bfdz49 发表于 2026-1-28 17:12:03

远征GM系统增加脚本客户端服务端

这个是客户端UI脚本

--===================================================================
-- GM系统配置表 v5.1
-- 命令描述、参数提示、UI分组配置
--===================================================================
print(" 加载配置表...")

GMCommandConfig = {
    -- 命令元数据
    commands = {
      count = {
            desc = "统计在线人数",
            params = {},
            category = "基础统计",
            shortcut = "F1"
      },
      userlist = {
            desc = "查看玩家列表",
            params = {},
            category = "基础统计",
            shortcut = "F2"
      },
      retrieve = {
            desc = "全面恢复HP/MP",
            params = {},
            category = "基础统计",
            shortcut = "F3"
      },
      tile = {
            desc = "传送到坐标",
            params = {
                {name = "x", type = "number", desc = "X坐标"},
                {name = "y", type = "number", desc = "Y坐标"},
                {name = "map", type = "number", desc = "地图ID(可选)"}
            },
            category = "传送移动",
            example = ":tile 100,200"
      },
      move = {
            desc = "传送到玩家身边",
            params = {
                {name = "player", type = "string", desc = "目标玩家名"}
            },
            category = "传送移动",
            example = ":move 玩家A"
      },
      pull = {
            desc = "拉人到自己身边",
            params = {
                {name = "player", type = "string", desc = "目标玩家名"}
            },
            category = "传送移动",
            example = ":pull 玩家B"
      },
      hide = {
            desc = "隐身/显身切换",
            params = {
                {name = "flag", type = "number", desc = "1=隐身,0=显身"}
            },
            category = "传送移动",
            example = ":hide 1"
      },
      mute = {
            desc = "禁言玩家",
            params = {
                {name = "player", type = "string", desc = "玩家名"},
                {name = "time", type = "number", desc = "时长(分钟)"},
                {name = "reason", type = "string", desc = "原因"}
            },
            category = "玩家管理",
            example = ":mute 玩家C,60,辱骂"
      },
      kick = {
            desc = "踢玩家下线",
            params = {
                {name = "player", type = "string", desc = "玩家名"},
                {name = "reason", type = "string", desc = "原因(可选)"}
            },
            category = "玩家管理",
            example = ":kick 玩家D"
      },
      kick2 = {
            desc = "踢下线并广播",
            params = {
                {name = "player", type = "string", desc = "玩家名"},
                {name = "reason", type = "string", desc = "广播内容"}
            },
            category = "玩家管理",
            example = ":kick2 玩家E,使用外挂"
      },
      freeze = {
            desc = "封号处理",
            params = {
                {name = "player", type = "string", desc = "玩家名"}
            },
            category = "玩家管理",
            example = ":freeze 玩家F"
      },
      prison = {
            desc = "关进监狱",
            params = {
                {name = "player", type = "string", desc = "玩家名"}
            },
            category = "玩家管理",
            example = ":prison 玩家G"
      },
      getitem = {
            desc = "获得物品",
            params = {
                {name = "itemId", type = "number", desc = "物品ID"},
                {name = "count", type = "number", desc = "数量"},
                {name = "bind", type = "number", desc = "绑定(1=是,0=否)"}
            },
            category = "物品/怪物",
            example = ":getitem 1001,10,1"
      },
      callmonster = {
            desc = "召唤怪物",
            params = {
                {name = "monsterId", type = "number", desc = "怪物ID"},
                {name = "count", type = "number", desc = "数量"},
                {name = "level", type = "number", desc = "等级(可选)"}
            },
            category = "物品/怪物",
            example = ":callmonster 2001,5"
      },
      resetectype = {
            desc = "重置副本次数",
            params = {},
            category = "物品/怪物"
      },
      ad = {
            desc = "发布公告",
            params = {
                {name = "content", type = "string", desc = "公告内容"}
            },
            category = "系统工具",
            example = ':ad 服务器活动开启!'
      },
      wh = {
            desc = "维护公告",
            params = {},
            category = "系统工具"
      },
      sp = {
            desc = "扫描外挂",
            params = {},
            category = "扫描监控"
      },
      scanqq = {
            desc = "获取玩家QQ",
            params = {
                {name = "player", type = "string", desc = "玩家名"}
            },
            category = "扫描监控"
      },
      monitorlua = {
            desc = "监控Lua错误",
            params = {},
            category = "扫描监控"
      },
      cancelmonitorlua = {
            desc = "取消Lua监控",
            params = {},
            category = "扫描监控"
      }
    },
   
    -- 快捷键配置
    shortcuts = {
      {key = "F10", action = "ToggleGMPanel", desc = "开关GM面板"},
      {key = "F1", command = ":count", desc = "统计在线"},
      {key = "F2", command = ":userlist", desc = "玩家列表"},
      {key = "F3", command = ":retrieve", desc = "全面恢复"},
      {key = "F5", command = ":hide 1", desc = "隐身"},
      {key = "F6", command = ":hide 0", desc = "显身"}
    }
}

