远征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
: 谢谢大佬分享 感谢分享 虽然没看懂 感谢分享 虽然没明白
页:
[1]