藏宝湾网游单机站

 找回密码
 注册

QQ登录

只需一步,快速开始

★69 元包站 Gm 手游平台★

★69 元包站 Gm 手游平台★

★Gm 游戏平台【无限资源包站平台,真正体验gm和土豪感觉】★

★白嫖放置传奇 玩通关算你赢★

★白嫖放置传奇 玩通关算你赢★

★白嫖长久耐玩型 放置类挂机传奇游戏 充值可打 安全挂机 可交易 无PK★

★@梦幻长久耐玩全新大唐九黎★

★@!!——梦幻长久耐玩全新大唐九黎——!!★

★★新增全新门派九黎城, ★侵烛系统 ★静脉系统 ★赐福系统 ★战斗动作声效系统 ★全场景NPC、召唤兽迭代最新 ★17个副本,完全还原 ★独家PK系统,享受极致免费PK★★

承接推广
★承接推广★

★承接推广★

☆ 六一活动开放-放置传奇☆

★ 六一活动开放-放置传奇★

★可白嫖 上班摸鱼类 放置文字传奇游戏(放置休闲)qq群756025698★

★三职业复古★开局送神装★爆率100%★零氪首选★

★三职业复古★开局送神装★爆率100%★零氪首选★

★〖双线〗〖无忧传奇〗〖每日新区〗〖开局送神装 100%高爆率 装备元宝打怪爆〗★

承接推广

★承接推广★

★承接推广★

承接推广

★承接推广★

★承接推广★

★DNF★全职业平衡★公益服★
★DNF★全职业平衡★公益服★

【dnf86版本】【怀旧服】【全职业平衡】【非变态服】【非商业服】【774031300】

★承接推广★

★承接推广★

★承接推广★

★承接推广★

★承接推广★

★承接推广★

★承接推广★

★承接推广★

★承接推广★

查看: 574|回复: 3

[原创] 远征GM系统增加脚本客户端服务端

[复制链接]
 楼主| 发表于 2026-1-28 17:12:03 | 显示全部楼层 |阅读模式
