Download Discord Wiki

Custom Pokémon

Adding your own Pokémon

This step-by-step guide will walk you through adding custom Pokémon through resource and data packs.

Knowledgeability on resource pack creation and modeling is recommended.


This guide will teach you:

  • How to format your models and animations
  • Where to place your files
  • How to configure stats for your Pokémon
  • How to configure evolutions for your Pokémon
  • How to configure spawning for your Pokémon
  • How to configure variants for your Pokémon

What you will be creating are two things together; a resource pack and a data pack.

Resource packs primarily operate within the assets folder, while data packs operate within the data folder.

The reason we need to make two different things is that the data pack handles all the information (stuff a server needs), and the resource pack handles all the assets like models, textures, and more (stuff the client needs).

In this guide we will be creating both as a single pack.

As a brief summary:

  • Data packs as a stand-alone are useful for servers, as servers have no need for assets
  • Resource packs are useful for players playing on servers that already have the data
  • A single pack with data pack and resource pack files together are useful to players who are playing single player, and need both the data and the assets

First, create an empty folder. You can name it whatever you want your pack to be called. This will be the root of your pack where you will place all of the files that you will make or gather. Be sure to create and place a pack.mcmeta file in your pack, as this will tell Minecraft that it's a resource/data pack.


In this guide you will be creating JSON files. It is recommended to use an editor that can check for JSON syntax errors when creating your files. Alternatively, you can pass or upload your files to a JSON linter or validator to ensure your files do not contain any errors.

Creating Your Custom Pokémon

To create your Pokémon, you should have assets prepared for it, this means turning your idea or concept into a usable model!

After coming up with an idea or design, you will need to:

  1. Model your Pokémon
  2. Texture your Pokémon
  3. Animate your Pokémon

In this guide, we will doing all of these using BlockBench, which is a program that can create Minecraft compatible models.

Other than the basic necessities, this guide will not teach you how to perform these steps in detail. Rather, this guide will teach you how to utilize the assets that you have created or gathered.

If you’re having issues with any part of the design process, you can always visit the Cobblemon Discord for extra input or feedback.

For this guide, let's use this concept sketch of a Pokémon called Tentaquil...

...and create a model for it!

The following sections will go over the formatting for textures, models, and animations before moving on to the specifics of implementation.


For Cobblemon, Pokémon models are created as Bedrock entities. Although Cobblemon is a mod for the Java Edition of Minecraft, Bedrock entities can still be used. They are the preffered format for Pokémon as they have a greater support for animations.

To create a Bedrock Entity in Blockbench:

File ➜ New ➜ Bedrock Entity

This will bring up a pop-up, where you can enter the name of your Pokémon as both the File Name and Model Identifier, preferably in all lower-case letters.

After you are done creating your model, you must export it as a Bedrock Geometry:

File ➜ Export ➜ Export Bedrock Geometry

This will result in a file called Pokémon.geo.json. In the case for Tentaquil, the resulting file will be called tentaquil.geo.json. This is normal, do not remove the .geo or .json at the end!


Textures are pretty straightforward, you will simply need to create them as PNG files.

You will need at least 1 default texture for your Pokémon. Although not strictly required, a shiny texture is recommended to be consistent with the Cobblemon standard.

There is no limit to how many textures a Pokémon can have. If you are feeling ambitious, you can create as many textures as you want, which can later be implemented as variants. For consistency, it is also recommended to have a shiny texture for each variant.


Similar to models and textures, animations can also be created in Blockbench by clicking on the Animate tab.

For Cobblemon, animations abide by the following naming conventions:

  • ground_idle
  • ground_walk
  • water_idle
  • water_swim
  • air_idle
  • air_fly
  • sleep
  • faint

The animations that are needed depend on how the Pokémon generally moves. If it can move on land, provide it with ground animations. If it can swim or fly, provide it with water and air animations respectivly. For example, as we want Tentaquil to be both a land and water-based Pokémon, we have provided it with ground and water animations.

The full animation ID for each animation should be something like animation.Poké, with Pokémon being the Model Identifier, in this case your Pokémon name, and name being the animation name, e.g. ground_idle.

After you are done with your animations, you can export them as a single animation file by clicking near the top of the ANIMATIONS pane, which should result in a file called Pokémon.animation.json.

