藏宝湾网游单机站

 找回密码
 注册

QQ登录

只需一步,快速开始

★69 元包站 Gm 手游平台★

★69 元包站 Gm 手游平台★

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

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

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

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

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

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

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

承接推广
★承接推广★

★承接推广★

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

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

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

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

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

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

承接推广

★承接推广★

★承接推广★

承接推广

★承接推广★

★承接推广★

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

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

★承接推广★

★承接推广★

★承接推广★

★承接推广★

★承接推广★

★承接推广★

★承接推广★

★承接推广★

★承接推广★

查看: 889|回复: 4

[原创] 远征OLGM系统

[复制链接]
 楼主| 发表于 2026-1-18 20:12:22 | 显示全部楼层 |阅读模式
本帖最后由 bfdz49 于 2026-1-18 20:17 编辑

很久没有搞远征了 今天我写个脚本GM系统 服务端跟客户端数据库的

自己去增加别问我
数据库GM账号表  gm_accounts
  1. CREATE TABLE [dbo].[gm_accounts] (
  2.     [id] INT IDENTITY(1,1) PRIMARY KEY,
  3.     [player_id] BIGINT NOT NULL,
  4.     [username] NVARCHAR(50) NOT NULL,
  5.     [password_hash] NVARCHAR(255) NULL,
  6.     [gm_level] TINYINT DEFAULT 1,
  7.     [rights] BIGINT DEFAULT 0,
  8.     [is_active] BIT DEFAULT 1,
  9.     [created_at] DATETIME DEFAULT GETDATE(),
  10.     [updated_at] DATETIME DEFAULT GETDATE()
  11. );

  12. CREATE UNIQUE INDEX [uk_player_id] ON [dbo].[gm_accounts] ([player_id]);
  13. CREATE INDEX [idx_username] ON [dbo].[gm_accounts] ([username]);

  14. -- 添加说明注释(SQL Server使用扩展属性)
  15. EXEC sp_addextendedproperty
  16.     [url=home.php?mod=space&uid=755926]@name[/url] = N'MS_Description', [url=home.php?mod=space&uid=229979]@value[/url] = 'GM账号表',
  17.     @level0type = N'SCHEMA', @level0name = N'dbo',
  18.     @level1type = N'TABLE', @level1name = N'gm_accounts';
复制代码
GM命令日志表  gm_command_logs
  1. CREATE TABLE [dbo].[gm_command_logs] (
  2.     [id] BIGINT IDENTITY(1,1) PRIMARY KEY,
  3.     [player_id] BIGINT NOT NULL,
  4.     [player_name] NVARCHAR(50) NOT NULL,
  5.     [command] NVARCHAR(MAX) NOT NULL,
  6.     [args] NVARCHAR(MAX) NULL,
  7.     [result] NVARCHAR(MAX) NULL,
  8.     [is_success] BIT DEFAULT 1,
  9.     [executed_at] DATETIME DEFAULT GETDATE(),
  10.     [server_id] INT DEFAULT 0,
  11.     [ip_address] NVARCHAR(45) NULL
  12. );

  13. CREATE INDEX [idx_player_id] ON [dbo].[gm_command_logs] ([player_id]);
  14. CREATE INDEX [idx_executed_at] ON [dbo].[gm_command_logs] ([executed_at]);
  15. CREATE INDEX [idx_command] ON [dbo].[gm_command_logs] ([command]);
复制代码
GM权限配置表  gm_permissions
  1. CREATE TABLE [dbo].[gm_permissions] (
  2.     [id] INT IDENTITY(1,1) PRIMARY KEY,
  3.     [gm_level] TINYINT NOT NULL,
  4.     [permission_name] NVARCHAR(100) NOT NULL,
  5.     [right_flag] BIGINT NOT NULL,
  6.     [description] NVARCHAR(MAX) NULL
  7. );

  8. CREATE UNIQUE INDEX [uk_level_flag] ON [dbo].[gm_permissions] ([gm_level], [right_flag]);

  9. -- 初始化权限数据(与C++ RightFlag一致)
  10. INSERT INTO [dbo].[gm_permissions] (gm_level, permission_name, right_flag, [description]) VALUES
  11. (1, N'Stat_Online', 1, N'统计在线人数'),
  12. (1, N'ChangePos_Myself', 2, N'自身传送'),
  13. (2, N'ChangePos_Actor', 4, N'操作其他玩家位置'),
  14. (3, N'Mute', 8, N'禁言玩家'),
  15. (3, N'Kickout', 16, N'踢玩家下线'),
  16. (5, N'Freeze', 32, N'封号权限'),
  17. (5, N'King', 64, N'任命国王'),
  18. (8, N'TrackUserPC', 128, N'追踪玩家PC信息'),
  19. (10, N'KillServer', 256, N'关闭服务器');
