generated from root/miduo_server
1263 lines
37 KiB
Lua
1263 lines
37 KiB
Lua
|
RoleManager = {}
|
|||
|
local this = RoleManager
|
|||
|
|
|||
|
--我方死亡列表
|
|||
|
local _RealDeadList={}
|
|||
|
-- 将死之人
|
|||
|
local _DeadRoleList = {}
|
|||
|
-- 重生之人
|
|||
|
local _ReliveRoleList = {}
|
|||
|
-- 所有角色
|
|||
|
local PosList = {}
|
|||
|
-- 删除节点
|
|||
|
local removeObjList = BattleList.New()
|
|||
|
-- 角色对象池
|
|||
|
local rolePool = BattleObjectPool.New(function ()
|
|||
|
return RoleLogic.New()
|
|||
|
end)
|
|||
|
|
|||
|
local bMyAllDead
|
|||
|
local bEnemyAllDead
|
|||
|
|
|||
|
--替补数据
|
|||
|
local tibuRoleList={}
|
|||
|
local tibuData = {}
|
|||
|
local enemy_tibuData = {}
|
|||
|
-- 替补状态
|
|||
|
-- 0 不存在
|
|||
|
-- 1 存在且在替补席 (未有单位死亡备战)
|
|||
|
-- 3 存在且上阵中 (有战斗单位死亡准备上阵)
|
|||
|
-- 4 (角色出场时)
|
|||
|
-- 2 存在且已经上阵 (替补角色生成已在场上) 替补对象生成后
|
|||
|
-- 0 (不存在替补) --- 1 (存在初始化 备战ing)--- 3(场上有一个对象死亡等待上场)--- 4(开始上场直到上场动画回合结束)----2(回合结束到之后状态)
|
|||
|
SubstiState={
|
|||
|
none=0,
|
|||
|
stage=1,
|
|||
|
waiting=3,
|
|||
|
onshow=4,
|
|||
|
showed=5
|
|||
|
}
|
|||
|
|
|||
|
local Tibu_State
|
|||
|
local enemyTibu_State
|
|||
|
|
|||
|
local RecordCaculate={}
|
|||
|
-- 初始化
|
|||
|
function this.Init()
|
|||
|
|
|||
|
bMyAllDead = false
|
|||
|
bEnemyAllDead = false
|
|||
|
Tibu_State=0
|
|||
|
enemyTibu_State = 0
|
|||
|
|
|||
|
RecordCaculate={}
|
|||
|
this.Clear()
|
|||
|
end
|
|||
|
|
|||
|
local isLog=false
|
|||
|
--temp角色日志
|
|||
|
function RoleManager.Log(str)
|
|||
|
if isLog then
|
|||
|
--LogError(str)
|
|||
|
end
|
|||
|
end
|
|||
|
|
|||
|
--to do check yh 角色数据添加 camp==0 我方英雄 1 敌方英雄 战斗替补上阵回合增加角色上阵信息
|
|||
|
function this.getCaRecord()
|
|||
|
return RecordCaculate
|
|||
|
end
|
|||
|
|
|||
|
-- 角色数据添加
|
|||
|
|
|||
|
local curUid
|
|||
|
|
|||
|
function this.AddRole(roleData, position, isHelp)
|
|||
|
if not curUid then
|
|||
|
curUid = 0
|
|||
|
end
|
|||
|
curUid = curUid + 1
|
|||
|
local role = rolePool:Get()
|
|||
|
-- 判断当前角色作为替补角色出现
|
|||
|
if not roleData.isTibu then
|
|||
|
RoleManager.Log("no tibu")
|
|||
|
role:Init(curUid, roleData, position)
|
|||
|
else
|
|||
|
RoleManager.Log("is tibu")
|
|||
|
if roleData.camp == 0 then
|
|||
|
role = tibuRoleList[1]
|
|||
|
elseif roleData.camp == 1 then
|
|||
|
role = tibuRoleList[2]
|
|||
|
end
|
|||
|
end
|
|||
|
-- objList:Add(curUid, role)
|
|||
|
if roleData.camp == 0 then
|
|||
|
RoleManager.Log("slef on"..position)
|
|||
|
PosList[position] = role -- 1-9 我方英雄
|
|||
|
role.position = position
|
|||
|
else
|
|||
|
-- 检测固定上场位置
|
|||
|
if position + 9 > 18 or position + 9 <= 9 then
|
|||
|
if position < 1 then
|
|||
|
position= position + 9
|
|||
|
elseif position > 9 then
|
|||
|
position = position - 9
|
|||
|
end
|
|||
|
end
|
|||
|
role.position = position
|
|||
|
RoleManager.Log("enemy on"..(position ))
|
|||
|
PosList[position + 9] = role-- 10-18 敌方英雄
|
|||
|
end
|
|||
|
|
|||
|
if not role:IsRealDead() then
|
|||
|
if role:IsSubstitute() then
|
|||
|
BattleLogic.Event:DispatchEvent(BattleEventName.AddRole, role, isHelp,true)
|
|||
|
|
|||
|
local RoundEndTibuSetState
|
|||
|
RoundEndTibuSetState =function (isHave,nullNum,ReCheckRound)
|
|||
|
if role.camp == 0 then Tibu_State=2 end
|
|||
|
if role.camp == 1 then enemyTibu_State=2 end
|
|||
|
BattleLogic.Event:RemoveEvent(BattleEventName.RoundBegin, RoundEndTibuSetState)
|
|||
|
end
|
|||
|
BattleLogic.Event:AddEvent(BattleEventName.RoundBegin, RoundEndTibuSetState)
|
|||
|
|
|||
|
|
|||
|
BattleLogic.ChangeRecordPos(role.position,false)
|
|||
|
local ResetTibuRound
|
|||
|
ResetTibuRound =function (isHave,nullNum,ReCheckRound)
|
|||
|
ReCheckRound(true,nullNum-1)
|
|||
|
BattleLogic.Event:RemoveEvent(BattleEventName.BattleRoundCheck, ResetTibuRound)
|
|||
|
end
|
|||
|
BattleLogic.Event:AddEvent(BattleEventName.BattleRoundCheck, ResetTibuRound)
|
|||
|
|
|||
|
return
|
|||
|
end
|
|||
|
BattleLogic.Event:DispatchEvent(BattleEventName.AddRole, role, isHelp,false)
|
|||
|
end
|
|||
|
end
|
|||
|
|
|||
|
------------- 抽象替补逻辑
|
|||
|
function this.InitTibuData(roleData,position)
|
|||
|
local date
|
|||
|
if roleData.camp == 0 then
|
|||
|
date = tibuData
|
|||
|
if roleData == nil then
|
|||
|
tibuData.HasTibu = false
|
|||
|
tibuData.AddTibu = false
|
|||
|
Tibu_State = 0
|
|||
|
else
|
|||
|
if not curUid then
|
|||
|
curUid = 0
|
|||
|
end
|
|||
|
curUid = curUid + 1
|
|||
|
Tibu_State = 1
|
|||
|
local role = rolePool:Get()
|
|||
|
role:Init(curUid, roleData, position)
|
|||
|
tibuRoleList[1] = role
|
|||
|
tibuData.roleData = roleData
|
|||
|
tibuData.position = position
|
|||
|
tibuData.HasTibu = true
|
|||
|
tibuData.AddTibu = false
|
|||
|
|
|||
|
end
|
|||
|
else
|
|||
|
date = enemy_tibuData
|
|||
|
if roleData == nil then
|
|||
|
enemy_tibuData.HasTibu = false
|
|||
|
enemy_tibuData.AddTibu = false
|
|||
|
enemyTibu_State = 0
|
|||
|
else
|
|||
|
if not curUid then
|
|||
|
curUid = 0
|
|||
|
end
|
|||
|
curUid = curUid + 1
|
|||
|
enemyTibu_State = 1
|
|||
|
local role = rolePool:Get()
|
|||
|
role:Init(curUid, roleData, position)
|
|||
|
tibuRoleList[2] = role
|
|||
|
enemy_tibuData.roleData = roleData
|
|||
|
enemy_tibuData.position = position
|
|||
|
enemy_tibuData.HasTibu = true
|
|||
|
enemy_tibuData.AddTibu = false
|
|||
|
end
|
|||
|
end
|
|||
|
return date
|
|||
|
end
|
|||
|
|
|||
|
function this.getTibuStateByCamp(_camp)
|
|||
|
if _camp == 0 or _camp == nil then
|
|||
|
return Tibu_State
|
|||
|
elseif _camp == 1 then
|
|||
|
return enemyTibu_State
|
|||
|
end
|
|||
|
end
|
|||
|
|
|||
|
function this.getTibuState()
|
|||
|
if Tibu_State ~= nil then
|
|||
|
RoleManager.Log("@@@@@@@@@@@@Tibu_State"..Tibu_State.."xxxxxxx enemyTibu_State"..enemyTibu_State)
|
|||
|
return Tibu_State,enemyTibu_State
|
|||
|
end
|
|||
|
RoleManager.Log("@@@@@@@@@@@@@@Tibu_State is nil")
|
|||
|
end
|
|||
|
|
|||
|
function this.HasTibu(_camp)
|
|||
|
if _camp == 0 then
|
|||
|
if tibuData ~= nil then
|
|||
|
return tibuData.HasTibu
|
|||
|
else
|
|||
|
return false
|
|||
|
end
|
|||
|
elseif _camp == 1 then
|
|||
|
if enemy_tibuData ~= nil then
|
|||
|
return enemy_tibuData.HasTibu
|
|||
|
else
|
|||
|
return false
|
|||
|
end
|
|||
|
end
|
|||
|
end
|
|||
|
|
|||
|
function this.SetTibuState(_camp,_state)
|
|||
|
if _camp == 0 then
|
|||
|
Tibu_State =_state
|
|||
|
elseif _camp == 1 then
|
|||
|
enemyTibu_State = _state
|
|||
|
end
|
|||
|
end
|
|||
|
|
|||
|
function this.AddTibuToWaitingState(_camp)
|
|||
|
if _camp == 0 then
|
|||
|
Tibu_State = 3
|
|||
|
elseif _camp == 1 then
|
|||
|
enemyTibu_State = 3
|
|||
|
end
|
|||
|
end
|
|||
|
|
|||
|
function this.IsRoleTibuAdding(_camp)
|
|||
|
if _camp == 0 then
|
|||
|
if Tibu_State == 3 then
|
|||
|
return true
|
|||
|
end
|
|||
|
return false
|
|||
|
elseif _camp == 1 then
|
|||
|
if enemyTibu_State == 3 then
|
|||
|
return true
|
|||
|
end
|
|||
|
return false
|
|||
|
end
|
|||
|
end
|
|||
|
|
|||
|
function this.TibuClear()
|
|||
|
tibuData.HasTibu = false
|
|||
|
tibuData.AddTibu = false
|
|||
|
Tibu_State = 0
|
|||
|
enemy_tibuData.HasTibu = false
|
|||
|
enemy_tibuData.AddTibu = false
|
|||
|
enemyTibu_State = 0
|
|||
|
end
|
|||
|
|
|||
|
--todo check yh 增加替补
|
|||
|
function this.AddTibu(_camp)
|
|||
|
if _camp == 0 then
|
|||
|
if tibuData.HasTibu then
|
|||
|
-- RoleManager.Log("............................1 my"..tibuData.position)
|
|||
|
Tibu_State = 4
|
|||
|
tibuData.AddTibu = true
|
|||
|
this.AddRole(tibuData.roleData,tibuData.position,false)
|
|||
|
bMyAllDead = false
|
|||
|
tibuData.HasTibu = false
|
|||
|
RoleManager.getTibuState()
|
|||
|
BattleLogic.Event:DispatchEvent(BattleEventName.OnAddTibuRole, tibuData.roleData)
|
|||
|
end
|
|||
|
elseif _camp == 1 then
|
|||
|
if enemy_tibuData.HasTibu then
|
|||
|
-- RoleManager.Log("............................1 enemy po"..enemy_tibuData.position)
|
|||
|
enemyTibu_State = 4
|
|||
|
enemy_tibuData.AddTibu = true
|
|||
|
this.AddRole(enemy_tibuData.roleData,enemy_tibuData.position - 9,false)
|
|||
|
bEnemyAllDead = false
|
|||
|
enemy_tibuData.HasTibu = false
|
|||
|
RoleManager.getTibuState()
|
|||
|
BattleLogic.Event:DispatchEvent(BattleEventName.OnAddTibuRole, enemy_tibuData.roleData)
|
|||
|
end
|
|||
|
end
|
|||
|
-- RoleManager.Log("............................2")
|
|||
|
end
|
|||
|
|
|||
|
function this.setTibuPos(pos,_camp)
|
|||
|
if _camp == 0 then
|
|||
|
tibuData.position = pos
|
|||
|
elseif _camp == 1 then
|
|||
|
enemy_tibuData.position = pos
|
|||
|
end
|
|||
|
end
|
|||
|
|
|||
|
-- 是否满编 !!pve 不适用
|
|||
|
function this.IsNotFullTeam(_camp)
|
|||
|
local teamFull = 5 --满编队 5人 --引用外部函数注意!
|
|||
|
local idx = 0
|
|||
|
for _, ro in pairs(PosList) do
|
|||
|
if ro.camp == _camp and ro ~= nil then
|
|||
|
idx = idx +1
|
|||
|
end
|
|||
|
end
|
|||
|
if idx < teamFull then
|
|||
|
return true
|
|||
|
end
|
|||
|
return false
|
|||
|
end
|
|||
|
|
|||
|
--空场位置 返回第一个
|
|||
|
function this.MyTeamEmptyPos(_camp)
|
|||
|
for i =1 , 9 do
|
|||
|
if PosList[i+_camp*9] == nil then return i end
|
|||
|
end
|
|||
|
|
|||
|
for po, ro in pairs(PosList) do
|
|||
|
if ro.camp == _camp and ro ==nil and not this.IsReliveRole(ro) then
|
|||
|
RoleManager.Log("po"..po)
|
|||
|
return po
|
|||
|
end
|
|||
|
end
|
|||
|
end
|
|||
|
|
|||
|
-- 获取场上一个存活对象
|
|||
|
function this.getMyTeamOneAlive()
|
|||
|
for _, ro in pairs(PosList) do
|
|||
|
if ro.camp == 0 and ro:IsDead()==false then
|
|||
|
return ro
|
|||
|
end
|
|||
|
end
|
|||
|
return nil
|
|||
|
end
|
|||
|
|
|||
|
--我方场上一人触发被动技能
|
|||
|
function this.TriggerMyTeamOneAlivePassivity(passivity)
|
|||
|
if tibuRoleList ~= nil then
|
|||
|
for _,ro in pairs(tibuRoleList) do
|
|||
|
local role = ro
|
|||
|
if role~=nil then
|
|||
|
role:AddPassiveByOther(passivity)
|
|||
|
-- LogError("TriggerMyTeamOneAlivePassivity")
|
|||
|
end
|
|||
|
end
|
|||
|
end
|
|||
|
end
|
|||
|
|
|||
|
--给所有存活人员加上被动buff
|
|||
|
function this.AddPassiveToAliveRoles(role)
|
|||
|
for _, ro in pairs(PosList) do
|
|||
|
if ro.camp == 0 and ro:IsDead()==false then
|
|||
|
for idx = 1, #role.passivity do
|
|||
|
-- v:AddPassive(id)
|
|||
|
-- v:AddBuff()
|
|||
|
local v = role.passivity[idx]
|
|||
|
local ids = v[1]
|
|||
|
for k = 1, #ids do
|
|||
|
local args = {}
|
|||
|
for j = 1, #v[k + 1] do
|
|||
|
args[j] = v[k + 1][j]
|
|||
|
end
|
|||
|
local id = ids[k]
|
|||
|
if BattleUtil.Passivity[id] then
|
|||
|
BattleUtil.Passivity[id](ro, args)
|
|||
|
-- 加入被动列表
|
|||
|
table.insert(ro.passiveList, {id, args})
|
|||
|
else
|
|||
|
|
|||
|
end
|
|||
|
end
|
|||
|
end
|
|||
|
end
|
|||
|
end
|
|||
|
|
|||
|
if not role:IsRealDead() then
|
|||
|
BattleLogic.Event:DispatchEvent(BattleEventName.AddRole, role, isHelp)
|
|||
|
end
|
|||
|
|
|||
|
this.Clone()
|
|||
|
end
|
|||
|
|
|||
|
--当前场上没有角色
|
|||
|
function this.IsMyTeamEmpty(_camp)
|
|||
|
for _, v in pairs(PosList) do
|
|||
|
if v.camp == _camp and v:IsDead()==false then
|
|||
|
return false
|
|||
|
end
|
|||
|
end
|
|||
|
return true
|
|||
|
end
|
|||
|
|
|||
|
--to do check yh 我方全部阵亡
|
|||
|
function this.IsMyAllDead()
|
|||
|
return bMyAllDead
|
|||
|
end
|
|||
|
|
|||
|
--to do check yh 某方一人阵亡
|
|||
|
function this.IsMyOneDead(_camp)
|
|||
|
for pos, role in pairs(_RealDeadList) do
|
|||
|
if role.camp==_camp then
|
|||
|
--and not BattleLogic.BuffMgr:HasBuff(role,BuffName.NoDead)
|
|||
|
return true
|
|||
|
end
|
|||
|
end
|
|||
|
return false
|
|||
|
end
|
|||
|
|
|||
|
--to do check yh 我方一人阵亡位置
|
|||
|
function this.IsMyOneDeadPosCanNotRelive(_camp)
|
|||
|
local upPos = -1
|
|||
|
for pos, role in pairs(_RealDeadList) do
|
|||
|
if role.camp==_camp then
|
|||
|
--被替补无法复活 role:GoDead() and not BattleLogic.BuffMgr:HasBuff(role,BuffName.NoDead)
|
|||
|
-- role:SetReliveFilter(false)
|
|||
|
upPos = pos
|
|||
|
break
|
|||
|
end
|
|||
|
end
|
|||
|
if upPos == -1 then upPos = this.MyTeamEmptyPos(_camp) end
|
|||
|
return upPos
|
|||
|
end
|
|||
|
|
|||
|
------------- 抽象替补逻辑 end
|
|||
|
|
|||
|
function this.Update()
|
|||
|
bMyAllDead = true
|
|||
|
bEnemyAllDead = true
|
|||
|
for _, v in pairs(PosList) do
|
|||
|
if not v:IsRealDead() then
|
|||
|
v:Update()
|
|||
|
if v.camp == 0 then
|
|||
|
bMyAllDead = false
|
|||
|
else
|
|||
|
bEnemyAllDead = false
|
|||
|
end
|
|||
|
end
|
|||
|
end
|
|||
|
-- to do check yh 更新战斗检测
|
|||
|
if tibuData~=nil then
|
|||
|
if bMyAllDead and tibuData.HasTibu then
|
|||
|
bMyAllDead = false
|
|||
|
end
|
|||
|
end
|
|||
|
if enemy_tibuData~=nil then
|
|||
|
if bEnemyAllDead and enemy_tibuData.HasTibu then
|
|||
|
bEnemyAllDead = false
|
|||
|
end
|
|||
|
end
|
|||
|
|
|||
|
if bEnemyAllDead then
|
|||
|
BattleLogic.Event:DispatchEvent(BattleEventName.BattleOrderEnd, BattleLogic.CurOrder)
|
|||
|
end
|
|||
|
end
|
|||
|
|
|||
|
-- 获取结果
|
|||
|
function this.GetResult()
|
|||
|
-- RecordResult={}
|
|||
|
-- for _, v in pairs(PosList) do
|
|||
|
-- if v~=nil then
|
|||
|
-- local isdead="false"
|
|||
|
-- if v.isRealDead then isdead = "true" end
|
|||
|
-- local _rolinfo =tostring(_) .." hp:".. tostring(v:GetRoleData(RoleDataName.Hp)) .." camp:"..tostring(v.camp) .." isdead:".. isdead
|
|||
|
-- table.insert(RecordResult , _rolinfo)
|
|||
|
-- end
|
|||
|
-- end
|
|||
|
|
|||
|
-- if bMyAllDead then
|
|||
|
-- local _set=" bMyAllDead is true"
|
|||
|
-- table.insert(RecordResult,_set)
|
|||
|
-- end
|
|||
|
|
|||
|
-- if bEnemyAllDead then
|
|||
|
-- local _set=" bEnemyAllDead is true"
|
|||
|
-- table.insert(RecordResult,_set)
|
|||
|
-- end
|
|||
|
if bMyAllDead then
|
|||
|
return 0
|
|||
|
end
|
|||
|
|
|||
|
if bEnemyAllDead then
|
|||
|
return 1
|
|||
|
end
|
|||
|
end
|
|||
|
|
|||
|
function this.CheadListOnDeadPool()
|
|||
|
if _RealDeadList~=nil then
|
|||
|
for pos, role in pairs(_RealDeadList) do
|
|||
|
return role
|
|||
|
end
|
|||
|
end
|
|||
|
return nil
|
|||
|
end
|
|||
|
|
|||
|
-- 加入将死的人
|
|||
|
function this.AddDeadRole(role)
|
|||
|
_DeadRoleList[role.position + role.camp * 9] = role
|
|||
|
_RealDeadList[role.position + role.camp * 9] = role
|
|||
|
end
|
|||
|
-- 检测是有人将死
|
|||
|
function this.CheckDead()
|
|||
|
local isDeadFrame = false
|
|||
|
local removePos = {}
|
|||
|
for pos, role in pairs(_DeadRoleList) do
|
|||
|
if role:GoDead() then
|
|||
|
isDeadFrame = true
|
|||
|
table.insert(removePos, pos)
|
|||
|
end
|
|||
|
end
|
|||
|
for _, pos in ipairs(removePos) do
|
|||
|
_DeadRoleList[pos] = nil
|
|||
|
end
|
|||
|
return isDeadFrame
|
|||
|
end
|
|||
|
|
|||
|
-- 加入复活之人
|
|||
|
function this.AddReliveRole(role)
|
|||
|
_ReliveRoleList[role.position + role.camp * 9] = role
|
|||
|
_RealDeadList[role.position + role.camp * 9] = nil
|
|||
|
end
|
|||
|
|
|||
|
-- 是否在复活列表
|
|||
|
function this.IsReliveRole(role)
|
|||
|
if _ReliveRoleList==nil then
|
|||
|
return false
|
|||
|
end
|
|||
|
for ro in pairs(_ReliveRoleList) do
|
|||
|
if ro==role then
|
|||
|
return true
|
|||
|
end
|
|||
|
end
|
|||
|
return false
|
|||
|
end
|
|||
|
|
|||
|
-- 检测是否有人复活
|
|||
|
function this.CheckRelive()
|
|||
|
local isReliveFrame = false
|
|||
|
local removePos = {}
|
|||
|
for pos, role in pairs(_ReliveRoleList) do
|
|||
|
if role:Relive() then
|
|||
|
isReliveFrame = true
|
|||
|
table.insert(removePos, pos)
|
|||
|
end
|
|||
|
end
|
|||
|
for _, pos in ipairs(removePos) do
|
|||
|
_ReliveRoleList[pos] = nil
|
|||
|
end
|
|||
|
return isReliveFrame
|
|||
|
end
|
|||
|
|
|||
|
-- 获取角色数据
|
|||
|
function this.GetRole(camp, pos)
|
|||
|
return PosList[pos + camp*9]
|
|||
|
end
|
|||
|
|
|||
|
function this.GetRoleByPos(pos)
|
|||
|
return PosList[pos]
|
|||
|
end
|
|||
|
|
|||
|
-- 获取某阵营所有角色
|
|||
|
function this.GetRoleByCamp(camp)
|
|||
|
local list = {}
|
|||
|
for i = 1, 6 do
|
|||
|
list[i] = PosList[i + camp * 6]
|
|||
|
end
|
|||
|
return list
|
|||
|
end
|
|||
|
|
|||
|
--查找角色替补数据
|
|||
|
function RoleManager.QueryTibu(func, inCludeDeadRole)
|
|||
|
local list = {}
|
|||
|
local index = 1
|
|||
|
if #tibuRoleList > 0 then
|
|||
|
if func then
|
|||
|
for camp, v in pairs(tibuRoleList) do
|
|||
|
if func(v) and (inCludeDeadRole or not v:IsRealDead()) then
|
|||
|
list[index] = v
|
|||
|
index = index + 1
|
|||
|
end
|
|||
|
end
|
|||
|
end
|
|||
|
end
|
|||
|
table.sort(list, function(a, b)
|
|||
|
return a.position < b.position
|
|||
|
end)
|
|||
|
return list
|
|||
|
end
|
|||
|
|
|||
|
|
|||
|
-- 查找角色
|
|||
|
function RoleManager.Query(func, inCludeDeadRole)
|
|||
|
local list = {}
|
|||
|
local index = 1
|
|||
|
if func then
|
|||
|
for pos, v in pairs(PosList) do
|
|||
|
if func(v) and (inCludeDeadRole or not v:IsRealDead()) then
|
|||
|
list[index] = v
|
|||
|
index = index + 1
|
|||
|
end
|
|||
|
end
|
|||
|
end
|
|||
|
table.sort(list, function(a, b)
|
|||
|
return a.position < b.position
|
|||
|
end)
|
|||
|
return list
|
|||
|
end
|
|||
|
|
|||
|
--> 查找死亡角色
|
|||
|
function RoleManager.QueryDead(func)
|
|||
|
local list = {}
|
|||
|
local index = 1
|
|||
|
if func then
|
|||
|
for pos, v in pairs(PosList) do
|
|||
|
if func(v) and v:IsRealDead() then
|
|||
|
list[index] = v
|
|||
|
index = index + 1
|
|||
|
end
|
|||
|
end
|
|||
|
end
|
|||
|
table.sort(list, function(a, b)
|
|||
|
return a.position < b.position
|
|||
|
end)
|
|||
|
return list
|
|||
|
end
|
|||
|
|
|||
|
|
|||
|
--对位规则: 1敌方相同对位 2若死亡或不存在,选取相邻阵位最近且阵位索引最小的
|
|||
|
function this.GetAggro(role)
|
|||
|
-- -- 计算开始位置
|
|||
|
-- local startPos = role.position
|
|||
|
-- startPos = startPos > 3 and startPos - 3 or startPos
|
|||
|
-- local target
|
|||
|
-- local enemyCamp = role.camp == 0 and 1 or 0
|
|||
|
|
|||
|
-- -- c=0 前排 c=1 后排
|
|||
|
-- for c = 0, 1 do
|
|||
|
-- startPos = startPos + c*3
|
|||
|
-- -- 向左
|
|||
|
-- for i = startPos, c*3+1, -1 do
|
|||
|
-- local pos = i + enemyCamp * 6
|
|||
|
-- if PosList[pos] and not PosList[pos]:IsRealDead() then
|
|||
|
-- target = PosList[pos]
|
|||
|
-- break
|
|||
|
-- end
|
|||
|
-- end
|
|||
|
-- if target then return target end
|
|||
|
-- -- 向右
|
|||
|
-- for i = startPos + 1, c*3+3 do
|
|||
|
-- local pos = i + enemyCamp * 6
|
|||
|
-- if PosList[pos] and not PosList[pos]:IsRealDead() then
|
|||
|
-- target = PosList[pos]
|
|||
|
-- break
|
|||
|
-- end
|
|||
|
-- end
|
|||
|
-- if target then return target end
|
|||
|
-- end
|
|||
|
|
|||
|
-->
|
|||
|
-- 计算开始位置
|
|||
|
local startPos = role.position
|
|||
|
startPos = startPos > 6 and startPos - 6 or (startPos > 3 and startPos - 3 or startPos)
|
|||
|
local target
|
|||
|
local enemyCamp = role.camp == 0 and 1 or 0
|
|||
|
|
|||
|
local tempStartPos = startPos --< 重置用
|
|||
|
-- c=0 前排 c=1 中排
|
|||
|
for c = 0, 2 do
|
|||
|
startPos = tempStartPos
|
|||
|
startPos = startPos + c*3
|
|||
|
-- 向左
|
|||
|
for i = startPos, c*3+1, -1 do
|
|||
|
local pos = i + enemyCamp * 9
|
|||
|
if PosList[pos] and not PosList[pos]:IsRealDead() then
|
|||
|
target = PosList[pos]
|
|||
|
break
|
|||
|
end
|
|||
|
end
|
|||
|
if target then return target end
|
|||
|
-- 向右
|
|||
|
for i = startPos + 1, c*3+3 do
|
|||
|
local pos = i + enemyCamp * 9
|
|||
|
if PosList[pos] and not PosList[pos]:IsRealDead() then
|
|||
|
target = PosList[pos]
|
|||
|
break
|
|||
|
end
|
|||
|
end
|
|||
|
if target then return target end
|
|||
|
end
|
|||
|
end
|
|||
|
|
|||
|
-- 获取没有进入死亡状态的仇恨目标
|
|||
|
function this.GetAliveAggro(role)
|
|||
|
-- 计算开始位置
|
|||
|
local startPos = role.position
|
|||
|
startPos = startPos > 3 and startPos - 3 or startPos
|
|||
|
local target
|
|||
|
local enemyCamp = role.camp == 0 and 1 or 0
|
|||
|
|
|||
|
-- c=0 前排 c=1 后排
|
|||
|
for c = 0, 1 do
|
|||
|
startPos = startPos + c*3
|
|||
|
-- 向左
|
|||
|
for i = startPos, c*3+1, -1 do
|
|||
|
local pos = i + enemyCamp * 6
|
|||
|
if PosList[pos] and not PosList[pos]:IsDead() then
|
|||
|
target = PosList[pos]
|
|||
|
break
|
|||
|
end
|
|||
|
end
|
|||
|
if target then return target end
|
|||
|
-- 向右
|
|||
|
for i = startPos + 1, c*3+3 do
|
|||
|
local pos = i + enemyCamp * 6
|
|||
|
if PosList[pos] and not PosList[pos]:IsDead() then
|
|||
|
target = PosList[pos]
|
|||
|
break
|
|||
|
end
|
|||
|
end
|
|||
|
if target then return target end
|
|||
|
end
|
|||
|
--> 只有被动用 暂不动
|
|||
|
end
|
|||
|
--对位规则: 1敌方相同对位 2若死亡或不存在,选取相邻阵位最近且阵位索引最小的
|
|||
|
function this.GetArrAggroList(role, arr)
|
|||
|
-- -- 重构数据
|
|||
|
-- local plist = {}
|
|||
|
-- for _, role in ipairs(arr) do
|
|||
|
-- plist[role.position] = role
|
|||
|
-- end
|
|||
|
-- -- 计算开始位置
|
|||
|
-- local startPos = role.position
|
|||
|
-- startPos = startPos > 3 and startPos - 3 or startPos
|
|||
|
-- local targetList = {}
|
|||
|
-- -- c=0 前排 c=1 后排
|
|||
|
-- for c = 0, 1 do
|
|||
|
-- startPos = startPos + c*3
|
|||
|
-- -- 向左
|
|||
|
-- for i = startPos, c*3+1, -1 do
|
|||
|
-- local pos = i
|
|||
|
-- if plist[pos] and not plist[pos]:IsRealDead() then
|
|||
|
-- table.insert(targetList, plist[pos])
|
|||
|
-- end
|
|||
|
-- end
|
|||
|
-- -- 向右
|
|||
|
-- for i = startPos + 1, c*3+3 do
|
|||
|
-- local pos = i
|
|||
|
-- if plist[pos] and not plist[pos]:IsRealDead() then
|
|||
|
-- table.insert(targetList, plist[pos])
|
|||
|
-- end
|
|||
|
-- end
|
|||
|
-- end
|
|||
|
-- table.sort(targetList, function(a, b)
|
|||
|
-- return a.position < b.position
|
|||
|
-- end)
|
|||
|
-- return targetList
|
|||
|
|
|||
|
-->
|
|||
|
-- 重构数据
|
|||
|
local plist = {}
|
|||
|
for _, role in ipairs(arr) do
|
|||
|
plist[role.position] = role
|
|||
|
end
|
|||
|
-- 计算开始位置
|
|||
|
local startPos = role.position
|
|||
|
startPos = startPos > 6 and startPos - 6 or (startPos > 3 and startPos - 3 or startPos)
|
|||
|
local targetList = {}
|
|||
|
|
|||
|
local tempStartPos = startPos --< 重置用
|
|||
|
-- c=0 前排 c=1 中排
|
|||
|
for c = 0, 2 do
|
|||
|
startPos = tempStartPos
|
|||
|
startPos = startPos + c*3
|
|||
|
-- 向左
|
|||
|
for i = startPos, c*3+1, -1 do
|
|||
|
local pos = i
|
|||
|
if plist[pos] and not plist[pos]:IsRealDead() then
|
|||
|
table.insert(targetList, plist[pos])
|
|||
|
end
|
|||
|
end
|
|||
|
-- 向右
|
|||
|
for i = startPos + 1, c*3+3 do
|
|||
|
local pos = i
|
|||
|
if plist[pos] and not plist[pos]:IsRealDead() then
|
|||
|
table.insert(targetList, plist[pos])
|
|||
|
end
|
|||
|
end
|
|||
|
end
|
|||
|
table.sort(targetList, function(a, b)
|
|||
|
return a.position < b.position
|
|||
|
end)
|
|||
|
return targetList
|
|||
|
end
|
|||
|
--获取对位相邻站位的人 chooseType 1 我方 2 敌方(对位的敌人受到嘲讽的影响,若对位的敌人死亡,则选取相邻最近的作为目标)
|
|||
|
function this.GetNeighbor(role, chooseType)
|
|||
|
local posList = {}
|
|||
|
local target
|
|||
|
if chooseType == 1 then
|
|||
|
target = role
|
|||
|
else
|
|||
|
if role.lockTarget and not role.lockTarget:IsRealDead() then
|
|||
|
target = role.lockTarget
|
|||
|
else
|
|||
|
target = this.GetAggro(role)
|
|||
|
end
|
|||
|
end
|
|||
|
if target then
|
|||
|
local list = this.Query(function (r) return r.camp == target.camp end)
|
|||
|
for i=1, #list do
|
|||
|
if not list[i]:IsRealDead() then
|
|||
|
if list[i].position == target.position + 3 -- 后排的人
|
|||
|
or list[i].position == target.position - 3 -- 前排的人
|
|||
|
or (math.abs(target.position - list[i].position) <= 1 and math.floor((target.position-1)/3) == math.floor((list[i].position-1)/3)) then -- 旁边的人和自己
|
|||
|
table.insert(posList, list[i])
|
|||
|
end
|
|||
|
end
|
|||
|
end
|
|||
|
end
|
|||
|
table.sort(posList, function(a, b)
|
|||
|
return a.position < b.position
|
|||
|
end)
|
|||
|
return posList
|
|||
|
end
|
|||
|
|
|||
|
|
|||
|
function this.Clear()
|
|||
|
--todo check yh add
|
|||
|
this.TibuClear()
|
|||
|
|
|||
|
for _, obj in pairs(PosList) do
|
|||
|
obj:Dispose()
|
|||
|
removeObjList:Add(obj)
|
|||
|
end
|
|||
|
PosList = {}
|
|||
|
|
|||
|
while removeObjList.size > 0 do
|
|||
|
rolePool:Put(removeObjList.buffer[removeObjList.size])
|
|||
|
removeObjList:Remove(removeObjList.size)
|
|||
|
end
|
|||
|
|
|||
|
_DeadRoleList = {}
|
|||
|
_ReliveRoleList = {}
|
|||
|
_RealDeadList= {}
|
|||
|
tibuRoleList={}
|
|||
|
end
|
|||
|
|
|||
|
-- 多波
|
|||
|
function this.ClearEnemy()
|
|||
|
local removePos = {}
|
|||
|
for pos, obj in pairs(PosList) do
|
|||
|
if obj.camp == 1 then
|
|||
|
removePos[pos] = 1
|
|||
|
BattleLogic.Event:DispatchEvent(BattleEventName.RemoveRole, obj)
|
|||
|
obj:Dispose()
|
|||
|
removeObjList:Add(obj)
|
|||
|
end
|
|||
|
end
|
|||
|
for pos, _ in pairs(removePos) do
|
|||
|
PosList[pos] = nil
|
|||
|
end
|
|||
|
end
|
|||
|
|
|||
|
--> 获取当前最高速度阵营
|
|||
|
function RoleManager.GetFastCamp()
|
|||
|
local maxSpeed = -1
|
|||
|
local maxSpeedCamp = 0
|
|||
|
for pos = 1, 18 do
|
|||
|
while true
|
|||
|
do
|
|||
|
local role = RoleManager.GetRoleByPos(pos)
|
|||
|
if role and not role:IsRealDead() then
|
|||
|
if maxSpeed < role:GetRoleData(RoleDataName.Speed) then
|
|||
|
maxSpeed = role:GetRoleData(RoleDataName.Speed)
|
|||
|
maxSpeedCamp = role.camp
|
|||
|
end
|
|||
|
end
|
|||
|
|
|||
|
break
|
|||
|
end
|
|||
|
end
|
|||
|
|
|||
|
return maxSpeedCamp
|
|||
|
end
|
|||
|
|
|||
|
--> deprecated 改为服务器算好位置
|
|||
|
--> 检测是否有人物数据 根据 位置信息和当前阵型 (formationPos 需要是对应camp的阵型)
|
|||
|
function RoleManager.CheckIsHaveRole(camp, position, formationPos)
|
|||
|
local pos = nil
|
|||
|
local isInFormation = false
|
|||
|
for i = 1, 5 do
|
|||
|
if formationPos[i] then
|
|||
|
if position == formationPos[i] then
|
|||
|
isInFormation = true
|
|||
|
end
|
|||
|
else
|
|||
|
--Logerror("### RoleManager.CheckIsHaveRole error!!!")
|
|||
|
end
|
|||
|
end
|
|||
|
if isInFormation then
|
|||
|
if camp == 0 then
|
|||
|
pos = position
|
|||
|
elseif camp == 1 then
|
|||
|
pos = position + 9
|
|||
|
end
|
|||
|
if PosList[pos] then
|
|||
|
return true
|
|||
|
else
|
|||
|
return false
|
|||
|
end
|
|||
|
else
|
|||
|
return false
|
|||
|
end
|
|||
|
|
|||
|
return false
|
|||
|
end
|
|||
|
|
|||
|
function RoleManager.CheckIsExistRole(camp, position)
|
|||
|
local pos = nil
|
|||
|
if camp == 0 then
|
|||
|
pos = position
|
|||
|
elseif camp == 1 then
|
|||
|
pos = position + 9
|
|||
|
end
|
|||
|
if PosList[pos] then
|
|||
|
return true
|
|||
|
else
|
|||
|
return false
|
|||
|
end
|
|||
|
end
|
|||
|
|
|||
|
function this.getOneRoleProperty(role,pro)
|
|||
|
local _line=""
|
|||
|
if role ~= nil then
|
|||
|
local date =role:GetData(pro)
|
|||
|
if date~=nil then
|
|||
|
_line =tostring(date)
|
|||
|
end
|
|||
|
end
|
|||
|
return _line
|
|||
|
end
|
|||
|
|
|||
|
|
|||
|
function this.printLogicInfo()
|
|||
|
local line=""
|
|||
|
local tb ={}
|
|||
|
line =line.." frame".. BattleLogic.CurFrame()
|
|||
|
line =line.." curRround"..BattleLogic.GetCurRound()
|
|||
|
line =line.." curMove"..BattleLogic.GetMoveTimes()
|
|||
|
return line
|
|||
|
end
|
|||
|
|
|||
|
local _cacheTeam
|
|||
|
function this.printEveryOneDate(_posList)
|
|||
|
_cacheTeam={}
|
|||
|
if _posList == nil then _posList = PosList end
|
|||
|
for pos,_role in pairs(PosList) do
|
|||
|
local info =this.printOneProper(_role,"self ")
|
|||
|
local prop={
|
|||
|
_info=info,
|
|||
|
_pos=pos
|
|||
|
}
|
|||
|
if prop.info==nil then
|
|||
|
prop.info="null"
|
|||
|
end
|
|||
|
table.insert(_cacheTeam,prop)
|
|||
|
end
|
|||
|
return _cacheTeam
|
|||
|
end
|
|||
|
|
|||
|
function this.GetTeamInfos()
|
|||
|
return this.printEveryOneDate(PosList)
|
|||
|
end
|
|||
|
|
|||
|
function this.printOneProper(_role,_sign)
|
|||
|
local _line=_role.roleId.." \n"
|
|||
|
_line=_line..this.getOneRoleProperty(_role,RoleDataName.Hp).." ".."--生命 \n"
|
|||
|
_line=_line..this.getOneRoleProperty(_role,RoleDataName.MaxHp).." ".."--最大生命 \n"
|
|||
|
_line=_line..this.getOneRoleProperty(_role,RoleDataName.Attack).." ".."--攻击力 \n"
|
|||
|
_line=_line..this.getOneRoleProperty(_role,RoleDataName.PhysicalDefence).." ".."--护甲 \n"
|
|||
|
_line=_line..this.getOneRoleProperty(_role,RoleDataName.MagicDefence).." ".."--魔抗 \n"
|
|||
|
_line=_line..this.getOneRoleProperty(_role,RoleDataName.Speed).." ".."--速度 \n"
|
|||
|
_line=_line..this.getOneRoleProperty(_role,RoleDataName.DamageBocusFactor).."-> ".."--伤害加成系数(%) \n"
|
|||
|
_line=_line..this.getOneRoleProperty(_role,RoleDataName.DamageReduceFactor).." ".."--伤害减免系数(%) \n"
|
|||
|
_line=_line..this.getOneRoleProperty(_role,RoleDataName.Hit).." ".."--施法率(% \n"
|
|||
|
_line=_line..this.getOneRoleProperty(_role,RoleDataName.Dodge).." ".."--后期基础施法率(%) \n"
|
|||
|
_line=_line..this.getOneRoleProperty(_role,RoleDataName.Crit).." ".."--暴击率(%) \n"
|
|||
|
_line=_line..this.getOneRoleProperty(_role,RoleDataName.CritDamageFactor).." ".."--暴击伤害系数(%) \n"
|
|||
|
_line=_line..this.getOneRoleProperty(_role,RoleDataName.Tenacity).." ".."--抗暴率(%) \n"
|
|||
|
_line=_line..this.getOneRoleProperty(_role,RoleDataName.TreatFacter).." ".."--治疗加成系数(%) \n"
|
|||
|
_line=_line..this.getOneRoleProperty(_role,RoleDataName.CureFacter).." ".."--受到治疗加成系数(%) \n"
|
|||
|
_line=_line..this.getOneRoleProperty(_role,RoleDataName.PhysicalDamage).." ".."--< 物伤 \n"
|
|||
|
_line=_line..this.getOneRoleProperty(_role,RoleDataName.MagicDamage).." ".."--< 法伤 \n"
|
|||
|
_line=_line..this.getOneRoleProperty(_role,RoleDataName.PhysicalImmune).."-> ".."--< 物免 \n"
|
|||
|
_line=_line..this.getOneRoleProperty(_role,RoleDataName.MagicImmune).." ->".."--< 法免 \n"
|
|||
|
_line=_line..this.getOneRoleProperty(_role,RoleDataName.SpeedAddition).." ".."--< 速度加成 \n"
|
|||
|
_line=_line..this.getOneRoleProperty(_role,RoleDataName.AttackAddition).." ".."--< 攻击加成 \n"
|
|||
|
_line=_line..this.getOneRoleProperty(_role,RoleDataName.ArmorAddition).." ".."--< 护甲加成 \n"
|
|||
|
_line=_line..this.getOneRoleProperty(_role,RoleDataName.ControlProbability).." ".."--< 控制几率 \n"
|
|||
|
_line=_line..this.getOneRoleProperty(_role,RoleDataName.ControlResist).." ".."--< 控制抵抗 \n"
|
|||
|
_line=_line..this.getOneRoleProperty(_role,RoleDataName.SkillDamage).." ".."--< 技能伤害 \n"
|
|||
|
-- _line=_line..this.getOneRoleProperty(_role,RoleDataName.DamageToMage).." ".."--< 对高爆型伤害 \n"
|
|||
|
-- _line=_line..this.getOneRoleProperty(_role,RoleDataName.DamageToFighter).." ".."--< 对穿甲型伤害 \n"
|
|||
|
-- _line=_line..this.getOneRoleProperty(_role,RoleDataName.DamageToDefender).." ".."--< 对防御型伤害 \n"
|
|||
|
-- _line=_line..this.getOneRoleProperty(_role,RoleDataName.DamageToHealer).." ".."--< 对辅助型伤害 \n"
|
|||
|
-- _line=_line..this.getOneRoleProperty(_role,RoleDataName.DefenceFromFighter).." ".."--< 受穿甲型伤害降低 \n"
|
|||
|
-- _line=_line..this.getOneRoleProperty(_role,RoleDataName.DefenceFromMage).." ".."--< 受高爆型伤害降低 \n"
|
|||
|
-- _line=_line..this.getOneRoleProperty(_role,RoleDataName.DefenceFromDefender).." ".."--< 受防御型伤害降低 \n"
|
|||
|
-- _line=_line..this.getOneRoleProperty(_role,RoleDataName.DefenceFromHealer).." ".."--< 受辅助型伤害降低 \n"
|
|||
|
_line=_line..this.getOneRoleProperty(_role,RoleDataName.CriDamageReduceRate).." ".."--< 暴伤抵抗 \n"
|
|||
|
_line=_line..this.getOneRoleProperty(_role,RoleDataName.HealCritical).." ".."--< 修理暴击 \n"
|
|||
|
_line=_line..this.getOneRoleProperty(_role,RoleDataName.HealCriEffect).." ".."--< 修理暴击效果 \n"
|
|||
|
_line=_line..this.getOneRoleProperty(_role,RoleDataName.MaxHpPercentage).." ".."--< 生命加成 \n"
|
|||
|
if _role.isRealDead then
|
|||
|
_line=_line.."》》》isdead"
|
|||
|
else
|
|||
|
_line=_line.."》》》not dead"
|
|||
|
end
|
|||
|
BattleLogManager.Log(
|
|||
|
_sign.." round:"..BattleLogic.GetCurRound().."frame:"..BattleLogic.CurFrame(),
|
|||
|
"tcamp:".. _role.camp,
|
|||
|
"tpos:".. _role.position,
|
|||
|
"prop:".. _line," end"
|
|||
|
)
|
|||
|
return _line
|
|||
|
end
|
|||
|
|
|||
|
|
|||
|
------------------- 回滚状态同步
|
|||
|
|
|||
|
--记录当前回滚帧
|
|||
|
this.nowRecored={}
|
|||
|
|
|||
|
function this.printMirror()
|
|||
|
-- --获取克隆的人员输出属性
|
|||
|
-- BattleLogManager.Log(
|
|||
|
-- "~~~~cloneMirror round:"..BattleLogic.GetCurRound().."frame:"..BattleLogic.CurFrame().." start"
|
|||
|
-- )
|
|||
|
-- if ##this.nowRecored > 0 and #this.nowRecored._fPosList > 0 then
|
|||
|
-- local _posList = this.nowRecored._fPosList
|
|||
|
-- this.printEveryOneDate(_posList)
|
|||
|
|
|||
|
-- end
|
|||
|
-- BattleLogManager.Log(
|
|||
|
-- "~~~~~cloneMirror round:"..BattleLogic.GetCurRound().."frame:"..BattleLogic.CurFrame().." end"
|
|||
|
-- )
|
|||
|
end
|
|||
|
|
|||
|
--记录角色计算数据
|
|||
|
function this.LogCa(...)
|
|||
|
-- local args = {...}
|
|||
|
-- local log = args[1] .. ":\n"
|
|||
|
-- log = log .. string.format("%s = %s, ", "frame", BattleLogic.CurFrame())
|
|||
|
-- for i = 2, #args, 2 do
|
|||
|
-- local key = args[i]
|
|||
|
-- local value = args[i + 1]
|
|||
|
-- log = log .. string.format("%s = %s, ", key, value)
|
|||
|
-- end
|
|||
|
-- table.insert(RecordCaculate, log)
|
|||
|
end
|
|||
|
|
|||
|
function this.LogArgs(id,args)
|
|||
|
if #args > 0 then
|
|||
|
for i,arg in pairs(args) do
|
|||
|
--LogError("id:"..id.." ".."arg["..i.."]:"..arg)
|
|||
|
end
|
|||
|
end
|
|||
|
end
|
|||
|
|
|||
|
-------------------工具方法--------------
|
|||
|
|
|||
|
local function compare(_myrole,_other)
|
|||
|
--Logerror("compare ".._myrole.roleId.." ")
|
|||
|
return _myrole:Equle(_other)
|
|||
|
end
|
|||
|
|
|||
|
local function getRoleInPool(_role,_pool)
|
|||
|
--Logerror("getRole".._role.roleId)
|
|||
|
local ro =_pool:Find(_role,compare)
|
|||
|
return ro
|
|||
|
end
|
|||
|
|
|||
|
local function tableCloneUID(intb,cptb,_newpool)
|
|||
|
for pos, rol in pairs(cptb) do
|
|||
|
intb[pos]=getRoleInPool(rol,_newpool)
|
|||
|
-- --Logerror("R..................y")
|
|||
|
end
|
|||
|
return intb
|
|||
|
end
|
|||
|
|
|||
|
-------------------工具方法--------------
|
|||
|
|
|||
|
function this.XCpy()
|
|||
|
local _cpPool = BattleObjectPool.New(function ()
|
|||
|
return RoleLogic.New()
|
|||
|
end)
|
|||
|
|
|||
|
local function _cpRoles(_role)
|
|||
|
--Logerror("ori".._role.roleId)
|
|||
|
local _r = _role:Clone()
|
|||
|
_cpPool:Put(_r)
|
|||
|
--Logerror("new".._r.roleId)
|
|||
|
end
|
|||
|
rolePool:Foreach(_cpRoles)
|
|||
|
|
|||
|
--Logerror("_cpPool........."..tostring(_cpPool:Count()))
|
|||
|
end
|
|||
|
|
|||
|
function this.CopyTableRole(_tb)
|
|||
|
local _copyTb=BattleDictionary.New()
|
|||
|
if _tb~=nil and #_tb>0 then
|
|||
|
for pos=1,#_tb do
|
|||
|
local _rol=_tb[pos]:Clone()
|
|||
|
_copyTb:Add(pos,_rol)
|
|||
|
end
|
|||
|
end
|
|||
|
return _copyTb
|
|||
|
end
|
|||
|
|
|||
|
|
|||
|
--克隆关键数据
|
|||
|
function this.Clone()
|
|||
|
|
|||
|
local _roleCp = BattleObjectPool.New(function ()
|
|||
|
return RoleLogic.New()
|
|||
|
end)
|
|||
|
|
|||
|
local function _cpRoles(_role)
|
|||
|
--Logerror("ori".._role.roleId)
|
|||
|
local _r = _role:Clone()
|
|||
|
_roleCp:Put(_r)
|
|||
|
--Logerror("new".._r.roleId)
|
|||
|
end
|
|||
|
rolePool:Foreach(_cpRoles)
|
|||
|
|
|||
|
|
|||
|
-- local _roleCp = rolePool:CloneType("RoleLogic") 做镜像数据
|
|||
|
-- 将死之人
|
|||
|
local function CopyTableRole(_tb,_copyTb)
|
|||
|
if _tb~=nil and #_tb>0 then
|
|||
|
for pos,role in pairs(_tb) do
|
|||
|
local _rol=role:Clone()
|
|||
|
--Logerror("_rol........."..role.roleId)
|
|||
|
_copyTb:Add(pos,_rol)
|
|||
|
end
|
|||
|
end
|
|||
|
end
|
|||
|
-- local _roleCp = rolePool:CloneType("RoleLogic") 做镜像数据
|
|||
|
-- 将死之人
|
|||
|
local _CpDeadRoleList = BattleDictionary.New()
|
|||
|
-- 重生之人
|
|||
|
local _CpReliveRoleList = BattleDictionary.New()
|
|||
|
-- 所有角色
|
|||
|
local _CpPosList = BattleDictionary.New()
|
|||
|
|
|||
|
CopyTableRole(_DeadRoleList,_CpDeadRoleList)
|
|||
|
CopyTableRole(_ReliveRoleList,_CpReliveRoleList)
|
|||
|
CopyTableRole(PosList,_CpPosList)
|
|||
|
|
|||
|
local frame = {
|
|||
|
_frolepool=_roleCp,
|
|||
|
_fDeadRoleList = _CpDeadRoleList,
|
|||
|
_fReliveRoleList = _CpReliveRoleList,
|
|||
|
_fPosList = _CpPosList
|
|||
|
}
|
|||
|
|
|||
|
return frame
|
|||
|
end
|
|||
|
|
|||
|
-- 更新当前角色池中的所有角色数据
|
|||
|
|
|||
|
|
|||
|
local function ContainsRoleInTable(tab,role)
|
|||
|
if #tab <=0 then return false end
|
|||
|
for pos,ro in pairs(tab) do
|
|||
|
if role:Equle(ro) then
|
|||
|
return true
|
|||
|
end
|
|||
|
end
|
|||
|
return true
|
|||
|
end
|
|||
|
|
|||
|
|
|||
|
local function FindRoleInTable(tab,role)
|
|||
|
--Logerror("F..............1")
|
|||
|
if #tab <=0 then return nil end
|
|||
|
for pos,ro in pairs(tab) do
|
|||
|
if role:Equle(ro) then
|
|||
|
return ro
|
|||
|
end
|
|||
|
end
|
|||
|
return nil
|
|||
|
end
|
|||
|
|
|||
|
|
|||
|
local function FindRolePosInTable(tab,role)
|
|||
|
if #tab <=0 then return nil end
|
|||
|
for pos,ro in pairs(tab) do
|
|||
|
if role:Equle(ro) then
|
|||
|
return pos
|
|||
|
end
|
|||
|
end
|
|||
|
return nil
|
|||
|
end
|
|||
|
|
|||
|
--回滚战斗数据
|
|||
|
function this.RollBack(_frame)
|
|||
|
-- 重置对象池所有玩家数据
|
|||
|
local frame = _frame
|
|||
|
local _rolPol = frame._frolepool
|
|||
|
local _FDead= frame._fDeadRoleList
|
|||
|
local _FRelive= frame._fReliveRoleList
|
|||
|
local _FPos= frame._fPosList
|
|||
|
|
|||
|
--Logerror("R..............5")
|
|||
|
---- 原始角色池找到对象
|
|||
|
---- 回滚到帧记录的对象数据
|
|||
|
-- local function XrollBack(_role)
|
|||
|
-- local mirro = _rolPol:Find(_role,compare)
|
|||
|
-- if mirro ~= nil then
|
|||
|
-- _role:RoleBack(mirro)
|
|||
|
-- --Logerror("R..............6")
|
|||
|
-- end
|
|||
|
-- end
|
|||
|
-- rolePool:Foreach(XrollBack)
|
|||
|
--Logerror("R..............7")
|
|||
|
|
|||
|
-- 角色数据回滚
|
|||
|
local function XrolFucDate(orTb,MirTb)
|
|||
|
if #orTb<=0 then return end
|
|||
|
--Logerror("f..............1")
|
|||
|
for pos,role in pairs(orTb) do
|
|||
|
if MirTb:Contains(pos) then
|
|||
|
local _mir =MirTb:Get(pos)
|
|||
|
-- LogError("f..............2")
|
|||
|
this.printOneProper(_mir,"miro ")
|
|||
|
role:RoleBack(_mir)
|
|||
|
|
|||
|
end
|
|||
|
end
|
|||
|
--Logerror("R..............x")
|
|||
|
end
|
|||
|
|
|||
|
-- 角色站位回滚 --todo
|
|||
|
local function XrolFucPos(orTb,MirTb)
|
|||
|
if #orTb<=0 then return end
|
|||
|
for pos,role in pairs(orTb) do
|
|||
|
if ContainsRoleInTable(role,MirTb) then -- 在镜像数据中 回滚数据
|
|||
|
local _ps = FindRolePosInTable(role,MirTb)
|
|||
|
if _ps ~= pos then
|
|||
|
--Logerror(role.roleId.."pos is error")
|
|||
|
end
|
|||
|
end
|
|||
|
end
|
|||
|
end
|
|||
|
|
|||
|
|
|||
|
-- XrolFucDate(_DeadRoleList,_FDead)
|
|||
|
--Logerror("R..............8")
|
|||
|
-- XrolFucDate(_ReliveRoleList,_FRelive)
|
|||
|
--Logerror("R..............9")
|
|||
|
XrolFucDate(PosList,_FPos)
|
|||
|
--Logerror("R..............10")
|
|||
|
this.nowRecored = frame
|
|||
|
|
|||
|
return frame
|
|||
|
end
|
|||
|
|
|||
|
return this
|