init
This commit is contained in:
321
server/cross/LogicServer/data/functions/Common/MonDispatcher.lua
Normal file
321
server/cross/LogicServer/data/functions/Common/MonDispatcher.lua
Normal file
@@ -0,0 +1,321 @@
|
||||
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
|
||||
|
||||
|
||||
Reference in New Issue
Block a user