-- @name Grip Steering -- @author DarkSupah -- @server -- @include ./slave.txt Steering = class('Steering') require('./slave.txt') local options = { Camber = 0, Caster = 85, Ackermann = 10, Lock = 50 } function Steering:_adjustPorts() local inputs = { Axles = 'table', Base = 'entity', LeftSlave = 'entity', RightSlave = 'entity' } local outputs = { SteerAngle = 'number', TargetAngle = 'number' } wire.adjustPorts(inputs, outputs) end function Steering:_createSlaves() local entities = {wire.ports.LeftSlave, wire.ports.RightSlave} local slaves = {} for k, v in pairs(entities) do local slave = Slave:new({ Entity = v, IsLeft = k % 2 == 1, Base = wire.ports.Base, Camber = self.slavesConfig.Camber, Caster = self.slavesConfig.Caster, Ackermann = self.slavesConfig.Ackermann }) table.insert(self.slaves, slave) end end function Steering:_updateOutputs() wire.ports.TargetAngle = self.targetAngle end function Steering:initialize(options) options = options or {} self.slavesConfig = { Camber = options.Camber, Caster = options.Caster, Ackermann = options.Ackermann } self.lock = 50 self.targetAngle = 0 self.angle = 0 self.slaves = {} self:_adjustPorts() self:_createSlaves() end function Steering:update() local horizontal = wire.ports.Axles.Horizontal.Value self.targetAngle = horizontal * self.lock self.angle = -horizontal * self.lock for k, v in pairs(self.slaves) do v:rotate(self.angle) end self:_updateOutputs() end local steering = Steering:new(options) hook.add('think', 'SteeringUpdate', function() steering:update() end)