From 9dcb6460c213603f88931d36d42eb1b148172bd5 Mon Sep 17 00:00:00 2001 From: Hermanest Date: Thu, 19 Dec 2024 18:25:48 +0300 Subject: [PATCH] Fixed overlapping toys in the bonus section. --- Source/3_AssetBundle/Christmas/ChristmasTree.cs | 1 + Source/8_UI/Christmas/ChristmasOrnamentsPool.cs | 1 + Source/8_UI/Christmas/ChristmasTreeOrnament.cs | 2 ++ Source/8_UI/Christmas/TreeEditor/OrnamentStoreCell.cs | 11 +++++++++-- 4 files changed, 13 insertions(+), 2 deletions(-) diff --git a/Source/3_AssetBundle/Christmas/ChristmasTree.cs b/Source/3_AssetBundle/Christmas/ChristmasTree.cs index 7cc35d70..d3fe976e 100644 --- a/Source/3_AssetBundle/Christmas/ChristmasTree.cs +++ b/Source/3_AssetBundle/Christmas/ChristmasTree.cs @@ -132,6 +132,7 @@ private async Task LoadOrnaments(ChristmasTreeSettings settings) { var tasks = new Task[size]; foreach (var ornament in _ornaments) { + ornament.Deinit(); OrnamentsPool.Despawn(ornament); } _ornaments.Clear(); diff --git a/Source/8_UI/Christmas/ChristmasOrnamentsPool.cs b/Source/8_UI/Christmas/ChristmasOrnamentsPool.cs index 38174fd8..419bdde4 100644 --- a/Source/8_UI/Christmas/ChristmasOrnamentsPool.cs +++ b/Source/8_UI/Christmas/ChristmasOrnamentsPool.cs @@ -34,6 +34,7 @@ public ChristmasTreeOrnament Spawn(int id) { } public void Despawn(ChristmasTreeOrnament ornament) { + ornament.OrnamentDeinitEvent -= Despawn; var cache = GetCache(ornament.BundleId); cache.Push(ornament); } diff --git a/Source/8_UI/Christmas/ChristmasTreeOrnament.cs b/Source/8_UI/Christmas/ChristmasTreeOrnament.cs index ec70953a..945c7dd2 100644 --- a/Source/8_UI/Christmas/ChristmasTreeOrnament.cs +++ b/Source/8_UI/Christmas/ChristmasTreeOrnament.cs @@ -48,6 +48,8 @@ public void Deinit() { _grabbed = false; _hovered = false; gameObject.SetActive(false); + OrnamentDeinitEvent = null; + OrnamentGrabbedEvent = null; } private void Awake() { diff --git a/Source/8_UI/Christmas/TreeEditor/OrnamentStoreCell.cs b/Source/8_UI/Christmas/TreeEditor/OrnamentStoreCell.cs index ced4c789..72233708 100644 --- a/Source/8_UI/Christmas/TreeEditor/OrnamentStoreCell.cs +++ b/Source/8_UI/Christmas/TreeEditor/OrnamentStoreCell.cs @@ -1,4 +1,5 @@ -using BeatLeader.Models; +using System.Threading; +using BeatLeader.Models; using BeatLeader.UI.MainMenu; using BeatSaberMarkupLanguage; using BeatSaberMarkupLanguage.Components; @@ -21,6 +22,8 @@ internal class OrnamentStoreCell : MonoBehaviour { private int _bundleId; private MapDetail? _song = null; + + private readonly SemaphoreSlim _semaphore = new(1, 1); public void Setup(ChristmasOrnamentPool pool, GameObject parent) { _pool = pool; @@ -65,6 +68,8 @@ public async void SetOrnamentStatus(DailyTreeStatus status) { } public async void SetBonusOrnamentStatus(BonusOrnament status) { + await _semaphore.WaitAsync(); + _bundleId = status.bundleId; await _pool.PreloadAsync(status.bundleId); ReloadNextInstance(true); @@ -74,6 +79,8 @@ public async void SetBonusOrnamentStatus(BonusOrnament status) { if (status.description.Length > 0) { _hint.text = status.description; } + + _semaphore.Release(); } private void Awake() { @@ -103,7 +110,7 @@ private void ReloadNextInstance(bool despawn = false) { _previewInstance.Deinit(); _pool.Despawn(_previewInstance); } - + _previewInstance = _pool.Spawn(_bundleId); _previewInstance.transform.SetParent(transform, false); _previewInstance.transform.localPosition = new Vector3(0.0f, 2.5f, 0.0f);