-- 获取命令描述
function GMCommandConfig:GetCommandDesc(cmdName)
    local cmd = self.commands
    return cmd and cmd.desc or "未知命令"
end

-- 获取命令参数
function GMCommandConfig:GetCommandParams(cmdName)
    local cmd = self.commands
    return cmd and cmd.params or {}
end

-- 获取分类
function GMCommandConfig:GetCommandsByCategory(category)
    local result = {}
    for name, cmd in pairs(self.commands) do
      if cmd.category == category then
            table.insert(result, name)
      end
    end
    return result
end

print(" 配置表加载完成")
--===================================================================
-- GM面板UI系统
--===================================================================
GMPanelUI = {
    window = nil,
    tabControl = nil,
    resultBox = nil,
    commandInput = nil,
    isVisible = false
}

-- 创建主窗口
function GMPanelUI:Create()
    if not CreateWindow then
      print(" 不支持UI创建")
      return
    end
   
    -- 主窗口
    self.window = CreateWindow("GMPanel", "GM命令面板",
      200, 100, 800, 600,
      true, true, true)
   
    if not self.window then return end
   
    -- 创建标签页
    self.tabControl = self.window:CreateTabControl("MainTab", 10, 10, 780, 480)
   
    -- 基础命令页
    self:CreateBasicTab()
   
    -- 玩家管理页
    self:CreatePlayerTab()
   
    -- 物品/怪物页
    self:CreateItemTab()
   
    -- 系统工具页
    self:CreateSystemTab()
   
    -- 快捷命令页
    self:CreateQuickTab()
   
    -- 结果显示区
    self.resultBox = self.window:CreateMultiLineEdit("ResultBox",
      "", 10, 500, 600, 90, false)
    self.resultBox:SetReadOnly(true)
   
    -- 命令输入框
    self.commandInput = self.window:CreateEdit("CommandInput",
      "", 10, 595, 500, 25)
   
    -- 执行按钮
    local executeBtn = self.window:CreateButton("ExecuteBtn", "执行",
      520, 595, 80, 25)
    executeBtn:SetClickCallback(function()
      self:OnExecuteCommand()
    end)
   
    -- 清空按钮
    local clearBtn = self.window:CreateButton("ClearBtn", "清空结果",
      610, 595, 80, 25)
    clearBtn:SetClickCallback(function()
      self.resultBox:SetText("")
    end)
   
    -- 历史按钮
    local historyBtn = self.window:CreateButton("HistoryBtn", "历史",
      700, 595, 80, 25)
    historyBtn:SetClickCallback(function()
      self:ShowHistory()
    end)
   
    -- 默认隐藏
    self.window:Hide()
    self.isVisible = false
   
    print(" 创建完成")
end

