Privacy
Language: Türkçe

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.

This page has not been translated into Turkish 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.

  1. In your game folder, create the folder resourcepacks/Flag Demo.

  2. 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
      }
    }
  3. Make the folders assets/minecraft/punchy/animations and assets/minecraft/punchy/compat inside Flag Demo.

  4. Save the clip file below as assets/minecraft/punchy/animations/flag_demo.animation.json.

  5. Save the rule file below as assets/minecraft/punchy/compat/flag_demo.json.

  6. 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.

  7. Join a world, hold any sword and switch to first person. Swing twice: the swings alternate between flag_swing_1 and flag_swing_2. Press I and flag_inspect plays.

  8. 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_v2 picks the V2 layout. anim_speed_1 plays the clip at the speed you drew it, and anim_speed_1.5 plays the second swing a half faster. blend_from_current_origin starts the blend from where the arm is now. keep_arm_tuning keeps your Hand Editor offsets during the swing. sync_walk_arms lets the walk arm motion follow the clip. dual_handed makes the inspect clip move both arms, and hide_offhand_if_empty and show_offhand_if_empty hide an empty off hand for most of it.
  • In the rule file. disable_sprint_lateral_tilt stops the sideways tilt while you sprint. disable_mining_animation makes a sword swing at a block play the attack clips. physics sets the pendulum. var_1 and var_2 are the combo, and critical_hit is the clip for a critical hit. skip_blend_out cuts out of the clip without a blend out. movement_influence keeps 40 percent of Punchy!‘s own walk motion on the arm.
Punchy! Studio's Bindings workspace writes the rule keys for you. The Effective list shows which rule Punchy! would use for the held item.

Video coming soon

Two swings and an inspect.

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 tooltip names the key a field writes.

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

WhenWhat winsPage
Two packs have a clip with the same nameThe 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 fieldThe 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 profileThey load in this order, and the later one wins for what it sets: compat files, then config/punchy/punchy_tuning.json (only when no profile is active), then your Mix Packs choices, then the active tuning profile.Compat rules
Several rules reach one itemFrom weakest to strongest: Punchy!‘s own values and the global poses, the kind group such as SWORD, a custom group, the itemSpecific entry for the item id, and an itemSpecific entry whose renamed matches the stack. A pattern entry works as an itemSpecific entry for each item it matches, longest pattern first, and is skipped for an item that has its own itemSpecific entry for the plain id.Compat rules
An item’s own customAnimation list and its group’s listThe item’s list replaces the group’s list whole, even when it is empty. default_animations then fill the types the chosen list lacks, matched by type plus key.Compat rules
Several entries of one type could playThe 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 fitThe highest priority. A tie keeps the one listed first.Variations
var_1 to var_3 and name on an attackvar_1 to var_3, one per swing, in order. name is used only when all three are empty. critical_hit is checked before the combo.Types and triggers
animation, name and var_1 on a single clip ruleanimation, then name, then var_1.Types and triggers
lerp_mode and easing on one keylerp_mode.Animation reference
rotation_zyx and rotation_xyz in one cliprotation_zyx. Both beat the rule that gives clips named mace, trident or crossbow the XYZ order.Animation reference
anim_speed_<n> and the Animation Speed settingThe token, from its time on. The last token at or before the current time wins.Animation reference
keep_arm_tuning and disable_arm_tuningdisable_arm_tuning.Animation reference
keep_arm_tuning and keep_arm_tuning_l or keep_arm_tuning_rThe side key wins for that hand.Compat rules
hide_offhand_if_empty and show_offhand_if_empty, or an off hand window start and stopThe later one by time.Animation reference
blend_from_current_origin as a token and as a rule keyEither one turns it on.Types and triggers
A triggerable key in a pack and the key the player chose in ControlsThe player’s key.Settings and controls
A pose and its entry both give a physics modeThe pose’s mode for that hand. A pose with none takes the entry’s.Item physics
Two definitions cover one itemDefinitions 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_physics and bonePhysics, disable_physics_bones and disable_pendulum_bones, camera_transparent_bones and inside_visible_bones, dynamic_bone_textures and dynamicBoneTexturesThe first key of each pair. The second is read only when the first is missing.Definitions
thirdperson_righthand and firstperson_righthand (and the left hand pair)The thirdperson_ entry for that hand.Definitions
Several animation entries fit one moment in a definitionThe highest score: inside_water 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_physics_bones and the definition’s listThe entry’s list replaces the definition’s while the entry plays, even when it is empty.Item physics
A bone texture for a boneThe exact bone name, then the name ignoring case, then the parent bones, then the main texture.Geometry and textures
Two physics specs for one boneThey merge. A percent that is not 100 wins, a mode other than none wins, and later settings win.Item physics
emit_interval and rate on one emitteremit_interval, when it is above 0.Particles
Emitters in a definition and in a compat rule for the same itemBoth 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 keyThe rule.Shading rules
Two shading.json rules match one itemFor 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 variantsThey 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

KeyMenu rowDefaultWhat it doesPage
enableModEnable Punchy, in the left column of every tabtrueThe master switch. When it is false the game draws your hands the vanilla way and no Punchy! clip plays.Settings and controls
animationSpeedAnimation Speed, General tab5.5The 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_speed_<n> 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
enableCameraAnimationsEnable Camera Animations, General tabtrueLets 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
disableNewKeyframeMovesResource Pack Movement, Movement tabtrueWhile 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
enableParticlesEnable Particle System, Effects tabtrueThe master switch for particle emitters. When it is false nothing is emitted.Particles
enableModelPartsGlowEnable Model Parts Glow, Effects tabtrueThe glow and full brightness of particles that glow. Model part items keep their own bone_emission glow. When it is false the particles still appear.Particles
enableBlurGlowAtDarkEnable Blur Glow At Dark, Effects tabtrueShows or hides the particles that use bright_at_dark or glow_target_menu.Particles
disableNativeItemPhysicsEnable Item Physics, Items & World tabfalseWhen 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
disableResourcePackModelPartsResource Pack Model Parts, Items & World tabfalseWhen 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

