# CustomEffect

### Description

Custom Effects are a way to add additional functionality to each [StatusEffectData](https://maraudical.gitbook.io/status-effect-framework/1.2.0/type-specifics/classes/statuseffectdata). Truthfully anything can be done with them as they are just an inheritable abstract class with a coroutine, allowing for unlimited functionality. It is **highly recommended** to take a look at the [samples](https://github.com/maraudical/StatusEffectsFramework-Unity/tree/main/Samples) for an idea of how to use them.

### Abstract Methods

<table data-header-hidden data-full-width="false"><thead><tr><th width="224"></th><th></th></tr></thead><tbody><tr><td>Effect</td><td>A <a href="https://docs.unity3d.com/ScriptReference/Coroutine.html">Coroutine</a> that is started when the <a href="statuseffect">StatusEffect</a> begins.</td></tr><tr><td>EffectEnd</td><td>A method that is invoked when the <a href="statuseffect">StatusEffect</a> is stopped.</td></tr></tbody></table>

### Example

```csharp
using System.Collections;
using UnityEngine;
// Use StatusEffects.Custom namespace for organization.
namespace StatusEffects.Custom
{
    // Setup scriptable object in create menu.
    [CreateAssetMenu(fileName = "Poison Effect", menuName = "Custom Effects/Poison", order = 1)]
    public class PoisonEffect : CustomEffect
    {
        // Unique value for this effect example
        public float intervalSeconds = 1f;

        public override IEnumerator Effect<T>(T monoBehaviour, StatusEffect statusEffect)
        {
            // Use your own character/entity class for this
            Entity entity = monoBehaviour.GetComponent<Entity>();
            
            for (; ; )
            {
                // Use your own TakeDamage() logic. This will 
                // occur every interval until the effect ends.
                entity.TakeDamage(statusEffect.data.baseValue);
                yield return new WaitForSeconds(intervalSeconds);
            }
        }

        public override void EffectEnd<T>(T monoBehaviour, StatusEffect statusEffect) { }
    }
}
```
