<?xml version="1.0"?>
<feed xmlns="http://www.w3.org/2005/Atom" xml:lang="en">
	<id>https://wiki.figuramc.org/api.php?action=feedcontributions&amp;feedformat=atom&amp;user=PoolloverNathan</id>
	<title>FiguraMC - User contributions [en]</title>
	<link rel="self" type="application/atom+xml" href="https://wiki.figuramc.org/api.php?action=feedcontributions&amp;feedformat=atom&amp;user=PoolloverNathan"/>
	<link rel="alternate" type="text/html" href="https://wiki.figuramc.org/index.php/Special:Contributions/PoolloverNathan"/>
	<updated>2026-05-29T17:11:59Z</updated>
	<subtitle>User contributions</subtitle>
	<generator>MediaWiki 1.42.1</generator>
	<entry>
		<id>https://wiki.figuramc.org/index.php?title=Blockbench&amp;diff=746</id>
		<title>Blockbench</title>
		<link rel="alternate" type="text/html" href="https://wiki.figuramc.org/index.php?title=Blockbench&amp;diff=746"/>
		<updated>2024-11-02T23:47:17Z</updated>

		<summary type="html">&lt;p&gt;PoolloverNathan: /* Animation Properties */ PoolloverNathan vs MediaWiki — may the most insane win&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;The basics on how to use Blockbench&lt;br /&gt;