-- 基础命令页
function GMPanelUI:CreateBasicTab()
    local tab = self.tabControl:AddTab("基础操作")
   
    -- 在线统计
    local row = 10
    tab:CreateButton("CountBtn", "统计在线", 10, row, 120, 25)
      :SetClickCallback(function() GMClient:QuickCommand("count") end)
   
    tab:CreateButton("UserListBtn", "玩家列表", 140, row, 120, 25)
      :SetClickCallback(function() GMClient:QuickCommand("userlist") end)
   
    -- 位置操作
    row = row + 35
    tab:CreateLabel("", "目标玩家:", 10, row + 5)
    local targetEdit = tab:CreateEdit("TargetPlayer", "", 80, row, 120, 25)
   
    tab:CreateButton("MoveBtn", "移动到TA", 210, row, 80, 25)
      :SetClickCallback(function()
            local target = targetEdit:GetText()
            if target ~= "" then
                GMClient:QuickCommand("move", target)
            end
      end)
   
    tab:CreateButton("PullBtn", "拉取到身边", 300, row, 80, 25)
      :SetClickCallback(function()
            local target = targetEdit:GetText()
            if target ~= "" then
                GMClient:QuickCommand("pull", target)
            end
      end)
   
    -- 隐身切换
    row = row + 35
    tab:CreateButton("HideBtn", "隐身模式", 10, row, 120, 25)
      :SetClickCallback(function() GMClient:QuickCommand("hide", "1") end)
   
    tab:CreateButton("ShowBtn", "显身模式", 140, row, 120, 25)
      :SetClickCallback(function() GMClient:QuickCommand("hide", "0") end)
   
    -- 坐标传送
    row = row + 35
    tab:CreateLabel("", "X坐标:", 10, row + 5)
    local xEdit = tab:CreateEdit("PosX", "100", 60, row, 60, 25)
   
    tab:CreateLabel("", "Y坐标:", 130, row + 5)
    local yEdit = tab:CreateEdit("PosY", "100", 180, row, 60, 25)
   
    tab:CreateButton("TileBtn", "传送", 250, row, 60, 25)
      :SetClickCallback(function()
            local x = xEdit:GetText()
            local y = yEdit:GetText()
            GMClient:QuickCommand("tile", x .. "," .. y)
      end)
end

-- 玩家管理页
function GMPanelUI:CreatePlayerTab()
    local tab = self.tabControl:AddTab("玩家管理")
   
    local row = 10
   
    -- 目标玩家
    tab:CreateLabel("", "玩家名:", 10, row + 5)
    local targetEdit = tab:CreateEdit("PM_Target", "", 70, row, 150, 25)
   
    tab:CreateButton("GetInfoBtn", "获取信息", 230, row, 80, 25)
      :SetClickCallback(function()
            local name = targetEdit:GetText()
            if name ~= "" then
                GMClient:QuickCommand("getuserinfo", name)
            end
      end)
   
    -- 禁言控制
    row = row + 35
    tab:CreateLabel("", "禁言时长(分钟):", 10, row + 5)
    local muteTime = tab:CreateEdit("MuteTime", "60", 120, row, 80, 25)
   
    tab:CreateButton("MuteBtn", "禁言", 210, row, 60, 25)
      :SetClickCallback(function()
            local name = targetEdit:GetText()
            local time = muteTime:GetText()
            if name ~= "" and time ~= "" then
                GMClient:QuickCommand("mute", name .. "," .. time)
            end
      end)
   
    -- 踢下线
    row = row + 35
    tab:CreateButton("KickBtn", "踢下线", 10, row, 80, 25)
      :SetClickCallback(function()
            local name = targetEdit:GetText()
            if name ~= "" then
                GMClient:QuickCommand("kick", name)
            end
      end)
   
    tab:CreateButton("Kick2Btn", "踢下线+广播", 100, row, 100, 25)
      :SetClickCallback(function()
            local name = targetEdit:GetText()
            if name ~= "" then
                GMClient:QuickCommand("kick2", name)
            end
      end)
   
    -- 封号/坐牢
    row = row + 35
    tab:CreateButton("FreezeBtn", "封号", 10, row, 80, 25)
      :SetClickCallback(function()
            local name = targetEdit:GetText()
            if name ~= "" then
                GMClient:QuickCommand("freeze", name)
            end
      end)
   
    tab:CreateButton("PrisonBtn", "关监狱", 100, row, 80, 25)
      :SetClickCallback(function()
            local name = targetEdit:GetText()
            if name ~= "" then
                GMClient:QuickCommand("prison", name)
            end
      end)
end

