# Module

### Description

Modules are a way to add additional functionality to each [StatusEffectData](https://maraudical.gitbook.io/status-effect-framework/1.6.0/type-specifics/scriptable-objects/statuseffectdata). Create one by simply inheriting from the Module class and implementing the required methods. 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.

{% hint style="info" %}
Make sure to checkout [ModuleInstance](https://maraudical.gitbook.io/status-effect-framework/1.6.0/type-specifics/scriptable-objects/moduleinstance) to see how you can setup unique module data per [StatusEffectData](https://maraudical.gitbook.io/status-effect-framework/1.6.0/type-specifics/scriptable-objects/statuseffectdata)!
{% endhint %}

### UniTask Support

Note that if you have [UniTask](https://docs.unity3d.com/ScriptReference/Coroutine.html) in your project then the Module will use [UniTasks](https://docs.unity3d.com/ScriptReference/Coroutine.html) over [Coroutines](https://docs.unity3d.com/ScriptReference/Coroutine.html). This is also included in the samples, but note that the only real difference is that there is no DisableModule abstract method because you can just wait until cancellation is requested on the [token](https://learn.microsoft.com/en-us/dotnet/api/system.threading.cancellationtoken?view=net-8.0).

### Abstract Methods

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

### Example

```csharp
using System.Collections;
using UnityEngine;
// Use StatusEffects.Modules namespace for organization.
namespace StatusEffects.Modules
{
    // Setup scriptable object in create menu.
    [CreateAssetMenu(fileName = "Damage Over Time Effect", menuName = "Status Effect Framework/Custom Effects/Damage Over Time", order = 1)]
    // This attribute will attach the module instance so 
    // that the interval time can be unique to each effect.
    [AttachModuleInstance(typeof(DamageOverTimeInstance))]
    public class DamageOverTimeEffect : CustomEffect
    {
        public override IEnumerator EnableModule<T>(T monoBehaviour, StatusEffect statusEffect, ModuleInstance moduleInstance)
        {
            // Note that for this module it uses a ModuleInstance 
            // to store a unique interval rate.
            DamageOverTimeInstance damageOverTimeInstance = moduleInstance as DamageOverTimeInstance;

            if (monoBehaviour.TryGetComponent(out ExampleEntity entity))
                // Infinite loop will be cancelled when coroutine is stopped.
                for (; ; )
                {
                    // Reduce health based on the Statu Effect base value.
                    entity.health -= statusEffect.data.baseValue;
                    // Wait for the interval before applying the damage again.
                    yield return new WaitForSeconds(damageOverTimeInstance.intervalSeconds);
                }
        }
        // You don't need to have anything in the disable method if you don't need to.
        public override void DisableModule<T>(T monoBehaviour, StatusEffect statusEffect, ModuleInstance moduleInstance) { }
}
```


---

# Agent Instructions: Querying This Documentation

If you need additional information that is not directly available in this page, you can query the documentation dynamically by asking a question.

Perform an HTTP GET request on the current page URL with the `ask` query parameter:

```
GET https://maraudical.gitbook.io/status-effect-framework/1.6.0/type-specifics/scriptable-objects/module.md?ask=<question>
```

The question should be specific, self-contained, and written in natural language.
The response will contain a direct answer to the question and relevant excerpts and sources from the documentation.

Use this mechanism when the answer is not explicitly present in the current page, you need clarification or additional context, or you want to retrieve related documentation sections.
