PGRData/Script/matrix/xentity/xguildwar/battle/node/XGWNode.lua
2024-09-01 22:49:41 +02:00

443 lines
12 KiB
Lua

---@class XGWNode
local XGWNode = XClass(nil, "XGWNode")
function XGWNode:Ctor(id)
self._Id = id
self.Config = XGuildWarConfig.GetNodeConfig(id)
self.UID = 0
-- 节点血量
self.HP = self.Config.HpMax
-- 节点最大血量
self.MaxHP = self.Config.HpMax
-- 当前到达该节点的人数
self.MemberCount = 0
-- 前节点
self.FrontNodes = nil
-- 后节点
self.NextNodes = nil
--父节点
self.ParentNode = nil
--子节点
self.ChildrenNodes = nil
-- 战斗次数
self.FightCount = 0
-- 是否死亡过,前哨重建后,也能经过
self.IsDead = nil
self.BossLevel = 0
self.IsJustDestroyed = false
end
-- data : XGuildWarNodeData
function XGWNode:UpdateWithServerData(data)
if data == nil then
data = {}
end
self.UID = data.Uid
self.HP = data.CurHp or 0
self.MaxHP = data.HpMax or self.Config.HpMax
self.FightCount = data.FightCount or 0
self.MemberCount = data.CurMember or 0
if self.IsDead == false and data.IsDead > 0 then
self:SetIsJustDestroyed(true)
end
self.IsDead = data.IsDead and (data.IsDead > 0) and true or false
self.BossLevel = data.CurBossLevel or 0
self.BossLevel = self.BossLevel + 1
end
function XGWNode:GetId()
return self.Config.Id
end
function XGWNode:GetUID()
return self.UID
end
function XGWNode:GetName()
return self.Config.Name
end
function XGWNode:GetNameEn()
return self.Config.NameEn
end
function XGWNode:GetDesc()
return XUiHelper.ReplaceTextNewLine(self.Config.Desc)
end
function XGWNode:GetDifficultyId()
return self.Config.DifficultyId
end
function XGWNode:GetIcon()
return self.Config.Icon
end
function XGWNode:GetShowMonsterIcon()
return self.Config.ShowMonsterIcon
end
function XGWNode:GetShowMonsterName()
return self.Config.ShowMonsterName
end
function XGWNode:GetGroupIndex()
return self.Config.GroupIndex
end
function XGWNode:GetStageIndex()
return self.Config.StageIndex
end
function XGWNode:GetStageIndexName()
return string.format("%d_%d", self:GetGroupIndex(), self:GetStageIndex())
end
-- 获取节点会长标志的下标,没有标记则为-1
function XGWNode:GetPathIndex()
return XDataCenter.GuildWarManager.GetBattleManager():GetNodePathIndex(self:GetId()) or -1
end
-- 检测是否为会长标记节点
function XGWNode:GetIsPlanNode()
return self:GetPathIndex() >= 0
end
-- 获取节点血量
function XGWNode:GetHP()
return self.HP
end
-- 获取节点最大血量
function XGWNode:GetMaxHP()
return self.MaxHP
end
function XGWNode:GetIsDead()
return self.IsDead
end
-- 获取百分比血量
function XGWNode:GetPercentageHP()
local value = (self:GetHP() / self:GetMaxHP()) * 100
if value > 0 and value < 1 then
value = math.max(value, 1)
end
return string.format("%s%%", getRoundingValue(value, 2))
end
-- 获取节点当前成员人数
function XGWNode:GetMemberCount()
return self.MemberCount
end
function XGWNode:GetNodeType()
return self.Config.Type
end
function XGWNode:GetIsCanBattle()
return false
end
--玩家是否在这个节点上
function XGWNode:GetIsPlayerNode()
return XDataCenter.GuildWarManager.GetBattleManager():GetCurrentNodeId() == self:GetId()
end
--是否基地节点
function XGWNode:GetIsBaseNode()
return self:GetNodeType() == XGuildWarConfig.NodeType.Home
end
--是否哨塔节点
function XGWNode:GetIsSentinelNode()
return self:GetNodeType() == XGuildWarConfig.NodeType.Sentinel
end
--是否一期感染区
function XGWNode:GetIsInfectNode()
return self:GetNodeType() == XGuildWarConfig.NodeType.Infect
end
--是否二期黑白鲨 大地图根节点
function XGWNode:GetIsPandaRootNode()
return self:GetNodeType() == XGuildWarConfig.NodeType.PandaRoot
end
--是否二期黑白鲨区
function XGWNode:GetIsPandaNode()
return XGuildWarConfig.PandaNodeType[self:GetNodeType()] or false
end
--是否三期双子区
function XGWNode:GetIsTwinsNode()
return XGuildWarConfig.TwinsNodeType[self:GetNodeType()] or false
end
--是否四期封锁点
function XGWNode:GetIsBlockadeNode()
return self:GetNodeType() == XGuildWarConfig.NodeType.Blockade
end
--是否四期boss
function XGWNode:GetIsTerm4Boss()
return XGuildWarConfig.Term4BossNodeType[self:GetNodeType()] or false
end
--是否BOSS区域
function XGWNode:GetIsLastNode()
return XGuildWarConfig.LastNodeType[self:GetNodeType()] or false
end
--是否残留区(击倒后的遗迹状态)
function XGWNode:GetIsRuinsStatus()
return false
end
function XGWNode:GetRebuildProgress()
-- 获取重建进度
return 0
end
function XGWNode:GetIsInBattle()
return false
end
-- 获取节点状态:正常,复活中,死亡
-- return : XGuildWarConfig.NodeStatusType
function XGWNode:GetStutesType()
if self:GetHP() <= 0 then
return XGuildWarConfig.NodeStatusType.Die
end
return XGuildWarConfig.NodeStatusType.Alive
end
-- 获得区域提示
function XGWNode:GetAreaTip()
local stutesType = self:GetStutesType()
if stutesType == XGuildWarConfig.NodeStatusType.Die then
return "GuildWarAreaTipDie"
end
if stutesType == XGuildWarConfig.NodeStatusType.Revive then
return "GuildWarAreaTipRevive"
end
if stutesType == XGuildWarConfig.NodeStatusType.Alive then
return "GuildWarAreaTipAlive"
end
end
-- 获取 路线之前节点列表
-- return { XGWNode }
function XGWNode:GetFrontNodes()
if self.FrontNodes == nil then
local parentIds = XGuildWarConfig.GetFrontNodeIdsByNodeId(self:GetId())
self.FrontNodes = {}
for _, parentId in ipairs(parentIds) do
table.insert(self.FrontNodes, XDataCenter.GuildWarManager.GetBattleManager():GetNode(parentId))
end
end
return self.FrontNodes
end
-- 获取 路线之后节点列表
-- return { XGWNode }
function XGWNode:GetNextNodes()
if self.NextNodes == nil then
self.NextNodes = {}
for _, linkId in ipairs(self.Config.LinkIds) do
table.insert(self.NextNodes, XDataCenter.GuildWarManager.GetBattleManager():GetNode(linkId))
end
end
return self.NextNodes
end
--获取父节点ID
function XGWNode:GetParentId()
return self.Config.RootId
end
--判断自己是否子节点
function XGWNode:IsChildNode()
return not (self.Config.RootId == 0)
end
-- 获取 父节点
-- return XGWNode
function XGWNode:GetParentNode()
local parentId = self:GetParentId()
if self.ParentNode == nil and parentId then
self.ParentNode = XDataCenter.GuildWarManager.GetBattleManager():GetNode(parentId)
end
return self.ParentNode
end
--检查是否存在子节点
function XGWNode:CheckChildExist(node)
return not (self:GetChildIndexByChildId(node:GetId()) == 0)
end
-- 通过子节点索引 获取子节点ID
function XGWNode:GetChildIdByIndex(index)
return XGuildWarConfig.GetChildNodeId(self:GetId(), index)
end
-- 通过子节点索引 获取子节点
function XGWNode:GetChildByIndex(index)
return XDataCenter.GuildWarManager.GetChildNode(self:GetId(), index)
end
-- 通过子节点ID 获取子节点
function XGWNode:GetChildById(nodeId)
for _, childId in ipairs(XGuildWarConfig.GetNodesChildren(self:GetId())) do
if nodeId == childId then
return XDataCenter.GuildWarManager.GetBattleManager():GetNode(nodeId)
end
end
XLog.Error("XGWNode:" .. self.GetId() .. " cant find child:" .. nodeId)
return nil
end
-- 获取 子节点
-- return XGWNode[]
function XGWNode:GetChildrenNodes()
if self.ChildrenNodes == nil then
self.ChildrenNodes = {}
for _, childId in ipairs(XGuildWarConfig.GetNodesChildren(self:GetId())) do
table.insert(self.ChildrenNodes, XDataCenter.GuildWarManager.GetBattleManager():GetNode(childId))
end
end
return self.ChildrenNodes
end
--获取子节点的索引
function XGWNode:GetChildIndexByChildId(nodeId)
for index, childId in ipairs(XGuildWarConfig.GetNodesChildren(self:GetId())) do
if childId == nodeId then
return index
end
end
return 0
end
function XGWNode:GetRewardId()
return self.Config.RewardId
end
function XGWNode:GetHelpTitle()
return self.Config.HelpTitle
end
function XGWNode:GetHelpDetail()
return self.Config.HelpDetail
end
function XGWNode:GetFightEventIds()
return self.Config.FightEventId
end
function XGWNode:GetShowFightEventId()
return self.Config.ShowFightEventId
end
-- StageFightEventDetails 配置表
function XGWNode:GetFightEventDetailConfig()
return XFubenConfigs.GetStageFightEventDetailsByStageFightEventId(self:GetShowFightEventId()[1])
end
function XGWNode:GetAllFightEventDetailConfig()
local showFightEventId = self:GetShowFightEventId()
local result = {}
for i = 1, #showFightEventId do
local id = showFightEventId[i]
local detail = XFubenConfigs.GetStageFightEventDetailsByStageFightEventId(id)
result[#result + 1] = detail
end
return result
end
function XGWNode:CheckIsCanGo()
local currentNodeId = XDataCenter.GuildWarManager.GetBattleManager():GetCurrentNodeId()
if self:GetId() == currentNodeId then
return false
end
-- 基地 true
if self:GetIsBaseNode() then
return true
end
-- 已击破 true
if self:GetIsDead() then
return true
end
-- 最终节点,但近卫未击破 false
if self:GetIsLastNode()
and not self:GetAllGuardIsDead() then
return false
end
-- 父节点里有任意节点已击破 or是基地 true
local parentNodes = self:GetFrontNodes()
for i = 1, #parentNodes do
local node = parentNodes[i]
if node:GetIsDead() or node:GetIsBaseNode() then
return true
end
end
-- false
return false
end
function XGWNode:GetAllGuardIsDead()
return XDataCenter.GuildWarManager:GetBattleManager():GetAllGuardIsDead()
end
--获取关卡ID
function XGWNode:GetStageId()
local gwStageId = XGuildWarConfig.GetNodeGuildWarStageId(self:GetId())
return XGuildWarConfig.GetStageId(gwStageId)
end
--获取推荐战力
function XGWNode:GetAbility()
local gwStageId = XGuildWarConfig.GetNodeGuildWarStageId(self:GetId())
return XGuildWarConfig.GetStageAbility(gwStageId)
end
--在公共节点Detail界面点击移动 并且移动到这个节点时回调 (return false的话正常执行公共逻辑 return true的话 截断公共逻辑)
function XGWNode:OnDetailGoCallback()
return false
end
function XGWNode:GetSelfChildIndex()
local parentNode = self:GetParentNode()
return parentNode:GetChildIndexByChildId(self:GetId())
end
-- 获取模型ID
function XGWNode:GetModelId()
return XGuildWarConfig.GetNodeModelId(self:GetId())
end
---@return number@ 复活次数
function XGWNode:GetBossLevel()
return self.BossLevel
end
function XGWNode:GetIsJustDestroyed()
return self.IsJustDestroyed
end
function XGWNode:SetIsJustDestroyed(value)
self.IsJustDestroyed = value
end
---@param node XGWNode
function XGWNode:IsLink2TheEndUnpassBlockade(passedNodes)
if not passedNodes then
passedNodes = {}
end
---@type XGWNode[]
local nextNodes = self:GetNextNodes()
for i = 1, #nextNodes do
local nextNode = nextNodes[i]
if not passedNodes[nextNode] then
passedNodes[nextNode] = true
if not nextNode:GetIsBlockadeNode() then
if nextNode:GetIsLastNode() then
return true
end
if nextNode:IsLink2TheEndUnpassBlockade(passedNodes) then
return true
end
end
end
end
return false
end
return XGWNode