710 lines
		
	
	
		
			24 KiB
		
	
	
	
		
			Lua
		
	
	
		
			Executable File
		
	
	
	
	
			
		
		
	
	
			710 lines
		
	
	
		
			24 KiB
		
	
	
	
		
			Lua
		
	
	
		
			Executable File
		
	
	
	
	
| 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
 |