-- 物品/怪物页
function GMPanelUI:CreateItemTab()
    local tab = self.tabControl:AddTab("物品/怪物")
   
    local row = 10
   
    -- 获取物品
    tab:CreateLabel("", "物品ID:", 10, row + 5)
    local itemIdEdit = tab:CreateEdit("ItemID", "10001", 70, row, 100, 25)
   
    tab:CreateLabel("", "数量:", 180, row + 5)
    local itemCountEdit = tab:CreateEdit("ItemCount", "1", 220, row, 60, 25)
   
    tab:CreateButton("GetItemBtn", "获得物品", 290, row, 80, 25)
      :SetClickCallback(function()
            local id = itemIdEdit:GetText()
            local count = itemCountEdit:GetText()
            GMClient:QuickCommand("getitem", id .. "," .. count)
      end)
   
    -- 召唤怪物
    row = row + 35
    tab:CreateLabel("", "怪物ID:", 10, row + 5)
    local monsterIdEdit = tab:CreateEdit("MonsterID", "20001", 70, row, 100, 25)
   
    tab:CreateLabel("", "数量:", 180, row + 5)
    local monsterCountEdit = tab:CreateEdit("MonsterCount", "1", 220, row, 60, 25)
   
    tab:CreateButton("CallMonsterBtn", "召唤", 290, row, 80, 25)
      :SetClickCallback(function()
            local id = monsterIdEdit:GetText()
            local count = monsterCountEdit:GetText()
            GMClient:QuickCommand("callmonster", id .. "," .. count)
      end)
   
    -- 重置副本
    row = row + 35
    tab:CreateButton("ResetEctypeBtn", "重置所有副本次数", 10, row, 150, 25)
      :SetClickCallback(function() GMClient:QuickCommand("resetectype") end)
end

-- 系统工具页
function GMPanelUI:CreateSystemTab()
    local tab = self.tabControl:AddTab("系统工具")
   
    local row = 10
   
    -- 公告系统
    tab:CreateLabel("", "公告内容:", 10, row + 5)
    local adEdit = tab:CreateMultiLineEdit("AD_Content", "", 10, row + 25, 300, 60)
   
    tab:CreateButton("ADBtn", "发布公告", 320, row, 80, 25)
      :SetClickCallback(function()
            local content = adEdit:GetText()
            if content ~= "" then
                GMClient:QuickCommand("ad", content)
                adEdit:SetText("")
            end
      end)
   
    -- 维护公告
    row = row + 70
    tab:CreateButton("MaintainBtn", "维护公告", 10, row, 100, 25)
      :SetClickCallback(function()
            GMClient:QuickCommand("wh")
      end)
   
    -- 扫描工具
    row = row + 35
    tab:CreateLabel("", "目标玩家:", 10, row + 5)
    local scanTarget = tab:CreateEdit("ScanTarget", "", 80, row, 120, 25)
   
    tab:CreateButton("ScanQQBtn", "扫描QQ", 210, row, 80, 25)
      :SetClickCallback(function()
            local name = scanTarget:GetText()
            if name ~= "" then
                GMClient:QuickCommand("scanqq", name)
            end
      end)
   
    tab:CreateButton("ScanProcessBtn", "扫描进程", 300, row, 80, 25)
      :SetClickCallback(function()
            local name = scanTarget:GetText()
            if name ~= "" then
                GMClient:QuickCommand("scanprocess", name)
            end
      end)
end

-- 快捷命令页
function GMPanelUI:CreateQuickTab()
    local tab = self.tabControl:AddTab("快捷命令")
   
    local quickCmds = {
      {name = "全面恢复", cmd = "retrieve"},
      {name = "隐身", cmd = "hide 1"},
      {name = "显身", cmd = "hide 0"},
      {name = "扫描外挂", cmd = "sp"},
      {name = "获取log", cmd = "getlog"},
    }
   
    local row = 10
    for i, qc in ipairs(quickCmds) do
      local btn = tab:CreateButton("QuickBtn" .. i, qc.name,
            10 + ((i-1) % 3) * 120,
            row + math.floor((i-1) / 3) * 35,
            110, 30)
      
      btn:SetClickCallback(function()
            GMClient:SendCommand(qc.cmd)
      end)
    end
end

-- 显示/隐藏
function GMPanelUI:Show()
    if self.window then
      self.window:Show()
      self.isVisible = true
    end
end

function GMPanelUI:Hide()
    if self.window then
      self.window:Hide()
      self.isVisible = false
    end
end

-- 执行命令
function GMPanelUI:OnExecuteCommand()
    local cmd = self.commandInput:GetText()
    if cmd and cmd ~= "" then
      GMClient:SendCommand(cmd)
      self.commandInput:SetText("")
    end
end

-- 显示结果
function GMPanelUI:ShowResult(text)
    if self.resultBox then
      local current = self.resultBox:GetText()
      local timestamp = os.date("[%H:%M:%S] ")
      self.resultBox:SetText(current .. timestamp .. tostring(text) .. "\n")
      self.resultBox:SetScrollPos(99999) -- 滚动到底部
    end
