322 lines
		
	
	
		
			8.6 KiB
		
	
	
	
		
			Lua
		
	
	
		
			Executable File
		
	
	
	
	
			
		
		
	
	
			322 lines
		
	
	
		
			8.6 KiB
		
	
	
	
		
			Lua
		
	
	
		
			Executable File
		
	
	
	
	
| module("MonDispatcher", package.seeall)
 | ||
| --[[
 | ||
|     个人数据:ActorData
 | ||
|     {
 | ||
|     }
 | ||
| 
 | ||
|     全局数据:GlobalData[fdId]
 | ||
|     {
 | ||
|     }
 | ||
| 
 | ||
|     缓存数据:CacheData[fdId]
 | ||
|     {
 | ||
| 
 | ||
|     }
 | ||
| ]]--
 | ||
| 
 | ||
| 
 | ||
| local IniScenes =  {}
 | ||
| --注册场景
 | ||
| function InitScene(sceneId)
 | ||
|     if IniScenes== nil then
 | ||
|         IniScenes = {}
 | ||
|     end
 | ||
|     if IniScenes[sceneId] then
 | ||
|         return
 | ||
|     end
 | ||
|     
 | ||
|     IniScenes[sceneId] = sceneId;
 | ||
| end
 | ||
| -- 场景是否注册
 | ||
| function IsInitScene(sceneId)
 | ||
|     if IniScenes == nil then
 | ||
|         return false;
 | ||
|     end
 | ||
| 
 | ||
|     return IniScenes[sceneId] ~= nil;
 | ||
| end
 | ||
| local dispatcher = { }
 | ||
| 
 | ||
| _G.MonEvent =
 | ||
| {
 | ||
|     OnInitialize = 1,      --初始化
 | ||
|     OnEnterFuben = 2,      --玩家进入Boss副本[玩家指针,副本指针, pOwner]
 | ||
|     OnExitFuben = 3,       --玩家离开Boss副本[玩家指针,副本指针, pOwner]
 | ||
|     OnEntityDeath = 4,     --副本实体死亡    [被杀者指针,击杀者指针,副本指针, pOwner]
 | ||
|     OnEntityAttacked = 5,  --副本实体收到伤害[副本指针,受击者,攻击者, pOwner]
 | ||
|     OnReqData     = 6,     --boss数据
 | ||
|     OnCancelBL   = 7,--取消归属
 | ||
|     OnSetBossBL   = 8,--设置归属
 | ||
|     OnCheckEnterFuben = 9, --boss进入检查
 | ||
|     OnFubenFinish = 10,     --活动副本结束    [, 副本指针,结果, pOwner] 1为完成,0为失败,nil则结果未知(需要对应副本设置结果)
 | ||
|     OnReqEnterFuben = 11,     --请求进入副本    [玩家指针, bossid]
 | ||
|     Count = 12,
 | ||
| }
 | ||
| --------------------------------------------------------------------
 | ||
| -- Lua接口
 | ||
| --------------------------------------------------------------------
 | ||
| 
 | ||
| -- @brief 注册事件分发器
 | ||
| -- @param evId 事件id
 | ||
| -- @param atvType 活动类型
 | ||
| -- @param func 回调
 | ||
| function Reg(evId, nMonType,  func, file)
 | ||
| 
 | ||
|     --参数检查
 | ||
| 	if evId == nil or func == nil or file == nil or nMonType == nil then 
 | ||
| 		print( debug.traceback() )
 | ||
| 		assert(false)
 | ||
|     end
 | ||
|     
 | ||
|     --事件范围检查
 | ||
|     if evId <= 0 or evId >= MonEvent.Count then
 | ||
|         assert(false)
 | ||
|     end
 | ||
| 
 | ||
|     --回调表初始化
 | ||
|     if dispatcher[evId] == nil then
 | ||
|         dispatcher[evId] = {}
 | ||
|     end
 | ||
|     if dispatcher[evId][nMonType] ~= nil then
 | ||
|         assert(false) -- 重复注册了
 | ||
|     end
 | ||
| 
 | ||
|     --注册
 | ||
|     dispatcher[evId][nMonType] = func
 | ||
|     print("[TIP][MonDispatcher Add nMonType(Type:"..nMonType..")] Event("..evId..") In File("..file..")")
 | ||
| end
 | ||
| 
 | ||
| -- @brief 获取副本怪物的全局数据(这个数据,是存文件的)
 | ||
| -- @param fdId 副本id
 | ||
| function GetGlobalData(fdId)
 | ||
|     if fdId == nil then
 | ||
|         assert(false)
 | ||
|     end
 | ||
|     local var = System.getStaticVar();
 | ||
|     if var.Mon == nil then
 | ||
|         var.Mon = {}
 | ||
|     end
 | ||
| 
 | ||
|     if var.Mon[fdId] == nil then
 | ||
|         var.Mon[fdId] = {}
 | ||
|     end
 | ||
| 
 | ||
|     return var.Mon[fdId]
 | ||
| end
 | ||
| 
 | ||
| -- @brief 清空某个bossId的全局数据(这个数据,是存文件的)
 | ||
