121 lines
4.5 KiB
C#
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);
|
|
}
|
|
}
|
|
}
|
|
} |