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

require luautilsrequire rLibClientrSemiTruck = rSemiTruck or rSemiTruckEvent = local function IsSemiTruckAnyvehicle	assertrLibargvehicle BaseVehicle	local vehicleName = vehiclegetScriptgetFullName	ret

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

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