RotatorsLib 半挂车事件处理模块
{ "title": "RotatorsLib 半挂车事件处理模块", "description": "该模块处理半挂车相关的事件,例如:车灯开关、挂车/解挂、玩家更新事件等。", "keywords": "RotatorsLib, 半挂车, 事件处理, 车灯开关, 挂车, 解挂, 玩家更新", "content": "-- 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) end
原文地址: https://www.cveoy.top/t/topic/nypL 著作权归作者所有。请勿转载和采集!