<?xml version="1.0"?>
<feed xmlns="http://www.w3.org/2005/Atom" xml:lang="en-GB">
	<id>https://forge.gemwire.uk/api.php?action=feedcontributions&amp;feedformat=atom&amp;user=RobotGryphon</id>
	<title>Forge Community Wiki - User contributions [en-gb]</title>
	<link rel="self" type="application/atom+xml" href="https://forge.gemwire.uk/api.php?action=feedcontributions&amp;feedformat=atom&amp;user=RobotGryphon"/>
	<link rel="alternate" type="text/html" href="https://forge.gemwire.uk/wiki/Special:Contributions/RobotGryphon"/>
	<updated>2026-04-30T14:32:45Z</updated>
	<subtitle>User contributions</subtitle>
	<generator>MediaWiki 1.35.0</generator>
	<entry>
		<id>https://forge.gemwire.uk/index.php?title=Main_Page&amp;diff=2651</id>
		<title>Main Page</title>
		<link rel="alternate" type="text/html" href="https://forge.gemwire.uk/index.php?title=Main_Page&amp;diff=2651"/>
		<updated>2021-06-17T13:45:13Z</updated>

		<summary type="html">&lt;p&gt;RobotGryphon: Made a new recipes section, added link to Custom Recipes page.&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;__NOTOC__&lt;br /&gt;
