---@class WB_PlayerSoldiers_C:UAEUserWidget ---@field VerticalBox_Players UVerticalBox --Edit Below-- ---@type WB_PlayerSoldiers_C local WB_PlayerSoldiers = { bInitDoOnce = false; }; function WB_PlayerSoldiers:Construct() UGCLogSystem.Log("[WB_PlayerSoldiers:Construct] 执行") self:LuaInit(); end function WB_PlayerSoldiers:LuaInit() if self.bInitDoOnce then return; end UGCEventSystem.AddListener(EventTypes.SelectSoldierType, self.SetSoldierTypes, self); UGCEventSystem.AddListener(EventTypes.UpdateNewTeams, self.SetPlayerKeys, self); UGCEventSystem.AddListener(EventTypes.PlayerUseBuff, self.OnTriggerSoldier, self); UGCEventSystem.AddListener(EventTypes.ResetRound, self.OnResetRound, self); UGCEventSystem.AddListener(EventTypes.UpdatePlayerSoldiers, self.SetSoldierTypes, self); for i = 1, UITool.GetChildrenCount(self.VerticalBox_Players) do local Item = self.VerticalBox_Players:GetChildAt(i - 1); Item:SetVisibility(ESlateVisibility.Collapsed); end self:HideAllChildrenCooldown(); self.bInitDoOnce = true; end -- 通过 WidgetManager 显示当前页面 --function WB_PlayerSoldiers:OnShowPanel(...) end function WB_PlayerSoldiers:Tick(MyGeometry, InDeltaTime) end function WB_PlayerSoldiers:HideAllChildrenCooldown() for i = 1, self.VerticalBox_Players:GetChildrenCount() do local Item = self.VerticalBox_Players:GetChildAt(i - 1); Item:HideCooldown(); end end function WB_PlayerSoldiers:Destruct() UGCEventSystem.RemoveListener(EventTypes.SelectSoldierType, self.SetSoldierTypes, self); end --- @field InList table> 同队玩家的 PlayerKey function WB_PlayerSoldiers:SetPlayerKeys(InList) if InList == nil then return; end -- 查找本地 UGCLogSystem.Log("[WB_PlayerSoldiers:SetPlayerKeys] Local Team ID = %d", DefaultSettings.LocalTeamId); local TeamId = DefaultSettings.LocalTeamId; if TeamId == nil or TeamId == -1 then TeamId = UGCPlayerControllerSystem.GetTeamID(STExtraGameplayStatics.GetFirstPlayerController(UGCGameSystem.GameState)) if TeamId == nil or TeamId <= 0 then return; end end local PlayerList = InList[TeamId]; UGCLogSystem.Log("[WB_PlayerSoldiers:SetPlayerKeys] Local Team ID = %d", DefaultSettings.LocalTeamId); --for i, v in pairs(InList) do -- local PlayerStr = ""; -- for c, d in pairs(v) do -- PlayerStr = PlayerStr .. tostring(d); -- end -- UGCLogSystem.Log("[WB_PlayerSoldiers:SetPlayerKeys] TeamId = %d, Val = %s", i, PlayerStr); --end UGCLogSystem.LogTree("[WB_PlayerSoldiers:SetPlayerKeys] InList = ", InList); for i, v in pairs(PlayerList) do local Item = self.VerticalBox_Players:GetChildAt(i - 1); Item:SetPlayerKey(v); end end --- 设置子项中的兵种类型 ---@param InList table {PlayerKey: SoldierConfig.ESoldierType, ...} function WB_PlayerSoldiers:SetSoldierTypes(InList) UGCLogSystem.LogTree("[WB_PlayerSoldiers:SetSoldierTypes] InList = ", InList); for i, v in pairs(InList) do self:SetSoldierType(i, v); end end ---@param InPlayerKey PlayerKey 玩家 Key ---@param InType ESoldierType 兵种类型 function WB_PlayerSoldiers:SetSoldierType(InPlayerKey, InType) -- 判断当前是否是自己队伍的 if InPlayerKey == nil then return end local LocalTeamID = UGCGameSystem.GameState:GetPlayerTeamId(LocalPlayerKey); if LocalTeamID ~= UGCGameSystem.GameState:GetPlayerTeamId(InPlayerKey) then return; end local Item = self:FindItem(InPlayerKey) -- 找到一个不是他的 if Item == nil then return; end Item:SetVisibility(ESlateVisibility.Visible); Item:SetSoldierType(InType); end -- 找到对应的 WidgetItem ---@param InPlayerKey PlayerKey function WB_PlayerSoldiers:FindItem(InPlayerKey) for i = 1, self.VerticalBox_Players:GetChildrenCount() do local Item = self.VerticalBox_Players:GetChildAt(i - 1); if Item:GetPlayerKey() == InPlayerKey then return Item; end end UGCLogSystem.Log("[WB_PlayerSoldiers:FindItem] 开始匹配没有的"); for i = 1, self.VerticalBox_Players:GetChildrenCount() do local Widget = self.VerticalBox_Players:GetChildAt(i - 1); local PlayerKey = Widget:GetPlayerKey(); if PlayerKey == 0 then Widget:SetPlayerKey(InPlayerKey); return Widget; end end UGCLogSystem.Log("[WB_PlayerSoldiers:FindItem] 无法找到 PlayerKey 对应的Item:%s", tostring(InPlayerKey)); return nil; end function WB_PlayerSoldiers:HideChildren(InCount) local Count = self.VerticalBox_Players:GetChildrenCount(); if InCount == nil or InCount > Count then InCount = Count; end -- 从后往前逐个隐藏 for i = 1, InCount do local Item = self.VerticalBox_Players:GetChildrenCount(Count - i); Item:SetVisibility(ESlateVisibility.Collapsed); end end function WB_PlayerSoldiers:OnTriggerSoldier(InPlayerKey, InBuffType, InBuffInfo, InServerTime) -- 首先检查是否是我们这一方的 local TheTeamId = UGCGameSystem.GameState:GetPlayerTeamId(InPlayerKey); UGCLogSystem.Log("[WB_PlayerSoldiers:OnTriggerSoldier] TeamId = %s,Local Team ID = %s", tostring(TheTeamId), tostring(DefaultSettings.LocalTeamId)); if TheTeamId ~= DefaultSettings.LocalTeamId then return; end for i = 1, self.VerticalBox_Players:GetChildrenCount() do local Item = self.VerticalBox_Players:GetChildAt(i - 1); local PlayerKey = Item:GetPlayerKey(); if PlayerKey == InPlayerKey then Item:TriggerSoldierType(); --break; end end end function WB_PlayerSoldiers:OnResetRound() local Count = self.VerticalBox_Players:GetChildrenCount() for i = 1, Count do local Item = self.VerticalBox_Players:GetChildAt(i - 1); Item:Reset(); end end return WB_PlayerSoldiers;