UGCProjects/ProjectTemp_T/Script/UI/WB_PlayerSoldiers.lua
2025-01-04 23:00:19 +08:00

155 lines
5.5 KiB
Lua
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.

---@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<TeamId,table<PlayerKey>> 同队玩家的 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, ESoldierType> {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 = %sLocal 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;