246 lines
9.4 KiB
Lua
246 lines
9.4 KiB
Lua
---@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 |