189 lines
5.9 KiB
Lua
189 lines
5.9 KiB
Lua
---@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; |