-- @include /koptilnya/libs/wire_component.txt -- @include ./steering_axle.txt -- @include /koptilnya/libs/table.txt require('/koptilnya/libs/wire_component.txt') require('./steering_axle.txt') require('/koptilnya/libs/table.txt') Steering = class('Steering', WireComponent) function Steering:initialize(options) options = options or {} self.axles = {} self.steer = 0 self.sensitivity = options.Sensitivity or 1 for key, axle in ipairs(options.Axles) do axle.Order = key axle.Base = wire.ports.Base table.insert(self.axles, SteeringAxle:new(axle)) end self:_adjustPorts() hook.add('tick', 'update', function() self:update() end) end function Steering:_adjustPorts() local inputs = {} local outputs = {} inputs = table.merge(inputs, self:getInputs()) outputs = table.merge(outputs, self:getOutputs()) for _, axle in ipairs(self.axles) do inputs = table.merge(inputs, axle:getInputs()) outputs = table.merge(outputs, axle:getOutputs()) end wire.adjustPorts(inputs, outputs) end function Steering:getInputs() return { TargetSteer = 'number', Base = 'entity' } end function Steering:getOutputs() return { Steer = 'number' } end function Steering:updateOutputs() -- local totalSteeringAngle = table.reduce(self.slaves, function(steer, slave) -- return steer + slave.direction * slave.steeringAngle / (slave.lock ~= 0 and slave.lock or 1) -- end, 0) -- local steerableSlaves = table.filter(self.slaves, function(slave) -- return slave.lock ~= 0 -- end) -- wire.ports.Steer = totalSteeringAngle / #steerableSlaves end function Steering:update() self.steer = wire.ports.TargetSteer * self.sensitivity self:updateOutputs() for _, axle in ipairs(self.axles) do axle.steer = self.steer axle:update() axle:updateOutputs() end end