&amp;lt;templatestyles src=&amp;quot;:Main_Page/styles.css&amp;quot; /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div class=&amp;quot;center title&amp;quot;&amp;gt;Forge Community Wiki&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
The Forge Community Wiki exists so that the community can:&lt;br /&gt;
&lt;br /&gt;
* collectively keep track of major changes and updates to Forge and Vanilla code;&lt;br /&gt;
* create and edit articles with in-depth explanations about a variety of Forge-related subjects; and&lt;br /&gt;
* contribute example code and tutorials for both simple and difficult concepts.&lt;br /&gt;
&lt;br /&gt;
This wiki is editable by any registered user with an account. This is to allow tracking of harmful edits, but isn't imposing any annoying limits. We welcome any edit, however small. Join the [https://discord.gg/Nn42eAh Discord] to discuss changes and edits to the wiki with others and the staff.&lt;br /&gt;
&lt;br /&gt;
''The wiki is still under heavy construction. Pages may move around, so if you bookmark a page, beware when the page is moved and your bookmarked link dies.''&lt;br /&gt;
&lt;br /&gt;
Please note that we only maintain wiki entries for the Latest and Long Term Support (LTS) releases. Once a documented release is no longer under LTS, it will be removed.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div class=&amp;quot;center round_warning&amp;quot;&amp;gt;&lt;br /&gt;
Please read the [[FCWMeta:Wiki Policy|wiki policy]] before editing!&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div class=&amp;quot;center&amp;quot; style=&amp;quot;margin-bottom: 2em&amp;quot;&amp;gt;&lt;br /&gt;
The current ''Latest'' version is '''1.16.5'''. The current ''Long Term Support (LTS)'' version is '''1.15.2'''.&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div class=&amp;quot;box_container center&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div class=&amp;quot;box&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;h3&amp;gt;Beginner Topics&amp;lt;/h3&amp;gt;&lt;br /&gt;
* [[Getting Started]]&lt;br /&gt;
* [[Proper Mod Structuring]]&lt;br /&gt;
* [[Debug Profiler|The Debug Profiler]]&lt;br /&gt;
* [[Update Checker]]&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div class=&amp;quot;box&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;h3&amp;gt;Common Concepts&amp;lt;/h3&amp;gt;&lt;br /&gt;
* [[Sides|Understanding Sides]]&lt;br /&gt;
* [[Events|Understanding Events]]&lt;br /&gt;
* [[Registration]]&lt;br /&gt;
* [[Internationalization]]&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div class=&amp;quot;box&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;h3&amp;gt;Forge Conventions&amp;lt;/h3&amp;gt;&lt;br /&gt;
* [[Semantic Versioning]]&lt;br /&gt;
* [[Stages of Modloading]]&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div class=&amp;quot;box&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;h3&amp;gt;Resources and Data&amp;lt;/h3&amp;gt;&lt;br /&gt;
* [[Using Resources|Introduction]]&lt;br /&gt;
* [[Recipes]]&lt;br /&gt;
* [[Tags]]&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div class=&amp;quot;box&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;h3&amp;gt;Blocks&amp;lt;/h3&amp;gt;&lt;br /&gt;
* [[Making Blocks|Creating Blocks]]&lt;br /&gt;
* [[Understanding Blockstates]] &lt;br /&gt;
* [[Interacting With Blocks|Block Interactions]]&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div class=&amp;quot;box&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;h3&amp;gt;Items&amp;lt;/h3&amp;gt;&lt;br /&gt;
* [[Making Items]]&lt;br /&gt;
* [[Making Tools]]&lt;br /&gt;
* [[ItemStack TileEntityRenderer|&amp;lt;tt&amp;gt;ItemStackTileEntityRenderer&amp;lt;/tt&amp;gt;]]&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div class=&amp;quot;box&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;h3&amp;gt;Data Generation&amp;lt;/h3&amp;gt;&lt;br /&gt;
* [[Datageneration|Introduction]]&lt;br /&gt;
* [[Datageneration/Recipes|Recipes]]&lt;br /&gt;
* [[Datageneration/Tags|Tags]]&lt;br /&gt;
* [[Datageneration/Loot_Tables|Loot Tables]]&lt;br /&gt;
* [[Datageneration/I18n|Localization]]&lt;br /&gt;
* [[Datageneration/States and Models|&amp;lt;tt&amp;gt;BlockState&amp;lt;/tt&amp;gt;s and Models]]&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div class=&amp;quot;box&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;h3&amp;gt;Tile Entities&amp;lt;/h3&amp;gt;&lt;br /&gt;
* [[Basics of Tile Entities|Introduction]]&lt;br /&gt;
* [[Using Tile Entity Renderers]]&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div class=&amp;quot;box&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;h3&amp;gt;Models&amp;lt;/h3&amp;gt;&lt;br /&gt;
* [[Introduction to Models|Introduction]]&lt;br /&gt;
* [[Model JSONs]]&lt;br /&gt;
* [[BlockState JSONs]]&lt;br /&gt;
* [[Coloring textures dynamically|Dynamically Colored Textures]]&lt;br /&gt;
* [[Item Overrides]]&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div class=&amp;quot;box&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;h3&amp;gt;Handling Information&amp;lt;/h3&amp;gt;&lt;br /&gt;
* [[Understanding Networking|Introduction]]&lt;br /&gt;
* [[Using NBT|Named Binary Tag (NBT)]]&lt;br /&gt;
* [[Using PacketBuffer|Using &amp;lt;tt&amp;gt;PacketBuffer&amp;lt;/tt&amp;gt;]]&lt;br /&gt;
* [[Sending Packets|Sending and Receiving Packets]]&lt;br /&gt;
* [[Using SimpleChannel|Using &amp;lt;tt&amp;gt;SimpleChannel&amp;lt;/tt&amp;gt;]]&lt;br /&gt;
* [[Networking with Entities]]&lt;br /&gt;
* [[DynamicOps|Using DynamicOps]]&lt;br /&gt;
* [[Codecs|Using Codecs]]&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div class=&amp;quot;box&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;h3&amp;gt;Data Storage&amp;lt;/h3&amp;gt;&lt;br /&gt;
* [[Capabilities|Understanding Capabilities]] &lt;br /&gt;
* [[Capabilities/Attaching|Attaching Capabilities]]&lt;br /&gt;
* [[World Saved Data]]&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div class=&amp;quot;box&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;h3&amp;gt;Game Effects&amp;lt;/h3&amp;gt;&lt;br /&gt;
* [[Effects]]&lt;br /&gt;
* [[Potions]]&lt;br /&gt;
* [[Particles]]&lt;br /&gt;
* [[Sounds]]&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div class=&amp;quot;box&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;h3&amp;gt;Events&amp;lt;/h3&amp;gt;&lt;br /&gt;
* [[Events|Understanding Events]]&lt;br /&gt;
* [[Entity Events]]&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div class=&amp;quot;box&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;h3&amp;gt;Others&amp;lt;/h3&amp;gt;&lt;br /&gt;
* [[Dependencies]]&lt;br /&gt;
* [[Dynamic Loot Modification]]&lt;br /&gt;
* [[Text Components|Text Components and Translation Keys]]&lt;br /&gt;
* [[Key Bindings]]&lt;br /&gt;
* [[Access Transformers]]&lt;br /&gt;
* [[Toolchain]]&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div class=&amp;quot;box&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;h3&amp;gt;Recipes&amp;lt;/h3&amp;gt;&lt;br /&gt;
* [[Recipes]]&lt;br /&gt;
* [[Custom Recipes|Custom Recipe Types]]&lt;br /&gt;
* [[Datageneration/Recipes|Datageneration]]&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;/div&gt;</summary>
		<author><name>RobotGryphon</name></author>
	</entry>
	<entry>
		<id>https://forge.gemwire.uk/index.php?title=Custom_Recipes&amp;diff=2650</id>
		<title>Custom Recipes</title>
		<link rel="alternate" type="text/html" href="https://forge.gemwire.uk/index.php?title=Custom_Recipes&amp;diff=2650"/>
		<updated>2021-06-05T17:45:19Z</updated>

		<summary type="html">&lt;p&gt;RobotGryphon: /* Setup */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;= Custom Recipe Serializers =&lt;br /&gt;
