322 lines
8.6 KiB
Lua
322 lines
8.6 KiB
Lua
|
|
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
|
|||
|
|
|
|||
|
|
|