133 lines
3.1 KiB
Lua
133 lines
3.1 KiB
Lua
--@include /koptilnya/libs/constants.txt
|
|
--@include /koptilnya/libs/utils.txt
|
|
--@include ../wire_component.txt
|
|
--@include ../vehicle.txt
|
|
|
|
local WireComponent = require('../wire_component.txt')
|
|
|
|
require('/koptilnya/libs/constants.txt')
|
|
require('/koptilnya/libs/utils.txt')
|
|
|
|
---@class PowertrainComponentConfig
|
|
---@field Name? string
|
|
---@field DEBUG? boolean
|
|
---@field Inertia? number
|
|
|
|
---@class PowertrainComponent: KPTLWireComponent
|
|
---@field vehicle KPTLVehicle
|
|
---@field name string
|
|
---@field CONFIG PowertrainComponentConfig
|
|
---@field DEBUG boolean
|
|
---@field input? PowertrainComponent
|
|
---@field output? PowertrainComponent
|
|
---@field inertia number
|
|
---@field angularVelocity number
|
|
---@field torque number
|
|
---@field DEBUG_DATA? table
|
|
local PowertrainComponent = class('PowertrainComponent', WireComponent)
|
|
|
|
---@protected
|
|
---@param vehicle KPTLVehicle
|
|
---@param name? string
|
|
---@param config? PowertrainComponentConfig
|
|
function PowertrainComponent:initialize(vehicle, name, config)
|
|
config = config or {}
|
|
|
|
WireComponent.initialize(self)
|
|
|
|
self.vehicle = vehicle
|
|
self.name = name or 'PowertrainComponent'
|
|
self.CONFIG = config
|
|
self.DEBUG = config.DEBUG or false
|
|
self.input = nil
|
|
self.output = nil
|
|
self.inertia = 0.02
|
|
self.angularVelocity = 0
|
|
self.torque = 0
|
|
|
|
if self.DEBUG then
|
|
if CLIENT then
|
|
self.DEBUG_DATA = {}
|
|
|
|
net.receive('DEBUG_' .. self.name, function()
|
|
self:deserializeDebugData(self.DEBUG_DATA)
|
|
end)
|
|
end
|
|
|
|
self.DEBUG_SEND_DATA_DEBOUNCED = debounce(function()
|
|
net.start('DEBUG_' .. self.name)
|
|
self:serializeDebugData()
|
|
net.send(self.vehicle.playersConnectedToHUD, true)
|
|
end, 1 / 10)
|
|
end
|
|
end
|
|
|
|
---@param component PowertrainComponent
|
|
---@return nil
|
|
function PowertrainComponent:linkComponent(component)
|
|
---@diagnostic disable-next-line: undefined-field
|
|
if not component:isInstanceOf(PowertrainComponent) then
|
|
return
|
|
end
|
|
|
|
if self.output == nil then
|
|
self.output = component
|
|
component.input = self
|
|
end
|
|
end
|
|
|
|
---@return number
|
|
function PowertrainComponent:getRPM()
|
|
return self.angularVelocity * RAD_TO_RPM
|
|
end
|
|
|
|
---@return number
|
|
function PowertrainComponent:queryInertia()
|
|
if self.output == nil then
|
|
return self.inertia
|
|
end
|
|
|
|
return self.inertia + self.output:queryInertia()
|
|
end
|
|
|
|
---@param angularVelocity number
|
|
---@return number
|
|
function PowertrainComponent:queryAngularVelocity(angularVelocity)
|
|
self.angularVelocity = angularVelocity
|
|
|
|
if self.output == nil then
|
|
return 0
|
|
end
|
|
|
|
return self.output:queryAngularVelocity(angularVelocity)
|
|
end
|
|
|
|
---@param torque number
|
|
---@param inertia number
|
|
---@return number
|
|
function PowertrainComponent:forwardStep(torque, inertia)
|
|
if self.output == nil then
|
|
return self.torque
|
|
end
|
|
|
|
return self.output:forwardStep(self.torque, self.inertia + inertia)
|
|
end
|
|
|
|
---@return nil
|
|
function PowertrainComponent:updateWireOutputs()
|
|
WireComponent.updateWireOutputs(self)
|
|
|
|
if self.DEBUG then
|
|
self:DEBUG_SEND_DATA_DEBOUNCED()
|
|
end
|
|
end
|
|
|
|
---@return nil
|
|
function PowertrainComponent:serializeDebugData() end
|
|
|
|
---@param result table
|
|
---@return nil
|
|
function PowertrainComponent:deserializeDebugData(result) end
|
|
|
|
return PowertrainComponent
|