UGCProjects/GZJ/Script/UI/WBP_Bag.lua
2025-01-08 22:46:12 +08:00

605 lines
18 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 WBP_Bag_C:UAEUserWidget
---@field CanvasPanel_Buttons UHorizontalBox
---@field CanvasPanel_Operation UCanvasPanel
---@field GeneralSlide_Select UWBP_GeneralSlide_C
---@field Guide_Item_1 UCanvasPanel
---@field Guide_Item_2 UCanvasPanel
---@field Guide_Item_3 UCanvasPanel
---@field Guide_Item_4 UCanvasPanel
---@field Guide_Item_5 UCanvasPanel
---@field Guide_Item_6 UCanvasPanel
---@field Header_Bag UWBP_WidgetHeader_C
---@field HorizontalBox_ItemList UHorizontalBox
---@field OperationButton_Replace UWBP_OperationIcon_C
---@field OperationButton_Reset UWBP_OperationIcon_C
---@field TextBlock_Replace UTextBlock
---@field TextBlock_Reset UTextBlock
---@field TextBlock_Stone UTextBlock
---@field WBP_DropItemWidget UWBP_DropItemWidget_C
---@field WBP_FittingItemInfo UWBP_FittingItemInfo_C
---@field WBP_GenerateAllButton UWBP_GenerateAllButton_C
---@field WBP_GenerateInfo UWBP_GenerateInfo_C
--Edit Below--
local WBP_Bag = {
bInitDoOnce = false;
-- 保存一下数据内容:就是背包中的数据,需要同步的时候改变即可
ItemList = {},
-- 可以通过Id查找到对应的行列数据类型; {UI, UI, UI, UI}
-- 存放所有 Item 的引用
ItemWidgetList = {},
-- 选择三个物品 {{数据, UI}, {数据, UI}, {数据, UI}}
SelectedItemList = {},
-- 第一个选择的类型
BagOperateType = EBagOperateType.None,
--默认
CurrentItemType = EItemType.SkillBook,
OwningPawn = nil,
PlayerState = nil,
BagWeaponItemClass = nil,
AddWeaponTimeHandler = nil,
WeaponItemWidgetClass = nil,
SelectSkillId = 0;
};
function WBP_Bag:Construct()
self.Header_Bag:Construct()
WBP_Bag.SuperClass.Construct(self)
self:BindEvents()
self:InitData() --设置基础数据(显示第一个元素的数据)
self.WBP_FittingItemInfo:SetVisibility(ESlateVisibility.Collapsed)
end
function WBP_Bag:OnShowPanel()
self:UnbindEvents()
self:BindEvents()
self:InitData() --设置基础数据(显示第一个元素的数据)
self.WBP_FittingItemInfo:SetVisibility(ESlateVisibility.Collapsed)
end
function WBP_Bag:OnClosePanel()
for i = 21, 28 do
NewPlayerGuideManager:RemoveGuide(i)
end
-- 关闭界面
UIManager:ClosePanel(EUIType.UseSkill)
end
function WBP_Bag:BindEvents()
EventSystem:AddListener(EventType.UpdateItemList, WBP_Bag.OnUpdateItemList, self)
EventSystem:AddListener(EventType.UpdateStones, WBP_Bag.UpdateResetStone, self)
EventSystem:AddListener(EventType.ShowGeneralSlideWidget, WBP_Bag.OnShowGeneralSlideWidget, self)
EventSystem:AddListener(EventType.BagOperation, WBP_Bag.OnBagOperate, self)
EventSystem:AddListener(EventType.CancelBagOperation, WBP_Bag.OnCancelBagOperation, self)
EventSystem:AddListener(EventType.SelectedItem, WBP_Bag.OnSelectedItem, self)
EventSystem:AddListener(EventType.SendGeneralSlideNum, WBP_Bag.OnSendGeneralSlideNum, self)
EventSystem:AddListener(EventType.ClickTitle, WBP_Bag.OnClickTitle, self)
EventSystem:AddListener(EventType.ShowItemDescribe, WBP_Bag.OnShowItemDescribe, self)
end
function WBP_Bag:Destruct()
self:UnbindEvents()
end
function WBP_Bag:UnbindEvents()
EventSystem:RemoveListener(EventType.UpdateItemList, WBP_Bag.OnUpdateItemList, self)
EventSystem:RemoveListener(EventType.UpdateStones, WBP_Bag.UpdateResetStone, self)
EventSystem:RemoveListener(EventType.ShowGeneralSlideWidget, WBP_Bag.OnShowGeneralSlideWidget, self)
EventSystem:RemoveListener(EventType.BagOperation, WBP_Bag.OnBagOperate, self)
EventSystem:RemoveListener(EventType.CancelBagOperation, WBP_Bag.OnCancelBagOperation, self)
EventSystem:RemoveListener(EventType.SelectedItem, WBP_Bag.OnSelectedItem, self)
EventSystem:RemoveListener(EventType.SendGeneralSlideNum, WBP_Bag.OnSendGeneralSlideNum, self)
EventSystem:RemoveListener(EventType.ClickTitle, WBP_Bag.OnClickTitle, self)
EventSystem:RemoveListener(EventType.ShowItemDescribe, WBP_Bag.OnShowItemDescribe, self)
end
function WBP_Bag:InitData()
self:ListBagItems()
self:SetOwningPawn()
self:SetIsDrop(false)
self.WeaponItemWidgetClass = UE.LoadClass(UGCGameSystem.GetUGCResourcesFullPath('Asset/UI/ChildWidgets/WBP_BagWeaponItem.WBP_BagWeaponItem_C'))
-- 设置 Title
local ButtonsCount = self.CanvasPanel_Buttons:GetChildrenCount()
for i = 1, ButtonsCount do
-- 注意此处是从 0 开始的
self.CanvasPanel_Buttons:GetChildAt(i - 1):SetClick(false)
end
-- 检查一下当前点击的
self.CanvasPanel_Buttons:GetChildAt(0):SetClick(true)
-- 将第一个变回去
for i = 1, 6 do
self.CanvasPanel_Buttons:GetChildAt(i - 1):SetClick(i - 1 == self.CurrentItemType)
end
self:UpdateItemMap(self.CurrentItemType)
local PS = GameDataManager.GetLocalPlayerState()
PS:OnRep_OwnerWeapons()
-- 试一下相机旋转
--UGCGameSystem.SetLookInputEventEnable(GameDataManager.GetLocalPlayerController(), false, true)
self:UpdateResetStone(nil)
end
function WBP_Bag:ClearBag()
self.ItemList = {}
-- 再将所有ItemWidget 清空
self:ClearListBagItems()
end
function WBP_Bag:UpdateItemMap(InItemType)
for i = 22, 28 do
NewPlayerGuideManager:RemoveGuide(i)
end
-- 寻找当前控制的玩家
print(string.format("[WBP_Bag:UpdateItemMap] 执行"))
self:ClearBag() -- 清空一下数组
if UE.IsValid(self.OwningPawn) == false or self.OwningPawn == nil then
self:SetOwningPawn()
end
local PC = GameDataManager.GetLocalPlayerController()
local ItemMap = PC:GetItemMapByItemType(InItemType)
-- i是Idv是数量
for i, v in pairs(ItemMap) do
local Item = {
ItemID = i,
ItemCount = v
}
-- 在最后面插入
-- 判断当前数据量
table.insert(self.ItemList, Item)
end
self:SortItemList(self.ItemList)
--设置数据
-- Replace 置换石
self:UpdateStone(EItemType.SubstituteStone, self.TextBlock_Replace)
-- Reset 重铸石
self:UpdateStone(EItemType.ScouringStone, self.TextBlock_Reset)
self:FillWithData(InItemType, self.ItemList)
end
function WBP_Bag:UpdateResetStone(InNum)
if InNum == nil then
InNum = self:GetStoneCount(EItemType.SubstituteStone)
if InNum == nil then
InNum = 0
end
end
self.TextBlock_Stone:SetText(string.format("置换石:%d", InNum))
end
function WBP_Bag:SortItemList(InList)
table.sort(InList, function(a, b)
local a_type = GetItemQualityLevel(a.ItemID)
local b_type = GetItemQualityLevel(b.ItemID)
local _is_type_ = a_type == b_type
if _is_type_ then
if a.ItemCount == b.ItemCount then
return a.ItemID > b.ItemID
end
return a.ItemCount > b.ItemCount
end
return a_type > b_type
end)
end
function WBP_Bag:GetStoneCount(InType)
local PC = GameDataManager.GetLocalPlayerController()
local Stones = PC:GetItemMapByItemType(InType)
local ItemCount = 0
if Stones ~= nil then
for _, v in pairs(Stones) do
ItemCount = ItemCount + v
end
end
return ItemCount
end
function WBP_Bag:UpdateStone(InType, InItem)
InItem:SetText(tostring(self:GetStoneCount(InType)))
end
function WBP_Bag:SetOwningPawn()
self.OwningPawn = GameDataManager.GetLocalPlayerPawn()
print(string.format("[WBP_Bag:SetOwningPawn] OwnerName = %s", KismetSystemLibrary.GetObjectName(self.OwningPawn)))
end
function WBP_Bag:FindItemCountById(InItemId)
local PC = GameDataManager.GetLocalPlayerController()
local Count = PC:FindItemCount(GetItemTypeByItemId(InItemId), InItemId)
return Count
end
function WBP_Bag:ListBagItems()
-- 依次获取
self.ItemWidgetList = {}
-- 其实一共24个
local ChildrenCount = self.HorizontalBox_ItemList:GetChildrenCount()
for i = 1, ChildrenCount do
local ItemList = self.HorizontalBox_ItemList:GetChildAt(i - 1)
for j = 1, ItemList:GetChildrenCount() do
table.insert(self.ItemWidgetList, ItemList:GetChildAt(j - 1))
end
end
end
function WBP_Bag:ClearListBagItems()
for i = 1, #self.ItemWidgetList do
self.ItemWidgetList[i]:CloseWidget()
end
end
-- 说明一下 Arr 中包含的数据
-- 再UI中是从上往下进行操作的
-- {{id, count}, {id, count}, ...},该数组必定包含全部配件,如果没有的话就是空的
-- SingleItem 表示一个具体的配件对象
function WBP_Bag:FillWithData(InType, DataArr)
-- 首先清空所有
if InType == EItemType.SkillBook then
local ActiveSkillNum = 0
for i = 1, #self.ItemWidgetList do
if i <= #DataArr then
ActiveSkillNum = ActiveSkillNum + 1
self.ItemWidgetList[i]:SetFittingItemData(DataArr[i])
else
self.ItemWidgetList[i]:CloseWidget()
end
end
if ActiveSkillNum > 0 then
NewPlayerGuideManager:TriggerGuide(22)
end
return
end
local ListArr = {}
for i = 1, #DataArr do
local Data = DataArr[i]
local WeaponId = GetItemWeaponTypeByItemId(Data.ItemID)
if ListArr[WeaponId] == nil then
ListArr[WeaponId] = {}
end
table.insert(ListArr[WeaponId], Data)
end
---- 在此处根据不同类型,塞入不同数据
for i = 1, self.HorizontalBox_ItemList:GetChildrenCount() do
local Widget = self.HorizontalBox_ItemList:GetChildAt(i - 1)
local Data = ListArr[i]
if Data == nil then
for j = 1, Widget:GetChildrenCount() do
Widget:GetChildAt(j - 1):CloseWidget()
end
else
for j = 1, Widget:GetChildrenCount() do
if j <= #Data then
Widget:GetChildAt(j - 1):SetFittingItemData(Data[j])
else
Widget:GetChildAt(j - 1):CloseWidget()
end
end
end
end
end
-- 通过 Id 找到对应的 WidgetItem
function WBP_Bag:GetFittingItemById(InId)
for _, v in pairs(self.ItemWidgetList) do
if v:GetItemData().ItemID ~= nil and v:GetItemData().ItemID == InId then
return v
end
end
return nil
end
function WBP_Bag:Clear()
for i = 1, self.HorizontalBox_ItemList:GetChildrenCount() do
local Item = self.HorizontalBox_ItemList:GetChildAt(i - 1)
for j = 1, Item:GetChildrenCount() do
Item:GetChildAt(j - 1):Clear()
end
end
end
-- 显示对应 UI
function WBP_Bag:OnShowGeneralSlideWidget(InOperateType, InData)
-- 往里面设置数据
self.GeneralSlide_Select:SetSlideValue(InData)
self.GeneralSlide_Select:SetOperateType(InOperateType)
self.GeneralSlide_Select:SetVisibility(ESlateVisibility.Visible)
end
function WBP_Bag:OnBagOperate(InType)
-- 首先判断一下是否已经点击过其他按钮了
if self.BagOperateType ~= EBagOperateType.None then
-- 将其他按钮变回去
for i = 1, 4 do
if i ~= InType then
self.CanvasPanel_Operation:GetChildAt(i - 1):SetDefaultText()
end
end
if self.BagOperateType == EBagOperateType.Generate then
self.WBP_GenerateInfo:Clear()
self.WBP_GenerateInfo:SetVisibility(ESlateVisibility.Collapsed)
end
self.BagOperateType = EBagOperateType.None
end
-- 分发事件
print(string.format("开始操作:%d", InType))
if InType == EBagOperateType.Generate then
--显示框
self.WBP_GenerateInfo:SetVisibility(ESlateVisibility.Visible)
--初始化一下
self.WBP_GenerateInfo:Clear()
end
self.BagOperateType = InType
end
function WBP_Bag:OnCancelBagOperation(InType)
print(string.format("取消操作:%d", InType))
self:CloseOperation(InType)
self.WBP_GenerateInfo:OnClickCancel()
end
-- 这里面是单个 Item 的数据{Id, count}
function WBP_Bag:OnSelectedItem(InData)
-- 这里处理的是具体选择的数据
if self.BagOperateType == EBagOperateType.None then
return
elseif self.BagOperateType == EBagOperateType.Generate then
self:SelectGenerateItem(InData)
elseif self.BagOperateType == EBagOperateType.Drop then
-- 判断此时
if InData.ItemCount == 1 then
self:OnSendGeneralSlideNum(EBagOperateType.Drop, InData)
else
self:SelectDropItem(InData)
end
elseif self.BagOperateType == EBagOperateType.Sell then
self:SelectSellItem(InData)
elseif self.BagOperateType == EBagOperateType.Reset then -- 置换
-- 不弹框,仅置换第一个,如果背包满了,那就丢到地上
if InData.ItemCount == 1 then
self:OnSendGeneralSlideNum(EBagOperateType.Reset, InData)
else
self:SelectResetItem(InData)
end
end
end
function WBP_Bag:SelectGenerateItem(InData)
--添加到物品中
self.WBP_GenerateInfo:AddItem(InData)
end
function WBP_Bag:SelectDropItem(InData)
-- 弹框
self:OnShowGeneralSlideWidget(EBagOperateType.Drop, InData)
end
function WBP_Bag:SelectSellItem(InData)
self:OnShowGeneralSlideWidget(EBagOperateType.Sell, InData)
end
function WBP_Bag:SetIsDrop(IsDrop)
if IsDrop then
self.WBP_DropItemWidget:SetVisibility(ESlateVisibility.Visible);
else
self.WBP_DropItemWidget:SetVisibility(ESlateVisibility.Collapsed);
end
end
function WBP_Bag:SelectResetItem(InData)
--此时谈一个框吧
-- 首先判断当前置换石的个数
if InData == nil then
return
end
local PC = GameDataManager.GetLocalPlayerController()
local Item = PC:GetItemMapByItemType(EItemType.SubstituteStone) -- 32000
local StoneCount = 0
for _, v in pairs(Item) do
StoneCount = v
end
if StoneCount <= 0 then
return
end
--选取一个小的
if InData.ItemCount > StoneCount then
InData.ItemCount = StoneCount
end
self:OnShowGeneralSlideWidget(EBagOperateType.Reset, InData)
end
function WBP_Bag:GetOperateType()
return self.BagOperateType
end
-- 这是当点击确认操作的时候执行的操作,传进来是一个 数据
function WBP_Bag:OnSendGeneralSlideNum(InOperateType, InData)
self.GeneralSlide_Select:SetVisibility(ESlateVisibility.Collapsed)
print(string.format("[WBP_Bag:OnSendGeneralSlideNum] OperateType = %d", InOperateType))
local PC = GameDataManager.GetLocalPlayerController()
local Pawn = GameDataManager.GetLocalPlayerPawn();
if InOperateType == EBagOperateType.None then
return
elseif InOperateType == EBagOperateType.Drop then
if not Pawn.IsInArena then
UIManager:ShowGeneralNotice("在练功房不能丢弃~")
return
end
local DropPos = VectorHelper.Sub(self.OwningPawn:K2_GetActorLocation(), {X = 0, Y = 0, Z = 10})
EventSystem:SendEvent(EventType.SpawnDropItem, DropPos, self.OwningPawn:K2_GetActorRotation(), -1, InData)
-- 从背包中移除一个,再刷新当前背包即可
local ItemData = {}
ItemData[InData.ItemID] = - InData.ItemCount
UnrealNetwork.CallUnrealRPC(PC, PC, "ServerRPC_DiscardItems", ItemData)
self:UpdateItemMap(self.CurrentItemType)
elseif self.BagOperateType == EBagOperateType.Sell then
UnrealNetwork.CallUnrealRPC(PC, PC, "ServerRPC_SellItem", InData)
elseif self.BagOperateType == EBagOperateType.Reset then -- 置换
UnrealNetwork.CallUnrealRPC(PC, PC, "ServerRPC_ResetItem", InData)
end
self:CloseOperation(InOperateType)
end
function WBP_Bag:OnClickTitle(InFittingType)
-- 根据 Item 筛选一下
-- 先将现在的变换一下
self.CanvasPanel_Buttons:GetChildAt(self.CurrentItemType):SetClick(false)
if self.CurrentItemType == EItemType.SkillBook then
UIManager:HidePanel(EUIType.UseSkill)
end
self.CurrentItemType = InFittingType
self.CanvasPanel_Buttons:GetChildAt(self.CurrentItemType):SetClick(true)
self:UpdateItemMap(InFittingType)
end
function WBP_Bag:OnUpdateItemList(InShow)
-- 当显示了再传递
if InShow then
self:UpdateItemMap(self.CurrentItemType)
else
if self:IsVisible() then
self:UpdateItemMap(self.CurrentItemType)
end
end
self:UpdateResetStone(nil)
end
function WBP_Bag:OnShowItemDescribe(InData, InShow)
if InShow then
print(string.format("[WBP_Bag:OnShowItemDescribe] 执行了该方法,其中 Id = %d, Count = %d", InData.ItemID, InData.ItemCount))
self.WBP_FittingItemInfo:SetInfoItemData(InData, self)
self.WBP_FittingItemInfo:SetVisibility(ESlateVisibility.SelfHitTestInvisible)
else
self.WBP_FittingItemInfo:SetVisibility(ESlateVisibility.Collapsed)
end
end
--重点
function WBP_Bag:CloseOperation(InType)
print(string.format('[WBP_Bag:CloseOperation] Type = %d', InType))
self.WBP_FittingItemInfo:SetVisibility(ESlateVisibility.Collapsed)
self.WBP_GenerateInfo:SetVisibility(ESlateVisibility.Collapsed)
self.CanvasPanel_Operation:GetChildAt(InType - 1):SetDefaultText()
self.BagOperateType = EBagOperateType.None
end
-- 一键合成
function WBP_Bag:GenerateAllItem()
-- 传入一个 类型,然后进行合成
local PC = GameDataManager.GetLocalPlayerController()
UnrealNetwork.CallUnrealRPC(PC, PC, "ServerRPC_GenerateAllItem", self.CurrentItemType)
if self.BagOperateType == EBagOperateType.Generate then
-- 关闭
self.CanvasPanel_Operation:OnClickTitle()
end
UIManager:ClosePanel(EUIType.UseSkill)
end
function WBP_Bag:GetSelectSkillSlotsXY(InItemWidget)
local SelectIndex = 0
for i = 1, #self.ItemWidgetList do
if self.ItemWidgetList[i] == InItemWidget then
SelectIndex = i
break
end
end
local Y = SelectIndex % 6
local X = SelectIndex // 4
return {X = X, Y = Y}
end
function WBP_Bag:GetAdd()
end
function WBP_Bag:ShowSelectSkill(IsFullSkill, InFittingData, InPosition)
self:InitSelectSkill(InFittingData.ItemID)
local CanvasSlot = self.WBP_SelectSkillSlots.Slot
CanvasSlot:SetPosition({ X = InPosition.X, Y = InPosition.Y })
self.WBP_SelectSkillSlots:SetVisibility(ESlateVisibility.SelfHitTestInvisible)
end
function WBP_Bag:HideSelectSkill()
UIManager:ClosePanel(EUIType.UseSkill)
end
function WBP_Bag:OnMouseMove(MyGeometry, MouseEvent)
end
function WBP_Bag:InitSelectSkill(InId)
print(string.format('[WBP_SelectSkillSlots:InitData] 初始化Id = %d', InId))
self.SelectSkillId = InId
local PC = GameDataManager.GetLocalPlayerController()
local InitiativeSkillSlots = PC:GetInitiativeSkillSlots()
if #InitiativeSkillSlots < 3 then
-- 此时是 select Button
self.WidgetSwitcher_Main:SetActiveWidgetIndex(1)
self.WBP_SkillSelectButton:SetSkillId(self.SkillItemId)
else
self.WidgetSwitcher_Main:SetActiveWidgetIndex(0)
self:FillSkillDatas()
end
end
function WBP_Bag:FillSkillDatas()
print(string.format('[WBP_SelectSkillSlots:FillDatas] 填充数据'))
local PC = GameDataManager.GetLocalPlayerController()
local InitiativeSkillSlots = PC:GetInitiativeSkillSlots()
print(string.format('[WBP_SelectSkillSlots:FillDatas] 主动技能数量:%d', #InitiativeSkillSlots))
for i = 1, #InitiativeSkillSlots do
local Slot = InitiativeSkillSlots[i]
if i <= 3 then
local ItemId = PC.ActiveSkillNameList[Slot].SkillName * 100 + PC.ActiveSkillNameList[Slot].SkillLevel * 10 + 20000
self.HorizontalBox_Skills:GetChildAt(i - 1):SetLastItemId(ItemId)
end
end
end
function WBP_Bag:OnMouseButtonDown(MyGeometry, PointerEvent)
WBP_Bag.SuperClass:OnMouseButtonDown(MyGeometry, PointerEvent)
UIManager:HidePanel(EUIType.UseSkill)
end
--当关闭界面的时候执行的函数
function WBP_Bag:OnCloseWidget()
UIManager:HidePanel(EUIType.UseSkill)
end
return WBP_Bag;