using Invector; using Invector.vMelee; using UnityEngine; namespace Beyond { public class ShadowSlayerBarkHelper : MonoBehaviour { private const int fullyChargedBarkId = 24, emptySlayerBarkId = 14, normalSwordAttackBarkID = 23, powerBarkID = 22; // Remove specific damagers, we don't need them anymore // public vObjectDamage blastDamager, flamethrowerDamager; public BarkManager barkManager; public vMeleeManager meleeManager; public MagicAttacks magicAttacks; public TutorialController emptySlayerTutorial; private void Awake() { EnableShadowSlayerBarks(); } private void EnableShadowSlayerBarks() { if (meleeManager) meleeManager.onDamageHit.AddListener(TryToPlayAttackBark); // NEW: Subscribe to the centralized Magic event if (magicAttacks) magicAttacks.OnSpellHit += OnMagicHit; } private void OnDestroy() { if (magicAttacks) magicAttacks.OnSpellHit -= OnMagicHit; if (meleeManager) meleeManager.onDamageHit.RemoveListener(TryToPlayAttackBark); } // --------------------------------------------------------- // MAGIC LOGIC // --------------------------------------------------------- private void OnMagicHit(SpellDefinition spell, Collider hitTarget) { // Check if the spell is "Offensive_Power" (Fireball, Flamethrower, Blast) if (spell.category == SpellCategory.Offensive_Power) { TryToPlayPowerBark(hitTarget); } } public void TryToPlayPowerBark(Collider arg0) { CharacterVisibilityController visilibityController = arg0.GetComponent(); if (visilibityController) { if (barkManager.CanBarkBeStillPlayed(powerBarkID)) { barkManager.PlayBark(powerBarkID); // We don't need to unsubscribe here anymore because the // event is global and persistent on MagicAttacks. // The 'CanBarkBeStillPlayed' check handles the "play once" logic. } } } // --------------------------------------------------------- // MELEE LOGIC (Unchanged, just uncommented) // --------------------------------------------------------- private void TryToPlayAttackBark(vHitInfo arg0) { CharacterVisibilityController visilibityController = arg0.targetCollider.GetComponent(); if (visilibityController) { var weapon = meleeManager.rightWeapon; if (weapon == null) return; bItemAttribute power = weapon.GetComponent().power; if (power != null && power.value > 0) { // Fully charged barkManager.PlayBark(fullyChargedBarkId); } else if (power != null && power.value <= 0) { // Empty Slayer if (emptySlayerTutorial != null && !emptySlayerTutorial.played) { emptySlayerTutorial.StartTutorial(); } // barkManager.PlayBark(emptySlayerBarkId); } else if (power == null) { // Normal Sword barkManager.PlayBark(normalSwordAttackBarkID); } // Cleanup listener if all barks are done TryToRemoveAttackListener(); } } private void TryToRemoveAttackListener() { // If all relevant barks are exhausted/played, stop listening to melee hits to save performance bool fullyChargedDone = !barkManager.CanBarkBeStillPlayed(fullyChargedBarkId); bool normalDone = !barkManager.CanBarkBeStillPlayed(normalSwordAttackBarkID); bool tutorialDone = (emptySlayerTutorial == null || emptySlayerTutorial.played); if (fullyChargedDone && normalDone && tutorialDone) { meleeManager.onDamageHit.RemoveListener(TryToPlayAttackBark); } } } }