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