<?xml version="1.0"?>
<feed xmlns="http://www.w3.org/2005/Atom" xml:lang="en">
	<id>https://wiki.cobblemon.com/api.php?action=feedcontributions&amp;feedformat=atom&amp;user=Hiroku</id>
	<title>Cobblemon Wiki - User contributions [en]</title>
	<link rel="self" type="application/atom+xml" href="https://wiki.cobblemon.com/api.php?action=feedcontributions&amp;feedformat=atom&amp;user=Hiroku"/>
	<link rel="alternate" type="text/html" href="https://wiki.cobblemon.com/index.php/Special:Contributions/Hiroku"/>
	<updated>2026-06-01T23:10:54Z</updated>
	<subtitle>User contributions</subtitle>
	<generator>MediaWiki 1.39.10</generator>
	<entry>
		<id>https://wiki.cobblemon.com/index.php?title=Dialogues&amp;diff=8180</id>
		<title>Dialogues</title>
		<link rel="alternate" type="text/html" href="https://wiki.cobblemon.com/index.php?title=Dialogues&amp;diff=8180"/>
		<updated>2026-01-23T03:04:58Z</updated>

		<summary type="html">&lt;p&gt;Hiroku: mandatory dialogue field mention&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Dialogues are a feature that can be used from API or from datapacks to play conversations in a GUI. They display entities, view pages of text, and handle various types of input.&lt;br /&gt;
&lt;br /&gt;
A dialogue that has been registered through a datapack can be opened using the /opendialogue command.&lt;br /&gt;
&lt;br /&gt;
Every case of a MoLang expression can be either a single text property or can be an array of text to support running multiple expressions to produce a result.&lt;br /&gt;
&lt;br /&gt;
[[File:Dialogue_Intro.png|400px|center]]&lt;br /&gt;
&lt;br /&gt;
=Dialogue=&lt;br /&gt;
&lt;br /&gt;
A Dialogue JSON file consists of the following main elements:&lt;br /&gt;
&lt;br /&gt;
- &amp;lt;code&amp;gt;escapeAction&amp;lt;/code&amp;gt;: A string or array that defines the action to be taken when the dialogue is escaped. This can be a MoLang expression or a sequence of MoLang expressions.&lt;br /&gt;
&lt;br /&gt;
- &amp;lt;code&amp;gt;speakers&amp;lt;/code&amp;gt;: An object that defines the speakers in the dialogue. Each speaker is represented by a key-value pair, where the key is the speaker&#039;s identifier and the value is an object that describes what the speaker looks like and their name.&lt;br /&gt;
&lt;br /&gt;
- &amp;lt;code&amp;gt;pages&amp;lt;/code&amp;gt;: An array of objects, each representing a page in the dialogue.&lt;br /&gt;
&lt;br /&gt;
==Speakers==&lt;br /&gt;
&lt;br /&gt;
Each speaker is represented by an object with the following properties:&lt;br /&gt;
&lt;br /&gt;
- &amp;lt;code&amp;gt;name&amp;lt;/code&amp;gt;: A string or object that defines the speaker&#039;s name. This is usually just text. If it&#039;s an object, it must have a &amp;lt;code&amp;gt;type&amp;lt;/code&amp;gt; property set to &amp;lt;code&amp;gt;&amp;quot;expression&amp;quot;&amp;lt;/code&amp;gt; and an &amp;lt;code&amp;gt;expression&amp;lt;/code&amp;gt; property that contains a MoLang expression. You would use an expression if you wanted the name to be dynamic.&lt;br /&gt;
&lt;br /&gt;
- &amp;lt;code&amp;gt;face&amp;lt;/code&amp;gt;: An object or MoLang expression that defines the speaker&#039;s face. This will be rendered in a frame of the GUI. For objects, it must have a &amp;lt;code&amp;gt;type&amp;lt;/code&amp;gt; property set to the type of face. The only object type support currently is &amp;quot;standard&amp;quot;. The others are done using MoLang expressions rather than an object.&lt;br /&gt;
&lt;br /&gt;
- &amp;lt;code&amp;gt;gibber&amp;lt;/code&amp;gt;: An object defining the gibber behaviour. This can be defined as simply &amp;lt;code&amp;gt;{}&amp;lt;/code&amp;gt; to use the default settings, or as a full object with any of the properties that you want to set. See the section on &amp;lt;code&amp;gt;gibber&amp;lt;/code&amp;gt; further below to see the properties that are available.&lt;br /&gt;
&lt;br /&gt;
===Faces===&lt;br /&gt;
The speaker faces can be defined in multiple ways. If it is an object it is going to be a &amp;quot;standard&amp;quot; face type.&lt;br /&gt;
&lt;br /&gt;
====&amp;quot;standard&amp;quot;====&lt;br /&gt;
The standard face type is for when the face displayed is not connected to a specific entity in the world but does follow Cobblemon&#039;s format of identifier and aspect list. The object must have the following properties:&lt;br /&gt;
&lt;br /&gt;
- &amp;lt;code&amp;gt;modelType&amp;lt;/code&amp;gt;: One of &#039;pokemon&#039;, &#039;npc&#039;&lt;br /&gt;
&lt;br /&gt;
- &amp;lt;code&amp;gt;identifier&amp;lt;/code&amp;gt;: The identifier of the Pokémon or NPC, such as &amp;lt;code&amp;gt;cobblemon:bulbasaur&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
- &amp;lt;code&amp;gt;aspects&amp;lt;/code&amp;gt;: An array of aspects that will be applied to the model.&lt;br /&gt;
&lt;br /&gt;
For example:&lt;br /&gt;
&lt;br /&gt;
  &amp;quot;face&amp;quot;: {&lt;br /&gt;
    &amp;quot;type&amp;quot;: &amp;quot;artificial&amp;quot;,&lt;br /&gt;
    &amp;quot;modelType&amp;quot;: &amp;quot;pokemon&amp;quot;,&lt;br /&gt;
    &amp;quot;identifier&amp;quot;: &amp;quot;cobblemon:pikachu&amp;quot;,&lt;br /&gt;
    &amp;quot;aspects&amp;quot;: [&lt;br /&gt;
      &amp;quot;shiny&amp;quot;&lt;br /&gt;
    ]&lt;br /&gt;
  }&lt;br /&gt;
  &lt;br /&gt;
&lt;br /&gt;
====player====&lt;br /&gt;
By using &amp;lt;code&amp;gt;q.player.face()&amp;lt;/code&amp;gt; you can make the player&#039;s model render for this face.&lt;br /&gt;
&lt;br /&gt;
For example:&lt;br /&gt;
&lt;br /&gt;
  &amp;quot;face&amp;quot;: &amp;quot;q.player.face();&amp;quot;&lt;br /&gt;
&lt;br /&gt;
====npc====&lt;br /&gt;
By using &amp;lt;code&amp;gt;q.npc.face()&amp;lt;/code&amp;gt; you can show a direct reference to the NPC you&#039;re having the dialogue with, if this was dialogue started with an NPC entity.&lt;br /&gt;
&lt;br /&gt;
For example:&lt;br /&gt;
&lt;br /&gt;
  &amp;quot;face&amp;quot;: &amp;quot;q.npc.face();&amp;quot;&lt;br /&gt;
