92 lines
1.8 KiB
Plaintext
92 lines
1.8 KiB
Plaintext
-- @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)
|