--@include /koptilnya/libs/watcher.txt --@include /koptilnya/libs/utils.txt --@include ./base.txt local BaseGearbox = require('./base.txt') require('/koptilnya/libs/watcher.txt') require('/koptilnya/libs/utils.txt') local ManualGearbox = class('ManualGearbox', BaseGearbox) function ManualGearbox:initialize(vehicle, name, config) BaseGearbox.initialize(self, vehicle, name, config) if CLIENT then return end table.merge(self.wireOutputs, { [string.format('%s_Gear', self.name)] = 'number', }) self.ratios = config.Ratios or { 3.6, 2.2, 1.5, 1.2, 1.0, 0.8 } self.reverse = config.Reverse or 3.4 self.gear = 0 function shiftFunc() if wire.ports.Clutch == 0 then return 0 end local upshift = wire.ports.Upshift or 0 local downshift = wire.ports.Downshift or 0 return upshift - downshift end self.shiftWatcher = watcher(shiftFunc, function(val) if val ~= 0 then self:shift(val) end end) self:recalcRatio() end function ManualGearbox:updateWireOutputs() BaseGearbox.updateWireOutputs(self) wire.ports[string.format('%s_Gear', self.name)] = self.gear end function ManualGearbox:setGear(gear) if gear >= -1 and gear <= #self.ratios then self.gear = gear self:recalcRatio() net.start('GEARBOX_GEAR') net.writeInt(gear, 5) net.send(self.vehicle.playersConnectedToHUD, true) end end function ManualGearbox:recalcRatio() if self.gear == -1 then self.ratio = -self.reverse elseif self.gear == 0 then self.ratio = 0 else self.ratio = self.ratios[self.gear] end end function ManualGearbox:shift(dir) self:setGear(self.gear + dir) end function ManualGearbox:forwardStep(torque, inertia) self.shiftWatcher() local result = BaseGearbox.forwardStep(self, torque, inertia) return result end return ManualGearbox