KeyTypeDefaultWhat it does
animationPackSelectionsobject, 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:empty_hand, or specific: and the item id, such as specific:minecraft:bow. The value is a pack option. Values are read in lower case, and empty ones are dropped.
animationPackTypeSelectionsobject, 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.
mixSpecificForceOverrideobject, text to boolean{}For the Specific items rows, whose ids start with specific:, such as specific:minecraft:bow. true makes the row use its own stored choice. Only true values are kept.

Pack options a Mix value can have

ValueWhat it means
punchy_defaultFollow pack order for this row. The ids vanilla and mod_resources, and an empty value, mean the same.
pack:punchy:punchyThe 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_pack_a.zip is pack:file/sword_pack_a.zip. The menu shows the name without file/ and .zip, with spaces for underscores and hyphens and each word capitalized, so sword_pack_a.zip 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

KeyTypeDefaultWhat it doesPage
itemobjectnoneEntries 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
itemSpecificobjectnoneEntries 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
customGroups, custom_groupslistnoneNamed 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:stick.Compat rules
globalItemside setnoneOne pose per hand for every held item.Compat rules
globalArmside setnoneOne pose per hand for every arm.Compat rules
armMeshobjectnoneMoves Punchy!‘s arm mesh, not the item. Only the key global is read, and it holds a side set.Compat rules
emptyHandentrynonePoses, physics, flags and clips for an empty hand.Compat rules
spatialGuiCompat, spatial_gui_compatentrynoneTakes the same keys as emptyHand. Only Punchy!‘s Spatial GUI support reads it.Compat rules
default_animations, defaultAnimationslistnoneClip rules for every item. They fill the types an item’s own list leaves out. A rule of type melee_combo, or one with a betterCombat list, goes to the Better Combat defaults.Compat rules
chestProxy, enchantParticleProxy, paddleProxy, fishingLineProxyobjectnoneMove 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

KeyTypeDefaultWhat it doesPage
scalenumbernoneThe 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, offZnumber0Moves the item or arm.Compat rules
rotX, rotY, rotZnumber, degrees0Turns the item or arm.Compat rules
pivotX, pivotY, pivotZnumber0The point an item turns around. Items only. The arm, the arm mesh and the proxies ignore it.Compat rules
physicstextnoneThe pendulum mode for this hand: NONE, FULL_PENDULUM or FORWARD_PENDULUM, in any letter case. An unknown name counts as NONE. It is text only: an object here drops the whole file.Item physics
disable_sprint_lateral_tilt, keep_arm_tuning, keep_trigger_arm_tuning, keep_arm_tuning_l, keep_arm_tuning_rbooleannoneThe flags in Flags that tune or switch off a moment, set for this hand only. In a pose keep_arm_tuning 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

KeyGoes inTypeDefaultWhat it doesPage
transformsitem, itemSpecific, emptyHandside setnoneWhere the held item sits, one pose per hand.Compat rules
right, leftitem entries keyed by a kind or a custom groupposenoneA shorter way to write transforms.right and transforms.left. Used only when transforms is missing. Not read in itemSpecific entries or pattern entries.Compat rules
armTransformsitem, itemSpecific, emptyHandside setnoneWhere the arm sits, one pose per hand.Compat rules
physicsitem, itemSpecific, emptyHandname, object or listnoneThe pendulum of the held item. See Physics settings.Item physics
kinditemSpecific, pattern entries of itemtext, capitalsthe item’s own kindSets the item’s kind. In itemSpecific 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
armKinditemSpecific, pattern entries of itemtext, capitalsthe entry’s kind, or AXEThe kind of arm model to use with armTransforms. Read only when armTransforms is present. Without it the arm pose uses kind when that is also an arm kind, and AXE otherwise.Compat rules
pattern_matching, patternMatchingitemtextnoneMakes 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 itemSpecific entry for the plain item id beats a pattern.Compat rules
related:<text>key of itemnonenoneA key that starts with related: works as pattern_matching with the text after the colon.Compat rules
renameditemSpecifictextnoneApplies the entry only to stacks whose custom name equals this text, ignoring case and the spaces at both ends.Compat rules
customModelData, custom_model_data, custommodeldataitemSpecificwhole numbernoneApplies the entry only to stacks with this custom model data number.Compat rules
customAnimationitem, itemSpecific, emptyHandlist of rulesnoneThe clip rules. See Custom animation entries.Types and triggers
customItemAnimationsitem, itemSpecific, emptyHandlist of rulesnoneA second list of clip rules for the item. For one item, its own customItemAnimations list is checked first, then its own customAnimation list, then the group’s two lists.Compat rules
betterCombatitem, itemSpecific, emptyHandlistnoneBetter Combat combos. Each element has a type of melee_combo (any spelling) and attack_1 to attack_6 clip names. Needs Better Combat.Types and triggers
particle_emitters, particleEmitters, particle, particles, particle_effects, particleEffects, particle_emission, particleEmissionitem, itemSpecificemittersnoneParticle emitters for these items. They are read in this order and joined. Not read in emptyHand.Particles
bone_physics, bonePhysicsitemSpecificobject or listnoneBone physics for the model part of this item. See Bone physics keys.Item physics
enchantment_variants, enchantmentVariantsitemSpecificlistnoneParticle 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

FlagGoes inWhat it doesPage
disable_sprint_lateral_tilt, disableSprintLateralTiltitem, itemSpecific, emptyHand, poseStops the sideways tilt of the item and arm while you sprint.Compat rules
keep_arm_tuning, keepArmTuningitem, itemSpecific, emptyHand, poseKeeps your arm and item offsets during actions that would clear them.Compat rules
keep_arm_tuning_l, keepArmTuningL, keep_arm_tuning_r, keepArmTuningRitem, itemSpecific, emptyHand, poseThe same for the left or the right hand only. In an item, itemSpecific or emptyHand entry the side key wins over keep_arm_tuning for that hand. In a pose it works differently: see the note under this table.Compat rules
keep_trigger_arm_tuning, keepTriggerArmTuning, keep_main_arm_tuning, keepMainArmTuningitem, itemSpecific, emptyHand, poseKeeps the offsets only on the arm that triggered the action.Compat rules
disable_mining_animation, disableMiningAnimation, disable_miningitem, itemSpecific, emptyHandNo mining clip. A swing at a block plays the attack clips instead.Types and triggers
disable_walk_on_water, disable_walkonwater, disable_walk_on_water_v2, disable_walk_on_water_animationitem, itemSpecificNo walk on water clip with this item.Types and triggers
disable_dry_out, disable_dryout, disable_dryout_animationitem, itemSpecificNo dry_out clip with this item.Types and triggers
disable_swiming, disable_swimming, disable_swim, disable_swim_animationitem, itemSpecificWhile 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_handed), neither arm swims and the idle keeps playing. The main spelling has one m.Types and triggers
disable_mace_fall_animation, disableMaceFallAnimationitem, itemSpecificNo mace fall animation with this item.Types and triggers
disable_fall_arm_animation, disableFallArmAnimation, disable_fall_animation, disableFallAnimationitem, itemSpecificNo 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

