设为首页收藏本站
  • 官方微信
    lmkj_wx 微信公众号 添加方式:
    1:扫描左侧二维码
  • 手机访问
    lmkj_sj
  •  找回密码
     立即注册

    QQ登录

    只需一步,快速开始

    查看: 20|回复: 0

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

    [复制链接]
    avatar
    • 打卡等级:魔龙套勇士
    • 打卡总天数:130
    • 打卡月天数:23
    • 打卡总奖励:14868
    • 最近打卡:2025-08-23 00:38:01

    7082

    主题

    150

    回帖

    8648

    积分

    管理员

    本站站长

    积分
    8648
    online_admin 发表于 2025-7-27 18:25:45 | 显示全部楼层 |阅读模式
    在复古传奇中实现 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 调用的稳定性。

    您需要登录后才可以回帖 登录 | 立即注册 qq_login

    本版积分规则

    QQArchiver 手机版 小黑屋 39传奇素材网 ( 蜀ICP备2022016510号-3 )

    快速回复 快速发帖 返回顶部 返回列表