Garry's Mod服务器日志脚本问题:Damage/Connect日志失效及职业日志添加
Garry's Mod日志脚本问题修复与功能扩展方案
一、修复Damage日志不显示问题
1. 初始化日志开关变量
原脚本未初始化logsEnabled,默认值为nil导致所有日志逻辑直接跳过,需在脚本开头添加:
local logsEnabled = true -- 默认开启日志功能
2. 优化伤害日志逻辑
修复武器获取稳定性,同时支持非玩家攻击者(如NPC、环境伤害)的日志记录:
-- Entity damage logging hook.Add("EntityTakeDamage", "", function(target, dmginfo) if not logsEnabled then return end if not target:IsPlayer() then return end local attacker = dmginfo:GetAttacker() local attackerName = "环境/世界" local weapon = dmginfo:GetInflictor():IsValid() and dmginfo:GetInflictor():GetPrintName() or "未知" if attacker:IsPlayer() then attackerName = attacker:Nick() local weaponEntity = attacker:GetActiveWeapon() if IsValid(weaponEntity) then weapon = weaponEntity:GetPrintName() end elseif attacker:IsNPC() then attackerName = attacker:GetClass() -- 记录NPC类型 end table.insert(logs.damage, "[" .. os.date("%H:%M:%S") .. "] " .. attackerName .. " 对玩家 " .. target:Nick() .. " 造成 " .. dmginfo:GetDamage() .. " 点伤害,使用武器: " .. weapon) end)
二、修复Connect日志不显示问题
原脚本依赖ChatText的joinleave类型不可靠(不同服务器消息格式差异大),改用官方游戏事件实现:
-- 删除原ChatText钩子中的joinleave处理逻辑,替换为以下代码 gameevent.Listen("player_connect") hook.Add("player_connect", "", function(data) if not logsEnabled then return end table.insert(logs.connect, "[" .. os.date("%H:%M:%S") .. "] " .. data.name .. " (" .. data.networkid .. ") 已发起服务器连接") end) -- 可选:记录玩家完全进入游戏的事件 hook.Add("PlayerInitialSpawn", "", function(ply) if not logsEnabled then return end table.insert(logs.connect, "[" .. os.date("%H:%M:%S") .. "] " .. ply:Nick() .. " (" .. ply:SteamID() .. ") 已进入游戏") end)
三、添加职业变更日志(以DarkRP为例)
1. 扩展日志存储结构
在logs表中新增职业变更日志数组:
local logs = { kill = {}, damage = {}, changename = {}, connect = {}, disconnect = {}, job_change = {}, -- 新增职业变更日志容器 Kd = nil }
2. 添加职业变更监听钩子
针对DarkRP的职业系统,监听playerChangedTeam事件:
hook.Add("playerChangedTeam", "", function(ply, oldTeam, newTeam) if not logsEnabled then return end local oldJob = RPExtraTeams[oldTeam] and RPExtraTeams[oldTeam].name or "无职业" local newJob = RPExtraTeams[newTeam] and RPExtraTeams[newTeam].name or "未知职业" table.insert(logs.job_change, "[" .. os.date("%H:%M:%S") .. "] " .. ply:Nick() .. " (" .. ply:SteamID() .. ") 从 [" .. oldJob .. "] 切换为 [" .. newJob .. "]") end)
3. 更新日志UI按钮
在createLogWindow函数的按钮创建部分,新增职业变更日志按钮:
createLogButton("Kill", logs.kill) createLogButton("Damage", logs.damage) createLogButton("Connect", logs.connect) createLogButton("Disconnect", logs.disconnect) createLogButton("职业变更", logs.job_change) -- 新增按钮
四、额外优化建议
- 将
logs.Kd重命名为logs_display,命名更直观 - 优化日志窗口关闭逻辑,将
frame:Close()改为frame:Remove()避免内存残留 - 添加管理员清空日志功能(可选):
concommand.Add("clear_server_logs", function(ply) if not ply:IsAdmin() then return end for key, value in pairs(logs) do if type(value) == "table" then table.Empty(value) end end print("服务器日志已清空") end)
内容的提问来源于stack exchange,提问作者Hacker 3310
相关产品推荐
相关产品推荐

