- 精华
- 阅读权限
- 90
- 贡献
- 人
- 好友
- 相册
- 分享
- 听众
- 收听
- 注册时间
- 2010-1-8
- 在线时间
- 小时
- 最后登录
- 1970-1-1
|
这个是客户端UI脚本
- --===================================================================
- -- GM系统配置表 v5.1
- -- 命令描述、参数提示、UI分组配置
- --===================================================================
- print("[GM客户端] 加载配置表...")
- 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[cmdName]
- return cmd and cmd.desc or "未知命令"
- end
- -- 获取命令参数
- function GMCommandConfig:GetCommandParams(cmdName)
- local cmd = self.commands[cmdName]
- 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客户端] 配置表加载完成")
复制代码- --===================================================================
- -- GM面板UI系统
- --===================================================================
- GMPanelUI = {
- window = nil,
- tabControl = nil,
- resultBox = nil,
- commandInput = nil,
- isVisible = false
- }
- -- 创建主窗口
- function GMPanelUI:Create()
- if not CreateWindow then
- print("[GM面板] 不支持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("[GM面板] 创建完成")
- 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("[GM服务器] 开始加载...")
- -- 基础工具函数(使用最安全的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("[GM服务器] " .. 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 = 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[cmdName]
- 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[i] = 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[i].name)
- end
- end
- return true
- end
- function OnGMMove(playerId, cmdStr, args)
- if countTable(args) < 1 then return false end
- log("执行move: " .. args[1])
- if TeleportToPlayer then
- TeleportToPlayer(playerId, args[1])
- 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[1])
- if SetActorHide then
- SetActorHide(playerId, args[1] == "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"})[i] 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 [YZ_GameDB_3D]
- GO
- CREATE TABLE [dbo].[GMCommands](
- [CmdID] [int] IDENTITY(1,1) NOT NULL PRIMARY KEY,
- [CommandName] [nvarchar](50) NOT NULL UNIQUE, -- 命令名(如"mute")
- [Description] [nvarchar](200) NOT NULL, -- 命令描述
- [MinGMLevel] [tinyint] NOT NULL DEFAULT(5), -- 最低GM等级
- [ParamCount] [tinyint] NOT NULL DEFAULT(0), -- 参数数量
- [ParamTypes] [nvarchar](100) NULL, -- 参数类型(如"string,number,string")
- [Category] [nvarchar](50) NULL, -- 分类
- [IsEnabled] [bit] NOT NULL DEFAULT(1) -- 是否启用
- );
- -- 插入51个GM命令
- INSERT INTO [dbo].[GMCommands]
- ([CommandName], [Description], [MinGMLevel], [ParamCount], [ParamTypes], [Category])
- 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 [dbo].[PrGs_ExecuteGMCommand]
- @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 = [GMLevel] FROM [dbo].[GameGMUsers]
- WHERE [ActorID] = @GMID AND [Status] = 1;
-
- IF @GMLevel IS NULL
- BEGIN
- SELECT 0 as Success, '无GM权限' as Message;
- RETURN;
- END
-
- -- 检查命令权限
- SELECT @MinLevel = [MinGMLevel], @CmdDesc = [Description]
- FROM [dbo].[GMCommands]
- WHERE [CommandName] = @CommandName AND [IsEnabled] = 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 [dbo].[GMOperationLog]
- ([GMID], [GMName], [AccountName], [TargetActorID], [Command],
- [Parameters], [OperationTime], [IP])
- SELECT
- @GMID,
- a.[ActorName],
- g.[AccountName],
- NULL,
- ':' + @CommandName,
- @Parameters,
- DATEDIFF(SECOND, '19700101', GETUTCDATE()),
- @IP
- FROM [dbo].[GameGMUsers] g
- INNER JOIN [dbo].[DXActorInfo] a ON g.[ActorID] = a.[ActorID]
- WHERE g.[ActorID] = @GMID;
-
- SELECT 1 as Success, @CmdDesc as Message;
- END
- GO
复制代码
|
|