RoA Workshop Guide – Explaining Hitboxes

Setting up hitboxes can be daunting when making a first workshop character. What’s more, many of the template characters have long, bloated lists which can make it difficult to figure out which ones you need to change. This guide will explain just the essential grid indexes, give a rough outline of the numbers you should pick for them, and offer a more streamlined example that you can use for your own custom attacks. 

While there are more Grid Indexes than the ones listed here, you won’t need all of them for every attack you make. Any Grid Indexes you don’t include will automatically default to zero.

Hitbox Type

set_hitbox_value(AT_FTILT, 1, HG_HITBOX_TYPE, 1);

HG_HITBOX_TYPE is the type of hitbox. 1 = Melee (default), 2 = Projectile. 

For a projectile hitbox, you’ll need a few additional grid indexes that this guide won’t cover. You can find them all at the bottom of the official Hitbox Grid Indexes list.

Timing and duration

set_hitbox_value(AT_FTILT, 1, HG_WINDOW, 2);
set_hitbox_value(AT_FTILT, 1, HG_WINDOW_CREATION_FRAME, 0);
set_hitbox_value(AT_FTILT, 1, HG_LIFETIME, 3);

HG_WINDOWHG_WINDOW_CREATION_FRAME and HG_LIFETIME determines the window, the first frame, and the length of time that the hitbox will exist for.

In most cases, you can set HG_WINDOW_CREATION_FRAME to ‘0’, and set HG_LIFETIME to equal the length of the window it will appear in.

Shape and Position

set_hitbox_value(AT_FTILT, 1, HG_HITBOX_X, 30);
set_hitbox_value(AT_FTILT, 1, HG_HITBOX_Y, -30);
set_hitbox_value(AT_FTILT, 1, HG_WIDTH, 50);
set_hitbox_value(AT_FTILT, 1, HG_HEIGHT, 50);

HG_HITBOX_XHG_HITBOX_YHG_WIDTH and HG_HEIGHT define the size and position of the hitbox. 

The coordinates (HG_HITBOX_X and HG_HITBOX_Y) are positioned at the center of the hitbox, relative to your character. (0, 0) is at the center of your character at ground level. The Workshop Hitbox Helper or RoABox can be used to help you accurately size and place hitboxes.

There is also HG_SHAPE, which sets the shape of the hitbox. Set HG_SHAPE to 0 (default) for an oval, 1 for a rectangle or 2 for a rounded rectangle.

Hitbox Groups and Priority

set_hitbox_value(AT_FTILT, 1, HG_HITBOX_GROUP, 1);
set_hitbox_value(AT_FTILT, 1, HG_PRIORITY, 5);

HG_PRIORITY determines the order that your own hitboxes will hit an opponent. Note this ‘priority’ stat only affects your own character; you can’t ‘out-prioritize’ other players’ hitboxes in Rivals. HG_PRIORITY must be set to a number between 1 and 10, or else your hitbox will not be able to hit anything.

HG_HITBOX_GROUP is used to ‘group’ several hitboxes into a singular attack. When one hitbox in an attack hits an opponent, every other hitbox with the same HG_HITBOX_GROUP will be inactive for the rest of the attack. This lets you create attacks made up of several hitboxes that will only deal damage once. Hitbox grouping only works for melee hitboxes, not projectiles.  

If your attack has a variety of stronger and weaker hitboxes, you can combine HG_HITBOX_GROUP and HG_PRIORITY to make the stronger hitboxes take priority over weaker ones. For example, to make an attack have a ‘sweetspot’, add a new hitbox with the same HG_HITBOX_GROUP and a higher HG_PRIORITY than the other hitboxes.

Damage

set_hitbox_value(AT_FTILT, 1, HG_DAMAGE, 8);

HG_DAMAGE is, unsurprisingly, the amount of damage that your hitbox deals. Just remember that you can’t have decimal damage numbers in Rivals of Aether.

Knockback

set_hitbox_value(AT_FTILT, 1, HG_BASE_KNOCKBACK, 6);
set_hitbox_value(AT_FTILT, 1, HG_KNOCKBACK_SCALING, 0.5);
set_hitbox_value(AT_FTILT, 1, HG_ANGLE, 45);
set_hitbox_value(AT_FTILT, 1, HG_ANGLE_FLIPPER, 0);

HG_BASE_KNOCKBACK is the attack’s initial knockback speed. HG_KNOCKBACK_SCALING determines how much the base knockback is increased by the opponent’s damage percent. 

HG_ANGLE is the angle of the attack. 0 is forwards, 90 is up, 180 is backwards and 270 is down. Most attacks will fit between angle 40 and 90 – multiples of 5 are recommended for a ‘base cast’ feel. 

