Tutorials/Riding Setup

Revision as of 11:10, 15 September 2026 by Jerzykv (talk | contribs) (updated riding setup page for 1.8)
(diff) ← Older revision | Latest revision (diff) | Newer revision → (diff)

Preface

This tutorial will teach you how to add custom ride Pokémon to Cobblemon. The process is relatively simple to accomplish, but it is recommended to have the minimum basic knowledge of Blockbench's controls and the ability to read json's.

Step 1: Adding a Locator

To allow the player to sit on the Pokémon, you need to add a locator (which is shown visually like an anchor) named seat_1 to your model. If you want to add multiple seats to your Pokémon, you can add more locators named seat_2, seat_3, and so on. you can find the "Add Locator" tool in the Blockbench toolbar customization. The model should be placed in assets/cobblemon/bedrock/pokemon/models/[folder named after your Pokémon] as a [pokemon].geo.json file.

One seat (Charizard model example)

One Seat Locator Example.png One Seat Viewport Example.png

Two Seats (Dewgong model example)

Two Seat Locator Example.png Two Seat Viewport Example.png

Six Seats (Camerupt model example)

Six Seat Locator Example.png Six Seat Viewport Example.png


Step 2: Adding Ride Data

In the species file of the Pokémon (or by species additions) you must add riding behaviours.

Example from Arcanine

"riding": {
   "behaviours": {
     "LAND": {
       "key": "cobblemon:land/horse",
       "rideSounds": [],
       "stats": {
         "ACCELERATION": "70-90",
         "JUMP": "45-65",
         "SKILL": "40-80",
         "SPEED": "45-70",
         "STAMINA": "35-80"
       }
     } 
   },
   "seats": [
      {
        "locator": "seat_1"
      }
    ]
  }

Extra Notes

rideSounds

The sounds and the configuration of the volume of the sounds. Mainly used for air mounts. An example of the configurations (Dragapult example):

      "rideSounds": [
         {
           "muffleEnabled": true,
           "pitchExpr": "math.max(1.0 ,0.2 + math.pow(math.min(q.ride_velocity() / 1.5, 1.0),2))",
           "playForNonPassengers": true,
           "soundLocation": "cobblemon:ride.loop.wind",
           "volumeExpr": "math.pow(math.min(q.ride_velocity() / 1.5, 1.0),2)"
         }
       ]

seats

How many seats a Pokémon will have, along with their locator. You should list as many seat locators as you have on your model.

A Pokémon with one seat:

   "seats": [
     {
       "locator": "seat_1"
     }
   ]

A Pokémon with two seats:

   "seats": [
     {
       "locator": "seat_1"
     },
     {
       "locator": "seat_2"
     }
   ]

Available Ride Keys

For more in-depth information, see Riding Styles

LAND
land/horse (also known as standard)

AIR
air/bird
air/jet
air/hover (also known as ufo)
air/rocket

LIQUID
liquid/boat
liquid/submarine
liquid/dolphin

To make your Pokémon unable to jump, you can add a "canJump": false line. To make it unable to sprint, you add a "canSprint": false line, as shown below (Dragapult example):

    "LAND": {
       "key": "cobblemon:land/horse",
       "rideSounds": [],
       "canJump": false,
       "canSprint": false,
       "stats": {
         "ACCELERATION": "10-40",
         "JUMP": "10-40",
         "SKILL": "80-100",
         "SPEED": "10-40",
         "STAMINA": "10-40"
       }
     }

Step 3: Animations

Small Note: Ride animations are optional and not required for riding to work.

Ride Pokémon have additional animations, mainly overlays, jumps and run animations.

Overlays play on top of the ride animation, allowing dynamic movement using molang. They use the variables feature of Blockbench. To make a variable slider, copy this text and replace yaw_change with whatever you want your slider to control.

q.r.yaw_change = slider('yaw_change', 0.02, -1.0, 1.0)

pitch_change velocity_y dive


For example, to make the slider affect yaw, you need to add q.r.yaw_change to a keyframe. If you would put q.r.yaw_change(0)*7 in a rotation keyframe, it will cause the part to rotate 7 degrees left or right, depending on the value of yaw_change on the slider.


Land rides usually use: ride_ground_run ride_ground_walk ride_jump

Air rides usually use: ride_air_fly air_glide ride_air_dive

Liquid rides usually use: ride_water_swim

Posers

The poser is how you set up the ride animations. You need to add a condition animation in the "animations": [] bracket with the condition q.is_ridden. This will cause the animation to only play whilst riding (Charizard's ride run overlay).

      {
         "condition": "q.is_ridden",
         "animation": "q.bedrock('charizard', 'ride_ground_run')"
       }

When adding a run to a Pokémon, you need to add a q.is_sprinting condition to your run pose and a !q.is_sprinting anticondition to your walk pose. To make a jump, you need to add a q.in_air condition to your jump pose and a !q.in_air to your grounded poses, so run, walk and idle. (Wyrdeer poser example)

    "in-air": {
       "poseTypes": ["STAND", "WALK"],
       "isBattle": false,
       "condition": "q.in_air && q.is_ridden",
       "animations": ["q.look('head')", "q.bedrock('wyrdeer', 'ride_jump')"],
       "transformTicks": 2,
       "transformToTicks": 2
     },
     "walk": {
       "poseName": "walk",
       "poseTypes": ["WALK"],
       "isBattle": false,
       "condition": "!q.in_air && !q.is_sprinting",
       "animations": [
         "q.look('head')",
         "q.bedrock('wyrdeer', 'ground_walk')",
       {
         "condition": "q.is_ridden",
         "animation": "q.bedrock('wyrdeer', 'ride_ground_run')"
       }
       ],
       "quirks": [
         "q.bedrock_quirk('wyrdeer', 'blink')"
       ],
       "transformTicks": 10
     },
     "run": {
       "poseName": "run",
       "poseTypes": ["STAND","WALK"],
       "isBattle": false,
       "condition": "!q.in_air && q.is_sprinting",
       "animations": [
         "q.look('head')",
         "q.bedrock('wyrdeer', 'ground_run')",
       {
         "condition": "q.is_ridden",
         "animation": "q.bedrock('wyrdeer', 'ride_ground_run')"
       }
       ],
       "quirks": [
         "q.bedrock_quirk('wyrdeer', 'blink')"
       ],
       "transformTicks": 10
     }