Flags reference
Every flag and token Punchy! reads in settings, compat files, tuning profiles, clip entries, timelines, model parts, particles and physics, with its default and the page that explains it.
-
Punchy! Studio
This page has not been translated into European Spanish yet, so it is shown in English. Read in English
On this page
This is the lookup page for Punchy! 3.0. The flags and tokens that Punchy! acts on in its settings, compat files, tuning profiles, clip files, model part definitions, particles and physics sit in the tables below, with the file each goes in, its default and a link to the page that teaches it. The keys of a geometry file are on Geometry and textures. Use it when you know what you want to switch and need the exact spelling, or when a pack acts in a way you did not expect and you want to check a key.
It is for pack makers who write JSON by hand, and for Punchy! Studio users who want to know what a field writes. A flag is a key in a JSON file. A token is a short word inside a clip’s timeline.
Before you start
- This page was checked against Punchy! 3.0 for Fabric on Minecraft 26.3. A key that works on only some versions says so in its row.
- You need a resource pack to put files in. If you have none, start with Resource packs.
- A key that works only with another mod says so in its row. These are Better Combat and Spatial GUI.
Read the tables
- The heading above a table tells you which file it is for. A Goes in column appears when one flag can sit in more than one place.
- Several names in one cell are usually spellings of the same flag, and any one works. A few cells list related flags instead, such as the four proxy maps or the left and right keep keys. The row says what each does.
- Default is what Punchy! uses when you leave the key out. none means the feature is off or nothing is set.
- Key names and clip names are case sensitive. Timeline tokens are not, because Punchy! lowercases them.
- Punchy! ignores a key it does not know, without a message. When a flag seems to have no effect, check the spelling first.
- A value of the wrong JSON type can make Punchy! drop a whole file. Things that drop a whole file lists them.
- A name in angle brackets, such as
<id>, stands for text you choose.
Try a few flags
This pack uses flags from several of the tables below. It makes sword swings alternate between two clips, plays a critical hit with the second clip, adds an inspect clip, and swings the sword like a pendulum.
-
In your game folder, create the folder
resourcepacks/Flag Demo. -
Inside it, save this as
pack.mcmeta. The numbers are for Minecraft 26.3; Resource packs has the numbers for other versions.{ "pack": { "description": "Flag Demo", "pack_format": 97, "min_format": 97, "max_format": 97 } } -
Make the folders
assets/minecraft/punchy/animationsandassets/minecraft/punchy/compatinsideFlag Demo. -
Save the clip file below as
assets/minecraft/punchy/animations/flag_demo.animation.json. -
Save the rule file below as
assets/minecraft/punchy/compat/flag_demo.json. -
Open Options, then Resource Packs…, move Flag Demo to the right-hand list and press Done. If it was already in the list, press F3+T.
-
Join a world, hold any sword and switch to first person. Swing twice: the swings alternate between
flag_swing_1andflag_swing_2. Press I andflag_inspectplays. -
Change a number in the clip file, press F3+T and swing again.
The clip file:
{
"animations": {
"flag_swing_1": {
"animation_length": 0.6,
"bones": {
"right_arm": {
"rotation": {
"0.0": [0, 0, 0],
"0.2": [-70, 0, 0],
"0.45": [35, 0, 0],
"0.6": [0, 0, 0]
}
}
},
"timeline": {
"0.0": "use_keyframes_v2;anim_speed_1;blend_from_current_origin;keep_arm_tuning;sync_walk_arms;"
}
},
"flag_swing_2": {
"animation_length": 0.6,
"bones": {
"right_arm": {
"rotation": {
"0.0": [0, 0, 0],
"0.2": [-50, 25, 0],
"0.45": [30, -20, 0],
"0.6": [0, 0, 0]
}
}
},
"timeline": {
"0.0": "use_keyframes_v2;anim_speed_1.5;blend_from_current_origin;"
}
},
"flag_inspect": {
"animation_length": 1.2,
"bones": {
"right_arm": {
"rotation": {
"0.0": [0, 0, 0],
"0.5": [-20, 40, 15],
"1.2": [0, 0, 0]
}
}
},
"timeline": {
"0.0": "use_keyframes_v2;anim_speed_1;dual_handed;hide_offhand_if_empty;",
"0.9": "show_offhand_if_empty;"
}
}
}
}
The rule file:
{
"item": {
"SWORD": {
"disable_sprint_lateral_tilt": true,
"disable_mining_animation": true,
"physics": { "name": "FORWARD_PENDULUM", "limitDeg": 25.0, "speed": 8.0 },
"customAnimation": [
{
"type": "attack",
"var_1": "flag_swing_1",
"var_2": "flag_swing_2",
"critical_hit": "flag_swing_2",
"skip_blend_out": true,
"customFlags": { "movement_influence": 40 }
},
{ "type": "inspect", "name": "flag_inspect" }
]
}
}
}
What each flag does here:
- In the clip file.
use_keyframes_v2picks the V2 layout.anim_speed_1plays the clip at the speed you drew it, andanim_speed_1.5plays the second swing a half faster.blend_from_current_originstarts the blend from where the arm is now.keep_arm_tuningkeeps your Hand Editor offsets during the swing.sync_walk_armslets the walk arm motion follow the clip.dual_handedmakes the inspect clip move both arms, andhide_offhand_if_emptyandshow_offhand_if_emptyhide an empty off hand for most of it. - In the rule file.
disable_sprint_lateral_tiltstops the sideways tilt while you sprint.disable_mining_animationmakes a sword swing at a block play the attack clips.physicssets the pendulum.var_1andvar_2are the combo, andcritical_hitis the clip for a critical hit.skip_blend_outcuts out of the clip without a blend out.movement_influencekeeps 40 percent of Punchy!‘s own walk motion on the arm.