There is also the special ‘Angle 361’, which will launch at 40 degrees on a grounded opponent, or 45 degrees when it hits someone in the air. It’s commonly used for jab combo attacks.

HG_ANGLE_FLIPPER modifies the attack angle based on a certain condition. Sometimes you’ll want ‘Flipper 6’, which makes the attack angle always hit the opponent away from your character. Otherwise leave it at zero. The other Angle Flippers are all for special cases, and you can find a full list at the bottom of the Hitbox Grid Indexes page. 

Hitpause

set_hitbox_value(AT_FTILT, 1, HG_BASE_HITPAUSE, 6);
set_hitbox_value(AT_FTILT, 1, HG_HITPAUSE_SCALING, 0.5);

‘Hitpause’ (also called ‘Hitstop’ and ‘Hitlag’) is the short duration where both players are paused after one player hits another. Hitpause not only makes attacks feel more impactful – it also serves the gameplay purpose of giving opponents time to react to an attack and DI accordingly. Stronger attacks should have more Hitpause, weaker attacks should have less.

HG_BASE_HITPAUSE is the base amount of Hitpause applied (in frames), and HG_HITPAUSE_MULTIPLIER scales it up based on damage. There is no fixed rule for Hitpause lengths, so your best reference is to look at similar base cast moves and copy the values there. 

Sound and Visual Effects

set_hitbox_value(AT_FTILT, 1, HG_VISUAL_EFFECT, 0);
set_hitbox_value(AT_FTILT, 1, HG_HIT_SFX, asset_get("sfx_blow_weak1"));

HG_VISUAL_FX is the hit-effect for when your hitbox touches an opponent. You can set this a number in the Visual Effects List, or you can create your own effect with hit_fx_create().

HG_HIT_SFX does the same thing for sound effects. Choose one of your own sounds with sound_get(“sound_name”), or use asset_get(“sfx_name”) if you want to use the base Rivals’ SFX List.

All Together

Using all of the above, this is an example of what a typical hitbox will look like in your attack scripts.

set_num_hitboxes(AT_FTILT , 1);

//type
set_hitbox_value(AT_FTILT , 1, HG_HITBOX_TYPE, 1);

//timing and duration
set_hitbox_value(AT_FTILT , 1, HG_WINDOW, 2);
set_hitbox_value(AT_FTILT , 1, HG_WINDOW_CREATION_FRAME, 0);
set_hitbox_value(AT_FTILT , 1, HG_LIFETIME, 3);

//shape and position

set_hitbox_value(AT_FTILT , 1, HG_HITBOX_X, 30);
set_hitbox_value(AT_FTILT , 1, HG_HITBOX_Y, -30);
set_hitbox_value(AT_FTILT , 1, HG_WIDTH, 50);
set_hitbox_value(AT_FTILT , 1, HG_HEIGHT, 50);

//grouping/priority

set_hitbox_value(AT_FTILT , 1, HG_HITBOX_GROUP, 1);
set_hitbox_value(AT_FTILT , 1, HG_PRIORITY, 5);

//damage
set_hitbox_value(AT_FTILT , 1, HG_DAMAGE, 8);

//knockback
set_hitbox_value(AT_FTILT , 1, HG_BASE_KNOCKBACK, 6);
set_hitbox_value(AT_FTILT , 1, HG_KNOCKBACK_SCALING, 0.5);
set_hitbox_value(AT_FTILT , 1, HG_ANGLE, 45);
set_hitbox_value(AT_FTILT , 1, HG_ANGLE_FLIPPER, 0);

//hitpause
set_hitbox_value(AT_FTILT , 1, HG_BASE_HITPAUSE, 6);
set_hitbox_value(AT_FTILT , 1, HG_HITPAUSE_SCALING, 0.5);

//effects
set_hitbox_value(AT_FTILT , 1, HG_VISUAL_EFFECT, 0);
set_hitbox_value(AT_FTILT , 1, HG_HIT_SFX, asset_get("sfx_blow_weak1"));

Addendum: What about ‘HG_PARENT_HITBOX’?

Although HG_PARENT_HITBOX is included in many hitbox templates, it’s only needed in rare cases. HG_PARENT_HITBOX works by overwriting most of a hitbox’s Grid Indexes with the selected hitbox’s Grid Indexes. It’s useful for when you need several hitboxes to share the same size and properties in different positions (e.g. Sylvanos B-Air), otherwise it serves little purpose. If your hitbox seems to be ‘stuck’ no matter which numbers you change, try erasing HG_PARENT_HITBOX.


Posted

in

by

Tags:

Comments

Leave a Reply

Your email address will not be published. Required fields are marked *