710 lines
24 KiB
Lua
710 lines
24 KiB
Lua
|
|
module("FubenDispatcher", package.seeall)
|
|||
|
|
--[[
|
|||
|
|
缓存数据:CacheData[fbId]
|
|||
|
|
{
|
|||
|
|
atvId, 建立 活动副本 与 活动id 的对应关系
|
|||
|
|
atvType, 副本类型到活动类型列表的映射,用以建立副本类型跟活动类型的对应关系
|
|||
|
|
ownerId, 单人副本的归属者id
|
|||
|
|
timeFlag, 超时设置标志
|
|||
|
|
kickFlag, 超时后踢出标志
|
|||
|
|
result, 副本结果 1成功,0失败,nil则未知(超时后,若未设置1,则设置为0)
|
|||
|
|
relive[aid] = -1~n 对应玩家的复活次数
|
|||
|
|
}
|
|||
|
|
]]--
|
|||
|
|
|
|||
|
|
local campType_Blue = 1
|
|||
|
|
local campType_Red = 2
|
|||
|
|
|
|||
|
|
local dispatcher = {}
|
|||
|
|
|
|||
|
|
_G.FubenEnterType =
|
|||
|
|
{
|
|||
|
|
Single = 0, --单人进入类副本
|
|||
|
|
Team = 1, --队伍进入类副本
|
|||
|
|
All = 2, --多人进入类副本
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
_G.FubenEvent =
|
|||
|
|
{
|
|||
|
|
OnCheckEnter = 1, --进入检查 [副本id,进入类型,玩家指针] 注意:需要返回值true/false
|
|||
|
|
OnCreate = 2, --副本创建 [副本id,进入类型,副本指针]
|
|||
|
|
OnEnter = 3, --实体进入副本 [副本id,进入类型,副本指针,场景id,实体指针]
|
|||
|
|
OnExit = 4, --实体退出副本 [副本id,进入类型,副本指针,场景id,实体指针]
|
|||
|
|
OnUpdate = 5, --副本帧更新 [副本id,进入类型,副本指针,当前时间]
|
|||
|
|
OnDeath = 6, --实体死亡 [副本id,进入类型,副本指针,场景id,实体指针]
|
|||
|
|
OnGetAward = 7, --获取副本奖励 [副本id,进入类型,副本指针,场景id,玩家指针]
|
|||
|
|
OnTimeout = 8, --副本超时 [副本id,进入类型,副本指针]
|
|||
|
|
OnAttacked = 9, --实体收到攻击 [副本id,进入类型,副本指针,场景id,受击者,攻击者] 注意:怪物攻击怪物不触发
|
|||
|
|
Count = 10,
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
--------------------------------------------------------------------
|
|||
|
|
-- Lua接口
|
|||
|
|
--------------------------------------------------------------------
|
|||
|
|
|
|||
|
|
-- @brief 注册事件分发器
|
|||
|
|
-- @param evId 事件id
|
|||
|
|
-- @param fbType 副本类型
|
|||
|
|
-- @param func 回调
|
|||
|
|
function Reg(evId, fbType, func, file)
|
|||
|
|
|
|||
|
|
--参数检查
|
|||
|
|
if fbType == nil or evId == nil or func == nil or file == nil then
|
|||
|
|
print( debug.traceback() )
|
|||
|
|
assert(false)
|
|||
|
|
end
|
|||
|
|
|
|||
|
|
--事件范围检查
|
|||
|
|
if evId <= 0 or evId >= FubenEvent.Count then
|
|||
|
|
assert(false)
|
|||
|
|
end
|
|||
|
|
|
|||
|
|
--回调表初始化
|
|||
|
|
if dispatcher[evId] == nil then
|
|||
|
|
dispatcher[evId] = {}
|
|||
|
|
end
|
|||
|
|
if dispatcher[evId][fbType] ~= nil then
|
|||
|
|
assert(false) -- 重复注册了
|
|||
|
|
end
|
|||
|
|
|
|||
|
|
--注册
|
|||
|
|
dispatcher[evId][fbType] = func
|
|||
|
|
print("[TIP][FubenDispatcher] Add Fuben(Type:"..fbType..") Event("..evId..") In File("..file.."), And Index="..table.maxn(dispatcher[evId]))
|
|||
|
|
end
|
|||
|
|
|
|||
|
|
-- @brief 获取某个副本的全局数据(这个数据,是存文件的)
|
|||
|
|
-- @param fbId 副本id
|
|||
|
|
function GetGlobalData(fbId)
|
|||
|
|
if fbId == nil then
|
|||
|
|
assert(false)
|
|||
|
|
end
|
|||
|
|
local var = System.getStaticVar();
|
|||
|
|
if var.Fubens == nil then
|
|||
|
|
var.Fubens = {}
|
|||
|
|
end
|
|||
|
|
|
|||
|
|
if var.Fubens[fbId] == nil then
|
|||
|
|
var.Fubens[fbId] = {}
|
|||
|
|
end
|
|||
|
|
|
|||
|
|
return var.Fubens[fbId]
|
|||
|
|
end
|
|||
|
|
|
|||
|
|
-- @brief 清空某个副本的全局数据(这个数据,是存文件的)
|
|||
|
|
-- @param fbId 副本id
|
|||
|
|
function ClearGlobalData(fbId)
|
|||
|
|
if fbId == nil then
|
|||
|
|
assert(false)
|
|||
|
|
end
|
|||
|
|
local var = System.getStaticVar();
|
|||
|
|
if var.Fubens == nil then
|
|||
|
|
var.Fubens = {}
|
|||
|
|
end
|
|||
|
|
if var.Fubens[fbId] then
|
|||
|
|
var.Fubens[fbId] = nil
|
|||
|
|
end
|
|||
|
|
end
|
|||
|
|
|
|||
|
|
-- @brief 获取某个副本的缓存数据(这个数据,不存储仅缓存)
|
|||
|
|
-- @param pFuben 副本指针
|
|||
|
|
function GetCacheData(pFuben)
|
|||
|
|
if pFuben == nil then
|
|||
|
|
assert(false)
|
|||
|
|
end
|
|||
|
|
return Fuben.getDyanmicVar(pFuben)
|
|||
|
|
end
|
|||
|
|
|
|||
|
|
-- @brief 清空某个副本的缓存数据(这个数据,不存储仅缓存)
|
|||
|
|
-- @param pFuben 副本指针
|
|||
|
|
function ClearCacheData(pFuben)
|
|||
|
|
if pFuben == nil then
|
|||
|
|
assert(false)
|
|||
|
|
end
|
|||
|
|
Fuben.clearDynamicVar(pFuben)
|
|||
|
|
end
|
|||
|
|
|
|||
|
|
-- @brief 获取某个副本的个人数据(这个数据,是存数据库的)
|
|||
|
|
-- @param pActor 玩家指针
|
|||
|
|
-- @param fbId 副本id
|
|||
|
|
function GetActorData(pActor, fbId)
|
|||
|
|
if fbId == nil or Actor.getEntityType(pActor) ~= enActor then
|
|||
|
|
assert(false)
|
|||
|
|
end
|
|||
|
|
local var = Actor.getStaticVar(pActor);
|
|||
|
|
if var.Fubens == nil then
|
|||
|
|
var.Fubens = {}
|
|||
|
|
end
|
|||
|
|
|
|||
|
|
if var.Fubens[fbId] == nil then
|
|||
|
|
var.Fubens[fbId] = {}
|
|||
|
|
end
|
|||
|
|
|
|||
|
|
return var.Fubens[fbId]
|
|||
|
|
end
|
|||
|
|
|
|||
|
|
-- @brief 清空某个副本的个人数据(这个数据,是存数据库的)
|
|||
|
|
-- @param pActor 玩家指针
|
|||
|
|
-- @param fbId 副本id
|
|||
|
|
function ClearActorData(pActor, fbId)
|
|||
|
|
if fbId == nil or Actor.getEntityType(pActor) ~= enActor then
|
|||
|
|
assert(false)
|
|||
|
|
end
|
|||
|
|
local var = Actor.getStaticVar(pActor);
|
|||
|
|
if var.Fubens == nil then
|
|||
|
|
var.Fubens = {}
|
|||
|
|
end
|
|||
|
|
if var.Fubens[fbId] then
|
|||
|
|
var.Fubens[fbId] = nil
|
|||
|
|
end
|
|||
|
|
end
|
|||
|
|
|
|||
|
|
-- @brief 设置复活剩余次数
|
|||
|
|
-- @param pActor 玩家指针
|
|||
|
|
-- @param fbId 副本id
|
|||
|
|
-- @param idx 复活选项索引(0为自动复活的,大于1的为复活选项卡的索引)
|
|||
|
|
-- @param count 次数限制(若设置为nil,则自动应用配置的,相当于重置;-1为无限制)
|
|||
|
|
function SetReliveCount(pActor, fbId, idx, count)
|
|||
|
|
local actorData = GetActorData(pActor, fbId)
|
|||
|
|
if actorData.relive == nil then
|
|||
|
|
actorData.relive = {}
|
|||
|
|
end
|
|||
|
|
if count == nil then
|
|||
|
|
local ConfId = (StaticFubens[fbId] and StaticFubens[fbId].reliveConfId) or 1
|
|||
|
|
local ReliveConf = ReliveConfig[ConfId] or ReliveConfig[1]
|
|||
|
|
if idx == 0 then
|
|||
|
|
actorData.relive[idx] = ReliveConf.limit
|
|||
|
|
else
|
|||
|
|
actorData.relive[idx] = ReliveConf.selectInfo[idx].limit or -1
|
|||
|
|
end
|
|||
|
|
else
|
|||
|
|
actorData.relive[idx] = count
|
|||
|
|
end
|
|||
|
|
end
|
|||
|
|
|
|||
|
|
-- @brief 设置副本结果(有结果后,再次设置无效)
|
|||
|
|
-- @param pFuben 副本指针
|
|||
|
|
-- @param result 1为成功,0为失败
|
|||
|
|
function SetResult(pFuben, result)
|
|||
|
|
local cacheData = GetCacheData(pFuben)
|
|||
|
|
if not cacheData.result then
|
|||
|
|
cacheData.result = result
|
|||
|
|
end
|
|||
|
|
CheckActivityFubenFinish(pFuben)
|
|||
|
|
end
|
|||
|
|
|
|||
|
|
-- @brief 获取副本结果
|
|||
|
|
-- @param pFuben 副本指针
|
|||
|
|
-- @return 1为成功,0为失败,nil为未知
|
|||
|
|
function GetReault(pFuben)
|
|||
|
|
local cacheData = GetCacheData(pFuben)
|
|||
|
|
return cacheData.result
|
|||
|
|
end
|
|||
|
|
|
|||
|
|
-- @brief 判断是否为活动副本
|
|||
|
|
-- @param pFuben 副本指针
|
|||
|
|
function IsActivityFuben(pFuben)
|
|||
|
|
local fbCacheData = FubenDispatcher.GetCacheData(pFuben)
|
|||
|
|
return fbCacheData.atvType ~= nil
|
|||
|
|
end
|
|||
|
|
|
|||
|
|
|
|||
|
|
-- @brief 判断是否为Mon副本
|
|||
|
|
-- @param pFuben 副本指针
|
|||
|
|
function IsMonFuben(pFuben)
|
|||
|
|
local fbCacheData = FubenDispatcher.GetCacheData(pFuben)
|
|||
|
|
return fbCacheData.nMonType ~= nil
|
|||
|
|
end
|
|||
|
|
|
|||
|
|
-- @brief 获取副本对应的活动id
|
|||
|
|
-- @param pFuben 副本指针
|
|||
|
|
-- @return 若非活动副本,则返回nil
|
|||
|
|
function GetActivityId(pFuben)
|
|||
|
|
local fbCacheData = FubenDispatcher.GetCacheData(pFuben)
|
|||
|
|
return fbCacheData.atvId
|
|||
|
|
end
|
|||
|
|
|
|||
|
|
-- @brief 获取副本对应的活动Type
|
|||
|
|
-- @param pFuben 副本指针
|
|||
|
|
-- @return 若非活动副本,则返回nil
|
|||
|
|
function GetActivityType(pFuben)
|
|||
|
|
local fbCacheData = FubenDispatcher.GetCacheData(pFuben)
|
|||
|
|
return fbCacheData.atvType
|
|||
|
|
end
|
|||
|
|
|
|||
|
|
-- @brief 获取副本对应的活动,超时后踢出标志
|
|||
|
|
-- @param pFuben 副本指针
|
|||
|
|
-- @return 若非活动副本,则返回nil
|
|||
|
|
function GetActivityKickFlag(pFuben)
|
|||
|
|
local fbCacheData = FubenDispatcher.GetCacheData(pFuben)
|
|||
|
|
return fbCacheData.kickFlag
|
|||
|
|
end
|
|||
|
|
|
|||
|
|
-- @brief 是否为单人副本
|
|||
|
|
-- @param pFuben 副本指针
|
|||
|
|
function IsSingleFuben(pFuben)
|
|||
|
|
local fbId = Fuben.getFubenIdByPtr(pFuben)
|
|||
|
|
if StaticFubens[fbId].enterType == FubenEnterType.Single then
|
|||
|
|
local fbCacheData = FubenDispatcher.GetCacheData(pFuben)
|
|||
|
|
if fbCacheData.ownerId then
|
|||
|
|
return true
|
|||
|
|
end
|
|||
|
|
end
|
|||
|
|
end
|
|||
|
|
|
|||
|
|
-- @brief 获取副本所有者(目前仅对单人副本)
|
|||
|
|
-- @param pFuben 副本指针
|
|||
|
|
-- @return 玩家指针(若非单人副本,则返回nil)
|
|||
|
|
function GetOwner(pFuben)
|
|||
|
|
local fbCacheData = FubenDispatcher.GetCacheData(pFuben)
|
|||
|
|
return Actor.getActorPtrById(fbCacheData.ownerId)
|
|||
|
|
end
|
|||
|
|
|
|||
|
|
-- @brief 延迟踢出
|
|||
|
|
-- @param pFuben 副本指针
|
|||
|
|
-- @param timeout 超时时间(默认10秒)
|
|||
|
|
function KictoutAfter(pFuben, timeout)
|
|||
|
|
local cacheData = GetCacheData(pFuben)
|
|||
|
|
cacheData.kickFlag = 1
|
|||
|
|
Fuben.setFbTime(pFuben, timeout or 10)
|
|||
|
|
end
|
|||
|
|
|
|||
|
|
-- @brief 设置复活次数
|
|||
|
|
-- @param pFuben 副本指针
|
|||
|
|
-- @param pActor 玩家指针
|
|||
|
|
-- @param count 次数
|
|||
|
|
function SetReliveCount(pFuben, pActor, count)
|
|||
|
|
if (not pFuben) or (not pActor) then
|
|||
|
|
return
|
|||
|
|
end
|
|||
|
|
local aid = Actor.getActorId(pActor)
|
|||
|
|
local cacheData = GetCacheData(pFuben)
|
|||
|
|
if not cacheData.relive then cacheData.relive = {} end
|
|||
|
|
cacheData.relive[aid] = count
|
|||
|
|
end
|
|||
|
|
|
|||
|
|
-- @brief 获取复活次数
|
|||
|
|
-- @param pFuben 副本指针
|
|||
|
|
-- @param pActor 玩家指针
|
|||
|
|
-- @return -1为不限次数,nil为异常
|
|||
|
|
function GetReliveCount(pFuben, pActor)
|
|||
|
|
if (not pFuben) or (not pActor) then
|
|||
|
|
return nil
|
|||
|
|
end
|
|||
|
|
local aid = Actor.getActorId(pActor)
|
|||
|
|
local cacheData = GetCacheData(pFuben)
|
|||
|
|
if not cacheData.relive then cacheData.relive = {} end
|
|||
|
|
return cacheData.relive[aid] or -1
|
|||
|
|
end
|
|||
|
|
|
|||
|
|
-- @brief 分配一个广播包,需要外部自己调用FreePacketEx释放包
|
|||
|
|
function AllocPacketEx(systemId, cmdId)
|
|||
|
|
local npack = DataPack.allocPacketEx()
|
|||
|
|
if npack then
|
|||
|
|
DataPack.writeByte(npack,systemId)
|
|||
|
|
DataPack.writeByte(npack,cmdId)
|
|||
|
|
end
|
|||
|
|
return npack
|
|||
|
|
end
|
|||
|
|
|
|||
|
|
-- @brief 释放一个通用回复(注意:这是广播包)
|
|||
|
|
function FreePacketEx(npack)
|
|||
|
|
if npack then
|
|||
|
|
DataPack.freePacketEx(npack)
|
|||
|
|
end
|
|||
|
|
end
|
|||
|
|
|
|||
|
|
--------------------------------------------------------------------
|
|||
|
|
-- CPP回调
|
|||
|
|
--------------------------------------------------------------------
|
|||
|
|
|
|||
|
|
function OnCreateEvent(fbId, fbEnterType, pFuben)
|
|||
|
|
-- 设置副本超时,如果需要的话
|
|||
|
|
local FubenConf = StaticFubens[fbId]
|
|||
|
|
if FubenConf and FubenConf.timeOut then
|
|||
|
|
local cacheData = GetCacheData(pFuben)
|
|||
|
|
if not cacheData.timeFlag then
|
|||
|
|
Fuben.setFbTime(pFuben, FubenConf.timeOut)
|
|||
|
|
cacheData.timeFlag = 1
|
|||
|
|
end
|
|||
|
|
end
|
|||
|
|
end
|
|||
|
|
|
|||
|
|
function OnEnterEvent(fbId, fbEnterType, pFuben, scenId, pEntity)
|
|||
|
|
|
|||
|
|
-- 记录单人副本归属
|
|||
|
|
if fbEnterType == FubenEnterType.Single then
|
|||
|
|
if Actor.getEntityType(pEntity) == enActor then
|
|||
|
|
local fbCacheData = FubenDispatcher.GetCacheData(pFuben)
|
|||
|
|
fbCacheData.ownerId = Actor.getActorId(pEntity)
|
|||
|
|
end
|
|||
|
|
end
|
|||
|
|
|
|||
|
|
-- 进入新场景时,发送剩余时间,如果需要的话
|
|||
|
|
local FubenConf = StaticFubens[fbId]
|
|||
|
|
if FubenConf and FubenConf.timeOut then
|
|||
|
|
if Actor.getEntityType(pEntity) == enActor then
|
|||
|
|
local netPack = DataPack.allocPacket(pEntity, enFubenSystemID, sFubenRestTime)
|
|||
|
|
if netPack then
|
|||
|
|
DataPack.writeInt(netPack, Fuben.getFbTime(pFuben))
|
|||
|
|
DataPack.flush(netPack)
|
|||
|
|
end
|
|||
|
|
end
|
|||
|
|
end
|
|||
|
|
|
|||
|
|
-- 进入活动场景检测
|
|||
|
|
if IsActivityFuben(pFuben) then
|
|||
|
|
local cacheData = GetCacheData(pFuben)
|
|||
|
|
ActivityDispatcher.CheckEnterFuben(cacheData.atvType, cacheData.atvId, pFuben, pEntity, Actor.getActorById(cacheData.ownerId))
|
|||
|
|
end
|
|||
|
|
if IsMonFuben(pFuben) then
|
|||
|
|
local cacheData = GetCacheData(pFuben)
|
|||
|
|
MonDispatcher.CheckEnterFuben(cacheData.nMonType, fbId,scenId,pEntity)
|
|||
|
|
end
|
|||
|
|
end
|
|||
|
|
|
|||
|
|
function OnExitEvent(fbId, fbEnterType, pFuben, scenId, pEntity)
|
|||
|
|
-- 离开活动场景检测
|
|||
|
|
if IsActivityFuben(pFuben) then
|
|||
|
|
local cacheData = GetCacheData(pFuben)
|
|||
|
|
ActivityDispatcher.CheckExitFuben(cacheData.atvType, cacheData.atvId, pFuben, pEntity, Actor.getActorById(cacheData.ownerId))
|
|||
|
|
end
|
|||
|
|
if IsMonFuben(pFuben) then
|
|||
|
|
local cacheData = GetCacheData(pFuben)
|
|||
|
|
MonDispatcher.CheckExitFuben(cacheData.nMonType, fbId,scenId,pFuben, pEntity)
|
|||
|
|
end
|
|||
|
|
end
|
|||
|
|
|
|||
|
|
function OnEntityDeathEvent(fbId, fbEnterType, pFuben, scenId, pEntity)
|
|||
|
|
-- 检查活动副本内实体死亡
|
|||
|
|
if IsActivityFuben(pFuben) then
|
|||
|
|
local killerHandle = Actor.getKillHandle(pEntity)
|
|||
|
|
local pKiller = Actor.getEntity(killerHandle)
|
|||
|
|
local cacheData = GetCacheData(pFuben)
|
|||
|
|
ActivityDispatcher.CheckFubenEntityDeath(cacheData.atvType, cacheData.atvId, pFuben, pEntity, pKiller, Actor.getActorById(cacheData.ownerId))
|
|||
|
|
end
|
|||
|
|
if IsMonFuben(pFuben) then
|
|||
|
|
local cacheData = GetCacheData(pFuben)
|
|||
|
|
local killerHandle = Actor.getKillHandle(pEntity)
|
|||
|
|
local pKiller = Actor.getEntity(killerHandle)
|
|||
|
|
MonDispatcher.CheckFubenEntityDeath(cacheData.nMonType, fbId, scenId,pFuben, pEntity, pKiller)
|
|||
|
|
end
|
|||
|
|
end
|
|||
|
|
|
|||
|
|
function OnAttackedEvent(fbId, fbEnterType, pFuben, scenId, pEntity, pAttacker)
|
|||
|
|
-- 检查活动副本内实体收到攻击
|
|||
|
|
if IsActivityFuben(pFuben) then
|
|||
|
|
local cacheData = GetCacheData(pFuben)
|
|||
|
|
ActivityDispatcher.CheckFubenEntityAttacked(cacheData.atvType, cacheData.atvId, pFuben, pEntity, pAttacker, Actor.getActorById(cacheData.ownerId))
|
|||
|
|
end
|
|||
|
|
if IsMonFuben(pFuben) then
|
|||
|
|
local cacheData = GetCacheData(pFuben)
|
|||
|
|
MonDispatcher.CheckFubenEntityAttacked(cacheData.nMonType, fbId, scenId, pFuben,pEntity, pAttacker)
|
|||
|
|
end
|
|||
|
|
end
|
|||
|
|
|
|||
|
|
function OnTimeoutEvent(fbId, fbEnterType, pFuben)
|
|||
|
|
-- 超时设置踢出时间,如果需要的话
|
|||
|
|
local FubenConf = StaticFubens[fbId]
|
|||
|
|
if FubenConf then
|
|||
|
|
local cacheData = GetCacheData(pFuben)
|
|||
|
|
--第二次超时,则表示踢出了
|
|||
|
|
if not cacheData.kickFlag then
|
|||
|
|
Fuben.setFbTime(pFuben, FubenConf.kickTime or 12)
|
|||
|
|
cacheData.kickFlag = 1
|
|||
|
|
|
|||
|
|
--若副本没成功,超时就表示失败了
|
|||
|
|
if not cacheData.result then
|
|||
|
|
cacheData.result = 0
|
|||
|
|
end
|
|||
|
|
|
|||
|
|
-- 检查活动副本结束
|
|||
|
|
CheckActivityFubenFinish(pFuben)
|
|||
|
|
elseif cacheData.kickFlag then
|
|||
|
|
Fuben.ExitAllFbActor(pFuben)
|
|||
|
|
end
|
|||
|
|
end
|
|||
|
|
end
|
|||
|
|
|
|||
|
|
|
|||
|
|
function SetFubenTimeout(fbId, pFuben)
|
|||
|
|
-- 超时设置踢出时间,如果需要的话
|
|||
|
|
local FubenConf = StaticFubens[fbId]
|
|||
|
|
if FubenConf then
|
|||
|
|
local cacheData = GetCacheData(pFuben)
|
|||
|
|
if not cacheData.kickFlag then
|
|||
|
|
Fuben.setFbTime(pFuben, FubenConf.kickTime or 12)
|
|||
|
|
cacheData.kickFlag = 1
|
|||
|
|
|
|||
|
|
--若副本没成功,超时就表示失败了
|
|||
|
|
if not cacheData.result then
|
|||
|
|
cacheData.result = 0
|
|||
|
|
end
|
|||
|
|
end
|
|||
|
|
end
|
|||
|
|
end
|
|||
|
|
|
|||
|
|
function ClearFubenTimeout(fbId, pFuben)
|
|||
|
|
-- 超时设置踢出时间,如果需要的话
|
|||
|
|
local FubenConf = StaticFubens[fbId]
|
|||
|
|
if FubenConf then
|
|||
|
|
local cacheData = GetCacheData(pFuben)
|
|||
|
|
if cacheData then
|
|||
|
|
Fuben.setFbTime(pFuben,0)
|
|||
|
|
cacheData.kickFlag = nil
|
|||
|
|
cacheData.result = nil
|
|||
|
|
end
|
|||
|
|
end
|
|||
|
|
end
|
|||
|
|
|
|||
|
|
function OnGetAwardEvent(fbId, fbEnterType, pFuben, nSceneId, pActor)
|
|||
|
|
-- 检查活动副本结算请求
|
|||
|
|
if IsActivityFuben(pFuben) then
|
|||
|
|
local cacheData = GetCacheData(pFuben)
|
|||
|
|
ActivityDispatcher.CheckFubenAward(cacheData.atvType, cacheData.atvId, pFuben, pActor, Actor.getActorById(cacheData.ownerId))
|
|||
|
|
end
|
|||
|
|
end
|
|||
|
|
|
|||
|
|
function OnEvent(evId, fbType, fbId, fbEnterType, ...)
|
|||
|
|
|
|||
|
|
if evId == FubenEvent.OnCreate then --副本创建
|
|||
|
|
OnCreateEvent(fbId, fbEnterType, ...)
|
|||
|
|
elseif evId == FubenEvent.OnEnter then --实体进入副本
|
|||
|
|
OnEnterEvent(fbId, fbEnterType, ...)
|
|||
|
|
elseif evId == FubenEvent.OnExit then --实体退出副本
|
|||
|
|
OnExitEvent(fbId, fbEnterType, ...)
|
|||
|
|
elseif evId == FubenEvent.OnDeath then --副本实体死亡
|
|||
|
|
OnEntityDeathEvent(fbId, fbEnterType, ...)
|
|||
|
|
elseif evId == FubenEvent.OnAttacked then --实体收到攻击
|
|||
|
|
OnAttackedEvent(fbId, fbEnterType, ...)
|
|||
|
|
elseif evId == FubenEvent.OnTimeout then --副本超时
|
|||
|
|
OnTimeoutEvent(fbId, fbEnterType, ...)
|
|||
|
|
elseif evId == FubenEvent.OnGetAward then --获取副本奖励
|
|||
|
|
OnGetAwardEvent(fbId, fbEnterType, ...)
|
|||
|
|
end
|
|||
|
|
|
|||
|
|
--获取回调
|
|||
|
|
local callbacks = dispatcher[evId]
|
|||
|
|
if callbacks == nil or callbacks[fbType] == nil then
|
|||
|
|
return true
|
|||
|
|
end
|
|||
|
|
local func = callbacks[fbType];
|
|||
|
|
|
|||
|
|
--回调调用
|
|||
|
|
if evId == FubenEvent.OnCheckEnter then --副本进入检查
|
|||
|
|
return func(fbId, fbEnterType, ...)
|
|||
|
|
else
|
|||
|
|
func(fbId, fbEnterType, ...)
|
|||
|
|
end
|
|||
|
|
return true
|
|||
|
|
end
|
|||
|
|
|
|||
|
|
-- 玩家死亡回调,用以发送复活信息
|
|||
|
|
function OnActorDeath(pActor, pFuben)
|
|||
|
|
--if Actor.getReliveTimeOut(pActor) == 0 then
|
|||
|
|
local fbId = Fuben.getFubenIdByPtr(pFuben)
|
|||
|
|
local ConfId = (StaticFubens[fbId] and StaticFubens[fbId].reliveConfId) or 1
|
|||
|
|
local ReliveConf = ReliveConfig[ConfId] or ReliveConfig[1]
|
|||
|
|
local aid = Actor.getActorId(pActor)
|
|||
|
|
local cacheData = GetCacheData(pFuben)
|
|||
|
|
if not cacheData.relive then cacheData.relive = {} end
|
|||
|
|
if not cacheData.relive[aid] then
|
|||
|
|
cacheData.relive[aid] = ReliveConf.limit or -1
|
|||
|
|
end
|
|||
|
|
local reliveCount = cacheData.relive[aid]
|
|||
|
|
|
|||
|
|
-- 维护次数
|
|||
|
|
if reliveCount > 0 then
|
|||
|
|
cacheData.relive[aid] = reliveCount - 1
|
|||
|
|
elseif reliveCount == 0 then
|
|||
|
|
Actor.clearReliveTimeOut(pActor)
|
|||
|
|
local maxhp = Actor.getIntProperty(pActor,PROP_CREATURE_MAXHP)
|
|||
|
|
Actor.changeHp(pActor, maxhp)
|
|||
|
|
local maxmp = Actor.getIntProperty(pActor,PROP_CREATURE_MAXMP)
|
|||
|
|
Actor.changeMp(pActor, maxmp)
|
|||
|
|
local atvId = GetActivityId(pFuben);
|
|||
|
|
local atvType = GetActivityType(pFuben);
|
|||
|
|
ActivityDispatcher.OnEvent(ActivityEvent.OnAtvGG, atvType, atvId, pActor);
|
|||
|
|
Actor.exitFubenAndBackCity(pActor)
|
|||
|
|
--Actor.addState(pActor, esStateDeath)
|
|||
|
|
--Actor.updateActorEntityProp(pActor)
|
|||
|
|
--Actor.removeState(pActor, esStateDeath)
|
|||
|
|
--Actor.updateActorEntityProp(pActor)
|
|||
|
|
cacheData.relive[aid] = nil
|
|||
|
|
return
|
|||
|
|
end
|
|||
|
|
|
|||
|
|
-- 设置自动复活时间
|
|||
|
|
-- 复活特权
|
|||
|
|
local nCurReviveDuration = Actor.getIntProperty2(pActor, PROP_ACTOR_CURREVIVEDURATION);
|
|||
|
|
if nCurReviveDuration ~= 0 then
|
|||
|
|
Actor.setReliveTimeOut(pActor, (ReliveConf.VipRevive or 5))
|
|||
|
|
else
|
|||
|
|
Actor.setReliveTimeOut(pActor, (ReliveConf.expire or 10))
|
|||
|
|
end
|
|||
|
|
|
|||
|
|
-- 通知死亡复活框
|
|||
|
|
local npack = DataPack.allocPacket(pActor, enDefaultEntitySystemID, sActorReliveInfo)
|
|||
|
|
if npack then
|
|||
|
|
DataPack.writeByte(npack, ConfId)
|
|||
|
|
DataPack.writeByte(npack, reliveCount)
|
|||
|
|
local count = (ReliveConf.selectInfo and #ReliveConf.selectInfo) or 0
|
|||
|
|
DataPack.writeByte(npack, count)
|
|||
|
|
local actorData = GetActorData(pActor, fbId)
|
|||
|
|
if actorData.relive == nil then
|
|||
|
|
actorData.relive = {}
|
|||
|
|
end
|
|||
|
|
if count > 0 then
|
|||
|
|
for i=1,count do
|
|||
|
|
if actorData.relive[i] == nil then
|
|||
|
|
actorData.relive[i] = ReliveConf.selectInfo[i].limit or -1
|
|||
|
|
end
|
|||
|
|
DataPack.writeByte(npack, actorData.relive[i])
|
|||
|
|
end
|
|||
|
|
end
|
|||
|
|
|
|||
|
|
-- 添加击杀者名字
|
|||
|
|
local h_killer = Actor.getKillHandle(pActor)
|
|||
|
|
local pKiller = Actor.getEntity(h_killer)
|
|||
|
|
local name = ""
|
|||
|
|
if pKiller then
|
|||
|
|
name = Actor.getName(pKiller)
|
|||
|
|
end
|
|||
|
|
DataPack.writeString( npack, name )
|
|||
|
|
DataPack.flush(npack)
|
|||
|
|
end
|
|||
|
|
--end
|
|||
|
|
end
|
|||
|
|
|
|||
|
|
-- 复活选项
|
|||
|
|
function OnClickReqRelive (pActor, packet)
|
|||
|
|
local confId = DataPack.readByte(packet)
|
|||
|
|
local idx = DataPack.readByte(packet) + 1
|
|||
|
|
|
|||
|
|
--获取当前副本复活配置
|
|||
|
|
local pFuben = Actor.getFubenPrt(pActor)
|
|||
|
|
local fbId = Fuben.getFubenIdByPtr(pFuben)
|
|||
|
|
local ConfId = (StaticFubens[fbId] and StaticFubens[fbId].reliveConfId) or 1
|
|||
|
|
local ReliveConf = ReliveConfig[ConfId] or ReliveConfig[1]
|
|||
|
|
|
|||
|
|
--配置id验证
|
|||
|
|
if confId ~= ConfId then
|
|||
|
|
return
|
|||
|
|
end
|
|||
|
|
|
|||
|
|
--复活选项配置
|
|||
|
|
local selectInfo = ReliveConf.selectInfo[idx]
|
|||
|
|
if selectInfo then
|
|||
|
|
|
|||
|
|
--消耗检查
|
|||
|
|
local consumes = {}
|
|||
|
|
if selectInfo.consume then
|
|||
|
|
table.insert( consumes, selectInfo.consume )
|
|||
|
|
if CommonFunc.Consumes.Check(pActor, consumes) ~= true then
|
|||
|
|
Actor.sendTipmsg(pActor, "|C:0xf56f00&T:道具或金币元宝不足!|", tstEcomeny)
|
|||
|
|
return
|
|||
|
|
end
|
|||
|
|
end
|
|||
|
|
|
|||
|
|
--次数检查
|
|||
|
|
if selectInfo.limit and selectInfo.limit > 0 then
|
|||
|
|
local actorData = GetActorData(pActor, fbId)
|
|||
|
|
|
|||
|
|
if actorData.relive[idx] == nil then
|
|||
|
|
actorData.relive[idx] = selectInfo.limit
|
|||
|
|
else
|
|||
|
|
if actorData.relive[idx] == 0 then
|
|||
|
|
Actor.sendTipmsg(pActor, "超过次数了!"..actorData.relive[idx].."/"..selectInfo.limit, tstUI)
|
|||
|
|
return
|
|||
|
|
end
|
|||
|
|
actorData.relive[idx] = actorData.relive[idx] - 1
|
|||
|
|
end
|
|||
|
|
end
|
|||
|
|
|
|||
|
|
-- 消耗
|
|||
|
|
if consumes and CommonFunc.Consumes.Remove(pActor, consumes,GameLog.Log_Relive , "复活") ~= true then
|
|||
|
|
return
|
|||
|
|
end
|
|||
|
|
|
|||
|
|
--回血回蓝
|
|||
|
|
local maxhp = Actor.getIntProperty(pActor,PROP_CREATURE_MAXHP)
|
|||
|
|
Actor.changeHp(pActor, maxhp * ((selectInfo.hp or 100)/100))
|
|||
|
|
local maxmp = Actor.getIntProperty(pActor,PROP_CREATURE_MAXMP)
|
|||
|
|
Actor.changeMp(pActor, maxmp * ((selectInfo.mp or 100)/100))
|
|||
|
|
|
|||
|
|
-- 原地复活
|
|||
|
|
if selectInfo.type == 1 then
|
|||
|
|
-- 随机复活
|
|||
|
|
elseif selectInfo.type == 2 then
|
|||
|
|
System.telportRandPos(pActor)
|
|||
|
|
-- 副本固定点复活
|
|||
|
|
elseif selectInfo.type == 3 then
|
|||
|
|
if ReliveConf.FixedPosi then
|
|||
|
|
local sceneId = Actor.getSceneId(pActor)
|
|||
|
|
Actor.enterScene(pActor, sceneId, ReliveConf.FixedPosi.x, ReliveConf.FixedPosi.y)
|
|||
|
|
else
|
|||
|
|
Actor.relive(pActor)
|
|||
|
|
end
|
|||
|
|
-- 回城安全区复活
|
|||
|
|
elseif selectInfo.type == 4 or selectInfo.type == 6 then
|
|||
|
|
if Fuben.isFuben(pFuben) then
|
|||
|
|
Actor.exitFubenAndBackCity(pActor)
|
|||
|
|
else
|
|||
|
|
Actor.relive(pActor)
|
|||
|
|
end
|
|||
|
|
-- 本方阵营复活
|
|||
|
|
elseif selectInfo.type == 5 then
|
|||
|
|
|
|||
|
|
|
|||
|
|
end
|
|||
|
|
|
|||
|
|
--清除复活倒计时
|
|||
|
|
Actor.clearReliveTimeOut(pActor)
|
|||
|
|
Actor.onRelive(pActor)
|
|||
|
|
TranRedActorToRedSceen(pActor)
|
|||
|
|
--Actor.removeState(pActor, esStateDeath)
|
|||
|
|
--Actor.updateActorEntityProp(pActor)
|
|||
|
|
end
|
|||
|
|
end
|
|||
|
|
|
|||
|
|
NetmsgDispatcher.Reg(enDefaultEntitySystemID, cChooseRelive, OnClickReqRelive)
|
|||
|
|
|
|||
|
|
--------------------------------------------------------------------
|
|||
|
|
-- 活动副本回调
|
|||
|
|
--------------------------------------------------------------------
|
|||
|
|
|
|||
|
|
-- 映射副本跟活动的对应关系
|
|||
|
|
function MapToActivity(pFuben, atvType, atvId)
|
|||
|
|
if atvType then
|
|||
|
|
local fbCacheData = FubenDispatcher.GetCacheData(pFuben)
|
|||
|
|
if fbCacheData.atvType == nil then
|
|||
|
|
fbCacheData.atvId = atvId
|
|||
|
|
fbCacheData.atvType = atvType
|
|||
|
|
local atvCacheData = ActivityDispatcher.GetCacheData(atvId)
|
|||
|
|
atvCacheData.fbHandle = Fuben.getFubenHandle(pFuben)
|
|||
|
|
end
|
|||
|
|
end
|
|||
|
|
end
|
|||
|
|
|
|||
|
|
-- 映射副本跟Monster的对应关系
|
|||
|
|
function MapToMonster(pFuben, nMonType, nSerial)
|
|||
|
|
if nMonType then
|
|||
|
|
local fbCacheData = FubenDispatcher.GetCacheData(pFuben)
|
|||
|
|
if fbCacheData.nMonType == nil then
|
|||
|
|
fbCacheData.nMonType = nMonType
|
|||
|
|
fbCacheData.nSerial = nSerial
|
|||
|
|
end
|
|||
|
|
end
|
|||
|
|
end
|
|||
|
|
|
|||
|
|
-- 检查活动副本结束
|
|||
|
|
function CheckActivityFubenFinish(pFuben)
|
|||
|
|
if IsActivityFuben(pFuben) then
|
|||
|
|
local cacheData = GetCacheData(pFuben)
|
|||
|
|
ActivityDispatcher.CheckFubenFinish(cacheData.atvType, cacheData.atvId, pFuben, cacheData.result, Actor.getActorById(cacheData.ownerId))
|
|||
|
|
end
|
|||
|
|
if IsMonFuben(pFuben) then
|
|||
|
|
local cacheData = GetCacheData(pFuben)
|
|||
|
|
MonDispatcher.CheckFubenFinish(cacheData.nMonType, pFuben, cacheData.result, Actor.getActorById(cacheData.ownerId))
|
|||
|
|
end
|
|||
|
|
end
|