Organizing Your Files

Now that you have created or gathered all of your model related files, you can begin placing them in your pack. Here are the directories that you will need to create to place the files in, with Pokémon being the name of your Pokémon in all lower-case letters, e.g. tentaquil:

  • Models: /assets/cobblemon/bedrock/models/Pokémon/Pokémon.geo.json
  • Textures: /assets/cobblemon/textures/pokemon/Pokémon/Pokémon.png
  • Animations: /assets/cobblemon/bedrock/animations/Pokémon/Pokémon.animation.json

Now all of your custom assets are in the right place! We must now create the files that will help Cobblemon understand what to do with them.

In the following sections, we will focus on two kinds of files; posers and species.


Posers are JSON files that create a set of animations for a Pokémon to use.

The poser file should exist in this directory:


The poser file contains information on when the Pokémon will perform certain animations. You can set your Pokémon to only ever perform one animation if you’d like, or you can give it different animations for just about every action it performs!

Below is an example of a poser file for Tentaquil. Hover over a section marked with 𝒊 to view more information.

  "head": "head"
This tells the game which bone is the head. In this case, the head bone is simply named "head". For Pokémon without a head bone, such as Tentaquil, this field is not needed and you can leave it out.
, "portraitScale": 1.25, "portraitTranslation": [ 0, 0.5, 0 ]
These refer to the framing of the Pokémon within portraits seen during battle and in the party side bar. This will require some trial and error. I advise coming back to this after you’ve implemented your Pokémon.Tip: You can refresh your resource pack in-game with F3 + T after editing and saving the poser file
, "profileScale": 0.8, "profileTranslation": [ 0, 0.4, 0 ]
These refer to the framing of the Pokémon within interfaces such as the summary or PC. Similar to portrait framing, this will require some trial and error. You can come back to this after you’ve implemented your Pokémon.Tip: You can refresh your resource pack in-game with F3 + T after editing and saving the poser file
, "faint": "bedrock(tentaquil, faint)"
This points to the faint animation for this Pokémon. If you have correctly named all your files and animations, this should be as simple as changing tentaquil to be your Pokémon’s name. If your Pokémon does not have a faint animation, you can leave this field out.
, "poses": {
Here we are defining a list of our poses.
"standing": { "poseName": "standing"
Here we are defining the names for these poses.
, "transformTicks": 10
This is the transition time between animations. You will most likely not need to change this value, and can leave it as 10.
, "poseTypes": [
Here we are telling the game when this animation will take place.
Below is a list of all poseTypes:

"STAND" When stationary on the ground
"WALK" When traveling on the ground
"HOVER" When stationary in the air
"FLY" When traveling in the air
"FLOAT" When stationary in fluids
"SWIM" When traveling in fluids
"SLEEP" When asleep
"SHOULDER_LEFT" When mounted on left shoulder
"SHOULDER_RIGHT" When mounted on right shoulder
"PROFILE" When rendered in the summary or PC interface frame
"PORTRAIT" When rendered in the party sidebar or battle frame
"NONE" When not doing anything
], "animations": [
This defines which animations will play during these poses.
Allows the Pokémon to move its head around to observe its surroundings or other entities. You can remove this if your Pokémon doesn't have a head bone, or if you don't want them to look around.
, "bedrock(tentaquil, ground_idle)"
This directs to a specific animation. If you named and placed your files correctly, it should as simple as changing the Pokémon name and animation name.
] }, "walking": { "poseName": "walking", "transformTicks": 10, "poseTypes": [ "WALK" ], "animations": [ "bedrock(tentaquil, ground_walk)" ] }, "floating": { "poseName": "floating", "transformTicks": 10, "poseTypes": [ "FLOAT" ], "animations": [ "bedrock(tentaquil, water_idle)" ] }, "swimming": { "poseName": "swimming", "transformTicks": 10, "poseTypes": [ "SWIM" ], "animations": [ "bedrock(tentaquil, water_swim)" ] } } }


There are two types of species files, one for assets and one for data. The one this section will go over will be for assets and should be in the following directory:


This file contains information about how the Pokémon will appear in the game, including details about alternate forms. The file naming convention of a preceding number is to account for Pokémon forms.

