391 lines
13 KiB
Lua
Raw Normal View History

2025-01-04 23:00:19 +08:00
---@class W_Shop_C:UUserWidget
---@field Shine UWidgetAnimation
---@field Button_Close UButton
---@field Button_Save UButton
---@field Button_Select UButton
---@field Button_ShopShow UButton
---@field Button_SlideMode_add UButton
---@field Button_SlideMode_minus UButton
---@field CanvasPanel_Main UCanvasPanel
---@field Image_0 UImage
---@field Image_41 UImage
---@field Image_66 UImage
---@field Image_67 UImage
---@field Image_68 UImage
---@field Image_69 UImage
---@field Image_70 UImage
---@field Image_71 UImage
---@field Image_74 UImage
---@field Image_77 UImage
---@field Image_78 UImage
---@field Image_79 UImage
---@field Image_81 UImage
---@field Image_85 UImage
---@field Image_BG UImage
---@field Image_Buy UImage
---@field Image_ItemTexBig UImage
---@field Image_ItemTexSmall UImage
---@field Image_Tip1 UImage
---@field Image_Tip2 UImage
---@field ImageEx_0 UImageEx
---@field ProgressBar_SlideMode UProgressBar
---@field ScrollBox_Items UScrollBox
---@field SlideMode_Value UTextBlock
---@field Slider_SlideMode USlider
---@field TextBlock_ItemName UTextBlock
---@field TextBlock_money UTextBlock
---@field TextBlock_NeedMoney UTextBlock
---@field TextBlock_Time UTextBlock
---@field UniformGridPanel_Item UUniformGridPanel
---@field W_CenterScrollBoxType1 UW_CenterScrollBox_C
---@field W_CenterScrollBoxType2 UW_CenterScrollBox_C
---@field WidgetSwitcher_SelectItemTex UWidgetSwitcher
--Edit Below--
---@type W_Shop_C
local W_Shop = {
bInitDoOnce = false;
-- Select
Type1Path = UGCGameSystem.GetUGCResourcesFullPath('Asset/UI/Shop/W_ShopItemLevelType1.W_ShopItemLevelType1_C');
Type2Path = UGCGameSystem.GetUGCResourcesFullPath('Asset/UI/Shop/W_ShopItemLevelType1.W_ShopItemLevelType1_C');
ItemPath = UGCGameSystem.GetUGCResourcesFullPath('Asset/UI/Shop/W_ShopItem.W_ShopItem_C');
SelectType1 = nil;
SelectType2 = nil;
SelectItemID= nil;
ScrollSoundType = SoundSystem.ESound.Click;
SelectItemSoundType = SoundSystem.ESound.Btn;
ItemsCol = 3;
SelectItemNumRangeMax = 200;
SelectItemNumRange = 1;
SelectItemNum = 1;
};
function W_Shop:Construct()
self:LuaInit();
end
function W_Shop:OnShowPanel()
-- self:ShowHideWidget()
end
function W_Shop:Tick(MyGeometry, InDeltaTime)
end
function W_Shop:CloseSelf()
--if self.CanvasPanel_Main:IsVisible() then
-- self.CanvasPanel_Main:SetVisibility(ESlateVisibility.Collapsed)
-- self.Button_ShopShow:SetVisibility(ESlateVisibility.Visible)
--else
-- self.CanvasPanel_Main:SetVisibility(ESlateVisibility.SelfHitTestInvisible)
-- self.Button_ShopShow:SetVisibility(ESlateVisibility.Collapsed)
-- self:UpdateAllShopItemInfo()
--end
WidgetManager:ClosePanel(WidgetConfig.EUIType.Shop)
end
-- function W_Shop:Destruct()
-- end
-- [Editor Generated Lua] function define Begin:
function W_Shop:LuaInit()
if self.bInitDoOnce then
return;
end
self.bInitDoOnce = true;
--self.Button_Close.OnClicked:Add(self.ShowHideWidget, self)
--self.Button_ShopShow.OnClicked:Add(self.ShowHideWidget, self)
--self.Button_Select.OnClicked:Add(self.Buy, self)
--self.Button_SlideMode_minus.OnClicked:Add(self.MinusSelectItemNum, self)
--self.Button_SlideMode_add.OnClicked:Add(self.AddSelectItemNum, self)
--self.Slider_SlideMode.OnValueChanged:Add(self.SlideModeChange, self)
WidgetLibrary.BindButtonClicked(self.Button_Close, self.CloseSelf, self)
WidgetLibrary.BindButtonClicked(self.Button_Select, self.Buy, self)
WidgetLibrary.BindButtonClicked(self.Button_SlideMode_minus, self.MinusSelectItemNum, self)
WidgetLibrary.BindButtonClicked(self.Button_SlideMode_add, self.AddSelectItemNum, self)
self.Slider_SlideMode.OnValueChanged:Add(self.SlideModeChange, self)
UGCEventSystem.AddListener(EventEnum.PlayerBuyCallBack, self.ShowBuyCallBack, self)
UGCEventSystem.AddListener(EventEnum.PlayerGoldCoinChange, self.UpdateMoney, self)
self:InitParam()
end
function W_Shop:InitParam()
self:InitDownLoadIcon()
-- 隔帧初始化
UGCEventSystem.SetTimer(self,
function()
self.W_CenterScrollBoxType1:Init(UE.LoadClass(self.Type1Path), 70., "InitSelectInfo", "SetSelect", "Button_ItemType")
self.W_CenterScrollBoxType2:Init(UE.LoadClass(self.Type2Path), 70., "InitSelectInfo", "SetSelect", "Button_ItemType")
self.W_CenterScrollBoxType1:BindUpdateSelectItem(self.UpdateSelectType2Item, self)
self.W_CenterScrollBoxType2:BindUpdateSelectItem(self.UpdateSelectItem, self)
self:InitType1()
end,
0.1
)
end
function W_Shop:InitDownLoadIcon()
for _, ItemInfo in pairs(ItemTable.AllItem) do
UGCSystemLibrary.LoadAsset(ItemInfo.SmallPic, true)
if ItemInfo.BigPic then
UGCSystemLibrary.LoadAsset(ItemInfo.BigPic, true)
end
end
end
function W_Shop:InitType1()
local ItemParams = {}
for k, v in pairs(ItemTable.ItemTypeList) do
UGCLogSystem.Log("[W_Shop_InitType1] TypeName:%s", k)
local ItemParam = {k, v.Name}
ItemParams[#ItemParams + 1] = ItemParam
end
self.W_CenterScrollBoxType1:UpdateItemInfo(ItemParams)
self.W_CenterScrollBoxType1:ScrollToMidItem()
end
--- 更新二级类Item
function W_Shop:UpdateSelectType2Item(SelectItem, SelectIndex)
SoundSystem.PlaySound(self.ScrollSoundType)
self.SelectType1 = SelectItem:GetItemKey()
self:InitType2(self.SelectType1)
end
function W_Shop:InitType2(Type1Select)
local ItemParams = {}
for k, v in pairs(ItemTable.ItemTypeList[Type1Select].Data) do
local ItemParam = {k, v.Name}
ItemParams[#ItemParams + 1] = ItemParam
end
self.W_CenterScrollBoxType2:UpdateItemInfo(ItemParams)
self.W_CenterScrollBoxType2:ScrollToMidItem()
end
--- 更新可选择的Item
function W_Shop:UpdateSelectItem(SelectItem, SelectIndex)
SoundSystem.PlaySound(self.ScrollSoundType)
self.SelectType2 = SelectItem:GetItemKey()
local ItemIDs = ItemTable.ItemTypeList[self.SelectType1].Data[self.SelectType2].Data
local SortItems = self:ConditionalSortItem(ItemIDs)
self:UpdateGridPanelList(SortItems)
self.ScrollBox_Items:SetScrollOffset(0.)
end
--- 选择Item
function W_Shop:SelectItem(SelectItem)
SoundSystem.PlaySound(self.SelectItemSoundType)
self.SelectItemID = SelectItem:GetItemID()
self:UpdateGridPanelItemsDeselect()
SelectItem:SetSelect(true)
self:UpdateSelectItemInfo()
end
--- 对Item进行条件排序
function W_Shop:ConditionalSortItem(ItemIDs)
-- 对Item进行筛选排序 一级:可购买 二级:可使用 三级:价格小,
local OwnGoldCoin = UGCGameSystem.GameState:GetPlayerCoin(UGCSystemLibrary.GetLocalPlayerKey())
table.sort(ItemIDs,
function(ItemID1, ItemID2)
local price1 = ItemTable.GetItemPrice(ItemID1)
local price2 = ItemTable.GetItemPrice(ItemID2)
local Item1CanBuy = (OwnGoldCoin >= price1)
local Item2CanBuy = (OwnGoldCoin >= price2)
if Item1CanBuy ~= Item2CanBuy then
return Item1CanBuy
end
local Item1CanUse = self:ItemCanUse(ItemID1)
local Item2CanUse = self:ItemCanUse(ItemID2)
if Item1CanUse ~= Item2CanUse then
return Item1CanUse
end
return price1 < price2
end
)
return ItemIDs
end
function W_Shop:ItemCanUse(ItemID)
local ItemMainClass = ItemTable.GetItemMainClass(ItemID)
local NowWeapons = GetPlayerShootWeaponIDs(UGCSystemLibrary.GetLocalPlayerKey())
if ItemMainClass == 2 then
for i, WeaponID in pairs(NowWeapons) do
if PartIsWeaopnCanBeUsed(WeaponID, ItemID) then
return true
end
end
elseif ItemMainClass == 3 then
for i, WeaponID in pairs(NowWeapons) do
if GetItemWeaponAmmunitionItemID(WeaponID) == ItemID then
return true
end
end
end
return false
end
--- 获取可选择Item的Widget类
function W_Shop:GetItemClass()
if self.ItemClass == nil then
self.ItemClass = UE.LoadClass(self.ItemPath)
end
return self.ItemClass
end
--- 更新网格面板里面的可选择Item
function W_Shop:UpdateGridPanelList(ItemIDs)
self:VerifyGridPanelQuantity(#ItemIDs)
self:UpdateGridPanelItemsDeselect()
local GridPanelChildrenCount = self.UniformGridPanel_Item:GetChildrenCount()
for i = 0, GridPanelChildrenCount - 1 do
local ItemInst = self.UniformGridPanel_Item:GetChildAt(i)
if #ItemIDs > i then
ItemInst:SetVisibility(ESlateVisibility.SelfHitTestInvisible)
ItemInst:InitSelectInfo(ItemIDs[i + 1])
else
ItemInst:SetVisibility(ESlateVisibility.Collapsed)
end
if i == 0 then
self:SelectItem(ItemInst)
end
end
end
function W_Shop:UpdateAllShopItemInfo()
local GridPanelChildrenCount = self.UniformGridPanel_Item:GetChildrenCount()
for i = 0, GridPanelChildrenCount - 1 do
local ItemInst = self.UniformGridPanel_Item:GetChildAt(i)
ItemInst:UpdateItemShowInfo()
end
end
--- 验证网格面板item数量 不足则补足
function W_Shop:VerifyGridPanelQuantity(NeedNum)
local GridPanelChildrenCount = self.UniformGridPanel_Item:GetChildrenCount()
if NeedNum > GridPanelChildrenCount then
for i = GridPanelChildrenCount, NeedNum - 1 do
local ItemInst = UserWidget.NewWidgetObjectBP(UGCSystemLibrary.GetLocalPlayerController(), self:GetItemClass())
self.UniformGridPanel_Item:AddChild(ItemInst)
local TargetUniformGridSlot = WidgetLayoutLibrary.SlotAsUniformGridSlot(ItemInst)
TargetUniformGridSlot:SetColumn(i % self.ItemsCol)
TargetUniformGridSlot:SetRow(math.floor(i / self.ItemsCol))
ItemInst:BindUpdateSelectItem(self.SelectItem, self)
end
end
end
--- 全部网格面板的Item设置为未选择状态
function W_Shop:UpdateGridPanelItemsDeselect()
local GridPanelChildrenCount = self.UniformGridPanel_Item:GetChildrenCount()
for i = 0, GridPanelChildrenCount - 1 do
local ItemInst = self.UniformGridPanel_Item:GetChildAt(i)
ItemInst:SetSelect(false)
end
end
function W_Shop:ShowBuyCallBack(bBuySucceed)
--local TipStr = (bBuySucceed and "购买成功" or "购买失败")
--UGCEventSystem.SendEvent(EventEnum.AddTip, TipStr, 2)
end
function W_Shop:Buy()
SoundSystem.PlaySound(SoundSystem.ESound.Btn)
if self.SelectItemID then
UGCSendRPCSystem.ActorRPCNotify(nil, UGCGameSystem.GameState, "PlayerBuy", UGCSystemLibrary.GetLocalPlayerKey(), self.SelectItemID, self.SelectItemNum)
end
end
-------------------------------------------------------- Item Info 右栏目 --------------------------------------------------------
function W_Shop:UpdateSelectItemInfo()
local ItemInfo = ItemTable.AllItem[self.SelectItemID]
self.TextBlock_ItemName:SetText(ItemInfo.Name)
if ItemInfo.BigPic then
self.Image_ItemTexBig:SetBrushFromTexture(UGCSystemLibrary.LoadAsset(ItemInfo.BigPic, true))
self.WidgetSwitcher_SelectItemTex:SetActiveWidgetIndex(1)
else
self.Image_ItemTexSmall:SetBrushFromTexture(UGCSystemLibrary.LoadAsset(ItemInfo.SmallPic, true))
self.WidgetSwitcher_SelectItemTex:SetActiveWidgetIndex(0)
end
self:UpdateBuyItemNumRange()
self:SetBuyItemNum(1)
end
function W_Shop:UpdateMoney()
self.TextBlock_money:SetText(tostring(UGCGameSystem.GameState:GetPlayerCoin(UGCSystemLibrary.GetLocalPlayerKey())))
end
function W_Shop:UpdateBuyItemNumRange()
--- 武器限制一个
if self.SelectItemID < 300000 or (self.SelectItemID >= 400000 and self.SelectItemID < 600000) then
self.SelectItemNumRange = 1
return
end
local ItemPrice = ItemTable.GetItemPrice(self.SelectItemID)
local HasMoney = UGCGameSystem.GameState:GetPlayerCoin(UGCSystemLibrary.GetLocalPlayerKey())
self.SelectItemNumRange = math.clamp(math.floor(HasMoney / ItemPrice), 1, self.SelectItemNumRangeMax)
end
function W_Shop:SetBuyItemNum(NewNum)
NewNum = math.clamp(NewNum, 1, self.SelectItemNumRange)
self:UpdateBuyItemNum(NewNum)
self:UpdateSlideValue(NewNum / self.SelectItemNumRange)
end
function W_Shop:UpdateBuyItemNum(NewNum)
if NewNum then
self.SelectItemNum = NewNum
else
self.SelectItemNum = math.clamp(self.SelectItemNum, 1, self.SelectItemNumRange)
end
self:UpdateNeedMoney()
self.SlideMode_Value:SetText(tostring(self.SelectItemNum))
end
function W_Shop:UpdateNeedMoney()
self.TextBlock_NeedMoney:SetText(tostring(self.SelectItemNum * ItemTable.GetItemPrice(self.SelectItemID)))
end
function W_Shop:AddSelectItemNum()
SoundSystem.PlaySound(SoundSystem.ESound.Btn)
self:SetBuyItemNum(self.SelectItemNum + 1)
end
function W_Shop:MinusSelectItemNum()
SoundSystem.PlaySound(SoundSystem.ESound.Btn)
self:SetBuyItemNum(self.SelectItemNum - 1)
end
function W_Shop:SlideModeChange(Value)
local NewNum = KismetMathLibrary.Round(Value * (self.SelectItemNumRange - 1)) + 1
self.ProgressBar_SlideMode:SetPercent(Value)
self:UpdateBuyItemNum(NewNum)
end
function W_Shop:UpdateSlideValue(NewValue)
self.Slider_SlideMode:SetValue(NewValue)
self.ProgressBar_SlideMode:SetPercent(NewValue)
end
return W_Shop;