-- @include /koptilnya/libs/wire_component.txt -- @include ./slave.txt -- @include /koptilnya/libs/table.txt require('/koptilnya/libs/wire_component.txt') require('./slave.txt') require('/koptilnya/libs/table.txt') Steering = class('Steering', WireComponent) function Steering:initialize(options) options = options or {} self.slaves = {} self.steer = 0 self.sensitivity = options.Sensitivity or 1 for key, slave in ipairs(options.Slaves) do slave.Order = key slave.Base = wire.ports.Base table.insert(self.slaves, Slave:new(slave)) 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 _, slave in ipairs(self.slaves) do inputs = table.merge(inputs, slave:getInputs()) outputs = table.merge(outputs, slave: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 _, slave in ipairs(self.slaves) do slave.steer = self.steer slave:update() slave:updateOutputs() end end