| -- @param bossId bossId
 | ||
| function ClearGlobalData(fdId)
 | ||
|     if fdId == nil then
 | ||
|         assert(false)
 | ||
|     end
 | ||
|     local var = System.getStaticVar();
 | ||
|     if var.Mon == nil then
 | ||
|         var.Mon = {}
 | ||
|     end
 | ||
|     if var.Mon[fdId] then
 | ||
|         var.Mon[fdId] = nil
 | ||
|     end
 | ||
| end
 | ||
| 
 | ||
| -- @brief 获取某个活动的缓存数据(这个数据,不存储仅缓存)
 | ||
| -- @param fbId 活动id
 | ||
| function GetCacheData(fdId)
 | ||
|     if fdId == nil then
 | ||
|         assert(false)
 | ||
|     end
 | ||
|     local var = System.getDyanmicVar();
 | ||
|     if var.Mon == nil then
 | ||
|         var.Mon = {}
 | ||
|     end
 | ||
| 
 | ||
|     if var.Mon[fdId] == nil then
 | ||
|         var.Mon[fdId] = {}
 | ||
|     end
 | ||
| 
 | ||
|     return var.Mon[fdId]
 | ||
| end
 | ||
| 
 | ||
| -- @brief 清空boss副本的缓存数据(这个数据,不存储仅缓存)
 | ||
| -- @param fbId 活动id
 | ||
| function ClearCacheData(fdId)
 | ||
|     if fdId == nil then
 | ||
|         assert(false)
 | ||
|     end
 | ||
|     local var = System.getDyanmicVar();
 | ||
|     if var.Mon == nil then
 | ||
|         var.Mon = {}
 | ||
|     end
 | ||
|     if var.Mon[fdId] then
 | ||
|         var.Mon[fdId] = nil
 | ||
|     end
 | ||
| end
 | ||
| 
 | ||
| 
 | ||
| 
 | ||
| 
 | ||
| -- @brief 获取boss副本的个人数据(这个数据,是存数据库的)
 | ||
| -- @param atvId 活动id
 | ||
| function GetActorData(pActor, fdId)
 | ||
|     if fdId == nil or Actor.getEntityType(pActor) ~= enActor then
 | ||
|         assert(false)
 | ||
|     end
 | ||
|     local var = Actor.getStaticVar(pActor);
 | ||
|     if var.Mon == nil then
 | ||
|         var.Mon = {}
 | ||
|     end
 | ||
|     if var.Mon[fdId] == nil then
 | ||
|         var.Mon[fdId] = {}
 | ||
|     end
 | ||
| 
 | ||
|     return var.Mon[fdId]
 | ||
| end
 | ||
| 
 | ||
| -- @brief 清空某个boss副本的个人数据(这个数据,是存数据库的)
 | ||
| -- @param atvId 活动id
 | ||
| function ClearActorData(pActor, fdId)
 | ||
|     if fdId == nil or Actor.getEntityType(pActor) ~= enActor then
 | ||
|         assert(false)
 | ||
|     end
 | ||
|     local var = Actor.getStaticVar(pActor);
 | ||
|     if var.Mon == nil then
 | ||
|         var.Mon = {}
 | ||
|     end
 | ||
|     if var.Mon[fdId] then
 | ||
|         var.Mon[fdId] = nil
 | ||
|     end
 | ||
| end
 | ||
| 
 | ||
| -- @brief 进入活动副本
 | ||
| function EnterFuben(atvId,pActor,fbId)
 | ||
|     -- local result = Actor.reqEnterFuben(pActor, fbId)
 | ||
|     -- if result then
 | ||
| 
 | ||
|     --     -- 回复活动id与副本句柄的关联
 | ||
|     --     local npack = AllocOperReturn(pActor, atvId, ActivityOperate.sEnterFubenResult)
 | ||
|     --     if npack then
 | ||
|     --         DataPack.flush(npack)
 | ||
|     --     end
 | ||
| 
 | ||
|     --     -- 建立副本类型跟活动类型的对应关系
 | ||
|     --     local fbHandle = Actor.getFubenHandle(pActor)
 | ||
|     --     local pFuben = Fuben.getFubenPtrByHandle(fbHandle)
 | ||
|     --     local atvType = 0
 | ||
|     --     if (ActivitiesConf[atvId] and ActivitiesConf[atvId].ActivityType) then
 | ||
|     --         atvType = ActivitiesConf[atvId].ActivityType
 | ||
|     --     elseif (PActivitiesConf[atvId] and PActivitiesConf[atvId].ActivityType) then
 | ||
|     --         atvType = PActivitiesConf[atvId].ActivityType
 | ||
|     --     end
 | ||
|     --     FubenDispatcher.MapToActivity(pFuben, atvType, atvId)
 | ||
| 
 | ||
|     --     return fbHandle
 | ||
|     -- end
 | ||
|     -- return nil
 | ||
| end
 | ||
| 
 | ||
| 
 | ||
| 
 | ||
| --------------------------------------------------------------------
 | ||
| -- 活动副本回调
 | ||
| --------------------------------------------------------------------
 | ||
| 
 | ||
