- 精华
- 阅读权限
- 90
- 贡献
- 人
- 好友
- 相册
- 分享
- 听众
- 收听
- 注册时间
- 2010-1-8
- 在线时间
- 小时
- 最后登录
- 1970-1-1
|
本帖最后由 bfdz49 于 2026-1-18 20:17 编辑
很久没有搞远征了 今天我写个脚本GM系统 服务端跟客户端数据库的
自己去增加别问我
数据库GM账号表 gm_accounts
- CREATE TABLE [dbo].[gm_accounts] (
- [id] INT IDENTITY(1,1) PRIMARY KEY,
- [player_id] BIGINT NOT NULL,
- [username] NVARCHAR(50) NOT NULL,
- [password_hash] NVARCHAR(255) NULL,
- [gm_level] TINYINT DEFAULT 1,
- [rights] BIGINT DEFAULT 0,
- [is_active] BIT DEFAULT 1,
- [created_at] DATETIME DEFAULT GETDATE(),
- [updated_at] DATETIME DEFAULT GETDATE()
- );
- CREATE UNIQUE INDEX [uk_player_id] ON [dbo].[gm_accounts] ([player_id]);
- CREATE INDEX [idx_username] ON [dbo].[gm_accounts] ([username]);
- -- 添加说明注释(SQL Server使用扩展属性)
- EXEC sp_addextendedproperty
- [url=home.php?mod=space&uid=755926]@name[/url] = N'MS_Description', [url=home.php?mod=space&uid=229979]@value[/url] = 'GM账号表',
- @level0type = N'SCHEMA', @level0name = N'dbo',
- @level1type = N'TABLE', @level1name = N'gm_accounts';
复制代码 GM命令日志表 gm_command_logs
- CREATE TABLE [dbo].[gm_command_logs] (
- [id] BIGINT IDENTITY(1,1) PRIMARY KEY,
- [player_id] BIGINT NOT NULL,
- [player_name] NVARCHAR(50) NOT NULL,
- [command] NVARCHAR(MAX) NOT NULL,
- [args] NVARCHAR(MAX) NULL,
- [result] NVARCHAR(MAX) NULL,
- [is_success] BIT DEFAULT 1,
- [executed_at] DATETIME DEFAULT GETDATE(),
- [server_id] INT DEFAULT 0,
- [ip_address] NVARCHAR(45) NULL
- );
- CREATE INDEX [idx_player_id] ON [dbo].[gm_command_logs] ([player_id]);
- CREATE INDEX [idx_executed_at] ON [dbo].[gm_command_logs] ([executed_at]);
- CREATE INDEX [idx_command] ON [dbo].[gm_command_logs] ([command]);
复制代码 GM权限配置表 gm_permissions
- CREATE TABLE [dbo].[gm_permissions] (
- [id] INT IDENTITY(1,1) PRIMARY KEY,
- [gm_level] TINYINT NOT NULL,
- [permission_name] NVARCHAR(100) NOT NULL,
- [right_flag] BIGINT NOT NULL,
- [description] NVARCHAR(MAX) NULL
- );
- CREATE UNIQUE INDEX [uk_level_flag] ON [dbo].[gm_permissions] ([gm_level], [right_flag]);
- -- 初始化权限数据(与C++ RightFlag一致)
- INSERT INTO [dbo].[gm_permissions] (gm_level, permission_name, right_flag, [description]) VALUES
- (1, N'Stat_Online', 1, N'统计在线人数'),
- (1, N'ChangePos_Myself', 2, N'自身传送'),
- (2, N'ChangePos_Actor', 4, N'操作其他玩家位置'),
- (3, N'Mute', 8, N'禁言玩家'),
- (3, N'Kickout', 16, N'踢玩家下线'),
- (5, N'Freeze', 32, N'封号权限'),
- (5, N'King', 64, N'任命国王'),
- (8, N'TrackUserPC', 128, N'追踪玩家PC信息'),
- (10, N'KillServer', 256, N'关闭服务器');
复制代码 初始化GM账号
- -- 将现有玩家提升为GM(示例)
- INSERT INTO [dbo].[gm_accounts] (player_id, username, gm_level, rights)
- VALUES (10001, N'Admin', 10, 9223372036854775807); -- 0x7FFFFFFFFFFFFFFF
- -- 插入GM命令日志示例
- INSERT INTO [dbo].[gm_command_logs] (player_id, player_name, command, args, result, is_success, server_id, ip_address)
- VALUES (10001, N'Admin', N':count', N'', N'{"online":150}', 1, 1, N'192.168.1.100');
复制代码 创建触发器
- -- 为gm_accounts创建更新触发器
- CREATE TRIGGER [tr_gm_accounts_update] ON [dbo].[gm_accounts]
- AFTER UPDATE
- AS
- BEGIN
- UPDATE [dbo].[gm_accounts]
- SET [updated_at] = GETDATE()
- WHERE [id] IN (SELECT [id] FROM inserted);
- END
复制代码 服务端脚本GMCommandManager
- --===================================================================
- -- 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调用")
复制代码
客户端脚本
- --===================================================================
- -- 超级神石 - 客户端 v7.1
- -- 功能:显示命令列表,提示手动输入
- --===================================================================
- print("[GM客户端] 加载中...")
- function UseItem_SupperStone(actor, item_id, message)
- print("[GM] UseItem_SupperStone | actor=" .. tostring(actor))
-
- -- 权限检查
- if IsGM and not IsGM(actor) then
- SendChat(actor, "你不是GM,无法使用此道具")
- return 0, 0
- end
-
- -- 显示命令列表
- ShowGMCommandList(actor)
- return 0, 0
- end
- function ShowGMCommandList(actor)
- local chat = _G.SendSystemChat
- if chat then
- chat(actor, "╔════════════════════════════╗")
- chat(actor, "║ GM命令使用说明 ║")
- chat(actor, "╚════════════════════════════╝")
- chat(actor, "")
- chat(actor, "请在聊天框手动输入:")
- chat(actor, "")
- chat(actor, "基础命令:")
- chat(actor, " :count - 统计在线人数")
- chat(actor, " :userlist - 查看玩家列表")
- chat(actor, "")
- chat(actor, "传送移动:")
- chat(actor, " :move 玩家名 - 传送到玩家")
- chat(actor, " :pull 玩家名 - 拉人到身边")
- chat(actor, " :tile x,y - 传送到坐标")
- chat(actor, " :hide 0或1 - 隐身/显身")
- chat(actor, "")
- chat(actor, "权限管理:")
- chat(actor, " :mute 玩家,分钟,理由 - 禁言")
- chat(actor, " :kick 玩家,理由 - 踢下线")
- chat(actor, " :setlevel 等级 - 修改等级")
- chat(actor, "")
- chat(actor, "高级命令:")
- chat(actor, " :getitem 物品ID,数量 - 获得物品")
- chat(actor, " :callmonster 怪物ID,数量 - 召唤怪物")
- chat(actor, "")
- chat(actor, "输入后按回车执行")
- else
- print("警告: SendSystemChat未定义")
- end
- end
- function SendChat(actor, msg)
- local func = _G.SendSystemChat
- if func then
- func(actor, msg)
- else
- print("[GM提示] " .. msg)
- end
- end
- print("[GM客户端] 加载完成")
- -- 空函数防止链接错误
- function GM_count() end
- function GM_userlist() end
复制代码
|
本帖子中包含更多资源
您需要 登录 才可以下载或查看,没有账号?注册
x
|