end

-- 显示历史
function GMPanelUI:ShowHistory()
    local history = GMClient:GetHistory()
    local text = "=== 命令历史 ===\n"
   
    for i, h in ipairs(history) do
      text = text .. h.time .. " " .. h.cmd .. "\n"
    end
   
    self:ShowResult("\n" .. text)
end

-- 销毁
function GMPanelUI:Destroy()
    if self.window then
      self.window:Destroy()
      self.window = nil
    end
    self.isVisible = false
end
服务端lua脚本加载
--===================================================================
-- GM命令系统 - 服务端 v7.0
-- 基于 GMCommandManager.cpp 完整实现
--===================================================================

print(" 开始加载...")

-- 基础工具函数(使用最安全的Lua语法)
local function countTable(tbl)
    local c = 0
    if tbl then
      for _ in pairs(tbl) do
            c = c + 1
      end
    end
    return c
end

local function trim(s)
    return string.match(s, "^%s*(.-)%s*$")
end

local function log(msg)
    print(" " .. msg)
end

--===================================================================
-- GM命令管理器
--===================================================================
GMCommandManager = {
    commands = {}
}

function GMCommandManager:init()
    log("开始注册51个GM命令...")
    self.commands = {}
   
    -- 基础统计
    self:Register("count",       "统计在线人数",                  OnGMCount)
    self:Register("userlist",    "查看玩家列表",                  OnGMUserlist)
    self:Register("statuserinfo","统计在线玩家信息",                OnGMStatUserInfo)
    self:Register("getuserinfo", "获取指定玩家信息",                OnGMGetUserInfo)
   
    -- 位置操作
    self:Register("tile",      "移动到指定坐标",                  OnGMTile)
    self:Register("move",      "移动到玩家身边",                  OnGMMove)
    self:Register("moveex",      "移动到玩家身边(加强)",            OnGMMoveEx)
    self:Register("pull",      "拉人到自己身边",                  OnGMPull)
    self:Register("push",      "将玩家1推到玩家2旁",            OnGMPush)
    self:Register("setpos",      "设置玩家位置",                  OnGMSetPos)
    self:Register("getpos",      "获取玩家位置",                  OnGMGetPos)
    self:Register("hang",      "跨区传送到默认位置",            OnGMHang)
    self:Register("checkzone",   "查询玩家在公共区还是普通区",      OnGMCheckZone)
   
    -- 权限管理
    self:Register("mute",      "禁言玩家",                        OnGMMute)
    self:Register("muteex",      "禁言玩家(加强)",                  OnGMMuteEx)
    self:Register("mute2",       "禁言并广播",                      OnGMMuteBroadcast)
    self:Register("kick",      "踢玩家下线",                      OnGMKick)
    self:Register("kick2",       "踢下线并广播",                  OnGMKickBroadcast)
    self:Register("freeze",      "封号",                            OnGMFreeze)
    self:Register("prison",      "蹲监牢",                        OnGMPrison)
    self:Register("sst",         "设置安全时间",                  OnGMSetSecurityTime)
    self:Register("rudefine",    "修改非文明值",                  OnGMRudeFine)
   
    -- 状态管理
    self:Register("hide",      "隐身/显身",                     OnGMHide)
    self:Register("retrieve",    "全面恢复",                        OnGMRetrieve)
   
    -- 物品与怪物
    self:Register("getitem",   "获得物品",                        OnGMGetItem)
    self:Register("callmonster", "召唤怪物",                        OnGMCallMonster)
    self:Register("resetectype", "重置副本次数",                  OnGMResetEctype)
   
    -- 公告系统
    self:Register("ad",          "发布公告(支持多条)",            OnGMAD)
    self:Register("resetad",   "重置登录公告(支持多条)",      OnGMADReset)
    self:Register("wh",          "维护公告",                        OnGMMaintain)
   
    -- 监控与扫描
    self:Register("monitorlua",      "监控玩家客户端Lua出错信息",   OnGMMonitorLuaError)
    self:Register("cancelmonitorlua","取消监控Lua出错信息",          OnGMCancelMonitorLuaError)
    self:Register("sp",          "扫描外挂进程",                  OnGMScanPlugin)
    self:Register("spex",      "扫描外挂(MD5)",                   OnGMScanModeMd5)
    self:Register("scanprocess", "获取玩家进程列表",                OnGMScanProcess)
    self:Register("scanqq",      "获取玩家登录的QQ",                OnGMScanQQ)
    self:Register("scanwinver","获取玩家Windows版本",            OnGMScanWinVER)
    self:Register("scanping",    "查看玩家ping值",                  OnGMScanPing)
    self:Register("kill",      "杀掉玩家指定进程",                OnGMKillProcess)
    self:Register("scanmode",    "扫描指定进程",                  OnGMScanMode)
   
    -- 文件与日志
    self:Register("getfile",   "获取指定玩家文件",                OnGMGetFile)
    self:Register("getlog",      "获取指定玩家游戏log",            OnGMGetLog)
    self:Register("getpath",   "获取玩家工作目录",                OnGMGetPath)
    self:Register("md5",         "扫描文件MD5",                     OnGMFileMd5)
   
    -- 调试
    self:Register("debug",       "开关客户端调试模式",            OnGMDebug)
    self:Register("startprofile","启动性能测试",                  OnGMStartProfile)
    self:Register("stopprofile", "停止性能测试",                  OnGMStopProfile)
    self:Register("cmd",         "执行远程控制台命令",            OnGMConsoleCMD)
   
    -- 队伍
    self:Register("team",      "获取队伍成员列表",                OnGMTeam)
   
    -- 时间
    self:Register("settime",   "修改服务器时间",                  OnGMSetTime)
   
    -- 关键字
    self:Register("addkey",      "动态添加关键字",                  OnGMAddKey)
    self:Register("removekey",   "动态删除关键字",                  OnGMRemoveKey)
    self:Register("clearkey",    "动态清空关键字",                  OnGMClearKey)
   
    log("命令注册完成,总数: " .. countTable(self.commands))
