UGCProjects/SoloKing/Script/UI/SelectWeapons/WB_CustomWeapon_New.lua
2025-01-21 11:29:14 +08:00

369 lines
13 KiB
Lua
Raw Permalink 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_CustomWeapon_New_C:UUserWidget
---@field HorizontalBox_WeaponType UHorizontalBox
---@field NewButton_Close UNewButton
---@field NewButton_Save UNewButton
---@field NewButton_SelectParts UNewButton
---@field SaveMeleeWeaponItem UWB_SaveOtherWeaponItem_C
---@field SaveSubWeaponItem UWB_SaveOtherWeaponItem_C
---@field SaveWeaponItem1 UWB_SaveWeaponItem_C
---@field SaveWeaponItem2 UWB_SaveWeaponItem_C
---@field UniformGridPanel_SelectWeapon UUniformGridPanel
---@field VerticalBox_OtherWeapons UVerticalBox
---@field VerticalBox_WeaponSocket UVerticalBox
---@field WidgetSwitcher_WeaponSocket_Type UWidgetSwitcher
--Edit Below--
local WB_CustomWeapon_New = {
bInitDoOnce = false;
WeaponComb = {}; -- {WeaponID1, WeaponID2
SelectSaveWeaponItemCol = 4;
WeaponSocketItems = {};
IsChange = false;
SelectWeaponSocketID = 1;
}
function WB_CustomWeapon_New:Construct()
self:LuaInit()
end
function WB_CustomWeapon_New:LuaInit()
if self.bInitDoOnce then return ; end
self.bInitDoOnce = true;
UGCLogSystem.Log("[WB_CustomWeapon_LuaInit]")
-- 按键初始化
--WidgetLibrary.BindButtonClicked(self.NewButton_Reset, self.ResetWeaponComb, self)
WidgetLibrary.BindButtonClicked(self.NewButton_Save, self.SaveWeaponComb, self)
--WidgetLibrary.BindButtonClicked(self.NewButton_Close, self.ClickClose, self)
WidgetLibrary.BindButtonClicked(self.NewButton_SelectParts, self.OnClickSetParts, self)
-- 初始化Item
self:InitItem()
UGCLogSystem.Log("[WB_CustomWeapon_LuaInit] Finish")
end
function WB_CustomWeapon_New:OnShowPanel(ProgrammeIndex)
UGCLogSystem.Log("[WB_CustomWeapon_OnShowPanel]")
-- 设置配置索引
self:SetProgrammeIndex(ProgrammeIndex)
UGCLogSystem.Log("[WB_CustomWeapon_OnShowPanel] Finish")
end
function WB_CustomWeapon_New:InitItem()
-- 武器类型中最大可选择的的武器数量
local MaxSelectItemCount = 0
-- 武器类型选择的Item在水平框中的对齐方式
local WeaponTypeSlateChildSize = UE.CreateStruct("SlateChildSize");
WeaponTypeSlateChildSize.SizeRule = ESlateSizeRule.Fill
for i, v in pairs(WeaponSelectionCombinationConfig.PlayerCustomWeapon) do
-- 设置一下最大的选择武器Item数量
MaxSelectItemCount = math.max(MaxSelectItemCount, #v.WeaponIDs)
-- 加载图片
for _, WeaponID in pairs(v.WeaponIDs) do
-- 加载剪影
MyWeaponSystem.AsyncLoadItemWhiteIconToBrush(WeaponID)
-- 加载大图
MyWeaponSystem.AsyncLoadItemBigIconToBrush(WeaponID)
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
self.WeaponSocketItems = {
self.SaveWeaponItem1,
self.SaveWeaponItem2,
self.SaveSubWeaponItem,
self.SaveMeleeWeaponItem,
}
for i, Item in pairs(self.WeaponSocketItems) do
Item:SetIndex(i)
Item:BindClickSelect(self.SelectWeaponSocket, self)
end
MaxSelectItemCount = math.max(MaxSelectItemCount, #WeaponSelectionCombinationConfig.PlayerCustomMeleeWeapon, #WeaponSelectionCombinationConfig.PlayerCustomMeleeWeapon)
-- 初始化武器选择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:BindClickSelect(self.ClickSelectSaveWeapon, self)
end
UGCLogSystem.Log("[WB_CustomWeapon_InitItem] Finish")
end
function WB_CustomWeapon_New: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_New: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
--- 设置配置ID
function WB_CustomWeapon_New:SetProgrammeIndex(InProgrammeIndex)
self.ProgrammeIndex = InProgrammeIndex
local SavedWeaponComb = nil
if SavedWeaponComb and SavedWeaponComb[self.ProgrammeIndex] then
self.WeaponComb = SavedWeaponComb[self.ProgrammeIndex]
else
local CombinationList = WeaponSelectionCombinationConfig.WeaponCombinationList.Weapon
if CombinationList and CombinationList[self.ProgrammeIndex] then
self.WeaponComb = CombinationList[self.ProgrammeIndex]
end
end
for i = #self.WeaponComb, 1, -1 do
self:SetSelectWeapon(i, self.WeaponComb[i], (i == 1));
end
end
--- 点击选择插槽
function WB_CustomWeapon_New:SelectWeaponSocket(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_New:SelectWeaponType(Index)
UGCLogSystem.Log("[WB_CustomWeapon_New_SelectWeaponType] Index:%s", tostring(Index))
local CustomWeaponIDs = {}
-- 判断武器插槽分类
if self.SelectWeaponSocketID <= 2 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 = WeaponSelectionCombinationConfig.PlayerCustomWeapon[self.WeaponTypeIndex]
if CustomWeaponInfo then
CustomWeaponIDs = CustomWeaponInfo.WeaponIDs
end
elseif self.SelectWeaponSocketID == 3 then
-- 副武器
CustomWeaponIDs = WeaponSelectionCombinationConfig.PlayerCustomSubWeapon
else
-- 近战武器
CustomWeaponIDs = WeaponSelectionCombinationConfig.PlayerCustomMeleeWeapon
end
local SocketWeaponID = -1
local WeaponSocketItem = self.WeaponSocketItems[self.SelectWeaponSocketID]
if WeaponSocketItem then
SocketWeaponID = WeaponSocketItem:GetWeaponID()
end
if CustomWeaponIDs then
for i = 1, self.UniformGridPanel_SelectWeapon:GetChildrenCount() do
local WeaponID = CustomWeaponIDs[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
--- 点击选择武器
function WB_CustomWeapon_New:ClickSelectSaveWeapon(Index)
self.IsChange = true
self:SelectSaveWeapon(Index)
end
function WB_CustomWeapon_New:SelectSaveWeapon(Index)
UGCLogSystem.Log("[WB_CustomWeapon_New_SelectSaveWeapon] Index:%s", tostring(Index))
local WeaponItem = self.UniformGridPanel_SelectWeapon:GetChildAt(Index - 1)
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)
end
--- 设置插槽内的武器
---@param SocketID uint 插槽的索引 只有1和2
---@param bUpdateSelectWeaponBar bool 是否更新武器选择栏
function WB_CustomWeapon_New:SetSelectWeapon(SocketID, WeaponID, bUpdateSelectWeaponBar)
UGCLogSystem.Log("[WB_CustomWeapon_New_SetSelectWeapon] SocketID:%s, WeaponID:%s, bUpdateSelectWeaponBar:%s", tostring(SocketID), tostring(WeaponID), tostring(bUpdateSelectWeaponBar))
-- 设置插槽页签
if SocketID <= 2 then
self.WidgetSwitcher_WeaponSocket_Type:SetActiveWidgetIndex(0)
elseif SocketID == 3 then
self.WidgetSwitcher_WeaponSocket_Type:SetActiveWidgetIndex(1)
else
self.WidgetSwitcher_WeaponSocket_Type:SetActiveWidgetIndex(2)
end
if bUpdateSelectWeaponBar then
self.SelectWeaponSocketID = SocketID
for i, v in pairs(self.WeaponSocketItems) do
v:SetSelect(i == SocketID)
end
local CustomWeaponTypeIndex = -1
local CustomWeaponIndex = -1;
if self.SelectWeaponSocketID <= 2 then
-- 获取武器ID类型和索引
for WeaponTypeIndex, v in pairs(WeaponSelectionCombinationConfig.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
elseif self.SelectWeaponSocketID == 3 then
-- 设置插槽页签
self.WidgetSwitcher_WeaponSocket_Type:SetActiveWidgetIndex(1)
CustomWeaponTypeIndex = -1
for WeaponIndex, TempWeaponID in pairs(WeaponSelectionCombinationConfig.PlayerCustomSubWeapon) do
if TempWeaponID == WeaponID then
CustomWeaponIndex = WeaponIndex
break
end
end
else
-- 设置插槽页签
self.WidgetSwitcher_WeaponSocket_Type:SetActiveWidgetIndex(2)
CustomWeaponTypeIndex = -2
for WeaponIndex, TempWeaponID in pairs(WeaponSelectionCombinationConfig.PlayerCustomMeleeWeapon) do
if TempWeaponID == WeaponID then
CustomWeaponIndex = WeaponIndex
break
end
end
end
-- 更新选择栏
self:SelectWeaponType(CustomWeaponTypeIndex)
self:SelectSaveWeapon(CustomWeaponIndex)
else
local SocketItem = self.WeaponSocketItems[SocketID]
if SocketItem then
SocketItem:SetWeaponID(WeaponID)
end
end
end
--- 重置武器配置
function WB_CustomWeapon_New:ResetWeaponComb()
local CombinationList = WeaponSelectionCombinationConfig.Weapon
if CombinationList and CombinationList[self.ProgrammeIndex] then
local Comb = CombinationList[self.ProgrammeIndex]
for i = #Comb, 1, -1 do
self:SetSelectWeapon(i, Comb[i], (i == 1))
end
end
end
function WB_CustomWeapon_New:SaveWeaponComb()
local WeaponComb = {}
local PartsComb = {}
for i, v in pairs(self.WeaponSocketItems) do
WeaponComb[i] = v:GetWeaponID()
-- 传入武器ID并保存
PartsComb[v:GetWeaponID()] = v:GetAllParts()
end
UGCLogSystem.LogTree("[WB_CustomWeapon_SaveWeaponComb]WeaponComb:", WeaponComb)
GameState:SendMiniGameRPC("PlayerSelectWeapons", LocalPlayerKey, self.ProgrammeIndex, WeaponComb);
-- 关闭UI
self:CloseSelf()
-- 通知父类
ArchiveTable[LocalPlayerKey].EnterWeapons[self.ProgrammeIndex] = TableHelper.DeepCopyTable(WeaponComb);
UGCEventSystem.SendEvent(EventTypes.UpdateEnterWeapons);
end
function WB_CustomWeapon_New:ClickClose()
UGCLogSystem.Log("[WB_CustomWeapon_New:ClickClose] 执行")
if self.IsChange then
UGCLogSystem.Log("[WB_CustomWeapon_New:ClickClose] 关闭界面进行二次确认")
WidgetManager:ShowPanel(WidgetConfig.EUIType.TwoConfirm, false)
WidgetManager:GetPanel(WidgetConfig.EUIType.TwoConfirm, function(Widget1)
Widget1:SetTextInfo("该配置还未保存,是否保存后关闭页面?", "关闭", "保存");
UGCLogSystem.Log("[WB_CustomWeapon_New:ClickClose] 111")
Widget1:BindCancellationCallBack(self.CloseSelf, self);
UGCLogSystem.Log("[WB_CustomWeapon_New:ClickClose] 222")
Widget1:BindConfirmCallBack(self.SaveWeaponComb, self);
UGCLogSystem.Log("[WB_CustomWeapon_New:ClickClose] 333")
end);
else
UGCLogSystem.Log("[WB_CustomWeapon_New:ClickClose] 关闭自身")
self:CloseSelf()
end
end
function WB_CustomWeapon_New:CloseSelf()
WidgetManager:ClosePanel(WidgetConfig.EUIType.CustomSelectWeapon)
self.IsChange = false
end
--- 拿到当前点击的武器ID
function WB_CustomWeapon_New:OnClickSetParts()
local WeaponSocketItem = self.WeaponSocketItems[self.SelectWeaponSocketID or 1];
if WeaponSocketItem then
local WeaponID = WeaponSocketItem:GetWeaponID()
if WeaponID then
UGCLogSystem.Log("[WB_CustomWeapon_New:OnClickSetParts] WeaponID = ", tostring(WeaponID));
WidgetManager:GetPanel(WidgetConfig.EUIType.WeaponConfiguration, function(Widget)
Widget:SetWeaponID(WeaponID);
end)
WidgetManager:ShowPanel(WidgetConfig.EUIType.WeaponConfiguration, true, WeaponID);
end
end
end
-- function WB_CustomWeapon_New:Tick(MyGeometry, InDeltaTime)
-- end
-- function WB_CustomWeapon_New:Destruct()
-- end
return WB_CustomWeapon_New