KeyTypeDefaultWhat it does
nametextnoneThe mode: NONE, FULL_PENDULUM or FORWARD_PENDULUM, in any letter case. An object with no valid name is not applied, and its settings are not applied either.
limitDegnumber, degrees55How far the item may swing either way. It sets the up and down limits together when you write neither.
limitDegUpnumber, degrees55The limit on one side of the forward and back swing. Written alone, the down limit stays at 55, not at limitDeg.
limitDegDownnumber, degrees55The limit on the other side.
forcenumber0.75How hard turning the camera kicks the item.
speednumber16Part of the damping. A higher speed means less damping, so the item swings longer.
cameraSensnumber0.3How much each turn of the camera counts.
gravitynumber25How strongly the item is pulled back to its rest angle.
motionSensnumber0.2How much walking, jumping, landing and shield hits count.
invertbooleanfalseSwings the other way.
handSpacebooleantruetrue applies the swing in hand space, before the item’s own offset and rotation. false applies it after.
enableCreaturePhysicsbooleantrueWhether 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 keyKeysWhat it placesPage
chestProxyboat, raft, minecartThe chest in a held chest boat, chest raft or chest minecart. No hand suffix.Compat rules
enchantParticleProxybook, book_left, book_rightWhere the enchanting particles of a held enchanting table fly to. Without a suffix, both hands.Compat rules
paddleProxyboat, raft, each with _left or _rightThe paddle of a held boat or raft. Without a suffix, both hands.Compat rules
fishingLineProxyrod, fishing_rod, each with _left or _rightWhere 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_line_anchor.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

typePlays whenClip keys it reads
attackYou swing the held item with the attack key and do not break a block.var_1 to var_3, critical_hit, name
melee_comboBetter Combat is installed, Better Combat Support is on and you swing a weapon. Only in default_animations: in other entries, put the combo in the entry’s betterCombat list.attack_1 to attack_6
mining, mining_v2You hold the attack key on a block with your main hand.name, or start, looping and end
useItemYou 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
interactionYou right-click a block or an entity and the game accepts it.animation, name, closeAnimation
fishingrodYou use a fishing rod. It casts when no hook is out and reels in when one is.throw, pull
eating, drinkingYou hold the use key on food, or on a potion, milk or anything else with the drinking animation.start, looping, end
useEat, useDrinkThe single clip form of eating and drinking.name
use_bowThe bow is drawing.name
use_bow_shotYou 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_crossbowYou hold the use key to load a crossbow.name
use_crossbow_shotYou fire a loaded crossbow.name
use_shieldYou hold the use key with a shield.name
spear_chargeYou hold the use key with a spear. A new stage starts as the charge grows.stage_1, stage_2, stage_3
use_tridentYou hold the use key with a trident.name
use_trident_throwYou let go after charging a trident for at least half a second.name
use_trident_throw_loyaltyThe same, for a trident with Loyalty.name
hand_inThe item in a hand has changed and the new item comes up.name
hand_outThe item in a hand is about to change and the old item goes away.name
idleNothing else is playing and the hand holds an item.name
fallingYou are in the air and dropping, not in water and not flying.name, min_blocks
walk_on_water_v2You wade through shallow water on foot, without swimming.start, looping, end
inspectYou press the Inspect key with no screen open.name
triggerableYou press the key the rule names.name, key, id, title
spatial_gui_compatYour empty hand animates in a screen of Spatial GUI. It is read from spatialGuiCompat.name
walk, walk_forward, walk_backward, walk_left, walk_right, sprint, sprint_forward, sprint_left, sprint_right, jump, fall, landingYou walk, sprint, jump, drop more than 3 blocks or land. They work only while Resource Pack Movement is on, which is disableNewKeyframeMoves 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 namePlays when
punchy_moves_idleIdle pose of the movement layer.
punchy_moves_walk_forward, then punchy_moves_walkYou walk forward.
punchy_moves_walk_backward, punchy_moves_walk_left, punchy_moves_walk_rightYou walk backward, left or right.
punchy_moves_sprint_forward, then punchy_moves_sprintYou sprint forward.
punchy_moves_sprint_left, punchy_moves_sprint_rightYou sprint to the side.
punchy_moves_jumpYou leave the ground.
punchy_moves_fallYou drop more than 3 blocks.
punchy_moves_landYou touch the ground.

Keys of a rule

Keys of a customAnimation rule

