710 lines
24 KiB
Lua
Executable File
710 lines
24 KiB
Lua
Executable File
module("FubenDispatcher", package.seeall)
|
||
--[[
|
||
缓存数据:CacheData[fbId]
|
||
{
|
||
atvId, 建立 活动副本 与 活动id 的对应关系
|
||
atvType, 副本类型到活动类型列表的映射,用以建立副本类型跟活动类型的对应关系
|
||
ownerId, 单人副本的归属者id
|
||
timeFlag, 超时设置标志
|
||
kickFlag, 超时后踢出标志
|
||
result, 副本结果 1成功,0失败,nil则未知(超时后,若未设置1,则设置为0)
|
||
relive[aid] = -1~n 对应玩家的复活次数
|
||
}
|
||
]]--
|
||
|
||
local campType_Blue = 1
|
||
local campType_Red = 2
|
||
|
||
local dispatcher = {}
|
||
|
||
_G.FubenEnterType =
|
||
{
|
||
Single = 0, --单人进入类副本
|
||
Team = 1, --队伍进入类副本
|
||
All = 2, --多人进入类副本
|
||
}
|
||
|
||
_G.FubenEvent =
|
||
{
|
||
OnCheckEnter = 1, --进入检查 [副本id,进入类型,玩家指针] 注意:需要返回值true/false
|
||
OnCreate = 2, --副本创建 [副本id,进入类型,副本指针]
|
||
OnEnter = 3, --实体进入副本 [副本id,进入类型,副本指针,场景id,实体指针]
|
||
OnExit = 4, --实体退出副本 [副本id,进入类型,副本指针,场景id,实体指针]
|
||
OnUpdate = 5, --副本帧更新 [副本id,进入类型,副本指针,当前时间]
|
||
OnDeath = 6, --实体死亡 [副本id,进入类型,副本指针,场景id,实体指针]
|
||
OnGetAward = 7, --获取副本奖励 [副本id,进入类型,副本指针,场景id,玩家指针]
|
||
OnTimeout = 8, --副本超时 [副本id,进入类型,副本指针]
|
||
OnAttacked = 9, --实体收到攻击 [副本id,进入类型,副本指针,场景id,受击者,攻击者] 注意:怪物攻击怪物不触发
|
||
Count = 10,
|
||
}
|
||
|
||
--------------------------------------------------------------------
|
||
-- Lua接口
|
||
--------------------------------------------------------------------
|
||
|
||
-- @brief 注册事件分发器
|
||
-- @param evId 事件id
|
||
-- @param fbType 副本类型
|
||
-- @param func 回调
|
||
function Reg(evId, fbType, func, file)
|
||
|
||
--参数检查
|
||
if fbType == nil or evId == nil or func == nil or file == nil then
|
||
print( debug.traceback() )
|
||
assert(false)
|
||
end
|
||
|
||
--事件范围检查
|
||
if evId <= 0 or evId >= FubenEvent.Count then
|
||
assert(false)
|
||
end
|
||
|
||
--回调表初始化
|
||
if dispatcher[evId] == nil then
|
||
dispatcher[evId] = {}
|
||
end
|
||
if dispatcher[evId][fbType] ~= nil then
|
||
assert(false) -- 重复注册了
|
||
end
|
||
|
||
--注册
|
||
dispatcher[evId][fbType] = func
|
||
print("[TIP][FubenDispatcher] Add Fuben(Type:"..fbType..") Event("..evId..") In File("..file.."), And Index="..table.maxn(dispatcher[evId]))
|
||
end
|
||
|
||
-- @brief 获取某个副本的全局数据(这个数据,是存文件的)
|
||
-- @param fbId 副本id
|
||
function GetGlobalData(fbId)
|
||
if fbId == nil then
|
||
assert(false)
|
||
end
|
||
local var = System.getStaticVar();
|
||
if var.Fubens == nil then
|
||
var.Fubens = {}
|
||
end
|
||
|
||
if var.Fubens[fbId] == nil then
|
||
var.Fubens[fbId] = {}
|
||
end
|
||
|
||
return var.Fubens[fbId]
|
||
end
|
||
|
||
-- @brief 清空某个副本的全局数据(这个数据,是存文件的)
|
||
-- @param fbId 副本id
|
||
function ClearGlobalData(fbId)
|
||
if fbId == nil then
|
||
assert(false)
|
||
end
|
||
local var = System.getStaticVar();
|
||
if var.Fubens == nil then
|
||
var.Fubens = {}
|
||
end
|
||
if var.Fubens[fbId] then
|
||
var.Fubens[fbId] = nil
|
||
end
|
||
end
|
||
|
||
-- @brief 获取某个副本的缓存数据(这个数据,不存储仅缓存)
|
||
-- @param pFuben 副本指针
|
||
function GetCacheData(pFuben)
|
||
if pFuben == nil then
|
||
assert(false)
|
||
end
|
||
return Fuben.getDyanmicVar(pFuben)
|
||
end
|
||
|
||
-- @brief 清空某个副本的缓存数据(这个数据,不存储仅缓存)
|
||
-- @param pFuben 副本指针
|
||
function ClearCacheData(pFuben)
|
||
if pFuben == nil then
|
||
assert(false)
|
||
end
|
||
Fuben.clearDynamicVar(pFuben)
|
||
end
|
||
|
||
-- @brief 获取某个副本的个人数据(这个数据,是存数据库的)
|
||
-- @param pActor 玩家指针
|
||
-- @param fbId 副本id
|
||
function GetActorData(pActor, fbId)
|
||
if fbId == nil or Actor.getEntityType(pActor) ~= enActor then
|
||
assert(false)
|
||
end
|
||
local var = Actor.getStaticVar(pActor);
|
||
if var.Fubens == nil then
|
||
var.Fubens = {}
|
||
end
|
||
|
||
if var.Fubens[fbId] == nil then
|
||
var.Fubens[fbId] = {}
|
||
end
|
||
|
||
return var.Fubens[fbId]
|
||
end
|
||
|
||
-- @brief 清空某个副本的个人数据(这个数据,是存数据库的)
|
||
-- @param pActor 玩家指针
|
||
-- @param fbId 副本id
|
||
function ClearActorData(pActor, fbId)
|
||
if fbId == nil or Actor.getEntityType(pActor) ~= enActor then
|
||
assert(false)
|
||
end
|
||
local var = Actor.getStaticVar(pActor);
|
||
if var.Fubens == nil then
|
||
var.Fubens = {}
|
||
end
|
||
if var.Fubens[fbId] then
|
||
var.Fubens[fbId] = nil
|
||
end
|
||
end
|
||
|
||
-- @brief 设置复活剩余次数
|
||
-- @param pActor 玩家指针
|
||
-- @param fbId 副本id
|
||
-- @param idx 复活选项索引(0为自动复活的,大于1的为复活选项卡的索引)
|
||
-- @param count 次数限制(若设置为nil,则自动应用配置的,相当于重置;-1为无限制)
|
||
function SetReliveCount(pActor, fbId, idx, count)
|
||
local actorData = GetActorData(pActor, fbId)
|
||
if actorData.relive == nil then
|
||
actorData.relive = {}
|
||
end
|
||
if count == nil then
|
||
local ConfId = (StaticFubens[fbId] and StaticFubens[fbId].reliveConfId) or 1
|
||
local ReliveConf = ReliveConfig[ConfId] or ReliveConfig[1]
|
||
if idx == 0 then
|
||
actorData.relive[idx] = ReliveConf.limit
|
||
else
|
||
actorData.relive[idx] = ReliveConf.selectInfo[idx].limit or -1
|
||
end
|
||
else
|
||
actorData.relive[idx] = count
|
||
end
|
||
end
|
||
|
||
-- @brief 设置副本结果(有结果后,再次设置无效)
|
||
-- @param pFuben 副本指针
|
||
-- @param result 1为成功,0为失败
|
||
function SetResult(pFuben, result)
|
||
local cacheData = GetCacheData(pFuben)
|
||
if not cacheData.result then
|
||
cacheData.result = result
|
||
end
|
||
CheckActivityFubenFinish(pFuben)
|
||
end
|
||
|
||
-- @brief 获取副本结果
|
||
-- @param pFuben 副本指针
|
||
-- @return 1为成功,0为失败,nil为未知
|
||
function GetReault(pFuben)
|
||
local cacheData = GetCacheData(pFuben)
|
||
return cacheData.result
|
||
end
|
||
|
||
-- @brief 判断是否为活动副本
|
||
-- @param pFuben 副本指针
|
||
function IsActivityFuben(pFuben)
|
||
local fbCacheData = FubenDispatcher.GetCacheData(pFuben)
|
||
return fbCacheData.atvType ~= nil
|
||
end
|
||
|
||
|
||
-- @brief 判断是否为Mon副本
|
||
-- @param pFuben 副本指针
|
||
function IsMonFuben(pFuben)
|
||
local fbCacheData = FubenDispatcher.GetCacheData(pFuben)
|
||
return fbCacheData.nMonType ~= nil
|
||
end
|
||
|
||
-- @brief 获取副本对应的活动id
|
||
-- @param pFuben 副本指针
|
||
-- @return 若非活动副本,则返回nil
|
||
function GetActivityId(pFuben)
|
||
local fbCacheData = FubenDispatcher.GetCacheData(pFuben)
|
||
return fbCacheData.atvId
|
||
end
|
||
|
||
-- @brief 获取副本对应的活动Type
|
||
-- @param pFuben 副本指针
|
||
-- @return 若非活动副本,则返回nil
|
||
function GetActivityType(pFuben)
|
||
local fbCacheData = FubenDispatcher.GetCacheData(pFuben)
|
||
return fbCacheData.atvType
|
||
end
|
||
|
||
-- @brief 获取副本对应的活动,超时后踢出标志
|
||
-- @param pFuben 副本指针
|
||
-- @return 若非活动副本,则返回nil
|
||
function GetActivityKickFlag(pFuben)
|
||
local fbCacheData = FubenDispatcher.GetCacheData(pFuben)
|
||
return fbCacheData.kickFlag
|
||
end
|
||
|
||
-- @brief 是否为单人副本
|
||
-- @param pFuben 副本指针
|
||
function IsSingleFuben(pFuben)
|
||
local fbId = Fuben.getFubenIdByPtr(pFuben)
|
||
if StaticFubens[fbId].enterType == FubenEnterType.Single then
|
||
local fbCacheData = FubenDispatcher.GetCacheData(pFuben)
|
||
if fbCacheData.ownerId then
|
||
return true
|
||
end
|
||
end
|
||
end
|
||
|
||
-- @brief 获取副本所有者(目前仅对单人副本)
|
||
-- @param pFuben 副本指针
|
||
-- @return 玩家指针(若非单人副本,则返回nil)
|
||
function GetOwner(pFuben)
|
||
local fbCacheData = FubenDispatcher.GetCacheData(pFuben)
|
||
return Actor.getActorPtrById(fbCacheData.ownerId)
|
||
end
|
||
|
||
-- @brief 延迟踢出
|
||
-- @param pFuben 副本指针
|
||
-- @param timeout 超时时间(默认10秒)
|
||
function KictoutAfter(pFuben, timeout)
|
||
local cacheData = GetCacheData(pFuben)
|
||
cacheData.kickFlag = 1
|
||
Fuben.setFbTime(pFuben, timeout or 10)
|
||
end
|
||
|
||
-- @brief 设置复活次数
|
||
-- @param pFuben 副本指针
|
||
-- @param pActor 玩家指针
|
||
-- @param count 次数
|
||
function SetReliveCount(pFuben, pActor, count)
|
||
if (not pFuben) or (not pActor) then
|
||
return
|
||
end
|
||
local aid = Actor.getActorId(pActor)
|
||
local cacheData = GetCacheData(pFuben)
|
||
if not cacheData.relive then cacheData.relive = {} end
|
||
cacheData.relive[aid] = count
|
||
end
|
||
|
||
-- @brief 获取复活次数
|
||
-- @param pFuben 副本指针
|
||
-- @param pActor 玩家指针
|
||
-- @return -1为不限次数,nil为异常
|
||
function GetReliveCount(pFuben, pActor)
|
||
if (not pFuben) or (not pActor) then
|
||
return nil
|
||
end
|
||
local aid = Actor.getActorId(pActor)
|
||
local cacheData = GetCacheData(pFuben)
|
||
if not cacheData.relive then cacheData.relive = {} end
|
||
return cacheData.relive[aid] or -1
|
||
end
|
||
|
||
-- @brief 分配一个广播包,需要外部自己调用FreePacketEx释放包
|
||
function AllocPacketEx(systemId, cmdId)
|
||
local npack = DataPack.allocPacketEx()
|
||
if npack then
|
||
DataPack.writeByte(npack,systemId)
|
||
DataPack.writeByte(npack,cmdId)
|
||
end
|
||
return npack
|
||
end
|
||
|
||
-- @brief 释放一个通用回复(注意:这是广播包)
|
||
function FreePacketEx(npack)
|
||
if npack then
|
||
DataPack.freePacketEx(npack)
|
||
end
|
||
end
|
||
|
||
--------------------------------------------------------------------
|
||
-- CPP回调
|
||
--------------------------------------------------------------------
|
||
|
||
function OnCreateEvent(fbId, fbEnterType, pFuben)
|
||
-- 设置副本超时,如果需要的话
|
||
local FubenConf = StaticFubens[fbId]
|
||
if FubenConf and FubenConf.timeOut then
|
||
local cacheData = GetCacheData(pFuben)
|
||
if not cacheData.timeFlag then
|
||
Fuben.setFbTime(pFuben, FubenConf.timeOut)
|
||
cacheData.timeFlag = 1
|
||
end
|
||
end
|
||
end
|
||
|
||
function OnEnterEvent(fbId, fbEnterType, pFuben, scenId, pEntity)
|
||
|
||
-- 记录单人副本归属
|
||
if fbEnterType == FubenEnterType.Single then
|
||
if Actor.getEntityType(pEntity) == enActor then
|
||
local fbCacheData = FubenDispatcher.GetCacheData(pFuben)
|
||
fbCacheData.ownerId = Actor.getActorId(pEntity)
|
||
end
|
||
end
|
||
|
||
-- 进入新场景时,发送剩余时间,如果需要的话
|
||
local FubenConf = StaticFubens[fbId]
|
||
if FubenConf and FubenConf.timeOut then
|
||
if Actor.getEntityType(pEntity) == enActor then
|
||
local netPack = DataPack.allocPacket(pEntity, enFubenSystemID, sFubenRestTime)
|
||
if netPack then
|
||
DataPack.writeInt(netPack, Fuben.getFbTime(pFuben))
|
||
DataPack.flush(netPack)
|
||
end
|
||
end
|
||
end
|
||
|
||
-- 进入活动场景检测
|
||
if IsActivityFuben(pFuben) then
|
||
local cacheData = GetCacheData(pFuben)
|
||
ActivityDispatcher.CheckEnterFuben(cacheData.atvType, cacheData.atvId, pFuben, pEntity, Actor.getActorById(cacheData.ownerId))
|
||
end
|
||
if IsMonFuben(pFuben) then
|
||
local cacheData = GetCacheData(pFuben)
|
||
MonDispatcher.CheckEnterFuben(cacheData.nMonType, fbId,scenId,pEntity)
|
||
end
|
||
end
|
||
|
||
function OnExitEvent(fbId, fbEnterType, pFuben, scenId, pEntity)
|
||
-- 离开活动场景检测
|
||
if IsActivityFuben(pFuben) then
|
||
local cacheData = GetCacheData(pFuben)
|
||
ActivityDispatcher.CheckExitFuben(cacheData.atvType, cacheData.atvId, pFuben, pEntity, Actor.getActorById(cacheData.ownerId))
|
||
end
|
||
if IsMonFuben(pFuben) then
|
||
local cacheData = GetCacheData(pFuben)
|
||
MonDispatcher.CheckExitFuben(cacheData.nMonType, fbId,scenId,pFuben, pEntity)
|
||
end
|
||
end
|
||
|
||
function OnEntityDeathEvent(fbId, fbEnterType, pFuben, scenId, pEntity)
|
||
-- 检查活动副本内实体死亡
|
||
if IsActivityFuben(pFuben) then
|
||
local killerHandle = Actor.getKillHandle(pEntity)
|
||
local pKiller = Actor.getEntity(killerHandle)
|
||
local cacheData = GetCacheData(pFuben)
|
||
ActivityDispatcher.CheckFubenEntityDeath(cacheData.atvType, cacheData.atvId, pFuben, pEntity, pKiller, Actor.getActorById(cacheData.ownerId))
|
||
end
|
||
if IsMonFuben(pFuben) then
|
||
local cacheData = GetCacheData(pFuben)
|
||
local killerHandle = Actor.getKillHandle(pEntity)
|
||
local pKiller = Actor.getEntity(killerHandle)
|
||
MonDispatcher.CheckFubenEntityDeath(cacheData.nMonType, fbId, scenId,pFuben, pEntity, pKiller)
|
||
end
|
||
end
|
||
|
||
function OnAttackedEvent(fbId, fbEnterType, pFuben, scenId, pEntity, pAttacker)
|
||
-- 检查活动副本内实体收到攻击
|
||
if IsActivityFuben(pFuben) then
|
||
local cacheData = GetCacheData(pFuben)
|
||
ActivityDispatcher.CheckFubenEntityAttacked(cacheData.atvType, cacheData.atvId, pFuben, pEntity, pAttacker, Actor.getActorById(cacheData.ownerId))
|
||
end
|
||
if IsMonFuben(pFuben) then
|
||
local cacheData = GetCacheData(pFuben)
|
||
MonDispatcher.CheckFubenEntityAttacked(cacheData.nMonType, fbId, scenId, pFuben,pEntity, pAttacker)
|
||
end
|
||
end
|
||
|
||
function OnTimeoutEvent(fbId, fbEnterType, pFuben)
|
||
-- 超时设置踢出时间,如果需要的话
|
||
local FubenConf = StaticFubens[fbId]
|
||
if FubenConf then
|
||
local cacheData = GetCacheData(pFuben)
|
||
--第二次超时,则表示踢出了
|
||
if not cacheData.kickFlag then
|
||
Fuben.setFbTime(pFuben, FubenConf.kickTime or 12)
|
||
cacheData.kickFlag = 1
|
||
|
||
--若副本没成功,超时就表示失败了
|
||
if not cacheData.result then
|
||
cacheData.result = 0
|
||
end
|
||
|
||
-- 检查活动副本结束
|
||
CheckActivityFubenFinish(pFuben)
|
||
elseif cacheData.kickFlag then
|
||
Fuben.ExitAllFbActor(pFuben)
|
||
end
|
||
end
|
||
end
|
||
|
||
|
||
function SetFubenTimeout(fbId, pFuben)
|
||
-- 超时设置踢出时间,如果需要的话
|
||
local FubenConf = StaticFubens[fbId]
|
||
if FubenConf then
|
||
local cacheData = GetCacheData(pFuben)
|
||
if not cacheData.kickFlag then
|
||
Fuben.setFbTime(pFuben, FubenConf.kickTime or 12)
|
||
cacheData.kickFlag = 1
|
||
|
||
--若副本没成功,超时就表示失败了
|
||
if not cacheData.result then
|
||
cacheData.result = 0
|
||
end
|
||
end
|
||
end
|
||
end
|
||
|
||
function ClearFubenTimeout(fbId, pFuben)
|
||
-- 超时设置踢出时间,如果需要的话
|
||
local FubenConf = StaticFubens[fbId]
|
||
if FubenConf then
|
||
local cacheData = GetCacheData(pFuben)
|
||
if cacheData then
|
||
Fuben.setFbTime(pFuben,0)
|
||
cacheData.kickFlag = nil
|
||
cacheData.result = nil
|
||
end
|
||
end
|
||
end
|
||
|
||
function OnGetAwardEvent(fbId, fbEnterType, pFuben, nSceneId, pActor)
|
||
-- 检查活动副本结算请求
|
||
if IsActivityFuben(pFuben) then
|
||
local cacheData = GetCacheData(pFuben)
|
||
ActivityDispatcher.CheckFubenAward(cacheData.atvType, cacheData.atvId, pFuben, pActor, Actor.getActorById(cacheData.ownerId))
|
||
end
|
||
end
|
||
|
||
function OnEvent(evId, fbType, fbId, fbEnterType, ...)
|
||
|
||
if evId == FubenEvent.OnCreate then --副本创建
|
||
OnCreateEvent(fbId, fbEnterType, ...)
|
||
elseif evId == FubenEvent.OnEnter then --实体进入副本
|
||
OnEnterEvent(fbId, fbEnterType, ...)
|
||
elseif evId == FubenEvent.OnExit then --实体退出副本
|
||
OnExitEvent(fbId, fbEnterType, ...)
|
||
elseif evId == FubenEvent.OnDeath then --副本实体死亡
|
||
OnEntityDeathEvent(fbId, fbEnterType, ...)
|
||
elseif evId == FubenEvent.OnAttacked then --实体收到攻击
|
||
OnAttackedEvent(fbId, fbEnterType, ...)
|
||
elseif evId == FubenEvent.OnTimeout then --副本超时
|
||
OnTimeoutEvent(fbId, fbEnterType, ...)
|
||
elseif evId == FubenEvent.OnGetAward then --获取副本奖励
|
||
OnGetAwardEvent(fbId, fbEnterType, ...)
|
||
end
|
||
|
||
--获取回调
|
||
local callbacks = dispatcher[evId]
|
||
if callbacks == nil or callbacks[fbType] == nil then
|
||
return true
|
||
end
|
||
local func = callbacks[fbType];
|
||
|
||
--回调调用
|
||
if evId == FubenEvent.OnCheckEnter then --副本进入检查
|
||
return func(fbId, fbEnterType, ...)
|
||
else
|
||
func(fbId, fbEnterType, ...)
|
||
end
|
||
return true
|
||
end
|
||
|
||
-- 玩家死亡回调,用以发送复活信息
|
||
function OnActorDeath(pActor, pFuben)
|
||
--if Actor.getReliveTimeOut(pActor) == 0 then
|
||
local fbId = Fuben.getFubenIdByPtr(pFuben)
|
||
local ConfId = (StaticFubens[fbId] and StaticFubens[fbId].reliveConfId) or 1
|
||
local ReliveConf = ReliveConfig[ConfId] or ReliveConfig[1]
|
||
local aid = Actor.getActorId(pActor)
|
||
local cacheData = GetCacheData(pFuben)
|
||
if not cacheData.relive then cacheData.relive = {} end
|
||
if not cacheData.relive[aid] then
|
||
cacheData.relive[aid] = ReliveConf.limit or -1
|
||
end
|
||
local reliveCount = cacheData.relive[aid]
|
||
|
||
-- 维护次数
|
||
if reliveCount > 0 then
|
||
cacheData.relive[aid] = reliveCount - 1
|
||
elseif reliveCount == 0 then
|
||
Actor.clearReliveTimeOut(pActor)
|
||
local maxhp = Actor.getIntProperty(pActor,PROP_CREATURE_MAXHP)
|
||
Actor.changeHp(pActor, maxhp)
|
||
local maxmp = Actor.getIntProperty(pActor,PROP_CREATURE_MAXMP)
|
||
Actor.changeMp(pActor, maxmp)
|
||
local atvId = GetActivityId(pFuben);
|
||
local atvType = GetActivityType(pFuben);
|
||
ActivityDispatcher.OnEvent(ActivityEvent.OnAtvGG, atvType, atvId, pActor);
|
||
Actor.exitFubenAndBackCity(pActor)
|
||
--Actor.addState(pActor, esStateDeath)
|
||
--Actor.updateActorEntityProp(pActor)
|
||
--Actor.removeState(pActor, esStateDeath)
|
||
--Actor.updateActorEntityProp(pActor)
|
||
cacheData.relive[aid] = nil
|
||
return
|
||
end
|
||
|
||
-- 设置自动复活时间
|
||
-- 复活特权
|
||
local nCurReviveDuration = Actor.getIntProperty2(pActor, PROP_ACTOR_CURREVIVEDURATION);
|
||
if nCurReviveDuration ~= 0 then
|
||
Actor.setReliveTimeOut(pActor, (ReliveConf.VipRevive or 5))
|
||
else
|
||
Actor.setReliveTimeOut(pActor, (ReliveConf.expire or 10))
|
||
end
|
||
|
||
-- 通知死亡复活框
|
||
local npack = DataPack.allocPacket(pActor, enDefaultEntitySystemID, sActorReliveInfo)
|
||
if npack then
|
||
DataPack.writeByte(npack, ConfId)
|
||
DataPack.writeByte(npack, reliveCount)
|
||
local count = (ReliveConf.selectInfo and #ReliveConf.selectInfo) or 0
|
||
DataPack.writeByte(npack, count)
|
||
local actorData = GetActorData(pActor, fbId)
|
||
if actorData.relive == nil then
|
||
actorData.relive = {}
|
||
end
|
||
if count > 0 then
|
||
for i=1,count do
|
||
if actorData.relive[i] == nil then
|
||
actorData.relive[i] = ReliveConf.selectInfo[i].limit or -1
|
||
end
|
||
DataPack.writeByte(npack, actorData.relive[i])
|
||
end
|
||
end
|
||
|
||
-- 添加击杀者名字
|
||
local h_killer = Actor.getKillHandle(pActor)
|
||
local pKiller = Actor.getEntity(h_killer)
|
||
local name = ""
|
||
if pKiller then
|
||
name = Actor.getName(pKiller)
|
||
end
|
||
DataPack.writeString( npack, name )
|
||
DataPack.flush(npack)
|
||
end
|
||
--end
|
||
end
|
||
|
||
-- 复活选项
|
||
function OnClickReqRelive (pActor, packet)
|
||
local confId = DataPack.readByte(packet)
|
||
local idx = DataPack.readByte(packet) + 1
|
||
|
||
--获取当前副本复活配置
|
||
local pFuben = Actor.getFubenPrt(pActor)
|
||
local fbId = Fuben.getFubenIdByPtr(pFuben)
|
||
local ConfId = (StaticFubens[fbId] and StaticFubens[fbId].reliveConfId) or 1
|
||
local ReliveConf = ReliveConfig[ConfId] or ReliveConfig[1]
|
||
|
||
--配置id验证
|
||
if confId ~= ConfId then
|
||
return
|
||
end
|
||
|
||
--复活选项配置
|
||
local selectInfo = ReliveConf.selectInfo[idx]
|
||
if selectInfo then
|
||
|
||
--消耗检查
|
||
local consumes = {}
|
||
if selectInfo.consume then
|
||
table.insert( consumes, selectInfo.consume )
|
||
if CommonFunc.Consumes.Check(pActor, consumes) ~= true then
|
||
Actor.sendTipmsg(pActor, "|C:0xf56f00&T:道具或金币元宝不足!|", tstEcomeny)
|
||
return
|
||
end
|
||
end
|
||
|
||
--次数检查
|
||
if selectInfo.limit and selectInfo.limit > 0 then
|
||
local actorData = GetActorData(pActor, fbId)
|
||
|
||
if actorData.relive[idx] == nil then
|
||
actorData.relive[idx] = selectInfo.limit
|
||
else
|
||
if actorData.relive[idx] == 0 then
|
||
Actor.sendTipmsg(pActor, "超过次数了!"..actorData.relive[idx].."/"..selectInfo.limit, tstUI)
|
||
return
|
||
end
|
||
actorData.relive[idx] = actorData.relive[idx] - 1
|
||
end
|
||
end
|
||
|
||
-- 消耗
|
||
if consumes and CommonFunc.Consumes.Remove(pActor, consumes,GameLog.Log_Relive , "复活") ~= true then
|
||
return
|
||
end
|
||
|
||
--回血回蓝
|
||
local maxhp = Actor.getIntProperty(pActor,PROP_CREATURE_MAXHP)
|
||
Actor.changeHp(pActor, maxhp * ((selectInfo.hp or 100)/100))
|
||
local maxmp = Actor.getIntProperty(pActor,PROP_CREATURE_MAXMP)
|
||
Actor.changeMp(pActor, maxmp * ((selectInfo.mp or 100)/100))
|
||
|
||
-- 原地复活
|
||
if selectInfo.type == 1 then
|
||
-- 随机复活
|
||
elseif selectInfo.type == 2 then
|
||
System.telportRandPos(pActor)
|
||
-- 副本固定点复活
|
||
elseif selectInfo.type == 3 then
|
||
if ReliveConf.FixedPosi then
|
||
local sceneId = Actor.getSceneId(pActor)
|
||
Actor.enterScene(pActor, sceneId, ReliveConf.FixedPosi.x, ReliveConf.FixedPosi.y)
|
||
else
|
||
Actor.relive(pActor)
|
||
end
|
||
-- 回城安全区复活
|
||
elseif selectInfo.type == 4 or selectInfo.type == 6 then
|
||
if Fuben.isFuben(pFuben) then
|
||
Actor.exitFubenAndBackCity(pActor)
|
||
else
|
||
Actor.relive(pActor)
|
||
end
|
||
-- 本方阵营复活
|
||
elseif selectInfo.type == 5 then
|
||
|
||
|
||
end
|
||
|
||
--清除复活倒计时
|
||
Actor.clearReliveTimeOut(pActor)
|
||
Actor.onRelive(pActor)
|
||
TranRedActorToRedSceen(pActor)
|
||
--Actor.removeState(pActor, esStateDeath)
|
||
--Actor.updateActorEntityProp(pActor)
|
||
end
|
||
end
|
||
|
||
NetmsgDispatcher.Reg(enDefaultEntitySystemID, cChooseRelive, OnClickReqRelive)
|
||
|
||
--------------------------------------------------------------------
|
||
-- 活动副本回调
|
||
--------------------------------------------------------------------
|
||
|
||
-- 映射副本跟活动的对应关系
|
||
function MapToActivity(pFuben, atvType, atvId)
|
||
if atvType then
|
||
local fbCacheData = FubenDispatcher.GetCacheData(pFuben)
|
||
if fbCacheData.atvType == nil then
|
||
fbCacheData.atvId = atvId
|
||
fbCacheData.atvType = atvType
|
||
local atvCacheData = ActivityDispatcher.GetCacheData(atvId)
|
||
atvCacheData.fbHandle = Fuben.getFubenHandle(pFuben)
|
||
end
|
||
end
|
||
end
|
||
|
||
-- 映射副本跟Monster的对应关系
|
||
function MapToMonster(pFuben, nMonType, nSerial)
|
||
if nMonType then
|
||
local fbCacheData = FubenDispatcher.GetCacheData(pFuben)
|
||
if fbCacheData.nMonType == nil then
|
||
fbCacheData.nMonType = nMonType
|
||
fbCacheData.nSerial = nSerial
|
||
end
|
||
end
|
||
end
|
||
|
||
-- 检查活动副本结束
|
||
function CheckActivityFubenFinish(pFuben)
|
||
if IsActivityFuben(pFuben) then
|
||
local cacheData = GetCacheData(pFuben)
|
||
ActivityDispatcher.CheckFubenFinish(cacheData.atvType, cacheData.atvId, pFuben, cacheData.result, Actor.getActorById(cacheData.ownerId))
|
||
end
|
||
if IsMonFuben(pFuben) then
|
||
local cacheData = GetCacheData(pFuben)
|
||
MonDispatcher.CheckFubenFinish(cacheData.nMonType, pFuben, cacheData.result, Actor.getActorById(cacheData.ownerId))
|
||
end
|
||
end
|