这个是客户端UI脚本

  1. --===================================================================
  2. -- GM系统配置表 v5.1
  3. -- 命令描述、参数提示、UI分组配置
  4. --===================================================================
  5. print("[GM客户端] 加载配置表...")

  6. GMCommandConfig = {
  7.     -- 命令元数据
  8.     commands = {
  9.         count = {
  10.             desc = "统计在线人数",
  11.             params = {},
  12.             category = "基础统计",
  13.             shortcut = "F1"
  14.         },
  15.         userlist = {
  16.             desc = "查看玩家列表",
  17.             params = {},
  18.             category = "基础统计",
  19.             shortcut = "F2"
  20.         },
  21.         retrieve = {
  22.             desc = "全面恢复HP/MP",
  23.             params = {},
  24.             category = "基础统计",
  25.             shortcut = "F3"
  26.         },
  27.         tile = {
  28.             desc = "传送到坐标",
  29.             params = {
  30.                 {name = "x", type = "number", desc = "X坐标"},
  31.                 {name = "y", type = "number", desc = "Y坐标"},
  32.                 {name = "map", type = "number", desc = "地图ID(可选)"}
  33.             },
  34.             category = "传送移动",
  35.             example = ":tile 100,200"
  36.         },
  37.         move = {
  38.             desc = "传送到玩家身边",
  39.             params = {
  40.                 {name = "player", type = "string", desc = "目标玩家名"}
  41.             },
  42.             category = "传送移动",
  43.             example = ":move 玩家A"
  44.         },
  45.         pull = {
  46.             desc = "拉人到自己身边",
  47.             params = {
  48.                 {name = "player", type = "string", desc = "目标玩家名"}
  49.             },
  50.             category = "传送移动",
  51.             example = ":pull 玩家B"
  52.         },
  53.         hide = {
  54.             desc = "隐身/显身切换",
  55.             params = {
  56.                 {name = "flag", type = "number", desc = "1=隐身,0=显身"}
  57.             },
  58.             category = "传送移动",
  59.             example = ":hide 1"
  60.         },
  61.         mute = {
  62.             desc = "禁言玩家",
  63.             params = {
  64.                 {name = "player", type = "string", desc = "玩家名"},
  65.                 {name = "time", type = "number", desc = "时长(分钟)"},
  66.                 {name = "reason", type = "string", desc = "原因"}
  67.             },
  68.             category = "玩家管理",
  69.             example = ":mute 玩家C,60,辱骂"
  70.         },
  71.         kick = {
  72.             desc = "踢玩家下线",
  73.             params = {
  74.                 {name = "player", type = "string", desc = "玩家名"},
  75.                 {name = "reason", type = "string", desc = "原因(可选)"}
  76.             },
  77.             category = "玩家管理",
  78.             example = ":kick 玩家D"
  79.         },
  80.         kick2 = {
  81.             desc = "踢下线并广播",
  82.             params = {
  83.                 {name = "player", type = "string", desc = "玩家名"},
  84.                 {name = "reason", type = "string", desc = "广播内容"}
  85.             },
  86.             category = "玩家管理",
  87.             example = ":kick2 玩家E,使用外挂"
  88.         },
  89.         freeze = {
  90.             desc = "封号处理",
  91.             params = {
  92.                 {name = "player", type = "string", desc = "玩家名"}
  93.             },
  94.             category = "玩家管理",
  95.             example = ":freeze 玩家F"
  96.         },
  97.         prison = {
  98.             desc = "关进监狱",
  99.             params = {
  100.                 {name = "player", type = "string", desc = "玩家名"}
  101.             },
  102.             category = "玩家管理",
  103.             example = ":prison 玩家G"
  104.         },
  105.         getitem = {
  106.             desc = "获得物品",
  107.             params = {
  108.                 {name = "itemId", type = "number", desc = "物品ID"},
  109.                 {name = "count", type = "number", desc = "数量"},
  110.                 {name = "bind", type = "number", desc = "绑定(1=是,0=否)"}
  111.             },
  112.             category = "物品/怪物",
  113.             example = ":getitem 1001,10,1"
  114.         },
  115.         callmonster = {
  116.             desc = "召唤怪物",
  117.             params = {
  118.                 {name = "monsterId", type = "number", desc = "怪物ID"},
  119.                 {name = "count", type = "number", desc = "数量"},
  120.                 {name = "level", type = "number", desc = "等级(可选)"}
  121.             },
  122.             category = "物品/怪物",
  123.             example = ":callmonster 2001,5"
  124.         },
  125.         resetectype = {
  126.             desc = "重置副本次数",
  127.             params = {},
  128.             category = "物品/怪物"
  129.         },
  130.         ad = {
  131.             desc = "发布公告",
  132.             params = {
  133.                 {name = "content", type = "string", desc = "公告内容"}
  134.             },
  135.             category = "系统工具",
  136.             example = ':ad 服务器活动开启!'
  137.         },
  138.         wh = {
  139.             desc = "维护公告",
  140.             params = {},
  141.             category = "系统工具"
  142.         },
  143.         sp = {
  144.             desc = "扫描外挂",
  145.             params = {},
  146.             category = "扫描监控"
  147.         },
  148.         scanqq = {
  149.             desc = "获取玩家QQ",
  150.             params = {
  151.                 {name = "player", type = "string", desc = "玩家名"}
  152.             },
  153.             category = "扫描监控"
  154.         },
  155.         monitorlua = {
  156.             desc = "监控Lua错误",
  157.             params = {},
  158.             category = "扫描监控"
  159.         },
  160.         cancelmonitorlua = {
  161.             desc = "取消Lua监控",
  162.             params = {},
  163.             category = "扫描监控"
  164.         }
  165.     },
  166.    
  167.     -- 快捷键配置
  168.     shortcuts = {
  169.         {key = "F10", action = "ToggleGMPanel", desc = "开关GM面板"},
  170.         {key = "F1", command = ":count", desc = "统计在线"},
  171.         {key = "F2", command = ":userlist", desc = "玩家列表"},
  172.         {key = "F3", command = ":retrieve", desc = "全面恢复"},
  173.         {key = "F5", command = ":hide 1", desc = "隐身"},
  174.         {key = "F6", command = ":hide 0", desc = "显身"}
  175.     }
  176. }

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

  182. -- 获取命令参数
  183. function GMCommandConfig:GetCommandParams(cmdName)
  184.     local cmd = self.commands[cmdName]
  185.     return cmd and cmd.params or {}
  186. end

  187. -- 获取分类
  188. function GMCommandConfig:GetCommandsByCategory(category)
  189.     local result = {}
  190.     for name, cmd in pairs(self.commands) do
  191.         if cmd.category == category then
  192.             table.insert(result, name)
  193.         end
  194.     end
  195.     return result
  196. end

  197. print("[GM客户端] 配置表加载完成")
