{"id":1125,"date":"2026-06-10T02:54:45","date_gmt":"2026-06-10T02:54:45","guid":{"rendered":"https:\/\/rivals2.com\/workshop-dev\/?post_type=knowledgebase&#038;p=1125"},"modified":"2026-08-10T21:42:18","modified_gmt":"2026-08-10T21:42:18","slug":"status-effect-overview","status":"publish","type":"knowledgebase","link":"https:\/\/rivals2.com\/workshop\/knowledge-base\/character-creation\/status-effect-overview\/","title":{"rendered":"Status Behaviors"},"content":{"rendered":"\n<p class=\"wp-block-paragraph\">Status Behaviors let your character apply a lasting gameplay change to another Rival &#8212; a burn that ticks damage, a cooldown that blocks a special, a mark that changes what your next hit does. They are written in Lua and registered through a Blueprint asset.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\">When to use a Status Behavior<\/h3>\n\n\n\n<p class=\"wp-block-paragraph\">Before making a status behavior, consider whether it couldn&#8217;t be better implemented by logic directly on your character. The two criteria below work as a good rule of thumb for when a status makes sense:<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li><strong>The behavior should be applied to a character other than the one who inflicts it<\/strong> &#8212; If you need a persistent effect that can only apply to your own character, handling the behavior inside your character and using a NetProp for timer\/stacks\/etc is probably the right move<\/li>\n\n\n\n<li><strong>The behavior is persistent<\/strong> &#8212; One-time effects can simply be executed immediately and don&#8217;t need to go through the status effect system. <\/li>\n<\/ul>\n\n\n\n<h3 class=\"wp-block-heading\">RivalsStatusEffect vs RivalsCustomStatusState<\/h3>\n\n\n\n<p class=\"wp-block-paragraph\">Statuses come in two varieties, both of which will inherit from RivalsStatusBehaviorBase:<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li><strong>Status Effect (RivalsLuaStatusEffectBase)<\/strong>: This represents an arbitrary status effect. A Rival can have many of them at a time, and they don&#8217;t force any specific custom behavior. Used for thins like Ranno&#8217;s poison, Zetterburn&#8217;s burn, etc.<\/li>\n\n\n\n<li><strong>Custom Status State (RivalsLuaCustomStatusState)<\/strong>: This represents a custom state tied to a status. A Rival can only be in one Custom Status State at a time, and it will override their action state (walk\/run\/etc). Custom Status States have custom animations and movement behavior. Used for things like Ranno&#8217;s bubble, Etalus&#8217; Freeze, etc.<\/li>\n<\/ul>\n\n\n\n<p class=\"wp-block-paragraph\">In general: if the Rival can keep acting during the state, it&#8217;s a Status Effect. If not, it&#8217;s a Custom Status State.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\">Creating a Status Effect<\/h3>\n\n\n\n<h4 class=\"wp-block-heading\">1: Create the Blueprint<\/h4>\n\n\n\n<p class=\"wp-block-paragraph\">In your mod&#8217;s\u00a0<code>UnrealAssets<\/code>\u00a0folder, create a Blueprint whose parent class is\u00a0<strong>RivalsLuaStatusEffectBase<\/strong>. Open it and set three properties on the Class Defaults:<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li><strong>Effect Name:<\/strong> The short name of your effect, for example <em>Burn<\/em>.<\/li>\n\n\n\n<li><strong>Lua Script Path:<\/strong> The path to your script, starting with your ModID, eg <code>1234567890\/Scripts\/MyStatusEffect.lua<\/code><\/li>\n\n\n\n<li><strong>Lua Metatable Name: <\/strong>The name of the global table your script defines. It must be a valid Lua name.<\/li>\n<\/ul>\n\n\n\n<h4 class=\"wp-block-heading\">2: Write the Script<\/h4>\n\n\n\n<p class=\"wp-block-paragraph\">Create the Lua file at the path you entered. The script defines one global table, named exactly the same as your\u00a0<strong>Lua Metatable Name<\/strong>.<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>MyStatusEffect = {}\n\n-- Runs every frame while the effect is active.\n-- Return true to remove the effect.\nfunction MyStatusEffect.Update( StatusEffect, Target )\n    local value = StatusEffect.StatusEffectValue:GetValue()\n    value = value - 1\n    StatusEffect.StatusEffectValue:SetValue( value )\n\n    if ( value &lt;= 0 ) then\n        return true\n    end\n    return false\nend<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">There are numerous functions that Status Effects can implement, check the Lua documentation for more info. Note that StatusEffectValues are NetProps, and thus must be accessed with GetValue\/SetValue.<\/p>\n\n\n\n<h4 class=\"wp-block-heading\">3. Register the effect<\/h4>\n\n\n\n<p class=\"wp-block-paragraph\">Your effect can&#8217;t be used until something registers it. Open your CharacterData or ArticleData asset and add your new Blueprint class to the <code>Status Effect Behavior Classes<\/code> array.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\">Using an Effect<\/h3>\n\n\n\n<p class=\"wp-block-paragraph\">Manipulating status effects is mostly done via 3 self-explanatory functions:<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li>Target:AddStatusEffect( inflictor, &#8220;EffectName&#8221;, stacks)<\/li>\n\n\n\n<li>local stacks = Target:GetStatusEffectValue( &#8220;EffectName&#8221; )<\/li>\n\n\n\n<li>Target:RemoveStatusEffects( &#8220;EffectName&#8221; )<\/li>\n<\/ul>\n\n\n\n<p class=\"wp-block-paragraph\">Note that status effects do not inherently have a duration. If you want a duration-based status effect, you&#8217;ll typically use the stack counter as a timer and tick it down in the effect&#8217;s Update function.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Multiple instances of the same status  will be resolved differently depending on whether <strong>Is Exclusive<\/strong> is set on the effect&#8217;s Blueprint. When true, the status will remove any prior instances before being applied. When false, multiple instances will coexist simultaneously, tick their functions seperately, and GetStatusEffectValue will return the value of the first instance found.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\">Naming and Mod Namespaces<\/h3>\n\n\n\n<p class=\"wp-block-paragraph\">Every effect is stored under a namespaced key,\u00a0<code>&lt;YourModID>.&lt;EffectName><\/code>. This allows two mods to both ship an effect called\u00a0<code>Burn<\/code>\u00a0without conflict. Base game effects have no prefix.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><strong>You do not have to type this prefix.<\/strong> When your script passes in a plain name like &#8220;Burn&#8221;, the game automatically prefixes your own ModID. You only need to think about this when invoking a status effect defined outside your own mod.<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li>For your own burn effect, write <em>&#8220;Burn&#8221;<\/em><\/li>\n\n\n\n<li>For a base game effect (eg Zetterburn&#8217;s), write <em>&#8220;base.Burn&#8221;<\/em><\/li>\n\n\n\n<li>For another mod&#8217;s burn effect write <em>&#8220;OtherModID.Burn&#8221;<\/em><\/li>\n<\/ul>\n\n\n\n<p class=\"wp-block-paragraph\">You can only ever <em>register<\/em> an effect in your own mod&#8217;s namespace.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\">Visuals<\/h3>\n\n\n\n<p class=\"wp-block-paragraph\">There are two ways to implement a status effect visual.<\/p>\n\n\n\n<h4 class=\"wp-block-heading\">1. Status Visual Definition<\/h4>\n\n\n\n<p class=\"wp-block-paragraph\">On your Blueprint, add an entry to the Status Visual Definitions map using your effect&#8217;s short-name as a key. The properties on this allow you to manipulate the affected Rival&#8217;s tint, outline, and aura.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Colors in a Status Visual Definition are\u00a0<strong>palette slot names, not raw color values<\/strong>.\u00a0<strong>Default Color Palette<\/strong>\u00a0provides fallback values when the inflictor has no matching palette of their own.\u00a0<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">You can also implement <code>GetVisual<\/code> on your status effect to programatically provide a status effect at runtime, allowing you to change the values dynamically.<\/p>\n\n\n\n<h4 class=\"wp-block-heading\">2. Visual Renderer Class<\/h4>\n\n\n\n<p class=\"wp-block-paragraph\">For effects that can&#8217;t be easily expressed with a Status Visual Definition, you can create your own renderer Actor and assign it to <strong>Visual Renderer Class<\/strong> on the Status Effect Blueprint.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\">SFX and VFX<\/h3>\n\n\n\n<p class=\"wp-block-paragraph\">To play SFX or VFX, you can set up the <strong>SFX Container Class<\/strong> and <strong>VFX Container Class<\/strong> and then invoke them from scripts:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>self:PlaySFX( Target, \"MySound\" )\nself:SpawnVfx( Target, \"MyEffect\" )<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">The inflictor can also be supplied as an optional third parameter. If the named effects are defined on the inflictor&#8217;s skin, it will use those instead of the ones on the Status Effect.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\">Custom Status States<\/h3>\n\n\n\n<p class=\"wp-block-paragraph\">Authoring a Custom Status State follows the same shape as a Status Effect, with three differences:<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li>The parent class is <strong>RivalsLuaCustomStatusState<\/strong><\/li>\n\n\n\n<li>The name property is <strong>State Name<\/strong><\/li>\n\n\n\n<li>The effect is registered in <strong>Custom Status State Behavior Classes<\/strong><\/li>\n<\/ul>\n\n\n\n<p class=\"wp-block-paragraph\">Custom Status States can be applied via SetCustomStatusState:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>Target:SetCustomStatusState( ERivalsCharacterState.CustomStatus1, self:GetEntityIndex(), \"MyState\" )<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">The important element here is the last parameter, which is the <strong>State Name<\/strong> on your Blueprint. The type will always be CustomStatus1.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Your script then drives the state by implementing various functions in its script, see the Lua documentation for more details.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\">Function Reference<\/h3>\n\n\n\n<p class=\"wp-block-paragraph\"><span style=\"text-decoration: underline;\">Status Effect Hooks:<\/span><\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Return true from any of these functions to remove the effect.<\/p>\n\n\n\n<figure class=\"wp-block-table\"><table class=\"has-fixed-layout\"><thead><tr><th class=\"has-text-align-left\" data-align=\"left\">Hook<\/th><th class=\"has-text-align-left\" data-align=\"left\">Runs when<\/th><\/tr><\/thead><tbody><tr><td class=\"has-text-align-left\" data-align=\"left\"><code>Update<\/code><\/td><td class=\"has-text-align-left\" data-align=\"left\">Every frame<\/td><\/tr><tr><td class=\"has-text-align-left\" data-align=\"left\"><code>UpdatePostMovement<\/code><\/td><td class=\"has-text-align-left\" data-align=\"left\">Every frame, after movement resolves<\/td><\/tr><tr><td class=\"has-text-align-left\" data-align=\"left\"><code>UpdateInHitpause<\/code><\/td><td class=\"has-text-align-left\" data-align=\"left\">Every frame during hitpause<\/td><\/tr><tr><td class=\"has-text-align-left\" data-align=\"left\"><code>UpdateOnHitboxImpact<\/code><\/td><td class=\"has-text-align-left\" data-align=\"left\">The Rival is struck. Also receives the hitbox<\/td><\/tr><tr><td class=\"has-text-align-left\" data-align=\"left\"><code>UpdateOnHitRival<\/code><\/td><td class=\"has-text-align-left\" data-align=\"left\">The Rival hits someone. Also receives the Rival hit<\/td><\/tr><tr><td class=\"has-text-align-left\" data-align=\"left\"><code>UpdateOnHitShield<\/code><\/td><td class=\"has-text-align-left\" data-align=\"left\">The Rival hits a shield. Also receives the shielding Rival<\/td><\/tr><tr><td class=\"has-text-align-left\" data-align=\"left\"><code>UpdateOnInitState<\/code><\/td><td class=\"has-text-align-left\" data-align=\"left\">The Rival changes state<\/td><\/tr><tr><td class=\"has-text-align-left\" data-align=\"left\"><code>UpdateOnKnockback<\/code><\/td><td class=\"has-text-align-left\" data-align=\"left\">The Rival takes knockback<\/td><\/tr><tr><td class=\"has-text-align-left\" data-align=\"left\"><code>UpdateOnTechableHitstunEnd<\/code><\/td><td class=\"has-text-align-left\" data-align=\"left\">Techable hitstun ends<\/td><\/tr><\/tbody><\/table><\/figure>\n\n\n\n<p class=\"wp-block-paragraph\"><span style=\"text-decoration: underline;\">Additional Status Effect Hooks:<\/span><\/p>\n\n\n\n<figure class=\"wp-block-table\"><table class=\"has-fixed-layout\"><thead><tr><th class=\"has-text-align-left\" data-align=\"left\"><br>Hook<\/th><th class=\"has-text-align-left\" data-align=\"left\">Runs when<\/th><\/tr><\/thead><tbody><tr><td class=\"has-text-align-left\" data-align=\"left\"><code>OnOwnerHitBlastzone<\/code><\/td><td class=\"has-text-align-left\" data-align=\"left\">Fires when the player this the blast zone. Returning true prevents death instead of removing the effect &#8212; it must be removed manually instead.<\/td><\/tr><tr><td class=\"has-text-align-left\" data-align=\"left\"><code>OnRemoved<\/code><\/td><td class=\"has-text-align-left\" data-align=\"left\">Runs when the effect ends. No return value.<\/td><\/tr><\/tbody><\/table><\/figure>\n\n\n\n<p class=\"wp-block-paragraph\"><span style=\"text-decoration: underline;\">Custom Status State Hooks<\/span><\/p>\n\n\n\n<figure class=\"wp-block-table\"><table class=\"has-fixed-layout\"><thead><tr><th class=\"has-text-align-left\" data-align=\"left\">Hook<\/th><th class=\"has-text-align-left\" data-align=\"left\">Purpose<\/th><\/tr><\/thead><tbody><tr><td class=\"has-text-align-left\" data-align=\"left\"><code>Start<\/code>,&nbsp;<code>End<\/code>,&nbsp;<code>EndNaturally<\/code><\/td><td class=\"has-text-align-left\" data-align=\"left\">Lifecycle.&nbsp;<code>EndNaturally<\/code>&nbsp;runs when the state times out rather than being cut short<\/td><\/tr><tr><td class=\"has-text-align-left\" data-align=\"left\"><code>Update<\/code>,&nbsp;<code>UpdatePostMovement<\/code>,&nbsp;<code>UpdateTimer<\/code><\/td><td class=\"has-text-align-left\" data-align=\"left\">Per frame<\/td><\/tr><tr><td class=\"has-text-align-left\" data-align=\"left\"><code>GetLength<\/code><\/td><td class=\"has-text-align-left\" data-align=\"left\">How many frames the state lasts<\/td><\/tr><tr><td class=\"has-text-align-left\" data-align=\"left\"><code>GetIasaFrame<\/code><\/td><td class=\"has-text-align-left\" data-align=\"left\">When the Rival can act again<\/td><\/tr><tr><td class=\"has-text-align-left\" data-align=\"left\"><code>GetOverlays<\/code><\/td><td class=\"has-text-align-left\" data-align=\"left\">Visual overlays<\/td><\/tr><tr><td class=\"has-text-align-left\" data-align=\"left\"><code>GetVisual<\/code><\/td><td class=\"has-text-align-left\" data-align=\"left\">Visual treatment<\/td><\/tr><tr><td class=\"has-text-align-left\" data-align=\"left\"><code>CanHitboxHitTarget<\/code><\/td><td class=\"has-text-align-left\" data-align=\"left\">Whether a given hitbox can connect<\/td><\/tr><tr><td class=\"has-text-align-left\" data-align=\"left\"><code>ApplyKnockbackToTarget<\/code><\/td><td class=\"has-text-align-left\" data-align=\"left\">Custom knockback response<\/td><\/tr><tr><td class=\"has-text-align-left\" data-align=\"left\"><code>TakeDamage<\/code><\/td><td class=\"has-text-align-left\" data-align=\"left\">Custom damage response<\/td><\/tr><\/tbody><\/table><\/figure>\n\n\n\n<p class=\"wp-block-paragraph\"><\/p>\n","protected":false},"excerpt":{"rendered":"<p>Status Behaviors let your character apply a lasting gameplay change to another Rival &#8212; a burn that ticks damage, a cooldown that blocks a special, a mark that changes what your next hit does. They are written in Lua and registered through a Blueprint asset. When to use a Status Behavior Before making a status [&hellip;]<\/p>\n","protected":false},"author":9,"featured_media":0,"comment_status":"open","ping_status":"open","template":"","knowledgebase_cat":[4],"knowledgebase_tag":[],"class_list":["post-1125","knowledgebase","type-knowledgebase","status-publish","hentry","knowledgebase_cat-character-creation"],"_links":{"self":[{"href":"https:\/\/rivals2.com\/workshop\/wp-json\/wp\/v2\/knowledgebase\/1125","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/rivals2.com\/workshop\/wp-json\/wp\/v2\/knowledgebase"}],"about":[{"href":"https:\/\/rivals2.com\/workshop\/wp-json\/wp\/v2\/types\/knowledgebase"}],"author":[{"embeddable":true,"href":"https:\/\/rivals2.com\/workshop\/wp-json\/wp\/v2\/users\/9"}],"replies":[{"embeddable":true,"href":"https:\/\/rivals2.com\/workshop\/wp-json\/wp\/v2\/comments?post=1125"}],"version-history":[{"count":5,"href":"https:\/\/rivals2.com\/workshop\/wp-json\/wp\/v2\/knowledgebase\/1125\/revisions"}],"predecessor-version":[{"id":1756,"href":"https:\/\/rivals2.com\/workshop\/wp-json\/wp\/v2\/knowledgebase\/1125\/revisions\/1756"}],"wp:attachment":[{"href":"https:\/\/rivals2.com\/workshop\/wp-json\/wp\/v2\/media?parent=1125"}],"wp:term":[{"taxonomy":"knowledgebase_cat","embeddable":true,"href":"https:\/\/rivals2.com\/workshop\/wp-json\/wp\/v2\/knowledgebase_cat?post=1125"},{"taxonomy":"knowledgebase_tag","embeddable":true,"href":"https:\/\/rivals2.com\/workshop\/wp-json\/wp\/v2\/knowledgebase_tag?post=1125"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}