bfdz49 发表于 2026-1-18 20:12:22

远征OLGM系统

本帖最后由 bfdz49 于 2026-1-18 20:17 编辑

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

自己去增加别问我
数据库GM账号表gm_accounts
CREATE TABLE . (
    INT IDENTITY(1,1) PRIMARY KEY,
    BIGINT NOT NULL,
    NVARCHAR(50) NOT NULL,
    NVARCHAR(255) NULL,
    TINYINT DEFAULT 1,
    BIGINT DEFAULT 0,
    BIT DEFAULT 1,
    DATETIME DEFAULT GETDATE(),
    DATETIME DEFAULT GETDATE()
);

CREATE UNIQUE INDEX ON . ();
CREATE INDEX ON . ();

-- 添加说明注释(SQL Server使用扩展属性)
EXEC sp_addextendedproperty
    @name = N'MS_Description', @value = 'GM账号表',
    @level0type = N'SCHEMA', @level0name = N'dbo',
    @level1type = N'TABLE', @level1name = N'gm_accounts';
GM命令日志表gm_command_logs
CREATE TABLE . (
    BIGINT IDENTITY(1,1) PRIMARY KEY,
    BIGINT NOT NULL,
    NVARCHAR(50) NOT NULL,
    NVARCHAR(MAX) NOT NULL,
    NVARCHAR(MAX) NULL,
    NVARCHAR(MAX) NULL,
    BIT DEFAULT 1,
    DATETIME DEFAULT GETDATE(),
    INT DEFAULT 0,
    NVARCHAR(45) NULL
);

CREATE INDEX ON . ();
CREATE INDEX ON . ();
CREATE INDEX ON . ();
GM权限配置表gm_permissions
CREATE TABLE . (
    INT IDENTITY(1,1) PRIMARY KEY,
    TINYINT NOT NULL,
    NVARCHAR(100) NOT NULL,
    BIGINT NOT NULL,
    NVARCHAR(MAX) NULL
);

CREATE UNIQUE INDEX ON . (, );

-- 初始化权限数据(与C++ RightFlag一致)
INSERT INTO . (gm_level, permission_name, right_flag, ) 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 . (player_id, username, gm_level, rights)
VALUES (10001, N'Admin', 10, 9223372036854775807); -- 0x7FFFFFFFFFFFFFFF

-- 插入GM命令日志示例
INSERT INTO . (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 ON .
AFTER UPDATE
AS
BEGIN
    UPDATE .
    SET = GETDATE()
    WHERE IN (SELECT FROM inserted);
END
服务端脚本GMCommandManager
--===================================================================
-- 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调用")

客户端脚本
--===================================================================
-- 超级神石 - 客户端 v7.1
-- 功能:显示命令列表,提示手动输入
--===================================================================

print(" 加载中...")

function UseItem_SupperStone(actor, item_id, message)
    print(" 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(" " .. msg)
    end
end

print(" 加载完成")

-- 空函数防止链接错误
function GM_count() end
function GM_userlist() end



飘然而至 发表于 2026-1-18 22:12:49

:

jack5472 发表于 2026-1-19 09:17:51

谢谢大佬分享

szdxzhao 发表于 2026-1-26 09:20:55

感谢分享 虽然没看懂

网易恶心 发表于 2026-1-26 09:58:04

感谢分享 虽然没明白
页: [1]
查看完整版本: 远征OLGM系统

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