复制代码
  1. --===================================================================
  2. -- GM面板UI系统
  3. --===================================================================
  4. GMPanelUI = {
  5.     window = nil,
  6.     tabControl = nil,
  7.     resultBox = nil,
  8.     commandInput = nil,
  9.     isVisible = false
  10. }

  11. -- 创建主窗口
  12. function GMPanelUI:Create()
  13.     if not CreateWindow then
  14.         print("[GM面板] 不支持UI创建")
  15.         return
  16.     end
  17.    
  18.     -- 主窗口
  19.     self.window = CreateWindow("GMPanel", "GM命令面板",
  20.         200, 100, 800, 600,
  21.         true, true, true)
  22.    
  23.     if not self.window then return end
  24.    
  25.     -- 创建标签页
  26.     self.tabControl = self.window:CreateTabControl("MainTab", 10, 10, 780, 480)
  27.    
  28.     -- 基础命令页
  29.     self:CreateBasicTab()
  30.    
  31.     -- 玩家管理页
  32.     self:CreatePlayerTab()
  33.    
  34.     -- 物品/怪物页
  35.     self:CreateItemTab()
  36.    
  37.     -- 系统工具页
  38.     self:CreateSystemTab()
  39.    
  40.     -- 快捷命令页
  41.     self:CreateQuickTab()
  42.    
  43.     -- 结果显示区
  44.     self.resultBox = self.window:CreateMultiLineEdit("ResultBox",
  45.         "", 10, 500, 600, 90, false)
  46.     self.resultBox:SetReadOnly(true)
  47.    
  48.     -- 命令输入框
  49.     self.commandInput = self.window:CreateEdit("CommandInput",
  50.         "", 10, 595, 500, 25)
  51.    
  52.     -- 执行按钮
  53.     local executeBtn = self.window:CreateButton("ExecuteBtn", "执行",
  54.         520, 595, 80, 25)
  55.     executeBtn:SetClickCallback(function()
  56.         self:OnExecuteCommand()
  57.     end)
  58.    
  59.     -- 清空按钮
  60.     local clearBtn = self.window:CreateButton("ClearBtn", "清空结果",
  61.         610, 595, 80, 25)
  62.     clearBtn:SetClickCallback(function()
  63.         self.resultBox:SetText("")
  64.     end)
  65.    
  66.     -- 历史按钮
  67.     local historyBtn = self.window:CreateButton("HistoryBtn", "历史",
  68.         700, 595, 80, 25)
  69.     historyBtn:SetClickCallback(function()
  70.         self:ShowHistory()
  71.     end)
  72.    
  73.     -- 默认隐藏
  74.     self.window:Hide()
  75.     self.isVisible = false
  76.    
  77.     print("[GM面板] 创建完成")
  78. end

  79. -- 基础命令页
  80. function GMPanelUI:CreateBasicTab()
  81.     local tab = self.tabControl:AddTab("基础操作")
  82.    
  83.     -- 在线统计
  84.     local row = 10
  85.     tab:CreateButton("CountBtn", "统计在线", 10, row, 120, 25)
  86.         :SetClickCallback(function() GMClient:QuickCommand("count") end)
  87.    
  88.     tab:CreateButton("UserListBtn", "玩家列表", 140, row, 120, 25)
  89.         :SetClickCallback(function() GMClient:QuickCommand("userlist") end)
  90.    
  91.     -- 位置操作
  92.     row = row + 35
  93.     tab:CreateLabel("", "目标玩家:", 10, row + 5)
  94.     local targetEdit = tab:CreateEdit("TargetPlayer", "", 80, row, 120, 25)
  95.    
  96.     tab:CreateButton("MoveBtn", "移动到TA", 210, row, 80, 25)
  97.         :SetClickCallback(function()
  98.             local target = targetEdit:GetText()
  99.             if target ~= "" then
  100.                 GMClient:QuickCommand("move", target)
  101.             end
  102.         end)
  103.    
  104.     tab:CreateButton("PullBtn", "拉取到身边", 300, row, 80, 25)
  105.         :SetClickCallback(function()
  106.             local target = targetEdit:GetText()
  107.             if target ~= "" then
  108.                 GMClient:QuickCommand("pull", target)
  109.             end
  110.         end)
  111.    
  112.     -- 隐身切换
  113.     row = row + 35
  114.     tab:CreateButton("HideBtn", "隐身模式", 10, row, 120, 25)
  115.         :SetClickCallback(function() GMClient:QuickCommand("hide", "1") end)
  116.    
  117.     tab:CreateButton("ShowBtn", "显身模式", 140, row, 120, 25)
  118.         :SetClickCallback(function() GMClient:QuickCommand("hide", "0") end)
  119.    
  120.     -- 坐标传送
  121.     row = row + 35
  122.     tab:CreateLabel("", "X坐标:", 10, row + 5)
  123.     local xEdit = tab:CreateEdit("PosX", "100", 60, row, 60, 25)
  124.    
  125.     tab:CreateLabel("", "Y坐标:", 130, row + 5)
  126.     local yEdit = tab:CreateEdit("PosY", "100", 180, row, 60, 25)
  127.    
  128.     tab:CreateButton("TileBtn", "传送", 250, row, 60, 25)
  129.         :SetClickCallback(function()
  130.             local x = xEdit:GetText()
  131.             local y = yEdit:GetText()
  132.             GMClient:QuickCommand("tile", x .. "," .. y)
  133.         end)
  134. end

  135. -- 玩家管理页
  136. function GMPanelUI:CreatePlayerTab()
  137.     local tab = self.tabControl:AddTab("玩家管理")
  138.    
  139.     local row = 10
  140.    
  141.     -- 目标玩家
  142.     tab:CreateLabel("", "玩家名:", 10, row + 5)
  143.     local targetEdit = tab:CreateEdit("PM_Target", "", 70, row, 150, 25)
  144.    
  145.     tab:CreateButton("GetInfoBtn", "获取信息", 230, row, 80, 25)
  146.         :SetClickCallback(function()
  147.             local name = targetEdit:GetText()
  148.             if name ~= "" then
  149.                 GMClient:QuickCommand("getuserinfo", name)
  150.             end
  151.         end)
  152.    
  153.     -- 禁言控制
  154.     row = row + 35
  155.     tab:CreateLabel("", "禁言时长(分钟):", 10, row + 5)
  156.     local muteTime = tab:CreateEdit("MuteTime", "60", 120, row, 80, 25)
  157.    
  158.     tab:CreateButton("MuteBtn", "禁言", 210, row, 60, 25)
  159.         :SetClickCallback(function()
  160.             local name = targetEdit:GetText()
  161.             local time = muteTime:GetText()
  162.             if name ~= "" and time ~= "" then
  163.                 GMClient:QuickCommand("mute", name .. "," .. time)
  164.             end
  165.         end)
  166.    
  167.     -- 踢下线
  168.     row = row + 35
  169.     tab:CreateButton("KickBtn", "踢下线", 10, row, 80, 25)
  170.         :SetClickCallback(function()
  171.             local name = targetEdit:GetText()
  172.             if name ~= "" then
  173.                 GMClient:QuickCommand("kick", name)
  174.             end
  175.         end)
  176.    
  177.     tab:CreateButton("Kick2Btn", "踢下线+广播", 100, row, 100, 25)
  178.         :SetClickCallback(function()
  179.             local name = targetEdit:GetText()
  180.             if name ~= "" then
  181.                 GMClient:QuickCommand("kick2", name)
  182.             end
  183.         end)
  184.    
  185.     -- 封号/坐牢
  186.     row = row + 35
  187.     tab:CreateButton("FreezeBtn", "封号", 10, row, 80, 25)
  188.         :SetClickCallback(function()
  189.             local name = targetEdit:GetText()
  190.             if name ~= "" then
  191.                 GMClient:QuickCommand("freeze", name)
  192.             end
  193.         end)
  194.    
  195.     tab:CreateButton("PrisonBtn", "关监狱", 100, row, 80, 25)
  196.         :SetClickCallback(function()
  197.             local name = targetEdit:GetText()
  198.             if name ~= "" then
  199.                 GMClient:QuickCommand("prison", name)
  200.             end
  201.         end)
  202. end

  203. -- 物品/怪物页
  204. function GMPanelUI:CreateItemTab()
  205.     local tab = self.tabControl:AddTab("物品/怪物")
  206.    
  207.     local row = 10
  208.    
  209.     -- 获取物品
  210.     tab:CreateLabel("", "物品ID:", 10, row + 5)
  211.     local itemIdEdit = tab:CreateEdit("ItemID", "10001", 70, row, 100, 25)
  212.    
  213.     tab:CreateLabel("", "数量:", 180, row + 5)
  214.     local itemCountEdit = tab:CreateEdit("ItemCount", "1", 220, row, 60, 25)
  215.    
  216.     tab:CreateButton("GetItemBtn", "获得物品", 290, row, 80, 25)
  217.         :SetClickCallback(function()
  218.             local id = itemIdEdit:GetText()
  219.             local count = itemCountEdit:GetText()
  220.             GMClient:QuickCommand("getitem", id .. "," .. count)
  221.         end)
  222.    
  223.     -- 召唤怪物
  224.     row = row + 35
  225.     tab:CreateLabel("", "怪物ID:", 10, row + 5)
  226.     local monsterIdEdit = tab:CreateEdit("MonsterID", "20001", 70, row, 100, 25)
  227.    
  228.     tab:CreateLabel("", "数量:", 180, row + 5)
  229.     local monsterCountEdit = tab:CreateEdit("MonsterCount", "1", 220, row, 60, 25)
  230.    
  231.     tab:CreateButton("CallMonsterBtn", "召唤", 290, row, 80, 25)
  232.         :SetClickCallback(function()
  233.             local id = monsterIdEdit:GetText()
  234.             local count = monsterCountEdit:GetText()
  235.             GMClient:QuickCommand("callmonster", id .. "," .. count)
  236.         end)
  237.    
  238.     -- 重置副本
  239.     row = row + 35
  240.     tab:CreateButton("ResetEctypeBtn", "重置所有副本次数", 10, row, 150, 25)
  241.         :SetClickCallback(function() GMClient:QuickCommand("resetectype") end)
  242. end

  243. -- 系统工具页
  244. function GMPanelUI:CreateSystemTab()
  245.     local tab = self.tabControl:AddTab("系统工具")
  246.    
  247.     local row = 10
  248.    
  249.     -- 公告系统
  250.     tab:CreateLabel("", "公告内容:", 10, row + 5)
  251.     local adEdit = tab:CreateMultiLineEdit("AD_Content", "", 10, row + 25, 300, 60)
  252.    
  253.     tab:CreateButton("ADBtn", "发布公告", 320, row, 80, 25)
  254.         :SetClickCallback(function()
  255.             local content = adEdit:GetText()
  256.             if content ~= "" then
  257.                 GMClient:QuickCommand("ad", content)
  258.                 adEdit:SetText("")
  259.             end
  260.         end)
  261.    
  262.     -- 维护公告
  263.     row = row + 70
  264.     tab:CreateButton("MaintainBtn", "维护公告", 10, row, 100, 25)
  265.         :SetClickCallback(function()
  266.             GMClient:QuickCommand("wh")
  267.         end)
  268.    
  269.     -- 扫描工具
  270.     row = row + 35
  271.     tab:CreateLabel("", "目标玩家:", 10, row + 5)
  272.     local scanTarget = tab:CreateEdit("ScanTarget", "", 80, row, 120, 25)
  273.    
  274.     tab:CreateButton("ScanQQBtn", "扫描QQ", 210, row, 80, 25)
  275.         :SetClickCallback(function()
  276.             local name = scanTarget:GetText()
  277.             if name ~= "" then
  278.                 GMClient:QuickCommand("scanqq", name)
  279.             end
  280.         end)
  281.    
  282.     tab:CreateButton("ScanProcessBtn", "扫描进程", 300, row, 80, 25)
  283.         :SetClickCallback(function()
  284.             local name = scanTarget:GetText()
  285.             if name ~= "" then
  286.                 GMClient:QuickCommand("scanprocess", name)
  287.             end
  288.         end)
  289. end

  290. -- 快捷命令页
  291. function GMPanelUI:CreateQuickTab()
  292.     local tab = self.tabControl:AddTab("快捷命令")
  293.    
  294.     local quickCmds = {
  295.         {name = "全面恢复", cmd = "retrieve"},
  296.         {name = "隐身", cmd = "hide 1"},
  297.         {name = "显身", cmd = "hide 0"},
  298.         {name = "扫描外挂", cmd = "sp"},
  299.         {name = "获取log", cmd = "getlog"},
  300.     }
  301.    
  302.     local row = 10
  303.     for i, qc in ipairs(quickCmds) do
  304.         local btn = tab:CreateButton("QuickBtn" .. i, qc.name,
  305.             10 + ((i-1) % 3) * 120,
  306.             row + math.floor((i-1) / 3) * 35,
  307.             110, 30)
  308.         
  309.         btn:SetClickCallback(function()
  310.             GMClient:SendCommand(qc.cmd)
  311.         end)
  312.     end
  313. end

  314. -- 显示/隐藏
  315. function GMPanelUI:Show()
  316.     if self.window then
  317.         self.window:Show()
  318.         self.isVisible = true
  319.     end
  320. end

  321. function GMPanelUI:Hide()
  322.     if self.window then
  323.         self.window:Hide()
  324.         self.isVisible = false
  325.     end
  326. end

  327. -- 执行命令
  328. function GMPanelUI:OnExecuteCommand()
  329.     local cmd = self.commandInput:GetText()
  330.     if cmd and cmd ~= "" then
  331.         GMClient:SendCommand(cmd)
  332.         self.commandInput:SetText("")
  333.     end
  334. end

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

  344. -- 显示历史
  345. function GMPanelUI:ShowHistory()
  346.     local history = GMClient:GetHistory()
  347.     local text = "=== 命令历史 ===\n"
  348.    
  349.     for i, h in ipairs(history) do
  350.         text = text .. h.time .. " " .. h.cmd .. "\n"
  351.     end
  352.    
  353.     self:ShowResult("\n" .. text)
  354. end

  355. -- 销毁
  356. function GMPanelUI:Destroy()
  357.     if self.window then
  358.         self.window:Destroy()
  359.         self.window = nil
  360.     end
  361.     self.isVisible = false
  362. end
