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
 | 
						||
 | 
						||
 |