&lt;br /&gt;
Want to make a custom recipe type for a machine, or some mechanic your mod has? Great! It means users can participate in the datapack system for recipes, so you get automatic syncing, updating, and ease of maintenance on servers. Here's what you need to get started:&lt;br /&gt;
&lt;br /&gt;
== Classes/Interfaces for the inventories and serialization ==&lt;br /&gt;
&lt;br /&gt;
==== IRecipeSerializer ==== &lt;br /&gt;
The thing that actually serializes recipe files. It implements the vanilla recipe serializer interface and provides means of reading from JSON and performing read/write operations on network buffer objects. One should look into using [[Codecs]] for this class, as using them simplifies the logic significantly.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;java&amp;quot;&amp;gt;&lt;br /&gt;
public class MyRecipeSerializer &lt;br /&gt;
  extends ForgeRegistryEntry&amp;lt;IRecipeSerializer&amp;lt;?&amp;gt;&amp;gt; &lt;br /&gt;
  implements IRecipeSerializer&amp;lt;MyRecipeType&amp;gt; {&lt;br /&gt;
  &lt;br /&gt;
  // your serializer code here&lt;br /&gt;
&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== IRecipeType ====&lt;br /&gt;
Links the recipe type to its implementation class. This is a very lightweight class that vanilla uses to make a recipe file's &amp;lt;code&amp;gt;type&amp;lt;/code&amp;gt; line to which serializer should be used to deserialize a recipe into an instance.&lt;br /&gt;
&lt;br /&gt;
==== IInventory ====&lt;br /&gt;
Wraps vanilla's &amp;lt;code&amp;gt;IInventory&amp;lt;/code&amp;gt; system. [https://gist.github.com/robotgryphon/344e5815e27f28fef7a837c4f98ade40 Here's a reference.] '''''Note this should not be used directly; you should make a fake inventory class and handle the actual match implementation with your own methods and logic.'''''&lt;br /&gt;
&lt;br /&gt;
==== IRecipe ====&lt;br /&gt;
Your actual recipe class or an abstraction to cheat vanilla's system and use your own recipe matching system. Takes the &amp;lt;code&amp;gt;IInventory&amp;lt;/code&amp;gt; from above and matches it. Your recipe class should return the &amp;lt;code&amp;gt;IRecipeType&amp;lt;/code&amp;gt; from registration in the getType override.&lt;br /&gt;
&lt;br /&gt;
== Setup ==&lt;br /&gt;
Once you have the above implementations, here's how to wire everything up:&lt;br /&gt;
&lt;br /&gt;
# Register your recipe serializer to the &amp;lt;code&amp;gt;RECIPE_SERIALIZERS&amp;lt;/code&amp;gt; Forge registry.&lt;br /&gt;
# Register the recipe type during the registration (constructor) phase. See below.&lt;br /&gt;
# Place a JSON file in &amp;lt;code&amp;gt;data/recipes/my_recipe.json&amp;lt;/code&amp;gt; and ensure it has &amp;lt;code&amp;gt;&amp;quot;type&amp;quot;: &amp;quot;mymod:my_recipe_type&amp;quot;&amp;lt;/code&amp;gt; in the JSON structure. &lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;java&amp;quot;&amp;gt;&lt;br /&gt;
Registry.register(Registry.RECIPE_TYPE, new ResLoc('mymod:my_recipe_type'), MyRecipeType.class);&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
This will load the recipe using the recipe serialization system, and wire it back to the serializer via matching the registry name in &amp;lt;code&amp;gt;type&amp;lt;/code&amp;gt; to the value you specified while registering the serializer in step 1.&lt;/div&gt;</summary>
		<author><name>RobotGryphon</name></author>
	</entry>
	<entry>
		<id>https://forge.gemwire.uk/index.php?title=Custom_Recipes&amp;diff=2649</id>
		<title>Custom Recipes</title>
		<link rel="alternate" type="text/html" href="https://forge.gemwire.uk/index.php?title=Custom_Recipes&amp;diff=2649"/>
		<updated>2021-06-05T17:32:00Z</updated>

		<summary type="html">&lt;p&gt;RobotGryphon: Created page with &amp;quot;= Custom Recipe Serializers =  Want to make a custom recipe type for a machine, or some mechanic your mod has? Great! It means users can participate in the datapack system for...&amp;quot;&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;= Custom Recipe Serializers =&lt;br /&gt;