KeyTypeDefaultWhat it does
typetextnoneRequired. The moment, from the table above.
nametextthe type’s built-in clipThe clip to play. For an attack it is used only when var_1 to var_3 are all empty.
animationtextnameThe preferred single clip, ahead of name. Not used for attack combos.
var_1, var_2, var_3textnoneThe 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_hittextnoneThe clip for a critical hit. It is checked before Better Combat and the combo.
start, looping, endtextthe rule’s single clip (animation, then name, then var_1); looping falls back to keep_looping firstThe three phases of mining, eating, drinking and walk_on_water_v2.
keep_loopingtextnoneA clip name, not a switch. It is the loop clip when looping is empty.
throw, throw_animation, cast, start_casttextnoneThe cast clip of a fishingrod rule. In a useItem rule it is the clip for a thrown item.
pull, pull_animation, reel, reel_intextnoneThe reel clip of a fishingrod rule.
stage_1, stage_2, stage_3, stage1, stage2, stage3textthe built-in spear clipsThe three charge clips of spear_charge.
min_blocks, minBlocks, falling_min_blocks, trigger_falling_min_blocksnumber0For 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.
itemslistevery itemOnly 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.
blockStateobjectnoneFor interaction: block properties that must match, such as { "open": "false" }.
closeAnimation, close_animation, closetextnoneFor interaction: the clip that plays when you close the container screen you opened.
interfaceDelaynumber, secondsnoneFor interaction on a block: how long to wait before the container screen opens. Used when above 0.
trigger_on_inputbooleanfalseFor 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.
keytextnoneFor 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, triggerIdtextname, then animation, then keyFor 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_name, displayName, friendly_name, friendlyNametextname, then animation, then idFor triggerable: the label in Controls.
skip_blend_inbooleanfalseSnap into the clip without blending from the current pose.
skip_blend_outbooleanfalseCut out of the clip without blending out.
blend_from_current_origin, blendFromCurrentOrigin, rebase_blend_in, rebaseBlendInbooleanfalseBlend from the pose the arm is in now. It is also on when the clip has a blend_from_current_origin or rebase_blend_in token.
stop_immediatebooleanfalseEnd a looping clip the moment you let go of the key, instead of at the end of the loop.
skip_hand_equip, disable_hand_equip, no_hand_equipbooleanfalseSkip the hand_out and hand_in swap clips after the action.
disable_walk_on_water, disable_walkonwater, disable_walk_on_water_v2, disable_walk_on_water_animationbooleanfalseNo walk on water clip while any rule in the list has this on.
disable_dry_out, disable_dryout, disable_dryout_animationbooleanfalseNo dry_out shake while any rule in the list has this on.
disable_swim_animationbooleanfalseWhile 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_handed), neither arm swims. This is the only spelling.
isJavaBlockbooleanfalseDraws a block item with the Java block model.
customFlagsobjectnoneSee Custom flags.
variationslistnoneClip variants that depend on the player. See Variations.
betterCombatlistnoneBetter Combat combos. Read only on a rule in default_animations. On item, itemSpecific and emptyHand entries, put betterCombat on the entry itself, as in Entries for kinds, groups and items.
in_water, inside_water, block_detection, weather_detection, time_detection, biome_detectionvariousnoneWorld 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

KeyTypeDefaultWhat it does
in_waterbooleannoneThe 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_waterbooleannoneYour eyes being under water must equal this.
block_detection.blocktextnoneOne block id or #tag. Read only when blocks is empty or missing.
block_detection.blockslistnoneBlock ids or #tags. One of them must be in the search area. With no target at all, the condition passes.
block_detection.radiuswhole number0A cube around the search origin, in every direction. 0 checks one block. A negative value counts as 0.
block_detection.offsetX, offsetY, offsetZwhole number0Moves the search origin from the block you stand in.
weather_detection.rainingbooleannoneMust match rain.
weather_detection.thunderingbooleannoneMust match thunder.
weather_detection.clearbooleannonetrue means not raining and not thundering.
time_detection.minwhole numberopenThe start of the window on the day clock, 0 to 23999.
time_detection.maxwhole numberopenThe end of the window. When min is above max, the window runs through midnight.
time_detection.rangetwo whole numbersnoneA shorter way to write min and max. When it has two values, it replaces both.
biome_detection.biometextnoneOne biome id or #tag. Read only when biomes is empty or missing.
biome_detection.biomeslistnoneBiome ids or #tags. One of them must be in the search area.
biome_detection.radiuswhole number0A cube around the search origin, as for blocks.
biome_detection.offsetX, offsetY, offsetZwhole number0Moves 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

KeyTypeDefaultWhat it does
movement_influence, movementInfluencewhole number, 0 to 100100How 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_procedural_arm_animations, syncProceduralArmAnimationsbooleanfalseKeeps Punchy!‘s own arm motion in step with the clip.
walk_and_sprint_force, walkAndSprintForcewhole numbernoneA force value for Punchy!‘s walk and sprint motion while the clip plays.
remaining_procedural_animations_force, remainingProceduralAnimationsForcewhole numbernoneA force value for Punchy!‘s other own motion while the clip plays.
look_down_enter, lookDownEnternumber, 0 to 90noneThe look-down pose starts when your view pitch passes this value. It applies only when look_down_exit is set too.
look_down_exit, lookDownExitnumber, 0 to 90noneThe look-down pose ends at this value. Needs look_down_enter.
look_down_forward_offset, lookDownForwardOffsetnumbernoneHow 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

KeyTypeDefaultWhat it does
nametextnoneRequired. The clip to play.
prioritywhole number0The highest priority among the variations that fit wins.
statetextnoneOne player state from the table below.
stateslistnonePlayer states that must all be true.
not_stateslistnonePlayer states that must all be false.
directiontextnoneforward, 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_below, health_abovenumbernoneYour health must be strictly below or above this.
health_percent_belownumber, 0 to 1noneYour health as a share of your maximum must be below this.
food_below, food_abovewhole numbernoneYour food level must be strictly below or above this.
min_fall_distancenumbernoneYou must have fallen at least this far.
in_water, inside_water, block_detection, weather_detection, time_detection, biome_detectionas in ConditionsnoneThe same world conditions as on a rule.

Player states for state, states and not_states

StateTrue when
crouching, sneakingYou are sneaking.
walking, movingYou are moving on the ground without sprinting.
sprintingYou are moving, sprinting and on the ground.
idle, stationaryYou are standing still on the ground.
jumping, risingYou are in the air and going up.
fallingYou are in the air and going down.
on_ground, groundedYou are on the ground.
in_air, airborneYou are not on the ground.
swimmingYou are swimming.
underwaterYour eyes are under water.
climbingYou are on a ladder, vines or another climbable block.
ridingYou are riding something.
flyingYou are flying.
glidingYou are gliding on elytra.
burningYou are on fire.
hungryYour food level is 6 or less.
low_life, low_healthYour health is 30 percent of your maximum or less.
block_above, under_blockA solid block is above your head.
block_below, on_blockA solid block is under your feet.
rainingIt is raining.
thunderingIt is thundering.
dayThe day clock is in the first half of the day, below 12000.
nightThe 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