Below is an example of a species file for Tentaquil. Hover over a section marked with 𝒊 to view more information.

  "species": "cobblemon:tentaquil"
Here we are saying which species of Pokémon this pertains to. We will create the species later in the guide.
, "order": 0
This is the load order of the forms in this file. Since this file contains the default variants for the Pokémon, the load order should be 0. If more forms are created later, they should use a higher number.
This is what 0_ and _base in the file name represent. 0_ represents the load order, and _base tells us that these are the default forms.
, "variations": [
This is a list of all the different variations.
{ "aspects": []
Aspects are traits that a Pokémon has. For example, a shiny Pokémon will have the "shiny" aspect. In this section, we are determining what the Pokémon will look like if it has a certain aspect.
, "poser": "cobblemon:tentaquil"
Here we are pointing to the poser file we made in the previous section. This tells the game which animations to use for the Pokémon. Assuming your naming is correct, this section should be as simple as changing the Pokémon's name.
, "model": "cobblemon:tentaquil.geo"
Here we pointing to which model geometry file to use. Assuming your naming is correct, this section should also be as simple as changing the Pokémon's name.
, "texture": "cobblemon:textures/pokemon/tentaquil/tentaquil.png"
Here we pointing to which texture file to use. Since this section is regarding the default form, make sure to use the directory for the default texture.
, "layers": []
This can used to add additional textures on top of the main texture, e.g. Arbok and its chest patterns.
}, { "aspects": [ "shiny" ]
In this section, we are determining what a Pokémon with the "shiny" aspect would look like.
, "texture": "cobblemon:textures/pokemon/tentaquil/tentaquil_shiny.png"
Here we are pointing to the texture file that the Pokémon will use when it is shiny.
}, { "aspects": [ "mischief" ]
Here we have added our own custom variant called "mischief". We will implement our custom aspect later in this guide.
, "model": "cobblemon:tentaquilmischief.geo"
Here we are pointing to the model geometry file that the Pokémon will use for this variant.
} ] }

Adding Your Custom Pokémon

Now that we’ve got all the assets in place, we can now add the Pokémon to the game!

This is done from the data folder within your pack. This section will be extensive, so for now just create a JSON file in the following directory of your pack:


Let's start by adding an opening and a closing curly bracket to the file.



In the following sections we will be adding information in between these brackets.

Let's start by adding in some basic information.

  "implemented": true
Whether or not this Pokémon is fully implemented. This determines whether it will show up in /spawnallpokemon and similar commands.
, "name": "tentaquil"
The name of the species.
, "labels": [ "custom" ]
Labels for this Pokémon, which can be custom.
Here are the labels that Cobblemon currently tracks:

Custom Species or Variant:



Regional Variations:

, "pokedex": [
Here we point to the Pokédex descriptions for this Pokémon.
"cobblemon.species.tentaquil.desc1", "cobblemon.species.tentaquil.desc2"
These are language keys, which will need to be defined in a language file. We will cover this later in the guide, but you can replace tentaquil with your Pokémon's name for now.
], "height": 11, "weight": 300
Height and weight used for the Pokédex. The units used for height and weight are decimeters and hectograms respectivly.
To convert these measurements to the more customary units of meters and kilograms, divide each by 10.
, "preEvolution": "pitipole"
The evolution that comes before this Pokémon if applicable. You can leave this property out if your Pokémon does not have a previous evolution.
"pitipole" is another custom Pokémon that we have made. We will go over it in a later section of this guide pertaining to evolutions.
, "features": [ "mischief" ]
This is a list of custom aspects that the Pokémon has. We have added the custom aspect "mischief", which we have previously noted in the species file.
, "forms": [
The list of available forms. This differs from aspects/variants as forms can have their own stats/moves/etc.
This guide won't cover on how to create them, but a good reference for forms is the Pikachu species.
{ "name": "normal" }
This is the basic form. This is pretty much only mandatory if you have multiple forms, but we'll include it for standardization.
], "shoulderMountable": false
Whether or not the Pokémon is able to ride on the player's shoulder.
, "shoulderEffects": [ "slow_fall" ]
The effect applied to the player when the Pokémon is shoulder-mounted. This field is optional.


Now let's include the stats.

