UGCProjects/SoloKing/Script/UI/GameRecord/WB_WeaponProficiencyPanel.lua

246 lines
9.4 KiB
Lua
Raw Normal View History

2025-01-04 23:00:19 +08:00
---@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 = {};
2025-01-21 11:29:14 +08:00
--UGCLogSystem.Log("[WB_WeaponProficiencyPanel:UpdateRepSelectWeapons] InList = " .. InList);
UGCLogSystem.LogTree(string.format("[WB_WeaponProficiencyPanel:UpdateRepSelectWeapons] InList ="), InList);
2025-01-04 23:00:19 +08:00
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;
2025-01-21 11:29:14 +08:00
local HeavyHit = SelectWeapons[WeaponID].HeavyHit or 0;
local ShootCount = SelectWeapons[WeaponID].ShootCount or 0;
2025-01-04 23:00:19 +08:00
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,
};
2025-01-21 11:29:14 +08:00
2025-01-04 23:00:19 +08:00
-- 计算熟练度的方法
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