From e9d5562684918ffa8b734c2a38b57f83c57ba80d Mon Sep 17 00:00:00 2001 From: Danil Iarosh Date: Tue, 30 Jun 2026 11:11:11 +0300 Subject: [PATCH] Fix infinite recursion crash in BalanceManager on payment pulse MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Исправлена бесконечная рекурсия (StackOverflowException) при синхронизации баланса с кредитами платы. Детали изменений: - В класс BalanceManager добавлен флаг-предохранитель _isSyncingCredits. - Обработчик OnImpulsePaid теперь игнорирует события начисления кредитов, вызванные синхронизацией. - В методе SyncCreditsWithBalance вызов ComSystemManager.SetCredits обернут в блок try-finally для безопасного управления флагом _isSyncingCredits. --- Assets/Scripts/Managers/BalanceManager.cs | 16 ++++++++++++++-- 1 file changed, 14 insertions(+), 2 deletions(-) diff --git a/Assets/Scripts/Managers/BalanceManager.cs b/Assets/Scripts/Managers/BalanceManager.cs index 91e1902..aeb8a28 100644 --- a/Assets/Scripts/Managers/BalanceManager.cs +++ b/Assets/Scripts/Managers/BalanceManager.cs @@ -36,6 +36,7 @@ namespace RR.Common.Managers private int _startGameCost = 10; private int _continueGameCost = 5; private bool _freeGame; + private bool _isSyncingCredits; private void Awake() { @@ -143,6 +144,9 @@ namespace RR.Common.Managers /// private void OnImpulsePaid(int creditsCount) { + if (_isSyncingCredits) + return; + // creditsCount - это количество добавленных кредитов (всегда 1 для одного импульса) // Начисляем стоимость импульса AddBalance(_impulseCost); @@ -302,8 +306,16 @@ namespace RR.Common.Managers if (targetCredits == currentCredits) return; // Кредиты уже синхронизированы - // Устанавливаем кредиты напрямую через SetCredits - ComSystemManager.SetCredits(targetCredits); + _isSyncingCredits = true; + try + { + // Устанавливаем кредиты напрямую через SetCredits + ComSystemManager.SetCredits(targetCredits); + } + finally + { + _isSyncingCredits = false; + } } ///