Video coming soon
In Punchy! Studio, hover any field in the Properties tabs of the Model workspace. The tooltip names the JSON key it writes and the other spellings Punchy! accepts.
Video coming soon
A model part definition uses the same idea. This one is the lantern from Model part definitions, with a bone physics spec and a particle that fires while you walk. The geometry, the texture and the clip file are the ones on that page. Save this definition as assets/minecraft/punchy/model_parts_items/definitions/lantern.json, beside the geo, textures and animations folders that page builds.
{
"items": ["minecraft:lantern"],
"geo": "minecraft:punchy/model_parts_items/geo/lantern.geo.json",
"texture": "minecraft:punchy/model_parts_items/textures/lantern",
"animations": [
"minecraft:punchy/model_parts_items/animations/lantern.animation.json"
],
"modelPartsAnimation": [
{ "type": "idle", "name": "lantern_sway" },
{
"type": "idle",
"name": "lantern_still",
"inside_water": true,
"disable_all_particles": true,
"skip_blend_in": true,
"skip_blend_out": true
},
{ "type": "attack", "name": "lantern_swing" }
],
"bone_emission": { "strength": 100, "blur": true, "flame": 100 },
"bone_physics": {
"flame": { "pendulum_mode": "forward", "limit_deg": 25 }
},
"particles": [
{
"type": "minecraft:smoke",
"bone": "flame",
"rate": 3,
"life": 1.5,
"triggers": { "walking": true }
}
]
}
Here items, geo, texture and animations name the files. Each modelPartsAnimation entry picks a clip for a moment, and the second one cuts to a still clip under water with no blend and no particles. bone_emission makes the flame bone glow with a halo. bone_physics lets the flame swing forward. The particle releases three times a second while you walk. Every key has a row below.
Which setting wins
When two keys or two files disagree, this table says which one Punchy! uses.
Which one wins
| When | What wins | Page |
|---|---|---|
| Two packs have a clip with the same name | The pack higher in your list of selected packs. The whole clip is replaced, and bones are never merged. | Animation reference |
| Two compat files set the same field | The file Punchy! reads first. Later files only fill what is still empty. Packs are read from the top of the list down. | Compat rules |
| A compat file, your saved tuning and a tuning profile | They load in this order, and the later one wins for what it sets: compat files, then config/ (only when no profile is active), then your Mix Packs choices, then the active tuning profile. | Compat rules |
| Several rules reach one item | From weakest to strongest: Punchy!‘s own values and the global poses, the kind group such as SWORD, a custom group, the item entry for the item id, and an item entry whose renamed matches the stack. A pattern entry works as an item entry for each item it matches, longest pattern first, and is skipped for an item that has its own item entry for the plain id. | Compat rules |
An item’s own custom list and its group’s list | The item’s list replaces the group’s list whole, even when it is empty. default_ then fill the types the chosen list lacks, matched by type plus key. | Compat rules |
| Several entries of one type could play | The more specific one. An items filter counts 100 and each condition counts 1. Ties keep the order of the list. | Types and triggers |
| Several variations fit | The highest priority. A tie keeps the one listed first. | Variations |
var_1 to var_3 and name on an attack | var_1 to var_3, one per swing, in order. name is used only when all three are empty. critical_ is checked before the combo. | Types and triggers |
animation, name and var_1 on a single clip rule | animation, then name, then var_1. | Types and triggers |
lerp_mode and easing on one key | lerp_mode. | Animation reference |
rotation_ and rotation_ in one clip | rotation_. Both beat the rule that gives clips named mace, trident or crossbow the XYZ order. | Animation reference |
anim_ and the Animation Speed setting | The token, from its time on. The last token at or before the current time wins. | Animation reference |
keep_ and disable_ | disable_. | Animation reference |
keep_ and keep_ or keep_ | The side key wins for that hand. | Compat rules |
hide_ and show_, or an off hand window start and stop | The later one by time. | Animation reference |
blend_ as a token and as a rule key | Either one turns it on. | Types and triggers |
A triggerable key in a pack and the key the player chose in Controls | The player’s key. | Settings and controls |
A pose and its entry both give a physics mode | The pose’s mode for that hand. A pose with none takes the entry’s. | Item physics |
| Two definitions cover one item | Definitions are sorted by their full id, ignoring case. The first unnamed one wins. A definition with a customName beats the unnamed ones when the stack carries that name. When a named definition covers the item and the stack lacks that name, no unnamed definition is used. | Definitions |
items and item, customName and name, animations and animation, bone_ and bone, disable_ and disable_, camera_ and inside_, dynamic_ and dynamic | The first key of each pair. The second is read only when the first is missing. | Definitions |
thirdperson_ and firstperson_ (and the left hand pair) | The thirdperson_ entry for that hand. | Definitions |
| Several animation entries fit one moment in a definition | The highest score: inside_ 3, in_water 2, and 1 for each of the other conditions written. Ties keep the order of the file. Entries with no condition play only when no scored entry fits. | Conditions |
An animation entry’s disable_ and the definition’s list | The entry’s list replaces the definition’s while the entry plays, even when it is empty. | Item physics |
| A bone texture for a bone | The exact bone name, then the name ignoring case, then the parent bones, then the main texture. | Geometry and textures |
| Two physics specs for one bone | They merge. A percent that is not 100 wins, a mode other than none wins, and later settings win. | Item physics |
emit_ and rate on one emitter | emit_, when it is above 0. | Particles |
| Emitters in a definition and in a compat rule for the same item | Both run, the definition’s first. In compat, the most specific list wins: an item’s list replaces its group’s list. | Particles |
A shading.json rule for the held item and a particle’s own additive key | The rule. | Shading rules |
Two shading.json rules match one item | For each field, the last matching rule wins. Punchy! reads the lowest pack first, so a higher pack can undo a lower one. | Shading rules |
| Several matching enchantment variants | They apply in ascending priority. Equal priorities keep the order of the file. | Variants |
Settings that switch features
These keys live in config/punchy/punchy_config.json, and each has a row in the Punchy menu you open with F8. They switch whole features on or off for the player. A pack cannot set them. They are here because several flags below act only while one of them is on.
Keys of punchy_config.json
| Key | Menu row | Default | What it does | Page |
|---|---|---|---|---|
enableMod | Enable Punchy, in the left column of every tab | true | The master switch. When it is false the game draws your hands the vanilla way and no Punchy! clip plays. | Settings and controls |
animation | Animation Speed, General tab | 5.5 | The base speed of attack, mining, triggerable and idle clips. Values are brought into the range 0.5 to 7 when the file loads. A clip’s own anim_ token wins from its time on. Bow, crossbow, shield, trident, swim and dry_out clips play at the speed you drew them. | Settings and controls |
enable | Enable Camera Animations, General tab | true | Lets the camera bone of a clip move and turn your view. When it is false your view stays still and the clip still moves your arms. | Settings and controls |
disable | Resource Pack Movement, Movement tab | true | While it is true, Punchy!‘s own motion drives walking, sprinting, jumping, falling and landing. Set it to false to let a pack’s clips for those moments play. The menu row reads the other way round: it is on when this key is false, so it is off by default. | Types and triggers |
enable | Enable Particle System, Effects tab | true | The master switch for particle emitters. When it is false nothing is emitted. | Particles |
enable | Enable Model Parts Glow, Effects tab | true | The glow and full brightness of particles that glow. Model part items keep their own bone_ glow. When it is false the particles still appear. | Particles |
enable | Enable Blur Glow At Dark, Effects tab | true | Shows or hides the particles that use bright_ or glow_. | Particles |
disable | Enable Item Physics, Items & World tab | false | When it is true, held items do not swing as pendulums and slime does not wobble in your hand. The menu row is on when this key is false. | Item physics |
disable | Resource Pack Model Parts, Items & World tab | false | When it is true, no model part loads or draws after the next resource reload (F3+T). The menu row is on when this key is false. | Model part definitions |
Rows over a disable key read the other way round in the menu. Enable Item Physics is on when disableNativeItemPhysics is false, Resource Pack Movement is on when disableNewKeyframeMoves is false, and Resource Pack Model Parts is on when disableResourcePackModelParts is false.
Mix Packs choices
Your choices on the Mix Packs tab of the Punchy menu are stored in punchy_config.json, and each setup you save is a file at config/punchy/mix_profiles/<name>.json with the same three keys. A pack cannot set them. Mix the packs shows the tab and how Punchy! decides.
Punchy! applies the loaded setup again at each resource reload and when the game starts, so a pick you make after loading or saving a setup goes back to that setup’s choices on the next reload. To keep a pick, save the setup again under the same name with Save as…, or pick Current choices in the setup list before you change a row.
Keys of the Mix Packs choices
| Key | Type | Default | What it does |
|---|---|---|---|
animation | object, text to text | {} | The pack for each row. The key is the row id: kind: and the kind in lower case, such as kind:sword or kind:, or specific: and the item id, such as specific:. The value is a pack option. Values are read in lower case, and empty ones are dropped. |
animation | object, text to text | {} | The pack for one animation type in one row. The key is the row id, a vertical bar and the type in lower case. A key without a vertical bar is dropped. |
mix | object, text to boolean | {} | For the Specific items rows, whose ids start with specific:, such as specific:. true makes the row use its own stored choice. Only true values are kept. |
Pack options a Mix value can have
| Value | What it means |
|---|---|
punchy_ | Follow pack order for this row. The ids vanilla and mod_, and an empty value, mean the same. |
pack: | The built-in Punchy! pack, shown as Punchy! Default. |
pack:<id> | Any other pack: pack: and the pack’s id, in lower case. For a pack in your resourcepacks folder the id is file/ and the file name, so sword_ is pack:. The menu shows the name without file/ and .zip, with spaces for underscores and hyphens and each word capitalized, so sword_ shows as Sword Pack A. |
Compat files and tuning profiles
A compat file is a JSON file at assets/minecraft/punchy/compat/<name>.json (or assets/punchy/compat/<name>.json) in a resource pack. A tuning profile is the file the Hand Editor saves in config/punchy/profiles/. Both use the same keys, so everything in this section works in either. Compat rules teaches the files, and Tuning editor and debug teaches the editor.
Root keys
Keys at the top of a compat file or a profile
| Key | Type | Default | What it does | Page |
|---|---|---|---|---|
item | object | none | Entries keyed by an item kind in capitals such as SWORD, by the name of a custom group, or by a pattern. Each entry applies to every item it matches. A key that is none of these is ignored. | Compat rules |
item | object | none | Entries keyed by one item id. This is the strongest rule. The key must be a valid lower case id. To write more than one entry for an item, add #, a vertical bar or @ and any text after the id. Punchy! reads only the id. | Compat rules |
custom, custom_ | list | none | Named lists of item ids. Each element has a name and an items list. Use the name as a key in item. In items, a bare name such as stick means minecraft:. | Compat rules |
globalItem | side set | none | One pose per hand for every held item. | Compat rules |
globalArm | side set | none | One pose per hand for every arm. | Compat rules |
armMesh | object | none | Moves Punchy!‘s arm mesh, not the item. Only the key global is read, and it holds a side set. | Compat rules |
emptyHand | entry | none | Poses, physics, flags and clips for an empty hand. | Compat rules |
spatial, spatial_ | entry | none | Takes the same keys as emptyHand. Only Punchy!‘s Spatial GUI support reads it. | Compat rules |
default_, default | list | none | Clip rules for every item. They fill the types an item’s own list leaves out. A rule of type melee_, or one with a better list, goes to the Better Combat defaults. | Compat rules |
chestProxy, enchant, paddle, fishing | object | none | Move the helper parts of some held items. See Proxies. | Compat rules |
A side set is an object with a right and a left pose.
Poses
A pose places something. It sits inside a side set, in transforms, armTransforms, globalItem, globalArm, armMesh and the proxy maps.
Keys of a pose
| Key | Type | Default | What it does | Page |
|---|---|---|---|---|
scale | number | none | The size of the item or arm. Always write it: 1.0 is normal size. A pose with no scale is drawn at size 0 and the item vanishes. | Compat rules |
offX, offY, offZ | number | 0 | Moves the item or arm. | Compat rules |
rotX, rotY, rotZ | number, degrees | 0 | Turns the item or arm. | Compat rules |
pivotX, pivotY, pivotZ | number | 0 | The point an item turns around. Items only. The arm, the arm mesh and the proxies ignore it. | Compat rules |
physics | text | none | The pendulum mode for this hand: NONE, FULL_ or FORWARD_, in any letter case. An unknown name counts as NONE. It is text only: an object here drops the whole file. | Item physics |
disable_, keep_, keep_, keep_, keep_ | boolean | none | The flags in Flags that tune or switch off a moment, set for this hand only. In a pose keep_ wins over the two side keys: see the note under that table. | Compat rules |
Entries for kinds, groups and items
These keys go in an entry of item (a kind, a custom group or a pattern), in an entry of itemSpecific, or in emptyHand. The Goes in column says which.
Keys of an entry
| Key | Goes in | Type | Default | What it does | Page |
|---|---|---|---|---|---|
transforms | item, item, emptyHand | side set | none | Where the held item sits, one pose per hand. | Compat rules |
right, left | item entries keyed by a kind or a custom group | pose | none | A shorter way to write transforms.right and transforms.left. Used only when transforms is missing. Not read in item entries or pattern entries. | Compat rules |
arm | item, item, emptyHand | side set | none | Where the arm sits, one pose per hand. | Compat rules |
physics | item, item, emptyHand | name, object or list | none | The pendulum of the held item. See Physics settings. | Item physics |
kind | item, pattern entries of item | text, capitals | the item’s own kind | Sets the item’s kind. In item write it in capitals, because a lower case value is ignored. In a pattern entry, Punchy! upper-cases it, and a kind that is not a kind name gives the items the kind INGREDIENT. With no kind in a pattern entry, the entry key is tried as a kind name, and INGREDIENT is used when it is not one. | Compat rules |
armKind | item, pattern entries of item | text, capitals | the entry’s kind, or AXE | The kind of arm model to use with arm. Read only when arm is present. Without it the arm pose uses kind when that is also an arm kind, and AXE otherwise. | Compat rules |
pattern_, pattern | item | text | none | Makes the entry apply to every item whose id, path or translation key contains this text, ignoring case. The longest text wins when several patterns match. An item entry for the plain item id beats a pattern. | Compat rules |
related: | key of item | none | none | A key that starts with related: works as pattern_ with the text after the colon. | Compat rules |
renamed | item | text | none | Applies the entry only to stacks whose custom name equals this text, ignoring case and the spaces at both ends. | Compat rules |
custom, custom_, custommodeldata | item | whole number | none | Applies the entry only to stacks with this custom model data number. | Compat rules |
custom | item, item, emptyHand | list of rules | none | The clip rules. See Custom animation entries. | Types and triggers |
custom | item, item, emptyHand | list of rules | none | A second list of clip rules for the item. For one item, its own custom list is checked first, then its own custom list, then the group’s two lists. | Compat rules |
better | item, item, emptyHand | list | none | Better Combat combos. Each element has a type of melee_ (any spelling) and attack_1 to attack_6 clip names. Needs Better Combat. | Types and triggers |
particle_, particle, particle, particles, particle_, particle, particle_, particle | item, item | emitters | none | Particle emitters for these items. They are read in this order and joined. Not read in emptyHand. | Particles |
bone_, bone | item | object or list | none | Bone physics for the model part of this item. See Bone physics keys. | Item physics |
enchantment_, enchantment | item | list | none | Particle emitters that apply while the item has certain enchantments. See Enchantment variants. | Variants |
Flags that tune or switch off a moment
The Goes in column says where each flag can sit. pose means inside a pose, for one hand. All of them default to false or not set.
Flags on entries and poses
| Flag | Goes in | What it does | Page |
|---|---|---|---|
disable_, disable | item, item, emptyHand, pose | Stops the sideways tilt of the item and arm while you sprint. | Compat rules |
keep_, keep | item, item, emptyHand, pose | Keeps your arm and item offsets during actions that would clear them. | Compat rules |
keep_, keep, keep_, keep | item, item, emptyHand, pose | The same for the left or the right hand only. In an item, item or emptyHand entry the side key wins over keep_ for that hand. In a pose it works differently: see the note under this table. | Compat rules |
keep_, keep, keep_, keep | item, item, emptyHand, pose | Keeps the offsets only on the arm that triggered the action. | Compat rules |
disable_, disable, disable_ | item, item, emptyHand | No mining clip. A swing at a block plays the attack clips instead. | Types and triggers |
disable_, disable_, disable_, disable_ | item, item | No walk on water clip with this item. | Types and triggers |
disable_, disable_, disable_ | item, item | No dry_out clip with this item. | Types and triggers |
disable_, disable_, disable_, disable_ | item, item | While you hold the item, the arm that holds it does not play the swim stroke, and the other arm swims as usual. When the item is in your main hand and its idle clip holds it with both hands (dual_), neither arm swims and the idle keeps playing. The main spelling has one m. | Types and triggers |
disable_, disable | item, item | No mace fall animation with this item. | Types and triggers |
disable_, disable, disable_, disable | item, item | No fall arm animation with this item. | Types and triggers |
A pose reads its keep flags differently from an entry. In a pose, keep_arm_tuning is used when it is written. Only when it is missing does the pose take keep_arm_tuning_l, and then keep_arm_tuning_r, and it takes them for either hand. A right-hand pose that writes only keep_arm_tuning_l therefore gets the left value. Write keep_arm_tuning in a pose, or the same value on both sides.
Physics settings
A physics value in an entry is a mode name alone, an object, or a list. A name alone, such as "physics": "FORWARD_PENDULUM", sets the mode. A list uses the first element that has a name. Write the mode in any letter case, such as FORWARD_PENDULUM or forward_pendulum. The setting keys below are camelCase, such as limitDeg and handSpace, and a snake case spelling such as limit_deg is not read here. Item physics explains each one with examples.
Keys of a physics object
| Key | Type | Default | What it does |
|---|---|---|---|
name | text | none | The mode: NONE, FULL_ or FORWARD_, in any letter case. An object with no valid name is not applied, and its settings are not applied either. |
limitDeg | number, degrees | 55 | How far the item may swing either way. It sets the up and down limits together when you write neither. |
limitDegUp | number, degrees | 55 | The limit on one side of the forward and back swing. Written alone, the down limit stays at 55, not at limitDeg. |
limit | number, degrees | 55 | The limit on the other side. |
force | number | 0.75 | How hard turning the camera kicks the item. |
speed | number | 16 | Part of the damping. A higher speed means less damping, so the item swings longer. |
cameraSens | number | 0.3 | How much each turn of the camera counts. |
gravity | number | 25 | How strongly the item is pulled back to its rest angle. |
motionSens | number | 0.2 | How much walking, jumping, landing and shield hits count. |
invert | boolean | false | Swings the other way. |
handSpace | boolean | true | true applies the swing in hand space, before the item’s own offset and rotation. false applies it after. |
enable | boolean | true | Whether the creature inside a creature bucket moves. Read only in an object that also has a valid name. |
Proxies
A proxy map moves a helper part that Punchy! draws with some held items. Each value is a pose, and only scale, the offsets and the rotations are read. Write the keys in lower case.
Keys of the proxy maps
| Root key | Keys | What it places | Page |
|---|---|---|---|
chestProxy | boat, raft, minecart | The chest in a held chest boat, chest raft or chest minecart. No hand suffix. | Compat rules |
enchant | book, book_left, book_right | Where the enchanting particles of a held enchanting table fly to. Without a suffix, both hands. | Compat rules |
paddle | boat, raft, each with _left or _right | The paddle of a held boat or raft. Without a suffix, both hands. | Compat rules |
fishing | rod, fishing_, each with _left or _right | Where the fishing line leaves the held rod. Without a suffix, both hands. On every Minecraft version the cast line starts at the tip of the rod in your hand, whether it is flat or a 3D model, so this proxy places the line only for a model part rod that has no fishing_. | Compat rules |
Custom animation entries
A customAnimation list says which clip plays at which moment. It sits in an item entry, an itemSpecific entry or emptyHand. The default_animations list at the root takes the same rules for every item. Each element is a rule: a type that names the moment, and keys that name the clip and narrow the moment. Types and triggers teaches them, and Create an animation walks through the first one.
Types
The type of a rule is read after Punchy! lowercases it and drops _, - and spaces, so use_bow, useBow and usebow are one type. mining and mining_v2 are one type too.
Values of type
type | Plays when | Clip keys it reads |
|---|---|---|
attack | You swing the held item with the attack key and do not break a block. | var_1 to var_3, critical_, name |
melee_ | Better Combat is installed, Better Combat Support is on and you swing a weapon. Only in default_: in other entries, put the combo in the entry’s better list. | attack_1 to attack_6 |
mining, mining_v2 | You hold the attack key on a block with your main hand. | name, or start, looping and end |
useItem | You right-click and the game accepts the use, you throw an item, or you press the drop key. Holding the key keeps the clip going. | name, animation, throw |
interaction | You right-click a block or an entity and the game accepts it. | animation, name, close |
fishingrod | You use a fishing rod. It casts when no hook is out and reels in when one is. | throw, pull |
eating, drinking | You hold the use key on food, or on a potion, milk or anything else with the drinking animation. | start, looping, end |
useEat, useDrink | The single clip form of eating and drinking. | name |
use_bow | The bow is drawing. | name |
use_ | You let go of a drawn bow. It plays only when a rule names it, the draw is strong enough and you have an arrow or are in creative. | name |
use_ | You hold the use key to load a crossbow. | name |
use_ | You fire a loaded crossbow. | name |
use_shield | You hold the use key with a shield. | name |
spear_ | You hold the use key with a spear. A new stage starts as the charge grows. | stage_1, stage_2, stage_3 |
use_ | You hold the use key with a trident. | name |
use_ | You let go after charging a trident for at least half a second. | name |
use_ | The same, for a trident with Loyalty. | name |
hand_in | The item in a hand has changed and the new item comes up. | name |
hand_out | The item in a hand is about to change and the old item goes away. | name |
idle | Nothing else is playing and the hand holds an item. | name |
falling | You are in the air and dropping, not in water and not flying. | name, min_blocks |
walk_ | You wade through shallow water on foot, without swimming. | start, looping, end |
inspect | You press the Inspect key with no screen open. | name |
triggerable | You press the key the rule names. | name, key, id, title |
spatial_ | Your empty hand animates in a screen of Spatial GUI. It is read from spatial. | name |
walk, walk_, walk_, walk_left, walk_right, sprint, sprint_, sprint_, sprint_, jump, fall, landing | You walk, sprint, jump, drop more than 3 blocks or land. They work only while Resource Pack Movement is on, which is disable set to false. A clip with length 0 is ignored. | name |
The names these types play when no rule gives one are listed on Types and triggers. The keyframe movement types fall back to these clip names:
Clip names for keyframe movement
| Clip name | Plays when |
|---|---|
punchy_ | Idle pose of the movement layer. |
punchy_, then punchy_ | You walk forward. |
punchy_, punchy_, punchy_ | You walk backward, left or right. |
punchy_, then punchy_ | You sprint forward. |
punchy_, punchy_ | You sprint to the side. |
punchy_ | You leave the ground. |
punchy_ | You drop more than 3 blocks. |
punchy_ | You touch the ground. |
Keys of a rule
Keys of a customAnimation rule
| Key | Type | Default | What it does |
|---|---|---|---|
type | text | none | Required. The moment, from the table above. |
name | text | the type’s built-in clip | The clip to play. For an attack it is used only when var_1 to var_3 are all empty. |
animation | text | name | The preferred single clip, ahead of name. Not used for attack combos. |
var_1, var_2, var_3 | text | none | The attack combo: one clip per swing, in order, then around again. The combo starts over after about 30 ticks without an attack. For single clip types only var_1 is used, as the last choice after animation and name. |
critical_ | text | none | The clip for a critical hit. It is checked before Better Combat and the combo. |
start, looping, end | text | the rule’s single clip (animation, then name, then var_1); looping falls back to keep_ first | The three phases of mining, eating, drinking and walk_. |
keep_ | text | none | A clip name, not a switch. It is the loop clip when looping is empty. |
throw, throw_, cast, start_cast | text | none | The cast clip of a fishingrod rule. In a useItem rule it is the clip for a thrown item. |
pull, pull_, reel, reel_in | text | none | The reel clip of a fishingrod rule. |
stage_1, stage_2, stage_3, stage1, stage2, stage3 | text | the built-in spear clips | The three charge clips of spear_. |
min_blocks, minBlocks, falling_, trigger_ | number | 0 | For falling: the lowest fall height, in blocks, at which the rule plays. The rule with the highest min_blocks that is not above the fall wins. |
items | list | every item | Only matches when the held item is one of these ids or #tags. For interaction it lists the blocks you click. A custom group name never matches here. |
blockState | object | none | For interaction: block properties that must match, such as { "open": "false" }. |
close, close_, close | text | none | For interaction: the clip that plays when you close the container screen you opened. |
interface | number, seconds | none | For interaction on a block: how long to wait before the container screen opens. Used when above 0. |
trigger_ | boolean | false | For attack with combo clips: start a clip on every click, without the limit of about 3.5 swings a second. For useItem with one clip: start it when you press the use key. |
key | text | none | For triggerable: the default key. Without it there is no entry in Controls. Letters, digits, F1 to F25, keypad names and navigation names work, as listed on Settings and controls. It is also part of the rule’s identity, so two rules of one type on one item need different keys. |
id, trigger_id, triggerId | text | name, then animation, then key | For triggerable: the stable identity of the key. It is lower-cased, and every character other than a letter from a to z, a digit, ., _ and - becomes _, so :, /, spaces and accented letters all turn into _. Rules with the same id share one Controls entry. |
title, display_, display, friendly_, friendly | text | name, then animation, then id | For triggerable: the label in Controls. |
skip_ | boolean | false | Snap into the clip without blending from the current pose. |
skip_ | boolean | false | Cut out of the clip without blending out. |
blend_, blend, rebase_, rebase | boolean | false | Blend from the pose the arm is in now. It is also on when the clip has a blend_ or rebase_ token. |
stop_ | boolean | false | End a looping clip the moment you let go of the key, instead of at the end of the loop. |
skip_, disable_, no_ | boolean | false | Skip the hand_out and hand_in swap clips after the action. |
disable_, disable_, disable_, disable_ | boolean | false | No walk on water clip while any rule in the list has this on. |
disable_, disable_, disable_ | boolean | false | No dry_out shake while any rule in the list has this on. |
disable_ | boolean | false | While you hold the item, the arm that holds it does not play the swim stroke. It counts when any rule in the item’s list has this on and its items filter matches or is empty, even if that rule is not the one playing. The other arm swims as usual. When the item is in your main hand and its idle clip holds it with both hands (dual_), neither arm swims. This is the only spelling. |
is | boolean | false | Draws a block item with the Java block model. |
custom | object | none | See Custom flags. |
variations | list | none | Clip variants that depend on the player. See Variations. |
better | list | none | Better Combat combos. Read only on a rule in default_. On item, item and emptyHand entries, put better on the entry itself, as in Entries for kinds, groups and items. |
in_water, inside_, block_, weather_, time_, biome_ | various | none | World conditions. See Conditions. |
Conditions
These keys go in a rule, and in a variation. Each one that is written must pass. A rule with no conditions always passes them. They are explained on Types and triggers and Compat rules. The same keys are read in the animation entries of a model part, where Conditions has the details.
Condition keys
| Key | Type | Default | What it does |
|---|---|---|---|
in_water | boolean | none | The player touching water must equal this. It is true when you are in water, your eyes are in water, or any of 27 points around your body is in water. |
inside_ | boolean | none | Your eyes being under water must equal this. |
block_ | text | none | One block id or #tag. Read only when blocks is empty or missing. |
block_ | list | none | Block ids or #tags. One of them must be in the search area. With no target at all, the condition passes. |
block_ | whole number | 0 | A cube around the search origin, in every direction. 0 checks one block. A negative value counts as 0. |
block_, offsetY, offsetZ | whole number | 0 | Moves the search origin from the block you stand in. |
weather_ | boolean | none | Must match rain. |
weather_ | boolean | none | Must match thunder. |
weather_ | boolean | none | true means not raining and not thundering. |
time_ | whole number | open | The start of the window on the day clock, 0 to 23999. |
time_ | whole number | open | The end of the window. When min is above max, the window runs through midnight. |
time_ | two whole numbers | none | A shorter way to write min and max. When it has two values, it replaces both. |
biome_ | text | none | One biome id or #tag. Read only when biomes is empty or missing. |
biome_ | list | none | Biome ids or #tags. One of them must be in the search area. |
biome_ | whole number | 0 | A cube around the search origin, as for blocks. |
biome_, offsetY, offsetZ | whole number | 0 | Moves the search origin. |
Custom flags
customFlags is an object inside a rule. It tunes how Punchy!‘s own motion mixes with the clip. It is explained on Types and triggers.
Keys of customFlags
| Key | Type | Default | What it does |
|---|---|---|---|
movement_, movement | whole number, 0 to 100 | 100 | How much of Punchy!‘s own walk and sprint motion stays on the active hand while the clip plays. It follows the blend in and out. |
sync_, sync | boolean | false | Keeps Punchy!‘s own arm motion in step with the clip. |
walk_, walk | whole number | none | A force value for Punchy!‘s walk and sprint motion while the clip plays. |
remaining_, remaining | whole number | none | A force value for Punchy!‘s other own motion while the clip plays. |
look_, look | number, 0 to 90 | none | The look-down pose starts when your view pitch passes this value. It applies only when look_ is set too. |
look_, look | number, 0 to 90 | none | The look-down pose ends at this value. Needs look_. |
look_, look | number | none | How far forward the arm is moved during the look-down pose. |
Variations
variations is a list inside a rule. Each variation can swap the clip when the player is in a certain state. Punchy! checks them in list order. A variation counts only when it has a name and every condition it writes passes. The variation with the highest priority wins, a tie keeps the one listed first, and its name replaces the clip names the rule would use.
Keys of a variation
| Key | Type | Default | What it does |
|---|---|---|---|
name | text | none | Required. The clip to play. |
priority | whole number | 0 | The highest priority among the variations that fit wins. |
state | text | none | One player state from the table below. |
states | list | none | Player states that must all be true. |
not_states | list | none | Player states that must all be false. |
direction | text | none | forward, backward (or back), left or right: the way you are moving, compared with the way you face. It is false while you stand still. |
health_, health_ | number | none | Your health must be strictly below or above this. |
health_ | number, 0 to 1 | none | Your health as a share of your maximum must be below this. |
food_below, food_above | whole number | none | Your food level must be strictly below or above this. |
min_ | number | none | You must have fallen at least this far. |
in_water, inside_, block_, weather_, time_, biome_ | as in Conditions | none | The same world conditions as on a rule. |
Player states for state, states and not_states
| State | True when |
|---|---|
crouching, sneaking | You are sneaking. |
walking, moving | You are moving on the ground without sprinting. |
sprinting | You are moving, sprinting and on the ground. |
idle, stationary | You are standing still on the ground. |
jumping, rising | You are in the air and going up. |
falling | You are in the air and going down. |
on_ground, grounded | You are on the ground. |
in_air, airborne | You are not on the ground. |
swimming | You are swimming. |
underwater | Your eyes are under water. |
climbing | You are on a ladder, vines or another climbable block. |
riding | You are riding something. |
flying | You are flying. |
gliding | You are gliding on elytra. |
burning | You are on fire. |
hungry | Your food level is 6 or less. |
low_life, low_health | Your health is 30 percent of your maximum or less. |
block_, under_ | A solid block is above your head. |
block_, on_block | A solid block is under your feet. |
raining | It is raining. |
thundering | It is thundering. |
day | The day clock is in the first half of the day, below 12000. |
night | The day clock is 12000 or later. |
Hyphens in a state name read as underscores, and letter case does not matter. Any other name is never true.
Clip files
A clip file is a .json file in assets/minecraft/punchy/animations/ of a resource pack. It holds the motion, the timeline tokens and the sounds. Animation reference teaches the format, and Create an animation shows how to make one in Punchy! Studio or Blockbench.
Keys of a clip file
Keys of a clip file and its clips
| Key | Goes in | Type | Default | What it does |
|---|---|---|---|---|
animations | file root | object | none | A map from clip name to clip. It is the only key read at the top of the file. |
| the clip name | key under animations | text | none | Any text. It is trimmed and case sensitive. A rule names a clip by this exact text. |
animation_ | clip | number, seconds | 0 | The clip’s length. Keyframe movement ignores a clip whose length is 0. A value that is not a number drops the clip. |
loop | clip | boolean or text | false | true, "loop" or "true" repeat the clip. "hold_ stays on the last frame while the action lasts. Any other value plays the clip once. |
bones | clip | object | none | A map from bone name to that bone’s channels. |
camera, right_arm, left_arm, itemgrip_, itemgrip_ | name in bones | object | none | The bones a clip moves. camera moves both arms and shakes the view, in V2 and legacy clips alike, while Enable Camera Animations is on. On Minecraft 1.21.11 even half a degree shows. On other versions a turn needs more than about 1.6 degrees, unless the bone also moves. The grips place the item in the hand. |
rotation | bone | keys | [0, 0, 0] | Turning, in degrees. |
position | bone | keys | [0, 0, 0] | Moving, in model units of the rig. |
scale | bone | keys | [1, 1, 1] | Size. |
[x, y, z] | a channel, or a key inside it | array of three | none | A channel written as one array is a single key at time 0. Each value is a number or a Molang expression written as text. Any other count drops the whole clip. |
"0.25": [x, y, z] | a channel | object | none | A channel written as an object has one key per time, in seconds, written as text. |
post, vector | a key written as an object | array of three | none | The key’s value. Punchy! reads post first, then vector, then pre. |
pre | a key written as an object | array of three | the post value | The key’s value when neither post nor vector is written. On a rotation key of a V2 clip, pre is the value the rotation arrives with and post the value it leaves with, and each falls back to the other when one is missing. |
lerp_mode | a key written as an object | text | linear | How the channel blends from this key to the next: linear, catmullrom, spherical_ or spherical_. The spherical modes work on rotation in a V2 clip. It is read in lower case. |
easing | a key written as an object | text | none | Used as the mode only when the key has no lerp_mode. |
query., q. | inside a key’s Molang text | expression | none | The seconds since the clip started. Molang text also understands +, -, *, /, brackets, pi, e, sin, cos and tan (in degrees), abs, sqrt, floor, ceil, round, min, max and clamp. |
timeline | clip | object | none | A map from time in seconds to tokens separated by ;. A token stays active from its time to the end of the clip. |
effects, effect, events, event | clip | text, list or object | none | Tokens that are active during the whole clip. The four names are read the same way. |
sound_ | clip | object | none | A map from time in seconds to a sound name, or to an object with the name in effect. The name is a sound file of the punchy namespace. |
Timeline tokens
A token is an exact word in a timeline string. Several tokens in one string are separated by ;. A token with extra text after it, such as a value after a colon, is a different word and never matches. Tokens that carry an item write its full id after the prefix, for example minecraft:arrow. The Goes in column says where the token is read. In Punchy! Studio, the Events lane of the Dope Sheet holds these tokens. Double-click the lane, or use Key > Insert Event…, to open the token picker. Animation reference explains each token with examples.
Video coming soon
Timeline: speed and layout
Speed, layout and rotation order
| Token | Goes in | What it does |
|---|---|---|
anim_ | timeline | Plays the clip at speed n from its time on, kept between 0.5 and 5.5. The last token at or before the current time wins. While one is set, the Animation Speed setting is ignored for the clip. Start the number with a digit: anim_ works, anim_ does not. |
use_ | timeline or effects | Reads the clip in the V2 layout. A clip without it is a legacy clip. |
rotation_, rot_xyz | timeline or effects | Reads rotation keys in the order X, Y, Z from that time on. Clips whose name contains mace, trident or crossbow already use this order. |
rotation_, rot_zyx | timeline or effects | Reads rotation keys in the order Z, Y, X. It wins over the XYZ tokens and over the name rule. |
Timeline: hands and the off hand
Hands and the off hand
| Token | Goes in | What it does |
|---|---|---|
dual_ | timeline or effects | Both arms follow the clip. Without it only the arm of the hand that started the action moves. |
dual_ | timeline or effects | Dual handed only when the off hand holds an item. |
start_, start_ | timeline | Opens the dual handed window when the off hand holds an item. In a dual handed clip, a token later than 0 also makes the clip start from this time in that case. |
stop_ | timeline | Closes the dual handed window when the off hand holds an item. A later start token opens it again. |
hide_ | timeline | Hides the off hand arm while the real off hand is empty. The later of this token and show_ decides. |
show_ | timeline | Shows the off hand arm again. |
sync_ | timeline or effects | Makes the walk and sprint arm movement follow the clip at full strength while it plays. It counts anywhere in the clip. |
Timeline: blending, arm tuning and physics
Blending, arm tuning and physics
| Token | Goes in | What it does |
|---|---|---|
blend_, rebase_ | timeline or effects | Blends into the clip from the pose the arm has now. It counts anywhere in the clip. |
keep_ | timeline | Keeps your arm tuning applied while the clip plays. |
disable_ | timeline | Turns arm tuning off while the clip plays. It wins over keep_. Equip clips and walk on water clips ignore it. |
disable_ | timeline | Sets the tuning to zero for the arm that plays the clip. The other arm is affected too only when the clip is dual handed. |
disable_, disable_ | timeline | Turns off pendulum physics on the arm and the held item while the token is active. |
Timeline: items shown and hidden
Item switching
| Token | Goes in | What it does |
|---|---|---|
left_ | timeline or effects | Shows that item in the left hand for the clip. |
right_ | timeline or effects | Shows that item in the right hand for the clip. |
hide_, hide_ | timeline | Hides the item in that hand, the real one or a switched one. The text after item_ is ignored, so hide_ does the same. The underscore after item is part of the token. |
show_, show_ | timeline | Shows the real item of that hand again. |
show_, show_ | timeline | Shows the given item in that hand. With * after the underscore, it shows the real item. |
hide_item | timeline | Hides the item in the hand opposite the one that started the clip. It needs a clip that a hand started. |
hide_ | timeline | Hides the item in the hand opposite the one that started the clip. The arm stays visible when that hand holds a real item. |
show_ | timeline | Shows the real item of that opposite hand again. An empty hand stays empty. |
Timeline: the item’s own use animation and equip
Item use animation, equip and riding
| Token | Goes in | What it does |
|---|---|---|
suppress_ | timeline | Holds the vanilla use animation of the item back from this time until a later start token. |
start_, loadstart, load_start | timeline | Lets the vanilla use animation run from this time. Clips named use_shield and use_ always hold it back. |
swap_end, swap_items, swap_item | timeline | In an equip clip, the moment the item you see changes from the old one to the new one. |
absolute_ | timeline or effects | In a clip that plays while you ride a horse, the arm follows the clip’s pose as written. A clip whose name contains shield counts too. It counts anywhere in the clip. |
Model part definitions
A definition is a .json file under assets/<namespace>/punchy/model_parts_items/definitions/, at any depth. It gives an item its own 3D model in first person. Every key below goes at the top of the definition unless the Goes in column says otherwise. Model parts shows how the pieces fit, and Model part definitions teaches the file. The geometry file a definition points to has its own keys (bones, cubes, UV faces, inflate and mirror), and The geometry file lists them.
Items and files
Keys that choose the item and name the files
| Key | Type | Default | What it does | Page |
|---|---|---|---|---|
items | list of text | none | Required unless item is written. The items the definition covers: ids, or #tags for every item in a tag. A bare id gets the minecraft namespace. An entry that is not a valid id is skipped. An empty list drops the definition. | Definitions |
item | text | none | One item id. Read only when items is missing. | Definitions |
customName | text | none | Makes this a named definition. The held stack must carry a custom name equal to this text, ignoring case and the spaces at both ends. | Variants |
name | text | none | The same as customName. Read only when the customName key is missing. | Variants |
geo | resource id | none | Required. The geometry file. It is used exactly as written, so write the whole id with the folder and the .geo.json ending. | Geometry and textures |
texture | resource id | none | Required. The main texture. A path under punchy/ gets .png added when it is missing. Any other path gets textures/ put in front, unless it already starts with textures/, and .png added. | Geometry and textures |
animations | list of resource ids | none | The item clip files to load. Write each id in full, with the . ending. A later file replaces a clip with the same name. | Item clips |
animation | resource id | none | One clip file. Read only when animations is missing. | Item clips |
model | list | none | The animation entries that choose a clip for a moment. See Animation entries. | Item clips |
Display
display places the model in your hand. Without it, Punchy! uses the vanilla first person transform of the held item. It is an object with up to four hand entries.
Keys of display and of each hand entry
| Key | Goes in | Type | Default | What it does |
|---|---|---|---|---|
firstperson_, firstperson_ | display | object | vanilla transform | The transform for that hand. Used when there is no thirdperson_ entry for the same hand. |
thirdperson_, thirdperson_ | display | object | none | If it is there, Punchy! uses it for that hand and ignores the firstperson_ entry. Model parts draw only in your own first person hands. |
rotation | a hand entry | three numbers, degrees | [0, 0, 0] | Turns the model around X, Y and Z. For the left hand, Y and Z are negated. |
translation | a hand entry | three numbers | [0, 0, 0] | Moves the model. One unit is one pixel of the model, 1/16 of a block. For the left hand, X is negated. |
scale | a hand entry | three numbers | [1, 1, 1] | Multiplies the model along each axis. |
These keys are explained on Model part definitions.
Animation entries
Each element of modelPartsAnimation is an entry. It says: at this moment, in these conditions, play this clip. Item clips teaches them, and Conditions goes through the world checks.
Values of type in a modelPartsAnimation entry
type | Punchy! asks for it when |
|---|---|
idle | Nothing else is happening. It is also the fallback when a moment has no entry or no clip. |
attack | You attack. |
mining | You mine a block. |
useItem | You use the item: draw a bow, charge a crossbow, charge a trident or use a spear. |
useDrink, useEat | You drink or eat. |
fishingrod | You cast or reel in a fishing rod. throw names the clip of the cast and pull the clip of the reel. |
falling | You fall. |
hand_in, hand_out | The item comes up into your hand, or goes away. |
inspect | You press the Inspect key. |
triggerable | You press a custom animation key. |
in_water | A candidate for idle, but only while you touch water. |
Case, underscores, hyphens and spaces are ignored in a type. When several of these start together, the higher one wins: attack, triggerable, inspect, hand_out, hand_in, mining, the cast and reel of fishingrod, useItem, then useDrink and useEat, then any other type, then idle.
Keys of a modelPartsAnimation entry
| Key | Type | Default | What it does |
|---|---|---|---|
type | text | none | Required. The moment. An entry with no type never matches. |
name, animation, var_1 | text | none | The clip to play, as named in the item clip file. The first of animation, name and var_1 that is not blank is used. For the right hand Punchy! tries <name>_ first, for the left hand <name>_, then the bare name. When no clip is found, the idle clip plays. |
throw, pull | text | none | Only in a fishingrod entry: the clip of the cast and the clip of the reel. Also read as throw_, cast, start_cast, pull_, reel and reel_in. Left out, the clip the entry names with animation, name or var_1 plays for both. |
items | list | every item of the definition | Limits the entry to stacks that match these ids or #tags. |
in_water | boolean | none | The player touching water must equal this. |
inside_ | boolean | none | The eyes being under water must equal this. When true, the entry also stays matched for 4 ticks after you leave the water. |
block_, weather_, time_, biome_ | object | none | World checks, with the same keys as in Conditions. raining stays true for 100 ticks after the rain stops. |
keep_ | text | none | The name of a clip that loops after this entry’s clip ends. The entry also stays matched for 6 ticks when its conditions flicker. |
skip_ | boolean | false | Cut into this clip with no blend. |
skip_ | boolean | false | On the entry that is playing: when another entry takes over or the clip stops, cut with no blend out. |
blend_, blend, rebase_, rebase | boolean | false | Starts the blend into this clip from the pose the model shows at that moment. |
disable_ | boolean | false | While you hold a stack that this entry’s items filter matches, Punchy! does not play the swim pose on that hand, even when this entry is not the one playing. |
disable_ | boolean | false | While this entry plays, no particle emitter of that hand emits. |
disable_, disable_ | list of text | the definition’s list | Bones that ignore pendulum physics while this entry plays. When the key is there, even as an empty list, it replaces the definition’s list. |
Item clip files
An item clip file is a Bedrock animation file at the id you list in animations. It uses the same shape as a clip file, with these differences: the keys that matter are below, every key is blended linearly, and the bones are the bones of the model’s geometry.
Keys of an item clip file
| Key | Type | Default | What it does | Page |
|---|---|---|---|---|
animations | object | none | Clips by name. Each clip is also known as namespace:. | Item clips |
animation_ | number, seconds | 0 | The clip’s length. A clip that loops needs a length above 0. | Item clips |
loop | boolean or text | false | true repeats the clip. "hold_ stops on the last pose and keeps it. | Item clips |
bones | object | none | The bones to move, by name. A name that is not a bone of the geometry is skipped. | Item clips |
rotation, position, scale | keys | rest values | The channels of a bone, written as for a clip file. Position is in model pixels. | Item clips |
timeline | object | none | Tokens at times, separated by ;: anim_, rotation_, rot_xyz, rotation_ and rot_zyx. | Item clips |
sound_ | object | none | Sound names at times, as in a clip file. | Item clips |
Glow, textures and mirroring
Keys that change how the model looks
| Key | Type | Default | What it does | Page |
|---|---|---|---|---|
bone_ | object | none | Glow settings: a level for each bone and the settings below. | Geometry and textures |
bone_ | number, 0 to 100 | 0 | The glow level of that bone, from a JSON number. 1 to 15 set how bright the overlay is, and 15 is full brightness. Above 15 the overlay stays at full brightness and the halo that blur draws grows stronger, up to 100, so the change shows only with blur. The name must match exactly, and child bones do not inherit it. | Geometry and textures |
bone_ | boolean | false | Adds a second, larger glow pass around glowing bones. | Geometry and textures |
bone_ | boolean | false | Samples the glow texture clamped to its edge instead of repeating it. | Geometry and textures |
bone_, intensity, brightness | whole number, 0 to 100 | 100 | One multiplier for every bone’s glow. The names blur, clamp, strength, intensity and brightness are reserved, so a bone with one of those names cannot glow. | Geometry and textures |
bone_ | object or list | none | Gives single bones their own texture. An object maps bone names to texture ids. A list holds elements with a texture id and a bones list, and a later element replaces an earlier one for the same bone. Texture ids are written like texture. | Geometry and textures |
texture_ | object | none | Animates the whole texture, stacked as frames from top to bottom. | Geometry and textures |
texture_ | whole number | 1 | How many frames are stacked in the PNG. At least 1. | Geometry and textures |
texture_ | whole number | 1 | Game ticks each frame lasts. At least 1. | Geometry and textures |
texture_ | whole number | 0 | The height of one frame in pixels. 0 means the geometry’s texture height. The PNG must be exactly frames times this tall, or the texture stays still. | Geometry and textures |
bone_ | object | none | A map from bone name to an object with frames, frametime and frame_, for that bone only. A value you leave out becomes 1, 1 and 0. | Geometry and textures |
bone_ | object | none | A map from bone name to a boolean, or to an object with position and rotation booleans. Only false does something: it negates the X position, and the X and Y rotation, of that bone’s keys in every item clip. | Geometry and textures |
camera_, inside_ | list of text | none | Bones, and the bones under them, whose faces that turn away from you are not drawn. Not applied to a bone that has physics. | Definitions |
state_ | object | none | A map from a state to an object of definition keys, most often a geo id. Those keys change for that state only. The states are using and fishing_, and fishing_ wins over using. | Definitions |
physics, falling, falling | boolean | false | Turns on the axolotl style feedback pose. It does something only for geometry shaped like an axolotl: a head bone, a body or body_root bone, and a legs_front or leg1 bone. | Definitions |
Dynamic textures
dynamic_bone_textures (or dynamicBoneTextures, read only when the first is missing) is one spec or a list of specs. It swaps one bone’s texture, or the whole geometry, by what the held item holds.
Keys of a dynamic spec
| Key | Type | Default | What it does | Page |
|---|---|---|---|---|
type | text | texture | texture swaps the texture of one bone. geo swaps the whole geometry. Any other value counts as texture. | Dynamic textures |
bone | text | none | The bone to retexture. Required for texture, ignored for geo. | Dynamic textures |
source | text | sulfur_ | What picks the map entry: sulfur_ (the item id of the block a sulfur cube has absorbed) or axol_ (the variant of the bucketed axolotl). Case does not matter. Any other value matches nothing, so only the fallback applies. | Dynamic textures |
map | object | empty | Maps what the source reports to a texture id, or to a geometry id for geo. The match is exact and case sensitive. | Dynamic textures |
fallback | resource id | none | Used when the map has no entry for what the source reports. | Dynamic textures |
Fishing rod keys
Two keys of a definition for minecraft:fishing_rod place the cast line and hide a line that is drawn into the model. Punchy! reads them on every Minecraft version, from the definition that draws the fishing rod in your hand.
Keys of a fishing rod definition
| Key | Type | Default | What it does | Page |
|---|---|---|---|---|
fishing_ | object | none | Where the cast line starts in first person. bone is a bone name of the geometry, and position is [x, y, z] in pixels inside that bone, as Blockbench shows them. A position that is not three numbers means no anchor. | Definitions |
hide_ | list of text | none | Bone names. Those bones and every bone under them are hidden while your hook is out and that hand holds the rod. Use it for a line drawn into the model. | Definitions |
This definition, saved as assets/mypack/punchy/model_parts_items/definitions/fishing_rod.json, starts the line at a bone named rod_tip and hides a bone named hanging_line while the hook is out. It needs a geometry file and a texture, which are below.
Geometry for the rod
The geometry has three bones: rod (the stick), rod_tip (a small cube at the top of the stick, centered on [0, 9.5, 0.85]) and hanging_line (a thin cube that hangs from the tip). rod_tip and hanging_line are children of rod. Every cube lists all six faces, so every face is drawn. Save it as assets/mypack/punchy/model_parts_items/geo/fishing_rod.geo.json.
{
"format_version": "1.12.0",
"minecraft:geometry": [
{
"description": { "identifier": "geometry.fishing_rod", "texture_width": 16, "texture_height": 16 },
"bones": [
{
"name": "rod",
"pivot": [0, 0, 0],
"cubes": [
{
"origin": [-0.5, 0, 0.35],
"size": [1, 9, 1],
"uv": {
"north": { "uv": [0, 0], "uv_size": [16, 16] },
"south": { "uv": [0, 0], "uv_size": [16, 16] },
"east": { "uv": [0, 0], "uv_size": [16, 16] },
"west": { "uv": [0, 0], "uv_size": [16, 16] },
"up": { "uv": [0, 0], "uv_size": [16, 16] },
"down": { "uv": [0, 0], "uv_size": [16, 16] }
}
}
]
},
{
"name": "rod_tip",
"parent": "rod",
"pivot": [0, 9.5, 0.85],
"cubes": [
{
"origin": [-0.5, 9, 0.35],
"size": [1, 1, 1],
"uv": {
"north": { "uv": [0, 0], "uv_size": [16, 16] },
"south": { "uv": [0, 0], "uv_size": [16, 16] },
"east": { "uv": [0, 0], "uv_size": [16, 16] },
"west": { "uv": [0, 0], "uv_size": [16, 16] },
"up": { "uv": [0, 0], "uv_size": [16, 16] },
"down": { "uv": [0, 0], "uv_size": [16, 16] }
}
}
]
},
{
"name": "hanging_line",
"parent": "rod",
"pivot": [0, 9.5, 1.85],
"cubes": [
{
"origin": [-0.25, 3, 1.6],
"size": [0.5, 6.5, 0.5],
"uv": {
"north": { "uv": [0, 0], "uv_size": [16, 16] },
"south": { "uv": [0, 0], "uv_size": [16, 16] },
"east": { "uv": [0, 0], "uv_size": [16, 16] },
"west": { "uv": [0, 0], "uv_size": [16, 16] },
"up": { "uv": [0, 0], "uv_size": [16, 16] },
"down": { "uv": [0, 0], "uv_size": [16, 16] }
}
}
]
}
]
}
]
}The texture is a 16 by 16 PNG saved as assets/mypack/punchy/model_parts_items/textures/fishing_rod.png. Fill every pixel with one brown such as #8B5A2B; any 16 by 16 picture works.
{
"items": ["minecraft:fishing_rod"],
"geo": "mypack:punchy/model_parts_items/geo/fishing_rod.geo.json",
"texture": "mypack:punchy/model_parts_items/textures/fishing_rod",
"fishing_line_anchor": { "bone": "rod_tip", "position": [0, 9.5, 0.85] },
"hide_bones_while_cast": ["hanging_line"]
}
Punchy! Studio has no fields for these two keys and keeps them as written.
Shading rules
assets/<namespace>/punchy/model_parts_items/shading.json sets, by item or texture, how a model part item is lit and whether the particles drawn while it is held blend additively. Punchy! reads this file from every active pack, in any namespace, lowest pack first. For each field the last matching rule wins, so a higher pack can undo a lower one. Geometry and textures teaches glow, and Particles the particles.
The file is an object with a rules list. Each rule names an item, a texture or both, and sets any of the fields below. With both, both must match. A field you leave out is not changed by that rule.
Keys of a shading rule
| Key | Type | Default | What it does |
|---|---|---|---|
item | text | none | The item the rule is for: a lower case id. minecraft: may be left out. |
texture | text | none | The texture the rule is for, written as in a definition; textures/ and .png may be left out. For fullbright and shading it is the model part’s texture, for additive the particle’s. |
fullbright | boolean | false | true draws a model part item without the light map, so it stays bright in the dark. It changes only items a pack draws as model parts. |
shading | boolean | true | false lights every face of a model part item evenly, without the game’s directional shading. It changes only items a pack draws as model parts. |
additive | boolean | none | true makes every particle drawn while that item is held blend additively, and false stops it. It decides over a particle’s own additive key. |
depth_test | boolean | none | For the additive glows drawn while that item is held, whether they are additive by this rule, another rule or their own additive key. true keeps the depth test, so whatever is in front of them hides them, and false drops it. A rule can set it without additive. It changes nothing for particles that are not additive. Left out, a glow pinned with lock_ is drawn whole and other additive glows keep the depth test. |
A value is true or false. The text true and false, yes and no, on and off, and 1 and 0 are read too. This file lights a lava bucket in the dark, lights a water bucket evenly, and gives a diamond sword an additive halo:
{
"rules": [
{ "item": "minecraft:lava_bucket", "fullbright": true },
{ "item": "minecraft:water_bucket", "shading": false },
{ "item": "minecraft:diamond_sword", "additive": true }
]
}
Bone physics keys
bone_physics (or bonePhysics, read only when the first is missing) goes in a definition, or in an itemSpecific entry of a compat file. It is an object from bone names to specs, or a list of such objects. Specs for one bone merge. A spec written as just true turns on creature feedback and slime squash for that bone, with no pendulum. A spec is kept only when it has creature feedback, slime feedback or a pendulum mode other than none. A bone with no spec of its own takes the spec of its nearest parent. The key disable_physics_bones (also disable_pendulum_bones, read only when the first is missing) goes at the top of a definition, not inside a spec. It is a list of bone names that lose the item’s physics motion, together with the bones under them. Item physics explains each key with examples.
Keys of a bone physics spec
| Key | Type | Default | What it does |
|---|---|---|---|
pendulum_, pendulum, pendulum, physics_ | text or boolean | none | The mode. full, pendulum_ and full_ mean FULL_. forward, foward, pendulum_, pendulum_, forward_ and foward_ mean FORWARD_. true means full and false means none. Letter case does not matter, and hyphens and spaces count as underscores. The first of the four keys that is not none wins. |
limit_deg, limitDeg, pendulum_, pendulum | number, degrees | 55 | Sets the up and down limits together. |
limit_, limitDegUp, pendulum_, pendulum | number, degrees | 55 | The upper limit. |
limit_, limit, pendulum_, pendulum | number, degrees | 55 | The lower limit. |
force, pendulum_, pendulum | number | 0.75 | How hard turning the camera kicks the bone. |
speed, pendulum_, pendulum | number | 16 | Part of the damping. A higher speed swings longer. |
camera_, cameraSens, pendulum_, pendulum | number | 0.3 | How much each turn of the camera counts. |
gravity, pendulum_, pendulum | number | 25 | How strongly the bone is pulled back to rest. |
motion_, motionSens, pendulum_, pendulum | number | 0.2 | How much walking and landing count. |
invert, pendulum_, pendulum | boolean | false | Swings the other way. |
enable, creature, puffer | boolean | false | Creature style feedback on this bone: it tilts and shifts as you walk, jump, fall and land. |
enable, slime, slimeBlock | boolean | false | Slime squash on this bone. |
impact, impact_, impact, impact_, landing, landing_, landing, landing_ | number, 0 to 100 | 100 | Scales the tilt on the side it leans while you fall or tilt the camera down. 100 means no change, and a bigger value counts as 100. |
fall, fall_, fall, fall_, upward, upward_, upward, upward_ | number, 0 to 100 | 100 | Scales the tilt on the other side, which is the punch of a landing and the lean when you tilt the camera up. |
impact, impact_, landing, landing_, impact, impact_, landing, landing_ | number, 0 to 100 | 100 | Scales the vertical and depth (Y and Z) shift during the lean of impact. |
fall, fall_, upward, upward_, fall, fall_, upward, upward_ | number, 0 to 100 | 100 | Scales the same shift during the lean of fall. |
slime, slime_, impact, impact_, slime, slime_ | number, 0 to 100 | 100 | Scales the slime squash: the squash at take-off, while you rise and at landing. |
slime, slime_, fall, fall_, slimeFall, slime_fall | number, 0 to 100 | 100 | Scales the slime stretch while falling. |
Particle emitters
An emitter spawns particles from a bone of a model part, or from an item. It is written as a JSON object, as a script string such as type=minecraft:flame,bone=tip,rate=4 (with or without particle(...) around it), or as a bare particle id. Every key below works in all three forms, with the exceptions noted. Particles explains each key with examples and recipes.
Where emitters are written
| Key | Goes in | What it does |
|---|---|---|
particle, particles, particle_, particle_, particle | the root of a definition | One emitter or a list. The five keys are read in this order and the lists are joined. |
particle_, particle, particle, particles, particle_, particle, particle_, particle | item and item entries of a compat file | The same emitters for the items an entry covers. They are read in this order and joined. Not read in emptyHand. |
Where an emitter starts
Type, bone and place
| Key | Type | Default | What it does |
|---|---|---|---|
type | particle id | minecraft: | Names the particle. Punchy! draws its own picture for it, and type picks that picture. Any id is fine, so you can make one up for your own particle. |
enabled | boolean | true | Object form only. false switches the emitter off. |
bone | text | none | The bone the particle starts at: the exact name, then the name ignoring case. With no match the particle starts at your hand. |
target, emit_, target_, emit_ | text | bone | Where the particle starts. bone starts it at the bone. world_ (also world_face, world_, target_) starts it on a face of the mined block. A compat emitter on an item without a model part can also use item_ (the middle of the item) and block_face. |
offset | vector | 0:0:0 | Moves the start from the bone, in blocks, in the space of offset_. |
spread | vector | 0:0:0 | A random scatter of the start, up to this far either way on each axis. |
velocity | vector | 0:0:0 | The starting push, in the space of velocity_. It is scaled by t and ease like count. |
A vector is [x, y, z] in an object and x:y:z in a script.
How many and how often
Count, timing and chance
| Key | Type | Default | What it does |
|---|---|---|---|
count, burst | whole number | 1 | Particles per release, 0 to 120, after t and ease scale it. |
chance | number, 0 to 1 | 1 | The chance that a release spawns anything. It is rolled once per release. |
rate, rate_, pps | number | 0 | Releases per second for a steady emitter, 0 to 120. At most 24 releases per frame. |
emit_, emit_, interval_, spawn_ | seconds | 0 | Seconds between releases for a steady emitter, 0 to 60. It wins over rate when above 0. |
emit_for, duration | seconds | 0 | The emitter stops for good this many seconds after it started, 0 to 30. 0 means no limit. |
t | number, 0 to 1 | 1 | A share put through ease and multiplied into count and velocity. 0 spawns nothing. |
ease | text | linear | linear, ease_, ease_ or ease_. Shapes the effect of t, and how size and alpha change over a particle’s life. Any other value plays as linear. |
An emitter with no triggers, no rate and no emit_interval releases once per game tick.
Triggers
A pulse trigger is an event, and the emitter releases once for each. A steady trigger is a condition, and the emitter releases on its clock while it is true. By default an emitter needs all of its triggers at once.
When an emitter fires
| Key | Type | Default | What it does |
|---|---|---|---|
trigger_, jump | boolean | false | Pulse. A burst at takeoff. |
trigger_, landing | boolean | false | Pulse. A burst on landing. |
trigger_, attacking, attack | boolean | false | Pulse. A burst for each swing or attack of this hand. |
trigger_, trigger_, use_item, useitem | boolean | false | Pulse. A burst each time this hand uses the item. |
trigger_, mining | boolean | false | Pulse and steady. A burst for each mining event, and the steady clock runs while you mine. Main hand only. |
trigger_, walking | boolean | false | Steady. You are on the ground, moving, not sprinting and not swimming. |
trigger_, sprinting | boolean | false | Steady. You are sprinting and moving. |
trigger_, swimming | boolean | false | Steady. You are swimming or in water. |
trigger_, falling | boolean | false | Steady. You are in the air and dropping. |
trigger_, falling_, min_, min_blocks | number, 0 to 512 | 0 | The shortest fall, in blocks, before falling counts. |
on_, trigger_, animation_ | text | none | The item clip to watch, matched ignoring case. A first person arm clip of that name, or of that name with _right or _left after it, counts too. It needs a timecode to take effect. |
on_, trigger_, animation_, timecode | seconds | unset | Pulse. The time in that clip at which one burst is released. Use a time above 0. |
on_, trigger_ | text | none | Name and time in one value, name@seconds. In an object it can also be { "name": "clip", "timecode": 1.0 }. |
trigger_, biome_, biomes, trigger_, biome | list | none | Steady. Biome ids or #tags, joined with a bar or a semicolon. True when the biome at your feet is in the list. |
trigger_, trigger_, triggers_, triggers_ | text | all | any or or releases when one trigger is true. Any other value needs all of them. |
triggers | object | none | Object form. The trigger flags as keys: jump, landing, walking, sprinting, swimming, attacking, mining, falling (a flag, or an object with min_blocks) and biome. Write use_item next to it. In a compat file it can also be a list of trigger names, which fires on any one, or one name. |
Look
Size, color and life
| Key | Type | Default | What it does |
|---|---|---|---|
life, lifetime | seconds | 1.1 | How long a particle lives, 0.05 to 60. |
size | number | 0.028 | Half the width of the square at the start, 0.001 to 2. |
size_end | number | 0.006 | Half the width at the end of life, 0 to 2. |
alpha | number | 0.95 | Opacity at the start, 0 to 1. A number above 1 is read as 0 to 255. |
alpha_end | number | 0 | Opacity at the end of life. Same range as alpha. |
drag | number | 0.93 | The share of speed kept each tick, 0 to 1.2. |
gravity | number | 0 | Added to the vertical speed over time, -2 to 2. |
tint, color, rgb | vector | white | Red, green and blue, each 0 to 1, or each 0 to 255 when any is above 1. Types with falling_, landing_, dripping_ or dripstone_ in the name start orange. |
texture | resource id | the type’s picture | The picture to draw. A name ending in _0 plays as an animation of numbered frames at 12 frames a second, up to 64 frames. |
Light and glow
In an object, write the short glow names strength, blur and clamp. The long names emissive_strength, emissive_blur, emissive_clamp and their emission_ spellings are read in script strings only.
Light and glow
| Key | Type | Default | What it does |
|---|---|---|---|
additive | boolean | false | Makes the particle’s glow add light, so the dark edges of a glow picture no longer darken what is behind it. In a script string write additive=true; true, 1 and yes turn it on, and false, 0 and no turn it off. A shading rule for the held item decides over this key. An additive glow locked in the model (lock_) is drawn whole over the item, not cut off where the item is in front of it. Other additive particles keep the depth test, so whatever is in front of them hides them. |
fullbright, full_ | boolean | true | Full light and a glow layer. false for types with leaf or leaves in the name unless you write it. Needs Enable Model Parts Glow. |
full_, fulldaylight, day_, daylight_ | boolean | false | Full light only in the overworld by day. Needs Enable Model Parts Glow. |
bright_, blur_, dark_, bright_, bright_, night_, full_, night_ | boolean | false | Fades in and glows as the world gets dark. Turns fullbright off unless you write it. Shows only while Enable Blur Glow At Dark is on. |
glow_ | boolean | false | Hides the particle whenever Enable Blur Glow At Dark is off. |
light_, light_pct, light, brightness_ | number, 0 to 100 | the world’s light | Mixes the world’s light toward full light. Below 100 the glow layer is not drawn. |
strength, emissive, emissive_, emission_ | whole number, 0 to 100 | 100 | The glow layer’s strength. 0 for types with leaf or leaves in the name unless you write it. |
blur, emissive_, emission_ | boolean | false | Adds a soft halo. |
clamp, emissive_, emission_ | boolean | true | Clamps the glow layer’s picture at the edges. |
An additive halo that stays in the model looks like this in a compat file:
{
"itemSpecific": {
"minecraft:golden_sword": {
"particle_emitters": [
{
"type": "minecraft:end_rod",
"texture": "mypack:particle/halo",
"target": "item_center",
"size": 0.9,
"alpha": 0.9,
"lock_in_model": true,
"fullbright": true,
"additive": true
}
]
}
}
}
The halo texture is yours to draw: a PNG with a soft bright dot in the middle that fades to black at the edges, saved as assets/mypack/textures/particle/halo.png. A 32 by 32 pixel picture is a good start. Particles says where Punchy! looks for a particle picture.
Punchy! Studio has no field for additive and keeps the key as written.
Space and motion
Space, orbit and pinning
| Key | Type | Default | What it does |
|---|---|---|---|
offset_, space_ | text | bone | The space offset is read in: bone, world, camera, block or block_face. |
velocity_, space_, vel_space | text | world | The space velocity is read in. The same values. |
ignore_, ignore_, emit_, no_ | boolean | true | The bone’s turning is ignored when placing the start, so an offset stays put while the bone sways. |
motion, movement, motion_ | text | linear | linear (also default, drag) or orbit (also orbital, circle). |
motion_, orbit_ | text | bone | The space the orbit axis and center are read in. |
orbit_, radius | number | 0 | The orbit’s radius in blocks, 0 to 4. |
orbit_, angular_ | number | 0 | Turns per second, -20 to 20. Negative turns the other way. |
orbit_axis, axis | vector | 0:1:0 | The axis the particle circles. |
orbit_, phase | number, degrees | 0 | The starting angle. The particles of one release are spread evenly from it. |
orbit_, center_, motion_ | vector | 0:0:0 | Moves the orbit’s center, in motion_. |
lock_, lock_model, locked_, pin_, pinned_ | boolean | false | Pins the particle with no motion and no end. A new release replaces the old one. In a model part definition the particle is placed at its bone, which must exist. In a compat emitter on an item without a model part, the particle pins to the middle of the item, with "target": "item_ or with target left out. |
synthetic_, fake_, pseudo_ | boolean | true | Keeps particles that still follow the model in place while the camera turns. |
world_, world_, world_, release_ | boolean | true | Draws a particle’s world copy behind the copy that follows the model. Off for pinned particles. |
world_, world_, behind_, release_ | number, 0 to 0.05 | 0.0015 | The depth push for that world copy. |
The mined block
Block faces and filters
| Key | Type | Default | What it does |
|---|---|---|---|
face, block_face, emit_face, mining_ | text | hit | The face for a block face emitter: hit (also impact, clicked), random, opposite (also back, reverse), up, down, north, south, west or east. |
face_, face_, surface, surface_, surface_ | text | 0:0:1:1 | Where on the face: hit, impact or exact for the hit point, or four numbers u:v:u:v from 0 to 1. |
trigger_, trigger_, block, blocks, mining_, mining_ | list | none | Block ids or #tags, joined with a bar or a semicolon. The mined block must be one of them. |
trigger_, block_, mining_ | list | none | Required states as name:value or name=value, joined with a bar or a semicolon. Names and values ignore case. |
Enchantment variants
enchantment_variants (or enchantmentVariants) goes in an itemSpecific entry of a compat file. Each variant adds particle emitters while the held item has certain enchantments. Nothing else about the item changes. Variants explains them.
Keys of an enchantment variant
| Key | Type | Default | What it does |
|---|---|---|---|
enchantments | list | none | Required, and it must be a JSON list. Each element is an enchantment id as text, which needs level 1 or more, or an object with an id. A variant with no valid element is dropped. |
min_level, minLevel | whole number | 1 | In an object element: the lowest level that counts. A minimum of 0 matches even when the enchantment is absent. |
max_level, maxLevel | whole number | none | In an object element: the highest level that counts. A negative value means no maximum. |
match | text | all | any, in any letter case, applies the variant when one element matches. Any other value needs every element. |
priority | whole number | 0 | Matching variants apply in ascending priority. Equal priorities keep the order of the file. |
particle_, particle, particle, particles, particle_, particle, particle_, particle | emitters | none | The emitters this variant adds. A variant with none is dropped. |
A model part definition can carry an enchantment_variants list of its own, with the same enchantments, match and priority keys. There the other keys of each matching variant change the definition itself, in ascending priority: particle lists are added, bone_emission, bone_textures, bone_texture_anim, bone_physics and display merge key by key, and any other key, such as texture, replaces the definition’s. Punchy! 3.0 applies this list only on Minecraft 1.21.11. On other versions it is read and does nothing.
Commands and keys
These are the commands and keys Punchy! adds. A key can be rebound in Options, then Controls, then Key Binds. A pack can also add triggerable keys, which show up in Controls.
Commands and keys
| Command or key | What it does | Page |
|---|---|---|
/ | Turns debug position mode on or off. Turning it on also switches Enable Punchy on. It starts off every time the game launches. | Tuning editor and debug |
/ | Moves the first person arms by three numbers, each in sixteenths of a block. It acts only while debug position is on. | Tuning editor and debug |
/ | Turns the first person arms by three numbers, in degrees. It acts only while debug position is on. | Tuning editor and debug |
| Open Punchy Menu, F8 | Opens the Punchy menu, or closes it when it is open. With Punchy! Moves installed, F7 opens the camera settings of Punchy! Moves on their own screen, and with Punchy! Studio installed, F6 opens the editor. While the menu is open, the Studio key jumps to the Punchy Studio tab, whichever key you have bound to it. | Settings and controls |
| Inspect, I | Plays the inspect clip of the item in your main hand, or in your off hand when the main hand has none. It works only while no screen is open. | Settings and controls |
Things that drop a whole file
Punchy! checks each file in one go. These mistakes drop a file, or part of it, usually without a message. Punchy! Studio’s lint and Clip > Check for Problems find most of them before you export.
What drops a file or a rule
| File | What drops it |
|---|---|
| Compat file | The whole file is skipped, with no message, for: a comma before a closing brace; a key written twice inside item, item, armMesh or a proxy map; a value of the wrong type, such as an object where a number belongs, text where a list belongs, a physics object inside a pose, or a decimal where a whole number belongs; text after the closing brace; a root that is not an object. |
| Compat file or profile | Only that key or entry is ignored, and the rest of the file still loads, for: a lower case kind key such as sword; a key that is not a kind, a group, a pattern or related:; an item key that is not a valid lower case id; a misspelled key; a custom group name inside a rule’s items, which never matches. |
| Compat file or profile | Nothing is dropped for a pose with no scale, and that is the trap: the file loads, and the pose draws at size 0, so the item or arm vanishes. |
| Clip file | All clips in the file are lost, with a warning in logs/, when the file is not valid JSON or its top level is not an object. |
| Clip file | One clip is dropped, with a warning, when a key does not have exactly three values, an expression cannot be parsed, a time key inside a bone channel is not a number, bones, a bone or timeline is not an object, or animation_ is not a number. |
| Model part definition | The definition is dropped, with no message, when its root is not an object, it has no item, no geo or no texture, or items, item, geo, texture, animations, display, customName, model or one of its entries has a value of the wrong type. A wrong type for the whole of bone_, bone_, texture_ or bone_ only ignores that key. A value inside one of them that cannot be read as the expected type, such as texture_ set to true or bone_ set to text that is not a number, still drops the definition. |
| Shading file | No rule is read, with no message, when the file is not valid JSON. |
| Item clip file | The file stops at the clip that has a key with fewer than three numbers, or a key time that is not a number. The clips before it load, and the clips after it do not. |
Why a flag has no effect
- The name is misspelled. Punchy! ignores a key it does not know and says nothing. Compare the spelling and the letter case with the tables above.
- The flag is in the wrong place. Check the Goes in column. A key in the wrong container is not read.
- Something that wins sets the same field. See Which setting wins. An active tuning profile and a pack higher in the list are the usual ones.
- A setting is off. Check Settings that switch features.
- You did not reload. Press F3+T after every change to a pack.
- The file was dropped. Check the JSON against Things that drop a whole file.
- The key needs another mod. Better Combat and Spatial GUI keys act only when those mods are installed.
Related pages
- Compat rules: the files that tune items and attach clips.
- Animation types and triggers: which type plays when.
- Animation reference: the clip file format and every timeline token.
- Create an animation: make a clip and put it in a pack.
- Tuning editor and debug: the Hand Editor and its profiles.
- Settings and controls: the menu behind the settings file.
- Mix the packs: choose between packs that set the same thing.
- Model parts: the whole system, then its definitions, item clips, particles, conditions, dynamic textures and variants.
- Item physics: pendulum modes and settings.
- Punchy! Studio: the editor that writes these files.
- Troubleshooting and FAQ when a pack does not load.
Last checked against the mod on 29 October 2026.