KeyGoes inTypeDefaultWhat it does
animationsfile rootobjectnoneA map from clip name to clip. It is the only key read at the top of the file.
the clip namekey under animationstextnoneAny text. It is trimmed and case sensitive. A rule names a clip by this exact text.
animation_lengthclipnumber, seconds0The clip’s length. Keyframe movement ignores a clip whose length is 0. A value that is not a number drops the clip.
loopclipboolean or textfalsetrue, "loop" or "true" repeat the clip. "hold_on_last_frame" stays on the last frame while the action lasts. Any other value plays the clip once.
bonesclipobjectnoneA map from bone name to that bone’s channels.
camera, right_arm, left_arm, itemgrip_right, itemgrip_leftname in bonesobjectnoneThe 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.
rotationbonekeys[0, 0, 0]Turning, in degrees.
positionbonekeys[0, 0, 0]Moving, in model units of the rig.
scalebonekeys[1, 1, 1]Size.
[x, y, z]a channel, or a key inside itarray of threenoneA 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 channelobjectnoneA channel written as an object has one key per time, in seconds, written as text.
post, vectora key written as an objectarray of threenoneThe key’s value. Punchy! reads post first, then vector, then pre.
prea key written as an objectarray of threethe post valueThe 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_modea key written as an objecttextlinearHow the channel blends from this key to the next: linear, catmullrom, spherical_linear or spherical_squad. The spherical modes work on rotation in a V2 clip. It is read in lower case.
easinga key written as an objecttextnoneUsed as the mode only when the key has no lerp_mode.
query.anim_time, q.anim_timeinside a key’s Molang textexpressionnoneThe 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.
timelineclipobjectnoneA 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, eventcliptext, list or objectnoneTokens that are active during the whole clip. The four names are read the same way.
sound_effectsclipobjectnoneA 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

The token picker in the Events lane.

Timeline: speed and layout

Speed, layout and rotation order

TokenGoes inWhat it does
anim_speed_<n>timelinePlays 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_speed_0.5 works, anim_speed_.5 does not.
use_keyframes_v2timeline or effectsReads the clip in the V2 layout. A clip without it is a legacy clip.
rotation_xyz, rot_xyztimeline or effectsReads 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_zyx, rot_zyxtimeline or effectsReads 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

TokenGoes inWhat it does
dual_handedtimeline or effectsBoth arms follow the clip. Without it only the arm of the hand that started the action moves.
dual_handed_if_has_off_itemtimeline or effectsDual handed only when the off hand holds an item.
start_here_if_off_hand_item, start_if_offhand_itemtimelineOpens 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_if_offhand_itemtimelineCloses the dual handed window when the off hand holds an item. A later start token opens it again.
hide_offhand_if_emptytimelineHides the off hand arm while the real off hand is empty. The later of this token and show_offhand_if_empty decides.
show_offhand_if_emptytimelineShows the off hand arm again.
sync_walk_armstimeline or effectsMakes 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

TokenGoes inWhat it does
blend_from_current_origin, rebase_blend_intimeline or effectsBlends into the clip from the pose the arm has now. It counts anywhere in the clip.
keep_arm_tuningtimelineKeeps your arm tuning applied while the clip plays.
disable_arm_tuningtimelineTurns arm tuning off while the clip plays. It wins over keep_arm_tuning. Equip clips and walk on water clips ignore it.
disable_tuningtimelineSets 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_pendulum, disable_pendulum_physicstimelineTurns off pendulum physics on the arm and the held item while the token is active.

Timeline: items shown and hidden

Item switching

TokenGoes inWhat it does
left_switch_item_<id>timeline or effectsShows that item in the left hand for the clip.
right_switch_item_<id>timeline or effectsShows that item in the right hand for the clip.
hide_left_switch_item_<id>, hide_right_switch_item_<id>timelineHides the item in that hand, the real one or a switched one. The text after item_ is ignored, so hide_left_switch_item_* does the same. The underscore after item is part of the token.
show_left_switch_item, show_right_switch_itemtimelineShows the real item of that hand again.
show_left_switch_item_<id>, show_right_switch_item_<id>timelineShows the given item in that hand. With * after the underscore, it shows the real item.
hide_itemtimelineHides the item in the hand opposite the one that started the clip. It needs a clip that a hand started.
hide_opposite_hand_itemtimelineHides the item in the hand opposite the one that started the clip. The arm stays visible when that hand holds a real item.
show_opposite_hand_itemtimelineShows 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

TokenGoes inWhat it does
suppress_mesh_animationtimelineHolds the vanilla use animation of the item back from this time until a later start token.
start_mesh_animation, loadstart, load_starttimelineLets the vanilla use animation run from this time. Clips named use_shield and use_trident always hold it back.
swap_end, swap_items, swap_itemtimelineIn an equip clip, the moment the item you see changes from the old one to the new one.
absolute_riding_posetimeline or effectsIn 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

KeyTypeDefaultWhat it doesPage
itemslist of textnoneRequired 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
itemtextnoneOne item id. Read only when items is missing.Definitions
customNametextnoneMakes 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
nametextnoneThe same as customName. Read only when the customName key is missing.Variants
georesource idnoneRequired. 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
textureresource idnoneRequired. The main texture. A path under punchy/model_parts_items/textures/ 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
animationslist of resource idsnoneThe item clip files to load. Write each id in full, with the .animation.json ending. A later file replaces a clip with the same name.Item clips
animationresource idnoneOne clip file. Read only when animations is missing.Item clips
modelPartsAnimationlistnoneThe 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

KeyGoes inTypeDefaultWhat it does
firstperson_righthand, firstperson_lefthanddisplayobjectvanilla transformThe transform for that hand. Used when there is no thirdperson_ entry for the same hand.
thirdperson_righthand, thirdperson_lefthanddisplayobjectnoneIf it is there, Punchy! uses it for that hand and ignores the firstperson_ entry. Model parts draw only in your own first person hands.
rotationa hand entrythree numbers, degrees[0, 0, 0]Turns the model around X, Y and Z. For the left hand, Y and Z are negated.
translationa hand entrythree 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.
scalea hand entrythree 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

