你可以在服务器脚本中创建一个事件来实现玩家头顶显示ID和名称的功能。首先,你需要在服务器脚本中创建一个事件监听器来捕获玩家加入和离开服务器的事件:
AddEventHandler('playerConnecting', function()
-- 玩家加入服务器时触发的事件
local player = source
-- 获取玩家的ID和名称
local playerId = GetPlayerIdentifier(player, 0)
local playerName = GetPlayerName(player)
-- 使用TriggerClientEvent将ID和名称发送给客户端
TriggerClientEvent('showPlayerInfo', player, playerId, playerName)
end)
AddEventHandler('playerDropped', function(reason)
-- 玩家离开服务器时触发的事件
local player = source
-- 使用TriggerClientEvent通知客户端隐藏头顶显示
TriggerClientEvent('hidePlayerInfo', player)
end)
然后,在客户端脚本中创建两个事件处理函数来接收服务器发送的玩家ID和名称,并显示或隐藏头顶信息:
RegisterNetEvent('showPlayerInfo')
AddEventHandler('showPlayerInfo', function(playerId, playerName)
-- 创建头顶显示元素并设置位置
local ped = GetPlayerPed(PlayerId())
local coords = GetEntityCoords(ped)
local x, y, z = coords.x, coords.y, coords.z + 1.2
-- 创建文本标签并设置显示内容和样式
local textDisplay = CreateText3D(playerId .. ' - ' .. playerName, x, y, z)
SetTextDisplayFont(textDisplay, 1)
SetTextScale(0.5, 0.5)
SetTextColour(255, 255, 255, 255)
SetTextDropShadow()
-- 将文本标签与玩家关联
AttachTextDisplayToPed(ped, textDisplay, 0, 0.5)
-- 将文本标签加入列表,以便在其他事件中可以隐藏
table.insert(playerLabels, {ped = ped, display = textDisplay})
end)
RegisterNetEvent('hidePlayerInfo')
AddEventHandler('hidePlayerInfo', function()
-- 隐藏所有已显示的头顶信息
for i, label in ipairs(playerLabels) do
RemoveText3D(label.display)
playerLabels[i] = nil
end
end)
最后,在脚本的其他部分(比如Tick事件)中添加代码来更新玩家头顶信息的位置,确保它始终显示在玩家的头上:
Citizen.CreateThread(function()
while true do
-- 更新头顶信息显示位置
for _, label in ipairs(playerLabels) do
local coords = GetEntityCoords(label.ped)
local x, y, z = coords.x, coords.y, coords.z + 1.2
SetTextDisplayPosition(label.display, x, y, z)
end
Citizen.Wait(0)
end
end)
请确保将这些代码放在服务器脚本文件(比如server.lua)中。同时,你还需要自己实现文本标签相关的函数(CreateText3D、SetTextDisplayFont等)。 |