--[[
    奇遇系统主模块
    
    功能:
    1. 处理玩家击杀怪物触发的奇遇事件
    2. 管理奇遇事件盒子
    3. 处理奇遇事件的buff状态
    
    配置依赖:
    1. cfg_QiYuMonster.lua - 奇遇怪物配置
    2. cfg_LuckyEvent_BoxData.lua - 奇遇事件配置
]]
LuckyEvent = {}
local LuckyMonCfg = include("QuestDiary/cfgcsv/cfg_QiYuMonster.lua")          --奇遇怪物配置
local LuckyEventCfg = include("QuestDiary/cfgcsv/cfg_LuckyEvent_BoxData.lua") --奇遇事件配置

--[[
    检查事件是否已存在于奇遇盒子中
    
    参数:
    @param actor 玩家对象
    @param Event_Name 事件名称
    
    返回:
    @return bool 是否已存在
]]
local function InTheBox(actor, Event_Name)
    local bool = false
    -- 获取所有盒子位置的事件
    local notes1 = getplaydef(actor, VarCfg["Z_奇遇盒子位置1"])
    local notes2 = getplaydef(actor, VarCfg["Z_奇遇盒子位置2"])
    local notes3 = getplaydef(actor, VarCfg["Z_奇遇盒子位置3"])
    local notes4 = getplaydef(actor, VarCfg["Z_奇遇盒子位置4"])
    local notes5 = getplaydef(actor, VarCfg["Z_奇遇盒子位置5"])
    local NewTbl = { notes1, notes2, notes3, notes4, notes5 }
    -- 检查事件是否已存在
    for _, value in ipairs(NewTbl) do
        if value == Event_Name then
            setplaydef(actor, VarCfg["S$奇遇验证"], "")
            bool = true
        end
    end
    return bool
end

--[[
    检查并处理事件buff冲突
    
    参数:
    @param actor 玩家对象
    @param Event_Name 事件名称
    
    返回:
    @return name 最终的事件名称(可能是新随机的)
]]
local function checkbuff(actor, Event_Name)
    local name = Event_Name
    -- 获取事件配置
    local cfg = {}
    for k, v in ipairs(LuckyEventCfg) do
        if v.EnevtName == Event_Name then
            cfg = v
            break
        end
    end
    -- 检查buff冲突
    if cfg.BuffId ~= "nil" then
        local BuffTbl = cfg.BuffId
        for i = 1, #BuffTbl do
            if hasbuff(actor, BuffTbl[i]) then
                -- 如果有冲突的buff,重新随机一个事件
                local NewTbl = {}
                for i = 17, 34 do
                    local info = LuckyEventCfg[i].EnevtName
                    if info ~= name then
                        table.insert(NewTbl, info)
                    end
                end
                name = NewTbl[math.random(1, #NewTbl)]
                return name
            end
        end
    end
    return name
end

--[[
    执行奇遇事件
    
    参数:
    @param actor 玩家对象
    @param Event_Name 事件名称
]]
local function EvevtRun(actor, Event_Name)
    if InTheBox(actor, Event_Name) then return end
    if QiYuHeZi.AddEvent(actor, Event_Name) then
        Message.sendmsg(actor, ssrNetMsgCfg.QiYuHeZi_OpenEventUI, 0, 0, 0, { Event_Name }) --打开前端事件UI
        GameEvent.push(EventCfg.LuckyEventinitVar, actor, Event_Name)                      --奇遇触发后设置变量
    end
end

-- 奇遇事件处理函数表
local event = {}
-- 召唤类事件处理
event["召唤类"] = function(actor, num)
    local Event_Name = LuckyEventCfg[num].EnevtName    -- 从配置表获取事件名称
    EvevtRun(actor, Event_Name)                        -- 执行奇遇事件
    Message.sendmsg(actor, ssrNetMsgCfg.QiYuZhaoHuan_SyncResponse, 0, 0, 0, { Event_Name }) -- 同步到客户端
end
-- 副本类事件处理
event["副本类"] = function(actor, num)
    local Event_Name = LuckyEventCfg[num + 8].EnevtName
    EvevtRun(actor, Event_Name)
    Message.sendmsg(actor, ssrNetMsgCfg.QiYuFuBen_SyncResponse, 0, 0, 0, { Event_Name })
end
-- 事件类事件处理
event["事件类"] = function(actor, num)
    local _Event_Name = LuckyEventCfg[math.random(17, 34)].EnevtName --随机取值事件
    local Event_Name = checkbuff(actor, _Event_Name)                 --buff查重 重新取事件
    EvevtRun(actor, Event_Name)
end

--[[
    击杀怪物触发奇遇事件处理
    
    参数:
    @param actor 玩家对象
    @param monobj 怪物对象
    @param monName 怪物名称
]]
local function _onKillMon(actor, monobj, monName)
    local MonName = monName
    local cfg = LuckyMonCfg[MonName]
    if cfg then
        -- 按概率触发奇遇
        if randomex(1, cfg.Random_num) then            -- 根据怪物配置的概率随机触发
            local times = getplaydef(actor, VarCfg["N$奇遇内置间隔"])
            -- 检查CD时间:首次触发或距离上次触发超过300秒
            local state = (times == 0) or ((os.time() - times) >= 300)
            if state then
                -- 随机选择事件类型:召唤类(30%)、副本类(40%)、事件类(30%)
                local result1, result2 = ransjstr("召唤类#3000|副本类#4000|事件类#3000", 1, 3)
                local num = cfg.Map_num                 -- 获取怪物对应的地图编号
                release_print(result1, num)             -- 调试输出
                event[result1](actor, num)              -- 执行对应类型的事件处理函数
                -- 更新最后触发时间
                setplaydef(actor, VarCfg["N$奇遇内置间隔"], os.time())
            end
        end
    end
end
-- 注册击杀怪物事件
GameEvent.add(EventCfg.onKillMon, _onKillMon, LuckyEvent)
return LuckyEvent
    撰写回复...