UGCProjects/ProjectTemp_T/Script/UI/WB_PlayerSoldiers.lua

155 lines
5.5 KiB
Lua
Raw Normal View History

2025-01-04 23:00:19 +08:00
---@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;