96 lines
2.2 KiB
Lua
96 lines
2.2 KiB
Lua
--@include ./powertrain_component.txt
|
|
--@include /koptilnya/libs/constants.txt
|
|
|
|
---@type PowertrainComponent
|
|
local PowertrainComponent = require('./powertrain_component.txt')
|
|
|
|
require('/koptilnya/libs/constants.txt')
|
|
|
|
---@class ClutchConfig: PowertrainComponentConfig
|
|
---@field SlipTorque? number
|
|
|
|
---@class Clutch: PowertrainComponent
|
|
---@field slipTorque number
|
|
local Clutch = class('Clutch', PowertrainComponent)
|
|
|
|
---@private
|
|
---@param vehicle KPTLVehicle
|
|
---@param name string
|
|
---@param config ClutchConfig
|
|
function Clutch:initialize(vehicle, name, config)
|
|
PowertrainComponent.initialize(self, vehicle, name, config)
|
|
|
|
if CLIENT then
|
|
return
|
|
end
|
|
|
|
self.wireInputs = {
|
|
Clutch = 'number',
|
|
}
|
|
self.wireOutputs = {
|
|
Clutch_Torque = 'number',
|
|
}
|
|
|
|
self.inertia = config.Inertia or 0.1
|
|
self.slipTorque = config.SlipTorque or 1000
|
|
end
|
|
|
|
---@return nil
|
|
function Clutch:updateWireOutputs()
|
|
PowertrainComponent.updateWireOutputs(self)
|
|
|
|
wire.ports.Clutch_Torque = self.torque
|
|
end
|
|
|
|
---@return number
|
|
function Clutch:getPress()
|
|
return 1 - wire.ports.Clutch
|
|
end
|
|
|
|
---@return number
|
|
function Clutch:queryInertia()
|
|
if self.output == nil then
|
|
return self.inertia
|
|
end
|
|
|
|
return self.inertia + self.output:queryInertia() * self:getPress()
|
|
end
|
|
|
|
---@param angularVelocity number
|
|
---@return number
|
|
function Clutch:queryAngularVelocity(angularVelocity)
|
|
self.angularVelocity = angularVelocity
|
|
|
|
if self.output == nil then
|
|
return angularVelocity
|
|
end
|
|
|
|
local outputW = self.output:queryAngularVelocity(angularVelocity) * self:getPress()
|
|
local inputW = angularVelocity * (1 - self:getPress())
|
|
|
|
return outputW + inputW
|
|
end
|
|
|
|
---@param torque number
|
|
---@param inertia number
|
|
---@return number
|
|
function Clutch:forwardStep(torque, inertia)
|
|
if self.output == nil then
|
|
return torque
|
|
end
|
|
|
|
local press = self:getPress()
|
|
|
|
self.torque = math.clamp(torque, -self.slipTorque, self.slipTorque)
|
|
self.torque = self.torque * (1 - (1 - math.pow(press, 0.3)))
|
|
|
|
local returnTorque = self.output:forwardStep(self.torque, inertia * press + self.inertia) * press
|
|
|
|
return math.clamp(returnTorque, -self.slipTorque, self.slipTorque)
|
|
end
|
|
|
|
---@type fun(vehicle: KPTLVehicle, name?: string, config?: ClutchConfig): Clutch
|
|
Clutch.new = Clutch.new
|
|
|
|
return Clutch
|