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

390 lines
13 KiB
Lua
Raw 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 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;