-- 监听玩家输入的聊天消息事件
AddEventHandler('_chat:messageEntered', function(author, color, message)
local xPlayer = ESX.GetPlayerFromId(source) -- 获取发送消息的玩家对象
local jobs = xPlayer.job.label -- 获取玩家的职业标签
local sent = "^5[" ..jobs.."]^4["..author.."]" -- 格式化发送者信息
local messages= "^5 "..message.." " -- 格式化消息内容
-- 如果消息或作者为空则返回
if not message or not author then
return
end
TriggerEvent('chatMessage', source, author, message) -- 触发聊天消息事件
-- 如果事件未被取消
if not WasEventCanceled() then
TriggerClientEvent('chatMessage', -1, sent, { 255, 255, 255 }, messages) -- 广播消息给所有客户端
end
print(sent .. '^7: ' .. messages .. '^7') -- 在控制台打印消息
end)
-- 监听警察聊天消息事件
AddEventHandler('_chat:messageEnteredP', function(author, color, message)
local xPlayer = ESX.GetPlayerFromId(source)
jobname = xPlayer.job.label -- 获取职业名称
grade_name = xPlayer.job.grade_label -- 获取职业等级名称
if xPlayer.job.name == 'police' then -- 检查是否为警察职业
if not message or not author then
return
end
TriggerEvent('chatMessageP', source, author, message) -- 触发警察聊天消息事件
if not WasEventCanceled() then
TriggerClientEvent('chatMessageP', -1, "[ "..grade_name.." ]" .. author ..":", { 0, 0, 255 }, message) -- 广播警察消息
end
print(author .. '^7: ' .. message .. '^7') -- 打印消息
else
-- 如果不是警察,则发送无权限通知
TriggerClientEvent('chat:addMessageP', source, { args = { '^1通知', '您无权在此频道上聊天。' } })
end
end)
-- 监听救护人员聊天消息事件
AddEventHandler('_chat:messageEnteredM', function(author, color, message)
local xPlayer = ESX.GetPlayerFromId(source)
jobname = xPlayer.job.label
grade_name = xPlayer.job.grade_label
if xPlayer.job.name == 'ambulance' then -- 检查是否为救护人员职业
if not message or not author then
return
end
TriggerEvent('chatMessageM', source, author, message) -- 触发救护人员聊天消息事件
if not WasEventCanceled() then
TriggerClientEvent('chatMessageM', -1, "[ "..grade_name.." ]" .. author ..":", { 34,139,34 }, message) -- 广播救护人员消息
end
print(author .. '^7: ' .. message .. '^7') -- 打印消息
else
-- 如果不是救护人员,则发送无权限通知
TriggerClientEvent('chat:addMessageM', source, { args = { '^1通知', '您无权在此频道上聊天。' } })
end
end)
-- 监听机械师聊天消息事件
AddEventHandler('_chat:messageEnteredG', function(author, color, message)
local xPlayer = ESX.GetPlayerFromId(source)
jobname = xPlayer.job.label
grade_name = xPlayer.job.grade_label
if xPlayer.job.name == 'mechanic' then -- 检查是否为机械师职业
if not message or not author then
return
end
TriggerEvent('chatMessageG', source, author, message) -- 触发机械师聊天消息事件
if not WasEventCanceled() then
TriggerClientEvent('chatMessageG', -1, "[ "..grade_name.." ]" .. author ..":", { 34,139,34 }, message) -- 广播机械师消息
end
print(author .. '^7: ' .. message .. '^7') -- 打印消息
else
-- 如果不是机械师,则发送无权限通知
TriggerClientEvent('chat:addMessageG', source, { args = { '^1通知', '您无权在此频道上聊天。'}})
end
end)
-- 监听命令回调事件
AddEventHandler('__cfx_internal:commandFallback', function(command)
local name = GetPlayerName(source) -- 获取玩家名称
TriggerEvent('chatMessage', source, name, '/' .. command) -- 触发命令消息事件
if not WasEventCanceled() then
TriggerClientEvent('chatMessage', -1, name, { 255, 255, 255 }, '/' .. command) -- 广播命令消息
end
CancelEvent() -- 取消事件
end)
-- 玩家加入消息
AddEventHandler('chat:init', function()
TriggerClientEvent('chatMessage', -1, '', { 255, 255, 255 }, '^2* ' .. GetPlayerName(source) .. ' 加入服务器.') -- 广播玩家加入消息
end)
-- 玩家离开消息
AddEventHandler('playerDropped', function(reason)
TriggerClientEvent('chatMessage', -1, '', { 255, 255, 255 }, '^2* ' .. GetPlayerName(source) ..' 离开了服务器 (' .. reason .. ')') -- 广播玩家离开消息
end)
-- 自定义"/say"命令
RegisterCommand('say', function(source, args, rawCommand)
TriggerClientEvent('chatMessage', -1, (source == 0) and '^1通知' or GetPlayerName(source), { 255, 255, 255 }, rawCommand:sub(5)) -- 广播消息
end)
-- 为客户端提供命令建议
local function refreshCommands(player)
if GetRegisteredCommands then
local registeredCommands = GetRegisteredCommands()
local suggestions = {}
for _, command in ipairs(registeredCommands) do
if IsPlayerAceAllowed(player, ('command.%s'):format(command.name)) then
table.insert(suggestions, {
name = '/' .. command.name,
help = ''
})
end
end
TriggerClientEvent('chat:addSuggestions', player, suggestions) -- 向客户端发送命令建议
end
end
-- 当聊天初始化时刷新命令建议
AddEventHandler('chat:init', function()
refreshCommands(source)
end)
-- 当服务器资源启动时刷新所有玩家的命令建议
AddEventHandler('onServerResourceStart', function(resName)
Wait(500)
for _, player in ipairs(GetPlayers()) do
refreshCommands(player) -- 刷新每个玩家的命令建议
end
end)