| function CheckEnterFuben(nMonType, nFubenId, nSceneId, pEntity)
 | ||
|     -- 玩家指针(个人活动判断需要一个玩家指针)
 | ||
|     if Actor.getEntityType(pEntity) ~= enActor then
 | ||
|         return
 | ||
|     end
 | ||
| 
 | ||
|     -- 触发玩家进入boss副本
 | ||
|     -- if IsInitScene(nSceneId) then
 | ||
|         OnEvent(nMonType, MonEvent.OnEnterFuben,nFubenId,nSceneId, pEntity)
 | ||
|     -- end
 | ||
| end
 | ||
| 
 | ||
| function CheckExitFuben(nMonType, nFubenId,nSceneId, pFuben, pEntity)
 | ||
|     -- 玩家指针
 | ||
|     if Actor.getEntityType(pEntity) ~= enActor then
 | ||
|         return
 | ||
|     end
 | ||
| 
 | ||
|     -- 触发玩家退出Boss副本事件
 | ||
|     OnEvent(nMonType, MonEvent.OnExitFuben, nFubenId, pFuben, nSceneId, pEntity)
 | ||
| end
 | ||
| 
 | ||
| function CheckFubenEntityDeath(nMonType,nFubenId, nSceneId, pFuben, pEntity, pKiller)
 | ||
|     -- 暂时只处理boss死亡
 | ||
| 
 | ||
|     if Actor.getEntityType(pEntity) == enPet then
 | ||
|         return
 | ||
|     end
 | ||
| 
 | ||
|     if Actor.getEntityType(pKiller) == enPet then
 | ||
|         pKiller = Actor.getMaster(pKiller)
 | ||
|     end
 | ||
| 
 | ||
|     -- 触发Boss副本实体死亡事件
 | ||
|     OnEvent(nMonType, MonEvent.OnEntityDeath,pFuben, nFubenId, nSceneId, pEntity, pKiller)
 | ||
| end
 | ||
| 
 | ||
| function CheckFubenEntityAttacked(nMonType, nFubenId, nSceneId, pFuben, pEntity, pAttacker)
 | ||
|     -- 玩家指针(个人活动判断需要一个玩家指针)
 | ||
|     local pActor = nil
 | ||
|     if Actor.getEntityType(pEntity) == enPet then
 | ||
|         return
 | ||
|     end
 | ||
|     if Actor.getEntityType(pAttacker) == enPet then
 | ||
|         pAttacker = Actor.getMaster(pAttacker)
 | ||
|     end
 | ||
|     -- 触发Boss副本实体受击事件
 | ||
|     OnEvent(nMonType, MonEvent.OnEntityAttacked, pFuben, nFubenId, nSceneId, pEntity, pAttacker)
 | ||
|     -- end
 | ||
| end
 | ||
| 
 | ||
| function CheckFubenFinish(nMonType,pFuben, result, pOwner)
 | ||
|     -- 玩家指针(个人活动判断需要一个玩家指针)
 | ||
|     local pActor = nil
 | ||
|     if Actor.getEntityType(pOwner) == enActor then
 | ||
|         pActor = pOwner
 | ||
|     end
 | ||
|     -- print("..nMonType.."..nMonType.."..result.."..result)
 | ||
|     -- 触发活动副本结束事件
 | ||
|     OnEvent(nMonType, MonEvent.OnFubenFinish, pFuben, result, pOwner)
 | ||
| end
 | ||
| 
 | ||
| 
 | ||
| -- @brief 进入Boss副本
 | ||
| function EnterMonFuben(nMonType,pActor,fbId, nSerial)
 | ||
|     local result = Actor.reqEnterFuben(pActor, fbId)
 | ||
|     if result then
 | ||
|         -- 建立副本类型跟活动类型的对应关系
 | ||
|         local fbHandle = Actor.getFubenHandle(pActor)
 | ||
|         local pFuben = Fuben.getFubenPtrByHandle(fbHandle)
 | ||
| 
 | ||
|         FubenDispatcher.MapToMonster(pFuben, nMonType, nSerial)
 | ||
| 
 | ||
|         return fbHandle
 | ||
|     end
 | ||
|     return nil
 | ||
| end
 | ||
| --公共副本
 | ||
| function EnterGlobalMonFuben(fbHandle,nMonType, fbId)
 | ||
|     -- 建立副本类型跟活动类型的对应关系
 | ||
|     local pFuben = Fuben.getFubenPtrByHandle(fbHandle)
 | ||
| 
 | ||
|     FubenDispatcher.MapToMonster(pFuben, nMonType, fbId)
 | ||
| end
 | ||
| 
 | ||
| 
 | ||
| function OnEvent(nMonType,evId, ...)
 | ||
|     --获取回调
 | ||
|     local callbacks = dispatcher[evId]
 | ||
| 
 | ||
|     --回调调用
 | ||
|     if callbacks and (callbacks[nMonType] ~= nil) then
 | ||
|         local func = callbacks[nMonType];
 | ||
|         return func(...)
 | ||
|     end
 | ||
|     return true;
 | ||
| end
 | ||
| 
 | ||
| 
 |