spell refactor part - assets and prefabs

This commit is contained in:
2026-01-22 14:54:35 +01:00
parent 1beff44ada
commit 013dca60a5
36 changed files with 773 additions and 1034 deletions

View File

@@ -1,8 +1,5 @@
using Invector;
using Invector.vMelee;
using System;
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
namespace Beyond
@@ -10,20 +7,15 @@ namespace Beyond
public class ShadowSlayerBarkHelper : MonoBehaviour
{
private const int fullyChargedBarkId = 24, emptySlayerBarkId = 14, normalSwordAttackBarkID = 23, powerBarkID = 22;
public vObjectDamage blastDamager, flamethrowerDamager;//, fireballDamager;
// Remove specific damagers, we don't need them anymore
// public vObjectDamage blastDamager, flamethrowerDamager;
public BarkManager barkManager;
// public bEquipArea weaponsArea;
public vMeleeManager meleeManager;
// public List<bEquipSlot> weaponSlots;
private vMeleeWeapon weapon;
public MagicAttacks magicAttacks;
public TutorialController emptySlayerTutorial;
// Start is called before the first frame update
private void Awake()
{
EnableShadowSlayerBarks();
@@ -31,48 +23,32 @@ namespace Beyond
private void EnableShadowSlayerBarks()
{
meleeManager.onDamageHit.AddListener(TryToPlayAttackBark);
if (meleeManager)
meleeManager.onDamageHit.AddListener(TryToPlayAttackBark);
blastDamager.onHit.AddListener(TryToPlayPowerBark);
flamethrowerDamager.onHit.AddListener(TryToPlayPowerBark);
magicAttacks.onHitFireball += TryToPlayPowerBark;
// fireballDamager.onHit.AddListener(TryToPlayPowerBark);
// NEW: Subscribe to the centralized Magic event
if (magicAttacks)
magicAttacks.OnSpellHit += OnMagicHit;
}
private void TryToPlayAttackBark(vHitInfo arg0)
private void OnDestroy()
{
CharacterVisibilityController visilibityController = arg0.targetCollider.GetComponent<CharacterVisibilityController>();
if (visilibityController)
{
weapon = meleeManager.rightWeapon;
bItemAttribute power = weapon.GetComponent<bMeleeEquipment>().power;
if (power != null && power.value > 0)
{
//attacking with fully charged slayer
barkManager.PlayBark(fullyChargedBarkId);
}
else if (power != null && power.value <= 0 && !emptySlayerTutorial.played)
{
emptySlayerTutorial.StartTutorial();
//attacking with empty slayer, change id to correct!
// barkManager.PlayBark(emptySlayerBarkId);
}
else if (power == null)
{
//attacking
barkManager.PlayBark(normalSwordAttackBarkID);
}
//not much of an improvement as bark handles playing already, just removes few check before
TryToRemoveAttackListener();
}
}
private void TryToRemoveAttackListener()
{
if (!(barkManager.CanBarkBeStillPlayed(fullyChargedBarkId) || !emptySlayerTutorial.played /*|| barkManager.CanBarkBeStillPlayed(emptySlayerBarkId) */ || barkManager.CanBarkBeStillPlayed(normalSwordAttackBarkID)))
{
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);
}
}
@@ -81,25 +57,65 @@ namespace Beyond
CharacterVisibilityController visilibityController = arg0.GetComponent<CharacterVisibilityController>();
if (visilibityController)
{
barkManager.PlayBark(powerBarkID);
TryToRemovePowerBarkListener();
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.
}
}
}
private void TryToRemovePowerBarkListener()
// ---------------------------------------------------------
// MELEE LOGIC (Unchanged, just uncommented)
// ---------------------------------------------------------
private void TryToPlayAttackBark(vHitInfo arg0)
{
if (barkManager.CanBarkBeStillPlayed(powerBarkID))
CharacterVisibilityController visilibityController = arg0.targetCollider.GetComponent<CharacterVisibilityController>();
if (visilibityController)
{
blastDamager.onHit.RemoveListener(TryToPlayPowerBark);
flamethrowerDamager.onHit.RemoveListener(TryToPlayPowerBark);
magicAttacks.onHitFireball -= TryToPlayPowerBark;
//fireballDamager.onHit.RemoveListener(TryToPlayPowerBark);
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();
}
}
// Update is called once per frame
private void Update()
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);
}
}
}
}