{ "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

RotatorsLib 半挂车事件处理模块

原文地址: https://www.cveoy.top/t/topic/nypL 著作权归作者所有。请勿转载和采集!

免费AI点我,无需注册和登录