require luautilsrequire rLibClientrSemiTruck = rSemiTruck or rSemiTruckEvent = local function IsSemiTruckAnyvehicle assertrLibargvehicle BaseVehicle local vehicleName = vehiclegetScriptgetFullName ret
-- rSemiTruck模块,用于处理半挂车相关事件
-- 判断是否为半挂车 local function IsSemiTruckAny(vehicle) assert(rLib.arg(vehicle, "BaseVehicle"))
local vehicleName = vehicle:getScript():getFullName()
return vehicleName == "Rotators.SemiTruck" or vehicleName == "Rotators.SemiTruckLite" or vehicleName == "Rotators.SemiTruckBox"
end
-- 判断是否为半挂车或轻型半挂车 local function IsSemiTruckOrSemiTruckLite(vehicle) assert(rLib.arg(vehicle, "BaseVehicle"))
local vehicleName = vehicle:getScript():getFullName()
return vehicleName == "Rotators.SemiTruck" or vehicleName == "Rotators.SemiTruckLite"
end
-- 判断是否为半挂车拖车 local function IsSemiTrailer(vehicle) assert(rLib.arg(vehicle, "BaseVehicle"))
local vehicleName = vehicle:getScript():getFullName()
return vehicleName == "Rotators.SemiTrailerVan" or vehicleName == "Rotators.SemiTrailerCistern"
end
-- 处理PostAutoRepair事件 function rSemiTruck.Event.PostAutoRepair(player, vehicle, part, armor) assert(rLib.arg(player, "IsoPlayer")) assert(rLib.arg(vehicle, "BaseVehicle")) assert(rLib.arg(part, "VehiclePart")) assert(rLib.arg(armor, "table"))
-- 打印日志
rLib.dprint("[rSemiTruck] PostAutoRepair : %s : %s", vehicle:getScript():getFullName(), part:getId())
-- 如果护甲损失值大于护甲实际损失并且需要零件,则设置零件的状态
if ZombRand(100) < armor.condition - part:getCondition() and type(armor.needs) == "table" and armor.needs.part then
local guard = vehicle:getPartById(armor.needs.part)
local guardCondition = guard:getCondition() - ZombRand(8)
rLib.dprint("[rSemiTruck] Guard condition: %s => %f", guard:getId(), guardCondition)
sendClientCommand(player, "vehicle", "setPartCondition", { vehicle = vehicle:getId(), part = guard:getId(), condition = guardCondition })
end
return true
end
-- 处理ToggleHeadlights事件 function rSemiTruck.Event.ToggleHeadlights(player, vehicle) assert(rLib.arg(player, "IsoPlayer")) assert(rLib.arg(vehicle, "BaseVehicle"))
-- 如果不是半挂车或轻型半挂车,则返回
if not IsSemiTruckOrSemiTruckLite(vehicle) then
return
end
-- 获取半挂车拖车
local trailer = vehicle:getVehicleTowing()
if not trailer or not IsSemiTrailer(trailer) then
return
end
-- 执行设置拖车前灯状态的命令
rLib.Commands.SendToServer(player, "SetVehicleHeadlights", {vehicleId = trailer:getId(), set = not vehicle:getHeadlightsOn()}, true)
end
-- 处理AttachDetachVehicle事件 function rSemiTruck.Event.AttachDetachVehicle(player, vehicleA, vehicleB) assert(rLib.arg(player, "IsoPlayer")) assert(rLib.arg(vehicleA, "BaseVehicle")) assert(rLib.arg(vehicleB, "BaseVehicle"))
-- 更新车辆总重
vehicleA:updateTotalMass()
vehicleB:updateTotalMass()
-- 如果不是半挂车或者不是半挂车拖车,则返回
if not IsSemiTruckOrSemiTruckLite(vehicleA) or not IsSemiTrailer(vehicleB) then
return
end
-- 获取半挂车电池
local batteryPart = vehicleA:getPartById("Battery")
if batteryPart then
local batteryInv = batteryPart:getInventoryItem()
local batteryVar = batteryInv and batteryInv:getUsedDelta() or 0
if batteryInv and batteryVar > 0 then
-- 执行设置拖车电池状态的命令
rLib.Commands.SendToServer(player, "SetVehicleBattery",
{
vehicleId = vehicleB:getId(),
battery = rLib.Events.Current == "Vehicle.AttachVehicle" and batteryVar or 0
}, true)
end
end
-- 执行设置拖车前灯状态的命令
rLib.Commands.SendToServer(player, "SetVehicleHeadlights",
{
vehicleId = vehicleB:getId(),
set = rLib.Events.Current == "Vehicle.AttachVehicle" and vehicleA:getHeadlightsOn() or false
}, true)
end
-- 处理PlayerUpdate事件 function rSemiTruck.Event.PlayerUpdate(player) -- 获取玩家所在车辆 local vehicle = player:getVehicle() or player:getNearVehicle() if not vehicle then return end
-- 如果玩家所在车辆是半挂车拖车,则执行以下代码
if vehicle:getVehicleTowing() then
vehicle = vehicle:getVehicleTowing()
end
-- 获取半挂车拖车的托架
local attachment = vehicle:getTowAttachmentOther()
if not attachment or string.lower(attachment) ~= "trailertruck" then
return
end
-- 获取半挂车拖车的货箱零件
local partTrunk = vehicle:getPartById("TruckBed")
if not partTrunk then
return
end
-- 计算货箱总质量
local partsContainersMass = 0
local partsInventoryMass = 0
for p=0, vehicle:getPartCount()-1 do
local part = vehicle:getPartByIndex(p)
local item = part:getItemContainer()
if item then
partsContainersMass = partsContainersMass + item:getCapacityWeight()
end
item = part:getInventoryItem()
if item then
partsInventoryMass = partsInventoryMass + item:getWeight()
end
end
local wantedMass = vehicle:getInitialMass() + partsInventoryMass + (partsContainersMass / 4)
vehicle:setMass(math.floor(wantedMass))
end
-- 处理EnterVehicle事件 function rSemiTruck.Event.EnterVehicle(player) if not rLib.modversion then luautils.okModal("Your rLib is older than Lexx's mouse") return end
local r = rLib.modversion("RotatorsLib") or rLib.modversion("RotatorsLib_DEV")
if not r or r < 1.2 then
luautils.okModal("Your rLib is bad and you should feel bad")
end
end
-- 注册事件监听器 rLib.Events.On("Vehicle.ToggleHeadlights", rSemiTruck.Event.ToggleHeadlights) rLib.Events.On("Vehicle.AttachVehicle", rSemiTruck.Event.AttachDetachVehicle) rLib.Events.On("Vehicle.DetachVehicle", rSemiTruck.Event.AttachDetachVehicle) Events.OnPlayerUpdate.Add(rSemiTruck.Event.PlayerUpdate) --Events.OnEnterVehicle.Add(rSemiTruck.Event.EnterVehicle)
-- 启用车辆覆盖编辑器 if getDebug() and rLib and rLib.Events.Exists("Vehicle.MechanicsSetVisible") then local function EnableVehicleOverlayEditor(ui, uiVisible) if uiVisible then local vehicleName = ui.vehicle:getScript():getFullName() if vehicleName == "Rotators.SemiTruck" or vehicleName == "Rotators.SemiTruckLite" or vehicleName == "Rotators.SemiTruckBox" then rLib.UI.VehicleOverlayEditor.Enable(ui) end end end rLib.Events.On("Vehicle.MechanicsSetVisible", EnableVehicleOverlayEditor) en
原文地址: https://www.cveoy.top/t/topic/cG7O 著作权归作者所有。请勿转载和采集!