&lt;br /&gt;
===Gibber===&lt;br /&gt;
An additional feature of dialogues is having the text appear gradually and with a simplistic set of tones that mimic speech, referred to here as gibbering. Gibbering has many options and all have sensible defaults. The properties available are as follows:&lt;br /&gt;
&lt;br /&gt;
- &amp;lt;code&amp;gt;graduallyShowText&amp;lt;/code&amp;gt;: A boolean which, when true, will cause the text in the GUI to gradually be typed out. When false, gibbering sound effects will play but all of the text will be visible from the beginning. Defaults to true.&lt;br /&gt;
&lt;br /&gt;
- &amp;lt;code&amp;gt;allowSkip&amp;lt;/code&amp;gt;: Whether or not clicking in the dialogue box will skip the gibbering and display all of the text at once. If false, the player must wait until the entirety of the gibbering has occurred before they can continue to the next page.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;step&amp;lt;/code&amp;gt;: The number of characters between each gibber. A gibber will play for the current character index and then, after some time interval, this step will be used to move to a later character in the text to play the next gibber. When gradually revealing text is on, a larger step will mean that text will appear in larger chunks. Defaults to 4 characters.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;interval&amp;lt;/code&amp;gt;: The time (in seconds) between each gibber sound. A smaller value will make the sounds come more rapidly, and the text will appear more quickly if gradually showing text. Defaults to 0.1 seconds.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;minPitch&amp;lt;/code&amp;gt;: The minimum pitch multiplier that could be used when randomly selecting a tone. Defaults to 0.8.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;maxPitch&amp;lt;/code&amp;gt;: The maximum pitch multiplier that could be used when randomly selecting a tone. Defaults to 1.2.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;minVolume&amp;lt;/code&amp;gt;: The minimum volume multiplier that could be used when randomly selecting a tone. Defaults to 0.75.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;maxVolume&amp;lt;/code&amp;gt;: The maximum volume multiplier that could be used when randomly selecting a tone. Defaults to 1.1.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;sounds&amp;lt;/code&amp;gt;: A list of resource locations indicating which sound events should be chosen from when playing a gibber. It can be any number of sounds. Defaults to three sounds: &amp;lt;code&amp;gt;&amp;quot;cobblemon:entity.villager.npc1&amp;quot;&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;&amp;quot;cobblemon:entity.villager.npc2&amp;quot;&amp;lt;/code&amp;gt;, and &amp;lt;code&amp;gt;&amp;quot;cobblemon:entity.villager.npc1&amp;quot;&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
==Pages==&lt;br /&gt;
&lt;br /&gt;
Each page is represented by an object with the following properties:&lt;br /&gt;
&lt;br /&gt;
- &amp;lt;code&amp;gt;id&amp;lt;/code&amp;gt;: A string that uniquely identifies the page. This is needed for instances where you might want to jump to a specific page. Page numbers could be used, but you should use page IDs.&lt;br /&gt;
&lt;br /&gt;
- &amp;lt;code&amp;gt;speaker&amp;lt;/code&amp;gt;: A string that specifies the speaker&#039;s identifier. This depends upon the speaker by this identifier existing in the speakers list.&lt;br /&gt;
&lt;br /&gt;
- &amp;lt;code&amp;gt;lines&amp;lt;/code&amp;gt;: An array of strings or objects, each representing a line of text. If it&#039;s an object, it must have a &amp;lt;code&amp;gt;type&amp;lt;/code&amp;gt; property set to &amp;lt;code&amp;gt;&amp;quot;expression&amp;quot;&amp;lt;/code&amp;gt; and an &amp;lt;code&amp;gt;expression&amp;lt;/code&amp;gt; property that contains a MoLang expression that evaluates to a string. You would use an expression if you want to include variables to make dynamic text.&lt;br /&gt;
&lt;br /&gt;
- &amp;lt;code&amp;gt;input&amp;lt;/code&amp;gt;: An object or string that defines the input prompt. If it&#039;s an object, it must have a &amp;lt;code&amp;gt;type&amp;lt;/code&amp;gt; property set to &amp;lt;code&amp;gt;&amp;quot;option&amp;quot;&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;&amp;quot;text&amp;quot;&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;&amp;quot;auto-continue&amp;quot;&amp;lt;/code&amp;gt;, or &amp;lt;code&amp;gt;&amp;quot;none&amp;quot;&amp;lt;/code&amp;gt;, and other properties depending on the type. By default, the input value will be &amp;lt;code&amp;gt;none&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
- &amp;lt;code&amp;gt;gibber&amp;lt;/code&amp;gt;: A page-specific gibber configuration. See above for more information about gibber objects. By default this is null, and will therefore fallback to the gibber that is on the &amp;lt;code&amp;gt;speaker&amp;lt;/code&amp;gt; for this page, if any is.&lt;br /&gt;
&lt;br /&gt;
- &amp;lt;code&amp;gt;clientActions&amp;lt;/code&amp;gt;: A list of MoLang expressions that will run on the client after the first frame of the page has been rendered on the client. This can be used to play sounds with &amp;lt;code&amp;gt;&amp;quot;q.sound(...)&amp;quot;&amp;lt;/code&amp;gt;, or even play animations on the face being rendered (if it is a Bedrock animated entity) by doing, for example, &amp;lt;code&amp;gt;&amp;quot;q.face.play_animation(&#039;win&#039;);&amp;quot;&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
- &amp;lt;code&amp;gt;escapeAction&amp;lt;/code&amp;gt;: A string or array that defines the action to be taken when the page is escaped. This can be a MoLang expression or a sequence of MoLang expressions.&lt;br /&gt;
&lt;br /&gt;
- &amp;lt;code&amp;gt;background&amp;lt;/code&amp;gt;: A resource location to use as the background texture for the dialogue box. By default this is null, which will result in Cobblemon&#039;s internal texture to be used.&lt;br /&gt;
&lt;br /&gt;
==Input Types==&lt;br /&gt;
&lt;br /&gt;
The &amp;lt;code&amp;gt;input&amp;lt;/code&amp;gt; property in a page object can have different structures depending on the &amp;lt;code&amp;gt;type&amp;lt;/code&amp;gt;. &lt;br /&gt;
&lt;br /&gt;
For all inputs that specify an &amp;lt;code&amp;gt;action&amp;lt;/code&amp;gt; property which is set to a MoLang expression, you can access the time it took for them to make that input using &amp;lt;code&amp;gt;v.seconds_taken_to_input&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
===&amp;quot;option&amp;quot;===&lt;br /&gt;
The input is a set of options. The object must have an &amp;lt;code&amp;gt;options&amp;lt;/code&amp;gt; property that is an array of objects, each representing an option. It can also specify whether the options should be displayed vertically or horizontally by whether or not the &amp;lt;code&amp;gt;vertical&amp;lt;/code&amp;gt; property is true or false.&lt;br /&gt;
&lt;br /&gt;
Each option object can have the following properties:&lt;br /&gt;
&lt;br /&gt;
- &amp;lt;code&amp;gt;value&amp;lt;/code&amp;gt;: The unique value of the dialogue option. This is not displayed to the player and is instead used to reference this option from scripts. This property is mandatory.&lt;br /&gt;
&lt;br /&gt;
- &amp;lt;code&amp;gt;text&amp;lt;/code&amp;gt;The display text for the option. This can be a simple string or can be an object. This property is mandatory.&lt;br /&gt;
&lt;br /&gt;
- &amp;lt;code&amp;gt;action&amp;lt;/code&amp;gt;: The MoLang expression to run when the user chooses the option.&lt;br /&gt;
&lt;br /&gt;
- &amp;lt;code&amp;gt;isVisible&amp;lt;/code&amp;gt;: A MoLang expression which must return either true or false. If false, the option will not be visible for the player. Defaults to true.&lt;br /&gt;
&lt;br /&gt;
- &amp;lt;code&amp;gt;isSelectable&amp;lt;/code&amp;gt;: A MoLang expression which must return either true or false. If false, the option will be greyed out (but only if it is visible). Defaults to true.&lt;br /&gt;
&lt;br /&gt;
[[File:Dialogue_Options.png|600px|center]]&lt;br /&gt;
&lt;br /&gt;
===&amp;quot;text&amp;quot;===&lt;br /&gt;
The input is a text field. The &amp;lt;code&amp;gt;action&amp;lt;/code&amp;gt; property is a MoLang expression that will run when the player hits enter with text typed in. As specified earlier, you can check the text that they input using &amp;lt;code&amp;gt;v.selected_option&amp;lt;/code&amp;gt; inside of the MoLang expression.&lt;br /&gt;
&lt;br /&gt;
[[File:Dialogue_Input.png|600px|center]]&lt;br /&gt;
&lt;br /&gt;
===&amp;quot;auto-continue&amp;quot;===&lt;br /&gt;
The dialogue will automatically progress after some period of time. There are several optional properties for this.&lt;br /&gt;
&lt;br /&gt;
- &amp;lt;code&amp;gt;delay&amp;lt;/code&amp;gt;: The delay in seconds until it progresses. By default this is 5 seconds. &lt;br /&gt;
&lt;br /&gt;
- &amp;lt;code&amp;gt;allowSkip&amp;lt;/code&amp;gt;: Whether the user is able to skip the delay by clicking. By default this is true. If false, the player will be forced to wait for the delay.&lt;br /&gt;
&lt;br /&gt;
- &amp;lt;code&amp;gt;showTimer&amp;lt;/code&amp;gt;: Whether a bar will be displayed to indicate how much more time the player has until it auto-continues. Defaults to false.&lt;br /&gt;
&lt;br /&gt;
- &amp;lt;code&amp;gt;action&amp;lt;/code&amp;gt;: A MoLang expression that runs when either the player clicks (only when &amp;lt;code&amp;gt;allowSkip&amp;lt;/code&amp;gt; is true) or the delay finishes. By default this moves to the next page.&lt;br /&gt;
&lt;br /&gt;
===&amp;quot;none&amp;quot;===&lt;br /&gt;
There is no input except that it waits until the user clicks to continue. The object can have an &amp;lt;code&amp;gt;action&amp;lt;/code&amp;gt; property that defines the MoLang expression to run when the player clicks. By default, it moves to the next page.&lt;br /&gt;
&lt;br /&gt;
===Timeouts===&lt;br /&gt;
All input types except for &amp;lt;code&amp;gt;&amp;quot;none&amp;quot;&amp;lt;/code&amp;gt; and &amp;lt;code&amp;gt;&amp;quot;autocontinue&amp;quot;&amp;lt;/code&amp;gt; can have a &#039;timeout&#039; object which allows you to apply time constraints to the player viewing the page.&lt;br /&gt;
&lt;br /&gt;
The timeout object can have 3 properties:&lt;br /&gt;
&lt;br /&gt;
- &amp;lt;code&amp;gt;duration&amp;lt;/code&amp;gt;: The time, in seconds, that the player will have to complete the input. By default this is 10 seconds.&lt;br /&gt;
&lt;br /&gt;
- &amp;lt;code&amp;gt;showTimer&amp;lt;/code&amp;gt;: Whether or not a bar will be shown to show the player how much time they have left. By default this is true.&lt;br /&gt;
&lt;br /&gt;
- &amp;lt;code&amp;gt;action&amp;lt;/code&amp;gt;: A MoLang expression to run if they do not enter the input in time. By default this will close the dialogue.&lt;br /&gt;
&lt;br /&gt;
[[File:Dialogue_Timer.png|600px|center]]&lt;br /&gt;
&lt;br /&gt;
=Example=&lt;br /&gt;
The following example is built-in to the mod, labelled &amp;quot;example&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
  {&lt;br /&gt;
    &amp;quot;escapeAction&amp;quot;: &amp;quot;q.dialogue.set_page(&#039;quitter&#039;)&amp;quot;,&lt;br /&gt;
    &amp;quot;speakers&amp;quot;: {&lt;br /&gt;
      &amp;quot;pikachu&amp;quot;: {&lt;br /&gt;
        &amp;quot;name&amp;quot;: &amp;quot;The Voice of Hiro&amp;quot;,&lt;br /&gt;
        &amp;quot;face&amp;quot;: {&lt;br /&gt;
          &amp;quot;type&amp;quot;: &amp;quot;artificial&amp;quot;,&lt;br /&gt;
          &amp;quot;modelType&amp;quot;: &amp;quot;pokemon&amp;quot;,&lt;br /&gt;
          &amp;quot;identifier&amp;quot;: &amp;quot;cobblemon:pikachu&amp;quot;,&lt;br /&gt;
          &amp;quot;aspects&amp;quot;: [&lt;br /&gt;
            &amp;quot;shiny&amp;quot;&lt;br /&gt;
          ]&lt;br /&gt;
        },&lt;br /&gt;
        &amp;quot;gibber&amp;quot;: {&lt;br /&gt;
          &amp;quot;step&amp;quot;: 2,&lt;br /&gt;
          &amp;quot;interval&amp;quot;: 0.07,&lt;br /&gt;
          &amp;quot;allowSkip&amp;quot;: false&lt;br /&gt;
        }&lt;br /&gt;
      },&lt;br /&gt;
      &amp;quot;player&amp;quot;: {&lt;br /&gt;
        &amp;quot;face&amp;quot;: &amp;quot;q.player.face();&amp;quot;,&lt;br /&gt;
        &amp;quot;name&amp;quot;: {&lt;br /&gt;
          &amp;quot;type&amp;quot;: &amp;quot;expression&amp;quot;,&lt;br /&gt;
          &amp;quot;expression&amp;quot;: &amp;quot;q.player.username&amp;quot;&lt;br /&gt;
        }&lt;br /&gt;
      }&lt;br /&gt;
    },&lt;br /&gt;
    &amp;quot;pages&amp;quot;: [&lt;br /&gt;
      {&lt;br /&gt;
        &amp;quot;id&amp;quot;: &amp;quot;player-chat&amp;quot;,&lt;br /&gt;
        &amp;quot;speaker&amp;quot;: &amp;quot;player&amp;quot;,&lt;br /&gt;
        &amp;quot;lines&amp;quot;: [&lt;br /&gt;
          {&lt;br /&gt;
            &amp;quot;type&amp;quot;: &amp;quot;expression&amp;quot;,&lt;br /&gt;
            &amp;quot;expression&amp;quot;: &amp;quot;&#039;Hello, I\\&#039;m &#039; + q.player.username + &#039;!&#039;&amp;quot;&lt;br /&gt;
          }&lt;br /&gt;
        ]&lt;br /&gt;
      },&lt;br /&gt;
      {&lt;br /&gt;
        &amp;quot;speaker&amp;quot;: &amp;quot;pikachu&amp;quot;,&lt;br /&gt;
        &amp;quot;lines&amp;quot;: [&lt;br /&gt;
          {&lt;br /&gt;
            &amp;quot;type&amp;quot;: &amp;quot;expression&amp;quot;,&lt;br /&gt;
            &amp;quot;expression&amp;quot;: &amp;quot;&#039;Nice to meet you, &#039; + q.player.username + &#039;! Welcome to the world of dialogues!&#039;&amp;quot;&lt;br /&gt;
          }&lt;br /&gt;
        ]&lt;br /&gt;
      },&lt;br /&gt;
      {&lt;br /&gt;
        &amp;quot;id&amp;quot;: &amp;quot;intro&amp;quot;,&lt;br /&gt;
        &amp;quot;speaker&amp;quot;: &amp;quot;pikachu&amp;quot;,&lt;br /&gt;
        &amp;quot;lines&amp;quot;: [ &amp;quot;Do you want to learn more?&amp;quot;],&lt;br /&gt;
        &amp;quot;input&amp;quot;: {&lt;br /&gt;
          &amp;quot;type&amp;quot;: &amp;quot;option&amp;quot;,&lt;br /&gt;
          &amp;quot;vertical&amp;quot;: false,&lt;br /&gt;
          &amp;quot;options&amp;quot;: [&lt;br /&gt;
            {&lt;br /&gt;
              &amp;quot;text&amp;quot;: &amp;quot;Yes&amp;quot;,&lt;br /&gt;
              &amp;quot;value&amp;quot;: &amp;quot;yes&amp;quot;,&lt;br /&gt;
              &amp;quot;action&amp;quot;: [&lt;br /&gt;
                &amp;quot;v.player_response = &#039;That sounds great!&#039;;&amp;quot;,&lt;br /&gt;
                &amp;quot;v.next_page = &#039;page1&#039;;&amp;quot;,&lt;br /&gt;
                &amp;quot;q.dialogue.set_page(&#039;player-surrogate&#039;);&amp;quot;&lt;br /&gt;
              ]&lt;br /&gt;
            },&lt;br /&gt;
            {&lt;br /&gt;
              &amp;quot;text&amp;quot;: &amp;quot;No&amp;quot;,&lt;br /&gt;
              &amp;quot;value&amp;quot;: &amp;quot;no&amp;quot;,&lt;br /&gt;
              &amp;quot;action&amp;quot;: [&lt;br /&gt;
                &amp;quot;v.player_response = &#039;No, I really don\\&#039;t care.&#039;;&amp;quot;,&lt;br /&gt;
                &amp;quot;v.next_page = &#039;quitter&#039;;&amp;quot;,&lt;br /&gt;
                &amp;quot;q.dialogue.set_page(&#039;player-surrogate&#039;);&amp;quot;&lt;br /&gt;
              ]&lt;br /&gt;
            },&lt;br /&gt;
            {&lt;br /&gt;
              &amp;quot;text&amp;quot;: &amp;quot;Sword!&amp;quot;,&lt;br /&gt;
              &amp;quot;value&amp;quot;: &amp;quot;sword&amp;quot;,&lt;br /&gt;
              &amp;quot;isVisible&amp;quot;: &amp;quot;q.player.main_held_item.is_of(&#039;minecraft:iron_sword&#039;)&amp;quot;,&lt;br /&gt;
              &amp;quot;isSelectable&amp;quot;: &amp;quot;q.player.data.scared_npc != true;&amp;quot;,&lt;br /&gt;
              &amp;quot;action&amp;quot;: [&lt;br /&gt;
                &amp;quot;v.player_response = &#039;How about you die! Muahahaha!&#039;;&amp;quot;,&lt;br /&gt;
                &amp;quot;v.next_page = &#039;sword&#039;;&amp;quot;,&lt;br /&gt;
                &amp;quot;q.dialogue.set_page(&#039;player-surrogate&#039;);&amp;quot;&lt;br /&gt;
              ]&lt;br /&gt;
            },&lt;br /&gt;
            {&lt;br /&gt;
              &amp;quot;text&amp;quot;: &amp;quot;Sword again!&amp;quot;,&lt;br /&gt;
              &amp;quot;value&amp;quot;: &amp;quot;sword2&amp;quot;,&lt;br /&gt;
              &amp;quot;isVisible&amp;quot;: &amp;quot;q.player.main_held_item.is_of(&#039;minecraft:iron_sword&#039;)&amp;quot;,&lt;br /&gt;
              &amp;quot;isSelectable&amp;quot;: &amp;quot;q.player.data.scared_npc == true;&amp;quot;,&lt;br /&gt;
              &amp;quot;action&amp;quot;: [&lt;br /&gt;
                &amp;quot;v.player_response = &#039;How about you die... again! Muahahaha!&#039;;&amp;quot;,&lt;br /&gt;
                &amp;quot;v.next_page = &#039;sword-again&#039;;&amp;quot;,&lt;br /&gt;
                &amp;quot;q.dialogue.set_page(&#039;player-surrogate&#039;);&amp;quot;&lt;br /&gt;
              ]&lt;br /&gt;
            }&lt;br /&gt;
          ]&lt;br /&gt;
        }&lt;br /&gt;
      },&lt;br /&gt;
      {&lt;br /&gt;
        &amp;quot;id&amp;quot;: &amp;quot;player-surrogate&amp;quot;,&lt;br /&gt;
        &amp;quot;speaker&amp;quot;: &amp;quot;player&amp;quot;,&lt;br /&gt;
        &amp;quot;gibber&amp;quot;: {},&lt;br /&gt;
        &amp;quot;lines&amp;quot;: [&lt;br /&gt;
          {&lt;br /&gt;
            &amp;quot;type&amp;quot;: &amp;quot;expression&amp;quot;,&lt;br /&gt;
            &amp;quot;expression&amp;quot;: &amp;quot;v.player_response;&amp;quot;&lt;br /&gt;
          }&lt;br /&gt;
        ],&lt;br /&gt;
        &amp;quot;input&amp;quot;: &amp;quot;q.dialogue.set_page(v.next_page);&amp;quot;&lt;br /&gt;
      },&lt;br /&gt;
      {&lt;br /&gt;
        &amp;quot;id&amp;quot;: &amp;quot;page1&amp;quot;,&lt;br /&gt;
        &amp;quot;speaker&amp;quot;: &amp;quot;pikachu&amp;quot;,&lt;br /&gt;
        &amp;quot;lines&amp;quot;: [&lt;br /&gt;
          &amp;quot;Well you see, this is a dialogue.&amp;quot;,&lt;br /&gt;
          &amp;quot;You can have multiple pages, and each page can have multiple lines.&amp;quot;&lt;br /&gt;
        ]&lt;br /&gt;
      },&lt;br /&gt;
      {&lt;br /&gt;
        &amp;quot;id&amp;quot;: &amp;quot;page2&amp;quot;,&lt;br /&gt;
        &amp;quot;speaker&amp;quot;: &amp;quot;pikachu&amp;quot;,&lt;br /&gt;
        &amp;quot;lines&amp;quot;: [&amp;quot;On an unrelated note, did you know that I&#039;m deeply afraid of iron swords? Anyway, cya!&amp;quot;],&lt;br /&gt;
        &amp;quot;input&amp;quot;: {&lt;br /&gt;
          &amp;quot;type&amp;quot;: &amp;quot;auto-continue&amp;quot;,&lt;br /&gt;
          &amp;quot;delay&amp;quot;: 5,&lt;br /&gt;
          &amp;quot;allowSkip&amp;quot;: true,&lt;br /&gt;
          &amp;quot;action&amp;quot;: &amp;quot;q.dialogue.close();&amp;quot;&lt;br /&gt;
        }&lt;br /&gt;
      },&lt;br /&gt;
      {&lt;br /&gt;
        &amp;quot;id&amp;quot;: &amp;quot;quitter&amp;quot;,&lt;br /&gt;
        &amp;quot;speaker&amp;quot;: &amp;quot;pikachu&amp;quot;,&lt;br /&gt;
        &amp;quot;lines&amp;quot;: [&amp;quot;Fine. Be that way.&amp;quot;],&lt;br /&gt;
        &amp;quot;input&amp;quot;: &amp;quot;q.dialogue.close();&amp;quot;,&lt;br /&gt;
        &amp;quot;escapeAction&amp;quot;: &amp;quot;q.dialogue.close();&amp;quot;&lt;br /&gt;
      },&lt;br /&gt;
      {&lt;br /&gt;
        &amp;quot;id&amp;quot;: &amp;quot;sword&amp;quot;,&lt;br /&gt;
        &amp;quot;speaker&amp;quot;: &amp;quot;pikachu&amp;quot;,&lt;br /&gt;
        &amp;quot;lines&amp;quot;: [&amp;quot;Oh god no, please don&#039;t hurt me!&amp;quot;],&lt;br /&gt;
        &amp;quot;escapeAction&amp;quot;: &amp;quot;q.dialogue.input(&#039;&#039;);&amp;quot;,&lt;br /&gt;
        &amp;quot;input&amp;quot;: [&lt;br /&gt;
          &amp;quot;t.data = q.player.data();&amp;quot;,&lt;br /&gt;
          &amp;quot;t.data.scared_npc = true;&amp;quot;,&lt;br /&gt;
          &amp;quot;q.player.save_data();&amp;quot;,&lt;br /&gt;
          &amp;quot;q.dialogue.close();&amp;quot;&lt;br /&gt;
        ]&lt;br /&gt;
      },&lt;br /&gt;
      {&lt;br /&gt;
        &amp;quot;id&amp;quot;: &amp;quot;sword-again&amp;quot;,&lt;br /&gt;
        &amp;quot;speaker&amp;quot;: &amp;quot;pikachu&amp;quot;,&lt;br /&gt;
        &amp;quot;lines&amp;quot;: [&amp;quot;I&#039;m ready for you this time. YOU will die today!&amp;quot;],&lt;br /&gt;
        &amp;quot;escapeAction&amp;quot;: &amp;quot;0&amp;quot;,&lt;br /&gt;
        &amp;quot;input&amp;quot;: {&lt;br /&gt;
          &amp;quot;type&amp;quot;: &amp;quot;option&amp;quot;,&lt;br /&gt;
          &amp;quot;vertical&amp;quot;: true,&lt;br /&gt;
          &amp;quot;timeout&amp;quot;: {&lt;br /&gt;
            &amp;quot;delay&amp;quot;: 6,&lt;br /&gt;
            &amp;quot;action&amp;quot;: &amp;quot;q.dialogue.input(&#039;stand&#039;);&amp;quot;&lt;br /&gt;
          },&lt;br /&gt;
          &amp;quot;options&amp;quot;: [&lt;br /&gt;
            {&lt;br /&gt;
              &amp;quot;text&amp;quot;: &amp;quot;Parry his attack.&amp;quot;,&lt;br /&gt;
              &amp;quot;value&amp;quot;: &amp;quot;parry&amp;quot;,&lt;br /&gt;
              &amp;quot;action&amp;quot;: [&lt;br /&gt;
                &amp;quot;v.reaction = &#039;parry&#039;;&amp;quot;,&lt;br /&gt;
                &amp;quot;q.dialogue.set_page(&#039;sword-again-decided&#039;);&amp;quot;&lt;br /&gt;
              ]&lt;br /&gt;
            },&lt;br /&gt;
            {&lt;br /&gt;
              &amp;quot;text&amp;quot;: &amp;quot;Stand perfectly still.&amp;quot;,&lt;br /&gt;
              &amp;quot;value&amp;quot;: &amp;quot;stand&amp;quot;,&lt;br /&gt;
              &amp;quot;action&amp;quot;: [&lt;br /&gt;
                &amp;quot;v.reaction = &#039;stand still&#039;;&amp;quot;,&lt;br /&gt;
                &amp;quot;q.dialogue.set_page(&#039;sword-again-decided&#039;);&amp;quot;&lt;br /&gt;
              ]&lt;br /&gt;
            },&lt;br /&gt;
            {&lt;br /&gt;
              &amp;quot;text&amp;quot;: &amp;quot;Drop your sword.&amp;quot;,&lt;br /&gt;
              &amp;quot;value&amp;quot;: &amp;quot;drop&amp;quot;,&lt;br /&gt;
              &amp;quot;action&amp;quot;: [&lt;br /&gt;
                &amp;quot;v.reaction = &#039;drop your sword&#039;;&amp;quot;,&lt;br /&gt;
                &amp;quot;q.dialogue.set_page(&#039;sword-again-decided&#039;);&amp;quot;&lt;br /&gt;
              ]&lt;br /&gt;
            }&lt;br /&gt;
          ]&lt;br /&gt;
        }&lt;br /&gt;
      },&lt;br /&gt;
      {&lt;br /&gt;
        &amp;quot;id&amp;quot;: &amp;quot;sword-again-decided&amp;quot;,&lt;br /&gt;
        &amp;quot;lines&amp;quot;: [&lt;br /&gt;
          {&lt;br /&gt;
            &amp;quot;type&amp;quot;: &amp;quot;expression&amp;quot;,&lt;br /&gt;
            &amp;quot;expression&amp;quot;: &amp;quot;v.reaction == &#039;parry&#039; ? &#039;You parry his attack and kill him.&#039; : (v.reaction == &#039;stand still&#039; ? &#039;He kills you.&#039; : &#039;You drop your sword and he kills you.&#039;)&amp;quot;&lt;br /&gt;
          }&lt;br /&gt;
        ],&lt;br /&gt;
        &amp;quot;input&amp;quot;: {&lt;br /&gt;
          &amp;quot;type&amp;quot;: &amp;quot;auto-continue&amp;quot;,&lt;br /&gt;
          &amp;quot;delay&amp;quot;: 3,&lt;br /&gt;
          &amp;quot;allowSkip&amp;quot;: false,&lt;br /&gt;
          &amp;quot;showTimer&amp;quot;: false,&lt;br /&gt;
          &amp;quot;action&amp;quot;: &amp;quot;q.dialogue.set_page(&#039;sword-again-reaction&#039;);&amp;quot;&lt;br /&gt;
        }&lt;br /&gt;
      },&lt;br /&gt;
      {&lt;br /&gt;
        &amp;quot;id&amp;quot;: &amp;quot;sword-again-reaction&amp;quot;,&lt;br /&gt;
        &amp;quot;speaker&amp;quot;: &amp;quot;pikachu&amp;quot;,&lt;br /&gt;
        &amp;quot;lines&amp;quot;: [&lt;br /&gt;
          {&lt;br /&gt;
            &amp;quot;type&amp;quot;: &amp;quot;expression&amp;quot;,&lt;br /&gt;
            &amp;quot;expression&amp;quot;: &amp;quot;&#039;Nah, I\\&#039;m just kidding. Interesting that you chose to &#039; + v.reaction + &#039; though.&#039;&amp;quot;&lt;br /&gt;
          }&lt;br /&gt;
        ]&lt;br /&gt;
      },&lt;br /&gt;
      {&lt;br /&gt;
        &amp;quot;id&amp;quot;: &amp;quot;name-question&amp;quot;,&lt;br /&gt;
        &amp;quot;speaker&amp;quot;: &amp;quot;pikachu&amp;quot;,&lt;br /&gt;
        &amp;quot;lines&amp;quot;: [ &amp;quot;Here&#039;s a puzzle though... What is my name? Lowercase only.&amp;quot;],&lt;br /&gt;
        &amp;quot;input&amp;quot;: {&lt;br /&gt;
          &amp;quot;type&amp;quot;: &amp;quot;text&amp;quot;,&lt;br /&gt;
          &amp;quot;timeout&amp;quot;: {&lt;br /&gt;
            &amp;quot;delay&amp;quot;: 10,&lt;br /&gt;
            &amp;quot;action&amp;quot;: &amp;quot;q.dialogue.set_page(&#039;too-slow&#039;);&amp;quot;&lt;br /&gt;
          },&lt;br /&gt;
          &amp;quot;action&amp;quot;: [&lt;br /&gt;
            &amp;quot;q.dialogue.set_page(&#039;name-speak&#039;);&amp;quot;,&lt;br /&gt;
            &amp;quot;t.data = q.player.data();&amp;quot;&lt;br /&gt;
          ]&lt;br /&gt;
        }&lt;br /&gt;
      },&lt;br /&gt;
      {&lt;br /&gt;
        &amp;quot;id&amp;quot;: &amp;quot;name-speak&amp;quot;,&lt;br /&gt;
        &amp;quot;speaker&amp;quot;: &amp;quot;player&amp;quot;,&lt;br /&gt;
        &amp;quot;lines&amp;quot;: [&lt;br /&gt;
          {&lt;br /&gt;
            &amp;quot;type&amp;quot;: &amp;quot;expression&amp;quot;,&lt;br /&gt;
            &amp;quot;expression&amp;quot;: &amp;quot;&#039;Your name is &#039; + v.selected_option + &#039;, right?&#039;&amp;quot;&lt;br /&gt;
          }&lt;br /&gt;
        ],&lt;br /&gt;
        &amp;quot;input&amp;quot;: &amp;quot;q.dialogue.set_page(&#039;name-guess&#039;);&amp;quot;&lt;br /&gt;
      },&lt;br /&gt;
      {&lt;br /&gt;
        &amp;quot;id&amp;quot;: &amp;quot;name-guess&amp;quot;,&lt;br /&gt;
        &amp;quot;speaker&amp;quot;: &amp;quot;pikachu&amp;quot;,&lt;br /&gt;
        &amp;quot;lines&amp;quot;: [&lt;br /&gt;
          {&lt;br /&gt;
            &amp;quot;type&amp;quot;: &amp;quot;expression&amp;quot;,&lt;br /&gt;
            &amp;quot;expression&amp;quot;: &amp;quot;v.selected_option == &#039;hiroku&#039; ? &#039;Correct! You know things that you shouldn\\&#039;t...&#039; : (&#039;Wrong! I\\&#039;m not \&amp;quot;&#039; + v.selected_option + &#039;\&amp;quot;. Whoever that is.&#039;)&amp;quot;&lt;br /&gt;
          }&lt;br /&gt;
        ],&lt;br /&gt;
        &amp;quot;input&amp;quot;: {&lt;br /&gt;
          &amp;quot;type&amp;quot;: &amp;quot;auto-continue&amp;quot;,&lt;br /&gt;
          &amp;quot;delay&amp;quot;: 5,&lt;br /&gt;
          &amp;quot;allowSkip&amp;quot;: true,&lt;br /&gt;
          &amp;quot;action&amp;quot;: &amp;quot;q.dialogue.set_page(&#039;farewell&#039;);&amp;quot;&lt;br /&gt;
        }&lt;br /&gt;
      },&lt;br /&gt;
      {&lt;br /&gt;
        &amp;quot;id&amp;quot;: &amp;quot;farewell&amp;quot;,&lt;br /&gt;
        &amp;quot;speaker&amp;quot;: &amp;quot;pikachu&amp;quot;,&lt;br /&gt;
        &amp;quot;lines&amp;quot;: [&amp;quot;Anyway, I&#039;m done with this dialogue. Bye!&amp;quot;],&lt;br /&gt;
        &amp;quot;input&amp;quot;: &amp;quot;q.dialogue.close();&amp;quot;&lt;br /&gt;
      },&lt;br /&gt;
      {&lt;br /&gt;
        &amp;quot;id&amp;quot;: &amp;quot;too-slow&amp;quot;,&lt;br /&gt;
        &amp;quot;speaker&amp;quot;: &amp;quot;pikachu&amp;quot;,&lt;br /&gt;
        &amp;quot;lines&amp;quot;: [&amp;quot;Don&#039;t know? Sad. Well I don&#039;t know your name either, so I guess we&#039;re even.&amp;quot;],&lt;br /&gt;
        &amp;quot;input&amp;quot;: &amp;quot;q.dialogue.close()&amp;quot;&lt;br /&gt;
      }&lt;br /&gt;
    ]&lt;br /&gt;
  }&lt;/div&gt;</summary>
		<author><name>Hiroku</name></author>
	</entry>
	<entry>
		<id>https://wiki.cobblemon.com/index.php?title=1.7.1&amp;diff=7492</id>
		<title>1.7.1</title>
		<link rel="alternate" type="text/html" href="https://wiki.cobblemon.com/index.php?title=1.7.1&amp;diff=7492"/>
		<updated>2025-12-01T02:13:10Z</updated>

		<summary type="html">&lt;p&gt;Hiroku: Date fix&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{InfoboxVersion&lt;br /&gt;
| title = 1.7.1&lt;br /&gt;
| image = &lt;br /&gt;
| release = November 29th, 2025&lt;br /&gt;
| fabric = [https://modrinth.com/mod/cobblemon/version/s64m1opn Modrinth]&amp;lt;br&amp;gt;[https://www.curseforge.com/minecraft/mc-mods/cobblemon/files/6125079 CurseForge]&lt;br /&gt;
| neoforge = TBD&lt;br /&gt;
| previous = [[1.7.0]]&lt;br /&gt;
| next = TBD&lt;br /&gt;
}}&lt;br /&gt;
&#039;&#039;&#039;1.7.1&#039;&#039;&#039; is a minor update to Cobblemon that was released on November 29th, 2025.&amp;lt;ref&amp;gt;https://cobblemon.com/changelog#1-7-1&amp;lt;/ref&amp;gt; It adds new trades and recipes, a few changes and various bug fixes.&lt;br /&gt;
&lt;br /&gt;
==Additions==&lt;br /&gt;
* Added trades for [[Saccharine Sapling|Saccharine Saplings]], [[Hearty Grains]], [[Chipped Pot]], and [[Masterpiece Teacup]] to the Wandering Trader.&lt;br /&gt;
* Added brewing recipe for [[Throat Spray]].&lt;br /&gt;
* Added vanilla sprinting&#039;s field of view change to Pokémon land mounts.&lt;br /&gt;
* Added a customizable keybind for the riding freelook button.&lt;br /&gt;
* Added double tap to sprint on land mounts.&lt;br /&gt;
&lt;br /&gt;
==Changes==&lt;br /&gt;
* Made Jet pitch turning 1.5x faster across all Pokémon.&lt;br /&gt;
* Party Pokémon now attack only mobs that are attacking their owner, instead of randomly targeting unrelated mobs and getting themselves hurt.&lt;br /&gt;
* Reduced the cost of the Vivichoke Seed trade with the Wandering Trader.&lt;br /&gt;
===Model updates for the following Pokémon===&lt;br /&gt;
* Tinkatink&lt;br /&gt;
* Tinkatuff&lt;br /&gt;
* Tinkaton&lt;br /&gt;
&lt;br /&gt;
==Fixes==&lt;br /&gt;
* Fixed incorrect camera pivot on Bird, Jet, and Dolphin mounts, leading to some disorienting riding.&lt;br /&gt;
* Fixed players suffocating while on vanilla mounts.&lt;br /&gt;
* Fixed a graphics crash that could occur on some machines when campfire pots were nearby.&lt;br /&gt;
* Fixed ride controls overlay being displayed to passengers. The passengers probably don&#039;t need to know about those.&lt;br /&gt;
* Fixed mount jumping so that it doesn&#039;t switch back to ground animations.&lt;br /&gt;
* Fixed ridden Pokémon land collision and some issues around stepping up blocks. Land mounts are smoother overall now.&lt;br /&gt;
* Fixed Furfrou&#039;s pink and magenta trims being swapped. Only a man could make that mistake.&lt;br /&gt;
* Fixed friendship being reset to the default value when evolving a Pokémon.&lt;br /&gt;
* Fixed Combees not depositing honey upon leaving a hive if they entered it with nectar.&lt;br /&gt;
* Fixed pastured Combees not moving during the night or in rain.&lt;br /&gt;
* Fixed a case in which a Combee might try to path to a flower that no longer exists.&lt;br /&gt;
* Fixed Combees attempting to enter a full hive.&lt;br /&gt;
* Fixed a crash involving Combees and hives. 500 bee bugs. Bugged bees? We can be bees. Mark, this is good news.&lt;br /&gt;
* Fixed a crash related to NPC navigation.&lt;br /&gt;
* Fixed a crash when opening a PC box with certain wallpapers while using VulkanMod.&lt;br /&gt;
* Fixed a crash when you place a block in the way of hearty grains 2nd block.&lt;br /&gt;
* Fixed passengers hearing the shiny noise of a ridden shiny Pokémon.&lt;br /&gt;
Ponigiri can no longer be eaten at full hunger.&lt;br /&gt;
* Fixed Poké Snack spawning sounds not coming from the block.&lt;br /&gt;
* Medicinal Brew&#039;s Campfire Pot recipe now correctly displays that it can be made using an empty glass bottle or a filled bottle.&lt;br /&gt;
* Fixed glass bottle not being returned when slathering honey on a saccharine leaf block.&lt;br /&gt;
* Fixed saccharine hanging signs sometimes dropping their oak wood counterpart when being broken.&lt;br /&gt;
* Fixed a bunch of incompatibilities with NeoForge mods.&lt;br /&gt;
* Fixed a bug where wind charges hitting pasture blocks would recall all Pokémon in it.&lt;br /&gt;
* Fixed the Home on the Range advancement triggering when opening the Pokémon interaction wheel.&lt;br /&gt;
* Fixed recipes that use concrete not working on NeoForge.&lt;br /&gt;
* Fixed Boltund&#039;s model.&lt;br /&gt;
* Fixed Cyclizar&#039;s textures.&lt;br /&gt;
&lt;br /&gt;
==References==&lt;br /&gt;
{{reflist}}&lt;/div&gt;</summary>
		<author><name>Hiroku</name></author>
	</entry>
	<entry>
		<id>https://wiki.cobblemon.com/index.php?title=Molang_Types&amp;diff=6429</id>
		<title>Molang Types</title>
		<link rel="alternate" type="text/html" href="https://wiki.cobblemon.com/index.php?title=Molang_Types&amp;diff=6429"/>
		<updated>2025-11-08T01:43:25Z</updated>

		<summary type="html">&lt;p&gt;Hiroku: ObjectValue clarification&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;This is a table of types used in Cobblemon as documented, and the classes they extend from.&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable fixed-header sortable&amp;quot;&lt;br /&gt;
!Name!!Type!!Description&lt;br /&gt;
|-&lt;br /&gt;
|&amp;lt;code&amp;gt;MoValue&amp;lt;/code&amp;gt;&lt;br /&gt;
|Class&lt;br /&gt;
|This is the parent class of all values. Does nothing on it&#039;s own, can be treated like &amp;lt;code&amp;gt;Any&amp;lt;/code&amp;gt; in Kotlin.&lt;br /&gt;
|-&lt;br /&gt;
|&amp;lt;code&amp;gt;DoubleValue&amp;lt;/code&amp;gt;&lt;br /&gt;
|Subclass of MoValue&lt;br /&gt;
|Doubles are also used as Integers and Booleans.&lt;br /&gt;
|-&lt;br /&gt;
|&amp;lt;code&amp;gt;StringValue&amp;lt;/code&amp;gt;&lt;br /&gt;
|Subclass of MoValue&lt;br /&gt;
|Represents a String.&lt;br /&gt;
|-&lt;br /&gt;
|&amp;lt;code&amp;gt;MoStruct&amp;lt;/code&amp;gt;&lt;br /&gt;
|Subclass of MoValue&lt;br /&gt;
|Used like a map, can get or set using a string key.&lt;br /&gt;
|-&lt;br /&gt;
|&amp;lt;code&amp;gt;VariableStruct&amp;lt;/code&amp;gt;&lt;br /&gt;
|Subclass of MoStruct&lt;br /&gt;
|A struct that can get and set values.&lt;br /&gt;
|-&lt;br /&gt;
|&amp;lt;code&amp;gt;ArrayStruct&amp;lt;/code&amp;gt;&lt;br /&gt;
|Subclass of VariableStruct&lt;br /&gt;
|A struct that uses integers as keys. NOTE: For the purpose of documentation, ArrayStruct is notated as &amp;lt;code&amp;gt;ArrayStruct&amp;lt;Type&amp;gt;&amp;lt;/code&amp;gt; when only one type is expected. All &amp;lt;code&amp;gt;ArrayStruct&amp;lt;/code&amp;gt;s have no required types and can be mixed.&lt;br /&gt;
|-&lt;br /&gt;
|&amp;lt;code&amp;gt;QueryStruct&amp;lt;/code&amp;gt;&lt;br /&gt;
|Subclass of MoStruct&lt;br /&gt;
|A struct that contains functions that can be executed using get. Does not support setting values.&lt;br /&gt;
|-&lt;br /&gt;
|&amp;lt;code&amp;gt;ObjectValue&amp;lt;/code&amp;gt;&lt;br /&gt;
|Subclass of QueryStruct&lt;br /&gt;
|Cobblemon class used to implement many types. Can get the value of the type, get a double value using &amp;lt;code&amp;gt;asDouble()&amp;lt;/code&amp;gt;, and get a string value using &amp;lt;code&amp;gt;asString()&amp;lt;/code&amp;gt;. This is used for Players, Pokémon, Battles, and the rest of our implemented Minecraft and Cobblemon types. These may have special functions depending on what&#039;s being represented by it.&lt;br /&gt;
|}&lt;/div&gt;</summary>
		<author><name>Hiroku</name></author>
	</entry>
	<entry>
		<id>https://wiki.cobblemon.com/index.php?title=Molang&amp;diff=6428</id>
		<title>Molang</title>
		<link rel="alternate" type="text/html" href="https://wiki.cobblemon.com/index.php?title=Molang&amp;diff=6428"/>
		<updated>2025-11-08T01:42:29Z</updated>

		<summary type="html">&lt;p&gt;Hiroku: We have a specific fork on the gitlab now&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Cobblemon uses a [https://gitlab.com/cable-mc/molang modified] version of [https://github.com/bedrockk/MoLang Bedrockk MoLang] to parse and execute MoLang. Updated as of 1.6.1.&lt;br /&gt;
&lt;br /&gt;
==Types==&lt;br /&gt;
&lt;br /&gt;
* [[Molang Types|Types]]&lt;br /&gt;
&lt;br /&gt;
==Functions==&lt;br /&gt;
&lt;br /&gt;
* [[Molang General Functions|General (Standard) Functions]]&lt;br /&gt;
* [[Molang Registry Functions|Registry Functions (World, Block, Dimension, Biome)]]&lt;br /&gt;
* [[Molang Player Functions|Player Functions]]&lt;br /&gt;
* [[Molang Entity Functions|Entity Functions]]&lt;br /&gt;
* [[Molang NPC Functions|NPC Functions]]&lt;br /&gt;
* [[Molang Battle Functions|Battle Functions]]&lt;br /&gt;
* [[Molang BattleActor Functions|BattleActor Functions]]&lt;br /&gt;
* [[Molang Pokémon Functions|Pokémon Functions]]&lt;br /&gt;
* [[Molang PokémonEntity Functions|PokémonEntity Functions]]&lt;br /&gt;
* [[Molang PokémonStore Functions|PokémonStore Functions]]&lt;br /&gt;
* [[Molang Party Functions|Party Functions]]&lt;br /&gt;
* [[Molang PC Functions|PC Functions]]&lt;br /&gt;
* [[Molang SpawningContext Functions|SpawningContext Functions]]&lt;br /&gt;
* [[Molang Server Functions|Server Functions]]&lt;br /&gt;
* [[Molang Pokédex Functions|Pokédex Functions]]&lt;br /&gt;
* [[Molang Species Functions|Species Functions]]&lt;br /&gt;
&lt;br /&gt;
==== Client Only ====&lt;br /&gt;
&lt;br /&gt;
* [[Molang Client General Functions|General Functions]]&lt;br /&gt;
* [[Molang Animation Functions|Animation Functions]]&lt;/div&gt;</summary>
		<author><name>Hiroku</name></author>
	</entry>
	<entry>
		<id>https://wiki.cobblemon.com/index.php?title=Dialogues&amp;diff=6422</id>
		<title>Dialogues</title>
		<link rel="alternate" type="text/html" href="https://wiki.cobblemon.com/index.php?title=Dialogues&amp;diff=6422"/>
		<updated>2025-11-01T10:04:06Z</updated>

		<summary type="html">&lt;p&gt;Hiroku: line breaks would help here&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Dialogues are a feature that can be used from API or from datapacks to play conversations in a GUI. They display entities, view pages of text, and handle various types of input.&lt;br /&gt;
&lt;br /&gt;
A dialogue that has been registered through a datapack can be opened using the /opendialogue command.&lt;br /&gt;
&lt;br /&gt;
Every case of a MoLang expression can be either a single text property or can be an array of text to support running multiple expressions to produce a result.&lt;br /&gt;
&lt;br /&gt;
[[File:Dialogue_Intro.png|400px|center]]&lt;br /&gt;
&lt;br /&gt;
=Dialogue=&lt;br /&gt;
&lt;br /&gt;
A Dialogue JSON file consists of the following main elements:&lt;br /&gt;
&lt;br /&gt;
- &amp;lt;code&amp;gt;escapeAction&amp;lt;/code&amp;gt;: A string or array that defines the action to be taken when the dialogue is escaped. This can be a MoLang expression or a sequence of MoLang expressions.&lt;br /&gt;
&lt;br /&gt;
- &amp;lt;code&amp;gt;speakers&amp;lt;/code&amp;gt;: An object that defines the speakers in the dialogue. Each speaker is represented by a key-value pair, where the key is the speaker&#039;s identifier and the value is an object that describes what the speaker looks like and their name.&lt;br /&gt;
&lt;br /&gt;
- &amp;lt;code&amp;gt;pages&amp;lt;/code&amp;gt;: An array of objects, each representing a page in the dialogue.&lt;br /&gt;
&lt;br /&gt;
==Speakers==&lt;br /&gt;
&lt;br /&gt;
Each speaker is represented by an object with the following properties:&lt;br /&gt;
&lt;br /&gt;
- &amp;lt;code&amp;gt;name&amp;lt;/code&amp;gt;: A string or object that defines the speaker&#039;s name. This is usually just text. If it&#039;s an object, it must have a &amp;lt;code&amp;gt;type&amp;lt;/code&amp;gt; property set to &amp;lt;code&amp;gt;&amp;quot;expression&amp;quot;&amp;lt;/code&amp;gt; and an &amp;lt;code&amp;gt;expression&amp;lt;/code&amp;gt; property that contains a MoLang expression. You would use an expression if you wanted the name to be dynamic.&lt;br /&gt;
&lt;br /&gt;
- &amp;lt;code&amp;gt;face&amp;lt;/code&amp;gt;: An object or MoLang expression that defines the speaker&#039;s face. This will be rendered in a frame of the GUI. For objects, it must have a &amp;lt;code&amp;gt;type&amp;lt;/code&amp;gt; property set to the type of face. The only object type support currently is &amp;quot;standard&amp;quot;. The others are done using MoLang expressions rather than an object.&lt;br /&gt;
&lt;br /&gt;
- &amp;lt;code&amp;gt;gibber&amp;lt;/code&amp;gt;: An object defining the gibber behaviour. This can be defined as simply &amp;lt;code&amp;gt;{}&amp;lt;/code&amp;gt; to use the default settings, or as a full object with any of the properties that you want to set. See the section on &amp;lt;code&amp;gt;gibber&amp;lt;/code&amp;gt; further below to see the properties that are available.&lt;br /&gt;
&lt;br /&gt;
===Faces===&lt;br /&gt;
The speaker faces can be defined in multiple ways. If it is an object it is going to be a &amp;quot;standard&amp;quot; face type.&lt;br /&gt;
&lt;br /&gt;
====&amp;quot;standard&amp;quot;====&lt;br /&gt;
The standard face type is for when the face displayed is not connected to a specific entity in the world but does follow Cobblemon&#039;s format of identifier and aspect list. The object must have the following properties:&lt;br /&gt;
&lt;br /&gt;
- &amp;lt;code&amp;gt;modelType&amp;lt;/code&amp;gt;: One of &#039;pokemon&#039;, &#039;npc&#039;&lt;br /&gt;
&lt;br /&gt;
- &amp;lt;code&amp;gt;identifier&amp;lt;/code&amp;gt;: The identifier of the Pokémon or NPC, such as &amp;lt;code&amp;gt;cobblemon:bulbasaur&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
- &amp;lt;code&amp;gt;aspects&amp;lt;/code&amp;gt;: An array of aspects that will be applied to the model.&lt;br /&gt;
&lt;br /&gt;
For example:&lt;br /&gt;
&lt;br /&gt;
  &amp;quot;face&amp;quot;: {&lt;br /&gt;
    &amp;quot;type&amp;quot;: &amp;quot;artificial&amp;quot;,&lt;br /&gt;
    &amp;quot;modelType&amp;quot;: &amp;quot;pokemon&amp;quot;,&lt;br /&gt;
    &amp;quot;identifier&amp;quot;: &amp;quot;cobblemon:pikachu&amp;quot;,&lt;br /&gt;
    &amp;quot;aspects&amp;quot;: [&lt;br /&gt;
      &amp;quot;shiny&amp;quot;&lt;br /&gt;
    ]&lt;br /&gt;
  }&lt;br /&gt;
  &lt;br /&gt;
&lt;br /&gt;
====player====&lt;br /&gt;
By using &amp;lt;code&amp;gt;q.player.face()&amp;lt;/code&amp;gt; you can make the player&#039;s model render for this face.&lt;br /&gt;
&lt;br /&gt;
For example:&lt;br /&gt;
&lt;br /&gt;
  &amp;quot;face&amp;quot;: &amp;quot;q.player.face();&amp;quot;&lt;br /&gt;
&lt;br /&gt;
====npc====&lt;br /&gt;
By using &amp;lt;code&amp;gt;q.npc.face()&amp;lt;/code&amp;gt; you can show a direct reference to the NPC you&#039;re having the dialogue with, if this was dialogue started with an NPC entity.&lt;br /&gt;
&lt;br /&gt;
For example:&lt;br /&gt;
&lt;br /&gt;
  &amp;quot;face&amp;quot;: &amp;quot;q.npc.face();&amp;quot;&lt;br /&gt;
&lt;br /&gt;
===Gibber===&lt;br /&gt;
An additional feature of dialogues is having the text appear gradually and with a simplistic set of tones that mimic speech, referred to here as gibbering. Gibbering has many options and all have sensible defaults. The properties available are as follows:&lt;br /&gt;
&lt;br /&gt;
- &amp;lt;code&amp;gt;graduallyShowText&amp;lt;/code&amp;gt;: A boolean which, when true, will cause the text in the GUI to gradually be typed out. When false, gibbering sound effects will play but all of the text will be visible from the beginning. Defaults to true.&lt;br /&gt;
&lt;br /&gt;
- &amp;lt;code&amp;gt;allowSkip&amp;lt;/code&amp;gt;: Whether or not clicking in the dialogue box will skip the gibbering and display all of the text at once. If false, the player must wait until the entirety of the gibbering has occurred before they can continue to the next page.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;step&amp;lt;/code&amp;gt;: The number of characters between each gibber. A gibber will play for the current character index and then, after some time interval, this step will be used to move to a later character in the text to play the next gibber. When gradually revealing text is on, a larger step will mean that text will appear in larger chunks. Defaults to 4 characters.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;interval&amp;lt;/code&amp;gt;: The time (in seconds) between each gibber sound. A smaller value will make the sounds come more rapidly, and the text will appear more quickly if gradually showing text. Defaults to 0.1 seconds.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;minPitch&amp;lt;/code&amp;gt;: The minimum pitch multiplier that could be used when randomly selecting a tone. Defaults to 0.8.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;maxPitch&amp;lt;/code&amp;gt;: The maximum pitch multiplier that could be used when randomly selecting a tone. Defaults to 1.2.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;minVolume&amp;lt;/code&amp;gt;: The minimum volume multiplier that could be used when randomly selecting a tone. Defaults to 0.75.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;maxVolume&amp;lt;/code&amp;gt;: The maximum volume multiplier that could be used when randomly selecting a tone. Defaults to 1.1.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;sounds&amp;lt;/code&amp;gt;: A list of resource locations indicating which sound events should be chosen from when playing a gibber. It can be any number of sounds. Defaults to three sounds: &amp;lt;code&amp;gt;&amp;quot;cobblemon:entity.villager.npc1&amp;quot;&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;&amp;quot;cobblemon:entity.villager.npc2&amp;quot;&amp;lt;/code&amp;gt;, and &amp;lt;code&amp;gt;&amp;quot;cobblemon:entity.villager.npc1&amp;quot;&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
==Pages==&lt;br /&gt;
&lt;br /&gt;
Each page is represented by an object with the following properties:&lt;br /&gt;
&lt;br /&gt;
- &amp;lt;code&amp;gt;id&amp;lt;/code&amp;gt;: A string that uniquely identifies the page. This is needed for instances where you might want to jump to a specific page. Page numbers could be used, but you should use page IDs.&lt;br /&gt;
&lt;br /&gt;
- &amp;lt;code&amp;gt;speaker&amp;lt;/code&amp;gt;: A string that specifies the speaker&#039;s identifier. This depends upon the speaker by this identifier existing in the speakers list.&lt;br /&gt;
&lt;br /&gt;
- &amp;lt;code&amp;gt;lines&amp;lt;/code&amp;gt;: An array of strings or objects, each representing a line of text. If it&#039;s an object, it must have a &amp;lt;code&amp;gt;type&amp;lt;/code&amp;gt; property set to &amp;lt;code&amp;gt;&amp;quot;expression&amp;quot;&amp;lt;/code&amp;gt; and an &amp;lt;code&amp;gt;expression&amp;lt;/code&amp;gt; property that contains a MoLang expression that evaluates to a string. You would use an expression if you want to include variables to make dynamic text.&lt;br /&gt;
&lt;br /&gt;
- &amp;lt;code&amp;gt;input&amp;lt;/code&amp;gt;: An object or string that defines the input prompt. If it&#039;s an object, it must have a &amp;lt;code&amp;gt;type&amp;lt;/code&amp;gt; property set to &amp;lt;code&amp;gt;&amp;quot;option&amp;quot;&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;&amp;quot;text&amp;quot;&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;&amp;quot;auto-continue&amp;quot;&amp;lt;/code&amp;gt;, or &amp;lt;code&amp;gt;&amp;quot;none&amp;quot;&amp;lt;/code&amp;gt;, and other properties depending on the type. By default, the input value will be &amp;lt;code&amp;gt;none&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
- &amp;lt;code&amp;gt;gibber&amp;lt;/code&amp;gt;: A page-specific gibber configuration. See above for more information about gibber objects. By default this is null, and will therefore fallback to the gibber that is on the &amp;lt;code&amp;gt;speaker&amp;lt;/code&amp;gt; for this page, if any is.&lt;br /&gt;
&lt;br /&gt;
- &amp;lt;code&amp;gt;clientActions&amp;lt;/code&amp;gt;: A list of MoLang expressions that will run on the client after the first frame of the page has been rendered on the client. This can be used to play sounds with &amp;lt;code&amp;gt;&amp;quot;q.sound(...)&amp;quot;&amp;lt;/code&amp;gt;, or even play animations on the face being rendered (if it is a Bedrock animated entity) by doing, for example, &amp;lt;code&amp;gt;&amp;quot;q.face.play_animation(&#039;win&#039;);&amp;quot;&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
- &amp;lt;code&amp;gt;escapeAction&amp;lt;/code&amp;gt;: A string or array that defines the action to be taken when the page is escaped. This can be a MoLang expression or a sequence of MoLang expressions.&lt;br /&gt;
&lt;br /&gt;
- &amp;lt;code&amp;gt;background&amp;lt;/code&amp;gt;: A resource location to use as the background texture for the dialogue box. By default this is null, which will result in Cobblemon&#039;s internal texture to be used.&lt;br /&gt;
&lt;br /&gt;
==Input Types==&lt;br /&gt;
&lt;br /&gt;
The &amp;lt;code&amp;gt;input&amp;lt;/code&amp;gt; property in a page object can have different structures depending on the &amp;lt;code&amp;gt;type&amp;lt;/code&amp;gt;. &lt;br /&gt;
&lt;br /&gt;
For all inputs that specify an &amp;lt;code&amp;gt;action&amp;lt;/code&amp;gt; property which is set to a MoLang expression, you can access the time it took for them to make that input using &amp;lt;code&amp;gt;v.seconds_taken_to_input&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
===&amp;quot;option&amp;quot;===&lt;br /&gt;
The input is a set of options. The object must have an &amp;lt;code&amp;gt;options&amp;lt;/code&amp;gt; property that is an array of objects, each representing an option. It can also specify whether the options should be displayed vertically or horizontally by whether or not the &amp;lt;code&amp;gt;vertical&amp;lt;/code&amp;gt; property is true or false.&lt;br /&gt;
&lt;br /&gt;
Each option object can have the following properties:&lt;br /&gt;
&lt;br /&gt;
- &amp;lt;code&amp;gt;value&amp;lt;/code&amp;gt;: The unique value of the dialogue option. This is not displayed to the player and is instead used to reference this option from scripts.&lt;br /&gt;
&lt;br /&gt;
- &amp;lt;code&amp;gt;text&amp;lt;/code&amp;gt;The display text for the option. This can be a simple string or can be an object&lt;br /&gt;
&lt;br /&gt;
- &amp;lt;code&amp;gt;action&amp;lt;/code&amp;gt;: The MoLang expression to run when the user chooses the option.&lt;br /&gt;
&lt;br /&gt;
- &amp;lt;code&amp;gt;isVisible&amp;lt;/code&amp;gt;: A MoLang expression which must return either true or false. If false, the option will not be visible for the player. Defaults to true.&lt;br /&gt;
&lt;br /&gt;
- &amp;lt;code&amp;gt;isSelectable&amp;lt;/code&amp;gt;: A MoLang expression which must return either true or false. If false, the option will be greyed out (but only if it is visible). Defaults to true.&lt;br /&gt;
&lt;br /&gt;
[[File:Dialogue_Options.png|600px|center]]&lt;br /&gt;
&lt;br /&gt;
===&amp;quot;text&amp;quot;===&lt;br /&gt;
The input is a text field. The &amp;lt;code&amp;gt;action&amp;lt;/code&amp;gt; property is a MoLang expression that will run when the player hits enter with text typed in. As specified earlier, you can check the text that they input using &amp;lt;code&amp;gt;v.selected_option&amp;lt;/code&amp;gt; inside of the MoLang expression.&lt;br /&gt;
&lt;br /&gt;
[[File:Dialogue_Input.png|600px|center]]&lt;br /&gt;
&lt;br /&gt;
===&amp;quot;auto-continue&amp;quot;===&lt;br /&gt;
The dialogue will automatically progress after some period of time. There are several optional properties for this.&lt;br /&gt;
&lt;br /&gt;
- &amp;lt;code&amp;gt;delay&amp;lt;/code&amp;gt;: The delay in seconds until it progresses. By default this is 5 seconds. &lt;br /&gt;
&lt;br /&gt;
- &amp;lt;code&amp;gt;allowSkip&amp;lt;/code&amp;gt;: Whether the user is able to skip the delay by clicking. By default this is true. If false, the player will be forced to wait for the delay.&lt;br /&gt;
&lt;br /&gt;
- &amp;lt;code&amp;gt;showTimer&amp;lt;/code&amp;gt;: Whether a bar will be displayed to indicate how much more time the player has until it auto-continues. Defaults to false.&lt;br /&gt;
&lt;br /&gt;
- &amp;lt;code&amp;gt;action&amp;lt;/code&amp;gt;: A MoLang expression that runs when either the player clicks (only when &amp;lt;code&amp;gt;allowSkip&amp;lt;/code&amp;gt; is true) or the delay finishes. By default this moves to the next page.&lt;br /&gt;
&lt;br /&gt;
===&amp;quot;none&amp;quot;===&lt;br /&gt;
There is no input except that it waits until the user clicks to continue. The object can have an &amp;lt;code&amp;gt;action&amp;lt;/code&amp;gt; property that defines the MoLang expression to run when the player clicks. By default, it moves to the next page.&lt;br /&gt;
&lt;br /&gt;
===Timeouts===&lt;br /&gt;
All input types except for &amp;lt;code&amp;gt;&amp;quot;none&amp;quot;&amp;lt;/code&amp;gt; and &amp;lt;code&amp;gt;&amp;quot;autocontinue&amp;quot;&amp;lt;/code&amp;gt; can have a &#039;timeout&#039; object which allows you to apply time constraints to the player viewing the page.&lt;br /&gt;
&lt;br /&gt;
The timeout object can have 3 properties:&lt;br /&gt;
&lt;br /&gt;
- &amp;lt;code&amp;gt;duration&amp;lt;/code&amp;gt;: The time, in seconds, that the player will have to complete the input. By default this is 10 seconds.&lt;br /&gt;
&lt;br /&gt;
- &amp;lt;code&amp;gt;showTimer&amp;lt;/code&amp;gt;: Whether or not a bar will be shown to show the player how much time they have left. By default this is true.&lt;br /&gt;
&lt;br /&gt;
- &amp;lt;code&amp;gt;action&amp;lt;/code&amp;gt;: A MoLang expression to run if they do not enter the input in time. By default this will close the dialogue.&lt;br /&gt;
&lt;br /&gt;
[[File:Dialogue_Timer.png|600px|center]]&lt;br /&gt;
&lt;br /&gt;
=Example=&lt;br /&gt;
The following example is built-in to the mod, labelled &amp;quot;example&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
  {&lt;br /&gt;
    &amp;quot;escapeAction&amp;quot;: &amp;quot;q.dialogue.set_page(&#039;quitter&#039;)&amp;quot;,&lt;br /&gt;
    &amp;quot;speakers&amp;quot;: {&lt;br /&gt;
      &amp;quot;pikachu&amp;quot;: {&lt;br /&gt;
        &amp;quot;name&amp;quot;: &amp;quot;The Voice of Hiro&amp;quot;,&lt;br /&gt;
        &amp;quot;face&amp;quot;: {&lt;br /&gt;
          &amp;quot;type&amp;quot;: &amp;quot;artificial&amp;quot;,&lt;br /&gt;
          &amp;quot;modelType&amp;quot;: &amp;quot;pokemon&amp;quot;,&lt;br /&gt;
          &amp;quot;identifier&amp;quot;: &amp;quot;cobblemon:pikachu&amp;quot;,&lt;br /&gt;
          &amp;quot;aspects&amp;quot;: [&lt;br /&gt;
            &amp;quot;shiny&amp;quot;&lt;br /&gt;
          ]&lt;br /&gt;
        },&lt;br /&gt;
        &amp;quot;gibber&amp;quot;: {&lt;br /&gt;
          &amp;quot;step&amp;quot;: 2,&lt;br /&gt;
          &amp;quot;interval&amp;quot;: 0.07,&lt;br /&gt;
          &amp;quot;allowSkip&amp;quot;: false&lt;br /&gt;
        }&lt;br /&gt;
      },&lt;br /&gt;
      &amp;quot;player&amp;quot;: {&lt;br /&gt;
        &amp;quot;face&amp;quot;: &amp;quot;q.player.face();&amp;quot;,&lt;br /&gt;
        &amp;quot;name&amp;quot;: {&lt;br /&gt;
          &amp;quot;type&amp;quot;: &amp;quot;expression&amp;quot;,&lt;br /&gt;
          &amp;quot;expression&amp;quot;: &amp;quot;q.player.username&amp;quot;&lt;br /&gt;
        }&lt;br /&gt;
      }&lt;br /&gt;
    },&lt;br /&gt;
    &amp;quot;pages&amp;quot;: [&lt;br /&gt;
      {&lt;br /&gt;
        &amp;quot;id&amp;quot;: &amp;quot;player-chat&amp;quot;,&lt;br /&gt;
        &amp;quot;speaker&amp;quot;: &amp;quot;player&amp;quot;,&lt;br /&gt;
        &amp;quot;lines&amp;quot;: [&lt;br /&gt;
          {&lt;br /&gt;
            &amp;quot;type&amp;quot;: &amp;quot;expression&amp;quot;,&lt;br /&gt;
            &amp;quot;expression&amp;quot;: &amp;quot;&#039;Hello, I\\&#039;m &#039; + q.player.username + &#039;!&#039;&amp;quot;&lt;br /&gt;
          }&lt;br /&gt;
        ]&lt;br /&gt;
      },&lt;br /&gt;
      {&lt;br /&gt;
        &amp;quot;speaker&amp;quot;: &amp;quot;pikachu&amp;quot;,&lt;br /&gt;
        &amp;quot;lines&amp;quot;: [&lt;br /&gt;
          {&lt;br /&gt;
            &amp;quot;type&amp;quot;: &amp;quot;expression&amp;quot;,&lt;br /&gt;
            &amp;quot;expression&amp;quot;: &amp;quot;&#039;Nice to meet you, &#039; + q.player.username + &#039;! Welcome to the world of dialogues!&#039;&amp;quot;&lt;br /&gt;
          }&lt;br /&gt;
        ]&lt;br /&gt;
      },&lt;br /&gt;
      {&lt;br /&gt;
        &amp;quot;id&amp;quot;: &amp;quot;intro&amp;quot;,&lt;br /&gt;
        &amp;quot;speaker&amp;quot;: &amp;quot;pikachu&amp;quot;,&lt;br /&gt;
        &amp;quot;lines&amp;quot;: [ &amp;quot;Do you want to learn more?&amp;quot;],&lt;br /&gt;
        &amp;quot;input&amp;quot;: {&lt;br /&gt;
          &amp;quot;type&amp;quot;: &amp;quot;option&amp;quot;,&lt;br /&gt;
          &amp;quot;vertical&amp;quot;: false,&lt;br /&gt;
          &amp;quot;options&amp;quot;: [&lt;br /&gt;
            {&lt;br /&gt;
              &amp;quot;text&amp;quot;: &amp;quot;Yes&amp;quot;,&lt;br /&gt;
              &amp;quot;value&amp;quot;: &amp;quot;yes&amp;quot;,&lt;br /&gt;
              &amp;quot;action&amp;quot;: [&lt;br /&gt;
                &amp;quot;v.player_response = &#039;That sounds great!&#039;;&amp;quot;,&lt;br /&gt;
                &amp;quot;v.next_page = &#039;page1&#039;;&amp;quot;,&lt;br /&gt;
                &amp;quot;q.dialogue.set_page(&#039;player-surrogate&#039;);&amp;quot;&lt;br /&gt;
              ]&lt;br /&gt;
            },&lt;br /&gt;
            {&lt;br /&gt;
              &amp;quot;text&amp;quot;: &amp;quot;No&amp;quot;,&lt;br /&gt;
              &amp;quot;value&amp;quot;: &amp;quot;no&amp;quot;,&lt;br /&gt;
              &amp;quot;action&amp;quot;: [&lt;br /&gt;
                &amp;quot;v.player_response = &#039;No, I really don\\&#039;t care.&#039;;&amp;quot;,&lt;br /&gt;
                &amp;quot;v.next_page = &#039;quitter&#039;;&amp;quot;,&lt;br /&gt;
                &amp;quot;q.dialogue.set_page(&#039;player-surrogate&#039;);&amp;quot;&lt;br /&gt;
              ]&lt;br /&gt;
            },&lt;br /&gt;
            {&lt;br /&gt;
              &amp;quot;text&amp;quot;: &amp;quot;Sword!&amp;quot;,&lt;br /&gt;
              &amp;quot;value&amp;quot;: &amp;quot;sword&amp;quot;,&lt;br /&gt;
              &amp;quot;isVisible&amp;quot;: &amp;quot;q.player.main_held_item.is_of(&#039;minecraft:iron_sword&#039;)&amp;quot;,&lt;br /&gt;
              &amp;quot;isSelectable&amp;quot;: &amp;quot;q.player.data.scared_npc != true;&amp;quot;,&lt;br /&gt;
              &amp;quot;action&amp;quot;: [&lt;br /&gt;
                &amp;quot;v.player_response = &#039;How about you die! Muahahaha!&#039;;&amp;quot;,&lt;br /&gt;
                &amp;quot;v.next_page = &#039;sword&#039;;&amp;quot;,&lt;br /&gt;
                &amp;quot;q.dialogue.set_page(&#039;player-surrogate&#039;);&amp;quot;&lt;br /&gt;
              ]&lt;br /&gt;
            },&lt;br /&gt;
            {&lt;br /&gt;
              &amp;quot;text&amp;quot;: &amp;quot;Sword again!&amp;quot;,&lt;br /&gt;
              &amp;quot;value&amp;quot;: &amp;quot;sword2&amp;quot;,&lt;br /&gt;
              &amp;quot;isVisible&amp;quot;: &amp;quot;q.player.main_held_item.is_of(&#039;minecraft:iron_sword&#039;)&amp;quot;,&lt;br /&gt;
              &amp;quot;isSelectable&amp;quot;: &amp;quot;q.player.data.scared_npc == true;&amp;quot;,&lt;br /&gt;
              &amp;quot;action&amp;quot;: [&lt;br /&gt;
                &amp;quot;v.player_response = &#039;How about you die... again! Muahahaha!&#039;;&amp;quot;,&lt;br /&gt;
                &amp;quot;v.next_page = &#039;sword-again&#039;;&amp;quot;,&lt;br /&gt;
                &amp;quot;q.dialogue.set_page(&#039;player-surrogate&#039;);&amp;quot;&lt;br /&gt;
              ]&lt;br /&gt;
            }&lt;br /&gt;
          ]&lt;br /&gt;
        }&lt;br /&gt;
      },&lt;br /&gt;
      {&lt;br /&gt;
        &amp;quot;id&amp;quot;: &amp;quot;player-surrogate&amp;quot;,&lt;br /&gt;
        &amp;quot;speaker&amp;quot;: &amp;quot;player&amp;quot;,&lt;br /&gt;
        &amp;quot;gibber&amp;quot;: {},&lt;br /&gt;
        &amp;quot;lines&amp;quot;: [&lt;br /&gt;
          {&lt;br /&gt;
            &amp;quot;type&amp;quot;: &amp;quot;expression&amp;quot;,&lt;br /&gt;
            &amp;quot;expression&amp;quot;: &amp;quot;v.player_response;&amp;quot;&lt;br /&gt;
          }&lt;br /&gt;
        ],&lt;br /&gt;
        &amp;quot;input&amp;quot;: &amp;quot;q.dialogue.set_page(v.next_page);&amp;quot;&lt;br /&gt;
      },&lt;br /&gt;
      {&lt;br /&gt;
        &amp;quot;id&amp;quot;: &amp;quot;page1&amp;quot;,&lt;br /&gt;
        &amp;quot;speaker&amp;quot;: &amp;quot;pikachu&amp;quot;,&lt;br /&gt;
        &amp;quot;lines&amp;quot;: [&lt;br /&gt;
          &amp;quot;Well you see, this is a dialogue.&amp;quot;,&lt;br /&gt;
          &amp;quot;You can have multiple pages, and each page can have multiple lines.&amp;quot;&lt;br /&gt;
        ]&lt;br /&gt;
      },&lt;br /&gt;
      {&lt;br /&gt;
        &amp;quot;id&amp;quot;: &amp;quot;page2&amp;quot;,&lt;br /&gt;
        &amp;quot;speaker&amp;quot;: &amp;quot;pikachu&amp;quot;,&lt;br /&gt;
        &amp;quot;lines&amp;quot;: [&amp;quot;On an unrelated note, did you know that I&#039;m deeply afraid of iron swords? Anyway, cya!&amp;quot;],&lt;br /&gt;
        &amp;quot;input&amp;quot;: {&lt;br /&gt;
          &amp;quot;type&amp;quot;: &amp;quot;auto-continue&amp;quot;,&lt;br /&gt;
          &amp;quot;delay&amp;quot;: 5,&lt;br /&gt;
          &amp;quot;allowSkip&amp;quot;: true,&lt;br /&gt;
          &amp;quot;action&amp;quot;: &amp;quot;q.dialogue.close();&amp;quot;&lt;br /&gt;
        }&lt;br /&gt;
      },&lt;br /&gt;
      {&lt;br /&gt;
        &amp;quot;id&amp;quot;: &amp;quot;quitter&amp;quot;,&lt;br /&gt;
        &amp;quot;speaker&amp;quot;: &amp;quot;pikachu&amp;quot;,&lt;br /&gt;
        &amp;quot;lines&amp;quot;: [&amp;quot;Fine. Be that way.&amp;quot;],&lt;br /&gt;
        &amp;quot;input&amp;quot;: &amp;quot;q.dialogue.close();&amp;quot;,&lt;br /&gt;
        &amp;quot;escapeAction&amp;quot;: &amp;quot;q.dialogue.close();&amp;quot;&lt;br /&gt;
      },&lt;br /&gt;
      {&lt;br /&gt;
        &amp;quot;id&amp;quot;: &amp;quot;sword&amp;quot;,&lt;br /&gt;
        &amp;quot;speaker&amp;quot;: &amp;quot;pikachu&amp;quot;,&lt;br /&gt;
        &amp;quot;lines&amp;quot;: [&amp;quot;Oh god no, please don&#039;t hurt me!&amp;quot;],&lt;br /&gt;
        &amp;quot;escapeAction&amp;quot;: &amp;quot;q.dialogue.input(&#039;&#039;);&amp;quot;,&lt;br /&gt;
        &amp;quot;input&amp;quot;: [&lt;br /&gt;
          &amp;quot;t.data = q.player.data();&amp;quot;,&lt;br /&gt;
          &amp;quot;t.data.scared_npc = true;&amp;quot;,&lt;br /&gt;
          &amp;quot;q.player.save_data();&amp;quot;,&lt;br /&gt;
          &amp;quot;q.dialogue.close();&amp;quot;&lt;br /&gt;
        ]&lt;br /&gt;
      },&lt;br /&gt;
      {&lt;br /&gt;
        &amp;quot;id&amp;quot;: &amp;quot;sword-again&amp;quot;,&lt;br /&gt;
        &amp;quot;speaker&amp;quot;: &amp;quot;pikachu&amp;quot;,&lt;br /&gt;
        &amp;quot;lines&amp;quot;: [&amp;quot;I&#039;m ready for you this time. YOU will die today!&amp;quot;],&lt;br /&gt;
        &amp;quot;escapeAction&amp;quot;: &amp;quot;0&amp;quot;,&lt;br /&gt;
        &amp;quot;input&amp;quot;: {&lt;br /&gt;
          &amp;quot;type&amp;quot;: &amp;quot;option&amp;quot;,&lt;br /&gt;
          &amp;quot;vertical&amp;quot;: true,&lt;br /&gt;
          &amp;quot;timeout&amp;quot;: {&lt;br /&gt;
            &amp;quot;delay&amp;quot;: 6,&lt;br /&gt;
            &amp;quot;action&amp;quot;: &amp;quot;q.dialogue.input(&#039;stand&#039;);&amp;quot;&lt;br /&gt;
          },&lt;br /&gt;
          &amp;quot;options&amp;quot;: [&lt;br /&gt;
            {&lt;br /&gt;
              &amp;quot;text&amp;quot;: &amp;quot;Parry his attack.&amp;quot;,&lt;br /&gt;
              &amp;quot;value&amp;quot;: &amp;quot;parry&amp;quot;,&lt;br /&gt;
              &amp;quot;action&amp;quot;: [&lt;br /&gt;
                &amp;quot;v.reaction = &#039;parry&#039;;&amp;quot;,&lt;br /&gt;
                &amp;quot;q.dialogue.set_page(&#039;sword-again-decided&#039;);&amp;quot;&lt;br /&gt;
              ]&lt;br /&gt;
            },&lt;br /&gt;
            {&lt;br /&gt;
              &amp;quot;text&amp;quot;: &amp;quot;Stand perfectly still.&amp;quot;,&lt;br /&gt;
              &amp;quot;value&amp;quot;: &amp;quot;stand&amp;quot;,&lt;br /&gt;
              &amp;quot;action&amp;quot;: [&lt;br /&gt;
                &amp;quot;v.reaction = &#039;stand still&#039;;&amp;quot;,&lt;br /&gt;
                &amp;quot;q.dialogue.set_page(&#039;sword-again-decided&#039;);&amp;quot;&lt;br /&gt;
              ]&lt;br /&gt;
            },&lt;br /&gt;
            {&lt;br /&gt;
              &amp;quot;text&amp;quot;: &amp;quot;Drop your sword.&amp;quot;,&lt;br /&gt;
              &amp;quot;value&amp;quot;: &amp;quot;drop&amp;quot;,&lt;br /&gt;
              &amp;quot;action&amp;quot;: [&lt;br /&gt;
                &amp;quot;v.reaction = &#039;drop your sword&#039;;&amp;quot;,&lt;br /&gt;
                &amp;quot;q.dialogue.set_page(&#039;sword-again-decided&#039;);&amp;quot;&lt;br /&gt;
              ]&lt;br /&gt;
            }&lt;br /&gt;
          ]&lt;br /&gt;
        }&lt;br /&gt;
      },&lt;br /&gt;
      {&lt;br /&gt;
        &amp;quot;id&amp;quot;: &amp;quot;sword-again-decided&amp;quot;,&lt;br /&gt;
        &amp;quot;lines&amp;quot;: [&lt;br /&gt;
          {&lt;br /&gt;
            &amp;quot;type&amp;quot;: &amp;quot;expression&amp;quot;,&lt;br /&gt;
            &amp;quot;expression&amp;quot;: &amp;quot;v.reaction == &#039;parry&#039; ? &#039;You parry his attack and kill him.&#039; : (v.reaction == &#039;stand still&#039; ? &#039;He kills you.&#039; : &#039;You drop your sword and he kills you.&#039;)&amp;quot;&lt;br /&gt;
          }&lt;br /&gt;
        ],&lt;br /&gt;
        &amp;quot;input&amp;quot;: {&lt;br /&gt;
          &amp;quot;type&amp;quot;: &amp;quot;auto-continue&amp;quot;,&lt;br /&gt;
          &amp;quot;delay&amp;quot;: 3,&lt;br /&gt;
          &amp;quot;allowSkip&amp;quot;: false,&lt;br /&gt;
          &amp;quot;showTimer&amp;quot;: false,&lt;br /&gt;
          &amp;quot;action&amp;quot;: &amp;quot;q.dialogue.set_page(&#039;sword-again-reaction&#039;);&amp;quot;&lt;br /&gt;
        }&lt;br /&gt;
      },&lt;br /&gt;
      {&lt;br /&gt;
        &amp;quot;id&amp;quot;: &amp;quot;sword-again-reaction&amp;quot;,&lt;br /&gt;
        &amp;quot;speaker&amp;quot;: &amp;quot;pikachu&amp;quot;,&lt;br /&gt;
        &amp;quot;lines&amp;quot;: [&lt;br /&gt;
          {&lt;br /&gt;
            &amp;quot;type&amp;quot;: &amp;quot;expression&amp;quot;,&lt;br /&gt;
            &amp;quot;expression&amp;quot;: &amp;quot;&#039;Nah, I\\&#039;m just kidding. Interesting that you chose to &#039; + v.reaction + &#039; though.&#039;&amp;quot;&lt;br /&gt;
          }&lt;br /&gt;
        ]&lt;br /&gt;
      },&lt;br /&gt;
      {&lt;br /&gt;
        &amp;quot;id&amp;quot;: &amp;quot;name-question&amp;quot;,&lt;br /&gt;
        &amp;quot;speaker&amp;quot;: &amp;quot;pikachu&amp;quot;,&lt;br /&gt;
        &amp;quot;lines&amp;quot;: [ &amp;quot;Here&#039;s a puzzle though... What is my name? Lowercase only.&amp;quot;],&lt;br /&gt;
        &amp;quot;input&amp;quot;: {&lt;br /&gt;
          &amp;quot;type&amp;quot;: &amp;quot;text&amp;quot;,&lt;br /&gt;
          &amp;quot;timeout&amp;quot;: {&lt;br /&gt;
            &amp;quot;delay&amp;quot;: 10,&lt;br /&gt;
            &amp;quot;action&amp;quot;: &amp;quot;q.dialogue.set_page(&#039;too-slow&#039;);&amp;quot;&lt;br /&gt;
          },&lt;br /&gt;
          &amp;quot;action&amp;quot;: [&lt;br /&gt;
            &amp;quot;q.dialogue.set_page(&#039;name-speak&#039;);&amp;quot;,&lt;br /&gt;
            &amp;quot;t.data = q.player.data();&amp;quot;&lt;br /&gt;
          ]&lt;br /&gt;
        }&lt;br /&gt;
      },&lt;br /&gt;
      {&lt;br /&gt;
        &amp;quot;id&amp;quot;: &amp;quot;name-speak&amp;quot;,&lt;br /&gt;
        &amp;quot;speaker&amp;quot;: &amp;quot;player&amp;quot;,&lt;br /&gt;
        &amp;quot;lines&amp;quot;: [&lt;br /&gt;
          {&lt;br /&gt;
            &amp;quot;type&amp;quot;: &amp;quot;expression&amp;quot;,&lt;br /&gt;
            &amp;quot;expression&amp;quot;: &amp;quot;&#039;Your name is &#039; + v.selected_option + &#039;, right?&#039;&amp;quot;&lt;br /&gt;
          }&lt;br /&gt;
        ],&lt;br /&gt;
        &amp;quot;input&amp;quot;: &amp;quot;q.dialogue.set_page(&#039;name-guess&#039;);&amp;quot;&lt;br /&gt;
      },&lt;br /&gt;
      {&lt;br /&gt;
        &amp;quot;id&amp;quot;: &amp;quot;name-guess&amp;quot;,&lt;br /&gt;
        &amp;quot;speaker&amp;quot;: &amp;quot;pikachu&amp;quot;,&lt;br /&gt;
        &amp;quot;lines&amp;quot;: [&lt;br /&gt;
          {&lt;br /&gt;
            &amp;quot;type&amp;quot;: &amp;quot;expression&amp;quot;,&lt;br /&gt;
            &amp;quot;expression&amp;quot;: &amp;quot;v.selected_option == &#039;hiroku&#039; ? &#039;Correct! You know things that you shouldn\\&#039;t...&#039; : (&#039;Wrong! I\\&#039;m not \&amp;quot;&#039; + v.selected_option + &#039;\&amp;quot;. Whoever that is.&#039;)&amp;quot;&lt;br /&gt;
          }&lt;br /&gt;
        ],&lt;br /&gt;
        &amp;quot;input&amp;quot;: {&lt;br /&gt;
          &amp;quot;type&amp;quot;: &amp;quot;auto-continue&amp;quot;,&lt;br /&gt;
          &amp;quot;delay&amp;quot;: 5,&lt;br /&gt;
          &amp;quot;allowSkip&amp;quot;: true,&lt;br /&gt;
          &amp;quot;action&amp;quot;: &amp;quot;q.dialogue.set_page(&#039;farewell&#039;);&amp;quot;&lt;br /&gt;
        }&lt;br /&gt;
      },&lt;br /&gt;
      {&lt;br /&gt;
        &amp;quot;id&amp;quot;: &amp;quot;farewell&amp;quot;,&lt;br /&gt;
        &amp;quot;speaker&amp;quot;: &amp;quot;pikachu&amp;quot;,&lt;br /&gt;
        &amp;quot;lines&amp;quot;: [&amp;quot;Anyway, I&#039;m done with this dialogue. Bye!&amp;quot;],&lt;br /&gt;
        &amp;quot;input&amp;quot;: &amp;quot;q.dialogue.close();&amp;quot;&lt;br /&gt;
      },&lt;br /&gt;
      {&lt;br /&gt;
        &amp;quot;id&amp;quot;: &amp;quot;too-slow&amp;quot;,&lt;br /&gt;
        &amp;quot;speaker&amp;quot;: &amp;quot;pikachu&amp;quot;,&lt;br /&gt;
        &amp;quot;lines&amp;quot;: [&amp;quot;Don&#039;t know? Sad. Well I don&#039;t know your name either, so I guess we&#039;re even.&amp;quot;],&lt;br /&gt;
        &amp;quot;input&amp;quot;: &amp;quot;q.dialogue.close()&amp;quot;&lt;br /&gt;
      }&lt;br /&gt;
    ]&lt;br /&gt;
  }&lt;/div&gt;</summary>
		<author><name>Hiroku</name></author>
	</entry>
	<entry>
		<id>https://wiki.cobblemon.com/index.php?title=Dialogues&amp;diff=5753</id>
		<title>Dialogues</title>
		<link rel="alternate" type="text/html" href="https://wiki.cobblemon.com/index.php?title=Dialogues&amp;diff=5753"/>
		<updated>2025-04-19T05:14:07Z</updated>

		<summary type="html">&lt;p&gt;Hiroku: Added gibber, clientActions, and background information&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Dialogues are a feature that can be used from API or from datapacks to play conversations in a GUI. They display entities, view pages of text, and handle various types of input.&lt;br /&gt;
&lt;br /&gt;
A dialogue that has been registered through a datapack can be opened using the /opendialogue command.&lt;br /&gt;
&lt;br /&gt;
Every case of a MoLang expression can be either a single text property or can be an array of text to support running multiple expressions to produce a result.&lt;br /&gt;
&lt;br /&gt;
[[File:Dialogue_Intro.png|400px|center]]&lt;br /&gt;
&lt;br /&gt;
=Dialogue=&lt;br /&gt;
&lt;br /&gt;
A Dialogue JSON file consists of the following main elements:&lt;br /&gt;
&lt;br /&gt;
- &amp;lt;code&amp;gt;escapeAction&amp;lt;/code&amp;gt;: A string or array that defines the action to be taken when the dialogue is escaped. This can be a MoLang expression or a sequence of MoLang expressions.&lt;br /&gt;
&lt;br /&gt;
- &amp;lt;code&amp;gt;speakers&amp;lt;/code&amp;gt;: An object that defines the speakers in the dialogue. Each speaker is represented by a key-value pair, where the key is the speaker&#039;s identifier and the value is an object that describes what the speaker looks like and their name.&lt;br /&gt;
&lt;br /&gt;
- &amp;lt;code&amp;gt;pages&amp;lt;/code&amp;gt;: An array of objects, each representing a page in the dialogue.&lt;br /&gt;
&lt;br /&gt;
==Speakers==&lt;br /&gt;
&lt;br /&gt;
Each speaker is represented by an object with the following properties:&lt;br /&gt;
&lt;br /&gt;
- &amp;lt;code&amp;gt;name&amp;lt;/code&amp;gt;: A string or object that defines the speaker&#039;s name. This is usually just text. If it&#039;s an object, it must have a &amp;lt;code&amp;gt;type&amp;lt;/code&amp;gt; property set to &amp;lt;code&amp;gt;&amp;quot;expression&amp;quot;&amp;lt;/code&amp;gt; and an &amp;lt;code&amp;gt;expression&amp;lt;/code&amp;gt; property that contains a MoLang expression. You would use an expression if you wanted the name to be dynamic.&lt;br /&gt;
&lt;br /&gt;
- &amp;lt;code&amp;gt;face&amp;lt;/code&amp;gt;: An object or MoLang expression that defines the speaker&#039;s face. This will be rendered in a frame of the GUI. For objects, it must have a &amp;lt;code&amp;gt;type&amp;lt;/code&amp;gt; property set to the type of face. The only object type support currently is &amp;quot;standard&amp;quot;. The others are done using MoLang expressions rather than an object.&lt;br /&gt;
&lt;br /&gt;
- &amp;lt;code&amp;gt;gibber&amp;lt;/code&amp;gt;: An object defining the gibber behaviour. This can be defined as simply &amp;lt;code&amp;gt;{}&amp;lt;/code&amp;gt; to use the default settings, or as a full object with any of the properties that you want to set. See the section on &amp;lt;code&amp;gt;gibber&amp;lt;/code&amp;gt; further below to see the properties that are available.&lt;br /&gt;
&lt;br /&gt;
===Faces===&lt;br /&gt;
The speaker faces can be defined in multiple ways. If it is an object it is going to be a &amp;quot;standard&amp;quot; face type.&lt;br /&gt;
&lt;br /&gt;
====&amp;quot;standard&amp;quot;====&lt;br /&gt;
The standard face type is for when the face displayed is not connected to a specific entity in the world but does follow Cobblemon&#039;s format of identifier and aspect list. The object must have the following properties:&lt;br /&gt;
&lt;br /&gt;
- &amp;lt;code&amp;gt;modelType&amp;lt;/code&amp;gt;: One of &#039;pokemon&#039;, &#039;npc&#039;&lt;br /&gt;
&lt;br /&gt;
- &amp;lt;code&amp;gt;identifier&amp;lt;/code&amp;gt;: The identifier of the Pokémon or NPC, such as &amp;lt;code&amp;gt;cobblemon:bulbasaur&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
- &amp;lt;code&amp;gt;aspects&amp;lt;/code&amp;gt;: An array of aspects that will be applied to the model.&lt;br /&gt;
&lt;br /&gt;
For example:&lt;br /&gt;
&lt;br /&gt;
  &amp;quot;face&amp;quot;: {&lt;br /&gt;
    &amp;quot;type&amp;quot;: &amp;quot;artificial&amp;quot;,&lt;br /&gt;
    &amp;quot;modelType&amp;quot;: &amp;quot;pokemon&amp;quot;,&lt;br /&gt;
    &amp;quot;identifier&amp;quot;: &amp;quot;cobblemon:pikachu&amp;quot;,&lt;br /&gt;
    &amp;quot;aspects&amp;quot;: [&lt;br /&gt;
      &amp;quot;shiny&amp;quot;&lt;br /&gt;
    ]&lt;br /&gt;
  }&lt;br /&gt;
  &lt;br /&gt;
&lt;br /&gt;
====player====&lt;br /&gt;
By using &amp;lt;code&amp;gt;q.player.face()&amp;lt;/code&amp;gt; you can make the player&#039;s model render for this face.&lt;br /&gt;
&lt;br /&gt;
For example:&lt;br /&gt;
&lt;br /&gt;
  &amp;quot;face&amp;quot;: &amp;quot;q.player.face();&amp;quot;&lt;br /&gt;
&lt;br /&gt;
====npc====&lt;br /&gt;
By using &amp;lt;code&amp;gt;q.npc.face()&amp;lt;/code&amp;gt; you can show a direct reference to the NPC you&#039;re having the dialogue with, if this was dialogue started with an NPC entity.&lt;br /&gt;
&lt;br /&gt;
For example:&lt;br /&gt;
&lt;br /&gt;
  &amp;quot;face&amp;quot;: &amp;quot;q.npc.face();&amp;quot;&lt;br /&gt;
&lt;br /&gt;
===Gibber===&lt;br /&gt;
An additional feature of dialogues is having the text appear gradually and with a simplistic set of tones that mimic speech, referred to here as gibbering. Gibbering has many options and all have sensible defaults. The properties available are as follows:&lt;br /&gt;
&lt;br /&gt;
- &amp;lt;code&amp;gt;graduallyShowText&amp;lt;/code&amp;gt;: A boolean which, when true, will cause the text in the GUI to gradually be typed out. When false, gibbering sound effects will play but all of the text will be visible from the beginning. Defaults to true.&lt;br /&gt;
&lt;br /&gt;
- &amp;lt;code&amp;gt;allowSkip&amp;lt;/code&amp;gt;: Whether or not clicking in the dialogue box will skip the gibbering and display all of the text at once. If false, the player must wait until the entirety of the gibbering has occurred before they can continue to the next page.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;step&amp;lt;/code&amp;gt;: The number of characters between each gibber. A gibber will play for the current character index and then, after some time interval, this step will be used to move to a later character in the text to play the next gibber. When gradually revealing text is on, a larger step will mean that text will appear in larger chunks. Defaults to 4 characters.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;interval&amp;lt;/code&amp;gt;: The time (in seconds) between each gibber sound. A smaller value will make the sounds come more rapidly, and the text will appear more quickly if gradually showing text. Defaults to 0.1 seconds.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;minPitch&amp;lt;/code&amp;gt;: The minimum pitch multiplier that could be used when randomly selecting a tone. Defaults to 0.8.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;maxPitch&amp;lt;/code&amp;gt;: The maximum pitch multiplier that could be used when randomly selecting a tone. Defaults to 1.2.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;minVolume&amp;lt;/code&amp;gt;: The minimum volume multiplier that could be used when randomly selecting a tone. Defaults to 0.75.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;maxVolume&amp;lt;/code&amp;gt;: The maximum volume multiplier that could be used when randomly selecting a tone. Defaults to 1.1.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;sounds&amp;lt;/code&amp;gt;: A list of resource locations indicating which sound events should be chosen from when playing a gibber. It can be any number of sounds. Defaults to three sounds: &amp;lt;code&amp;gt;&amp;quot;cobblemon:entity.villager.npc1&amp;quot;&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;&amp;quot;cobblemon:entity.villager.npc2&amp;quot;&amp;lt;/code&amp;gt;, and &amp;lt;code&amp;gt;&amp;quot;cobblemon:entity.villager.npc1&amp;quot;&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
==Pages==&lt;br /&gt;
&lt;br /&gt;
Each page is represented by an object with the following properties:&lt;br /&gt;
&lt;br /&gt;
- &amp;lt;code&amp;gt;id&amp;lt;/code&amp;gt;: A string that uniquely identifies the page. This is needed for instances where you might want to jump to a specific page. Page numbers could be used, but you should use page IDs.&lt;br /&gt;
&lt;br /&gt;
- &amp;lt;code&amp;gt;speaker&amp;lt;/code&amp;gt;: A string that specifies the speaker&#039;s identifier. This depends upon the speaker by this identifier existing in the speakers list.&lt;br /&gt;
&lt;br /&gt;
- &amp;lt;code&amp;gt;lines&amp;lt;/code&amp;gt;: An array of strings or objects, each representing a line of text. If it&#039;s an object, it must have a &amp;lt;code&amp;gt;type&amp;lt;/code&amp;gt; property set to &amp;lt;code&amp;gt;&amp;quot;expression&amp;quot;&amp;lt;/code&amp;gt; and an &amp;lt;code&amp;gt;expression&amp;lt;/code&amp;gt; property that contains a MoLang expression that evaluates to a string. You would use an expression if you want to include variables to make dynamic text.&lt;br /&gt;
&lt;br /&gt;
- &amp;lt;code&amp;gt;input&amp;lt;/code&amp;gt;: An object or string that defines the input prompt. If it&#039;s an object, it must have a &amp;lt;code&amp;gt;type&amp;lt;/code&amp;gt; property set to &amp;lt;code&amp;gt;&amp;quot;option&amp;quot;&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;&amp;quot;text&amp;quot;&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;&amp;quot;auto-continue&amp;quot;&amp;lt;/code&amp;gt;, or &amp;lt;code&amp;gt;&amp;quot;none&amp;quot;&amp;lt;/code&amp;gt;, and other properties depending on the type. By default, the input value will be &amp;lt;code&amp;gt;none&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
- &amp;lt;code&amp;gt;gibber&amp;lt;/code&amp;gt;: A page-specific gibber configuration. See above for more information about gibber objects. By default this is null, and will therefore fallback to the gibber that is on the &amp;lt;code&amp;gt;speaker&amp;lt;/code&amp;gt; for this page, if any is.&lt;br /&gt;
&lt;br /&gt;
- &amp;lt;code&amp;gt;clientActions&amp;lt;/code&amp;gt;: A list of MoLang expressions that will run on the client after the first frame of the page has been rendered on the client. This can be used to play sounds with &amp;lt;code&amp;gt;&amp;quot;q.sound(...)&amp;quot;&amp;lt;/code&amp;gt;, or even play animations on the face being rendered (if it is a Bedrock animated entity) by doing, for example, &amp;lt;code&amp;gt;&amp;quot;q.face.play_animation(&#039;win&#039;);&amp;quot;&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
- &amp;lt;code&amp;gt;escapeAction&amp;lt;/code&amp;gt;: A string or array that defines the action to be taken when the page is escaped. This can be a MoLang expression or a sequence of MoLang expressions.&lt;br /&gt;
&lt;br /&gt;
- &amp;lt;code&amp;gt;background&amp;lt;/code&amp;gt;: A resource location to use as the background texture for the dialogue box. By default this is null, which will result in Cobblemon&#039;s internal texture to be used.&lt;br /&gt;
&lt;br /&gt;
==Input Types==&lt;br /&gt;
&lt;br /&gt;
The &amp;lt;code&amp;gt;input&amp;lt;/code&amp;gt; property in a page object can have different structures depending on the &amp;lt;code&amp;gt;type&amp;lt;/code&amp;gt;. &lt;br /&gt;
&lt;br /&gt;
For all inputs that specify an &amp;lt;code&amp;gt;action&amp;lt;/code&amp;gt; property which is set to a MoLang expression, you can access the time it took for them to make that input using &amp;lt;code&amp;gt;v.seconds_taken_to_input&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
===&amp;quot;option&amp;quot;===&lt;br /&gt;
The input is a set of options. The object must have an &amp;lt;code&amp;gt;options&amp;lt;/code&amp;gt; property that is an array of objects, each representing an option. It can also specify whether the options should be displayed vertically or horizontally by whether or not the &amp;lt;code&amp;gt;vertical&amp;lt;/code&amp;gt; property is true or false.&lt;br /&gt;
&lt;br /&gt;
Each option object can have the following properties:&lt;br /&gt;
&lt;br /&gt;
- &amp;lt;code&amp;gt;value&amp;lt;/code&amp;gt;: The unique value of the dialogue option. This is not displayed to the player and is instead used to reference this option from scripts.&lt;br /&gt;
- &amp;lt;code&amp;gt;text&amp;lt;/code&amp;gt;The display text for the option. This can be a simple string or can be an object&lt;br /&gt;
- &amp;lt;code&amp;gt;action&amp;lt;/code&amp;gt;: The MoLang expression to run when the user chooses the option.&lt;br /&gt;
- &amp;lt;code&amp;gt;isVisible&amp;lt;/code&amp;gt;: A MoLang expression which must return either true or false. If false, the option will not be visible for the player. Defaults to true.&lt;br /&gt;
- &amp;lt;code&amp;gt;isSelectable&amp;lt;/code&amp;gt;: A MoLang expression which must return either true or false. If false, the option will be greyed out (but only if it is visible). Defaults to true.&lt;br /&gt;
&lt;br /&gt;
[[File:Dialogue_Options.png|600px|center]]&lt;br /&gt;
&lt;br /&gt;
===&amp;quot;text&amp;quot;===&lt;br /&gt;
The input is a text field. The &amp;lt;code&amp;gt;action&amp;lt;/code&amp;gt; property is a MoLang expression that will run when the player hits enter with text typed in. As specified earlier, you can check the text that they input using &amp;lt;code&amp;gt;v.selected_option&amp;lt;/code&amp;gt; inside of the MoLang expression.&lt;br /&gt;
&lt;br /&gt;
[[File:Dialogue_Input.png|600px|center]]&lt;br /&gt;
&lt;br /&gt;
===&amp;quot;auto-continue&amp;quot;===&lt;br /&gt;
The dialogue will automatically progress after some period of time. There are several optional properties for this.&lt;br /&gt;
&lt;br /&gt;
- &amp;lt;code&amp;gt;delay&amp;lt;/code&amp;gt;: The delay in seconds until it progresses. By default this is 5 seconds. &lt;br /&gt;
&lt;br /&gt;
- &amp;lt;code&amp;gt;allowSkip&amp;lt;/code&amp;gt;: Whether the user is able to skip the delay by clicking. By default this is true. If false, the player will be forced to wait for the delay.&lt;br /&gt;
&lt;br /&gt;
- &amp;lt;code&amp;gt;showTimer&amp;lt;/code&amp;gt;: Whether a bar will be displayed to indicate how much more time the player has until it auto-continues. Defaults to false.&lt;br /&gt;
&lt;br /&gt;
- &amp;lt;code&amp;gt;action&amp;lt;/code&amp;gt;: A MoLang expression that runs when either the player clicks (only when &amp;lt;code&amp;gt;allowSkip&amp;lt;/code&amp;gt; is true) or the delay finishes. By default this moves to the next page.&lt;br /&gt;
&lt;br /&gt;
===&amp;quot;none&amp;quot;===&lt;br /&gt;
There is no input except that it waits until the user clicks to continue. The object can have an &amp;lt;code&amp;gt;action&amp;lt;/code&amp;gt; property that defines the MoLang expression to run when the player clicks. By default, it moves to the next page.&lt;br /&gt;
&lt;br /&gt;
===Timeouts===&lt;br /&gt;
All input types except for &amp;lt;code&amp;gt;&amp;quot;none&amp;quot;&amp;lt;/code&amp;gt; and &amp;lt;code&amp;gt;&amp;quot;autocontinue&amp;quot;&amp;lt;/code&amp;gt; can have a &#039;timeout&#039; object which allows you to apply time constraints to the player viewing the page.&lt;br /&gt;
&lt;br /&gt;
The timeout object can have 3 properties:&lt;br /&gt;
&lt;br /&gt;
- &amp;lt;code&amp;gt;duration&amp;lt;/code&amp;gt;: The time, in seconds, that the player will have to complete the input. By default this is 10 seconds.&lt;br /&gt;
&lt;br /&gt;
- &amp;lt;code&amp;gt;showTimer&amp;lt;/code&amp;gt;: Whether or not a bar will be shown to show the player how much time they have left. By default this is true.&lt;br /&gt;
&lt;br /&gt;
- &amp;lt;code&amp;gt;action&amp;lt;/code&amp;gt;: A MoLang expression to run if they do not enter the input in time. By default this will close the dialogue.&lt;br /&gt;
&lt;br /&gt;
[[File:Dialogue_Timer.png|600px|center]]&lt;br /&gt;
&lt;br /&gt;
=Example=&lt;br /&gt;
The following example is built-in to the mod, labelled &amp;quot;example&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
  {&lt;br /&gt;
    &amp;quot;escapeAction&amp;quot;: &amp;quot;q.dialogue.set_page(&#039;quitter&#039;)&amp;quot;,&lt;br /&gt;
    &amp;quot;speakers&amp;quot;: {&lt;br /&gt;
      &amp;quot;pikachu&amp;quot;: {&lt;br /&gt;
        &amp;quot;name&amp;quot;: &amp;quot;The Voice of Hiro&amp;quot;,&lt;br /&gt;
        &amp;quot;face&amp;quot;: {&lt;br /&gt;
          &amp;quot;type&amp;quot;: &amp;quot;artificial&amp;quot;,&lt;br /&gt;
          &amp;quot;modelType&amp;quot;: &amp;quot;pokemon&amp;quot;,&lt;br /&gt;
          &amp;quot;identifier&amp;quot;: &amp;quot;cobblemon:pikachu&amp;quot;,&lt;br /&gt;
          &amp;quot;aspects&amp;quot;: [&lt;br /&gt;
            &amp;quot;shiny&amp;quot;&lt;br /&gt;
          ]&lt;br /&gt;
        },&lt;br /&gt;
        &amp;quot;gibber&amp;quot;: {&lt;br /&gt;
          &amp;quot;step&amp;quot;: 2,&lt;br /&gt;
          &amp;quot;interval&amp;quot;: 0.07,&lt;br /&gt;
          &amp;quot;allowSkip&amp;quot;: false&lt;br /&gt;
        }&lt;br /&gt;
      },&lt;br /&gt;
      &amp;quot;player&amp;quot;: {&lt;br /&gt;
        &amp;quot;face&amp;quot;: &amp;quot;q.player.face();&amp;quot;,&lt;br /&gt;
        &amp;quot;name&amp;quot;: {&lt;br /&gt;
          &amp;quot;type&amp;quot;: &amp;quot;expression&amp;quot;,&lt;br /&gt;
          &amp;quot;expression&amp;quot;: &amp;quot;q.player.username&amp;quot;&lt;br /&gt;
        }&lt;br /&gt;
      }&lt;br /&gt;
    },&lt;br /&gt;
    &amp;quot;pages&amp;quot;: [&lt;br /&gt;
      {&lt;br /&gt;
        &amp;quot;id&amp;quot;: &amp;quot;player-chat&amp;quot;,&lt;br /&gt;
        &amp;quot;speaker&amp;quot;: &amp;quot;player&amp;quot;,&lt;br /&gt;
        &amp;quot;lines&amp;quot;: [&lt;br /&gt;
          {&lt;br /&gt;
            &amp;quot;type&amp;quot;: &amp;quot;expression&amp;quot;,&lt;br /&gt;
            &amp;quot;expression&amp;quot;: &amp;quot;&#039;Hello, I\\&#039;m &#039; + q.player.username + &#039;!&#039;&amp;quot;&lt;br /&gt;
          }&lt;br /&gt;
        ]&lt;br /&gt;
      },&lt;br /&gt;
      {&lt;br /&gt;
        &amp;quot;speaker&amp;quot;: &amp;quot;pikachu&amp;quot;,&lt;br /&gt;
        &amp;quot;lines&amp;quot;: [&lt;br /&gt;
          {&lt;br /&gt;
            &amp;quot;type&amp;quot;: &amp;quot;expression&amp;quot;,&lt;br /&gt;
            &amp;quot;expression&amp;quot;: &amp;quot;&#039;Nice to meet you, &#039; + q.player.username + &#039;! Welcome to the world of dialogues!&#039;&amp;quot;&lt;br /&gt;
          }&lt;br /&gt;
        ]&lt;br /&gt;
      },&lt;br /&gt;
      {&lt;br /&gt;
        &amp;quot;id&amp;quot;: &amp;quot;intro&amp;quot;,&lt;br /&gt;
        &amp;quot;speaker&amp;quot;: &amp;quot;pikachu&amp;quot;,&lt;br /&gt;
        &amp;quot;lines&amp;quot;: [ &amp;quot;Do you want to learn more?&amp;quot;],&lt;br /&gt;
        &amp;quot;input&amp;quot;: {&lt;br /&gt;
          &amp;quot;type&amp;quot;: &amp;quot;option&amp;quot;,&lt;br /&gt;
          &amp;quot;vertical&amp;quot;: false,&lt;br /&gt;
          &amp;quot;options&amp;quot;: [&lt;br /&gt;
            {&lt;br /&gt;
              &amp;quot;text&amp;quot;: &amp;quot;Yes&amp;quot;,&lt;br /&gt;
              &amp;quot;value&amp;quot;: &amp;quot;yes&amp;quot;,&lt;br /&gt;
              &amp;quot;action&amp;quot;: [&lt;br /&gt;
                &amp;quot;v.player_response = &#039;That sounds great!&#039;;&amp;quot;,&lt;br /&gt;
                &amp;quot;v.next_page = &#039;page1&#039;;&amp;quot;,&lt;br /&gt;
                &amp;quot;q.dialogue.set_page(&#039;player-surrogate&#039;);&amp;quot;&lt;br /&gt;
              ]&lt;br /&gt;
            },&lt;br /&gt;
            {&lt;br /&gt;
              &amp;quot;text&amp;quot;: &amp;quot;No&amp;quot;,&lt;br /&gt;
              &amp;quot;value&amp;quot;: &amp;quot;no&amp;quot;,&lt;br /&gt;
              &amp;quot;action&amp;quot;: [&lt;br /&gt;
                &amp;quot;v.player_response = &#039;No, I really don\\&#039;t care.&#039;;&amp;quot;,&lt;br /&gt;
                &amp;quot;v.next_page = &#039;quitter&#039;;&amp;quot;,&lt;br /&gt;
                &amp;quot;q.dialogue.set_page(&#039;player-surrogate&#039;);&amp;quot;&lt;br /&gt;
              ]&lt;br /&gt;
            },&lt;br /&gt;
            {&lt;br /&gt;
              &amp;quot;text&amp;quot;: &amp;quot;Sword!&amp;quot;,&lt;br /&gt;
              &amp;quot;value&amp;quot;: &amp;quot;sword&amp;quot;,&lt;br /&gt;
              &amp;quot;isVisible&amp;quot;: &amp;quot;q.player.main_held_item.is_of(&#039;minecraft:iron_sword&#039;)&amp;quot;,&lt;br /&gt;
              &amp;quot;isSelectable&amp;quot;: &amp;quot;q.player.data.scared_npc != true;&amp;quot;,&lt;br /&gt;
              &amp;quot;action&amp;quot;: [&lt;br /&gt;
                &amp;quot;v.player_response = &#039;How about you die! Muahahaha!&#039;;&amp;quot;,&lt;br /&gt;
                &amp;quot;v.next_page = &#039;sword&#039;;&amp;quot;,&lt;br /&gt;
                &amp;quot;q.dialogue.set_page(&#039;player-surrogate&#039;);&amp;quot;&lt;br /&gt;
              ]&lt;br /&gt;
            },&lt;br /&gt;
            {&lt;br /&gt;
              &amp;quot;text&amp;quot;: &amp;quot;Sword again!&amp;quot;,&lt;br /&gt;
              &amp;quot;value&amp;quot;: &amp;quot;sword2&amp;quot;,&lt;br /&gt;
              &amp;quot;isVisible&amp;quot;: &amp;quot;q.player.main_held_item.is_of(&#039;minecraft:iron_sword&#039;)&amp;quot;,&lt;br /&gt;
              &amp;quot;isSelectable&amp;quot;: &amp;quot;q.player.data.scared_npc == true;&amp;quot;,&lt;br /&gt;
              &amp;quot;action&amp;quot;: [&lt;br /&gt;
                &amp;quot;v.player_response = &#039;How about you die... again! Muahahaha!&#039;;&amp;quot;,&lt;br /&gt;
                &amp;quot;v.next_page = &#039;sword-again&#039;;&amp;quot;,&lt;br /&gt;
                &amp;quot;q.dialogue.set_page(&#039;player-surrogate&#039;);&amp;quot;&lt;br /&gt;
              ]&lt;br /&gt;
            }&lt;br /&gt;
          ]&lt;br /&gt;
        }&lt;br /&gt;
      },&lt;br /&gt;
      {&lt;br /&gt;
        &amp;quot;id&amp;quot;: &amp;quot;player-surrogate&amp;quot;,&lt;br /&gt;
        &amp;quot;speaker&amp;quot;: &amp;quot;player&amp;quot;,&lt;br /&gt;
        &amp;quot;gibber&amp;quot;: {},&lt;br /&gt;
        &amp;quot;lines&amp;quot;: [&lt;br /&gt;
          {&lt;br /&gt;
            &amp;quot;type&amp;quot;: &amp;quot;expression&amp;quot;,&lt;br /&gt;
            &amp;quot;expression&amp;quot;: &amp;quot;v.player_response;&amp;quot;&lt;br /&gt;
          }&lt;br /&gt;
        ],&lt;br /&gt;
        &amp;quot;input&amp;quot;: &amp;quot;q.dialogue.set_page(v.next_page);&amp;quot;&lt;br /&gt;
      },&lt;br /&gt;
      {&lt;br /&gt;
        &amp;quot;id&amp;quot;: &amp;quot;page1&amp;quot;,&lt;br /&gt;
        &amp;quot;speaker&amp;quot;: &amp;quot;pikachu&amp;quot;,&lt;br /&gt;
        &amp;quot;lines&amp;quot;: [&lt;br /&gt;
          &amp;quot;Well you see, this is a dialogue.&amp;quot;,&lt;br /&gt;
          &amp;quot;You can have multiple pages, and each page can have multiple lines.&amp;quot;&lt;br /&gt;
        ]&lt;br /&gt;
      },&lt;br /&gt;
      {&lt;br /&gt;
        &amp;quot;id&amp;quot;: &amp;quot;page2&amp;quot;,&lt;br /&gt;
        &amp;quot;speaker&amp;quot;: &amp;quot;pikachu&amp;quot;,&lt;br /&gt;
        &amp;quot;lines&amp;quot;: [&amp;quot;On an unrelated note, did you know that I&#039;m deeply afraid of iron swords? Anyway, cya!&amp;quot;],&lt;br /&gt;
        &amp;quot;input&amp;quot;: {&lt;br /&gt;
          &amp;quot;type&amp;quot;: &amp;quot;auto-continue&amp;quot;,&lt;br /&gt;
          &amp;quot;delay&amp;quot;: 5,&lt;br /&gt;
          &amp;quot;allowSkip&amp;quot;: true,&lt;br /&gt;
          &amp;quot;action&amp;quot;: &amp;quot;q.dialogue.close();&amp;quot;&lt;br /&gt;
        }&lt;br /&gt;
      },&lt;br /&gt;
      {&lt;br /&gt;
        &amp;quot;id&amp;quot;: &amp;quot;quitter&amp;quot;,&lt;br /&gt;
        &amp;quot;speaker&amp;quot;: &amp;quot;pikachu&amp;quot;,&lt;br /&gt;
        &amp;quot;lines&amp;quot;: [&amp;quot;Fine. Be that way.&amp;quot;],&lt;br /&gt;
        &amp;quot;input&amp;quot;: &amp;quot;q.dialogue.close();&amp;quot;,&lt;br /&gt;
        &amp;quot;escapeAction&amp;quot;: &amp;quot;q.dialogue.close();&amp;quot;&lt;br /&gt;
      },&lt;br /&gt;
      {&lt;br /&gt;
        &amp;quot;id&amp;quot;: &amp;quot;sword&amp;quot;,&lt;br /&gt;
        &amp;quot;speaker&amp;quot;: &amp;quot;pikachu&amp;quot;,&lt;br /&gt;
        &amp;quot;lines&amp;quot;: [&amp;quot;Oh god no, please don&#039;t hurt me!&amp;quot;],&lt;br /&gt;
        &amp;quot;escapeAction&amp;quot;: &amp;quot;q.dialogue.input(&#039;&#039;);&amp;quot;,&lt;br /&gt;
        &amp;quot;input&amp;quot;: [&lt;br /&gt;
          &amp;quot;t.data = q.player.data();&amp;quot;,&lt;br /&gt;
          &amp;quot;t.data.scared_npc = true;&amp;quot;,&lt;br /&gt;
          &amp;quot;q.player.save_data();&amp;quot;,&lt;br /&gt;
          &amp;quot;q.dialogue.close();&amp;quot;&lt;br /&gt;
        ]&lt;br /&gt;
      },&lt;br /&gt;
      {&lt;br /&gt;
        &amp;quot;id&amp;quot;: &amp;quot;sword-again&amp;quot;,&lt;br /&gt;
        &amp;quot;speaker&amp;quot;: &amp;quot;pikachu&amp;quot;,&lt;br /&gt;
        &amp;quot;lines&amp;quot;: [&amp;quot;I&#039;m ready for you this time. YOU will die today!&amp;quot;],&lt;br /&gt;
        &amp;quot;escapeAction&amp;quot;: &amp;quot;0&amp;quot;,&lt;br /&gt;
        &amp;quot;input&amp;quot;: {&lt;br /&gt;
          &amp;quot;type&amp;quot;: &amp;quot;option&amp;quot;,&lt;br /&gt;
          &amp;quot;vertical&amp;quot;: true,&lt;br /&gt;
          &amp;quot;timeout&amp;quot;: {&lt;br /&gt;
            &amp;quot;delay&amp;quot;: 6,&lt;br /&gt;
            &amp;quot;action&amp;quot;: &amp;quot;q.dialogue.input(&#039;stand&#039;);&amp;quot;&lt;br /&gt;
          },&lt;br /&gt;
          &amp;quot;options&amp;quot;: [&lt;br /&gt;
            {&lt;br /&gt;
              &amp;quot;text&amp;quot;: &amp;quot;Parry his attack.&amp;quot;,&lt;br /&gt;
              &amp;quot;value&amp;quot;: &amp;quot;parry&amp;quot;,&lt;br /&gt;
              &amp;quot;action&amp;quot;: [&lt;br /&gt;
                &amp;quot;v.reaction = &#039;parry&#039;;&amp;quot;,&lt;br /&gt;
                &amp;quot;q.dialogue.set_page(&#039;sword-again-decided&#039;);&amp;quot;&lt;br /&gt;
              ]&lt;br /&gt;
            },&lt;br /&gt;
            {&lt;br /&gt;
              &amp;quot;text&amp;quot;: &amp;quot;Stand perfectly still.&amp;quot;,&lt;br /&gt;
              &amp;quot;value&amp;quot;: &amp;quot;stand&amp;quot;,&lt;br /&gt;
              &amp;quot;action&amp;quot;: [&lt;br /&gt;
                &amp;quot;v.reaction = &#039;stand still&#039;;&amp;quot;,&lt;br /&gt;
                &amp;quot;q.dialogue.set_page(&#039;sword-again-decided&#039;);&amp;quot;&lt;br /&gt;
              ]&lt;br /&gt;
            },&lt;br /&gt;
            {&lt;br /&gt;
              &amp;quot;text&amp;quot;: &amp;quot;Drop your sword.&amp;quot;,&lt;br /&gt;
              &amp;quot;value&amp;quot;: &amp;quot;drop&amp;quot;,&lt;br /&gt;
              &amp;quot;action&amp;quot;: [&lt;br /&gt;
                &amp;quot;v.reaction = &#039;drop your sword&#039;;&amp;quot;,&lt;br /&gt;
                &amp;quot;q.dialogue.set_page(&#039;sword-again-decided&#039;);&amp;quot;&lt;br /&gt;
              ]&lt;br /&gt;
            }&lt;br /&gt;
          ]&lt;br /&gt;
        }&lt;br /&gt;
      },&lt;br /&gt;
      {&lt;br /&gt;
        &amp;quot;id&amp;quot;: &amp;quot;sword-again-decided&amp;quot;,&lt;br /&gt;
        &amp;quot;lines&amp;quot;: [&lt;br /&gt;
          {&lt;br /&gt;
            &amp;quot;type&amp;quot;: &amp;quot;expression&amp;quot;,&lt;br /&gt;
            &amp;quot;expression&amp;quot;: &amp;quot;v.reaction == &#039;parry&#039; ? &#039;You parry his attack and kill him.&#039; : (v.reaction == &#039;stand still&#039; ? &#039;He kills you.&#039; : &#039;You drop your sword and he kills you.&#039;)&amp;quot;&lt;br /&gt;
          }&lt;br /&gt;
        ],&lt;br /&gt;
        &amp;quot;input&amp;quot;: {&lt;br /&gt;
          &amp;quot;type&amp;quot;: &amp;quot;auto-continue&amp;quot;,&lt;br /&gt;
          &amp;quot;delay&amp;quot;: 3,&lt;br /&gt;
          &amp;quot;allowSkip&amp;quot;: false,&lt;br /&gt;
          &amp;quot;showTimer&amp;quot;: false,&lt;br /&gt;
          &amp;quot;action&amp;quot;: &amp;quot;q.dialogue.set_page(&#039;sword-again-reaction&#039;);&amp;quot;&lt;br /&gt;
        }&lt;br /&gt;
      },&lt;br /&gt;
      {&lt;br /&gt;
        &amp;quot;id&amp;quot;: &amp;quot;sword-again-reaction&amp;quot;,&lt;br /&gt;
        &amp;quot;speaker&amp;quot;: &amp;quot;pikachu&amp;quot;,&lt;br /&gt;
        &amp;quot;lines&amp;quot;: [&lt;br /&gt;
          {&lt;br /&gt;
            &amp;quot;type&amp;quot;: &amp;quot;expression&amp;quot;,&lt;br /&gt;
            &amp;quot;expression&amp;quot;: &amp;quot;&#039;Nah, I\\&#039;m just kidding. Interesting that you chose to &#039; + v.reaction + &#039; though.&#039;&amp;quot;&lt;br /&gt;
          }&lt;br /&gt;
        ]&lt;br /&gt;
      },&lt;br /&gt;
      {&lt;br /&gt;
        &amp;quot;id&amp;quot;: &amp;quot;name-question&amp;quot;,&lt;br /&gt;
        &amp;quot;speaker&amp;quot;: &amp;quot;pikachu&amp;quot;,&lt;br /&gt;
        &amp;quot;lines&amp;quot;: [ &amp;quot;Here&#039;s a puzzle though... What is my name? Lowercase only.&amp;quot;],&lt;br /&gt;
        &amp;quot;input&amp;quot;: {&lt;br /&gt;
          &amp;quot;type&amp;quot;: &amp;quot;text&amp;quot;,&lt;br /&gt;
          &amp;quot;timeout&amp;quot;: {&lt;br /&gt;
            &amp;quot;delay&amp;quot;: 10,&lt;br /&gt;
            &amp;quot;action&amp;quot;: &amp;quot;q.dialogue.set_page(&#039;too-slow&#039;);&amp;quot;&lt;br /&gt;
          },&lt;br /&gt;
          &amp;quot;action&amp;quot;: [&lt;br /&gt;
            &amp;quot;q.dialogue.set_page(&#039;name-speak&#039;);&amp;quot;,&lt;br /&gt;
            &amp;quot;t.data = q.player.data();&amp;quot;&lt;br /&gt;
          ]&lt;br /&gt;
        }&lt;br /&gt;
      },&lt;br /&gt;
      {&lt;br /&gt;
        &amp;quot;id&amp;quot;: &amp;quot;name-speak&amp;quot;,&lt;br /&gt;
        &amp;quot;speaker&amp;quot;: &amp;quot;player&amp;quot;,&lt;br /&gt;
        &amp;quot;lines&amp;quot;: [&lt;br /&gt;
          {&lt;br /&gt;
            &amp;quot;type&amp;quot;: &amp;quot;expression&amp;quot;,&lt;br /&gt;
            &amp;quot;expression&amp;quot;: &amp;quot;&#039;Your name is &#039; + v.selected_option + &#039;, right?&#039;&amp;quot;&lt;br /&gt;
          }&lt;br /&gt;
        ],&lt;br /&gt;
        &amp;quot;input&amp;quot;: &amp;quot;q.dialogue.set_page(&#039;name-guess&#039;);&amp;quot;&lt;br /&gt;
      },&lt;br /&gt;
      {&lt;br /&gt;
        &amp;quot;id&amp;quot;: &amp;quot;name-guess&amp;quot;,&lt;br /&gt;
        &amp;quot;speaker&amp;quot;: &amp;quot;pikachu&amp;quot;,&lt;br /&gt;
        &amp;quot;lines&amp;quot;: [&lt;br /&gt;
          {&lt;br /&gt;
            &amp;quot;type&amp;quot;: &amp;quot;expression&amp;quot;,&lt;br /&gt;
            &amp;quot;expression&amp;quot;: &amp;quot;v.selected_option == &#039;hiroku&#039; ? &#039;Correct! You know things that you shouldn\\&#039;t...&#039; : (&#039;Wrong! I\\&#039;m not \&amp;quot;&#039; + v.selected_option + &#039;\&amp;quot;. Whoever that is.&#039;)&amp;quot;&lt;br /&gt;
          }&lt;br /&gt;
        ],&lt;br /&gt;
        &amp;quot;input&amp;quot;: {&lt;br /&gt;
          &amp;quot;type&amp;quot;: &amp;quot;auto-continue&amp;quot;,&lt;br /&gt;
          &amp;quot;delay&amp;quot;: 5,&lt;br /&gt;
          &amp;quot;allowSkip&amp;quot;: true,&lt;br /&gt;
          &amp;quot;action&amp;quot;: &amp;quot;q.dialogue.set_page(&#039;farewell&#039;);&amp;quot;&lt;br /&gt;
        }&lt;br /&gt;
      },&lt;br /&gt;
      {&lt;br /&gt;
        &amp;quot;id&amp;quot;: &amp;quot;farewell&amp;quot;,&lt;br /&gt;
        &amp;quot;speaker&amp;quot;: &amp;quot;pikachu&amp;quot;,&lt;br /&gt;
        &amp;quot;lines&amp;quot;: [&amp;quot;Anyway, I&#039;m done with this dialogue. Bye!&amp;quot;],&lt;br /&gt;
        &amp;quot;input&amp;quot;: &amp;quot;q.dialogue.close();&amp;quot;&lt;br /&gt;
      },&lt;br /&gt;
      {&lt;br /&gt;
        &amp;quot;id&amp;quot;: &amp;quot;too-slow&amp;quot;,&lt;br /&gt;
        &amp;quot;speaker&amp;quot;: &amp;quot;pikachu&amp;quot;,&lt;br /&gt;
        &amp;quot;lines&amp;quot;: [&amp;quot;Don&#039;t know? Sad. Well I don&#039;t know your name either, so I guess we&#039;re even.&amp;quot;],&lt;br /&gt;
        &amp;quot;input&amp;quot;: &amp;quot;q.dialogue.close()&amp;quot;&lt;br /&gt;
      }&lt;br /&gt;
    ]&lt;br /&gt;
  }&lt;/div&gt;</summary>
		<author><name>Hiroku</name></author>
	</entry>
	<entry>
		<id>https://wiki.cobblemon.com/index.php?title=Tutorials/Creating_A_Custom_Pokemon&amp;diff=5035</id>
		<title>Tutorials/Creating A Custom Pokemon</title>
		<link rel="alternate" type="text/html" href="https://wiki.cobblemon.com/index.php?title=Tutorials/Creating_A_Custom_Pokemon&amp;diff=5035"/>
		<updated>2024-11-09T23:22:12Z</updated>

		<summary type="html">&lt;p&gt;Hiroku: Fakemon generator update&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{TOC|right}}&lt;br /&gt;
== Preface ==&lt;br /&gt;
This beginner friendly step-by-step guide will walk you through adding custom Pokémon through resource and data packs. Cobblemon addons have certain requirements in order to work in Minecraft. There are several mistakes you can make along the way that can cause the game to crash. This tutorial was created in collaboration with Cobblemon community members who have made these mistakes.&lt;br /&gt;
&lt;br /&gt;
Knowledge of coding and resource packs is not necessary! In this tutorial, you will mostly be replacing data in existing file templates and building a custom Pokémon out of cubes. Experience with Blockbench is recommended, but never required! If at any point your addon is not working, you can look for help in the Cobblemon discord server.&lt;br /&gt;
&lt;br /&gt;
== Overview ==&lt;br /&gt;
This guide will teach you:&lt;br /&gt;
* How to format your models and animations&lt;br /&gt;
* Where to place your files&lt;br /&gt;
* How to configure stats for your Pokémon&lt;br /&gt;
* How to configure evolutions for your Pokémon&lt;br /&gt;
* How to configure spawning for your Pokémon&lt;br /&gt;
&lt;br /&gt;
What you will be creating are two things together; a resource pack and a data pack.&lt;br /&gt;
Resource packs primarily operate within the assets folder, while data packs operate within the data folder.&lt;br /&gt;
&lt;br /&gt;
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).&lt;br /&gt;
&lt;br /&gt;
In this guide we will be creating both as a single pack.&lt;br /&gt;
&lt;br /&gt;
As a brief summary:&lt;br /&gt;
* &amp;lt;code&amp;gt;Data packs&amp;lt;/code&amp;gt; as a stand-alone are useful for servers, as servers have no need for assets&lt;br /&gt;
* &amp;lt;code&amp;gt;Resource packs&amp;lt;/code&amp;gt; are useful for players playing on servers that already have the data&lt;br /&gt;
* 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. These combined data and resource files are often called &amp;lt;code&amp;gt;Addons&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
== Recommended Tools ==&lt;br /&gt;
While creating an addon can be done with a browser and some default PC tools, it&#039;s highly recommended that you download some of the following software. They can be very helpful if you want to make more than one custom Pokémon. &lt;br /&gt;
* &#039;&#039;&#039;Blockbench Desktop App&#039;&#039;&#039; - It will make accessing assets easier&lt;br /&gt;
* &#039;&#039;&#039;A Text Editor&#039;&#039;&#039; - They can be helpful for editing multiple files at once&lt;br /&gt;
** Recommendations:&lt;br /&gt;
**# Visual Studio Code&lt;br /&gt;
**# Notepad++&lt;br /&gt;
* &#039;&#039;&#039;Zip File Software&#039;&#039;&#039; - They can help you zip up your addon to be shared&lt;br /&gt;
** Recommendations:&lt;br /&gt;
**# 7zip&lt;br /&gt;
&amp;lt;/br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Cobblemon addons use a lot of &amp;lt;code&amp;gt;json&amp;lt;/code&amp;gt; files. These are human-readable sets of data for Minecraft to read. Here are some JSON terms to help you understand these files.&lt;br /&gt;
&amp;lt;/br&amp;gt;&lt;br /&gt;
&#039;&#039;&#039;JSON terminology&#039;&#039;&#039;&lt;br /&gt;
* &amp;lt;code&amp;gt;&amp;quot;key&amp;quot;: &amp;quot;value&amp;quot;&amp;lt;/code&amp;gt; - Property, aka &amp;quot;key-value pair&amp;quot;. &amp;lt;code&amp;gt;key&amp;lt;/code&amp;gt; must have quotes around it in JSON. &amp;lt;code&amp;gt;value&amp;lt;/code&amp;gt; can be any of the following:&lt;br /&gt;
* &amp;lt;code&amp;gt;{}&amp;lt;/code&amp;gt; - Object. contains properties, as above.&lt;br /&gt;
* &amp;lt;code&amp;gt;[]&amp;lt;/code&amp;gt; - Array. Is an ordered list of &amp;quot;entries&amp;quot; of any of the other data types.&lt;br /&gt;
* &amp;lt;code&amp;gt;&amp;quot;abc&amp;quot;&amp;lt;/code&amp;gt; - String. Quotes around any set of characters. Cannot have line returns in the middle of them.&lt;br /&gt;
* &amp;lt;code&amp;gt;1&amp;lt;/code&amp;gt; - Number. Doesn&#039;t have quotes. Some values can be decimal friendly. &lt;br /&gt;
* &amp;lt;code&amp;gt;true/false&amp;lt;/code&amp;gt; - Boolean. Doesn&#039;t have quotes. One of possibly either `true` or `false`&lt;br /&gt;
&amp;lt;/br&amp;gt;&lt;br /&gt;
&#039;&#039;&#039;JSON quirks&#039;&#039;&#039;&lt;br /&gt;
* Must have commas between properties.&lt;br /&gt;
* Cannot have commas after properties if there&#039;s not another property.&lt;br /&gt;
** You can&#039;t have any commas before any sort of closing bracket.&lt;br /&gt;
&lt;br /&gt;
== Creating a Custom Pokémon ==&lt;br /&gt;
=== Part 1: Arrange the folders for this addon ===&lt;br /&gt;
Due to some files sharing the same names later in this guide, you will be creating the folder structure and &amp;lt;code&amp;gt;pack.mcmeta&amp;lt;/code&amp;gt; now. This is to prevent confusion going forward. &lt;br /&gt;
&lt;br /&gt;
# Create a new text file and name it &amp;lt;code&amp;gt;pack.mcmeta&amp;lt;/code&amp;gt;&lt;br /&gt;
#* Ensure that it doesn&#039;t end in other file extensions like .txt. You may need to search &amp;quot;how to show file extensions&amp;quot; for whatever operating system you have.&lt;br /&gt;
#* This file tells Minecraft &amp;quot;this is a resourcepack/datapack&amp;quot;&lt;br /&gt;
# Open the file and insert the following data:&lt;br /&gt;
#* Hover over the underlined text to see more information.&lt;br /&gt;
 {&lt;br /&gt;
  &amp;quot;&amp;lt;abbr title=&amp;quot;This lets Minecraft know that it is a datapack&amp;quot;&amp;gt;pack&amp;lt;/abbr&amp;gt;&amp;quot;: {&lt;br /&gt;
    &amp;quot;&amp;lt;abbr title=&amp;quot;Here you will list the pack format number for a specific version of Minecraft&amp;quot;&amp;gt;pack_format&amp;lt;/abbr&amp;gt;&amp;quot;: &amp;lt;abbr title=&amp;quot;As of 1.20.1, the current resourcepack format number is 15. But it will still load if this number isn&#039;t correct!&amp;quot;&amp;gt;15&amp;lt;/abbr&amp;gt;,&lt;br /&gt;
    &amp;quot;&amp;lt;abbr title=&amp;quot;Here you will write a short description of your datapack&amp;quot;&amp;gt;description&amp;lt;/abbr&amp;gt;&amp;quot;: &amp;quot;&amp;lt;abbr title=&amp;quot;Your short datapack description&amp;quot;&amp;gt;Example description&amp;lt;/abbr&amp;gt;&amp;quot;&lt;br /&gt;
  }&lt;br /&gt;
 }&lt;br /&gt;
# &amp;lt;li value=3&amp;gt; Save the file and put it aside for now.&lt;br /&gt;
# Create a series of folders arranged like the following example:&lt;br /&gt;
==== Folder Structure ====&lt;br /&gt;
 &amp;lt;div class=&amp;quot;treeview&amp;quot;&amp;gt;&lt;br /&gt;
*&#039;&#039;(addon name)&#039;&#039;&lt;br /&gt;
** &#039;&#039;&#039;pack.mcmeta&#039;&#039;&#039;&lt;br /&gt;
**assets&lt;br /&gt;
***cobblemon&lt;br /&gt;
****bedrock&lt;br /&gt;
*****pokemon&lt;br /&gt;
******animations&lt;br /&gt;
*******&amp;lt;folder named after your pokemon&amp;gt;&lt;br /&gt;
******models&lt;br /&gt;
*******&amp;lt;folder named after your pokemon&amp;gt;&lt;br /&gt;
******posers&lt;br /&gt;
******resolvers&lt;br /&gt;
*******&amp;lt;folder named after your pokemon&amp;gt;&lt;br /&gt;
****lang&lt;br /&gt;
****textures&lt;br /&gt;
*****pokemon&lt;br /&gt;
******&amp;lt;folder named after your pokemon&amp;gt;&lt;br /&gt;
**data&lt;br /&gt;
***cobblemon&lt;br /&gt;
****spawn_pool_world&lt;br /&gt;
****species&lt;br /&gt;
*****custom&lt;br /&gt;
&amp;lt;/div&amp;gt;&amp;lt;/br&amp;gt;&lt;br /&gt;
After this folder tree for your addon is made, you can simply drop the files into the associated folders as you create them. &lt;br /&gt;
Remember that the &amp;lt;code&amp;gt;pack.mcmeta&amp;lt;/code&amp;gt; is a file, not a folder to add. It must be one folder deep in order for Minecraft to recognize this pack as a resource pack or data pack when in the appropriate game folders.&lt;br /&gt;
&lt;br /&gt;
=== Part 2: Create your Pokémon&#039;s assets in Blockbench ===&lt;br /&gt;
&#039;&#039;&#039;This is not a guide to Blockbench.&#039;&#039;&#039; This &#039;&#039;&#039;extensive&#039;&#039;&#039; part of the tutorial will guide you in the creation of a compatible Cobblemon model. Cobblemon models have certain requirements in order to work in Minecraft. There are several mistakes you might make when creating a model which may result in you having to start all over.&lt;br /&gt;
&lt;br /&gt;
This part of the guide is a slightly watered down version of the [[Tutorials/Creating A Model|model creation tutorial]] to keep things more beginner friendly.&lt;br /&gt;
&lt;br /&gt;
==== Step 1: Get access to Blockbench ====&lt;br /&gt;
Blockbench is a free 3D Modeling program capable of doing everything you need to make a Cobblemon model. You can create a model, paint it, and animate it all at the same time using Blockbench. Watching some Blockbench tutorials before getting started is recommended.&lt;br /&gt;
&lt;br /&gt;
# Open your browser and go to https://www.blockbench.net&lt;br /&gt;
# &amp;lt;code&amp;gt;DOWNLOAD&amp;lt;/code&amp;gt; the app &#039;&#039;&#039;or&#039;&#039;&#039; click on &amp;lt;code&amp;gt;OPEN WEB APP&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Blockbench can also be used on mobile devices!&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Disclaimer&#039;&#039;&#039;: This guide is tailored towards the Blockbench app on PC.&lt;br /&gt;
&lt;br /&gt;
==== Step 2: Create the model file ====&lt;br /&gt;
You will be creating the project file in Blockbench. Although this step seems simple, if you choose the wrong model type or UV mode then it will not work with Cobblemon&#039;s custom Pokémon system. &lt;br /&gt;
&lt;br /&gt;
# Open up Blockbench &lt;br /&gt;
# Click on File &amp;gt; New &amp;gt; Bedrock Entity&lt;br /&gt;
# &#039;&#039;&#039;In lowercase only&#039;&#039;&#039;, type the name of your custom Pokémon in both &amp;lt;code&amp;gt;File Name&amp;lt;/code&amp;gt; and &amp;lt;code&amp;gt;Model Identifier&amp;lt;/code&amp;gt;&lt;br /&gt;
# Make sure Default UV Mode is set to &amp;lt;code&amp;gt;Box UV&amp;lt;/code&amp;gt;&lt;br /&gt;
# Leave &amp;lt;code&amp;gt;Texture Size&amp;lt;/code&amp;gt; alone&lt;br /&gt;
# Click &amp;lt;code&amp;gt;Confirm&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
You have created the foundation of your model file!&lt;br /&gt;
&lt;br /&gt;
Despite being for the Java version of Minecraft, Cobblemon uses Bedrock entities to allow for flexible animations. &lt;br /&gt;
&lt;br /&gt;
==== Step 3: Creating cubes the right way ====&lt;br /&gt;
There are many ways to create a Pokémon model. There is no “right way” to make a cube to build your design; however, &#039;&#039;&#039;there are several things that can break your model involving these cubes.&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Before you get started, you should know that there are several things you should &#039;&#039;&#039;never&#039;&#039;&#039; do when creating cubes. As you create your model, keep the following tips in mind:&lt;br /&gt;
* &#039;&#039;&#039;Don&#039;t&#039;&#039;&#039; use capital letters when naming your cubes or groups. Minecraft might crash trying to read them.&lt;br /&gt;
** &#039;&#039;&#039;Always stick with lowercase letters when naming things!&#039;&#039;&#039;&lt;br /&gt;
* &#039;&#039;&#039;Don&#039;t&#039;&#039;&#039; use decimals in &amp;lt;code&amp;gt;Size&amp;lt;/code&amp;gt; values! Minecraft can&#039;t handle &amp;quot;2.5&amp;quot; pixels properly. &lt;br /&gt;
** These decimal values will get rounded up or down in game and break the geometry. &lt;br /&gt;
** &amp;lt;code&amp;gt;Position&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;Inflate&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;Pivot Point&amp;lt;/code&amp;gt;, and &amp;lt;code&amp;gt;Rotation&amp;lt;/code&amp;gt; values can use decimals without issues.&lt;br /&gt;
* &#039;&#039;&#039;Don&#039;t&#039;&#039;&#039; change the UV Mode of the cube. They should all be “Box UV” by default. &lt;br /&gt;
** If just one cube is changed to Per-face UV, the whole resource pack will refuse to load. &lt;br /&gt;
* &#039;&#039;&#039;Don&#039;t&#039;&#039;&#039; forget to save! It can take hours or days to make your model. Save often!&lt;br /&gt;
* Make sure your model is facing &amp;lt;code&amp;gt;North&amp;lt;/code&amp;gt;! &#039;&#039;&#039;It should be facing towards the N on the floor.&#039;&#039;&#039; &lt;br /&gt;
** It may walk backwards or sideways in game if not facing North. &lt;br /&gt;
* Your model does not always need to be on a 1 to 1 scale. It can be sized down in game to affect texture details.&amp;lt;/br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
With that in mind, you can start creating cubes in Blockbench!&lt;br /&gt;
# Create a cube by clicking the &amp;lt;code&amp;gt;Add Cube&amp;lt;/code&amp;gt; button under &amp;quot;Outliner&amp;quot; or press Ctrl + N&lt;br /&gt;
# Change the elements of this cube as needed&lt;br /&gt;
# Repeat these steps when more cubes are needed to build your model&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Tip&#039;&#039;&#039;: You can change one of the size values to 0 to create a 2D plane. These are usually called &amp;lt;code&amp;gt;panes&amp;lt;/code&amp;gt; and can be used to create flat textures for certain situations. Remember to paint the back side of these panes!&lt;br /&gt;
&lt;br /&gt;
==== Step 4: Arrange your cubes into &amp;quot;bones&amp;quot; ====&lt;br /&gt;
As you create the cubes for your model, you will want group them into folders. These groups of cubes are called &amp;lt;code&amp;gt;bones&amp;lt;/code&amp;gt;. Only bones can be selected in the &amp;lt;code&amp;gt;Animate&amp;lt;/code&amp;gt; tab. Bones can even go inside of other bones. You are essentially building a skeleton. Sort these bones out to make animating the model easier later on. &lt;br /&gt;
[[File:Example_of_Arm.png|thumb|350px|caption|Sceptile&#039;s arm bone structure.]]&lt;br /&gt;
# Decide which cubes should be grouped together as a &amp;lt;code&amp;gt;bone&amp;lt;/code&amp;gt;.&amp;lt;/br&amp;gt;example: grouping several cubes together to make a &amp;quot;foot&amp;quot; bone. Then grouping other cubes to make a &amp;quot;leg&amp;quot; bone.&lt;br /&gt;
# Create a group by clicking the &amp;lt;code&amp;gt;Add Group&amp;lt;/code&amp;gt; button under &amp;quot;Outliner&amp;quot; or press Ctrl + G&lt;br /&gt;
# Name this new bone. It is recommended to use names of body parts like arm, arm 2, hand, etc.&lt;br /&gt;
# Click and drag associated cubes into this new bone folder.&lt;br /&gt;
# Assign an appropriate pivot point to this new bone. This controls the location it will rotate from. &lt;br /&gt;
# Repeat these steps when more bones are needed for animation&lt;br /&gt;
&lt;br /&gt;
Bones can use the same properties under the &amp;quot;Element&amp;quot; section. How you use these properties with bones is up to you. You can reference official models that have a similar body type to your custom Pokémon.&lt;br /&gt;
&lt;br /&gt;
==== Step 5: Arranging your bones the right way ====&lt;br /&gt;
There are many ways to create a Pokémon model. Unfortunately, there is a &amp;quot;right way&amp;quot; to arrange your bones so it won&#039;t break something in game; however, &#039;&#039;&#039;this will never restrict your creative freedom!&#039;&#039;&#039; There are only 2 &amp;quot;bones&amp;quot; required to make your model functional with Cobblemon and it shouldn&#039;t interfere with your design. &lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;You may want to come back to these steps after creating all of the cubes necessary to make your model complete&#039;&#039;&#039;&lt;br /&gt;
[[File:CharmanderAndItsBones.png|thumb|350px|caption|Charmander with its &amp;quot;root folder&amp;quot; and &amp;quot;head&amp;quot; bone.]]&lt;br /&gt;
# Create a new bone group and name this folder after your custom Pokémon&lt;br /&gt;
# Drag all bones and cubes into this new folder until it holds everything.&lt;br /&gt;
#*This folder that holds everything is known as the &amp;lt;code&amp;gt;root folder&amp;lt;/code&amp;gt;&lt;br /&gt;
# Ensure the XYZ Pivot Point values of the root folder are all at 0.&lt;br /&gt;
#* This stops the model from sinking into the ground in game. &lt;br /&gt;
# Create or pick the &amp;lt;code&amp;gt;head&amp;lt;/code&amp;gt; bone for your Pokémon. &lt;br /&gt;
#*This will be the bone that rotates when it uses the &amp;quot;look&amp;quot; animation.&lt;br /&gt;
#* Sometimes a Pokémon wont have a traditional head like Spheal for example. You&#039;ll have to get creative with which bone shall be the head bone. &lt;br /&gt;
# Ensure this head bone is named &amp;lt;code&amp;gt;head&amp;lt;/code&amp;gt;.&lt;br /&gt;
#* You mostly name it &amp;quot;head&amp;quot; for simplicity with the &amp;lt;code&amp;gt;poser file&amp;lt;/code&amp;gt;.&lt;br /&gt;
#* If your Pokémon is shaped differently, then just remember to use the name of the bone that works best in its poser file.&lt;br /&gt;
&lt;br /&gt;
The root folder is crucial for making the in-game model&#039;s position look exactly the way it does in Blockbench. If the Pivot values are not 0, then it will shift in some direction. &lt;br /&gt;
&lt;br /&gt;
Having a head bone allows the Pokémon to use the look animation without issues. In the past, many creators have unknowingly assigned the head bone as &amp;quot;head&amp;quot; in their poser files despite not having an actual bone with that name in their model. &#039;&#039;&#039;If the model did not have this matching &amp;lt;code&amp;gt;head&amp;lt;/code&amp;gt; bone, the game would crash!&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
==== Step 6: Create your textures ====&lt;br /&gt;
This step will only help you with the creation of the files. Any artistic help will have to be sourced from somewhere else. It is recommended to watch some tutorials or ask for help in the Cobblemon discord server. &lt;br /&gt;
[[File:PaintingACharmander.png|thumb|450px|caption|Charmander getting painted in Blockbench.]]&lt;br /&gt;
# Click on &amp;quot;Create Texture&amp;quot; or press Ctrl+Shift+T.&lt;br /&gt;
# Name the texture after your Pokémon.&lt;br /&gt;
# Ensure Pixel Density is set to &amp;lt;code&amp;gt;16x&amp;lt;/code&amp;gt;&lt;br /&gt;
#* Other densities may break textures. &lt;br /&gt;
#* The model can later be sized up or down to affect details.&lt;br /&gt;
# Click confirm. The default settings are usually fine. &lt;br /&gt;
# Navigate to the &amp;lt;code&amp;gt;Paint&amp;lt;/code&amp;gt; tab in the top-right corner of Blockbench&lt;br /&gt;
# Paint the model until satisfied.&lt;br /&gt;
# Click the Save icon on your texture, or press Ctrl+S&lt;br /&gt;
# Make sure the PNG is called &amp;lt;code&amp;gt;&amp;lt;pokemon&amp;gt;.png&amp;lt;/code&amp;gt;&lt;br /&gt;
# Place this PNG in your Pokémon&#039;s &amp;lt;code&amp;gt;texture&amp;lt;/code&amp;gt; folder of your addon.&lt;br /&gt;
#* The folder path for this PNG should be like so: &amp;lt;/br&amp;gt;&amp;lt;code&amp;gt; &amp;lt;your_addon&amp;gt;/assets/cobblemon/textures/pokemon/&amp;lt;your_pokemon&amp;gt;/&amp;lt;pokemon&amp;gt;.png &amp;lt;/code&amp;gt;&lt;br /&gt;
# Repeat these steps for the shiny texture. (optional)&lt;br /&gt;
&lt;br /&gt;
==== Step 7: Animate your Pokémon ====&lt;br /&gt;
Again, this step will only help you with the creation of the files. Animations are not required to make your Pokémon work in game. This step may be skipped.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Remember that animations can only select bones. And if you change the bone names during or after this process, then you need to update your animations!&#039;&#039;&#039;&lt;br /&gt;
# Navigate to the &amp;lt;code&amp;gt;Animate&amp;lt;/code&amp;gt; tab in the top-right corner of Blockbench&lt;br /&gt;
# Under the &amp;quot;ANIMATIONS&amp;quot; section, click the &amp;lt;code&amp;gt;Add Animation&amp;lt;/code&amp;gt; button.&lt;br /&gt;
# Name your animation &amp;lt;code&amp;gt;animation.&amp;lt;pokemon&amp;gt;.&amp;lt;animation type&amp;gt;&amp;lt;/code&amp;gt;&lt;br /&gt;
#* There is a list of animation type examples below&lt;br /&gt;
#* A full list of animation types that the developers make can be found [[Tutorials/Creating_A_Model#Step_7:_Animate_your_Pokémon| here.]]&lt;br /&gt;
# Select a desired loop mode. This can be changed later.&lt;br /&gt;
# Click &amp;lt;code&amp;gt;Confirm&amp;lt;/code&amp;gt;&lt;br /&gt;
# Animate your Pokémon until satisfied. &lt;br /&gt;
# Repeat the previous steps to create new animations.&lt;br /&gt;
# Save your animations as a group. Click on the top-most save icon.&lt;br /&gt;
# Name this animation JSON &amp;lt;code&amp;gt;&amp;lt;pokemon&amp;gt;.animation.json&amp;lt;/code&amp;gt;&lt;br /&gt;
# Place this animation JSON in your Pokémon&#039;s &amp;lt;code&amp;gt;animation&amp;lt;/code&amp;gt; folder of your addon.&lt;br /&gt;
#* The folder path for this JSON should be like so: &amp;lt;/br&amp;gt;&amp;lt;code&amp;gt;&amp;lt;your_addon&amp;gt;/assets/cobblemon/bedrock/pokemon/animations/&amp;lt;your_pokemon&amp;gt;/&amp;lt;pokemon&amp;gt;.animation.json&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Cobblemon has a limited selection of Pose types that animations can use in game. You should at least create some core animations like idles, walks, and faints. You can name your animations using the following naming scheme. &lt;br /&gt;
&lt;br /&gt;
Beginner list of Poses and animations you should make for your Pokemon:&lt;br /&gt;
* &amp;quot;STAND&amp;quot; - &amp;lt;code&amp;gt;animation.&amp;lt;pokemon&amp;gt;.ground_idle&amp;lt;/code&amp;gt;&lt;br /&gt;
* &amp;quot;WALK&amp;quot; - &amp;lt;code&amp;gt;animation.&amp;lt;pokemon&amp;gt;.ground_walk&amp;lt;/code&amp;gt;&lt;br /&gt;
* &amp;quot;faint&amp;quot; - &amp;lt;code&amp;gt;animation.&amp;lt;pokemon&amp;gt;.faint&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
The full list of usable pose types and the animations that work with them can be found on the full version of the [[Tutorials/Creating_A_Model#Step_7:_Animate_your_Pokémon| model guide.]]&lt;br /&gt;
&lt;br /&gt;
==== Step 8: Export Bedrock Geometry ====&lt;br /&gt;
By now, you should already have your textures and animations saved somewhere. All that&#039;s left is to export your model file. Afterwards, everything you have made should be ready to use in resource packs!&lt;br /&gt;
&lt;br /&gt;
# Click on File &amp;gt; Export &amp;gt; Export Bedrock Geometry&lt;br /&gt;
# Name this file &amp;lt;code&amp;gt;&amp;lt;pokemon&amp;gt;.geo.json&amp;lt;/code&amp;gt;&lt;br /&gt;
# Place this model JSON in your Pokémon&#039;s &amp;lt;code&amp;gt;model&amp;lt;/code&amp;gt; folder of your addon.&lt;br /&gt;
#* The folder path for this JSON should be like so: &amp;lt;/br&amp;gt;&amp;lt;code&amp;gt;&amp;lt;your_addon&amp;gt;/assets/cobblemon/bedrock/pokemon/models/&amp;lt;your_pokemon&amp;gt;/&amp;lt;pokemon&amp;gt;.geo.json &amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
This step is done last in case any edits needed to be made to the model. &lt;br /&gt;
&lt;br /&gt;
Congratulations! You should now have a model, textures, and animations, which is most of the work for creating a custom Pokémon. Provided you followed this guide, your model should not be causing any issues when put in game.&lt;br /&gt;
&lt;br /&gt;
=== Part 3: Create your Pokémon&#039;s Poser file ===&lt;br /&gt;
&amp;lt;code&amp;gt;Posers&amp;lt;/code&amp;gt; are JSON files that create a set of animations for a Pokémon to use. 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! &lt;br /&gt;
&lt;br /&gt;
You will be creating a poser file for the idle, walk, and faint animation you should have created if following this guide. &#039;&#039;&#039;Later in this guide&#039;&#039;&#039;, you will have to come back and edit some of the &amp;lt;code&amp;gt;portrait&amp;lt;/code&amp;gt; and &amp;lt;code&amp;gt;profile&amp;lt;/code&amp;gt; values in the file so they look nice in the menus!&lt;br /&gt;
&lt;br /&gt;
# Create a new text file and name it after your Pokémon. Include the file extension of &amp;lt;code&amp;gt;.json&amp;lt;/code&amp;gt;&lt;br /&gt;
#* Example: &amp;lt;code&amp;gt;bulbasaur.json&amp;lt;/code&amp;gt;&lt;br /&gt;
#* Make sure this new file name ends in .json and not any other file extension like .txt. You may need to search &amp;quot;how to show file extensions&amp;quot; for whatever operating system you have.&lt;br /&gt;
# Open this new JSON in your preferred text editor&lt;br /&gt;
# Copy and paste this entire poser example into the JSON&lt;br /&gt;
#* Hover over the underlined text to see more information.&lt;br /&gt;
 {&lt;br /&gt;
  &amp;quot;&amp;lt;abbr title=&amp;quot;Tells the game which bone is the head. In this case, the head bone is simply named head.&amp;quot;&amp;gt;head&amp;lt;/abbr&amp;gt;&amp;quot;: &amp;quot;&amp;lt;abbr title=&amp;quot;The bone from your model that will act as the head for the look animation that plays when a Pokémon wants to look in certain directions. Can be any other appropriate bone and not all Pokémon need to do this!&amp;quot;&amp;gt;head&amp;lt;/abbr&amp;gt;&amp;quot;,&lt;br /&gt;
  &amp;quot;&amp;lt;abbr title=&amp;quot;These refer to the portraits on the party menu on the left side of the screen. 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 with F3 + T for quick edits.)&amp;quot;&amp;gt;portraitScale&amp;quot;: 1&amp;lt;/abbr&amp;gt;,&lt;br /&gt;
  &amp;quot;&amp;lt;abbr title=&amp;quot;These refer to the portraits on the party menu on the left side of the screen. 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 with F3 + T for quick edits.)&amp;quot;&amp;gt;portraitTranslation&amp;quot;: [ 0, 0.5, 0 ]&amp;lt;/abbr&amp;gt;,&lt;br /&gt;
  &amp;quot;&amp;lt;abbr title=&amp;quot;These refer to the full body view of the Pokémon often seen in GUI, but most notably the summary UI. Like the previous code block, this section will require some trial and error, and you should come back to edit this later. (Tip: you can refresh your resource pack with F3 + T for quick edits.)&amp;quot;&amp;gt;profileScale&amp;quot;: 1&amp;lt;/abbr&amp;gt;,&lt;br /&gt;
  &amp;quot;&amp;lt;abbr title=&amp;quot;These refer to the full body view of the Pokémon often seen in GUI, but most notably the summary UI. Like the previous code block, this section will require some trial and error, and you should come back to edit this later. (Tip: you can refresh your resource pack with F3 + T for quick edits.)&amp;quot;&amp;gt;profileTranslation&amp;quot;: [ 0, 0.4, 0 ]&amp;lt;/abbr&amp;gt;,&lt;br /&gt;
  &amp;quot;&amp;lt;abbr title=&amp;quot;This points to the faint animation for this Pokémon. If you have no faint animation, you can delete this line.&amp;quot;&amp;gt;faint&amp;lt;/abbr&amp;gt;&amp;quot;: &amp;quot;&amp;lt;abbr title=&amp;quot;The animation you are telling it to use when your Pokémon faints. If you have correctly named all your files and animations, this should be as simple as changing &#039;pokemon&#039; to be your Pokémon’s name.&amp;quot;&amp;gt;bedrock(pokemon, faint)&amp;lt;/abbr&amp;gt;&amp;quot;,&lt;br /&gt;
  &amp;quot;&amp;lt;abbr title=&amp;quot;Here we are defining a list of our poses.&amp;quot;&amp;gt;poses&amp;lt;/abbr&amp;gt;&amp;quot;: {&lt;br /&gt;
    &amp;quot;&amp;lt;abbr title=&amp;quot;Here we are defining the name of the pose.&amp;quot;&amp;gt;standing&amp;lt;/abbr&amp;gt;&amp;quot;: {&lt;br /&gt;
      &amp;quot;&amp;lt;abbr title=&amp;quot;Here we are again defining the name of the pose.&amp;quot;&amp;gt;poseName&amp;lt;/abbr&amp;gt;&amp;quot;: &amp;quot;&amp;lt;abbr title=&amp;quot;The name of your pose. In this case, its called standing&amp;quot;&amp;gt;standing&amp;lt;/abbr&amp;gt;&amp;quot;,&lt;br /&gt;
      &amp;quot;&amp;lt;abbr title=&amp;quot;This is transition time between animations. You probably won&#039;t need to mess with this.&amp;gt;transformTicks&amp;quot;: 10&amp;lt;/abbr&amp;gt;,&lt;br /&gt;
      &amp;quot;&amp;lt;abbr title=&amp;quot;Here, we are telling the game when this animation will take place.&amp;quot;&amp;gt;poseTypes&amp;lt;/abbr&amp;gt;&amp;quot;: [&lt;br /&gt;
        &amp;quot;&amp;lt;abbr title=&amp;quot;One of the pose types that will use the following animation. STAND - when stationary on the ground&amp;quot;&amp;gt;STAND&amp;lt;/abbr&amp;gt;&amp;quot;,&lt;br /&gt;
        &amp;quot;&amp;lt;abbr title=&amp;quot;One of the pose types that will use the following animation. NONE - when not doing anything at all&amp;quot;&amp;gt;NONE&amp;lt;/abbr&amp;gt;&amp;quot;,&lt;br /&gt;
        &amp;quot;&amp;lt;abbr title=&amp;quot;One of the pose types that will use the following animation. PORTRAIT - when in a portrait like on your party UI&amp;quot;&amp;gt;PORTRAIT&amp;lt;/abbr&amp;gt;&amp;quot;,&lt;br /&gt;
        &amp;quot;&amp;lt;abbr title=&amp;quot;One of the pose types that will use the following animation. PROFILE - when in summary screens&amp;quot;&amp;gt;PROFILE&amp;lt;/abbr&amp;gt;&amp;quot;&lt;br /&gt;
      ],&lt;br /&gt;
      &amp;quot;&amp;lt;abbr title=&amp;quot;Here you will list which animations will play during these poses.&amp;quot;&amp;gt;animations&amp;lt;/abbr&amp;gt;&amp;quot;: [&lt;br /&gt;
        &amp;quot;&amp;lt;abbr title=&amp;quot;Allows the Pokémon to move its head around to observe its surroundings. You can delete this if your Pokémon doesn&#039;t have a head bone, or you just don&#039;t want them looking around.&amp;quot;&amp;gt;look&amp;lt;/abbr&amp;gt;&amp;quot;,&lt;br /&gt;
        &amp;quot;&amp;lt;abbr title=&amp;quot;The animation you are telling it to use when your Pokémon is standing, doing nothing, or in the mod&#039;s UI. If you have correctly named all your files and animations, this should be as simple as changing &#039;pokemon&#039; to be your Pokémon’s name.&amp;quot;&amp;gt;bedrock(pokemon, ground_idle)&amp;lt;/abbr&amp;gt;&amp;quot;&lt;br /&gt;
      ]&lt;br /&gt;
    },&lt;br /&gt;
    &amp;quot;&amp;lt;abbr title=&amp;quot;Here we are defining the name of the pose.&amp;quot;&amp;gt;walking&amp;lt;/abbr&amp;gt;&amp;quot;: {&lt;br /&gt;
      &amp;quot;&amp;lt;abbr title=&amp;quot;Here we are again defining the name of the pose.&amp;quot;&amp;gt;poseName&amp;lt;/abbr&amp;gt;&amp;quot;: &amp;quot;&amp;lt;abbr title=&amp;quot;The name of your pose. In this case, its called walking&amp;quot;&amp;gt;walking&amp;lt;/abbr&amp;gt;&amp;quot;,&lt;br /&gt;
      &amp;quot;&amp;lt;abbr title=&amp;quot;This is transition time between animations. You probably won&#039;t need to mess with this.&amp;gt;transformTicks&amp;quot;: 10&amp;lt;/abbr&amp;gt;,&lt;br /&gt;
      &amp;quot;&amp;lt;abbr title=&amp;quot;Here, we are telling the game when this animation will take place.&amp;quot;&amp;gt;poseTypes&amp;lt;/abbr&amp;gt;&amp;quot;: [ &amp;quot;&amp;lt;abbr title=&amp;quot;One of the pose types that will use the following animation. WALK - when traveling on the ground&amp;quot;&amp;gt;WALK&amp;lt;/abbr&amp;gt;&amp;quot; ],&lt;br /&gt;
      &amp;quot;&amp;lt;abbr title=&amp;quot;Here you will list which animations will play during these poses.&amp;quot;&amp;gt;animations&amp;lt;/abbr&amp;gt;&amp;quot;: [ &amp;quot;&amp;lt;abbr title=&amp;quot;The animation you are telling it to use when your Pokémon is walking on land. If you have correctly named all your files and animations, this should be as simple as changing &#039;pokemon&#039; to be your Pokémon’s name.&amp;quot;&amp;gt;bedrock(pokemon, ground_walk)&amp;lt;/abbr&amp;gt;&amp;quot; ]&lt;br /&gt;
    }&lt;br /&gt;
  }&lt;br /&gt;
 }&lt;br /&gt;
# &amp;lt;li value=4&amp;gt; In the section for &amp;lt;code&amp;gt;&amp;quot;faint&amp;quot;&amp;lt;/code&amp;gt;, change &amp;quot;pokemon&amp;quot; in &amp;lt;code&amp;gt;&amp;quot;bedrock(pokemon, faint)&amp;quot;&amp;lt;/code&amp;gt; to be your Pokémon&#039;s name.&lt;br /&gt;
#* Don&#039;t put the name in quotes.&lt;br /&gt;
# In the section for &amp;lt;code&amp;gt;&amp;quot;standing&amp;quot;&amp;lt;/code&amp;gt;, change &amp;quot;pokemon&amp;quot; in &amp;lt;code&amp;gt;&amp;quot;bedrock(pokemon, ground_idle)&amp;quot;&amp;lt;/code&amp;gt; to be your Pokémon&#039;s name.&lt;br /&gt;
#* Don&#039;t put the name in quotes.&lt;br /&gt;
# In the section for &amp;lt;code&amp;gt;&amp;quot;walking&amp;quot;&amp;lt;/code&amp;gt;, change &amp;quot;pokemon&amp;quot; in &amp;lt;code&amp;gt;&amp;quot;bedrock(pokemon, ground_walk)&amp;quot;&amp;lt;/code&amp;gt; to be your Pokémon&#039;s name.&lt;br /&gt;
#* Don&#039;t put the name in quotes.&lt;br /&gt;
# Save the file&lt;br /&gt;
# Place this new poser JSON into the &amp;lt;code&amp;gt;posers&amp;lt;/code&amp;gt; folder of your addon. &lt;br /&gt;
&lt;br /&gt;
You just created the poser file! When it&#039;s time to test your addon in game, it should use the animations you created earlier. &lt;br /&gt;
&lt;br /&gt;
=== Part 4: Create your Pokémon&#039;s Resolver file ===&lt;br /&gt;
&amp;lt;code&amp;gt;Resolvers&amp;lt;/code&amp;gt; are JSON files that assign a Pokémon its &amp;lt;code&amp;gt;model&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;textures&amp;lt;/code&amp;gt;, and &amp;lt;code&amp;gt;animations&amp;lt;/code&amp;gt;. The resolver files control all the things that allow a Pokémon to function visually!&lt;br /&gt;
&lt;br /&gt;
You will be creating the resolver file for your Pokémon. At this part of the guide, you should already have files for model, texture, animation, and poser. Now they just need to be linked to your Pokémon using the resolver file.&lt;br /&gt;
&lt;br /&gt;
# Create a new text file and name it &amp;lt;code&amp;gt;&amp;quot;0_&amp;lt;pokemon&amp;gt;_base.json&amp;quot;&amp;lt;/code&amp;gt;&lt;br /&gt;
#* Example: &amp;lt;code&amp;gt;0_treecko_base.json&amp;lt;/code&amp;gt;&lt;br /&gt;
#* Make sure this new file name ends in .json and not any other file extension like .txt. You may need to search &amp;quot;how to show file extensions&amp;quot; for whatever operating system you have.&lt;br /&gt;
# Open this new JSON in your preferred text editor&lt;br /&gt;
# Copy and paste this entire resolver example into the JSON&lt;br /&gt;
#*Hover over the underlined text to see more information.&lt;br /&gt;
 {&lt;br /&gt;
  &amp;quot;&amp;lt;abbr title=&amp;quot;Here you are saying what Pokémon species will get the following assets&amp;quot;&amp;gt;species&amp;lt;/abbr&amp;gt;&amp;quot;: &amp;quot;&amp;lt;abbr title=&amp;quot;In this example, Treecko will get the following assets. You will want to change &#039;treecko&#039; to be your Pokémon&#039;s name&amp;quot;&amp;gt;cobblemon:treecko&amp;lt;/abbr&amp;gt;&amp;quot;,&lt;br /&gt;
  &amp;quot;&amp;lt;abbr title=&amp;quot;This is the load order of the forms in this file. Since this file contains the default variants for this Pokémon, load order should be 0. Addons may create more forms later, and they will use a higher number. This is what &#039;0_&#039; and &#039;_base&#039; in the file name represent. &#039;0_&#039; represents the load order, and &#039;_base&#039; represents that these are the default forms.&amp;quot;&amp;gt;order&amp;quot;: 0&amp;lt;/abbr&amp;gt;,&lt;br /&gt;
  &amp;quot;&amp;lt;abbr title=&amp;quot;Here you will list all of your Pokémon&#039;s visual variations. This is how the shiny version uses the same model but with a different texture.&amp;quot;&amp;gt;variations&amp;lt;/abbr&amp;gt;&amp;quot;: [&lt;br /&gt;
    {&lt;br /&gt;
      &amp;quot;&amp;lt;abbr title=&amp;quot;&#039;Aspects&#039; are traits a Pokémon has. In this section, we are determining what the Pokémon will look like if it has no aspects. This can be considered the &#039;default&#039; assets.&amp;quot;&amp;gt;aspects&amp;quot;: []&amp;lt;/abbr&amp;gt;,&lt;br /&gt;
      &amp;quot;&amp;lt;abbr title=&amp;quot;Here you are telling the Pokémon what poser file to use.&amp;quot;&amp;gt;poser&amp;lt;/abbr&amp;gt;&amp;quot;: &amp;quot;&amp;lt;abbr title=&amp;quot;In this example, it will use the treecko poser. You will want to change &#039;treecko&#039; to be your Pokémon&#039;s name&amp;quot;&amp;gt;cobblemon:treecko&amp;lt;/abbr&amp;gt;&amp;quot;,&lt;br /&gt;
      &amp;quot;&amp;lt;abbr title=&amp;quot;Here you are telling the Pokémon what model file to use.&amp;quot;&amp;gt;model&amp;lt;/abbr&amp;gt;&amp;quot;: &amp;quot;&amp;lt;abbr title=&amp;quot;In this example, it will use the treecko model. You will want to change &#039;treecko&#039; to be your Pokémon&#039;s name&amp;quot;&amp;gt;cobblemon:treecko.geo&amp;lt;/abbr&amp;gt;&amp;quot;,&lt;br /&gt;
      &amp;quot;&amp;lt;abbr title=&amp;quot;Here you are telling the Pokémon what texture PNG to use.&amp;quot;&amp;gt;texture&amp;lt;/abbr&amp;gt;&amp;quot;: &amp;quot;&amp;lt;abbr title=&amp;quot;In this example, it will use &#039;treecko.png&#039; from the &#039;treecko&#039; folder. You will want to change both instances of &#039;treecko&#039; to be your Pokémon&#039;s name&amp;quot;&amp;gt;cobblemon:textures/pokemon/treecko/treecko.png&amp;lt;/abbr&amp;gt;&amp;quot;,&lt;br /&gt;
      &amp;quot;&amp;lt;abbr title=&amp;quot;This can be used to add additional textures on top of the main texture like with emissive textures or Arbok&#039;s chest patterns. This is unfortunately not covered in this guide.&amp;quot;&amp;gt;layers&amp;quot;: []&amp;lt;/abbr&amp;gt;&lt;br /&gt;
    },&lt;br /&gt;
    {&lt;br /&gt;
      &amp;quot;&amp;lt;abbr title=&amp;quot;In this section, we are determining what the Pokémon will look like if it is &#039;shiny&#039;.&amp;quot;&amp;gt;aspects&amp;lt;/abbr&amp;gt;&amp;quot;: [&lt;br /&gt;
        &amp;quot;&amp;lt;abbr title=&amp;quot;Here you are specifying that any shiny Treecko will use the following texture. If you don&#039;t list a model or poser like this example, then it will use the &#039;default&#039; ones that you created above.&amp;quot;&amp;gt;shiny&amp;lt;/abbr&amp;gt;&amp;quot;&lt;br /&gt;
      ],&lt;br /&gt;
      &amp;quot;&amp;lt;abbr title=&amp;quot;Here you are telling the shiny Pokémon what texture PNG to use. The texture will be applied to the default model in this example.&amp;quot;&amp;gt;texture&amp;lt;/abbr&amp;gt;&amp;quot;: &amp;quot;&amp;lt;abbr title=&amp;quot;In this example, it will use &#039;treecko_shiny.png&#039; from the &#039;treecko&#039; folder. You will want to change both instances of &#039;treecko&#039; to be your Pokémon&#039;s name&amp;quot;&amp;gt;cobblemon:textures/pokemon/treecko/treecko_shiny.png&amp;lt;/abbr&amp;gt;&amp;quot;&lt;br /&gt;
    }&lt;br /&gt;
  ]&lt;br /&gt;
 }&lt;br /&gt;
# &amp;lt;li value=4&amp;gt; In the section for &amp;lt;code&amp;gt;&amp;quot;species&amp;quot;&amp;lt;/code&amp;gt;, change &amp;quot;treecko&amp;quot; in &amp;lt;code&amp;gt;&amp;quot;cobblemon:treecko&amp;quot;&amp;lt;/code&amp;gt; to be your Pokémon&#039;s name.&lt;br /&gt;
# In the section for &amp;lt;code&amp;gt;&amp;quot;poser&amp;quot;&amp;lt;/code&amp;gt;, change &amp;quot;treecko&amp;quot; in &amp;lt;code&amp;gt;&amp;quot;cobblemon:treecko&amp;quot;&amp;lt;/code&amp;gt; to be your Pokémon&#039;s name.&lt;br /&gt;
# In the section for &amp;lt;code&amp;gt;&amp;quot;model&amp;quot;&amp;lt;/code&amp;gt;, change &amp;quot;treecko&amp;quot; in &amp;lt;code&amp;gt;&amp;quot;cobblemon:treecko.geo&amp;quot;&amp;lt;/code&amp;gt; to be your Pokémon&#039;s name.&lt;br /&gt;
# In the section for &amp;lt;code&amp;gt;&amp;quot;textures&amp;quot;&amp;lt;/code&amp;gt;, change &#039;&#039;&#039;both instances&#039;&#039;&#039; of &amp;quot;treecko&amp;quot; in &amp;lt;code&amp;gt;&amp;quot;cobblemon:textures/pokemon/treecko/treecko.png&amp;quot;&amp;lt;/code&amp;gt; to be your Pokémon&#039;s name.&lt;br /&gt;
# Under the &amp;lt;code&amp;gt;&amp;quot;shiny&amp;quot;&amp;lt;/code&amp;gt; aspect section for &amp;lt;code&amp;gt;&amp;quot;textures&amp;quot;&amp;lt;/code&amp;gt;, change &#039;&#039;&#039;both instances&#039;&#039;&#039; of &amp;quot;treecko&amp;quot; in &amp;lt;code&amp;gt;&amp;quot;cobblemon:textures/pokemon/treecko/treecko_shiny.png&amp;quot;&amp;lt;/code&amp;gt; to be your Pokémon&#039;s name.&lt;br /&gt;
#* Don&#039;t delete the &amp;quot;_shiny&amp;quot; part of the name.&lt;br /&gt;
#* You can remove the shiny variation if you didn&#039;t make any shiny textures. &lt;br /&gt;
# Save the file&lt;br /&gt;
# Place this new resolver JSON into your Pokémon&#039;s &amp;lt;code&amp;gt;resolvers&amp;lt;/code&amp;gt; folder of your addon. &lt;br /&gt;
&lt;br /&gt;
You just created your Pokémon&#039;s resolver file. When it&#039;s time to load your addon in game, it should be using the model, textures, and animations you created for it!&lt;br /&gt;
&lt;br /&gt;
=== Part 5: Create your Pokémon&#039;s Species file ===&lt;br /&gt;
Now that we’ve got all the assets in place, we can now create the &amp;lt;code&amp;gt;species&amp;lt;/code&amp;gt; file! The species file contains all the entity data your Pokémon needs to exist. This is done from the data folder within your pack. This section will be extensive, but it will explain some of the basic properties of the &amp;lt;code&amp;gt;species file&amp;lt;/code&amp;gt;. For a more detailed description of the properties in the species file, you can refer to [https://wiki.cobblemon.com/index.php/Species its wiki page]&lt;br /&gt;
&lt;br /&gt;
This part of the guide can be skipped if you are able to create your Pokémon&#039;s &amp;lt;code&amp;gt;species&amp;lt;/code&amp;gt; file through this [https://tools.cobblemon.com/fakemon/ Fakemon Generator] made for Cobblemon! It will automatically create a zipped species JSON after you fill out some information for your Pokémon. The Fakemon Generator is very beginner friendly and can prevent you from making typos in the process of making a species file by hand.&lt;br /&gt;
&lt;br /&gt;
==== Creating the Species JSON ====&lt;br /&gt;
This JSON will contain all the necessary data any Pokémon needs. This includes its name, type, abilities, stats, moves, etc.&lt;br /&gt;
&lt;br /&gt;
# Create a new text file and name it after your Pokémon. Include the file extension of &amp;lt;code&amp;gt;.json&amp;lt;/code&amp;gt;&lt;br /&gt;
#* Example: &amp;lt;code&amp;gt;bulbasaur.json&amp;lt;/code&amp;gt;&lt;br /&gt;
#* Make sure this new file name ends in .json and not any other file extension like .txt. You may need to search &amp;quot;how to show file extensions&amp;quot; for whatever operating system you have.&lt;br /&gt;
# Open this new JSON in your preferred text editor&lt;br /&gt;
# Let&#039;s start by adding an opening and a closing curly bracket to the file like so: &lt;br /&gt;
#* In the following sections you will be adding information &#039;&#039;&#039;in between&#039;&#039;&#039; these brackets.&lt;br /&gt;
 {&lt;br /&gt;
 &lt;br /&gt;
 }&lt;br /&gt;
&amp;lt;/br&amp;gt;&lt;br /&gt;
==== Basic Information ====&lt;br /&gt;
Let&#039;s add some basic information about your Pokémon.&lt;br /&gt;
&lt;br /&gt;
# Copy and paste the following data &#039;&#039;&#039;inside the previously created curly brackets.&#039;&#039;&#039;&lt;br /&gt;
#*Hover over the underlined text to see more information.&lt;br /&gt;
 &amp;quot;&amp;lt;abbr title=&amp;quot;Whether or not this Pokémon is fully implemented. This determines whether it will show up in /spawnallpokemon or similar commands&amp;quot;&amp;gt;implemented&amp;lt;/abbr&amp;gt;&amp;quot;: true,&lt;br /&gt;
  &amp;quot;&amp;lt;abbr title=&amp;quot;The name of the Pokémon species&amp;quot;&amp;gt;name&amp;lt;/abbr&amp;gt;&amp;quot;: &amp;quot;&amp;lt;abbr title=&amp;quot;In this example, the Pokémon will be called Tentaquil!&amp;quot;&amp;gt;tentaquil&amp;lt;/abbr&amp;gt;&amp;quot;,&lt;br /&gt;
  &amp;quot;&amp;lt;abbr title=&amp;quot;Labels for this Pokémon. These labels can be used for spawning&amp;quot;&amp;gt;labels&amp;lt;/abbr&amp;gt;&amp;quot;: [ &amp;quot;&amp;lt;abbr title=&amp;quot;Here you are labeling your Pokémon as a &#039;custom&#039; Pokémon.&amp;quot;&amp;gt;custom&amp;lt;/abbr&amp;gt;&amp;quot; ],&lt;br /&gt;
  &amp;quot;&amp;lt;abbr title=&amp;quot;Here we point to the Pokédex descriptions for this Pokémon.&amp;quot;&amp;gt;pokedex&amp;lt;/abbr&amp;gt;&amp;quot;: [&lt;br /&gt;
    &amp;quot;&amp;lt;abbr title=&amp;quot;These are lang keys! We will need to define these later in a lang file, which is really easy. We&#039;ll cover this, but just replace &#039;tentaquil&#039; with your own Pokémon&#039;s name for now.&amp;quot;&amp;gt;cobblemon.species.tentaquil.desc1&amp;lt;/abbr&amp;gt;&amp;quot;,&lt;br /&gt;
    &amp;quot;&amp;lt;abbr title=&amp;quot;These are lang keys! We will need to define these later in a lang file, which is really easy. We&#039;ll cover this, but just replace &#039;tentaquil&#039; with your own Pokémon&#039;s name for now.&amp;quot;&amp;gt;cobblemon.species.tentaquil.desc2&amp;lt;/abbr&amp;gt;&amp;quot;&lt;br /&gt;
  ],&lt;br /&gt;
  &amp;quot;&amp;lt;abbr title=&amp;quot;Height for the Pokédex. The value here is written in decimeters. To convert to meters, divide this value by 10.&amp;quot;&amp;gt;height&amp;lt;/abbr&amp;gt;&amp;quot;: &amp;lt;abbr title=&amp;quot;Tentaquil has a height of 11 decimeters, or 1.1 meters!&amp;quot;&amp;gt;11&amp;lt;/abbr&amp;gt;,&lt;br /&gt;
  &amp;quot;&amp;lt;abbr title=&amp;quot;Weight for the Pokédex and the amount of damage for moves based on weight. The value here is written in hectograms. To convert to kilograms, divide this value by 10.&amp;quot;&amp;gt;weight&amp;lt;/abbr&amp;gt;&amp;quot;: &amp;lt;abbr title=&amp;quot;Tentaquil has a weight of 300 hectograms, or 30 kilograms!&amp;quot;&amp;gt;300&amp;lt;/abbr&amp;gt;,&lt;br /&gt;
  &amp;quot;&amp;lt;abbr title=&amp;quot;Whether or not this pokemon can ride on the players shoulder.&amp;quot;&amp;gt;shoulderMountable&amp;lt;/abbr&amp;gt;&amp;quot;: false,&lt;br /&gt;
# &amp;lt;li value=2&amp;gt;Change the 3 instances of &amp;quot;tentaquil&amp;quot; to your Pokémon&#039;s name&lt;br /&gt;
# Change the values of &amp;lt;code&amp;gt;&amp;quot;height&amp;quot;&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;&amp;quot;weight&amp;quot;&amp;lt;/code&amp;gt;, and &amp;lt;code&amp;gt;&amp;quot;shoulderMountable&amp;quot;&amp;lt;/code&amp;gt; if desired. &lt;br /&gt;
&amp;lt;/br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== Stats ====&lt;br /&gt;
Now let&#039;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. You can find the mod&#039;s official &amp;lt;code&amp;gt;species&amp;lt;/code&amp;gt; files on the [https://gitlab.com/cable-mc/cobblemon/-/tree/main/common/src/main/resources/data/cobblemon/species Gitlab] which are organized by generation.&lt;br /&gt;
&lt;br /&gt;
# Copy and paste the following data &#039;&#039;&#039;in a new line after the previous data.&#039;&#039;&#039;&lt;br /&gt;
#*Hover over the underlined text to see more information.&lt;br /&gt;
  &amp;quot;&amp;lt;abbr title=&amp;quot;The type assigned to your Pokémon.&amp;quot;&amp;gt;primaryType&amp;lt;/abbr&amp;gt;&amp;quot;: &amp;quot;&amp;lt;abbr title=&amp;quot;In this example, the Pokémon will be a poison type. You can change this if you like, but it must be an official type.&amp;quot;&amp;gt;poison&amp;lt;/abbr&amp;gt;&amp;quot;,&lt;br /&gt;
  &amp;quot;&amp;lt;abbr title=&amp;quot;The second type assigned to your Pokémon. This line is optional.&amp;quot;&amp;gt;secondaryType&amp;lt;/abbr&amp;gt;&amp;quot;: &amp;quot;&amp;lt;abbr title=&amp;quot;In this example, the Pokémon will also be a water type. You can change this if you like, but it must be an official type.&amp;quot;&amp;gt;water&amp;lt;/abbr&amp;gt;&amp;quot;,&lt;br /&gt;
  &amp;quot;&amp;lt;abbr title=&amp;quot;The base stats of your pokémon. Again, these are up to you.&amp;quot;&amp;gt;baseStats&amp;lt;/abbr&amp;gt;&amp;quot;: {&lt;br /&gt;
    &amp;quot;&amp;lt;abbr title=&amp;quot;The base hp stat of your pokémon.&amp;quot;&amp;gt;hp&amp;lt;/abbr&amp;gt;&amp;quot;: 125,&lt;br /&gt;
    &amp;quot;&amp;lt;abbr title=&amp;quot;The base attack stat of your pokémon.&amp;quot;&amp;gt;attack&amp;lt;/abbr&amp;gt;&amp;quot;: 105,&lt;br /&gt;
    &amp;quot;&amp;lt;abbr title=&amp;quot;The base defense stat of your pokémon.&amp;quot;&amp;gt;defence&amp;lt;/abbr&amp;gt;&amp;quot;: 95,&lt;br /&gt;
    &amp;quot;&amp;lt;abbr title=&amp;quot;The base special attack stat of your pokémon.&amp;quot;&amp;gt;special_attack&amp;lt;/abbr&amp;gt;&amp;quot;: 120,&lt;br /&gt;
    &amp;quot;&amp;lt;abbr title=&amp;quot;The base special defense stat of your pokémon.&amp;quot;&amp;gt;special_defence&amp;lt;/abbr&amp;gt;&amp;quot;: 85,&lt;br /&gt;
    &amp;quot;&amp;lt;abbr title=&amp;quot;The base speed stat of your pokémon.&amp;quot;&amp;gt;speed&amp;lt;/abbr&amp;gt;&amp;quot;: 70&lt;br /&gt;
  },&lt;br /&gt;
  &amp;quot;&amp;lt;abbr title=&amp;quot;The catch rate of your Pokémon. The higher the value, the easier it is to catch your Pokémon.&amp;quot;&amp;gt;catchRate&amp;lt;/abbr&amp;gt;&amp;quot;: &amp;lt;abbr title=&amp;quot;Catch rate values can start as low as 3 for legendary Pokémon and go as high as 255 for early game Pokémon like caterpie.&amp;quot;&amp;gt;100&amp;lt;/abbr&amp;gt;,&lt;br /&gt;
  &amp;quot;&amp;lt;abbr title=&amp;quot;What percentage of this pokémon are male.&amp;quot;&amp;gt;maleRatio&amp;lt;/abbr&amp;gt;&amp;quot;: &amp;lt;abbr title=&amp;quot;This would make the Pokémon have a 50% male ratio. You can set this value to 0 to make a female only species like Miltank. You can also set it to -1 to make genderless Pokémon like Ditto.&amp;quot;&amp;gt;0.5&amp;lt;/abbr&amp;gt;,&lt;br /&gt;
  &amp;quot;&amp;lt;abbr title=&amp;quot;How much experience is granted by this pokémon upon being defeated.&amp;quot;&amp;gt;baseExperienceYield&amp;lt;/abbr&amp;gt;&amp;quot;: &amp;lt;abbr title=&amp;quot;270 would let this Pokémon drop the same amount of exp as a legendary pokemon! Weak Pokémon have a value as low as 50. Blissey has the highest value at 635.&amp;quot;&amp;gt;270&amp;lt;/abbr&amp;gt;,&lt;br /&gt;
  &amp;quot;&amp;lt;abbr title=&amp;quot;How quickly this Pokémon will level up.&amp;quot;&amp;gt;experienceGroup&amp;lt;/abbr&amp;gt;&amp;quot;: &amp;quot;&amp;lt;abbr title=&amp;quot;It is recommended that you leave this alone for now. If you spell something wrong when trying to change it, your Pokémon will not level up at all.&amp;quot;&amp;gt;fluctuating&amp;lt;/abbr&amp;gt;&amp;quot;,&lt;br /&gt;
  &amp;quot;&amp;lt;abbr title=&amp;quot;How long it will take this Pokémon&#039;s eggs to hatch.&amp;quot;&amp;gt;eggCycles&amp;lt;/abbr&amp;gt;&amp;quot;: &amp;lt;abbr title=&amp;quot;This value can be as low as 15 for quick hatching eggs or as high as 120 for slow hatching eggs like legendaries.&amp;quot;&amp;gt;25&amp;lt;/abbr&amp;gt;,&lt;br /&gt;
  &amp;quot;&amp;lt;abbr title=&amp;quot;The egg groups that this Pokémon can breed with.&amp;quot;&amp;gt;eggGroups&amp;lt;/abbr&amp;gt;&amp;quot;: [&lt;br /&gt;
    &amp;quot;&amp;lt;abbr title=&amp;quot;It is recommended that you leave these alone unless you know what you&#039;re doing. If these values aren&#039;t valid, the game will crash.&amp;quot;&amp;gt;water_1&amp;lt;/abbr&amp;gt;&amp;quot;,&lt;br /&gt;
    &amp;quot;&amp;lt;abbr title=&amp;quot;It is recommended that you leave these alone unless you know what you&#039;re doing. If these values aren&#039;t valid, the game will crash.&amp;quot;&amp;gt;monster&amp;lt;/abbr&amp;gt;&amp;quot;&lt;br /&gt;
  ],&lt;br /&gt;
  &amp;quot;&amp;lt;abbr title=&amp;quot;What this pokémon&#039;s friendship stat starts at when caught.&amp;quot;&amp;gt;baseFriendship&amp;lt;/abbr&amp;gt;&amp;quot;: &amp;lt;abbr title=&amp;quot;For most non-legendary Pokémon, this value is usually 50.&amp;quot;&amp;gt;50&amp;lt;/abbr&amp;gt;,&lt;br /&gt;
  &amp;quot;&amp;lt;abbr title=&amp;quot;How many EV&#039;s this pokémon gives upon being defeated.&amp;quot;&amp;gt;evYield&amp;lt;/abbr&amp;gt;&amp;quot;: {&lt;br /&gt;
    &amp;quot;&amp;lt;abbr title=&amp;quot;The amount of hp EV&#039;s this Pokémon will drop.&amp;quot;&amp;gt;hp&amp;lt;/abbr&amp;gt;&amp;quot;: 2,&lt;br /&gt;
    &amp;quot;&amp;lt;abbr title=&amp;quot;The amount of special attack EV&#039;s this Pokémon will drop.&amp;quot;&amp;gt;special_attack&amp;lt;/abbr&amp;gt;&amp;quot;: 1&lt;br /&gt;
  },&lt;br /&gt;
# &amp;lt;li value=2&amp;gt; Change any of these values if desired&lt;br /&gt;
#* It is recommended that you leave most of these values alone if you are unsure about your Pokémon&#039;s stats. They can always be changed later. &lt;br /&gt;
&amp;lt;/br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== Moves and Abilities ====&lt;br /&gt;
Here you will include the abilities and move pool for your Pokémon.&lt;br /&gt;
&lt;br /&gt;
# Copy and paste the following data &#039;&#039;&#039;in a new line after the previous data.&#039;&#039;&#039;&lt;br /&gt;
#*Hover over the underlined text to see more information.&lt;br /&gt;
  &amp;quot;&amp;lt;abbr title=&amp;quot;Here we&#039;re defining our list of moves. You can list as many as you like! If you&#039;d like to include more moves, you cannot use spaces or underscores for moves that are named with multiple words like &#039;double slap.&#039; You need to smoosh the words together! It would be written in this JSON as &#039;doubleslap&#039;&amp;quot;&amp;gt;moves&amp;lt;/abbr&amp;gt;&amp;quot;: [&lt;br /&gt;
    &amp;quot;&amp;lt;abbr title=&amp;quot;This would let disable be one of the &#039;egg moves&#039; for this Pokémon&amp;quot;&amp;gt;egg:disable&amp;lt;/abbr&amp;gt;&amp;quot;,&lt;br /&gt;
    &amp;quot;&amp;lt;abbr title=&amp;quot;This would let the Pokémon learn crushclaw at level 20&amp;quot;&amp;gt;20:crushclaw&amp;lt;/abbr&amp;gt;&amp;quot;,&lt;br /&gt;
    &amp;quot;&amp;lt;abbr title=&amp;quot;This would allow the Pokémon to use a &#039;rest tm&#039; when tm&#039;s get implemented&amp;quot;&amp;gt;tm:rest&amp;lt;/abbr&amp;gt;&amp;quot;,&lt;br /&gt;
    &amp;quot;&amp;lt;abbr title=&amp;quot;This would allow the Pokémon to learn hone claws from a tutor when that gets implemented&amp;quot;&amp;gt;tutor:honeclaws&amp;lt;/abbr&amp;gt;&amp;quot;&lt;br /&gt;
  ],&lt;br /&gt;
  &amp;quot;&amp;lt;abbr title=&amp;quot;Here we define the list of abilities. You can have up to two abilities listed, and one hidden ability. The names of abilities must be one word just like with the moves.&amp;quot;&amp;gt;abilities&amp;lt;/abbr&amp;gt;&amp;quot;: [&lt;br /&gt;
    &amp;quot;&amp;lt;abbr title=&amp;quot;This would make tough claws be the only default ability for this Pokémon.&amp;quot;&amp;gt;toughclaws&amp;lt;/abbr&amp;gt;&amp;quot;,&lt;br /&gt;
    &amp;quot;&amp;lt;abbr title=&amp;quot;This would let serene grace be the hidden ability for this Pokémon. Hidden abilities are not implemented at this time.&amp;quot;&amp;gt;h:serenegrace&amp;lt;/abbr&amp;gt;&amp;quot;&lt;br /&gt;
  ],&lt;br /&gt;
# &amp;lt;li value=2&amp;gt; Change any of these values if desired&lt;br /&gt;
#* You probably should edit the moves and abilities for your Pokémon, but it can always be done later!&lt;br /&gt;
&amp;lt;/br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== Entity Properties ====&lt;br /&gt;
Here you will list some properties of your Pokémon like its behavior, drops, and size.&lt;br /&gt;
&lt;br /&gt;
# Copy and paste the following data &#039;&#039;&#039;in a new line after the previous data.&#039;&#039;&#039;&lt;br /&gt;
#*Hover over the underlined text to see more information.&lt;br /&gt;
  &amp;quot;&amp;lt;abbr title=&amp;quot;This refers to the scale of the Pokémon model.&amp;quot;&amp;gt;baseScale&amp;lt;/abbr&amp;gt;&amp;quot;: &amp;lt;abbr title=&amp;quot; A scale of 1 means that the Pokémon will be the same size it was modeled at in Blockbench.&amp;quot;&amp;gt;1&amp;lt;/abbr&amp;gt;,&lt;br /&gt;
  &amp;quot;&amp;lt;abbr title=&amp;quot;These are the parameters that handle hit collision. There are only values for height and width since hitboxes are square prisms.&amp;quot;&amp;gt;hitbox&amp;lt;/abbr&amp;gt;&amp;quot;: {&lt;br /&gt;
    &amp;quot;&amp;lt;abbr title=&amp;quot;The width of the hitbox. We will change this value later in the guide.&amp;quot;&amp;gt;width&amp;lt;/abbr&amp;gt;&amp;quot;: 1,&lt;br /&gt;
    &amp;quot;&amp;lt;abbr title=&amp;quot;The height of the hitbox. We will change this value later in the guide.&amp;quot;&amp;gt;height&amp;lt;/abbr&amp;gt;&amp;quot;: 1,&lt;br /&gt;
    &amp;quot;&amp;lt;abbr title=&amp;quot;This determines whether the hitbox is fixed in place or not. You usually always want this on false.&amp;quot;&amp;gt;fixed&amp;lt;/abbr&amp;gt;&amp;quot;: false&lt;br /&gt;
  },&lt;br /&gt;
  &amp;quot;&amp;lt;abbr title=&amp;quot;Here you will define what a Pokémon will drop when defeated.&amp;quot;&amp;gt;drops&amp;lt;/abbr&amp;gt;&amp;quot;: {&lt;br /&gt;
  &amp;quot;&amp;lt;abbr title=&amp;quot;This indicates how many drop attempts there will be.&amp;quot;&amp;gt;amount&amp;lt;/abbr&amp;gt;&amp;quot;: &amp;quot;&amp;lt;abbr title=&amp;quot;In this instance, there will be 2 attempts to drop items from the entries listed below.&amp;quot;&amp;gt;2&amp;lt;/abbr&amp;gt;&amp;quot;,&lt;br /&gt;
    &amp;quot;&amp;lt;abbr title=&amp;quot;This lists the potential items to drop.&amp;quot;&amp;gt;entries&amp;lt;/abbr&amp;gt;&amp;quot;: [&lt;br /&gt;
      {&lt;br /&gt;
        &amp;quot;&amp;lt;abbr title=&amp;quot;Here you will list the item id.&amp;quot;&amp;gt;item&amp;lt;/abbr&amp;gt;&amp;quot;: &amp;quot;&amp;lt;abbr title=&amp;quot;In this example, the Pokémon will attempt to drop slime balls! You can also include drops from other mods.&amp;quot;&amp;gt;minecraft:slimeball&amp;lt;/abbr&amp;gt;&amp;quot;,&lt;br /&gt;
        &amp;quot;&amp;lt;abbr title=&amp;quot;The amount of items that will drop.&amp;quot;&amp;gt;quantityRange&amp;lt;/abbr&amp;gt;&amp;quot;: &amp;quot;&amp;lt;abbr title=&amp;quot;In this instance, it will drop 1-2 slime balls. Since there are 2 drop attempts, as specified from &#039;amount,&#039; then there&#039;s a chance at getting 4 slime balls when defeating this pokemon!&amp;quot;&amp;gt;1-2&amp;lt;/abbr&amp;gt;&amp;quot;,&lt;br /&gt;
        &amp;quot;&amp;lt;abbr title=&amp;quot;The chance for the item to drop.&amp;quot;&amp;gt;percentage&amp;lt;/abbr&amp;gt;&amp;quot;: &amp;lt;abbr title=&amp;quot;This means it will have a 66% chance to drop 1-2 slimeballs.&amp;quot;&amp;gt;66&amp;lt;/abbr&amp;gt;&lt;br /&gt;
      }&lt;br /&gt;
    ]&lt;br /&gt;
  },&lt;br /&gt;
  &amp;quot;&amp;lt;abbr title=&amp;quot;Here we will define the behavior of the Pokémon.&amp;quot;&amp;gt;behaviour&amp;lt;/abbr&amp;gt;&amp;quot;: {&lt;br /&gt;
    &amp;quot;&amp;lt;abbr title=&amp;quot;Here you are listing behaviors regarding movement.&amp;quot;&amp;gt;moving&amp;lt;/abbr&amp;gt;&amp;quot;: {&lt;br /&gt;
    &amp;quot;&amp;lt;abbr title=&amp;quot;This determines whether or not a Pokémon can look around. This really depends on your model.&amp;quot;&amp;gt;canLook&amp;lt;/abbr&amp;gt;&amp;quot;: &amp;lt;abbr title=&amp;quot;If your Pokémon doesn&#039;t have a proper head and neck, you might want to set this to false.&amp;quot;&amp;gt;true&amp;lt;/abbr&amp;gt;,&lt;br /&gt;
      &amp;quot;&amp;lt;abbr title=&amp;quot;Here you will list behaviors about flying.&amp;quot;&amp;gt;fly&amp;lt;/abbr&amp;gt;&amp;quot;: {&lt;br /&gt;
        &amp;quot;&amp;lt;abbr title=&amp;quot;Whether or not a Pokémon can fly. If true, it will be assigned AI to fly.&amp;quot;&amp;gt;canFly&amp;lt;/abbr&amp;gt;&amp;quot;: false&lt;br /&gt;
      },          &lt;br /&gt;
      &amp;quot;&amp;lt;abbr title=&amp;quot;Here you will list behaviors about swimming. This would include swimming in water and lava!&amp;quot;&amp;gt;swim&amp;lt;/abbr&amp;gt;&amp;quot;: {&lt;br /&gt;
        &amp;quot;&amp;lt;abbr title=&amp;quot;Here you will determine how fast your Pokémon moves when swimming.&amp;quot;&amp;gt;swimSpeed&amp;lt;/abbr&amp;gt;&amp;quot;: 0.2,&lt;br /&gt;
        &amp;quot;&amp;lt;abbr title=&amp;quot;Here you will determine if your Pokémon knows how to swim. If false, then the Pokémon will float to the surface instead of swimming around in water.&amp;quot;&amp;gt;canSwimInWater&amp;lt;/abbr&amp;gt;&amp;quot;: true,&lt;br /&gt;
        &amp;quot;&amp;lt;abbr title=&amp;quot;Whether or not a Pokémon can breathe underwater. You want this set to true for most aquatic Pokémon.&amp;quot;&amp;gt;canBreatheUnderwater&amp;lt;/abbr&amp;gt;&amp;quot;: true&lt;br /&gt;
      }&lt;br /&gt;
    }&lt;br /&gt;
  }&lt;br /&gt;
# &amp;lt;li value=2&amp;gt; Change any of these values if desired&lt;br /&gt;
#* It is recommended to leave these alone for now.&lt;br /&gt;
&amp;lt;/br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== Save the file! ====&lt;br /&gt;
That should be enough data for your custom Pokémon to be functional in game. Now you can save the file.&lt;br /&gt;
&lt;br /&gt;
# Save the file&lt;br /&gt;
# Place this new species JSON into the &amp;lt;code&amp;gt;custom&amp;lt;/code&amp;gt; folder of your addon.&lt;br /&gt;
&amp;lt;/br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Part 6: Creating the lang file ===&lt;br /&gt;
In this section we will walk you through on how to display the Pokémon&#039;s name in game. Let&#039;s begin by making a language file!&lt;br /&gt;
&lt;br /&gt;
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.&lt;br /&gt;
&lt;br /&gt;
# Create a new text file and name it &amp;lt;code&amp;gt;en_us.json&amp;lt;/code&amp;gt;&lt;br /&gt;
#* If US English is not your language, you can refer to the [https://minecraft.wiki/w/Language Minecraft Wiki page for language files] to get file name for your language.&lt;br /&gt;
#* Make sure this new file name ends in .json and not any other file extension like .txt. You may need to search &amp;quot;how to show file extensions&amp;quot; for whatever operating system you have.&lt;br /&gt;
# Open this new JSON in your preferred text editor&lt;br /&gt;
# Copy and paste this example data into the JSON:&lt;br /&gt;
#* Hover over the underlined text to see more information.&lt;br /&gt;
#* Remember that you want to change the string on the right side of the colon to whatever language you play with. The string on the left side of the colon must remain in English to be read properly by the mod.&lt;br /&gt;
 {&lt;br /&gt;
  &amp;quot;&amp;lt;abbr title=&amp;quot;Here you will specify how your Pokémon&#039;s name will appear in English.&amp;quot;&amp;gt;cobblemon.species.tentaquil.name&amp;lt;/abbr&amp;gt;&amp;quot;: &amp;quot;&amp;lt;abbr title=&amp;quot;This will be the name that appears above the Pokémon&#039;s head in game. You are allowed to use capital letters, periods, and hyphens here.&amp;quot;&amp;gt;Tentaquil&amp;lt;/abbr&amp;gt;&amp;quot;,&lt;br /&gt;
  &amp;quot;&amp;lt;abbr title=&amp;quot;Here you will give a short description of your Pokémon for the pokédex.&amp;quot;&amp;gt;cobblemon.species.tentaquil.desc1&amp;lt;/abbr&amp;gt;&amp;quot;: &amp;quot;&amp;lt;abbr title=&amp;quot;This will appear in the English pokédex when it gets implemented.&amp;quot;&amp;gt;If its bold colors do not sufficiently ward off predators, it secretes toxins that smell strongly of copper.&amp;lt;/abbr&amp;gt;&amp;quot;,&lt;br /&gt;
  &amp;quot;&amp;lt;abbr title=&amp;quot;Here you will give a short description of your Pokémon for the pokédex.&amp;quot;&amp;gt;cobblemon.species.tentaquil.desc2&amp;lt;/abbr&amp;gt;&amp;quot;: &amp;quot;&amp;lt;abbr title=&amp;quot;This will appear in the English pokédex when it gets implemented.&amp;quot;&amp;gt;There has only been one recorded sighting of this pokémon. Until recently, this was considered to be a joke.&amp;lt;/abbr&amp;gt;&amp;quot;&lt;br /&gt;
 }&lt;br /&gt;
# Swap out &amp;quot;tentaquil&amp;quot; for the name of your Pokémon&lt;br /&gt;
#* The value after &amp;lt;code&amp;gt;cobblemon.species.tentaquil.name&amp;lt;/code&amp;gt; is what your Pokémon&#039;s name will look like over its head. So you can use capital letters, periods, and hyphens. &lt;br /&gt;
# Change the descriptions of the Pokémon if desired.&lt;br /&gt;
# Save the file&lt;br /&gt;
# Place this file in the &amp;lt;code&amp;gt;lang&amp;lt;/code&amp;gt; folder of your addon.&lt;br /&gt;
&lt;br /&gt;
The keys ending with &amp;lt;code&amp;gt;desc1&amp;lt;/code&amp;gt; and &amp;lt;code&amp;gt;desc2&amp;lt;/code&amp;gt; are the Pokémon&#039;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.&lt;br /&gt;
&lt;br /&gt;
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.&lt;br /&gt;
&amp;lt;/br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Part 7: Testing your Pokemon in Game ===&lt;br /&gt;
You Pokemon should now have enough data to be functional in game! Let&#039;s try loading your addon in a new creative world. &lt;br /&gt;
# Launch Minecraft with the Cobblemon mod enabled. &lt;br /&gt;
# Click on &amp;quot;Singleplayer&amp;quot;&lt;br /&gt;
# Click on &amp;quot;Create New World&amp;quot;&lt;br /&gt;
# Name this new world whatever you like&lt;br /&gt;
# Set it to Creative and allow cheats!&lt;br /&gt;
# Click on &amp;quot;Data Packs&amp;quot;&lt;br /&gt;
# Click on &amp;quot;Open Pack Folder&amp;quot;&lt;br /&gt;
# Copy your addon folder and paste it into this datapack folder.&lt;br /&gt;
#* Your addon should appear in the list of available datapacks&lt;br /&gt;
#* If it appears as red, you can still select it and load it without issues if you have been following this guide. &lt;br /&gt;
# Select your addon from the list of available datapacks and click done&lt;br /&gt;
#* It should warn you that the datapack is outdated, but you can ignore this warning!&lt;br /&gt;
# Click on &amp;quot;Create New World&amp;quot;&lt;br /&gt;
# After the world has loaded, spawn your Pokémon with this command: &amp;lt;code&amp;gt;/pokespawn &amp;lt;your_pokemon&amp;gt;&amp;lt;/code&amp;gt;&lt;br /&gt;
# Your Pokémon should have a strange looking name and should have spawned as the substitute doll, which is a green dinosaur-like doll. &lt;br /&gt;
#* This is because the resource pack hasn&#039;t been activated yet. We will do that next. &lt;br /&gt;
#* If a Pokémon can at least spawn as the substitute doll, that means all of it&#039;s data is valid.&lt;br /&gt;
# Open your options menu.&lt;br /&gt;
# Click on &amp;quot;Resource Packs&amp;quot;&lt;br /&gt;
# Click on &amp;quot;Open Pack Folder&amp;quot;&lt;br /&gt;
# Copy your addon folder and paste it into this resource pack folder.&lt;br /&gt;
#* Your addon should appear in the list of available resource packs&lt;br /&gt;
# Select your addon from the list of available resource packs and click done.&lt;br /&gt;
#* If you get a warning that the resource pack is outdated, you can ignore this warning!&lt;br /&gt;
# After the game refreshes the resourcepacks, you should be able to see the model you created!&lt;br /&gt;
# Ensure that your Pokémon&#039;s model, animations, and name are working properly.&lt;br /&gt;
# Do not close Minecraft yet. In the following sections of this guide, we will be editing the addon files while the game is loaded. &lt;br /&gt;
&lt;br /&gt;
You may notice that your Pokémon does not appear properly in the Party menus and HUD. Its appearance in the GUI is controlled by the &amp;lt;code&amp;gt;poser&amp;lt;/code&amp;gt; file. We will fix it in the next couple of sections. &lt;br /&gt;
&lt;br /&gt;
Your Pokémon may also appear bigger or smaller than you intended. This can be corrected in its &amp;lt;code&amp;gt;species&amp;lt;/code&amp;gt; file. We will fix it in the next section. &lt;br /&gt;
&amp;lt;/br&amp;gt;&lt;br /&gt;
=== Part 8: Adjusting the Scale of your Pokémon in game ===&lt;br /&gt;
We will be adjusting the size of your Pokémon in game. This will be done by editing the &amp;lt;code&amp;gt;species&amp;lt;/code&amp;gt; file you created earlier. &lt;br /&gt;
&lt;br /&gt;
Remember that datapack folder that you copy and pasted your addon folder into? It was a temporary folder used for world creation. This means that your addon is now in a different folder. We want to edit the in game files so we can see the changes without having to restart the game! This section of the guide will show you how to access that folder from in game. &lt;br /&gt;
&lt;br /&gt;
# Have Minecraft open in the main menu&lt;br /&gt;
#* You&#039;ll always want Minecraft open in this section of the guide. &lt;br /&gt;
# Open your options menu.&lt;br /&gt;
# Click on &amp;quot;Resource Packs&amp;quot;&lt;br /&gt;
#* Although we are looking for your addon in the datapacks folder, this is a simple way to navigate to the datapack folder.&lt;br /&gt;
# Click on &amp;quot;Open Pack Folder&amp;quot;&lt;br /&gt;
# From this new folder window, go back one folder or press &amp;lt;code&amp;gt;ALT+[UP ARROW]&amp;lt;/code&amp;gt;.&lt;br /&gt;
# Click on the &amp;lt;code&amp;gt;saves&amp;lt;/code&amp;gt; folder.&lt;br /&gt;
# Click on the folder named after the Creative World you made earlier in this guide.&lt;br /&gt;
# Click on the &amp;lt;code&amp;gt;datapacks&amp;lt;/code&amp;gt; folder.&lt;br /&gt;
# You should see your addon folder now! &lt;br /&gt;
# Open your addon folder and navigate to the &amp;lt;code&amp;gt;species&amp;lt;/code&amp;gt; JSON of your Pokémon.&lt;br /&gt;
# Open the JSON in your preferred text editor.&lt;br /&gt;
# Look for the following data in this file:&lt;br /&gt;
 &amp;quot;&amp;lt;abbr title=&amp;quot;This refers to the scale of the Pokémon model.&amp;quot;&amp;gt;baseScale&amp;lt;/abbr&amp;gt;&amp;quot;: &amp;lt;abbr title=&amp;quot; A scale of 1 means that the Pokémon will be the same size it was modeled at in Blockbench.&amp;quot;&amp;gt;1&amp;lt;/abbr&amp;gt;,&lt;br /&gt;
   &amp;quot;&amp;lt;abbr title=&amp;quot;These are the parameters that handle hit collision. There are only values for height and width since hitboxes are square prisms.&amp;quot;&amp;gt;hitbox&amp;lt;/abbr&amp;gt;&amp;quot;: {&lt;br /&gt;
    &amp;quot;&amp;lt;abbr title=&amp;quot;The width of the hitbox. We will change this value now.&amp;quot;&amp;gt;width&amp;lt;/abbr&amp;gt;&amp;quot;: 1,&lt;br /&gt;
    &amp;quot;&amp;lt;abbr title=&amp;quot;The height of the hitbox. We will change this value now.&amp;quot;&amp;gt;height&amp;lt;/abbr&amp;gt;&amp;quot;: 1,&lt;br /&gt;
    &amp;quot;&amp;lt;abbr title=&amp;quot;This determines whether the hitbox is fixed in place or not. You usually always want this on false.&amp;quot;&amp;gt;fixed&amp;lt;/abbr&amp;gt;&amp;quot;: false&lt;br /&gt;
 },&lt;br /&gt;
# &amp;lt;li value=13&amp;gt; Let&#039;s start by changing the &amp;lt;code&amp;gt;baseScale&amp;lt;/code&amp;gt; value first! This controls the size of the Pokémon model. &lt;br /&gt;
#* By default, this value should be 1. &lt;br /&gt;
#* You can use decimals to get a precise size for your Pokémon. &lt;br /&gt;
# Change the value for &amp;lt;code&amp;gt;baseScale&amp;lt;/code&amp;gt;&lt;br /&gt;
#* If you want your Pokémon to be bigger, make the value higher than 1&lt;br /&gt;
#* If you want your Pokémon to be smaller, make the value lower than 1, but higher than 0. &lt;br /&gt;
# Save the file.&lt;br /&gt;
# Load your Creative Single Player world from the main menu.&lt;br /&gt;
#* You always have to load the world from the main menu to see changes to &amp;lt;code&amp;gt;data&amp;lt;/code&amp;gt; files.&lt;br /&gt;
#* The command &amp;lt;code&amp;gt;/reload&amp;lt;/code&amp;gt; does not work with Cobblemon datapacks. &lt;br /&gt;
# Examine your Pokémon and decide if it still needs to be adjusted.&lt;br /&gt;
# Repeat steps 10-17 until your Pokémon&#039;s in game size is just right!&lt;br /&gt;
# Now that your Pokémon&#039;s size is correct, we can adjust its &amp;lt;code&amp;gt;hitbox&amp;lt;/code&amp;gt; values! This controls the Pokémon&#039;s hitbox and the size of its shadow. &lt;br /&gt;
#* By default, this value should be 1. &lt;br /&gt;
#* You can use decimals to get a precise size for your Pokémon.&lt;br /&gt;
# Open your addon folder and navigate to the &amp;lt;code&amp;gt;species&amp;lt;/code&amp;gt; JSON of your Pokémon.&lt;br /&gt;
# Open the JSON in your preferred text editor.&lt;br /&gt;
# Look for the following data in this file:&lt;br /&gt;
  &amp;quot;&amp;lt;abbr title=&amp;quot;These are the parameters that handle hit collision. There are only values for height and width since hitboxes are square prisms.&amp;quot;&amp;gt;hitbox&amp;lt;/abbr&amp;gt;&amp;quot;: {&lt;br /&gt;
    &amp;quot;&amp;lt;abbr title=&amp;quot;The width of the hitbox. We will change this value now.&amp;quot;&amp;gt;width&amp;lt;/abbr&amp;gt;&amp;quot;: 1,&lt;br /&gt;
    &amp;quot;&amp;lt;abbr title=&amp;quot;The height of the hitbox. We will change this value now.&amp;quot;&amp;gt;height&amp;lt;/abbr&amp;gt;&amp;quot;: 1,&lt;br /&gt;
    &amp;quot;&amp;lt;abbr title=&amp;quot;This determines whether the hitbox is fixed in place or not. You usually always want this on false.&amp;quot;&amp;gt;fixed&amp;lt;/abbr&amp;gt;&amp;quot;: false&lt;br /&gt;
 },&lt;br /&gt;
# &amp;lt;li value=23&amp;gt; Change the values for &amp;lt;code&amp;gt;width&amp;lt;/code&amp;gt; and &amp;lt;code&amp;gt;height&amp;lt;/code&amp;gt;&lt;br /&gt;
#* If you want your Pokémon&#039;s hitbox to be bigger, make the values higher than 1&lt;br /&gt;
#* If you want your Pokémon&#039;s hitbox to be smaller, make the values lower than 1, but higher than 0. &lt;br /&gt;
# Save the file.&lt;br /&gt;
# Load your Creative Single Player world from the main menu.&lt;br /&gt;
#* You always have to load the world from the main menu to see changes to &amp;lt;code&amp;gt;data&amp;lt;/code&amp;gt; files.&lt;br /&gt;
# Press &amp;lt;code&amp;gt;F3+B&amp;lt;/code&amp;gt; to show hitboxes.&lt;br /&gt;
# Examine your Pokémon and decide if it still needs to be adjusted.&lt;br /&gt;
#* Most of the time, you want the red line around the same height as the eye(s) of your Pokémon. &lt;br /&gt;
#* That red line on the hitbox indicates when the entity will start suffocating. If the hitbox somehow has a block above this red line, then the entity will start suffocating.&lt;br /&gt;
# Repeat steps 20-27 until your Pokémon&#039;s in game hitbox is just right!&lt;br /&gt;
# Once your Pokémon&#039;s size and hitbox are just right, go back to the main menu of Minecraft and proceed to the next part of the guide.&lt;br /&gt;
&amp;lt;/br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Part 9: Adjusting your Pokémon&#039;s poser file in game ===&lt;br /&gt;
In this part of the guide, we will be editing the &amp;lt;code&amp;gt;poser&amp;lt;/code&amp;gt; file so your Pokémon can look nice in the GUIs! This time we will be editing files in the resource pack folder! This means you can press &amp;lt;code&amp;gt;F3+T&amp;lt;/code&amp;gt; to reload the resource pack in game rather than loading from the main menu like we did for the species file. &lt;br /&gt;
&lt;br /&gt;
# Have Minecraft open in the main menu&lt;br /&gt;
#* You&#039;ll always want Minecraft open in this section of the guide. &lt;br /&gt;
# Open your options menu.&lt;br /&gt;
# Click on &amp;quot;Resource Packs&amp;quot;&lt;br /&gt;
# Click on &amp;quot;Open Pack Folder&amp;quot;&lt;br /&gt;
# From this new folder window, you should see your addon folder.&lt;br /&gt;
# Open your addon folder and navigate to the &amp;lt;code&amp;gt;poser&amp;lt;/code&amp;gt; JSON of your Pokémon.&lt;br /&gt;
# Open the JSON in your preferred text editor.&lt;br /&gt;
# Look for the following data in this file:&lt;br /&gt;
  &amp;quot;&amp;lt;abbr title=&amp;quot;These refer to the portraits on the party menu on the left side of the screen. 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 with F3 + T for quick edits.)&amp;quot;&amp;gt;portraitScale&amp;quot;: 1&amp;lt;/abbr&amp;gt;,&lt;br /&gt;
  &amp;quot;&amp;lt;abbr title=&amp;quot;These refer to the portraits on the party menu on the left side of the screen. 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 with F3 + T for quick edits.)&amp;quot;&amp;gt;portraitTranslation&amp;quot;: [ 0, 0.5, 0 ]&amp;lt;/abbr&amp;gt;,&lt;br /&gt;
  &amp;quot;&amp;lt;abbr title=&amp;quot;These refer to the full body view of the Pokémon often seen in GUI, but most notably the summary UI. Like the previous code block, this section will require some trial and error, and you should come back to edit this later. (Tip: you can refresh your resource pack with F3 + T for quick edits.)&amp;quot;&amp;gt;profileScale&amp;quot;: 1&amp;lt;/abbr&amp;gt;,&lt;br /&gt;
  &amp;quot;&amp;lt;abbr title=&amp;quot;These refer to the full body view of the Pokémon often seen in GUI, but most notably the summary UI. Like the previous code block, this section will require some trial and error, and you should come back to edit this later. (Tip: you can refresh your resource pack with F3 + T for quick edits.)&amp;quot;&amp;gt;profileTranslation&amp;quot;: [ 0, 0.4, 0 ]&amp;lt;/abbr&amp;gt;,&lt;br /&gt;
# &amp;lt;li value=9&amp;gt; Let&#039;s start by editing &amp;lt;code&amp;gt;portraitScale&amp;lt;/code&amp;gt; and &amp;lt;code&amp;gt;portraitTranslation&amp;lt;/code&amp;gt;. These values control how your Pokémon looks on the right side of your screen.&lt;br /&gt;
#* &amp;lt;code&amp;gt;portraitScale&amp;lt;/code&amp;gt; makes your Pokémon bigger or smaller in the GUI. It can be treated like a &amp;quot;zoom&amp;quot; value for the camera that renders your Pokémon in this GUI. The higher the value, the more it will zoom into your Pokémon.&lt;br /&gt;
#* &amp;lt;code&amp;gt;portraitTranslation&amp;lt;/code&amp;gt; has a set of 3 values in brackets. These 3 values can be treated like the xyz coordinates for the camera that renders your Pokémon in the GUI. These values can use decimals and negative numbers!&lt;br /&gt;
#* This part requires a lot of trial and error. Sometimes if you change a value too drastically, it will stop appearing on the GUI. It is recommended to change the values in increments of 0.3 to get your bearings on how these values work. &lt;br /&gt;
# Change the values for &amp;lt;code&amp;gt;portraitScale&amp;lt;/code&amp;gt; and &amp;lt;code&amp;gt;portraitTranslation&amp;lt;/code&amp;gt;&lt;br /&gt;
# Save the file&lt;br /&gt;
# Go back to Minecraft and press &amp;lt;code&amp;gt;F3+T&amp;lt;/code&amp;gt; to refresh all resource packs&lt;br /&gt;
# After loading, examine your Pokémon in the party GUI on the left side of your screen.&lt;br /&gt;
#* Generally, you want this GUI to show your Pokémon&#039;s entire face&lt;br /&gt;
# Repeat steps 6-13 until your Pokémon looks just right!&lt;br /&gt;
# Next we will edit the values for &amp;lt;code&amp;gt;profileScale&amp;lt;/code&amp;gt; and &amp;lt;code&amp;gt;profileTranslation&amp;lt;/code&amp;gt;. These values control how your Pokémon looks in the Party GUI when you press M. &lt;br /&gt;
#* &amp;lt;code&amp;gt;profileScale&amp;lt;/code&amp;gt; makes your Pokémon bigger or smaller in the GUI.&lt;br /&gt;
#* &amp;lt;code&amp;gt;portraitTranslation&amp;lt;/code&amp;gt; controls the position of the camera rendering your Pokémon in this menu. These values can use decimals and negative numbers!&lt;br /&gt;
#* This part also requires a lot of trial and error. It is recommended to change the values in increments of 0.3 again.&lt;br /&gt;
# Open your addon folder and navigate to the &amp;lt;code&amp;gt;poser&amp;lt;/code&amp;gt; JSON of your Pokémon.&lt;br /&gt;
# Open the JSON in your preferred text editor.&lt;br /&gt;
# Look for the following data in this file:&lt;br /&gt;
  &amp;quot;&amp;lt;abbr title=&amp;quot;These refer to the portraits on the party menu on the left side of the screen. 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 with F3 + T for quick edits.)&amp;quot;&amp;gt;portraitScale&amp;quot;: 1&amp;lt;/abbr&amp;gt;,&lt;br /&gt;
  &amp;quot;&amp;lt;abbr title=&amp;quot;These refer to the portraits on the party menu on the left side of the screen. 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 with F3 + T for quick edits.)&amp;quot;&amp;gt;portraitTranslation&amp;quot;: [ 0, 0.5, 0 ]&amp;lt;/abbr&amp;gt;,&lt;br /&gt;
  &amp;quot;&amp;lt;abbr title=&amp;quot;These refer to the full body view of the Pokémon often seen in GUI, but most notably the summary UI. Like the previous code block, this section will require some trial and error, and you should come back to edit this later. (Tip: you can refresh your resource pack with F3 + T for quick edits.)&amp;quot;&amp;gt;profileScale&amp;quot;: 1&amp;lt;/abbr&amp;gt;,&lt;br /&gt;
  &amp;quot;&amp;lt;abbr title=&amp;quot;These refer to the full body view of the Pokémon often seen in GUI, but most notably the summary UI. Like the previous code block, this section will require some trial and error, and you should come back to edit this later. (Tip: you can refresh your resource pack with F3 + T for quick edits.)&amp;quot;&amp;gt;profileTranslation&amp;quot;: [ 0, 0.4, 0 ]&amp;lt;/abbr&amp;gt;,&lt;br /&gt;
# &amp;lt;li value=19&amp;gt; Change the values for &amp;lt;code&amp;gt;profileScale&amp;lt;/code&amp;gt; and &amp;lt;code&amp;gt;profileTranslation&amp;lt;/code&amp;gt;&lt;br /&gt;
# Save the file&lt;br /&gt;
# Go back to Minecraft and press &amp;lt;code&amp;gt;F3+T&amp;lt;/code&amp;gt; to refresh all resource packs&lt;br /&gt;
# After loading, press M and examine your Pokémon in the party GUI.&lt;br /&gt;
#* Generally, you want this GUI to show your Pokémon&#039;s entire body. &lt;br /&gt;
#* You mainly want your Pokémon&#039;s body to stay within the camera borders on the left side of the menu. This will mostly prevent your Pokémon from overlapping on the right side of the menu.&lt;br /&gt;
# Repeat steps 16-22 until your Pokémon looks just right!&lt;br /&gt;
# Once your Pokémon looks just right in the party menus, go back to the main menu of Minecraft and proceed to the next part of the guide.&lt;br /&gt;
&lt;br /&gt;
At this point in the guide, your Pokémon should be fully functional in game. The last thing it needs is a way for it to spawn naturally in the game!&lt;br /&gt;
&amp;lt;/br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Part 10: Create your Pokémon&#039;s Spawn File ===&lt;br /&gt;
Once you create the spawn file for your Pokémon, it is considered complete! We will be using an example spawn file as a template to spawn your Pokémon. You can edit it to your liking with different [https://gitlab.com/cable-mc/cobblemon/-/wikis/Spawner/Spawn-Condition spawn conditions.] A list of biome tags you can use can be found [https://docs.google.com/document/d/1iB0EJSc2r6mRJXIo1n3XpHbZ5udwJVnrh2pXdhTyH8c/edit here].&lt;br /&gt;
&lt;br /&gt;
# Create a new text file and name it &amp;lt;code&amp;gt;&amp;lt;pokemon&amp;gt;.json&amp;lt;/code&amp;gt;&lt;br /&gt;
#* Example: &amp;lt;code&amp;gt;bulbasaur.json&amp;lt;/code&amp;gt;&lt;br /&gt;
#* Make sure this new file name ends in .json and not any other file extension like .txt. You may need to search &amp;quot;how to show file extensions&amp;quot; for whatever operating system you have.&lt;br /&gt;
# Open this new JSON in your preferred text editor&lt;br /&gt;
# Copy and paste this example data into the JSON:&lt;br /&gt;
#* Hover over the underlined text to see more information.&lt;br /&gt;
 {&lt;br /&gt;
  &amp;quot;&amp;lt;abbr title=&amp;quot;This determines whether this spawn data is enabled&amp;quot;&amp;gt;enabled&amp;quot;: true&amp;lt;/abbr&amp;gt;,&lt;br /&gt;
  &amp;quot;&amp;lt;abbr title=&amp;quot;These are lists that say whether the spawn data requires specific mods to be present. Namely, this is mostly for pokémon that spawn in biomes introduced by other mods.&amp;quot;&amp;gt;neededInstalledMods&amp;quot;: []&amp;lt;/abbr&amp;gt;,&lt;br /&gt;
  &amp;quot;&amp;lt;abbr title=&amp;quot;These are lists that say whether the spawn data requires specific mods to be present. Namely, this is mostly for pokémon that spawn in biomes introduced by other mods.&amp;quot;&amp;gt;neededUninstalledMods&amp;quot;: []&amp;lt;/abbr&amp;gt;,&lt;br /&gt;
  &amp;quot;&amp;lt;abbr title=&amp;quot;Here we are declaring where it will spawn.&amp;quot;&amp;gt;spawns&amp;lt;/abbr&amp;gt;&amp;quot;: [&lt;br /&gt;
    {&lt;br /&gt;
      &amp;quot;&amp;lt;abbr title=&amp;quot;Spawn locations require unique ID&#039;s. Calling them something like yourpokemon-1, yourpokemon-2 and so on is acceptable.&amp;quot;&amp;gt;id&amp;quot;: &amp;quot;tentaquil-1&amp;quot;&amp;lt;/abbr&amp;gt;,&lt;br /&gt;
      &amp;quot;&amp;lt;abbr title=&amp;quot;Which pokémon are we trying to spawn here?&amp;quot;&amp;gt;pokemon&amp;quot;: &amp;quot;tentaquil&amp;lt;/abbr&amp;gt;&amp;quot;,&lt;br /&gt;
      &amp;quot;&amp;lt;abbr title=&amp;quot;Presets are a collection of potential block candidates to spawn on, this way you don&#039;t need to clarify a ton of blocks every time you make a spawn file.&amp;quot;&amp;gt;presets&amp;lt;/abbr&amp;gt;&amp;quot;: [ &amp;quot;&amp;lt;abbr title=&amp;quot;natural is the most common preset. You can pick others like underground, freshwater, redstone or more.&amp;quot;&amp;gt;natural&amp;lt;/abbr&amp;gt;&amp;quot; ],&lt;br /&gt;
      &amp;quot;&amp;lt;abbr title=&amp;quot;We are spawning a pokémon here, so no need to change this.&amp;quot;&amp;gt;type&amp;quot;: &amp;quot;pokemon&amp;lt;/abbr&amp;gt;&amp;quot;,&lt;br /&gt;
      &amp;quot;&amp;lt;abbr title=&amp;quot;What sort of surface is this spawning on? We will keep it on &#039;grounded&#039; for this example.&amp;quot;&amp;gt;context&amp;quot;: &amp;quot;grounded&amp;lt;/abbr&amp;gt;&amp;quot;,&lt;br /&gt;
      &amp;quot;&amp;lt;abbr title=&amp;quot;How rare is this pokémon?&amp;quot;&amp;gt;bucket&amp;quot;: &amp;quot;uncommon&amp;lt;/abbr&amp;gt;&amp;quot;,&lt;br /&gt;
      &amp;quot;&amp;lt;abbr title=&amp;quot;This is the minimum and maximum level this pokémon can spawn at.&amp;quot;&amp;gt;level&amp;quot;: &amp;quot;18-60&amp;lt;/abbr&amp;gt;&amp;quot;,&lt;br /&gt;
      &amp;quot;&amp;lt;abbr title=&amp;quot;This number determines how likely it is to spawn considering its rarity.&amp;quot;&amp;gt;weight&amp;quot;: 10.0&amp;lt;/abbr&amp;gt;,&lt;br /&gt;
      &amp;quot;&amp;lt;abbr title=&amp;quot;Additional spawn conditions are listed in this section.&amp;quot;&amp;gt;condition&amp;lt;/abbr&amp;gt;&amp;quot;: {&lt;br /&gt;
        &amp;quot;&amp;lt;abbr title=&amp;quot;Whether or not this pokémon should be able to see the sky when it spawns.&amp;quot;&amp;gt;canSeeSky&amp;lt;/abbr&amp;gt;&amp;quot;: true,&lt;br /&gt;
        &amp;quot;&amp;lt;abbr title=&amp;quot;Here we list the biomes we want the pokémon to spawn in.&amp;quot;&amp;gt;biomes&amp;lt;/abbr&amp;gt;&amp;quot;: [ &amp;quot;&amp;lt;abbr title=&amp;quot;The Cobblemon tag for forest biomes. Allows Tentaquil to spawn in any biome tagged as a forest.&amp;quot;&amp;gt;#cobblemon:is_forest&amp;lt;/abbr&amp;gt;&amp;quot; ]&lt;br /&gt;
      }&lt;br /&gt;
    }&lt;br /&gt;
  ]&lt;br /&gt;
 }&lt;br /&gt;
# &amp;lt;li value=4&amp;gt; Replace the 2 instances of &amp;quot;tentaquil&amp;quot; with the name of your Pokémon&lt;br /&gt;
# Edit any of the other values if desired.&lt;br /&gt;
#* With the current template, your Pokémon will be an uncommon spawn in the forest.&lt;br /&gt;
# Save the file&lt;br /&gt;
# Place this new file in the &amp;lt;code&amp;gt;spawn_pool_world&amp;lt;/code&amp;gt; folder of your addon.&lt;br /&gt;
#* Ensure that you place it in the addon folder that is in the datapack folder!&lt;br /&gt;
# Load your Creative Single Player world from the main menu.&lt;br /&gt;
#* You always have to load the world from the main menu to see changes to &amp;lt;code&amp;gt;data&amp;lt;/code&amp;gt; files.&lt;br /&gt;
# Check if your Pokémon spawns where you assigned it to. You can use &amp;lt;code&amp;gt;/checkspawn &amp;lt;rarity&amp;gt;&amp;lt;/code&amp;gt; when in the assigned biome. &lt;br /&gt;
#* You can run the command &amp;lt;code&amp;gt;/locate biome &amp;lt;assigned biome&amp;gt;&amp;lt;/code&amp;gt; to get coordinates to the assigned biome. You can then click on the coordinates it gave you and be teleported instantly. &lt;br /&gt;
# Ensure that your Pokémon at least appears in the &amp;lt;code&amp;gt;checkspawn&amp;lt;/code&amp;gt; list after meeting its conditions.&lt;br /&gt;
#* If you made your Pokémon rare or ultra-rare, then it may take hours before you even see it spawn naturally.&lt;br /&gt;
# If your Pokémon appears in the checkspawn list, or if you see it spawn naturally, then you can consider this guide completed!&lt;br /&gt;
&lt;br /&gt;
Congratulations! You are now a Cobblemon modder. Hopefully your Pokémon will have no issues if you&#039;ve been following along. If you have any issues with your addon, help can be found in the Cobblemon Discord server.&lt;br /&gt;
&lt;br /&gt;
== Sharing your Pokémon Addon ==&lt;br /&gt;
Before you share your addon with others or upload it to a server, it is best to package your addon into a &amp;lt;code&amp;gt;.zip&amp;lt;/code&amp;gt;. This will allow you to share the single &amp;lt;code&amp;gt;.zip&amp;lt;/code&amp;gt; file instead of all the files individually. &lt;br /&gt;
&lt;br /&gt;
If you have been following this guide, you may have realized that some files that got updated while testing in game are now separated. We need to combine the &amp;lt;code&amp;gt;data&amp;lt;/code&amp;gt; and &amp;lt;code&amp;gt;assets&amp;lt;/code&amp;gt; folders again.&lt;br /&gt;
&lt;br /&gt;
# Create a new folder&lt;br /&gt;
# Name this new folder. This will be the final product name for your addon.&lt;br /&gt;
# Navigate to your addon folder inside the &amp;lt;code&amp;gt;datapacks&amp;lt;/code&amp;gt; folder&lt;br /&gt;
# Open your addon folder&lt;br /&gt;
# Copy the &amp;lt;code&amp;gt;data&amp;lt;/code&amp;gt; folder and the &amp;lt;code&amp;gt;pack.mcmeta&amp;lt;/code&amp;gt; file&lt;br /&gt;
#* If you have a &amp;lt;code&amp;gt;pack.png&amp;lt;/code&amp;gt;, copy that file too&lt;br /&gt;
# Paste them inside of your new addon folder&lt;br /&gt;
# Navigate to your addon folder inside the &amp;lt;code&amp;gt;resourcepacks&amp;lt;/code&amp;gt; folder&lt;br /&gt;
# Open your addon folder&lt;br /&gt;
# Copy the &amp;lt;code&amp;gt;assets&amp;lt;/code&amp;gt; folder&lt;br /&gt;
# Paste inside of your new addon folder&lt;br /&gt;
# Your up to date files should now be reunited in the new addon folder. Its structure and contents should look like the following folder tree:&lt;br /&gt;
==== Folder Structure ====&lt;br /&gt;
 &amp;lt;div class=&amp;quot;treeview&amp;quot;&amp;gt;&lt;br /&gt;
*&#039;&#039;(new addon folder name)&#039;&#039;&lt;br /&gt;
** &#039;&#039;&#039;pack.mcmeta&#039;&#039;&#039;&lt;br /&gt;
** &#039;&#039;&#039;pack.png&#039;&#039;&#039;&lt;br /&gt;
**assets&lt;br /&gt;
***cobblemon&lt;br /&gt;
****bedrock&lt;br /&gt;
*****pokemon&lt;br /&gt;
******animations&lt;br /&gt;
*******&amp;lt;pokemon name&amp;gt;&lt;br /&gt;
********&#039;&#039;&#039;&amp;lt;pokemon&amp;gt;.animation.json&#039;&#039;&#039;&lt;br /&gt;
******models&lt;br /&gt;
*******&amp;lt;pokemon name&amp;gt;&lt;br /&gt;
********&#039;&#039;&#039;&amp;lt;pokemon&amp;gt;.geo.json&#039;&#039;&#039;&lt;br /&gt;
******posers&lt;br /&gt;
*******&#039;&#039;&#039;&amp;lt;pokemon&amp;gt;.json&#039;&#039;&#039;&lt;br /&gt;
******resolvers&lt;br /&gt;
*******&amp;lt;pokemon&amp;gt;&lt;br /&gt;
********&#039;&#039;&#039;0_&amp;lt;pokemon&amp;gt;_base.json&#039;&#039;&#039;&lt;br /&gt;
****lang&lt;br /&gt;
*****&#039;&#039;&#039;en_us.json&#039;&#039;&#039;&lt;br /&gt;
****textures&lt;br /&gt;
*****pokemon&lt;br /&gt;
******&amp;lt;pokemon&amp;gt;&lt;br /&gt;
*******&#039;&#039;&#039;&amp;lt;pokemon&amp;gt;.png&#039;&#039;&#039;&lt;br /&gt;
*******&#039;&#039;&#039;&amp;lt;pokemon&amp;gt;_shiny.png&#039;&#039;&#039;&lt;br /&gt;
**data&lt;br /&gt;
***cobblemon&lt;br /&gt;
****spawn_pool_world&lt;br /&gt;
*****&#039;&#039;&#039;&amp;lt;pokemon&amp;gt;.json&#039;&#039;&#039;&lt;br /&gt;
****species&lt;br /&gt;
*****custom&lt;br /&gt;
******&#039;&#039;&#039;&amp;lt;pokemon&amp;gt;.json&#039;&#039;&#039;&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
# &amp;lt;li value=12&amp;gt; Ensure you followed steps 1-11 correctly.&lt;br /&gt;
#* If you followed along correctly, then you copied the correct and updated files so it should work properly when shared.&lt;br /&gt;
# Open your new addon folder&lt;br /&gt;
# Select all of the following items together: &amp;lt;code&amp;gt;data&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;assets&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;pack.mcmeta&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;pack.png&amp;lt;/code&amp;gt;(optional)&lt;br /&gt;
# Compress the files with your preferred zip file software.&lt;br /&gt;
#* If you are on Windows, you can compress them with the following method: Right click the selected items &amp;gt; send to &amp;gt; Compressed (zipped) folder&lt;br /&gt;
# Ensure that they are in a &amp;lt;code&amp;gt;.zip&amp;lt;/code&amp;gt; file&lt;br /&gt;
#* Minecraft wont read &amp;lt;code&amp;gt;.rar&amp;lt;/code&amp;gt; files&lt;br /&gt;
# Ensure that the &amp;lt;code&amp;gt;pack.mcmeta&amp;lt;/code&amp;gt; file is one of the first things you see when you open your zipped addon. &lt;br /&gt;
#* Minecraft will only read 1 folder deep for the &amp;lt;code&amp;gt;pack.mcmeta&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Your addon should now be ready to share! Remember that this new &amp;lt;code&amp;gt;zip&amp;lt;/code&amp;gt; file will still need to have a copy placed in both the &amp;lt;code&amp;gt;datapacks&amp;lt;/code&amp;gt; and &amp;lt;code&amp;gt;resourcepacks&amp;lt;/code&amp;gt; folders of those who will receive it. If you want to share the files on a server, then the server needs a copy in its datapack folder of the world. And every player will need a copy in their resourcepack folder!&lt;br /&gt;
&lt;br /&gt;
{{Addon Creation}}&lt;br /&gt;
[[Category:Tutorial]]&lt;/div&gt;</summary>
		<author><name>Hiroku</name></author>
	</entry>
	<entry>
		<id>https://wiki.cobblemon.com/index.php?title=Spawn_Rules&amp;diff=4789</id>
		<title>Spawn Rules</title>
		<link rel="alternate" type="text/html" href="https://wiki.cobblemon.com/index.php?title=Spawn_Rules&amp;diff=4789"/>
		<updated>2024-06-28T05:47:47Z</updated>

		<summary type="html">&lt;p&gt;Hiroku: it&amp;#039;s not a future feature anymore weee&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Spawn Rules are a datapack feature that allow addons to modify spawning behaviour in a global way. Spawn Rules contain a set of rule components, and there are several component types to choose from. Spawn rules are loaded from the `spawn_rules` folder.&lt;br /&gt;
&lt;br /&gt;
&amp;quot;weight&amp;quot;:&lt;br /&gt;
The weight rule component allows you to selectively modify the weight of spawn details as they are used. For example, you can make the weight of a Pikachu spawn in an area that is well lit to be multiplied by 20.&lt;br /&gt;
{&lt;br /&gt;
  &amp;quot;type&amp;quot;: &amp;quot;weight&amp;quot;,&lt;br /&gt;
  &amp;quot;spawnSelector&amp;quot;: &amp;quot;v.spawn.pokemon.species == &#039;pikachu&#039;&amp;quot;,&lt;br /&gt;
  &amp;quot;contextSelector&amp;quot;: &amp;quot;v.context.light &amp;gt; 8&amp;quot;,&lt;br /&gt;
  &amp;quot;weight&amp;quot;: &amp;quot;v.weight * 20&amp;quot;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;quot;filter&amp;quot;:&lt;br /&gt;
The filter rule component allows you to block or allow spawns. This is like adding a global rule against spawning. For example, you can make Pikachu unable to spawn in an area that is not well lit.&lt;br /&gt;
{&lt;br /&gt;
  &amp;quot;type&amp;quot;: &amp;quot;filter&amp;quot;,&lt;br /&gt;
  &amp;quot;spawnSelector&amp;quot;: &amp;quot;v.spawn.pokemon.species == &#039;pikachu&#039;&amp;quot;,&lt;br /&gt;
  &amp;quot;contextSelector&amp;quot;: &amp;quot;v.context.light &amp;lt; 8&amp;quot;,&lt;br /&gt;
  &amp;quot;allow&amp;quot;: &amp;quot;false&amp;quot;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;quot;location&amp;quot;:&lt;br /&gt;
The location rule component allows you to block or allow locations to be considered for any spawning. This is more aggressive than the filter rule component because it cancels the spawning process much sooner. This is best used to create no-spawn zones.&lt;br /&gt;
{&lt;br /&gt;
  &amp;quot;type&amp;quot;: &amp;quot;location&amp;quot;,&lt;br /&gt;
  &amp;quot;allow&amp;quot;: &amp;quot;v.y &amp;gt; 100 || v.world.is_of(&#039;minecraft:overworld&#039;)&amp;quot;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Spawn Detail Properties&lt;br /&gt;
Every spawn detail that is made available under the name &amp;quot;spawn&amp;quot; has properties that can be checked in your spawn rule components.&lt;br /&gt;
* &amp;quot;weight&amp;quot;: The base weight of the spawn.&lt;br /&gt;
* &amp;quot;percentage&amp;quot;: The base percentage spawn chance (usually null)&lt;br /&gt;
* &amp;quot;id&amp;quot;: The unique ID of the spawn.&lt;br /&gt;
* &amp;quot;bucket&amp;quot;: The bucket of the spawn.&lt;br /&gt;
* &amp;quot;width&amp;quot;: The specified width required for spawning.&lt;br /&gt;
* &amp;quot;height&amp;quot;: The specified height required for spawning.&lt;br /&gt;
* &amp;quot;context&amp;quot;: The context type of the spawn.&lt;br /&gt;
* &amp;quot;labels&amp;quot;: A list of label strings.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Pokémon Spawn Detail Properties&lt;br /&gt;
Pokémon spawn details have more properties than the general spawn detail.&lt;br /&gt;
* &amp;quot;pokemon&amp;quot;: The specified Pokémon as a variable. This is what was specified in the file.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Pokémon Properties&lt;br /&gt;
Pokémon Properties referenced from MoLang expressions have many properties.&lt;br /&gt;
* &amp;quot;species&amp;quot;: The species of the Pokémon, such as cobblemon:bulbasaur, if set.&lt;br /&gt;
* &amp;quot;level&amp;quot;: The level of the Pokémon, if set.&lt;br /&gt;
* &amp;quot;shiny&amp;quot;: True or false depending on if the Pokémon is explicitly marked as either. It can be null.&lt;br /&gt;
* &amp;quot;gender&amp;quot;: The gender name, if set.&lt;br /&gt;
* &amp;quot;friendship&amp;quot;: The friendship value of the Pokémon, if set.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Location properties&lt;br /&gt;
When using the &amp;quot;location&amp;quot; rule component, many variables are supplied.&lt;br /&gt;
* &amp;quot;x&amp;quot;: The x coordinate being checked.&lt;br /&gt;
* &amp;quot;y&amp;quot;: The y coordinate being checked.&lt;br /&gt;
* &amp;quot;z&amp;quot;: The z coordinate being checked.&lt;br /&gt;
* &amp;quot;context&amp;quot;: The context type being checked, such as &amp;quot;grounded&amp;quot; or &amp;quot;seafloor&amp;quot;.&lt;br /&gt;
* &amp;quot;world&amp;quot;: The world it&#039;s in. This contains two functions, is_of and is_in for checking the ID or if it fits a specific tag, respectively. For example, v.world.is_in(&#039;yourmod:your_world_tag&#039;).&lt;br /&gt;
* &amp;quot;dimension_type&amp;quot;: The dimension it&#039;s in. This contains the same two functions as the &amp;quot;world&amp;quot; property.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Context properties&lt;br /&gt;
When using a context selector, a context will be added as a variable and it contains many variables.&lt;br /&gt;
* &amp;quot;light&amp;quot;: The light level, from 0 to 15.&lt;br /&gt;
* &amp;quot;x&amp;quot;: The x coordinate.&lt;br /&gt;
* &amp;quot;y&amp;quot;: The y coordinate.&lt;br /&gt;
* &amp;quot;z&amp;quot;: The z coordinate.&lt;br /&gt;
* &amp;quot;moon_phase&amp;quot;: The phase of the moon, between 0 and 7 inclusive.&lt;br /&gt;
* &amp;quot;world&amp;quot;: The world of the context, in the same format in the &amp;quot;location&amp;quot; properties.&lt;br /&gt;
* &amp;quot;biome&amp;quot;: The biome of the context. This, like world and dimension type, contains two functions: is_of and is_in.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Example (weird) spawn rule:&lt;br /&gt;
{&lt;br /&gt;
  &amp;quot;displayName&amp;quot;: &amp;quot;Pikachu Daylight Multiplier - (Example file)&amp;quot;,&lt;br /&gt;
  &amp;quot;enabled&amp;quot;: &amp;quot;true&amp;quot;,&lt;br /&gt;
  &amp;quot;components&amp;quot;: [&lt;br /&gt;
    {&lt;br /&gt;
      &amp;quot;type&amp;quot;: &amp;quot;weight&amp;quot;,&lt;br /&gt;
      &amp;quot;spawnSelector&amp;quot;: &amp;quot;v.spawn.pokemon.species == &#039;pikachu&#039;&amp;quot;,&lt;br /&gt;
      &amp;quot;contextSelector&amp;quot;: &amp;quot;v.context.light &amp;gt; 8&amp;quot;,&lt;br /&gt;
      &amp;quot;weight&amp;quot;: &amp;quot;v.weight * 20&amp;quot;&lt;br /&gt;
    },&lt;br /&gt;
    {&lt;br /&gt;
      &amp;quot;type&amp;quot;: &amp;quot;filter&amp;quot;,&lt;br /&gt;
      &amp;quot;spawnSelector&amp;quot;: &amp;quot;v.spawn.pokemon.species == &#039;pikachu&#039;&amp;quot;,&lt;br /&gt;
      &amp;quot;contextSelector&amp;quot;: &amp;quot;v.context.light &amp;lt; 8&amp;quot;,&lt;br /&gt;
      &amp;quot;allow&amp;quot;: &amp;quot;false&amp;quot;&lt;br /&gt;
    },&lt;br /&gt;
    {&lt;br /&gt;
      &amp;quot;type&amp;quot;: &amp;quot;location&amp;quot;,&lt;br /&gt;
      &amp;quot;allow&amp;quot;: &amp;quot;v.y &amp;gt; 100 || v.world.is_of(&#039;minecraft:overworld&#039;)&amp;quot;&lt;br /&gt;
    }&lt;br /&gt;
  ]&lt;/div&gt;</summary>
		<author><name>Hiroku</name></author>
	</entry>
	<entry>
		<id>https://wiki.cobblemon.com/index.php?title=Dialogues&amp;diff=4788</id>
		<title>Dialogues</title>
		<link rel="alternate" type="text/html" href="https://wiki.cobblemon.com/index.php?title=Dialogues&amp;diff=4788"/>
		<updated>2024-06-28T04:38:09Z</updated>

		<summary type="html">&lt;p&gt;Hiroku: Created Dialogues page&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Dialogues are a feature that can be used from API or from datapacks to play conversations in a GUI. They display entities, view pages of text, and handle various types of input.&lt;br /&gt;
&lt;br /&gt;
A dialogue that has been registered through a datapack can be opened using the /opendialogue command.&lt;br /&gt;
&lt;br /&gt;
Every case of a MoLang expression can be either a single text property or can be an array of text to support running multiple expressions to produce a result.&lt;br /&gt;
&lt;br /&gt;
[[File:Dialogue_Intro.png|400px|center]]&lt;br /&gt;
&lt;br /&gt;
=Dialogue=&lt;br /&gt;
&lt;br /&gt;
A Dialogue JSON file consists of the following main elements:&lt;br /&gt;
&lt;br /&gt;
- &amp;lt;code&amp;gt;escapeAction&amp;lt;/code&amp;gt;: A string or array that defines the action to be taken when the dialogue is escaped. This can be a MoLang expression or a sequence of MoLang expressions.&lt;br /&gt;
&lt;br /&gt;
- &amp;lt;code&amp;gt;speakers&amp;lt;/code&amp;gt;: An object that defines the speakers in the dialogue. Each speaker is represented by a key-value pair, where the key is the speaker&#039;s identifier and the value is an object that describes what the speaker looks like and their name.&lt;br /&gt;
&lt;br /&gt;
- &amp;lt;code&amp;gt;pages&amp;lt;/code&amp;gt;: An array of objects, each representing a page in the dialogue.&lt;br /&gt;
&lt;br /&gt;
==Speakers==&lt;br /&gt;
&lt;br /&gt;
Each speaker is represented by an object with the following properties:&lt;br /&gt;
&lt;br /&gt;
- &amp;lt;code&amp;gt;name&amp;lt;/code&amp;gt;: A string or object that defines the speaker&#039;s name. This is usually just text. If it&#039;s an object, it must have a &amp;lt;code&amp;gt;type&amp;lt;/code&amp;gt; property set to &amp;lt;code&amp;gt;&amp;quot;expression&amp;quot;&amp;lt;/code&amp;gt; and an &amp;lt;code&amp;gt;expression&amp;lt;/code&amp;gt; property that contains a MoLang expression. You would use an expression if you wanted the name to be dynamic.&lt;br /&gt;
&lt;br /&gt;
- &amp;lt;code&amp;gt;face&amp;lt;/code&amp;gt;: An object or MoLang expression that defines the speaker&#039;s face. This will be rendered in a frame of the GUI. For objects, it must have a &amp;lt;code&amp;gt;type&amp;lt;/code&amp;gt; property set to the type of face. The only object type support currently is &amp;quot;standard&amp;quot;. The others are done using MoLang expressions rather than an object.&lt;br /&gt;
&lt;br /&gt;
===Faces===&lt;br /&gt;
The speaker faces can be defined in multiple ways. If it is an object it is going to be a &amp;quot;standard&amp;quot; face type.&lt;br /&gt;
&lt;br /&gt;
====&amp;quot;standard&amp;quot;====&lt;br /&gt;
The standard face type is for when the face displayed is not connected to a specific entity in the world but does follow Cobblemon&#039;s format of identifier and aspect list. The object must have the following properties:&lt;br /&gt;
&lt;br /&gt;
- &amp;lt;code&amp;gt;modelType&amp;lt;/code&amp;gt;: One of &#039;pokemon&#039;, &#039;npc&#039;&lt;br /&gt;
&lt;br /&gt;
- &amp;lt;code&amp;gt;identifier&amp;lt;/code&amp;gt;: The identifier of the Pokémon or NPC, such as &amp;lt;code&amp;gt;cobblemon:bulbasaur&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
- &amp;lt;code&amp;gt;aspects&amp;lt;/code&amp;gt;: An array of aspects that will be applied to the model.&lt;br /&gt;
&lt;br /&gt;
For example:&lt;br /&gt;
&lt;br /&gt;
  &amp;quot;face&amp;quot;: {&lt;br /&gt;
    &amp;quot;type&amp;quot;: &amp;quot;artificial&amp;quot;,&lt;br /&gt;
    &amp;quot;modelType&amp;quot;: &amp;quot;pokemon&amp;quot;,&lt;br /&gt;
    &amp;quot;identifier&amp;quot;: &amp;quot;cobblemon:pikachu&amp;quot;,&lt;br /&gt;
    &amp;quot;aspects&amp;quot;: [&lt;br /&gt;
      &amp;quot;shiny&amp;quot;&lt;br /&gt;
    ]&lt;br /&gt;
  }&lt;br /&gt;
  &lt;br /&gt;
&lt;br /&gt;
====player====&lt;br /&gt;
By using &amp;lt;code&amp;gt;q.player.face()&amp;lt;/code&amp;gt; you can make the player&#039;s model render for this face.&lt;br /&gt;
&lt;br /&gt;
For example:&lt;br /&gt;
&lt;br /&gt;
  &amp;quot;face&amp;quot;: &amp;quot;q.player.face();&amp;quot;&lt;br /&gt;
&lt;br /&gt;
====npc====&lt;br /&gt;
By using &amp;lt;code&amp;gt;q.npc.face()&amp;lt;/code&amp;gt; you can show a direct reference to the NPC you&#039;re having the dialogue with, if this was dialogue started with an NPC entity.&lt;br /&gt;
&lt;br /&gt;
For example:&lt;br /&gt;
&lt;br /&gt;
  &amp;quot;face&amp;quot;: &amp;quot;q.npc.face();&amp;quot;&lt;br /&gt;
&lt;br /&gt;
==Pages==&lt;br /&gt;
&lt;br /&gt;
Each page is represented by an object with the following properties:&lt;br /&gt;
&lt;br /&gt;
- &amp;lt;code&amp;gt;id&amp;lt;/code&amp;gt;: A string that uniquely identifies the page. This is needed for instances where you might want to jump to a specific page. Page numbers could be used, but you should use page IDs.&lt;br /&gt;
&lt;br /&gt;
- &amp;lt;code&amp;gt;speaker&amp;lt;/code&amp;gt;: A string that specifies the speaker&#039;s identifier. This depends upon the speaker by this identifier existing in the speakers list.&lt;br /&gt;
&lt;br /&gt;
- &amp;lt;code&amp;gt;lines&amp;lt;/code&amp;gt;: An array of strings or objects, each representing a line of text. If it&#039;s an object, it must have a &amp;lt;code&amp;gt;type&amp;lt;/code&amp;gt; property set to &amp;lt;code&amp;gt;&amp;quot;expression&amp;quot;&amp;lt;/code&amp;gt; and an &amp;lt;code&amp;gt;expression&amp;lt;/code&amp;gt; property that contains a MoLang expression that evaluates to a string. You would use an expression if you want to include variables to make dynamic text.&lt;br /&gt;
&lt;br /&gt;
- &amp;lt;code&amp;gt;input&amp;lt;/code&amp;gt;: An object or string that defines the input prompt. If it&#039;s an object, it must have a &amp;lt;code&amp;gt;type&amp;lt;/code&amp;gt; property set to &amp;lt;code&amp;gt;&amp;quot;option&amp;quot;&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;&amp;quot;text&amp;quot;&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;&amp;quot;auto-continue&amp;quot;&amp;lt;/code&amp;gt;, or &amp;lt;code&amp;gt;&amp;quot;none&amp;quot;&amp;lt;/code&amp;gt;, and other properties depending on the type. By default, the input value will be &amp;lt;code&amp;gt;none&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
- &amp;lt;code&amp;gt;escapeAction&amp;lt;/code&amp;gt;: A string or array that defines the action to be taken when the page is escaped. This can be a MoLang expression or a sequence of MoLang expressions.&lt;br /&gt;
&lt;br /&gt;
==Input Types==&lt;br /&gt;
&lt;br /&gt;
The &amp;lt;code&amp;gt;input&amp;lt;/code&amp;gt; property in a page object can have different structures depending on the &amp;lt;code&amp;gt;type&amp;lt;/code&amp;gt;. &lt;br /&gt;
&lt;br /&gt;
For all inputs that specify an &amp;lt;code&amp;gt;action&amp;lt;/code&amp;gt; property which is set to a MoLang expression, you can access the time it took for them to make that input using &amp;lt;code&amp;gt;v.seconds_taken_to_input&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
===&amp;quot;option&amp;quot;===&lt;br /&gt;
The input is a set of options. The object must have an &amp;lt;code&amp;gt;options&amp;lt;/code&amp;gt; property that is an array of objects, each representing an option. It can also specify whether the options should be displayed vertically or horizontally by whether or not the &amp;lt;code&amp;gt;vertical&amp;lt;/code&amp;gt; property is true or false.&lt;br /&gt;
&lt;br /&gt;
Each option object can have the following properties:&lt;br /&gt;
&lt;br /&gt;
- &amp;lt;code&amp;gt;value&amp;lt;/code&amp;gt;: The unique value of the dialogue option. This is not displayed to the player and is instead used to reference this option from scripts.&lt;br /&gt;
- &amp;lt;code&amp;gt;text&amp;lt;/code&amp;gt;The display text for the option. This can be a simple string or can be an object&lt;br /&gt;
- &amp;lt;code&amp;gt;action&amp;lt;/code&amp;gt;: The MoLang expression to run when the user chooses the option.&lt;br /&gt;
- &amp;lt;code&amp;gt;isVisible&amp;lt;/code&amp;gt;: A MoLang expression which must return either true or false. If false, the option will not be visible for the player. Defaults to true.&lt;br /&gt;
- &amp;lt;code&amp;gt;isSelectable&amp;lt;/code&amp;gt;: A MoLang expression which must return either true or false. If false, the option will be greyed out (but only if it is visible). Defaults to true.&lt;br /&gt;
&lt;br /&gt;
[[File:Dialogue_Options.png|600px|center]]&lt;br /&gt;
&lt;br /&gt;
===&amp;quot;text&amp;quot;===&lt;br /&gt;
The input is a text field. The &amp;lt;code&amp;gt;action&amp;lt;/code&amp;gt; property is a MoLang expression that will run when the player hits enter with text typed in. As specified earlier, you can check the text that they input using &amp;lt;code&amp;gt;v.selected_option&amp;lt;/code&amp;gt; inside of the MoLang expression.&lt;br /&gt;
&lt;br /&gt;
[[File:Dialogue_Input.png|600px|center]]&lt;br /&gt;
&lt;br /&gt;
===&amp;quot;auto-continue&amp;quot;===&lt;br /&gt;
The dialogue will automatically progress after some period of time. There are several optional properties for this.&lt;br /&gt;
&lt;br /&gt;
- &amp;lt;code&amp;gt;delay&amp;lt;/code&amp;gt;: The delay in seconds until it progresses. By default this is 5 seconds. &lt;br /&gt;
&lt;br /&gt;
- &amp;lt;code&amp;gt;allowSkip&amp;lt;/code&amp;gt;: Whether the user is able to skip the delay by clicking. By default this is true. If false, the player will be forced to wait for the delay.&lt;br /&gt;
&lt;br /&gt;
- &amp;lt;code&amp;gt;showTimer&amp;lt;/code&amp;gt;: Whether a bar will be displayed to indicate how much more time the player has until it auto-continues. Defaults to false.&lt;br /&gt;
&lt;br /&gt;
- &amp;lt;code&amp;gt;action&amp;lt;/code&amp;gt;: A MoLang expression that runs when either the player clicks (only when &amp;lt;code&amp;gt;allowSkip&amp;lt;/code&amp;gt; is true) or the delay finishes. By default this moves to the next page.&lt;br /&gt;
&lt;br /&gt;
===&amp;quot;none&amp;quot;===&lt;br /&gt;
There is no input except that it waits until the user clicks to continue. The object can have an &amp;lt;code&amp;gt;action&amp;lt;/code&amp;gt; property that defines the MoLang expression to run when the player clicks. By default, it moves to the next page.&lt;br /&gt;
&lt;br /&gt;
===Timeouts===&lt;br /&gt;
All input types except for &amp;lt;code&amp;gt;&amp;quot;none&amp;quot;&amp;lt;/code&amp;gt; and &amp;lt;code&amp;gt;&amp;quot;autocontinue&amp;quot;&amp;lt;/code&amp;gt; can have a &#039;timeout&#039; object which allows you to apply time constraints to the player viewing the page.&lt;br /&gt;
&lt;br /&gt;
The timeout object can have 3 properties:&lt;br /&gt;
&lt;br /&gt;
- &amp;lt;code&amp;gt;duration&amp;lt;/code&amp;gt;: The time, in seconds, that the player will have to complete the input. By default this is 10 seconds.&lt;br /&gt;
&lt;br /&gt;
- &amp;lt;code&amp;gt;showTimer&amp;lt;/code&amp;gt;: Whether or not a bar will be shown to show the player how much time they have left. By default this is true.&lt;br /&gt;
&lt;br /&gt;
- &amp;lt;code&amp;gt;action&amp;lt;/code&amp;gt;: A MoLang expression to run if they do not enter the input in time. By default this will close the dialogue.&lt;br /&gt;
&lt;br /&gt;
[[File:Dialogue_Timer.png|600px|center]]&lt;br /&gt;
&lt;br /&gt;
=Example=&lt;br /&gt;
The following example is built-in to the mod, labelled &amp;quot;example&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
  {&lt;br /&gt;
    &amp;quot;escapeAction&amp;quot;: &amp;quot;q.dialogue.set_page(&#039;quitter&#039;)&amp;quot;,&lt;br /&gt;
    &amp;quot;speakers&amp;quot;: {&lt;br /&gt;
      &amp;quot;pikachu&amp;quot;: {&lt;br /&gt;
        &amp;quot;name&amp;quot;: &amp;quot;The Voice of Hiro&amp;quot;,&lt;br /&gt;
        &amp;quot;face&amp;quot;: {&lt;br /&gt;
          &amp;quot;type&amp;quot;: &amp;quot;artificial&amp;quot;,&lt;br /&gt;
          &amp;quot;modelType&amp;quot;: &amp;quot;pokemon&amp;quot;,&lt;br /&gt;
          &amp;quot;identifier&amp;quot;: &amp;quot;cobblemon:pikachu&amp;quot;,&lt;br /&gt;
          &amp;quot;aspects&amp;quot;: [&lt;br /&gt;
            &amp;quot;shiny&amp;quot;&lt;br /&gt;
          ]&lt;br /&gt;
        }&lt;br /&gt;
      },&lt;br /&gt;
      &amp;quot;player&amp;quot;: {&lt;br /&gt;
        &amp;quot;face&amp;quot;: &amp;quot;q.player.face();&amp;quot;,&lt;br /&gt;
        &amp;quot;name&amp;quot;: {&lt;br /&gt;
          &amp;quot;type&amp;quot;: &amp;quot;expression&amp;quot;,&lt;br /&gt;
          &amp;quot;expression&amp;quot;: &amp;quot;q.player.username&amp;quot;&lt;br /&gt;
        }&lt;br /&gt;
      }&lt;br /&gt;
    },&lt;br /&gt;
    &amp;quot;pages&amp;quot;: [&lt;br /&gt;
      {&lt;br /&gt;
        &amp;quot;id&amp;quot;: &amp;quot;player-chat&amp;quot;,&lt;br /&gt;
        &amp;quot;speaker&amp;quot;: &amp;quot;player&amp;quot;,&lt;br /&gt;
        &amp;quot;lines&amp;quot;: [&lt;br /&gt;
          {&lt;br /&gt;
            &amp;quot;type&amp;quot;: &amp;quot;expression&amp;quot;,&lt;br /&gt;
            &amp;quot;expression&amp;quot;: &amp;quot;&#039;Hello, I\\&#039;m &#039; + q.player.username + &#039;!&#039;&amp;quot;&lt;br /&gt;
          }&lt;br /&gt;
        ]&lt;br /&gt;
      },&lt;br /&gt;
      {&lt;br /&gt;
        &amp;quot;speaker&amp;quot;: &amp;quot;pikachu&amp;quot;,&lt;br /&gt;
        &amp;quot;lines&amp;quot;: [&lt;br /&gt;
          {&lt;br /&gt;
            &amp;quot;type&amp;quot;: &amp;quot;expression&amp;quot;,&lt;br /&gt;
            &amp;quot;expression&amp;quot;: &amp;quot;&#039;Nice to meet you, &#039; + q.player.username + &#039;! Welcome to the world of dialogues!&#039;&amp;quot;&lt;br /&gt;
          }&lt;br /&gt;
        ]&lt;br /&gt;
      },&lt;br /&gt;
      {&lt;br /&gt;
        &amp;quot;id&amp;quot;: &amp;quot;intro&amp;quot;,&lt;br /&gt;
        &amp;quot;speaker&amp;quot;: &amp;quot;pikachu&amp;quot;,&lt;br /&gt;
        &amp;quot;lines&amp;quot;: [ &amp;quot;Do you want to learn more?&amp;quot;],&lt;br /&gt;
        &amp;quot;input&amp;quot;: {&lt;br /&gt;
          &amp;quot;type&amp;quot;: &amp;quot;option&amp;quot;,&lt;br /&gt;
          &amp;quot;vertical&amp;quot;: false,&lt;br /&gt;
          &amp;quot;options&amp;quot;: [&lt;br /&gt;
            {&lt;br /&gt;
              &amp;quot;text&amp;quot;: &amp;quot;Yes&amp;quot;,&lt;br /&gt;
              &amp;quot;value&amp;quot;: &amp;quot;yes&amp;quot;,&lt;br /&gt;
              &amp;quot;action&amp;quot;: [&lt;br /&gt;
                &amp;quot;v.player_response = &#039;That sounds great!&#039;;&amp;quot;,&lt;br /&gt;
                &amp;quot;v.next_page = &#039;page1&#039;;&amp;quot;,&lt;br /&gt;
                &amp;quot;q.dialogue.set_page(&#039;player-surrogate&#039;);&amp;quot;&lt;br /&gt;
              ]&lt;br /&gt;
            },&lt;br /&gt;
            {&lt;br /&gt;
              &amp;quot;text&amp;quot;: &amp;quot;No&amp;quot;,&lt;br /&gt;
              &amp;quot;value&amp;quot;: &amp;quot;no&amp;quot;,&lt;br /&gt;
              &amp;quot;action&amp;quot;: [&lt;br /&gt;
                &amp;quot;v.player_response = &#039;No, I really don\\&#039;t care.&#039;;&amp;quot;,&lt;br /&gt;
                &amp;quot;v.next_page = &#039;quitter&#039;;&amp;quot;,&lt;br /&gt;
                &amp;quot;q.dialogue.set_page(&#039;player-surrogate&#039;);&amp;quot;&lt;br /&gt;
              ]&lt;br /&gt;
            },&lt;br /&gt;
            {&lt;br /&gt;
              &amp;quot;text&amp;quot;: &amp;quot;Sword!&amp;quot;,&lt;br /&gt;
              &amp;quot;value&amp;quot;: &amp;quot;sword&amp;quot;,&lt;br /&gt;
              &amp;quot;isVisible&amp;quot;: &amp;quot;q.player.main_held_item.is_of(&#039;minecraft:iron_sword&#039;)&amp;quot;,&lt;br /&gt;
              &amp;quot;isSelectable&amp;quot;: &amp;quot;q.player.data.scared_npc != true;&amp;quot;,&lt;br /&gt;
              &amp;quot;action&amp;quot;: [&lt;br /&gt;
                &amp;quot;v.player_response = &#039;How about you die! Muahahaha!&#039;;&amp;quot;,&lt;br /&gt;
                &amp;quot;v.next_page = &#039;sword&#039;;&amp;quot;,&lt;br /&gt;
                &amp;quot;q.dialogue.set_page(&#039;player-surrogate&#039;);&amp;quot;&lt;br /&gt;
              ]&lt;br /&gt;
            },&lt;br /&gt;
            {&lt;br /&gt;
              &amp;quot;text&amp;quot;: &amp;quot;Sword again!&amp;quot;,&lt;br /&gt;
              &amp;quot;value&amp;quot;: &amp;quot;sword2&amp;quot;,&lt;br /&gt;
              &amp;quot;isVisible&amp;quot;: &amp;quot;q.player.main_held_item.is_of(&#039;minecraft:iron_sword&#039;)&amp;quot;,&lt;br /&gt;
              &amp;quot;isSelectable&amp;quot;: &amp;quot;q.player.data.scared_npc == true;&amp;quot;,&lt;br /&gt;
              &amp;quot;action&amp;quot;: [&lt;br /&gt;
                &amp;quot;v.player_response = &#039;How about you die... again! Muahahaha!&#039;;&amp;quot;,&lt;br /&gt;
                &amp;quot;v.next_page = &#039;sword-again&#039;;&amp;quot;,&lt;br /&gt;
                &amp;quot;q.dialogue.set_page(&#039;player-surrogate&#039;);&amp;quot;&lt;br /&gt;
              ]&lt;br /&gt;
            }&lt;br /&gt;
          ]&lt;br /&gt;
        }&lt;br /&gt;
      },&lt;br /&gt;
      {&lt;br /&gt;
        &amp;quot;id&amp;quot;: &amp;quot;player-surrogate&amp;quot;,&lt;br /&gt;
        &amp;quot;speaker&amp;quot;: &amp;quot;player&amp;quot;,&lt;br /&gt;
        &amp;quot;lines&amp;quot;: [&lt;br /&gt;
          {&lt;br /&gt;
            &amp;quot;type&amp;quot;: &amp;quot;expression&amp;quot;,&lt;br /&gt;
            &amp;quot;expression&amp;quot;: &amp;quot;v.player_response;&amp;quot;&lt;br /&gt;
          }&lt;br /&gt;
        ],&lt;br /&gt;
        &amp;quot;input&amp;quot;: &amp;quot;q.dialogue.set_page(v.next_page);&amp;quot;&lt;br /&gt;
      },&lt;br /&gt;
      {&lt;br /&gt;
        &amp;quot;id&amp;quot;: &amp;quot;page1&amp;quot;,&lt;br /&gt;
        &amp;quot;speaker&amp;quot;: &amp;quot;pikachu&amp;quot;,&lt;br /&gt;
        &amp;quot;lines&amp;quot;: [&lt;br /&gt;
          &amp;quot;Well you see, this is a dialogue.&amp;quot;,&lt;br /&gt;
          &amp;quot;You can have multiple pages, and each page can have multiple lines.&amp;quot;&lt;br /&gt;
        ]&lt;br /&gt;
      },&lt;br /&gt;
      {&lt;br /&gt;
        &amp;quot;id&amp;quot;: &amp;quot;page2&amp;quot;,&lt;br /&gt;
        &amp;quot;speaker&amp;quot;: &amp;quot;pikachu&amp;quot;,&lt;br /&gt;
        &amp;quot;lines&amp;quot;: [&amp;quot;On an unrelated note, did you know that I&#039;m deeply afraid of iron swords? Anyway, cya!&amp;quot;],&lt;br /&gt;
        &amp;quot;input&amp;quot;: {&lt;br /&gt;
          &amp;quot;type&amp;quot;: &amp;quot;auto-continue&amp;quot;,&lt;br /&gt;
          &amp;quot;delay&amp;quot;: 5,&lt;br /&gt;
          &amp;quot;allowSkip&amp;quot;: true,&lt;br /&gt;
          &amp;quot;action&amp;quot;: &amp;quot;q.dialogue.close();&amp;quot;&lt;br /&gt;
        }&lt;br /&gt;
      },&lt;br /&gt;
      {&lt;br /&gt;
        &amp;quot;id&amp;quot;: &amp;quot;quitter&amp;quot;,&lt;br /&gt;
        &amp;quot;speaker&amp;quot;: &amp;quot;pikachu&amp;quot;,&lt;br /&gt;
        &amp;quot;lines&amp;quot;: [&amp;quot;Fine. Be that way.&amp;quot;],&lt;br /&gt;
        &amp;quot;input&amp;quot;: &amp;quot;q.dialogue.close();&amp;quot;,&lt;br /&gt;
        &amp;quot;escapeAction&amp;quot;: &amp;quot;q.dialogue.close();&amp;quot;&lt;br /&gt;
      },&lt;br /&gt;
      {&lt;br /&gt;
        &amp;quot;id&amp;quot;: &amp;quot;sword&amp;quot;,&lt;br /&gt;
        &amp;quot;speaker&amp;quot;: &amp;quot;pikachu&amp;quot;,&lt;br /&gt;
        &amp;quot;lines&amp;quot;: [&amp;quot;Oh god no, please don&#039;t hurt me!&amp;quot;],&lt;br /&gt;
        &amp;quot;escapeAction&amp;quot;: &amp;quot;q.dialogue.input(&#039;&#039;);&amp;quot;,&lt;br /&gt;
        &amp;quot;input&amp;quot;: [&lt;br /&gt;
          &amp;quot;t.data = q.player.data();&amp;quot;,&lt;br /&gt;
          &amp;quot;t.data.scared_npc = true;&amp;quot;,&lt;br /&gt;
          &amp;quot;q.player.save_data();&amp;quot;,&lt;br /&gt;
          &amp;quot;q.dialogue.close();&amp;quot;&lt;br /&gt;
        ]&lt;br /&gt;
      },&lt;br /&gt;
      {&lt;br /&gt;
        &amp;quot;id&amp;quot;: &amp;quot;sword-again&amp;quot;,&lt;br /&gt;
        &amp;quot;speaker&amp;quot;: &amp;quot;pikachu&amp;quot;,&lt;br /&gt;
        &amp;quot;lines&amp;quot;: [&amp;quot;I&#039;m ready for you this time. YOU will die today!&amp;quot;],&lt;br /&gt;
        &amp;quot;escapeAction&amp;quot;: &amp;quot;0&amp;quot;,&lt;br /&gt;
        &amp;quot;input&amp;quot;: {&lt;br /&gt;
          &amp;quot;type&amp;quot;: &amp;quot;option&amp;quot;,&lt;br /&gt;
          &amp;quot;vertical&amp;quot;: true,&lt;br /&gt;
          &amp;quot;timeout&amp;quot;: {&lt;br /&gt;
            &amp;quot;delay&amp;quot;: 6,&lt;br /&gt;
            &amp;quot;action&amp;quot;: &amp;quot;q.dialogue.input(&#039;stand&#039;);&amp;quot;&lt;br /&gt;
          },&lt;br /&gt;
          &amp;quot;options&amp;quot;: [&lt;br /&gt;
            {&lt;br /&gt;
              &amp;quot;text&amp;quot;: &amp;quot;Parry his attack.&amp;quot;,&lt;br /&gt;
              &amp;quot;value&amp;quot;: &amp;quot;parry&amp;quot;,&lt;br /&gt;
              &amp;quot;action&amp;quot;: [&lt;br /&gt;
                &amp;quot;v.reaction = &#039;parry&#039;;&amp;quot;,&lt;br /&gt;
                &amp;quot;q.dialogue.set_page(&#039;sword-again-decided&#039;);&amp;quot;&lt;br /&gt;
              ]&lt;br /&gt;
            },&lt;br /&gt;
            {&lt;br /&gt;
              &amp;quot;text&amp;quot;: &amp;quot;Stand perfectly still.&amp;quot;,&lt;br /&gt;
              &amp;quot;value&amp;quot;: &amp;quot;stand&amp;quot;,&lt;br /&gt;
              &amp;quot;action&amp;quot;: [&lt;br /&gt;
                &amp;quot;v.reaction = &#039;stand still&#039;;&amp;quot;,&lt;br /&gt;
                &amp;quot;q.dialogue.set_page(&#039;sword-again-decided&#039;);&amp;quot;&lt;br /&gt;
              ]&lt;br /&gt;
            },&lt;br /&gt;
            {&lt;br /&gt;
              &amp;quot;text&amp;quot;: &amp;quot;Drop your sword.&amp;quot;,&lt;br /&gt;
              &amp;quot;value&amp;quot;: &amp;quot;drop&amp;quot;,&lt;br /&gt;
              &amp;quot;action&amp;quot;: [&lt;br /&gt;
                &amp;quot;v.reaction = &#039;drop your sword&#039;;&amp;quot;,&lt;br /&gt;
                &amp;quot;q.dialogue.set_page(&#039;sword-again-decided&#039;);&amp;quot;&lt;br /&gt;
              ]&lt;br /&gt;
            }&lt;br /&gt;
          ]&lt;br /&gt;
        }&lt;br /&gt;
      },&lt;br /&gt;
      {&lt;br /&gt;
        &amp;quot;id&amp;quot;: &amp;quot;sword-again-decided&amp;quot;,&lt;br /&gt;
        &amp;quot;lines&amp;quot;: [&lt;br /&gt;
          {&lt;br /&gt;
            &amp;quot;type&amp;quot;: &amp;quot;expression&amp;quot;,&lt;br /&gt;
            &amp;quot;expression&amp;quot;: &amp;quot;v.reaction == &#039;parry&#039; ? &#039;You parry his attack and kill him.&#039; : (v.reaction == &#039;stand still&#039; ? &#039;He kills you.&#039; : &#039;You drop your sword and he kills you.&#039;)&amp;quot;&lt;br /&gt;
          }&lt;br /&gt;
        ],&lt;br /&gt;
        &amp;quot;input&amp;quot;: {&lt;br /&gt;
          &amp;quot;type&amp;quot;: &amp;quot;auto-continue&amp;quot;,&lt;br /&gt;
          &amp;quot;delay&amp;quot;: 3,&lt;br /&gt;
          &amp;quot;allowSkip&amp;quot;: false,&lt;br /&gt;
          &amp;quot;showTimer&amp;quot;: false,&lt;br /&gt;
          &amp;quot;action&amp;quot;: &amp;quot;q.dialogue.set_page(&#039;sword-again-reaction&#039;);&amp;quot;&lt;br /&gt;
        }&lt;br /&gt;
      },&lt;br /&gt;
      {&lt;br /&gt;
        &amp;quot;id&amp;quot;: &amp;quot;sword-again-reaction&amp;quot;,&lt;br /&gt;
        &amp;quot;speaker&amp;quot;: &amp;quot;pikachu&amp;quot;,&lt;br /&gt;
        &amp;quot;lines&amp;quot;: [&lt;br /&gt;
          {&lt;br /&gt;
            &amp;quot;type&amp;quot;: &amp;quot;expression&amp;quot;,&lt;br /&gt;
            &amp;quot;expression&amp;quot;: &amp;quot;&#039;Nah, I\\&#039;m just kidding. Interesting that you chose to &#039; + v.reaction + &#039; though.&#039;&amp;quot;&lt;br /&gt;
          }&lt;br /&gt;
        ]&lt;br /&gt;
      },&lt;br /&gt;
      {&lt;br /&gt;
        &amp;quot;id&amp;quot;: &amp;quot;name-question&amp;quot;,&lt;br /&gt;
        &amp;quot;speaker&amp;quot;: &amp;quot;pikachu&amp;quot;,&lt;br /&gt;
        &amp;quot;lines&amp;quot;: [ &amp;quot;Here&#039;s a puzzle though... What is my name? Lowercase only.&amp;quot;],&lt;br /&gt;
        &amp;quot;input&amp;quot;: {&lt;br /&gt;
          &amp;quot;type&amp;quot;: &amp;quot;text&amp;quot;,&lt;br /&gt;
          &amp;quot;timeout&amp;quot;: {&lt;br /&gt;
            &amp;quot;delay&amp;quot;: 10,&lt;br /&gt;
            &amp;quot;action&amp;quot;: &amp;quot;q.dialogue.set_page(&#039;too-slow&#039;);&amp;quot;&lt;br /&gt;
          },&lt;br /&gt;
          &amp;quot;action&amp;quot;: [&lt;br /&gt;
            &amp;quot;q.dialogue.set_page(&#039;name-speak&#039;);&amp;quot;,&lt;br /&gt;
            &amp;quot;t.data = q.player.data();&amp;quot;&lt;br /&gt;
          ]&lt;br /&gt;
        }&lt;br /&gt;
      },&lt;br /&gt;
      {&lt;br /&gt;
        &amp;quot;id&amp;quot;: &amp;quot;name-speak&amp;quot;,&lt;br /&gt;
        &amp;quot;speaker&amp;quot;: &amp;quot;player&amp;quot;,&lt;br /&gt;
        &amp;quot;lines&amp;quot;: [&lt;br /&gt;
          {&lt;br /&gt;
            &amp;quot;type&amp;quot;: &amp;quot;expression&amp;quot;,&lt;br /&gt;
            &amp;quot;expression&amp;quot;: &amp;quot;&#039;Your name is &#039; + v.selected_option + &#039;, right?&#039;&amp;quot;&lt;br /&gt;
          }&lt;br /&gt;
        ],&lt;br /&gt;
        &amp;quot;input&amp;quot;: &amp;quot;q.dialogue.set_page(&#039;name-guess&#039;);&amp;quot;&lt;br /&gt;
      },&lt;br /&gt;
      {&lt;br /&gt;
        &amp;quot;id&amp;quot;: &amp;quot;name-guess&amp;quot;,&lt;br /&gt;
        &amp;quot;speaker&amp;quot;: &amp;quot;pikachu&amp;quot;,&lt;br /&gt;
        &amp;quot;lines&amp;quot;: [&lt;br /&gt;
          {&lt;br /&gt;
            &amp;quot;type&amp;quot;: &amp;quot;expression&amp;quot;,&lt;br /&gt;
            &amp;quot;expression&amp;quot;: &amp;quot;v.selected_option == &#039;hiroku&#039; ? &#039;Correct! You know things that you shouldn\\&#039;t...&#039; : (&#039;Wrong! I\\&#039;m not \&amp;quot;&#039; + v.selected_option + &#039;\&amp;quot;. Whoever that is.&#039;)&amp;quot;&lt;br /&gt;
          }&lt;br /&gt;
        ],&lt;br /&gt;
        &amp;quot;input&amp;quot;: {&lt;br /&gt;
          &amp;quot;type&amp;quot;: &amp;quot;auto-continue&amp;quot;,&lt;br /&gt;
          &amp;quot;delay&amp;quot;: 5,&lt;br /&gt;
          &amp;quot;allowSkip&amp;quot;: true,&lt;br /&gt;
          &amp;quot;action&amp;quot;: &amp;quot;q.dialogue.set_page(&#039;farewell&#039;);&amp;quot;&lt;br /&gt;
        }&lt;br /&gt;
      },&lt;br /&gt;
      {&lt;br /&gt;
        &amp;quot;id&amp;quot;: &amp;quot;farewell&amp;quot;,&lt;br /&gt;
        &amp;quot;speaker&amp;quot;: &amp;quot;pikachu&amp;quot;,&lt;br /&gt;
        &amp;quot;lines&amp;quot;: [&amp;quot;Anyway, I&#039;m done with this dialogue. Bye!&amp;quot;],&lt;br /&gt;
        &amp;quot;input&amp;quot;: &amp;quot;q.dialogue.close();&amp;quot;&lt;br /&gt;
      },&lt;br /&gt;
      {&lt;br /&gt;
        &amp;quot;id&amp;quot;: &amp;quot;too-slow&amp;quot;,&lt;br /&gt;
        &amp;quot;speaker&amp;quot;: &amp;quot;pikachu&amp;quot;,&lt;br /&gt;
        &amp;quot;lines&amp;quot;: [&amp;quot;Don&#039;t know? Sad. Well I don&#039;t know your name either, so I guess we&#039;re even.&amp;quot;],&lt;br /&gt;
        &amp;quot;input&amp;quot;: &amp;quot;q.dialogue.close()&amp;quot;&lt;br /&gt;
      }&lt;br /&gt;
    ]&lt;br /&gt;
  }&lt;/div&gt;</summary>
		<author><name>Hiroku</name></author>
	</entry>
	<entry>
		<id>https://wiki.cobblemon.com/index.php?title=File:Dialogue_Input.png&amp;diff=4787</id>
		<title>File:Dialogue Input.png</title>
		<link rel="alternate" type="text/html" href="https://wiki.cobblemon.com/index.php?title=File:Dialogue_Input.png&amp;diff=4787"/>
		<updated>2024-06-28T04:33:56Z</updated>

		<summary type="html">&lt;p&gt;Hiroku: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&lt;/div&gt;</summary>
		<author><name>Hiroku</name></author>
	</entry>
	<entry>
		<id>https://wiki.cobblemon.com/index.php?title=File:Dialogue_Timer.png&amp;diff=4786</id>
		<title>File:Dialogue Timer.png</title>
		<link rel="alternate" type="text/html" href="https://wiki.cobblemon.com/index.php?title=File:Dialogue_Timer.png&amp;diff=4786"/>
		<updated>2024-06-28T04:33:37Z</updated>

		<summary type="html">&lt;p&gt;Hiroku: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&lt;/div&gt;</summary>
		<author><name>Hiroku</name></author>
	</entry>
	<entry>
		<id>https://wiki.cobblemon.com/index.php?title=File:Dialogue_Options.png&amp;diff=4785</id>
		<title>File:Dialogue Options.png</title>
		<link rel="alternate" type="text/html" href="https://wiki.cobblemon.com/index.php?title=File:Dialogue_Options.png&amp;diff=4785"/>
		<updated>2024-06-28T04:31:31Z</updated>

		<summary type="html">&lt;p&gt;Hiroku: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&lt;/div&gt;</summary>
		<author><name>Hiroku</name></author>
	</entry>
	<entry>
		<id>https://wiki.cobblemon.com/index.php?title=File:Dialogue_Intro.png&amp;diff=4784</id>
		<title>File:Dialogue Intro.png</title>
		<link rel="alternate" type="text/html" href="https://wiki.cobblemon.com/index.php?title=File:Dialogue_Intro.png&amp;diff=4784"/>
		<updated>2024-06-28T04:30:02Z</updated>

		<summary type="html">&lt;p&gt;Hiroku: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&lt;/div&gt;</summary>
		<author><name>Hiroku</name></author>
	</entry>
</feed>