复制代码
服务端lua脚本加载
  1. --===================================================================
  2. -- GM命令系统 - 服务端 v7.0
  3. -- 基于 GMCommandManager.cpp 完整实现
  4. --===================================================================

  5. print("[GM服务器] 开始加载...")

  6. -- 基础工具函数(使用最安全的Lua语法)
  7. local function countTable(tbl)
  8.     local c = 0
  9.     if tbl then
  10.         for _ in pairs(tbl) do
  11.             c = c + 1
  12.         end
  13.     end
  14.     return c
  15. end

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

  19. local function log(msg)
  20.     print("[GM服务器] " .. msg)
  21. end

  22. --===================================================================
  23. -- GM命令管理器
  24. --===================================================================
  25. GMCommandManager = {
  26.     commands = {}
  27. }

  28. function GMCommandManager:init()
  29.     log("开始注册51个GM命令...")
  30.     self.commands = {}
  31.    
  32.     -- 基础统计
  33.     self:Register("count",       "统计在线人数",                    OnGMCount)
  34.     self:Register("userlist",    "查看玩家列表",                    OnGMUserlist)
  35.     self:Register("statuserinfo","统计在线玩家信息",                OnGMStatUserInfo)
  36.     self:Register("getuserinfo", "获取指定玩家信息",                OnGMGetUserInfo)
  37.    
  38.     -- 位置操作
  39.     self:Register("tile",        "移动到指定坐标",                  OnGMTile)
  40.     self:Register("move",        "移动到玩家身边",                  OnGMMove)
  41.     self:Register("moveex",      "移动到玩家身边(加强)",            OnGMMoveEx)
  42.     self:Register("pull",        "拉人到自己身边",                  OnGMPull)
  43.     self:Register("push",        "将玩家1推到玩家2旁",              OnGMPush)
  44.     self:Register("setpos",      "设置玩家位置",                    OnGMSetPos)
  45.     self:Register("getpos",      "获取玩家位置",                    OnGMGetPos)
  46.     self:Register("hang",        "跨区传送到默认位置",              OnGMHang)
  47.     self:Register("checkzone",   "查询玩家在公共区还是普通区",      OnGMCheckZone)
  48.    
  49.     -- 权限管理
  50.     self:Register("mute",        "禁言玩家",                        OnGMMute)
  51.     self:Register("muteex",      "禁言玩家(加强)",                  OnGMMuteEx)
  52.     self:Register("mute2",       "禁言并广播",                      OnGMMuteBroadcast)
  53.     self:Register("kick",        "踢玩家下线",                      OnGMKick)
  54.     self:Register("kick2",       "踢下线并广播",                    OnGMKickBroadcast)
  55.     self:Register("freeze",      "封号",                            OnGMFreeze)
  56.     self:Register("prison",      "蹲监牢",                          OnGMPrison)
  57.     self:Register("sst",         "设置安全时间",                    OnGMSetSecurityTime)
  58.     self:Register("rudefine",    "修改非文明值",                    OnGMRudeFine)
  59.    
  60.     -- 状态管理
  61.     self:Register("hide",        "隐身/显身",                       OnGMHide)
  62.     self:Register("retrieve",    "全面恢复",                        OnGMRetrieve)
  63.    
  64.     -- 物品与怪物
  65.     self:Register("getitem",     "获得物品",                        OnGMGetItem)
  66.     self:Register("callmonster", "召唤怪物",                        OnGMCallMonster)
  67.     self:Register("resetectype", "重置副本次数",                    OnGMResetEctype)
  68.    
  69.     -- 公告系统
  70.     self:Register("ad",          "发布公告(支持多条)",            OnGMAD)
  71.     self:Register("resetad",     "重置登录公告(支持多条)",        OnGMADReset)
  72.     self:Register("wh",          "维护公告",                        OnGMMaintain)
  73.    
  74.     -- 监控与扫描
  75.     self:Register("monitorlua",      "监控玩家客户端Lua出错信息",   OnGMMonitorLuaError)
  76.     self:Register("cancelmonitorlua","取消监控Lua出错信息",          OnGMCancelMonitorLuaError)
  77.     self:Register("sp",          "扫描外挂进程",                    OnGMScanPlugin)
  78.     self:Register("spex",        "扫描外挂(MD5)",                   OnGMScanModeMd5)
  79.     self:Register("scanprocess", "获取玩家进程列表",                OnGMScanProcess)
  80.     self:Register("scanqq",      "获取玩家登录的QQ",                OnGMScanQQ)
  81.     self:Register("scanwinver",  "获取玩家Windows版本",            OnGMScanWinVER)
  82.     self:Register("scanping",    "查看玩家ping值",                  OnGMScanPing)
  83.     self:Register("kill",        "杀掉玩家指定进程",                OnGMKillProcess)
  84.     self:Register("scanmode",    "扫描指定进程",                    OnGMScanMode)
  85.    
  86.     -- 文件与日志
  87.     self:Register("getfile",     "获取指定玩家文件",                OnGMGetFile)
  88.     self:Register("getlog",      "获取指定玩家游戏log",            OnGMGetLog)
  89.     self:Register("getpath",     "获取玩家工作目录",                OnGMGetPath)
  90.     self:Register("md5",         "扫描文件MD5",                     OnGMFileMd5)
  91.    
  92.     -- 调试
  93.     self:Register("debug",       "开关客户端调试模式",            OnGMDebug)
  94.     self:Register("startprofile","启动性能测试",                    OnGMStartProfile)
  95.     self:Register("stopprofile", "停止性能测试",                    OnGMStopProfile)
  96.     self:Register("cmd",         "执行远程控制台命令",            OnGMConsoleCMD)
  97.    
  98.     -- 队伍
  99.     self:Register("team",        "获取队伍成员列表",                OnGMTeam)
  100.    
  101.     -- 时间
  102.     self:Register("settime",     "修改服务器时间",                  OnGMSetTime)
  103.    
  104.     -- 关键字
  105.     self:Register("addkey",      "动态添加关键字",                  OnGMAddKey)
  106.     self:Register("removekey",   "动态删除关键字",                  OnGMRemoveKey)
  107.     self:Register("clearkey",    "动态清空关键字",                  OnGMClearKey)
  108.    
  109.     log("命令注册完成,总数: " .. countTable(self.commands))
  110. end

  111. function GMCommandManager:Register(name, desc, handler)
  112.     self.commands[name] = {
  113.         name = name,
  114.         desc = desc,
  115.         execute = handler
  116.     }
  117. end

  118. -- C++调用入口
  119. function HandleGMCommand(playerId, cmdStr)
  120.     log("收到GM命令: playerId=" .. tostring(playerId) .. " cmd=" .. cmdStr)
  121.    
  122.     local ok, result = pcall(function()
  123.         return GMCommandManager:execute(playerId, cmdStr)
  124.     end)
  125.    
  126.     if ok then
  127.         log("命令处理成功")
  128.         return true
  129.     else
  130.         log("处理失败: " .. tostring(result))
  131.         return false
  132.     end
  133. end

  134. function GMCommandManager:execute(playerId, cmdStr)
  135.     if not IsGM or not IsGM(playerId) then
  136.         log("权限不足: " .. tostring(playerId))
  137.         return false
  138.     end
  139.    
  140.     local cmdName = string.match(cmdStr, "^:([%a_]+)")
  141.     if not cmdName then
  142.         log("命令格式错误: " .. cmdStr)
  143.         return false
  144.     end
  145.    
  146.     local cmd = self.commands[cmdName]
  147.     if not cmd then
  148.         log("未知命令: " .. cmdName)
  149.         return false
  150.     end
  151.    
  152.     local args = {}
  153.     local argStr = string.match(cmdStr, "^:[%a_]+%s+(.+)$")
  154.     if argStr then
  155.         local i = 1
  156.         for arg in string.gmatch(argStr, "([^,]+)") do
  157.             args[i] = trim(arg)
  158.             i = i + 1
  159.         end
  160.     end
  161.    
  162.     log("执行: " .. cmdName)
  163.     return cmd.execute(playerId, cmdStr, args)
  164. end

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

  174. function OnGMUserlist(playerId, cmdStr, args)
  175.     log("执行userlist")
  176.     if GetOnlinePlayers then
  177.         local players = GetOnlinePlayers()
  178.         for i = 1, countTable(players) do
  179.             SendSystemChat(playerId, players[i].name)
  180.         end
  181.     end
  182.     return true
  183. end

  184. function OnGMMove(playerId, cmdStr, args)
  185.     if countTable(args) < 1 then return false end
  186.     log("执行move: " .. args[1])
  187.     if TeleportToPlayer then
  188.         TeleportToPlayer(playerId, args[1])
  189.     end
  190.     return true
  191. end

  192. function OnGMRetrieve(playerId, cmdStr, args)
  193.     log("执行retrieve")
  194.     if SetActorProperty then
  195.         SetActorProperty(playerId, 1001, 1000000) -- HP
  196.         SetActorProperty(playerId, 1002, 1000000) -- MP
  197.     end
  198.     return true
  199. end

  200. function OnGMHide(playerId, cmdStr, args)
  201.     if countTable(args) < 1 then return false end
  202.     log("执行hide: " .. args[1])
  203.     if SetActorHide then
  204.         SetActorHide(playerId, args[1] == "1")
  205.     end
  206.     return true
  207. end

  208. -- 其他命令实现...
  209. for i = 1, 40 do
  210.     _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
  211. end

  212. -- 初始化
  213. GMCommandManager:init()

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

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

  11. <procedure name="PrGs_GetGMOperationLog" cmdid="5102" databaseid="1">
  12.     <param name="@GMID" type="int" dir="in" size="4" optional="true" />
  13.     <param name="@StartTime" type="int" dir="in" size="4" />
  14.     <param name="@EndTime" type="int" dir="in" size="4" />
  15. </procedure>
