// сам носимый баллон: // внедряем в FX-объект баллона контроллер подмены анимации // вытаскиваем индекс из носителя и применяем подмену символа анимации // запоминаем ссылку на новый FX-объект private static void ApplySymbolOverrideBalloonFX(BalloonFX.Instance smi, KBatchedAnimController kbac) { kbac.usingNewSymbolOverrideSystem = true; SymbolOverrideController symbolOverrideController = SymbolOverrideControllerUtil.AddToPrefab(kbac.gameObject); VaricolouredBalloonsHelper receiver = smi.master.GetComponent <VaricolouredBalloonsHelper>(); if (receiver != null) { receiver.fx = smi; VaricolouredBalloonsHelper.ApplySymbolOverrideByIdx(symbolOverrideController, receiver.ReceiverBalloonSymbolIdx); } }
private static void Postfix(BalloonArtistChore.States __instance) { __instance.balloonStand.Enter((BalloonArtistChore.StatesInstance smi) => smi.GetComponent <VaricolouredBalloonsHelper>()?.RandomizeArtistBalloonSymbolIdx()); __instance.balloonStand.idle.Enter((BalloonArtistChore.StatesInstance smi) => { VaricolouredBalloonsHelper artist = smi.GetComponent <VaricolouredBalloonsHelper>(); if (artist != null) { artist.ApplySymbolOverrideByIdx(artist.ArtistBalloonSymbolIdx); } }); }
// перехватываем "задание 'получить баллон' начато" // вытаскиваем индекс из артиста, запихиваем его в получателя, и применяем подмену символа анимации // уничтожаем предыдущий FX-объект баллона если он есть private static void OnBeginGetBalloonChore(BalloonStandConfig balloonStandConfig, Chore chore) { GetBalloonWorkable balloonWorkable = chore.target?.GetComponent <GetBalloonWorkable>(); if (balloonWorkable != null) { uint idx = BALLOONARTIST.Get(balloonWorkable)?.GetComponent <VaricolouredBalloonsHelper>()?.ArtistBalloonSymbolIdx ?? 0; VaricolouredBalloonsHelper receiver = chore.driver?.GetComponent <VaricolouredBalloonsHelper>(); if (receiver != null) { receiver.ReceiverBalloonSymbolIdx = idx; receiver.ApplySymbolOverrideByIdx(idx); if (receiver.fx != null) { receiver.fx.StopSM("Unequipped"); receiver.fx = null; } } } }