---@class WBP_ForceGuide_Backpack_C:UUserWidget ---@field Button_Item UButton ---@field Button_UseSkill UButton ---@field HorizontalBox_ItemList UHorizontalBox ---@field Image_Icon_1 UImage ---@field Image_Icon_2 UImage ---@field Image_Icon_3 UImage ---@field Image_Icon_4 UImage ---@field Item_1 UCanvasPanel ---@field Item_2 UCanvasPanel ---@field Item_3 UCanvasPanel ---@field Item_4 UCanvasPanel ---@field ItemBG_1 UCanvasPanel ---@field ItemBG_2 UCanvasPanel ---@field ItemBG_3 UCanvasPanel ---@field ItemBG_4 UCanvasPanel ---@field ItemText_1 UCanvasPanel ---@field ItemText_2 UCanvasPanel ---@field ItemText_3 UCanvasPanel ---@field ItemText_4 UCanvasPanel ---@field Panel_Backpack UCanvasPanel ---@field Panel_BG UWBP_WidgetHeader_C ---@field Panel_SkillSlot UCanvasPanel ---@field SkillBtn_Slot1 UWBP_SkillBtn_Item_C ---@field SkillBtn_Slot2 UWBP_SkillBtn_Item_C ---@field SkillBtn_Slot3 UWBP_SkillBtn_Item_C ---@field TextBlock_Count_1 UTextBlock ---@field TextBlock_Count_2 UTextBlock ---@field TextBlock_Count_3 UTextBlock ---@field TextBlock_Count_4 UTextBlock ---@field TextBlock_ItemType_1 UTextBlock ---@field TextBlock_ItemType_2 UTextBlock ---@field TextBlock_ItemType_3 UTextBlock ---@field TextBlock_ItemType_4 UTextBlock ---@field TextBlock_Quality_1 UTextBlock ---@field TextBlock_Quality_2 UTextBlock ---@field TextBlock_Quality_3 UTextBlock ---@field TextBlock_Quality_4 UTextBlock ---@field TextBlock_SkillItem_Tips UTextBlock ---@field TextBlock_Tip_Slot1 UTextBlock ---@field TextBlock_Tip_Slot2 UTextBlock ---@field TextBlock_Tip_Slot3 UTextBlock ---@field Tips_Item UCanvasPanel ---@field Tips_Slot1 UCanvasPanel ---@field Tips_Slot2 UCanvasPanel ---@field Tips_Slot3 UCanvasPanel ---@field Tips_UseSkill UCanvasPanel ---@field UseSkill UCanvasPanel ---@field WidgetSwitcher_BG_1 UWidgetSwitcher ---@field WidgetSwitcher_BG_2 UWidgetSwitcher ---@field WidgetSwitcher_BG_3 UWidgetSwitcher ---@field WidgetSwitcher_BG_4 UWidgetSwitcher --Edit Below-- local WBP_ForceGuide_Backpack = { bInitDoOnce = false, CurUseSkillTimes = 0, --已装备技能次数 }; function WBP_ForceGuide_Backpack:OnStartGuideProgress() self:SetVisibility(ESlateVisibility.SelfHitTestInvisible) self.Panel_Backpack:SetVisibility(ESlateVisibility.SelfHitTestInvisible) self.Panel_BG:Construct() self.PendingEndGuide = false self.OwningPawn = GameDataManager.GetLocalPlayerPawn() self.OwningPC = GameDataManager.GetLocalPlayerController() self:UpdateItemMap(false) self.CurUseSkillTimes = 0 self.Panel_SkillSlot:SetVisibility(ESlateVisibility.Collapsed) self.Button_Item.OnClicked:Add(self.OnItemClicked, self) self.Button_UseSkill.OnClicked:Add(self.OnUseSkillClicked, self) EventSystem:SendEvent(EventType.ForceGuide_OnGuideTriggered, 7) end function WBP_ForceGuide_Backpack:OnEndGuideProgress() self:SetVisibility(ESlateVisibility.Collapsed) EventSystem:RemoveListener(EventType.OnSetupSkillButton, WBP_ForceGuide_Backpack.OnSetupSkillButton, self) EventSystem:RemoveListener(EventType.PlayerSkillCDTriggered, WBP_ForceGuide_Backpack.OnSkillCDTriggered, self) self.Button_Item.OnClicked:Remove(self.OnItemClicked, self) self.Button_UseSkill.OnClicked:Remove(self.OnUseSkillClicked, self) EventSystem:SendEvent(EventType.ForceGuide_OnGuideFinished, 7) end function WBP_ForceGuide_Backpack:UpdateItemMap(IsBackpackPanelInViewPort) local ItemMap = self.OwningPC:GetItemMapByItemType(EItemType.SkillBook) local ItemList = {} for ID, Count in pairs(ItemMap) do local Item = { ItemID = ID, Count = Count, } table.insert(ItemList, Item) end self.ItemList = {} local ActiveSkillData = nil local RaySkillData = nil for i = 1, table.getCount(ItemList) do local Data = ItemList[i] local SkillName = GameDataManager.GetSkillNameById(Data.ItemID) local SkillLevel = GameDataManager.GetSkillLevelById(Data.ItemID) local Type = GameDataManager.GetSkillTypeByName(SkillName) if Type == ESkillType.Active and ActiveSkillData == nil then ActiveSkillData = Data end if Type == ESkillType.Passive and SkillName == ESkillName.Ray and SkillLevel == 4 and RaySkillData == nil then RaySkillData = Data end end if ActiveSkillData ~= nil then table.insert(self.ItemList, ActiveSkillData) end if RaySkillData ~= nil then table.insert(self.ItemList, 1, RaySkillData) end if ActiveSkillData == nil and RaySkillData == nil then return end self:UpdateDisplayedItemList(self.ItemList) end function WBP_ForceGuide_Backpack:SetupItemDatas(ItemList) for i = 1, 4 do local IndexStr = tostring(i) local ItemData = ItemList[i] if ItemData then self["Item_"..IndexStr]:SetVisibility(ESlateVisibility.SelfHitTestInvisible) self["ItemText_"..IndexStr]:SetVisibility(ESlateVisibility.SelfHitTestInvisible) self["ItemBG_"..IndexStr]:SetVisibility(ESlateVisibility.SelfHitTestInvisible) self:SetItemData(i, ItemData) else self["Item_"..IndexStr]:SetVisibility(ESlateVisibility.Collapsed) end end end function WBP_ForceGuide_Backpack:SetItemData(Index, InData) local IndexStr = tostring(Index) local ItemInfo = GameDataManager.GetItemInfoByItemID(InData.ItemID) local Quality = GetItemQualityLevel(InData.ItemID) UIManager.LoadTexture(self["Image_Icon_"..IndexStr], ItemInfo.Icon) self["WidgetSwitcher_BG_"..IndexStr]:SetActiveWidgetIndex(Quality) self["TextBlock_Quality_"..IndexStr]:SetText(Tables.QualityInfo[Quality][1]) self["TextBlock_ItemType_"..IndexStr]:SetText(DropItemMap.SkillItemMap[InData.ItemID].SkillName) self["TextBlock_Count_"..IndexStr]:SetText(tostring(InData.Count)) end function WBP_ForceGuide_Backpack:UpdateDisplayedItemList(ItemList) self:SetupItemDatas(ItemList) self.UseSkill:SetVisibility(ESlateVisibility.Collapsed) if not table.isEmpty(ItemList) then self.Tips_Item:SetVisibility(ESlateVisibility.SelfHitTestInvisible) if self.CurUseSkillTimes < 1 then self.TextBlock_SkillItem_Tips:SetText("您已获得一个新技能\n点击装备它吧") else self.TextBlock_SkillItem_Tips:SetText("还有一个技能\n同样装备上吧") end else self.Tips_Item:SetVisibility(ESlateVisibility.Collapsed) end end function WBP_ForceGuide_Backpack:OnItemClicked() if table.isEmpty(self.ItemList) then return end local ItemData = self.ItemList[1] if ItemData == nil then return end self.Tips_Item:SetVisibility(ESlateVisibility.Collapsed) self.UseSkill:SetVisibility(ESlateVisibility.SelfHitTestInvisible) self.Tips_UseSkill:SetVisibility(ESlateVisibility.HitTestInvisible) end function WBP_ForceGuide_Backpack:OnUseSkillClicked() if table.isEmpty(self.ItemList) then return end local ItemData = self.ItemList[1] if ItemData == nil then return end self.Tips_UseSkill:SetVisibility(ESlateVisibility.Collapsed) local PC = GameDataManager.GetLocalPlayerController() local SkillName = GameDataManager.GetSkillNameById(ItemData.ItemID) local SkillLevel = GameDataManager.GetSkillLevelById(ItemData.ItemID) UnrealNetwork.CallUnrealRPC(PC, PC, "ServerRPC_GiveSkill", SkillName, self.CurUseSkillTimes + 1, SkillLevel) table.remove(self.ItemList, 1) self:UpdateDisplayedItemList(self.ItemList) self.CurUseSkillTimes = self.CurUseSkillTimes + 1 if self.CurUseSkillTimes >= 2 then self.Panel_Backpack:SetVisibility(ESlateVisibility.Collapsed) self:SetupSkillButton() end end function WBP_ForceGuide_Backpack:SetupSkillButton() self.Panel_SkillSlot:SetVisibility(ESlateVisibility.SelfHitTestInvisible) self.SkillButtons = { [ESkillSlot.Slot1] = self.SkillBtn_Slot1, [ESkillSlot.Slot2] = self.SkillBtn_Slot2, [ESkillSlot.Slot3] = self.SkillBtn_Slot3, } self.SkillsMapping = { [ESkillSlot.Slot1] = -1, [ESkillSlot.Slot2] = -1, [ESkillSlot.Slot3] = -1, } for _, Button in pairs(self.SkillButtons) do if Button then Button:Show() end end local LocalPC = GameDataManager.GetLocalPlayerController() if UE.IsValid(LocalPC) then for Slot, SkillInfo in pairs(LocalPC.ActiveSkillNameList) do self:OnSetupSkillButton(SkillInfo.SkillName, Slot, SkillInfo.SkillLevel) end end EventSystem:AddListener(EventType.OnSetupSkillButton, WBP_ForceGuide_Backpack.OnSetupSkillButton, self) EventSystem:AddListener(EventType.PlayerSkillCDTriggered, WBP_ForceGuide_Backpack.OnSkillCDTriggered, self) end function WBP_ForceGuide_Backpack:OnSetupSkillButton(SkillName, SkillSlot, SkillLevel) self.SkillsMapping[SkillSlot] = SkillName local Button = self.SkillButtons[SkillSlot] if Button then Button:Show() Button:SetupSkillButton(SkillName, SkillLevel) self["Tips_Slot"..tostring(SkillSlot)]:SetVisibility(ESlateVisibility.HitTestInvisible) if Button.IsPassiveSkill then self["TextBlock_Tip_Slot"..tostring(SkillSlot)]:SetText("技能图标灰色为被动技能\n达到条件自动施放") else self["TextBlock_Tip_Slot"..tostring(SkillSlot)]:SetText("点击施放主动技能") end end end function WBP_ForceGuide_Backpack:OnSkillCDTriggered(Slot, CD) local Button = self:GetSkillButtonBySlot(Slot) if Button then UE.Log("[WBP_ForceGuide_Backpack:OnSkillCDTriggered] Slot=%d, CD=%.2f", Slot, CD) Button:OnSkillCD(Slot, CD) if CD > 1.0 then if self.PendingEndGuide then return end self.PendingEndGuide = true if self.Timer ~= nil then EventSystem.StopTimer(self.Timer) end self.Timer = EventSystem.SetTimer(self, function() self:OnEndGuideProgress() ---结束本阶段引导 EventSystem.StopTimer(self.Timer) self.Timer = nil end, 0.5) end end end function WBP_ForceGuide_Backpack:GetSkillButtonBySlot(InSkillSlot) return self.SkillButtons[InSkillSlot] end return WBP_ForceGuide_Backpack;