typePunchy! asks for it when
idleNothing else is happening. It is also the fallback when a moment has no entry or no clip.
attackYou attack.
miningYou mine a block.
useItemYou use the item: draw a bow, charge a crossbow, charge a trident or use a spear.
useDrink, useEatYou drink or eat.
fishingrodYou cast or reel in a fishing rod. throw names the clip of the cast and pull the clip of the reel.
fallingYou fall.
hand_in, hand_outThe item comes up into your hand, or goes away.
inspectYou press the Inspect key.
triggerableYou press a custom animation key.
in_waterA 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

KeyTypeDefaultWhat it does
typetextnoneRequired. The moment. An entry with no type never matches.
name, animation, var_1textnoneThe 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>_right first, for the left hand <name>_left, then the bare name. When no clip is found, the idle clip plays.
throw, pulltextnoneOnly in a fishingrod entry: the clip of the cast and the clip of the reel. Also read as throw_animation, cast, start_cast, pull_animation, reel and reel_in. Left out, the clip the entry names with animation, name or var_1 plays for both.
itemslistevery item of the definitionLimits the entry to stacks that match these ids or #tags.
in_waterbooleannoneThe player touching water must equal this.
inside_waterbooleannoneThe eyes being under water must equal this. When true, the entry also stays matched for 4 ticks after you leave the water.
block_detection, weather_detection, time_detection, biome_detectionobjectnoneWorld checks, with the same keys as in Conditions. raining stays true for 100 ticks after the rain stops.
keep_loopingtextnoneThe 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_blend_inbooleanfalseCut into this clip with no blend.
skip_blend_outbooleanfalseOn the entry that is playing: when another entry takes over or the clip stops, cut with no blend out.
blend_from_current_origin, blendFromCurrentOrigin, rebase_blend_in, rebaseBlendInbooleanfalseStarts the blend into this clip from the pose the model shows at that moment.
disable_swim_animationbooleanfalseWhile 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_all_particlesbooleanfalseWhile this entry plays, no particle emitter of that hand emits.
disable_physics_bones, disable_pendulum_boneslist of textthe definition’s listBones 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

KeyTypeDefaultWhat it doesPage
animationsobjectnoneClips by name. Each clip is also known as namespace:name.Item clips
animation_lengthnumber, seconds0The clip’s length. A clip that loops needs a length above 0.Item clips
loopboolean or textfalsetrue repeats the clip. "hold_on_last_frame" stops on the last pose and keeps it.Item clips
bonesobjectnoneThe bones to move, by name. A name that is not a bone of the geometry is skipped.Item clips
rotation, position, scalekeysrest valuesThe channels of a bone, written as for a clip file. Position is in model pixels.Item clips
timelineobjectnoneTokens at times, separated by ;: anim_speed_<n>, rotation_xyz, rot_xyz, rotation_zyx and rot_zyx.Item clips
sound_effectsobjectnoneSound names at times, as in a clip file.Item clips

Glow, textures and mirroring

Keys that change how the model looks

KeyTypeDefaultWhat it doesPage
bone_emissionobjectnoneGlow settings: a level for each bone and the settings below.Geometry and textures
bone_emission.<bone>number, 0 to 1000The 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_emission.blurbooleanfalseAdds a second, larger glow pass around glowing bones.Geometry and textures
bone_emission.clampbooleanfalseSamples the glow texture clamped to its edge instead of repeating it.Geometry and textures
bone_emission.strength, intensity, brightnesswhole number, 0 to 100100One 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_texturesobject or listnoneGives 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_animobjectnoneAnimates the whole texture, stacked as frames from top to bottom.Geometry and textures
texture_anim.frameswhole number1How many frames are stacked in the PNG. At least 1.Geometry and textures
texture_anim.frametimewhole number1Game ticks each frame lasts. At least 1.Geometry and textures
texture_anim.frame_heightwhole number0The 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_texture_animobjectnoneA map from bone name to an object with frames, frametime and frame_height, for that bone only. A value you leave out becomes 1, 1 and 0.Geometry and textures
bone_mirrorobjectnoneA 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_transparent_bones, inside_visible_boneslist of textnoneBones, 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_modelsobjectnoneA 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_rod_cast, and fishing_rod_cast wins over using.Definitions
physicsFeedback, fallingFeedBack, fallingFeedbackbooleanfalseTurns 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

KeyTypeDefaultWhat it doesPage
typetexttexturetexture swaps the texture of one bone. geo swaps the whole geometry. Any other value counts as texture.Dynamic textures
bonetextnoneThe bone to retexture. Required for texture, ignored for geo.Dynamic textures
sourcetextsulfur_cube_contentWhat picks the map entry: sulfur_cube_content (the item id of the block a sulfur cube has absorbed) or axol_variants (the variant of the bucketed axolotl). Case does not matter. Any other value matches nothing, so only the fallback applies.Dynamic textures
mapobjectemptyMaps what the source reports to a texture id, or to a geometry id for geo. The match is exact and case sensitive.Dynamic textures
fallbackresource idnoneUsed 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

KeyTypeDefaultWhat it doesPage
fishing_line_anchorobjectnoneWhere 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_bones_while_castlist of textnoneBone 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

KeyTypeDefaultWhat it does
itemtextnoneThe item the rule is for: a lower case id. minecraft: may be left out.
texturetextnoneThe 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.
fullbrightbooleanfalsetrue 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.
shadingbooleantruefalse 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.
additivebooleannonetrue 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_testbooleannoneFor 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_in_model 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