复制代码
初始化GM账号
  1. -- 将现有玩家提升为GM(示例)
  2. INSERT INTO [dbo].[gm_accounts] (player_id, username, gm_level, rights)
  3. VALUES (10001, N'Admin', 10, 9223372036854775807); -- 0x7FFFFFFFFFFFFFFF

  4. -- 插入GM命令日志示例
  5. INSERT INTO [dbo].[gm_command_logs] (player_id, player_name, command, args, result, is_success, server_id, ip_address)
  6. VALUES (10001, N'Admin', N':count', N'', N'{"online":150}', 1, 1, N'192.168.1.100');
复制代码
创建触发器
  1. -- 为gm_accounts创建更新触发器
  2. CREATE TRIGGER [tr_gm_accounts_update] ON [dbo].[gm_accounts]
  3. AFTER UPDATE
  4. AS
  5. BEGIN
  6.     UPDATE [dbo].[gm_accounts]
  7.     SET [updated_at] = GETDATE()
  8.     WHERE [id] IN (SELECT [id] FROM inserted);
  9. END
复制代码
服务端脚本GMCommandManager
  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. -- 超级神石 - 客户端 v7.1
  3. -- 功能:显示命令列表,提示手动输入
  4. --===================================================================

  5. print("[GM客户端] 加载中...")

  6. function UseItem_SupperStone(actor, item_id, message)
  7.     print("[GM] UseItem_SupperStone | actor=" .. tostring(actor))
  8.    
  9.     -- 权限检查
  10.     if IsGM and not IsGM(actor) then
  11.         SendChat(actor, "你不是GM,无法使用此道具")
  12.         return 0, 0
  13.     end
  14.    
  15.     -- 显示命令列表
  16.     ShowGMCommandList(actor)
  17.     return 0, 0
  18. end

  19. function ShowGMCommandList(actor)
  20.     local chat = _G.SendSystemChat
  21.     if chat then
  22.         chat(actor, "╔════════════════════════════╗")
  23.         chat(actor, "║      GM命令使用说明        ║")
  24.         chat(actor, "╚════════════════════════════╝")
  25.         chat(actor, "")
  26.         chat(actor, "请在聊天框手动输入:")
  27.         chat(actor, "")
  28.         chat(actor, "基础命令:")
  29.         chat(actor, "  :count           - 统计在线人数")
  30.         chat(actor, "  :userlist        - 查看玩家列表")
  31.         chat(actor, "")
  32.         chat(actor, "传送移动:")
  33.         chat(actor, "  :move 玩家名     - 传送到玩家")
  34.         chat(actor, "  :pull 玩家名     - 拉人到身边")
  35.         chat(actor, "  :tile x,y        - 传送到坐标")
  36.         chat(actor, "  :hide 0或1       - 隐身/显身")
  37.         chat(actor, "")
  38.         chat(actor, "权限管理:")
  39.         chat(actor, "  :mute 玩家,分钟,理由 - 禁言")
  40.         chat(actor, "  :kick 玩家,理由     - 踢下线")
  41.         chat(actor, "  :setlevel 等级      - 修改等级")
  42.         chat(actor, "")
  43.         chat(actor, "高级命令:")
  44.         chat(actor, "  :getitem 物品ID,数量 - 获得物品")
  45.         chat(actor, "  :callmonster 怪物ID,数量 - 召唤怪物")
  46.         chat(actor, "")
  47.         chat(actor, "输入后按回车执行")
  48.     else
  49.         print("警告: SendSystemChat未定义")
  50.     end
  51. end

  52. function SendChat(actor, msg)
  53.     local func = _G.SendSystemChat
  54.     if func then
  55.         func(actor, msg)
  56.     else
  57.         print("[GM提示] " .. msg)
  58.     end
  59. end

  60. print("[GM客户端] 加载完成")

  61. -- 空函数防止链接错误
  62. function GM_count() end
  63. function GM_userlist() end
复制代码



本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?注册

x
回复

使用道具 举报

发表于 2026-1-18 22:12:49 | 显示全部楼层
回复 支持 反对

使用道具 举报

发表于 2026-1-19 09:17:51 | 显示全部楼层
谢谢大佬分享
回复 支持 反对

使用道具 举报

发表于 2026-1-26 09:20:55 | 显示全部楼层
感谢分享 虽然没看懂
[发帖际遇]: 一个袋子砸在了 szdxzhao 头上,szdxzhao 赚了 5 枚 金币. 幸运榜 / 衰神榜
回复 支持 反对

使用道具 举报

发表于 2026-1-26 09:58:04 来自手机 | 显示全部楼层
感谢分享 虽然没明白
回复 支持 反对

使用道具 举报

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

本版积分规则

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

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

GMT+8, 2026-6-5 03:34 , Processed in 0.170388 second(s), 21 queries .

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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