&lt;br /&gt;
Want to make a custom recipe type for a machine, or some mechanic your mod has? Great! It means users can participate in the datapack system for recipes, so you get automatic syncing, updating, and ease of maintenance on servers. Here's what you need to get started:&lt;br /&gt;
&lt;br /&gt;
== Classes/Interfaces for the inventories and serialization ==&lt;br /&gt;
&lt;br /&gt;
==== IRecipeSerializer ==== &lt;br /&gt;
The thing that actually serializes recipe files. It implements the vanilla recipe serializer interface and provides means of reading from JSON and performing read/write operations on network buffer objects. One should look into using [[Codecs]] for this class, as using them simplifies the logic significantly.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;java&amp;quot;&amp;gt;&lt;br /&gt;
public class MyRecipeSerializer &lt;br /&gt;
  extends ForgeRegistryEntry&amp;lt;IRecipeSerializer&amp;lt;?&amp;gt;&amp;gt; &lt;br /&gt;
  implements IRecipeSerializer&amp;lt;MyRecipeType&amp;gt; {&lt;br /&gt;
  &lt;br /&gt;
  // your serializer code here&lt;br /&gt;
&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== IRecipeType ====&lt;br /&gt;
Links the recipe type to its implementation class. This is a very lightweight class that vanilla uses to make a recipe file's &amp;lt;code&amp;gt;type&amp;lt;/code&amp;gt; line to which serializer should be used to deserialize a recipe into an instance.&lt;br /&gt;
&lt;br /&gt;
==== IInventory ====&lt;br /&gt;
Wraps vanilla's &amp;lt;code&amp;gt;IInventory&amp;lt;/code&amp;gt; system. [https://gist.github.com/robotgryphon/344e5815e27f28fef7a837c4f98ade40 Here's a reference.] '''''Note this should not be used directly; you should make a fake inventory class and handle the actual match implementation with your own methods and logic.'''''&lt;br /&gt;
&lt;br /&gt;
==== IRecipe ====&lt;br /&gt;
Your actual recipe class or an abstraction to cheat vanilla's system and use your own recipe matching system. Takes the &amp;lt;code&amp;gt;IInventory&amp;lt;/code&amp;gt; from above and matches it. Your recipe class should return the &amp;lt;code&amp;gt;IRecipeType&amp;lt;/code&amp;gt; from registration in the getType override.&lt;br /&gt;
&lt;br /&gt;
== Setup ==&lt;br /&gt;
Once you have the above implementations, here's how to wire everything up:&lt;br /&gt;
&lt;br /&gt;
# Register your recipe serializer to the &amp;lt;code&amp;gt;RECIPE_SERIALIZERS&amp;lt;/code&amp;gt; Forge registry.&lt;br /&gt;
# Register the recipe type during the registration (constructor) phase. See below.&lt;br /&gt;
# Place a JSON file in &amp;lt;code&amp;gt;data/recipes/my_recipe.json&amp;lt;/code&amp;gt; and ensure it has &amp;lt;code&amp;gt;&amp;quot;type&amp;quot;: &amp;quot;mymod:my_recipe_type&amp;quot;&amp;lt;/code&amp;gt; in the JSON structure. &lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;java&amp;quot;&amp;gt;&lt;br /&gt;
Registry.register(Registry.RECIPE_TYPE, new ResLoc('mymod:my_recipe_type'), MyRecipeType.class);&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
This will load the recipe using the recipe serialization system, and wire it back to the serializer via type matching the value you specified during the &amp;lt;code&amp;gt;RECIPE_TYPE&amp;lt;/code&amp;gt; registration above, in step 2.&lt;/div&gt;</summary>
		<author><name>RobotGryphon</name></author>
	</entry>
</feed>