--@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