Table of Contents

Class ActiveSkill

Namespace
GrindFest
Assembly
GrindFest.dll

A skill that is executed: it owns the equipment swap protocol, animation helpers and combat targeting that used to live on the SkillBehaviour MonoBehaviour.

The coroutine is hosted on SkillUserBehaviour — the skill never needs a GameObject.

public abstract class ActiveSkill : Skill
Inheritance
object
ActiveSkill
Derived
Inherited Members

Fields

Coroutine
OldLeftHandItem
OldRightHandItem
SwappedItem

Properties

MovementInterrupts

Methods

AcquireAsset<T>(string, Action<T>)

Acquires an asset and waits for it, then hands it to onReady.

This is the bridge a coroutine needs: a skill cannot await, and the alternative — reading a cold asset out of a property and carrying on — is not acceptable for something the skill is made of. That read is what killed DropSkill mid-drop: the asset was cold, .Transition threw a NullReferenceException inside Use(), the coroutine died with the item still in the hero's hand and the hero walked off (measured 2026-09-19). Here the skill simply waits for the animation and then plays it.

A load that genuinely fails is loud and the skill stops. It never falls through to acting unanimated: silence would be a skill that does something different from what it says, with nothing in the log.

AcquireSubAsset<T>(string, string, Action<T>)

AcquireAsset<T>(string, Action<T>) for a clip that lives inside a model file, e.g. Clip("Assets/…/Villager@Fishing01.fbx", "Villager@Fishing01").

Sub-assets need their own acquire as the right type: a sub-asset is not satisfied by loading its parent as Object (the cache key is address|type|name), so the skill has to ask for the clip.

AcquireTransition(string, Action<ClipTransition>)

AcquireAsset<T>(string, Action<T>) for the transition assets the skills animate with. The ClipTransitionAsset.Transition is read after the asset is resident, so the dereference that used to blow up mid-skill cannot happen. A null handed to onReady, therefore, only ever means a real failure — already logged — and the caller stops on it.

FadeUpperBodyLayer(float)

Fade the overlay layer back out after a skill that used it (normal completion).

GetBestMeleeEnemy()
GetEnemiesInArc(float, float, Vector3, HashSet<CombatBehaviour>)
GetEnemiesInLine(float, HashSet<CombatBehaviour>)
InstantiateProjectile(Projectile, Transform)
OnRemoved()

Equipment swapped in for the skill is restored when the skill ends.

PlayAnimation(ITransition, int, float)
PlayAnimation(AnimationClip, int, float)

Raw clip overload — animations resolved from an .fbx by address arrive as clips.

PlayUpperBodyAnimation(ITransition, float)

Play an animation on the upper-body layer (layer 1, masked), used by casting/consuming.

PlayUpperBodyAnimation(AnimationClip, float)

Play a raw clip on the upper-body layer (masked), used by casting / consuming.

PlayWeaponAnimation(Action)
RestoreEquipment()
SwapEquipment(EquipableBehaviour)
TrySwapEquipment<T>(Predicate<ItemBehaviour>, string, out T)
WaitForAnimation(ITransition, float, float)
WaitForAnimation(AnimationClip, float, float)
WaitForAnimationEvent(ClipTransition, string)
WaitForAnimationEvent(ITransition, string, float)

Waits for a named event; falls back to fallbackTime when the animation is not a plain clip transition.

WaitForRestOfWeaponAnimation()
WaitForWeaponAnimation(ClipTransition, int)

Same as above for a transition that came out of a ClipTransitionAsset.

WaitForWeaponAnimation(int, UnShared)
WeaponDamage(CombatBehaviour, Element, float)
WeaponDamage(HashSet<CombatBehaviour>, Element, float)
WeaponDamage(Collision, Element, float)