170 lines
6.9 KiB
Lua
Raw Normal View History

2025-01-04 23:00:19 +08:00
---@class WB_SelectMiniGame_C:UUserWidget
---@field Button_SelectMap UButton
---@field HorizontalBox_PlayerReadys UHorizontalBox
---@field TextBlock_Desc UTextBlock
---@field TextBlock_MiniGameName UTextBlock
---@field TextBlock_SelectTime UTextBlock
---@field UniformGridPanel_Items UUniformGridPanel
---@field WidgetSwitcher_IsSelected UWidgetSwitcher
--Edit Below--
local WB_SelectMiniGame = {
bInitDoOnce = false;
ItemsCol = 5;
SelectedMaps = {};
bCanClickSelect = true;
};
function WB_SelectMiniGame:Construct()
WidgetLibrary.BindButtonClicked(self.Button_SelectMap, self.ClickSelect, self)
WidgetLibrary.TextBlockBindingPropertyText(self.TextBlock_SelectTime, self.UpdateSelectTime, self)
UGCEventSystem.AddListener(EventEnum.SelectMiniGameCallBack, self.SelectMiniGameCallBack, self)
UGCEventSystem.AddListener(EventEnum.UpdatePlayerScoreData, self.UpdatePlayerHead, self)
UGCEventSystem.AddListener(ArchiveDataConfig.GetParamNotifyEvent(ArchiveDataConfig.EArchiveType.MapStar), self.UpdateStarCount, self)
self:InitMiniGameItem()
self:UpdatePlayerHead()
self:ItemSelectMiniGame(math.max(table.unpack(table.getKeys(MiniGameConfig.MiniGameInfo))))
-- Test
-- UGCEventSystem.SetTimerLoop(self, self.UpdateStarCount, 0.5)
end
function WB_SelectMiniGame:UpdateSelectTime()
return tostring(UGCGameSystem.GameState.WaitPlayerJoinTime)
end
function WB_SelectMiniGame:GetItemClass()
if self.ItemClass == nil then
self.ItemClass = UE.LoadClass(UGCGameSystem.GetUGCResourcesFullPath('Asset/UI/StatusUI/MiniGame/MiniGameSelect/WB_MiniGameItem.WB_MiniGameItem_C'))
end
return self.ItemClass
end
function WB_SelectMiniGame:InitMiniGameItem()
local Index = 0
local MiniGameTypes = table.getKeys(MiniGameConfig.MiniGameInfo)
table.sort(MiniGameTypes, function(a, b) return a > b end)
UGCLogSystem.LogTree("[WB_SelectMiniGame_InitMiniGameItem] MiniGameTypes", MiniGameTypes)
local PlayerStarCount = ArchiveDataConfig.GetPlayerArchiveDataFromType(UGCSystemLibrary.GetLocalPlayerKey(), ArchiveDataConfig.EArchiveType.MapStar)
if PlayerStarCount == nil then PlayerStarCount = {} end
for _, MiniGameType in pairs(MiniGameTypes) do
local ItemInst = UserWidget.NewWidgetObjectBP(UGCSystemLibrary.GetLocalPlayerController(), self:GetItemClass())
self.UniformGridPanel_Items:AddChild(ItemInst)
local TargetUniformGridSlot = WidgetLayoutLibrary.SlotAsUniformGridSlot(ItemInst)
-- 居中
TargetUniformGridSlot:SetVerticalAlignment(EVerticalAlignment.VAlign_Center)
TargetUniformGridSlot:SetHorizontalAlignment(EHorizontalAlignment.HAlign_Center)
-- 设置索引
TargetUniformGridSlot:SetColumn(Index % self.ItemsCol)
TargetUniformGridSlot:SetRow(math.floor(Index / self.ItemsCol))
-- 初始化
ItemInst:Init(MiniGameType, self.ItemSelectMiniGame, self)
ItemInst:UpdateStarCount(PlayerStarCount[MiniGameType])
Index = Index + 1
end
end
function WB_SelectMiniGame:UpdatePlayerHead()
local OnlinePlayerKeys = UGCGameSystem.GameState:GetPlayerPersonalKeys()
--table.sort(OnlinePlayerKeys, function(a, b) return a > b end)
--for i = 1, self.HorizontalBox_PlayerReadys:GetChildrenCount() do
-- local Item = self.HorizontalBox_PlayerReadys:GetChildAt(i - 1)
-- Item:InitPlayerReady(OnlinePlayerKeys[i])
--end
if OnlinePlayerKeys then
local NullPlayerKeyItem = {}
for i = 1, self.HorizontalBox_PlayerReadys:GetChildrenCount() do
local Item = self.HorizontalBox_PlayerReadys:GetChildAt(i - 1)
Item:ResetIsReady()
local PlayerKey = Item:GetPlayerKey()
if PlayerKey == nil or not table.hasValue(OnlinePlayerKeys, PlayerKey) then
NullPlayerKeyItem[#NullPlayerKeyItem + 1] = Item
Item:InitPlayerReady(nil)
else
table.removeValue(OnlinePlayerKeys, PlayerKey)
end
end
for i, v in pairs(OnlinePlayerKeys) do
if NullPlayerKeyItem[i] then
NullPlayerKeyItem[i]:InitPlayerReady(v)
end
end
self:UpdateStarCount()
end
end
function WB_SelectMiniGame:ItemSelectMiniGame(InMiniGameType)
SoundSystem.PlaySound(SoundSystem.ESound.Click)
local MiniGameInfo = MiniGameConfig.MiniGameInfo[InMiniGameType]
if MiniGameInfo then
self.SelectGameType = InMiniGameType
self.TextBlock_Desc:SetText(MiniGameInfo.DescText)
for i = 1, self.UniformGridPanel_Items:GetChildrenCount() do
local Item = self.UniformGridPanel_Items:GetChildAt(i - 1)
Item:SelectType(InMiniGameType)
end
end
end
function WB_SelectMiniGame:ClickSelect()
if self.bCanClickSelect then
self.bCanClickSelect = false
UGCEventSystem.SetTimer(self, function() self.bCanClickSelect = true end, 0.5)
if not self.IsSelected then
if table.hasValue(self.SelectedMaps, self.SelectGameType) then
UGCEventSystem.SendEvent(EventEnum.AddTip, TipConfig.TipType.MiniGameIsSelected)
else
UGCSendRPCSystem.ActorRPCNotify(nil, UGCGameSystem.GameState, "PlayerSelectMiniGame", self.SelectGameType, UGCSystemLibrary.GetLocalPlayerKey())
end
end
end
end
function WB_SelectMiniGame:SelectMiniGameCallBack(IsSucceed, InMiniGameType, InPlayerKey)
if IsSucceed then
self.SelectedMaps[#self.SelectedMaps + 1] = InMiniGameType
if InPlayerKey == UGCSystemLibrary.GetLocalPlayerKey() then
self.IsSelected = true
self.WidgetSwitcher_IsSelected:SetActiveWidgetIndex(1)
UGCEventSystem.SendEvent(EventEnum.AddTip, TipConfig.TipType.SelectedMiniGameSucceed)
end
else
SoundSystem.PlaySound(SoundSystem.ESound.Click)
UGCEventSystem.SendEvent(EventEnum.AddTip, TipConfig.TipType.MiniGameIsSelected)
end
end
function WB_SelectMiniGame:UpdateStarCount()
for i = 1, self.HorizontalBox_PlayerReadys:GetChildrenCount() do
local Item = self.HorizontalBox_PlayerReadys:GetChildAt(i - 1)
local PlayerKey = Item:GetPlayerKey()
Item:UpdateStarCount(UGCGameSystem.GameState:GetPlayerStar(PlayerKey))
end
local PlayerStarCount = ArchiveDataConfig.GetPlayerArchiveDataFromType(UGCSystemLibrary.GetLocalPlayerKey(), ArchiveDataConfig.EArchiveType.MapStar)
UGCLogSystem.LogTree("[WB_SelectMiniGame_UpdateStarCount] PlayerStarCount:", PlayerStarCount)
if PlayerStarCount == nil then PlayerStarCount = {} end
for i = 1, self.UniformGridPanel_Items:GetChildrenCount() do
local Item = self.UniformGridPanel_Items:GetChildAt(i - 1)
local MiniGameType = Item:GetMiniGameType()
Item:UpdateStarCount(PlayerStarCount[MiniGameType])
end
end
-- function WB_SelectMiniGame:Tick(MyGeometry, InDeltaTime)
-- end
-- function WB_SelectMiniGame:Destruct()
-- end
return WB_SelectMiniGame;