2025-05-16 07:11:48 +06:00

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