You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.20 01:58:09