end

function GMCommandManager:Register(name, desc, handler)
    self.commands = {
      name = name,
      desc = desc,
      execute = handler
    }
end

-- C++调用入口
function HandleGMCommand(playerId, cmdStr)
    log("收到GM命令: playerId=" .. tostring(playerId) .. " cmd=" .. cmdStr)
   
    local ok, result = pcall(function()
      return GMCommandManager:execute(playerId, cmdStr)
    end)
   
    if ok then
      log("命令处理成功")
      return true
    else
      log("处理失败: " .. tostring(result))
      return false
    end
end

function GMCommandManager:execute(playerId, cmdStr)
    if not IsGM or not IsGM(playerId) then
      log("权限不足: " .. tostring(playerId))
      return false
    end
   
    local cmdName = string.match(cmdStr, "^:([%a_]+)")
    if not cmdName then
      log("命令格式错误: " .. cmdStr)
      return false
    end
   
    local cmd = self.commands
    if not cmd then
      log("未知命令: " .. cmdName)
      return false
    end
   
    local args = {}
    local argStr = string.match(cmdStr, "^:[%a_]+%s+(.+)$")
    if argStr then
      local i = 1
      for arg in string.gmatch(argStr, "([^,]+)") do
            args = trim(arg)
            i = i + 1
      end
    end
   
    log("执行: " .. cmdName)
    return cmd.execute(playerId, cmdStr, args)
end

-- 命令实现(简化版)
function OnGMCount(playerId, cmdStr, args)
    log("执行count")
    if GetOnlinePlayerCount then
      local count = GetOnlinePlayerCount()
      SendSystemChat(playerId, "在线人数: " .. tostring(count))
    end
    return true
end

function OnGMUserlist(playerId, cmdStr, args)
    log("执行userlist")
    if GetOnlinePlayers then
      local players = GetOnlinePlayers()
      for i = 1, countTable(players) do
            SendSystemChat(playerId, players.name)
      end
    end
    return true
end

function OnGMMove(playerId, cmdStr, args)
    if countTable(args) < 1 then return false end
    log("执行move: " .. args)
    if TeleportToPlayer then
      TeleportToPlayer(playerId, args)
    end
    return true
end

function OnGMRetrieve(playerId, cmdStr, args)
    log("执行retrieve")
    if SetActorProperty then
      SetActorProperty(playerId, 1001, 1000000) -- HP
      SetActorProperty(playerId, 1002, 1000000) -- MP
    end
    return true
end

function OnGMHide(playerId, cmdStr, args)
    if countTable(args) < 1 then return false end
    log("执行hide: " .. args)
    if SetActorHide then
      SetActorHide(playerId, args == "1")
    end
    return true