&lt;br /&gt;
Proper tutorials for Blockbench can be found online. This page just explains Figura specific stuff. This page assumes you are using the Desktop version of Blockbench, not the online app.&amp;lt;br/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Project Properties ==&lt;br /&gt;
&lt;br /&gt;
This is the popup that appears when you create a Project. You can also get to this page via File-&amp;amp;gt;Project.&amp;lt;br/&amp;gt; &amp;lt;img src={require(&amp;quot;@site/static/img/blockbench/project.png&amp;quot;).default} width=&amp;quot;400&amp;quot;&amp;gt;&amp;lt;/img&amp;gt;&amp;lt;br/&amp;gt; Figura only accepts &amp;lt;Emoji icon=&amp;quot;file/bbmodel&amp;quot;/&amp;gt; bbmodels in the Generic Model format. If your format is not Generic Model, Figura will refuse to load the avatar. To convert a project, File-&amp;amp;gt;Convert Project. Deselect &amp;lt;code&amp;gt;Create Copy&amp;lt;/code&amp;gt;, ensure format is Generic Model, and press Confirm. If the popup does not go away after pressing Confirm, close it manually.&amp;lt;br/&amp;gt; &amp;lt;img src={require(&amp;quot;@site/static/img/blockbench/convert_project.png&amp;quot;).default} width=&amp;quot;400&amp;quot;&amp;gt;&amp;lt;/img&amp;gt;&amp;lt;br/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
The &amp;lt;code&amp;gt;File Name&amp;lt;/code&amp;gt; and &amp;lt;code&amp;gt;Model Identifier&amp;lt;/code&amp;gt; fields are unused by Figura.&amp;lt;br/&amp;gt; &amp;lt;code&amp;gt;UV Mode&amp;lt;/code&amp;gt; determines how Blockbench handles how UVs are positioned. Figura will handle both &amp;lt;code&amp;gt;Box UV&amp;lt;/code&amp;gt; and &amp;lt;code&amp;gt;Per-face UV&amp;lt;/code&amp;gt;. Its up to you which you want. UVs determine where a 2D texture is applied to a 3D model. Each face has it’s own UV coordinates which determines where on the 2D texture it will get it’s pixels from.&amp;lt;br/&amp;gt;&amp;lt;br/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;img src={require(&amp;quot;@site/static/img/blockbench/uvmode_box.png&amp;quot;).default} width=&amp;quot;200&amp;quot; style={{&amp;quot;float&amp;quot;:&amp;quot;right&amp;quot;}}&amp;gt;&amp;lt;/img&amp;gt; &amp;lt;code&amp;gt;Box UV&amp;lt;/code&amp;gt; forces each face of a cube to match how vanilla does UVs. If you have ever edited your own vanilla skin before, you will recognize the pattern. While this does simplify the texturing process, it limits what you can do. Also, all textures in the model must have the same size, as what is a pixel is determined by the project’s global &amp;lt;code&amp;gt;Texture Size&amp;lt;/code&amp;gt; instead of the size of the texture itself. Also, meshes cannot be used while using &amp;lt;code&amp;gt;Box UV&amp;lt;/code&amp;gt;&amp;lt;br/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;clear:both;&amp;quot;&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;img src={require(&amp;quot;@site/static/img/blockbench/uvmode_perface.png&amp;quot;).default} width=&amp;quot;200&amp;quot; style={{&amp;quot;float&amp;quot;:&amp;quot;right&amp;quot;}}&amp;gt;&amp;lt;/img&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;Per-face UV&amp;lt;/code&amp;gt; allows full control over each face of the cube/mesh. Each face can be positioned, scaled, and rotated individually from each other. You can even set a different texture for each face, or remove a face to reduce clutter. While the pixel grid is effected by the project’s global &amp;lt;code&amp;gt;Texture Size&amp;lt;/code&amp;gt;, changing the &amp;lt;code&amp;gt;Texture Size&amp;lt;/code&amp;gt; has zero effect on the UVs themselves, unlike &amp;lt;code&amp;gt;Box UV&amp;lt;/code&amp;gt; which will have destructive effects when changing the project&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;clear:both;&amp;quot;&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;Texture Size&amp;lt;/code&amp;gt;.&amp;lt;br/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
The &amp;lt;code&amp;gt;Texture Size&amp;lt;/code&amp;gt; field aids with UV calculation. In rendering, UVs are a float from 0-1 representing the percentage of the texture that this point is at. A UV of (0.5,0.5) represents the center of the texture, regardless of the texture’s own size. A way of calculating this percentage is to take the pixel coordinate you want and divide it by the texture’s size. (32,16)/(64,64)=(0.5,0.25). The &amp;lt;code&amp;gt;Texture Size&amp;lt;/code&amp;gt; field determines this texture size globally. Blockbench never uses the texture’s actual size, which causes issues when you have a model with textures of different sizes. Thankfully, changing it only has an effect on ModelParts that use &amp;lt;code&amp;gt;Box UV&amp;lt;/code&amp;gt;, so when you need to edit ModelParts using a different sized texture, you can change this with no worries so long as you are using &amp;lt;code&amp;gt;Per-face UV&amp;lt;/code&amp;gt;.&amp;lt;br/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== ModelParts ==&lt;br /&gt;
&lt;br /&gt;
=== ParentTypes ===&lt;br /&gt;
&lt;br /&gt;
If the name of a &amp;lt;Emoji icon=&amp;quot;blockbench/group&amp;quot;/&amp;gt; group begins with a specific string, Figura will apply special effects to that group. Some examples include &amp;lt;code&amp;gt;Head&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;RightArm&amp;lt;/code&amp;gt;, and &amp;lt;code&amp;gt;World&amp;lt;/code&amp;gt;. These are called [[../enums/ModelPartParentTypes|ParentTypes]].&lt;br /&gt;
&lt;br /&gt;
=== &amp;lt;code&amp;gt;Blank&amp;lt;/code&amp;gt; Texture ===&lt;br /&gt;
&lt;br /&gt;
ModelParts that use the Blockbench inbuilt &amp;lt;code&amp;gt;Blank&amp;lt;/code&amp;gt; texture will not be loaded by Figura at all. If you want a Model to not have a texture and assign the texture via script, use the [[../tutorials/Avatar-Metadata|&amp;lt;code&amp;gt;ignoredTextures&amp;lt;/code&amp;gt; metadata customization]]. The &amp;lt;code&amp;gt;Transparent&amp;lt;/code&amp;gt; texture that can only be applied to individual faces in Per-face UV behave the same way. Figura will not load those faces.&lt;br /&gt;
&lt;br /&gt;
=== Meshes ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;Emoji icon=&amp;quot;blockbench/mesh&amp;quot;/&amp;gt; Meshes are allowed. Nothing special with Figura. This is just here for those that need to be explicitly told Meshes work.&lt;br /&gt;
&lt;br /&gt;
== Textures ==&lt;br /&gt;
&lt;br /&gt;
=== Local/External Textures ===&lt;br /&gt;
&lt;br /&gt;
In Blockbench, textures have 2 distinct states: Local and External.&amp;lt;br/&amp;gt; To determine the state your texture is in, Right Click a texture-&amp;amp;gt;Properties. An External texture will have a file path, while a Local one will not.&amp;lt;br/&amp;gt;There is one key factor for a texture to be External, and that is for the file itself to be inside the avatar’s folder. If the filepath does not lead to a file inside the avatar’s folder, Figura will load it as a Local file.&amp;lt;br/&amp;gt; &amp;lt;img src={require(&amp;quot;@site/static/img/blockbench/texture_local.png&amp;quot;).default} width=&amp;quot;300&amp;quot;&amp;gt;&amp;lt;/img&amp;gt;&amp;lt;img src={require(&amp;quot;@site/static/img/blockbench/texture_external.png&amp;quot;).default} width=&amp;quot;300&amp;quot;&amp;gt;&amp;lt;/img&amp;gt;&amp;lt;br/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Whether a texture is Local or External will determine how Figura will load it which is important when getting a Texture in script.&amp;lt;br/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
The &amp;lt;code&amp;gt;Render Mode&amp;lt;/code&amp;gt; field determines how the texture will be rendered. In Blockbench, this changes nothing visually.&amp;lt;br/&amp;gt; &#039;&#039;&#039;Figura ignores &amp;lt;code&amp;gt;Render Mode&amp;lt;/code&amp;gt;.&#039;&#039;&#039; The Primary Texture will always be &amp;lt;code&amp;gt;TRANSLUCENT&amp;lt;/code&amp;gt; by default, and the Secondary Texture will always be &amp;lt;code&amp;gt;EMISSIVE&amp;lt;/code&amp;gt; by default.&amp;lt;br/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
The &amp;lt;code&amp;gt;Render Sides&amp;lt;/code&amp;gt; field determines if the cube should be rendered when looking at the back of a face.&amp;lt;br/&amp;gt; &#039;&#039;&#039;Figura ignores &amp;lt;code&amp;gt;Render Sides&amp;lt;/code&amp;gt;.&#039;&#039;&#039; To apply the same effect, use the &amp;lt;code&amp;gt;TRANSLUCENT_CULL&amp;lt;/code&amp;gt; [[../enums/RenderTypes|RenderType]] in a script.&amp;lt;br/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Texture Suffix ===&lt;br /&gt;
&lt;br /&gt;
In Blockbench, each cube (face) can only point to a single texture, which means that Figura needs to get creative when it wants to link multiple textures together for stuff like emissive textures.&amp;lt;br/&amp;gt; When Figura loads a texture, it looks for another texture with the same name but with a specific suffix. Then for all ModelParts in Blockbench that use the texture, Figura will link the suffixed texture to that ModelPart as well.&lt;br /&gt;
&lt;br /&gt;
List of suffixes used by Figura:&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;code&amp;gt;_e&amp;lt;/code&amp;gt;: This texture will be used as the Secondary Texture, also known as the [[../tutorials/Emissive%20Textures|Emissive Texture]], of the ModelPart. The Secondary RenderType of a ModelPart is by default &amp;lt;code&amp;gt;EMISSIVE&amp;lt;/code&amp;gt;, but can be changed in script.&lt;br /&gt;
* &amp;lt;code&amp;gt;_n&amp;lt;/code&amp;gt;: This texture will be used as the [https://en.wikipedia.org/wiki/Normal_mapping Normal Texture]. &amp;lt;b&amp;gt;Do not confuse this with the Primary Texture&amp;lt;/b&amp;gt;. “Normal” means something very specific in modeling. This suffix is used with Iris Shaders, and does nothing with vanilla rendering. &amp;lt;b&amp;gt;&amp;lt;i&amp;gt;This suffix currently does not function&amp;lt;/i&amp;gt;&amp;lt;/b&amp;gt;.&lt;br /&gt;
* &amp;lt;code&amp;gt;_s&amp;lt;/code&amp;gt;: This texture will be used as the [https://en.wikipedia.org/wiki/Specularity Specular Texture]. This suffix is used with Iris Shaders, and does nothing with vanilla rendering. &amp;lt;b&amp;gt;&amp;lt;i&amp;gt;This suffix currently does not function&amp;lt;/i&amp;gt;&amp;lt;/b&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
An example is the &amp;lt;Emoji icon=&amp;quot;blockbench/group&amp;quot;/&amp;gt; &amp;lt;code&amp;gt;Head&amp;lt;/code&amp;gt;, &amp;lt;Emoji icon=&amp;quot;file/texture&amp;quot;/&amp;gt; &amp;lt;code&amp;gt;skin&amp;lt;/code&amp;gt;, and &amp;lt;Emoji icon=&amp;quot;file/texture&amp;quot;/&amp;gt; &amp;lt;code&amp;gt;skin_e&amp;lt;/code&amp;gt;. When the &amp;lt;Emoji icon=&amp;quot;blockbench/group&amp;quot;/&amp;gt; &amp;lt;code&amp;gt;Head&amp;lt;/code&amp;gt; uses the texture &amp;lt;Emoji icon=&amp;quot;file/texture&amp;quot;/&amp;gt; &amp;lt;code&amp;gt;skin&amp;lt;/code&amp;gt;, when the Avatar is loaded, &amp;lt;Emoji icon=&amp;quot;file/texture&amp;quot;/&amp;gt; &amp;lt;code&amp;gt;skin_e&amp;lt;/code&amp;gt; is used as the Secondary Texture, ie the Emissive Texture.&amp;lt;br/&amp;gt; &amp;lt;img src={require(&amp;quot;@site/static/img/blockbench/settexture.png&amp;quot;).default} width=&amp;quot;300&amp;quot;&amp;gt;&amp;lt;/img&amp;gt;&amp;lt;br/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
For a texture to have the same name, they must both be either [[#localexternal-textures|Local or External]], and should they be external, they must be in the same folder. Otherwise, they will not have the same name internally.&amp;lt;br/&amp;gt; For textures with file extensions, the suffix goes before the extension. &amp;lt;Emoji icon=&amp;quot;file/texture&amp;quot;/&amp;gt; &amp;lt;code&amp;gt;skin_e.png&amp;lt;/code&amp;gt;&amp;lt;br/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Animations ==&lt;br /&gt;
&lt;br /&gt;
=== Animation Properties ===&lt;br /&gt;
&lt;br /&gt;
This popup appears when you create an animation. To get back to this popup, Right Click an Animation-&amp;amp;gt;Properties.&amp;lt;br/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;img src={require(&amp;quot;@site/static/img/blockbench/animation_properties.png&amp;quot;).default} width=&amp;quot;500&amp;quot;&amp;gt;&amp;lt;/img&amp;gt;&amp;lt;br/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
; Name&lt;br /&gt;
: This is the animation’s name. It is very important that you change this to something shorter. The entire textbox is the animation’s name, so unless you want to refer to this animation in lua with &amp;lt;code&amp;gt;animations.player[&amp;quot;animation.model.new&amp;quot;]&amp;lt;/code&amp;gt;, change the name. An animation named just &amp;lt;code&amp;gt;&amp;quot;new&amp;quot;&amp;lt;/code&amp;gt; is indexed via &amp;lt;code&amp;gt;animations.player.new&amp;lt;/code&amp;gt;. Much nicer, right?&lt;br /&gt;
&lt;br /&gt;
; Loop Mode&lt;br /&gt;
: This controls what happens when the animation reaches the end. There are 3 valid loop modes:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;margin-left: var(--space-lg); margin-top: -1em&amp;quot;&amp;gt;&lt;br /&gt;
; Play Once&lt;br /&gt;
: The animation will stop immediately at the end. Note that badly-made animations may have a visible jump to their original position in this mode.&lt;br /&gt;
; Hold On Last Frame&lt;br /&gt;
: The animation will hold the values from its last frame after ending. Note that while an animation is holding, it is still considered playing, so calling &amp;lt;code&amp;gt;:play()&amp;lt;/code&amp;gt; again will do nothing.&lt;br /&gt;
; Loop&lt;br /&gt;
: When the animation reaches its end, it will jump to the beginning. Note that the start and end frames should be the same in this mode, as there won&#039;t be an in-between animation.&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
; Override&lt;br /&gt;
: If this is enabled, Mimic-type [[Enums/ParentTypes|Enums/ParentTypes]] won&#039;t apply their rotations while this animation is playing. Note that keyframes must be present on the specific channel for override to apply! For example, putting a keyframe on Head&#039;s rotation won&#039;t apply override to its position or scale, Body, or even other Heads.&lt;br /&gt;
&lt;br /&gt;
; Snapping&lt;br /&gt;
: This sets what unit of time Blockbench will set animations to. Holding Ctrl allows you to bypass this. Figura ignores this value.&lt;br /&gt;
&lt;br /&gt;
; Anim Time Update&lt;br /&gt;
: &#039;&#039;Default value: 0&#039;&#039;&lt;br /&gt;
: This allows you to set the time Figura starts playing the animation at. For example, setting this to 2 skips the first 2 seconds of the animation. This lets you add keyframes before the animation to help with interpolations.&lt;br /&gt;
: {{tagged|Trivia|In Molang (and, therefore, Blockbench), this sets the animation&#039;s time &#039;&#039;every tick&#039;&#039; to a Molang expression. In Figura, you can achieve the equivalent by calling &amp;lt;code&amp;gt;setTime&amp;lt;/code&amp;gt; in a script.}}&lt;br /&gt;
&lt;br /&gt;
; Blend Weight&lt;br /&gt;
: Every keyframe value in the animation is multiplied by this value. This isn&#039;t very useful itself, but can be used by scripts (for example, [[GSAnimBlend]]) to transition into or out of animations.&lt;br /&gt;
&lt;br /&gt;
; Start Delay&lt;br /&gt;
: &#039;&#039;Default value: 0&#039;&#039;&lt;br /&gt;
: This delays the animation&#039;s start time by the given amount.&lt;br /&gt;
&lt;br /&gt;
; Loop Delay&lt;br /&gt;
: &#039;&#039;Default value: 0&#039;&#039;&lt;br /&gt;
: This sets the amount of time the animation will pause at the end before it loops again. This is only relevant in Loop mode.&lt;br /&gt;
&lt;br /&gt;
=== Keyframe Expressions ===&lt;br /&gt;
&lt;br /&gt;
While Blockbench supports Molang, &#039;&#039;&#039;Figura does not&#039;&#039;&#039;.&amp;lt;br/&amp;gt; To remedy this, Figura allows writing lua code into keyframe fields.&amp;lt;br/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Figura provides data for the keyframe expression, which is accessible via the &amp;lt;code&amp;gt;...&amp;lt;/code&amp;gt; variable.&lt;br /&gt;
&lt;br /&gt;
It has 2 pieces of data, the keyframe time, and the Animation object of the animation itself.&amp;lt;br/&amp;gt; Keyframe time is measured in percentage, not seconds. So, assuming a Step interpolation keyframe, &amp;lt;code&amp;gt;0&amp;lt;/code&amp;gt; is at the time at the keyframe itself and &amp;lt;code&amp;gt;1&amp;lt;/code&amp;gt; is at the next keyframe. Keyframe time is only useful when the keyframe uses Step interpolation.&amp;lt;br/&amp;gt;When using other interpolation types, the expression will execute before it has reached the keyframe itself to interpolate. While this happens, it will give the Keyframe time of the previous keyframe and go back to zero once it reaches itself.&lt;br /&gt;
&lt;br /&gt;
They can be extracted via the following line:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;lua&amp;quot;&amp;gt;local time, anim = ...&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Keyframe Expressions accept 2 different formats:&lt;br /&gt;
&lt;br /&gt;
* A single lua expression that evaluates to a number&lt;br /&gt;
* A lua script that &amp;lt;code&amp;gt;returns&amp;lt;/code&amp;gt; a number&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;math.sin(world.getTime())&amp;lt;/code&amp;gt; is a single lua expression, so it is a valid Keyframe Expression.&amp;lt;br/&amp;gt; However, &amp;lt;code&amp;gt;local _, anim=... math.sin(anim:getTime())&amp;lt;/code&amp;gt; is not a single lua expression and will need to have an explicit return value:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;lua&amp;quot;&amp;gt;local _, anim = ...&lt;br /&gt;
&lt;br /&gt;
return math.sin(anim:getTime())&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Alternatively, you can rewrite it as a single lua expression: &amp;lt;code&amp;gt;math.sin({...}[2]:getTime())&amp;lt;/code&amp;gt;&amp;lt;br/&amp;gt; This deconstructs the &amp;lt;code&amp;gt;...&amp;lt;/code&amp;gt; varargs into a table and grabs the second value.&lt;br /&gt;
&lt;br /&gt;
=== Instruction Keyframes ===&lt;br /&gt;
&lt;br /&gt;
Instruction Keyframes run lua code when the Animation reaches that keyframe. This can be used to play sounds, spawn particles, literally anything. Remember that Lua code is what goes in this spot, not Molang.&amp;lt;br/&amp;gt; You can access Instruction Keyframes via the Magic Wand icon. An Effects timeline should appear along with the other ModelPart timelines.&lt;br /&gt;
&lt;br /&gt;
=== Animation Features That Figura Does Not Care About ===&lt;br /&gt;
&lt;br /&gt;
Below are features provided by Blockbench Animations that figura does not use when loading the bbmodel.&amp;lt;br/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Variable Placeholders&#039;&#039;&#039;&amp;lt;br/&amp;gt; &amp;lt;img src={require(&amp;quot;@site/static/img/blockbench/animation_variableplaceholders.png&amp;quot;).default} width=&amp;quot;200&amp;quot;&amp;gt;&amp;lt;/img&amp;gt;&amp;lt;br/&amp;gt; This is completely ignored by Figura.&amp;lt;br/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Inverse Kinematics&#039;&#039;&#039;&amp;lt;br/&amp;gt; Don’t bother. Not a thing in Figura.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Global Rotation&#039;&#039;&#039;&amp;lt;br/&amp;gt; There is a toggle for Global Rotation next to the Rotation timeline for ModelParts. Figura does not obey this, so keep it disabled.&amp;lt;br/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Sound Keyframes&#039;&#039;&#039;&amp;lt;br/&amp;gt; Figura does not read these. Use [[#instruction-keyframes|Instruction Keyframes]].&amp;lt;br/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Particle Keyframes&#039;&#039;&#039;&amp;lt;br/&amp;gt; Figura does not read these. Use [[#instruction-keyframes|Instruction Keyframes]].&amp;lt;br/&amp;gt;&lt;/div&gt;</summary>
		<author><name>PoolloverNathan</name></author>
	</entry>
	<entry>
		<id>https://wiki.figuramc.org/index.php?title=Template:D&amp;diff=745</id>
		<title>Template:D</title>
		<link rel="alternate" type="text/html" href="https://wiki.figuramc.org/index.php?title=Template:D&amp;diff=745"/>
		<updated>2024-11-02T23:29:21Z</updated>

		<summary type="html">&lt;p&gt;PoolloverNathan: template data&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&amp;lt;includeonly&amp;gt;&amp;lt;dt&amp;gt;{{{1}}}&amp;lt;/dt&amp;gt;&amp;lt;dd&amp;gt;{{{2}}}&amp;lt;/dd&amp;gt;&amp;lt;/includeonly&amp;gt;&amp;lt;noinclude&amp;gt;{{lowercase}}A &amp;lt;code&amp;gt;&amp;amp;lt;dt&amp;gt;&amp;lt;/code&amp;gt; and &amp;lt;code&amp;gt;&amp;amp;lt;dd&amp;gt;&amp;lt;/code&amp;gt; pair for nested or otherwise manually-created definition lists.&lt;br /&gt;
&amp;lt;templatedata&amp;gt;&lt;br /&gt;
{&lt;br /&gt;
	&amp;quot;params&amp;quot;: {&lt;br /&gt;
		&amp;quot;1&amp;quot;: {&lt;br /&gt;
			&amp;quot;label&amp;quot;: &amp;quot;term&amp;quot;,&lt;br /&gt;
			&amp;quot;description&amp;quot;: &amp;quot;The term or key of the definition list item.&amp;quot;,&lt;br /&gt;
			&amp;quot;type&amp;quot;: &amp;quot;content&amp;quot;,&lt;br /&gt;
			&amp;quot;required&amp;quot;: true&lt;br /&gt;
		},&lt;br /&gt;
		&amp;quot;2&amp;quot;: {&lt;br /&gt;
			&amp;quot;label&amp;quot;: &amp;quot;definition&amp;quot;,&lt;br /&gt;
			&amp;quot;description&amp;quot;: &amp;quot;The definition or value for the list item.&amp;quot;,&lt;br /&gt;
			&amp;quot;required&amp;quot;: true&lt;br /&gt;
		}&lt;br /&gt;
	},&lt;br /&gt;
	&amp;quot;paramOrder&amp;quot;: [&lt;br /&gt;
		&amp;quot;1&amp;quot;,&lt;br /&gt;
		&amp;quot;2&amp;quot;&lt;br /&gt;
	]&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/templatedata&amp;gt;&amp;lt;/noinclude&amp;gt;&lt;/div&gt;</summary>
		<author><name>PoolloverNathan</name></author>
	</entry>
	<entry>
		<id>https://wiki.figuramc.org/index.php?title=Template:D&amp;diff=744</id>
		<title>Template:D</title>
		<link rel="alternate" type="text/html" href="https://wiki.figuramc.org/index.php?title=Template:D&amp;diff=744"/>
		<updated>2024-11-02T22:57:46Z</updated>

		<summary type="html">&lt;p&gt;PoolloverNathan: Created page with &amp;quot;&amp;lt;includeonly&amp;gt;&amp;lt;dt&amp;gt;{{{1}}}&amp;lt;/dt&amp;gt;&amp;lt;dd&amp;gt;{{{2}}}&amp;lt;/dd&amp;gt;&amp;lt;/includeonly&amp;gt;&amp;lt;noinclude&amp;gt;{{lowercase}}A &amp;lt;code&amp;gt;&amp;amp;lt;dt&amp;gt;&amp;lt;/code&amp;gt; and &amp;lt;code&amp;gt;&amp;amp;lt;dd&amp;gt;&amp;lt;/code&amp;gt; pair for nested or otherwise manually-created definition lists. &amp;lt;templatedata&amp;gt; { 	&amp;quot;params&amp;quot;: { 		&amp;quot;1&amp;quot;: {}, 		&amp;quot;2&amp;quot;: {} 	} } &amp;lt;/templatedata&amp;gt;&amp;lt;/noinclude&amp;gt;&amp;quot;&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&amp;lt;includeonly&amp;gt;&amp;lt;dt&amp;gt;{{{1}}}&amp;lt;/dt&amp;gt;&amp;lt;dd&amp;gt;{{{2}}}&amp;lt;/dd&amp;gt;&amp;lt;/includeonly&amp;gt;&amp;lt;noinclude&amp;gt;{{lowercase}}A &amp;lt;code&amp;gt;&amp;amp;lt;dt&amp;gt;&amp;lt;/code&amp;gt; and &amp;lt;code&amp;gt;&amp;amp;lt;dd&amp;gt;&amp;lt;/code&amp;gt; pair for nested or otherwise manually-created definition lists.&lt;br /&gt;
&amp;lt;templatedata&amp;gt;&lt;br /&gt;
{&lt;br /&gt;
	&amp;quot;params&amp;quot;: {&lt;br /&gt;
		&amp;quot;1&amp;quot;: {},&lt;br /&gt;
		&amp;quot;2&amp;quot;: {}&lt;br /&gt;
	}&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/templatedata&amp;gt;&amp;lt;/noinclude&amp;gt;&lt;/div&gt;</summary>
		<author><name>PoolloverNathan</name></author>
	</entry>
	<entry>
		<id>https://wiki.figuramc.org/index.php?title=Blockbench&amp;diff=743</id>
		<title>Blockbench</title>
		<link rel="alternate" type="text/html" href="https://wiki.figuramc.org/index.php?title=Blockbench&amp;diff=743"/>
		<updated>2024-11-02T22:56:35Z</updated>

		<summary type="html">&lt;p&gt;PoolloverNathan: /* Animation Properties */ properly nested definition lists&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;The basics on how to use Blockbench&lt;br /&gt;
&lt;br /&gt;
Proper tutorials for Blockbench can be found online. This page just explains Figura specific stuff. This page assumes you are using the Desktop version of Blockbench, not the online app.&amp;lt;br/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Project Properties ==&lt;br /&gt;
&lt;br /&gt;
This is the popup that appears when you create a Project. You can also get to this page via File-&amp;amp;gt;Project.&amp;lt;br/&amp;gt; &amp;lt;img src={require(&amp;quot;@site/static/img/blockbench/project.png&amp;quot;).default} width=&amp;quot;400&amp;quot;&amp;gt;&amp;lt;/img&amp;gt;&amp;lt;br/&amp;gt; Figura only accepts &amp;lt;Emoji icon=&amp;quot;file/bbmodel&amp;quot;/&amp;gt; bbmodels in the Generic Model format. If your format is not Generic Model, Figura will refuse to load the avatar. To convert a project, File-&amp;amp;gt;Convert Project. Deselect &amp;lt;code&amp;gt;Create Copy&amp;lt;/code&amp;gt;, ensure format is Generic Model, and press Confirm. If the popup does not go away after pressing Confirm, close it manually.&amp;lt;br/&amp;gt; &amp;lt;img src={require(&amp;quot;@site/static/img/blockbench/convert_project.png&amp;quot;).default} width=&amp;quot;400&amp;quot;&amp;gt;&amp;lt;/img&amp;gt;&amp;lt;br/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
The &amp;lt;code&amp;gt;File Name&amp;lt;/code&amp;gt; and &amp;lt;code&amp;gt;Model Identifier&amp;lt;/code&amp;gt; fields are unused by Figura.&amp;lt;br/&amp;gt; &amp;lt;code&amp;gt;UV Mode&amp;lt;/code&amp;gt; determines how Blockbench handles how UVs are positioned. Figura will handle both &amp;lt;code&amp;gt;Box UV&amp;lt;/code&amp;gt; and &amp;lt;code&amp;gt;Per-face UV&amp;lt;/code&amp;gt;. Its up to you which you want. UVs determine where a 2D texture is applied to a 3D model. Each face has it’s own UV coordinates which determines where on the 2D texture it will get it’s pixels from.&amp;lt;br/&amp;gt;&amp;lt;br/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;img src={require(&amp;quot;@site/static/img/blockbench/uvmode_box.png&amp;quot;).default} width=&amp;quot;200&amp;quot; style={{&amp;quot;float&amp;quot;:&amp;quot;right&amp;quot;}}&amp;gt;&amp;lt;/img&amp;gt; &amp;lt;code&amp;gt;Box UV&amp;lt;/code&amp;gt; forces each face of a cube to match how vanilla does UVs. If you have ever edited your own vanilla skin before, you will recognize the pattern. While this does simplify the texturing process, it limits what you can do. Also, all textures in the model must have the same size, as what is a pixel is determined by the project’s global &amp;lt;code&amp;gt;Texture Size&amp;lt;/code&amp;gt; instead of the size of the texture itself. Also, meshes cannot be used while using &amp;lt;code&amp;gt;Box UV&amp;lt;/code&amp;gt;&amp;lt;br/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;clear:both;&amp;quot;&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;img src={require(&amp;quot;@site/static/img/blockbench/uvmode_perface.png&amp;quot;).default} width=&amp;quot;200&amp;quot; style={{&amp;quot;float&amp;quot;:&amp;quot;right&amp;quot;}}&amp;gt;&amp;lt;/img&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;Per-face UV&amp;lt;/code&amp;gt; allows full control over each face of the cube/mesh. Each face can be positioned, scaled, and rotated individually from each other. You can even set a different texture for each face, or remove a face to reduce clutter. While the pixel grid is effected by the project’s global &amp;lt;code&amp;gt;Texture Size&amp;lt;/code&amp;gt;, changing the &amp;lt;code&amp;gt;Texture Size&amp;lt;/code&amp;gt; has zero effect on the UVs themselves, unlike &amp;lt;code&amp;gt;Box UV&amp;lt;/code&amp;gt; which will have destructive effects when changing the project&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;clear:both;&amp;quot;&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;Texture Size&amp;lt;/code&amp;gt;.&amp;lt;br/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
The &amp;lt;code&amp;gt;Texture Size&amp;lt;/code&amp;gt; field aids with UV calculation. In rendering, UVs are a float from 0-1 representing the percentage of the texture that this point is at. A UV of (0.5,0.5) represents the center of the texture, regardless of the texture’s own size. A way of calculating this percentage is to take the pixel coordinate you want and divide it by the texture’s size. (32,16)/(64,64)=(0.5,0.25). The &amp;lt;code&amp;gt;Texture Size&amp;lt;/code&amp;gt; field determines this texture size globally. Blockbench never uses the texture’s actual size, which causes issues when you have a model with textures of different sizes. Thankfully, changing it only has an effect on ModelParts that use &amp;lt;code&amp;gt;Box UV&amp;lt;/code&amp;gt;, so when you need to edit ModelParts using a different sized texture, you can change this with no worries so long as you are using &amp;lt;code&amp;gt;Per-face UV&amp;lt;/code&amp;gt;.&amp;lt;br/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== ModelParts ==&lt;br /&gt;
&lt;br /&gt;
=== ParentTypes ===&lt;br /&gt;
&lt;br /&gt;
If the name of a &amp;lt;Emoji icon=&amp;quot;blockbench/group&amp;quot;/&amp;gt; group begins with a specific string, Figura will apply special effects to that group. Some examples include &amp;lt;code&amp;gt;Head&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;RightArm&amp;lt;/code&amp;gt;, and &amp;lt;code&amp;gt;World&amp;lt;/code&amp;gt;. These are called [[../enums/ModelPartParentTypes|ParentTypes]].&lt;br /&gt;
&lt;br /&gt;
=== &amp;lt;code&amp;gt;Blank&amp;lt;/code&amp;gt; Texture ===&lt;br /&gt;
&lt;br /&gt;
ModelParts that use the Blockbench inbuilt &amp;lt;code&amp;gt;Blank&amp;lt;/code&amp;gt; texture will not be loaded by Figura at all. If you want a Model to not have a texture and assign the texture via script, use the [[../tutorials/Avatar-Metadata|&amp;lt;code&amp;gt;ignoredTextures&amp;lt;/code&amp;gt; metadata customization]]. The &amp;lt;code&amp;gt;Transparent&amp;lt;/code&amp;gt; texture that can only be applied to individual faces in Per-face UV behave the same way. Figura will not load those faces.&lt;br /&gt;
&lt;br /&gt;
=== Meshes ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;Emoji icon=&amp;quot;blockbench/mesh&amp;quot;/&amp;gt; Meshes are allowed. Nothing special with Figura. This is just here for those that need to be explicitly told Meshes work.&lt;br /&gt;
&lt;br /&gt;
== Textures ==&lt;br /&gt;
&lt;br /&gt;
=== Local/External Textures ===&lt;br /&gt;
&lt;br /&gt;
In Blockbench, textures have 2 distinct states: Local and External.&amp;lt;br/&amp;gt; To determine the state your texture is in, Right Click a texture-&amp;amp;gt;Properties. An External texture will have a file path, while a Local one will not.&amp;lt;br/&amp;gt;There is one key factor for a texture to be External, and that is for the file itself to be inside the avatar’s folder. If the filepath does not lead to a file inside the avatar’s folder, Figura will load it as a Local file.&amp;lt;br/&amp;gt; &amp;lt;img src={require(&amp;quot;@site/static/img/blockbench/texture_local.png&amp;quot;).default} width=&amp;quot;300&amp;quot;&amp;gt;&amp;lt;/img&amp;gt;&amp;lt;img src={require(&amp;quot;@site/static/img/blockbench/texture_external.png&amp;quot;).default} width=&amp;quot;300&amp;quot;&amp;gt;&amp;lt;/img&amp;gt;&amp;lt;br/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Whether a texture is Local or External will determine how Figura will load it which is important when getting a Texture in script.&amp;lt;br/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
The &amp;lt;code&amp;gt;Render Mode&amp;lt;/code&amp;gt; field determines how the texture will be rendered. In Blockbench, this changes nothing visually.&amp;lt;br/&amp;gt; &#039;&#039;&#039;Figura ignores &amp;lt;code&amp;gt;Render Mode&amp;lt;/code&amp;gt;.&#039;&#039;&#039; The Primary Texture will always be &amp;lt;code&amp;gt;TRANSLUCENT&amp;lt;/code&amp;gt; by default, and the Secondary Texture will always be &amp;lt;code&amp;gt;EMISSIVE&amp;lt;/code&amp;gt; by default.&amp;lt;br/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
The &amp;lt;code&amp;gt;Render Sides&amp;lt;/code&amp;gt; field determines if the cube should be rendered when looking at the back of a face.&amp;lt;br/&amp;gt; &#039;&#039;&#039;Figura ignores &amp;lt;code&amp;gt;Render Sides&amp;lt;/code&amp;gt;.&#039;&#039;&#039; To apply the same effect, use the &amp;lt;code&amp;gt;TRANSLUCENT_CULL&amp;lt;/code&amp;gt; [[../enums/RenderTypes|RenderType]] in a script.&amp;lt;br/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Texture Suffix ===&lt;br /&gt;
&lt;br /&gt;
In Blockbench, each cube (face) can only point to a single texture, which means that Figura needs to get creative when it wants to link multiple textures together for stuff like emissive textures.&amp;lt;br/&amp;gt; When Figura loads a texture, it looks for another texture with the same name but with a specific suffix. Then for all ModelParts in Blockbench that use the texture, Figura will link the suffixed texture to that ModelPart as well.&lt;br /&gt;
&lt;br /&gt;
List of suffixes used by Figura:&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;code&amp;gt;_e&amp;lt;/code&amp;gt;: This texture will be used as the Secondary Texture, also known as the [[../tutorials/Emissive%20Textures|Emissive Texture]], of the ModelPart. The Secondary RenderType of a ModelPart is by default &amp;lt;code&amp;gt;EMISSIVE&amp;lt;/code&amp;gt;, but can be changed in script.&lt;br /&gt;
* &amp;lt;code&amp;gt;_n&amp;lt;/code&amp;gt;: This texture will be used as the [https://en.wikipedia.org/wiki/Normal_mapping Normal Texture]. &amp;lt;b&amp;gt;Do not confuse this with the Primary Texture&amp;lt;/b&amp;gt;. “Normal” means something very specific in modeling. This suffix is used with Iris Shaders, and does nothing with vanilla rendering. &amp;lt;b&amp;gt;&amp;lt;i&amp;gt;This suffix currently does not function&amp;lt;/i&amp;gt;&amp;lt;/b&amp;gt;.&lt;br /&gt;
* &amp;lt;code&amp;gt;_s&amp;lt;/code&amp;gt;: This texture will be used as the [https://en.wikipedia.org/wiki/Specularity Specular Texture]. This suffix is used with Iris Shaders, and does nothing with vanilla rendering. &amp;lt;b&amp;gt;&amp;lt;i&amp;gt;This suffix currently does not function&amp;lt;/i&amp;gt;&amp;lt;/b&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
An example is the &amp;lt;Emoji icon=&amp;quot;blockbench/group&amp;quot;/&amp;gt; &amp;lt;code&amp;gt;Head&amp;lt;/code&amp;gt;, &amp;lt;Emoji icon=&amp;quot;file/texture&amp;quot;/&amp;gt; &amp;lt;code&amp;gt;skin&amp;lt;/code&amp;gt;, and &amp;lt;Emoji icon=&amp;quot;file/texture&amp;quot;/&amp;gt; &amp;lt;code&amp;gt;skin_e&amp;lt;/code&amp;gt;. When the &amp;lt;Emoji icon=&amp;quot;blockbench/group&amp;quot;/&amp;gt; &amp;lt;code&amp;gt;Head&amp;lt;/code&amp;gt; uses the texture &amp;lt;Emoji icon=&amp;quot;file/texture&amp;quot;/&amp;gt; &amp;lt;code&amp;gt;skin&amp;lt;/code&amp;gt;, when the Avatar is loaded, &amp;lt;Emoji icon=&amp;quot;file/texture&amp;quot;/&amp;gt; &amp;lt;code&amp;gt;skin_e&amp;lt;/code&amp;gt; is used as the Secondary Texture, ie the Emissive Texture.&amp;lt;br/&amp;gt; &amp;lt;img src={require(&amp;quot;@site/static/img/blockbench/settexture.png&amp;quot;).default} width=&amp;quot;300&amp;quot;&amp;gt;&amp;lt;/img&amp;gt;&amp;lt;br/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
For a texture to have the same name, they must both be either [[#localexternal-textures|Local or External]], and should they be external, they must be in the same folder. Otherwise, they will not have the same name internally.&amp;lt;br/&amp;gt; For textures with file extensions, the suffix goes before the extension. &amp;lt;Emoji icon=&amp;quot;file/texture&amp;quot;/&amp;gt; &amp;lt;code&amp;gt;skin_e.png&amp;lt;/code&amp;gt;&amp;lt;br/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Animations ==&lt;br /&gt;
&lt;br /&gt;
=== Animation Properties ===&lt;br /&gt;
&lt;br /&gt;
This popup appears when you create an animation. To get back to this popup, Right Click an Animation-&amp;amp;gt;Properties.&amp;lt;br/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;img src={require(&amp;quot;@site/static/img/blockbench/animation_properties.png&amp;quot;).default} width=&amp;quot;500&amp;quot;&amp;gt;&amp;lt;/img&amp;gt;&amp;lt;br/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
; Name&lt;br /&gt;
: This is the animation’s name. It is very important that you change this to something shorter. The entire textbox is the animation’s name, so unless you want to refer to this animation in lua with &amp;lt;code&amp;gt;animations.player[&amp;quot;animation.model.new&amp;quot;]&amp;lt;/code&amp;gt;, change the name. An animation named just &amp;lt;code&amp;gt;&amp;quot;new&amp;quot;&amp;lt;/code&amp;gt; is indexed via &amp;lt;code&amp;gt;animations.player.new&amp;lt;/code&amp;gt;. Much nicer, right?&lt;br /&gt;
&lt;br /&gt;
; Loop Mode&lt;br /&gt;
: This controls what happens when the animation reaches the end. There are 3 valid loop modes:&lt;br /&gt;
: &amp;lt;dl&amp;gt;&lt;br /&gt;
: {{d|Play Once|The animation will stop immediately at the end. Note that badly-made animations may have a visible jump to their original position in this mode.}}&lt;br /&gt;
: {{d|Hold On Last Frame|The animation will hold the values from its last frame after ending. Note that while an animation is holding, it is still considered playing, so calling &amp;lt;code&amp;gt;:play()&amp;lt;/code&amp;gt; again will do nothing.}}&lt;br /&gt;
: {{d|Loop|When the animation reaches its end, it will jump to the beginning. Note that the start and end frames should be the same in this mode, as there won&#039;t be an in-between animation.}}&lt;br /&gt;
: &amp;lt;/dl&amp;gt;&lt;br /&gt;
&lt;br /&gt;
; Override&lt;br /&gt;
: If this is enabled, Mimic-type [[Enums/ParentTypes|Enums/ParentTypes]] won&#039;t apply their rotations while this animation is playing. Note that keyframes must be present on the specific channel for override to apply! For example, putting a keyframe on Head&#039;s rotation won&#039;t apply override to its position or scale, Body, or even other Heads.&lt;br /&gt;
&lt;br /&gt;
; Snapping&lt;br /&gt;
: This sets what unit of time Blockbench will set animations to. Holding Ctrl allows you to bypass this. Figura ignores this value.&lt;br /&gt;
&lt;br /&gt;
; Anim Time Update&lt;br /&gt;
: &#039;&#039;Default value: 0&#039;&#039;&lt;br /&gt;
: This allows you to set the time Figura starts playing the animation at. For example, setting this to 2 skips the first 2 seconds of the animation. This lets you add keyframes before the animation to help with interpolations.&lt;br /&gt;
: {{tagged|Trivia|In Molang (and, therefore, Blockbench), this sets the animation&#039;s time &#039;&#039;every tick&#039;&#039; to a Molang expression. In Figura, you can achieve the equivalent by calling &amp;lt;code&amp;gt;setTime&amp;lt;/code&amp;gt; in a script.}}&lt;br /&gt;
&lt;br /&gt;
; Blend Weight&lt;br /&gt;
: Every keyframe value in the animation is multiplied by this value. This isn&#039;t very useful itself, but can be used by scripts (for example, [[GSAnimBlend]]) to transition into or out of animations.&lt;br /&gt;
&lt;br /&gt;
; Start Delay&lt;br /&gt;
: &#039;&#039;Default value: 0&#039;&#039;&lt;br /&gt;
: This delays the animation&#039;s start time by the given amount.&lt;br /&gt;
&lt;br /&gt;
; Loop Delay&lt;br /&gt;
: &#039;&#039;Default value: 0&#039;&#039;&lt;br /&gt;
: This sets the amount of time the animation will pause at the end before it loops again. This is only relevant in Loop mode.&lt;br /&gt;
&lt;br /&gt;
=== Keyframe Expressions ===&lt;br /&gt;
&lt;br /&gt;
While Blockbench supports Molang, &#039;&#039;&#039;Figura does not&#039;&#039;&#039;.&amp;lt;br/&amp;gt; To remedy this, Figura allows writing lua code into keyframe fields.&amp;lt;br/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Figura provides data for the keyframe expression, which is accessible via the &amp;lt;code&amp;gt;...&amp;lt;/code&amp;gt; variable.&lt;br /&gt;
&lt;br /&gt;
It has 2 pieces of data, the keyframe time, and the Animation object of the animation itself.&amp;lt;br/&amp;gt; Keyframe time is measured in percentage, not seconds. So, assuming a Step interpolation keyframe, &amp;lt;code&amp;gt;0&amp;lt;/code&amp;gt; is at the time at the keyframe itself and &amp;lt;code&amp;gt;1&amp;lt;/code&amp;gt; is at the next keyframe. Keyframe time is only useful when the keyframe uses Step interpolation.&amp;lt;br/&amp;gt;When using other interpolation types, the expression will execute before it has reached the keyframe itself to interpolate. While this happens, it will give the Keyframe time of the previous keyframe and go back to zero once it reaches itself.&lt;br /&gt;
&lt;br /&gt;
They can be extracted via the following line:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;lua&amp;quot;&amp;gt;local time, anim = ...&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Keyframe Expressions accept 2 different formats:&lt;br /&gt;
&lt;br /&gt;
* A single lua expression that evaluates to a number&lt;br /&gt;
* A lua script that &amp;lt;code&amp;gt;returns&amp;lt;/code&amp;gt; a number&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;math.sin(world.getTime())&amp;lt;/code&amp;gt; is a single lua expression, so it is a valid Keyframe Expression.&amp;lt;br/&amp;gt; However, &amp;lt;code&amp;gt;local _, anim=... math.sin(anim:getTime())&amp;lt;/code&amp;gt; is not a single lua expression and will need to have an explicit return value:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;lua&amp;quot;&amp;gt;local _, anim = ...&lt;br /&gt;
&lt;br /&gt;
return math.sin(anim:getTime())&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Alternatively, you can rewrite it as a single lua expression: &amp;lt;code&amp;gt;math.sin({...}[2]:getTime())&amp;lt;/code&amp;gt;&amp;lt;br/&amp;gt; This deconstructs the &amp;lt;code&amp;gt;...&amp;lt;/code&amp;gt; varargs into a table and grabs the second value.&lt;br /&gt;
&lt;br /&gt;
=== Instruction Keyframes ===&lt;br /&gt;
&lt;br /&gt;
Instruction Keyframes run lua code when the Animation reaches that keyframe. This can be used to play sounds, spawn particles, literally anything. Remember that Lua code is what goes in this spot, not Molang.&amp;lt;br/&amp;gt; You can access Instruction Keyframes via the Magic Wand icon. An Effects timeline should appear along with the other ModelPart timelines.&lt;br /&gt;
&lt;br /&gt;
=== Animation Features That Figura Does Not Care About ===&lt;br /&gt;
&lt;br /&gt;
Below are features provided by Blockbench Animations that figura does not use when loading the bbmodel.&amp;lt;br/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Variable Placeholders&#039;&#039;&#039;&amp;lt;br/&amp;gt; &amp;lt;img src={require(&amp;quot;@site/static/img/blockbench/animation_variableplaceholders.png&amp;quot;).default} width=&amp;quot;200&amp;quot;&amp;gt;&amp;lt;/img&amp;gt;&amp;lt;br/&amp;gt; This is completely ignored by Figura.&amp;lt;br/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Inverse Kinematics&#039;&#039;&#039;&amp;lt;br/&amp;gt; Don’t bother. Not a thing in Figura.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Global Rotation&#039;&#039;&#039;&amp;lt;br/&amp;gt; There is a toggle for Global Rotation next to the Rotation timeline for ModelParts. Figura does not obey this, so keep it disabled.&amp;lt;br/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Sound Keyframes&#039;&#039;&#039;&amp;lt;br/&amp;gt; Figura does not read these. Use [[#instruction-keyframes|Instruction Keyframes]].&amp;lt;br/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Particle Keyframes&#039;&#039;&#039;&amp;lt;br/&amp;gt; Figura does not read these. Use [[#instruction-keyframes|Instruction Keyframes]].&amp;lt;br/&amp;gt;&lt;/div&gt;</summary>
		<author><name>PoolloverNathan</name></author>
	</entry>
	<entry>
		<id>https://wiki.figuramc.org/index.php?title=Template:Nest&amp;diff=742</id>
		<title>Template:Nest</title>
		<link rel="alternate" type="text/html" href="https://wiki.figuramc.org/index.php?title=Template:Nest&amp;diff=742"/>
		<updated>2024-11-02T22:51:03Z</updated>

		<summary type="html">&lt;p&gt;PoolloverNathan: Created page with &amp;quot;&amp;lt;includeonly&amp;gt;{{{1}}}&amp;lt;/includeonly&amp;gt;&amp;lt;noinclude&amp;gt;Returns the argument unmodified, to fix parsing issues when nesting certain types of elements.&amp;lt;/noinclude&amp;gt;&amp;quot;&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&amp;lt;includeonly&amp;gt;{{{1}}}&amp;lt;/includeonly&amp;gt;&amp;lt;noinclude&amp;gt;Returns the argument unmodified, to fix parsing issues when nesting certain types of elements.&amp;lt;/noinclude&amp;gt;&lt;/div&gt;</summary>
		<author><name>PoolloverNathan</name></author>
	</entry>
	<entry>
		<id>https://wiki.figuramc.org/index.php?title=Template:Note&amp;diff=574</id>
		<title>Template:Note</title>
		<link rel="alternate" type="text/html" href="https://wiki.figuramc.org/index.php?title=Template:Note&amp;diff=574"/>
		<updated>2024-10-09T21:55:20Z</updated>

		<summary type="html">&lt;p&gt;PoolloverNathan: get template data&amp;#039;d&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&amp;lt;div style=&amp;quot;border-left: 6px solid {{{color|#5ea5ff}}}; border-radius: 6px; padding-left: 7.5px&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;div style=&amp;quot;color: {{{color|#5ea5ff}}}&amp;quot;&amp;gt;{{{icon|ⓘ}}} {{{tag|Note}}}&amp;lt;/div&amp;gt;&lt;br /&gt;
{{{1}}}&lt;br /&gt;
&amp;lt;/div&amp;gt;&amp;lt;noinclude&amp;gt;&lt;br /&gt;
&amp;lt;templatedata&amp;gt;&lt;br /&gt;
{&lt;br /&gt;
	&amp;quot;params&amp;quot;: {&lt;br /&gt;
		&amp;quot;1&amp;quot;: {&lt;br /&gt;
			&amp;quot;type&amp;quot;: &amp;quot;content&amp;quot;,&lt;br /&gt;
			&amp;quot;required&amp;quot;: true,&lt;br /&gt;
			&amp;quot;label&amp;quot;: &amp;quot;content&amp;quot;,&lt;br /&gt;
			&amp;quot;description&amp;quot;: &amp;quot;The text displayed in the note.&amp;quot;,&lt;br /&gt;
			&amp;quot;example&amp;quot;: &amp;quot;You should be aware of this.&amp;quot;&lt;br /&gt;
		},&lt;br /&gt;
		&amp;quot;color&amp;quot;: {&lt;br /&gt;
			&amp;quot;description&amp;quot;: &amp;quot;The color to use for the line and tag.&amp;quot;,&lt;br /&gt;
			&amp;quot;type&amp;quot;: &amp;quot;string&amp;quot;,&lt;br /&gt;
			&amp;quot;default&amp;quot;: &amp;quot;#5ea5ff&amp;quot;&lt;br /&gt;
		},&lt;br /&gt;
		&amp;quot;icon&amp;quot;: {&lt;br /&gt;
			&amp;quot;description&amp;quot;: &amp;quot;The symbol to display in the header.&amp;quot;,&lt;br /&gt;
			&amp;quot;example&amp;quot;: &amp;quot;⊗&amp;quot;,&lt;br /&gt;
			&amp;quot;type&amp;quot;: &amp;quot;string&amp;quot;,&lt;br /&gt;
			&amp;quot;default&amp;quot;: &amp;quot;ⓘ&amp;quot;&lt;br /&gt;
		},&lt;br /&gt;
		&amp;quot;tag&amp;quot;: {&lt;br /&gt;
			&amp;quot;description&amp;quot;: &amp;quot;The type of note to display.&amp;quot;,&lt;br /&gt;
			&amp;quot;example&amp;quot;: &amp;quot;Warning&amp;quot;,&lt;br /&gt;
			&amp;quot;type&amp;quot;: &amp;quot;string&amp;quot;,&lt;br /&gt;
			&amp;quot;default&amp;quot;: &amp;quot;Note&amp;quot;&lt;br /&gt;
		}&lt;br /&gt;
	},&lt;br /&gt;
	&amp;quot;description&amp;quot;: &amp;quot;Displays an indented note.&amp;quot;,&lt;br /&gt;
	&amp;quot;paramOrder&amp;quot;: [&lt;br /&gt;
		&amp;quot;1&amp;quot;,&lt;br /&gt;
		&amp;quot;icon&amp;quot;,&lt;br /&gt;
		&amp;quot;tag&amp;quot;,&lt;br /&gt;
		&amp;quot;color&amp;quot;&lt;br /&gt;
	],&lt;br /&gt;
	&amp;quot;format&amp;quot;: &amp;quot;block&amp;quot;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/templatedata&amp;gt;&lt;br /&gt;
&amp;lt;/noinclude&amp;gt;&lt;/div&gt;</summary>
		<author><name>PoolloverNathan</name></author>
	</entry>
	<entry>
		<id>https://wiki.figuramc.org/index.php?title=FiguraMC:Contributing/Style_Guide/TypeExample&amp;diff=573</id>
		<title>FiguraMC:Contributing/Style Guide/TypeExample</title>
		<link rel="alternate" type="text/html" href="https://wiki.figuramc.org/index.php?title=FiguraMC:Contributing/Style_Guide/TypeExample&amp;diff=573"/>
		<updated>2024-10-09T21:50:20Z</updated>

		<summary type="html">&lt;p&gt;PoolloverNathan: link to templates&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;= Page title = &amp;lt;!-- this one&#039;s just so that the transclusion looks like a full page --&amp;gt;&lt;br /&gt;
(Don&#039;t add an additional level-1 heading for the page title.)&lt;br /&gt;
&lt;br /&gt;
If necessary, use &amp;lt;code&amp;gt;&amp;lt;nowiki&amp;gt;{{&amp;lt;/nowiki&amp;gt;[[Template:host only|host only]]&amp;lt;nowiki&amp;gt;}}&amp;lt;/nowiki&amp;gt;&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;&amp;lt;nowiki&amp;gt;{{&amp;lt;/nowiki&amp;gt;[[Template:Notice|Notice]]|...&amp;lt;nowiki&amp;gt;}}&amp;lt;/nowiki&amp;gt;&amp;lt;/code&amp;gt;, or &amp;lt;code&amp;gt;&amp;lt;nowiki&amp;gt;{{&amp;lt;/nowiki&amp;gt;[[Template:Notice/Warning|Notice/Warning]]|...&amp;lt;nowiki&amp;gt;}}&amp;lt;/nowiki&amp;gt;&amp;lt;/code&amp;gt;. For example:&lt;br /&gt;
&lt;br /&gt;
{{host only|nocat=yes}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
(Important information about the type...)&lt;br /&gt;
&lt;br /&gt;
== Methods ==&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Method&lt;br /&gt;
! Brief description&lt;br /&gt;
|-&lt;br /&gt;
| [[#methodName|methodName]]&lt;br /&gt;
| description&lt;br /&gt;
|-&lt;br /&gt;
| [[#secondCategoryMethod|secondCategoryMethod]]&lt;br /&gt;
| Returns the position of the ModelPart as a {{type|Vector3}}&lt;br /&gt;
|}&lt;br /&gt;
== Fields ==&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Field&lt;br /&gt;
! Description&lt;br /&gt;
! Type&lt;br /&gt;
|-&lt;br /&gt;
| field&lt;br /&gt;
| Brief description&lt;br /&gt;
| {{type|type}}&lt;br /&gt;
|-&lt;br /&gt;
| TICK&lt;br /&gt;
| Runs every tick the player is rendered&lt;br /&gt;
| {{type|Event}}&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== Methods ==&lt;br /&gt;
=== Category ===&lt;br /&gt;
Brief description&lt;br /&gt;
==== methodName ====&lt;br /&gt;
----&lt;br /&gt;
Description&lt;br /&gt;
&lt;br /&gt;
Overloads:&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Arguments&lt;br /&gt;
! Return Type&lt;br /&gt;
|-&lt;br /&gt;
| pos {{Type|Vector3}}, name {{Type|string?}}&lt;br /&gt;
| {{Type|nil}}&lt;br /&gt;
|-&lt;br /&gt;
| x {{Type|number}}, y {{Type|number}}, z {{Type|number}}, name {{Type|string?}}&lt;br /&gt;
| {{Type|nil}}&lt;br /&gt;
|}&lt;br /&gt;
Description&lt;br /&gt;
&amp;lt;syntaxHighlight lang=&amp;quot;lua&amp;quot;&amp;gt;&lt;br /&gt;
-- Example Code&lt;br /&gt;
&amp;lt;/syntaxHighlight&amp;gt;&lt;br /&gt;
=== Category ===&lt;br /&gt;
Brief description&lt;br /&gt;
==== secondCategoryMethod ====&lt;br /&gt;
----&lt;br /&gt;
Description&lt;br /&gt;
&lt;br /&gt;
Overloads:&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Arguments&lt;br /&gt;
! Return Type&lt;br /&gt;
|-&lt;br /&gt;
| rotation {{Type|Vector3}}&lt;br /&gt;
| {{Type|nil}}&lt;br /&gt;
|-&lt;br /&gt;
| x {{Type|number}}, y {{Type|number}}, z {{Type|number}}&lt;br /&gt;
| {{Type|nil}}&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;syntaxHighlight lang=&amp;quot;lua&amp;quot;&amp;gt;&lt;br /&gt;
-- Example Code&lt;br /&gt;
&amp;lt;/syntaxHighlight&amp;gt;&lt;/div&gt;</summary>
		<author><name>PoolloverNathan</name></author>
	</entry>
	<entry>
		<id>https://wiki.figuramc.org/index.php?title=FiguraMC:Contributing/Style_Guide&amp;diff=572</id>
		<title>FiguraMC:Contributing/Style Guide</title>
		<link rel="alternate" type="text/html" href="https://wiki.figuramc.org/index.php?title=FiguraMC:Contributing/Style_Guide&amp;diff=572"/>
		<updated>2024-10-09T21:44:38Z</updated>

		<summary type="html">&lt;p&gt;PoolloverNathan: bunny, that was a subtle suggestion&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{Stub}}&lt;br /&gt;
== General Guidelines ==&lt;br /&gt;
* Avoid writing in the first/second person&lt;br /&gt;
** Only write in the second person in tutorials&lt;br /&gt;
** Avoid using [[wikipedia:English personal pronouns|personal pronouns]]&lt;br /&gt;
** See [[wikipedia:Grammatical person|Grammatical person]]&lt;br /&gt;
* Properly capitalize wikilinks where it makes sense&lt;br /&gt;
&lt;br /&gt;
== Types ==&lt;br /&gt;
When creating a type page, please use the following layout:&lt;br /&gt;
&lt;br /&gt;
{{VeryObviouslyTranscluded/2|FiguraMC:Contributing/Style Guide/TypeExample|TypeExample}}&lt;br /&gt;
&lt;br /&gt;
Each method in the table should link to the section more in-depth explaining it.&lt;/div&gt;</summary>
		<author><name>PoolloverNathan</name></author>
	</entry>
	<entry>
		<id>https://wiki.figuramc.org/index.php?title=LogTable&amp;diff=533</id>
		<title>LogTable</title>
		<link rel="alternate" type="text/html" href="https://wiki.figuramc.org/index.php?title=LogTable&amp;diff=533"/>
		<updated>2024-10-05T20:38:16Z</updated>

		<summary type="html">&lt;p&gt;PoolloverNathan: see previous edit&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;#REDIRECT [[PrintTable]]&lt;/div&gt;</summary>
		<author><name>PoolloverNathan</name></author>
	</entry>
	<entry>
		<id>https://wiki.figuramc.org/index.php?title=Log&amp;diff=532</id>
		<title>Log</title>
		<link rel="alternate" type="text/html" href="https://wiki.figuramc.org/index.php?title=Log&amp;diff=532"/>
		<updated>2024-10-05T20:35:28Z</updated>

		<summary type="html">&lt;p&gt;PoolloverNathan: ensure people attempting to access fallacious printing methods are redirected to the true form of printing&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;#REDIRECT [[print]]&lt;/div&gt;</summary>
		<author><name>PoolloverNathan</name></author>
	</entry>
	<entry>
		<id>https://wiki.figuramc.org/index.php?title=Community_Resources&amp;diff=531</id>
		<title>Community Resources</title>
		<link rel="alternate" type="text/html" href="https://wiki.figuramc.org/index.php?title=Community_Resources&amp;diff=531"/>
		<updated>2024-10-05T20:30:17Z</updated>

		<summary type="html">&lt;p&gt;PoolloverNathan: /* 4p5.nz 🛡️ */ unfuck sidebar&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{Notice/Warning&lt;br /&gt;
 |content=&#039;&#039;&#039;This page is heavily unfinished.&#039;&#039;&#039;&amp;lt;br&amp;gt;&lt;br /&gt;
Please wait before referring other people to this page. If you&#039;re able to, please [[FiguraMC:Contributing|contribute]]!&lt;br /&gt;
}}&lt;br /&gt;
{{Notice&lt;br /&gt;
 |content=&#039;&#039;&#039;Some of the resources listed here are not officially endorsed by FiguraMC.&#039;&#039;&#039;&amp;lt;br&amp;gt;&lt;br /&gt;
* Resources affiliated with FiguraMC will be marked as such with a ⭐ icon.&lt;br /&gt;
}}&lt;br /&gt;
= Documentation =&lt;br /&gt;
===&#039;&#039;&#039;[https://applejuiceyy.github.io/figs/ Figs]&#039;&#039;&#039;===&lt;br /&gt;
&#039;&#039;&#039;Figs&#039;&#039;&#039; is an online documentation browser for Figura, making using Figura&#039;s built-in documentation easier to use.&lt;br /&gt;
===&#039;&#039;&#039;[https://wiki.figuramc.org Figura Wiki]&#039;&#039;&#039; (YOU ARE HERE) ⭐===&lt;br /&gt;
The &#039;&#039;&#039;Figura Wiki&#039;&#039;&#039; is an online wiki that aims to document Figura, its scripting language, modeling, etc.&lt;br /&gt;
== Lua Documenation ==&lt;br /&gt;
===&#039;&#039;&#039;[https://manuel-3.github.io/lua-quickstart Lua Quickstart Guide]&#039;&#039;&#039;===&lt;br /&gt;
&#039;&#039;&#039;Manuel&#039;s Lua Quickstart Guide&#039;&#039;&#039; is a quick, online tutorial guiding users through the basics of Lua syntax.&lt;br /&gt;
===&#039;&#039;&#039;[http://lua.org/manual/5.1 Lua 5.1 Manual]&#039;&#039;&#039;===&lt;br /&gt;
The &#039;&#039;&#039;Lua Manual&#039;&#039;&#039; is a long document describing the ins and outs of vanilla Lua. Although some of it will not apply to Figura Lua, it&#039;s still very useful for learning about the standard libraries.&lt;br /&gt;
== Tutorials ==&lt;br /&gt;
===&#039;&#039;&#039;[https://www.youtube.com/playlist?list=PLNz7v2g2SFA8lOQUDS4z4-gIDLi_dWAhl Chloe&#039;s Video Tutorial Series]&#039;&#039;&#039;===&lt;br /&gt;
&#039;&#039;&#039;Chloe&#039;s Tutorial Series&#039;&#039;&#039; is a video series on YouTube that acts as a way for new users to get used to the mod. The series covers everything from modeling and modifying &amp;lt;code&amp;gt;avatar.json&amp;lt;/code&amp;gt; files to scripting.&lt;br /&gt;
= Tools =&lt;br /&gt;
===&#039;&#039;&#039;[https://github.com/GrandpaScout/FiguraRewriteVSDocs GS&#039; Figura VSCode Documentation]&#039;&#039;&#039;===&lt;br /&gt;
&#039;&#039;&#039;GrandpaScout&#039;s Figura VSCode Documentation&#039;&#039;&#039; is an addon for Visual Studio Code (along with Code OSS and VSCodium) that adds Figura&#039;s documentation and snippets to [https://marketplace.visualstudio.com/items?itemName=sumneko.lua sumneko&#039;s Lua Language Server plugin].&lt;br /&gt;
&amp;lt;div class=&amp;quot;mw-collapsible mw-collapsed&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;h4&amp;gt;&lt;br /&gt;
Additional Resources&lt;br /&gt;
&amp;lt;div class=&amp;quot;mw-collapsible-toggle-placeholder&amp;quot;&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;/h4&amp;gt;&lt;br /&gt;
&amp;lt;div class=&amp;quot;mw-collapsible-content&amp;quot;&amp;gt;&lt;br /&gt;
* [https://github.com/GrandpaScout/FiguraRewriteVSDocs/wiki Install Guide]&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
===&#039;&#039;&#039;[https://github.com/KitCat962/figura-format-bbplugin Katt&#039;s Figura Blockbench Extension]&#039;&#039;&#039;===&lt;br /&gt;
The &#039;&#039;&#039;Figura Blockbench Extension&#039;&#039;&#039; adds a new model format to Blockbench, the Figura Model format. It extends the base Generic Model format by adding tools to make the avatar creation process easier, lifting restrictions to the Generic Model format that Figura supports, and removing features Figura doesn&#039;t.&lt;br /&gt;
= Assets (Scripts, Libraries, APIs) =&lt;br /&gt;
{{Notice&lt;br /&gt;
 |content=&#039;&#039;&#039;Some assets only exist within the [https://discord.figuramc.org FiguraMC Discord].&#039;&#039;&#039;&amp;lt;br&amp;gt;&lt;br /&gt;
* Assets that link to the FiguraMC Discord will be marked with a 💬 icon.&lt;br /&gt;
}}&lt;br /&gt;
== Animation Helpers ==&lt;br /&gt;
===&#039;&#039;&#039;[https://github.com/GrandpaScout/GSAnimBlend GSAnimBlend]&#039;&#039;&#039;===&lt;br /&gt;
&#039;&#039;&#039;GSAnimBlend&#039;&#039;&#039; is a script that automatically adds blends to the start and end of animations.&lt;br /&gt;
===&#039;&#039;&#039;[https://github.com/JimmyHelp/JimmyAnims Jimmy&#039;s Animation Handler]&#039;&#039;&#039;===&lt;br /&gt;
&#039;&#039;&#039;JimmyAnim&#039;&#039;&#039; (full name Jimmy&#039;s Animation Helper) is a library that plays specific Blockbench animations based on the player&#039;s current action.&lt;br /&gt;
&amp;lt;div class=&amp;quot;mw-collapsible mw-collapsed&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;h4&amp;gt;&lt;br /&gt;
Additional Resources&lt;br /&gt;
&amp;lt;div class=&amp;quot;mw-collapsible-toggle-placeholder&amp;quot;&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;/h4&amp;gt;&lt;br /&gt;
&amp;lt;div class=&amp;quot;mw-collapsible-content&amp;quot;&amp;gt;&lt;br /&gt;
* [https://jimmyhelp.notion.site/JimmyAnims-79adfdca2fe04f9c9ede5e0bfd898b6a Documentation]&lt;br /&gt;
* [https://github.com/JimmyHelp/JimmyAnims/blob/main/JimmyExample.lua Example Usage]&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
== World Interactions==&lt;br /&gt;
===&#039;&#039;&#039;[https://discord.com/channels/1129805506354085959/1132467393050968214/1132467393050968214 Origins API]&#039;&#039;&#039; 💬===&lt;br /&gt;
Katt&#039;s &#039;&#039;&#039;Origins API&#039;&#039;&#039; is an API that uses the player&#039;s NBT data to get information about the player&#039;s [https://modrinth.com/mod/origins Origin].&lt;br /&gt;
==Visual Elements==&lt;br /&gt;
===&#039;&#039;&#039;[https://github.com/Manuel-3/figura-scripts/tree/main/src/confetti Confetti]&#039;&#039;&#039;===&lt;br /&gt;
&#039;&#039;&#039;Confetti&#039;&#039;&#039; is a library that allows users to add custom particles, either sprite or modelpart, to their avatars&lt;br /&gt;
&amp;lt;div class=&amp;quot;mw-collapsible mw-collapsed&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;h4&amp;gt;&lt;br /&gt;
Additional Resources&lt;br /&gt;
&amp;lt;div class=&amp;quot;mw-collapsible-toggle-placeholder&amp;quot;&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;/h4&amp;gt;&lt;br /&gt;
&amp;lt;div class=&amp;quot;mw-collapsible-content&amp;quot;&amp;gt;&lt;br /&gt;
* [https://github.com/Manuel-3/figura-scripts/blob/main/src/confetti/readme.md Documentation]&lt;br /&gt;
* [https://github.com/Manuel-3/figura-scripts/blob/main/src/confetti/example.zip Example Avatar]&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
===&#039;&#039;&#039;[https://discord.com/channels/1129805506354085959/1137506926742216835 KattArmor]&#039;&#039;&#039; 💬===&lt;br /&gt;
&#039;&#039;&#039;KattArmor&#039;&#039;&#039; (sometimes called Katt Armor API/Library) is a library that allows users to edit their avatar&#039;s armor, whether by adding pivots using a script or by using unique models and textures.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div class=&amp;quot;mw-collapsible mw-collapsed&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;h4&amp;gt;&lt;br /&gt;
Additional Resources&lt;br /&gt;
&amp;lt;div class=&amp;quot;mw-collapsible-toggle-placeholder&amp;quot;&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;/h4&amp;gt;&lt;br /&gt;
&amp;lt;div class=&amp;quot;mw-collapsible-content&amp;quot;&amp;gt;&lt;br /&gt;
* [https://discord.com/channels/1129805506354085959/1137506926742216835/1155212562980425818 How-To Guide]&lt;br /&gt;
* [https://discord.com/channels/1129805506354085959/1137506926742216835/1262160359905562705 Example Avatars]&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
= Community =&lt;br /&gt;
===&#039;&#039;&#039;[https://discord.figuramc.org FiguraMC Discord]&#039;&#039;&#039; ⭐===&lt;br /&gt;
The &#039;&#039;&#039;FiguraMC Discord Server&#039;&#039;&#039; is the central place for everything Figura, including help and support for the mod, avatar showcasing, and more. You&#039;ll also need to join this server to request whitelist to the FiguraSMP.&lt;br /&gt;
== Minecraft Servers ==&lt;br /&gt;
{{Notice&lt;br /&gt;
 |content=&#039;&#039;&#039;Some servers listed below are whitelisted.&#039;&#039;&#039;&amp;lt;br&amp;gt;&lt;br /&gt;
* Servers that have a public whitelist application process will be marked with a 🔒 icon.&lt;br /&gt;
* Servers that are invite-only will be marked with a 🛡️ icon.&lt;br /&gt;
}}&lt;br /&gt;
=== Figura Plaza ⭐ ===&lt;br /&gt;
&#039;&#039;&#039;IP:&amp;amp;nbsp;&amp;lt;span style=&amp;quot;user-select: all&amp;quot;&amp;gt;plaza.figuramc.org&amp;lt;/span&amp;gt;&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
The &#039;&#039;&#039;Figura Plaza&#039;&#039;&#039; is an official lobby-like server where players can join, hang out with other Figura users, make avatars in company, play games, and occasionally attend events. The server does not have any survival gameplay, and disables PvP by default. The server also provides a selection of free temporary items to use when testing avatars.&lt;br /&gt;
&lt;br /&gt;
=== Figura SMP ⭐🔒 ===&lt;br /&gt;
&#039;&#039;&#039;IP:&amp;amp;nbsp;&amp;lt;span style=&amp;quot;user-select: all&amp;quot;&amp;gt;vanilla.figuramc.org&amp;lt;/span&amp;gt;&#039;&#039;&#039; &amp;amp;bull; &#039;&#039;&#039;Version:&amp;amp;nbsp;1.21&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
The &#039;&#039;&#039;Figura SMP&#039;&#039;&#039; (also referred to as Vanilla SMP) is an official survial server that stays close to the base game, plus a few server-side mods for quality-of-life purposes. You are perfectly able to join this server without any mods, and even on a vanilla client. You can read the server rules in [https://discord.com/channels/1129805506354085959/1130186794873405510 #info] and get whitelisted by putting your name in [https://discord.com/channels/1129805506354085959/1130187119680311470 #whitelist]. note that both of these channel links require you to be in [https://discord.figuramc.org the official Discord server for Figura].&lt;br /&gt;
&lt;br /&gt;
==== Modded SMP ====&lt;br /&gt;
&#039;&#039;&#039;IP:&amp;amp;nbsp;&amp;lt;span style=&amp;quot;user-select: none&amp;quot;&amp;gt;[TBD]&amp;lt;/span&amp;gt;&#039;&#039;&#039; &amp;amp;bull; &#039;&#039;&#039;Version:&amp;amp;nbsp;1.20.1-fabric&#039;&#039;&#039; &amp;amp;bull; &#039;&#039;&#039;Modpack:&amp;amp;nbsp;&amp;lt;span style=&amp;quot;user-select: none&amp;quot;&amp;gt;[TBD]&amp;lt;/span&amp;gt;&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
The &#039;&#039;&#039;Modded SMP&#039;&#039;&#039; is a seasonal modpack server adjacent to Figura SMP, each season coming with its own theme. &#039;&#039;&#039;Currently offline.&#039;&#039;&#039; The next season is themed after a nuclear apocalypse and is set for release Soon™. Getting whitelisted for Figura SMP also makes you whitelisted for this server (and vice versa).&lt;br /&gt;
&lt;br /&gt;
=== 4p5.nz 🛡️ ===&lt;br /&gt;
&#039;&#039;&#039;IP:&amp;amp;nbsp;&amp;lt;span style=&amp;quot;user-select: all&amp;quot;&amp;gt;4p5.nz&amp;lt;/span&amp;gt;&#039;&#039;&#039; &amp;amp;bull; &#039;&#039;&#039;Version:&amp;amp;nbsp;1.21&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;4p5.nz&#039;&#039;&#039; is an invite-only creative/operator server where players have free reign over the world around them.&lt;/div&gt;</summary>
		<author><name>PoolloverNathan</name></author>
	</entry>
	<entry>
		<id>https://wiki.figuramc.org/index.php?title=Community_Resources&amp;diff=530</id>
		<title>Community Resources</title>
		<link rel="alternate" type="text/html" href="https://wiki.figuramc.org/index.php?title=Community_Resources&amp;diff=530"/>
		<updated>2024-10-05T20:28:42Z</updated>

		<summary type="html">&lt;p&gt;PoolloverNathan: /* Minecraft Servers */ minor spelling mistake&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{Notice/Warning&lt;br /&gt;
 |content=&#039;&#039;&#039;This page is heavily unfinished.&#039;&#039;&#039;&amp;lt;br&amp;gt;&lt;br /&gt;
Please wait before referring other people to this page. If you&#039;re able to, please [[FiguraMC:Contributing|contribute]]!&lt;br /&gt;
}}&lt;br /&gt;
{{Notice&lt;br /&gt;
 |content=&#039;&#039;&#039;Some of the resources listed here are not officially endorsed by FiguraMC.&#039;&#039;&#039;&amp;lt;br&amp;gt;&lt;br /&gt;
* Resources affiliated with FiguraMC will be marked as such with a ⭐ icon.&lt;br /&gt;
}}&lt;br /&gt;
= Documentation =&lt;br /&gt;
===&#039;&#039;&#039;[https://applejuiceyy.github.io/figs/ Figs]&#039;&#039;&#039;===&lt;br /&gt;
&#039;&#039;&#039;Figs&#039;&#039;&#039; is an online documentation browser for Figura, making using Figura&#039;s built-in documentation easier to use.&lt;br /&gt;
===&#039;&#039;&#039;[https://wiki.figuramc.org Figura Wiki]&#039;&#039;&#039; (YOU ARE HERE) ⭐===&lt;br /&gt;
The &#039;&#039;&#039;Figura Wiki&#039;&#039;&#039; is an online wiki that aims to document Figura, its scripting language, modeling, etc.&lt;br /&gt;
== Lua Documenation ==&lt;br /&gt;
===&#039;&#039;&#039;[https://manuel-3.github.io/lua-quickstart Lua Quickstart Guide]&#039;&#039;&#039;===&lt;br /&gt;
&#039;&#039;&#039;Manuel&#039;s Lua Quickstart Guide&#039;&#039;&#039; is a quick, online tutorial guiding users through the basics of Lua syntax.&lt;br /&gt;
===&#039;&#039;&#039;[http://lua.org/manual/5.1 Lua 5.1 Manual]&#039;&#039;&#039;===&lt;br /&gt;
The &#039;&#039;&#039;Lua Manual&#039;&#039;&#039; is a long document describing the ins and outs of vanilla Lua. Although some of it will not apply to Figura Lua, it&#039;s still very useful for learning about the standard libraries.&lt;br /&gt;
== Tutorials ==&lt;br /&gt;
===&#039;&#039;&#039;[https://www.youtube.com/playlist?list=PLNz7v2g2SFA8lOQUDS4z4-gIDLi_dWAhl Chloe&#039;s Video Tutorial Series]&#039;&#039;&#039;===&lt;br /&gt;
&#039;&#039;&#039;Chloe&#039;s Tutorial Series&#039;&#039;&#039; is a video series on YouTube that acts as a way for new users to get used to the mod. The series covers everything from modeling and modifying &amp;lt;code&amp;gt;avatar.json&amp;lt;/code&amp;gt; files to scripting.&lt;br /&gt;
= Tools =&lt;br /&gt;
===&#039;&#039;&#039;[https://github.com/GrandpaScout/FiguraRewriteVSDocs GS&#039; Figura VSCode Documentation]&#039;&#039;&#039;===&lt;br /&gt;
&#039;&#039;&#039;GrandpaScout&#039;s Figura VSCode Documentation&#039;&#039;&#039; is an addon for Visual Studio Code (along with Code OSS and VSCodium) that adds Figura&#039;s documentation and snippets to [https://marketplace.visualstudio.com/items?itemName=sumneko.lua sumneko&#039;s Lua Language Server plugin].&lt;br /&gt;
&amp;lt;div class=&amp;quot;mw-collapsible mw-collapsed&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;h4&amp;gt;&lt;br /&gt;
Additional Resources&lt;br /&gt;
&amp;lt;div class=&amp;quot;mw-collapsible-toggle-placeholder&amp;quot;&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;/h4&amp;gt;&lt;br /&gt;
&amp;lt;div class=&amp;quot;mw-collapsible-content&amp;quot;&amp;gt;&lt;br /&gt;
* [https://github.com/GrandpaScout/FiguraRewriteVSDocs/wiki Install Guide]&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
===&#039;&#039;&#039;[https://github.com/KitCat962/figura-format-bbplugin Katt&#039;s Figura Blockbench Extension]&#039;&#039;&#039;===&lt;br /&gt;
The &#039;&#039;&#039;Figura Blockbench Extension&#039;&#039;&#039; adds a new model format to Blockbench, the Figura Model format. It extends the base Generic Model format by adding tools to make the avatar creation process easier, lifting restrictions to the Generic Model format that Figura supports, and removing features Figura doesn&#039;t.&lt;br /&gt;
= Assets (Scripts, Libraries, APIs) =&lt;br /&gt;
{{Notice&lt;br /&gt;
 |content=&#039;&#039;&#039;Some assets only exist within the [https://discord.figuramc.org FiguraMC Discord].&#039;&#039;&#039;&amp;lt;br&amp;gt;&lt;br /&gt;
* Assets that link to the FiguraMC Discord will be marked with a 💬 icon.&lt;br /&gt;
}}&lt;br /&gt;
== Animation Helpers ==&lt;br /&gt;
===&#039;&#039;&#039;[https://github.com/GrandpaScout/GSAnimBlend GSAnimBlend]&#039;&#039;&#039;===&lt;br /&gt;
&#039;&#039;&#039;GSAnimBlend&#039;&#039;&#039; is a script that automatically adds blends to the start and end of animations.&lt;br /&gt;
===&#039;&#039;&#039;[https://github.com/JimmyHelp/JimmyAnims Jimmy&#039;s Animation Handler]&#039;&#039;&#039;===&lt;br /&gt;
&#039;&#039;&#039;JimmyAnim&#039;&#039;&#039; (full name Jimmy&#039;s Animation Helper) is a library that plays specific Blockbench animations based on the player&#039;s current action.&lt;br /&gt;
&amp;lt;div class=&amp;quot;mw-collapsible mw-collapsed&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;h4&amp;gt;&lt;br /&gt;
Additional Resources&lt;br /&gt;
&amp;lt;div class=&amp;quot;mw-collapsible-toggle-placeholder&amp;quot;&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;/h4&amp;gt;&lt;br /&gt;
&amp;lt;div class=&amp;quot;mw-collapsible-content&amp;quot;&amp;gt;&lt;br /&gt;
* [https://jimmyhelp.notion.site/JimmyAnims-79adfdca2fe04f9c9ede5e0bfd898b6a Documentation]&lt;br /&gt;
* [https://github.com/JimmyHelp/JimmyAnims/blob/main/JimmyExample.lua Example Usage]&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
== World Interactions==&lt;br /&gt;
===&#039;&#039;&#039;[https://discord.com/channels/1129805506354085959/1132467393050968214/1132467393050968214 Origins API]&#039;&#039;&#039; 💬===&lt;br /&gt;
Katt&#039;s &#039;&#039;&#039;Origins API&#039;&#039;&#039; is an API that uses the player&#039;s NBT data to get information about the player&#039;s [https://modrinth.com/mod/origins Origin].&lt;br /&gt;
==Visual Elements==&lt;br /&gt;
===&#039;&#039;&#039;[https://github.com/Manuel-3/figura-scripts/tree/main/src/confetti Confetti]&#039;&#039;&#039;===&lt;br /&gt;
&#039;&#039;&#039;Confetti&#039;&#039;&#039; is a library that allows users to add custom particles, either sprite or modelpart, to their avatars&lt;br /&gt;
&amp;lt;div class=&amp;quot;mw-collapsible mw-collapsed&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;h4&amp;gt;&lt;br /&gt;
Additional Resources&lt;br /&gt;
&amp;lt;div class=&amp;quot;mw-collapsible-toggle-placeholder&amp;quot;&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;/h4&amp;gt;&lt;br /&gt;
&amp;lt;div class=&amp;quot;mw-collapsible-content&amp;quot;&amp;gt;&lt;br /&gt;
* [https://github.com/Manuel-3/figura-scripts/blob/main/src/confetti/readme.md Documentation]&lt;br /&gt;
* [https://github.com/Manuel-3/figura-scripts/blob/main/src/confetti/example.zip Example Avatar]&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
===&#039;&#039;&#039;[https://discord.com/channels/1129805506354085959/1137506926742216835 KattArmor]&#039;&#039;&#039; 💬===&lt;br /&gt;
&#039;&#039;&#039;KattArmor&#039;&#039;&#039; (sometimes called Katt Armor API/Library) is a library that allows users to edit their avatar&#039;s armor, whether by adding pivots using a script or by using unique models and textures.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div class=&amp;quot;mw-collapsible mw-collapsed&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;h4&amp;gt;&lt;br /&gt;
Additional Resources&lt;br /&gt;
&amp;lt;div class=&amp;quot;mw-collapsible-toggle-placeholder&amp;quot;&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;/h4&amp;gt;&lt;br /&gt;
&amp;lt;div class=&amp;quot;mw-collapsible-content&amp;quot;&amp;gt;&lt;br /&gt;
* [https://discord.com/channels/1129805506354085959/1137506926742216835/1155212562980425818 How-To Guide]&lt;br /&gt;
* [https://discord.com/channels/1129805506354085959/1137506926742216835/1262160359905562705 Example Avatars]&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
= Community =&lt;br /&gt;
===&#039;&#039;&#039;[https://discord.figuramc.org FiguraMC Discord]&#039;&#039;&#039; ⭐===&lt;br /&gt;
The &#039;&#039;&#039;FiguraMC Discord Server&#039;&#039;&#039; is the central place for everything Figura, including help and support for the mod, avatar showcasing, and more. You&#039;ll also need to join this server to request whitelist to the FiguraSMP.&lt;br /&gt;
== Minecraft Servers ==&lt;br /&gt;
{{Notice&lt;br /&gt;
 |content=&#039;&#039;&#039;Some servers listed below are whitelisted.&#039;&#039;&#039;&amp;lt;br&amp;gt;&lt;br /&gt;
* Servers that have a public whitelist application process will be marked with a 🔒 icon.&lt;br /&gt;
* Servers that are invite-only will be marked with a 🛡️ icon.&lt;br /&gt;
}}&lt;br /&gt;
=== Figura Plaza ⭐ ===&lt;br /&gt;
&#039;&#039;&#039;IP:&amp;amp;nbsp;&amp;lt;span style=&amp;quot;user-select: all&amp;quot;&amp;gt;plaza.figuramc.org&amp;lt;/span&amp;gt;&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
The &#039;&#039;&#039;Figura Plaza&#039;&#039;&#039; is an official lobby-like server where players can join, hang out with other Figura users, make avatars in company, play games, and occasionally attend events. The server does not have any survival gameplay, and disables PvP by default. The server also provides a selection of free temporary items to use when testing avatars.&lt;br /&gt;
&lt;br /&gt;
=== Figura SMP ⭐🔒 ===&lt;br /&gt;
&#039;&#039;&#039;IP:&amp;amp;nbsp;&amp;lt;span style=&amp;quot;user-select: all&amp;quot;&amp;gt;vanilla.figuramc.org&amp;lt;/span&amp;gt;&#039;&#039;&#039; &amp;amp;bull; &#039;&#039;&#039;Version:&amp;amp;nbsp;1.21&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
The &#039;&#039;&#039;Figura SMP&#039;&#039;&#039; (also referred to as Vanilla SMP) is an official survial server that stays close to the base game, plus a few server-side mods for quality-of-life purposes. You are perfectly able to join this server without any mods, and even on a vanilla client. You can read the server rules in [https://discord.com/channels/1129805506354085959/1130186794873405510 #info] and get whitelisted by putting your name in [https://discord.com/channels/1129805506354085959/1130187119680311470 #whitelist]. note that both of these channel links require you to be in [https://discord.figuramc.org the official Discord server for Figura].&lt;br /&gt;
&lt;br /&gt;
==== Modded SMP ====&lt;br /&gt;
&#039;&#039;&#039;IP:&amp;amp;nbsp;&amp;lt;span style=&amp;quot;user-select: none&amp;quot;&amp;gt;[TBD]&amp;lt;/span&amp;gt;&#039;&#039;&#039; &amp;amp;bull; &#039;&#039;&#039;Version:&amp;amp;nbsp;1.20.1-fabric&#039;&#039;&#039; &amp;amp;bull; &#039;&#039;&#039;Modpack:&amp;amp;nbsp;&amp;lt;span style=&amp;quot;user-select: none&amp;quot;&amp;gt;[TBD]&amp;lt;/span&amp;gt;&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
The &#039;&#039;&#039;Modded SMP&#039;&#039;&#039; is a seasonal modpack server adjacent to Figura SMP, each season coming with its own theme. &#039;&#039;&#039;Currently offline.&#039;&#039;&#039; The next season is themed after a nuclear apocalypse and is set for release Soon™. Getting whitelisted for Figura SMP also makes you whitelisted for this server (and vice versa).&lt;br /&gt;
&lt;br /&gt;
=== &#039;&#039;&#039;4p5.nz&#039;&#039;&#039; 🛡️ ===&lt;br /&gt;
&#039;&#039;&#039;IP:&amp;amp;nbsp;&amp;lt;span style=&amp;quot;user-select: all&amp;quot;&amp;gt;4p5.nz&amp;lt;/span&amp;gt;&#039;&#039;&#039; &amp;amp;bull; &#039;&#039;&#039;Version:&amp;amp;nbsp;1.21&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;4p5.nz&#039;&#039;&#039; is an invite-only creative/operator server where players have free reign over the world around them.&lt;/div&gt;</summary>
		<author><name>PoolloverNathan</name></author>
	</entry>
	<entry>
		<id>https://wiki.figuramc.org/index.php?title=Community_Resources&amp;diff=528</id>
		<title>Community Resources</title>
		<link rel="alternate" type="text/html" href="https://wiki.figuramc.org/index.php?title=Community_Resources&amp;diff=528"/>
		<updated>2024-10-05T20:25:46Z</updated>

		<summary type="html">&lt;p&gt;PoolloverNathan: /* Minecraft Servers */ reformatting&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{Notice/Warning&lt;br /&gt;
 |content=&#039;&#039;&#039;This page is heavily unfinished.&#039;&#039;&#039;&amp;lt;br&amp;gt;&lt;br /&gt;
Please wait before referring other people to this page. If you&#039;re able to, please [[FiguraMC:Contributing|contribute]]!&lt;br /&gt;
}}&lt;br /&gt;
{{Notice&lt;br /&gt;
 |content=&#039;&#039;&#039;Some of the resources listed here are not officially endorsed by FiguraMC.&#039;&#039;&#039;&amp;lt;br&amp;gt;&lt;br /&gt;
* Resources affiliated with FiguraMC will be marked as such with a ⭐ icon.&lt;br /&gt;
}}&lt;br /&gt;
= Documentation =&lt;br /&gt;
===&#039;&#039;&#039;[https://applejuiceyy.github.io/figs/ Figs]&#039;&#039;&#039;===&lt;br /&gt;
&#039;&#039;&#039;Figs&#039;&#039;&#039; is an online documentation browser for Figura, making using Figura&#039;s built-in documentation easier to use.&lt;br /&gt;
===&#039;&#039;&#039;[https://wiki.figuramc.org Figura Wiki]&#039;&#039;&#039; (YOU ARE HERE) ⭐===&lt;br /&gt;
The &#039;&#039;&#039;Figura Wiki&#039;&#039;&#039; is an online wiki that aims to document Figura, its scripting language, modeling, etc.&lt;br /&gt;
== Lua Documenation ==&lt;br /&gt;
===&#039;&#039;&#039;[https://manuel-3.github.io/lua-quickstart Lua Quickstart Guide]&#039;&#039;&#039;===&lt;br /&gt;
&#039;&#039;&#039;Manuel&#039;s Lua Quickstart Guide&#039;&#039;&#039; is a quick, online tutorial guiding users through the basics of Lua syntax.&lt;br /&gt;
===&#039;&#039;&#039;[http://lua.org/manual/5.1 Lua 5.1 Manual]&#039;&#039;&#039;===&lt;br /&gt;
The &#039;&#039;&#039;Lua Manual&#039;&#039;&#039; is a long document describing the ins and outs of vanilla Lua. Although some of it will not apply to Figura Lua, it&#039;s still very useful for learning about the standard libraries.&lt;br /&gt;
== Tutorials ==&lt;br /&gt;
===&#039;&#039;&#039;[https://www.youtube.com/playlist?list=PLNz7v2g2SFA8lOQUDS4z4-gIDLi_dWAhl Chloe&#039;s Video Tutorial Series]&#039;&#039;&#039;===&lt;br /&gt;
&#039;&#039;&#039;Chloe&#039;s Tutorial Series&#039;&#039;&#039; is a video series on YouTube that acts as a way for new users to get used to the mod. The series covers everything from modeling and modifying &amp;lt;code&amp;gt;avatar.json&amp;lt;/code&amp;gt; files to scripting.&lt;br /&gt;
= Tools =&lt;br /&gt;
===&#039;&#039;&#039;[https://github.com/GrandpaScout/FiguraRewriteVSDocs GS&#039; Figura VSCode Documentation]&#039;&#039;&#039;===&lt;br /&gt;
&#039;&#039;&#039;GrandpaScout&#039;s Figura VSCode Documentation&#039;&#039;&#039; is an addon for Visual Studio Code (along with Code OSS and VSCodium) that adds Figura&#039;s documentation and snippets to [https://marketplace.visualstudio.com/items?itemName=sumneko.lua sumneko&#039;s Lua Language Server plugin].&lt;br /&gt;
&amp;lt;div class=&amp;quot;mw-collapsible mw-collapsed&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;h4&amp;gt;&lt;br /&gt;
Additional Resources&lt;br /&gt;
&amp;lt;div class=&amp;quot;mw-collapsible-toggle-placeholder&amp;quot;&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;/h4&amp;gt;&lt;br /&gt;
&amp;lt;div class=&amp;quot;mw-collapsible-content&amp;quot;&amp;gt;&lt;br /&gt;
* [https://github.com/GrandpaScout/FiguraRewriteVSDocs/wiki Install Guide]&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
===&#039;&#039;&#039;[https://github.com/KitCat962/figura-format-bbplugin Katt&#039;s Figura Blockbench Extension]&#039;&#039;&#039;===&lt;br /&gt;
The &#039;&#039;&#039;Figura Blockbench Extension&#039;&#039;&#039; adds a new model format to Blockbench, the Figura Model format. It extends the base Generic Model format by adding tools to make the avatar creation process easier, lifting restrictions to the Generic Model format that Figura supports, and removing features Figura doesn&#039;t.&lt;br /&gt;
= Assets (Scripts, Libraries, APIs) =&lt;br /&gt;
{{Notice&lt;br /&gt;
 |content=&#039;&#039;&#039;Some assets only exist within the [https://discord.figuramc.org FiguraMC Discord].&#039;&#039;&#039;&amp;lt;br&amp;gt;&lt;br /&gt;
* Assets that link to the FiguraMC Discord will be marked with a 💬 icon.&lt;br /&gt;
}}&lt;br /&gt;
== Animation Helpers ==&lt;br /&gt;
===&#039;&#039;&#039;[https://github.com/GrandpaScout/GSAnimBlend GSAnimBlend]&#039;&#039;&#039;===&lt;br /&gt;
&#039;&#039;&#039;GSAnimBlend&#039;&#039;&#039; is a script that automatically adds blends to the start and end of animations.&lt;br /&gt;
===&#039;&#039;&#039;[https://github.com/JimmyHelp/JimmyAnims Jimmy&#039;s Animation Handler]&#039;&#039;&#039;===&lt;br /&gt;
&#039;&#039;&#039;JimmyAnim&#039;&#039;&#039; (full name Jimmy&#039;s Animation Helper) is a library that plays specific Blockbench animations based on the player&#039;s current action.&lt;br /&gt;
&amp;lt;div class=&amp;quot;mw-collapsible mw-collapsed&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;h4&amp;gt;&lt;br /&gt;
Additional Resources&lt;br /&gt;
&amp;lt;div class=&amp;quot;mw-collapsible-toggle-placeholder&amp;quot;&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;/h4&amp;gt;&lt;br /&gt;
&amp;lt;div class=&amp;quot;mw-collapsible-content&amp;quot;&amp;gt;&lt;br /&gt;
* [https://jimmyhelp.notion.site/JimmyAnims-79adfdca2fe04f9c9ede5e0bfd898b6a Documentation]&lt;br /&gt;
* [https://github.com/JimmyHelp/JimmyAnims/blob/main/JimmyExample.lua Example Usage]&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
==Visual Elements==&lt;br /&gt;
===&#039;&#039;&#039;[https://github.com/Manuel-3/figura-scripts/tree/main/src/confetti Confetti]&#039;&#039;&#039;===&lt;br /&gt;
&#039;&#039;&#039;Confetti&#039;&#039;&#039; is a library that allows users to add custom particles, either sprite or modelpart, to their avatars&lt;br /&gt;
&amp;lt;div class=&amp;quot;mw-collapsible mw-collapsed&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;h4&amp;gt;&lt;br /&gt;
Additional Resources&lt;br /&gt;
&amp;lt;div class=&amp;quot;mw-collapsible-toggle-placeholder&amp;quot;&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;/h4&amp;gt;&lt;br /&gt;
&amp;lt;div class=&amp;quot;mw-collapsible-content&amp;quot;&amp;gt;&lt;br /&gt;
* [https://github.com/Manuel-3/figura-scripts/blob/main/src/confetti/readme.md Documentation]&lt;br /&gt;
* [https://github.com/Manuel-3/figura-scripts/blob/main/src/confetti/example.zip Example Avatar]&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
===&#039;&#039;&#039;[https://discord.com/channels/1129805506354085959/1137506926742216835 KattArmor]&#039;&#039;&#039; 💬===&lt;br /&gt;
&#039;&#039;&#039;KattArmor&#039;&#039;&#039; (sometimes called Katt Armor API/Library) is a library that allows users to edit their avatar&#039;s armor, whether by adding pivots using a script or by using unique models and textures.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div class=&amp;quot;mw-collapsible mw-collapsed&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;h4&amp;gt;&lt;br /&gt;
Additional Resources&lt;br /&gt;
&amp;lt;div class=&amp;quot;mw-collapsible-toggle-placeholder&amp;quot;&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;/h4&amp;gt;&lt;br /&gt;
&amp;lt;div class=&amp;quot;mw-collapsible-content&amp;quot;&amp;gt;&lt;br /&gt;
* [https://discord.com/channels/1129805506354085959/1137506926742216835/1155212562980425818 How-To Guide]&lt;br /&gt;
* [https://discord.com/channels/1129805506354085959/1137506926742216835/1262160359905562705 Example Avatars]&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
= Community =&lt;br /&gt;
===&#039;&#039;&#039;[https://discord.figuramc.org FiguraMC Discord]&#039;&#039;&#039; ⭐===&lt;br /&gt;
The &#039;&#039;&#039;FiguraMC Discord Server&#039;&#039;&#039; is the central place for everything Figura, including help and support for the mod, avatar showcasing, and more. You&#039;ll also need to join this server to request whitelist to the FiguraSMP.&lt;br /&gt;
== Minecraft Servers ==&lt;br /&gt;
{{Notice&lt;br /&gt;
 |content=&#039;&#039;&#039;Some servers listed below are whitelisted.&#039;&#039;&#039;&amp;lt;br&amp;gt;&lt;br /&gt;
* Servers that have a public whitelist application process will be marked with a 🔒 icon.&lt;br /&gt;
* Servers that are invite-only will be marked with a 🛡️ icon.&lt;br /&gt;
}}&lt;br /&gt;
=== Figura Plaza ⭐ ===&lt;br /&gt;
&#039;&#039;&#039;IP:&amp;amp;nbsp;&amp;lt;span style=&amp;quot;user-select: all&amp;quot;&amp;gt;plaza.figuramc.org&amp;lt;/span&amp;gt;&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
The &#039;&#039;&#039;Figura Plaza&#039;&#039;&#039; is an official lobby-like server where players can join, hang out with other Figura users, make avatars in company, play games, and occasionally attend events. The server does not have any survival gameplay, and disables PvP by default. The server also provides a selection of free temporary items to use when testing avatars.&lt;br /&gt;
&lt;br /&gt;
=== Figura SMP ⭐🔒 ===&lt;br /&gt;
&#039;&#039;&#039;IP:&amp;amp;nbsp;&amp;lt;span style=&amp;quot;user-select: all&amp;quot;&amp;gt;vanilla.figuramc.org&amp;lt;/span&amp;gt;&#039;&#039;&#039; &amp;amp;bull; &#039;&#039;&#039;Version:&amp;amp;nbsp;1.21&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
The &#039;&#039;&#039;Figura SMP&#039;&#039;&#039; (also referred to as Vanilla SMP) is an official survial server that stays close to the base game, plus a few server-side mods for quality-of-life purposes. You are perfectly able to join this server without any mods, and even on a vanilla client. You can read the server rules in [https://discord.com/channels/1129805506354085959/1130186794873405510 #info] and get whitelisted by putting your name in &amp;lt;sub&amp;gt;Subscript text&amp;lt;/sub&amp;gt;[https://discord.com/channels/1129805506354085959/1130187119680311470 #whitelist]. note that both of these channel links require you to be in [https://discord.figuramc.org the official Discord server for Figura].&lt;br /&gt;
&lt;br /&gt;
==== Modded SMP ====&lt;br /&gt;
&#039;&#039;&#039;IP:&amp;amp;nbsp;&amp;lt;span style=&amp;quot;user-select: none&amp;quot;&amp;gt;[TBD]&amp;lt;/span&amp;gt;&#039;&#039;&#039; &amp;amp;bull; &#039;&#039;&#039;Version:&amp;amp;nbsp;1.20.1-fabric&#039;&#039;&#039; &amp;amp;bull; &#039;&#039;&#039;Modpack:&amp;amp;nbsp;&amp;lt;span style=&amp;quot;user-select: none&amp;quot;&amp;gt;[TBD]&amp;lt;/span&amp;gt;&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
The &#039;&#039;&#039;Modded SMP&#039;&#039;&#039; is a seasonal modpack server adjacent to Figura SMP, each season coming with its own theme. &#039;&#039;&#039;Currently offline.&#039;&#039;&#039; The next season is themed after a nuclear apocalypse and is set for release Soon™. Getting whitelisted for Figura SMP also makes you whitelisted for this server (and vice versa).&lt;br /&gt;
&lt;br /&gt;
=== &#039;&#039;&#039;4p5.nz&#039;&#039;&#039; 🛡️ ===&lt;br /&gt;
&#039;&#039;&#039;IP:&amp;amp;nbsp;&amp;lt;span style=&amp;quot;user-select: all&amp;quot;&amp;gt;4p5.nz&amp;lt;/span&amp;gt;&#039;&#039;&#039; &amp;amp;bull; &#039;&#039;&#039;Version:&amp;amp;nbsp;1.21&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;4p5.nz&#039;&#039;&#039; is an invite-only creative/operator server where players have free reign over the world around them.&lt;/div&gt;</summary>
		<author><name>PoolloverNathan</name></author>
	</entry>
	<entry>
		<id>https://wiki.figuramc.org/index.php?title=Community_Resources&amp;diff=526</id>
		<title>Community Resources</title>
		<link rel="alternate" type="text/html" href="https://wiki.figuramc.org/index.php?title=Community_Resources&amp;diff=526"/>
		<updated>2024-10-05T20:15:45Z</updated>

		<summary type="html">&lt;p&gt;PoolloverNathan: /* FiguraSMP ⭐🔒 */ migrate server ip, elaborate on whitelist and msmp&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{Notice/Warning&lt;br /&gt;
 |content=&#039;&#039;&#039;This page is heavily unfinished.&#039;&#039;&#039;&amp;lt;br&amp;gt;&lt;br /&gt;
Please wait before referring other people to this page. If you&#039;re able to, please [[FiguraMC:Contributing|contribute]]!&lt;br /&gt;
}}&lt;br /&gt;
{{Notice&lt;br /&gt;
 |content=&#039;&#039;&#039;Some of the resources listed here are not officially endorsed by FiguraMC.&#039;&#039;&#039;&amp;lt;br&amp;gt;&lt;br /&gt;
* Resources affiliated with FiguraMC will be marked as such with a ⭐ icon.&lt;br /&gt;
}}&lt;br /&gt;
= Documentation =&lt;br /&gt;
===&#039;&#039;&#039;[https://applejuiceyy.github.io/figs/ Figs]&#039;&#039;&#039;===&lt;br /&gt;
&#039;&#039;&#039;Figs&#039;&#039;&#039; is an online documentation browser for Figura, making using Figura&#039;s built-in documentation easier to use.&lt;br /&gt;
===&#039;&#039;&#039;[https://wiki.figuramc.org Figura Wiki]&#039;&#039;&#039; (YOU ARE HERE) ⭐===&lt;br /&gt;
The &#039;&#039;&#039;Figura Wiki&#039;&#039;&#039; is an online wiki that aims to document Figura, its scripting language, modeling, etc.&lt;br /&gt;
== Lua Documenation ==&lt;br /&gt;
===&#039;&#039;&#039;[https://manuel-3.github.io/lua-quickstart Lua Quickstart Guide]&#039;&#039;&#039;===&lt;br /&gt;
&#039;&#039;&#039;Manuel&#039;s Lua Quickstart Guide&#039;&#039;&#039; is a quick, online tutorial guiding users through the basics of Lua syntax.&lt;br /&gt;
===&#039;&#039;&#039;[http://lua.org/manual/5.1 Lua 5.1 Manual]&#039;&#039;&#039;===&lt;br /&gt;
The &#039;&#039;&#039;Lua Manual&#039;&#039;&#039; is a long document describing the ins and outs of vanilla Lua. Although some of it will not apply to Figura Lua, it&#039;s still very useful for learning about the standard libraries.&lt;br /&gt;
== Tutorials ==&lt;br /&gt;
===&#039;&#039;&#039;[https://www.youtube.com/playlist?list=PLNz7v2g2SFA8lOQUDS4z4-gIDLi_dWAhl Chloe&#039;s Video Tutorial Series]&#039;&#039;&#039;===&lt;br /&gt;
&#039;&#039;&#039;Chloe&#039;s Tutorial Series&#039;&#039;&#039; is a video series on YouTube that acts as a way for new users to get used to the mod. The series covers everything from modeling and modifying &amp;lt;code&amp;gt;avatar.json&amp;lt;/code&amp;gt; files to scripting.&lt;br /&gt;
= Tools =&lt;br /&gt;
===&#039;&#039;&#039;[https://github.com/GrandpaScout/FiguraRewriteVSDocs GS&#039; Figura VSCode Documentation]&#039;&#039;&#039;===&lt;br /&gt;
&#039;&#039;&#039;GrandpaScout&#039;s Figura VSCode Documentation&#039;&#039;&#039; is an addon for Visual Studio Code (along with Code OSS and VSCodium) that adds Figura&#039;s documentation and snippets to [https://marketplace.visualstudio.com/items?itemName=sumneko.lua sumneko&#039;s Lua Language Server plugin].&lt;br /&gt;
&amp;lt;div class=&amp;quot;mw-collapsible mw-collapsed&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;h4&amp;gt;&lt;br /&gt;
Additional Resources&lt;br /&gt;
&amp;lt;div class=&amp;quot;mw-collapsible-toggle-placeholder&amp;quot;&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;/h4&amp;gt;&lt;br /&gt;
&amp;lt;div class=&amp;quot;mw-collapsible-content&amp;quot;&amp;gt;&lt;br /&gt;
* [https://github.com/GrandpaScout/FiguraRewriteVSDocs/wiki Install Guide]&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
===&#039;&#039;&#039;[https://github.com/KitCat962/figura-format-bbplugin Katt&#039;s Figura Blockbench Extension]&#039;&#039;&#039;===&lt;br /&gt;
The &#039;&#039;&#039;Figura Blockbench Extension&#039;&#039;&#039; adds a new model format to Blockbench, the Figura Model format. It extends the base Generic Model format by adding tools to make the avatar creation process easier, lifting restrictions to the Generic Model format that Figura supports, and removing features Figura doesn&#039;t.&lt;br /&gt;
= Assets (Scripts, Libraries, APIs) =&lt;br /&gt;
{{Notice&lt;br /&gt;
 |content=&#039;&#039;&#039;Some assets only exist within the [https://discord.figuramc.org FiguraMC Discord].&#039;&#039;&#039;&amp;lt;br&amp;gt;&lt;br /&gt;
* Assets that link to the FiguraMC Discord will be marked with a 💬 icon.&lt;br /&gt;
}}&lt;br /&gt;
== Animation Helpers ==&lt;br /&gt;
===&#039;&#039;&#039;[https://github.com/GrandpaScout/GSAnimBlend GSAnimBlend]&#039;&#039;&#039;===&lt;br /&gt;
&#039;&#039;&#039;GSAnimBlend&#039;&#039;&#039; is a script that automatically adds blends to the start and end of animations.&lt;br /&gt;
===&#039;&#039;&#039;[https://github.com/JimmyHelp/JimmyAnims Jimmy&#039;s Animation Handler]&#039;&#039;&#039;===&lt;br /&gt;
&#039;&#039;&#039;JimmyAnim&#039;&#039;&#039; (full name Jimmy&#039;s Animation Helper) is a library that plays specific Blockbench animations based on the player&#039;s current action.&lt;br /&gt;
&amp;lt;div class=&amp;quot;mw-collapsible mw-collapsed&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;h4&amp;gt;&lt;br /&gt;
Additional Resources&lt;br /&gt;
&amp;lt;div class=&amp;quot;mw-collapsible-toggle-placeholder&amp;quot;&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;/h4&amp;gt;&lt;br /&gt;
&amp;lt;div class=&amp;quot;mw-collapsible-content&amp;quot;&amp;gt;&lt;br /&gt;
* [https://jimmyhelp.notion.site/JimmyAnims-79adfdca2fe04f9c9ede5e0bfd898b6a Documentation]&lt;br /&gt;
* [https://github.com/JimmyHelp/JimmyAnims/blob/main/JimmyExample.lua Example Usage]&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
==Visual Elements==&lt;br /&gt;
===&#039;&#039;&#039;[https://github.com/Manuel-3/figura-scripts/tree/main/src/confetti Confetti]&#039;&#039;&#039;===&lt;br /&gt;
&#039;&#039;&#039;Confetti&#039;&#039;&#039; is a library that allows users to add custom particles, either sprite or modelpart, to their avatars&lt;br /&gt;
&amp;lt;div class=&amp;quot;mw-collapsible mw-collapsed&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;h4&amp;gt;&lt;br /&gt;
Additional Resources&lt;br /&gt;
&amp;lt;div class=&amp;quot;mw-collapsible-toggle-placeholder&amp;quot;&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;/h4&amp;gt;&lt;br /&gt;
&amp;lt;div class=&amp;quot;mw-collapsible-content&amp;quot;&amp;gt;&lt;br /&gt;
* [https://github.com/Manuel-3/figura-scripts/blob/main/src/confetti/readme.md Documentation]&lt;br /&gt;
* [https://github.com/Manuel-3/figura-scripts/blob/main/src/confetti/example.zip Example Avatar]&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
===&#039;&#039;&#039;[https://discord.com/channels/1129805506354085959/1137506926742216835 KattArmor]&#039;&#039;&#039; 💬===&lt;br /&gt;
&#039;&#039;&#039;KattArmor&#039;&#039;&#039; (sometimes called Katt Armor API/Library) is a library that allows users to edit their avatar&#039;s armor, whether by adding pivots using a script or by using unique models and textures.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div class=&amp;quot;mw-collapsible mw-collapsed&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;h4&amp;gt;&lt;br /&gt;
Additional Resources&lt;br /&gt;
&amp;lt;div class=&amp;quot;mw-collapsible-toggle-placeholder&amp;quot;&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;/h4&amp;gt;&lt;br /&gt;
&amp;lt;div class=&amp;quot;mw-collapsible-content&amp;quot;&amp;gt;&lt;br /&gt;
* [https://discord.com/channels/1129805506354085959/1137506926742216835/1155212562980425818 How-To Guide]&lt;br /&gt;
* [https://discord.com/channels/1129805506354085959/1137506926742216835/1262160359905562705 Example Avatars]&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
= Community =&lt;br /&gt;
===&#039;&#039;&#039;[https://discord.figuramc.org FiguraMC Discord]&#039;&#039;&#039; ⭐===&lt;br /&gt;
The &#039;&#039;&#039;FiguraMC Discord Server&#039;&#039;&#039; is the central place for everything Figura, including help and support for the mod, avatar showcasing, and more. You&#039;ll also need to join this server to request whitelist to the FiguraSMP.&lt;br /&gt;
== Minecraft Servers ==&lt;br /&gt;
{{Notice&lt;br /&gt;
 |content=&#039;&#039;&#039;Some servers listed below are whitelisted.&#039;&#039;&#039;&amp;lt;br&amp;gt;&lt;br /&gt;
* Servers that have a public whitelist application process will be marked with a 🔒 icon.&lt;br /&gt;
* Servers that are invite-only will be marked with a 🛡️ icon.&lt;br /&gt;
}}&lt;br /&gt;
===&#039;&#039;&#039;Figura Plaza&#039;&#039;&#039; ⭐===&lt;br /&gt;
&#039;&#039;&#039;Figura Plaza&#039;&#039;&#039; is a lobby-like server where players can join, hang out with other Figura users, make avatars in company, play games, and occasionally attend events.&lt;br /&gt;
 plaza.figuramc.org&lt;br /&gt;
===&#039;&#039;&#039;FiguraSMP&#039;&#039;&#039; ⭐🔒===&lt;br /&gt;
The &#039;&#039;&#039;FiguraSMP&#039;&#039;&#039; is a set of two survival multiplayer servers—Vanilla and Modded—that are ran in affiliation with FiguraMC. &lt;br /&gt;
* Vanilla FiguraSMP is a server that stays close to the base game, only adding quality of life features for public servers. &#039;&#039;&#039;IP:&amp;amp;nbsp;&amp;lt;span style=&amp;quot;user-select: all&amp;quot;&amp;gt;vanilla.figuramc.org&amp;lt;/span&amp;gt;&#039;&#039;&#039;&lt;br /&gt;
* ModdedSMP is a seasonal modpack server, each season coming with its own theme. &#039;&#039;&#039;Currently offline.&#039;&#039;&#039; The next season is themed after a nuclear apocalypse and is set for release Soon™.&lt;br /&gt;
&lt;br /&gt;
You can read the server rules in [https://discord.com/channels/1129805506354085959/1130186794873405510 #info] and get whitelisted by putting your name in [https://discord.com/channels/1129805506354085959/1130187119680311470 #whitelist]. note that both of these channel links require you to be in [https://discord.figuramc.org the official Discord server for Figura].&lt;br /&gt;
&lt;br /&gt;
===&#039;&#039;&#039;4p5.nz&#039;&#039;&#039; 🛡️===&lt;br /&gt;
&#039;&#039;&#039;4p5.nz&#039;&#039;&#039; is an invite-only creative/operator server where players have free reign over the world around them.&lt;br /&gt;
 4p5.nz&lt;/div&gt;</summary>
		<author><name>PoolloverNathan</name></author>
	</entry>
	<entry>
		<id>https://wiki.figuramc.org/index.php?title=FiguraMC:Contributing&amp;diff=510</id>
		<title>FiguraMC:Contributing</title>
		<link rel="alternate" type="text/html" href="https://wiki.figuramc.org/index.php?title=FiguraMC:Contributing&amp;diff=510"/>
		<updated>2024-10-05T04:07:33Z</updated>

		<summary type="html">&lt;p&gt;PoolloverNathan: Undo revision 508 by PoolloverNathan (talk)&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{Stub}}&lt;br /&gt;
== Contributing to the Mod ==&lt;br /&gt;
Please refer to [https://github.com/FiguraMC/Figura/blob/1.20/CONTRIBUTING.md the GitHub repo]&lt;br /&gt;
== Contributing to the Wiki ==&lt;br /&gt;
=== Information ===&lt;br /&gt;
When contributing to this wiki, there are a couple things you should remember:&lt;br /&gt;
* Follow the [[FiguraMC:Rules|rules]]&lt;br /&gt;
* Follow the [[FiguraMC:Contributing/Style Guide|style guide]]&lt;br /&gt;
=== Style Guide ===&lt;br /&gt;
{{VeryObviouslyTranscluded|FiguraMC:Contributing/Style Guide|Style Guide}}&lt;br /&gt;
=== Rules ===&lt;br /&gt;
{{VeryObviouslyTranscluded|FiguraMC:Rules}}&lt;br /&gt;
=== (Temporary) Getting an Account ===&lt;br /&gt;
Until account creation is set up, contact one of the wiki admins.&lt;/div&gt;</summary>
		<author><name>PoolloverNathan</name></author>
	</entry>
	<entry>
		<id>https://wiki.figuramc.org/index.php?title=FiguraMC:Contributing&amp;diff=508</id>
		<title>FiguraMC:Contributing</title>
		<link rel="alternate" type="text/html" href="https://wiki.figuramc.org/index.php?title=FiguraMC:Contributing&amp;diff=508"/>
		<updated>2024-10-05T04:07:01Z</updated>

		<summary type="html">&lt;p&gt;PoolloverNathan: inline transclude&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{Stub}}&lt;br /&gt;
== Contributing to the Mod ==&lt;br /&gt;
Please refer to [https://github.com/FiguraMC/Figura/blob/1.20/CONTRIBUTING.md the GitHub repo]&lt;br /&gt;
== Contributing to the Wiki ==&lt;br /&gt;
=== Information ===&lt;br /&gt;
When contributing to this wiki, there are a couple things you should remember:&lt;br /&gt;
* Follow the [[FiguraMC:Rules|rules]]&lt;br /&gt;
* Follow the [[FiguraMC:Contributing/Style Guide|style guide]]&lt;br /&gt;
=== Style Guide ===&lt;br /&gt;
{{FiguraMC:Contributing/Style Guide|Style Guide}}&lt;br /&gt;
=== Rules ===&lt;br /&gt;
{{FiguraMC:Rules}}&lt;br /&gt;
=== (Temporary) Getting an Account ===&lt;br /&gt;
Until account creation is set up, contact one of the wiki admins.&lt;/div&gt;</summary>
		<author><name>PoolloverNathan</name></author>
	</entry>
	<entry>
		<id>https://wiki.figuramc.org/index.php?title=Template:VeryObviouslyTranscluded&amp;diff=500</id>
		<title>Template:VeryObviouslyTranscluded</title>
		<link rel="alternate" type="text/html" href="https://wiki.figuramc.org/index.php?title=Template:VeryObviouslyTranscluded&amp;diff=500"/>
		<updated>2024-10-05T03:54:11Z</updated>

		<summary type="html">&lt;p&gt;PoolloverNathan: suppress external link icon&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&amp;lt;div style=&amp;quot;border-left: thin solid black; padding-left: 1mm&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;div style=&amp;quot;float: right; margin-top: -1.5em&amp;quot;&amp;gt;&lt;br /&gt;
&#039;&#039;From [[{{{1}}}|{{{2|{{{1}}}}}}]] (&amp;lt;span class=&amp;quot;plainlinks&amp;quot;&amp;gt;[{{fullurl:{{{1}}}|action=edit}} edit]&amp;lt;/span&amp;gt;)&#039;&#039;&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
{{{{{1}}}}}&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;/div&gt;</summary>
		<author><name>PoolloverNathan</name></author>
	</entry>
	<entry>
		<id>https://wiki.figuramc.org/index.php?title=FiguraMC:Contributing&amp;diff=498</id>
		<title>FiguraMC:Contributing</title>
		<link rel="alternate" type="text/html" href="https://wiki.figuramc.org/index.php?title=FiguraMC:Contributing&amp;diff=498"/>
		<updated>2024-10-05T03:52:20Z</updated>

		<summary type="html">&lt;p&gt;PoolloverNathan: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{Stub}}&lt;br /&gt;
== Contributing to the Mod ==&lt;br /&gt;
Please refer to [https://github.com/FiguraMC/Figura/blob/1.20/CONTRIBUTING.md the GitHub repo]&lt;br /&gt;
== Contributing to the Wiki ==&lt;br /&gt;
=== Information ===&lt;br /&gt;
When contributing to this wiki, there are a couple things you should remember:&lt;br /&gt;
* Follow the [[FiguraMC:Rules|rules]]&lt;br /&gt;
* Follow the [[FiguraMC:Contibuting/Style Guide|style guide]]&lt;br /&gt;
=== Style Guide ===&lt;br /&gt;
{{VeryObviouslyTranscluded|User:TheKillerBunny/Style Guide|Style Guide}}&lt;br /&gt;
=== Rules ===&lt;br /&gt;
{{VeryObviouslyTranscluded|FiguraMC:Rules}}&lt;br /&gt;
=== (Temporary) Getting an Account ===&lt;br /&gt;
Until account creation is set up, contact one of the wiki admins.&lt;/div&gt;</summary>
		<author><name>PoolloverNathan</name></author>
	</entry>
	<entry>
		<id>https://wiki.figuramc.org/index.php?title=Template:VeryObviouslyTranscluded&amp;diff=497</id>
		<title>Template:VeryObviouslyTranscluded</title>
		<link rel="alternate" type="text/html" href="https://wiki.figuramc.org/index.php?title=Template:VeryObviouslyTranscluded&amp;diff=497"/>
		<updated>2024-10-05T03:48:47Z</updated>

		<summary type="html">&lt;p&gt;PoolloverNathan: reformat&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&amp;lt;div style=&amp;quot;border-left: thin solid black; padding-left: 1mm&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;div style=&amp;quot;float: right; margin-top: -1em&amp;quot;&amp;gt;&lt;br /&gt;
&#039;&#039;From [[{{{1}}}|{{{2|{{{1}}}}}}]] ([{{fullurl:{{{1}}}|action=edit}} edit])&#039;&#039;&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
{{{{{1}}}}}&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;/div&gt;</summary>
		<author><name>PoolloverNathan</name></author>
	</entry>
	<entry>
		<id>https://wiki.figuramc.org/index.php?title=Template:VeryObviouslyTranscluded&amp;diff=489</id>
		<title>Template:VeryObviouslyTranscluded</title>
		<link rel="alternate" type="text/html" href="https://wiki.figuramc.org/index.php?title=Template:VeryObviouslyTranscluded&amp;diff=489"/>
		<updated>2024-10-05T03:35:10Z</updated>

		<summary type="html">&lt;p&gt;PoolloverNathan: Created page with &amp;quot;&amp;#039;&amp;#039;Transcluded from {{{1}}}}}} ([{{fullurl:{{{1}}}|action=edit}} edit])&amp;#039;&amp;#039; {{{{{1}}}}}&amp;quot;&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&#039;&#039;Transcluded from [[{{{1}}}|{{{2|{{{1}}}}}}]] ([{{fullurl:{{{1}}}|action=edit}} edit])&#039;&#039;&lt;br /&gt;
{{{{{1}}}}}&lt;/div&gt;</summary>
		<author><name>PoolloverNathan</name></author>
	</entry>
	<entry>
		<id>https://wiki.figuramc.org/index.php?title=FiguraMC:Contributing&amp;diff=488</id>
		<title>FiguraMC:Contributing</title>
		<link rel="alternate" type="text/html" href="https://wiki.figuramc.org/index.php?title=FiguraMC:Contributing&amp;diff=488"/>
		<updated>2024-10-05T03:34:26Z</updated>

		<summary type="html">&lt;p&gt;PoolloverNathan: get created&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{stub}}&lt;br /&gt;
== Rules ==&lt;br /&gt;
{{VeryObviouslyTranscluded|FiguraMC:Rules}}&lt;/div&gt;</summary>
		<author><name>PoolloverNathan</name></author>
	</entry>
	<entry>
		<id>https://wiki.figuramc.org/index.php?title=Main_Page&amp;diff=487</id>
		<title>Main Page</title>
		<link rel="alternate" type="text/html" href="https://wiki.figuramc.org/index.php?title=Main_Page&amp;diff=487"/>
		<updated>2024-10-05T03:30:42Z</updated>

		<summary type="html">&lt;p&gt;PoolloverNathan: pipe trick&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{Notice/Warning&lt;br /&gt;
 |content=&lt;br /&gt;
&amp;lt;div style=&amp;quot;font-size: 1.5em; font-weight: bold; margin: 0.5em 0 0 0;&amp;quot;&amp;gt;This wiki is under heavy construction.&amp;lt;/div&amp;gt;&lt;br /&gt;
To contribute to this wiki, see [[Special:WantedPages|Wanted Pages]], [[:Category:Stubs|Stubs]], and [[FiguraMC:Contributing|Contributing]].&lt;br /&gt;
}}&lt;br /&gt;
{{Notice&lt;br /&gt;
 |content=[https://figura-wiki.pages.dev &amp;lt;span style=&amp;quot;font-size: 1.5em; color: black !important;&amp;quot;&amp;gt;&#039;&#039;&#039;Looking for the old wiki? Click here!&#039;&#039;&#039;&amp;lt;/span&amp;gt;]&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
== Navigation ==&lt;br /&gt;
{{Navbox documentation}}&lt;/div&gt;</summary>
		<author><name>PoolloverNathan</name></author>
	</entry>
	<entry>
		<id>https://wiki.figuramc.org/index.php?title=Main_Page&amp;diff=486</id>
		<title>Main Page</title>
		<link rel="alternate" type="text/html" href="https://wiki.figuramc.org/index.php?title=Main_Page&amp;diff=486"/>
		<updated>2024-10-05T03:30:14Z</updated>

		<summary type="html">&lt;p&gt;PoolloverNathan: google en passant&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{Notice/Warning&lt;br /&gt;
 |content=&lt;br /&gt;
&amp;lt;div style=&amp;quot;font-size: 1.5em; font-weight: bold; margin: 0.5em 0 0 0;&amp;quot;&amp;gt;This wiki is under heavy construction.&amp;lt;/div&amp;gt;&lt;br /&gt;
To contribute to this wiki, see [[Special:WantedPages|Wanted Pages]], [[:Category:Stubs|Stubs]], and [[FiguraMC:Contributing]].&lt;br /&gt;
}}&lt;br /&gt;
{{Notice&lt;br /&gt;
 |content=[https://figura-wiki.pages.dev &amp;lt;span style=&amp;quot;font-size: 1.5em; color: black !important;&amp;quot;&amp;gt;&#039;&#039;&#039;Looking for the old wiki? Click here!&#039;&#039;&#039;&amp;lt;/span&amp;gt;]&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
== Navigation ==&lt;br /&gt;
{{Navbox documentation}}&lt;/div&gt;</summary>
		<author><name>PoolloverNathan</name></author>
	</entry>
	<entry>
		<id>https://wiki.figuramc.org/index.php?title=Module:Distinguish&amp;diff=447</id>
		<title>Module:Distinguish</title>
		<link rel="alternate" type="text/html" href="https://wiki.figuramc.org/index.php?title=Module:Distinguish&amp;diff=447"/>
		<updated>2024-09-29T01:39:10Z</updated>

		<summary type="html">&lt;p&gt;PoolloverNathan: lua doin a little trollin&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;function hatnoteDistinguish(frame)&lt;br /&gt;
	local args = frame:getParent().args&lt;br /&gt;
    if not args[1] then return frame:expandTemplate { title = [[Hatnote]]; args = { [[Not to be confused. ]]; }; }; end;&lt;br /&gt;
	local final = {}&lt;br /&gt;
	&lt;br /&gt;
	for k, v in ipairs(args) do&lt;br /&gt;
		table.insert(final, &amp;quot;[[&amp;quot; .. v .. &amp;quot;]]&amp;quot;)&lt;br /&gt;
	end&lt;br /&gt;
	local sep = &amp;quot; &amp;quot;&lt;br /&gt;
	if #final &amp;gt; 1 then&lt;br /&gt;
		final[#final] = &amp;quot;or &amp;quot; .. final[#final]&lt;br /&gt;
		if #final &amp;gt; 2 then&lt;br /&gt;
			sep = &amp;quot;, &amp;quot;&lt;br /&gt;
		else&lt;br /&gt;
			sep = &amp;quot; &amp;quot;&lt;br /&gt;
		end&lt;br /&gt;
	end&lt;br /&gt;
	return frame:expandTemplate{title = &amp;quot;Hatnote&amp;quot;, args = {&amp;quot;Not to be confused with &amp;quot; .. table.concat(final, sep) .. &amp;quot;.&amp;quot;}}&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
return {[&amp;quot;hatnote&amp;quot;] = hatnoteDistinguish}&lt;/div&gt;</summary>
		<author><name>PoolloverNathan</name></author>
	</entry>
	<entry>
		<id>https://wiki.figuramc.org/index.php?title=Module:Distinguish&amp;diff=446</id>
		<title>Module:Distinguish</title>
		<link rel="alternate" type="text/html" href="https://wiki.figuramc.org/index.php?title=Module:Distinguish&amp;diff=446"/>
		<updated>2024-09-29T01:38:49Z</updated>

		<summary type="html">&lt;p&gt;PoolloverNathan: mediawiki doin a little trollin&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;function hatnoteDistinguish(frame)&lt;br /&gt;
	local args = frame:getParent().args&lt;br /&gt;
    if not args[0] then return frame:expandTemplate { title = [[Hatnote]]; args = { [[Not to be confused. ]]; }; }; end;&lt;br /&gt;
	local final = {}&lt;br /&gt;
	&lt;br /&gt;
	for k, v in ipairs(args) do&lt;br /&gt;
		table.insert(final, &amp;quot;[[&amp;quot; .. v .. &amp;quot;]]&amp;quot;)&lt;br /&gt;
	end&lt;br /&gt;
	local sep = &amp;quot; &amp;quot;&lt;br /&gt;
	if #final &amp;gt; 1 then&lt;br /&gt;
		final[#final] = &amp;quot;or &amp;quot; .. final[#final]&lt;br /&gt;
		if #final &amp;gt; 2 then&lt;br /&gt;
			sep = &amp;quot;, &amp;quot;&lt;br /&gt;
		else&lt;br /&gt;
			sep = &amp;quot; &amp;quot;&lt;br /&gt;
		end&lt;br /&gt;
	end&lt;br /&gt;
	return frame:expandTemplate{title = &amp;quot;Hatnote&amp;quot;, args = {&amp;quot;Not to be confused with &amp;quot; .. table.concat(final, sep) .. &amp;quot;.&amp;quot;}}&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
return {[&amp;quot;hatnote&amp;quot;] = hatnoteDistinguish}&lt;/div&gt;</summary>
		<author><name>PoolloverNathan</name></author>
	</entry>
	<entry>
		<id>https://wiki.figuramc.org/index.php?title=Module:Distinguish/doc&amp;diff=445</id>
		<title>Module:Distinguish/doc</title>
		<link rel="alternate" type="text/html" href="https://wiki.figuramc.org/index.php?title=Module:Distinguish/doc&amp;diff=445"/>
		<updated>2024-09-29T01:38:18Z</updated>

		<summary type="html">&lt;p&gt;PoolloverNathan: Created page with &amp;quot;* {{distinguish}} * {{distinguish|Foo}} * {{distinguish|Foo|Bar}} * {{distinguish|Foo|Bar|Baz}}&amp;quot;&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;* {{distinguish}}&lt;br /&gt;
* {{distinguish|Foo}}&lt;br /&gt;
* {{distinguish|Foo|Bar}}&lt;br /&gt;
* {{distinguish|Foo|Bar|Baz}}&lt;/div&gt;</summary>
		<author><name>PoolloverNathan</name></author>
	</entry>
	<entry>
		<id>https://wiki.figuramc.org/index.php?title=Module:Distinguish&amp;diff=444</id>
		<title>Module:Distinguish</title>
		<link rel="alternate" type="text/html" href="https://wiki.figuramc.org/index.php?title=Module:Distinguish&amp;diff=444"/>
		<updated>2024-09-29T01:37:28Z</updated>

		<summary type="html">&lt;p&gt;PoolloverNathan: accept 0 arguments&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;function hatnoteDistinguish(frame)&lt;br /&gt;
	local args = frame:getParent().args&lt;br /&gt;
    if #args then return frame:expandTemplate { title = [[Hatnote]]; args = { [[Not to be confused. ]]; }; }; end;&lt;br /&gt;
	local final = {}&lt;br /&gt;
	&lt;br /&gt;
	for k, v in ipairs(args) do&lt;br /&gt;
		table.insert(final, &amp;quot;[[&amp;quot; .. v .. &amp;quot;]]&amp;quot;)&lt;br /&gt;
	end&lt;br /&gt;
	local sep = &amp;quot; &amp;quot;&lt;br /&gt;
	if #final &amp;gt; 1 then&lt;br /&gt;
		final[#final] = &amp;quot;or &amp;quot; .. final[#final]&lt;br /&gt;
		if #final &amp;gt; 2 then&lt;br /&gt;
			sep = &amp;quot;, &amp;quot;&lt;br /&gt;
		else&lt;br /&gt;
			sep = &amp;quot; &amp;quot;&lt;br /&gt;
		end&lt;br /&gt;
	end&lt;br /&gt;
	return frame:expandTemplate{title = &amp;quot;Hatnote&amp;quot;, args = {&amp;quot;Not to be confused with &amp;quot; .. table.concat(final, sep) .. &amp;quot;.&amp;quot;}}&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
return {[&amp;quot;hatnote&amp;quot;] = hatnoteDistinguish}&lt;/div&gt;</summary>
		<author><name>PoolloverNathan</name></author>
	</entry>
	<entry>
		<id>https://wiki.figuramc.org/index.php?title=Template:Type&amp;diff=339</id>
		<title>Template:Type</title>
		<link rel="alternate" type="text/html" href="https://wiki.figuramc.org/index.php?title=Template:Type&amp;diff=339"/>
		<updated>2024-09-28T19:30:51Z</updated>

		<summary type="html">&lt;p&gt;PoolloverNathan: depluralize example Vector and Matrix plus suggestion&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&amp;lt;includeonly&amp;gt;&amp;lt;templatestyles src=&amp;quot;Template:Type/style.css&amp;quot;/&amp;gt;{{#if:{{{3|{{{link|}}}}}}&lt;br /&gt;
 |{{type/link|{{{1}}}|mod={{{2|{{{mod|}}}}}}|link={{{3|{{{link}}}}}}}}&lt;br /&gt;
 |{{#switch:{{{1}}}&lt;br /&gt;
 | nil&lt;br /&gt;
 | number&lt;br /&gt;
 | numbers&lt;br /&gt;
 | double&lt;br /&gt;
 | doubles&lt;br /&gt;
 | integer&lt;br /&gt;
 | integers&lt;br /&gt;
 | string&lt;br /&gt;
 | strings&lt;br /&gt;
 | boolean&lt;br /&gt;
 | bool&lt;br /&gt;
 | booleans&lt;br /&gt;
 | true&lt;br /&gt;
 | false&lt;br /&gt;
 | function&lt;br /&gt;
 | functions&lt;br /&gt;
 | table&lt;br /&gt;
 | any&lt;br /&gt;
 | tables = {{type/builtin|{{{1}}}|mod={{{2|{{{mod|}}}}}}}}&lt;br /&gt;
 | Vectors&lt;br /&gt;
 | vectors&lt;br /&gt;
 | Vector&lt;br /&gt;
 | Vector2&lt;br /&gt;
 | Vector3&lt;br /&gt;
 | Vector4 = {{type/vector|{{{1}}}|name=Vector|mod={{{2|{{{mod|}}}}}}}}&lt;br /&gt;
 | Matrices&lt;br /&gt;
 | matrices&lt;br /&gt;
 | Matrix&lt;br /&gt;
 | Matrix2&lt;br /&gt;
 | Matrix3&lt;br /&gt;
 | Matrix4 = {{type/vector|{{{1}}}|name=Matrix|mod={{{2|{{{mod|}}}}}}}}&lt;br /&gt;
 | {{type/custom|{{{1}}}|mod={{{2|{{{mod|}}}}}}}}&lt;br /&gt;
  }}&lt;br /&gt;
}}&amp;lt;/includeonly&amp;gt;&amp;lt;noinclude&amp;gt; &amp;lt;!-- Documentation starts here. --&amp;gt;&lt;br /&gt;
&#039;&#039;&#039;Displays a &#039;&#039;type widget&#039;&#039;.&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
* If a link is provided: [[Template:Type/link]]&lt;br /&gt;
* Built-in types: [[Template:Type/builtin]]&lt;br /&gt;
* Custom types (fallback): [[Template:Type/custom]]. If the page with &amp;lt;code&amp;gt;[argument 1] (type)&amp;lt;/code&amp;gt; (i.e. disambiguated) exists, that page will be used instead of the plain name for the link.&lt;br /&gt;
&lt;br /&gt;
Stylesheet: [[Template:Type/style.css]] (edit to add colors and decorations for custom types)&lt;br /&gt;
&lt;br /&gt;
== Examples ==&lt;br /&gt;
* {{type|nil}} &amp;lt;code&amp;gt;&amp;lt;nowiki&amp;gt;{{type|nil}}&amp;lt;/nowiki&amp;gt;&amp;lt;/code&amp;gt;&lt;br /&gt;
* {{type|number}}&lt;br /&gt;
* {{type|number|?}} (optional number)&lt;br /&gt;
* {{type|string}}&lt;br /&gt;
* {{type|boolean}}&lt;br /&gt;
* {{type|function}}&lt;br /&gt;
* {{type|table}}&lt;br /&gt;
* {{type|Vector}} ({{type|Vector2}}, {{type|Vector3}}, {{type|Vector4}})&lt;br /&gt;
* {{type|Matrix}} ({{type|Matrix2}}, {{type|Matrix3}}, {{type|Matrix4}})&lt;br /&gt;
* {{type|Event}} (custom type that exists)&lt;br /&gt;
* {{type|CrashAPI}} (custom type that doesn&#039;t exist)&lt;br /&gt;
* {{type|Main Page|link=Main Page}} (links to the [[Main Page]]) &amp;lt;code&amp;gt;&amp;lt;nowiki&amp;gt;{{type|Main Page|link=Main Page}}&amp;lt;/nowiki&amp;gt;&amp;lt;/code&amp;gt;&lt;br /&gt;
[[Template:Type/testcases|Testcases page.]]&lt;br /&gt;
&amp;lt;templatedata&amp;gt;&lt;br /&gt;
{&lt;br /&gt;
	&amp;quot;params&amp;quot;: {&lt;br /&gt;
		&amp;quot;1&amp;quot;: {&lt;br /&gt;
			&amp;quot;label&amp;quot;: &amp;quot;Type name&amp;quot;,&lt;br /&gt;
			&amp;quot;suggestedvalues&amp;quot;: [&lt;br /&gt;
				&amp;quot;nil&amp;quot;,&lt;br /&gt;
				&amp;quot;boolean&amp;quot;,&lt;br /&gt;
				&amp;quot;integer&amp;quot;,&lt;br /&gt;
				&amp;quot;number&amp;quot;,&lt;br /&gt;
				&amp;quot;string&amp;quot;,&lt;br /&gt;
				&amp;quot;function&amp;quot;,&lt;br /&gt;
				&amp;quot;table&amp;quot;,&lt;br /&gt;
                &amp;quot;Vector&amp;quot;,&lt;br /&gt;
                &amp;quot;Matrix&amp;quot;&lt;br /&gt;
			],&lt;br /&gt;
			&amp;quot;required&amp;quot;: true&lt;br /&gt;
		},&lt;br /&gt;
		&amp;quot;link&amp;quot;: {&lt;br /&gt;
			&amp;quot;aliases&amp;quot;: [&lt;br /&gt;
				&amp;quot;3&amp;quot;&lt;br /&gt;
			],&lt;br /&gt;
			&amp;quot;label&amp;quot;: &amp;quot;Custom link target&amp;quot;,&lt;br /&gt;
			&amp;quot;type&amp;quot;: &amp;quot;wiki-page-name&amp;quot;&lt;br /&gt;
		},&lt;br /&gt;
		&amp;quot;mod&amp;quot;: {&lt;br /&gt;
			&amp;quot;aliases&amp;quot;: [&lt;br /&gt;
				&amp;quot;2&amp;quot;&lt;br /&gt;
			],&lt;br /&gt;
			&amp;quot;label&amp;quot;: &amp;quot;Type modifiers&amp;quot;,&lt;br /&gt;
			&amp;quot;description&amp;quot;: &amp;quot;Modifiers to the type, like array / optional&amp;quot;,&lt;br /&gt;
			&amp;quot;type&amp;quot;: &amp;quot;content&amp;quot;,&lt;br /&gt;
			&amp;quot;suggestedvalues&amp;quot;: [&lt;br /&gt;
				&amp;quot;[]&amp;quot;,&lt;br /&gt;
				&amp;quot;?&amp;quot;,&lt;br /&gt;
				&amp;quot;[]?&amp;quot;&lt;br /&gt;
			]&lt;br /&gt;
		}&lt;br /&gt;
	},&lt;br /&gt;
	&amp;quot;description&amp;quot;: &amp;quot;Displays and links to types.&amp;quot;,&lt;br /&gt;
	&amp;quot;paramOrder&amp;quot;: [&lt;br /&gt;
		&amp;quot;1&amp;quot;,&lt;br /&gt;
		&amp;quot;mod&amp;quot;,&lt;br /&gt;
		&amp;quot;link&amp;quot;&lt;br /&gt;
	],&lt;br /&gt;
	&amp;quot;format&amp;quot;: &amp;quot;inline&amp;quot;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/templatedata&amp;gt;&amp;lt;/noinclude&amp;gt;&lt;/div&gt;</summary>
		<author><name>PoolloverNathan</name></author>
	</entry>
	<entry>
		<id>https://wiki.figuramc.org/index.php?title=Main_Page&amp;diff=293</id>
		<title>Main Page</title>
		<link rel="alternate" type="text/html" href="https://wiki.figuramc.org/index.php?title=Main_Page&amp;diff=293"/>
		<updated>2024-09-27T18:50:04Z</updated>

		<summary type="html">&lt;p&gt;PoolloverNathan: redirect to page list&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;#REDIRECT [[Special:AllPages]]&lt;br /&gt;
&lt;br /&gt;
(redirect requested by joeyy)&lt;br /&gt;
[[File:Screenshot_2024-09-27_14.48.30.png]]&lt;br /&gt;
&lt;br /&gt;
[https://figura-wiki.pages.dev &amp;lt;big&amp;gt;&#039;&#039;&#039;Looking for the old wiki? Click here!&#039;&#039;&#039;&amp;lt;/big&amp;gt;]&lt;/div&gt;</summary>
		<author><name>PoolloverNathan</name></author>
	</entry>
	<entry>
		<id>https://wiki.figuramc.org/index.php?title=File:Screenshot_2024-09-27_14.48.30.png&amp;diff=292</id>
		<title>File:Screenshot 2024-09-27 14.48.30.png</title>
		<link rel="alternate" type="text/html" href="https://wiki.figuramc.org/index.php?title=File:Screenshot_2024-09-27_14.48.30.png&amp;diff=292"/>
		<updated>2024-09-27T18:49:08Z</updated>

		<summary type="html">&lt;p&gt;PoolloverNathan: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&lt;/div&gt;</summary>
		<author><name>PoolloverNathan</name></author>
	</entry>
	<entry>
		<id>https://wiki.figuramc.org/index.php?title=Event&amp;diff=291</id>
		<title>Event</title>
		<link rel="alternate" type="text/html" href="https://wiki.figuramc.org/index.php?title=Event&amp;diff=291"/>
		<updated>2024-09-27T18:47:19Z</updated>

		<summary type="html">&lt;p&gt;PoolloverNathan: PoolloverNathan moved page Event to Event (type): Distinguishing from Events&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;#REDIRECT [[Event (type)]]&lt;/div&gt;</summary>
		<author><name>PoolloverNathan</name></author>
	</entry>
	<entry>
		<id>https://wiki.figuramc.org/index.php?title=Event_(type)&amp;diff=290</id>
		<title>Event (type)</title>
		<link rel="alternate" type="text/html" href="https://wiki.figuramc.org/index.php?title=Event_(type)&amp;diff=290"/>
		<updated>2024-09-27T18:47:19Z</updated>

		<summary type="html">&lt;p&gt;PoolloverNathan: PoolloverNathan moved page Event to Event (type): Distinguishing from Events&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{Distinguish|Events}}&lt;br /&gt;
&lt;br /&gt;
The event type is used for events such as &amp;lt;code&amp;gt;events.TICK&amp;lt;/code&amp;gt;. To create an event function, use one of the following.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxHighlight lang=&amp;quot;lua&amp;quot;&amp;gt; local tick = 0&lt;br /&gt;
function events.WORLD_TICK()&lt;br /&gt;
  tick = tick + 1&lt;br /&gt;
end&lt;br /&gt;
-- OR&lt;br /&gt;
local tick = 0&lt;br /&gt;
events.WORLD_TICK:register(function()&lt;br /&gt;
  tick = tick + 1&lt;br /&gt;
end, &amp;quot;TICK_COUNTER&amp;quot;)&lt;br /&gt;
&amp;lt;/syntaxHighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Methods ==&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! | Method&lt;br /&gt;
! | Description&lt;br /&gt;
|-&lt;br /&gt;
| [[/remove|remove]]&lt;br /&gt;
| Takes in a {{type|string}} with the name of the event, and removes it, stopping it from being called&lt;br /&gt;
|-&lt;br /&gt;
| [[/clear|clear]]&lt;br /&gt;
| Clears the event of all methods&lt;br /&gt;
|-&lt;br /&gt;
| [[/register|register]]&lt;br /&gt;
| Takes in a {{type|function}} to run when the event is fired, with an optional name argument ({{type|string}})&lt;br /&gt;
|-&lt;br /&gt;
| [[/getRegisteredCount|getRegisteredCount]]&lt;br /&gt;
| Returns the amount of functions registered, with an optional name argument ({{type|string}})&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
[[Category:Types]]&lt;/div&gt;</summary>
		<author><name>PoolloverNathan</name></author>
	</entry>
	<entry>
		<id>https://wiki.figuramc.org/index.php?title=Template:Type/style.css&amp;diff=289</id>
		<title>Template:Type/style.css</title>
		<link rel="alternate" type="text/html" href="https://wiki.figuramc.org/index.php?title=Template:Type/style.css&amp;diff=289"/>
		<updated>2024-09-27T18:02:58Z</updated>

		<summary type="html">&lt;p&gt;PoolloverNathan: spell matrix correctly &amp;amp; select a&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;.lua-type {&lt;br /&gt;
	display: inline-flex;&lt;br /&gt;
	align-items: stretch;&lt;br /&gt;
	flex-flow: row nowrap;&lt;br /&gt;
	width: max-content;&lt;br /&gt;
	border-radius: 3px;&lt;br /&gt;
	overflow: hidden;&lt;br /&gt;
	font-family: monospace;&lt;br /&gt;
}&lt;br /&gt;
.lua-type a {&lt;br /&gt;
	border-radius: 3px;&lt;br /&gt;
	background-color: #eeeeee;&lt;br /&gt;
	padding: 0 3px;&lt;br /&gt;
	background-image: none;&lt;br /&gt;
	z-index: 2;&lt;br /&gt;
}&lt;br /&gt;
.lua-type .lua-type-mod {&lt;br /&gt;
	margin-left: -3px;&lt;br /&gt;
	padding: 0 3px 0 6px;&lt;br /&gt;
	background-color: #ffffff;&lt;br /&gt;
	border: 1px solid #dddddd;&lt;br /&gt;
	z-index: 1;&lt;br /&gt;
}&lt;br /&gt;
.lua-type a, .lua-type a:visited {&lt;br /&gt;
	color: #000000;&lt;br /&gt;
}&lt;br /&gt;
.lua-type[data-name=&amp;quot;nil&amp;quot;] a {&lt;br /&gt;
	background-color: #ffffff;&lt;br /&gt;
	border: 1px solid #808080;&lt;br /&gt;
}&lt;br /&gt;
.lua-type[data-name=&amp;quot;any&amp;quot;] a {&lt;br /&gt;
	background-color: #ffffff;&lt;br /&gt;
	border: 1px dotted #808080;&lt;br /&gt;
}&lt;br /&gt;
.lua-type[data-name=&amp;quot;table&amp;quot;] a, .lua-type[data-name=&amp;quot;tables&amp;quot;] a {&lt;br /&gt;
	background-color: #ffffdd;&lt;br /&gt;
}&lt;br /&gt;
.lua-type[data-name=&amp;quot;function&amp;quot;] a, .lua-type[data-name=&amp;quot;functions&amp;quot;] a {&lt;br /&gt;
	background-color: #eeddff;&lt;br /&gt;
}&lt;br /&gt;
.lua-type[data-name=&amp;quot;string&amp;quot;] a, .lua-type[data-name=&amp;quot;strings&amp;quot;] a {&lt;br /&gt;
	background-color: #ddffdd;&lt;br /&gt;
}&lt;br /&gt;
.lua-type[data-name=&amp;quot;boolean&amp;quot;] a, .lua-type[data-name=&amp;quot;booleans&amp;quot;] a, .lua-type[data-name=&amp;quot;bool&amp;quot;] a {&lt;br /&gt;
	background-color: #ffddff;&lt;br /&gt;
}&lt;br /&gt;
.lua-type[data-name=&amp;quot;number&amp;quot;] a, .lua-type[data-name=&amp;quot;numbers&amp;quot;] a, .lua-type[data-name=&amp;quot;integer&amp;quot;] a, .lua-type[data-name=&amp;quot;integers&amp;quot;] a, .lua-type[data-name=&amp;quot;double&amp;quot;] a, .lua-type[data-name=&amp;quot;doubles&amp;quot;] a {&lt;br /&gt;
	background-color: #ddddff;&lt;br /&gt;
}&lt;br /&gt;
.lua-type[data-name=&amp;quot;Vector&amp;quot;] a {&lt;br /&gt;
	background-color: #ffeedd;&lt;br /&gt;
}&lt;br /&gt;
.lua-type[data-name=&amp;quot;Matrix&amp;quot;] a {&lt;br /&gt;
	background-color: #ffddee;&lt;br /&gt;
}&lt;br /&gt;
.lua-type.lua-type[data-missing] a {&lt;br /&gt;
	background-color: #ffdddd;&lt;br /&gt;
	color: #d73333;&lt;br /&gt;
}&lt;/div&gt;</summary>
		<author><name>PoolloverNathan</name></author>
	</entry>
	<entry>
		<id>https://wiki.figuramc.org/index.php?title=Template:Type/style.css&amp;diff=288</id>
		<title>Template:Type/style.css</title>
		<link rel="alternate" type="text/html" href="https://wiki.figuramc.org/index.php?title=Template:Type/style.css&amp;diff=288"/>
		<updated>2024-09-27T18:01:09Z</updated>

		<summary type="html">&lt;p&gt;PoolloverNathan: is ^= disallowed?&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;.lua-type {&lt;br /&gt;
	display: inline-flex;&lt;br /&gt;
	align-items: stretch;&lt;br /&gt;
	flex-flow: row nowrap;&lt;br /&gt;
	width: max-content;&lt;br /&gt;
	border-radius: 3px;&lt;br /&gt;
	overflow: hidden;&lt;br /&gt;
	font-family: monospace;&lt;br /&gt;
}&lt;br /&gt;
.lua-type a {&lt;br /&gt;
	border-radius: 3px;&lt;br /&gt;
	background-color: #eeeeee;&lt;br /&gt;
	padding: 0 3px;&lt;br /&gt;
	background-image: none;&lt;br /&gt;
	z-index: 2;&lt;br /&gt;
}&lt;br /&gt;
.lua-type .lua-type-mod {&lt;br /&gt;
	margin-left: -3px;&lt;br /&gt;
	padding: 0 3px 0 6px;&lt;br /&gt;
	background-color: #ffffff;&lt;br /&gt;
	border: 1px solid #dddddd;&lt;br /&gt;
	z-index: 1;&lt;br /&gt;
}&lt;br /&gt;
.lua-type a, .lua-type a:visited {&lt;br /&gt;
	color: #000000;&lt;br /&gt;
}&lt;br /&gt;
.lua-type[data-name=&amp;quot;nil&amp;quot;] a {&lt;br /&gt;
	background-color: #ffffff;&lt;br /&gt;
	border: 1px solid #808080;&lt;br /&gt;
}&lt;br /&gt;
.lua-type[data-name=&amp;quot;any&amp;quot;] a {&lt;br /&gt;
	background-color: #ffffff;&lt;br /&gt;
	border: 1px dotted #808080;&lt;br /&gt;
}&lt;br /&gt;
.lua-type[data-name=&amp;quot;table&amp;quot;] a, .lua-type[data-name=&amp;quot;tables&amp;quot;] a {&lt;br /&gt;
	background-color: #ffffdd;&lt;br /&gt;
}&lt;br /&gt;
.lua-type[data-name=&amp;quot;function&amp;quot;] a, .lua-type[data-name=&amp;quot;functions&amp;quot;] a {&lt;br /&gt;
	background-color: #eeddff;&lt;br /&gt;
}&lt;br /&gt;
.lua-type[data-name=&amp;quot;string&amp;quot;] a, .lua-type[data-name=&amp;quot;strings&amp;quot;] a {&lt;br /&gt;
	background-color: #ddffdd;&lt;br /&gt;
}&lt;br /&gt;
.lua-type[data-name=&amp;quot;boolean&amp;quot;] a, .lua-type[data-name=&amp;quot;booleans&amp;quot;] a, .lua-type[data-name=&amp;quot;bool&amp;quot;] a {&lt;br /&gt;
	background-color: #ffddff;&lt;br /&gt;
}&lt;br /&gt;
.lua-type[data-name=&amp;quot;number&amp;quot;] a, .lua-type[data-name=&amp;quot;numbers&amp;quot;] a, .lua-type[data-name=&amp;quot;integer&amp;quot;] a, .lua-type[data-name=&amp;quot;integers&amp;quot;] a, .lua-type[data-name=&amp;quot;double&amp;quot;] a, .lua-type[data-name=&amp;quot;doubles&amp;quot;] a {&lt;br /&gt;
	background-color: #ddddff;&lt;br /&gt;
}&lt;br /&gt;
.lua-type[data-name=&amp;quot;Vector&amp;quot;] {&lt;br /&gt;
	background-color: #ffeedd;&lt;br /&gt;
}&lt;br /&gt;
.lua-type[data-name=&amp;quot;Matri&amp;quot;] {&lt;br /&gt;
	background-color: #ffddee;&lt;br /&gt;
}&lt;br /&gt;
.lua-type.lua-type[data-missing] a {&lt;br /&gt;
	background-color: #ffdddd;&lt;br /&gt;
	color: #d73333;&lt;br /&gt;
}&lt;/div&gt;</summary>
		<author><name>PoolloverNathan</name></author>
	</entry>
	<entry>
		<id>https://wiki.figuramc.org/index.php?title=Template:Type&amp;diff=286</id>
		<title>Template:Type</title>
		<link rel="alternate" type="text/html" href="https://wiki.figuramc.org/index.php?title=Template:Type&amp;diff=286"/>
		<updated>2024-09-27T18:00:04Z</updated>

		<summary type="html">&lt;p&gt;PoolloverNathan: pass name through&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&amp;lt;includeonly&amp;gt;&amp;lt;templatestyles src=&amp;quot;Template:Type/style.css&amp;quot;/&amp;gt;{{#if:{{{3|{{{link|}}}}}}&lt;br /&gt;
 |{{type/link|{{{1}}}|mod={{{2|{{{mod|}}}}}}|link={{{3|{{{link}}}}}}}}&lt;br /&gt;
 |{{#switch:{{{1}}}&lt;br /&gt;
 | nil&lt;br /&gt;
 | number&lt;br /&gt;
 | numbers&lt;br /&gt;
 | double&lt;br /&gt;
 | doubles&lt;br /&gt;
 | integer&lt;br /&gt;
 | integers&lt;br /&gt;
 | string&lt;br /&gt;
 | strings&lt;br /&gt;
 | boolean&lt;br /&gt;
 | bool&lt;br /&gt;
 | booleans&lt;br /&gt;
 | true&lt;br /&gt;
 | false&lt;br /&gt;
 | function&lt;br /&gt;
 | functions&lt;br /&gt;
 | table&lt;br /&gt;
 | any&lt;br /&gt;
 | tables = {{type/builtin|{{{1}}}|mod={{{2|{{{mod|}}}}}}}}&lt;br /&gt;
 | Vectors&lt;br /&gt;
 | vectors&lt;br /&gt;
 | Vector2&lt;br /&gt;
 | Vector3&lt;br /&gt;
 | Vector4 = {{type/vector|{{{1}}}|name=Vector|mod={{{2|{{{mod|}}}}}}}}&lt;br /&gt;
 | Matrices&lt;br /&gt;
 | matrices&lt;br /&gt;
 | Matrix2&lt;br /&gt;
 | Matrix3&lt;br /&gt;
 | Matrix4 = {{type/vector|{{{1}}}|name=Matrix|mod={{{2|{{{mod|}}}}}}}}&lt;br /&gt;
 | {{type/custom|{{{1}}}|mod={{{2|{{{mod|}}}}}}}}&lt;br /&gt;
  }}&lt;br /&gt;
}}&amp;lt;/includeonly&amp;gt;&amp;lt;noinclude&amp;gt; &amp;lt;!-- Documentation starts here. --&amp;gt;&lt;br /&gt;
&#039;&#039;&#039;Displays a &#039;&#039;type widget&#039;&#039;.&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
* If a link is provided: [[Template:Type/link]]&lt;br /&gt;
* Built-in types: [[Template:Type/builtin]]&lt;br /&gt;
* Custom types (fallback): [[Template:Type/custom]]. If the page with &amp;lt;code&amp;gt;[argument 1] (type)&amp;lt;/code&amp;gt; (i.e. disambiguated) exists, that page will be used instead of the plain name for the link.&lt;br /&gt;
&lt;br /&gt;
Stylesheet: [[Template:Type/style.css]] (edit to add colors and decorations for custom types)&lt;br /&gt;
&lt;br /&gt;
== Examples ==&lt;br /&gt;
* {{type|nil}} &amp;lt;code&amp;gt;&amp;lt;nowiki&amp;gt;{{type|nil}}&amp;lt;/nowiki&amp;gt;&amp;lt;/code&amp;gt;&lt;br /&gt;
* {{type|number}}&lt;br /&gt;
* {{type|number|?}} (optional number)&lt;br /&gt;
* {{type|string}}&lt;br /&gt;
* {{type|boolean}}&lt;br /&gt;
* {{type|function}}&lt;br /&gt;
* {{type|table}}&lt;br /&gt;
* {{type|Vectors}} ({{type|Vector2}}, {{type|Vector3}}, {{type|Vector4}})&lt;br /&gt;
* {{type|Matrices}} ({{type|Matrix2}}, {{type|Matrix3}}, {{type|Matrix4}})&lt;br /&gt;
* {{type|Event}} (custom type that exists)&lt;br /&gt;
* {{type|CrashAPI}} (custom type that doesn&#039;t exist)&lt;br /&gt;
* {{type|Main Page|link=Main Page}} (links to the [[Main Page]]) &amp;lt;code&amp;gt;&amp;lt;nowiki&amp;gt;{{type|Main Page|link=Main Page}}&amp;lt;/nowiki&amp;gt;&amp;lt;/code&amp;gt;&lt;br /&gt;
[[Template:Type/testcases|Testcases page.]]&lt;br /&gt;
&amp;lt;templatedata&amp;gt;&lt;br /&gt;
{&lt;br /&gt;
	&amp;quot;params&amp;quot;: {&lt;br /&gt;
		&amp;quot;1&amp;quot;: {&lt;br /&gt;
			&amp;quot;label&amp;quot;: &amp;quot;Type name&amp;quot;,&lt;br /&gt;
			&amp;quot;suggestedvalues&amp;quot;: [&lt;br /&gt;
				&amp;quot;nil&amp;quot;,&lt;br /&gt;
				&amp;quot;boolean&amp;quot;,&lt;br /&gt;
				&amp;quot;integer&amp;quot;,&lt;br /&gt;
				&amp;quot;number&amp;quot;,&lt;br /&gt;
				&amp;quot;string&amp;quot;,&lt;br /&gt;
				&amp;quot;function&amp;quot;,&lt;br /&gt;
				&amp;quot;table&amp;quot;&lt;br /&gt;
			],&lt;br /&gt;
			&amp;quot;required&amp;quot;: true&lt;br /&gt;
		},&lt;br /&gt;
		&amp;quot;link&amp;quot;: {&lt;br /&gt;
			&amp;quot;aliases&amp;quot;: [&lt;br /&gt;
				&amp;quot;3&amp;quot;&lt;br /&gt;
			],&lt;br /&gt;
			&amp;quot;label&amp;quot;: &amp;quot;Custom link target&amp;quot;,&lt;br /&gt;
			&amp;quot;type&amp;quot;: &amp;quot;wiki-page-name&amp;quot;&lt;br /&gt;
		},&lt;br /&gt;
		&amp;quot;mod&amp;quot;: {&lt;br /&gt;
			&amp;quot;aliases&amp;quot;: [&lt;br /&gt;
				&amp;quot;2&amp;quot;&lt;br /&gt;
			],&lt;br /&gt;
			&amp;quot;label&amp;quot;: &amp;quot;Type modifiers&amp;quot;,&lt;br /&gt;
			&amp;quot;description&amp;quot;: &amp;quot;Modifiers to the type, like array / optional&amp;quot;,&lt;br /&gt;
			&amp;quot;type&amp;quot;: &amp;quot;content&amp;quot;,&lt;br /&gt;
			&amp;quot;suggestedvalues&amp;quot;: [&lt;br /&gt;
				&amp;quot;[]&amp;quot;,&lt;br /&gt;
				&amp;quot;?&amp;quot;,&lt;br /&gt;
				&amp;quot;[]?&amp;quot;&lt;br /&gt;
			]&lt;br /&gt;
		}&lt;br /&gt;
	},&lt;br /&gt;
	&amp;quot;description&amp;quot;: &amp;quot;Displays and links to types.&amp;quot;,&lt;br /&gt;
	&amp;quot;paramOrder&amp;quot;: [&lt;br /&gt;
		&amp;quot;1&amp;quot;,&lt;br /&gt;
		&amp;quot;mod&amp;quot;,&lt;br /&gt;
		&amp;quot;link&amp;quot;&lt;br /&gt;
	],&lt;br /&gt;
	&amp;quot;format&amp;quot;: &amp;quot;inline&amp;quot;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/templatedata&amp;gt;&amp;lt;/noinclude&amp;gt;&lt;/div&gt;</summary>
		<author><name>PoolloverNathan</name></author>
	</entry>
	<entry>
		<id>https://wiki.figuramc.org/index.php?title=Template:Type/style.css&amp;diff=285</id>
		<title>Template:Type/style.css</title>
		<link rel="alternate" type="text/html" href="https://wiki.figuramc.org/index.php?title=Template:Type/style.css&amp;diff=285"/>
		<updated>2024-09-27T17:58:18Z</updated>

		<summary type="html">&lt;p&gt;PoolloverNathan: colorize vectors &amp;amp; matrices&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;.lua-type {&lt;br /&gt;
	display: inline-flex;&lt;br /&gt;
	align-items: stretch;&lt;br /&gt;
	flex-flow: row nowrap;&lt;br /&gt;
	width: max-content;&lt;br /&gt;
	border-radius: 3px;&lt;br /&gt;
	overflow: hidden;&lt;br /&gt;
	font-family: monospace;&lt;br /&gt;
}&lt;br /&gt;
.lua-type a {&lt;br /&gt;
	border-radius: 3px;&lt;br /&gt;
	background-color: #eeeeee;&lt;br /&gt;
	padding: 0 3px;&lt;br /&gt;
	background-image: none;&lt;br /&gt;
	z-index: 2;&lt;br /&gt;
}&lt;br /&gt;
.lua-type .lua-type-mod {&lt;br /&gt;
	margin-left: -3px;&lt;br /&gt;
	padding: 0 3px 0 6px;&lt;br /&gt;
	background-color: #ffffff;&lt;br /&gt;
	border: 1px solid #dddddd;&lt;br /&gt;
	z-index: 1;&lt;br /&gt;
}&lt;br /&gt;
.lua-type a, .lua-type a:visited {&lt;br /&gt;
	color: #000000;&lt;br /&gt;
}&lt;br /&gt;
.lua-type[data-name=&amp;quot;nil&amp;quot;] a {&lt;br /&gt;
	background-color: #ffffff;&lt;br /&gt;
	border: 1px solid #808080;&lt;br /&gt;
}&lt;br /&gt;
.lua-type[data-name=&amp;quot;any&amp;quot;] a {&lt;br /&gt;
	background-color: #ffffff;&lt;br /&gt;
	border: 1px dotted #808080;&lt;br /&gt;
}&lt;br /&gt;
.lua-type[data-name=&amp;quot;table&amp;quot;] a, .lua-type[data-name=&amp;quot;tables&amp;quot;] a {&lt;br /&gt;
	background-color: #ffffdd;&lt;br /&gt;
}&lt;br /&gt;
.lua-type[data-name=&amp;quot;function&amp;quot;] a, .lua-type[data-name=&amp;quot;functions&amp;quot;] a {&lt;br /&gt;
	background-color: #eeddff;&lt;br /&gt;
}&lt;br /&gt;
.lua-type[data-name=&amp;quot;string&amp;quot;] a, .lua-type[data-name=&amp;quot;strings&amp;quot;] a {&lt;br /&gt;
	background-color: #ddffdd;&lt;br /&gt;
}&lt;br /&gt;
.lua-type[data-name=&amp;quot;boolean&amp;quot;] a, .lua-type[data-name=&amp;quot;booleans&amp;quot;] a, .lua-type[data-name=&amp;quot;bool&amp;quot;] a {&lt;br /&gt;
	background-color: #ffddff;&lt;br /&gt;
}&lt;br /&gt;
.lua-type[data-name=&amp;quot;number&amp;quot;] a, .lua-type[data-name=&amp;quot;numbers&amp;quot;] a, .lua-type[data-name=&amp;quot;integer&amp;quot;] a, .lua-type[data-name=&amp;quot;integers&amp;quot;] a, .lua-type[data-name=&amp;quot;double&amp;quot;] a, .lua-type[data-name=&amp;quot;doubles&amp;quot;] a {&lt;br /&gt;
	background-color: #ddddff;&lt;br /&gt;
}&lt;br /&gt;
.lua-type[data-name^=&amp;quot;vector&amp;quot;], .lua-type[data-name^=&amp;quot;Vector&amp;quot;] {&lt;br /&gt;
	background-color: #ffeedd;&lt;br /&gt;
}&lt;br /&gt;
.lua-type[data-name^=&amp;quot;matri&amp;quot;], .lua-type[data-name^=&amp;quot;Matri&amp;quot;] {&lt;br /&gt;
	background-color: #ffddee;&lt;br /&gt;
}&lt;br /&gt;
.lua-type.lua-type[data-missing] a {&lt;br /&gt;
	background-color: #ffdddd;&lt;br /&gt;
	color: #d73333;&lt;br /&gt;
}&lt;/div&gt;</summary>
		<author><name>PoolloverNathan</name></author>
	</entry>
	<entry>
		<id>https://wiki.figuramc.org/index.php?title=Template:Type&amp;diff=284</id>
		<title>Template:Type</title>
		<link rel="alternate" type="text/html" href="https://wiki.figuramc.org/index.php?title=Template:Type&amp;diff=284"/>
		<updated>2024-09-27T17:55:27Z</updated>

		<summary type="html">&lt;p&gt;PoolloverNathan: add vector/matrix support&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&amp;lt;includeonly&amp;gt;&amp;lt;templatestyles src=&amp;quot;Template:Type/style.css&amp;quot;/&amp;gt;{{#if:{{{3|{{{link|}}}}}}&lt;br /&gt;
 |{{type/link|{{{1}}}|mod={{{2|{{{mod|}}}}}}|link={{{3|{{{link}}}}}}}}&lt;br /&gt;
 |{{#switch:{{{1}}}&lt;br /&gt;
 | nil&lt;br /&gt;
 | number&lt;br /&gt;
 | numbers&lt;br /&gt;
 | double&lt;br /&gt;
 | doubles&lt;br /&gt;
 | integer&lt;br /&gt;
 | integers&lt;br /&gt;
 | string&lt;br /&gt;
 | strings&lt;br /&gt;
 | boolean&lt;br /&gt;
 | bool&lt;br /&gt;
 | booleans&lt;br /&gt;
 | true&lt;br /&gt;
 | false&lt;br /&gt;
 | function&lt;br /&gt;
 | functions&lt;br /&gt;
 | table&lt;br /&gt;
 | any&lt;br /&gt;
 | tables = {{type/builtin|{{{1}}}|mod={{{2|{{{mod|}}}}}}}}&lt;br /&gt;
 | Vectors&lt;br /&gt;
 | vectors&lt;br /&gt;
 | Vector2&lt;br /&gt;
 | Vector3&lt;br /&gt;
 | Vector4 = {{type/vector|{{{1}}}|mod={{{2|{{{mod|}}}}}}}}&lt;br /&gt;
 | Matrices&lt;br /&gt;
 | matrices&lt;br /&gt;
 | Matrix2&lt;br /&gt;
 | Matrix3&lt;br /&gt;
 | Matrix4 = {{type/vector|{{{1}}}|mod={{{2|{{{mod|}}}}}}}}&lt;br /&gt;
 | {{type/custom|{{{1}}}|mod={{{2|{{{mod|}}}}}}}}&lt;br /&gt;
  }}&lt;br /&gt;
}}&amp;lt;/includeonly&amp;gt;&amp;lt;noinclude&amp;gt; &amp;lt;!-- Documentation starts here. --&amp;gt;&lt;br /&gt;
&#039;&#039;&#039;Displays a &#039;&#039;type widget&#039;&#039;.&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
* If a link is provided: [[Template:Type/link]]&lt;br /&gt;
* Built-in types: [[Template:Type/builtin]]&lt;br /&gt;
* Custom types (fallback): [[Template:Type/custom]]. If the page with &amp;lt;code&amp;gt;[argument 1] (type)&amp;lt;/code&amp;gt; (i.e. disambiguated) exists, that page will be used instead of the plain name for the link.&lt;br /&gt;
&lt;br /&gt;
Stylesheet: [[Template:Type/style.css]] (edit to add colors and decorations for custom types)&lt;br /&gt;
&lt;br /&gt;
== Examples ==&lt;br /&gt;
* {{type|nil}} &amp;lt;code&amp;gt;&amp;lt;nowiki&amp;gt;{{type|nil}}&amp;lt;/nowiki&amp;gt;&amp;lt;/code&amp;gt;&lt;br /&gt;
* {{type|number}}&lt;br /&gt;
* {{type|number|?}} (optional number)&lt;br /&gt;
* {{type|string}}&lt;br /&gt;
* {{type|boolean}}&lt;br /&gt;
* {{type|function}}&lt;br /&gt;
* {{type|table}}&lt;br /&gt;
* {{type|Vectors}} ({{type|Vector2}}, {{type|Vector3}}, {{type|Vector4}})&lt;br /&gt;
* {{type|Matrices}} ({{type|Matrix2}}, {{type|Matrix3}}, {{type|Matrix4}})&lt;br /&gt;
* {{type|Event}} (custom type that exists)&lt;br /&gt;
* {{type|CrashAPI}} (custom type that doesn&#039;t exist)&lt;br /&gt;
* {{type|Main Page|link=Main Page}} (links to the [[Main Page]]) &amp;lt;code&amp;gt;&amp;lt;nowiki&amp;gt;{{type|Main Page|link=Main Page}}&amp;lt;/nowiki&amp;gt;&amp;lt;/code&amp;gt;&lt;br /&gt;
[[Template:Type/testcases|Testcases page.]]&lt;br /&gt;
&amp;lt;templatedata&amp;gt;&lt;br /&gt;
{&lt;br /&gt;
	&amp;quot;params&amp;quot;: {&lt;br /&gt;
		&amp;quot;1&amp;quot;: {&lt;br /&gt;
			&amp;quot;label&amp;quot;: &amp;quot;Type name&amp;quot;,&lt;br /&gt;
			&amp;quot;suggestedvalues&amp;quot;: [&lt;br /&gt;
				&amp;quot;nil&amp;quot;,&lt;br /&gt;
				&amp;quot;boolean&amp;quot;,&lt;br /&gt;
				&amp;quot;integer&amp;quot;,&lt;br /&gt;
				&amp;quot;number&amp;quot;,&lt;br /&gt;
				&amp;quot;string&amp;quot;,&lt;br /&gt;
				&amp;quot;function&amp;quot;,&lt;br /&gt;
				&amp;quot;table&amp;quot;&lt;br /&gt;
			],&lt;br /&gt;
			&amp;quot;required&amp;quot;: true&lt;br /&gt;
		},&lt;br /&gt;
		&amp;quot;link&amp;quot;: {&lt;br /&gt;
			&amp;quot;aliases&amp;quot;: [&lt;br /&gt;
				&amp;quot;3&amp;quot;&lt;br /&gt;
			],&lt;br /&gt;
			&amp;quot;label&amp;quot;: &amp;quot;Custom link target&amp;quot;,&lt;br /&gt;
			&amp;quot;type&amp;quot;: &amp;quot;wiki-page-name&amp;quot;&lt;br /&gt;
		},&lt;br /&gt;
		&amp;quot;mod&amp;quot;: {&lt;br /&gt;
			&amp;quot;aliases&amp;quot;: [&lt;br /&gt;
				&amp;quot;2&amp;quot;&lt;br /&gt;
			],&lt;br /&gt;
			&amp;quot;label&amp;quot;: &amp;quot;Type modifiers&amp;quot;,&lt;br /&gt;
			&amp;quot;description&amp;quot;: &amp;quot;Modifiers to the type, like array / optional&amp;quot;,&lt;br /&gt;
			&amp;quot;type&amp;quot;: &amp;quot;content&amp;quot;,&lt;br /&gt;
			&amp;quot;suggestedvalues&amp;quot;: [&lt;br /&gt;
				&amp;quot;[]&amp;quot;,&lt;br /&gt;
				&amp;quot;?&amp;quot;,&lt;br /&gt;
				&amp;quot;[]?&amp;quot;&lt;br /&gt;
			]&lt;br /&gt;
		}&lt;br /&gt;
	},&lt;br /&gt;
	&amp;quot;description&amp;quot;: &amp;quot;Displays and links to types.&amp;quot;,&lt;br /&gt;
	&amp;quot;paramOrder&amp;quot;: [&lt;br /&gt;
		&amp;quot;1&amp;quot;,&lt;br /&gt;
		&amp;quot;mod&amp;quot;,&lt;br /&gt;
		&amp;quot;link&amp;quot;&lt;br /&gt;
	],&lt;br /&gt;
	&amp;quot;format&amp;quot;: &amp;quot;inline&amp;quot;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/templatedata&amp;gt;&amp;lt;/noinclude&amp;gt;&lt;/div&gt;</summary>
		<author><name>PoolloverNathan</name></author>
	</entry>
	<entry>
		<id>https://wiki.figuramc.org/index.php?title=Template:Tagged&amp;diff=282</id>
		<title>Template:Tagged</title>
		<link rel="alternate" type="text/html" href="https://wiki.figuramc.org/index.php?title=Template:Tagged&amp;diff=282"/>
		<updated>2024-09-27T17:24:16Z</updated>

		<summary type="html">&lt;p&gt;PoolloverNathan: grid?&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&amp;lt;includeonly&amp;gt;&lt;br /&gt;
&amp;lt;span style=&amp;quot;display: inline-grid; grid-template-columns: max-content 1fr&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;span&amp;gt;&#039;&#039;&#039;{{{1}}}&#039;&#039;&#039;:&amp;amp;nbsp;&amp;lt;/span&amp;gt;&lt;br /&gt;
&amp;lt;span&amp;gt;{{{2}}}&amp;lt;/span&amp;gt;&lt;br /&gt;
&amp;lt;/span&amp;gt;&lt;br /&gt;
&amp;lt;/includeonly&amp;gt;&lt;br /&gt;
&amp;lt;noinclude&amp;gt;&lt;br /&gt;
testing inline text {{tagged|foo bar baz|bar baz bar bazbar bazbar bazbar bazbar bazbar bazbar bazbar bazbar bazbar bazbar bazbar bazbar bazbar bazbar bazbar bazbar bazbar baz bar bazbar bazbar bazbar bazbar bazbar bazbar bazbar bazbar bazbar bazbar bazbar bazbar bazbar bazbar bazbar bazbar baz}}&lt;br /&gt;
&amp;lt;/noinclude&amp;gt;&lt;/div&gt;</summary>
		<author><name>PoolloverNathan</name></author>
	</entry>
	<entry>
		<id>https://wiki.figuramc.org/index.php?title=Template:Tagged&amp;diff=281</id>
		<title>Template:Tagged</title>
		<link rel="alternate" type="text/html" href="https://wiki.figuramc.org/index.php?title=Template:Tagged&amp;diff=281"/>
		<updated>2024-09-27T17:21:19Z</updated>

		<summary type="html">&lt;p&gt;PoolloverNathan: fix&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&amp;lt;includeonly&amp;gt;&lt;br /&gt;
&amp;lt;div style=&amp;quot;display: inline-flex&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;div style=&amp;quot;flex: 0 0 auto&amp;quot;&amp;gt;&#039;&#039;&#039;{{{1}}}&#039;&#039;&#039;:&amp;amp;nbsp;&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;div style=&amp;quot;flex: 1 0 0&amp;quot;&amp;gt;&amp;lt;div style=&amp;quot;width: 100%&amp;quot;&amp;gt;{{{2}}}&amp;lt;/div&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;/includeonly&amp;gt;&lt;br /&gt;
&amp;lt;noinclude&amp;gt;&lt;br /&gt;
testing inline text {{tagged|foo bar baz|bar baz bar bazbar bazbar bazbar bazbar bazbar bazbar bazbar bazbar bazbar bazbar bazbar bazbar bazbar bazbar bazbar bazbar bazbar baz bar bazbar bazbar bazbar bazbar bazbar bazbar bazbar bazbar bazbar bazbar bazbar bazbar bazbar bazbar bazbar bazbar baz}}&lt;br /&gt;
&amp;lt;/noinclude&amp;gt;&lt;/div&gt;</summary>
		<author><name>PoolloverNathan</name></author>
	</entry>
	<entry>
		<id>https://wiki.figuramc.org/index.php?title=Tutorials/Commands&amp;diff=280</id>
		<title>Tutorials/Commands</title>
		<link rel="alternate" type="text/html" href="https://wiki.figuramc.org/index.php?title=Tutorials/Commands&amp;diff=280"/>
		<updated>2024-09-27T17:18:43Z</updated>

		<summary type="html">&lt;p&gt;PoolloverNathan: essentially rewrite&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Figura comes with a small set of commands to act as menu shortcuts or access advanced features. As Figura is a client-side mod, these only affect the client.&lt;br /&gt;
&lt;br /&gt;
{{note|Figura commands are &#039;&#039;&#039;only visible client-side&#039;&#039;&#039; and therefore cannot be used server-side (e.g. in command blocks or functions, or even in &amp;lt;code&amp;gt;/execute&amp;lt;/code&amp;gt;). If you try, it will appear as an invalid command.|tag=Warning|icon=⚠}}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span id=&amp;quot;normal-commands&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
&lt;br /&gt;
; &amp;lt;code name=&amp;quot;docs&amp;quot;&amp;gt;/figura docs&amp;lt;/code&amp;gt;&lt;br /&gt;
: This command allows you to quickly access a list of types (and their fields/methods) and enums (and their values), as well as a brief description for each one. Note that some internal docs may &lt;br /&gt;
&lt;br /&gt;
; &amp;lt;code name=&amp;quot;emojis&amp;gt;/figura emojis&amp;lt;/code&amp;gt;&lt;br /&gt;
: This command lists all the emojis added by Figura. &amp;lt;code&amp;gt;/figura emojis all&amp;lt;/code&amp;gt; can show you all of them at once.&lt;br /&gt;
&lt;br /&gt;
; &amp;lt;code name=&amp;quot;export_avatar&amp;gt;/figura export avatar&amp;lt;/code&amp;gt;&lt;br /&gt;
: This exports your currently saved avatar data to a file in your Figura directory. The&lt;br /&gt;
&lt;br /&gt;
; &amp;lt;code&amp;gt;/figura links&amp;lt;/code&amp;gt;&lt;br /&gt;
: This command prints a list of links to various Figura websites.&lt;br /&gt;
&lt;br /&gt;
; &amp;lt;code&amp;gt;/figura load &#039;&#039;directory&#039;&#039;&amp;lt;/code&amp;gt;&lt;br /&gt;
: This command loads a Figura avatar by the name of its &#039;&#039;directory&#039;&#039; in your avatars folder. This can be useful if you don&#039;t want to open the Figura menu, or you have a lot of avatars and don&#039;t want to search through them.&lt;br /&gt;
&lt;br /&gt;
; &amp;lt;code&amp;gt;/figura reload&amp;lt;/code&amp;gt;&lt;br /&gt;
: This command reloads your currently-selected avatar, equivalent to pressing your reload keybind.&lt;br /&gt;
&lt;br /&gt;
; &amp;lt;code&amp;gt;/figura run &#039;&#039;code&#039;&#039;&amp;lt;/code&amp;gt;&lt;br /&gt;
: This command runs the code you supply in the context of your avatar, with the ability to access any &#039;&#039;&#039;global&#039;&#039;&#039; variables you&#039;ve declared. If you don&#039;t have an avatar selected, or its script has errored. you will not be able to run code.&lt;br /&gt;
&lt;br /&gt;
== Debug Mode Commands ==&lt;br /&gt;
&lt;br /&gt;
More commands can be unlocked by turning Debug Mode on in Figura’s settings and rejoining the world..&lt;br /&gt;
&lt;br /&gt;
; &amp;lt;code name=&amp;quot;debug&amp;quot;&amp;gt;/figura debug&amp;lt;/code&amp;gt;&lt;br /&gt;
: This generates a file in your Figura directory that contains information about your Figura mod settings and the avatar you currently have equipped. This includes the file sizes of all of the elements in the avatar. &#039;&#039;This command is currently broken on Forge.&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
; &amp;lt;code name=&amp;quot;backend2&amp;quot;&amp;gt;/figura backend2&amp;lt;/code&amp;gt;&lt;br /&gt;
: Usage unknown; presumably used to test the Figura backend.&lt;br /&gt;
&lt;br /&gt;
; &amp;lt;code name=&amp;quot;set_avatar&amp;quot;&amp;gt;/figura set_avatar &#039;&#039;to&#039;&#039; &#039;&#039;from&#039;&#039;&amp;lt;/code&amp;gt;&lt;br /&gt;
: This command copies equipped avatars between entities, which allows you to e.g. test [[CEM]] avatars. Note that both arguments must be the entities&#039; &#039;&#039;&#039;UUIDs&#039;&#039;&#039; — merely their name or a selector will not be accepted.&lt;br /&gt;
: {{tagged|&amp;lt;code&amp;gt;to&amp;lt;/code&amp;gt;|This is the UUID of the entity you wish to set the avatar of. You can get the UUID by autocompleting a command, such as &amp;lt;code&amp;gt;/tp&amp;lt;/code&amp;gt;, while looking at them. (This command also works on players, somewhat.)}}&lt;br /&gt;
: {{tagged|&amp;lt;code&amp;gt;from&amp;lt;/code&amp;gt;|This is the UUID of the entity you want to copy the avatar &#039;&#039;from&#039;&#039;. You can acquire this by using the command &amp;lt;code&amp;gt;/list uuids&amp;lt;/code&amp;gt; (check your game logs if you wish to copy the output) or a website such as [https://mcuuid.net].}}&lt;/div&gt;</summary>
		<author><name>PoolloverNathan</name></author>
	</entry>
	<entry>
		<id>https://wiki.figuramc.org/index.php?title=Tutorial:Blinking&amp;diff=279</id>
		<title>Tutorial:Blinking</title>
		<link rel="alternate" type="text/html" href="https://wiki.figuramc.org/index.php?title=Tutorial:Blinking&amp;diff=279"/>
		<updated>2024-09-27T16:54:29Z</updated>

		<summary type="html">&lt;p&gt;PoolloverNathan: modelpart indexing reference&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[[File:EyeGroup.png|thumb]] Avatars may blink as a means to convey a character&#039;s personality and suggest liveliness. To blink, you must first have eyes that have been split into a separate [[ModelPart]]. Your script will scale this group to simulate blinking.&lt;br /&gt;
To begin with, define variables containing parameters the script will use: the [[ModelPart Indexing|path to]] the eye model, their height, and the length of the blinking animation.&lt;br /&gt;
&amp;lt;syntaxHighlight lang=&amp;quot;lua&amp;quot;&amp;gt;&lt;br /&gt;
local eyes = models.model.root.UpperBody.TheHead.Eyes&lt;br /&gt;
local EYE_HEIGHT = 2 --The height of your eyes in blockbench units&lt;br /&gt;
local BLINK_RATE = 4 * 20 -- 4 Seconds&lt;br /&gt;
&amp;lt;/syntaxHighlight&amp;gt;The &amp;lt;code&amp;gt;BLINK_RATE&amp;lt;/code&amp;gt; particle is multiplied by 20 as the script will deal in ticks, and there are 20 ticks in a second.&lt;br /&gt;
&lt;br /&gt;
Next, the logic that determines when to blink will be performed in a &amp;lt;code&amp;gt;TICK&amp;lt;/code&amp;gt; event. 4 new variables will also be needed to store the calculated position and scale for the eyes, alongside a simple timer. These will be initialised outside of the &amp;lt;code&amp;gt;TICK&amp;lt;/code&amp;gt; event.&lt;br /&gt;
&amp;lt;syntaxHighlight lang=&amp;quot;lua&amp;quot;&amp;gt;&lt;br /&gt;
local oldScale = vec(1, 1, 1)&lt;br /&gt;
local newScale = vec(1, 1, 1)&lt;br /&gt;
local oldPos = vec(0, 0, 0)&lt;br /&gt;
local newPos = vec(0, 0, 0)&lt;br /&gt;
&lt;br /&gt;
local tick = 0&lt;br /&gt;
function events.TICK()&lt;br /&gt;
  -- Sets old pos and scale for later interpolation&lt;br /&gt;
  oldPos = newPos&lt;br /&gt;
  oldScale = newScale&lt;br /&gt;
  tick = tick + 1&lt;br /&gt;
&lt;br /&gt;
  -- If time to blink, set new position and scale to close the eyes, otherwise open them&lt;br /&gt;
  if tick % BLINK_RATE == 0 then&lt;br /&gt;
    newScale = vec(1, 0, 1)&lt;br /&gt;
    newPos = vec(0, EYE_HEIGHT / -2, 0)&lt;br /&gt;
  else&lt;br /&gt;
    newScale = vec(1, 1, 1)&lt;br /&gt;
    newPos = vec(0, 0, 0)&lt;br /&gt;
  end&lt;br /&gt;
end&lt;br /&gt;
&amp;lt;/syntaxHighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
In order to give the blinking a smooth appearance, the rendered position and scale will be calculated and set in a &amp;lt;code&amp;gt;RENDER&amp;lt;/code&amp;gt; event, using the variables initialized earlier.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxHighlight lang=&amp;quot;lua&amp;quot;&amp;gt;&lt;br /&gt;
function events.RENDER(delta)&lt;br /&gt;
  -- This interpolates the blinking to make for a smooth blink&lt;br /&gt;
  local scale = math.lerp(oldScale, newScale, delta)&lt;br /&gt;
  local pos = math.lerp(oldPos, newPos, delta)&lt;br /&gt;
&lt;br /&gt;
  eyes:setPos(pos):setScale(scale)&lt;br /&gt;
end&lt;br /&gt;
&amp;lt;/syntaxHighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[[Category:Tutorials]]&lt;/div&gt;</summary>
		<author><name>PoolloverNathan</name></author>
	</entry>
	<entry>
		<id>https://wiki.figuramc.org/index.php?title=Tutorial:Blinking&amp;diff=278</id>
		<title>Tutorial:Blinking</title>
		<link rel="alternate" type="text/html" href="https://wiki.figuramc.org/index.php?title=Tutorial:Blinking&amp;diff=278"/>
		<updated>2024-09-27T16:53:30Z</updated>

		<summary type="html">&lt;p&gt;PoolloverNathan: move eye thingy&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[[File:EyeGroup.png|thumb]] Avatars may blink as a means to convey a character&#039;s personality and suggest liveliness. To blink, you must first have eyes that have been split into a separate [[ModelPart]]. Your script will scale this group to simulate blinking.&lt;br /&gt;
To begin with, define variables containing parameters the script will use: the path to the eye model, their height, and the length of the blinking animation.&lt;br /&gt;
&amp;lt;syntaxHighlight lang=&amp;quot;lua&amp;quot;&amp;gt;&lt;br /&gt;
local eyes = models.model.root.UpperBody.TheHead.Eyes&lt;br /&gt;
local EYE_HEIGHT = 2 --The height of your eyes in blockbench units&lt;br /&gt;
local BLINK_RATE = 4 * 20 -- 4 Seconds&lt;br /&gt;
&amp;lt;/syntaxHighlight&amp;gt;The &amp;lt;code&amp;gt;BLINK_RATE&amp;lt;/code&amp;gt; particle is multiplied by 20 as the script will deal in ticks, and there are 20 ticks in a second.&lt;br /&gt;
&lt;br /&gt;
Next, the logic that determines when to blink will be performed in a &amp;lt;code&amp;gt;TICK&amp;lt;/code&amp;gt; event. 4 new variables will also be needed to store the calculated position and scale for the eyes, alongside a simple timer. These will be initialised outside of the &amp;lt;code&amp;gt;TICK&amp;lt;/code&amp;gt; event.&lt;br /&gt;
&amp;lt;syntaxHighlight lang=&amp;quot;lua&amp;quot;&amp;gt;&lt;br /&gt;
local oldScale = vec(1, 1, 1)&lt;br /&gt;
local newScale = vec(1, 1, 1)&lt;br /&gt;
local oldPos = vec(0, 0, 0)&lt;br /&gt;
local newPos = vec(0, 0, 0)&lt;br /&gt;
&lt;br /&gt;
local tick = 0&lt;br /&gt;
function events.TICK()&lt;br /&gt;
  -- Sets old pos and scale for later interpolation&lt;br /&gt;
  oldPos = newPos&lt;br /&gt;
  oldScale = newScale&lt;br /&gt;
  tick = tick + 1&lt;br /&gt;
&lt;br /&gt;
  -- If time to blink, set new position and scale to close the eyes, otherwise open them&lt;br /&gt;
  if tick % BLINK_RATE == 0 then&lt;br /&gt;
    newScale = vec(1, 0, 1)&lt;br /&gt;
    newPos = vec(0, EYE_HEIGHT / -2, 0)&lt;br /&gt;
  else&lt;br /&gt;
    newScale = vec(1, 1, 1)&lt;br /&gt;
    newPos = vec(0, 0, 0)&lt;br /&gt;
  end&lt;br /&gt;
end&lt;br /&gt;
&amp;lt;/syntaxHighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
In order to give the blinking a smooth appearance, the rendered position and scale will be calculated and set in a &amp;lt;code&amp;gt;RENDER&amp;lt;/code&amp;gt; event, using the variables initialized earlier.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxHighlight lang=&amp;quot;lua&amp;quot;&amp;gt;&lt;br /&gt;
function events.RENDER(delta)&lt;br /&gt;
  -- This interpolates the blinking to make for a smooth blink&lt;br /&gt;
  local scale = math.lerp(oldScale, newScale, delta)&lt;br /&gt;
  local pos = math.lerp(oldPos, newPos, delta)&lt;br /&gt;
&lt;br /&gt;
  eyes:setPos(pos):setScale(scale)&lt;br /&gt;
end&lt;br /&gt;
&amp;lt;/syntaxHighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[[Category:Tutorials]]&lt;/div&gt;</summary>
		<author><name>PoolloverNathan</name></author>
	</entry>
	<entry>
		<id>https://wiki.figuramc.org/index.php?title=ModelPart&amp;diff=273</id>
		<title>ModelPart</title>
		<link rel="alternate" type="text/html" href="https://wiki.figuramc.org/index.php?title=ModelPart&amp;diff=273"/>
		<updated>2024-09-27T15:17:11Z</updated>

		<summary type="html">&lt;p&gt;PoolloverNathan: /* Child Manipulation */ who the fuck thought that was a good header&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;A ModelPart represents a Cube, Mesh, or Group from Blockbench.&lt;br /&gt;
&lt;br /&gt;
Via scripting, ModelParts can be modified dynamically to achieve whatever visuals you need (limited to Minecraft&#039;s rendering engine)&lt;br /&gt;
&lt;br /&gt;
== Accessing ModelParts ==&lt;br /&gt;
&amp;lt;code&amp;gt;models&amp;lt;/code&amp;gt; is the global that acts as the Root of your avatar and is where all ModelParts are stored, either as a child of &amp;lt;code&amp;gt;models&amp;lt;/code&amp;gt;, a child of a child, or further down the tree.&lt;br /&gt;
&lt;br /&gt;
Specifically, &amp;lt;code&amp;gt;models&amp;lt;/code&amp;gt;&#039;s children are Blockbench models. When an avatar is selected, not only are a bbmodel&#039;s Cubes, Meshes, and Groups converted into ModelParts, but the bbmodel file itself is converted into a ModelPart.&lt;br /&gt;
&lt;br /&gt;
To access a child ModelPart from a parent ModelPart, [https://www.lua.org/pil/2.5.html index] the parent using the child&#039;s name as a string.&lt;br /&gt;
&lt;br /&gt;
Example:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;lua&amp;quot;&amp;gt;&lt;br /&gt;
local bbmodel = models[&amp;quot;model&amp;quot;] -- access the bbmodel &amp;quot;model.bbmodel&amp;quot;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
This logic is the same for every single ModelPart. If you want to access a child, index the parent with the child&#039;s name.&lt;br /&gt;
&lt;br /&gt;
{{note|&amp;lt;code&amp;gt;models&amp;lt;/code&amp;gt; itself is a ModelPart. This allows you to apply transformations to the entire model, using e.g. &amp;lt;code&amp;gt;models:setScale(0.5)&amp;lt;/code&amp;gt;.|tag=Trivia|color=#A155DA}}&lt;br /&gt;
&lt;br /&gt;
The below example accesses the Head Group from the [[WikiExampleAvatar]]&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;lua&amp;quot;&amp;gt;&lt;br /&gt;
local head = models[&amp;quot;model&amp;quot;][&amp;quot;root&amp;quot;][&amp;quot;Head&amp;quot;]&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
If the above seems tedious, Lua provides a shorthand way of indexing with strings. It only works when the string contains no spaces or special characters.&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;lua&amp;quot;&amp;gt;&lt;br /&gt;
local head = models.model.root.Head&lt;br /&gt;
&lt;br /&gt;
-- Below is invalid, as the name contains spaces&lt;br /&gt;
local superMegaAwsomeThing = models.model.root.Super Mega Awsome Thing&lt;br /&gt;
&lt;br /&gt;
-- Super Mega Awsome Thing would need to be indexed with the normal method&lt;br /&gt;
local superMegaAwsomeThing = models.model.root[&amp;quot;Super Mega Awsome Thing&amp;quot;]&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== BBModels within folders ===&lt;br /&gt;
When a bbmodel is within a folder, Figura will actually turn the folder itself into a ModelPart. This can be confusing as ModelParts are the only thing that does this.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;lua&amp;quot;&amp;gt;&lt;br /&gt;
local folderHead = models.folder.model.root.Head&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== ModelPart ParentTypes ==&lt;br /&gt;
In Figura, a ParentType is applied to a ModelPart causing the ModelPart to behave in a predefined way. This behavior includes acting as a vanilla part like the Head or LeftLeg, moving the rendering of special parts like held items, armor, or parrots, and binding the ModelPart to the World instead of the Player.&lt;br /&gt;
&lt;br /&gt;
ParentTypes can either be applied in Blockbench itself or via script.&lt;br /&gt;
=== ParentTypes via BlockBench ===&lt;br /&gt;
To define a ParentType in Blockbench, the name of a Group must begin with a case-sensitive ParentType.&lt;br /&gt;
&lt;br /&gt;
For example, the &amp;lt;code&amp;gt;Head&amp;lt;/code&amp;gt; ParentType causes the ModelPart to move and rotate like the vanilla Head. If you name a Group the following, it will have this ParentType:&lt;br /&gt;
&lt;br /&gt;
* Head&lt;br /&gt;
* HEAD&lt;br /&gt;
* Head2&lt;br /&gt;
* HeadPhones&lt;br /&gt;
&lt;br /&gt;
If you name a group the following, &amp;lt;b&amp;gt;it will not&amp;lt;/b&amp;gt; have the &amp;lt;code&amp;gt;Head&amp;lt;/code&amp;gt; ParentType:&lt;br /&gt;
&lt;br /&gt;
* head    =&amp;gt; &#039;head&#039; is not a valid ParentType. Capitalization matters!&lt;br /&gt;
* BigHead =&amp;gt; Does not begin with ParentType&lt;br /&gt;
* HeAd    =&amp;gt; &#039;HeAd&#039; is not a valid ParentType. Capitalization matters!&lt;br /&gt;
&lt;br /&gt;
Do note that some English words naturally start with a ParentType which can cause unintended behavior!&lt;br /&gt;
&lt;br /&gt;
For example, the word &amp;quot;Guitar&amp;quot;. Seems innocent, right? Well, &amp;quot;Guitar&amp;quot; starts with &amp;quot;Gui&amp;quot;, and &amp;quot;Gui&amp;quot; is an alias for the ParentType &amp;lt;code&amp;gt;Hud&amp;lt;/code&amp;gt;, a ParentType that binds the ModelPart to the Heads Up Display where the hotbar and inventory reside. This causes the ModelPart to not be visible, as &amp;lt;code&amp;gt;Hud&amp;lt;/code&amp;gt; parts have special rules. Be careful!&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;Note: ParentTypes are sometimes called Keywords by legacy Figura users&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== ParentTypes via Script ===&lt;br /&gt;
Calling the &amp;lt;code&amp;gt;setParentType&amp;lt;/code&amp;gt; on &amp;lt;em&amp;gt;any&amp;lt;/em&amp;gt; ModelPart will override it&#039;s ParentType.&lt;br /&gt;
&lt;br /&gt;
Simply [[ModelParts#Accessing_ModelParts|access]] the ModelPart, then call &amp;lt;code&amp;gt;setParentType&amp;lt;/code&amp;gt; on it, passing in the ParentType as a string.&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;lua&amp;quot;&amp;gt;&lt;br /&gt;
local head = models.model.root.Head&lt;br /&gt;
head:setParentType(&amp;quot;RightArm&amp;quot;)&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
To remove a ParentType from a ModelPart, call &amp;lt;code&amp;gt;setParentType&amp;lt;/code&amp;gt; with the string &amp;lt;code&amp;gt;&amp;quot;None&amp;quot;&amp;lt;/code&amp;gt;&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;lua&amp;quot;&amp;gt;&lt;br /&gt;
local head = models.model.root.Head&lt;br /&gt;
head:setParentType(&amp;quot;None&amp;quot;)&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
ModelParts &amp;lt;b&amp;gt;do not&amp;lt;/b&amp;gt; remember their original ParentType! If you need a ModelPart&#039;s original ParentType, store it in a variable for later:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;lua&amp;quot;&amp;gt;&lt;br /&gt;
local head = models.model.root.Head&lt;br /&gt;
local headParentType = head:getParentType()&lt;br /&gt;
head:setParentType(&amp;quot;None&amp;quot;)&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
== ModelPart Methods ==&lt;br /&gt;
&lt;br /&gt;
=== ModelPart Properties ===&lt;br /&gt;
Read-only properties of a ModelPart&lt;br /&gt;
&lt;br /&gt;
==== &amp;lt;code&amp;gt;ModelPart:getName&amp;lt;/code&amp;gt; ====&lt;br /&gt;
Returns the name of this ModelPart. ModelParts can have duplicate names.&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Arguments !! Return Type&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;getName()&amp;lt;/code&amp;gt;&lt;br /&gt;
| {{type|string}}&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;lua&amp;quot;&amp;gt;&lt;br /&gt;
local head = models.model.root.Head&lt;br /&gt;
print(head:getName()) --&amp;gt; &amp;quot;Head&amp;quot;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== &amp;lt;code&amp;gt;ModelPart:getType&amp;lt;/code&amp;gt; ====&lt;br /&gt;
Returns the original type of this ModelPart. Can be &amp;lt;code&amp;gt;Cube&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;Mesh&amp;lt;/code&amp;gt;, or &amp;lt;code&amp;gt;Group&amp;lt;/code&amp;gt;. BBModels and folders are considered Groups. Cubes with no texture data are also considered Groups, as with no texture data their face data is stripped.&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Arguments !! Return Type&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;getType()&amp;lt;/code&amp;gt;&lt;br /&gt;
|| &amp;lt;code&amp;gt;&amp;quot;Cube&amp;quot; | &amp;quot;Mesh&amp;quot; | &amp;quot;Group&amp;quot;&amp;lt;/code&amp;gt;&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;lua&amp;quot;&amp;gt;&lt;br /&gt;
local head = models.model.root.Head&lt;br /&gt;
print(head:getType()) --&amp;gt; &amp;quot;Group&amp;quot;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Editing ModelPart Hierarchy ===&lt;br /&gt;
Methods relating to getting other ModelParts and manipulating the ModelPart tree&lt;br /&gt;
&lt;br /&gt;
==== &amp;lt;code&amp;gt;ModelPart:getParent&amp;lt;/code&amp;gt; ====&lt;br /&gt;
Returns the parent of this ModelPart, or &amp;lt;code&amp;gt;nil&amp;lt;/code&amp;gt; if this is &amp;lt;code&amp;gt;models&amp;lt;/code&amp;gt; or a loose ModelPart created via script.&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Arguments !! Return Type&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;getParent()&amp;lt;/code&amp;gt;&lt;br /&gt;
|| {{type|ModelPart}} | {{type|nil}}&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;lua&amp;quot;&amp;gt;&lt;br /&gt;
local head = models.model.root.Head&lt;br /&gt;
print(head:getParent()) --&amp;gt; ModelPart(root)&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== &amp;lt;code&amp;gt;ModelPart:getChildren&amp;lt;/code&amp;gt; ====&lt;br /&gt;
Returns an array of all children of this ModelPart&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Arguments !! Return Type&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;getChildren()&amp;lt;/code&amp;gt;&lt;br /&gt;
|| {{type|ModelPart|[]}}&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;lua&amp;quot;&amp;gt;&lt;br /&gt;
local root = models.model.root&lt;br /&gt;
print(root:getChildren()) --[[&lt;br /&gt;
ModelPart(Head), &lt;br /&gt;
ModelPart(Body), &lt;br /&gt;
ModelPart(RightArm), &lt;br /&gt;
ModelPart(LeftArm), &lt;br /&gt;
ModelPart(RightLeg), &lt;br /&gt;
ModelPart(LeftLeg),&lt;br /&gt;
]]--&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== &amp;lt;code&amp;gt;ModelPart:isChildOf&amp;lt;/code&amp;gt; ====&lt;br /&gt;
Recursively checks if this child is a decedent of the provided ModelPart.&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Arguments !! Return Type&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;isChildOf(part {{type|ModelPart}})&amp;lt;/code&amp;gt;&lt;br /&gt;
|| {{type|boolean}}&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;lua&amp;quot;&amp;gt;&lt;br /&gt;
local model = models.model&lt;br /&gt;
local head = model.root.Head&lt;br /&gt;
print(head:isChildOf(model)) --&amp;gt; true&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== &amp;lt;code&amp;gt;ModelPart:copy&amp;lt;/code&amp;gt; ====&lt;br /&gt;
Copies the data of this ModelPart, assigning it a new name, then returning it. The new name has nothing to do with ParentTypes. The children of the copy are references to the original ModelPart&#039;s children. Extra work needs to be done to recursively copy it&#039;s children. The [[ModelPart#ModelPart_addChild|addChild]] method can then be used to add the copy to the ModelPart tree.&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Arguments !! Return Type&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;copy(newName {{type|string}})&amp;lt;/code&amp;gt;&lt;br /&gt;
|| {{type|ModelPart}}&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;lua&amp;quot;&amp;gt;&lt;br /&gt;
local head = models.model.root.Head&lt;br /&gt;
&lt;br /&gt;
local headCopy = head:copy(&amp;quot;NewHead&amp;quot;)&lt;br /&gt;
print(headCopy) --&amp;gt; ModelPart(NewHead)&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;lua&amp;quot;&amp;gt;&lt;br /&gt;
-- The parentType is copied with the ModelPart&lt;br /&gt;
local head = models.model.root.Head&lt;br /&gt;
&lt;br /&gt;
local headCopy = head:copy(&amp;quot;NewHead&amp;quot;)&lt;br /&gt;
print(headCopy:getParentType()) --&amp;gt; &amp;quot;Head&amp;quot;&lt;br /&gt;
&lt;br /&gt;
headCopy:setParentType(&amp;quot;None&amp;quot;)&lt;br /&gt;
print(headCopy:getParentType()) --&amp;gt; &amp;quot;None&amp;quot;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&#039;&#039;&#039;@see&#039;&#039;&#039; [[ModelParts#ModelPart:setParentType|setParentType]], [[ModelParts#ModelPart:getParentType|getParentType]]&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;lua&amp;quot;&amp;gt;&lt;br /&gt;
-- Extra work is needed to deep copy a ModelPart&#039;s children as well&lt;br /&gt;
local function deepCopy(model)&lt;br /&gt;
    local copy = model:copy(model:getName())&lt;br /&gt;
    for _, child in pairs(copy:getChildren()) do&lt;br /&gt;
        copy:removeChild(child):addChild(deepCopy(child))&lt;br /&gt;
    end&lt;br /&gt;
    return copy&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
local head = models.model.root.Head&lt;br /&gt;
local headCube = head.Head&lt;br /&gt;
&lt;br /&gt;
-- headCopyA contains references to head&#039;s children because it is a shallow copy&lt;br /&gt;
local headCopyA = head:copy(&amp;quot;NewHead&amp;quot;)&lt;br /&gt;
print(headCopyA.Head == headCube) --&amp;gt; true&lt;br /&gt;
&lt;br /&gt;
-- headCopyB contains true copies of head&#039;s children as it was passed through a function that recursively copies children&lt;br /&gt;
local headCopyB = deepCopy(head)&lt;br /&gt;
print(headCopyB.Head == headCube) --&amp;gt; false&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&#039;&#039;&#039;@see&#039;&#039;&#039; [[ModelParts#ModelPart:getName|getName]], [[ModelParts#ModelPart:getChildren|getChildren]], [[ModelParts#ModelPart:addChild|addChild]], [[ModelParts#ModelPart:removeChild|removeChild]]&lt;br /&gt;
&lt;br /&gt;
==== &amp;lt;code&amp;gt;ModelPart:addChild&amp;lt;/code&amp;gt; ====&lt;br /&gt;
Adds the provided ModelPart as one of this ModelPart&#039;s children. Beware of adding a parent of this ModelPart as a child! This method returns this ModelPart for method chaining.&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Arguments !! Return Type&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;addChild(part {{type|ModelPart}})&amp;lt;/code&amp;gt;&lt;br /&gt;
|| self {{type|ModelPart}}&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;lua&amp;quot;&amp;gt;&lt;br /&gt;
local root = models.model.root&lt;br /&gt;
local headCopy = root.Head:copy(&amp;quot;NewHead&amp;quot;)&lt;br /&gt;
root:addChild(headCopy)&lt;br /&gt;
headCopy:setPos(10,0,0)&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&#039;&#039;&#039;@see&#039;&#039;&#039; [[ModelParts#ModelPart:copy|copy]], [[ModelParts#ModelPart:setPos|setPos]]&lt;br /&gt;
&lt;br /&gt;
==== &amp;lt;code&amp;gt;ModelPart:removeChild&amp;lt;/code&amp;gt; ====&lt;br /&gt;
Removes a child from this ModelPart. Takes in the child ModelPart itself. This method returns this ModelPart for method chaining.&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Arguments !! Return Type&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;removeChild(partToRemove {{type|ModelPart}})&amp;lt;/code&amp;gt;&lt;br /&gt;
| self {{type|ModelPart}}&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;lua&amp;quot;&amp;gt;&lt;br /&gt;
local root = models.model.root&lt;br /&gt;
local head = root.Head&lt;br /&gt;
root:removeChild(head) -- Bye bye Head!&lt;br /&gt;
&lt;br /&gt;
-- Head is still valid and can be re-added later, so long as we keep a variable referencing it.&lt;br /&gt;
print(head) --&amp;gt; ModelPart(Head)&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== &amp;lt;code&amp;gt;ModelPart:remove&amp;lt;/code&amp;gt; ====&lt;br /&gt;
Removes this ModelPart from the parent&#039;s child list. Returns self&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Arguments !! Return Type&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;remove()&amp;lt;/code&amp;gt;&lt;br /&gt;
| self {{type|ModelPart}}&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;lua&amp;quot;&amp;gt;&lt;br /&gt;
local head = models.model.root.Head&lt;br /&gt;
head:remove() -- Bye bye Head!&lt;br /&gt;
&lt;br /&gt;
-- Head is still valid and can be re-added, so long as we keep a variable referencing it.&lt;br /&gt;
print(head) --&amp;gt; ModelPart(Head)&lt;br /&gt;
models.model.root.LeftLeg:addChild(head)&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&#039;&#039;&#039;@see&#039;&#039;&#039; [[ModelParts#ModelPart:addChild|addChild]]&lt;br /&gt;
&lt;br /&gt;
=== Manipulation ===&lt;br /&gt;
Methods relating to manipulating the ModelPart within physical space&lt;br /&gt;
&lt;br /&gt;
==== &amp;lt;code&amp;gt;ModelPart:setPos&amp;lt;/code&amp;gt; ====&lt;br /&gt;
Sets the offset of the the position of the ModelPart. Position translation applies on the local rotation axis.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;nil&amp;lt;/code&amp;gt; values are interpreted as 0.&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Arguments !! Return Type&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;setPos(pos {{type|Vector3}})&amp;lt;/code&amp;gt;&lt;br /&gt;
| self {{type|ModelPart}}&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;setPos(x {{type|number}}, y {{type|number}}, z {{type|number}})&amp;lt;/code&amp;gt;&lt;br /&gt;
| self {{type|ModelPart}}&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;lua&amp;quot;&amp;gt;&lt;br /&gt;
local head = models.model.root.Head&lt;br /&gt;
&lt;br /&gt;
-- Move 10 units on the local y axis&lt;br /&gt;
head:setPos(0, 10, 0)&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== &amp;lt;code&amp;gt;ModelPart:getPos&amp;lt;/code&amp;gt; ====&lt;br /&gt;
Returns the value that was used for &amp;lt;code&amp;gt;setPos&amp;lt;/code&amp;gt;.  Always 0,0,0 when script begins.&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Arguments !! Return Type&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;getPos()&amp;lt;/code&amp;gt;&lt;br /&gt;
| {{type|Vector3}}&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;lua&amp;quot;&amp;gt;&lt;br /&gt;
local head = models.model.root.Head&lt;br /&gt;
&lt;br /&gt;
print(head:getPos()) --&amp;gt; vec(0,0,0)&lt;br /&gt;
head:setPos(0, 10, 0)&lt;br /&gt;
print(head:getPos()) --&amp;gt; vec(0,10,0)&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&#039;&#039;&#039;@see&#039;&#039;&#039; [[ModelParts#ModelPart:setPos|setPos]]&lt;br /&gt;
&lt;br /&gt;
==== &amp;lt;code&amp;gt;ModelPart:setRot&amp;lt;/code&amp;gt; ====&lt;br /&gt;
Sets the rotation of the ModelPart. Rotates the ModelPart around the PivotPoint.&lt;br /&gt;
&lt;br /&gt;
Angles are interpreted as degrees. &amp;lt;code&amp;gt;nil&amp;lt;/code&amp;gt; values are interpreted as 0.&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Arguments !! Return Type&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;setRot(rot {{type|Vector3}})&amp;lt;/code&amp;gt;&lt;br /&gt;
| self {{type|ModelPart}}&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;setRot(pitch {{type|number}}, yaw {{type|number}}, roll {{type|number}})&amp;lt;/code&amp;gt;&lt;br /&gt;
| self {{type|ModelPart}}&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;lua&amp;quot;&amp;gt;&lt;br /&gt;
local head = models.model.root.Head&lt;br /&gt;
&lt;br /&gt;
-- Rotate 45 degrees on the x axis, causing the avatar to look down&lt;br /&gt;
head:setRot(0, 45, 0)&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== &amp;lt;code&amp;gt;ModelPart:getRot&amp;lt;/code&amp;gt; ====&lt;br /&gt;
Returns the value that was used for &amp;lt;code&amp;gt;setRot&amp;lt;/code&amp;gt;. Will be the Rotation values defined in BlockBench when script begins.&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Arguments !! Return Type&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;getRot()&amp;lt;/code&amp;gt;&lt;br /&gt;
| {{type|Vector3}}&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;lua&amp;quot;&amp;gt;&lt;br /&gt;
local head = models.model.root.Head&lt;br /&gt;
&lt;br /&gt;
print(head:getRot()) --&amp;gt; vec(0,0,0) -- Most ModelParts will not have a rotation set in blockbench&lt;br /&gt;
head:setRot(45, 0, 0)&lt;br /&gt;
print(head:getPos()) --&amp;gt; vec(45,0,0)&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&#039;&#039;&#039;@see&#039;&#039;&#039; [[ModelParts#ModelPart:setRot|setRot]]&lt;br /&gt;
&lt;br /&gt;
==== &amp;lt;code&amp;gt;ModelPart:setScale&amp;lt;/code&amp;gt; ====&lt;br /&gt;
Sets the scale of the ModelPart. Scales the ModelPart around the PivotPoint.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;nil&amp;lt;/code&amp;gt; values are interpreted as 1. If a number is provided for x and both y and z are not defined, x will be used for all 3 axis.&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Arguments !! Return Type&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;setScale(scale {{type|Vector3}})&amp;lt;/code&amp;gt;&lt;br /&gt;
| self {{type|ModelPart}}&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;setScale(scaleAll {{type|number}})&amp;lt;/code&amp;gt;&lt;br /&gt;
| self {{type|ModelPart}}&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;setScale(x {{type|number}}, y {{type|number}}, z {{type|number}})&amp;lt;/code&amp;gt;&lt;br /&gt;
| self {{type|ModelPart}}&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;lua&amp;quot;&amp;gt;&lt;br /&gt;
local head = models.model.root.Head&lt;br /&gt;
-- Double the size of the head&lt;br /&gt;
head:setScale(2)&lt;br /&gt;
-- Squishes and stretches the entire model&lt;br /&gt;
models.model:setScale(1.5, 0.75, 1.5)&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== &amp;lt;code&amp;gt;ModelPart:getScale&amp;lt;/code&amp;gt; ====&lt;br /&gt;
Returns the value that was used for &amp;lt;code&amp;gt;setScale&amp;lt;/code&amp;gt;.  Always 1,1,1 when script begins.&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Arguments !! Return Type&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;getScale()&amp;lt;/code&amp;gt;&lt;br /&gt;
| {{type|Vector3}}&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;lua&amp;quot;&amp;gt;&lt;br /&gt;
local head = models.model.root.Head&lt;br /&gt;
&lt;br /&gt;
print(head:getScale()) --&amp;gt; vec(1,1,1)&lt;br /&gt;
head:setScale(2)&lt;br /&gt;
print(head:getScale()) --&amp;gt; vec(2,2,2)&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&#039;&#039;&#039;@see&#039;&#039;&#039; [[ModelParts#ModelPart:setScale|setScale]]&lt;br /&gt;
&lt;br /&gt;
==== &amp;lt;code&amp;gt;ModelPart:setPivot&amp;lt;/code&amp;gt; ====&lt;br /&gt;
Sets the pivot point of the ModelPart. &#039;&#039;This overrides the pivot point defined in blockbench.&#039;&#039; It is recommended to use [[ModelParts#ModelPart:setOffsetPivot|setOffsetPivot]] instead.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;nil&amp;lt;/code&amp;gt; values are interpreted as 0.&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Arguments !! Return Type&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;setPivot(pivot {{type|Vector3}})&amp;lt;/code&amp;gt;&lt;br /&gt;
| self {{type|ModelPart}}&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;setPivot(x {{type|number}}, y {{type|number}}, z {{type|number}})&amp;lt;/code&amp;gt;&lt;br /&gt;
| self {{type|ModelPart}}&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;lua&amp;quot;&amp;gt;&lt;br /&gt;
local head = models.model.root.Head&lt;br /&gt;
&lt;br /&gt;
-- For a normal size humanoid model, the Head&#039;s pivot point is usually at 0,24,0&lt;br /&gt;
-- If we assume that the Head cube is an 8x8x8 cube,&lt;br /&gt;
-- then the head will rotate around the center of the cube instead of the neck&lt;br /&gt;
head:setPivot(0, 28, 0)&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== &amp;lt;code&amp;gt;ModelPart:getPivot&amp;lt;/code&amp;gt; ====&lt;br /&gt;
Returns the Pivot Point defined in BlockBench, or the value set by &amp;lt;code&amp;gt;setPivot&amp;lt;/code&amp;gt; if it was already overwritten.&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Arguments !! Return Type&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;getPivot()&amp;lt;/code&amp;gt;&lt;br /&gt;
| {{type|Vector3}}&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;lua&amp;quot;&amp;gt;&lt;br /&gt;
local head = models.model.root.Head&lt;br /&gt;
&lt;br /&gt;
-- The Head group&#039;s pivot point for a humanoid model is usually at 0,24,0&lt;br /&gt;
print(head:getPivot()) --&amp;gt; vec(0,24,0)&lt;br /&gt;
head:setPivot(0,0,0)&lt;br /&gt;
-- We have completely ruined the rendering of this ModelPart&lt;br /&gt;
print(head:getPivot()) --&amp;gt; vec(0,0,0)&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&#039;&#039;&#039;@see&#039;&#039;&#039; [[ModelParts#ModelPart:setPivot|setPivot]]&lt;br /&gt;
&lt;br /&gt;
==== &amp;lt;code&amp;gt;ModelPart:setOffsetRot&amp;lt;/code&amp;gt; ====&lt;br /&gt;
Sets a rotation value that will be added to the ModelPart&#039;s rotation.&lt;br /&gt;
&lt;br /&gt;
Angles are interpreted as degrees. &amp;lt;code&amp;gt;nil&amp;lt;/code&amp;gt; values are interpreted as 0.&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Arguments !! Return Type&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;setOffsetRot(rot {{type|Vector3}})&amp;lt;/code&amp;gt;&lt;br /&gt;
| self {{type|ModelPart}}&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;setOffsetRot(pitch {{type|number}}, yaw {{type|number}}, roll {{type|number}})&amp;lt;/code&amp;gt;&lt;br /&gt;
| self {{type|ModelPart}}&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;lua&amp;quot;&amp;gt;&lt;br /&gt;
local head = models.model.root.Head&lt;br /&gt;
&lt;br /&gt;
-- ModelParts inherit their rotation from blockbench. The Head usually has a rotation of 0,0,0 for consistency with the vanilla model&lt;br /&gt;
print(head:getRot()) --&amp;gt; vec(0,0,0)&lt;br /&gt;
-- Set the offset to 45 degrees on the x axis, causing the avatar to look down&lt;br /&gt;
head:setOffsetRot(0, 45, 0)&lt;br /&gt;
-- The original rotation is unchanged.&lt;br /&gt;
print(head:getRot()) --&amp;gt; vec(0,0,0)&lt;br /&gt;
&lt;br /&gt;
-- setOffsetRot is not additive.&lt;br /&gt;
head:setOffsetRot(0, 25, 0)&lt;br /&gt;
print(head:getOffsetRot()) --&amp;gt; vec(0,25,0)&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&#039;&#039;&#039;@see&#039;&#039;&#039; [[ModelParts#ModelPart:getRot|getRot]] [[ModelParts#ModelPart:getOffsetRot|getOffsetRot]]&lt;br /&gt;
&lt;br /&gt;
==== &amp;lt;code&amp;gt;ModelPart:getOffsetRot&amp;lt;/code&amp;gt; ====&lt;br /&gt;
Returns the value that was used for &amp;lt;code&amp;gt;setOffsetRot&amp;lt;/code&amp;gt;. Will be 0,0,0 when the script begins&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Arguments !! Return Type&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;getOffsetRot()&amp;lt;/code&amp;gt;&lt;br /&gt;
| {{type|Vector3}}&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;lua&amp;quot;&amp;gt;&lt;br /&gt;
local head = models.model.root.Head&lt;br /&gt;
&lt;br /&gt;
print(head:getOffsetRot()) --&amp;gt; vec(0,0,0)&lt;br /&gt;
head:setOffsetRot(45, 0, 0)&lt;br /&gt;
print(head:getOffsetRot()) --&amp;gt; vec(45,0,0)&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&#039;&#039;&#039;@see&#039;&#039;&#039; [[ModelParts#ModelPart:setOffsetRot|setOffsetRot]]&lt;br /&gt;
&lt;br /&gt;
==== &amp;lt;code&amp;gt;ModelPart:setOffsetScale&amp;lt;/code&amp;gt; ====&lt;br /&gt;
Sets a scale value that will be multiplied with the ModelPart&#039;s scale.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;nil&amp;lt;/code&amp;gt; values are interpreted as 1. If a number is provided for x and both y and z are not defined, x will be used for all 3 axis.&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Arguments !! Return Type&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;setOffsetScale(scale {{type|Vector3}})&amp;lt;/code&amp;gt;&lt;br /&gt;
| self {{type|ModelPart}}&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;setOffsetScale(scaleAll {{type|number}})&amp;lt;/code&amp;gt;&lt;br /&gt;
| self {{type|ModelPart}}&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;setOffsetScale(x {{type|number}}, y {{type|number}}, z {{type|number}})&amp;lt;/code&amp;gt;&lt;br /&gt;
| self {{type|ModelPart}}&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;lua&amp;quot;&amp;gt;&lt;br /&gt;
local head = models.model.root.Head&lt;br /&gt;
-- Double the size of the head&lt;br /&gt;
head:setScale(2)&lt;br /&gt;
-- Half the size of the head&lt;br /&gt;
head:setOffsetScale(0.5)&lt;br /&gt;
-- Results in no changes&lt;br /&gt;
-- I have no idea what this is used for&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== &amp;lt;code&amp;gt;ModelPart:getOffsetScale&amp;lt;/code&amp;gt; ====&lt;br /&gt;
Returns the value that was used for &amp;lt;code&amp;gt;setOffsetScale&amp;lt;/code&amp;gt;.  Always 1,1,1 when script begins.&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Arguments !! Return Type&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;getOffsetScale()&amp;lt;/code&amp;gt;&lt;br /&gt;
| {{type|Vector3}}&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;lua&amp;quot;&amp;gt;&lt;br /&gt;
local head = models.model.root.Head&lt;br /&gt;
&lt;br /&gt;
print(head:getOffsetScale()) --&amp;gt; vec(1,1,1)&lt;br /&gt;
head:setOffsetScale(2)&lt;br /&gt;
print(head:getOffsetScale()) --&amp;gt; vec(2,2,2)&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&#039;&#039;&#039;@see&#039;&#039;&#039; [[ModelParts#ModelPart:setOffsetScale|setOffsetScale]]&lt;br /&gt;
&lt;br /&gt;
==== &amp;lt;code&amp;gt;ModelPart:setOffsetPivot&amp;lt;/code&amp;gt; ====&lt;br /&gt;
Sets a value that will be added to the ModelPart&#039;s pivot point.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;nil&amp;lt;/code&amp;gt; values are interpreted as 0.&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Arguments !! Return Type&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;setOffsetPivot(pivot {{type|Vector3}})&amp;lt;/code&amp;gt;&lt;br /&gt;
| self {{type|ModelPart}}&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;setOffsetPivot(x {{type|number}}, y {{type|number}}, z {{type|number}})&amp;lt;/code&amp;gt;&lt;br /&gt;
| self {{type|ModelPart}}&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;lua&amp;quot;&amp;gt;&lt;br /&gt;
local head = models.model.root.Head&lt;br /&gt;
&lt;br /&gt;
-- If we assume that the Head cube is an 8x8x8 cube and offset the pivot up by 4,&lt;br /&gt;
-- then the head will rotate around the center of the cube instead of the neck&lt;br /&gt;
head:setOffsetPivot(0, 4, 0)&lt;br /&gt;
-- Notice that we did not need to know the original pivot point to do this&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== &amp;lt;code&amp;gt;ModelPart:getOffsetPivot&amp;lt;/code&amp;gt; ====&lt;br /&gt;
Returns the value that was used for &amp;lt;code&amp;gt;setOffsetPivot&amp;lt;/code&amp;gt;.  Always 0,0,0 when script begins.&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Arguments !! Return Type&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;getOffsetPivot()&amp;lt;/code&amp;gt;&lt;br /&gt;
| {{type|Vector3}}&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;lua&amp;quot;&amp;gt;&lt;br /&gt;
local head = models.model.root.Head&lt;br /&gt;
&lt;br /&gt;
print(head:getOffsetPivot()) --&amp;gt; vec(0,0,0)&lt;br /&gt;
head:setOffsetPivot(0,4,0)&lt;br /&gt;
print(head:getOffsetPivot()) --&amp;gt; vec(0,4,0)&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&#039;&#039;&#039;@see&#039;&#039;&#039; [[ModelParts#ModelPart:setOffsetPivot|setOffsetPivot]]&lt;br /&gt;
&lt;br /&gt;
==== &amp;lt;code&amp;gt;ModelPart:setMatrix&amp;lt;/code&amp;gt; ====&lt;br /&gt;
Allows you to manually define the matrix used for positioning this ModelPart. Returns self for method chaining.&lt;br /&gt;
&lt;br /&gt;
Using &amp;lt;code&amp;gt;setPos&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;setRot&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;setScale&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;setPivot&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;setOffsetRot&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;setOffsetScale&amp;lt;/code&amp;gt;, or &amp;lt;code&amp;gt;setOffsetPivot&amp;lt;/code&amp;gt; will undo &amp;lt;code&amp;gt;setMatrix&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Using &amp;lt;code&amp;gt;getPos&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;getRot&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;getScale&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;getPivot&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;getOffsetRot&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;getOffsetScale&amp;lt;/code&amp;gt;, or &amp;lt;code&amp;gt;getOffsetPivot&amp;lt;/code&amp;gt; will return invalid values while &amp;lt;code&amp;gt;setMatrix&amp;lt;/code&amp;gt; is in effect. &lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;getTruePos&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;getTrueRot&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;getTrueScale&amp;lt;/code&amp;gt;, and &amp;lt;code&amp;gt;getTruePivot&amp;lt;/code&amp;gt; are probably also affected, but nobody tested them yet.&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Arguments !! Return Type&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;setMatrix(matrix {{type|Matrix4}})&amp;lt;/code&amp;gt;&lt;br /&gt;
| self {{type|ModelPart}}&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;lua&amp;quot;&amp;gt;&lt;br /&gt;
-- no example provided&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== &amp;lt;code&amp;gt;ModelPart:getTruePos&amp;lt;/code&amp;gt; ====&lt;br /&gt;
Returns the position after all calculations are done. This includes &amp;lt;code&amp;gt;setPos&amp;lt;/code&amp;gt; and the data from all playing Animations.&lt;br /&gt;
&lt;br /&gt;
This does not include ParentTypes or transformations applied from a parent part.&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Arguments !! Return Type&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;getTruePos()&amp;lt;/code&amp;gt;&lt;br /&gt;
| {{type|Vector3}}&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;lua&amp;quot;&amp;gt;&lt;br /&gt;
-- no example provided&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== &amp;lt;code&amp;gt;ModelPart:getTrueRot&amp;lt;/code&amp;gt; ====&lt;br /&gt;
Returns the rotation after all calculations are done. This includes &amp;lt;code&amp;gt;setRot&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;setOffsetRot&amp;lt;/code&amp;gt;, and the data from all playing Animations.&lt;br /&gt;
&lt;br /&gt;
This does not include ParentTypes or transformations applied from a parent part.&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Arguments !! Return Type&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;getTruePos()&amp;lt;/code&amp;gt;&lt;br /&gt;
| {{type|Vector3}}&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;lua&amp;quot;&amp;gt;&lt;br /&gt;
-- no example provided&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== &amp;lt;code&amp;gt;ModelPart:getTrueScale&amp;lt;/code&amp;gt; ====&lt;br /&gt;
Returns the scale after all calculations are done. This includes &amp;lt;code&amp;gt;setScale&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;setOffsetScale&amp;lt;/code&amp;gt;, and the data from all playing Animations.&lt;br /&gt;
&lt;br /&gt;
This does not include ParentTypes or transformations applied from a parent part.&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Arguments !! Return Type&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;getTrueScale()&amp;lt;/code&amp;gt;&lt;br /&gt;
| {{type|Vector3}}&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;lua&amp;quot;&amp;gt;&lt;br /&gt;
-- no example provided&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== &amp;lt;code&amp;gt;ModelPart:getTruePivot&amp;lt;/code&amp;gt; ====&lt;br /&gt;
Returns the pivot point after all calculations are done. This includes &amp;lt;code&amp;gt;setPivot&amp;lt;/code&amp;gt; and &amp;lt;code&amp;gt;setOffsetPivot&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
This does not include ParentTypes or transformations applied from a parent part.&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Arguments !! Return Type&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;getTruePivot()&amp;lt;/code&amp;gt;&lt;br /&gt;
| {{type|Vector3}}&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;lua&amp;quot;&amp;gt;&lt;br /&gt;
-- no example provided&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Visual Manipulation ===&lt;br /&gt;
Methods relating to modifying how a ModelPart looks&lt;br /&gt;
&lt;br /&gt;
todo: put anything related to renderType, textures, and other visual modifications in here&lt;br /&gt;
&lt;br /&gt;
==== ModelPart:setVisible ====&lt;br /&gt;
Sets if this ModelPart is visible or not. Children of this ModelPart will also be invisible while this part is invisible.&lt;br /&gt;
&lt;br /&gt;
A value of &amp;lt;code&amp;gt;nil&amp;lt;/code&amp;gt; is interpreted as &amp;lt;code&amp;gt;true&amp;lt;/code&amp;gt; on 0.1.4 and below, and &amp;lt;code&amp;gt;false&amp;lt;/code&amp;gt; on 0.1.5 and above. This message will disappear &amp;lt;s&amp;gt;if&amp;lt;/s&amp;gt; when 0.1.6 is released.&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Arguments !! Return Type&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;setVisible(visible {{type|boolean}})&amp;lt;/code&amp;gt;&lt;br /&gt;
| self {{type|ModelPart}}&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;lua&amp;quot;&amp;gt;&lt;br /&gt;
local head = models.model.root.Head&lt;br /&gt;
&lt;br /&gt;
head:setVisible(false) -- Bye bye Head!&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== ModelPart:getVisible ====&lt;br /&gt;
Recursively goes up the ModelPart tree until it finds a ModelPart that is invisible, or the ModelPart is &amp;lt;code&amp;gt;models&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
In other words, if a parent part is invisible, this function returns &amp;lt;code&amp;gt;false&amp;lt;/code&amp;gt;. If all parent parts are visible, this function will return &amp;lt;code&amp;gt;true&amp;lt;/code&amp;gt; or &amp;lt;code&amp;gt;nil&amp;lt;/code&amp;gt;. Kinda stupid. This is fixed in 0.1.5 to never return &amp;lt;code&amp;gt;nil&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Arguments !! Return Type&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;getVisible()&amp;lt;/code&amp;gt;&lt;br /&gt;
| {{type|bool}} &amp;lt;nowiki&amp;gt;|&amp;lt;/nowiki&amp;gt; {{type|nil}} {{until|0.1.5}}&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;getVisible()&amp;lt;/code&amp;gt;&lt;br /&gt;
| {{type|bool}} {{since|0.1.5}}&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;lua&amp;quot;&amp;gt;&lt;br /&gt;
local root = models.model.root.Head&lt;br /&gt;
&lt;br /&gt;
print(root.Head:getVisible()) --&amp;gt; nil --&amp;lt; this is stupid&lt;br /&gt;
root:setVisible(false) -- Bye bye root!&lt;br /&gt;
print(root.Head:getVisible()) --&amp;gt; false&lt;br /&gt;
root:setVisible(true) -- Welcome back root!&lt;br /&gt;
print(root.Head:getVisible()) --&amp;gt; true --&amp;lt; aaaaaaaa&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== ModelPart:setColor ====&lt;br /&gt;
Sets a value to multiply with all pixels on the ModelPart&#039;s texture.&lt;br /&gt;
&lt;br /&gt;
=== renderTasks ===&lt;br /&gt;
todo: put all rendertask functions in here &lt;br /&gt;
&lt;br /&gt;
=== Render Methods ===&lt;br /&gt;
todo: Put partToWorldMatrix, preRender, midRender, and PostRender in here&lt;br /&gt;
&lt;br /&gt;
=== Animation Methods ===&lt;br /&gt;
todo: put getAnimPos/Rot/Scale and overrideVanillaPos/Rot/Scale in here&lt;/div&gt;</summary>
		<author><name>PoolloverNathan</name></author>
	</entry>
	<entry>
		<id>https://wiki.figuramc.org/index.php?title=ModelPart&amp;diff=271</id>
		<title>ModelPart</title>
		<link rel="alternate" type="text/html" href="https://wiki.figuramc.org/index.php?title=ModelPart&amp;diff=271"/>
		<updated>2024-09-27T15:13:59Z</updated>

		<summary type="html">&lt;p&gt;PoolloverNathan: /* Accessing ModelParts */ don&amp;#039;t use a pre for a fun fact (peer-review: is calling this trivia appropriate? taking that tradition from explainxkcd)&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;A ModelPart represents a Cube, Mesh, or Group from Blockbench.&lt;br /&gt;
&lt;br /&gt;
Via scripting, ModelParts can be modified dynamically to achieve whatever visuals you need (limited to Minecraft&#039;s rendering engine)&lt;br /&gt;
&lt;br /&gt;
== Accessing ModelParts ==&lt;br /&gt;
&amp;lt;code&amp;gt;models&amp;lt;/code&amp;gt; is the global that acts as the Root of your avatar and is where all ModelParts are stored, either as a child of &amp;lt;code&amp;gt;models&amp;lt;/code&amp;gt;, a child of a child, or further down the tree.&lt;br /&gt;
&lt;br /&gt;
Specifically, &amp;lt;code&amp;gt;models&amp;lt;/code&amp;gt;&#039;s children are Blockbench models. When an avatar is selected, not only are a bbmodel&#039;s Cubes, Meshes, and Groups converted into ModelParts, but the bbmodel file itself is converted into a ModelPart.&lt;br /&gt;
&lt;br /&gt;
To access a child ModelPart from a parent ModelPart, [https://www.lua.org/pil/2.5.html index] the parent using the child&#039;s name as a string.&lt;br /&gt;
&lt;br /&gt;
Example:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;lua&amp;quot;&amp;gt;&lt;br /&gt;
local bbmodel = models[&amp;quot;model&amp;quot;] -- access the bbmodel &amp;quot;model.bbmodel&amp;quot;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
This logic is the same for every single ModelPart. If you want to access a child, index the parent with the child&#039;s name.&lt;br /&gt;
&lt;br /&gt;
{{note|&amp;lt;code&amp;gt;models&amp;lt;/code&amp;gt; itself is a ModelPart. This allows you to apply transformations to the entire model, using e.g. &amp;lt;code&amp;gt;models:setScale(0.5)&amp;lt;/code&amp;gt;.|tag=Trivia|color=#A155DA}}&lt;br /&gt;
&lt;br /&gt;
The below example accesses the Head Group from the [[WikiExampleAvatar]]&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;lua&amp;quot;&amp;gt;&lt;br /&gt;
local head = models[&amp;quot;model&amp;quot;][&amp;quot;root&amp;quot;][&amp;quot;Head&amp;quot;]&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
If the above seems tedious, Lua provides a shorthand way of indexing with strings. It only works when the string contains no spaces or special characters.&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;lua&amp;quot;&amp;gt;&lt;br /&gt;
local head = models.model.root.Head&lt;br /&gt;
&lt;br /&gt;
-- Below is invalid, as the name contains spaces&lt;br /&gt;
local superMegaAwsomeThing = models.model.root.Super Mega Awsome Thing&lt;br /&gt;
&lt;br /&gt;
-- Super Mega Awsome Thing would need to be indexed with the normal method&lt;br /&gt;
local superMegaAwsomeThing = models.model.root[&amp;quot;Super Mega Awsome Thing&amp;quot;]&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== BBModels within folders ===&lt;br /&gt;
When a bbmodel is within a folder, Figura will actually turn the folder itself into a ModelPart. This can be confusing as ModelParts are the only thing that does this.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;lua&amp;quot;&amp;gt;&lt;br /&gt;
local folderHead = models.folder.model.root.Head&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== ModelPart ParentTypes ==&lt;br /&gt;
In Figura, a ParentType is applied to a ModelPart causing the ModelPart to behave in a predefined way. This behavior includes acting as a vanilla part like the Head or LeftLeg, moving the rendering of special parts like held items, armor, or parrots, and binding the ModelPart to the World instead of the Player.&lt;br /&gt;
&lt;br /&gt;
ParentTypes can either be applied in Blockbench itself or via script.&lt;br /&gt;
=== ParentTypes via BlockBench ===&lt;br /&gt;
To define a ParentType in Blockbench, the name of a Group must begin with a case-sensitive ParentType.&lt;br /&gt;
&lt;br /&gt;
For example, the &amp;lt;code&amp;gt;Head&amp;lt;/code&amp;gt; ParentType causes the ModelPart to move and rotate like the vanilla Head. If you name a Group the following, it will have this ParentType:&lt;br /&gt;
&lt;br /&gt;
* Head&lt;br /&gt;
* HEAD&lt;br /&gt;
* Head2&lt;br /&gt;
* HeadPhones&lt;br /&gt;
&lt;br /&gt;
If you name a group the following, &amp;lt;b&amp;gt;it will not&amp;lt;/b&amp;gt; have the &amp;lt;code&amp;gt;Head&amp;lt;/code&amp;gt; ParentType:&lt;br /&gt;
&lt;br /&gt;
* head    =&amp;gt; &#039;head&#039; is not a valid ParentType. Capitalization matters!&lt;br /&gt;
* BigHead =&amp;gt; Does not begin with ParentType&lt;br /&gt;
* HeAd    =&amp;gt; &#039;HeAd&#039; is not a valid ParentType. Capitalization matters!&lt;br /&gt;
&lt;br /&gt;
Do note that some English words naturally start with a ParentType which can cause unintended behavior!&lt;br /&gt;
&lt;br /&gt;
For example, the word &amp;quot;Guitar&amp;quot;. Seems innocent, right? Well, &amp;quot;Guitar&amp;quot; starts with &amp;quot;Gui&amp;quot;, and &amp;quot;Gui&amp;quot; is an alias for the ParentType &amp;lt;code&amp;gt;Hud&amp;lt;/code&amp;gt;, a ParentType that binds the ModelPart to the Heads Up Display where the hotbar and inventory reside. This causes the ModelPart to not be visible, as &amp;lt;code&amp;gt;Hud&amp;lt;/code&amp;gt; parts have special rules. Be careful!&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;Note: ParentTypes are sometimes called Keywords by legacy Figura users&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== ParentTypes via Script ===&lt;br /&gt;
Calling the &amp;lt;code&amp;gt;setParentType&amp;lt;/code&amp;gt; on &amp;lt;em&amp;gt;any&amp;lt;/em&amp;gt; ModelPart will override it&#039;s ParentType.&lt;br /&gt;
&lt;br /&gt;
Simply [[ModelParts#Accessing_ModelParts|access]] the ModelPart, then call &amp;lt;code&amp;gt;setParentType&amp;lt;/code&amp;gt; on it, passing in the ParentType as a string.&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;lua&amp;quot;&amp;gt;&lt;br /&gt;
local head = models.model.root.Head&lt;br /&gt;
head:setParentType(&amp;quot;RightArm&amp;quot;)&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
To remove a ParentType from a ModelPart, call &amp;lt;code&amp;gt;setParentType&amp;lt;/code&amp;gt; with the string &amp;lt;code&amp;gt;&amp;quot;None&amp;quot;&amp;lt;/code&amp;gt;&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;lua&amp;quot;&amp;gt;&lt;br /&gt;
local head = models.model.root.Head&lt;br /&gt;
head:setParentType(&amp;quot;None&amp;quot;)&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
ModelParts &amp;lt;b&amp;gt;do not&amp;lt;/b&amp;gt; remember their original ParentType! If you need a ModelPart&#039;s original ParentType, store it in a variable for later:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;lua&amp;quot;&amp;gt;&lt;br /&gt;
local head = models.model.root.Head&lt;br /&gt;
local headParentType = head:getParentType()&lt;br /&gt;
head:setParentType(&amp;quot;None&amp;quot;)&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
== ModelPart Methods ==&lt;br /&gt;
&lt;br /&gt;
=== ModelPart Properties ===&lt;br /&gt;
Read-only properties of a ModelPart&lt;br /&gt;
&lt;br /&gt;
==== &amp;lt;code&amp;gt;ModelPart:getName&amp;lt;/code&amp;gt; ====&lt;br /&gt;
Returns the name of this ModelPart. ModelParts can have duplicate names.&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Arguments !! Return Type&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;getName()&amp;lt;/code&amp;gt;&lt;br /&gt;
| {{type|string}}&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;lua&amp;quot;&amp;gt;&lt;br /&gt;
local head = models.model.root.Head&lt;br /&gt;
print(head:getName()) --&amp;gt; &amp;quot;Head&amp;quot;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== &amp;lt;code&amp;gt;ModelPart:getType&amp;lt;/code&amp;gt; ====&lt;br /&gt;
Returns the original type of this ModelPart. Can be &amp;lt;code&amp;gt;Cube&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;Mesh&amp;lt;/code&amp;gt;, or &amp;lt;code&amp;gt;Group&amp;lt;/code&amp;gt;. BBModels and folders are considered Groups. Cubes with no texture data are also considered Groups, as with no texture data their face data is stripped.&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Arguments !! Return Type&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;getType()&amp;lt;/code&amp;gt;&lt;br /&gt;
|| &amp;lt;code&amp;gt;&amp;quot;Cube&amp;quot; | &amp;quot;Mesh&amp;quot; | &amp;quot;Group&amp;quot;&amp;lt;/code&amp;gt;&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;lua&amp;quot;&amp;gt;&lt;br /&gt;
local head = models.model.root.Head&lt;br /&gt;
print(head:getType()) --&amp;gt; &amp;quot;Group&amp;quot;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Child Manipulation ===&lt;br /&gt;
Methods relating to getting other ModelParts and manipulating the ModelPart tree&lt;br /&gt;
&lt;br /&gt;
==== &amp;lt;code&amp;gt;ModelPart:getParent&amp;lt;/code&amp;gt; ====&lt;br /&gt;
Returns the parent of this ModelPart, or &amp;lt;code&amp;gt;nil&amp;lt;/code&amp;gt; if this is &amp;lt;code&amp;gt;models&amp;lt;/code&amp;gt; or a loose ModelPart created via script.&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Arguments !! Return Type&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;getParent()&amp;lt;/code&amp;gt;&lt;br /&gt;
|| {{type|ModelPart}} | {{type|nil}}&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;lua&amp;quot;&amp;gt;&lt;br /&gt;
local head = models.model.root.Head&lt;br /&gt;
print(head:getParent()) --&amp;gt; ModelPart(root)&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== &amp;lt;code&amp;gt;ModelPart:getChildren&amp;lt;/code&amp;gt; ====&lt;br /&gt;
Returns an array of all children of this ModelPart&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Arguments !! Return Type&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;getChildren()&amp;lt;/code&amp;gt;&lt;br /&gt;
|| {{type|ModelPart|[]}}&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;lua&amp;quot;&amp;gt;&lt;br /&gt;
local root = models.model.root&lt;br /&gt;
print(root:getChildren()) --[[&lt;br /&gt;
ModelPart(Head), &lt;br /&gt;
ModelPart(Body), &lt;br /&gt;
ModelPart(RightArm), &lt;br /&gt;
ModelPart(LeftArm), &lt;br /&gt;
ModelPart(RightLeg), &lt;br /&gt;
ModelPart(LeftLeg),&lt;br /&gt;
]]--&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== &amp;lt;code&amp;gt;ModelPart:isChildOf&amp;lt;/code&amp;gt; ====&lt;br /&gt;
Recursively checks if this child is a decedent of the provided ModelPart.&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Arguments !! Return Type&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;isChildOf(part {{type|ModelPart}})&amp;lt;/code&amp;gt;&lt;br /&gt;
|| {{type|boolean}}&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;lua&amp;quot;&amp;gt;&lt;br /&gt;
local model = models.model&lt;br /&gt;
local head = model.root.Head&lt;br /&gt;
print(head:isChildOf(model)) --&amp;gt; true&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== &amp;lt;code&amp;gt;ModelPart:copy&amp;lt;/code&amp;gt; ====&lt;br /&gt;
Copies the data of this ModelPart, assigning it a new name, then returning it. The new name has nothing to do with ParentTypes. The children of the copy are references to the original ModelPart&#039;s children. Extra work needs to be done to recursively copy it&#039;s children. The [[ModelPart#ModelPart_addChild|addChild]] method can then be used to add the copy to the ModelPart tree.&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Arguments !! Return Type&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;copy(newName {{type|string}})&amp;lt;/code&amp;gt;&lt;br /&gt;
|| {{type|ModelPart}}&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;lua&amp;quot;&amp;gt;&lt;br /&gt;
local head = models.model.root.Head&lt;br /&gt;
&lt;br /&gt;
local headCopy = head:copy(&amp;quot;NewHead&amp;quot;)&lt;br /&gt;
print(headCopy) --&amp;gt; ModelPart(NewHead)&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;lua&amp;quot;&amp;gt;&lt;br /&gt;
-- The parentType is copied with the ModelPart&lt;br /&gt;
local head = models.model.root.Head&lt;br /&gt;
&lt;br /&gt;
local headCopy = head:copy(&amp;quot;NewHead&amp;quot;)&lt;br /&gt;
print(headCopy:getParentType()) --&amp;gt; &amp;quot;Head&amp;quot;&lt;br /&gt;
&lt;br /&gt;
headCopy:setParentType(&amp;quot;None&amp;quot;)&lt;br /&gt;
print(headCopy:getParentType()) --&amp;gt; &amp;quot;None&amp;quot;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&#039;&#039;&#039;@see&#039;&#039;&#039; [[ModelParts#ModelPart:setParentType|setParentType]], [[ModelParts#ModelPart:getParentType|getParentType]]&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;lua&amp;quot;&amp;gt;&lt;br /&gt;
-- Extra work is needed to deep copy a ModelPart&#039;s children as well&lt;br /&gt;
local function deepCopy(model)&lt;br /&gt;
    local copy = model:copy(model:getName())&lt;br /&gt;
    for _, child in pairs(copy:getChildren()) do&lt;br /&gt;
        copy:removeChild(child):addChild(deepCopy(child))&lt;br /&gt;
    end&lt;br /&gt;
    return copy&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
local head = models.model.root.Head&lt;br /&gt;
local headCube = head.Head&lt;br /&gt;
&lt;br /&gt;
-- headCopyA contains references to head&#039;s children because it is a shallow copy&lt;br /&gt;
local headCopyA = head:copy(&amp;quot;NewHead&amp;quot;)&lt;br /&gt;
print(headCopyA.Head == headCube) --&amp;gt; true&lt;br /&gt;
&lt;br /&gt;
-- headCopyB contains true copies of head&#039;s children as it was passed through a function that recursively copies children&lt;br /&gt;
local headCopyB = deepCopy(head)&lt;br /&gt;
print(headCopyB.Head == headCube) --&amp;gt; false&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&#039;&#039;&#039;@see&#039;&#039;&#039; [[ModelParts#ModelPart:getName|getName]], [[ModelParts#ModelPart:getChildren|getChildren]], [[ModelParts#ModelPart:addChild|addChild]], [[ModelParts#ModelPart:removeChild|removeChild]]&lt;br /&gt;
&lt;br /&gt;
==== &amp;lt;code&amp;gt;ModelPart:addChild&amp;lt;/code&amp;gt; ====&lt;br /&gt;
Adds the provided ModelPart as one of this ModelPart&#039;s children. Beware of adding a parent of this ModelPart as a child! This method returns this ModelPart for method chaining.&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Arguments !! Return Type&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;addChild(part {{type|ModelPart}})&amp;lt;/code&amp;gt;&lt;br /&gt;
|| self {{type|ModelPart}}&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;lua&amp;quot;&amp;gt;&lt;br /&gt;
local root = models.model.root&lt;br /&gt;
local headCopy = root.Head:copy(&amp;quot;NewHead&amp;quot;)&lt;br /&gt;
root:addChild(headCopy)&lt;br /&gt;
headCopy:setPos(10,0,0)&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&#039;&#039;&#039;@see&#039;&#039;&#039; [[ModelParts#ModelPart:copy|copy]], [[ModelParts#ModelPart:setPos|setPos]]&lt;br /&gt;
&lt;br /&gt;
==== &amp;lt;code&amp;gt;ModelPart:removeChild&amp;lt;/code&amp;gt; ====&lt;br /&gt;
Removes a child from this ModelPart. Takes in the child ModelPart itself. This method returns this ModelPart for method chaining.&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Arguments !! Return Type&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;removeChild(partToRemove {{type|ModelPart}})&amp;lt;/code&amp;gt;&lt;br /&gt;
| self {{type|ModelPart}}&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;lua&amp;quot;&amp;gt;&lt;br /&gt;
local root = models.model.root&lt;br /&gt;
local head = root.Head&lt;br /&gt;
root:removeChild(head) -- Bye bye Head!&lt;br /&gt;
&lt;br /&gt;
-- Head is still valid and can be re-added later, so long as we keep a variable referencing it.&lt;br /&gt;
print(head) --&amp;gt; ModelPart(Head)&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== &amp;lt;code&amp;gt;ModelPart:remove&amp;lt;/code&amp;gt; ====&lt;br /&gt;
Removes this ModelPart from the parent&#039;s child list. Returns self&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Arguments !! Return Type&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;remove()&amp;lt;/code&amp;gt;&lt;br /&gt;
| self {{type|ModelPart}}&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;lua&amp;quot;&amp;gt;&lt;br /&gt;
local head = models.model.root.Head&lt;br /&gt;
head:remove() -- Bye bye Head!&lt;br /&gt;
&lt;br /&gt;
-- Head is still valid and can be re-added, so long as we keep a variable referencing it.&lt;br /&gt;
print(head) --&amp;gt; ModelPart(Head)&lt;br /&gt;
models.model.root.LeftLeg:addChild(head)&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&#039;&#039;&#039;@see&#039;&#039;&#039; [[ModelParts#ModelPart:addChild|addChild]]&lt;br /&gt;
&lt;br /&gt;
=== Manipulation ===&lt;br /&gt;
Methods relating to manipulating the ModelPart within physical space&lt;br /&gt;
&lt;br /&gt;
==== &amp;lt;code&amp;gt;ModelPart:setPos&amp;lt;/code&amp;gt; ====&lt;br /&gt;
Sets the offset of the the position of the ModelPart. Position translation applies on the local rotation axis.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;nil&amp;lt;/code&amp;gt; values are interpreted as 0.&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Arguments !! Return Type&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;setPos(pos {{type|Vector3}})&amp;lt;/code&amp;gt;&lt;br /&gt;
| self {{type|ModelPart}}&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;setPos(x {{type|number}}, y {{type|number}}, z {{type|number}})&amp;lt;/code&amp;gt;&lt;br /&gt;
| self {{type|ModelPart}}&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;lua&amp;quot;&amp;gt;&lt;br /&gt;
local head = models.model.root.Head&lt;br /&gt;
&lt;br /&gt;
-- Move 10 units on the local y axis&lt;br /&gt;
head:setPos(0, 10, 0)&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== &amp;lt;code&amp;gt;ModelPart:getPos&amp;lt;/code&amp;gt; ====&lt;br /&gt;
Returns the value that was used for &amp;lt;code&amp;gt;setPos&amp;lt;/code&amp;gt;.  Always 0,0,0 when script begins.&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Arguments !! Return Type&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;getPos()&amp;lt;/code&amp;gt;&lt;br /&gt;
| {{type|Vector3}}&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;lua&amp;quot;&amp;gt;&lt;br /&gt;
local head = models.model.root.Head&lt;br /&gt;
&lt;br /&gt;
print(head:getPos()) --&amp;gt; vec(0,0,0)&lt;br /&gt;
head:setPos(0, 10, 0)&lt;br /&gt;
print(head:getPos()) --&amp;gt; vec(0,10,0)&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&#039;&#039;&#039;@see&#039;&#039;&#039; [[ModelParts#ModelPart:setPos|setPos]]&lt;br /&gt;
&lt;br /&gt;
==== &amp;lt;code&amp;gt;ModelPart:setRot&amp;lt;/code&amp;gt; ====&lt;br /&gt;
Sets the rotation of the ModelPart. Rotates the ModelPart around the PivotPoint.&lt;br /&gt;
&lt;br /&gt;
Angles are interpreted as degrees. &amp;lt;code&amp;gt;nil&amp;lt;/code&amp;gt; values are interpreted as 0.&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Arguments !! Return Type&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;setRot(rot {{type|Vector3}})&amp;lt;/code&amp;gt;&lt;br /&gt;
| self {{type|ModelPart}}&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;setRot(pitch {{type|number}}, yaw {{type|number}}, roll {{type|number}})&amp;lt;/code&amp;gt;&lt;br /&gt;
| self {{type|ModelPart}}&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;lua&amp;quot;&amp;gt;&lt;br /&gt;
local head = models.model.root.Head&lt;br /&gt;
&lt;br /&gt;
-- Rotate 45 degrees on the x axis, causing the avatar to look down&lt;br /&gt;
head:setRot(0, 45, 0)&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== &amp;lt;code&amp;gt;ModelPart:getRot&amp;lt;/code&amp;gt; ====&lt;br /&gt;
Returns the value that was used for &amp;lt;code&amp;gt;setRot&amp;lt;/code&amp;gt;. Will be the Rotation values defined in BlockBench when script begins.&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Arguments !! Return Type&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;getRot()&amp;lt;/code&amp;gt;&lt;br /&gt;
| {{type|Vector3}}&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;lua&amp;quot;&amp;gt;&lt;br /&gt;
local head = models.model.root.Head&lt;br /&gt;
&lt;br /&gt;
print(head:getRot()) --&amp;gt; vec(0,0,0) -- Most ModelParts will not have a rotation set in blockbench&lt;br /&gt;
head:setRot(45, 0, 0)&lt;br /&gt;
print(head:getPos()) --&amp;gt; vec(45,0,0)&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&#039;&#039;&#039;@see&#039;&#039;&#039; [[ModelParts#ModelPart:setRot|setRot]]&lt;br /&gt;
&lt;br /&gt;
==== &amp;lt;code&amp;gt;ModelPart:setScale&amp;lt;/code&amp;gt; ====&lt;br /&gt;
Sets the scale of the ModelPart. Scales the ModelPart around the PivotPoint.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;nil&amp;lt;/code&amp;gt; values are interpreted as 1. If a number is provided for x and both y and z are not defined, x will be used for all 3 axis.&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Arguments !! Return Type&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;setScale(scale {{type|Vector3}})&amp;lt;/code&amp;gt;&lt;br /&gt;
| self {{type|ModelPart}}&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;setScale(scaleAll {{type|number}})&amp;lt;/code&amp;gt;&lt;br /&gt;
| self {{type|ModelPart}}&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;setScale(x {{type|number}}, y {{type|number}}, z {{type|number}})&amp;lt;/code&amp;gt;&lt;br /&gt;
| self {{type|ModelPart}}&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;lua&amp;quot;&amp;gt;&lt;br /&gt;
local head = models.model.root.Head&lt;br /&gt;
-- Double the size of the head&lt;br /&gt;
head:setScale(2)&lt;br /&gt;
-- Squishes and stretches the entire model&lt;br /&gt;
models.model:setScale(1.5, 0.75, 1.5)&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== &amp;lt;code&amp;gt;ModelPart:getScale&amp;lt;/code&amp;gt; ====&lt;br /&gt;
Returns the value that was used for &amp;lt;code&amp;gt;setScale&amp;lt;/code&amp;gt;.  Always 1,1,1 when script begins.&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Arguments !! Return Type&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;getScale()&amp;lt;/code&amp;gt;&lt;br /&gt;
| {{type|Vector3}}&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;lua&amp;quot;&amp;gt;&lt;br /&gt;
local head = models.model.root.Head&lt;br /&gt;
&lt;br /&gt;
print(head:getScale()) --&amp;gt; vec(1,1,1)&lt;br /&gt;
head:setScale(2)&lt;br /&gt;
print(head:getScale()) --&amp;gt; vec(2,2,2)&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&#039;&#039;&#039;@see&#039;&#039;&#039; [[ModelParts#ModelPart:setScale|setScale]]&lt;br /&gt;
&lt;br /&gt;
==== &amp;lt;code&amp;gt;ModelPart:setPivot&amp;lt;/code&amp;gt; ====&lt;br /&gt;
Sets the pivot point of the ModelPart. &#039;&#039;This overrides the pivot point defined in blockbench.&#039;&#039; It is recommended to use [[ModelParts#ModelPart:setOffsetPivot|setOffsetPivot]] instead.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;nil&amp;lt;/code&amp;gt; values are interpreted as 0.&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Arguments !! Return Type&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;setPivot(pivot {{type|Vector3}})&amp;lt;/code&amp;gt;&lt;br /&gt;
| self {{type|ModelPart}}&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;setPivot(x {{type|number}}, y {{type|number}}, z {{type|number}})&amp;lt;/code&amp;gt;&lt;br /&gt;
| self {{type|ModelPart}}&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;lua&amp;quot;&amp;gt;&lt;br /&gt;
local head = models.model.root.Head&lt;br /&gt;
&lt;br /&gt;
-- For a normal size humanoid model, the Head&#039;s pivot point is usually at 0,24,0&lt;br /&gt;
-- If we assume that the Head cube is an 8x8x8 cube,&lt;br /&gt;
-- then the head will rotate around the center of the cube instead of the neck&lt;br /&gt;
head:setPivot(0, 28, 0)&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== &amp;lt;code&amp;gt;ModelPart:getPivot&amp;lt;/code&amp;gt; ====&lt;br /&gt;
Returns the Pivot Point defined in BlockBench, or the value set by &amp;lt;code&amp;gt;setPivot&amp;lt;/code&amp;gt; if it was already overwritten.&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Arguments !! Return Type&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;getPivot()&amp;lt;/code&amp;gt;&lt;br /&gt;
| {{type|Vector3}}&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;lua&amp;quot;&amp;gt;&lt;br /&gt;
local head = models.model.root.Head&lt;br /&gt;
&lt;br /&gt;
-- The Head group&#039;s pivot point for a humanoid model is usually at 0,24,0&lt;br /&gt;
print(head:getPivot()) --&amp;gt; vec(0,24,0)&lt;br /&gt;
head:setPivot(0,0,0)&lt;br /&gt;
-- We have completely ruined the rendering of this ModelPart&lt;br /&gt;
print(head:getPivot()) --&amp;gt; vec(0,0,0)&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&#039;&#039;&#039;@see&#039;&#039;&#039; [[ModelParts#ModelPart:setPivot|setPivot]]&lt;br /&gt;
&lt;br /&gt;
==== &amp;lt;code&amp;gt;ModelPart:setOffsetRot&amp;lt;/code&amp;gt; ====&lt;br /&gt;
Sets a rotation value that will be added to the ModelPart&#039;s rotation.&lt;br /&gt;
&lt;br /&gt;
Angles are interpreted as degrees. &amp;lt;code&amp;gt;nil&amp;lt;/code&amp;gt; values are interpreted as 0.&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Arguments !! Return Type&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;setOffsetRot(rot {{type|Vector3}})&amp;lt;/code&amp;gt;&lt;br /&gt;
| self {{type|ModelPart}}&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;setOffsetRot(pitch {{type|number}}, yaw {{type|number}}, roll {{type|number}})&amp;lt;/code&amp;gt;&lt;br /&gt;
| self {{type|ModelPart}}&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;lua&amp;quot;&amp;gt;&lt;br /&gt;
local head = models.model.root.Head&lt;br /&gt;
&lt;br /&gt;
-- ModelParts inherit their rotation from blockbench. The Head usually has a rotation of 0,0,0 for consistency with the vanilla model&lt;br /&gt;
print(head:getRot()) --&amp;gt; vec(0,0,0)&lt;br /&gt;
-- Set the offset to 45 degrees on the x axis, causing the avatar to look down&lt;br /&gt;
head:setOffsetRot(0, 45, 0)&lt;br /&gt;
-- The original rotation is unchanged.&lt;br /&gt;
print(head:getRot()) --&amp;gt; vec(0,0,0)&lt;br /&gt;
&lt;br /&gt;
-- setOffsetRot is not additive.&lt;br /&gt;
head:setOffsetRot(0, 25, 0)&lt;br /&gt;
print(head:getOffsetRot()) --&amp;gt; vec(0,25,0)&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&#039;&#039;&#039;@see&#039;&#039;&#039; [[ModelParts#ModelPart:getRot|getRot]] [[ModelParts#ModelPart:getOffsetRot|getOffsetRot]]&lt;br /&gt;
&lt;br /&gt;
==== &amp;lt;code&amp;gt;ModelPart:getOffsetRot&amp;lt;/code&amp;gt; ====&lt;br /&gt;
Returns the value that was used for &amp;lt;code&amp;gt;setOffsetRot&amp;lt;/code&amp;gt;. Will be 0,0,0 when the script begins&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Arguments !! Return Type&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;getOffsetRot()&amp;lt;/code&amp;gt;&lt;br /&gt;
| {{type|Vector3}}&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;lua&amp;quot;&amp;gt;&lt;br /&gt;
local head = models.model.root.Head&lt;br /&gt;
&lt;br /&gt;
print(head:getOffsetRot()) --&amp;gt; vec(0,0,0)&lt;br /&gt;
head:setOffsetRot(45, 0, 0)&lt;br /&gt;
print(head:getOffsetRot()) --&amp;gt; vec(45,0,0)&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&#039;&#039;&#039;@see&#039;&#039;&#039; [[ModelParts#ModelPart:setOffsetRot|setOffsetRot]]&lt;br /&gt;
&lt;br /&gt;
==== &amp;lt;code&amp;gt;ModelPart:setOffsetScale&amp;lt;/code&amp;gt; ====&lt;br /&gt;
Sets a scale value that will be multiplied with the ModelPart&#039;s scale.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;nil&amp;lt;/code&amp;gt; values are interpreted as 1. If a number is provided for x and both y and z are not defined, x will be used for all 3 axis.&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Arguments !! Return Type&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;setOffsetScale(scale {{type|Vector3}})&amp;lt;/code&amp;gt;&lt;br /&gt;
| self {{type|ModelPart}}&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;setOffsetScale(scaleAll {{type|number}})&amp;lt;/code&amp;gt;&lt;br /&gt;
| self {{type|ModelPart}}&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;setOffsetScale(x {{type|number}}, y {{type|number}}, z {{type|number}})&amp;lt;/code&amp;gt;&lt;br /&gt;
| self {{type|ModelPart}}&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;lua&amp;quot;&amp;gt;&lt;br /&gt;
local head = models.model.root.Head&lt;br /&gt;
-- Double the size of the head&lt;br /&gt;
head:setScale(2)&lt;br /&gt;
-- Half the size of the head&lt;br /&gt;
head:setOffsetScale(0.5)&lt;br /&gt;
-- Results in no changes&lt;br /&gt;
-- I have no idea what this is used for&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== &amp;lt;code&amp;gt;ModelPart:getOffsetScale&amp;lt;/code&amp;gt; ====&lt;br /&gt;
Returns the value that was used for &amp;lt;code&amp;gt;setOffsetScale&amp;lt;/code&amp;gt;.  Always 1,1,1 when script begins.&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Arguments !! Return Type&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;getOffsetScale()&amp;lt;/code&amp;gt;&lt;br /&gt;
| {{type|Vector3}}&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;lua&amp;quot;&amp;gt;&lt;br /&gt;
local head = models.model.root.Head&lt;br /&gt;
&lt;br /&gt;
print(head:getOffsetScale()) --&amp;gt; vec(1,1,1)&lt;br /&gt;
head:setOffsetScale(2)&lt;br /&gt;
print(head:getOffsetScale()) --&amp;gt; vec(2,2,2)&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&#039;&#039;&#039;@see&#039;&#039;&#039; [[ModelParts#ModelPart:setOffsetScale|setOffsetScale]]&lt;br /&gt;
&lt;br /&gt;
==== &amp;lt;code&amp;gt;ModelPart:setOffsetPivot&amp;lt;/code&amp;gt; ====&lt;br /&gt;
Sets a value that will be added to the ModelPart&#039;s pivot point.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;nil&amp;lt;/code&amp;gt; values are interpreted as 0.&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Arguments !! Return Type&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;setOffsetPivot(pivot {{type|Vector3}})&amp;lt;/code&amp;gt;&lt;br /&gt;
| self {{type|ModelPart}}&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;setOffsetPivot(x {{type|number}}, y {{type|number}}, z {{type|number}})&amp;lt;/code&amp;gt;&lt;br /&gt;
| self {{type|ModelPart}}&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;lua&amp;quot;&amp;gt;&lt;br /&gt;
local head = models.model.root.Head&lt;br /&gt;
&lt;br /&gt;
-- If we assume that the Head cube is an 8x8x8 cube and offset the pivot up by 4,&lt;br /&gt;
-- then the head will rotate around the center of the cube instead of the neck&lt;br /&gt;
head:setOffsetPivot(0, 4, 0)&lt;br /&gt;
-- Notice that we did not need to know the original pivot point to do this&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== &amp;lt;code&amp;gt;ModelPart:getOffsetPivot&amp;lt;/code&amp;gt; ====&lt;br /&gt;
Returns the value that was used for &amp;lt;code&amp;gt;setOffsetPivot&amp;lt;/code&amp;gt;.  Always 0,0,0 when script begins.&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Arguments !! Return Type&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;getOffsetPivot()&amp;lt;/code&amp;gt;&lt;br /&gt;
| {{type|Vector3}}&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;lua&amp;quot;&amp;gt;&lt;br /&gt;
local head = models.model.root.Head&lt;br /&gt;
&lt;br /&gt;
print(head:getOffsetPivot()) --&amp;gt; vec(0,0,0)&lt;br /&gt;
head:setOffsetPivot(0,4,0)&lt;br /&gt;
print(head:getOffsetPivot()) --&amp;gt; vec(0,4,0)&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&#039;&#039;&#039;@see&#039;&#039;&#039; [[ModelParts#ModelPart:setOffsetPivot|setOffsetPivot]]&lt;br /&gt;
&lt;br /&gt;
==== &amp;lt;code&amp;gt;ModelPart:setMatrix&amp;lt;/code&amp;gt; ====&lt;br /&gt;
Allows you to manually define the matrix used for positioning this ModelPart. Returns self for method chaining.&lt;br /&gt;
&lt;br /&gt;
Using &amp;lt;code&amp;gt;setPos&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;setRot&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;setScale&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;setPivot&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;setOffsetRot&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;setOffsetScale&amp;lt;/code&amp;gt;, or &amp;lt;code&amp;gt;setOffsetPivot&amp;lt;/code&amp;gt; will undo &amp;lt;code&amp;gt;setMatrix&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Using &amp;lt;code&amp;gt;getPos&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;getRot&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;getScale&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;getPivot&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;getOffsetRot&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;getOffsetScale&amp;lt;/code&amp;gt;, or &amp;lt;code&amp;gt;getOffsetPivot&amp;lt;/code&amp;gt; will return invalid values while &amp;lt;code&amp;gt;setMatrix&amp;lt;/code&amp;gt; is in effect. &lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;getTruePos&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;getTrueRot&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;getTrueScale&amp;lt;/code&amp;gt;, and &amp;lt;code&amp;gt;getTruePivot&amp;lt;/code&amp;gt; are probably also affected, but nobody tested them yet.&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Arguments !! Return Type&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;setMatrix(matrix {{type|Matrix4}})&amp;lt;/code&amp;gt;&lt;br /&gt;
| self {{type|ModelPart}}&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;lua&amp;quot;&amp;gt;&lt;br /&gt;
-- no example provided&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== &amp;lt;code&amp;gt;ModelPart:getTruePos&amp;lt;/code&amp;gt; ====&lt;br /&gt;
Returns the position after all calculations are done. This includes &amp;lt;code&amp;gt;setPos&amp;lt;/code&amp;gt; and the data from all playing Animations.&lt;br /&gt;
&lt;br /&gt;
This does not include ParentTypes or transformations applied from a parent part.&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Arguments !! Return Type&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;getTruePos()&amp;lt;/code&amp;gt;&lt;br /&gt;
| {{type|Vector3}}&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;lua&amp;quot;&amp;gt;&lt;br /&gt;
-- no example provided&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== &amp;lt;code&amp;gt;ModelPart:getTrueRot&amp;lt;/code&amp;gt; ====&lt;br /&gt;
Returns the rotation after all calculations are done. This includes &amp;lt;code&amp;gt;setRot&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;setOffsetRot&amp;lt;/code&amp;gt;, and the data from all playing Animations.&lt;br /&gt;
&lt;br /&gt;
This does not include ParentTypes or transformations applied from a parent part.&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Arguments !! Return Type&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;getTruePos()&amp;lt;/code&amp;gt;&lt;br /&gt;
| {{type|Vector3}}&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;lua&amp;quot;&amp;gt;&lt;br /&gt;
-- no example provided&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== &amp;lt;code&amp;gt;ModelPart:getTrueScale&amp;lt;/code&amp;gt; ====&lt;br /&gt;
Returns the scale after all calculations are done. This includes &amp;lt;code&amp;gt;setScale&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;setOffsetScale&amp;lt;/code&amp;gt;, and the data from all playing Animations.&lt;br /&gt;
&lt;br /&gt;
This does not include ParentTypes or transformations applied from a parent part.&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Arguments !! Return Type&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;getTrueScale()&amp;lt;/code&amp;gt;&lt;br /&gt;
| {{type|Vector3}}&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;lua&amp;quot;&amp;gt;&lt;br /&gt;
-- no example provided&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== &amp;lt;code&amp;gt;ModelPart:getTruePivot&amp;lt;/code&amp;gt; ====&lt;br /&gt;
Returns the pivot point after all calculations are done. This includes &amp;lt;code&amp;gt;setPivot&amp;lt;/code&amp;gt; and &amp;lt;code&amp;gt;setOffsetPivot&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
This does not include ParentTypes or transformations applied from a parent part.&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Arguments !! Return Type&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;getTruePivot()&amp;lt;/code&amp;gt;&lt;br /&gt;
| {{type|Vector3}}&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;lua&amp;quot;&amp;gt;&lt;br /&gt;
-- no example provided&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Visual Manipulation ===&lt;br /&gt;
Methods relating to modifying how a ModelPart looks&lt;br /&gt;
&lt;br /&gt;
todo: put anything related to renderType, textures, and other visual modifications in here&lt;br /&gt;
&lt;br /&gt;
==== ModelPart:setVisible ====&lt;br /&gt;
Sets if this ModelPart is visible or not. Children of this ModelPart will also be invisible while this part is invisible.&lt;br /&gt;
&lt;br /&gt;
A value of &amp;lt;code&amp;gt;nil&amp;lt;/code&amp;gt; is interpreted as &amp;lt;code&amp;gt;true&amp;lt;/code&amp;gt; on 0.1.4 and below, and &amp;lt;code&amp;gt;false&amp;lt;/code&amp;gt; on 0.1.5 and above. This message will disappear &amp;lt;s&amp;gt;if&amp;lt;/s&amp;gt; when 0.1.6 is released.&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Arguments !! Return Type&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;setVisible(visible {{type|boolean}})&amp;lt;/code&amp;gt;&lt;br /&gt;
| self {{type|ModelPart}}&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;lua&amp;quot;&amp;gt;&lt;br /&gt;
local head = models.model.root.Head&lt;br /&gt;
&lt;br /&gt;
head:setVisible(false) -- Bye bye Head!&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== ModelPart:getVisible ====&lt;br /&gt;
Recursively goes up the ModelPart tree until it finds a ModelPart that is invisible, or the ModelPart is &amp;lt;code&amp;gt;models&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
In other words, if a parent part is invisible, this function returns &amp;lt;code&amp;gt;false&amp;lt;/code&amp;gt;. If all parent parts are visible, this function will return &amp;lt;code&amp;gt;true&amp;lt;/code&amp;gt; or &amp;lt;code&amp;gt;nil&amp;lt;/code&amp;gt;. Kinda stupid. This is fixed in 0.1.5 to never return &amp;lt;code&amp;gt;nil&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Arguments !! Return Type&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;getVisible()&amp;lt;/code&amp;gt;&lt;br /&gt;
| {{type|bool}} &amp;lt;nowiki&amp;gt;|&amp;lt;/nowiki&amp;gt; {{type|nil}} {{until|0.1.5}}&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;getVisible()&amp;lt;/code&amp;gt;&lt;br /&gt;
| {{type|bool}} {{since|0.1.5}}&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;lua&amp;quot;&amp;gt;&lt;br /&gt;
local root = models.model.root.Head&lt;br /&gt;
&lt;br /&gt;
print(root.Head:getVisible()) --&amp;gt; nil --&amp;lt; this is stupid&lt;br /&gt;
root:setVisible(false) -- Bye bye root!&lt;br /&gt;
print(root.Head:getVisible()) --&amp;gt; false&lt;br /&gt;
root:setVisible(true) -- Welcome back root!&lt;br /&gt;
print(root.Head:getVisible()) --&amp;gt; true --&amp;lt; aaaaaaaa&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== ModelPart:setColor ====&lt;br /&gt;
Sets a value to multiply with all pixels on the ModelPart&#039;s texture.&lt;br /&gt;
&lt;br /&gt;
=== renderTasks ===&lt;br /&gt;
todo: put all rendertask functions in here &lt;br /&gt;
&lt;br /&gt;
=== Render Methods ===&lt;br /&gt;
todo: Put partToWorldMatrix, preRender, midRender, and PostRender in here&lt;br /&gt;
&lt;br /&gt;
=== Animation Methods ===&lt;br /&gt;
todo: put getAnimPos/Rot/Scale and overrideVanillaPos/Rot/Scale in here&lt;/div&gt;</summary>
		<author><name>PoolloverNathan</name></author>
	</entry>
	<entry>
		<id>https://wiki.figuramc.org/index.php?title=Template:Note&amp;diff=269</id>
		<title>Template:Note</title>
		<link rel="alternate" type="text/html" href="https://wiki.figuramc.org/index.php?title=Template:Note&amp;diff=269"/>
		<updated>2024-09-27T15:11:10Z</updated>

		<summary type="html">&lt;p&gt;PoolloverNathan: separate icon customization&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&amp;lt;div style=&amp;quot;border-left: 6q solid {{{color|#5ea5ff}}}; border-radius: 6q; padding-left: 8q&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;div style=&amp;quot;color: {{{color|#5ea5ff}}}&amp;quot;&amp;gt;{{{icon|ⓘ}}} {{{tag|Note}}}&amp;lt;/div&amp;gt;&lt;br /&gt;
{{{1}}}&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;/div&gt;</summary>
		<author><name>PoolloverNathan</name></author>
	</entry>
	<entry>
		<id>https://wiki.figuramc.org/index.php?title=Template:Note&amp;diff=268</id>
		<title>Template:Note</title>
		<link rel="alternate" type="text/html" href="https://wiki.figuramc.org/index.php?title=Template:Note&amp;diff=268"/>
		<updated>2024-09-27T15:10:46Z</updated>

		<summary type="html">&lt;p&gt;PoolloverNathan: allow customization&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&amp;lt;div style=&amp;quot;border-left: 6q solid {{{color|#5ea5ff}}}; border-radius: 6q; padding-left: 8q&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;div style=&amp;quot;color: {{{color|#5ea5ff}}}&amp;quot;&amp;gt;{{{tag|ⓘ Note}}}&amp;lt;/div&amp;gt;&lt;br /&gt;
{{{1}}}&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;/div&gt;</summary>
		<author><name>PoolloverNathan</name></author>
	</entry>
	<entry>
		<id>https://wiki.figuramc.org/index.php?title=Template:Fr&amp;diff=261</id>
		<title>Template:Fr</title>
		<link rel="alternate" type="text/html" href="https://wiki.figuramc.org/index.php?title=Template:Fr&amp;diff=261"/>
		<updated>2024-09-27T14:24:59Z</updated>

		<summary type="html">&lt;p&gt;PoolloverNathan: glorified fraction slash&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{{1}}}⁄{{{2}}}&lt;/div&gt;</summary>
		<author><name>PoolloverNathan</name></author>
	</entry>
	<entry>
		<id>https://wiki.figuramc.org/index.php?title=Template:Note&amp;diff=250</id>
		<title>Template:Note</title>
		<link rel="alternate" type="text/html" href="https://wiki.figuramc.org/index.php?title=Template:Note&amp;diff=250"/>
		<updated>2024-09-27T04:39:20Z</updated>

		<summary type="html">&lt;p&gt;PoolloverNathan: mobile compat&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&amp;lt;div style=&amp;quot;border-left: 6q solid #5ea5ff; border-radius: 6q; padding-left: 8q&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;div style=&amp;quot;color: #5ea5ff&amp;quot;&amp;gt;ⓘ Note&amp;lt;/div&amp;gt;&lt;br /&gt;
{{{1}}}&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;/div&gt;</summary>
		<author><name>PoolloverNathan</name></author>
	</entry>
	<entry>
		<id>https://wiki.figuramc.org/index.php?title=Pings_(Tutorial)&amp;diff=249</id>
		<title>Pings (Tutorial)</title>
		<link rel="alternate" type="text/html" href="https://wiki.figuramc.org/index.php?title=Pings_(Tutorial)&amp;diff=249"/>
		<updated>2024-09-27T04:36:09Z</updated>

		<summary type="html">&lt;p&gt;PoolloverNathan: format link&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;With normal mods, there is comunication between the Minecraft Server and it’s clients which allows everything to stay in sync. &amp;lt;br/&amp;gt; Figura is completely client-side. It will never comunicate with the Minecraft Server you are connected to. Figura does not have a server-side component, meaning nothing will happen if you put the mod on a server.&amp;lt;br/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
----&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
What does this mean for you, the user? It means that certain functionality that only your client has access to will not be synced with other players.&amp;lt;br/&amp;gt; Some examples:&lt;br /&gt;
&lt;br /&gt;
; Keybinds&lt;br /&gt;
: If the Minecraft Server tracked every single keystroke, it would be a major security issue. The exact keystrokes are never sent, only the result of those keystrokes.&lt;br /&gt;
&lt;br /&gt;
; Action Wheel&lt;br /&gt;
: The Action Wheel is a feature added by Figura. Remember how I said that Figura never comunicates with the Minecraft Server? It should be obvious why the Action Wheel isnt synced.&lt;br /&gt;
&lt;br /&gt;
; HostAPI&lt;br /&gt;
: The HostAPI exclusivly contains variables that only you, the owner of the avatar and the owner of the machine running Minecraft, has access to. All functions contained within are vanilla variables that are not synced with the Minecraft Server. They are wrapped in a nice, explicit package stating that they are never synced. This is unlike the PlayerAPI, which you can assume is always synced (to some extent — some methods such as &amp;lt;code&amp;gt;[[PlayerAPI/isGrounded|isGrounded]]&amp;lt;/code&amp;gt; feel the need to be &#039;&#039;special&#039;&#039;)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
So how can we sync information with other players if we cannot do it through the Minecraft Server? The answer is Pings.&lt;br /&gt;
&lt;br /&gt;
== General Pings ==&lt;br /&gt;
Pings utilize Figura’s Backend to sync information with other clients. Pings are functions that when called, triggers all other clients to call the same function for their instance of your avatar.&lt;br /&gt;
&lt;br /&gt;
=== Ping Rate Limiting ===&lt;br /&gt;
The backend restricts you on how much data you can send over a period of time. The developer given limits are:&lt;br /&gt;
&lt;br /&gt;
* 1024 bytes per second&lt;br /&gt;
* 32 pings per second&lt;br /&gt;
&lt;br /&gt;
If either of these are reached, the backend will ignore any comunication from you for some amount of time.&lt;br /&gt;
&lt;br /&gt;
{{note|In some cases, fluctuations in network speed may cause some pings to become clumped close enough to reach this limit if they are slightly below. It&#039;s wise to leave a bit of buffer room just in case.}}&lt;br /&gt;
&lt;br /&gt;
=== Pingable Values ===&lt;br /&gt;
Pings can send most primitive types and some userdata types.&amp;lt;br/&amp;gt; All pingable types use a single byte to represent the type of data that is being sent. This byte is not included in the listed byte totals.&lt;br /&gt;
&lt;br /&gt;
* {{Type|nil}} - 0 Bytes&lt;br /&gt;
** if a type that is not supported is used as a parameter, it will be replaced with {{Type|nil}}.&lt;br /&gt;
&lt;br /&gt;
* {{Type|boolean}} - 0 Bytes&lt;br /&gt;
&lt;br /&gt;
* {{Type|integer}} - 1-4 Bytes&lt;br /&gt;
** {{Type|integers}} only take up as many bytes as they need.&lt;br /&gt;
** {{Type|integers}} are signed. For example, to only use a single byte the value must be between -128 and 127.&lt;br /&gt;
&lt;br /&gt;
* {{Type|double}} - 8 Bytes&lt;br /&gt;
** If the number has a decimal at all, or is outside the range of a 4 byte {{Type|integer}}, it will be sent as a {{Type|double}}.&lt;br /&gt;
&lt;br /&gt;
* {{Type|string}} - 2+n Bytes&lt;br /&gt;
** {{Type|strings}} will always use 2 bytes to store the length of the string.&lt;br /&gt;
** ASCII characters will be a single byte each.&lt;br /&gt;
** UTF-8 characters will be multiple bytes per character.&lt;br /&gt;
** The absolute maximum size of string you can send is &amp;lt;code&amp;gt;65535&amp;lt;/code&amp;gt; characters. If a larger string is sent, it will be truncated.&lt;br /&gt;
&lt;br /&gt;
* {{Type|table}} - (all keys) + (all values) Bytes&lt;br /&gt;
** Every key and value is send as data, resulting in high byte costs.&lt;br /&gt;
** It is recommended to never send a table over pings.&lt;br /&gt;
&lt;br /&gt;
* {{Type|Vector}} - 1+8*N Bytes&lt;br /&gt;
** {{Type|Vectors}} use a single byte to store the size of the Vector.&lt;br /&gt;
** Vectors are always assumed to store {{Type|doubles}}. If you have a Vector of integers, I recommend sending them as 3 seperate arguments instead.&lt;br /&gt;
&lt;br /&gt;
* {{Type|Matrix}} - 2+8*W*H Bytes&lt;br /&gt;
** {{Type|Matrices}} store both the width and height of the matrix, then every value as a {{Type|double}}.&lt;br /&gt;
&lt;br /&gt;
=== Ping ===&lt;br /&gt;
Below is an &#039;&#039;&#039;example&#039;&#039;&#039; ping.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;lua&amp;quot;&amp;gt;function pings.pingName(a)&lt;br /&gt;
    print(&amp;quot;Ping&amp;quot;)&lt;br /&gt;
    print(&amp;quot;.&amp;quot;)&lt;br /&gt;
    print(&amp;quot;Data Recieved:&amp;quot;, a)&lt;br /&gt;
    print(&amp;quot;.&amp;quot;)&lt;br /&gt;
    print(&amp;quot;Pong&amp;quot;)&lt;br /&gt;
end&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
It accepts a single variable, which it will print to the chat as an example.&lt;br /&gt;
&lt;br /&gt;
To call it, just call it like any other lua function.&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;lua&amp;quot;&amp;gt;&lt;br /&gt;
pings.pingName(&amp;quot;This is a string wooooooooooooooooo&amp;quot;)&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
When you as the host call the ping, the function will execute for all other clients, regardless of their current state.&lt;br /&gt;
&lt;br /&gt;
Do note that if a non-host client reaches a line where a ping gets called, it is completely ignored. No data is sent to the backend, and the contents of the ping will not be executed.&lt;br /&gt;
&lt;br /&gt;
Ping functions can be passed into functions that expect a function as a parameter, such as Action &amp;lt;code&amp;gt;onToggle&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;lua&amp;quot;&amp;gt;&lt;br /&gt;
actionVariable:onToggle(pings.pingName)&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Remember that we are passing the function itself as a variable. The below would be passing the &#039;&#039;return result&#039;&#039; of the ping function, which is nigh guarenteed to be &amp;lt;code&amp;gt;nil&amp;lt;/code&amp;gt; as Pings &#039;&#039;should never&#039;&#039; return a value.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;lua&amp;quot;&amp;gt;&lt;br /&gt;
--do not do&lt;br /&gt;
actionVariable:onToggle(pings.pingName())&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span id=&amp;quot;advanced-pings&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Advanced Pings ==&lt;br /&gt;
&lt;br /&gt;
Situational techniques that may be handy, depending on the use case.&lt;br /&gt;
&lt;br /&gt;
=== Ping on Init ===&lt;br /&gt;
Calling a ping function when the script is first loaded is a horrible idea. The ping will only ever execute for other clients when you, the host, load the avatar. Not only that, it may never be executed on other clients, as they might not have your avatar loaded by the time you broadcast the ping.&lt;br /&gt;
&lt;br /&gt;
How do we get around this? Well, when you assign a function to an index in the &amp;lt;code&amp;gt;pings&amp;lt;/code&amp;gt; table, the Lua Function gets replaced with a Java Function. This happens because of metatables, specifically the &amp;lt;code&amp;gt;__newindex&amp;lt;/code&amp;gt; metamethod. Functions cannot be modified, so if we store the function before adding it to the &amp;lt;code&amp;gt;pings&amp;lt;/code&amp;gt; table, we can use it like a regular function, and use the same code as a ping function.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;lua&amp;quot;&amp;gt;local function doThing(state)&lt;br /&gt;
    models.modelA:setVisible(state)&lt;br /&gt;
    models.modelB:setVisible(not state)&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
pings.doThing = doThing&lt;br /&gt;
&lt;br /&gt;
-- doThing and pings.doThing are 2 completely seperate values at this point, as the pings table has replaced the index at pings.doThing with a Java Function that wraps the doThing Lua Function.&lt;br /&gt;
&lt;br /&gt;
-- &amp;lt;code&amp;gt;doThing==pings.doThing&amp;lt;/code&amp;gt; will return &amp;lt;code&amp;gt;false&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
print(doThing, pings.doThing, doThing == pings.doThing)&lt;br /&gt;
&lt;br /&gt;
local keybindState = false&lt;br /&gt;
&lt;br /&gt;
-- I call the local doThing instead of pings.doThing, as pings.doThing is a function that invokes network code.&lt;br /&gt;
&lt;br /&gt;
-- This ensures that the default state is set correctly. If this was a ping function, both models will be visible for other clients until you press the keybind.&lt;br /&gt;
&lt;br /&gt;
doThing(keybindState)&lt;br /&gt;
&lt;br /&gt;
local keyA = keybinds:newKeybind(&amp;quot;KeybindName&amp;quot;, &amp;quot;key.keyboard.k&amp;quot;)&lt;br /&gt;
&lt;br /&gt;
function keyA.press()&lt;br /&gt;
&lt;br /&gt;
    keybindState = not keybindState&lt;br /&gt;
&lt;br /&gt;
    -- We still need to call the ping function in the keybind.&lt;br /&gt;
&lt;br /&gt;
    pings.doThing(keybindState)&lt;br /&gt;
&lt;br /&gt;
end&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
The alternative is to reiterate the &amp;lt;code&amp;gt;models.modelA:setVisible(state) models.modelB:setVisible(not state)&amp;lt;/code&amp;gt; part of the ping.&amp;lt;br/&amp;gt; For larger pings it will be combersome to rewrite code that is already defined, which is why this technique is useful.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span id=&amp;quot;byte-array&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Byte Array ===&lt;br /&gt;
There are some situations where you will want to send a large amount of raw bytes, and you need to do it efficiently. The most efficient way is to send a string.&lt;br /&gt;
&lt;br /&gt;
Asside from the 2 constant bytes for the length, a string will always be 1 byte per ascii character (UTF-8 characters are multiple ascii characters, interpreted as a single character). This makes it very consistent in terms of bytes, making it easy to predict and avoid being rate limited.&lt;br /&gt;
&lt;br /&gt;
Below is a basic conversion of a byte array to a string, ready to be pinged and converted back into a byte array on the client’s end.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;lua&amp;quot;&amp;gt;function pings.recieveData(str)&lt;br /&gt;
    local byteArray = table.pack(string.byte(str))&lt;br /&gt;
    printTable(byteArray)&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
local packet=[]&lt;br /&gt;
for i=1,20 do&lt;br /&gt;
    table.insert(packet, math.random(0,255))&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
local keyA = keybinds:newKeybind(&amp;quot;KeybindName&amp;quot;, &amp;quot;key.keyboard.k&amp;quot;)&lt;br /&gt;
&lt;br /&gt;
function keyA.press()&lt;br /&gt;
    local packedString = string.char(table.unpack(packet))&lt;br /&gt;
    pings.recieveData(packedString)&lt;br /&gt;
end&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;/div&gt;</summary>
		<author><name>PoolloverNathan</name></author>
	</entry>
	<entry>
		<id>https://wiki.figuramc.org/index.php?title=Pings_(Tutorial)&amp;diff=248</id>
		<title>Pings (Tutorial)</title>
		<link rel="alternate" type="text/html" href="https://wiki.figuramc.org/index.php?title=Pings_(Tutorial)&amp;diff=248"/>
		<updated>2024-09-27T04:34:58Z</updated>

		<summary type="html">&lt;p&gt;PoolloverNathan: minor reformatting; mention leaving buffer room&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;With normal mods, there is comunication between the Minecraft Server and it’s clients which allows everything to stay in sync. &amp;lt;br/&amp;gt; Figura is completely client-side. It will never comunicate with the Minecraft Server you are connected to. Figura does not have a server-side component, meaning nothing will happen if you put the mod on a server.&amp;lt;br/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
----&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
What does this mean for you, the user? It means that certain functionality that only your client has access to will not be synced with other players.&amp;lt;br/&amp;gt; Some examples:&lt;br /&gt;
&lt;br /&gt;
; Keybinds&lt;br /&gt;
: If the Minecraft Server tracked every single keystroke, it would be a major security issue. The exact keystrokes are never sent, only the result of those keystrokes.&lt;br /&gt;
&lt;br /&gt;
; Action Wheel&lt;br /&gt;
: The Action Wheel is a feature added by Figura. Remember how I said that Figura never comunicates with the Minecraft Server? It should be obvious why the Action Wheel isnt synced.&lt;br /&gt;
&lt;br /&gt;
; HostAPI&lt;br /&gt;
: The HostAPI exclusivly contains variables that only you, the owner of the avatar and the owner of the machine running Minecraft, has access to. All functions contained within are vanilla variables that are not synced with the Minecraft Server. They are wrapped in a nice, explicit package stating that they are never synced. This is unlike the PlayerAPI, which you can assume is always synced (to some extent — some methods such as [[PlayerAPI/isGrounded]] feel the need to be &#039;&#039;special&#039;&#039;)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
So how can we sync information with other players if we cannot do it through the Minecraft Server? The answer is Pings.&lt;br /&gt;
&lt;br /&gt;
== General Pings ==&lt;br /&gt;
Pings utilize Figura’s Backend to sync information with other clients. Pings are functions that when called, triggers all other clients to call the same function for their instance of your avatar.&lt;br /&gt;
&lt;br /&gt;
=== Ping Rate Limiting ===&lt;br /&gt;
The backend restricts you on how much data you can send over a period of time. The developer given limits are:&lt;br /&gt;
&lt;br /&gt;
* 1024 bytes per second&lt;br /&gt;
* 32 pings per second&lt;br /&gt;
&lt;br /&gt;
If either of these are reached, the backend will ignore any comunication from you for some amount of time.&lt;br /&gt;
&lt;br /&gt;
{{note|In some cases, fluctuations in network speed may cause some pings to become clumped close enough to reach this limit if they are slightly below. It&#039;s wise to leave a bit of buffer room just in case.}}&lt;br /&gt;
&lt;br /&gt;
=== Pingable Values ===&lt;br /&gt;
Pings can send most primitive types and some userdata types.&amp;lt;br/&amp;gt; All pingable types use a single byte to represent the type of data that is being sent. This byte is not included in the listed byte totals.&lt;br /&gt;
&lt;br /&gt;
* {{Type|nil}} - 0 Bytes&lt;br /&gt;
** if a type that is not supported is used as a parameter, it will be replaced with {{Type|nil}}.&lt;br /&gt;
&lt;br /&gt;
* {{Type|boolean}} - 0 Bytes&lt;br /&gt;
&lt;br /&gt;
* {{Type|integer}} - 1-4 Bytes&lt;br /&gt;
** {{Type|integers}} only take up as many bytes as they need.&lt;br /&gt;
** {{Type|integers}} are signed. For example, to only use a single byte the value must be between -128 and 127.&lt;br /&gt;
&lt;br /&gt;
* {{Type|double}} - 8 Bytes&lt;br /&gt;
** If the number has a decimal at all, or is outside the range of a 4 byte {{Type|integer}}, it will be sent as a {{Type|double}}.&lt;br /&gt;
&lt;br /&gt;
* {{Type|string}} - 2+n Bytes&lt;br /&gt;
** {{Type|strings}} will always use 2 bytes to store the length of the string.&lt;br /&gt;
** ASCII characters will be a single byte each.&lt;br /&gt;
** UTF-8 characters will be multiple bytes per character.&lt;br /&gt;
** The absolute maximum size of string you can send is &amp;lt;code&amp;gt;65535&amp;lt;/code&amp;gt; characters. If a larger string is sent, it will be truncated.&lt;br /&gt;
&lt;br /&gt;
* {{Type|table}} - (all keys) + (all values) Bytes&lt;br /&gt;
** Every key and value is send as data, resulting in high byte costs.&lt;br /&gt;
** It is recommended to never send a table over pings.&lt;br /&gt;
&lt;br /&gt;
* {{Type|Vector}} - 1+8*N Bytes&lt;br /&gt;
** {{Type|Vectors}} use a single byte to store the size of the Vector.&lt;br /&gt;
** Vectors are always assumed to store {{Type|doubles}}. If you have a Vector of integers, I recommend sending them as 3 seperate arguments instead.&lt;br /&gt;
&lt;br /&gt;
* {{Type|Matrix}} - 2+8*W*H Bytes&lt;br /&gt;
** {{Type|Matrices}} store both the width and height of the matrix, then every value as a {{Type|double}}.&lt;br /&gt;
&lt;br /&gt;
=== Ping ===&lt;br /&gt;
Below is an &#039;&#039;&#039;example&#039;&#039;&#039; ping.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;lua&amp;quot;&amp;gt;function pings.pingName(a)&lt;br /&gt;
    print(&amp;quot;Ping&amp;quot;)&lt;br /&gt;
    print(&amp;quot;.&amp;quot;)&lt;br /&gt;
    print(&amp;quot;Data Recieved:&amp;quot;, a)&lt;br /&gt;
    print(&amp;quot;.&amp;quot;)&lt;br /&gt;
    print(&amp;quot;Pong&amp;quot;)&lt;br /&gt;
end&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
It accepts a single variable, which it will print to the chat as an example.&lt;br /&gt;
&lt;br /&gt;
To call it, just call it like any other lua function.&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;lua&amp;quot;&amp;gt;&lt;br /&gt;
pings.pingName(&amp;quot;This is a string wooooooooooooooooo&amp;quot;)&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
When you as the host call the ping, the function will execute for all other clients, regardless of their current state.&lt;br /&gt;
&lt;br /&gt;
Do note that if a non-host client reaches a line where a ping gets called, it is completely ignored. No data is sent to the backend, and the contents of the ping will not be executed.&lt;br /&gt;
&lt;br /&gt;
Ping functions can be passed into functions that expect a function as a parameter, such as Action &amp;lt;code&amp;gt;onToggle&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;lua&amp;quot;&amp;gt;&lt;br /&gt;
actionVariable:onToggle(pings.pingName)&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Remember that we are passing the function itself as a variable. The below would be passing the &#039;&#039;return result&#039;&#039; of the ping function, which is nigh guarenteed to be &amp;lt;code&amp;gt;nil&amp;lt;/code&amp;gt; as Pings &#039;&#039;should never&#039;&#039; return a value.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;lua&amp;quot;&amp;gt;&lt;br /&gt;
--do not do&lt;br /&gt;
actionVariable:onToggle(pings.pingName())&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span id=&amp;quot;advanced-pings&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Advanced Pings ==&lt;br /&gt;
&lt;br /&gt;
Situational techniques that may be handy, depending on the use case.&lt;br /&gt;
&lt;br /&gt;
=== Ping on Init ===&lt;br /&gt;
Calling a ping function when the script is first loaded is a horrible idea. The ping will only ever execute for other clients when you, the host, load the avatar. Not only that, it may never be executed on other clients, as they might not have your avatar loaded by the time you broadcast the ping.&lt;br /&gt;
&lt;br /&gt;
How do we get around this? Well, when you assign a function to an index in the &amp;lt;code&amp;gt;pings&amp;lt;/code&amp;gt; table, the Lua Function gets replaced with a Java Function. This happens because of metatables, specifically the &amp;lt;code&amp;gt;__newindex&amp;lt;/code&amp;gt; metamethod. Functions cannot be modified, so if we store the function before adding it to the &amp;lt;code&amp;gt;pings&amp;lt;/code&amp;gt; table, we can use it like a regular function, and use the same code as a ping function.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;lua&amp;quot;&amp;gt;local function doThing(state)&lt;br /&gt;
    models.modelA:setVisible(state)&lt;br /&gt;
    models.modelB:setVisible(not state)&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
pings.doThing = doThing&lt;br /&gt;
&lt;br /&gt;
-- doThing and pings.doThing are 2 completely seperate values at this point, as the pings table has replaced the index at pings.doThing with a Java Function that wraps the doThing Lua Function.&lt;br /&gt;
&lt;br /&gt;
-- &amp;lt;code&amp;gt;doThing==pings.doThing&amp;lt;/code&amp;gt; will return &amp;lt;code&amp;gt;false&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
print(doThing, pings.doThing, doThing == pings.doThing)&lt;br /&gt;
&lt;br /&gt;
local keybindState = false&lt;br /&gt;
&lt;br /&gt;
-- I call the local doThing instead of pings.doThing, as pings.doThing is a function that invokes network code.&lt;br /&gt;
&lt;br /&gt;
-- This ensures that the default state is set correctly. If this was a ping function, both models will be visible for other clients until you press the keybind.&lt;br /&gt;
&lt;br /&gt;
doThing(keybindState)&lt;br /&gt;
&lt;br /&gt;
local keyA = keybinds:newKeybind(&amp;quot;KeybindName&amp;quot;, &amp;quot;key.keyboard.k&amp;quot;)&lt;br /&gt;
&lt;br /&gt;
function keyA.press()&lt;br /&gt;
&lt;br /&gt;
    keybindState = not keybindState&lt;br /&gt;
&lt;br /&gt;
    -- We still need to call the ping function in the keybind.&lt;br /&gt;
&lt;br /&gt;
    pings.doThing(keybindState)&lt;br /&gt;
&lt;br /&gt;
end&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
The alternative is to reiterate the &amp;lt;code&amp;gt;models.modelA:setVisible(state) models.modelB:setVisible(not state)&amp;lt;/code&amp;gt; part of the ping.&amp;lt;br/&amp;gt; For larger pings it will be combersome to rewrite code that is already defined, which is why this technique is useful.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span id=&amp;quot;byte-array&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Byte Array ===&lt;br /&gt;
There are some situations where you will want to send a large amount of raw bytes, and you need to do it efficiently. The most efficient way is to send a string.&lt;br /&gt;
&lt;br /&gt;
Asside from the 2 constant bytes for the length, a string will always be 1 byte per ascii character (UTF-8 characters are multiple ascii characters, interpreted as a single character). This makes it very consistent in terms of bytes, making it easy to predict and avoid being rate limited.&lt;br /&gt;
&lt;br /&gt;
Below is a basic conversion of a byte array to a string, ready to be pinged and converted back into a byte array on the client’s end.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;lua&amp;quot;&amp;gt;function pings.recieveData(str)&lt;br /&gt;
    local byteArray = table.pack(string.byte(str))&lt;br /&gt;
    printTable(byteArray)&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
local packet=[]&lt;br /&gt;
for i=1,20 do&lt;br /&gt;
    table.insert(packet, math.random(0,255))&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
local keyA = keybinds:newKeybind(&amp;quot;KeybindName&amp;quot;, &amp;quot;key.keyboard.k&amp;quot;)&lt;br /&gt;
&lt;br /&gt;
function keyA.press()&lt;br /&gt;
    local packedString = string.char(table.unpack(packet))&lt;br /&gt;
    pings.recieveData(packedString)&lt;br /&gt;
end&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;/div&gt;</summary>
		<author><name>PoolloverNathan</name></author>
	</entry>
</feed>