--[[
奇遇系统主模块
功能:
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