end

-- 其他命令实现...
for i = 1, 40 do
    _G["OnGM" .. ({"Tile","MoveEx","Pull","Push","SetPos","GetPos","Hang","CheckZone","MuteEx","MuteBroadcast","KickBroadcast","King","AD","ADReset","Maintain","ScanProcess","ScanQQ","ScanWinVER","ScanPing","ConsoleCMD","StatUserInfo","GetUserInfo","MonitorLuaError","CancelMonitorLuaError","ScanPlugin","KillProcess","Crash","AddKey","RemoveKey","ClearKey","GetFile","GetLog","Debug","StartProfile","StopProfile","GetPath","GetMuteList","ClearMuteList","Freeze","Prison","ScanModeMd5","FileMd5","SetTime","Team","Ka","SetSecurityTime","RudeFine","GetItem","CallMonster","ResetEctype"}) or ""] = function() log("执行命令") return true end
end

-- 初始化
GMCommandManager:init()

print("=== GM服务端脚本加载完成 ===")
print("C++可通过HandleGMCommand调用")
命令        等级        参数        说明       
基础统计       
`:count`        1        无        统计在线人数       
`:userlist`        1        无        列出在线玩家       
`:statuserinfo`        1        无        统计玩家信息       
`:retrieve`        1        无        恢复HP/MP       
传送移动       
`:tile x,y`        5        number,number        传送到坐标       
`:move 玩家名`        5        string        传送到玩家       
`:pull 玩家名`        5        string        拉取玩家到身边       
`:hide 0/1`        5        number        隐身/显身       
`:push 玩家1,玩家2`        5        string,string        将玩家1推到玩家2旁       
`:setpos 玩家,x,y`        10        string,number,number        设置玩家位置       
`:hang`        5        无        跨区传送       
玩家管理       
`:mute 玩家,时间,原因`        5        string,number,string        禁言       
`:kick 玩家,原因`        5        string,string        踢下线       
`:kick2 玩家,原因`        10        string,string        踢下线并广播       
`:freeze 玩家`        10        string        封号       
`:prison 玩家`        10        string        关监狱       
`:sst 时间`        10        number        设置安全时间       
`:rudefine 玩家,值`        10        string,number        修改非文明值       
物品/怪物       
`:getitem ID,数量,绑定`        5        number,number,number        获得物品       
`:callmonster ID,数量,等级`        5        number,number,number        召唤怪物       
`:resetectype`        10        无        重置副本       
公告系统       
`:ad 内容`        5        string        发布公告       
`:wh`        10        无        维护公告       
监控扫描       
`:sp`        10        无        扫描外挂       
`:scanqq 玩家`        10        string        获取玩家QQ       
`:scanprocess 玩家`        10        string        获取进程列表       
`:scanwinver 玩家`        10        string        获取Windows版本       
`:monitorlua`        10        无        监控Lua错误       
`:cancelmonitorlua`        10        无        取消监控       
`:spex`        10        无        扫描MD5       
`:scanping 玩家`        10        string        查看ping值       
`:kill 玩家,进程名`        10        string,string        杀进程       
调试工具       
`:debug`        10        无        开启调试       
`:cmd 命令`        10        string        执行控制台命令       
DBProcedure.dbs配置
<!-- 在底部增加他就OK-->
<procedure name="PrGs_ExecuteGMCommand" cmdid="5100" databaseid="1">
    <param name="@GMID" type="int" dir="in" size="4" />
    <param name="@CommandName" type="nvarchar" dir="in" size="50" />
    <param name="@Parameters" type="nvarchar" dir="in" size="500" optional="true" />
    <param name="@IP" type="nvarchar" dir="in" size="50" optional="true" />
</procedure>

<procedure name="PrGs_GetGMCommands" cmdid="5101" databaseid="1">
    <param name="@GMLevel" type="tinyint" dir="in" size="1" />
</procedure>

<procedure name="PrGs_GetGMOperationLog" cmdid="5102" databaseid="1">
    <param name="@GMID" type="int" dir="in" size="4" optional="true" />
    <param name="@StartTime" type="int" dir="in" size="4" />
    <param name="@EndTime" type="int" dir="in" size="4" />
</procedure>
数据库储存
USE
GO

