391 lines
13 KiB
Lua
391 lines
13 KiB
Lua
|
---@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;
|