UGCProjects/BoltGods/Script/UI/SelectWeapons/WB_SelectAllWeapon.lua
2025-01-04 23:00:19 +08:00

118 lines
3.7 KiB
Lua

---@class WB_SelectAllWeapon_C:UUserWidget
---@field ScrollBox_Types UScrollBox
---@field TextBlock_CountDown UTextBlock
--Edit Below--
---@type WB_SelectAllWeapon_C
local WB_SelectAllWeapon = { bInitDoOnce = false; };
WB_SelectAllWeapon.TypeItems = {};
---@type table<int32, WB_AllWeapon_Item_C>
WB_SelectAllWeapon.CurrSelectItems = {};
--- 玩家武器最多限制
WB_SelectAllWeapon.WeaponLimitCount = 8;
function WB_SelectAllWeapon:Construct()
UGCEventSystem.AddListener(EventTypes.UpdateSelectWeapons, self.OnUpdateSelectWeapons, self)
UGCEventSystem.AddListener(EventTypes.CountDownTimeChange, self.OnCountDownChange, self)
if table.isEmpty(WeaponIdTable) then
GetWeaponIdTable();
end
end
function WB_SelectAllWeapon:OnShowPanel(...)
local vars = {...};
-- 检查一下可以使用的类型
local WeaponTypes = {};
for i, v in pairs(WeaponIdTable) do
local Info = WeaponTable[v];
if WeaponTypes[Info.TypeNew] == nil then WeaponTypes[Info.TypeNew] = {}; end
table.insert(WeaponTypes[Info.TypeNew], v);
end
local TypeList = {};
for i, v in pairs(WeaponTypes) do
table.insert(TypeList, {
Type = i;
List = v;
})
end
table.sort(TypeList, function(a, b) return a.Type < b.Type; end);
ObjectPath.AddFunc("WB_AllWeapon_Type", function(TargetClass)
UGCLogSystem.Log("[WB_SelectAllWeapon:OnShowPanel] 执行");
UITool.AdaptChildren(self.ScrollBox_Types, table.getCount(TypeList), TargetClass);
UITool.ForeachAllChildren(self.ScrollBox_Types, function(index, Widget)
Widget:Init(self, self.OnClickItem)
Widget:SetType(TypeList[index].Type, TypeList[index].List);
self.TypeItems[TypeList[index].Type] = Widget;
end);
end)
end
---@param InItemId int32 物品 ID
function WB_SelectAllWeapon:GetWeaponItemByItemId(InItemId)
for i = 1, UITool.GetChildrenCount(self.ScrollBox_Types) do
local Item = UITool.GetChildAt(self.ScrollBox_Types, i - 1);
if Item:GetType() == WeaponTable[InItemId].TypeNew then
return Item:GetItemByWeaponId(InItemId);
end
end
return nil;
end
function WB_SelectAllWeapon:OnUpdateSelectWeapons(InList)
if table.isEmpty(InList) then return; end
if table.isEmpty(InList[LocalPlayerKey]) then return; end
UGCLogSystem.LogTree(string.format("[WB_SelectAllWeapon:OnUpdateSelectWeapons] InList ="), InList)
-- 让所有的都设置为非选择
self:SetAllNoSelect();
for i, v in pairs(InList[LocalPlayerKey]) do
-- 获取类型
local Item = self:GetWeaponItemByItemId(v)
if Item ~= nil and UE.IsValid(Item) then Item:SetSelect(true); end
end
end
function WB_SelectAllWeapon:SetAllNoSelect()
UITool.ForeachAllChildren(self.ScrollBox_Types, function(index, Widget)
Widget:SetAllNoSelect();
end);
end
--- 倒计时
---@param InTime int
function WB_SelectAllWeapon:OnCountDownChange(InTime)
self.TextBlock_CountDown:SetText(tostring(InTime) .. 's');
end
-- function WB_SelectAllWeapon:Tick(MyGeometry, InDeltaTime)
-- end
-- function WB_SelectAllWeapon:Destruct()
-- end
---@param InItem WB_AllWeapon_Item_C
function WB_SelectAllWeapon:OnClickItem(InItem)
local ItemId = InItem:GetItemId()
if self.CurrSelectItems[ItemId] == nil then
-- 判断当前是否存在
if table.getCount(self.CurrSelectItems) < self.WeaponLimitCount then
self.CurrSelectItems[ItemId] = InItem;
InItem:SetSelect(true);
-- 发送 RPC
GameState:SendMiniGameRPC("OnSelectWeapons", LocalPlayerKey, ItemId, true);
else
-- 提示当前无法添加了
UGCWidgetManagerSystem.ShowTipsUI(string.format('当前已经添加到上限了,请取消已选择的再进行添加~'));
end
else
self.CurrSelectItems[ItemId]:SetSelect(false)
GameState:SendMiniGameRPC("OnSelectWeapons", LocalPlayerKey, ItemId, false);
self.CurrSelectItems[ItemId] = nil;
end
end
return WB_SelectAllWeapon;