CREATE TABLE .(
    IDENTITY(1,1) NOT NULL PRIMARY KEY,
    (50) NOT NULL UNIQUE,      -- 命令名(如"mute")
    (200) NOT NULL,            -- 命令描述
    NOT NULL DEFAULT(5),      -- 最低GM等级
    NOT NULL DEFAULT(0),      -- 参数数量
    (100) NULL,               -- 参数类型(如"string,number,string")
    (50) NULL,                  -- 分类
    NOT NULL DEFAULT(1)            -- 是否启用
);

-- 插入51个GM命令
INSERT INTO .
(, , , , , )
VALUES
('count', '统计在线人数', 1, 0, NULL, '基础统计'),
('userlist', '查看玩家列表', 1, 0, NULL, '基础统计'),
('tile', '传送到坐标', 5, 2, 'number,number', '传送移动'),
('move', '传送到玩家身边', 5, 1, 'string', '传送移动'),
('pull', '拉人到自己身边', 5, 1, 'string', '传送移动'),
('hide', '隐身/显身', 5, 1, 'number', '传送移动'),
('mute', '禁言玩家', 5, 3, 'string,number,string', '玩家管理'),
('kick', '踢玩家下线', 5, 2, 'string,string', '玩家管理'),
('kick2', '踢下线并广播', 10, 2, 'string,string', '玩家管理'),
('freeze', '封号', 10, 1, 'string', '玩家管理'),
('prison', '关监狱', 10, 1, 'string', '玩家管理'),
('retrieve', '全面恢复', 1, 0, NULL, '基础统计'),
('getitem', '获得物品', 5, 3, 'number,number,number', '物品系统'),
('callmonster', '召唤怪物', 5, 3, 'number,number,number', '物品系统'),
('resetectype', '重置副本次数', 10, 0, NULL, '物品系统'),
('ad', '发布公告', 5, 1, 'string', '公告系统'),
('wh', '维护公告', 10, 0, NULL, '公告系统'),
('sp', '扫描外挂', 10, 0, NULL, '监控系统'),
('scanqq', '获取玩家QQ', 10, 1, 'string', '监控系统'),
('monitorlua', '监控Lua错误', 10, 0, NULL, '监控系统'),
('cancelmonitorlua', '取消Lua监控', 10, 0, NULL, '监控系统');
CREATE PROCEDURE .
    @GMID int,
    @CommandName nvarchar(50),
    @Parameters nvarchar(500) = NULL,
    @IP nvarchar(50) = NULL
AS
BEGIN
    SET NOCOUNT ON;
   
    DECLARE @GMLevel tinyint;
    DECLARE @MinLevel tinyint;
    DECLARE @CmdDesc nvarchar(200);
   
    -- 检查GM等级
    SELECT @GMLevel = FROM .
    WHERE = @GMID AND = 1;
   
    IF @GMLevel IS NULL
    BEGIN
      SELECT 0 as Success, '无GM权限' as Message;
      RETURN;
    END
   
    -- 检查命令权限
    SELECT @MinLevel = , @CmdDesc =
    FROM .
    WHERE = @CommandName AND = 1;
   
    IF @MinLevel IS NULL
    BEGIN
      SELECT 0 as Success, '未知命令或命令已禁用' as Message;
      RETURN;
    END
   
    IF @GMLevel < @MinLevel
    BEGIN
      SELECT 0 as Success, 'GM等级不足,需要等级' + CAST(@MinLevel as nvarchar) as Message;
      RETURN;
    END
   
    -- 记录操作日志
    INSERT INTO .
    (, , , , ,
   , , )
    SELECT
      @GMID,
      a.,
      g.,
      NULL,
      ':' + @CommandName,
      @Parameters,
      DATEDIFF(SECOND, '19700101', GETUTCDATE()),
      @IP
    FROM . g
    INNER JOIN . a ON g. = a.
    WHERE g. = @GMID;
   
    SELECT 1 as Success, @CmdDesc as Message;
END
GO


浮萍行者 发表于 2026-1-29 05:34:16

感谢分享:

liyicheng556 发表于 2026-1-29 10:30:03

进来看看哦

hate0115 发表于 2026-1-29 10:33:02

感谢楼主分享
页: [1]
查看完整版本: 远征GM系统增加脚本客户端服务端

本站内容如若侵犯到您的权益,请来电来函告知,我们会尽快处理!
联系QQ:1953150286,2251387361,123784736,免责申明