---@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;