UGCProjects/GZJ/Script/UI/ChildWidgets/WBP_BagWeaponItem.lua

189 lines
5.9 KiB
Lua
Raw Normal View History

2025-01-08 22:46:12 +08:00
---@class WBP_BagWeaponItem_C:UUserWidget
---@field Button_Reset UButton
---@field CanvasPanel_Fittings UCanvasPanel
---@field Image_WeaponIcon UImage
---@field TextBlock_Desc UTextBlock
---@field TextBlock_WeaponName UTextBlock
--Edit Below--
local WBP_BagWeaponItem = {
bInitDoOnce = false;
WeaponItem = nil,
WeaponItemId = 0, -- 武器Id
Fittings = {},
WeaponComponent = nil,
bHasConstruct = false,
};
function WBP_BagWeaponItem:Construct()
self.SuperClass:Construct()
print(string.format("[WBP_BagWeaponItem:Construct] 构造好了"))
self.bHasConstruct = true
print(string.format("[WBP_BagWeaponItem:Construct] 设置好了"))
self:InitData()
end
function WBP_BagWeaponItem:GetHasConstruct()
return self.bHasConstruct
end
-- 初始化
function WBP_BagWeaponItem:InitData()
print(string.format("[WBP_BagWeaponItem:InitData] 初始化数据"))
-- 在开始的时候把它们全部隐藏
for i = 1, 5 do
self.CanvasPanel_Fittings:GetChildAt(i - 1).Image_Icon:SetVisibility(ESlateVisibility.Collapsed)
--再给他们设置 ItemType
self.CanvasPanel_Fittings:GetChildAt(i - 1).FittingItemType = i - 1
end
self.Button_Reset.OnClicked:Add(WBP_BagWeaponItem.OnClickResetWeapon, self)
end
function WBP_BagWeaponItem:GetFittingItemByItemType(InItemType)
return self.CanvasPanel_Fittings:GetChildAt(InItemType)
end
-- function WBP_BagWeaponItem:Tick(MyGeometry, InDeltaTime)
-- end
-- function WBP_BagWeaponItem:Destruct()
-- end
function WBP_BagWeaponItem:OnMouseButtonDown(MyGeometry, PointerEvent)
self.SuperClass:OnMouseButtonDown(MyGeometry, PointerEvent)
-- local PlayerController = STExtraGameplayStatics.GetFirstPlayerController(self)
-- UnrealNetwork.CallUnrealRPC(PlayerController, PlayerController, "ServerRPC_ChangeCurrentWeaponId", self.WeaponItemId)
end
function WBP_BagWeaponItem:OnMouseButtonUp(MyGeometry, InTouchEvent)
self.SuperClass:OnMouseButtonUp(MyGeometry, InTouchEvent)
end
function WBP_BagWeaponItem:OnFocusLost(InFocusEvent)
return WBP_BagWeaponItem.SuperClass:OnFocusLost(InFocusEvent)
end
-- 当拖拽到该元素上的时候,并释放的时候
function WBP_BagWeaponItem:OnDrop(MyGeometry, PointerEvent, Operation)
local Data = Operation:GetItemData()
if Data == nil then
print(string.format("[WBP_BagWeaponItem:OnDrop] 有问题,请检查一下"))
return
end
self:SetDragData(Data)
self.SuperClass:OnDrop(MyGeometry, PointerEvent, Operation)
end
-- 数据类型 {ItemID, 1} -- 数量为1
function WBP_BagWeaponItem:SetDragData(InData)
self:AddFittingItem(InData.ItemID)
end
-- 这是客户端设置武器
function WBP_BagWeaponItem:SetWeaponId(InId, bIsNewAdd)
self.WeaponItemId = InId
local Data = GameDataManager.GetWeaponConstructDataByID(InId)
if Data == nil then
UE.Log("[WBP_BagWeaponItem:SetWeaponId] Data is nil")
return
end
if Data.Icon ~= nil then
self.Image_WeaponIcon:SetBrushFromTexture(Data.Icon)
end
self.TextBlock_WeaponName:SetText(Tables.WeaponClassTypeDesc[Data.WeaponType][1])
self.TextBlock_Desc:SetText(DropItemMap.WeaponTable[Data.WeaponType].Text)
-- 从武器组件中读取对应数据
self:RefreshFittings()
end
function WBP_BagWeaponItem:GetWeaponComponent()
local PlayerController = STExtraGameplayStatics.GetFirstPlayerController(self)
if PlayerController then
local OwningPawn = PlayerController:GetPlayerCharacterSafety()
if OwningPawn then
local WC = OwningPawn:GetWeaponComponent()
if WC ~= nil and UE.IsValid(WC) then
self.WeaponComponent = WC
end
end
end
end
function WBP_BagWeaponItem:RefreshFittings()
local PlayerState = GameDataManager.GetLocalPlayerState()
if PlayerState == nil then
print(string.format("[WBP_BagWeaponItem:RefreshFittings] 没有 PlayerState请检查一下"))
return
end
print(string.format("[WBP_BagWeaponItem:RefreshFittings] 当前的Id = %d", self.WeaponItemId))
local Val = PlayerState:GetWeaponFittingsById(self.WeaponItemId)
self.Fittings = TableHelper.DeepCopyTable(Val)
self:SetFittingList(self.Fittings)
end
function WBP_BagWeaponItem:SetFittingList(InDataArr)
print(string.format("[WBP_BagWeaponItem:SetFittingList] 开始设置 Fitting List"))
self:HideFittingList()
-- 注意,从左往右依次是
for i = 1, #InDataArr do
local ItemId = InDataArr[i]
self:SetFittingItem(ItemId)
end
end
function WBP_BagWeaponItem:HideFittingList()
for i = 1, 5 do
self.CanvasPanel_Fittings:GetChildAt(i - 1):SetItemHidden()
end
end
function WBP_BagWeaponItem:AddFittingItem(InItemId)
print(string.format("[WBP_BagWeaponItem:AddFittingItem] 开始添加配件 %d", InItemId))
local PC = STExtraGameplayStatics.GetFirstPlayerController(self)
UnrealNetwork.CallUnrealRPC(PC, PC, "ServerRPC_AddFittingItem", self.WeaponItemId, InItemId)
end
function WBP_BagWeaponItem:SetFittingItem(InItemId)
local ItemType = GetItemTypeByItemId(InItemId)
local Icon = GameDataManager.GetItemInfoByItemID(InItemId).Icon
self.CanvasPanel_Fittings:GetChildAt(ItemType):SetItemIcon(Icon)
self.CanvasPanel_Fittings:GetChildAt(ItemType):SetItemBGColor(GetItemQualityLevel(InItemId))
self.CanvasPanel_Fittings:GetChildAt(ItemType):SetVisibility(ESlateVisibility.Visible)
end
function WBP_BagWeaponItem:RemoveFittingItem(InItemId)
local ItemType = GetItemTypeByItemId(InItemId)
self.CanvasPanel_Fittings:GetChildAt(ItemType):SetVisibility(ESlateVisibility.Collapsed)
end
function WBP_BagWeaponItem:OnClickResetWeapon()
--首先判断有没有足够的石头
local PC = GameDataManager.GetLocalPlayerController()
local Items = PC.ItemMap[EItemType.ScouringStone]
local bFindStone = false
local Count = 0
if Items ~= nil then
for _, v in pairs(Items) do
Count = Count + v
end
end
if Count > 0 then
bFindStone = true
end
if not bFindStone then
UIManager:ShowGeneralNotice("没有足够多的重铸石")
return
end
local PC = GameDataManager.GetLocalPlayerController()
UnrealNetwork.CallUnrealRPC(PC, PC, "ServerRPC_ResetWeapon", self.WeaponItemId)
end
return WBP_BagWeaponItem;