From d5bbad6f1d983aa46368dcd334b2a31b80184d7a Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=D0=98=D0=B2=D0=B0=D0=BD=20=D0=93=D1=80=D0=B0=D1=87=D1=91?= =?UTF-8?q?=D0=B2?= Date: Sun, 19 Sep 2021 19:51:10 +0500 Subject: [PATCH] Fixed target values bug --- koptilnya/grip_steering/main.txt | 91 +++++++++++++++++++++++++++++ koptilnya/grip_steering/slave.txt | 25 ++++++++ koptilnya/input_system/cl_input.txt | 28 ++++++--- 3 files changed, 136 insertions(+), 8 deletions(-) create mode 100644 koptilnya/grip_steering/main.txt create mode 100644 koptilnya/grip_steering/slave.txt diff --git a/koptilnya/grip_steering/main.txt b/koptilnya/grip_steering/main.txt new file mode 100644 index 0000000..df2b42e --- /dev/null +++ b/koptilnya/grip_steering/main.txt @@ -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) diff --git a/koptilnya/grip_steering/slave.txt b/koptilnya/grip_steering/slave.txt new file mode 100644 index 0000000..a5e125d --- /dev/null +++ b/koptilnya/grip_steering/slave.txt @@ -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 diff --git a/koptilnya/input_system/cl_input.txt b/koptilnya/input_system/cl_input.txt index ef00bfa..3d48cd0 100644 --- a/koptilnya/input_system/cl_input.txt +++ b/koptilnya/input_system/cl_input.txt @@ -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