KeyTypeDefaultWhat it does
pendulum_mode, pendulumMode, pendulum, physics_modetext or booleannoneThe mode. full, pendulum_full and full_pendulum mean FULL_PENDULUM. forward, foward, pendulum_forward, pendulum_foward, forward_pendulum and foward_pendulum mean FORWARD_PENDULUM. 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_limit_deg, pendulumLimitDegnumber, degrees55Sets the up and down limits together.
limit_deg_up, limitDegUp, pendulum_limit_deg_up, pendulumLimitDegUpnumber, degrees55The upper limit.
limit_deg_down, limitDegDown, pendulum_limit_deg_down, pendulumLimitDegDownnumber, degrees55The lower limit.
force, pendulum_force, pendulumForcenumber0.75How hard turning the camera kicks the bone.
speed, pendulum_speed, pendulumSpeednumber16Part of the damping. A higher speed swings longer.
camera_sens, cameraSens, pendulum_camera_sens, pendulumCameraSensnumber0.3How much each turn of the camera counts.
gravity, pendulum_gravity, pendulumGravitynumber25How strongly the bone is pulled back to rest.
motion_sens, motionSens, pendulum_motion_sens, pendulumMotionSensnumber0.2How much walking and landing count.
invert, pendulum_invert, pendulumInvertbooleanfalseSwings the other way.
enableCreaturePhysics, creature, pufferbooleanfalseCreature style feedback on this bone: it tilts and shifts as you walk, jump, fall and land.
enableSlimePhysics, slime, slimeBlockbooleanfalseSlime squash on this bone.
impactInclinationPercent, impact_inclination_percent, impactInclination, impact_inclination, landingInclinationPercent, landing_inclination_percent, landingInclination, landing_inclinationnumber, 0 to 100100Scales 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.
fallInclinationPercent, fall_inclination_percent, fallInclination, fall_inclination, upwardInclinationPercent, upward_inclination_percent, upwardInclination, upward_inclinationnumber, 0 to 100100Scales the tilt on the other side, which is the punch of a landing and the lean when you tilt the camera up.
impactTranslationPercent, impact_translation_percent, landingTranslationPercent, landing_translation_percent, impactTranslation, impact_translation, landingTranslation, landing_translationnumber, 0 to 100100Scales the vertical and depth (Y and Z) shift during the lean of impactInclinationPercent.
fallTranslationPercent, fall_translation_percent, upwardTranslationPercent, upward_translation_percent, fallTranslation, fall_translation, upwardTranslation, upward_translationnumber, 0 to 100100Scales the same shift during the lean of fallInclinationPercent.
slimeImpactPercent, slime_impact_percent, impactSlimePercent, impact_slime_percent, slimeImpact, slime_impactnumber, 0 to 100100Scales the slime squash: the squash at take-off, while you rise and at landing.
slimeFallPercent, slime_fall_percent, fallSlimePercent, fall_slime_percent, slimeFall, slime_fallnumber, 0 to 100100Scales 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

KeyGoes inWhat it does
particle, particles, particle_effects, particle_emission, particleEmissionthe root of a definitionOne emitter or a list. The five keys are read in this order and the lists are joined.
particle_emitters, particleEmitters, particle, particles, particle_effects, particleEffects, particle_emission, particleEmissionitem and itemSpecific entries of a compat fileThe 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

KeyTypeDefaultWhat it does
typeparticle idminecraft:critNames 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.
enabledbooleantrueObject form only. false switches the emitter off.
bonetextnoneThe 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, target_type, emit_target_typetextboneWhere the particle starts. bone starts it at the bone. world_block_face (also world_face, world_hit_face, target_block_face) starts it on a face of the mined block. A compat emitter on an item without a model part can also use item_center (the middle of the item) and block_face.
offsetvector0:0:0Moves the start from the bone, in blocks, in the space of offset_space.
spreadvector0:0:0A random scatter of the start, up to this far either way on each axis.
velocityvector0:0:0The starting push, in the space of velocity_space. 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

KeyTypeDefaultWhat it does
count, burstwhole number1Particles per release, 0 to 120, after t and ease scale it.
chancenumber, 0 to 11The chance that a release spawns anything. It is rolled once per release.
rate, rate_per_sec, ppsnumber0Releases per second for a steady emitter, 0 to 120. At most 24 releases per frame.
emit_interval, emit_every_seconds, interval_seconds, spawn_every_secondsseconds0Seconds between releases for a steady emitter, 0 to 60. It wins over rate when above 0.
emit_for, durationseconds0The emitter stops for good this many seconds after it started, 0 to 30. 0 means no limit.
tnumber, 0 to 11A share put through ease and multiplied into count and velocity. 0 spawns nothing.
easetextlinearlinear, ease_in_quad, ease_out_quad or ease_in_out_cubic. 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

KeyTypeDefaultWhat it does
trigger_jump, jumpbooleanfalsePulse. A burst at takeoff.
trigger_landing, landingbooleanfalsePulse. A burst on landing.
trigger_attacking, attacking, attackbooleanfalsePulse. A burst for each swing or attack of this hand.
trigger_use_item, trigger_useitem, use_item, useitembooleanfalsePulse. A burst each time this hand uses the item.
trigger_mining, miningbooleanfalsePulse and steady. A burst for each mining event, and the steady clock runs while you mine. Main hand only.
trigger_walking, walkingbooleanfalseSteady. You are on the ground, moving, not sprinting and not swimming.
trigger_sprinting, sprintingbooleanfalseSteady. You are sprinting and moving.
trigger_swimming, swimmingbooleanfalseSteady. You are swimming or in water.
trigger_falling, fallingbooleanfalseSteady. You are in the air and dropping.
trigger_falling_min_blocks, falling_min_blocks, min_fall_blocks, min_blocksnumber, 0 to 5120The shortest fall, in blocks, before falling counts.
on_animation_name, trigger_animation_name, animation_nametextnoneThe 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_animation_timecode, trigger_animation_timecode, animation_timecode, timecodesecondsunsetPulse. The time in that clip at which one burst is released. Use a time above 0.
on_animation, trigger_on_animationtextnoneName and time in one value, name@seconds. In an object it can also be { "name": "clip", "timecode": 1.0 }.
trigger_biomes, biome_names, biomes, trigger_biome, biomelistnoneSteady. Biome ids or #tags, joined with a bar or a semicolon. True when the biome at your feet is in the list.
trigger_mode, trigger_logic, triggers_mode, triggers_logictextallany or or releases when one trigger is true. Any other value needs all of them.
triggersobjectnoneObject 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

