<?xml version="1.0"?>
<feed xmlns="http://www.w3.org/2005/Atom" xml:lang="en">
	<id>https://wiki.ornithemc.net/api.php?action=feedcontributions&amp;feedformat=atom&amp;user=Space+Walker</id>
	<title>Ornithe Wiki - User contributions [en]</title>
	<link rel="self" type="application/atom+xml" href="https://wiki.ornithemc.net/api.php?action=feedcontributions&amp;feedformat=atom&amp;user=Space+Walker"/>
	<link rel="alternate" type="text/html" href="https://wiki.ornithemc.net/wiki/Special:Contributions/Space_Walker"/>
	<updated>2026-04-29T03:12:35Z</updated>
	<subtitle>User contributions</subtitle>
	<generator>MediaWiki 1.45.1</generator>
	<entry>
		<id>https://wiki.ornithemc.net/index.php?title=Signature_Changer&amp;diff=49</id>
		<title>Signature Changer</title>
		<link rel="alternate" type="text/html" href="https://wiki.ornithemc.net/index.php?title=Signature_Changer&amp;diff=49"/>
		<updated>2025-08-13T09:10:56Z</updated>

		<summary type="html">&lt;p&gt;Space Walker: add Signature Changer page&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Signature Changer is a tool to patch generic type signatures for classes, fields, and methods in Java class files. It takes in a [[Sparrow]] data file and applies those patches to a jar file. This tool was originally created by [https://github.com/Gaming32 Gaming32].&lt;br /&gt;
&lt;br /&gt;
== Generic Type Signatures ==&lt;br /&gt;
&lt;br /&gt;
Classes, fields, methods, and variables all define their generic type signatures in Java class files.&lt;br /&gt;
&lt;br /&gt;
Obfuscators such as [https://www.guardsquare.com/proguard ProGuard] may remove them to shrink the jar file size. This is generally not a problem, since it does not affect the runtime behavior of a Java application. However, they do make a difference at &#039;&#039;compile time&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
Generics are a useful tool for writing type-safe code. However, if the generic type signatures are missing,  code can become bothersome to write and more prone to errors.&lt;br /&gt;
&lt;br /&gt;
== Signature Changer ==&lt;br /&gt;
&lt;br /&gt;
Exceptor patches the generic type signatures in a jar using a [[Sparrow]] data file. It has the following features:&lt;br /&gt;
&lt;br /&gt;
* Removing, adding or modifying generic type signatures for classes, fields, and methods.&lt;br /&gt;
* Generating a [[Sparrow]] file from a given jar file.&lt;/div&gt;</summary>
		<author><name>Space Walker</name></author>
	</entry>
	<entry>
		<id>https://wiki.ornithemc.net/index.php?title=Sparrow&amp;diff=48</id>
		<title>Sparrow</title>
		<link rel="alternate" type="text/html" href="https://wiki.ornithemc.net/index.php?title=Sparrow&amp;diff=48"/>
		<updated>2025-08-13T09:09:04Z</updated>

		<summary type="html">&lt;p&gt;Space Walker: add note on &amp;#039;remove&amp;#039; mode&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Sparrow is Ornithe&#039;s generics patch. It is used to modify generic type signatures in Java class files.&lt;br /&gt;
&lt;br /&gt;
See [[Signature Changer]] for information on generic type signatures and how these patches are applied.&lt;br /&gt;
&lt;br /&gt;
=== Relevance ===&lt;br /&gt;
&lt;br /&gt;
Most Minecraft versions before 1.8.2 Pre-release 5 had the generic type signatures stripped from the jar. Sparrow was created in an effort to reconstruct what the original generics would have been in the source code.&lt;br /&gt;
&lt;br /&gt;
=== File Specification ===&lt;br /&gt;
&lt;br /&gt;
The &amp;lt;code&amp;gt;.sigs&amp;lt;/code&amp;gt; file format was originally created by [https://github.com/Gaming32 Gaming32]. &amp;lt;code&amp;gt;.sigs&amp;lt;/code&amp;gt; files are &amp;lt;code&amp;gt;UTF-8&amp;lt;/code&amp;gt; encoded text files. A line has the following format.&lt;br /&gt;
&lt;br /&gt;
 &amp;lt;class name&amp;gt;	[&amp;lt;class signature&amp;gt;]&lt;br /&gt;
 	&amp;lt;member name&amp;gt;	&amp;lt;member type descriptor&amp;gt;	&amp;lt;member signature&amp;gt;&lt;br /&gt;
 	...&lt;br /&gt;
 ...&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;code&amp;gt;class name&amp;lt;/code&amp;gt;: the internal name of the class.&lt;br /&gt;
* &amp;lt;code&amp;gt;class type signature&amp;lt;/code&amp;gt;: the generic type signature of the class (optional).&lt;br /&gt;
* &amp;lt;code&amp;gt;member name&amp;lt;/code&amp;gt;: the name of the field or method.&lt;br /&gt;
* &amp;lt;code&amp;gt;member type descriptor&amp;lt;/code&amp;gt;: the type descriptor of the field or method.&lt;br /&gt;
* &amp;lt;code&amp;gt;member signature&amp;lt;/code&amp;gt;: the generic type signature of the field or method.&lt;br /&gt;
&lt;br /&gt;
==== Notes ====&lt;br /&gt;
&lt;br /&gt;
The file format does not support generic type signatures for local variables.&lt;br /&gt;
&lt;br /&gt;
The &amp;lt;code&amp;gt;class type signature&amp;lt;/code&amp;gt; and &amp;lt;code&amp;gt;member type signature&amp;lt;/code&amp;gt; values can be set to &amp;lt;code&amp;gt;.&amp;lt;/code&amp;gt; to signal that the generic type signature should be removed from that class or class member respectively.&lt;br /&gt;
&lt;br /&gt;
[[category:Mod Development]]&lt;/div&gt;</summary>
		<author><name>Space Walker</name></author>
	</entry>
	<entry>
		<id>https://wiki.ornithemc.net/index.php?title=Sparrow&amp;diff=47</id>
		<title>Sparrow</title>
		<link rel="alternate" type="text/html" href="https://wiki.ornithemc.net/index.php?title=Sparrow&amp;diff=47"/>
		<updated>2025-08-13T08:10:02Z</updated>

		<summary type="html">&lt;p&gt;Space Walker: create Sparrow page&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Sparrow is Ornithe&#039;s generics patch. It is used to modify generic type signatures in Java class files.&lt;br /&gt;
&lt;br /&gt;
See [[Signature Changer]] for information on generic type signatures and how these patches are applied.&lt;br /&gt;
&lt;br /&gt;
=== Relevance ===&lt;br /&gt;
&lt;br /&gt;
Most Minecraft versions before 1.8.2 Pre-release 5 had the generic type signatures stripped from the jar. Sparrow was created in an effort to reconstruct what the original generics would have been in the source code.&lt;br /&gt;
&lt;br /&gt;
=== File Specification ===&lt;br /&gt;
&lt;br /&gt;
The &amp;lt;code&amp;gt;.sigs&amp;lt;/code&amp;gt; file format was originally created by [https://github.com/Gaming32 Gaming32]. &amp;lt;code&amp;gt;.sigs&amp;lt;/code&amp;gt; files are &amp;lt;code&amp;gt;UTF-8&amp;lt;/code&amp;gt; encoded text files. A line has the following format.&lt;br /&gt;
&lt;br /&gt;
 &amp;lt;class name&amp;gt;	[&amp;lt;class signature&amp;gt;]&lt;br /&gt;
 	&amp;lt;member name&amp;gt;	&amp;lt;member type descriptor&amp;gt;	&amp;lt;member signature&amp;gt;&lt;br /&gt;
 	...&lt;br /&gt;
 ...&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;code&amp;gt;class name&amp;lt;/code&amp;gt;: the internal name of the class.&lt;br /&gt;
* &amp;lt;code&amp;gt;class signature&amp;lt;/code&amp;gt;: the generic type signature of the class (optional).&lt;br /&gt;
* &amp;lt;code&amp;gt;member name&amp;lt;/code&amp;gt;: the name of the field or method.&lt;br /&gt;
* &amp;lt;code&amp;gt;member type descriptor&amp;lt;/code&amp;gt;: the type descriptor of the field or method.&lt;br /&gt;
* &amp;lt;code&amp;gt;member signature&amp;lt;/code&amp;gt;: the generic type signature of the field or method.&lt;br /&gt;
&lt;br /&gt;
==== Notes ====&lt;br /&gt;
&lt;br /&gt;
The file format does not support generic type signatures for local variables.&lt;br /&gt;
&lt;br /&gt;
[[category:Mod Development]]&lt;/div&gt;</summary>
		<author><name>Space Walker</name></author>
	</entry>
	<entry>
		<id>https://wiki.ornithemc.net/index.php?title=Raven&amp;diff=46</id>
		<title>Raven</title>
		<link rel="alternate" type="text/html" href="https://wiki.ornithemc.net/index.php?title=Raven&amp;diff=46"/>
		<updated>2025-08-13T08:00:09Z</updated>

		<summary type="html">&lt;p&gt;Space Walker: fix file spec section&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Raven is Ornithe&#039;s patch for method throws clauses. It is used to modify methods attributes in Java class files.&lt;br /&gt;
&lt;br /&gt;
See [[Exceptor]] for information on methods attributes and how these patches are applied.&lt;br /&gt;
&lt;br /&gt;
=== Relevance ===&lt;br /&gt;
&lt;br /&gt;
Most Minecraft versions before 1.8.2 Pre-release 5 had the exceptions from the methods attributes stripped from the jar. Raven was created in an effort to reconstruct what the original method throws clauses would have been in the source code.&lt;br /&gt;
&lt;br /&gt;
=== File Specification ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;.excs&amp;lt;/code&amp;gt; files are &amp;lt;code&amp;gt;UTF-8&amp;lt;/code&amp;gt; encoded text files. A line has the following format.&lt;br /&gt;
&lt;br /&gt;
 &amp;lt;class name&amp;gt;&lt;br /&gt;
 	&amp;lt;method name&amp;gt;	&amp;lt;method type name&amp;gt;[	&amp;lt;exception class name&amp;gt;...]&lt;br /&gt;
 	...&lt;br /&gt;
 ...&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;code&amp;gt;class name&amp;lt;/code&amp;gt;: the internal name of the class.&lt;br /&gt;
* &amp;lt;code&amp;gt;method name&amp;lt;/code&amp;gt;: the method name.&lt;br /&gt;
* &amp;lt;code&amp;gt;method type descriptor&amp;lt;/code&amp;gt;: the descriptor describing the type of the method.&lt;br /&gt;
* &amp;lt;code&amp;gt;exception class name&amp;lt;/code&amp;gt;: the internal name of the exception class.&lt;br /&gt;
&lt;br /&gt;
[[category:Mod Development]]&lt;/div&gt;</summary>
		<author><name>Space Walker</name></author>
	</entry>
	<entry>
		<id>https://wiki.ornithemc.net/index.php?title=Raven&amp;diff=45</id>
		<title>Raven</title>
		<link rel="alternate" type="text/html" href="https://wiki.ornithemc.net/index.php?title=Raven&amp;diff=45"/>
		<updated>2025-08-13T07:55:38Z</updated>

		<summary type="html">&lt;p&gt;Space Walker: fix grammar&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Raven is Ornithe&#039;s patch for method throws clauses. It is used to modify methods attributes in Java class files.&lt;br /&gt;
&lt;br /&gt;
See [[Exceptor]] for information on methods attributes and how these patches are applied.&lt;br /&gt;
&lt;br /&gt;
=== Relevance ===&lt;br /&gt;
&lt;br /&gt;
Most Minecraft versions before 1.8.2 Pre-release 5 had the exceptions from the methods attributes stripped from the jar. Raven was created in an effort to reconstruct what the original method throws clauses would have been in the source code.&lt;br /&gt;
&lt;br /&gt;
=== File Specification ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;.excs&amp;lt;/code&amp;gt; files are &amp;lt;code&amp;gt;UTF-8&amp;lt;/code&amp;gt; encoded text files. Each line defines the relationship between a class and its outer class and, if applicable, outer method. A line has the following format.&lt;br /&gt;
&lt;br /&gt;
 &amp;lt;class name&amp;gt;	&amp;lt;method name&amp;gt;	&amp;lt;method type name&amp;gt;[	&amp;lt;exception class name&amp;gt;...]&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;code&amp;gt;class name&amp;lt;/code&amp;gt;: the internal name of the class.&lt;br /&gt;
* &amp;lt;code&amp;gt;method name&amp;lt;/code&amp;gt;: the method name.&lt;br /&gt;
* &amp;lt;code&amp;gt;method type descriptor&amp;lt;/code&amp;gt;: the descriptor describing the type of the method.&lt;br /&gt;
* &amp;lt;code&amp;gt;exception class name&amp;lt;/code&amp;gt;: the internal name of the exception class.&lt;br /&gt;
&lt;br /&gt;
[[category:Mod Development]]&lt;/div&gt;</summary>
		<author><name>Space Walker</name></author>
	</entry>
	<entry>
		<id>https://wiki.ornithemc.net/index.php?title=Exceptor&amp;diff=44</id>
		<title>Exceptor</title>
		<link rel="alternate" type="text/html" href="https://wiki.ornithemc.net/index.php?title=Exceptor&amp;diff=44"/>
		<updated>2025-08-12T17:45:58Z</updated>

		<summary type="html">&lt;p&gt;Space Walker: add Exceptor page&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Exceptor is a tool to patch exceptions in methods class attributes in Java class files. It takes in a [[Raven]] data file and applies those patches to a jar file. &lt;br /&gt;
&lt;br /&gt;
== Throws Clauses ==&lt;br /&gt;
&lt;br /&gt;
The throws clause in a method declaration defines which exceptions can be thrown from within the method body. It is denoted by the &amp;lt;code&amp;gt;throws&amp;lt;/code&amp;gt; key word and goes after the method parameter list before the opening bracket of the method body.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
public void openPage(String address) throws URISyntaxException, IOException {&lt;br /&gt;
    ...&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Methods Attributes ==&lt;br /&gt;
&lt;br /&gt;
Java class files have a &amp;lt;code&amp;gt;Methods&amp;lt;/code&amp;gt; attribute that contains entries for each method defined in a class. These entries contain values for the name and type descriptor of the method, but also for the exceptions that can be thrown by that method.&lt;br /&gt;
&lt;br /&gt;
Obfuscators such as [https://www.guardsquare.com/proguard ProGuard] may remove that value to shrink the jar file size. This is generally not a problem, since it does not affect the runtime behavior of a Java application. However, they do make a difference at &#039;&#039;compile time&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
Usually, the Java compiler forces you to handle exceptions. However, if the throws clauses are missing for some methods, you can invoke them and not handle the exceptions, without any compile error. While this may sound nice, it will lead to unexpected behavior, bugs, and even crashes.&lt;br /&gt;
&lt;br /&gt;
A more bothersome issue occurs when overriding methods where the throws clause is missing. You are not able to throw any exceptions in that method at all. The compiler will complain that the exceptions are not handled. However, adding a throws clause to your override is not possible, because the method you are overriding does not have one. The only solution is to catch the exception and throw a runtime exception instead.&lt;br /&gt;
&lt;br /&gt;
=== The Methods Attribute ===&lt;br /&gt;
&lt;br /&gt;
The &amp;lt;code&amp;gt;Methods&amp;lt;/code&amp;gt; attribute of a class contains entries for all methods defined in that class. Each entry has four values:&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;code&amp;gt;method access&amp;lt;/code&amp;gt;: the access modifier of the method&lt;br /&gt;
* &amp;lt;code&amp;gt;method name&amp;lt;/code&amp;gt;: the name of the method&lt;br /&gt;
* &amp;lt;code&amp;gt;method type descriptor&amp;lt;/code&amp;gt;: the type descriptor of the method&lt;br /&gt;
* &amp;lt;code&amp;gt;method generic type signature&amp;lt;/code&amp;gt;: the generic type signature of the method&lt;br /&gt;
* &amp;lt;code&amp;gt;method exceptions&amp;lt;/code&amp;gt;: the internal names of all exceptions that can be thrown by the method&lt;br /&gt;
&lt;br /&gt;
== Exceptor ==&lt;br /&gt;
&lt;br /&gt;
Exceptor patches the methods attributes in a jar using a [[Raven]] data file. It has the following features:&lt;br /&gt;
&lt;br /&gt;
* Setting the exceptions value in the methods attribute for existing methods.&lt;br /&gt;
* Generating a [[Raven]] file from a given jar file.&lt;/div&gt;</summary>
		<author><name>Space Walker</name></author>
	</entry>
	<entry>
		<id>https://wiki.ornithemc.net/index.php?title=Raven&amp;diff=43</id>
		<title>Raven</title>
		<link rel="alternate" type="text/html" href="https://wiki.ornithemc.net/index.php?title=Raven&amp;diff=43"/>
		<updated>2025-08-12T16:58:04Z</updated>

		<summary type="html">&lt;p&gt;Space Walker: add Raven page&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Raven is Ornithe&#039;s patch for method throws clauses. They are used to modify methods attributes in Java class files.&lt;br /&gt;
&lt;br /&gt;
See [[Exceptor]] for information on methods attributes and how these patches are applied.&lt;br /&gt;
&lt;br /&gt;
=== Relevance ===&lt;br /&gt;
&lt;br /&gt;
Most Minecraft versions before 1.8.2 Pre-release 5 had the exceptions from the methods attributes stripped from the jar. Raven was created in an effort to reconstruct what the original method throws clauses would have been in the source code.&lt;br /&gt;
&lt;br /&gt;
=== File Specification ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;.excs&amp;lt;/code&amp;gt; files are &amp;lt;code&amp;gt;UTF-8&amp;lt;/code&amp;gt; encoded text files. Each line defines the relationship between a class and its outer class and, if applicable, outer method. A line has the following format.&lt;br /&gt;
&lt;br /&gt;
 &amp;lt;class name&amp;gt;	&amp;lt;method name&amp;gt;	&amp;lt;method type name&amp;gt;[	&amp;lt;exception class name&amp;gt;...]&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;code&amp;gt;class name&amp;lt;/code&amp;gt;: the internal name of the class.&lt;br /&gt;
* &amp;lt;code&amp;gt;method name&amp;lt;/code&amp;gt;: the method name.&lt;br /&gt;
* &amp;lt;code&amp;gt;method type descriptor&amp;lt;/code&amp;gt;: the descriptor describing the type of the method.&lt;br /&gt;
* &amp;lt;code&amp;gt;exception class name&amp;lt;/code&amp;gt;: the internal name of the exception class.&lt;br /&gt;
&lt;br /&gt;
[[category:Mod Development]]&lt;/div&gt;</summary>
		<author><name>Space Walker</name></author>
	</entry>
	<entry>
		<id>https://wiki.ornithemc.net/index.php?title=Nester&amp;diff=42</id>
		<title>Nester</title>
		<link rel="alternate" type="text/html" href="https://wiki.ornithemc.net/index.php?title=Nester&amp;diff=42"/>
		<updated>2025-08-12T16:31:33Z</updated>

		<summary type="html">&lt;p&gt;Space Walker: add chapter on features&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Nester is a tool to patch inner class attributes in Java class files. It takes in a [[Nests]] data file and applies those patches to a jar file. &lt;br /&gt;
&lt;br /&gt;
== Inner Classes ==&lt;br /&gt;
&lt;br /&gt;
Inner classes are classes that are defined inside other classes or methods. There are three types of inner classes: nested classes, local classes, and anonymous classes. Each type has its own uses, and a different relationship with its outer class or method.&lt;br /&gt;
&lt;br /&gt;
=== Nested Classes ===&lt;br /&gt;
&lt;br /&gt;
A nested class is a class declared inside another class. &lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
public class Outer {&lt;br /&gt;
    ...&lt;br /&gt;
    public class Inner {&lt;br /&gt;
        ...&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Nested classes can be &#039;&#039;static&#039;&#039; or &#039;&#039;non-static&#039;&#039;.&lt;br /&gt;
* A &#039;&#039;static&#039;&#039; nested class can access static members of its outer class, and vice versa, even if those members are private.&lt;br /&gt;
* A &#039;&#039;non-static&#039;&#039; nested class can access both static members and instance members of its outer class, and vice versa, even if those members are private.&lt;br /&gt;
&lt;br /&gt;
=== Local Classes ===&lt;br /&gt;
&lt;br /&gt;
A local class a class declared inside a method.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
public class Outer {&lt;br /&gt;
    ....&lt;br /&gt;
    public void outer() {&lt;br /&gt;
        ...&lt;br /&gt;
        class Inner {&lt;br /&gt;
            ...&lt;br /&gt;
        }&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
A local class can access both static and instance members from its outer class, as well as local variables from the scope in which it is declared in its outer method.&lt;br /&gt;
&lt;br /&gt;
=== Anonymous Classes ===&lt;br /&gt;
&lt;br /&gt;
An anonymous class is a class declared and instantiated at the same time.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
public class Outer {&lt;br /&gt;
    ...&lt;br /&gt;
    public void outer() {&lt;br /&gt;
        ...&lt;br /&gt;
        Runnable task = new Runnable() {&lt;br /&gt;
            ...&lt;br /&gt;
        }&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
An anonymous class can access both static and instance members from its outer class, as well as local variables from the scope in which it is declared in its outer method.&lt;br /&gt;
&lt;br /&gt;
=== Special Classes ===&lt;br /&gt;
&lt;br /&gt;
The Java compiler may generate special classes for some of the language&#039;s features. These synthetic classes are normally invisible.&lt;br /&gt;
&lt;br /&gt;
* Switch statements are compiled to classes with enum value tables.&lt;br /&gt;
* A completely empty class may be generated and passed between multiple nested classes and their outer class to enforce the contract for access between them.&lt;br /&gt;
&lt;br /&gt;
=== Inner Class Names ===&lt;br /&gt;
&lt;br /&gt;
While the JVM specification does not enforce any naming scheme for inner classes, there is a convention for each type of inner class.&lt;br /&gt;
&lt;br /&gt;
* Names for nested classes are typically composed of the outer class name and the inner name of the nested class. For example, a nested class with outer class name &amp;lt;code&amp;gt;com/example/Outer&amp;lt;/code&amp;gt; and inner name &amp;lt;code&amp;gt;Inner&amp;lt;/code&amp;gt; typically has the name &amp;lt;code&amp;gt;com/example/Outer$Inner&amp;lt;/code&amp;gt;.&lt;br /&gt;
* Names for local classes are typically composed of the outer class name, the inner name of the inner class, and a number that counts up for each local class in the top-level outer class. For example, the second local class in some top-level class, with outer class name &amp;lt;code&amp;gt;com/example/Outer&amp;lt;/code&amp;gt; and inner name &amp;lt;code&amp;gt;Inner&amp;lt;/code&amp;gt; typically has the name &amp;lt;code&amp;gt;com/example/Outer$2Inner&amp;lt;/code&amp;gt;.&lt;br /&gt;
* Names for anonymous classes are typically composed of the outer class name and a number that counts up for each anonymous class in the outer class. For example, the third anonymous class in outer class &amp;lt;code&amp;gt;com/example/Outer&amp;lt;/code&amp;gt; typically has the name &amp;lt;code&amp;gt;com/example/Outer$3&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
== Inner Class Attributes ==&lt;br /&gt;
&lt;br /&gt;
Inner class attributes describe the relationship between inner classes and their outer classes or methods. Obfuscators such as [https://www.guardsquare.com/proguard ProGuard] may remove them to shrink the jar file size. This is generally not a problem, since these attributes do not affect the runtime behavior of a Java application. However, they do make a difference at &#039;&#039;compile time&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
Interactions with inner classes will not work properly if the inner class attributes are missing. Access between non-static nested classes and their outer classes will be broken, anonymous classes will be accessible when they should not be, and references to nested classes will not work.&lt;br /&gt;
&lt;br /&gt;
On top of the compile time issues, decompiler results will be significantly worse for jars where the inner class attributes are not present. Local and anonymous classes will not appear inside their outer classes and methods, and member access between nested classes and their outer classes may appear as references to methods that do not exist.&lt;br /&gt;
&lt;br /&gt;
=== The InnerClasses Attribute ===&lt;br /&gt;
&lt;br /&gt;
The &amp;lt;code&amp;gt;InnerClasses&amp;lt;/code&amp;gt; attribute of a class contains entries for all inner classes referenced by that class. Each entry has four values:&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;code&amp;gt;inner class name&amp;lt;/code&amp;gt;: the internal name of the inner class&lt;br /&gt;
* &amp;lt;code&amp;gt;outer class name&amp;lt;/code&amp;gt;: the internal name of the outer class&lt;br /&gt;
* &amp;lt;code&amp;gt;inner name&amp;lt;/code&amp;gt;: the simple name of the inner class (i.e. the name as declared in the source)&lt;br /&gt;
* &amp;lt;code&amp;gt;inner class access&amp;lt;/code&amp;gt;: the access modifier flags of the inner class&lt;br /&gt;
&lt;br /&gt;
The &amp;lt;code&amp;gt;outer class name&amp;lt;/code&amp;gt; is empty for anonymous and local classes.&lt;br /&gt;
&lt;br /&gt;
The &amp;lt;code&amp;gt;inner name&amp;lt;/code&amp;gt; value is empty for anonymous classes.&lt;br /&gt;
&lt;br /&gt;
=== The EnclosingMethod Attribute ===&lt;br /&gt;
&lt;br /&gt;
The &amp;lt;code&amp;gt;EnclosingMethod&amp;lt;/code&amp;gt; attribute of a class describes the outer class and method of an inner class. It has three values:&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;code&amp;gt;enclosing class name&amp;lt;/code&amp;gt;: the internal name of the enclosing class&lt;br /&gt;
* &amp;lt;code&amp;gt;enclosing method name&amp;lt;/code&amp;gt;: the name of the enclosing method&lt;br /&gt;
* &amp;lt;code&amp;gt;enclosing method descriptor&amp;lt;/code&amp;gt;: the type descriptor of the enclosing method&lt;br /&gt;
&lt;br /&gt;
This attribute is only present for local and anonymous classes.&lt;br /&gt;
&lt;br /&gt;
The &amp;lt;code&amp;gt;enclosing method name&amp;lt;/code&amp;gt; and &amp;lt;code&amp;gt;enclosing method descriptor&amp;lt;/code&amp;gt; values are empty for anonymous classes that are declared in in-line initializers for fields.&lt;br /&gt;
&lt;br /&gt;
== Nester ==&lt;br /&gt;
&lt;br /&gt;
Nester patches inner class attributes in a jar using a [[Nests]] data file. It has the following features:&lt;br /&gt;
&lt;br /&gt;
* Adding inner class attributes to existing classes.&lt;br /&gt;
* Remapping inner classes to fit the convention for [[Nester#Inner Class Names|inner class names]]. &lt;br /&gt;
* Generating new classes if outer classes specified in the Nests file do not exist.&lt;/div&gt;</summary>
		<author><name>Space Walker</name></author>
	</entry>
	<entry>
		<id>https://wiki.ornithemc.net/index.php?title=Nester&amp;diff=41</id>
		<title>Nester</title>
		<link rel="alternate" type="text/html" href="https://wiki.ornithemc.net/index.php?title=Nester&amp;diff=41"/>
		<updated>2025-08-12T15:48:26Z</updated>

		<summary type="html">&lt;p&gt;Space Walker: add chapter on inner class names&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Nester is a tool to patch inner class attributes in Java class files. It takes in a [[Nests]] data file and applies those patches to a jar file. &lt;br /&gt;
&lt;br /&gt;
== Inner Classes ==&lt;br /&gt;
&lt;br /&gt;
Inner classes are classes that are defined inside other classes or methods. There are three types of inner classes: nested classes, local classes, and anonymous classes. Each type has its own uses, and a different relationship with its outer class or method.&lt;br /&gt;
&lt;br /&gt;
=== Nested Classes ===&lt;br /&gt;
&lt;br /&gt;
A nested class is a class declared inside another class. &lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
public class Outer {&lt;br /&gt;
    ...&lt;br /&gt;
    public class Inner {&lt;br /&gt;
        ...&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Nested classes can be &#039;&#039;static&#039;&#039; or &#039;&#039;non-static&#039;&#039;.&lt;br /&gt;
* A &#039;&#039;static&#039;&#039; nested class can access static members of its outer class, and vice versa, even if those members are private.&lt;br /&gt;
* A &#039;&#039;non-static&#039;&#039; nested class can access both static members and instance members of its outer class, and vice versa, even if those members are private.&lt;br /&gt;
&lt;br /&gt;
=== Local Classes ===&lt;br /&gt;
&lt;br /&gt;
A local class a class declared inside a method.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
public class Outer {&lt;br /&gt;
    ....&lt;br /&gt;
    public void outer() {&lt;br /&gt;
        ...&lt;br /&gt;
        class Inner {&lt;br /&gt;
            ...&lt;br /&gt;
        }&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
A local class can access both static and instance members from its outer class, as well as local variables from the scope in which it is declared in its outer method.&lt;br /&gt;
&lt;br /&gt;
=== Anonymous Classes ===&lt;br /&gt;
&lt;br /&gt;
An anonymous class is a class declared and instantiated at the same time.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
public class Outer {&lt;br /&gt;
    ...&lt;br /&gt;
    public void outer() {&lt;br /&gt;
        ...&lt;br /&gt;
        Runnable task = new Runnable() {&lt;br /&gt;
            ...&lt;br /&gt;
        }&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
An anonymous class can access both static and instance members from its outer class, as well as local variables from the scope in which it is declared in its outer method.&lt;br /&gt;
&lt;br /&gt;
=== Special Classes ===&lt;br /&gt;
&lt;br /&gt;
The Java compiler may generate special classes for some of the language&#039;s features. These synthetic classes are normally invisible.&lt;br /&gt;
&lt;br /&gt;
* Switch statements are compiled to classes with enum value tables.&lt;br /&gt;
* A completely empty class may be generated and passed between multiple nested classes and their outer class to enforce the contract for access between them.&lt;br /&gt;
&lt;br /&gt;
=== Inner Class Names ===&lt;br /&gt;
&lt;br /&gt;
While the JVM specification does not enforce any naming scheme for inner classes, there is a convention for each type of inner class.&lt;br /&gt;
&lt;br /&gt;
* Names for nested classes are typically composed of the outer class name and the inner name of the nested class. For example, a nested class with outer class name &amp;lt;code&amp;gt;com/example/Outer&amp;lt;/code&amp;gt; and inner name &amp;lt;code&amp;gt;Inner&amp;lt;/code&amp;gt; typically has the name &amp;lt;code&amp;gt;com/example/Outer$Inner&amp;lt;/code&amp;gt;.&lt;br /&gt;
* Names for local classes are typically composed of the outer class name, the inner name of the inner class, and a number that counts up for each local class in the top-level outer class. For example, the second local class in some top-level class, with outer class name &amp;lt;code&amp;gt;com/example/Outer&amp;lt;/code&amp;gt; and inner name &amp;lt;code&amp;gt;Inner&amp;lt;/code&amp;gt; typically has the name &amp;lt;code&amp;gt;com/example/Outer$2Inner&amp;lt;/code&amp;gt;.&lt;br /&gt;
* Names for anonymous classes are typically composed of the outer class name and a number that counts up for each anonymous class in the outer class. For example, the third anonymous class in outer class &amp;lt;code&amp;gt;com/example/Outer&amp;lt;/code&amp;gt; typically has the name &amp;lt;code&amp;gt;com/example/Outer$3&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
== Inner Class Attributes ==&lt;br /&gt;
&lt;br /&gt;
Inner class attributes describe the relationship between inner classes and their outer classes or methods. Obfuscators such as [https://www.guardsquare.com/proguard ProGuard] may remove them to shrink the jar file size. This is generally not a problem, since these attributes do not affect the runtime behavior of a Java application. However, they do make a difference at &#039;&#039;compile time&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
Interactions with inner classes will not work properly if the inner class attributes are missing. Access between non-static nested classes and their outer classes will be broken, anonymous classes will be accessible when they should not be, and references to nested classes will not work.&lt;br /&gt;
&lt;br /&gt;
On top of the compile time issues, decompiler results will be significantly worse for jars where the inner class attributes are not present. Local and anonymous classes will not appear inside their outer classes and methods, and member access between nested classes and their outer classes may appear as references to methods that do not exist.&lt;br /&gt;
&lt;br /&gt;
=== The InnerClasses Attribute ===&lt;br /&gt;
&lt;br /&gt;
The &amp;lt;code&amp;gt;InnerClasses&amp;lt;/code&amp;gt; attribute of a class contains entries for all inner classes referenced by that class. Each entry has four values:&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;code&amp;gt;inner class name&amp;lt;/code&amp;gt;: the internal name of the inner class&lt;br /&gt;
* &amp;lt;code&amp;gt;outer class name&amp;lt;/code&amp;gt;: the internal name of the outer class&lt;br /&gt;
* &amp;lt;code&amp;gt;inner name&amp;lt;/code&amp;gt;: the simple name of the inner class (i.e. the name as declared in the source)&lt;br /&gt;
* &amp;lt;code&amp;gt;inner class access&amp;lt;/code&amp;gt;: the access modifier flags of the inner class&lt;br /&gt;
&lt;br /&gt;
The &amp;lt;code&amp;gt;outer class name&amp;lt;/code&amp;gt; is empty for anonymous and local classes.&lt;br /&gt;
&lt;br /&gt;
The &amp;lt;code&amp;gt;inner name&amp;lt;/code&amp;gt; value is empty for anonymous classes.&lt;br /&gt;
&lt;br /&gt;
=== The EnclosingMethod Attribute ===&lt;br /&gt;
&lt;br /&gt;
The &amp;lt;code&amp;gt;EnclosingMethod&amp;lt;/code&amp;gt; attribute of a class describes the outer class and method of an inner class. It has three values:&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;code&amp;gt;enclosing class name&amp;lt;/code&amp;gt;: the internal name of the enclosing class&lt;br /&gt;
* &amp;lt;code&amp;gt;enclosing method name&amp;lt;/code&amp;gt;: the name of the enclosing method&lt;br /&gt;
* &amp;lt;code&amp;gt;enclosing method descriptor&amp;lt;/code&amp;gt;: the type descriptor of the enclosing method&lt;br /&gt;
&lt;br /&gt;
This attribute is only present for local and anonymous classes.&lt;br /&gt;
&lt;br /&gt;
The &amp;lt;code&amp;gt;enclosing method name&amp;lt;/code&amp;gt; and &amp;lt;code&amp;gt;enclosing method descriptor&amp;lt;/code&amp;gt; values are empty for anonymous classes that are declared in in-line initializers for fields.&lt;/div&gt;</summary>
		<author><name>Space Walker</name></author>
	</entry>
	<entry>
		<id>https://wiki.ornithemc.net/index.php?title=Nester&amp;diff=40</id>
		<title>Nester</title>
		<link rel="alternate" type="text/html" href="https://wiki.ornithemc.net/index.php?title=Nester&amp;diff=40"/>
		<updated>2025-08-12T14:01:26Z</updated>

		<summary type="html">&lt;p&gt;Space Walker: fix two typos&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Nester is a tool to patch inner class attributes in Java class files. It takes in a [[Nests]] data file and applies those patches to a jar file. &lt;br /&gt;
&lt;br /&gt;
== Inner Classes ==&lt;br /&gt;
&lt;br /&gt;
Inner classes are classes that are defined inside other classes or methods. There are three types of inner classes: nested classes, local classes, and anonymous classes. Each type has its own uses, and a different relationship with its outer class or method.&lt;br /&gt;
&lt;br /&gt;
=== Nested Classes ===&lt;br /&gt;
&lt;br /&gt;
A nested class is a class declared inside another class. &lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
public class Outer {&lt;br /&gt;
    ...&lt;br /&gt;
    public class Inner {&lt;br /&gt;
        ...&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Nested classes can be &#039;&#039;static&#039;&#039; or &#039;&#039;non-static&#039;&#039;.&lt;br /&gt;
* A &#039;&#039;static&#039;&#039; nested class can access static members of its outer class, and vice versa, even if those members are private.&lt;br /&gt;
* A &#039;&#039;non-static&#039;&#039; nested class can access both static members and instance members of its outer class, and vice versa, even if those members are private.&lt;br /&gt;
&lt;br /&gt;
=== Local Classes ===&lt;br /&gt;
&lt;br /&gt;
A local class a class declared inside a method.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
public class Outer {&lt;br /&gt;
    ....&lt;br /&gt;
    public void outer() {&lt;br /&gt;
        ...&lt;br /&gt;
        class Inner {&lt;br /&gt;
            ...&lt;br /&gt;
        }&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
A local class can access both static and instance members from its outer class, as well as local variables from the scope in which it is declared in its outer method.&lt;br /&gt;
&lt;br /&gt;
=== Anonymous Classes ===&lt;br /&gt;
&lt;br /&gt;
An anonymous class is a class declared and instantiated at the same time.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
public class Outer {&lt;br /&gt;
    ...&lt;br /&gt;
    public void outer() {&lt;br /&gt;
        ...&lt;br /&gt;
        Runnable task = new Runnable() {&lt;br /&gt;
            ...&lt;br /&gt;
        }&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
An anonymous class can access both static and instance members from its outer class, as well as local variables from the scope in which it is declared in its outer method.&lt;br /&gt;
&lt;br /&gt;
=== Special Classes ===&lt;br /&gt;
&lt;br /&gt;
The Java compiler may generate special classes for some of the language&#039;s features. These synthetic classes are normally invisible.&lt;br /&gt;
&lt;br /&gt;
* Switch statements are compiled to classes with enum value tables.&lt;br /&gt;
* A completely empty class may be generated and passed between multiple nested classes and their outer class to enforce the contract for access between them.&lt;br /&gt;
&lt;br /&gt;
== Inner Class Attributes ==&lt;br /&gt;
&lt;br /&gt;
Inner class attributes describe the relationship between inner classes and their outer classes or methods. Obfuscators such as [https://www.guardsquare.com/proguard ProGuard] may remove them to shrink the jar file size. This is generally not a problem, since these attributes do not affect the runtime behavior of a Java application. However, they do make a difference at &#039;&#039;compile time&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
Interactions with inner classes will not work properly if the inner class attributes are missing. Access between non-static nested classes and their outer classes will be broken, anonymous classes will be accessible when they should not be, and references to nested classes will not work.&lt;br /&gt;
&lt;br /&gt;
On top of the compile time issues, decompiler results will be significantly worse for jars where the inner class attributes are not present. Local and anonymous classes will not appear inside their outer classes and methods, and member access between nested classes and their outer classes may appear as references to methods that do not exist.&lt;br /&gt;
&lt;br /&gt;
=== The InnerClasses Attribute ===&lt;br /&gt;
&lt;br /&gt;
The &amp;lt;code&amp;gt;InnerClasses&amp;lt;/code&amp;gt; attribute of a class contains entries for all inner classes referenced by that class. Each entry has four values:&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;code&amp;gt;inner class name&amp;lt;/code&amp;gt;: the internal name of the inner class&lt;br /&gt;
* &amp;lt;code&amp;gt;outer class name&amp;lt;/code&amp;gt;: the internal name of the outer class&lt;br /&gt;
* &amp;lt;code&amp;gt;inner name&amp;lt;/code&amp;gt;: the simple name of the inner class (i.e. the name as declared in the source)&lt;br /&gt;
* &amp;lt;code&amp;gt;inner class access&amp;lt;/code&amp;gt;: the access modifier flags of the inner class&lt;br /&gt;
&lt;br /&gt;
The &amp;lt;code&amp;gt;outer class name&amp;lt;/code&amp;gt; is empty for anonymous and local classes.&lt;br /&gt;
&lt;br /&gt;
The &amp;lt;code&amp;gt;inner name&amp;lt;/code&amp;gt; value is empty for anonymous classes.&lt;br /&gt;
&lt;br /&gt;
=== The EnclosingMethod Attribute ===&lt;br /&gt;
&lt;br /&gt;
The &amp;lt;code&amp;gt;EnclosingMethod&amp;lt;/code&amp;gt; attribute of a class describes the outer class and method of an inner class. It has three values:&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;code&amp;gt;enclosing class name&amp;lt;/code&amp;gt;: the internal name of the enclosing class&lt;br /&gt;
* &amp;lt;code&amp;gt;enclosing method name&amp;lt;/code&amp;gt;: the name of the enclosing method&lt;br /&gt;
* &amp;lt;code&amp;gt;enclosing method descriptor&amp;lt;/code&amp;gt;: the type descriptor of the enclosing method&lt;br /&gt;
&lt;br /&gt;
This attribute is only present for local and anonymous classes.&lt;br /&gt;
&lt;br /&gt;
The &amp;lt;code&amp;gt;enclosing method name&amp;lt;/code&amp;gt; and &amp;lt;code&amp;gt;enclosing method descriptor&amp;lt;/code&amp;gt; values are empty for anonymous classes that are declared in in-line initializers for fields.&lt;/div&gt;</summary>
		<author><name>Space Walker</name></author>
	</entry>
	<entry>
		<id>https://wiki.ornithemc.net/index.php?title=Nester&amp;diff=39</id>
		<title>Nester</title>
		<link rel="alternate" type="text/html" href="https://wiki.ornithemc.net/index.php?title=Nester&amp;diff=39"/>
		<updated>2025-08-12T13:53:34Z</updated>

		<summary type="html">&lt;p&gt;Space Walker: Created page with &amp;quot;Nester is a tool to patch inner class attributes in Java class files. It takes in a Nests data file and applies those patches to a jar file.   == Inner Classes ==  Inner classes are classes that are defined inside other classes or methods. There are three types of inner classes: nested classes, local classes, and anonymous classes. Each type has its own uses, and a different relationship with its outer class or method.  === Nested Classes ===  A nested class is a cla...&amp;quot;&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Nester is a tool to patch inner class attributes in Java class files. It takes in a [[Nests]] data file and applies those patches to a jar file. &lt;br /&gt;
&lt;br /&gt;
== Inner Classes ==&lt;br /&gt;
&lt;br /&gt;
Inner classes are classes that are defined inside other classes or methods. There are three types of inner classes: nested classes, local classes, and anonymous classes. Each type has its own uses, and a different relationship with its outer class or method.&lt;br /&gt;
&lt;br /&gt;
=== Nested Classes ===&lt;br /&gt;
&lt;br /&gt;
A nested class is a class declared inside another class. &lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
public class Outer {&lt;br /&gt;
    ...&lt;br /&gt;
    public class Inner {&lt;br /&gt;
        ...&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Nested classes can be &#039;&#039;static&#039;&#039; or &#039;&#039;non-static&#039;&#039;.&lt;br /&gt;
* A &#039;&#039;static&#039;&#039; nested class can access static members of its outer class, and vice versa, even if those members are private.&lt;br /&gt;
* A &#039;&#039;non-static&#039;&#039; nested class can access both static members and instance members of its outer class, and vice versa, even if those members are private.&lt;br /&gt;
&lt;br /&gt;
=== Local Classes ===&lt;br /&gt;
&lt;br /&gt;
A local class a class declared inside a method.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
public class Outer {&lt;br /&gt;
    ....&lt;br /&gt;
    public void outer() {&lt;br /&gt;
        ...&lt;br /&gt;
        class Inner {&lt;br /&gt;
            ...&lt;br /&gt;
        }&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
A local class can access both static and instance members from its outer class, as well as local variables from the scope in which it is declared in its outer method.&lt;br /&gt;
&lt;br /&gt;
=== Anonymous Classes ===&lt;br /&gt;
&lt;br /&gt;
An anonymous class is a class declared and instantiated at the same time.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
public class Outer {&lt;br /&gt;
    ...&lt;br /&gt;
    public void outer() {&lt;br /&gt;
        ...&lt;br /&gt;
        Runnable task = new Runnable() {&lt;br /&gt;
            ...&lt;br /&gt;
        }&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
An anonymous class can access both static and instance members from its outer class, as well as local variables from the scope in which it is declared in its outer method.&lt;br /&gt;
&lt;br /&gt;
=== Special Classes ===&lt;br /&gt;
&lt;br /&gt;
The Java compiler may generate special classes for some of the language features. These synthetic classes are normally invisible.&lt;br /&gt;
&lt;br /&gt;
* Switch statements are compiled to classes with enum value tables.&lt;br /&gt;
* A completely empty class may be generated and passed between multiple nested class and their outer class to enforce the contract for access between them.&lt;br /&gt;
&lt;br /&gt;
== Inner Class Attributes ==&lt;br /&gt;
&lt;br /&gt;
Inner class attributes describe the relationship between inner classes and their outer classes or methods. Obfuscators such as [https://www.guardsquare.com/proguard ProGuard] may remove them to shrink the jar file size. This is generally not a problem, since these attributes do not affect the runtime behavior of a Java application. However, they do make a difference at &#039;&#039;compile time&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
Interactions with inner classes will not work properly if the inner class attributes are missing. Access between non-static nested classes and their outer classes will be broken, anonymous classes will be accessible when they should not be, and references to nested classes will not work.&lt;br /&gt;
&lt;br /&gt;
On top of the compile time issues, decompiler results will be significantly worse for jars where the inner class attributes are not present. Local and anonymous classes will not appear inside their outer classes and methods, and member access between nested classes and their outer classes may appear as references to methods that do not exist.&lt;br /&gt;
&lt;br /&gt;
=== The InnerClasses Attribute ===&lt;br /&gt;
&lt;br /&gt;
The &amp;lt;code&amp;gt;InnerClasses&amp;lt;/code&amp;gt; attribute of a class contains entries for all inner classes referenced by that class. Each entry has four values:&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;code&amp;gt;inner class name&amp;lt;/code&amp;gt;: the internal name of the inner class&lt;br /&gt;
* &amp;lt;code&amp;gt;outer class name&amp;lt;/code&amp;gt;: the internal name of the outer class&lt;br /&gt;
* &amp;lt;code&amp;gt;inner name&amp;lt;/code&amp;gt;: the simple name of the inner class (i.e. the name as declared in the source)&lt;br /&gt;
* &amp;lt;code&amp;gt;inner class access&amp;lt;/code&amp;gt;: the access modifier flags of the inner class&lt;br /&gt;
&lt;br /&gt;
The &amp;lt;code&amp;gt;outer class name&amp;lt;/code&amp;gt; is empty for anonymous and local classes.&lt;br /&gt;
&lt;br /&gt;
The &amp;lt;code&amp;gt;inner name&amp;lt;/code&amp;gt; value is empty for anonymous classes.&lt;br /&gt;
&lt;br /&gt;
=== The EnclosingMethod Attribute ===&lt;br /&gt;
&lt;br /&gt;
The &amp;lt;code&amp;gt;EnclosingMethod&amp;lt;/code&amp;gt; attribute of a class describes the outer class and method of an inner class. It has three values:&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;code&amp;gt;enclosing class name&amp;lt;/code&amp;gt;: the internal name of the enclosing class&lt;br /&gt;
* &amp;lt;code&amp;gt;enclosing method name&amp;lt;/code&amp;gt;: the name of the enclosing method&lt;br /&gt;
* &amp;lt;code&amp;gt;enclosing method descriptor&amp;lt;/code&amp;gt;: the type descriptor of the enclosing method&lt;br /&gt;
&lt;br /&gt;
This attribute is only present for local and anonymous classes.&lt;br /&gt;
&lt;br /&gt;
The &amp;lt;code&amp;gt;enclosing method name&amp;lt;/code&amp;gt; and &amp;lt;code&amp;gt;enclosing method descriptor&amp;lt;/code&amp;gt; values are empty for anonymous classes that are declared in in-line initializers for fields.&lt;/div&gt;</summary>
		<author><name>Space Walker</name></author>
	</entry>
	<entry>
		<id>https://wiki.ornithemc.net/index.php?title=Nests&amp;diff=38</id>
		<title>Nests</title>
		<link rel="alternate" type="text/html" href="https://wiki.ornithemc.net/index.php?title=Nests&amp;diff=38"/>
		<updated>2025-08-12T12:52:46Z</updated>

		<summary type="html">&lt;p&gt;Space Walker: remove chapter about inner class attributes (and move them to the Nester page)&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Nests are Ornithe&#039;s inner class patches. They are used to modify inner class attributes in Java class files.&lt;br /&gt;
&lt;br /&gt;
See [[Nester]] for information on inner class attributes and how these patches are applied.&lt;br /&gt;
&lt;br /&gt;
=== Relevance ===&lt;br /&gt;
&lt;br /&gt;
Most Minecraft versions before 1.8.2 Pre-release 5 had the inner class attributes stripped from the jar. Nests were created in an effort to reconstruct what the original inner classes would have been in the source code.&lt;br /&gt;
&lt;br /&gt;
=== File Specification ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;.nest&amp;lt;/code&amp;gt; files are &amp;lt;code&amp;gt;UTF-8&amp;lt;/code&amp;gt; encoded text files. Each line defines the relationship between a class and its outer class and, if applicable, outer method. A line has the following format.&lt;br /&gt;
&lt;br /&gt;
 &amp;lt;class name&amp;gt;	&amp;lt;outer class name&amp;gt;	&amp;lt;outer method name&amp;gt;	&amp;lt;outer method descriptor&amp;gt;	&amp;lt;inner name&amp;gt;	&amp;lt;access&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;code&amp;gt;class name&amp;lt;/code&amp;gt;: the internal name of the class&lt;br /&gt;
* &amp;lt;code&amp;gt;outer class name&amp;lt;/code&amp;gt;: the internal name of the outer class.&lt;br /&gt;
* &amp;lt;code&amp;gt;outer method name&amp;lt;/code&amp;gt;: the name of the outer method (may be empty).&lt;br /&gt;
* &amp;lt;code&amp;gt;outer method descriptor&amp;lt;/code&amp;gt;: the descriptor describing the type of the outer method (may be empty).&lt;br /&gt;
* &amp;lt;code&amp;gt;inner name&amp;lt;/code&amp;gt;: the inner name of the class (may be empty).&lt;br /&gt;
* &amp;lt;code&amp;gt;access&amp;lt;/code&amp;gt;: the access flags for the inner class.&lt;br /&gt;
&lt;br /&gt;
==== Notes ====&lt;br /&gt;
&lt;br /&gt;
The &amp;lt;code&amp;gt;inner name&amp;lt;/code&amp;gt; component does not directly correspond to the inner name as defined in the inner class attribute. Rather, it is used to construct a new internal name of the class. The actual inner name is parsed from this component.&lt;br /&gt;
&lt;br /&gt;
For regular inner classes, the &amp;lt;code&amp;gt;inner name&amp;lt;/code&amp;gt; component corresponds directly to the inner name as defined in the inner class attribute. If the component is all digits, the inner class is assumed to be anonymous, and the actual inner name &amp;lt;code&amp;gt;null&amp;lt;/code&amp;gt;. If the component starts with digits and transitions to text, the inner class is assumed to be local, and the inner name the text part of the component.&lt;br /&gt;
&lt;br /&gt;
For example:&lt;br /&gt;
* &amp;lt;code&amp;gt;Example&amp;lt;/code&amp;gt; - the class is assumed to be a regular inner class, with inner name &amp;lt;code&amp;gt;Example&amp;lt;/code&amp;gt;.&lt;br /&gt;
* &amp;lt;code&amp;gt;1&amp;lt;/code&amp;gt; - the class is assumed to be an anonymous class, with inner name &amp;lt;code&amp;gt;null&amp;lt;/code&amp;gt;.&lt;br /&gt;
* &amp;lt;code&amp;gt;1Example&amp;lt;/code&amp;gt; - the class is assumed to be a local class, with inner name &amp;lt;code&amp;gt;Example&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
[[category:Mod Development]]&lt;/div&gt;</summary>
		<author><name>Space Walker</name></author>
	</entry>
	<entry>
		<id>https://wiki.ornithemc.net/index.php?title=Installing_Ornithe&amp;diff=37</id>
		<title>Installing Ornithe</title>
		<link rel="alternate" type="text/html" href="https://wiki.ornithemc.net/index.php?title=Installing_Ornithe&amp;diff=37"/>
		<updated>2025-08-12T11:19:09Z</updated>

		<summary type="html">&lt;p&gt;Space Walker: remove chapter numbers as they are automatically assigned&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;This guide will only cover installing Ornithe to the Official Minecraft launcher, MultiMC and its derivatives such as PrismLauncher and for a dedicated server. Other launchers may also allow for an automated installation, however as of 2025-04-23 we are not aware of any.&lt;br /&gt;
&lt;br /&gt;
=== Download the installer ===&lt;br /&gt;
&lt;br /&gt;
Head to our website at https://ornithemc.net/download and grab the installer for your platform. Should the native installer not be available for your platform or not work for you, follow the steps at [[Installing Ornithe#Addendum: Using the java-based installer|§ Addendum: Using the java-based installer]].&lt;br /&gt;
&lt;br /&gt;
=== Installation ===&lt;br /&gt;
&lt;br /&gt;
Depending on your target environment, this step changes slightly.&lt;br /&gt;
&lt;br /&gt;
==== Official Launcher ====&lt;br /&gt;
&lt;br /&gt;
Due to the difficulties around managing multiple instances using the official launcher its usage in modded scenarios &lt;br /&gt;
is generally discouraged.&lt;br /&gt;
&lt;br /&gt;
Before starting, make sure that both your game and the launcher are closed.&lt;br /&gt;
&lt;br /&gt;
===== GUI Installation =====&lt;br /&gt;
&lt;br /&gt;
* Select the &amp;quot;Client(Official Launcher)&amp;quot; environment&lt;br /&gt;
* Choose your desired Minecraft version. You might need to enable the &amp;quot;Snapshots&amp;quot; checkbox to choose non-release versions or the &amp;quot;Historical Versions&amp;quot; checkbox to show versions before 1.0.0.&lt;br /&gt;
* Choose your desired loader and loader version. If you&#039;re uncertain it&#039;s fine to leave it at its defaults of the latest version of Fabric loader.&lt;br /&gt;
* Choose the installation location. This directory should be your &amp;lt;code&amp;gt;.minecraft&amp;lt;/code&amp;gt; directory. The Installer will default to the default location, so if you haven&#039;t changed anything it should also be fine to leave as-is.&lt;br /&gt;
* The Installer will generate a new profile for Ornithe by default. This behavior can be disabled by unchecking this checkbox.&lt;br /&gt;
&lt;br /&gt;
Now, click &amp;quot;Install&amp;quot;, wait for your installation to complete and enjoy the game.&lt;br /&gt;
&lt;br /&gt;
===== CLI Installation =====&lt;br /&gt;
&lt;br /&gt;
The CLI offers the same functionality as the Gui. To install for the official launcher, use the &amp;lt;code&amp;gt;client&amp;lt;/code&amp;gt; subcommand. Then, add your desired minecraft version as an argument.&lt;br /&gt;
&lt;br /&gt;
 $ ornithe-installer-rs client --minecraft-version VERSION&lt;br /&gt;
&lt;br /&gt;
Example:&lt;br /&gt;
 $ ornithe-installer-rs client --minecraft-version 1.7.2&lt;br /&gt;
&lt;br /&gt;
The &amp;lt;code&amp;gt;--minecraft-version&amp;lt;/code&amp;gt; argument may also be shortened to &amp;lt;code&amp;gt;-m&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Additional arguments for other options are available as well:&lt;br /&gt;
&lt;br /&gt;
* Loader type: &amp;lt;code&amp;gt;--loader-type &amp;lt;TYPE&amp;gt;&amp;lt;/code&amp;gt;&lt;br /&gt;
* Loader version: &amp;lt;code&amp;gt;--loader-version &amp;lt;VERSION&amp;gt;&amp;lt;/code&amp;gt;&lt;br /&gt;
* Installation directory: &amp;lt;code&amp;gt;-d --dir &amp;lt;DIR&amp;gt;&amp;lt;/code&amp;gt;&lt;br /&gt;
* Whether to generate a profile: &amp;lt;code&amp;gt;-p --generate-profile &amp;lt;VALUE&amp;gt;&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== MultiMC/PrismLauncher ====&lt;br /&gt;
&lt;br /&gt;
PrismLauncher is the recommended launcher for Ornithe.&lt;br /&gt;
&lt;br /&gt;
===== GUI Installation =====&lt;br /&gt;
&lt;br /&gt;
* Select the &amp;quot;MultiMC/PrismLauncher&amp;quot; environment&lt;br /&gt;
* Choose your desired Minecraft version. You might need to enable the &amp;quot;Snapshots&amp;quot; checkbox to choose non-release versions or the &amp;quot;Historical Versions&amp;quot; checkbox to show versions before 1.0.0.&lt;br /&gt;
* Choose your desired loader and loader version. If you&#039;re uncertain it&#039;s fine to leave it at its defaults of the latest version of Fabric loader.&lt;br /&gt;
* Choose the installation location. By default, the installer will output a zip file for your instance into this directory. However, if you have unselected &amp;quot;Generate Instance Zip&amp;quot; this directory should be your launcher&#039;s &amp;lt;code&amp;gt;instances&amp;lt;/code&amp;gt; directory.&lt;br /&gt;
&lt;br /&gt;
Now, click &amp;quot;Install&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
If you generated an instance zip, import it into your launcher, for example by dragging it onto it.&lt;br /&gt;
Otherwise, restart your launcher for it to reload the instance list.&lt;br /&gt;
&lt;br /&gt;
===== CLI Installation =====&lt;br /&gt;
&lt;br /&gt;
The CLI offers the same functionality as the Gui. To install for MultiMC or its derivatives, use the &amp;lt;code&amp;gt;mmc&amp;lt;/code&amp;gt; subcommand (or its alias, &amp;lt;code&amp;gt;prism&amp;lt;/code&amp;gt;). Then, add your desired minecraft version as an argument.&lt;br /&gt;
&lt;br /&gt;
 $ ornithe-installer-rs mmc --minecraft-version VERSION&lt;br /&gt;
&lt;br /&gt;
Example:&lt;br /&gt;
 $ ornithe-installer-rs mmc --minecraft-version 1.7.2&lt;br /&gt;
&lt;br /&gt;
The &amp;lt;code&amp;gt;--minecraft-version&amp;lt;/code&amp;gt; argument may also be shortened to &amp;lt;code&amp;gt;-m&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Additional arguments for other options are available as well:&lt;br /&gt;
&lt;br /&gt;
* Loader type: &amp;lt;code&amp;gt;--loader-type &amp;lt;TYPE&amp;gt;&amp;lt;/code&amp;gt;&lt;br /&gt;
* Loader version: &amp;lt;code&amp;gt;--loader-version &amp;lt;VERSION&amp;gt;&amp;lt;/code&amp;gt;&lt;br /&gt;
* Installation directory: &amp;lt;code&amp;gt;-d --dir &amp;lt;DIR&amp;gt;&amp;lt;/code&amp;gt;&lt;br /&gt;
* Whether to generate a profile zip: &amp;lt;code&amp;gt;-z --generate-zip &amp;lt;VALUE&amp;gt;&amp;lt;/code&amp;gt;&lt;br /&gt;
* Whether to copy the output path to the clipboard: &amp;lt;code&amp;gt;-c --copy-profile-path &amp;lt;VALUE&amp;gt;&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== Server ====&lt;br /&gt;
&lt;br /&gt;
Most likely, your server will not have a graphical environment so you should skip ahead to the Cli Installation.&lt;br /&gt;
&lt;br /&gt;
===== GUI Installation =====&lt;br /&gt;
&lt;br /&gt;
* Select the &amp;quot;Server&amp;quot; environment&lt;br /&gt;
* Choose your desired Minecraft version. You might need to enable the &amp;quot;Snapshots&amp;quot; checkbox to choose non-release versions or the &amp;quot;Historical Versions&amp;quot; checkbox to show versions before 1.0.0.&lt;br /&gt;
* Choose your desired loader and loader version. If you&#039;re uncertain it&#039;s fine to leave it at its defaults of the latest version of Fabric loader.&lt;br /&gt;
* Choose the installation location. By default, the installer will install into a new &amp;lt;code&amp;gt;server&amp;lt;/code&amp;gt; sub-directory in the current directory.&lt;br /&gt;
* If &amp;quot;Download Minecraft Server&amp;quot; is checked, the installer will download the server jar for you. Otherwise, you will have to download it yourself.&lt;br /&gt;
&lt;br /&gt;
Now, click &amp;quot;Install&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
You can then start your server with either&lt;br /&gt;
 java -jar fabric-server-launch.jar nogui&lt;br /&gt;
if you selected the Fabric Loader, or&lt;br /&gt;
 java -jar quilt-server-launch.jar nogui&lt;br /&gt;
if you chose the Quilt Loader.&lt;br /&gt;
&lt;br /&gt;
===== CLI Installation =====&lt;br /&gt;
&lt;br /&gt;
The CLI generally offers the same functionality as the Gui, with the main addition being the bootstrap functionality. For this, see [[Installing Ornithe#2.3.3. Install &amp;amp; Run (CLI)|§ 2.3.3. Install &amp;amp; Run (CLI)]]. To install a server, use the &amp;lt;code&amp;gt;server&amp;lt;/code&amp;gt; subcommand. Then, add your desired minecraft version as an argument.&lt;br /&gt;
&lt;br /&gt;
 $ ornithe-installer-rs server --minecraft-version VERSION&lt;br /&gt;
&lt;br /&gt;
Example:&lt;br /&gt;
 $ ornithe-installer-rs server --minecraft-version 1.7.2&lt;br /&gt;
&lt;br /&gt;
The &amp;lt;code&amp;gt;--minecraft-version&amp;lt;/code&amp;gt; argument may also be shortened to &amp;lt;code&amp;gt;-m&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Additional arguments for other options are available as well:&lt;br /&gt;
&lt;br /&gt;
* Loader type: &amp;lt;code&amp;gt;--loader-type &amp;lt;TYPE&amp;gt;&amp;lt;/code&amp;gt;&lt;br /&gt;
* Loader version: &amp;lt;code&amp;gt;--loader-version &amp;lt;VERSION&amp;gt;&amp;lt;/code&amp;gt;&lt;br /&gt;
* Installation directory: &amp;lt;code&amp;gt;-d --dir &amp;lt;DIR&amp;gt;&amp;lt;/code&amp;gt;&lt;br /&gt;
* Whether to download the minecraft server jar: &amp;lt;code&amp;gt;--download-minecraft&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===== Install &amp;amp; Run (CLI) =====&lt;br /&gt;
&lt;br /&gt;
For this, the installer serves as a server bootstrap and the &amp;lt;code&amp;gt;run&amp;lt;/code&amp;gt; subcommand of the &amp;lt;code&amp;gt;server&amp;lt;/code&amp;gt; subcommand is used.&lt;br /&gt;
&lt;br /&gt;
 $ ornithe-installer-rs server --minecraft-version VERSION run&lt;br /&gt;
&lt;br /&gt;
Example:&lt;br /&gt;
&lt;br /&gt;
 $ ornithe-installer-rs server --minecraft-version 1.7.2 run&lt;br /&gt;
&lt;br /&gt;
In addition to the arguments available for the &amp;lt;code&amp;gt;server&amp;lt;/code&amp;gt; subcommand, additional arguments are available for the &amp;lt;code&amp;gt;run&amp;lt;/code&amp;gt; subcommand:&lt;br /&gt;
&lt;br /&gt;
* Java arguments to pass to the server: &amp;lt;code&amp;gt;--args &amp;lt;ARGS&amp;gt;&amp;lt;/code&amp;gt;&lt;br /&gt;
* Java binary to use to start the server: &amp;lt;code&amp;gt;--java &amp;lt;PATH&amp;gt;&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
The &amp;lt;code&amp;gt;--download-minecraft&amp;lt;/code&amp;gt; flag is not applicable and always enabled when the &amp;lt;code&amp;gt;run&amp;lt;/code&amp;gt; subcommand is used.&lt;br /&gt;
&lt;br /&gt;
Then, your server will be installed automatically and started afterwards.&lt;br /&gt;
&lt;br /&gt;
=== Addendum: Using the java-based installer ===&lt;br /&gt;
&lt;br /&gt;
// TODO&lt;/div&gt;</summary>
		<author><name>Space Walker</name></author>
	</entry>
	<entry>
		<id>https://wiki.ornithemc.net/index.php?title=Nests&amp;diff=35</id>
		<title>Nests</title>
		<link rel="alternate" type="text/html" href="https://wiki.ornithemc.net/index.php?title=Nests&amp;diff=35"/>
		<updated>2025-07-31T16:00:51Z</updated>

		<summary type="html">&lt;p&gt;Space Walker: create Nests page&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Nests are Ornithe&#039;s inner class patches. They are used to modify inner class attributes in Java class files.&lt;br /&gt;
&lt;br /&gt;
See [[Nester]] for information on how these patches are applied.&lt;br /&gt;
&lt;br /&gt;
=== Inner Class Attributes ===&lt;br /&gt;
&lt;br /&gt;
Inner class attributes are necessary for interactions with inner classes to work as expected. This is especially noticeable with non-static inner classes, and anonymous classes in particular. These inner classes can access fields, methods, or variables from their outer class or method, as well as the other way around.&lt;br /&gt;
&lt;br /&gt;
Obfuscators such as [https://www.guardsquare.com/proguard ProGuard] may remove these class file attributes. This is generally not a problem, since these attributes do not affect the runtime behavior of a Java application. However, if you wish to de-obfuscate and decompile a jar file, you will get better results when the inner class attributes are present.&lt;br /&gt;
&lt;br /&gt;
=== Relevance ===&lt;br /&gt;
&lt;br /&gt;
Most Minecraft versions before 1.8.2 Pre-release 5 had the inner class attributes stripped from the jar. Nests were created in an effort to reconstruct what the original inner classes would have been in the source code.&lt;br /&gt;
&lt;br /&gt;
=== File Specification ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;.nest&amp;lt;/code&amp;gt; files are &amp;lt;code&amp;gt;UTF-8&amp;lt;/code&amp;gt; encoded text files. Each line defines the relationship between a class and its outer class and, if applicable, outer method. A line has the following format.&lt;br /&gt;
&lt;br /&gt;
 &amp;lt;class name&amp;gt;	&amp;lt;outer class name&amp;gt;	&amp;lt;outer method name&amp;gt;	&amp;lt;outer method descriptor&amp;gt;	&amp;lt;inner name&amp;gt;	&amp;lt;access&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;code&amp;gt;class name&amp;lt;/code&amp;gt;: the internal name of the class&lt;br /&gt;
* &amp;lt;code&amp;gt;outer class name&amp;lt;/code&amp;gt;: the internal name of the outer class.&lt;br /&gt;
* &amp;lt;code&amp;gt;outer method name&amp;lt;/code&amp;gt;: the name of the outer method (may be empty).&lt;br /&gt;
* &amp;lt;code&amp;gt;outer method descriptor&amp;lt;/code&amp;gt;: the descriptor describing the type of the outer method (may be empty).&lt;br /&gt;
* &amp;lt;code&amp;gt;inner name&amp;lt;/code&amp;gt;: the inner name of the class (may be empty).&lt;br /&gt;
* &amp;lt;code&amp;gt;access&amp;lt;/code&amp;gt;: the access flags for the inner class.&lt;br /&gt;
&lt;br /&gt;
==== Notes ====&lt;br /&gt;
&lt;br /&gt;
The &amp;lt;code&amp;gt;inner name&amp;lt;/code&amp;gt; component does not directly correspond to the inner name as defined in the inner class attribute. Rather, it is used to construct a new internal name of the class. The actual inner name is parsed from this component.&lt;br /&gt;
&lt;br /&gt;
For regular inner classes, the &amp;lt;code&amp;gt;inner name&amp;lt;/code&amp;gt; component corresponds directly to the inner name as defined in the inner class attribute. If the component is all digits, the inner class is assumed to be anonymous, and the actual inner name &amp;lt;code&amp;gt;null&amp;lt;/code&amp;gt;. If the component starts with digits and transitions to text, the inner class is assumed to be local, and the inner name the text part of the component.&lt;br /&gt;
&lt;br /&gt;
For example:&lt;br /&gt;
* &amp;lt;code&amp;gt;Example&amp;lt;/code&amp;gt; - the class is assumed to be a regular inner class, with inner name &amp;lt;code&amp;gt;Example&amp;lt;/code&amp;gt;.&lt;br /&gt;
* &amp;lt;code&amp;gt;1&amp;lt;/code&amp;gt; - the class is assumed to be an anonymous class, with inner name &amp;lt;code&amp;gt;null&amp;lt;/code&amp;gt;.&lt;br /&gt;
* &amp;lt;code&amp;gt;1Example&amp;lt;/code&amp;gt; - the class is assumed to be a local class, with inner name &amp;lt;code&amp;gt;Example&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
[[category:Mod Development]]&lt;/div&gt;</summary>
		<author><name>Space Walker</name></author>
	</entry>
	<entry>
		<id>https://wiki.ornithemc.net/index.php?title=Setting_up_a_Mod_Development_Environment&amp;diff=34</id>
		<title>Setting up a Mod Development Environment</title>
		<link rel="alternate" type="text/html" href="https://wiki.ornithemc.net/index.php?title=Setting_up_a_Mod_Development_Environment&amp;diff=34"/>
		<updated>2025-07-31T14:57:40Z</updated>

		<summary type="html">&lt;p&gt;Space Walker: Created page with &amp;quot;This article is a guide on how to set up an Ornithe mod development environment.  == Before You Get Started ==  If you have no prior experience with programming in Java, it is strongly recommended you learn at least the basics first. Here are some resources to help you on your way: * Oracle Java tutorials: https://docs.oracle.com/javase/tutorial/ * Java tutorial at W3Schools: https://www.w3schools.com/java/  Ornithe modding is essentially the same as Fabric/Quilt modding...&amp;quot;&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;This article is a guide on how to set up an Ornithe mod development environment.&lt;br /&gt;
&lt;br /&gt;
== Before You Get Started ==&lt;br /&gt;
&lt;br /&gt;
If you have no prior experience with programming in Java, it is strongly recommended you learn at least the basics first. Here are some resources to help you on your way:&lt;br /&gt;
* Oracle Java tutorials: https://docs.oracle.com/javase/tutorial/&lt;br /&gt;
* Java tutorial at W3Schools: https://www.w3schools.com/java/&lt;br /&gt;
&lt;br /&gt;
Ornithe modding is essentially the same as Fabric/Quilt modding. There are, however, a few key differences. If you are not familiar with Fabric/Quilt modding, you may peruse their documentation ([https://wiki.fabricmc.net/ here] for Fabric, [https://wiki.quiltmc.org/ here] for Quilt), though it is not required to follow this guide.&lt;br /&gt;
&lt;br /&gt;
== The Mod Template ==&lt;br /&gt;
&lt;br /&gt;
The mod template is a bare bones mod development project. It has all the necessary elements, and can be customized to suit your own needs. You can visit the repository on GitHub at https://github.com/OrnitheMC/ornithe-mod-template/.&lt;br /&gt;
&lt;br /&gt;
=== Using the Template ===&lt;br /&gt;
&lt;br /&gt;
The first step is to create a new repository from the template. In the &amp;lt;code&amp;gt;Create a new repository&amp;lt;/code&amp;gt; dialog, make sure to select the &amp;lt;code&amp;gt;Include all branches&amp;lt;/code&amp;gt; option.&lt;br /&gt;
&lt;br /&gt;
Next, you must choose the correct branch for your project. Which branch to choose depends on the mod loader of your choice, and the Minecraft version your mod will be targeting.&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;code&amp;gt;fabric/merged&amp;lt;/code&amp;gt; for a Fabric mod for Minecraft 1.3 or later.&lt;br /&gt;
* &amp;lt;code&amp;gt;fabric/split&amp;lt;/code&amp;gt; for a Fabric mod for Minecraft 12w30e or earlier.&lt;br /&gt;
* &amp;lt;code&amp;gt;quilt/merged&amp;lt;/code&amp;gt; for a Quilt mod for Minecraft 1.3 or later.&lt;br /&gt;
* &amp;lt;code&amp;gt;quilt/split&amp;lt;/code&amp;gt; for a Quilt mod for Minecraft 12w30e or earlier.&lt;br /&gt;
&lt;br /&gt;
You may rename the chosen branch to &amp;lt;code&amp;gt;main&amp;lt;/code&amp;gt; (or otherwise as you see fit) and discard the others.&lt;br /&gt;
&lt;br /&gt;
=== Setting up the Project ===&lt;br /&gt;
&lt;br /&gt;
Once you have prepared your new repository, you can clone it to your computer and import the project into your IDE.&lt;br /&gt;
&lt;br /&gt;
Next, it&#039;s time to configure the project for the target Minecraft version. The &amp;lt;code&amp;gt;gradle.properties&amp;lt;/code&amp;gt; file contains the versions for key dependencies. Visit https://ornithemc.net/develop/ to look up the latest versions. Then edit the values for the following fields.&lt;br /&gt;
* &amp;lt;code&amp;gt;minecraft_version&amp;lt;/code&amp;gt;: the Minecraft version your mod will be targeting.&lt;br /&gt;
* &amp;lt;code&amp;gt;loader_version&amp;lt;/code&amp;gt;: the version of the mod loader.&lt;br /&gt;
* &amp;lt;code&amp;gt;osl_version&amp;lt;/code&amp;gt;: the version of OSL (Ornithe Standard Libraries).&lt;br /&gt;
&lt;br /&gt;
Some dependencies are different for Minecraft versions before 1.3 compared to 1.3 and later. These dependencies may also not be available at all for the Minecraft version your mod is targeting. In that case you will also need to make changes to the &amp;lt;code&amp;gt;build.gradle&amp;lt;/code&amp;gt; file.&lt;br /&gt;
&lt;br /&gt;
==== Dependencies for Minecraft 1.3 or Later ====&lt;br /&gt;
&lt;br /&gt;
Edit the values for the following fields in the &amp;lt;code&amp;gt;gradle.properties&amp;lt;/code&amp;gt; file.&lt;br /&gt;
* &amp;lt;code&amp;gt;feather_build&amp;lt;/code&amp;gt;: the build number of the [[Feather]] mappings.&lt;br /&gt;
* &amp;lt;code&amp;gt;raven_build&amp;lt;/code&amp;gt;: the build number for [[Raven]].&lt;br /&gt;
* &amp;lt;code&amp;gt;sparrow_build&amp;lt;/code&amp;gt;: the build number for [[Sparrow]].&lt;br /&gt;
* &amp;lt;code&amp;gt;nests_build&amp;lt;/code&amp;gt;: the build number for [[Nests]].&lt;br /&gt;
&lt;br /&gt;
If Raven is not avaliable, remove the following line from the &amp;lt;code&amp;gt;dependencies { }&amp;lt;/code&amp;gt; block in the &amp;lt;code&amp;gt;build.gradle&amp;lt;/code&amp;gt; file.&lt;br /&gt;
&lt;br /&gt;
 	exceptions ploceus.raven(project.raven_build)&lt;br /&gt;
&lt;br /&gt;
If Sparrow is not avaliable, remove the following line from the &amp;lt;code&amp;gt;dependencies { }&amp;lt;/code&amp;gt; block in the &amp;lt;code&amp;gt;build.gradle&amp;lt;/code&amp;gt; file.&lt;br /&gt;
&lt;br /&gt;
 	signatures ploceus.sparrow(project.sparrow_build)&lt;br /&gt;
&lt;br /&gt;
If Nests are not avaliable, remove the following line from the &amp;lt;code&amp;gt;dependencies { }&amp;lt;/code&amp;gt; block in the &amp;lt;code&amp;gt;build.gradle&amp;lt;/code&amp;gt; file.&lt;br /&gt;
&lt;br /&gt;
 	nests ploceus.nests(project.nests_build)&lt;br /&gt;
&lt;br /&gt;
==== Dependencies for Minecraft 12w30e or Earlier ====&lt;br /&gt;
&lt;br /&gt;
Edit the values for the following fields in the &amp;lt;code&amp;gt;client/gradle.properties&amp;lt;/code&amp;gt; and &amp;lt;code&amp;gt;server/gradle.properties&amp;lt;/code&amp;gt; files.&lt;br /&gt;
* &amp;lt;code&amp;gt;feather_build&amp;lt;/code&amp;gt;: the build number of the [[Feather]] mappings.&lt;br /&gt;
* &amp;lt;code&amp;gt;raven_build&amp;lt;/code&amp;gt;: the build number for [[Raven]].&lt;br /&gt;
* &amp;lt;code&amp;gt;sparrow_build&amp;lt;/code&amp;gt;: the build number for [[Sparrow]].&lt;br /&gt;
* &amp;lt;code&amp;gt;nests_build&amp;lt;/code&amp;gt;: the build number for [[Nests]].&lt;br /&gt;
&lt;br /&gt;
If Raven is not avaliable, remove the following line from the &amp;lt;code&amp;gt;project.dependencies { }&amp;lt;/code&amp;gt; block in the &amp;lt;code&amp;gt;build.gradle&amp;lt;/code&amp;gt; file.&lt;br /&gt;
&lt;br /&gt;
 	exceptions project.ploceus.raven(project.raven_build)&lt;br /&gt;
&lt;br /&gt;
If Sparrow is not avaliable, remove the following line from the &amp;lt;code&amp;gt;project.dependencies { }&amp;lt;/code&amp;gt; block in the &amp;lt;code&amp;gt;build.gradle&amp;lt;/code&amp;gt; file.&lt;br /&gt;
&lt;br /&gt;
 	signatures project.ploceus.sparrow(project.sparrow_build)&lt;br /&gt;
&lt;br /&gt;
If Nests are not avaliable, remove the following line from the &amp;lt;code&amp;gt;project.dependencies { }&amp;lt;/code&amp;gt; block in the &amp;lt;code&amp;gt;build.gradle&amp;lt;/code&amp;gt; file.&lt;br /&gt;
&lt;br /&gt;
 	nests project.ploceus.nests(project.nests_build)&lt;br /&gt;
&lt;br /&gt;
=== Updating Mod Metadata ===&lt;br /&gt;
&lt;br /&gt;
The last step is to update the mod metadata to make it your own.&lt;br /&gt;
&lt;br /&gt;
In the &amp;lt;code&amp;gt;gradle.properties&amp;lt;/code&amp;gt; file, update the value of the &amp;lt;code&amp;gt;archives_base_name&amp;lt;/code&amp;gt; field. This will be used to construct file name of the compiled mod jar.&lt;br /&gt;
&lt;br /&gt;
In the &amp;lt;code&amp;gt;src/main/resources/&amp;lt;/code&amp;gt; folder, update the &amp;lt;code&amp;gt;mod.json&amp;lt;/code&amp;gt; file. This step differs slightly depending on the mod loader you chose to use.&lt;br /&gt;
&lt;br /&gt;
==== Updating &amp;lt;code&amp;gt;fabric.mod.json&amp;lt;/code&amp;gt; ====&lt;br /&gt;
&lt;br /&gt;
In the &amp;lt;code&amp;gt;fabric.mod.json&amp;lt;/code&amp;gt; file, update the following fields.&lt;br /&gt;
* &amp;lt;code&amp;gt;id&amp;lt;/code&amp;gt;: the mod id. This ought to be a unique identifier for your mod. It should have only lowercase letters and underscores. Generally, you can use your mod&#039;s name, turned all lowercase, and replacing any spaces with underscores. For example, for a mod named &amp;lt;code&amp;gt;My Cool Mod&amp;lt;/code&amp;gt;, the mod id could be &amp;lt;code&amp;gt;my_cool_mod&amp;lt;/code&amp;gt;.&lt;br /&gt;
* &amp;lt;code&amp;gt;name&amp;lt;/code&amp;gt;: the name of your mod.&lt;br /&gt;
* &amp;lt;code&amp;gt;description&amp;lt;/code&amp;gt;: a short description of your mod, what it&#039;s for and/or what it does.&lt;br /&gt;
* &amp;lt;code&amp;gt;authors&amp;lt;/code&amp;gt;: a list of people who made the mod. Add your name(s) to this list.&lt;br /&gt;
&lt;br /&gt;
There are other fields in the &amp;lt;code&amp;gt;mod.json&amp;lt;/code&amp;gt; that may be relevant to your mod. Feel free to fill those in or remove them as you see fit.&lt;br /&gt;
&lt;br /&gt;
==== Updating &amp;lt;code&amp;gt;quilt.mod.json&amp;lt;/code&amp;gt; ====&lt;br /&gt;
&lt;br /&gt;
In the &amp;lt;code&amp;gt;quilt.mod.json&amp;lt;/code&amp;gt; file, update the following fields.&lt;br /&gt;
* &amp;lt;code&amp;gt;id&amp;lt;/code&amp;gt;: the mod id. This ought to be a unique identifier for your mod. It should have only lowercase letters and underscores. Generally, you can use your mod&#039;s name, turned all lowercase, and replacing any spaces with underscores. For example, for a mod named &amp;lt;code&amp;gt;My Cool Mod&amp;lt;/code&amp;gt;, the mod id could be &amp;lt;code&amp;gt;my_cool_mod&amp;lt;/code&amp;gt;.&lt;br /&gt;
* &amp;lt;code&amp;gt;name&amp;lt;/code&amp;gt;: the name of your mod.&lt;br /&gt;
* &amp;lt;code&amp;gt;description&amp;lt;/code&amp;gt;: a short description of your mod, what it&#039;s for and/or what it does.&lt;br /&gt;
* &amp;lt;code&amp;gt;contributors&amp;lt;/code&amp;gt;: a list of people who made the mod. Add your name(s) to this list.&lt;br /&gt;
&lt;br /&gt;
There are other fields in the &amp;lt;code&amp;gt;mod.json&amp;lt;/code&amp;gt; that may be relevant to your mod. Feel free to fill those in or remove them as you see fit.&lt;br /&gt;
&lt;br /&gt;
== Almost Done! ==&lt;br /&gt;
&lt;br /&gt;
With the mod template set up and configured, you are almost ready to start working on your mod. You may have to refresh your IDE for the changes to take effect. After that, it&#039;s time to write some code!&lt;br /&gt;
&lt;br /&gt;
[[Category:Mod Development]]&lt;/div&gt;</summary>
		<author><name>Space Walker</name></author>
	</entry>
	<entry>
		<id>https://wiki.ornithemc.net/index.php?title=Ornithe_Installer&amp;diff=33</id>
		<title>Ornithe Installer</title>
		<link rel="alternate" type="text/html" href="https://wiki.ornithemc.net/index.php?title=Ornithe_Installer&amp;diff=33"/>
		<updated>2025-07-29T13:08:34Z</updated>

		<summary type="html">&lt;p&gt;Space Walker: consistent capitalization of GUI&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;The Ornithe Installer serves a few purposes:&lt;br /&gt;
&lt;br /&gt;
* Installing a profile into the vanilla (official) launcher&lt;br /&gt;
* Generating an instance for MultiMC or MultiMC-based launchers&lt;br /&gt;
* Installing (&amp;amp; optionally starting) a server&lt;br /&gt;
&lt;br /&gt;
For this, two different UIs are offered:&lt;br /&gt;
&lt;br /&gt;
* an [https://crates.io/crates/egui egui]-based GUI&lt;br /&gt;
* an extensive CLI&lt;br /&gt;
&lt;br /&gt;
=== GUI ===&lt;br /&gt;
[[File:Screenshot 20250421 191013.png|alt=Screenshot of the installer GUI, with the &amp;quot;Client&amp;quot; page selected. All options are at their default values. No Minecraft version is selected, the loader is set to &amp;quot;Fabric Loader&amp;quot; with version 0.16.4. The install location is &amp;quot;~/.minecraft&amp;quot;, and &amp;quot;Generate Profile&amp;quot; is checked.|thumb|Installer GUI on the &amp;quot;Client&amp;quot; page]]&lt;br /&gt;
The GUI is a convenient way to quickly install ornithe on a desktop computer.&lt;br /&gt;
&lt;br /&gt;
All operations are done in a graphical way, the general behavior mimicking the old,&lt;br /&gt;
&lt;br /&gt;
java-based installers of Fabric &amp;amp; Quilt.&lt;br /&gt;
&lt;br /&gt;
=== Cli ===&lt;br /&gt;
The CLI is an easy-to-use and intuitive interface when a graphical environment is not available.&lt;br /&gt;
&lt;br /&gt;
The CLI features all options present in the GUI and additionally includes the ability to not only install,&lt;br /&gt;
&lt;br /&gt;
but also directly launch a modded server. This allows the installer to serve as a server bootstrap.&lt;br /&gt;
&lt;br /&gt;
Help: &lt;br /&gt;
 Usage: ornithe-installer-rs [COMMAND]&lt;br /&gt;
 &lt;br /&gt;
 Commands:&lt;br /&gt;
  client, --client&lt;br /&gt;
          Client installation for the official launcher&lt;br /&gt;
  mmc, --mmc&lt;br /&gt;
          Generate an instance for MultiMC/PrismLauncher [aliases: prism]&lt;br /&gt;
  server, --server&lt;br /&gt;
          Server installation&lt;br /&gt;
  game-versions, --list-game-versions&lt;br /&gt;
          List supported game versions&lt;br /&gt;
  loader-versions, --list-loader-versions&lt;br /&gt;
          List available loader versions&lt;br /&gt;
  help&lt;br /&gt;
          Print this message or the help of the given subcommand(s)&lt;br /&gt;
 &lt;br /&gt;
 Options:&lt;br /&gt;
  -h, --help     Print help&lt;br /&gt;
  -V, --version  Print version&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Client&#039;&#039;&#039; subcommand:&lt;br /&gt;
 Usage: ornithe-installer-rs {client|--client} [OPTIONS] --minecraft-version &amp;lt;VERSION&amp;gt;&lt;br /&gt;
 &lt;br /&gt;
 Options:&lt;br /&gt;
 -d, --dir &amp;lt;DIR&amp;gt;                    Installation directory [default: ~/.minecraft]&lt;br /&gt;
  -p, --generate-profile &amp;lt;VALUE&amp;gt;     Whether to generate a launch profile [default: true] [possible values: true, false]&lt;br /&gt;
  -m, --minecraft-version &amp;lt;VERSION&amp;gt;  Minecraft version to use&lt;br /&gt;
      --loader-type &amp;lt;TYPE&amp;gt;           Loader type to use [default: fabric] [possible values: fabric, quilt]&lt;br /&gt;
      --loader-version &amp;lt;VERSION&amp;gt;     Loader version to use [default: latest]&lt;br /&gt;
  -h, --help                         Print help&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Mmc&#039;&#039;&#039; subcommand:&lt;br /&gt;
&lt;br /&gt;
 Usage: ornithe-installer-rs {mmc|--mmc} [OPTIONS] --minecraft-version &amp;lt;VERSION&amp;gt;&lt;br /&gt;
 &lt;br /&gt;
 Options:&lt;br /&gt;
  -d, --dir &amp;lt;DIR&amp;gt;                    Output directory [default: .]&lt;br /&gt;
  -z, --generate-zip &amp;lt;VALUE&amp;gt;         Whether to generate an instance zip instead of installing into the directory [default: true] [possible values: true, false]&lt;br /&gt;
  -c, --copy-profile-path &amp;lt;VALUE&amp;gt;    Whether to copy the path of the generated profile to the clipboard [default: false] [possible values: true, false]&lt;br /&gt;
  -m, --minecraft-version &amp;lt;VERSION&amp;gt;  Minecraft version to use&lt;br /&gt;
      --loader-type &amp;lt;TYPE&amp;gt;           Loader type to use [default: fabric] [possible values: fabric, quilt]&lt;br /&gt;
      --loader-version &amp;lt;VERSION&amp;gt;     Loader version to use [default: latest]&lt;br /&gt;
  -h, --help                         Print help&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Server&#039;&#039;&#039; subcommand:&lt;br /&gt;
&lt;br /&gt;
 Usage: ornithe-installer-rs {server|--server} [OPTIONS] --minecraft-version &amp;lt;VERSION&amp;gt; [COMMAND]&lt;br /&gt;
 &lt;br /&gt;
 Commands:&lt;br /&gt;
  run   Install and run the server&lt;br /&gt;
  help  Print this message or the help of the given subcommand(s)&lt;br /&gt;
 &lt;br /&gt;
 Options:&lt;br /&gt;
  -d, --dir &amp;lt;DIR&amp;gt;                    Installation directory [default: ./server]&lt;br /&gt;
      --download-minecraft           Whether to download the minecraft server jar&lt;br /&gt;
  -m, --minecraft-version &amp;lt;VERSION&amp;gt;  Minecraft version to use&lt;br /&gt;
      --loader-type &amp;lt;TYPE&amp;gt;           Loader type to use [default: fabric] [possible values: fabric, quilt]&lt;br /&gt;
      --loader-version &amp;lt;VERSION&amp;gt;     Loader version to use [default: latest]&lt;br /&gt;
  -h, --help                         Print help&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Run&#039;&#039;&#039; subcommand (only in combination with &#039;&#039;&#039;Server&#039;&#039;&#039;):&lt;br /&gt;
&lt;br /&gt;
 Usage: ornithe-installer-rs server --minecraft-version &amp;lt;VERSION&amp;gt; run [OPTIONS]&lt;br /&gt;
 &lt;br /&gt;
 Options:&lt;br /&gt;
      --args &amp;lt;ARGS&amp;gt;  Java arguments to pass to the server (before the server jar)&lt;br /&gt;
      --java &amp;lt;PATH&amp;gt;  The java binary to use to run the server&lt;br /&gt;
  -h, --help         Print help&lt;br /&gt;
&lt;br /&gt;
=== Legacy Java installer ===&lt;br /&gt;
&lt;br /&gt;
Ornithe also still offers a legacy java-based installer. Forked from the Quilt installer, it is extended with ornithe-specific features such as loader type selection and MultiMC instance generation.&lt;br /&gt;
[[File:Ornithe Installer (Java, Client tab).png|thumb|alt=The older ornithe installer, on the client tab. All options are set to their default values: Minecraft version 1.14.4, Launcher type official, Loader type fabric, Loader version 0.16.4, Install location ~/.minecraft. The &amp;quot;Generate profile&amp;quot; checkbox is checked.|The older ornithe installer, on the client tab.]]&lt;/div&gt;</summary>
		<author><name>Space Walker</name></author>
	</entry>
	<entry>
		<id>https://wiki.ornithemc.net/index.php?title=Ornithe_Installer&amp;diff=32</id>
		<title>Ornithe Installer</title>
		<link rel="alternate" type="text/html" href="https://wiki.ornithemc.net/index.php?title=Ornithe_Installer&amp;diff=32"/>
		<updated>2025-07-29T13:07:35Z</updated>

		<summary type="html">&lt;p&gt;Space Walker: fix typo&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;The Ornithe Installer serves a few purposes:&lt;br /&gt;
&lt;br /&gt;
* Installing a profile into the vanilla (official) launcher&lt;br /&gt;
* Generating an instance for MultiMC or MultiMC-based launchers&lt;br /&gt;
* Installing (&amp;amp; optionally starting) a server&lt;br /&gt;
&lt;br /&gt;
For this, two different UIs are offered:&lt;br /&gt;
&lt;br /&gt;
* an [https://crates.io/crates/egui egui]-based GUI&lt;br /&gt;
* an extensive CLI&lt;br /&gt;
&lt;br /&gt;
=== Gui ===&lt;br /&gt;
[[File:Screenshot 20250421 191013.png|alt=Screenshot of the installer GUI, with the &amp;quot;Client&amp;quot; page selected. All options are at their default values. No Minecraft version is selected, the loader is set to &amp;quot;Fabric Loader&amp;quot; with version 0.16.4. The install location is &amp;quot;~/.minecraft&amp;quot;, and &amp;quot;Generate Profile&amp;quot; is checked.|thumb|Installer GUI on the &amp;quot;Client&amp;quot; page]]&lt;br /&gt;
The GUI is a convenient way to quickly install ornithe on a desktop computer.&lt;br /&gt;
&lt;br /&gt;
All operations are done in a graphical way, the general behavior mimicking the old,&lt;br /&gt;
&lt;br /&gt;
java-based installers of Fabric &amp;amp; Quilt.&lt;br /&gt;
&lt;br /&gt;
=== Cli ===&lt;br /&gt;
The CLI is an easy-to-use and intuitive interface when a graphical environment is not available.&lt;br /&gt;
&lt;br /&gt;
The CLI features all options present in the GUI and additionally includes the ability to not only install,&lt;br /&gt;
&lt;br /&gt;
but also directly launch a modded server. This allows the installer to serve as a server bootstrap.&lt;br /&gt;
&lt;br /&gt;
Help: &lt;br /&gt;
 Usage: ornithe-installer-rs [COMMAND]&lt;br /&gt;
 &lt;br /&gt;
 Commands:&lt;br /&gt;
  client, --client&lt;br /&gt;
          Client installation for the official launcher&lt;br /&gt;
  mmc, --mmc&lt;br /&gt;
          Generate an instance for MultiMC/PrismLauncher [aliases: prism]&lt;br /&gt;
  server, --server&lt;br /&gt;
          Server installation&lt;br /&gt;
  game-versions, --list-game-versions&lt;br /&gt;
          List supported game versions&lt;br /&gt;
  loader-versions, --list-loader-versions&lt;br /&gt;
          List available loader versions&lt;br /&gt;
  help&lt;br /&gt;
          Print this message or the help of the given subcommand(s)&lt;br /&gt;
 &lt;br /&gt;
 Options:&lt;br /&gt;
  -h, --help     Print help&lt;br /&gt;
  -V, --version  Print version&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Client&#039;&#039;&#039; subcommand:&lt;br /&gt;
 Usage: ornithe-installer-rs {client|--client} [OPTIONS] --minecraft-version &amp;lt;VERSION&amp;gt;&lt;br /&gt;
 &lt;br /&gt;
 Options:&lt;br /&gt;
 -d, --dir &amp;lt;DIR&amp;gt;                    Installation directory [default: ~/.minecraft]&lt;br /&gt;
  -p, --generate-profile &amp;lt;VALUE&amp;gt;     Whether to generate a launch profile [default: true] [possible values: true, false]&lt;br /&gt;
  -m, --minecraft-version &amp;lt;VERSION&amp;gt;  Minecraft version to use&lt;br /&gt;
      --loader-type &amp;lt;TYPE&amp;gt;           Loader type to use [default: fabric] [possible values: fabric, quilt]&lt;br /&gt;
      --loader-version &amp;lt;VERSION&amp;gt;     Loader version to use [default: latest]&lt;br /&gt;
  -h, --help                         Print help&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Mmc&#039;&#039;&#039; subcommand:&lt;br /&gt;
&lt;br /&gt;
 Usage: ornithe-installer-rs {mmc|--mmc} [OPTIONS] --minecraft-version &amp;lt;VERSION&amp;gt;&lt;br /&gt;
 &lt;br /&gt;
 Options:&lt;br /&gt;
  -d, --dir &amp;lt;DIR&amp;gt;                    Output directory [default: .]&lt;br /&gt;
  -z, --generate-zip &amp;lt;VALUE&amp;gt;         Whether to generate an instance zip instead of installing into the directory [default: true] [possible values: true, false]&lt;br /&gt;
  -c, --copy-profile-path &amp;lt;VALUE&amp;gt;    Whether to copy the path of the generated profile to the clipboard [default: false] [possible values: true, false]&lt;br /&gt;
  -m, --minecraft-version &amp;lt;VERSION&amp;gt;  Minecraft version to use&lt;br /&gt;
      --loader-type &amp;lt;TYPE&amp;gt;           Loader type to use [default: fabric] [possible values: fabric, quilt]&lt;br /&gt;
      --loader-version &amp;lt;VERSION&amp;gt;     Loader version to use [default: latest]&lt;br /&gt;
  -h, --help                         Print help&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Server&#039;&#039;&#039; subcommand:&lt;br /&gt;
&lt;br /&gt;
 Usage: ornithe-installer-rs {server|--server} [OPTIONS] --minecraft-version &amp;lt;VERSION&amp;gt; [COMMAND]&lt;br /&gt;
 &lt;br /&gt;
 Commands:&lt;br /&gt;
  run   Install and run the server&lt;br /&gt;
  help  Print this message or the help of the given subcommand(s)&lt;br /&gt;
 &lt;br /&gt;
 Options:&lt;br /&gt;
  -d, --dir &amp;lt;DIR&amp;gt;                    Installation directory [default: ./server]&lt;br /&gt;
      --download-minecraft           Whether to download the minecraft server jar&lt;br /&gt;
  -m, --minecraft-version &amp;lt;VERSION&amp;gt;  Minecraft version to use&lt;br /&gt;
      --loader-type &amp;lt;TYPE&amp;gt;           Loader type to use [default: fabric] [possible values: fabric, quilt]&lt;br /&gt;
      --loader-version &amp;lt;VERSION&amp;gt;     Loader version to use [default: latest]&lt;br /&gt;
  -h, --help                         Print help&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Run&#039;&#039;&#039; subcommand (only in combination with &#039;&#039;&#039;Server&#039;&#039;&#039;):&lt;br /&gt;
&lt;br /&gt;
 Usage: ornithe-installer-rs server --minecraft-version &amp;lt;VERSION&amp;gt; run [OPTIONS]&lt;br /&gt;
 &lt;br /&gt;
 Options:&lt;br /&gt;
      --args &amp;lt;ARGS&amp;gt;  Java arguments to pass to the server (before the server jar)&lt;br /&gt;
      --java &amp;lt;PATH&amp;gt;  The java binary to use to run the server&lt;br /&gt;
  -h, --help         Print help&lt;br /&gt;
&lt;br /&gt;
=== Legacy Java installer ===&lt;br /&gt;
&lt;br /&gt;
Ornithe also still offers a legacy java-based installer. Forked from the Quilt installer, it is extended with ornithe-specific features such as loader type selection and MultiMC instance generation.&lt;br /&gt;
[[File:Ornithe Installer (Java, Client tab).png|thumb|alt=The older ornithe installer, on the client tab. All options are set to their default values: Minecraft version 1.14.4, Launcher type official, Loader type fabric, Loader version 0.16.4, Install location ~/.minecraft. The &amp;quot;Generate profile&amp;quot; checkbox is checked.|The older ornithe installer, on the client tab.]]&lt;/div&gt;</summary>
		<author><name>Space Walker</name></author>
	</entry>
	<entry>
		<id>https://wiki.ornithemc.net/index.php?title=Ploceus&amp;diff=31</id>
		<title>Ploceus</title>
		<link rel="alternate" type="text/html" href="https://wiki.ornithemc.net/index.php?title=Ploceus&amp;diff=31"/>
		<updated>2025-07-29T13:03:05Z</updated>

		<summary type="html">&lt;p&gt;Space Walker: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Ploceus is a [https://gradle.org/ Gradle] plugin. It is an extension to [https://wiki.fabricmc.net/documentation:fabric_loom Loom] that configures projects for Orntihe mod development.&lt;br /&gt;
&lt;br /&gt;
== Features ==&lt;br /&gt;
&lt;br /&gt;
==== Basic functionality ====&lt;br /&gt;
* Expanding the Minecraft version support with a custom versions manifest.&lt;br /&gt;
* Setting up Loom&#039;s intermediate mappings provider to use Ornithe&#039;s [[Calamus Intermediary|Calamus]] intermediary.&lt;br /&gt;
* Upgrading Minecraft libraries.&lt;br /&gt;
* Adding additional Minecraft libraries.&lt;br /&gt;
&lt;br /&gt;
==== Additional features ====&lt;br /&gt;
* Depending on [[Ornithe Standard Libraries|OSL]].&lt;br /&gt;
* Using [[Feather Mappings|Feather]] mappings.&lt;br /&gt;
* Applying [[Nests|inner class patches]].&lt;br /&gt;
* Applying [[Sparrow|generic type signature patches]].&lt;br /&gt;
* Applying [[Raven|throws clause patches]].&lt;br /&gt;
* Applying [[Condor|LVT patches]].&lt;br /&gt;
* Applying [[Preen|miscellaneous de-obfuscation patches]].&lt;br /&gt;
&lt;br /&gt;
== Using Ploceus ==&lt;br /&gt;
The easiest option to make use of Ploceus is to start with [https://github.com/OrnitheMC/ornithe-mod-template Ornithe&#039;s Mod Template].&lt;br /&gt;
&lt;br /&gt;
Should you need to add it to an already existing project these steps should cover your needs:&lt;br /&gt;
&lt;br /&gt;
==== Adding Ornithe&#039;s maven repository for plugin resolution ====&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;settings.gradle&amp;lt;/code&amp;gt;&lt;br /&gt;
 pluginManagement {&lt;br /&gt;
     repositories {&lt;br /&gt;
         /* ... (Other repositories) */&lt;br /&gt;
         maven { url = &amp;quot;https://maven.ornithemc.net/releases&amp;quot; }&lt;br /&gt;
         maven { url = &amp;quot;https://maven.orntithemc.net/snapshots&amp;quot;&lt;br /&gt;
     }&lt;br /&gt;
 }&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;settings.gradle.kts&amp;lt;/code&amp;gt;&lt;br /&gt;
 pluginManagement {&lt;br /&gt;
     repositories {&lt;br /&gt;
         /* ... (Other repositories) */&lt;br /&gt;
         maven(&amp;quot;https://maven.ornithemc.net/releases&amp;quot;)&lt;br /&gt;
         maven(&amp;quot;https://maven.orntithemc.net/snapshots&amp;quot;) &lt;br /&gt;
     }&lt;br /&gt;
 }&lt;br /&gt;
&lt;br /&gt;
==== Apply the plugin ====&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;build.gradle&amp;lt;/code&amp;gt;&lt;br /&gt;
 plugins {&lt;br /&gt;
     /* ... (Other plugins) */&lt;br /&gt;
     id &amp;quot;ploceus&amp;quot; version &amp;quot;&amp;lt;version&amp;gt;&amp;quot;&lt;br /&gt;
 }&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;build.gradle.kts&amp;lt;/code&amp;gt;&lt;br /&gt;
 plugins {&lt;br /&gt;
     /* ... (Other plugins) */&lt;br /&gt;
     id(&amp;quot;ploceus&amp;quot;) version &amp;quot;&amp;lt;version&amp;gt;&amp;quot;&lt;br /&gt;
 }&lt;br /&gt;
&lt;br /&gt;
===== Note =====&lt;br /&gt;
&lt;br /&gt;
The major and minor Ploceus version must match the major and minor Loom version! For example, if the Loom version is &amp;lt;code&amp;gt;1.10-SNAPSHOT&amp;lt;/code&amp;gt;, the Ploceus version must be &amp;lt;code&amp;gt;1.10-SNAPSHOT&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
== Configuring Ploceus ==&lt;br /&gt;
&lt;br /&gt;
The latest versions for the relevant dependencies can be found on the [https://ornithemc.net/develop develop] page on the website.&lt;br /&gt;
&lt;br /&gt;
==== Split development environments ====&lt;br /&gt;
&lt;br /&gt;
How you configure Ploceus depends on the Minecraft version you are developing for. Merged client-server development environments are not supported for Minecraft versions before 1.3. For these versions, you must configure Loom and Ploceus for a split development environment. You may use a sub-project structure (see the &amp;lt;code&amp;gt;fabric/split&amp;lt;/code&amp;gt; branch on the Ornithe Mod Template) in order to develop both a client mod and a server mod in one project, or choose to develop a client-only or server-only mod.&lt;br /&gt;
&lt;br /&gt;
In either case, you must configure Loom and Ploceus for a one-side-only development environment.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;build.gradle&amp;lt;/code&amp;gt;&lt;br /&gt;
 loom {&lt;br /&gt;
     ...&lt;br /&gt;
     clientOnlyMinecraftJar() // for a client-side-only (sub)project&lt;br /&gt;
 //  serverOnlyMinecraftJar() // for a server-side-only (sub)project&lt;br /&gt;
 }&lt;br /&gt;
 &lt;br /&gt;
 ploceus {&lt;br /&gt;
     ...&lt;br /&gt;
     clientOnlyMappings() // for a client-side-only (sub)project&lt;br /&gt;
 //  serverOnlyMappings() // for a server-side-only (sub)project&lt;br /&gt;
 }&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;build.gradle.kts&amp;lt;/code&amp;gt;&lt;br /&gt;
 loom {&lt;br /&gt;
     ...&lt;br /&gt;
     clientOnlyMinecraftJar() // for a client-side-only (sub)project&lt;br /&gt;
 //  serverOnlyMinecraftJar() // for a server-side-only (sub)project&lt;br /&gt;
 }&lt;br /&gt;
 &lt;br /&gt;
 ploceus {&lt;br /&gt;
     ...&lt;br /&gt;
     clientOnlyMappings() // for a client-side-only (sub)project&lt;br /&gt;
 //  serverOnlyMappings() // for a server-side-only (sub)project&lt;br /&gt;
 }&lt;br /&gt;
&lt;br /&gt;
==== Mappings ====&lt;br /&gt;
&lt;br /&gt;
It is recommended to use [[Feather Mappings|Feather]] mappings for your mod development environment, though the use of MCP mappings is also supported for a handful of Minecraft versions.&lt;br /&gt;
&lt;br /&gt;
To use Feather mappings, add the &amp;lt;code&amp;gt;mappings&amp;lt;/code&amp;gt; dependency as follows.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;build.gradle&amp;lt;/code&amp;gt;&lt;br /&gt;
 dependencies {&lt;br /&gt;
     ...&lt;br /&gt;
     mappings ploceus.featherMappings(&amp;lt;Feather build&amp;gt;)&lt;br /&gt;
 }&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;build.gradle.kts&amp;lt;/code&amp;gt;&lt;br /&gt;
 dependencies {&lt;br /&gt;
     ...&lt;br /&gt;
     mappings(ploceus.featherMappings(&amp;lt;Feather build&amp;gt;))&lt;br /&gt;
 }&lt;br /&gt;
&lt;br /&gt;
To use MCP mappings, add the &amp;lt;code&amp;gt;mappings&amp;lt;/code&amp;gt; dependency as follows.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;build.gradle&amp;lt;/code&amp;gt;&lt;br /&gt;
 dependencies {&lt;br /&gt;
     ...&lt;br /&gt;
     mappings ploceus.mcpMappings(&amp;lt;MCP channel&amp;gt;, &amp;lt;Minecraft version&amp;gt;, &amp;lt;MCP build&amp;gt;)&lt;br /&gt;
 }&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;build.gradle.kts&amp;lt;/code&amp;gt;&lt;br /&gt;
 dependencies {&lt;br /&gt;
     ...&lt;br /&gt;
     mappings(ploceus.mcpMappings(&amp;lt;MCP channel&amp;gt;, &amp;lt;Minecraft version&amp;gt;, &amp;lt;MCP build&amp;gt;))&lt;br /&gt;
 }&lt;br /&gt;
&lt;br /&gt;
==== OSL ====&lt;br /&gt;
&lt;br /&gt;
[[Ornithe Standard Libraries|OSL]] provides hooks and events for modding with Ornithe. To use OSL, add the dependency as follows.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;build.gradle&amp;lt;/code&amp;gt;&lt;br /&gt;
 dependencies {&lt;br /&gt;
     ...&lt;br /&gt;
     ploceus.dependOsl(&amp;lt;OSL version&amp;gt;)&lt;br /&gt;
 //  ploceus.dependOsl(&amp;lt;configuration&amp;gt;, &amp;lt;OSL version&amp;gt;) // default configuration is modImplementation&lt;br /&gt;
 }&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;build.gradle.kts&amp;lt;/code&amp;gt;&lt;br /&gt;
 dependencies {&lt;br /&gt;
     ...&lt;br /&gt;
     ploceus.dependOsl(&amp;lt;OSL version&amp;gt;)&lt;br /&gt;
 //  ploceus.dependOsl(&amp;lt;configuration&amp;gt;, &amp;lt;OSL version&amp;gt;) // default configuration is modImplementation&lt;br /&gt;
 }&lt;br /&gt;
&lt;br /&gt;
You may also depend on individual OSL modules.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;build.gradle&amp;lt;/code&amp;gt;&lt;br /&gt;
 dependencies {&lt;br /&gt;
     ...&lt;br /&gt;
     ploceus.dependOslModule(&amp;lt;OSL version&amp;gt;, &amp;lt;module name&amp;gt;)&lt;br /&gt;
 //  ploceus.dependOslModule(&amp;lt;configuration&amp;gt;, &amp;lt;OSL version&amp;gt;) // default configuration is modImplementation&lt;br /&gt;
 }&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;build.gradle.kts&amp;lt;/code&amp;gt;&lt;br /&gt;
 dependencies {&lt;br /&gt;
     ...&lt;br /&gt;
     ploceus.dependOslModule(&amp;lt;OSL version&amp;gt;, &amp;lt;module name&amp;gt;)&lt;br /&gt;
 //  ploceus.dependOslModule(&amp;lt;configuration&amp;gt;, &amp;lt;OSL version&amp;gt;, &amp;lt;module name&amp;gt;) // default configuration is modImplementation&lt;br /&gt;
 }&lt;br /&gt;
&lt;br /&gt;
==== Nests ====&lt;br /&gt;
&lt;br /&gt;
[[Nests|Nests]] are Ornithe&#039;s inner classes patches. To apply these patches, add the &amp;lt;code&amp;gt;nests&amp;lt;/code&amp;gt; dependency as follows.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;build.gradle&amp;lt;/code&amp;gt;&lt;br /&gt;
 dependencies {&lt;br /&gt;
     ...&lt;br /&gt;
     nests ploceus.nests(&amp;lt;Nests build&amp;gt;)&lt;br /&gt;
 }&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;build.gradle.kts&amp;lt;/code&amp;gt;&lt;br /&gt;
 dependencies {&lt;br /&gt;
     ...&lt;br /&gt;
     nests(ploceus.nests(&amp;lt;Nests build&amp;gt;))&lt;br /&gt;
 }&lt;br /&gt;
&lt;br /&gt;
==== Sparrow ====&lt;br /&gt;
&lt;br /&gt;
[[Sparrow|Sparrow]] is Ornithe&#039;s generic type signatures patch. To apply these patches, add the &amp;lt;code&amp;gt;signatures&amp;lt;/code&amp;gt; dependency as follows.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;build.gradle&amp;lt;/code&amp;gt;&lt;br /&gt;
 dependencies {&lt;br /&gt;
     ...&lt;br /&gt;
     signatures ploceus.sparrow(&amp;lt;Sparrow build&amp;gt;)&lt;br /&gt;
 }&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;build.gradle.kts&amp;lt;/code&amp;gt;&lt;br /&gt;
 dependencies {&lt;br /&gt;
     ...&lt;br /&gt;
     signatures(ploceus.sparrow(&amp;lt;Sparrow build&amp;gt;))&lt;br /&gt;
 }&lt;br /&gt;
&lt;br /&gt;
==== Raven ====&lt;br /&gt;
&lt;br /&gt;
[[Raven|Raven]] is Ornithe&#039;s throws clauses patch. To apply these patches, add the &amp;lt;code&amp;gt;exceptions&amp;lt;/code&amp;gt; dependency as follows.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;build.gradle&amp;lt;/code&amp;gt;&lt;br /&gt;
 dependencies {&lt;br /&gt;
     ...&lt;br /&gt;
     exceptions ploceus.raven(&amp;lt;Raven build&amp;gt;)&lt;br /&gt;
 }&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;build.gradle.kts&amp;lt;/code&amp;gt;&lt;br /&gt;
 dependencies {&lt;br /&gt;
     ...&lt;br /&gt;
     exceptions(ploceus.raven(&amp;lt;Raven build&amp;gt;))&lt;br /&gt;
 }&lt;br /&gt;
&lt;br /&gt;
[[Category:Mod Development]]&lt;/div&gt;</summary>
		<author><name>Space Walker</name></author>
	</entry>
	<entry>
		<id>https://wiki.ornithemc.net/index.php?title=Ploceus&amp;diff=30</id>
		<title>Ploceus</title>
		<link rel="alternate" type="text/html" href="https://wiki.ornithemc.net/index.php?title=Ploceus&amp;diff=30"/>
		<updated>2025-07-29T12:34:36Z</updated>

		<summary type="html">&lt;p&gt;Space Walker: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;= Ploceus =&lt;br /&gt;
&lt;br /&gt;
Ploceus is a [https://gradle.org/ Gradle] plugin. It is an extension to [https://wiki.fabricmc.net/documentation:fabric_loom Loom] that configures projects for Orntihe mod development.&lt;br /&gt;
&lt;br /&gt;
== Features ==&lt;br /&gt;
&lt;br /&gt;
==== Basic functionality ====&lt;br /&gt;
* Expanding the Minecraft version support with a custom versions manifest.&lt;br /&gt;
* Setting up Loom&#039;s intermediate mappings provider to use Ornithe&#039;s [[Calamus Intermediary|Calamus]] intermediary.&lt;br /&gt;
* Upgrading Minecraft libraries.&lt;br /&gt;
* Adding additional Minecraft libraries.&lt;br /&gt;
&lt;br /&gt;
==== Additional features ====&lt;br /&gt;
* Depending on [[Ornithe Standard Libraries|OSL]].&lt;br /&gt;
* Using [[Feather Mappings|Feather]] mappings.&lt;br /&gt;
* Applying [[Nests|inner class patches]].&lt;br /&gt;
* Applying [[Sparrow|generic type signature patches]].&lt;br /&gt;
* Applying [[Raven|throws clause patches]].&lt;br /&gt;
* Applying [[Condor|LVT patches]].&lt;br /&gt;
* Applying [[Preen|miscellaneous de-obfuscation patches]].&lt;br /&gt;
&lt;br /&gt;
== Using Ploceus ==&lt;br /&gt;
The easiest option to make use of Ploceus is to start with [https://github.com/OrnitheMC/ornithe-mod-template Ornithe&#039;s Mod Template].&lt;br /&gt;
&lt;br /&gt;
Should you need to add it to an already existing project these steps should cover your needs:&lt;br /&gt;
&lt;br /&gt;
==== Adding Ornithe&#039;s maven repository for plugin resolution ====&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;settings.gradle&amp;lt;/code&amp;gt;&lt;br /&gt;
 pluginManagement {&lt;br /&gt;
     repositories {&lt;br /&gt;
         /* ... (Other repositories) */&lt;br /&gt;
         maven { url = &amp;quot;https://maven.ornithemc.net/releases&amp;quot; }&lt;br /&gt;
         maven { url = &amp;quot;https://maven.orntithemc.net/snapshots&amp;quot;&lt;br /&gt;
     }&lt;br /&gt;
 }&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;settings.gradle.kts&amp;lt;/code&amp;gt;&lt;br /&gt;
 pluginManagement {&lt;br /&gt;
     repositories {&lt;br /&gt;
         /* ... (Other repositories) */&lt;br /&gt;
         maven(&amp;quot;https://maven.ornithemc.net/releases&amp;quot;)&lt;br /&gt;
         maven(&amp;quot;https://maven.orntithemc.net/snapshots&amp;quot;) &lt;br /&gt;
     }&lt;br /&gt;
 }&lt;br /&gt;
&lt;br /&gt;
==== Apply the plugin ====&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;build.gradle&amp;lt;/code&amp;gt;&lt;br /&gt;
 plugins {&lt;br /&gt;
     /* ... (Other plugins) */&lt;br /&gt;
     id &amp;quot;ploceus&amp;quot; version &amp;quot;&amp;lt;version&amp;gt;&amp;quot;&lt;br /&gt;
 }&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;build.gradle.kts&amp;lt;/code&amp;gt;&lt;br /&gt;
 plugins {&lt;br /&gt;
     /* ... (Other plugins) */&lt;br /&gt;
     id(&amp;quot;ploceus&amp;quot;) version &amp;quot;&amp;lt;version&amp;gt;&amp;quot;&lt;br /&gt;
 }&lt;br /&gt;
&lt;br /&gt;
===== Note =====&lt;br /&gt;
&lt;br /&gt;
The major and minor Ploceus version must match the major and minor Loom version! For example, if the Loom version is &amp;lt;code&amp;gt;1.10-SNAPSHOT&amp;lt;/code&amp;gt;, the Ploceus version must be &amp;lt;code&amp;gt;1.10-SNAPSHOT&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
== Configuring Ploceus ==&lt;br /&gt;
&lt;br /&gt;
The latest versions for the relevant dependencies can be found on the [https://ornithemc.net/develop develop] page on the website.&lt;br /&gt;
&lt;br /&gt;
==== Split development environments ====&lt;br /&gt;
&lt;br /&gt;
How you configure Ploceus depends on the Minecraft version you are developing for. Merged client-server development environments are not supported for Minecraft versions before 1.3. For these versions, you must configure Loom and Ploceus for a split development environment. You may use a sub-project structure (see the &amp;lt;code&amp;gt;fabric/split&amp;lt;/code&amp;gt; branch on the Ornithe Mod Template) in order to develop both a client mod and a server mod in one project, or choose to develop a client-only or server-only mod.&lt;br /&gt;
&lt;br /&gt;
In either case, you must configure Loom and Ploceus for a one-side-only development environment.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;build.gradle&amp;lt;/code&amp;gt;&lt;br /&gt;
 loom {&lt;br /&gt;
     ...&lt;br /&gt;
     clientOnlyMinecraftJar() // for a client-side-only (sub)project&lt;br /&gt;
 //  serverOnlyMinecraftJar() // for a server-side-only (sub)project&lt;br /&gt;
 }&lt;br /&gt;
 &lt;br /&gt;
 ploceus {&lt;br /&gt;
     ...&lt;br /&gt;
     clientOnlyMappings() // for a client-side-only (sub)project&lt;br /&gt;
 //  serverOnlyMappings() // for a server-side-only (sub)project&lt;br /&gt;
 }&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;build.gradle.kts&amp;lt;/code&amp;gt;&lt;br /&gt;
 loom {&lt;br /&gt;
     ...&lt;br /&gt;
     clientOnlyMinecraftJar() // for a client-side-only (sub)project&lt;br /&gt;
 //  serverOnlyMinecraftJar() // for a server-side-only (sub)project&lt;br /&gt;
 }&lt;br /&gt;
 &lt;br /&gt;
 ploceus {&lt;br /&gt;
     ...&lt;br /&gt;
     clientOnlyMappings() // for a client-side-only (sub)project&lt;br /&gt;
 //  serverOnlyMappings() // for a server-side-only (sub)project&lt;br /&gt;
 }&lt;br /&gt;
&lt;br /&gt;
==== Mappings ====&lt;br /&gt;
&lt;br /&gt;
It is recommended to use [[Feather Mappings|Feather]] mappings for your mod development environment, though the use of MCP mappings is also supported for a handful of Minecraft versions.&lt;br /&gt;
&lt;br /&gt;
To use Feather mappings, add the &amp;lt;code&amp;gt;mappings&amp;lt;/code&amp;gt; dependency as follows.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;build.gradle&amp;lt;/code&amp;gt;&lt;br /&gt;
 dependencies {&lt;br /&gt;
     ...&lt;br /&gt;
     mappings ploceus.featherMappings(&amp;lt;Feather build&amp;gt;)&lt;br /&gt;
 }&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;build.gradle.kts&amp;lt;/code&amp;gt;&lt;br /&gt;
 dependencies {&lt;br /&gt;
     ...&lt;br /&gt;
     mappings(ploceus.featherMappings(&amp;lt;Feather build&amp;gt;))&lt;br /&gt;
 }&lt;br /&gt;
&lt;br /&gt;
To use MCP mappings, add the &amp;lt;code&amp;gt;mappings&amp;lt;/code&amp;gt; dependency as follows.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;build.gradle&amp;lt;/code&amp;gt;&lt;br /&gt;
 dependencies {&lt;br /&gt;
     ...&lt;br /&gt;
     mappings ploceus.mcpMappings(&amp;lt;MCP channel&amp;gt;, &amp;lt;Minecraft version&amp;gt;, &amp;lt;MCP build&amp;gt;)&lt;br /&gt;
 }&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;build.gradle.kts&amp;lt;/code&amp;gt;&lt;br /&gt;
 dependencies {&lt;br /&gt;
     ...&lt;br /&gt;
     mappings(ploceus.mcpMappings(&amp;lt;MCP channel&amp;gt;, &amp;lt;Minecraft version&amp;gt;, &amp;lt;MCP build&amp;gt;))&lt;br /&gt;
 }&lt;br /&gt;
&lt;br /&gt;
==== OSL ====&lt;br /&gt;
&lt;br /&gt;
[[Ornithe Standard Libraries|OSL]] provides hooks and events for modding with Ornithe. To use OSL, add the dependency as follows.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;build.gradle&amp;lt;/code&amp;gt;&lt;br /&gt;
 dependencies {&lt;br /&gt;
     ...&lt;br /&gt;
     ploceus.dependOsl(&amp;lt;OSL version&amp;gt;)&lt;br /&gt;
 //  ploceus.dependOsl(&amp;lt;configuration&amp;gt;, &amp;lt;OSL version&amp;gt;) // default configuration is modImplementation&lt;br /&gt;
 }&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;build.gradle.kts&amp;lt;/code&amp;gt;&lt;br /&gt;
 dependencies {&lt;br /&gt;
     ...&lt;br /&gt;
     ploceus.dependOsl(&amp;lt;OSL version&amp;gt;)&lt;br /&gt;
 //  ploceus.dependOsl(&amp;lt;configuration&amp;gt;, &amp;lt;OSL version&amp;gt;) // default configuration is modImplementation&lt;br /&gt;
 }&lt;br /&gt;
&lt;br /&gt;
You may also depend on individual OSL modules.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;build.gradle&amp;lt;/code&amp;gt;&lt;br /&gt;
 dependencies {&lt;br /&gt;
     ...&lt;br /&gt;
     ploceus.dependOslModule(&amp;lt;OSL version&amp;gt;, &amp;lt;module name&amp;gt;)&lt;br /&gt;
 //  ploceus.dependOslModule(&amp;lt;configuration&amp;gt;, &amp;lt;OSL version&amp;gt;) // default configuration is modImplementation&lt;br /&gt;
 }&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;build.gradle.kts&amp;lt;/code&amp;gt;&lt;br /&gt;
 dependencies {&lt;br /&gt;
     ...&lt;br /&gt;
     ploceus.dependOslModule(&amp;lt;OSL version&amp;gt;, &amp;lt;module name&amp;gt;)&lt;br /&gt;
 //  ploceus.dependOslModule(&amp;lt;configuration&amp;gt;, &amp;lt;OSL version&amp;gt;, &amp;lt;module name&amp;gt;) // default configuration is modImplementation&lt;br /&gt;
 }&lt;br /&gt;
&lt;br /&gt;
==== Nests ====&lt;br /&gt;
&lt;br /&gt;
[[Nests|Nests]] are Ornithe&#039;s inner classes patches. To apply these patches, add the &amp;lt;code&amp;gt;nests&amp;lt;/code&amp;gt; dependency as follows.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;build.gradle&amp;lt;/code&amp;gt;&lt;br /&gt;
 dependencies {&lt;br /&gt;
     ...&lt;br /&gt;
     nests ploceus.nests(&amp;lt;Nests build&amp;gt;)&lt;br /&gt;
 }&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;build.gradle.kts&amp;lt;/code&amp;gt;&lt;br /&gt;
 dependencies {&lt;br /&gt;
     ...&lt;br /&gt;
     nests(ploceus.nests(&amp;lt;Nests build&amp;gt;))&lt;br /&gt;
 }&lt;br /&gt;
&lt;br /&gt;
==== Sparrow ====&lt;br /&gt;
&lt;br /&gt;
[[Sparrow|Sparrow]] is Ornithe&#039;s generic type signatures patch. To apply these patches, add the &amp;lt;code&amp;gt;signatures&amp;lt;/code&amp;gt; dependency as follows.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;build.gradle&amp;lt;/code&amp;gt;&lt;br /&gt;
 dependencies {&lt;br /&gt;
     ...&lt;br /&gt;
     signatures ploceus.sparrow(&amp;lt;Sparrow build&amp;gt;)&lt;br /&gt;
 }&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;build.gradle.kts&amp;lt;/code&amp;gt;&lt;br /&gt;
 dependencies {&lt;br /&gt;
     ...&lt;br /&gt;
     signatures(ploceus.sparrow(&amp;lt;Sparrow build&amp;gt;))&lt;br /&gt;
 }&lt;br /&gt;
&lt;br /&gt;
==== Raven ====&lt;br /&gt;
&lt;br /&gt;
[[Raven|Raven]] is Ornithe&#039;s throws clauses patch. To apply these patches, add the &amp;lt;code&amp;gt;exceptions&amp;lt;/code&amp;gt; dependency as follows.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;build.gradle&amp;lt;/code&amp;gt;&lt;br /&gt;
 dependencies {&lt;br /&gt;
     ...&lt;br /&gt;
     exceptions ploceus.raven(&amp;lt;Raven build&amp;gt;)&lt;br /&gt;
 }&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;build.gradle.kts&amp;lt;/code&amp;gt;&lt;br /&gt;
 dependencies {&lt;br /&gt;
     ...&lt;br /&gt;
     exceptions(ploceus.raven(&amp;lt;Raven build&amp;gt;))&lt;br /&gt;
 }&lt;br /&gt;
&lt;br /&gt;
[[Category:Mod Development]]&lt;/div&gt;</summary>
		<author><name>Space Walker</name></author>
	</entry>
	<entry>
		<id>https://wiki.ornithemc.net/index.php?title=Ornithe_Standard_Libraries&amp;diff=5</id>
		<title>Ornithe Standard Libraries</title>
		<link rel="alternate" type="text/html" href="https://wiki.ornithemc.net/index.php?title=Ornithe_Standard_Libraries&amp;diff=5"/>
		<updated>2024-02-01T18:47:04Z</updated>

		<summary type="html">&lt;p&gt;Space Walker: add description of osl&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Ornithe Standard Libraries (OSL for short) provides tools for mod developers to use in their mods. Much like Fabric API and Quilt Standard Libraries, it aims to be non-invasive yet provide the hooks and APIs that other mods need to add new content.&lt;/div&gt;</summary>
		<author><name>Space Walker</name></author>
	</entry>
	<entry>
		<id>https://wiki.ornithemc.net/index.php?title=User:Space_Walker&amp;diff=4</id>
		<title>User:Space Walker</title>
		<link rel="alternate" type="text/html" href="https://wiki.ornithemc.net/index.php?title=User:Space_Walker&amp;diff=4"/>
		<updated>2024-01-30T23:39:54Z</updated>

		<summary type="html">&lt;p&gt;Space Walker: Created page with &amp;quot;I make stuff.&amp;quot;&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;I make stuff.&lt;/div&gt;</summary>
		<author><name>Space Walker</name></author>
	</entry>
</feed>