Fixed target values bug

This commit is contained in:
Иван Грачёв 2021-09-19 19:51:10 +05:00
parent 8dc9689601
commit d5bbad6f1d
3 changed files with 136 additions and 8 deletions

View File

@ -0,0 +1,91 @@
-- @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)

View File

@ -0,0 +1,25 @@
Slave = class('Slave')
function Slave:initialize(options)
options = options or {}
self.entity = options.Entity
self.base = options.Base
self.camber = options.Camber
self.caster = options.Caster
self.ackermann = options.Ackermann
self.isLeft = options.IsLeft
end
function Slave:rotate(ang)
if self.entity:isFrozen() == false then
self.entity:setFrozen(1)
end
local angle = Angle(0, ang, 0)
local transformedAngle = self.base:localToWorldAngles(angle)
self.entity:setAngles(transformedAngle)
-- rotate slave here
end

View File

@ -7,22 +7,35 @@ Input = class('Input')
function Input:_setupHooks()
hook.add('inputPressed', 'KeyPress', function(key)
if self.driver == CURRENT_PLAYER then
self:_trySetTargetValue(key, 'press')
self:_trySetTargetValue(key)
end
end)
hook.add('inputReleased', 'KeyRelease', function(key)
if self.driver == CURRENT_PLAYER then
self:_trySetTargetValue(key, 'release')
self:_trySetTargetValue(key)
end
end)
end
function Input:_trySetTargetValue(key, evt)
function Input:bothKeysHolding(axle)
return (input.isKeyDown(axle.Positive) == true) and (input.isKeyDown(axle.Negative) == true)
end
function Input:noKeysHolding(axle)
return (input.isKeyDown(axle.Positive) == false) and (input.isKeyDown(axle.Negative) == false)
end
function Input:getAxleValue(axle)
return (input.isKeyDown(axle.Positive) and 1 or 0) - (input.isKeyDown(axle.Negative) and 1 or 0)
end
function Input:_trySetTargetValue(key)
local triggeredKey = self.keys[key]
if triggeredKey ~= nil then
local targetValue = evt == 'press' and triggeredKey.Value or 0
local triggeredAxle = self.axles[triggeredKey.Axle]
local targetValue = self:getAxleValue(triggeredAxle)
net.start('SetTargetAxle')
net.writeString(triggeredKey.Axle)
@ -40,13 +53,11 @@ end
function Input:_mapKeys(axles)
for k, v in pairs(axles) do
self.keys[v.Negative] = {
Axle = k,
Value = -1
Axle = k
}
self.keys[v.Positive] = {
Axle = k,
Value = 1
Axle = k
}
end
end
@ -55,6 +66,7 @@ end
function Input:initialize(options)
options = options or {}
self.axles = options.Axles
self.keys = {}
self.driver = NULL_ENTITY