复制代码
数据库储存
  1. USE [YZ_GameDB_3D]
  2. GO

  3. CREATE TABLE [dbo].[GMCommands](
  4.     [CmdID] [int] IDENTITY(1,1) NOT NULL PRIMARY KEY,
  5.     [CommandName] [nvarchar](50) NOT NULL UNIQUE,      -- 命令名(如"mute")
  6.     [Description] [nvarchar](200) NOT NULL,            -- 命令描述
  7.     [MinGMLevel] [tinyint] NOT NULL DEFAULT(5),        -- 最低GM等级
  8.     [ParamCount] [tinyint] NOT NULL DEFAULT(0),        -- 参数数量
  9.     [ParamTypes] [nvarchar](100) NULL,                 -- 参数类型(如"string,number,string")
  10.     [Category] [nvarchar](50) NULL,                    -- 分类
  11.     [IsEnabled] [bit] NOT NULL DEFAULT(1)              -- 是否启用
  12. );

  13. -- 插入51个GM命令
  14. INSERT INTO [dbo].[GMCommands]
  15. ([CommandName], [Description], [MinGMLevel], [ParamCount], [ParamTypes], [Category])
  16. VALUES
  17. ('count', '统计在线人数', 1, 0, NULL, '基础统计'),
  18. ('userlist', '查看玩家列表', 1, 0, NULL, '基础统计'),
  19. ('tile', '传送到坐标', 5, 2, 'number,number', '传送移动'),
  20. ('move', '传送到玩家身边', 5, 1, 'string', '传送移动'),
  21. ('pull', '拉人到自己身边', 5, 1, 'string', '传送移动'),
  22. ('hide', '隐身/显身', 5, 1, 'number', '传送移动'),
  23. ('mute', '禁言玩家', 5, 3, 'string,number,string', '玩家管理'),
  24. ('kick', '踢玩家下线', 5, 2, 'string,string', '玩家管理'),
  25. ('kick2', '踢下线并广播', 10, 2, 'string,string', '玩家管理'),
  26. ('freeze', '封号', 10, 1, 'string', '玩家管理'),
  27. ('prison', '关监狱', 10, 1, 'string', '玩家管理'),
  28. ('retrieve', '全面恢复', 1, 0, NULL, '基础统计'),
  29. ('getitem', '获得物品', 5, 3, 'number,number,number', '物品系统'),
  30. ('callmonster', '召唤怪物', 5, 3, 'number,number,number', '物品系统'),
  31. ('resetectype', '重置副本次数', 10, 0, NULL, '物品系统'),
  32. ('ad', '发布公告', 5, 1, 'string', '公告系统'),
  33. ('wh', '维护公告', 10, 0, NULL, '公告系统'),
  34. ('sp', '扫描外挂', 10, 0, NULL, '监控系统'),
  35. ('scanqq', '获取玩家QQ', 10, 1, 'string', '监控系统'),
  36. ('monitorlua', '监控Lua错误', 10, 0, NULL, '监控系统'),
  37. ('cancelmonitorlua', '取消Lua监控', 10, 0, NULL, '监控系统');
