{"id":984,"date":"2026-06-09T16:54:54","date_gmt":"2026-06-09T16:54:54","guid":{"rendered":"https:\/\/rivals2.com\/workshop-dev\/?post_type=knowledgebase&#038;p=984"},"modified":"2026-06-10T20:24:25","modified_gmt":"2026-06-10T20:24:25","slug":"how-to-make-a-rivals-2-attack","status":"publish","type":"knowledgebase","link":"https:\/\/rivals2.com\/workshop\/knowledge-base\/miscellaneous\/how-to-make-a-rivals-2-attack\/","title":{"rendered":"How to Make a Rivals 2 Attack"},"content":{"rendered":"\n<h2 class=\"wp-block-heading\">Creating a basic grounded attack<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">In this tutorial, we&#8217;re going to create a very basic grounded attack with a single active window and no sweetspot\/sourspot hitboxes. This will serve as the basis for the rest of the tutorials on this page.<\/p>\n\n\n\n<ol class=\"wp-block-list\">\n<li>Open the attack data for the attack you want to create.<\/li>\n\n\n\n<li>Set the groundedness to &#8220;Ground Only&#8221;. This makes sure the attack doesn&#8217;t continue if the ground disappears from under it.<\/li>\n<\/ol>\n\n\n\n<figure class=\"wp-block-image size-full\"><img loading=\"lazy\" decoding=\"async\" width=\"803\" height=\"591\" src=\"https:\/\/rivals2.com\/workshop\/wp-content\/uploads\/2026\/06\/image-114.png\" alt=\"\" class=\"wp-image-985\" srcset=\"https:\/\/rivals2.com\/workshop\/wp-content\/uploads\/2026\/06\/image-114.png 803w, https:\/\/rivals2.com\/workshop\/wp-content\/uploads\/2026\/06\/image-114-300x221.png 300w, https:\/\/rivals2.com\/workshop\/wp-content\/uploads\/2026\/06\/image-114-768x565.png 768w\" sizes=\"auto, (max-width: 803px) 100vw, 803px\" \/><\/figure>\n\n\n\n<ol start=\"3\" class=\"wp-block-list\">\n<li>Set the Rooted Type to Rooted. This makes the attack stop at ledges, but still allows it to ledge cancel when hitting a shield.<\/li>\n<\/ol>\n\n\n\n<figure class=\"wp-block-image size-full\"><img loading=\"lazy\" decoding=\"async\" width=\"803\" height=\"591\" src=\"https:\/\/rivals2.com\/workshop\/wp-content\/uploads\/2026\/06\/image-115.png\" alt=\"\" class=\"wp-image-986\" srcset=\"https:\/\/rivals2.com\/workshop\/wp-content\/uploads\/2026\/06\/image-115.png 803w, https:\/\/rivals2.com\/workshop\/wp-content\/uploads\/2026\/06\/image-115-300x221.png 300w, https:\/\/rivals2.com\/workshop\/wp-content\/uploads\/2026\/06\/image-115-768x565.png 768w\" sizes=\"auto, (max-width: 803px) 100vw, 803px\" \/><\/figure>\n\n\n\n<ol start=\"4\" class=\"wp-block-list\">\n<li>Set the Grounded Animation to the intended animation. Attacks with no animations cannot be tested in game.<\/li>\n\n\n\n<li>Add 3 elements to the Windows array. Name them &#8220;Startup&#8221;, &#8220;Active&#8221;, and &#8220;Recovery&#8221; respectively.<\/li>\n<\/ol>\n\n\n\n<figure class=\"wp-block-image size-large\"><img loading=\"lazy\" decoding=\"async\" width=\"646\" height=\"1024\" src=\"https:\/\/rivals2.com\/workshop\/wp-content\/uploads\/2026\/06\/image-119-646x1024.png\" alt=\"\" class=\"wp-image-990\" srcset=\"https:\/\/rivals2.com\/workshop\/wp-content\/uploads\/2026\/06\/image-119-646x1024.png 646w, https:\/\/rivals2.com\/workshop\/wp-content\/uploads\/2026\/06\/image-119-189x300.png 189w, https:\/\/rivals2.com\/workshop\/wp-content\/uploads\/2026\/06\/image-119-768x1217.png 768w, https:\/\/rivals2.com\/workshop\/wp-content\/uploads\/2026\/06\/image-119.png 803w\" sizes=\"auto, (max-width: 646px) 100vw, 646px\" \/><\/figure>\n\n\n\n<ol start=\"6\" class=\"wp-block-list\">\n<li>To set up the frame data, set the &#8220;Window Length Frames&#8221; for each of the windows to the intended durations. This example attack will have 5 startup frames, 3 active frames, and 18 recovery frames\n<ol class=\"wp-block-list\">\n<li>Note: On the recovery window, the &#8220;IASA Frame&#8221; determines the actual frame data, while the &#8220;Window Length Frames&#8221; just determine how long the animation will play. In this example, the recovery animation will play for 25 frames, but the character will be actionable on frame 18.<\/li>\n<\/ol>\n<\/li>\n<\/ol>\n\n\n\n<figure class=\"wp-block-image size-large\"><img loading=\"lazy\" decoding=\"async\" width=\"609\" height=\"1024\" src=\"https:\/\/rivals2.com\/workshop\/wp-content\/uploads\/2026\/06\/image-116-609x1024.png\" alt=\"\" class=\"wp-image-989\" srcset=\"https:\/\/rivals2.com\/workshop\/wp-content\/uploads\/2026\/06\/image-116-609x1024.png 609w, https:\/\/rivals2.com\/workshop\/wp-content\/uploads\/2026\/06\/image-116-178x300.png 178w, https:\/\/rivals2.com\/workshop\/wp-content\/uploads\/2026\/06\/image-116-768x1291.png 768w, https:\/\/rivals2.com\/workshop\/wp-content\/uploads\/2026\/06\/image-116.png 803w\" sizes=\"auto, (max-width: 609px) 100vw, 609px\" \/><\/figure>\n\n\n\n<ol start=\"7\" class=\"wp-block-list\">\n<li>To make the animation match the frame data, enter the &#8220;Animation Start Frame&#8221; and &#8220;Animation Length Frames&#8221; numbers for each of the windows.\n<ol class=\"wp-block-list\">\n<li>Note: If the frame data matches the animation perfectly, then &#8220;Animation Length Frames&#8221; should match the &#8220;Window Length Frames&#8221; value and &#8220;Animation Start Frame&#8221; should just be the previous window&#8217;s &#8220;Animation Start Frame&#8221; plus its &#8220;Animation Length Frames&#8221;, like in the picture below.<\/li>\n<\/ol>\n<\/li>\n<\/ol>\n\n\n\n<figure class=\"wp-block-image size-large\"><img loading=\"lazy\" decoding=\"async\" width=\"609\" height=\"1024\" src=\"https:\/\/rivals2.com\/workshop\/wp-content\/uploads\/2026\/06\/image-117-609x1024.png\" alt=\"\" class=\"wp-image-988\" srcset=\"https:\/\/rivals2.com\/workshop\/wp-content\/uploads\/2026\/06\/image-117-609x1024.png 609w, https:\/\/rivals2.com\/workshop\/wp-content\/uploads\/2026\/06\/image-117-178x300.png 178w, https:\/\/rivals2.com\/workshop\/wp-content\/uploads\/2026\/06\/image-117-768x1291.png 768w, https:\/\/rivals2.com\/workshop\/wp-content\/uploads\/2026\/06\/image-117.png 803w\" sizes=\"auto, (max-width: 609px) 100vw, 609px\" \/><\/figure>\n\n\n\n<ol start=\"8\" class=\"wp-block-list\">\n<li>Set the &#8220;Next Window String Table Key&#8221; for each window so that they transition into each other.<\/li>\n<\/ol>\n\n\n\n<figure class=\"wp-block-image size-large\"><img loading=\"lazy\" decoding=\"async\" width=\"609\" height=\"1024\" src=\"https:\/\/rivals2.com\/workshop\/wp-content\/uploads\/2026\/06\/image-122-609x1024.png\" alt=\"\" class=\"wp-image-993\" srcset=\"https:\/\/rivals2.com\/workshop\/wp-content\/uploads\/2026\/06\/image-122-609x1024.png 609w, https:\/\/rivals2.com\/workshop\/wp-content\/uploads\/2026\/06\/image-122-178x300.png 178w, https:\/\/rivals2.com\/workshop\/wp-content\/uploads\/2026\/06\/image-122-768x1291.png 768w, https:\/\/rivals2.com\/workshop\/wp-content\/uploads\/2026\/06\/image-122.png 803w\" sizes=\"auto, (max-width: 609px) 100vw, 609px\" \/><\/figure>\n\n\n\n<ol start=\"9\" class=\"wp-block-list\">\n<li>Scroll down to the &#8220;Hitbox On Hit Properties&#8221; section and add an entry to the array. Normally, you would give it a descriptive name to differentiate from the other on-hit properties, but since this attack only has one, you can name it whatever you want. In this example, we&#8217;ll name it &#8220;Hit&#8221; for simplicity.<\/li>\n<\/ol>\n\n\n\n<figure class=\"wp-block-image size-full\"><img loading=\"lazy\" decoding=\"async\" width=\"803\" height=\"731\" src=\"https:\/\/rivals2.com\/workshop\/wp-content\/uploads\/2026\/06\/image-118.png\" alt=\"\" class=\"wp-image-987\" srcset=\"https:\/\/rivals2.com\/workshop\/wp-content\/uploads\/2026\/06\/image-118.png 803w, https:\/\/rivals2.com\/workshop\/wp-content\/uploads\/2026\/06\/image-118-300x273.png 300w, https:\/\/rivals2.com\/workshop\/wp-content\/uploads\/2026\/06\/image-118-768x699.png 768w\" sizes=\"auto, (max-width: 803px) 100vw, 803px\" \/><\/figure>\n\n\n\n<ol start=\"10\" class=\"wp-block-list\">\n<li>Set the &#8220;Damage&#8221;, &#8220;Base Knockback&#8221;, &#8220;Knockback Scaling&#8221;, and &#8220;Knockback Angle&#8221; fields. These determine how the enemy gets launched when hit by this attack.<\/li>\n<\/ol>\n\n\n\n<figure class=\"wp-block-image size-full\"><img loading=\"lazy\" decoding=\"async\" width=\"803\" height=\"731\" src=\"https:\/\/rivals2.com\/workshop\/wp-content\/uploads\/2026\/06\/image-121.png\" alt=\"\" class=\"wp-image-992\" srcset=\"https:\/\/rivals2.com\/workshop\/wp-content\/uploads\/2026\/06\/image-121.png 803w, https:\/\/rivals2.com\/workshop\/wp-content\/uploads\/2026\/06\/image-121-300x273.png 300w, https:\/\/rivals2.com\/workshop\/wp-content\/uploads\/2026\/06\/image-121-768x699.png 768w\" sizes=\"auto, (max-width: 803px) 100vw, 803px\" \/><\/figure>\n\n\n\n<ol start=\"11\" class=\"wp-block-list\">\n<li>Set the &#8220;Hit Effect Name&#8221; and &#8220;Hit Sound Name&#8221; so that the move has visual\/audio feedback on hit. In this example, we&#8217;ll use the standard values of &#8220;Hit Normal Medium&#8221; for the vfx and &#8220;Hit Blunt Medium&#8221; for the sfx.\n<ul class=\"wp-block-list\">\n<li><a href=\"https:\/\/rivals2.com\/workshop\/knowledge-base\/miscellaneous\/universal-sfx-sound-and-vfx-particles\/\" data-type=\"knowledgebase\" data-id=\"1155\" target=\"_blank\" rel=\"noreferrer noopener\">The list of universal vfx and sfx can be found here.<\/a><\/li>\n<\/ul>\n<\/li>\n<\/ol>\n\n\n\n<figure class=\"wp-block-image size-full\"><img loading=\"lazy\" decoding=\"async\" width=\"803\" height=\"731\" src=\"https:\/\/rivals2.com\/workshop\/wp-content\/uploads\/2026\/06\/image-120.png\" alt=\"\" class=\"wp-image-991\" srcset=\"https:\/\/rivals2.com\/workshop\/wp-content\/uploads\/2026\/06\/image-120.png 803w, https:\/\/rivals2.com\/workshop\/wp-content\/uploads\/2026\/06\/image-120-300x273.png 300w, https:\/\/rivals2.com\/workshop\/wp-content\/uploads\/2026\/06\/image-120-768x699.png 768w\" sizes=\"auto, (max-width: 803px) 100vw, 803px\" \/><\/figure>\n\n\n\n<ol start=\"12\" class=\"wp-block-list\">\n<li>Next we want to create the hitboxes that will use the on-hit properties we just made. In the &#8220;Hitbox Attributes&#8221; section, add 3 entries, named &#8220;Tip&#8221;, &#8220;Mid&#8221;, and &#8220;Base&#8221;.<\/li>\n<\/ol>\n\n\n\n<figure class=\"wp-block-image size-large\"><img loading=\"lazy\" decoding=\"async\" width=\"616\" height=\"1024\" src=\"https:\/\/rivals2.com\/workshop\/wp-content\/uploads\/2026\/06\/image-124-616x1024.png\" alt=\"\" class=\"wp-image-995\" srcset=\"https:\/\/rivals2.com\/workshop\/wp-content\/uploads\/2026\/06\/image-124-616x1024.png 616w, https:\/\/rivals2.com\/workshop\/wp-content\/uploads\/2026\/06\/image-124-181x300.png 181w, https:\/\/rivals2.com\/workshop\/wp-content\/uploads\/2026\/06\/image-124-768x1276.png 768w, https:\/\/rivals2.com\/workshop\/wp-content\/uploads\/2026\/06\/image-124.png 803w\" sizes=\"auto, (max-width: 616px) 100vw, 616px\" \/><\/figure>\n\n\n\n<ol start=\"13\" class=\"wp-block-list\">\n<li>Set the &#8220;Bone Name&#8221; for each of these hitboxes to determine which bones they will follow. In this example, we&#8217;ll use the common values of &#8220;Wrist_R&#8221;, &#8220;Elbow_R&#8221;, and &#8220;Shoulder_R&#8221;.<\/li>\n<\/ol>\n\n\n\n<figure class=\"wp-block-image size-large\"><img loading=\"lazy\" decoding=\"async\" width=\"616\" height=\"1024\" src=\"https:\/\/rivals2.com\/workshop\/wp-content\/uploads\/2026\/06\/image-123-616x1024.png\" alt=\"\" class=\"wp-image-994\" srcset=\"https:\/\/rivals2.com\/workshop\/wp-content\/uploads\/2026\/06\/image-123-616x1024.png 616w, https:\/\/rivals2.com\/workshop\/wp-content\/uploads\/2026\/06\/image-123-181x300.png 181w, https:\/\/rivals2.com\/workshop\/wp-content\/uploads\/2026\/06\/image-123-768x1276.png 768w, https:\/\/rivals2.com\/workshop\/wp-content\/uploads\/2026\/06\/image-123.png 803w\" sizes=\"auto, (max-width: 616px) 100vw, 616px\" \/><\/figure>\n\n\n\n<ol start=\"14\" class=\"wp-block-list\">\n<li>Next we will set the radius for each of these hitboxes. These values will vary greatly for each attack.<\/li>\n<\/ol>\n\n\n\n<figure class=\"wp-block-image size-large\"><img loading=\"lazy\" decoding=\"async\" width=\"616\" height=\"1024\" src=\"https:\/\/rivals2.com\/workshop\/wp-content\/uploads\/2026\/06\/image-128-616x1024.png\" alt=\"\" class=\"wp-image-998\" srcset=\"https:\/\/rivals2.com\/workshop\/wp-content\/uploads\/2026\/06\/image-128-616x1024.png 616w, https:\/\/rivals2.com\/workshop\/wp-content\/uploads\/2026\/06\/image-128-181x300.png 181w, https:\/\/rivals2.com\/workshop\/wp-content\/uploads\/2026\/06\/image-128-768x1276.png 768w, https:\/\/rivals2.com\/workshop\/wp-content\/uploads\/2026\/06\/image-128.png 803w\" sizes=\"auto, (max-width: 616px) 100vw, 616px\" \/><\/figure>\n\n\n\n<ol start=\"15\" class=\"wp-block-list\">\n<li>Set the &#8220;On Hit Properties Name&#8221; for all of the hitboxes to &#8220;Hit&#8221;, the name of the on-hit properties entry we made earlier.<\/li>\n<\/ol>\n\n\n\n<figure class=\"wp-block-image size-large\"><img loading=\"lazy\" decoding=\"async\" width=\"616\" height=\"1024\" src=\"https:\/\/rivals2.com\/workshop\/wp-content\/uploads\/2026\/06\/image-127-616x1024.png\" alt=\"\" class=\"wp-image-1000\" srcset=\"https:\/\/rivals2.com\/workshop\/wp-content\/uploads\/2026\/06\/image-127-616x1024.png 616w, https:\/\/rivals2.com\/workshop\/wp-content\/uploads\/2026\/06\/image-127-181x300.png 181w, https:\/\/rivals2.com\/workshop\/wp-content\/uploads\/2026\/06\/image-127-768x1276.png 768w, https:\/\/rivals2.com\/workshop\/wp-content\/uploads\/2026\/06\/image-127.png 803w\" sizes=\"auto, (max-width: 616px) 100vw, 616px\" \/><\/figure>\n\n\n\n<ol start=\"16\" class=\"wp-block-list\">\n<li>Finally, go back up to the &#8220;Active&#8221; window and add 3 entries to the &#8220;Hitbox Windows&#8221; array. Enter the hitbox attributes names into each of the &#8220;Hitbox Name&#8221; fields. We can leave the &#8220;Start Frame&#8221; and &#8220;Length in Frames&#8221; fields at 0, since that makes the hitbox last for the full duration of the window.\n<ol class=\"wp-block-list\">\n<li>Note: The order of this array determines the priority of the hitboxes. The first entry will detect collision before the ones below it. In this example, we&#8217;re giving the Base hitbox the highest priority, then the Tip hitbox, and finally the Mid hitbox. This is a fairly common setup for moves with a sweetspot on the tip, although this attack only has one on-hit properties entry, so the priority order will only affect where the hit vfx is spawned, since it&#8217;s relative to the location of the hitbox that hit.<\/li>\n<\/ol>\n<\/li>\n<\/ol>\n\n\n\n<figure class=\"wp-block-image size-full\"><img loading=\"lazy\" decoding=\"async\" width=\"803\" height=\"982\" src=\"https:\/\/rivals2.com\/workshop\/wp-content\/uploads\/2026\/06\/image-126.png\" alt=\"\" class=\"wp-image-999\" srcset=\"https:\/\/rivals2.com\/workshop\/wp-content\/uploads\/2026\/06\/image-126.png 803w, https:\/\/rivals2.com\/workshop\/wp-content\/uploads\/2026\/06\/image-126-245x300.png 245w, https:\/\/rivals2.com\/workshop\/wp-content\/uploads\/2026\/06\/image-126-768x939.png 768w\" sizes=\"auto, (max-width: 803px) 100vw, 803px\" \/><\/figure>\n\n\n\n<h2 class=\"wp-block-heading\">Creating a basic aerial attack<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">Most of the setup is the same as the basic attack described above, with only the following differences:<\/p>\n\n\n\n<ol class=\"wp-block-list\">\n<li>Change the Groundedness to &#8220;Air Only&#8221;. This makes the move go into the Landing Lag state when it becomes grounded.<\/li>\n\n\n\n<li>Set the &#8220;Aerial Animation&#8221; to the intended animation.<\/li>\n\n\n\n<li>Set the &#8220;Landing Lag&#8221; value to determine the landing lag frames of this aerial. The value is usually no lower than 7 frames.<\/li>\n\n\n\n<li>Optional: Set a &#8220;Landing Lag Animation&#8221;. If you don&#8217;t set this property, it will use the character&#8217;s default landing lag animation, as specified in the character data.<\/li>\n\n\n\n<li>Optional: Open the &#8220;Ledge Properties&#8221; section of the &#8220;Recovery&#8221; window. Set the &#8220;Can Grab Ledge on Frame&#8221; property to a value higher than the IASA frame.\n<ol class=\"wp-block-list\">\n<li>Most aerials use this property to prevent them from grabbing ledge too quickly after being used from ledge.<\/li>\n<\/ol>\n<\/li>\n<\/ol>\n\n\n\n<h2 class=\"wp-block-heading\">Creating a strong attack<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">Most of the setup is the same as the basic attack described above, with only the following differences:<\/p>\n\n\n\n<ol class=\"wp-block-list\">\n<li>Instead of a single &#8220;Startup&#8221; window, you will need 3 startup windows, called &#8220;Pre-Charge&#8221;, &#8220;Charge&#8221;, and &#8220;Post-Charge&#8221;.<\/li>\n<\/ol>\n\n\n\n<figure class=\"wp-block-image size-full\"><img loading=\"lazy\" decoding=\"async\" width=\"803\" height=\"790\" src=\"https:\/\/rivals2.com\/workshop\/wp-content\/uploads\/2026\/06\/image-125.png\" alt=\"\" class=\"wp-image-996\" srcset=\"https:\/\/rivals2.com\/workshop\/wp-content\/uploads\/2026\/06\/image-125.png 803w, https:\/\/rivals2.com\/workshop\/wp-content\/uploads\/2026\/06\/image-125-300x295.png 300w, https:\/\/rivals2.com\/workshop\/wp-content\/uploads\/2026\/06\/image-125-768x756.png 768w\" sizes=\"auto, (max-width: 803px) 100vw, 803px\" \/><\/figure>\n\n\n\n<ol start=\"2\" class=\"wp-block-list\">\n<li>Set the window lengths and animation frames the same way you would in the basic attack example above. The &#8220;Charge&#8221; window needs to be 60 frames long.<\/li>\n<\/ol>\n\n\n\n<figure class=\"wp-block-image size-large\"><img loading=\"lazy\" decoding=\"async\" width=\"644\" height=\"1024\" src=\"https:\/\/rivals2.com\/workshop\/wp-content\/uploads\/2026\/06\/image-130-644x1024.png\" alt=\"\" class=\"wp-image-1002\" srcset=\"https:\/\/rivals2.com\/workshop\/wp-content\/uploads\/2026\/06\/image-130-644x1024.png 644w, https:\/\/rivals2.com\/workshop\/wp-content\/uploads\/2026\/06\/image-130-189x300.png 189w, https:\/\/rivals2.com\/workshop\/wp-content\/uploads\/2026\/06\/image-130-768x1221.png 768w, https:\/\/rivals2.com\/workshop\/wp-content\/uploads\/2026\/06\/image-130.png 803w\" sizes=\"auto, (max-width: 644px) 100vw, 644px\" \/><\/figure>\n\n\n\n<ol start=\"3\" class=\"wp-block-list\">\n<li>Add an entry into the &#8220;Window Cancels&#8221; section of the &#8220;Charge&#8221; window. Set the &#8220;Window Cancel Type&#8221; to &#8220;Strong Released&#8221; and the &#8220;Post Cancel Window String Table Key&#8221; to &#8220;Post-Charge&#8221;. This makes the attack only charge while the Strong button is held<\/li>\n<\/ol>\n\n\n\n<figure class=\"wp-block-image size-full\"><img loading=\"lazy\" decoding=\"async\" width=\"803\" height=\"790\" src=\"https:\/\/rivals2.com\/workshop\/wp-content\/uploads\/2026\/06\/image-125.png\" alt=\"\" class=\"wp-image-997\" srcset=\"https:\/\/rivals2.com\/workshop\/wp-content\/uploads\/2026\/06\/image-125.png 803w, https:\/\/rivals2.com\/workshop\/wp-content\/uploads\/2026\/06\/image-125-300x295.png 300w, https:\/\/rivals2.com\/workshop\/wp-content\/uploads\/2026\/06\/image-125-768x756.png 768w\" sizes=\"auto, (max-width: 803px) 100vw, 803px\" \/><\/figure>\n\n\n\n<h2 class=\"wp-block-heading\">Creating a basic recovery move<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">In this tutorial, we will create a basic recovery move that goes into special fall and can grab ledge.<\/p>\n\n\n\n<ol class=\"wp-block-list\">\n<li>Set the &#8220;BReverse Type&#8221; field to &#8220;Reverse Facing&#8221; (or &#8220;Reverse Momentum&#8221; if that makes sense for your attack) to allow B-Reversing this move.<\/li>\n\n\n\n<li>Add five windows, named: &#8220;Startup&#8221;, &#8220;Active&#8221;, &#8220;Recovery&#8221;, &#8220;Special Fall&#8221;, and &#8220;Special Land&#8221;<\/li>\n<\/ol>\n\n\n\n<figure class=\"wp-block-image size-full\"><img loading=\"lazy\" decoding=\"async\" width=\"803\" height=\"622\" src=\"https:\/\/rivals2.com\/workshop\/wp-content\/uploads\/2026\/06\/image-129.png\" alt=\"\" class=\"wp-image-1001\" srcset=\"https:\/\/rivals2.com\/workshop\/wp-content\/uploads\/2026\/06\/image-129.png 803w, https:\/\/rivals2.com\/workshop\/wp-content\/uploads\/2026\/06\/image-129-300x232.png 300w, https:\/\/rivals2.com\/workshop\/wp-content\/uploads\/2026\/06\/image-129-768x595.png 768w\" sizes=\"auto, (max-width: 803px) 100vw, 803px\" \/><\/figure>\n\n\n\n<ol start=\"3\" class=\"wp-block-list\">\n<li>To set up the frame data, set the &#8220;Window Length Frames&#8221; for each of the windows to the intended durations. In this example, we will use:\n<ol class=\"wp-block-list\">\n<li>Startup: 12<\/li>\n\n\n\n<li>Active: 20<\/li>\n\n\n\n<li>Recovery: 30<\/li>\n\n\n\n<li>Special Fall: 12<\/li>\n\n\n\n<li>Special Land 40 (30 IASA)<\/li>\n<\/ol>\n<\/li>\n\n\n\n<li>Set the &#8220;Next Window String Table Key&#8221; for each window so that they transition into each other. The &#8220;Special Fall&#8221; window should transition into itself so that it loops until you land.<\/li>\n\n\n\n<li>Set up the &#8220;Animation Start Frame&#8221; and &#8220;Animation Length Frames&#8221;, just like in the basic grounded attack example above.\n<ol class=\"wp-block-list\">\n<li>The only exception is for the &#8220;Special Land&#8221; window. It should start on frame 75 instead of 74, because &#8220;Special Fall&#8221; is a looping window and needs an extra frame for animation interpolation at higher frame rates.<\/li>\n<\/ol>\n<\/li>\n<\/ol>\n\n\n\n<figure class=\"wp-block-image size-full\"><img loading=\"lazy\" decoding=\"async\" width=\"803\" height=\"887\" src=\"https:\/\/rivals2.com\/workshop\/wp-content\/uploads\/2026\/06\/image-134.png\" alt=\"\" class=\"wp-image-1007\" srcset=\"https:\/\/rivals2.com\/workshop\/wp-content\/uploads\/2026\/06\/image-134.png 803w, https:\/\/rivals2.com\/workshop\/wp-content\/uploads\/2026\/06\/image-134-272x300.png 272w, https:\/\/rivals2.com\/workshop\/wp-content\/uploads\/2026\/06\/image-134-768x848.png 768w\" sizes=\"auto, (max-width: 803px) 100vw, 803px\" \/><\/figure>\n\n\n\n<figure class=\"wp-block-image size-large\"><img loading=\"lazy\" decoding=\"async\" width=\"648\" height=\"1024\" src=\"https:\/\/rivals2.com\/workshop\/wp-content\/uploads\/2026\/06\/image-142-648x1024.png\" alt=\"\" class=\"wp-image-1018\" srcset=\"https:\/\/rivals2.com\/workshop\/wp-content\/uploads\/2026\/06\/image-142-648x1024.png 648w, https:\/\/rivals2.com\/workshop\/wp-content\/uploads\/2026\/06\/image-142-190x300.png 190w, https:\/\/rivals2.com\/workshop\/wp-content\/uploads\/2026\/06\/image-142-768x1213.png 768w, https:\/\/rivals2.com\/workshop\/wp-content\/uploads\/2026\/06\/image-142.png 803w\" sizes=\"auto, (max-width: 648px) 100vw, 648px\" \/><\/figure>\n\n\n\n<ol start=\"6\" class=\"wp-block-list\">\n<li>Add an entry to the &#8220;Velocity Data&#8221; section of the &#8220;Startup&#8221; window. Set both the &#8220;Horizontal Velocity Type&#8221; and &#8220;Vertical Velocity Type&#8221; to &#8220;Const Velocity&#8221; and leave both parts of the &#8220;Velocity&#8221; field at zero. Then open the &#8220;Movement Properties&#8221; section of this window and set &#8220;Gravity&#8221; to zero. This will freeze your character in place during the startup window, which helps players space the move correctly when trying to recover.<\/li>\n<\/ol>\n\n\n\n<figure class=\"wp-block-image size-large\"><img loading=\"lazy\" decoding=\"async\" width=\"790\" height=\"1024\" src=\"https:\/\/rivals2.com\/workshop\/wp-content\/uploads\/2026\/06\/image-135-790x1024.png\" alt=\"\" class=\"wp-image-1009\" srcset=\"https:\/\/rivals2.com\/workshop\/wp-content\/uploads\/2026\/06\/image-135-790x1024.png 790w, https:\/\/rivals2.com\/workshop\/wp-content\/uploads\/2026\/06\/image-135-231x300.png 231w, https:\/\/rivals2.com\/workshop\/wp-content\/uploads\/2026\/06\/image-135-768x996.png 768w, https:\/\/rivals2.com\/workshop\/wp-content\/uploads\/2026\/06\/image-135.png 803w\" sizes=\"auto, (max-width: 790px) 100vw, 790px\" \/><\/figure>\n\n\n\n<ol start=\"7\" class=\"wp-block-list\">\n<li>Add an entry to the &#8220;Velocity Data&#8221; section of the &#8220;Active&#8221; window. Set both the &#8220;Horizontal Velocity Type&#8221; and &#8220;Vertical Velocity Type&#8221; to &#8220;Set Velocity&#8221;, then set value of the &#8220;Velocity&#8221; field to the desired values. This will apply that velocity to your character at the beginning of the &#8220;Active&#8221; window.<\/li>\n<\/ol>\n\n\n\n<figure class=\"wp-block-image size-full\"><img loading=\"lazy\" decoding=\"async\" width=\"803\" height=\"679\" src=\"https:\/\/rivals2.com\/workshop\/wp-content\/uploads\/2026\/06\/image-131.png\" alt=\"\" class=\"wp-image-1003\" srcset=\"https:\/\/rivals2.com\/workshop\/wp-content\/uploads\/2026\/06\/image-131.png 803w, https:\/\/rivals2.com\/workshop\/wp-content\/uploads\/2026\/06\/image-131-300x254.png 300w, https:\/\/rivals2.com\/workshop\/wp-content\/uploads\/2026\/06\/image-131-768x649.png 768w\" sizes=\"auto, (max-width: 803px) 100vw, 803px\" \/><\/figure>\n\n\n\n<ol start=\"8\" class=\"wp-block-list\">\n<li>In the &#8220;Active&#8221; window&#8217;s &#8220;Velocity Data&#8221; that we just created, add an entry into the &#8220;Velocity Modifiers&#8221; section. Set the &#8220;Modifier Input&#8221; to &#8220;Analog Forward&#8221;, the &#8220;Modifier Velocity Type&#8221; to &#8220;Change Angle&#8221;, and the &#8220;Angle Change&#8221; to -20. This allows the player to angle the move forward by tilting their joystick forward.<\/li>\n<\/ol>\n\n\n\n<figure class=\"wp-block-image size-full\"><img loading=\"lazy\" decoding=\"async\" width=\"803\" height=\"812\" src=\"https:\/\/rivals2.com\/workshop\/wp-content\/uploads\/2026\/06\/image-136.png\" alt=\"\" class=\"wp-image-1010\" srcset=\"https:\/\/rivals2.com\/workshop\/wp-content\/uploads\/2026\/06\/image-136.png 803w, https:\/\/rivals2.com\/workshop\/wp-content\/uploads\/2026\/06\/image-136-297x300.png 297w, https:\/\/rivals2.com\/workshop\/wp-content\/uploads\/2026\/06\/image-136-768x777.png 768w\" sizes=\"auto, (max-width: 803px) 100vw, 803px\" \/><\/figure>\n\n\n\n<ol start=\"9\" class=\"wp-block-list\">\n<li>Open the &#8220;Advanced Properties&#8221; section of the &#8220;Active&#8221; window and set &#8220;B-Reverse On Frame&#8221; to zero. This lets players use the entire startup window to B-Reverse this move.<\/li>\n<\/ol>\n\n\n\n<figure class=\"wp-block-image size-full\"><img loading=\"lazy\" decoding=\"async\" width=\"803\" height=\"987\" src=\"https:\/\/rivals2.com\/workshop\/wp-content\/uploads\/2026\/06\/image-138.png\" alt=\"\" class=\"wp-image-1012\" srcset=\"https:\/\/rivals2.com\/workshop\/wp-content\/uploads\/2026\/06\/image-138.png 803w, https:\/\/rivals2.com\/workshop\/wp-content\/uploads\/2026\/06\/image-138-244x300.png 244w, https:\/\/rivals2.com\/workshop\/wp-content\/uploads\/2026\/06\/image-138-768x944.png 768w\" sizes=\"auto, (max-width: 803px) 100vw, 803px\" \/><\/figure>\n\n\n\n<ol start=\"10\" class=\"wp-block-list\">\n<li>Open the &#8220;Movement Properties&#8221; section of the &#8220;Recovery&#8221; window. Set &#8220;Can Drift&#8221; to &#8220;Can Drift&#8221; to allow the character to drift during this window.<\/li>\n<\/ol>\n\n\n\n<figure class=\"wp-block-image size-large\"><img loading=\"lazy\" decoding=\"async\" width=\"790\" height=\"1024\" src=\"https:\/\/rivals2.com\/workshop\/wp-content\/uploads\/2026\/06\/image-135-790x1024.png\" alt=\"\" class=\"wp-image-1008\" srcset=\"https:\/\/rivals2.com\/workshop\/wp-content\/uploads\/2026\/06\/image-135-790x1024.png 790w, https:\/\/rivals2.com\/workshop\/wp-content\/uploads\/2026\/06\/image-135-231x300.png 231w, https:\/\/rivals2.com\/workshop\/wp-content\/uploads\/2026\/06\/image-135-768x996.png 768w, https:\/\/rivals2.com\/workshop\/wp-content\/uploads\/2026\/06\/image-135.png 803w\" sizes=\"auto, (max-width: 790px) 100vw, 790px\" \/><\/figure>\n\n\n\n<ol start=\"11\" class=\"wp-block-list\">\n<li>Open the &#8220;Movement Properties&#8221; section of the &#8220;Special Fall&#8221; window. Set &#8220;Can Drift&#8221; to &#8220;Can Drift&#8221; and set &#8220;Can Fall Through Platforms&#8221; to true. This allows the character to drift and fall through platforms during special fall, which is standard behavior.<\/li>\n<\/ol>\n\n\n\n<figure class=\"wp-block-image size-full\"><img loading=\"lazy\" decoding=\"async\" width=\"803\" height=\"887\" src=\"https:\/\/rivals2.com\/workshop\/wp-content\/uploads\/2026\/06\/image-132.png\" alt=\"\" class=\"wp-image-1004\" srcset=\"https:\/\/rivals2.com\/workshop\/wp-content\/uploads\/2026\/06\/image-132.png 803w, https:\/\/rivals2.com\/workshop\/wp-content\/uploads\/2026\/06\/image-132-272x300.png 272w, https:\/\/rivals2.com\/workshop\/wp-content\/uploads\/2026\/06\/image-132-768x848.png 768w\" sizes=\"auto, (max-width: 803px) 100vw, 803px\" \/><\/figure>\n\n\n\n<ol start=\"12\" class=\"wp-block-list\">\n<li>Add an entry to the &#8220;Window Cancels&#8221; section of the &#8220;Special Fall&#8221; window. Set the &#8220;Window Cancel Type&#8221; to &#8220;Grounded&#8221; and the &#8220;Post Cancel Window String Table Key&#8221; to &#8220;Special Land&#8221; so that it cancels when it lands.<\/li>\n<\/ol>\n\n\n\n<figure class=\"wp-block-image size-full\"><img loading=\"lazy\" decoding=\"async\" width=\"803\" height=\"887\" src=\"https:\/\/rivals2.com\/workshop\/wp-content\/uploads\/2026\/06\/image-134.png\" alt=\"\" class=\"wp-image-1005\" srcset=\"https:\/\/rivals2.com\/workshop\/wp-content\/uploads\/2026\/06\/image-134.png 803w, https:\/\/rivals2.com\/workshop\/wp-content\/uploads\/2026\/06\/image-134-272x300.png 272w, https:\/\/rivals2.com\/workshop\/wp-content\/uploads\/2026\/06\/image-134-768x848.png 768w\" sizes=\"auto, (max-width: 803px) 100vw, 803px\" \/><\/figure>\n\n\n\n<ol start=\"13\" class=\"wp-block-list\">\n<li>Add an entry to the &#8220;Window Cancels&#8221; section of the &#8220;Special Land&#8221; window. Set the &#8220;Window Cancel Type&#8221; to &#8220;Aerial&#8221; and leave the &#8220;Post Cancel Window String Table Key&#8221; blank. This will make it able to ledge cancel.<\/li>\n<\/ol>\n\n\n\n<figure class=\"wp-block-image size-full\"><img loading=\"lazy\" decoding=\"async\" width=\"803\" height=\"887\" src=\"https:\/\/rivals2.com\/workshop\/wp-content\/uploads\/2026\/06\/image-140.png\" alt=\"\" class=\"wp-image-1015\" srcset=\"https:\/\/rivals2.com\/workshop\/wp-content\/uploads\/2026\/06\/image-140.png 803w, https:\/\/rivals2.com\/workshop\/wp-content\/uploads\/2026\/06\/image-140-272x300.png 272w, https:\/\/rivals2.com\/workshop\/wp-content\/uploads\/2026\/06\/image-140-768x848.png 768w\" sizes=\"auto, (max-width: 803px) 100vw, 803px\" \/><\/figure>\n\n\n\n<ol start=\"14\" class=\"wp-block-list\">\n<li>Open the &#8220;Ledge Properties&#8221; section of the &#8220;Recovery&#8221; window. Set &#8220;Can Grab Ledge on Frame&#8221; to zero then set values for the &#8220;Ledge Grab Box Offset&#8221; and &#8220;Ledge Grab Box Dimensions&#8221; that make sense for your character.\n<ol class=\"wp-block-list\">\n<li>Note: Attacks that can grab ledge usually extend your ledge grab box backward significantly, otherwise you could just leave the offset and dimensions at zero to use the default values from the character data.<\/li>\n<\/ol>\n<\/li>\n<\/ol>\n\n\n\n<figure class=\"wp-block-image size-full\"><img loading=\"lazy\" decoding=\"async\" width=\"803\" height=\"798\" src=\"https:\/\/rivals2.com\/workshop\/wp-content\/uploads\/2026\/06\/image-141.png\" alt=\"\" class=\"wp-image-1016\" srcset=\"https:\/\/rivals2.com\/workshop\/wp-content\/uploads\/2026\/06\/image-141.png 803w, https:\/\/rivals2.com\/workshop\/wp-content\/uploads\/2026\/06\/image-141-300x298.png 300w, https:\/\/rivals2.com\/workshop\/wp-content\/uploads\/2026\/06\/image-141-150x150.png 150w, https:\/\/rivals2.com\/workshop\/wp-content\/uploads\/2026\/06\/image-141-768x763.png 768w\" sizes=\"auto, (max-width: 803px) 100vw, 803px\" \/><\/figure>\n\n\n\n<ol start=\"15\" class=\"wp-block-list\">\n<li>Copy the &#8220;Ledge Properties&#8221; section of the &#8220;Recovery&#8221; window and paste it into the &#8220;Ledge Properties&#8221; section of the &#8220;Special Fall&#8221; window.\n<ol class=\"wp-block-list\">\n<li>Note: You can quickly copy\/paste in Unreal by using Shift+Right Click for copy and Shift+Left Click for paste.<\/li>\n<\/ol>\n<\/li>\n\n\n\n<li>Add hitboxes to the active window using the same steps from the basic grounded attack example above.<\/li>\n<\/ol>\n\n\n\n<h2 class=\"wp-block-heading\">Adding a projectile to an attack<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">In this tutorial, we will be adding an extremely simple projectile to an existing attack.<\/p>\n\n\n\n<ol class=\"wp-block-list\">\n<li><a href=\"https:\/\/rivals2.com\/workshop\/knowledge-base\/character-creation\/creating-custom-lua-articles\/\" data-type=\"knowledgebase\" data-id=\"561\" target=\"_blank\" rel=\"noreferrer noopener\">Create a new RivalsArticleData asset and an RivalsArticleRenderer asset.<\/a><\/li>\n\n\n\n<li>Set the &#8220;Attack&#8221; field to the appropriate attack, the &#8220;Article Name&#8221; to the name of the article, the &#8220;Default Renderer Class&#8221; to the appropriate article renderer class, and &#8220;Is Projectile&#8221; to true.<\/li>\n<\/ol>\n\n\n\n<figure class=\"wp-block-image size-full\"><img loading=\"lazy\" decoding=\"async\" width=\"803\" height=\"685\" src=\"https:\/\/rivals2.com\/workshop\/wp-content\/uploads\/2026\/06\/image-133.png\" alt=\"\" class=\"wp-image-1006\" srcset=\"https:\/\/rivals2.com\/workshop\/wp-content\/uploads\/2026\/06\/image-133.png 803w, https:\/\/rivals2.com\/workshop\/wp-content\/uploads\/2026\/06\/image-133-300x256.png 300w, https:\/\/rivals2.com\/workshop\/wp-content\/uploads\/2026\/06\/image-133-768x655.png 768w\" sizes=\"auto, (max-width: 803px) 100vw, 803px\" \/><\/figure>\n\n\n\n<ol start=\"3\" class=\"wp-block-list\">\n<li>Add two entries to the &#8220;Windows&#8221; section, named: &#8220;Active&#8221; and &#8220;Destroy&#8221;.<\/li>\n\n\n\n<li>Set the &#8220;Next Window String Table Key&#8221; for the &#8220;Active&#8221; window to &#8220;Destroy&#8221; so that it transitions into the correct window when it finishes.<\/li>\n\n\n\n<li>Set the &#8220;Window Length Frames&#8221; fields for each window to determine how long they last. In this example, we&#8217;ll give it 60 Active frames and 10 Destroy frames.<\/li>\n<\/ol>\n\n\n\n<figure class=\"wp-block-image size-full\"><img loading=\"lazy\" decoding=\"async\" width=\"803\" height=\"887\" src=\"https:\/\/rivals2.com\/workshop\/wp-content\/uploads\/2026\/06\/image-140.png\" alt=\"\" class=\"wp-image-1014\" srcset=\"https:\/\/rivals2.com\/workshop\/wp-content\/uploads\/2026\/06\/image-140.png 803w, https:\/\/rivals2.com\/workshop\/wp-content\/uploads\/2026\/06\/image-140-272x300.png 272w, https:\/\/rivals2.com\/workshop\/wp-content\/uploads\/2026\/06\/image-140-768x848.png 768w\" sizes=\"auto, (max-width: 803px) 100vw, 803px\" \/><\/figure>\n\n\n\n<ol start=\"6\" class=\"wp-block-list\">\n<li>If the article has animations, set the &#8220;Window Animation&#8221;, &#8220;Animation Start Frame&#8221;, and &#8220;Animation Length Frames&#8221; fields in both windows.\n<ol class=\"wp-block-list\">\n<li>Note: Unlike character attack data, each window can use a different animation, so the animation frames may not be consecutive.<\/li>\n<\/ol>\n<\/li>\n<\/ol>\n\n\n\n<figure class=\"wp-block-image size-large\"><img loading=\"lazy\" decoding=\"async\" width=\"648\" height=\"1024\" src=\"https:\/\/rivals2.com\/workshop\/wp-content\/uploads\/2026\/06\/image-142-648x1024.png\" alt=\"\" class=\"wp-image-1017\" srcset=\"https:\/\/rivals2.com\/workshop\/wp-content\/uploads\/2026\/06\/image-142-648x1024.png 648w, https:\/\/rivals2.com\/workshop\/wp-content\/uploads\/2026\/06\/image-142-190x300.png 190w, https:\/\/rivals2.com\/workshop\/wp-content\/uploads\/2026\/06\/image-142-768x1213.png 768w, https:\/\/rivals2.com\/workshop\/wp-content\/uploads\/2026\/06\/image-142.png 803w\" sizes=\"auto, (max-width: 648px) 100vw, 648px\" \/><\/figure>\n\n\n\n<ol start=\"7\" class=\"wp-block-list\">\n<li>Add an entry to the &#8220;Velocity Data&#8221; section of the &#8220;Active&#8221; window. Set the &#8220;Horizontal Velocity Type&#8221; to &#8220;Const Velocity&#8221; and set the X value of the &#8220;Velocity&#8221; field to the desired value. In this example, we&#8217;re using 15, which will make it move forward at a constant velocity of 15 cm per frame with no vertical movement.<\/li>\n<\/ol>\n\n\n\n<figure class=\"wp-block-image size-full\"><img loading=\"lazy\" decoding=\"async\" width=\"803\" height=\"736\" src=\"https:\/\/rivals2.com\/workshop\/wp-content\/uploads\/2026\/06\/image-139.png\" alt=\"\" class=\"wp-image-1013\" srcset=\"https:\/\/rivals2.com\/workshop\/wp-content\/uploads\/2026\/06\/image-139.png 803w, https:\/\/rivals2.com\/workshop\/wp-content\/uploads\/2026\/06\/image-139-300x275.png 300w, https:\/\/rivals2.com\/workshop\/wp-content\/uploads\/2026\/06\/image-139-768x704.png 768w\" sizes=\"auto, (max-width: 803px) 100vw, 803px\" \/><\/figure>\n\n\n\n<ol start=\"8\" class=\"wp-block-list\">\n<li>Add a hitbox to the &#8220;Active&#8221; window the same way as in the basic grounded attack example above.<\/li>\n\n\n\n<li>Open up the attack data that you want to spawn the projectile. Add an entry into the &#8220;Article Creation Data&#8221; section of that attack. Set the &#8220;Article Data&#8221; field to the newly created article data, then set the &#8220;Creation Window String Table Key&#8221; to the name of the window where you want the article to spawn and set the &#8220;Creation Window Frame&#8221; to the frame you want it to spawn in that window. In this example, we&#8217;re spawning it on frame 0 of the &#8220;Active&#8221; window. You can also adjust the spawn location with the &#8220;Initial Offset from Owner&#8221; field.<\/li>\n<\/ol>\n\n\n\n<figure class=\"wp-block-image size-full\"><img loading=\"lazy\" decoding=\"async\" width=\"803\" height=\"736\" src=\"https:\/\/rivals2.com\/workshop\/wp-content\/uploads\/2026\/06\/image-137.png\" alt=\"\" class=\"wp-image-1011\" srcset=\"https:\/\/rivals2.com\/workshop\/wp-content\/uploads\/2026\/06\/image-137.png 803w, https:\/\/rivals2.com\/workshop\/wp-content\/uploads\/2026\/06\/image-137-300x275.png 300w, https:\/\/rivals2.com\/workshop\/wp-content\/uploads\/2026\/06\/image-137-768x704.png 768w\" sizes=\"auto, (max-width: 803px) 100vw, 803px\" \/><\/figure>\n\n\n\n<h2 class=\"wp-block-heading\">Adding unique functionality to an attack<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">Most special attacks and some normal attacks will require code to add functionality that the attack data cannot provide. Here&#8217;s how you can do that:<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li>Open up your character&#8217;s code.<\/li>\n\n\n\n<li>Override the UpdateAttack() function if you haven&#8217;t already.<\/li>\n\n\n\n<li>The function should start with:<\/li>\n<\/ul>\n\n\n\n<pre class=\"wp-block-code\"><code>if ( not self:Super_UpdateAttack() ) then\n    return false\nend<\/code><\/pre>\n\n\n\n<ul class=\"wp-block-list\">\n<li>Then you can add a check for your current attack, and run code if it&#8217;s the desired attack. For example, this is how you would add functionality to the character&#8217;s Up Special and Forward Special<\/li>\n<\/ul>\n\n\n\n<pre class=\"wp-block-code\"><code>local Attack = self:GetAttack()\n\nif ( Attack == ERivalsCharacterAttack.Uspecial ) then\n    -- Put your Uspecial logic here\nelseif ( Attack == ERivalsCharacterAttack.Fspecial ) then\n    -- Put your Fspecial logic here\nend<\/code><\/pre>\n","protected":false},"excerpt":{"rendered":"<p>Creating a basic grounded attack In this tutorial, we&#8217;re going to create a very basic grounded attack with a single active window and no sweetspot\/sourspot hitboxes. This will serve as the basis for the rest of the tutorials on this page. Creating a basic aerial attack Most of the setup is the same as the [&hellip;]<\/p>\n","protected":false},"author":2,"featured_media":0,"comment_status":"open","ping_status":"open","template":"","knowledgebase_cat":[7],"knowledgebase_tag":[],"class_list":["post-984","knowledgebase","type-knowledgebase","status-publish","hentry","knowledgebase_cat-miscellaneous"],"_links":{"self":[{"href":"https:\/\/rivals2.com\/workshop\/wp-json\/wp\/v2\/knowledgebase\/984","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\/2"}],"replies":[{"embeddable":true,"href":"https:\/\/rivals2.com\/workshop\/wp-json\/wp\/v2\/comments?post=984"}],"version-history":[{"count":4,"href":"https:\/\/rivals2.com\/workshop\/wp-json\/wp\/v2\/knowledgebase\/984\/revisions"}],"predecessor-version":[{"id":1321,"href":"https:\/\/rivals2.com\/workshop\/wp-json\/wp\/v2\/knowledgebase\/984\/revisions\/1321"}],"wp:attachment":[{"href":"https:\/\/rivals2.com\/workshop\/wp-json\/wp\/v2\/media?parent=984"}],"wp:term":[{"taxonomy":"knowledgebase_cat","embeddable":true,"href":"https:\/\/rivals2.com\/workshop\/wp-json\/wp\/v2\/knowledgebase_cat?post=984"},{"taxonomy":"knowledgebase_tag","embeddable":true,"href":"https:\/\/rivals2.com\/workshop\/wp-json\/wp\/v2\/knowledgebase_tag?post=984"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}