2025-01-04 23:00:19 +08:00

191 lines
5.6 KiB
Lua

---@class WB_Backpack1_C:UUserWidget
---@field Button_Select UButton
---@field HorizontalBox_Bombs UHorizontalBox
---@field HorizontalBox_Defences UHorizontalBox
---@field HorizontalBox_Medication UHorizontalBox
---@field ScrollBox_Items UScrollBox
---@field TextBlock_WeaponSelect UTextBlock
--Edit Below--
---@type WB_Backpack1_C
local WB_Backpack1 = { bInitDoOnce = false; };
WB_Backpack1.CurrClickItem = nil;
WB_Backpack1.SelectWeapons = nil;
WB_Backpack1.IntervalTime = 0.5;
function WB_Backpack1:Construct()
UITool.BindButtonClicked(self.Button_Select, self.OnClickSelect, self)
end
function WB_Backpack1:OnShowPanel(...)
-- 这个是没有的
self:OnCloseCountDown();
local SoldierType = UGCGameSystem.GameState.PlayerSoldierType[LocalPlayerKey];
UGCLogSystem.Log("[WB_Backpack1:OnShowPanel] %s", tostring(SoldierType));
if SoldierType == nil then return; end
self:FillWeapons(SoldierType);
self:FillBombs(SoldierType);
self:FillMedications(SoldierType);
self:SetDefences(SoldierType);
UITool.ButtonSetEnable(self.Button_Select, true);
end
function WB_Backpack1:FillWeapons(InType)
local WeaponLimits = SoldierConfig.WeaponLimits[InType];
local Count = SoldierConfig.WeaponCount[InType]
local WeaponSelect = {};
if Count == 1 then
for Index, TypeNew in pairs(WeaponLimits) do
local Weapons = GetWeaponListByTypeNew(TypeNew, WeaponTable);
-- 检查是一把武器还是两把武器
for _, WeaponId in pairs(Weapons) do
WeaponSelect[#WeaponSelect + 1] = { WeaponId };
end
end
elseif Count == 2 then
WeaponSelect = SoldierConfig.WeaponSet[InType]
end
self:FillWeaponItems(WeaponSelect);
end
function WB_Backpack1:FillWeaponItems(InWeapons)
-- 设置数据进去
UGCLogSystem.LogTree(string.format("[WB_Backpack1:FillWeaponItems] InWeapons ="), InWeapons)
local ItemCount = UITool.GetChildrenCount(self.ScrollBox_Items);
local WeaponCount = table.getCount(InWeapons);
if WeaponCount > ItemCount then
local TheCount = WeaponCount - ItemCount;
for i = 1, TheCount do
UITool.AddWidgetItem(self.ScrollBox_Items, ObjectPath.WB_Backpack_Item1, self);
end
end
for i = 1, UITool.GetChildrenCount(self.ScrollBox_Items) do
local Item = self.ScrollBox_Items:GetChildAt(i - 1);
local Weapon = InWeapons[i];
if Weapon ~= nil then
if Item.bInitDoOnce then
Item:SetParent(self, self.OnClickCallback);
Item:SetWeaponIds(Weapon);
else
Item.Weapons = Weapon;
Item.ParentWidget = self;
Item.OnClickFunc = self.OnClickCallback;
end
else
Item:SetVisibility(ESlateVisibility.Collapsed);
end
if i == 1 then self:OnClickCallback(Item) end
end
end
function WB_Backpack1:OnCloseCountDown()
self.CloseTime = DefaultSettings.SelectWeaponShowTime;
if self.OnCloseTimer ~= nil then
UGCEventSystem.StopTimer(self.OnCloseTimer);
self.OnCloseTimer = nil;
end
-- 关闭页面
self.OnCloseTimer = UGCEventSystem.SetTimerLoop(self, function()
self.CloseTime = self.CloseTime - self.IntervalTime;
self.TextBlock_WeaponSelect:SetText(tostring(math.floor(self.CloseTime - 1))..'s');
if self.CloseTime <= 1 then
if self.OnCloseTimer ~= nil then
UGCEventSystem.StopTimer(self.OnCloseTimer);
WidgetManager:ClosePanel(WidgetConfig.EUIType.Backpack);
end
end
end, self.IntervalTime);
end
function WB_Backpack1:ClearItemsSelect()
for i = 1, UITool.GetChildrenCount(self.ScrollBox_Items) do
local Item = self.ScrollBox_Items:GetChildAt(i - 1);
Item:SetIsSelect(false);
end
end
-- function WB_Backpack1:Tick(MyGeometry, InDeltaTime)
-- end
-- function WB_Backpack1:Destruct()
-- end
function WB_Backpack1:OnClickSelect()
-- 发送选择的武器
if table.isEmpty(self.SelectWeapons) then return; end
UGCSendRPCSystem.ActorRPCNotify(nil, LocalPlayerController, "Server_SelectWeapons", self.SelectWeapons)
UITool.ButtonSetEnable(self.Button_Select, false);
SoundSystem.PlaySound(SoundSystem.ESound.OK)
--WidgetManager:ClosePanel(WidgetConfig.EUIType.Backpack);
end
---填充药品
---@param InType ESoldierType 兵种类型
function WB_Backpack1:FillMedications(InType)
self:FillInternalBox(InType, self.HorizontalBox_Medication, SoldierConfig.Medications);
end
---填充炸弹
---@param InType ESoldierType 兵种类型
function WB_Backpack1:FillBombs(InType)
self:FillInternalBox(InType, self.HorizontalBox_Bombs, SoldierConfig.Bombs);
end
---@private
---@param InType ESoldierType 兵种类型
---@param InBox UHorizontalBox
---@param InTable table<ESoldierType, table<int32, int32>>
function WB_Backpack1:FillInternalBox(InType, InBox, InTable)
local Table = InTable[InType]
local Num = 0;
for Id, Count in pairs(Table) do
if Count > 0 then
local Item = InBox:GetChildAt(Num);
Item:SetVisibility(ESlateVisibility.Visible);
Item:SetOtherItemType(Id, Count);
Num = Num + 1;
end
end
for i = Num, UITool.GetChildrenCount(InBox) - 1 do
local Item = InBox:GetChildAt(i);
Item:SetVisibility(ESlateVisibility.Collapsed);
end
end
function WB_Backpack1:SetDefences(InType)
local Func = function(InVal, InIndex)
local HelmetItem = self.HorizontalBox_Defences:GetChildAt(InIndex);
if InVal == nil then
HelmetItem:SetVisibility(ESlateVisibility.Collapsed);
else
HelmetItem:SetVisibility(ESlateVisibility.Visible);
HelmetItem:SetOtherItemType(InVal);
end
end
Func(SoldierConfig.DefenceItems[InType].Helmet, 0);
Func(SoldierConfig.DefenceItems[InType].Armor, 1);
end
---@param InItem WB_Backpack_Item1_C
function WB_Backpack1:OnClickCallback(InItem)
if self.CurrClickItem ~= nil then
self.CurrClickItem:SetIsSelect(false);
end
self.CurrClickItem = InItem;
InItem:SetIsSelect(true);
self.SelectWeapons = InItem.Weapons;
-- 设置为选择
self:OnClickSelect();
end
return WB_Backpack1;