2025-01-04 23:00:19 +08:00
|
|
|
---@class WB_CustomWeapon_C:UUserWidget
|
|
|
|
---@field HorizontalBox_WeaponType UHorizontalBox
|
|
|
|
---@field NewButton_Cancel UNewButton
|
|
|
|
---@field NewButton_Close UNewButton
|
|
|
|
---@field NewButton_Select UNewButton
|
|
|
|
---@field UniformGridPanel_SelectWeapon UUniformGridPanel
|
|
|
|
---@field VerticalBox_WeaponSocket UVerticalBox
|
|
|
|
--Edit Below--
|
|
|
|
---@type WB_CustomWeapon_C
|
|
|
|
local WB_CustomWeapon = {
|
|
|
|
bInitDoOnce = false;
|
|
|
|
WeaponComb = {}; -- {WeaponID1, WeaponID2
|
|
|
|
SelectSaveWeaponItemCol = 5;
|
|
|
|
WeaponSocketItems = {};
|
|
|
|
IsChange = false;
|
|
|
|
}
|
|
|
|
|
|
|
|
function WB_CustomWeapon:Construct()
|
|
|
|
self:LuaInit()
|
|
|
|
end
|
|
|
|
|
|
|
|
function WB_CustomWeapon:LuaInit()
|
|
|
|
if self.bInitDoOnce then return ; end
|
|
|
|
self.bInitDoOnce = true;
|
|
|
|
|
|
|
|
UGCLogSystem.Log("[WB_CustomWeapon_LuaInit]")
|
|
|
|
|
|
|
|
-- 按键初始化
|
|
|
|
UITool.BindButtonClicked(self.NewButton_Cancel, self.CloseSelf, self)
|
|
|
|
UITool.BindButtonClicked(self.NewButton_Select, self.ClickSelectWeapon, self)
|
|
|
|
--UITool.BindButtonClicked(self.NewButton_Close, self.ClickClose, self)
|
|
|
|
|
|
|
|
-- 初始化Item
|
|
|
|
self:InitItem()
|
|
|
|
UGCLogSystem.Log("[WB_CustomWeapon_LuaInit] Finish")
|
|
|
|
end
|
|
|
|
|
|
|
|
function WB_CustomWeapon:OnShowPanel()
|
|
|
|
UGCLogSystem.Log("[WB_CustomWeapon_OnShowPanel]")
|
|
|
|
-- 设置配置索引
|
|
|
|
-- self:SetProgrammeIndex(ProgrammeIndex)
|
|
|
|
|
|
|
|
if GlobalMiniMode ~= nil and GlobalMiniMode.CurrWeaponItem[LocalPlayerKey] then
|
|
|
|
self:SetSelectWeapon(1, GlobalMiniMode.CurrWeaponItem[LocalPlayerKey], true)
|
|
|
|
else
|
|
|
|
-- 从存档中获取
|
|
|
|
local LastWeapon = 101001
|
|
|
|
if ArchiveTable[LocalPlayerKey] then
|
|
|
|
LastWeapon = ArchiveTable[LocalPlayerKey].LastWeapon
|
|
|
|
end
|
|
|
|
self:SetSelectWeapon(1, LastWeapon, true)
|
|
|
|
end
|
|
|
|
|
|
|
|
UGCLogSystem.Log("[WB_CustomWeapon_OnShowPanel] Finish")
|
|
|
|
end
|
|
|
|
|
|
|
|
function WB_CustomWeapon:InitItem()
|
|
|
|
-- 武器类型中最大可选择的的武器数量
|
|
|
|
local MaxSelectItemCount = 0
|
|
|
|
|
|
|
|
-- 武器类型选择的Item在水平框中的对齐方式
|
|
|
|
local WeaponTypeSlateChildSize = UE.CreateStruct("SlateChildSize");
|
|
|
|
WeaponTypeSlateChildSize.SizeRule = ESlateSizeRule.Fill
|
|
|
|
|
|
|
|
for i, v in pairs(PlayerCustomWeapon) do
|
|
|
|
-- 设置一下最大的选择武器Item数量
|
|
|
|
MaxSelectItemCount = math.max(MaxSelectItemCount, #v.WeaponIDs)
|
|
|
|
-- 加载图片
|
|
|
|
for _, WeaponID in pairs(v.WeaponIDs) do
|
|
|
|
local WeaponInfo = UGCItemSystem.GetItemData(WeaponID);
|
|
|
|
if WeaponInfo.ItemWhiteIcon_n then
|
|
|
|
-- 加载剪影
|
|
|
|
UE.AsyncLoadAsset_New(WeaponInfo.ItemWhiteIcon_n, nil, nil, true)
|
|
|
|
-- 加载实际武器大图
|
|
|
|
UE.AsyncLoadAsset_New(WeaponInfo.ItemBigIcon_n, nil, nil, true)
|
|
|
|
end
|
|
|
|
end
|
|
|
|
-- 初始化武器类型
|
|
|
|
local WeaponTypeItem = nil
|
|
|
|
if self.HorizontalBox_WeaponType:GetChildrenCount() < i then
|
|
|
|
WeaponTypeItem = UserWidget.NewWidgetObjectBP(LocalPlayerController, self:GetWeaponTypeItemClass());
|
|
|
|
self.HorizontalBox_WeaponType:AddChild(WeaponTypeItem)
|
|
|
|
-- 设置对齐方式
|
|
|
|
local TargetHorizontalBoxSlot = WidgetLayoutLibrary.SlotAsHorizontalBoxSlot(WeaponTypeItem)
|
|
|
|
TargetHorizontalBoxSlot:SetSize(WeaponTypeSlateChildSize)
|
|
|
|
else
|
|
|
|
WeaponTypeItem = self.HorizontalBox_WeaponType:GetChildAt(i - 1)
|
|
|
|
end
|
|
|
|
WeaponTypeItem:SetIndex(i)
|
|
|
|
WeaponTypeItem:BindClickSelect(self.SelectWeaponType, self)
|
|
|
|
end
|
|
|
|
-- 初始化武器槽UI
|
|
|
|
|
|
|
|
for i = 1, self.VerticalBox_WeaponSocket:GetChildrenCount() do
|
|
|
|
local Item = self.VerticalBox_WeaponSocket:GetChildAt(i - 1)
|
|
|
|
self.WeaponSocketItems[i] = Item
|
|
|
|
Item:SetIndex(i)
|
|
|
|
Item:BindClickSelect(self.SelectWeaponSocket, self)
|
|
|
|
end
|
|
|
|
-- 初始化武器选择Item
|
|
|
|
for i = 1, MaxSelectItemCount do
|
|
|
|
local Item = nil;
|
|
|
|
if self.UniformGridPanel_SelectWeapon:GetChildrenCount() < i then
|
|
|
|
Item = UserWidget.NewWidgetObjectBP(LocalPlayerController, self:GetSelectSaveWeaponItemClass());
|
|
|
|
self.UniformGridPanel_SelectWeapon:AddChild(Item)
|
|
|
|
local TargetUniformGridSlot = WidgetLayoutLibrary.SlotAsUniformGridSlot(Item)
|
|
|
|
-- 居中
|
|
|
|
TargetUniformGridSlot:SetVerticalAlignment(EVerticalAlignment.VAlign_Center)
|
|
|
|
TargetUniformGridSlot:SetHorizontalAlignment(EHorizontalAlignment.HAlign_Center)
|
|
|
|
-- 设置索引
|
|
|
|
TargetUniformGridSlot:SetColumn((i - 1) % self.SelectSaveWeaponItemCol)
|
|
|
|
TargetUniformGridSlot:SetRow((i - 1) // self.SelectSaveWeaponItemCol)
|
|
|
|
else
|
|
|
|
Item = self.UniformGridPanel_SelectWeapon:GetChildAt(i - 1)
|
|
|
|
Item:SetVisibility(ESlateVisibility.HitTestInvisible)
|
|
|
|
end
|
|
|
|
Item:SetIndex(i)
|
|
|
|
Item:LuaInit();
|
|
|
|
Item:BindClickSelect(self.ClickSelectSaveWeapon, self)
|
|
|
|
end
|
|
|
|
UGCLogSystem.Log("[WB_CustomWeapon_InitItem] Finish")
|
|
|
|
end
|
|
|
|
|
|
|
|
function WB_CustomWeapon:GetSelectSaveWeaponItemClass()
|
|
|
|
if self.SelectSaveWeaponClass == nil then
|
|
|
|
self.SelectSaveWeaponClass = UE.LoadClass(UGCGameSystem.GetUGCResourcesFullPath('Asset/UI/SelectWeapons/SaveCustomWeaponItem/WB_SelectSaveWeapon.WB_SelectSaveWeapon_C'))
|
|
|
|
end
|
|
|
|
return self.SelectSaveWeaponClass
|
|
|
|
end
|
|
|
|
|
|
|
|
function WB_CustomWeapon:GetWeaponTypeItemClass()
|
|
|
|
if self.WeaponTypeItemClass == nil then
|
|
|
|
self.WeaponTypeItemClass = UE.LoadClass(UGCGameSystem.GetUGCResourcesFullPath('Asset/UI/SelectWeapons/SaveCustomWeaponItem/WB_WeaponType.WB_WeaponType_C'))
|
|
|
|
end
|
|
|
|
return self.WeaponTypeItemClass
|
|
|
|
end
|
|
|
|
|
|
|
|
--- 点击选择插槽
|
|
|
|
function WB_CustomWeapon:SelectWeaponSocket(Index)
|
|
|
|
UGCLogSystem.Log("[WB_CustomWeapon:SelectWeaponSocket] 点击 Index = %s", tostring(Index));
|
|
|
|
if self.SelectWeaponSocketID ~= Index then
|
|
|
|
self.SelectWeaponSocketID = Index
|
|
|
|
local WeaponSocketItem = self.WeaponSocketItems[self.SelectWeaponSocketID]
|
|
|
|
if WeaponSocketItem then
|
|
|
|
self:SetSelectWeapon(self.SelectWeaponSocketID, WeaponSocketItem:GetWeaponID(), true)
|
|
|
|
end
|
|
|
|
end
|
|
|
|
end
|
|
|
|
--- 点击选择武器类型
|
|
|
|
function WB_CustomWeapon:SelectWeaponType(Index)
|
|
|
|
if self.WeaponTypeIndex ~= Index then
|
|
|
|
self.WeaponTypeIndex = Index
|
|
|
|
for i = 1, self.HorizontalBox_WeaponType:GetChildrenCount() do
|
|
|
|
local WeaponTypeItem = self.HorizontalBox_WeaponType:GetChildAt(i - 1)
|
|
|
|
WeaponTypeItem:SetSelect(i == self.WeaponTypeIndex)
|
|
|
|
end
|
|
|
|
local CustomWeaponInfo = PlayerCustomWeapon[self.WeaponTypeIndex]
|
|
|
|
local SocketWeaponID = -1
|
|
|
|
local WeaponSocketItem = self.WeaponSocketItems[self.SelectWeaponSocketID]
|
|
|
|
if WeaponSocketItem then
|
|
|
|
SocketWeaponID = WeaponSocketItem:GetWeaponID()
|
|
|
|
end
|
|
|
|
if CustomWeaponInfo then
|
|
|
|
for i = 1, self.UniformGridPanel_SelectWeapon:GetChildrenCount() do
|
|
|
|
local WeaponID = CustomWeaponInfo.WeaponIDs[i]
|
|
|
|
local WeaponItem = self.UniformGridPanel_SelectWeapon:GetChildAt(i - 1)
|
|
|
|
if WeaponID then
|
|
|
|
WeaponItem:SetWeaponID(WeaponID)
|
|
|
|
WeaponItem:SetSelect(SocketWeaponID == WeaponID)
|
|
|
|
WeaponItem:SetVisibility(ESlateVisibility.SelfHitTestInvisible)
|
|
|
|
else
|
|
|
|
WeaponItem:SetVisibility(ESlateVisibility.Collapsed)
|
|
|
|
end
|
|
|
|
end
|
|
|
|
end
|
|
|
|
end
|
|
|
|
end
|
|
|
|
--- 点击选择武器
|
|
|
|
function WB_CustomWeapon:ClickSelectSaveWeapon(Index)
|
|
|
|
UGCLogSystem.Log("[WB_CustomWeapon:ClickSelectSaveWeapon] 执行 Index = %s", tostring(Index))
|
|
|
|
self.IsChange = true
|
|
|
|
self:SelectSaveWeapon(Index)
|
|
|
|
end
|
|
|
|
function WB_CustomWeapon:SelectSaveWeapon(Index)
|
|
|
|
local WeaponItem = self.UniformGridPanel_SelectWeapon:GetChildAt(Index - 1)
|
2025-01-07 21:21:33 +08:00
|
|
|
if WeaponItem then
|
|
|
|
local WeaponID = WeaponItem:GetWeaponID()
|
|
|
|
for i = 1, self.UniformGridPanel_SelectWeapon:GetChildrenCount() do
|
|
|
|
local TempWeaponItem = self.UniformGridPanel_SelectWeapon:GetChildAt(i - 1)
|
|
|
|
TempWeaponItem:SetSelect(Index == i)
|
|
|
|
end
|
|
|
|
self:SetSelectWeapon(self.SelectWeaponSocketID, WeaponID, false)
|
2025-01-04 23:00:19 +08:00
|
|
|
end
|
|
|
|
end
|
|
|
|
|
|
|
|
function WB_CustomWeapon:SelectSaveWeaponByItemID(ItemID)
|
|
|
|
for i = 1, UITool.GetChildrenCount(self.UniformGridPanel_SelectWeapon) do
|
|
|
|
local Item = self.UniformGridPanel_SelectWeapon:GetChildAt(i - 1);
|
|
|
|
if Item then
|
|
|
|
if Item:GetWeaponID() == ItemID then
|
|
|
|
Item:SetSelect(true);
|
|
|
|
else
|
|
|
|
Item:SetSelect(false);
|
|
|
|
end
|
|
|
|
end
|
|
|
|
end
|
|
|
|
self:SetSelectWeapon(self.SelectWeaponSocketID, ItemID, false)
|
|
|
|
end
|
|
|
|
|
|
|
|
--- 设置插槽内的武器
|
|
|
|
---@param SocketID uint 插槽的索引 只有1和2
|
|
|
|
---@param bUpdateSelectWeaponBar bool 是否更新武器选择栏
|
|
|
|
function WB_CustomWeapon:SetSelectWeapon(SocketID, WeaponID, bUpdateSelectWeaponBar)
|
|
|
|
if bUpdateSelectWeaponBar then
|
|
|
|
self.SelectWeaponSocketID = SocketID
|
|
|
|
for i, v in pairs(self.WeaponSocketItems) do
|
|
|
|
v:SetSelect(i == SocketID)
|
|
|
|
end
|
|
|
|
-- 获取武器ID类型和索引
|
|
|
|
local CustomWeaponTypeIndex = -1
|
|
|
|
local CustomWeaponIndex = -1;
|
|
|
|
for WeaponTypeIndex, v in pairs(PlayerCustomWeapon) do
|
|
|
|
-- 加载图片
|
|
|
|
for WeaponIndex, TempWeaponID in pairs(v.WeaponIDs) do
|
|
|
|
if TempWeaponID == WeaponID then
|
|
|
|
CustomWeaponIndex = WeaponIndex
|
|
|
|
CustomWeaponTypeIndex = WeaponTypeIndex
|
|
|
|
end
|
|
|
|
end
|
|
|
|
if CustomWeaponTypeIndex > 0 then
|
|
|
|
break
|
|
|
|
end
|
|
|
|
end
|
|
|
|
-- 更新选择栏
|
|
|
|
self:SelectWeaponType(CustomWeaponTypeIndex)
|
|
|
|
self:SelectSaveWeapon(CustomWeaponIndex)
|
|
|
|
else
|
|
|
|
local SocketItem = self.WeaponSocketItems[SocketID]
|
|
|
|
if SocketItem then
|
|
|
|
SocketItem:SetWeaponID(WeaponID)
|
|
|
|
end
|
|
|
|
end
|
|
|
|
end
|
|
|
|
|
|
|
|
WB_CustomWeapon.LastSelectWeapon = 0;
|
|
|
|
|
|
|
|
function WB_CustomWeapon:ClickSelectWeapon()
|
|
|
|
local WeaponID = self.WeaponSocketItems[1]:GetWeaponID()
|
|
|
|
if self.LastSelectWeapon ~= WeaponID then
|
|
|
|
GameState:SendMiniGameRPC("PlayerSelectWeapon", LocalPlayerKey, WeaponID);
|
|
|
|
end
|
|
|
|
-- 关闭UI
|
|
|
|
self:CloseSelf()
|
|
|
|
end
|
|
|
|
|
|
|
|
function WB_CustomWeapon:CloseSelf()
|
|
|
|
WidgetManager:ClosePanel(self.UIType)
|
|
|
|
self.IsChange = false
|
|
|
|
end
|
|
|
|
|
|
|
|
-- function WB_CustomWeapon:Tick(MyGeometry, InDeltaTime)
|
|
|
|
|
|
|
|
-- end
|
|
|
|
|
|
|
|
-- function WB_CustomWeapon:Destruct()
|
|
|
|
|
|
|
|
-- end
|
|
|
|
|
|
|
|
return WB_CustomWeapon
|