Files
chuanqi-server-instance/LogicServer/data/functions/Common/MonDispatcher.lua
2024-12-16 20:45:03 +08:00

322 lines
8.6 KiB
Lua
Executable File
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

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