复制代码
  1. CREATE PROCEDURE [dbo].[PrGs_ExecuteGMCommand]
  2.     @GMID int,
  3.     @CommandName nvarchar(50),
  4.     @Parameters nvarchar(500) = NULL,
  5.     @IP nvarchar(50) = NULL
  6. AS
  7. BEGIN
  8.     SET NOCOUNT ON;
  9.    
  10.     DECLARE @GMLevel tinyint;
  11.     DECLARE @MinLevel tinyint;
  12.     DECLARE @CmdDesc nvarchar(200);
  13.    
  14.     -- 检查GM等级
  15.     SELECT @GMLevel = [GMLevel] FROM [dbo].[GameGMUsers]
  16.     WHERE [ActorID] = @GMID AND [Status] = 1;
  17.    
  18.     IF @GMLevel IS NULL
  19.     BEGIN
  20.         SELECT 0 as Success, '无GM权限' as Message;
  21.         RETURN;
  22.     END
  23.    
  24.     -- 检查命令权限
  25.     SELECT @MinLevel = [MinGMLevel], @CmdDesc = [Description]
  26.     FROM [dbo].[GMCommands]
  27.     WHERE [CommandName] = @CommandName AND [IsEnabled] = 1;
  28.    
  29.     IF @MinLevel IS NULL
  30.     BEGIN
  31.         SELECT 0 as Success, '未知命令或命令已禁用' as Message;
  32.         RETURN;
  33.     END
  34.    
  35.     IF @GMLevel < @MinLevel
  36.     BEGIN
  37.         SELECT 0 as Success, 'GM等级不足,需要等级' + CAST(@MinLevel as nvarchar) as Message;
  38.         RETURN;
  39.     END
  40.    
  41.     -- 记录操作日志
  42.     INSERT INTO [dbo].[GMOperationLog]
  43.     ([GMID], [GMName], [AccountName], [TargetActorID], [Command],
  44.      [Parameters], [OperationTime], [IP])
  45.     SELECT
  46.         @GMID,
  47.         a.[ActorName],
  48.         g.[AccountName],
  49.         NULL,
  50.         ':' + @CommandName,
  51.         @Parameters,
  52.         DATEDIFF(SECOND, '19700101', GETUTCDATE()),
  53.         @IP
  54.     FROM [dbo].[GameGMUsers] g
  55.     INNER JOIN [dbo].[DXActorInfo] a ON g.[ActorID] = a.[ActorID]
  56.     WHERE g.[ActorID] = @GMID;
  57.    
  58.     SELECT 1 as Success, @CmdDesc as Message;
  59. END
  60. GO
复制代码


[发帖际遇]: bfdz49 被钱袋砸中进医院,看病花了 1 枚 金币. 幸运榜 / 衰神榜
回复

使用道具 举报

发表于 2026-1-29 05:34:16 | 显示全部楼层
感谢分享
回复 支持 反对

使用道具 举报

发表于 2026-1-29 10:30:03 | 显示全部楼层
进来看看哦
回复 支持 反对

使用道具 举报

发表于 2026-1-29 10:33:02 | 显示全部楼层
感谢楼主分享
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 注册

本版积分规则

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

排行榜|联系我们|小黑屋|手机版|Archiver|游戏藏宝湾 |

GMT+8, 2026-6-5 04:21 , Processed in 0.167027 second(s), 20 queries .

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表