---@class WB_WeaponProficiencyPanel_C:UUserWidget ---@field ComboBoxString_WeaponType UComboBoxString ---@field HorizontalBox_TopWeapons UHorizontalBox ---@field ScrollBox_AllWeaponProficiency UScrollBox ---@field WB_SortType_C_AllDamage UWB_SortType_C ---@field WB_SortType_C_CriticalHitRate UWB_SortType_C ---@field WB_SortType_C_CriticalStrikeCount UWB_SortType_C ---@field WB_SortType_C_MatchNumber UWB_SortType_C ---@field WB_SortType_C_WinRate UWB_SortType_C ---@field WB_SortType_Proficiency UWB_SortType_C --Edit Below-- local WB_WeaponProficiencyPanel = { bInitDoOnce = false; ShowWeaponSubTypeID = -1; AllWeaponProficiency = {}; } function WB_WeaponProficiencyPanel:Construct() self:LuaInit(); end function WB_WeaponProficiencyPanel:LuaInit() if self.bInitDoOnce then return ; end self.bInitDoOnce = true; self.ProficiencyTypeItems = { [EWeaponProficiencyType.Proficiency] = self.WB_SortType_Proficiency, [EWeaponProficiencyType.MatchNumber] = self.WB_SortType_C_MatchNumber, [EWeaponProficiencyType.WinRate] = self.WB_SortType_C_WinRate, [EWeaponProficiencyType.CriticalStrikeCount] = self.WB_SortType_C_CriticalStrikeCount, [EWeaponProficiencyType.CriticalHitRate] = self.WB_SortType_C_CriticalHitRate, [EWeaponProficiencyType.AllDamage] = self.WB_SortType_C_AllDamage, }; -- 初始化选项 for i, v in pairs(self.ProficiencyTypeItems) do v:LuaInit() v:SetName(WeaponProficiencyName[i]) v:SetIndex(i) v:BindClickSelect(self.ChangeSortType, self) end -- 初始化筛选栏 self.ComboBoxString_WeaponType:AddOption("全部") local WeaponTypeSort = {} for i, v in pairs(WeaponTypeSuffixName) do WeaponTypeSort[#WeaponTypeSort + 1] = i end table.sort(WeaponTypeSort) for i, v in pairs(WeaponTypeSort) do self.ComboBoxString_WeaponType:AddOption(WeaponTypeSuffixName[v]) end UITool.BindComboBoxStringOnSelectionChanged(self.ComboBoxString_WeaponType, self.SelectionWeaponTypeChanged, self) self.ComboBoxString_WeaponType:SetSelectedOption("全部") -- 初始化滚动栏数量 local WeaponProficiencyCount = table.getCount(WeaponTable) for i = 1, WeaponProficiencyCount do local WeaponProficiencyItem = nil if i > self.ScrollBox_AllWeaponProficiency:GetChildrenCount() then WeaponProficiencyItem = UserWidget.NewWidgetObjectBP(LocalPlayerController, self:GetWeaponProficiencyItemClass()) self.ScrollBox_AllWeaponProficiency:AddChild(WeaponProficiencyItem) WeaponProficiencyItem:SetVisibility(ESlateVisibility.Collapsed) else WeaponProficiencyItem = self.ScrollBox_AllWeaponProficiency:GetChildAt(i - 1) end WeaponProficiencyItem:ChangeBG(i) end UGCEventSystem.AddListener(EventTypes.AllSelectWeaponsAlready, self.UpdateRepSelectWeapons, self) UGCLogSystem.Log("[WB_WeaponProficiencyPanel:LuaInit] 更新玩家历史数据") self:OnShowPanel(); end function WB_WeaponProficiencyPanel:OnShowPanel() if ArchiveTable[LocalPlayerKey] == nil then return end if table.isEmpty(ArchiveTable[LocalPlayerKey].SelectWeapons) then return end self:UpdateRepSelectWeapons(ArchiveTable[LocalPlayerKey].SelectWeapons); end function WB_WeaponProficiencyPanel:GetWeaponProficiencyItemClass() if not UE.IsValid(self.ItemClass) then self.ItemClass = UE.LoadClass(UGCGameSystem.GetUGCResourcesFullPath('Asset/UI/GameRecord/WB_WeaponProficiency.WB_WeaponProficiency_C')) end return self.ItemClass end ---@param InAllWeaponProficiency "table:{[WeaponID] = {EWeaponProficiencyType.Type = number, ...}, ...} " function WB_WeaponProficiencyPanel:UpdateWeaponProficiencyInfo(InAllWeaponProficiency) self.AllWeaponProficiency = InAllWeaponProficiency for WeaponID, WeaponProficiencyInfo in pairs(self.AllWeaponProficiency) do -- 校验熟练度 self.AllWeaponProficiency[WeaponID] = WeaponProficiencyDataCheck(WeaponProficiencyInfo) -- 计算并保存熟练度 self.AllWeaponProficiency[WeaponID][EWeaponProficiencyType.Proficiency] = WeaponProficiencyCalculation(self.AllWeaponProficiency[WeaponID]) end self:UpdateTopWeaponProficiency() self:ChangeSortType(EWeaponProficiencyType.Proficiency, true) end -- 筛选武器类型 function WB_WeaponProficiencyPanel:SelectionWeaponTypeChanged(InSelectString) local SubTypeID = WeaponTypeNameMappingSubTypeID[InSelectString] if SubTypeID then self.ShowWeaponSubTypeID = SubTypeID else self.ShowWeaponSubTypeID = -1 end -- 刷新显示的武器熟练度信息 self:UpdateShowWeaponProficiency() end function WB_WeaponProficiencyPanel:SetSelectSortType(InType, IsAscendingOrder) self.IsAscendingOrder = IsAscendingOrder self.SortType = InType for i, v in pairs(self.ProficiencyTypeItems) do if InType == v:GetIndex() then v:SetSelect(true) v:SetAscendingOrder(self.IsAscendingOrder) else v:SetSelect(false) end end end -- 获取当前参与显示的武器ID function WB_WeaponProficiencyPanel:GetNowShowWeapons() local Res = {} local IsShowAllWeapon = (self.ShowWeaponSubTypeID < 0) for WeaponID, v in pairs(self.AllWeaponProficiency) do if IsShowAllWeapon or WeaponID // 1000 == self.ShowWeaponSubTypeID then Res[#Res + 1] = WeaponID end end return Res end --- 切换排序类型 ---@param IsUpdateInfo bool 是否为table信息刷新 function WB_WeaponProficiencyPanel:ChangeSortType(InSortType, IsUpdateInfo) if IsUpdateInfo or self.SortType ~= InSortType then self:SetSelectSortType(InSortType, false) else self:SetSelectSortType(InSortType, not self.IsAscendingOrder) end -- 刷新显示的武器熟练度信息 self:UpdateShowWeaponProficiency() end --- 刷新显示的武器熟练度信息 function WB_WeaponProficiencyPanel:UpdateShowWeaponProficiency() local AllShowWeaponIDs = self:GetNowShowWeapons() table.sort(AllShowWeaponIDs, function(a, b) if self.IsAscendingOrder then return self.AllWeaponProficiency[a][self.SortType] < self.AllWeaponProficiency[b][self.SortType] else return self.AllWeaponProficiency[a][self.SortType] > self.AllWeaponProficiency[b][self.SortType] end end) for i = 1, self.ScrollBox_AllWeaponProficiency:GetChildrenCount() do local Item = self.ScrollBox_AllWeaponProficiency:GetChildAt(i - 1) local WeaponID = AllShowWeaponIDs[i] if WeaponID then Item:SetWeaponID(WeaponID) Item:SetWeaponProficiencyInfo(self.AllWeaponProficiency[WeaponID]) Item:SetVisibility(ESlateVisibility.SelfHitTestInvisible) else Item:SetVisibility(ESlateVisibility.Collapsed) end end end function WB_WeaponProficiencyPanel:UpdateTopWeaponProficiency() -- 这里可以优化一下但是懒得写 local AllWeapons = {} for i, v in pairs(self.AllWeaponProficiency) do AllWeapons[#AllWeapons + 1] = i end table.sort(AllWeapons, function(a, b) return self.AllWeaponProficiency[a][EWeaponProficiencyType.Proficiency] > self.AllWeaponProficiency[b][EWeaponProficiencyType.Proficiency] end) for i = 1, self.HorizontalBox_TopWeapons:GetChildrenCount() do local Item = self.HorizontalBox_TopWeapons:GetChildAt(i - 1) local WeaponID = AllWeapons[i] if WeaponID then Item:SetWeaponID(WeaponID) Item:SetWeaponProficiencyInfo(self.AllWeaponProficiency[WeaponID]) Item:SetVisibility(ESlateVisibility.SelfHitTestInvisible) else Item:SetVisibility(ESlateVisibility.Hidden) end end end function WB_WeaponProficiencyPanel:UpdateRepSelectWeapons(InList) if table.isEmpty(InList) then return ; end local SelectWeapons = {}; --UGCLogSystem.Log("[WB_WeaponProficiencyPanel:UpdateRepSelectWeapons] InList = " .. InList); UGCLogSystem.LogTree(string.format("[WB_WeaponProficiencyPanel:UpdateRepSelectWeapons] InList ="), InList); for WeaponID, List in pairs(InList) do SelectWeapons[WeaponID] = UE.MakeSelectWeapon(List); end UGCLogSystem.LogTree(string.format("[WB_WeaponProficiencyPanel:UpdateRepSelectWeapons] SelectWeapons ="), SelectWeapons) local AllWeaponInfo = {}; for WeaponID, v in pairs(WeaponTable) do if SelectWeapons[WeaponID] then local UseCount = SelectWeapons[WeaponID].UseCount or 0; local HeavyHit = SelectWeapons[WeaponID].HeavyHit or 0; local ShootCount = SelectWeapons[WeaponID].ShootCount or 0; AllWeaponInfo[WeaponID] = { [EWeaponProficiencyType.MatchNumber] = UseCount, [EWeaponProficiencyType.WinRate] = (SelectWeapons[WeaponID].WinCount or 0) / (UseCount == 0 and 1 or UseCount), [EWeaponProficiencyType.CriticalStrikeCount] = HeavyHit, [EWeaponProficiencyType.CriticalHitRate] = HeavyHit / (ShootCount == 0 and 1 or ShootCount), [EWeaponProficiencyType.AllDamage] = SelectWeapons[WeaponID].TotalDamage or 0, }; -- 计算熟练度的方法 AllWeaponInfo[WeaponID][EWeaponProficiencyType.Proficiency] = WeaponProficiencyCalculation(AllWeaponInfo[WeaponID]); else AllWeaponInfo[WeaponID] = { [EWeaponProficiencyType.Proficiency] = 0, [EWeaponProficiencyType.MatchNumber] = 0, [EWeaponProficiencyType.WinRate] = 0, [EWeaponProficiencyType.CriticalStrikeCount] = 0, [EWeaponProficiencyType.CriticalHitRate] = 0, [EWeaponProficiencyType.AllDamage] = 0, } end end self:UpdateWeaponProficiencyInfo(AllWeaponInfo); end -- function WB_WeaponProficiencyPanel:Tick(MyGeometry, InDeltaTime) -- end -- function WB_WeaponProficiencyPanel:Destruct() -- end return WB_WeaponProficiencyPanel