39传奇素材网 发表于 2025-7-27 18:25:45

适合复古传奇BOSS刷新公告牌

在复古传奇中实现 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
      local mapName = Args
      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.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
      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
      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 调用的稳定性。

页: [1]
查看完整版本: 适合复古传奇BOSS刷新公告牌