Fixed target values bug
This commit is contained in:
parent
8dc9689601
commit
d5bbad6f1d
91
koptilnya/grip_steering/main.txt
Normal file
91
koptilnya/grip_steering/main.txt
Normal 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)
|
||||||
25
koptilnya/grip_steering/slave.txt
Normal file
25
koptilnya/grip_steering/slave.txt
Normal 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
|
||||||
@ -7,22 +7,35 @@ Input = class('Input')
|
|||||||
function Input:_setupHooks()
|
function Input:_setupHooks()
|
||||||
hook.add('inputPressed', 'KeyPress', function(key)
|
hook.add('inputPressed', 'KeyPress', function(key)
|
||||||
if self.driver == CURRENT_PLAYER then
|
if self.driver == CURRENT_PLAYER then
|
||||||
self:_trySetTargetValue(key, 'press')
|
self:_trySetTargetValue(key)
|
||||||
end
|
end
|
||||||
end)
|
end)
|
||||||
|
|
||||||
hook.add('inputReleased', 'KeyRelease', function(key)
|
hook.add('inputReleased', 'KeyRelease', function(key)
|
||||||
if self.driver == CURRENT_PLAYER then
|
if self.driver == CURRENT_PLAYER then
|
||||||
self:_trySetTargetValue(key, 'release')
|
self:_trySetTargetValue(key)
|
||||||
end
|
end
|
||||||
end)
|
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]
|
local triggeredKey = self.keys[key]
|
||||||
|
|
||||||
if triggeredKey ~= nil then
|
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.start('SetTargetAxle')
|
||||||
net.writeString(triggeredKey.Axle)
|
net.writeString(triggeredKey.Axle)
|
||||||
@ -40,13 +53,11 @@ end
|
|||||||
function Input:_mapKeys(axles)
|
function Input:_mapKeys(axles)
|
||||||
for k, v in pairs(axles) do
|
for k, v in pairs(axles) do
|
||||||
self.keys[v.Negative] = {
|
self.keys[v.Negative] = {
|
||||||
Axle = k,
|
Axle = k
|
||||||
Value = -1
|
|
||||||
}
|
}
|
||||||
|
|
||||||
self.keys[v.Positive] = {
|
self.keys[v.Positive] = {
|
||||||
Axle = k,
|
Axle = k
|
||||||
Value = 1
|
|
||||||
}
|
}
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
@ -55,6 +66,7 @@ end
|
|||||||
|
|
||||||
function Input:initialize(options)
|
function Input:initialize(options)
|
||||||
options = options or {}
|
options = options or {}
|
||||||
|
self.axles = options.Axles
|
||||||
self.keys = {}
|
self.keys = {}
|
||||||
self.driver = NULL_ENTITY
|
self.driver = NULL_ENTITY
|
||||||
|
|
||||||
|
|||||||
Loading…
x
Reference in New Issue
Block a user