You can refer to the stats of official Pokémon as guidelines if you plan on making the stats more practical and faithful to the official games.

  "primaryType": "poison",
  "secondaryType": "water"
The type(s) assigned to the Pokémon. The secondary type is optional.
, "baseStats": { "hp": 125, "attack": 105, "defence": 95, "special_attack": 120, "special_defence": 85, "speed": 70 }
The base stats of the Pokémon.
Here is a list of base stats for all official Pokémon that you can use as reference.
, "catchRate": 30
The catch rate of the Pokémon. Increasing the value makes the Pokémon easier to catch.
Here is a list of catch rates for all official Pokémon that you can use as reference.
, "maleRatio": 0.5
The male ratio for the Pokémon. The maximum value of 1, which equates to 100%, will make the Pokémon be a male-only species. The minimum value of 0 equates to 0%, and will make the Pokémon be a female-only species. Setting the value to -1 makes the Pokémon genderless.
, "baseExperienceYield": 270
How much experience the Pokémon will grant upon being defeated.
Here is a list of base experience values for all official Pokémon that you can use as reference.
, "experienceGroup": "fluctuating"
How the Pokémon gains experience.
The available options are:
, "eggCycles": 25
How long it will take for the Pokémon's egg to hatch.
Here is a list of base egg cycle values for all official Pokémon that you can use as reference.
, "eggGroups": [ "water_1", "monster" ]
The egg group(s) that the Pokémon belongs to. There must be at least one egg group, additional egg groups are optional. Official Pokémon have a maximum of 2 egg groups.

List of available egg groups:
, "baseFriendship": 35
The starting friendship value when caught. The maximum friendship value is 255.
Here is a list of base friendship values for all official Pokémon that you can use as reference.
, "evYield": { "hp": 2, "special_attack": 1 }
How many EVs the Pokémon gives upon being defeated.
Here is a list of EV yields for all official Pokémon that you can use as reference.

