Files
beyond/Assets/Scripts/Audio/ShadowSlayerBarkHelper.cs

121 lines
4.5 KiB
C#

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<CharacterVisibilityController>();
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<CharacterVisibilityController>();
if (visilibityController)
{
var weapon = meleeManager.rightWeapon;
if (weapon == null) return;
bItemAttribute power = weapon.GetComponent<bMeleeEquipment>().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);
}
}
}
}