远征GM系统增加脚本客户端服务端
这个是客户端UI脚本--===================================================================
-- GM系统配置表 v5.1
-- 命令描述、参数提示、UI分组配置
--===================================================================
print(" 加载配置表...")
GMCommandConfig = {
-- 命令元数据
commands = {
count = {
desc = "统计在线人数",
params = {},
category = "基础统计",
shortcut = "F1"
},
userlist = {
desc = "查看玩家列表",
params = {},
category = "基础统计",
shortcut = "F2"
},
retrieve = {
desc = "全面恢复HP/MP",
params = {},
category = "基础统计",
shortcut = "F3"
},
tile = {
desc = "传送到坐标",
params = {
{name = "x", type = "number", desc = "X坐标"},
{name = "y", type = "number", desc = "Y坐标"},
{name = "map", type = "number", desc = "地图ID(可选)"}
},
category = "传送移动",
example = ":tile 100,200"
},
move = {
desc = "传送到玩家身边",
params = {
{name = "player", type = "string", desc = "目标玩家名"}
},
category = "传送移动",
example = ":move 玩家A"
},
pull = {
desc = "拉人到自己身边",
params = {
{name = "player", type = "string", desc = "目标玩家名"}
},
category = "传送移动",
example = ":pull 玩家B"
},
hide = {
desc = "隐身/显身切换",
params = {
{name = "flag", type = "number", desc = "1=隐身,0=显身"}
},
category = "传送移动",
example = ":hide 1"
},
mute = {
desc = "禁言玩家",
params = {
{name = "player", type = "string", desc = "玩家名"},
{name = "time", type = "number", desc = "时长(分钟)"},
{name = "reason", type = "string", desc = "原因"}
},
category = "玩家管理",
example = ":mute 玩家C,60,辱骂"
},
kick = {
desc = "踢玩家下线",
params = {
{name = "player", type = "string", desc = "玩家名"},
{name = "reason", type = "string", desc = "原因(可选)"}
},
category = "玩家管理",
example = ":kick 玩家D"
},
kick2 = {
desc = "踢下线并广播",
params = {
{name = "player", type = "string", desc = "玩家名"},
{name = "reason", type = "string", desc = "广播内容"}
},
category = "玩家管理",
example = ":kick2 玩家E,使用外挂"
},
freeze = {
desc = "封号处理",
params = {
{name = "player", type = "string", desc = "玩家名"}
},
category = "玩家管理",
example = ":freeze 玩家F"
},
prison = {
desc = "关进监狱",
params = {
{name = "player", type = "string", desc = "玩家名"}
},
category = "玩家管理",
example = ":prison 玩家G"
},
getitem = {
desc = "获得物品",
params = {
{name = "itemId", type = "number", desc = "物品ID"},
{name = "count", type = "number", desc = "数量"},
{name = "bind", type = "number", desc = "绑定(1=是,0=否)"}
},
category = "物品/怪物",
example = ":getitem 1001,10,1"
},
callmonster = {
desc = "召唤怪物",
params = {
{name = "monsterId", type = "number", desc = "怪物ID"},
{name = "count", type = "number", desc = "数量"},
{name = "level", type = "number", desc = "等级(可选)"}
},
category = "物品/怪物",
example = ":callmonster 2001,5"
},
resetectype = {
desc = "重置副本次数",
params = {},
category = "物品/怪物"
},
ad = {
desc = "发布公告",
params = {
{name = "content", type = "string", desc = "公告内容"}
},
category = "系统工具",
example = ':ad 服务器活动开启!'
},
wh = {
desc = "维护公告",
params = {},
category = "系统工具"
},
sp = {
desc = "扫描外挂",
params = {},
category = "扫描监控"
},
scanqq = {
desc = "获取玩家QQ",
params = {
{name = "player", type = "string", desc = "玩家名"}
},
category = "扫描监控"
},
monitorlua = {
desc = "监控Lua错误",
params = {},
category = "扫描监控"
},
cancelmonitorlua = {
desc = "取消Lua监控",
params = {},
category = "扫描监控"
}
},
-- 快捷键配置
shortcuts = {
{key = "F10", action = "ToggleGMPanel", desc = "开关GM面板"},
{key = "F1", command = ":count", desc = "统计在线"},
{key = "F2", command = ":userlist", desc = "玩家列表"},
{key = "F3", command = ":retrieve", desc = "全面恢复"},
{key = "F5", command = ":hide 1", desc = "隐身"},
{key = "F6", command = ":hide 0", desc = "显身"}
}
}
-- 获取命令描述
function GMCommandConfig:GetCommandDesc(cmdName)
local cmd = self.commands
return cmd and cmd.desc or "未知命令"
end
-- 获取命令参数
function GMCommandConfig:GetCommandParams(cmdName)
local cmd = self.commands
return cmd and cmd.params or {}
end
-- 获取分类
function GMCommandConfig:GetCommandsByCategory(category)
local result = {}
for name, cmd in pairs(self.commands) do
if cmd.category == category then
table.insert(result, name)
end
end
return result
end
print(" 配置表加载完成")
--===================================================================
-- GM面板UI系统
--===================================================================
GMPanelUI = {
window = nil,
tabControl = nil,
resultBox = nil,
commandInput = nil,
isVisible = false
}
-- 创建主窗口
function GMPanelUI:Create()
if not CreateWindow then
print(" 不支持UI创建")
return
end
-- 主窗口
self.window = CreateWindow("GMPanel", "GM命令面板",
200, 100, 800, 600,
true, true, true)
if not self.window then return end
-- 创建标签页
self.tabControl = self.window:CreateTabControl("MainTab", 10, 10, 780, 480)
-- 基础命令页
self:CreateBasicTab()
-- 玩家管理页
self:CreatePlayerTab()
-- 物品/怪物页
self:CreateItemTab()
-- 系统工具页
self:CreateSystemTab()
-- 快捷命令页
self:CreateQuickTab()
-- 结果显示区
self.resultBox = self.window:CreateMultiLineEdit("ResultBox",
"", 10, 500, 600, 90, false)
self.resultBox:SetReadOnly(true)
-- 命令输入框
self.commandInput = self.window:CreateEdit("CommandInput",
"", 10, 595, 500, 25)
-- 执行按钮
local executeBtn = self.window:CreateButton("ExecuteBtn", "执行",
520, 595, 80, 25)
executeBtn:SetClickCallback(function()
self:OnExecuteCommand()
end)
-- 清空按钮
local clearBtn = self.window:CreateButton("ClearBtn", "清空结果",
610, 595, 80, 25)
clearBtn:SetClickCallback(function()
self.resultBox:SetText("")
end)
-- 历史按钮
local historyBtn = self.window:CreateButton("HistoryBtn", "历史",
700, 595, 80, 25)
historyBtn:SetClickCallback(function()
self:ShowHistory()
end)
-- 默认隐藏
self.window:Hide()
self.isVisible = false
print(" 创建完成")
end
-- 基础命令页
function GMPanelUI:CreateBasicTab()
local tab = self.tabControl:AddTab("基础操作")
-- 在线统计
local row = 10
tab:CreateButton("CountBtn", "统计在线", 10, row, 120, 25)
:SetClickCallback(function() GMClient:QuickCommand("count") end)
tab:CreateButton("UserListBtn", "玩家列表", 140, row, 120, 25)
:SetClickCallback(function() GMClient:QuickCommand("userlist") end)
-- 位置操作
row = row + 35
tab:CreateLabel("", "目标玩家:", 10, row + 5)
local targetEdit = tab:CreateEdit("TargetPlayer", "", 80, row, 120, 25)
tab:CreateButton("MoveBtn", "移动到TA", 210, row, 80, 25)
:SetClickCallback(function()
local target = targetEdit:GetText()
if target ~= "" then
GMClient:QuickCommand("move", target)
end
end)
tab:CreateButton("PullBtn", "拉取到身边", 300, row, 80, 25)
:SetClickCallback(function()
local target = targetEdit:GetText()
if target ~= "" then
GMClient:QuickCommand("pull", target)
end
end)
-- 隐身切换
row = row + 35
tab:CreateButton("HideBtn", "隐身模式", 10, row, 120, 25)
:SetClickCallback(function() GMClient:QuickCommand("hide", "1") end)
tab:CreateButton("ShowBtn", "显身模式", 140, row, 120, 25)
:SetClickCallback(function() GMClient:QuickCommand("hide", "0") end)
-- 坐标传送
row = row + 35
tab:CreateLabel("", "X坐标:", 10, row + 5)
local xEdit = tab:CreateEdit("PosX", "100", 60, row, 60, 25)
tab:CreateLabel("", "Y坐标:", 130, row + 5)
local yEdit = tab:CreateEdit("PosY", "100", 180, row, 60, 25)
tab:CreateButton("TileBtn", "传送", 250, row, 60, 25)
:SetClickCallback(function()
local x = xEdit:GetText()
local y = yEdit:GetText()
GMClient:QuickCommand("tile", x .. "," .. y)
end)
end
-- 玩家管理页
function GMPanelUI:CreatePlayerTab()
local tab = self.tabControl:AddTab("玩家管理")
local row = 10
-- 目标玩家
tab:CreateLabel("", "玩家名:", 10, row + 5)
local targetEdit = tab:CreateEdit("PM_Target", "", 70, row, 150, 25)
tab:CreateButton("GetInfoBtn", "获取信息", 230, row, 80, 25)
:SetClickCallback(function()
local name = targetEdit:GetText()
if name ~= "" then
GMClient:QuickCommand("getuserinfo", name)
end
end)
-- 禁言控制
row = row + 35
tab:CreateLabel("", "禁言时长(分钟):", 10, row + 5)
local muteTime = tab:CreateEdit("MuteTime", "60", 120, row, 80, 25)
tab:CreateButton("MuteBtn", "禁言", 210, row, 60, 25)
:SetClickCallback(function()
local name = targetEdit:GetText()
local time = muteTime:GetText()
if name ~= "" and time ~= "" then
GMClient:QuickCommand("mute", name .. "," .. time)
end
end)
-- 踢下线
row = row + 35
tab:CreateButton("KickBtn", "踢下线", 10, row, 80, 25)
:SetClickCallback(function()
local name = targetEdit:GetText()
if name ~= "" then
GMClient:QuickCommand("kick", name)
end
end)
tab:CreateButton("Kick2Btn", "踢下线+广播", 100, row, 100, 25)
:SetClickCallback(function()
local name = targetEdit:GetText()
if name ~= "" then
GMClient:QuickCommand("kick2", name)
end
end)
-- 封号/坐牢
row = row + 35
tab:CreateButton("FreezeBtn", "封号", 10, row, 80, 25)
:SetClickCallback(function()
local name = targetEdit:GetText()
if name ~= "" then
GMClient:QuickCommand("freeze", name)
end
end)
tab:CreateButton("PrisonBtn", "关监狱", 100, row, 80, 25)
:SetClickCallback(function()
local name = targetEdit:GetText()
if name ~= "" then
GMClient:QuickCommand("prison", name)
end
end)
end
-- 物品/怪物页
function GMPanelUI:CreateItemTab()
local tab = self.tabControl:AddTab("物品/怪物")
local row = 10
-- 获取物品
tab:CreateLabel("", "物品ID:", 10, row + 5)
local itemIdEdit = tab:CreateEdit("ItemID", "10001", 70, row, 100, 25)
tab:CreateLabel("", "数量:", 180, row + 5)
local itemCountEdit = tab:CreateEdit("ItemCount", "1", 220, row, 60, 25)
tab:CreateButton("GetItemBtn", "获得物品", 290, row, 80, 25)
:SetClickCallback(function()
local id = itemIdEdit:GetText()
local count = itemCountEdit:GetText()
GMClient:QuickCommand("getitem", id .. "," .. count)
end)
-- 召唤怪物
row = row + 35
tab:CreateLabel("", "怪物ID:", 10, row + 5)
local monsterIdEdit = tab:CreateEdit("MonsterID", "20001", 70, row, 100, 25)
tab:CreateLabel("", "数量:", 180, row + 5)
local monsterCountEdit = tab:CreateEdit("MonsterCount", "1", 220, row, 60, 25)
tab:CreateButton("CallMonsterBtn", "召唤", 290, row, 80, 25)
:SetClickCallback(function()
local id = monsterIdEdit:GetText()
local count = monsterCountEdit:GetText()
GMClient:QuickCommand("callmonster", id .. "," .. count)
end)
-- 重置副本
row = row + 35
tab:CreateButton("ResetEctypeBtn", "重置所有副本次数", 10, row, 150, 25)
:SetClickCallback(function() GMClient:QuickCommand("resetectype") end)
end
-- 系统工具页
function GMPanelUI:CreateSystemTab()
local tab = self.tabControl:AddTab("系统工具")
local row = 10
-- 公告系统
tab:CreateLabel("", "公告内容:", 10, row + 5)
local adEdit = tab:CreateMultiLineEdit("AD_Content", "", 10, row + 25, 300, 60)
tab:CreateButton("ADBtn", "发布公告", 320, row, 80, 25)
:SetClickCallback(function()
local content = adEdit:GetText()
if content ~= "" then
GMClient:QuickCommand("ad", content)
adEdit:SetText("")
end
end)
-- 维护公告
row = row + 70
tab:CreateButton("MaintainBtn", "维护公告", 10, row, 100, 25)
:SetClickCallback(function()
GMClient:QuickCommand("wh")
end)
-- 扫描工具
row = row + 35
tab:CreateLabel("", "目标玩家:", 10, row + 5)
local scanTarget = tab:CreateEdit("ScanTarget", "", 80, row, 120, 25)
tab:CreateButton("ScanQQBtn", "扫描QQ", 210, row, 80, 25)
:SetClickCallback(function()
local name = scanTarget:GetText()
if name ~= "" then
GMClient:QuickCommand("scanqq", name)
end
end)
tab:CreateButton("ScanProcessBtn", "扫描进程", 300, row, 80, 25)
:SetClickCallback(function()
local name = scanTarget:GetText()
if name ~= "" then
GMClient:QuickCommand("scanprocess", name)
end
end)
end
-- 快捷命令页
function GMPanelUI:CreateQuickTab()
local tab = self.tabControl:AddTab("快捷命令")
local quickCmds = {
{name = "全面恢复", cmd = "retrieve"},
{name = "隐身", cmd = "hide 1"},
{name = "显身", cmd = "hide 0"},
{name = "扫描外挂", cmd = "sp"},
{name = "获取log", cmd = "getlog"},
}
local row = 10
for i, qc in ipairs(quickCmds) do
local btn = tab:CreateButton("QuickBtn" .. i, qc.name,
10 + ((i-1) % 3) * 120,
row + math.floor((i-1) / 3) * 35,
110, 30)
btn:SetClickCallback(function()
GMClient:SendCommand(qc.cmd)
end)
end
end
-- 显示/隐藏
function GMPanelUI:Show()
if self.window then
self.window:Show()
self.isVisible = true
end
end
function GMPanelUI:Hide()
if self.window then
self.window:Hide()
self.isVisible = false
end
end
-- 执行命令
function GMPanelUI:OnExecuteCommand()
local cmd = self.commandInput:GetText()
if cmd and cmd ~= "" then
GMClient:SendCommand(cmd)
self.commandInput:SetText("")
end
end
-- 显示结果
function GMPanelUI:ShowResult(text)
if self.resultBox then
local current = self.resultBox:GetText()
local timestamp = os.date("[%H:%M:%S] ")
self.resultBox:SetText(current .. timestamp .. tostring(text) .. "\n")
self.resultBox:SetScrollPos(99999) -- 滚动到底部
end
end
-- 显示历史
function GMPanelUI:ShowHistory()
local history = GMClient:GetHistory()
local text = "=== 命令历史 ===\n"
for i, h in ipairs(history) do
text = text .. h.time .. " " .. h.cmd .. "\n"
end
self:ShowResult("\n" .. text)
end
-- 销毁
function GMPanelUI:Destroy()
if self.window then
self.window:Destroy()
self.window = nil
end
self.isVisible = false
end
服务端lua脚本加载
--===================================================================
-- 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调用")
命令 等级 参数 说明
基础统计
`:count` 1 无 统计在线人数
`:userlist` 1 无 列出在线玩家
`:statuserinfo` 1 无 统计玩家信息
`:retrieve` 1 无 恢复HP/MP
传送移动
`:tile x,y` 5 number,number 传送到坐标
`:move 玩家名` 5 string 传送到玩家
`:pull 玩家名` 5 string 拉取玩家到身边
`:hide 0/1` 5 number 隐身/显身
`:push 玩家1,玩家2` 5 string,string 将玩家1推到玩家2旁
`:setpos 玩家,x,y` 10 string,number,number 设置玩家位置
`:hang` 5 无 跨区传送
玩家管理
`:mute 玩家,时间,原因` 5 string,number,string 禁言
`:kick 玩家,原因` 5 string,string 踢下线
`:kick2 玩家,原因` 10 string,string 踢下线并广播
`:freeze 玩家` 10 string 封号
`:prison 玩家` 10 string 关监狱
`:sst 时间` 10 number 设置安全时间
`:rudefine 玩家,值` 10 string,number 修改非文明值
物品/怪物
`:getitem ID,数量,绑定` 5 number,number,number 获得物品
`:callmonster ID,数量,等级` 5 number,number,number 召唤怪物
`:resetectype` 10 无 重置副本
公告系统
`:ad 内容` 5 string 发布公告
`:wh` 10 无 维护公告
监控扫描
`:sp` 10 无 扫描外挂
`:scanqq 玩家` 10 string 获取玩家QQ
`:scanprocess 玩家` 10 string 获取进程列表
`:scanwinver 玩家` 10 string 获取Windows版本
`:monitorlua` 10 无 监控Lua错误
`:cancelmonitorlua` 10 无 取消监控
`:spex` 10 无 扫描MD5
`:scanping 玩家` 10 string 查看ping值
`:kill 玩家,进程名` 10 string,string 杀进程
调试工具
`:debug` 10 无 开启调试
`:cmd 命令` 10 string 执行控制台命令
DBProcedure.dbs配置
<!-- 在底部增加他就OK-->
<procedure name="PrGs_ExecuteGMCommand" cmdid="5100" databaseid="1">
<param name="@GMID" type="int" dir="in" size="4" />
<param name="@CommandName" type="nvarchar" dir="in" size="50" />
<param name="@Parameters" type="nvarchar" dir="in" size="500" optional="true" />
<param name="@IP" type="nvarchar" dir="in" size="50" optional="true" />
</procedure>
<procedure name="PrGs_GetGMCommands" cmdid="5101" databaseid="1">
<param name="@GMLevel" type="tinyint" dir="in" size="1" />
</procedure>
<procedure name="PrGs_GetGMOperationLog" cmdid="5102" databaseid="1">
<param name="@GMID" type="int" dir="in" size="4" optional="true" />
<param name="@StartTime" type="int" dir="in" size="4" />
<param name="@EndTime" type="int" dir="in" size="4" />
</procedure>
数据库储存
USE
GO
CREATE TABLE .(
IDENTITY(1,1) NOT NULL PRIMARY KEY,
(50) NOT NULL UNIQUE, -- 命令名(如"mute")
(200) NOT NULL, -- 命令描述
NOT NULL DEFAULT(5), -- 最低GM等级
NOT NULL DEFAULT(0), -- 参数数量
(100) NULL, -- 参数类型(如"string,number,string")
(50) NULL, -- 分类
NOT NULL DEFAULT(1) -- 是否启用
);
-- 插入51个GM命令
INSERT INTO .
(, , , , , )
VALUES
('count', '统计在线人数', 1, 0, NULL, '基础统计'),
('userlist', '查看玩家列表', 1, 0, NULL, '基础统计'),
('tile', '传送到坐标', 5, 2, 'number,number', '传送移动'),
('move', '传送到玩家身边', 5, 1, 'string', '传送移动'),
('pull', '拉人到自己身边', 5, 1, 'string', '传送移动'),
('hide', '隐身/显身', 5, 1, 'number', '传送移动'),
('mute', '禁言玩家', 5, 3, 'string,number,string', '玩家管理'),
('kick', '踢玩家下线', 5, 2, 'string,string', '玩家管理'),
('kick2', '踢下线并广播', 10, 2, 'string,string', '玩家管理'),
('freeze', '封号', 10, 1, 'string', '玩家管理'),
('prison', '关监狱', 10, 1, 'string', '玩家管理'),
('retrieve', '全面恢复', 1, 0, NULL, '基础统计'),
('getitem', '获得物品', 5, 3, 'number,number,number', '物品系统'),
('callmonster', '召唤怪物', 5, 3, 'number,number,number', '物品系统'),
('resetectype', '重置副本次数', 10, 0, NULL, '物品系统'),
('ad', '发布公告', 5, 1, 'string', '公告系统'),
('wh', '维护公告', 10, 0, NULL, '公告系统'),
('sp', '扫描外挂', 10, 0, NULL, '监控系统'),
('scanqq', '获取玩家QQ', 10, 1, 'string', '监控系统'),
('monitorlua', '监控Lua错误', 10, 0, NULL, '监控系统'),
('cancelmonitorlua', '取消Lua监控', 10, 0, NULL, '监控系统');
CREATE PROCEDURE .
@GMID int,
@CommandName nvarchar(50),
@Parameters nvarchar(500) = NULL,
@IP nvarchar(50) = NULL
AS
BEGIN
SET NOCOUNT ON;
DECLARE @GMLevel tinyint;
DECLARE @MinLevel tinyint;
DECLARE @CmdDesc nvarchar(200);
-- 检查GM等级
SELECT @GMLevel = FROM .
WHERE = @GMID AND = 1;
IF @GMLevel IS NULL
BEGIN
SELECT 0 as Success, '无GM权限' as Message;
RETURN;
END
-- 检查命令权限
SELECT @MinLevel = , @CmdDesc =
FROM .
WHERE = @CommandName AND = 1;
IF @MinLevel IS NULL
BEGIN
SELECT 0 as Success, '未知命令或命令已禁用' as Message;
RETURN;
END
IF @GMLevel < @MinLevel
BEGIN
SELECT 0 as Success, 'GM等级不足,需要等级' + CAST(@MinLevel as nvarchar) as Message;
RETURN;
END
-- 记录操作日志
INSERT INTO .
(, , , , ,
, , )
SELECT
@GMID,
a.,
g.,
NULL,
':' + @CommandName,
@Parameters,
DATEDIFF(SECOND, '19700101', GETUTCDATE()),
@IP
FROM . g
INNER JOIN . a ON g. = a.
WHERE g. = @GMID;
SELECT 1 as Success, @CmdDesc as Message;
END
GO
感谢分享: 进来看看哦 感谢楼主分享
页:
[1]