Finished stuff with manual gearbox
This commit is contained in:
parent
b5fb04cce8
commit
54202989c1
@ -62,7 +62,7 @@ local Colors =
|
|||||||
ReverseLights = Color(120,120,120),
|
ReverseLights = Color(120,120,120),
|
||||||
RearLightsGlass = Color(150,40,40),
|
RearLightsGlass = Color(150,40,40),
|
||||||
FrontLightsBase = Color(30,30,30),
|
FrontLightsBase = Color(30,30,30),
|
||||||
FrontLights = Color(170,180,180),
|
FrontLights = Color(10,10,10),
|
||||||
FrontLightsGlass = Color(140,140,140),
|
FrontLightsGlass = Color(140,140,140),
|
||||||
Floor = Color(50,50,50),
|
Floor = Color(50,50,50),
|
||||||
Dashboard = Color(50,50,50),
|
Dashboard = Color(50,50,50),
|
||||||
|
|||||||
@ -15,31 +15,42 @@ function Clutch:initialize(config)
|
|||||||
self.targetTorque = 0
|
self.targetTorque = 0
|
||||||
self.torque = 0
|
self.torque = 0
|
||||||
|
|
||||||
self._engine = nil
|
self.engine = nil
|
||||||
self._gearbox = nil
|
self.gearbox = nil
|
||||||
end
|
end
|
||||||
|
|
||||||
function Clutch:linkEngine(eng)
|
function Clutch:linkEngine(eng)
|
||||||
self._engine = eng
|
self.engine = eng
|
||||||
end
|
end
|
||||||
|
|
||||||
function Clutch:linkGearbox(gbox)
|
function Clutch:linkGearbox(gbox)
|
||||||
self._gearbox = gbox
|
self.gearbox = gbox
|
||||||
end
|
end
|
||||||
|
|
||||||
function Clutch:getInputs()
|
function Clutch:getInputs()
|
||||||
|
if self.gearbox ~= nil and self.gearbox.type == gearboxTypes.MANUAL then
|
||||||
|
return {
|
||||||
|
Clutch = 'number'
|
||||||
|
}
|
||||||
|
else
|
||||||
return {}
|
return {}
|
||||||
|
end
|
||||||
end
|
end
|
||||||
|
|
||||||
function Clutch:getOutputs()
|
function Clutch:getOutputs()
|
||||||
return {
|
return {
|
||||||
ClutchTorque = 'number',
|
Clutch_Torque = 'number',
|
||||||
ClutchSlip = 'number'
|
Clutch_Slip = 'number'
|
||||||
}
|
}
|
||||||
end
|
end
|
||||||
|
|
||||||
|
function Clutch:updateOutputs()
|
||||||
|
wire.ports.Clutch_Torque = self.torque
|
||||||
|
wire.ports.Clutch_Slip = self.slip
|
||||||
|
end
|
||||||
|
|
||||||
function Clutch:getPress()
|
function Clutch:getPress()
|
||||||
if self._gearbox ~= nil and self._gearbox.type == gearboxTypes.MANUAL then
|
if self.gearbox ~= nil and self.gearbox.type == gearboxTypes.MANUAL then
|
||||||
return wire.ports.Clutch
|
return wire.ports.Clutch
|
||||||
else
|
else
|
||||||
return self.press
|
return self.press
|
||||||
@ -49,9 +60,9 @@ end
|
|||||||
function Clutch:update()
|
function Clutch:update()
|
||||||
local someConversionCoeff = 0.10472
|
local someConversionCoeff = 0.10472
|
||||||
|
|
||||||
local engRPM = self._engine and self._engine.rpm or 0
|
local engRPM = self.engine and self.engine.rpm or 0
|
||||||
local gboxRPM = self._gearbox and self._gearbox.rpm or 0
|
local gboxRPM = self.gearbox and self.gearbox.rpm or 0
|
||||||
local gboxRatio = self._gearbox and self._gearbox.ratio or 0
|
local gboxRatio = self.gearbox and self.gearbox.ratio or 0
|
||||||
local gboxRatioNotZero = gboxRatio ~= 0 and 1 or 0
|
local gboxRatioNotZero = gboxRatio ~= 0 and 1 or 0
|
||||||
|
|
||||||
self.slip = ((engRPM - gboxRPM) * someConversionCoeff) * gboxRatioNotZero / 2
|
self.slip = ((engRPM - gboxRPM) * someConversionCoeff) * gboxRatioNotZero / 2
|
||||||
|
|||||||
@ -36,19 +36,19 @@ Vehicle:new({
|
|||||||
},
|
},
|
||||||
Clutch = {
|
Clutch = {
|
||||||
Stiffness = 22,
|
Stiffness = 22,
|
||||||
Damping = 0.5,
|
Damping = 0.8,
|
||||||
MaxTorque = 600
|
MaxTorque = 600
|
||||||
},
|
},
|
||||||
Gearbox = {
|
Gearbox = {
|
||||||
Type = "MANUAL",
|
Type = 'MANUAL',
|
||||||
ShiftDuration = 0.2,
|
ShiftDuration = 0.2,
|
||||||
ShiftSmoothness = 0.3,
|
ShiftSmoothness = 0.3,
|
||||||
Ratios = {13.45, 8.12, 5.51, 4.16, 3.36, 2.83},
|
Ratios = {13.45, 8.12, 5.51, 4.16, 3.36, 2.83},
|
||||||
Reverse = 14.41
|
Reverse = 14.41
|
||||||
},
|
},
|
||||||
Axles = {{
|
Axles = {{
|
||||||
Power = 1,
|
Power = 0.3,
|
||||||
Coast = 1,
|
Coast = 0.15,
|
||||||
Preload = 10,
|
Preload = 10,
|
||||||
UsePowerBias = 10,
|
UsePowerBias = 10,
|
||||||
ViscousCoeff = 0.96,
|
ViscousCoeff = 0.96,
|
||||||
@ -56,8 +56,8 @@ Vehicle:new({
|
|||||||
DistributionCoeff = 0.4,
|
DistributionCoeff = 0.4,
|
||||||
FinalDrive = 1
|
FinalDrive = 1
|
||||||
}, {
|
}, {
|
||||||
Power = 1,
|
Power = 0.4,
|
||||||
Coast = 1,
|
Coast = 0.3,
|
||||||
Preload = 10,
|
Preload = 10,
|
||||||
UsePowerBias = 10,
|
UsePowerBias = 10,
|
||||||
ViscousCoeff = 0.96,
|
ViscousCoeff = 0.96,
|
||||||
@ -66,10 +66,10 @@ Vehicle:new({
|
|||||||
FinalDrive = 1
|
FinalDrive = 1
|
||||||
}},
|
}},
|
||||||
Systems = {{
|
Systems = {{
|
||||||
Type = "LAUNCH",
|
Type = 'LAUNCH',
|
||||||
Limit = 3500
|
Limit = 3500
|
||||||
}, {
|
}, {
|
||||||
Type = "TRACTION",
|
Type = 'TRACTION',
|
||||||
Limit = 1.5
|
Limit = 1.5
|
||||||
}}
|
}}
|
||||||
})
|
})
|
||||||
|
|||||||
@ -1,12 +1,17 @@
|
|||||||
|
-- @server
|
||||||
|
-- @include /koptilnya/libs/constants.txt
|
||||||
-- @include ./wire_component.txt
|
-- @include ./wire_component.txt
|
||||||
|
require('/koptilnya/libs/constants.txt')
|
||||||
require('./wire_component.txt')
|
require('./wire_component.txt')
|
||||||
|
|
||||||
Differential = class('Differential', WireComponent)
|
Differential = class('Differential', WireComponent)
|
||||||
|
|
||||||
function Differential:initialize(config)
|
function Differential:initialize(config, order)
|
||||||
self.power = config.Power or 1
|
self.power = config.Power or 1
|
||||||
self.coast = config.Coast or 1
|
self.coast = config.Coast or 1
|
||||||
|
self.finalDrive = config.FinalDrive or 1
|
||||||
self.preload = config.Preload or 10
|
self.preload = config.Preload or 10
|
||||||
|
self.order = order or 1
|
||||||
|
|
||||||
self.viscousCoeff = config.ViscousCoeff or 0.9
|
self.viscousCoeff = config.ViscousCoeff or 0.9
|
||||||
self.usePowerBias = config.UsePowerBias or 10
|
self.usePowerBias = config.UsePowerBias or 10
|
||||||
@ -16,18 +21,87 @@ function Differential:initialize(config)
|
|||||||
|
|
||||||
self.avgRPM = 0
|
self.avgRPM = 0
|
||||||
|
|
||||||
self.leftWheel = nil
|
self.leftWheelInput = 'Axle' .. self.order .. '_LeftWheel'
|
||||||
self.rightWheel = nil
|
self.rightWheelInput = 'Axle' .. self.order .. '_RightWheel'
|
||||||
|
|
||||||
|
self.leftWheel = wire.ports[self.leftWheelInput]
|
||||||
|
self.rightWheel = wire.ports[self.rightWheelInput]
|
||||||
|
|
||||||
|
hook.add('input', 'wire_axle_update' .. self.order, function(key, val)
|
||||||
|
if key == self.leftWheelInput then
|
||||||
|
self.leftWheel = val
|
||||||
|
end
|
||||||
|
|
||||||
|
if key == self.rightWheelInput then
|
||||||
|
self.rightWheel = val
|
||||||
|
end
|
||||||
|
end)
|
||||||
end
|
end
|
||||||
|
|
||||||
function Differential:getInputs()
|
function Differential:getInputs()
|
||||||
local leftWheelName = 'Axle_' + self.order + '_LeftWheel'
|
|
||||||
local rightWheelName = 'Axle_' + self.order + '_RightWheel'
|
|
||||||
|
|
||||||
local inputs = {}
|
local inputs = {}
|
||||||
|
|
||||||
inputs[leftWheelName] = 'entity'
|
inputs[self.leftWheelInput] = 'entity'
|
||||||
inputs[rightWheelName] = 'entity'
|
inputs[self.rightWheelInput] = 'entity'
|
||||||
|
|
||||||
return inputs
|
return inputs
|
||||||
end
|
end
|
||||||
|
|
||||||
|
function Differential:linkGearbox(gbox)
|
||||||
|
self.gearbox = gbox
|
||||||
|
end
|
||||||
|
|
||||||
|
function Differential:update()
|
||||||
|
if isValid(self.leftWheel) and isValid(self.rightWheel) then
|
||||||
|
local lwav = math.rad(self.leftWheel:getAngleVelocity()[2])
|
||||||
|
local rwav = math.rad(self.rightWheel:getAngleVelocity()[2]) * -1
|
||||||
|
|
||||||
|
self.avgRPM = (lwav + rwav) / 2 * RAD_TO_RPM * self.finalDrive
|
||||||
|
|
||||||
|
-- RAV = relative anglar velocity
|
||||||
|
local lwrav = rwav - lwav
|
||||||
|
local rwrav = lwav - rwav
|
||||||
|
|
||||||
|
local lwInertia = self.leftWheel:getInertia():getLength()
|
||||||
|
local rwInertia = self.rightWheel:getInertia():getLength()
|
||||||
|
|
||||||
|
local lwtq = lwrav * lwInertia
|
||||||
|
local rwtq = rwrav * rwInertia
|
||||||
|
|
||||||
|
-- Calculating damping torque here
|
||||||
|
local lwDampingTorque = self.viscousCoeff * lwtq
|
||||||
|
local rwDampingTorque = self.viscousCoeff * rwtq
|
||||||
|
|
||||||
|
-- Whether use diff power or diff coast
|
||||||
|
local usePower = self.gearbox and self.gearbox.torque > self.usePowerBias or false
|
||||||
|
local usedCoeff = usePower and self.power or self.coast
|
||||||
|
|
||||||
|
local lwPowerCoeff = usedCoeff
|
||||||
|
local rwPowerCoeff = usedCoeff
|
||||||
|
|
||||||
|
-- this could probably be shortened?
|
||||||
|
-- if lwtq - rwtq > self.preload then
|
||||||
|
-- lwPowerCoeff = usedCoeff
|
||||||
|
-- rwPowerCoeff = usedCoeff
|
||||||
|
-- end
|
||||||
|
|
||||||
|
-- if rwtq - lwtq > self.preload then
|
||||||
|
-- lwPowerCoeff = usedCoeff
|
||||||
|
-- rwPowerCoeff = usedCoeff
|
||||||
|
-- end
|
||||||
|
|
||||||
|
local lwCorrectingTorque = math.clamp(lwDampingTorque * lwPowerCoeff, -self.maxCorrectingTorque,
|
||||||
|
self.maxCorrectingTorque)
|
||||||
|
local rwCorrectingTorque = math.clamp(rwDampingTorque * rwPowerCoeff, -self.maxCorrectingTorque,
|
||||||
|
self.maxCorrectingTorque)
|
||||||
|
|
||||||
|
local gboxTorque = self.gearbox and self.gearbox.torque or 0
|
||||||
|
|
||||||
|
local driveTorque = gboxTorque * self.distributionCoeff * 52.49 * self.finalDrive
|
||||||
|
local lwCorrectedTorque = lwCorrectingTorque * 600 + driveTorque
|
||||||
|
local rwCorrectedTorque = rwCorrectingTorque * 600 + driveTorque
|
||||||
|
|
||||||
|
self.leftWheel:applyTorque(lwCorrectedTorque * -self.leftWheel:getRight() * TICK_INTERVAL)
|
||||||
|
self.rightWheel:applyTorque(rwCorrectedTorque * self.rightWheel:getRight() * TICK_INTERVAL)
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|||||||
@ -28,7 +28,7 @@ function Engine:initialize(config, clutch)
|
|||||||
self._limiterTime = 0
|
self._limiterTime = 0
|
||||||
|
|
||||||
self.clutch = clutch
|
self.clutch = clutch
|
||||||
clutch.engine = self
|
clutch:linkEngine(self)
|
||||||
end
|
end
|
||||||
|
|
||||||
function Engine:getInputs()
|
function Engine:getInputs()
|
||||||
|
|||||||
@ -5,6 +5,6 @@ require('../gearboxes/manual.txt')
|
|||||||
|
|
||||||
GearboxFactory = class('GearboxFactory')
|
GearboxFactory = class('GearboxFactory')
|
||||||
|
|
||||||
function GearboxFactory.create(config, clutch)
|
function GearboxFactory.create(...)
|
||||||
return ManualGearbox:new(config, clutch)
|
return ManualGearbox:new(...)
|
||||||
end
|
end
|
||||||
|
|||||||
@ -1,4 +1,7 @@
|
|||||||
Gearbox = class('Gearbox')
|
-- @include ../wire_component.txt
|
||||||
|
require('../wire_component.txt')
|
||||||
|
|
||||||
|
Gearbox = class('Gearbox', WireComponent)
|
||||||
|
|
||||||
function Gearbox:initialize(config, clutch, axles)
|
function Gearbox:initialize(config, clutch, axles)
|
||||||
self.ratios = config.Ratios
|
self.ratios = config.Ratios
|
||||||
@ -11,9 +14,40 @@ function Gearbox:initialize(config, clutch, axles)
|
|||||||
self.axles = axles or {}
|
self.axles = axles or {}
|
||||||
self.clutch = clutch
|
self.clutch = clutch
|
||||||
|
|
||||||
|
self.type = config.Type
|
||||||
|
|
||||||
|
clutch:linkGearbox(self)
|
||||||
|
|
||||||
|
for _, axle in pairs(axles) do
|
||||||
|
axle:linkGearbox(self)
|
||||||
|
end
|
||||||
|
|
||||||
self:recalcRatio()
|
self:recalcRatio()
|
||||||
end
|
end
|
||||||
|
|
||||||
|
function Gearbox:getInputs()
|
||||||
|
return {
|
||||||
|
Upshift = 'number',
|
||||||
|
Downshift = 'number'
|
||||||
|
}
|
||||||
|
end
|
||||||
|
|
||||||
|
function Gearbox:getOutputs()
|
||||||
|
return {
|
||||||
|
Gearbox_RPM = 'number',
|
||||||
|
Gearbox_Torque = 'number',
|
||||||
|
Gearbox_Gear = 'number',
|
||||||
|
Gearbox_Ratio = 'number'
|
||||||
|
}
|
||||||
|
end
|
||||||
|
|
||||||
|
function Gearbox:updateOutputs()
|
||||||
|
wire.ports.Gearbox_RPM = self.rpm
|
||||||
|
wire.ports.Gearbox_Torque = self.torque
|
||||||
|
wire.ports.Gearbox_Gear = self.gear
|
||||||
|
wire.ports.Gearbox_Ratio = self.ratio
|
||||||
|
end
|
||||||
|
|
||||||
function Gearbox:setGear(gear)
|
function Gearbox:setGear(gear)
|
||||||
if gear >= -1 and gear <= #self.ratios then
|
if gear >= -1 and gear <= #self.ratios then
|
||||||
self.gear = gear
|
self.gear = gear
|
||||||
@ -36,14 +70,13 @@ function Gearbox:update()
|
|||||||
self.torque = self.clutch.torque * self.ratio
|
self.torque = self.clutch.torque * self.ratio
|
||||||
end
|
end
|
||||||
|
|
||||||
local axlesRPM = table.map(self.axles, function(diff)
|
local maxAxlesRPM = 0
|
||||||
return diff.avgRPM
|
|
||||||
end)
|
|
||||||
|
|
||||||
local maxAxlesRPM = math.max(unpack(axlesRPM))
|
if #self.axles > 0 then
|
||||||
|
maxAxlesRPM = math.max(unpack(table.map(self.axles, function(diff)
|
||||||
|
return diff.avgRPM
|
||||||
|
end)))
|
||||||
|
end
|
||||||
|
|
||||||
self.rpm = maxAxlesRPM * self.ratio
|
self.rpm = maxAxlesRPM * self.ratio
|
||||||
end
|
end
|
||||||
|
|
||||||
function Gearbox:shift()
|
|
||||||
end
|
|
||||||
|
|||||||
@ -5,30 +5,21 @@ require('./base.txt')
|
|||||||
|
|
||||||
ManualGearbox = class('ManualGearbox', Gearbox)
|
ManualGearbox = class('ManualGearbox', Gearbox)
|
||||||
|
|
||||||
function ManualGearbox:initialize(config, clutch)
|
function ManualGearbox:initialize(...)
|
||||||
Gearbox.initialize(self, config, clutch)
|
Gearbox.initialize(self, ...)
|
||||||
|
|
||||||
-- self.ratios = config.Ratios
|
function shiftFunc()
|
||||||
-- self.reverse = config.Reverse
|
local upshift = wire.ports.Upshift or 0
|
||||||
|
local downshift = wire.ports.Downshift or 0
|
||||||
|
|
||||||
-- self.rpm = 0
|
return upshift - downshift
|
||||||
-- self.torque = 0
|
end
|
||||||
-- self.gear = 0
|
|
||||||
|
|
||||||
-- self:recalcRatio()
|
self.shiftWatcher = watcher(shiftFunc, function(val)
|
||||||
|
if val ~= 0 then
|
||||||
-- self.axles = {}
|
self:shift(val)
|
||||||
-- self.clutch = nil
|
end
|
||||||
|
end)
|
||||||
-- self.torque = 0
|
|
||||||
|
|
||||||
-- self.shiftWatcher = watcher(function()
|
|
||||||
-- return wire.ports.Upshift - wire.ports.Downshift
|
|
||||||
-- end, function(val)
|
|
||||||
-- if val ~= 0 then
|
|
||||||
-- self:shift(val)
|
|
||||||
-- end
|
|
||||||
-- end)
|
|
||||||
end
|
end
|
||||||
|
|
||||||
function ManualGearbox:recalcRatio()
|
function ManualGearbox:recalcRatio()
|
||||||
@ -41,36 +32,23 @@ function ManualGearbox:recalcRatio()
|
|||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
||||||
function ManualGearbox:getInputs()
|
function ManualGearbox:shift(dir)
|
||||||
return {
|
self:setGear(self.gear + dir)
|
||||||
Upshift = 'number',
|
|
||||||
Downshift = 'number'
|
|
||||||
}
|
|
||||||
end
|
end
|
||||||
|
|
||||||
function ManualGearbox:getOutputs()
|
-- function ManualGearbox:getOutputs()
|
||||||
return {
|
-- return {
|
||||||
Gearbox_RPM = 'number',
|
-- Gearbox_RPM = 'number',
|
||||||
Gearbox_Torque = 'number'
|
-- Gearbox_Torque = 'number'
|
||||||
}
|
-- }
|
||||||
end
|
-- end
|
||||||
|
|
||||||
function ManualGearbox:updateOutputs()
|
-- function ManualGearbox:updateOutputs()
|
||||||
|
|
||||||
end
|
-- end
|
||||||
|
|
||||||
function ManualGearbox:update()
|
function ManualGearbox:update()
|
||||||
-- if self.clutch ~= nil then
|
Gearbox.update(self)
|
||||||
-- self.torque = self.clutch.torque * self.ratio
|
|
||||||
-- end
|
|
||||||
|
|
||||||
-- local axlesRPM = table.map(self.axles, function(diff)
|
self.shiftWatcher()
|
||||||
-- return diff.avgRPM
|
|
||||||
-- end)
|
|
||||||
|
|
||||||
-- local maxAxlesRPM = math.max(unpack(axlesRPM))
|
|
||||||
|
|
||||||
-- self.rpm = maxAxlesRPM * self.ratio
|
|
||||||
|
|
||||||
-- self.shiftWatcher()
|
|
||||||
end
|
end
|
||||||
|
|||||||
@ -2,12 +2,14 @@
|
|||||||
--
|
--
|
||||||
-- @include ./engine.txt
|
-- @include ./engine.txt
|
||||||
-- @include ./clutch.txt
|
-- @include ./clutch.txt
|
||||||
|
-- @include ./differential.txt
|
||||||
--
|
--
|
||||||
-- Helpers & stuff
|
-- Helpers & stuff
|
||||||
-- @include ./factories/gearbox.txt
|
-- @include ./factories/gearbox.txt
|
||||||
-- @include /koptilnya/libs/table.txt
|
-- @include /koptilnya/libs/table.txt
|
||||||
require('./engine.txt')
|
require('./engine.txt')
|
||||||
require('./clutch.txt')
|
require('./clutch.txt')
|
||||||
|
require('./differential.txt')
|
||||||
require('./factories/gearbox.txt')
|
require('./factories/gearbox.txt')
|
||||||
|
|
||||||
require('/koptilnya/libs/table.txt')
|
require('/koptilnya/libs/table.txt')
|
||||||
@ -23,20 +25,20 @@ function Vehicle:initialize(config)
|
|||||||
self.clutch = Clutch:new(config.Clutch)
|
self.clutch = Clutch:new(config.Clutch)
|
||||||
self.engine = Engine:new(config.Engine, self.clutch)
|
self.engine = Engine:new(config.Engine, self.clutch)
|
||||||
|
|
||||||
|
local axleOrder = 0
|
||||||
self.axles = table.map(config.Axles, function(config)
|
self.axles = table.map(config.Axles, function(config)
|
||||||
return Differential:new(config)
|
axleOrder = axleOrder + 1
|
||||||
|
return Differential:new(config, axleOrder)
|
||||||
end)
|
end)
|
||||||
|
|
||||||
self.gearbox = GearboxFactory.create(config.Gearbox, self.clutch, self.axles)
|
self.gearbox = GearboxFactory.create(config.Gearbox, self.clutch, self.axles)
|
||||||
|
|
||||||
-- self.axles = table.map(config.Axles, function(config)
|
|
||||||
-- return Differential:new(config)
|
|
||||||
-- end)
|
|
||||||
-- self.systems = table.map(config.Systems, function(config)
|
-- self.systems = table.map(config.Systems, function(config)
|
||||||
-- return SystemsBuilder:create(config)
|
-- return SystemsFactory.create(config)
|
||||||
-- end)
|
-- end)
|
||||||
|
|
||||||
self.components = {self.clutch, self.engine, self.gearbox} -- , self.gearbox, self.clutch}
|
self.components = {self.clutch, self.engine, self.gearbox}
|
||||||
|
self.components = table.add(self.components, self.axles)
|
||||||
-- self.components = table.add(self.components, self.axles)
|
-- self.components = table.add(self.components, self.axles)
|
||||||
-- self.components = table.add(self.components, self.systems)
|
-- self.components = table.add(self.components, self.systems)
|
||||||
|
|
||||||
@ -50,11 +52,6 @@ function Vehicle:initialize(config)
|
|||||||
|
|
||||||
wire.adjustPorts(inputs, outputs)
|
wire.adjustPorts(inputs, outputs)
|
||||||
|
|
||||||
-- for _, ent in self.entities do
|
|
||||||
-- ent:createInputs()
|
|
||||||
-- ent:createOutputs()
|
|
||||||
-- end
|
|
||||||
|
|
||||||
hook.add('tick', 'vehicle_update', function()
|
hook.add('tick', 'vehicle_update', function()
|
||||||
local outputs = {}
|
local outputs = {}
|
||||||
|
|
||||||
|
|||||||
Loading…
x
Reference in New Issue
Block a user