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