UGCProjects/GZJ/Script/UI/WBP_Bag.lua

605 lines
18 KiB
Lua
Raw Normal View History

2025-01-08 22:46:12 +08:00
---@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;