Moves and Abilities

  "moves": [
Here we're defining the list of moves.
"egg:disable", "20:crushclaw", "tm:rest", "tutor:honeclaws"
Move names do not contain any spaces. The prefix before the move indicates how the move will be learned.

egg: Indicates an egg move
20: Indicates the level at which the move will be learned through levelling
tm: Indicates a move that can be learned by via a TM
tutor: Indicates a move that can be learned from a tutor
], "abilities": [
Here we're defining the list of available abilities.
"toughclaws", "h:serenegrace"
Ability names do not contain any spaces. You can list up to a maximum of 3 abilities: 2 normal abilities and 1 hidden ability.

h: This prefix indicates the hidden ability


Here we will be defining the evolution method(s).

The code shown below is from the data file of Pitipole, a custom Pokémon that we have created to be Tentaquil's pre-evolution, rather than Tentaquil as we want Tentaquil to be the final evolution.

The code contains multiple evolution methods for demonstrative purposes, but we'll keep only one for our pack.

  "evolutions": [
The list of evolution methods. If your Pokémon does not evolve, you can leave the evolution list empty: "evolutions": [],
{ "id": "pitipole_tentaquil_trade"
This is the ID for the evolution method.
Usually this is formatted in the following order:
the Pokémon species, the species it will evolve into, and a descriptor, all seperated with underscores.
, "variant": "trade"
This refers to how the evolution is initiated.

The current available options are:
"level_up" Evolution upon reaching a specified level
"trade" Evolution upon trading
"item_interact" Evolution upon item interaction, e.g. an evolution stone
, "result": "tentaquil shiny"
This refers to what the Pokémon will evolve into. You can add additional properties like the shiny aspect after the Pokémon name.
, "consumeHeldItem": true
This refers to the item held by the Pokémon. For example, for trade evolutions that utilize items, you will most likely want the held item to be consumed after the trade completes.
, "learnableMoves": [ "doubleslap" ]
A list of moves that the Pokémon will learn upon evolving.
, "requirements": [
Additional requirements for this evolution method.
{ "variant": "held_item"
This refers to the requirement type.

The current available options are:
"level" Requires the evolution to happen at a specific level
"held_item" Requires the evolution to utilize the Pokémon's held item.
"biome" Requires the evolution to happen at a specific biome.
, "item": "cobblemon:poke_ball"
This is used when the requirement variant is "held_item". This indicates what item the Pokémon should be holding for the evolution to occur. The value should be an item ID.
} ] }, { "id": "pitipole_tentaquil_glowberry", "variant": "item_interact", "result": "tentaquil", "consumeHeldItem": false, "learnableMoves": [], "requirements": [], "requiredContext": "minecraft:glow_berries"
The requirement for the specified variant. Currently only utilized if the variant is "item_interact"; the context would be the item ID.
}, { "id": "pitipole_tentaquil_lvl", "variant": "level_up", "result": "tentaquil mischief", "consumeHeldItem": false, "learnableMoves": [], "requirements": [ { "variant": "level", "minLevel": 100
The required field for variant "level". This indicates the minimum level for the evolution to occur.
}, { "variant": "biome", "biomeCondition": "#minecraft:is_beach"
The required field for variant "biome". This indicates the biome where the evolution should occur at. The value should be a biome tag ID.
} ] } ],

Entity Properties

  "baseScale": 1.1
This refers to the scale of the Pokémon. A scale of 1 will make the Pokémon be at the size it was modeled at.
, "hitbox": {
These are the parameters that handle hit collision.
"width": 0.9, "height": 1.4
The width and height of the hitbox. There are only 2 size properties as hitboxes are square prisms.

Tip: You can check entity hitboxes in-game with F3 + B
, "fixed": false
Determines whether the hitbox is fixed in place or not. This should be set to false for majority of instances.
}, "drops": {
Here we are defining what items the Pokémon will drop upon being defeated.
"amount": "2"
This indicates how many drop attempts will occur. In this instance, there will be an attempt to drop items twice.
, "entries": [
This lists the potential items to drop.
{ "item": "minecraft:slimeball"
The ID of the item.
, "quantityRange": "1-2"
The amount that will drop. Factoring in the number of drop attempts, there will be a maximum drop potential of 4 for the range in this instance.
, "percentage": 66
The chance for the item to drop.
} ] }, "behaviour": {
This is where we define the entity behavior.
"moving": {
Behavior regarding movement.
"canLook": false
Indicates whether the Pokémon can look around. Requires a model with a head bone. As the Tentaquil model does not have a head bone, we have set it to false.
, "fly": {
Flying related movement.
"canFly": false
Indicates whether or not the Pokémon can fly.
} "swim": {
Swimming related movement.
"swimSpeed": 0.2
Indicates how fast the Pokémon can swim.
, "canSwimInWater": true
Indicates whether or not the Pokémon will sink or swim when in water.
, "canBreatheUnderwater": true
Indicates whether or not the Pokémon will suffocate when underwater.
} } }

With that, you’ve successfully created your species’ data file! You can go ahead and save it.

At this point, your pack should currently have two directories in it, assets and data, and a pack.mcmeta file.

Now let's test the pack and try loading the Pokémon in game:

  1. Copy your pack and place it in the resourcepacks folder in the Minecraft root directory.
  2. Make another copy of your pack and place it in the datapacks folder of the world save that you will load the Pokémon in.
  3. Start up Minecraft and then go to Options ➜ Resource Packs. Select your pack to load it.
  4. Load the world save that contains the data pack.
  5. Once in the world, you can run the command /pokespawn Pokémon or /spawnpokemon Pokémon, with Pokémon being the name of your Pokémon.

Now let's test it...

Looks like spawning in Tentaquil worked!

You'll probably notice that its name looks a little bit weird though. Let's fix that in the next section.

Language Files

In this section we will walk you through on how to display the Pokémon's name in game. Let's begin by making a language file!

The file's directory should be:


Minecraft will take whatever text is declared in this language file to show in game if a matching key is defined. The purpose of this is so that text such as names can be translated for different languages.

Remember the weird text that appeared above the Pokémon's head when spawned in game? As nothing was defined in the language file, there was no name to display. Now let's add that text as a key.

Your lang file should look something like this:

  "": "Tentaquil",
  "cobblemon.species.tentaquil.desc1": "If its bold colors do not sufficiently ward off predators, it secretes toxins that smell strongly of copper.",
  "cobblemon.species.tentaquil.desc2": "There has only been one recorded sighting of this pokémon. Until recently, this was considered to be a joke."

In this example file, you can swap out tentaquil for the name of your Pokémon.

The keys ending with desc1 and desc2 are the Pokémon's Pokédex entries. Although the Pokédex has not been implemented yet, try to keep the entries short and brief as there may eventually be a character limit.

You can add as many Pokémon names (along with their Pokédex entries) as you want to the same language file if you are planning to add more custom Pokémon to your pack.

Now let's re-add the updated pack to the resourcepacks folder and reload Minecraft.

Your Pokémon should now show the name that you defined in the language file.

If you want to add support for other languages, you can create additional language files. For example, de_de.json for German, fr_fr.json for French, ja_jp.json for Japanese, and so on. All you need to do is change the value for each key.

If you are satisfied with your Pokémon never spawning, you may stop here! Otherwise, we’ve just got a little more work left to do...


We’re in the home stretch! The last step is to create spawn data for your Pokémon.

The spawn file should be at this directory, with Pokémon being the name of your Pokémon:


  "enabled": true
This determines whether this spawn data is enabled.
, "neededInstalledMods": [], "neededUninstalledMods": []
These are lists that determine whether the spawn data requires specific mods to be present. This is mainly for Pokémon that spawn in biomes introduced by other mods.
, "spawns": [
Here we are declaring the spawn options.
{ "id": "tentaquil-1"
The unique ID for this specific spawn. The standard convention for Cobblemon is the Pokémon name and a number separated by a hyphen.
, "pokemon": "tentaquil"
The Pokémon to spawn.
, "presets": [ "underground" ]
Presets denote collections of potential block candidates to spawn on, this way you don't need to list a large amount of blocks.

List of available presets:
, "type": "pokemon"
The spawn type. As we are spawning a Pokémon, this can be kept as "pokemon".
, "context": "grounded"
This indicates the spawning surface.

"grounded" Indicates spawning on a block surface
"submerged" Indicates spawning under water
, "bucket": "ultra-rare"
This indicates how rare the spawn will be.

The available spawn buckets are:
, "level": "18-60"
The range of levels that the Pokémon can have when it spawns.
, "weight": 10.0
This value determines how likely it is to spawn. A Pokémon with a spawn weight of 1.0 is ten times less likely to appear than a Pokémon with a spawn weight of 10.0, when under the assumption that both Pokémon have the same bucket rarity. The conventional standard is having an evolved Pokémon's spawn weight value be around 1/10th as much as its pre-evolution.
, "condition": {
Here we can provide additional requirements for this spawn option.
"canSeeSky": false
This indicates whether or not the Pokémon should be able to see the sky when it spawns. This is useful for making spawns that happen under shelter or underground.
, "biomes": [ "#cobblemon:is_lush" ]
Here we can list the biomes we want the Pokémon to spawn in. The values should be biome tag IDs.
} }, { "id": "tentaquil-2", "pokemon": "tentaquil", "presets": [ "underwater", "underground" ], "type": "pokemon", "context": "submerged", "bucket": "rare", "level": "18-60", "weight": 1.0, "condition": { "canSeeSky": false, "biomes": [ "#cobblemon:is_lush", "#minecraft:is_beach" ] } } ] }


If you didn’t create any custom variants, your journey ends here!

Otherwise, stick around for this final section. For context, we’re going to log the custom aspect that we noted earlier, mischief.

To do that, you need a file in this directory, with aspect being the aspect name:


  "keys": [ "mischief" ]
Here we are indicating the name of our aspect.
, "type": "flag"
For a standard variant, this should be set to "flag".
This determines whether there are multiple sub-variants of this variant or not. For example, Sawsbuck has a season variant with 4 different sub-variants.
, "isAspect": true
This should be set to true for standard variants.
This would only be set to false if you want this variant to not have a visual aspect to it, i.e. texture changes. For example, flagging a Pokémon as an event Pokémon.
, "default": false
In almost all cases, this should be set to false. This is primarily used for things that have some level of built-in functionality, like the shiny aspect.

Just repeat this process for every variant that you have created.

And that’s it, you have reached the end of this guide.

You should hopefully now have the knowledge to create and implement your own custom Pokémon.

You can download the pack we have created in this guide here:

Tentaquil Pack Download

Thanks to Eiko for creating the pack and writing the original guide.

Have Questions or Feedback?

Join our Discord server!