- 打卡等级:魔龙套勇士
- 打卡总天数:130
- 打卡月天数:23
- 打卡总奖励:14868
- 最近打卡:2025-08-23 00:38:01
管理员
本站站长
- 积分
- 8648
|
在复古传奇中实现 BOSS 刷新公告牌系统,需结合引擎脚本配置、数据库存储和多渠道通知,同时兼顾防刷屏机制和GM 权限控制。以下是适用于主流引擎(GOM、GEE、BLUE)的完整解决方案:
一、核心功能设计
1. BOSS 信息管理
数据库表结构(MySQL 示例):
sql
CREATE TABLE `boss_info` (
`id` INT PRIMARY KEY AUTO_INCREMENT,
`boss_name` VARCHAR(50) NOT NULL,
`map_name` VARCHAR(50) NOT NULL,
`refresh_interval` INT NOT NULL COMMENT '刷新间隔(分钟)',
`last_refresh_time` DATETIME NOT NULL,
`kill_count` INT DEFAULT 0
);
存储 BOSS 名称、刷新地图、间隔时间及最后刷新时间。
2. 公告触发机制
自动触发:通过脚本定时检测 BOSS 刷新时间,满足条件时发送公告。
手动触发:GM 通过命令(如@刷新公告)强制发布指定 BOSS 的刷新信息。
二、引擎脚本实现(以 GOM 为例)
1. BOSS 刷新检测脚本
在Mir200\Envir\QuestDiary\MonDie\QFunction-0.txt中添加:
lua
-- 每5分钟检测一次BOSS刷新(通过定时器触发)
function CheckBossRefresh()
local sql = "SELECT * FROM boss_info WHERE TIMESTAMPDIFF(MINUTE, last_refresh_time, NOW()) >= refresh_interval"
local result = DB_Query(sql)
if result and #result > 0 then
for _, row in ipairs(result) do
-- 刷新BOSS并记录时间
local mapName = row.map_name
local bossName = row.boss_name
SpawnMonster(mapName, 320, 320, bossName) -- 示例坐标,需根据实际调整
DB_Execute(string.format("UPDATE boss_info SET last_refresh_time=NOW(), kill_count=kill_count+1 WHERE id=%d", row.id))
-- 发送全服公告
local msg = string.format("<255>【BOSS来袭】<20>%s<1>已在<255>%s<1>刷新!击杀可获得顶级装备!", bossName, mapName)
SendBroadMsg(0, 0, 0, msg, 0, 0, 0)
-- 发送Discord通知(需配置Webhook)
local discordMsg = string.format("[%s] %s在%s刷新!", os.date("%Y-%m-%d %H:%M:%S"), bossName, mapName)
RunApp("python", "send_discord.py " .. discordMsg) -- 调用外部Python脚本
end
end
end
-- 添加定时器(每5分钟执行一次)
AddTimer(300, 0, "CheckBossRefresh")
2. GM 手动触发命令
在Mir200\Envir\QuestDiary\Admin\AdminCommand.txt中添加:
lua
-- 命令格式:@刷新公告 祖玛教主 祖玛7层
function OnAdminCommand(Admin, Command, Args)
if Command == "刷新公告" then
local bossName = Args[1]
local mapName = Args[2]
local sql = string.format("SELECT id FROM boss_info WHERE boss_name='%s' AND map_name='%s'", bossName, mapName)
local result = DB_Query(sql)
if result and #result > 0 then
-- 强制刷新并发送公告
DB_Execute(string.format("UPDATE boss_info SET last_refresh_time='1970-01-01 00:00:00' WHERE id=%d", result[1].id))
CheckBossRefresh() -- 立即触发检测
SendMsgToAdmin(Admin, "已手动刷新" .. bossName .. "的公告")
else
SendMsgToAdmin(Admin, "未找到该BOSS配置")
end
return 1
end
end
三、多渠道通知实现
1. Discord Webhook 集成
编写send_discord.py脚本:
python
import requests
import sys
def send_discord_message(message):
webhook_url = "YOUR_DISCORD_WEBHOOK_URL"
payload = {"content": message}
headers = {"Content-Type": "application/json"}
response = requests.post(webhook_url, json=payload, headers=headers)
return response.status_code
if __name__ == "__main__":
if len(sys.argv) > 1:
message = sys.argv[1]
send_discord_message(message)
在 GOM 脚本中通过RunApp调用该脚本发送通知。
2. 游戏内界面公告
在登录器界面或游戏内添加滚动公告栏,使用引擎提供的SendTopMsg或SendCenterMsg函数:
lua
-- GEE引擎示例:顶端滚动公告
SendTopMsg(255, 0, "<255>【BOSS提醒】<20>黄泉教主<1>将于10分钟后在骨魔5层刷新!", 0)
-- BLUE引擎示例:居中显示公告
SendCenterMsg(255, 0, "BOSS刷新公告:赤月恶魔已在赤月魔穴出现!", 0)
四、防刷屏与权限控制
1. 冷却时间机制
在boss_info表中添加last_announce_time字段,限制同一 BOSS 的公告频率:
lua
-- 修改后的检测逻辑
function CheckBossRefresh()
local sql = [[
SELECT bi.*
FROM boss_info bi
WHERE TIMESTAMPDIFF(MINUTE, bi.last_refresh_time, NOW()) >= bi.refresh_interval
AND TIMESTAMPDIFF(MINUTE, bi.last_announce_time, NOW()) >= 5 -- 5分钟冷却
]]
local result = DB_Query(sql)
if result and #result > 0 then
for _, row in ipairs(result) do
-- 发送公告前更新last_announce_time
DB_Execute(string.format("UPDATE boss_info SET last_announce_time=NOW() WHERE id=%d", row.id))
-- 后续逻辑不变
end
end
end
2. GM 权限控制
在Mir200\Envir\AdminList.txt中配置 GM 账号,仅允许列表内的账号使用@刷新公告命令。
通过引擎的CheckAdmin函数验证权限:
lua
function OnAdminCommand(Admin, Command, Args)
if not CheckAdmin(Admin) then
SendMsgToAdmin(Admin, "您没有执行此命令的权限")
return 0
end
-- 后续逻辑
end
五、历史记录查询
1. 数据库表设计
新增boss_log表存储历史记录:
sql
CREATE TABLE `boss_log` (
`id` INT PRIMARY KEY AUTO_INCREMENT,
`boss_id` INT NOT NULL,
`refresh_time` DATETIME NOT NULL,
`killer` VARCHAR(50) DEFAULT NULL,
`drop_items` TEXT DEFAULT NULL,
FOREIGN KEY (`boss_id`) REFERENCES boss_info(`id`)
);
2. 查询脚本
在 GM 命令中添加查询功能:
lua
-- 命令格式:@查询BOSS记录 祖玛教主
function OnAdminCommand(Admin, Command, Args)
if Command == "查询BOSS记录" then
local bossName = Args[1]
local sql = string.format(
"SELECT bl.refresh_time, bl.killer, bl.drop_items " ..
"FROM boss_log bl " ..
"JOIN boss_info bi ON bl.boss_id = bi.id " ..
"WHERE bi.boss_name = '%s' " ..
"ORDER BY bl.refresh_time DESC",
bossName
)
local result = DB_Query(sql)
if result and #result > 0 then
SendMsgToAdmin(Admin, "查询到" .. #result .. "条记录:")
for _, row in ipairs(result) do
local msg = string.format(
"时间:%s,击杀者:%s,掉落:%s",
row.refresh_time, row.killer or "未击杀", row.drop_items or "无"
)
SendMsgToAdmin(Admin, msg)
end
else
SendMsgToAdmin(Admin, "无相关记录")
end
return 1
end
end
六、测试与优化
功能测试:
手动触发 BOSS 刷新,检查游戏内公告、Discord 通知及数据库记录是否正常。
使用同一 BOSS 重复触发公告,验证冷却时间是否生效。
性能优化:
对boss_info表添加索引:
sql
ALTER TABLE `boss_info` ADD INDEX `idx_last_refresh` (`last_refresh_time`);
减少定时器频率(如将 5 分钟改为 10 分钟),降低数据库压力。
界面优化:
在游戏内添加 NPC(如 “BOSS 信使”),提供可视化的 BOSS 刷新列表和历史记录查询界面。
使用引擎的ShowShopDlg函数或 HTML 界面展示数据。
通过以上方案,可构建一个功能完整、防刷屏且支持多渠道通知的 BOSS 刷新公告系统,适用于复古传奇的运营需求。实际配置时需根据引擎版本调整脚本语法,并确保数据库连接和外部 API 调用的稳定性。
|
|