(Motion to remove the term potion)
 
(12 intermediate revisions by 3 users not shown)
Line 15: Line 15:
</br>
</br>
===== '''Where to find official Pokémon data''' =====
===== '''Where to find official Pokémon data''' =====
* [https://bulbapedia.bulbagarden.net/wiki/List_of_Pokémon_by_National_Pokédex_number Bulbagarden] - This website has information about Pokémon both from the games and the anime. You can find many references about each Pokémon here.</br>
* [[bulbapedia:List of Pokémon by National Pokédex number|Bulbagarden]] - This website has information about Pokémon both from the games and the anime. You can find many references about each Pokémon here.</br>
* [https://pokemondb.net/pokedex/all Pokémon Database] - This website has all kinds of information about Pokémon, but is more focused on stats. A lot of that data is the same or similar to what's written in the species files.
* [https://pokemondb.net/pokedex/all Pokémon Database] - This website has all kinds of information about Pokémon, but is more focused on stats. A lot of that data is the same or similar to what's written in the species files.
* [https://www.serebii.net/pokemon/nationalpokedex.shtml Serebii] - This website probably has the most information about Pokémon. Serebii provides accurate data and media references with images of these media appearances.
* [https://www.serebii.net/pokemon/nationalpokedex.shtml Serebii] - This website probably has the most information about Pokémon. Serebii provides accurate data and media references with images of these media appearances.
Line 30: Line 30:
===== '''Evolutions''' =====
===== '''Evolutions''' =====
* [https://gitlab.com/cable-mc/cobblemon/-/tree/main/common/src/main/resources/data/cobblemon/species The Cobblemon Gitlab] - It is recommended that you use an existing Pokémon's evolution data as a template for evolutions. All existing evolution methods should be written into their respective pokemon's species file.</br>
* [https://gitlab.com/cable-mc/cobblemon/-/tree/main/common/src/main/resources/data/cobblemon/species The Cobblemon Gitlab] - It is recommended that you use an existing Pokémon's evolution data as a template for evolutions. All existing evolution methods should be written into their respective pokemon's species file.</br>
* [https://tmetcalfe89.github.io/cobblemon-fakemon-generator/ Cobblemon's Fakemon Generator] - You can also generate evolution methods using the Fakemon generator. It will give you all the evolution when creating new species files.</br>
* [https://tmetcalfe89.github.io/cobblemon-fakemon-generator/ Cobblemon's Fakemon Generator] - You can also generate evolution methods using the Fakemon generator. It will give you all the evolution methods when creating new species files.</br>
* [https://gitlab.com/cable-mc/cobblemon/-/tree/main/common/src/main/kotlin/com/cobblemon/mod/common/pokemon/evolution/requirements Evolution Requirements From the Cobblemon Gitlab] - This links to a folder on the gitlab that has the code files to all the possible evolution requirements for you to reference. All of these methods are used by at least one official Pokémon. It is recommended that you look up this Pokémon's species file to replicate its evolution method.  
* [https://gitlab.com/cable-mc/cobblemon/-/tree/main/common/src/main/kotlin/com/cobblemon/mod/common/pokemon/evolution/requirements Evolution Requirements From the Cobblemon Gitlab] - This links to a folder on the gitlab that has the code files to all the possible evolution requirements for you to reference. All of these methods are used by at least one official Pokémon. It is recommended that you look up this Pokémon's species file to replicate its evolution method.  
</br>
</br>
===== '''Shoulder Effects''' =====
===== '''Shoulder Effects''' =====
Cobblemon's shoulder effects are custom coded versions of the minecraft potion effects. So you can't use any potion effect as a shoulder effect. If it's not from cobblemon, the species file will fail to load.</br>
Shoulder effects grant special buffs to the player if certain Pokémon are on their shoulders. Version 1.4 removed the shoulder effects so they could be rebalanced at a later date, but you can still apply effect data through datapacks. As of version 1.4, no shoulder mountable Pokémon has shoulder effect data in their species file.


Version 1.4 removed the shoulder effects so they could be rebalanced at a later date.
</br>If you wish to apply shoulder effect data to a Pokémon, you can include the following code block and switch the effect as you please:
* You can find a list of effects on the [https://minecraft.wiki/w/Effect#Effect_list Minecraft Wiki]. Mileage may vary.
  "shoulderEffects": [
    {
      "type": "potion_effect",
      "effect": "minecraft:slow_falling",
      "amplifier": 0,
      "ambient": true,
      "showParticles": false,
      "showIcon": false
    }
  ]


Version 1.3 shoulder effects:
</br>Version 1.3 shoulder effects:
* <code>haste</code>
* <code>haste</code>
* <code>water_breathing</code>
* <code>water_breathing</code>
Line 44: Line 56:
* <code>slow_falling</code>
* <code>slow_falling</code>
</br>
</br>
===== '''Moves and Learning Methods''' =====
This section of the species file determines the moves a Pokémon can learn. There are 4 methods of learning moves. Only 1 of them is currently implemented and that's <code>level</code> learning.
Every move from the official games should be in Cobblemon. In order for moves to be read properly, they must be written in the correct format for the move list. The method type goes on the left side of a colon and the move name goes on the right side of the colon. '''Moves that contain 2 or more words must be bunched together into one "word" and can't contain any spaces, underscores, commas, or hyphens.''' Everything must remain in lowercase as well.
Example of each method and name format:
* <code>"5:quickattack"</code> : '''Level''' - This would let a Pokémon learn <code>quick attack</code> at level 5. The number determines what level the move will be learned at.
* <code>"egg:thunder"</code> : '''Egg Move''' - This would let a Pokémon inherit <code>thunder</code> from one of its parents. It will hatch from its egg knowing this move when breeding gets implemented.
* <code>"tm:thunderbolt"</code> : '''TMs''' - This would allow a Pokémon to use a <code>thunderbolt</code> TM when TMs get implemented.
* <code>"tutor:10000000voltthunderbolt"</code> : '''Tutor''' - This would allow a Pokémon to learn <code>10,000,000 Volt Thunderbolt</code> from a tutor when tutors get implemented.
</br>
===== '''Item Drops''' =====
Cobblemon drops work differently than vanilla drops. You need to set a target amount of drops, then it tries to achieve this drop amount by rolling for drops in the entries listed. If an entry passes a percentage check, then it will count as 1 towards the targeted amount. Once this target amount is achieved, it will stop trying to roll for drops even if it did not finish reading all the entries. If it runs out of entries and did not achieve this target, then it will also stop rolling for drops. Once it stops rolling, all of the drops that passed the percentage check will drop where the Pokémon was defeated.</br>
</br>
Example code block for drops:
* Since amount is set to 1 and there is only 1 entry, then it will only roll for drops from this 1 entry.
* The sweet berries entry does not list a percentage value, so by default its 100%.
* This would make Vulpix drop 2-3 berries 100% of the time
"drops": {
  "amount": "1",
  "entries": [
    {
      "item": "minecraft:sweet_berries",
      "quantityRange": "2-3"
    }
  ]
},
</br>
===== '''Hitbox and Base Scale''' =====
===== '''Hitbox and Base Scale''' =====
The size of the Pokémon model and its hitbox are controlled by the species file. If you want to change any of these values and see the results, '''you must load the singleplayer world from the main menu.''' The <code>/reload</code> command does not work with Cobblemon datapacks. Loading the world again is the proper way to refresh Cobblemon datapacks.</br>
The size of the Pokémon model and its hitbox are controlled by the species file. If you want to change any of these values and see the results, '''you must load the singleplayer world from the main menu.''' The <code>/reload</code> command does not work with Cobblemon datapacks. Loading the world again is the proper way to refresh Cobblemon datapacks.</br>
* <code>baseScale</code> will size the Pokémon up or down. A value of 1 will let the model be at a one to one scale with its size in blockbench.</br>
* <code>baseScale</code> will size the Pokémon up or down. A value of 1 will let the model be at a one to one scale with its size in blockbench.</br>
* <code>hitbox</code> has 3 values you can change, but you will only want to change the <code>height</code> and <code>width</code> of the hitbox. In game, you can press <code>F3+B</code> to show the hitboxes on entities.  
* <code>hitbox</code> has 3 values you can change, but you will only want to change the <code>height</code> and <code>width</code> of the hitbox. In game, you can press <code>F3+B</code> to show the hitboxes on entities.  
** Height is how many blocks high the Pokémon is.
** A hitbox width of 1 will let the hitbox be as wide as 1 Minecraft block with the Pokémon at the center of the hitbox. Width is akin to diameter, but it's Minecraft so everything is a cube. Try not to think about it too much.
</br>
===== '''Height and Weight''' =====
===== '''Height and Weight''' =====
x10 /10 math hard
The height and weight that will be used for the Pokédex when it gets implemented. The unit for height is in decimeters. The unit for weight is in hectograms. Dividing these values by 10 will give you the metric units for meters and kilograms.
The actual height and weight of the pokemon.  
* <code>height</code> doesn't do anything significant and is misleading a lot of the time in the Pokédex. Sometimes it measures distance from the ground, and sometimes it measures how long a Pokémon is.
* Height doesn't do anything and apparently is wrong a lot of the time in the pokedex.  
* <code>weight</code> will determine the damage value of weight based moves like heavy slam. Make sure you set these weights to hectograms or these moves may do unintentional amounts of damage.
* Weight will determine the damage value of weight based moves.  
</br>
====='''Gender'''=====
Gender is managed via the <code>maleRatio</code> property.
* This property should have a decimal value between 0 and 1, and is the percent chance for a Pokémon to spawn as a male.
** A value of <code>0.1</code> for example would lead to a 10% chance to spawn as a male.
* The special value of <code>-1</code> is reserved for genderless Pokémon.
</br>
===== '''Lighting Data''' =====
Lighting data allows for compatibility with some of the more popular dynamic lighting mods. A Pokémon can be assigned a light level and can be set to only emit light when on land, underwater, or both!
* <code>lightLevel</code> - The light level emitted by the Pokémon. A range of 0 to 15.
* <code>liquidGlowMode</code> - If the effect runs while in a liquid or on land. Your options are <code>LAND</code>, <code>UNDERWATER</code> or <code>BOTH</code>
</br>
Example code block for lightingData:
* Any pokemon assigned this data will emit a light level of 14 when on land
  "lightingData": {
  "lightLevel": 14,
  "liquidGlowMode": "LAND"
  }
 
</br>
==== Species File Breakdown ====
==== Species File Breakdown ====
As far as the writer of this article is concerned, Vulpix has one of the most fleshed out species files. This makes Vulpix a great example to explain the different sections of the species file. You can reference some of the resources lifted above and compare them with the written data below.</br>
As far as the writer of this article is concerned, Vulpix has one of the most fleshed out species files. This makes Vulpix a great example to explain the different sections of the species file. You can reference some of the resources listed above and compare them with the written data below. Hover over the underlined text to see more information.</br>
Another Epic File I have to Write 😭
</br>
  {
  {
   "implemented": true,
   "<abbr title="Whether or not this pokémon is fully implemented. This determines whether it will show up in /spawnallpokemon or similar commands.">implemented</abbr>": <abbr title="Because it's set to true, vulpix will appear when using the /spawnallpokemon command.">true</abbr>,
   "name": "Vulpix",
   "<abbr title="Here you will create the name of a new Pokémon species">name</abbr>": "<abbr title="The name of this species.">Vulpix</abbr>",
   "nationalPokedexNumber": 37,
   "<abbr title="The pokédex number for this pokémon -- currently not significant, but just in case, try and pick a unique digit above 2000.">nationalPokedexNumber</abbr>": <abbr title="This is Vulpix's national dex number!">37</abbr>,
   "primaryType": "fire",
   "<abbr title="Elemental typings of your Pokémon, these are completely up to you. (But of course it must be an official typing.) You do not need to have a secondary typing if you don't want one.">primaryType</abbr>": "<abbr title="Vulpix is a fire type, so we assign it fire here.">fire</abbr>",
   "abilities": [
   "<abbr title="Here we define the list of abilities. You can have up to two abilities listed, and one hidden ability.">abilities</abbr>": [
     "flashfire",
     "<abbr title="This is Vulpix's first and only ability">flashfire</abbr>",
     "h:drought"
     "<abbr title="This is Vulpix's hidden ability">h:drought</abbr>"
   ],
   ],
   "baseStats": {
   "<abbr title="The base stats of your Pokémon. Again, these are up to you. You can reference some official Pokémon stats and borrow them if you can't come up with your own.">baseStats</abbr>": {
     "hp": 38,
     "<abbr title="Determines the amount of health a Pokémon will have.">hp</abbr>": 38,
     "attack": 41,
     "<abbr title="Determines the damage dealt from physical attacks.">attack</abbr>": 41,
     "defence": 40,
     "<abbr title="Determines the damage reduction from physical attacks">defence</abbr>": 40,
     "special_attack": 50,
     "<abbr title="Determines the damage dealt from special attacks.">special_attack</abbr>": 50,
     "special_defence": 65,
     "<abbr title="Determines the damage reduction from special attacks.">special_defence</abbr>": 65,
     "speed": 65
     "<abbr title="Determines if the Pokémon will move first in battle.">speed</abbr>": 65
   },
   },
   "behaviour": {
   "<abbr title="We define how the pokémon behaves here. You can reference the Behavior wiki page to see more information about this section.">behaviour</abbr>": {
     "resting": {
     "<abbr title="A set of properties relating to how and when the Pokémon sleeps, if it sleeps at all.">resting</abbr>": {
       "canSleep": true,
       "<abbr title="A true/false value. If it's true, then it can fall asleep and use its sleep animations. You probably want this set to true always!">canSleep</abbr>": <abbr title="Setting it to true will allow Vulpix to fall asleep under the following conditions.">true</abbr>,
       "willSleepOnBed": true,
       "<abbr title="A true/false value. If true, the Pokémon will try to sleep on top of the player's bed when they hop into it, much like cats.">willSleepOnBed</abbr>": <abbr title="If given the option, Vulpix will try to sleep on a player bed.">true</abbr>,
       "depth": "normal",
       "<abbr title="Is this Pokémon a light sleeper or a heavy sleeper?">depth</abbr>": "<abbr title="The depth of the sleep. Normal means vulpix will wake up if the player is within 16 blocks and not sneaking.">normal</abbr>",
       "light": "0-4"
       "<abbr title="A light level or level range, between 0 and 15, which represents the light levels in which the Pokémon is able to sleep.">light</abbr>": "<abbr title="Vulpix will attempt to sleep only if it's standing in a light level of 0-4.">0-4</abbr>"
     }
     }
   },
   },
   "catchRate": 190,
   "<abbr title="How easy it is to catch your pokémon. Larger numbers mean it's easier to catch.">catchRate</abbr>": <abbr title="Values over 100 are considered 'easier' captures. Since Vulpix is a pre evolution Pokémon, its capture rate is quite high.">190</abbr>,
   "maleRatio": 0.25,
   "<abbr title="What percentage of this pokémon are male.">maleRatio</abbr>": <abbr title="Wild Vulpix have a 25% chance of being male. This means 75% of Vulpix spawns will be females.">0.25</abbr>,
   "shoulderMountable": false,
   "<abbr title="Determines whether or not this Pokémon can go on the players shoulder. You can set this to true for any Pokémon, but it most likely wont look good! It will use its ground idle animation on the player shoulder if there is no dedicated shoulder animation.">shoulderMountable</abbr>": <abbr title="Vulpix is unfortunately not a shoulder mountable Pokémon.">false</abbr>,
   "forms": [
   "<abbr title="A list of available forms for Vulpix. These forms will have their own set of stats. It's almost like writing a whole new Pokémon into this section.">forms</abbr>": [
     {
     {
       "name": "Alola",
       "<abbr title="The name of this form.">name</abbr>": "<abbr title="We simply call it Alola. All the other Alolan Pokémon forms will share this same form name.">Alola</abbr>",
       "primaryType": "ice",
       "<abbr title="Alolan Vulpix's type. Form types are usually different than the base form.">primaryType</abbr>": "<abbr title="Alolan Vulpix will be an ice type.">ice</abbr>",
       "abilities": [
       "<abbr title="Here we will list Alolan Vulpix's abilities.">abilities</abbr>": [
         "snowcloak",
         "<abbr title="Alolan Vulpix's first and only ability.">snowcloak</abbr>",
         "h:snowwarning"
         "<abbr title="Alolan Vulpix's hidden ability">h:snowwarning</abbr>"
       ],
       ],
       "baseStats": {
       "<abbr title="The base stats for Alolan Vulpix. These are usually different than the base form.">baseStats</abbr>": {
         "hp": 38,
         "<abbr title="Determines the amount of health a Pokémon will have.">hp</abbr>": 38,
         "attack": 41,
         "<abbr title="Determines the damage dealt from physical attacks.">attack</abbr>": 41,
         "defence": 40,
         "<abbr title="Determines the damage reduction from physical attacks">defence</abbr>": 40,
         "special_attack": 50,
         "<abbr title="Determines the damage dealt from special attacks.">special_attack</abbr>": 50,
         "special_defence": 65,
         "<abbr title="Determines the damage reduction from special attacks.">special_defence</abbr>": 65,
         "speed": 65
         "<abbr title="Determines if the Pokémon will move first in battle.">speed</abbr>": 65
       },
       },
       "catchRate": 190,
       "<abbr title="How easy it is to catch your pokémon. Larger numbers mean it's easier to catch.">catchRate</abbr>": <abbr title="Values over 100 are considered 'easier' captures. Since Alolan Vulpix is a pre evolution Pokémon, its capture rate is quite high.">190</abbr>,
       "maleRatio": 0.25,
       "<abbr title="What percentage of this pokémon are male.">maleRatio</abbr>": <abbr title="Wild Alolan Vulpix have a 25% chance of being male. This means 75% of Alolan Vulpix spawns will be females.">0.25</abbr>,
       "baseExperienceYield": 60,
       "<abbr title="How many experience granted by this pokémon upon being defeated.">baseExperienceYield</abbr>": <abbr title="Weaker Pokémon usually have this value around 50.">60</abbr>,
       "baseFriendship": 50,
       "<abbr title="What this pokémon's friendship stat starts at when caught.">baseFriendship</abbr>": <abbr title="Most Pokémon have this value set to 50">50</abbr>,
       "evYield": {
       "<abbr title="How many effort values this pokémon gives upon being defeated.">evYield</abbr>": {
         "hp": 0,
         "<abbr title="Defeating this Pokémon will grant the following amount of effort values in this stat.">hp</abbr>": 0,
         "attack": 0,
         "<abbr title="Defeating this Pokémon will grant the following amount of effort values in this stat.">attack</abbr>": 0,
         "defence": 0,
         "<abbr title="Defeating this Pokémon will grant the following amount of effort values in this stat.">defence</abbr>": 0,
         "special_attack": 0,
         "<abbr title="Defeating this Pokémon will grant the following amount of effort values in this stat.">special_attack</abbr>": 0,
         "special_defence": 0,
         "<abbr title="Defeating this Pokémon will grant the following amount of effort values in this stat.">special_defence</abbr>": 0,
         "speed": 1
         "<abbr title="Defeating this Pokémon will grant the following amount of effort values in this stat.">speed</abbr>": 1
       },
       },
       "experienceGroup": "medium_fast",
       "<abbr title="How quickly this Pokémon will level up. You can look this information up online.">experienceGroup</abbr>": "<abbr title="Alolan Vulpix will level up at a 'medium fast' rate.">medium_fast</abbr>",
       "eggCycles": 20,
       "<abbr title="How long it takes for this pokémon's egg to hatch.">eggCycles</abbr>": <abbr title="A value of 20 is about how long it takes to hatch a starter Pokémon egg.">20</abbr>,
       "eggGroups": [
       "<abbr title="What egg groups this Pokémon will be able to breed with. You can look this information up online.">eggGroups</abbr>": [
         "field"
         "<abbr title="The egg group of this pokemon.">field</abbr>"
       ],
       ],
       "moves": [
       "<abbr title="Here you will list what moves the pokemon can learn and how they will learn those moves. You can check this page's section for moves to see how to write them.">moves</abbr>": [
         "1:powdersnow",
         "<abbr title="This lets Alolan Vulpix learn powder snow at level 1">1:powdersnow</abbr>",
         "1:tailwhip",
         "<abbr title="This lets Alolan Vulpix learn tail whip at level 1">1:tailwhip</abbr>",
         "4:disable",
         "4:disable",
         "7:roar",
         "7:roar",
Line 235: Line 298:
         "tutor:zenheadbutt"
         "tutor:zenheadbutt"
       ],
       ],
       "labels": [
       "<abbr title="Labels for this pokémon. There's no real use for labels yet.">labels</abbr>": [
         "gen7",
         "<abbr title="Label for a Pokémon introduced in generation 7">gen7</abbr>",
         "alola_regional"
         "<abbr title="Label for a Regional form from the alola region">alola_regional</abbr>"
       ],
       ],
       "aspects": [
       "<abbr title="Aspects are what allows a Pokémon to change its visual aspects for things like regional forms. You can read about it in this page's section on forms.">aspects</abbr>": [
         "alolan"
         "<abbr title="Alolan Vulpix will receive the aspect for alolan. This will allow it to use the alolan aspect in the resolver file to assign the alolan model instead of the kantonian one.">alolan</abbr>"
       ],
       ],
       "height": 6,
       "<abbr title="The Pokémon's height measured in decimeters">height</abbr>": 6,
       "weight": 99,
       "<abbr title="The Pokémon's weight measured in hectograms">weight</abbr>": 99,
       "evolutions": [
       "<abbr title="Here you will list any evolution methods the form will have. They are separate from the base forms evolutions.">evolutions</abbr>": [
         {
         {
           "id": "vulpix_ninetales",
           "<abbr title="The name of this evolution entry.">id</abbr>": "<abbr title="The name of this evolution entry.">vulpix_ninetales</abbr>",
           "variant": "item_interact",
           "<abbr title="The evolution variant it will use to evolve.">variant</abbr>": "<abbr title="In this case, you need to interact with an item. This is the same method as using an evolution stone to evolve. But it can be configured to be any item or modded item.">item_interact</abbr>",
           "result": "ninetales form=alola",
           "<abbr title="The Pokémon that this species will evolve into.">result</abbr>": "<abbr title="Here you are specifying that alolan vulpix will evolve into alolan ninetales. Remember to use this format when making evolution data for regional forms.">ninetales form=alola</abbr>",
           "consumeHeldItem": false,
           "<abbr title="Whether or not its held item gets consumed when evolving.">consumeHeldItem</abbr>": <abbr title="A held item is not required for this evolution, so we will leave this false for now">false</abbr>,
           "learnableMoves": [
           "<abbr title="A list of moves this Pokémon will learn when it evolves.">learnableMoves</abbr>": [
             "dazzlinggleam"
             "<abbr title="When evolving into Alolan Ninetales, it will learn dazzling gleam.">dazzlinggleam</abbr>"
           ],
           ],
           "requirements": [],
           "<abbr title="Here you will list some sub requirements for evolution. You can learn more about evolution requirements on this page's section of evolution">requirements</abbr>": <abbr title="There are no sub requirements for this evolution, so we leave these brackets blank.">[]</abbr>,
           "requiredContext": "cobblemon:ice_stone"
           "<abbr title="Here you will list what item you need to interact with to make this Pokémon evolve.">requiredContext</abbr>": "<abbr title="In this case, we are using an ice stone from the Cobblemon mod. This can be changed to any vanilla or modded item as long as you use the proper item id.">cobblemon:ice_stone</abbr>"
         }
         }
       ],
       ],
       "cannotDynamax": false,
       "cannotDynamax</abbr>": false</abbr>,
       "battleOnly": false
       "battleOnly</abbr>": false</abbr>
     }
     }
   ],
   ],
   "features": [
   "<abbr title="Here you will list any features this pokemon has. Features come from the species feature folder of the mod. You can learn more about features from this page's section on forms and features.">features</abbr>": [
     "alolan"
     "<abbr title="Even though the alolan form's data is written above, Vulpix can't access that form data unless you list alolan as a feature like this. So remember to apply alolan as a feature and an aspect!">alolan</abbr>"
   ],
   ],
   "baseExperienceYield": 60,
   "<abbr title="How many experience granted by this pokémon upon being defeated.">baseExperienceYield</abbr>": <abbr title="Weaker Pokémon usually have this value around 50.">60</abbr>,
   "experienceGroup": "medium_fast",
   "<abbr title="How quickly this Pokémon will level up. You can look this information up online.">experienceGroup</abbr>": "<abbr title="Vulpix will level up at a 'medium fast' rate.">medium_fast</abbr>",
   "eggCycles": 20,
   "<abbr title="How long it takes for this pokémon's egg to hatch.">eggCycles</abbr>": <abbr title="A value of 20 is about how long it takes to hatch a starter Pokémon egg.">20</abbr>,
   "eggGroups": [
   "<abbr title="What egg groups this Pokémon will be able to breed with. You can look this information up online.">eggGroups</abbr>": [
     "field"
     "<abbr title="The egg group of this pokemon.">field</abbr>"
   ],
   ],
   "drops": {
   "drops": {
Line 279: Line 342:
     ]
     ]
   },
   },
   "moves": [
   "<abbr title="Here you will list what moves the pokemon can learn and how they will learn those moves. You can check this page's section for moves to see how to write them.">moves</abbr>": [
     "1:ember",
     "<abbr title="This allows Kantonian Vulpix to learn ember at level 1">1:ember</abbr>",
     "1:tailwhip",
     "<abbr title="This allows Kantonian Vulpix to learn tail whip at level 1">1:tailwhip</abbr>",
     "4:disable",
     "4:disable",
     "7:roar",
     "7:roar",
Line 427: Line 490:
     "tutor:zenheadbutt"
     "tutor:zenheadbutt"
   ],
   ],
   "labels": [
   "<abbr title="Labels for this pokémon. There's no real use for labels yet.">labels</abbr>": [
     "gen1",
     "<abbr title="Label for a Pokémon introduced in generation 1">gen1</abbr>",
     "kanto_regional"
     "<abbr title="Label for a Pokémon from the kanto region.">kanto_regional</abbr>"
   ],
   ],
   "pokedex": [
   "<abbr title="Here you can create a string for your pokedex entry. The entry itself is written in the lang file. You are simply creating something to define in the lang file here.">pokedex</abbr>": [
     "cobblemon.species.vulpix.desc"
     "<abbr title="This line can be translated to any language in the language files and include the actual pokedex entry.">cobblemon.species.vulpix.desc</abbr>"
   ],
   ],
   "evolutions": [
   "<abbr title="Here you will list any evolution methods">evolutions</abbr>": [
     {
     {
       "id": "vulpix_ninetales",
       "<abbr title="The name of this evolution entry.">id</abbr>": "<abbr title="The name of this evolution entry.">vulpix_ninetales</abbr>",
       "variant": "item_interact",
       "<abbr title="The evolution variant it will use to evolve.">variant</abbr>": "<abbr title="In this case, you need to interact with an item. This is the same method as using an evolution stone to evolve. But it can be configured to be any item or modded item.">item_interact</abbr>",
       "result": "ninetales",
       "<abbr title="The Pokémon that this species will evolve into.">result</abbr>": "<abbr title="Here you are specifying that vulpix will evolve into ninetales.">ninetales</abbr>",
       "consumeHeldItem": false,
       "<abbr title="Whether or not its held item gets consumed when evolving.">consumeHeldItem</abbr>": <abbr title="A held item is not required for this evolution, so we will leave this false for now">false</abbr>,
       "learnableMoves": [],
       "<abbr title="A list of moves this Pokémon will learn when it evolves.">learnableMoves</abbr>": <abbr title="Vulpix wont learn any special moves when it evolves into ninetales, so this will be left empty.">[]</abbr>,
       "requirements": [],
       "<abbr title="Here you will list some sub requirements for evolution. You can learn more about evolution requirements on this page's section of evolution">requirements</abbr>": <abbr title="There are no sub requirements for this evolution, so we leave these brackets blank.">[]</abbr>,
       "requiredContext": "cobblemon:fire_stone"
       "<abbr title="Here you will list what item you need to interact with to make this Pokémon evolve.">requiredContext</abbr>": "<abbr title="In this case, we are using a fire stone from the Cobblemon mod. This can be changed to any vanilla or modded item as long as you use the proper item id.">cobblemon:fire_stone</abbr>"
     }
     }
   ],
   ],
   "baseScale": 0.7,
   "<abbr title="Determines the size of the model. Based on the size of the model in blockbench. A value of 1 will put it at a one to one scale with what you made in blockbench. Remember that you can't use the /reload command to see the changes you make here.">baseScale</abbr>": <abbr title="A value of 0.7 means the model will only be at 70% the size of what you made in blockbench. This can be useful for scaling models down so you can get more detail on smaller Pokémon like joltik.">0.7</abbr>,
   "hitbox": {
   "<abbr title="Here you will determine the size of this Pokémon's hitbox. You can learn more about it in this page's hitbox section.">hitbox</abbr>": {
     "width": 0.9,
     "<abbr title="A width value of 1 should let the hitbox be the size of a normal block in minecraft. Play around with this value until it looks right to you.">width</abbr>": 0.9,
     "height": 1.1,
     "<abbr title="A height value of 1 should let the hitbox be the size of a normal block in minecraft. Play around with this value until it looks right to you.">height</abbr>": 1.1,
     "fixed": false
     "<abbr title="Determines whether the hitbox is fixed in place. This should most likely be set to false.">fixed</abbr>": false
   },
   },
   "baseFriendship": 50,
   "<abbr title="What this pokémon's friendship stat starts at when caught.">baseFriendship</abbr>": <abbr title="Most Pokémon have this value set to 50">50</abbr>,
   "evYield": {
   "<abbr title="How many effort values this pokémon gives upon being defeated.">evYield</abbr>": {
     "hp": 0,
     "<abbr title="Defeating this Pokémon will grant the following amount of effort values in this stat.">hp</abbr>": 0,
     "attack": 0,
     "<abbr title="Defeating this Pokémon will grant the following amount of effort values in this stat.">attack</abbr>": 0,
     "defence": 0,
     "<abbr title="Defeating this Pokémon will grant the following amount of effort values in this stat.">defence</abbr>": 0,
     "special_attack": 0,
     "<abbr title="Defeating this Pokémon will grant the following amount of effort values in this stat.">special_attack</abbr>": 0,
     "special_defence": 0,
     "<abbr title="Defeating this Pokémon will grant the following amount of effort values in this stat.">special_defence</abbr>": 0,
     "speed": 1
     "<abbr title="Defeating this Pokémon will grant the following amount of effort values in this stat.">speed</abbr>": 1
   },
   },
   "height": 6,
   "<abbr title="The Pokémon's height measured in decimeters">height</abbr>": 6,
   "weight": 99,
   "<abbr title="The Pokémon's weight measured in hectograms">weight</abbr>": 99,
   "aspects": [],
   "<abbr title="Aspects are what allows a Pokémon to change its visual aspects for things like regional forms. Since this is for Vulpix's normal form, you'll want to leave this blank. You can read about it in this page's section on forms.">aspects</abbr>": <abbr title="The normal form for Vulpix will receive no aspects so this is left blank. This can be considered a 'default' vulpix and it will use 'default' assets for its models and textures.">[]</abbr>,
   "cannotDynamax": false
   "cannotDynamax": false
  }
  }
{{Addon Creation}}

Latest revision as of 11:43, 4 March 2024

Preface

The species JSON contains all the data of each Pokémon and its various forms. The species file is everything a Pokémon is without the visual aspects. Moves, abilities, forms, size, evolutions, and so much more are contained in this single file for every Pokémon. Cobblemon already includes most of this data for all 1,017 Pokémon.

Creating a custom Pokémon is as simple as creating a new species file! You can borrow an existing Pokémon's species file and swap the name for a new one or you can create a new file from scratch. It is highly recommended that you use Cobblemon's Fakemon Generator to create new species files.

The Species File

The species file contains large amounts of data about Pokémon that connect to all the other systems that make Pokémon function in game. Some properties in the file are self explanatory, while others are not so clear. This section will provide lots of helpful information and links to help you understand all the different systems that connect to the species file.

Helpful Information

Some very helpful links and resources will be listed below. They can help you with understanding the mechanics of both the mod and Pokémon in general.

Where to get species files
  • The Cobblemon Gitlab - This is where Cobblemon's source code is hosted. You can find the species files of all Pokémon in that link. They should be in folders sorted by generation.


Where to find official Pokémon data
  • Bulbagarden - This website has information about Pokémon both from the games and the anime. You can find many references about each Pokémon here.
  • Pokémon Database - This website has all kinds of information about Pokémon, but is more focused on stats. A lot of that data is the same or similar to what's written in the species files.
  • Serebii - This website probably has the most information about Pokémon. Serebii provides accurate data and media references with images of these media appearances.


Behaviors and AI information
  • Behavior Wiki Page - This wiki page will list and explain all the different behavior properties you can write for a Pokémon. This assigns the Pokémon its AI behavior. You can also copy a similar Pokémon's behavior code block if you are unsure how to create one.


Forms, Features, and Aspects
  • Regional Forms - This links to a tutorial about setting up regional forms. Regional forms usually have different stats and this tutorial can show you how to set them up.
  • Multiple Visual Forms - This links to a tutorial about creating multiple visual forms like the different Torterra trees. These kinds of forms usually keep the same stats as the normal form and this tutorial can show you how to set them up.
  • Species Features - This is the wiki page about species features. Features are what create "Aspects." Aspects are what allows for all the different visual forms for Pokémon.


Evolutions
  • The Cobblemon Gitlab - It is recommended that you use an existing Pokémon's evolution data as a template for evolutions. All existing evolution methods should be written into their respective pokemon's species file.
  • Cobblemon's Fakemon Generator - You can also generate evolution methods using the Fakemon generator. It will give you all the evolution methods when creating new species files.
  • Evolution Requirements From the Cobblemon Gitlab - This links to a folder on the gitlab that has the code files to all the possible evolution requirements for you to reference. All of these methods are used by at least one official Pokémon. It is recommended that you look up this Pokémon's species file to replicate its evolution method.


Shoulder Effects

Shoulder effects grant special buffs to the player if certain Pokémon are on their shoulders. Version 1.4 removed the shoulder effects so they could be rebalanced at a later date, but you can still apply effect data through datapacks. As of version 1.4, no shoulder mountable Pokémon has shoulder effect data in their species file.


If you wish to apply shoulder effect data to a Pokémon, you can include the following code block and switch the effect as you please:

  • You can find a list of effects on the Minecraft Wiki. Mileage may vary.
 "shoulderEffects": [
   {
     "type": "potion_effect",
     "effect": "minecraft:slow_falling",
     "amplifier": 0,
     "ambient": true,
     "showParticles": false,
     "showIcon": false
   }
 ]


Version 1.3 shoulder effects:

  • haste
  • water_breathing
  • speed
  • slow_falling


Moves and Learning Methods

This section of the species file determines the moves a Pokémon can learn. There are 4 methods of learning moves. Only 1 of them is currently implemented and that's level learning.

Every move from the official games should be in Cobblemon. In order for moves to be read properly, they must be written in the correct format for the move list. The method type goes on the left side of a colon and the move name goes on the right side of the colon. Moves that contain 2 or more words must be bunched together into one "word" and can't contain any spaces, underscores, commas, or hyphens. Everything must remain in lowercase as well.

Example of each method and name format:

  • "5:quickattack" : Level - This would let a Pokémon learn quick attack at level 5. The number determines what level the move will be learned at.
  • "egg:thunder" : Egg Move - This would let a Pokémon inherit thunder from one of its parents. It will hatch from its egg knowing this move when breeding gets implemented.
  • "tm:thunderbolt" : TMs - This would allow a Pokémon to use a thunderbolt TM when TMs get implemented.
  • "tutor:10000000voltthunderbolt" : Tutor - This would allow a Pokémon to learn 10,000,000 Volt Thunderbolt from a tutor when tutors get implemented.


Item Drops

Cobblemon drops work differently than vanilla drops. You need to set a target amount of drops, then it tries to achieve this drop amount by rolling for drops in the entries listed. If an entry passes a percentage check, then it will count as 1 towards the targeted amount. Once this target amount is achieved, it will stop trying to roll for drops even if it did not finish reading all the entries. If it runs out of entries and did not achieve this target, then it will also stop rolling for drops. Once it stops rolling, all of the drops that passed the percentage check will drop where the Pokémon was defeated.

Example code block for drops:

  • Since amount is set to 1 and there is only 1 entry, then it will only roll for drops from this 1 entry.
  • The sweet berries entry does not list a percentage value, so by default its 100%.
  • This would make Vulpix drop 2-3 berries 100% of the time
"drops": {
  "amount": "1",
  "entries": [
    {
      "item": "minecraft:sweet_berries",
      "quantityRange": "2-3"
    }
  ]
},


Hitbox and Base Scale

The size of the Pokémon model and its hitbox are controlled by the species file. If you want to change any of these values and see the results, you must load the singleplayer world from the main menu. The /reload command does not work with Cobblemon datapacks. Loading the world again is the proper way to refresh Cobblemon datapacks.

  • baseScale will size the Pokémon up or down. A value of 1 will let the model be at a one to one scale with its size in blockbench.
  • hitbox has 3 values you can change, but you will only want to change the height and width of the hitbox. In game, you can press F3+B to show the hitboxes on entities.
    • Height is how many blocks high the Pokémon is.
    • A hitbox width of 1 will let the hitbox be as wide as 1 Minecraft block with the Pokémon at the center of the hitbox. Width is akin to diameter, but it's Minecraft so everything is a cube. Try not to think about it too much.


Height and Weight

The height and weight that will be used for the Pokédex when it gets implemented. The unit for height is in decimeters. The unit for weight is in hectograms. Dividing these values by 10 will give you the metric units for meters and kilograms.

  • height doesn't do anything significant and is misleading a lot of the time in the Pokédex. Sometimes it measures distance from the ground, and sometimes it measures how long a Pokémon is.
  • weight will determine the damage value of weight based moves like heavy slam. Make sure you set these weights to hectograms or these moves may do unintentional amounts of damage.


Gender

Gender is managed via the maleRatio property.

  • This property should have a decimal value between 0 and 1, and is the percent chance for a Pokémon to spawn as a male.
    • A value of 0.1 for example would lead to a 10% chance to spawn as a male.
  • The special value of -1 is reserved for genderless Pokémon.


Lighting Data

Lighting data allows for compatibility with some of the more popular dynamic lighting mods. A Pokémon can be assigned a light level and can be set to only emit light when on land, underwater, or both!

  • lightLevel - The light level emitted by the Pokémon. A range of 0 to 15.
  • liquidGlowMode - If the effect runs while in a liquid or on land. Your options are LAND, UNDERWATER or BOTH


Example code block for lightingData:

  • Any pokemon assigned this data will emit a light level of 14 when on land
 "lightingData": {
  "lightLevel": 14,
  "liquidGlowMode": "LAND"
 }


Species File Breakdown

As far as the writer of this article is concerned, Vulpix has one of the most fleshed out species files. This makes Vulpix a great example to explain the different sections of the species file. You can reference some of the resources listed above and compare them with the written data below. Hover over the underlined text to see more information.

{
 "implemented": true,
 "name": "Vulpix",
 "nationalPokedexNumber": 37,
 "primaryType": "fire",
 "abilities": [
   "flashfire",
   "h:drought"
 ],
 "baseStats": {
   "hp": 38,
   "attack": 41,
   "defence": 40,
   "special_attack": 50,
   "special_defence": 65,
   "speed": 65
 },
 "behaviour": {
   "resting": {
     "canSleep": true,
     "willSleepOnBed": true,
     "depth": "normal",
     "light": "0-4"
   }
 },
 "catchRate": 190,
 "maleRatio": 0.25,
 "shoulderMountable": false,
 "forms": [
   {
     "name": "Alola",
     "primaryType": "ice",
     "abilities": [
       "snowcloak",
       "h:snowwarning"
     ],
     "baseStats": {
       "hp": 38,
       "attack": 41,
       "defence": 40,
       "special_attack": 50,
       "special_defence": 65,
       "speed": 65
     },
     "catchRate": 190,
     "maleRatio": 0.25,
     "baseExperienceYield": 60,
     "baseFriendship": 50,
     "evYield": {
       "hp": 0,
       "attack": 0,
       "defence": 0,
       "special_attack": 0,
       "special_defence": 0,
       "speed": 1
     },
     "experienceGroup": "medium_fast",
     "eggCycles": 20,
     "eggGroups": [
       "field"
     ],
     "moves": [
       "1:powdersnow",
       "1:tailwhip",
       "4:disable",
       "7:roar",
       "8:iceshard",
       "9:babydolleyes",
       "12:spite",
       "16:icywind",
       "18:payback",
       "20:confuseray",
       "23:feintattack",
       "24:aurorabeam",
       "26:hex",
       "28:extrasensory",
       "32:icebeam",
       "34:safeguard",
       "36:imprison",
       "40:mist",
       "44:auroraveil",
       "47:captivate",
       "48:sheercold",
       "52:grudge",
       "56:blizzard",
       "egg:agility",
       "egg:babydolleyes",
       "egg:charm",
       "egg:disable",
       "egg:encore",
       "egg:extrasensory",
       "egg:flail",
       "egg:freezedry",
       "egg:howl",
       "egg:hypnosis",
       "egg:moonblast",
       "egg:powerswap",
       "egg:roar",
       "egg:secretpower",
       "egg:spite",
       "egg:tailslap",
       "tm:agility",
       "tm:attract",
       "tm:auroraveil",
       "tm:blizzard",
       "tm:bodyslam",
       "tm:charm",
       "tm:confide",
       "tm:darkpulse",
       "tm:dig",
       "tm:doubleteam",
       "tm:drainingkiss",
       "tm:encore",
       "tm:endure",
       "tm:facade",
       "tm:foulplay",
       "tm:frostbreath",
       "tm:frustration",
       "tm:hail",
       "tm:hex",
       "tm:hiddenpower",
       "tm:icebeam",
       "tm:icywind",
       "tm:imprison",
       "tm:irontail",
       "tm:payback",
       "tm:powerswap",
       "tm:protect",
       "tm:psychup",
       "tm:raindance",
       "tm:rest",
       "tm:return",
       "tm:roar",
       "tm:round",
       "tm:safeguard",
       "tm:sleeptalk",
       "tm:snore",
       "tm:substitute",
       "tm:swagger",
       "tm:swift",
       "tm:tailslap",
       "tm:toxic",
       "tm:weatherball",
       "tm:zenheadbutt",
       "tutor:aquatail",
       "tutor:aurorabeam",
       "tutor:babydolleyes",
       "tutor:blizzard",
       "tutor:celebrate",
       "tutor:confuseray",
       "tutor:covet",
       "tutor:darkpulse",
       "tutor:dazzlinggleam",
       "tutor:dig",
       "tutor:facade",
       "tutor:foulplay",
       "tutor:headbutt",
       "tutor:healbell",
       "tutor:icebeam",
       "tutor:iceshard",
       "tutor:icywind",
       "tutor:irontail",
       "tutor:mist",
       "tutor:painsplit",
       "tutor:powdersnow",
       "tutor:protect",
       "tutor:reflect",
       "tutor:rest",
       "tutor:roar",
       "tutor:roleplay",
       "tutor:snore",
       "tutor:spite",
       "tutor:substitute",
       "tutor:tackle",
       "tutor:tailwhip",
       "tutor:toxic",
       "tutor:zenheadbutt"
     ],
     "labels": [
       "gen7",
       "alola_regional"
     ],
     "aspects": [
       "alolan"
     ],
     "height": 6,
     "weight": 99,
     "evolutions": [
       {
         "id": "vulpix_ninetales",
         "variant": "item_interact",
         "result": "ninetales form=alola",
         "consumeHeldItem": false,
         "learnableMoves": [
           "dazzlinggleam"
         ],
         "requirements": [],
         "requiredContext": "cobblemon:ice_stone"
       }
     ],
     "cannotDynamax": false,
     "battleOnly": false
   }
 ],
 "features": [
   "alolan"
 ],
 "baseExperienceYield": 60,
 "experienceGroup": "medium_fast",
 "eggCycles": 20,
 "eggGroups": [
   "field"
 ],
 "drops": {
   "amount": "1",
   "entries": [
     {
       "item": "minecraft:sweet_berries",
       "quantityRange": "2-3"
     }
   ]
 },
 "moves": [
   "1:ember",
   "1:tailwhip",
   "4:disable",
   "7:roar",
   "8:quickattack",
   "9:babydolleyes",
   "12:spite",
   "16:incinerate",
   "18:payback",
   "20:confuseray",
   "23:feintattack",
   "24:willowisp",
   "26:hex",
   "28:extrasensory",
   "28:flameburst",
   "32:flamethrower",
   "36:imprison",
   "40:firespin",
   "44:safeguard",
   "47:captivate",
   "48:inferno",
   "52:grudge",
   "56:fireblast",
   "egg:babydolleyes",
   "egg:captivate",
   "egg:disable",
   "egg:energyball",
   "egg:extrasensory",
   "egg:feintattack",
   "egg:flail",
   "egg:flamecharge",
   "egg:flareblitz",
   "egg:heatwave",
   "egg:hex",
   "egg:howl",
   "egg:hypnosis",
   "egg:memento",
   "egg:powerswap",
   "egg:psychup",
   "egg:roar",
   "egg:secretpower",
   "egg:spite",
   "egg:tailslap",
   "tm:agility",
   "tm:attract",
   "tm:bodyslam",
   "tm:captivate",
   "tm:confide",
   "tm:darkpulse",
   "tm:dig",
   "tm:doubleteam",
   "tm:encore",
   "tm:endure",
   "tm:energyball",
   "tm:facade",
   "tm:fireblast",
   "tm:firespin",
   "tm:flamecharge",
   "tm:flamethrower",
   "tm:flareblitz",
   "tm:foulplay",
   "tm:frustration",
   "tm:heatwave",
   "tm:hex",
   "tm:hiddenpower",
   "tm:imprison",
   "tm:incinerate",
   "tm:irontail",
   "tm:mysticalfire",
   "tm:naturalgift",
   "tm:overheat",
   "tm:payback",
   "tm:powerswap",
   "tm:protect",
   "tm:psychup",
   "tm:rest",
   "tm:return",
   "tm:roar",
   "tm:round",
   "tm:safeguard",
   "tm:secretpower",
   "tm:sleeptalk",
   "tm:snore",
   "tm:substitute",
   "tm:sunnyday",
   "tm:swagger",
   "tm:swift",
   "tm:tailslap",
   "tm:toxic",
   "tm:weatherball",
   "tm:willowisp",
   "tm:zenheadbutt",
   "tutor:attract",
   "tutor:bide",
   "tutor:bodyslam",
   "tutor:burningjealousy",
   "tutor:charm",
   "tutor:confuseray",
   "tutor:covet",
   "tutor:curse",
   "tutor:darkpulse",
   "tutor:dig",
   "tutor:disable",
   "tutor:doubleedge",
   "tutor:doubleteam",
   "tutor:ember",
   "tutor:endure",
   "tutor:facade",
   "tutor:feintattack",
   "tutor:fireblast",
   "tutor:firespin",
   "tutor:flail",
   "tutor:flamethrower",
   "tutor:foulplay",
   "tutor:frustration",
   "tutor:headbutt",
   "tutor:heatwave",
   "tutor:hiddenpower",
   "tutor:hypnosis",
   "tutor:irontail",
   "tutor:mimic",
   "tutor:ominouswind",
   "tutor:painsplit",
   "tutor:protect",
   "tutor:quickattack",
   "tutor:rage",
   "tutor:reflect",
   "tutor:rest",
   "tutor:return",
   "tutor:roar",
   "tutor:roleplay",
   "tutor:safeguard",
   "tutor:skullbash",
   "tutor:sleeptalk",
   "tutor:snore",
   "tutor:spite",
   "tutor:substitute",
   "tutor:sunnyday",
   "tutor:swagger",
   "tutor:swift",
   "tutor:tackle",
   "tutor:tailwhip",
   "tutor:takedown",
   "tutor:toxic",
   "tutor:willowisp",
   "tutor:zenheadbutt"
 ],
 "labels": [
   "gen1",
   "kanto_regional"
 ],
 "pokedex": [
   "cobblemon.species.vulpix.desc"
 ],
 "evolutions": [
   {
     "id": "vulpix_ninetales",
     "variant": "item_interact",
     "result": "ninetales",
     "consumeHeldItem": false,
     "learnableMoves": [],
     "requirements": [],
     "requiredContext": "cobblemon:fire_stone"
   }
 ],
 "baseScale": 0.7,
 "hitbox": {
   "width": 0.9,
   "height": 1.1,
   "fixed": false
 },
 "baseFriendship": 50,
 "evYield": {
   "hp": 0,
   "attack": 0,
   "defence": 0,
   "special_attack": 0,
   "special_defence": 0,
   "speed": 1
 },
 "height": 6,
 "weight": 99,
 "aspects": [],
 "cannotDynamax": false
}