KeyTypeDefaultWhat it does
life, lifetimeseconds1.1How long a particle lives, 0.05 to 60.
sizenumber0.028Half the width of the square at the start, 0.001 to 2.
size_endnumber0.006Half the width at the end of life, 0 to 2.
alphanumber0.95Opacity at the start, 0 to 1. A number above 1 is read as 0 to 255.
alpha_endnumber0Opacity at the end of life. Same range as alpha.
dragnumber0.93The share of speed kept each tick, 0 to 1.2.
gravitynumber0Added to the vertical speed over time, -2 to 2.
tint, color, rgbvectorwhiteRed, green and blue, each 0 to 1, or each 0 to 255 when any is above 1. Types with falling_lava, landing_lava, dripping_lava or dripstone_lava in the name start orange.
textureresource idthe type’s pictureThe 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

KeyTypeDefaultWhat it does
additivebooleanfalseMakes 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_in_model) 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_brightbooleantrueFull 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_day_light, fulldaylight, day_fullbright, daylight_fullbrightbooleanfalseFull light only in the overworld by day. Needs Enable Model Parts Glow.
bright_at_dark, blur_glow_at_dark, dark_bright, bright_in_dark, bright_at_night, night_bright, full_night_light, night_fullbrightbooleanfalseFades 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_target_menubooleanfalseHides the particle whenever Enable Blur Glow At Dark is off.
light_percent, light_pct, light, brightness_percentnumber, 0 to 100the world’s lightMixes the world’s light toward full light. Below 100 the glow layer is not drawn.
strength, emissive, emissive_strength, emission_strengthwhole number, 0 to 100100The glow layer’s strength. 0 for types with leaf or leaves in the name unless you write it.
blur, emissive_blur, emission_blurbooleanfalseAdds a soft halo.
clamp, emissive_clamp, emission_clampbooleantrueClamps 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

KeyTypeDefaultWhat it does
offset_space, space_offsettextboneThe space offset is read in: bone, world, camera, block or block_face.
velocity_space, space_velocity, vel_spacetextworldThe space velocity is read in. The same values.
ignore_model_rotation_for_emit, ignore_model_rotation, emit_ignore_model_rotation, no_model_rot_emitbooleantrueThe bone’s turning is ignored when placing the start, so an offset stays put while the bone sways.
motion, movement, motion_modetextlinearlinear (also default, drag) or orbit (also orbital, circle).
motion_space, orbit_spacetextboneThe space the orbit axis and center are read in.
orbit_radius, radiusnumber0The orbit’s radius in blocks, 0 to 4.
orbit_speed, angular_speednumber0Turns per second, -20 to 20. Negative turns the other way.
orbit_axis, axisvector0:1:0The axis the particle circles.
orbit_phase, phasenumber, degrees0The starting angle. The particles of one release are spread evenly from it.
orbit_center, center_offset, motion_centervector0:0:0Moves the orbit’s center, in motion_space.
lock_in_model, lock_model, locked_in_model, pin_in_model, pinned_in_modelbooleanfalsePins 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_center" or with target left out.
synthetic_world_local, fake_world_local, pseudo_world_localbooleantrueKeeps particles that still follow the model in place while the camera turns.
world_preview_behind_local, world_layer_behind_local, world_behind_local, release_preview_layerbooleantrueDraws a particle’s world copy behind the copy that follows the model. Off for pinned particles.
world_preview_bias, world_layer_bias, behind_local_bias, release_preview_biasnumber, 0 to 0.050.0015The depth push for that world copy.

The mined block

Block faces and filters

KeyTypeDefaultWhat it does
face, block_face, emit_face, mining_facetexthitThe face for a block face emitter: hit (also impact, clicked), random, opposite (also back, reverse), up, down, north, south, west or east.
face_region, face_bounds, surface, surface_region, surface_boundstext0:0:1:1Where on the face: hit, impact or exact for the hit point, or four numbers u:v:u:v from 0 to 1.
trigger_block, trigger_blocks, block, blocks, mining_block, mining_blockslistnoneBlock ids or #tags, joined with a bar or a semicolon. The mined block must be one of them.
trigger_block_state, block_state, mining_block_statelistnoneRequired 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

KeyTypeDefaultWhat it does
enchantmentslistnoneRequired, 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, minLevelwhole number1In an object element: the lowest level that counts. A minimum of 0 matches even when the enchantment is absent.
max_level, maxLevelwhole numbernoneIn an object element: the highest level that counts. A negative value means no maximum.
matchtextallany, in any letter case, applies the variant when one element matches. Any other value needs every element.
prioritywhole number0Matching variants apply in ascending priority. Equal priorities keep the order of the file.
particle_emitters, particleEmitters, particle, particles, particle_effects, particleEffects, particle_emission, particleEmissionemittersnoneThe 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 keyWhat it doesPage
/punchy debugpositionTurns 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
/punchy pos <x> <y> <z>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
/punchy rot <x> <y> <z>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, F8Opens 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, IPlays 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

FileWhat drops it
Compat fileThe whole file is skipped, with no message, for: a comma before a closing brace; a key written twice inside item, itemSpecific, 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 profileOnly 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 itemSpecific 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 profileNothing 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 fileAll clips in the file are lost, with a warning in logs/latest.log, when the file is not valid JSON or its top level is not an object.
Clip fileOne 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_length is not a number.
Model part definitionThe 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, modelPartsAnimation or one of its entries has a value of the wrong type. A wrong type for the whole of bone_emission, bone_textures, texture_anim or bone_mirror only ignores that key. A value inside one of them that cannot be read as the expected type, such as texture_anim.frames set to true or bone_emission.strength set to text that is not a number, still drops the definition.
Shading fileNo rule is read, with no message, when the file is not valid JSON.
Item clip fileThe 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

  1. 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.
  2. The flag is in the wrong place. Check the Goes in column. A key in the wrong container is not read.
  3. 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.
  4. A setting is off. Check Settings that switch features.
  5. You did not reload. Press F3+T after every change to a pack.
  6. The file was dropped. Check the JSON against Things that drop a whole file.
  7. The key needs another mod. Better Combat and Spatial GUI keys act only when those mods are installed.

Last checked against the mod on 29 October 2026.