Privacy
Language: Português (Brasil)

Recreate a 3D torch pack

Build 3D torches and lanterns with a glowing animated flame, particles, a flame that goes out under water and a swinging lantern, in Blockbench or Punchy! Studio.

This page has not been translated into Brazilian Portuguese yet, so it is shown in English. Read in English

On this page

In this tutorial you build a small pack called Torchlight from an empty folder. It gives the torch, the soul torch, the lantern and the soul lantern a 3D model in your hand, with a flame that glows and flickers, particles that rise from it, a flame that goes out when your head goes under water, and a lantern that swings as you turn and walk.

This tutorial is inspired by the example pack provided by patovskiz, Refined Torches, and uses the same techniques: one bone for the flame, a glow and an animated picture on that bone, an emitter on the bone, and a second idle clip for the water. Every model, texture and file here is our own. The page is for pack makers who want a real goal for their first model part, and for anyone who has made one and wants to see glow, particles, conditions and physics working together.

Before you start

  • Punchy! 3.0 or newer, from Modrinth or CurseForge. This page was checked against Punchy! 3.0 for Fabric on Minecraft 26.3.
  • Blockbench 5, or Punchy! Studio, which you get from Modrinth or CurseForge. Both paths make the same pack.
  • A creative world to test in. Every test below starts with a /give command.
  • A rough idea of what a model part is: a shape, a picture and a definition that ties them to an item. The model parts overview explains it, and each page in that section covers the keys used here in full.

Model parts show in your own first person hands only. The inventory, dropped items and other players still show the normal item.

What you will build

The pack has four definitions that share two models and one set of flame clips.

Torchlight/
  pack.mcmeta
  assets/minecraft/punchy/model_parts_items/
    definitions/
      torch.json
      soul_torch.json
      lantern.json
      soul_lantern.json
    geo/
      torch.geo.json
      lantern.geo.json
    textures/
      torch.png
      torch_flame.png
      soul_flame.png
      lantern.png
    animations/
      flame.animation.json

Each effect has one cause, and each section below adds one of them:

EffectWhat makes itWhere
The 3D modelA Bedrock geometry file and a texture, tied to the item by a definitionModel the torch
The glowbone_emission on the flame boneMake the flame glow and move
The moving flameA tall PNG of four frames and bone_texture_anim on the flame boneMake the flame glow and move
The flickerAn item clip that scales the flame boneAnimate the flame and put it out under water
The flame going outA second idle entry that plays while your eyes are under waterAnimate the flame and put it out under water
The particlesEmitters on the flame boneAdd flame particles
The swinging lanternbone_physics with a pendulum on the swing boneMake the lantern swing

After every section from Show the torch in your hand on, the pack still works, so you can test as you go.

Model the torch

The torch has three bones. The stick and its wrapped head are plain cubes. Everything about the flame lives in one bone called flame, because glow, texture animation and particles each act on a single bone by its name. The flame is two flat cards that cross like a plus sign seen from above. A card is a cube with a size of 0 on one axis, and Punchy! draws only its two broad faces.

BoneParentPivotCube originCube sizeWhat it is
torchnone0, 0, 0-1, -5, -12, 10, 2The stick
headtorch0, 5, 0-2, 5, -24, 2, 4The wrapped top
flamehead0, 7, 0-2, 7, 04, 6, 0First card, facing north and south
flamehead0, 7, 00, 7, -20, 6, 4Second card, facing east and west

All numbers are pixels, and 16 pixels make one block. The stick is centered on height 0. The texture grid is 16 by 16, and every face is a rectangle on it. Each rectangle is written as u, v, width, height:

FaceStickHeadFlame cards
north0, 0, 2, 108, 0, 4, 20, 0, 4, 6 (first card)
east2, 0, 2, 1012, 0, 4, 20, 0, 4, 6 (second card)
south4, 0, 2, 108, 2, 4, 20, 0, 4, 6 (first card)
west6, 0, 2, 1012, 2, 4, 20, 0, 4, 6 (second card)
up0, 10, 2, 28, 4, 4, 4none
down2, 10, 2, 212, 4, 4, 4none

The flame cards use the same rectangle on their own texture, which you paint in a later section. Geometry and textures explains every geometry key.

Tool

In Blockbench

  1. Choose File > New > Bedrock Entity.

    Do not pick Bedrock Legacy Model. It writes the old layout that Punchy! cannot read.

  2. Choose File > Project…. Set Default UV Mode to Per-face UV and Texture Size to 16 and 16, then press Confirm.

  3. Use Add Group to make a group named torch, with its Pivot Point at 0, 0, 0. With the group selected, use Add Cube. Make the cube 2 wide, 10 high and 2 deep, with its lowest point at height -5 and centered on 0 in x and z.

  4. Add a group named head. Drag it onto torch in the Outliner, and set its Pivot Point to 0, 5, 0. Add a cube 4 wide, 2 high and 4 deep, with its lowest point at height 5 and centered on 0 in x and z.

  5. Add a group named flame. Drag it onto head, and set its Pivot Point to 0, 7, 0. Add a cube 4 wide, 6 high and 0 deep, with its lowest point at height 7, centered on 0 in x, with z at 0.

  6. Add a second cube to flame: 0 wide, 6 high and 4 deep, lowest point at height 7, x at 0, centered on 0 in z. The two cubes now cross.

  7. In the UV panel, give every face the rectangle from the table above. For the two cards, only the broad faces matter: north and south on the first, east and west on the second.

  8. In the Textures panel, use Create Texture to make a 16 by 16 texture named torch. You paint it in the next section.

  9. Choose File > Export > Export Bedrock Geometry and save the file as torch.geo.json.

Video coming soon

A Bedrock Entity project set to Per-face UV, with the stick of the torch.

Video coming soon

The flame is one group with two crossing flat cubes.

In Punchy! Studio

  1. Join a creative world, run /give @s torch, hold it, switch to first person and press F6. If the editor opens in the Third Person perspective, pick First Person with the switch between the menus and the workspace tabs. Click the Model tab.
  2. Choose File > New Model Part. Type torch in Name and minecraft:torch in Held Item, then press Create. The new model part starts with one bone and one textured cube.
  3. Select the bone in the Outliner. In the Bone tab, type torch in Name. Select its cube. In the Cube tab, set Origin to -1, -5, -1 and Size to 2, 10, 2.
  4. Select the torch bone and press Add Child Bone in the Bone Actions panel. Select the new bone, name it head and set its Pivot to 0, 5, 0. Press Add Cube and set the cube’s Origin to -2, 5, -2 and Size to 4, 2, 4.
  5. Select head and press Add Child Bone again. Name the new bone flame and set its Pivot to 0, 7, 0. Press Add Cube and set Origin to -2, 7, 0 and Size to 4, 6, 0.
  6. With flame selected, press Add Cube once more. Set Origin to 0, 7, -2 and Size to 0, 6, 4.
  7. Press 2 for UV mode. Select a cube, click one of its faces in the UV editor, and type the U, V, Width and Height from the table above in the Face tab. You can also drag the faces onto the rectangles.

Video coming soon

Three bones and four cubes in the Model workspace.

Video coming soon

Placing the faces on the 16 by 16 grid.

Studio keeps your work in its own project, saved to punchy-studio/<name>.psm.json, and writes the geometry file when you export.

Prefer to skip the modeling? Copy torch.geo.json from The complete files. Open it in Blockbench with File > Open Model, or drop it on the game window in Studio, which replaces the model’s geometry.

Paint the torch

torch.png is a 16 by 16 picture. Punchy! reads only the two rectangles the faces point at, so painting it takes two fills. Positions are counted in pixels from the top left corner. The pixels outside them are never drawn, so they can stay empty or hold any color.

RectangleColorWhat it paints
x 0 to 7, y 0 to 11#8B5A2B (139, 90, 43)The stick
x 8 to 15, y 0 to 7#2E2118 (46, 33, 24)The wrapped head
Tool

In Blockbench

  1. Click the torch texture in the Textures panel, then switch to Paint mode with the mode tab at the top right.
  2. Pick a brush of size 1 or a fill tool, set the color to #8B5A2B, and cover x 0 to 7 and y 0 to 11. Switch the color to #2E2118 and cover x 8 to 15 and y 0 to 7.
  3. Save the texture as torch.png.

Video coming soon

Two rectangles are all the torch texture needs.

In Punchy! Studio

  1. Select the torch bone and press 5 for Paint mode. The image editor shows the main texture.
  2. Pick Fill (G), set the color in the Color panel to 139, 90, 43 and click the image until the whole texture has the stick color. A Shift click fills every pixel of the clicked color.
  3. Pick Pencil (B), set the color to 46, 33, 24 and paint x 8 to 15, y 0 to 7. A larger brush Size covers it faster, and the Pixel Grid helps you count.

Video coming soon

Fill the stick color, then paint the head.

Show the torch in your hand

The smallest definition names the item, the geometry and the texture:

{
  "items": ["minecraft:torch"],
  "geo": "minecraft:punchy/model_parts_items/geo/torch.geo.json",
  "texture": "minecraft:punchy/model_parts_items/textures/torch"
}

The geo id is used exactly as written, with its folders and the .geo.json ending. The texture id gets .png added for you.

Tool

In Blockbench

  1. In your resourcepacks folder, make a folder called Torchlight. Inside it, make pack.mcmeta with the text from The complete files.
  2. Make the folders assets/minecraft/punchy/model_parts_items/ with definitions, geo, textures and animations inside it.
  3. Put torch.geo.json in geo and torch.png in textures. Save the definition above as torch.json in definitions.
  4. In the game, open Options, then Resource Packs, move Torchlight to the right-hand list, and press Done.
  5. Join a creative world, run /give @s torch, hold it and switch to first person.
  6. After every later edit, press F3+T to reload.

In Punchy! Studio

  1. Choose View > Live Link with Punchy (Ctrl+L). Punchy! now draws your unsaved model in your hand. Hold a torch to see it.
  2. Open the Definition tab. The Lint panel says Nothing to report. when Punchy! will load the definition.
  3. Choose File > Export Model Part… (Ctrl+E). Type Torchlight in Pack, tick Activate the pack and play it now, and press Export.

Video coming soon

The live link shows the model in your hand, then Export writes the pack.

Studio writes the folders, pack.mcmeta, the definition, the geometry and the textures. Its file names follow your project’s name, so they can differ from the ones on this page. The files work the same way.

You should see a small torch in your hand with two plain brown cards on top, where the flame will go. If the vanilla torch shows instead, go to Things that stop it from working.

Make the flame glow and move

The flame gets three things, all on the flame bone: its own picture, an animation that steps through four frames, and a glow.

The picture is a tall PNG, torch_flame.png, 16 pixels wide and 64 tall. It holds four frames of 16 by 16 pixels, one under the other. Punchy! shows one frame at a time. The faces of the cards describe the first frame, and Punchy! moves them down the PNG for you, so you draw the 4 by 6 flame at the top left of each frame.

Here are the four frames. Each letter is one pixel, and a dot is a see-through pixel. Frame 1 starts at y 0, frame 2 at y 16, frame 3 at y 32 and frame 4 at y 48.

Frame 1   Frame 2   Frame 3   Frame 4
.O..      ..O.      .O..      ..O.
.OO.      .OO.      OOO.      .OOO
OOYO      OOYO      OYYO      OYYO
OYYO      OYYO      OYYO      OYWO
OYWO      OYWO      OYWO      OYWO
.OO.      .OO.      .OO.      .OO.
LetterTorch colorSoul torch color
O#FF7A1A (255, 122, 26)#2B9FD6 (43, 159, 214)
Y#FFC83D (255, 200, 61)#6FE0F2 (111, 224, 242)
W#FFF1B8 (255, 241, 184)#E6FBFF (230, 251, 255)

Every pixel in these frames is fully solid or fully see-through.

Tool

In Blockbench

The strip is four times taller than the model’s 16 by 16 grid, so paint it in a pixel editor of your choice.

  1. Make a new image 16 pixels wide and 64 pixels tall with a see-through background, and paint the four frames from the grid above.
  2. Save it as torch_flame.png in the textures folder.
  3. Open torch.json and add the keys from the next block. The next section explains each of them.
  4. Press F3+T in the game and hold the torch.

Video coming soon

Four frames of 16 by 16 pixels, stacked into one 16 by 64 picture.

In Punchy! Studio

  1. Select the flame bone. Choose Image > New Image…. Type torch_flame as the name, set the width to 16 and the height to 64, leave it transparent and press Create. The new image becomes the texture of the flame bone.
  2. In the Bone tab, open Bone Texture Animation. Set Frames to 4 and Frame Time to 3.
  3. Press 5 for Paint mode. Pick Pencil and set the brush Size to 1. In the image editor, choose a frame with the Frame field and paint it from the grid above. Do this for all four frames.
  4. Still in the Bone tab, set Glow Level to 100 under Glow.
  5. Open the Material tab. Under Glow Settings, tick Blur Glow and Clamp Glow.
  6. In the Bone tab, open Flags and switch on Camera Transparent.
  7. Choose View > Show Glow to preview the glow on the stage, and look at the real thing through the live link.

Video coming soon

A 16 by 64 image for the flame, painted one frame at a time.

Video coming soon

The animation and the glow are fields of the flame bone.

Studio warns you when the height of the picture does not fit the frames, and the Lint panel in the Definition tab names the problem. If the flame stays still, read that warning first.

The definition gets four new keys. The Studio fields above write the same ones:

{
  "bone_textures": {
    "flame": "minecraft:punchy/model_parts_items/textures/torch_flame"
  },
  "bone_texture_anim": {
    "flame": { "frames": 4, "frametime": 3 }
  },
  "bone_emission": { "flame": 100, "blur": true, "clamp": true },
  "camera_transparent_bones": ["flame"]
}
  • bone_textures gives the flame bone its own picture. Every other bone keeps the main texture.
  • bone_texture_anim plays that picture as four frames. frametime counts game ticks, and there are 20 in a second, so 3 ticks per frame is a flicker of about 7 frames a second. The PNG must be exactly frames times 16 pixels tall, which is 64. If the height is off by one pixel the texture animation switches off, the flame stops moving and looks squashed, and Punchy! says nothing.
  • bone_emission draws the flame bone a second time at full brightness, so it stays bright in the dark while the stick is shaded as usual. A level of 100 is the strongest. blur adds a soft, slightly larger copy for the bloom, and it also makes the glow read the picture smoothly. clamp keeps the edge pixels from picking up colors from the opposite edge. The glow follows the animation, because it is drawn from the same frame.
  • camera_transparent_bones hides the faces of a bone that turn away from you, so each flame card shows one face and not two stacked ones.

Reload and hold the torch in a dark place, such as a cave or at night. The flame cycles through its four frames and keeps its color while the stick falls into shade.

Video coming soon

The flame glows and moves. The stick is shaded by the world's light.

Animate the flame and put it out under water

The four frames make the flame move inside its picture. An item clip makes the whole flame bone move: it grows, shrinks and sways a little. An item clip is an animation of the bones of the model itself, played next to the hand animation. You need two clips, both in one file:

  • flame_flicker loops and scales the flame by a few percent. It is the normal idle.
  • flame_out loops too, and holds the flame at a scale of 0.001, which is smaller than a pixel. That hides the flame and its glow together, because both are drawn from the same bone. It is the idle under water.
{
  "format_version": "1.8.0",
  "animations": {
    "flame_flicker": {
      "loop": true,
      "animation_length": 1.2,
      "bones": {
        "flame": {
          "scale": {
            "0.0": [1, 1, 1],
            "0.3": [0.92, 1.12, 0.92],
            "0.6": [1.04, 0.94, 1.04],
            "0.9": [0.95, 1.08, 0.95],
            "1.2": [1, 1, 1]
          }
        }
      }
    },
    "flame_out": {
      "loop": true,
      "animation_length": 1,
      "bones": {
        "flame": { "scale": [0.001, 0.001, 0.001] }
      }
    }
  }
}

Save this as flame.animation.json in animations. Keys are played linearly. Give a looping clip an animation_length above 0. An idle entry repeats its clip by itself, and "loop": true in the clip file says the same thing, so write it on every clip that should repeat. A scale given as one list, as in flame_out, is a single key at time 0.

Two entries in the definition decide when each clip plays:

{
  "animations": ["minecraft:punchy/model_parts_items/animations/flame.animation.json"],
  "modelPartsAnimation": [
    { "type": "idle", "animation": "flame_flicker" },
    {
      "type": "idle",
      "animation": "flame_out",
      "inside_water": true,
      "disable_all_particles": true,
      "skip_blend_in": true,
      "skip_blend_out": true
    }
  ]
}

Both entries are idle, so both are candidates whenever nothing else plays. Punchy! picks the most specific one that matches right now. An entry earns points for each condition it has, and inside_water earns 3. An entry with any points beats every entry with none, so the second entry wins while your eyes are under water and the first one wins the rest of the time. The order in the file does not matter here.

  • inside_water: true matches while your eyes are under water. It keeps matching for a very short moment after you come up.
  • disable_all_particles clears every emitter of that hand while the entry is playing. This is what stops the smoke under water.
  • skip_blend_in and skip_blend_out make Punchy! cut to the clip and away from it. Without them Punchy! blends between clips, over 0.4 seconds between two clips and 0.6 seconds into an idle clip that follows a playing one, so the flame would shrink and grow over that time. With skip_blend_in the blend into the clip is 0 seconds. A cut looks like a flame being snuffed out and relit.
Tool

In Blockbench

  1. With the torch project open, press Animate, the mode tab at the top right. If you closed it, open torch.geo.json with File > Open Model first.
  2. In the Animations panel, press Add Animation. Type flame_flicker in Name, set Loop Mode to Loop, and press Confirm. Set Animation Length to 1.2.
  3. Select flame in the Outliner. In the Timeline panel, click the ruler at 0 and press the + beside Scale. Type 1, 1 and 1 in the Keyframe panel. Add scale keys at 0.3 (0.92, 1.12, 0.92), at 0.6 (1.04, 0.94, 1.04), at 0.9 (0.95, 1.08, 0.95) and at 1.2 (1, 1, 1).
  4. Press Add Animation again for flame_out. Set Loop Mode to Loop and Animation Length to 1. Add one scale key at 0 with 0.001, 0.001 and 0.001.
  5. Choose Animation > Export Animations…, tick both animations in Select Animations to Export, press Confirm, and save the file as flame.animation.json in animations.
  6. Add the animations and modelPartsAnimation keys from above to torch.json, and press F3+T in the game.

Video coming soon

Keying the flicker, then exporting the clips.

In Punchy! Studio

  1. Open the Animation tab in the Properties column and press Add Clip. In the Item Clip panel, type flame_flicker in Name and 1.2 in Length, and choose Loop on the Loop row.
  2. Select the flame bone in the Outliner and pick its Scale row in the timeline. Put the playhead on 0 and press I. Set the key’s values in the key column, then add keys at 0.3, 0.6, 0.9 and 1.2 with the values from the clip file above.
  3. Press Add Clip again. Name it flame_out, set Length to 1 and choose Loop. Key the flame bone’s Scale at 0 with 0.001 on all three axes.
  4. Press Add Entry. Set Type to idle and Clip to flame_flicker.
  5. Press Add Entry again. Set Type to idle and Clip to flame_out. Set Under Water to Yes, and switch on No Particles, Skip Blend In and Skip Blend Out.
  6. Open the Environment tab. Under Weather and Water, set Eyes in Water to yes. What Reacts Now says that idle plays flame_out, and the live link shows the flame go out in your hand. Set it back when you are done.

Video coming soon

Two clips and two idle entries in the Animation tab.

Video coming soon

The Environment tab tests the water entry without leaving the editor.

Dive in a lake with the torch in hand. The flame and its glow vanish the moment your eyes go under. They come back a moment after your eyes leave the water, because inside_water keeps matching briefly.

Video coming soon

The flame goes out when your eyes go under water.

Add flame particles

Particles are small pictures that Punchy! draws itself and moves away from a bone. For the torch you add two emitters on the flame bone: embers that rise from the flame, and a thin smoke.

{
  "particles": [
    {
      "type": "minecraft:flame",
      "bone": "flame",
      "offset": [0, 0.25, 0],
      "rate": 5,
      "life": 0.6,
      "size": 0.03,
      "size_end": 0.005,
      "spread": [0.02, 0.01, 0.02],
      "velocity": [0, 0.012, 0]
    },
    {
      "type": "minecraft:smoke",
      "bone": "flame",
      "offset": [0, 0.4, 0],
      "rate": 2,
      "life": 1.4,
      "size": 0.04,
      "size_end": 0.08,
      "alpha": 0.35,
      "alpha_end": 0,
      "fullbright": false,
      "spread": [0.02, 0.01, 0.02],
      "velocity": [0, 0.012, 0]
    }
  ]
}

Read the first emitter line by line:

  • type picks the picture. Punchy! does not spawn the game’s particle. It draws its own square with the picture that the type uses, so minecraft:flame draws the flame sprite. With no type at all you get the crit picture, and a type with no picture of its own draws the flame sprite.
  • bone is where the particles start: the pivot of that bone. If the name does not match a bone, they start at your hand instead.
  • offset moves the start from the bone, in blocks. 0.25 blocks is 4 pixels, which puts the embers near the top of the flame.
  • rate is how many times a second the emitter releases. With no triggers, an emitter runs all the time. Each release makes one particle, since count is 1 by default.
  • life is how long a particle lives, in seconds. size is the starting half width of its square and size_end is the size at the end of its life, so the embers shrink as they rise.
  • spread scatters the starting point a little, and velocity gives each particle a starting push, up in this example. Drag slows a particle every tick, so a small push goes a short way.

The smoke is the same idea with three changes. Its alpha fades from 0.35 to nothing, its size_end is larger than its size so it spreads out, and fullbright is false. A particle gets full light by default, ignoring the light of the world, as long as Enable Model Parts Glow is on. Smoke should follow the light of the world, so it gets a dull shade at night.

Particles need Enable Particle System, the master switch, which is on by default. Enable Model Parts Glow is on by default too, and it controls only the glow and the full light of the particles. The bone_emission glow on the model’s own bones does not depend on it, and turning the switch off does not turn the particles off. Both are on the Effects tab of the F8 menu, under Particles and glow. See Settings and controls.

Tool

In Blockbench

  1. Open torch.json and add the particles list from above next to the other keys. Keep a comma between keys.
  2. Press F3+T in the game and hold the torch. Embers rise from the flame and smoke drifts off its tip.
  3. If the particles start at your hand, the bone name does not match a bone in the geometry.

In Punchy! Studio

  1. Press 3 for Particles mode. Choose Add > Add Emitter. The emitter appears under Particles in the Outliner.
  2. In the Particles tab, set Type to minecraft:flame and Bone to flame. The panels are Emission, Timing and Triggers, Look, Space and Motion and Script, and keys you have not written show Punchy!‘s default greyed out.
  3. Set Offset to 0, 0.25, 0, Rate to 5, Life to 0.6, Size to 0.03 and End Size to 0.005. Set Spread to 0.02, 0.01, 0.02 and Velocity to 0, 0.012, 0.
  4. Choose Add > Add Emitter again for the smoke. Set Type to minecraft:smoke, Bone to flame, Offset to 0, 0.4, 0, Rate to 2, Life to 1.4, Size to 0.04, End Size to 0.08, Alpha to 0.35 and End Alpha to 0. Switch Full Bright off, and set Spread and Velocity as for the embers.
  5. The Script panel shows each emitter as it will be written. The Trigger Test panel at the bottom shows which emitters would emit now.
  6. With the live link on, hold the torch to see the particles in your hand. Press Ctrl+E to export again.

Video coming soon

Add Emitter, set Type and Bone, and watch it through the live link.

Video coming soon

Embers and smoke on the flame bone.

Because the water entry has disable_all_particles, the embers and smoke stop under water along with the flame. Particles covers triggers, bursts, glow, your own animated particle pictures and every other key.

Make the soul torch

The soul torch is the torch with a blue flame. It uses the same geometry, the same main texture, the same clips and the same entries. Only these things change:

  • items is minecraft:soul_torch.
  • The flame bone’s picture is soul_flame, painted from the same four frames with the soul colors in the table above.
  • The embers are minecraft:soul_fire_flame. The game’s own definition of that particle names the soul fire flame picture, so the embers are blue.
  • The smoke is minecraft:soul, which draws the soul wisp picture and plays its frames. It also gets its own look: rate 1, life 1.2, size 0.045, size_end 0.02 and alpha 0.7. It does not set fullbright, so the wisps keep the default and glow in the dark.
Tool

In Blockbench

  1. Paint soul_flame.png like torch_flame.png, with the soul colors, and save it in textures.
  2. Copy torch.json to soul_torch.json. Change items, the flame entry of bone_textures, and the two particle types. On the smoke emitter, also set rate to 1, life to 1.2, size to 0.045, size_end to 0.02 and alpha to 0.7, and delete its fullbright line. Take the full file from The complete files if you want to compare.
  3. Reload with F3+T and run /give @s soul_torch.

In Punchy! Studio

  1. Choose File > Open Model Part… (Ctrl+O), pick Resource Packs, select the torch definition of Torchlight and press Open. Studio copies it into a new project and never changes the pack.
  2. In the Definition tab, set Name and File Name to soul_torch and Items to minecraft:soul_torch.
  3. Select flame. Choose Image > New Image…, make a 16 by 64 image named soul_flame, and paint the four frames with the soul colors. Frames and Frame Time carry over from the torch.
  4. In Particles mode, change the two emitters’ Type to minecraft:soul_fire_flame and minecraft:soul. On the second emitter, set Rate to 1, Life to 1.2, Size to 0.045, End Size to 0.02 and Alpha to 0.7, and switch Full Bright back on.
  5. Press Ctrl+E, keep Torchlight in Pack, choose Project for Paths, and press Export.

Video coming soon

Import the torch, change four things and export.

Video coming soon

The torch and the soul torch side by side.

Build the lantern

The lantern is a second model with the same flame. It has three bones, and the middle one is the one that swings:

BoneParentPivotCubesWhat it is
handlenone0, 6, 0One bar, origin -2, 6, -0.5, size 4, 1, 1The ring you hold. It never moves.
swinghandle0, 6, 0Chain, cap, base and four postsEverything that hangs and swings
flameswing0, -5, 0Two crossing cards, origins -2, -5, 0 and 0, -5, -2, sizes 4, 6, 0 and 0, 6, 4The same flame as the torch

The swing bone has the same pivot as its parent, at the ring where you hold the lantern. That is the point it swings around, and it is the safe choice, because a bone’s physics pivot is measured from its parent’s pivot. The flame is a child of swing, so it swings with the cage, and so do its particles.

The cage is a base, a cap and four posts at the corners, with the flame in the open middle. Leaving the sides open keeps the flame in plain view.

Cube in swingOriginSize
Chain-0.5, 2, -0.51, 4, 1
Cap-3, 1, -36, 1, 6
Base-3, -6, -36, 1, 6
Posts-3, -5, -3 and 2, -5, -3 and -3, -5, 2 and 2, -5, 21, 6, 1

That is 10 cubes and 38 faces to place by hand, counting the flame cards, so the finished geometry is in The complete files. Every face of the lantern body uses the whole 16 by 16 texture. The finished file lists four sides for the handle bar, the chain and each post, and four sides plus a top for the cap and the base. Punchy! draws only the faces a cube lists. lantern.png is one flat color: fill the whole picture with #3A3A44 (58, 58, 68). The two flame cards use the rectangle 0, 0, 4, 6, as on the torch, and the flame uses torch_flame.png again.

Tool

In Blockbench

  1. Save the geometry from The complete files as lantern.geo.json in geo, and open it with File > Open Model to look at the bones.
  2. To build it yourself, follow the steps of the torch with the groups and cubes from the two tables. Set Pivot Point to 0, 6, 0 on both handle and swing, and to 0, -5, 0 on flame. Give the faces that the finished file lists on the cubes in handle and swing (the four sides of each, plus the top of the cap and the base) the rectangle 0, 0, 16, 16, and the broad faces of the two flame cards the rectangle 0, 0, 4, 6.
  3. Make a 16 by 16 texture named lantern, fill it with #3A3A44, and save it as lantern.png in textures.
  4. Save the definition from The complete files as lantern.json, reload with F3+T and run /give @s lantern.

In Punchy! Studio

  1. Choose File > New Model Part. Type lantern in Name and minecraft:lantern in Held Item, then press Create.
  2. Drop lantern.geo.json from The complete files on the game window. It replaces the model’s geometry with the bones above. To build it by hand, use Add Child Bone and Add Cube with the numbers in the tables.
  3. Select the flame bone and use Image > New Image… to add a 16 by 64 image named torch_flame, or drop a copy of your torch_flame.png on the window with flame selected.
  4. With flame still selected, in the Bone tab set Frames 4, Frame Time 3 and Glow Level 100, and tick Blur Glow and Clamp Glow in the Material tab, as for the torch. If you made a new image, press 5 for Paint mode and paint the four frames as for the torch, choosing each frame with the Frame field.
  5. Select the swing bone and, if you are not in Paint mode yet, press 5, so the image editor shows the main texture. Pick Fill, set the color to 58, 58, 68, and Shift click a light grey square and a dark grey square, because the new texture starts as a grey checker with two colors.
  6. Add the two clips and the two entries in the Animation tab, the same as for the torch. In Particles mode, add one emitter with Type minecraft:flame, Bone flame, Offset 0, 0.2, 0, Rate 4, Life 0.5, Size 0.025, End Size 0.005, Spread 0.015, 0.01, 0.015 and Velocity 0, 0.01, 0.
  7. Export with Ctrl+E into Torchlight.

Video coming soon

Drop the geometry file on the window to bring in the lantern.

The lantern definition reuses the flame keys from the torch: the flame’s picture, its animation, its glow, the two idle entries and the animation file. It has one emitter, because a lantern flame is small and stays inside the cage. It has no camera_transparent_bones, because that setting does not apply to a bone that has physics, and the flame is under the swinging bone.

Make the lantern swing

A pendulum makes a bone swing on its own when you move. Punchy! feeds it your camera turns, walking, jumping and landing. It is a damped spring that outputs two angles, and it rotates the bone around its pivot. The bone then hangs and swings by itself, and it settles back to straight.

You switch it on with bone_physics, which names the bone and its settings:

{
  "bone_physics": {
    "swing": {
      "pendulum_mode": "full",
      "limit_deg": 45,
      "force": 1,
      "motion_sens": 0.3
    }
  }
}
  • pendulum_mode is full to swing both ways, forward and back and left and right, or forward to swing only along your view. A bone needs a mode, or creature or slime feedback, for Punchy! to keep its entry. Settings alone are dropped.
  • limit_deg is the furthest it can swing, in degrees. The default is 55.
  • force scales how strongly turning your view pushes it. The default is 0.75.
  • motion_sens scales how strongly walking, jumping and landing push it. The default is 0.2.

Every bone under swing swings with it. That includes flame, and the flame particles start from the swinging flame. The settings you did not write keep their defaults: speed 16, camera_sens 0.3 and gravity 25, with gravity as the spring that pulls the bone back to hanging straight.

Tool

In Blockbench

  1. Add the bone_physics key from above to lantern.json.
  2. Reload with F3+T, hold the lantern, turn your view quickly and walk around. It swings and settles.
  3. Change one number at a time and reload. Raise limit_deg for a looser lantern. Raise force or motion_sens for a livelier one.

In Punchy! Studio

  1. Press 4 for Physics mode and select the swing bone.
  2. In the Physics tab, pick the Item Pendulum Default preset in Presets. It starts the bone with Punchy!‘s defaults, and Punchy! keeps it.
  3. In Pendulum, set Mode to Full, Limit to 45, Force to 1 and Motion Sensitivity to 0.3.
  4. Open the Physics Test Rig panel. Turn the view with Yaw and Pitch, use Walk and Jump, or drag on the stage to shake the view, while the graphs show the swing. With the live link on, hold the lantern and look at it in your own hand.

Video coming soon

A pendulum on the swing bone, tested with the Physics Test Rig.

Video coming soon

The lantern swings as you turn, walk and jump.

Make the soul lantern

The soul lantern is the lantern with three changes, the same as for the soul torch:

  • items is minecraft:soul_lantern.
  • The flame picture is soul_flame.
  • The emitter type is minecraft:soul_fire_flame.

Everything else is shared with the lantern: the geometry, lantern.png, the clips, the entries and the pendulum.

In Studio, import the lantern model part the way you imported the torch, and change the same fields. In Blockbench, copy lantern.json to soul_lantern.json and change the same keys. The full file is in The complete files.

Try it in game

  1. Turn Torchlight on under Options, then Resource Packs, and press Done. After later edits, press F3+T in a world.
  2. Run /give @s torch, then the same for soul_torch, lantern and soul_lantern. Hold each one in first person.
  3. Go to a dark place. Check that the flame glows, steps through its frames and flickers, and that embers and smoke rise from it.
  4. Swim down with each item. The flame, its glow and the particles go out as your eyes go under, and everything returns when you surface.
  5. Hold a lantern, turn your view quickly, walk and jump. The cage swings and settles, and the flame swings with it.
  6. Move one of the items to your off hand. Punchy! flips the model for the left hand, and it works the same way.

Video coming soon

The four items of the finished pack.

If a model sits too low, too far from you or at the wrong angle, add a display entry. Without it, Punchy! uses Minecraft’s own first person transform for the item. With it, you write the transform yourself and it replaces the vanilla one for that hand, so write both hands:

{
  "display": {
    "firstperson_righthand": { "rotation": [0, 0, 0], "translation": [0, 0, 0], "scale": [1, 1, 1] },
    "firstperson_lefthand": { "rotation": [0, 0, 0], "translation": [0, 0, 0], "scale": [1, 1, 1] }
  }
}

Those numbers are the neutral values, so change them one at a time. rotation is in degrees. scale multiplies the model. translation moves it in small steps: 16 units move the model by one of its own pixels, which is 1/16 of a block, so the steps are fine. In Studio, open the Display tab, switch off Use Vanilla First Person for each arm, and change the numbers in Right Arm and Left Arm while the live link shows your hand. Model part definitions has the full rules.

The complete files

Save every file under Torchlight, in the folders shown in What you will build. Studio writes the same content under its own file names.

pack.mcmeta says the pack is for Minecraft 26.3. Resource packs has the numbers for other versions.

{
  "pack": {
    "description": "Torchlight",
    "pack_format": 97,
    "min_format": 97,
    "max_format": 97
  }
}

Definitions

definitions/torch.json:

{
  "items": ["minecraft:torch"],
  "geo": "minecraft:punchy/model_parts_items/geo/torch.geo.json",
  "texture": "minecraft:punchy/model_parts_items/textures/torch",
  "bone_textures": { "flame": "minecraft:punchy/model_parts_items/textures/torch_flame" },
  "bone_texture_anim": {
    "flame": { "frames": 4, "frametime": 3 }
  },
  "bone_emission": { "flame": 100, "blur": true, "clamp": true },
  "camera_transparent_bones": ["flame"],
  "animations": ["minecraft:punchy/model_parts_items/animations/flame.animation.json"],
  "modelPartsAnimation": [
    { "type": "idle", "animation": "flame_flicker" },
    {
      "type": "idle",
      "animation": "flame_out",
      "inside_water": true,
      "disable_all_particles": true,
      "skip_blend_in": true,
      "skip_blend_out": true
    }
  ],
  "particles": [
    {
      "type": "minecraft:flame",
      "bone": "flame",
      "offset": [0, 0.25, 0],
      "rate": 5,
      "life": 0.6,
      "size": 0.03,
      "size_end": 0.005,
      "spread": [0.02, 0.01, 0.02],
      "velocity": [0, 0.012, 0]
    },
    {
      "type": "minecraft:smoke",
      "bone": "flame",
      "offset": [0, 0.4, 0],
      "rate": 2,
      "life": 1.4,
      "size": 0.04,
      "size_end": 0.08,
      "alpha": 0.35,
      "alpha_end": 0,
      "fullbright": false,
      "spread": [0.02, 0.01, 0.02],
      "velocity": [0, 0.012, 0]
    }
  ]
}

definitions/soul_torch.json:

{
  "items": ["minecraft:soul_torch"],
  "geo": "minecraft:punchy/model_parts_items/geo/torch.geo.json",
  "texture": "minecraft:punchy/model_parts_items/textures/torch",
  "bone_textures": { "flame": "minecraft:punchy/model_parts_items/textures/soul_flame" },
  "bone_texture_anim": {
    "flame": { "frames": 4, "frametime": 3 }
  },
  "bone_emission": { "flame": 100, "blur": true, "clamp": true },
  "camera_transparent_bones": ["flame"],
  "animations": ["minecraft:punchy/model_parts_items/animations/flame.animation.json"],
  "modelPartsAnimation": [
    { "type": "idle", "animation": "flame_flicker" },
    {
      "type": "idle",
      "animation": "flame_out",
      "inside_water": true,
      "disable_all_particles": true,
      "skip_blend_in": true,
      "skip_blend_out": true
    }
  ],
  "particles": [
    {
      "type": "minecraft:soul_fire_flame",
      "bone": "flame",
      "offset": [0, 0.25, 0],
      "rate": 5,
      "life": 0.6,
      "size": 0.03,
      "size_end": 0.005,
      "spread": [0.02, 0.01, 0.02],
      "velocity": [0, 0.012, 0]
    },
    {
      "type": "minecraft:soul",
      "bone": "flame",
      "offset": [0, 0.4, 0],
      "rate": 1,
      "life": 1.2,
      "size": 0.045,
      "size_end": 0.02,
      "alpha": 0.7,
      "alpha_end": 0,
      "spread": [0.02, 0.01, 0.02],
      "velocity": [0, 0.012, 0]
    }
  ]
}

definitions/lantern.json:

{
  "items": ["minecraft:lantern"],
  "geo": "minecraft:punchy/model_parts_items/geo/lantern.geo.json",
  "texture": "minecraft:punchy/model_parts_items/textures/lantern",
  "bone_textures": { "flame": "minecraft:punchy/model_parts_items/textures/torch_flame" },
  "bone_texture_anim": {
    "flame": { "frames": 4, "frametime": 3 }
  },
  "bone_emission": { "flame": 100, "blur": true, "clamp": true },
  "bone_physics": {
    "swing": { "pendulum_mode": "full", "limit_deg": 45, "force": 1, "motion_sens": 0.3 }
  },
  "animations": ["minecraft:punchy/model_parts_items/animations/flame.animation.json"],
  "modelPartsAnimation": [
    { "type": "idle", "animation": "flame_flicker" },
    {
      "type": "idle",
      "animation": "flame_out",
      "inside_water": true,
      "disable_all_particles": true,
      "skip_blend_in": true,
      "skip_blend_out": true
    }
  ],
  "particles": [
    {
      "type": "minecraft:flame",
      "bone": "flame",
      "offset": [0, 0.2, 0],
      "rate": 4,
      "life": 0.5,
      "size": 0.025,
      "size_end": 0.005,
      "spread": [0.015, 0.01, 0.015],
      "velocity": [0, 0.01, 0]
    }
  ]
}

definitions/soul_lantern.json:

{
  "items": ["minecraft:soul_lantern"],
  "geo": "minecraft:punchy/model_parts_items/geo/lantern.geo.json",
  "texture": "minecraft:punchy/model_parts_items/textures/lantern",
  "bone_textures": { "flame": "minecraft:punchy/model_parts_items/textures/soul_flame" },
  "bone_texture_anim": {
    "flame": { "frames": 4, "frametime": 3 }
  },
  "bone_emission": { "flame": 100, "blur": true, "clamp": true },
  "bone_physics": {
    "swing": { "pendulum_mode": "full", "limit_deg": 45, "force": 1, "motion_sens": 0.3 }
  },
  "animations": ["minecraft:punchy/model_parts_items/animations/flame.animation.json"],
  "modelPartsAnimation": [
    { "type": "idle", "animation": "flame_flicker" },
    {
      "type": "idle",
      "animation": "flame_out",
      "inside_water": true,
      "disable_all_particles": true,
      "skip_blend_in": true,
      "skip_blend_out": true
    }
  ],
  "particles": [
    {
      "type": "minecraft:soul_fire_flame",
      "bone": "flame",
      "offset": [0, 0.2, 0],
      "rate": 4,
      "life": 0.5,
      "size": 0.025,
      "size_end": 0.005,
      "spread": [0.015, 0.01, 0.015],
      "velocity": [0, 0.01, 0]
    }
  ]
}

Clips

animations/flame.animation.json is the file from Animate the flame and put it out under water. All four definitions use it.

Geometry

geo/torch.geo.json:

{
  "format_version": "1.12.0",
  "minecraft:geometry": [
    {
      "description": { "identifier": "geometry.torchlight_torch", "texture_width": 16, "texture_height": 16 },
      "bones": [
        {
          "name": "torch",
          "pivot": [0, 0, 0],
          "cubes": [
            {
              "origin": [-1, -5, -1],
              "size": [2, 10, 2],
              "uv": {
                "north": { "uv": [0, 0], "uv_size": [2, 10] },
                "east": { "uv": [2, 0], "uv_size": [2, 10] },
                "south": { "uv": [4, 0], "uv_size": [2, 10] },
                "west": { "uv": [6, 0], "uv_size": [2, 10] },
                "up": { "uv": [0, 10], "uv_size": [2, 2] },
                "down": { "uv": [2, 10], "uv_size": [2, 2] }
              }
            }
          ]
        },
        {
          "name": "head",
          "parent": "torch",
          "pivot": [0, 5, 0],
          "cubes": [
            {
              "origin": [-2, 5, -2],
              "size": [4, 2, 4],
              "uv": {
                "north": { "uv": [8, 0], "uv_size": [4, 2] },
                "east": { "uv": [12, 0], "uv_size": [4, 2] },
                "south": { "uv": [8, 2], "uv_size": [4, 2] },
                "west": { "uv": [12, 2], "uv_size": [4, 2] },
                "up": { "uv": [8, 4], "uv_size": [4, 4] },
                "down": { "uv": [12, 4], "uv_size": [4, 4] }
              }
            }
          ]
        },
        {
          "name": "flame",
          "parent": "head",
          "pivot": [0, 7, 0],
          "cubes": [
            {
              "origin": [-2, 7, 0],
              "size": [4, 6, 0],
              "uv": {
                "north": { "uv": [0, 0], "uv_size": [4, 6] },
                "south": { "uv": [0, 0], "uv_size": [4, 6] }
              }
            },
            {
              "origin": [0, 7, -2],
              "size": [0, 6, 4],
              "uv": {
                "east": { "uv": [0, 0], "uv_size": [4, 6] },
                "west": { "uv": [0, 0], "uv_size": [4, 6] }
              }
            }
          ]
        }
      ]
    }
  ]
}
geo/lantern.geo.json
{
  "format_version": "1.12.0",
  "minecraft:geometry": [
    {
      "description": { "identifier": "geometry.torchlight_lantern", "texture_width": 16, "texture_height": 16 },
      "bones": [
        {
          "name": "handle",
          "pivot": [0, 6, 0],
          "cubes": [
            {
              "origin": [-2, 6, -0.5],
              "size": [4, 1, 1],
              "uv": {
                "north": { "uv": [0, 0], "uv_size": [16, 16] },
                "east": { "uv": [0, 0], "uv_size": [16, 16] },
                "south": { "uv": [0, 0], "uv_size": [16, 16] },
                "west": { "uv": [0, 0], "uv_size": [16, 16] }
              }
            }
          ]
        },
        {
          "name": "swing",
          "parent": "handle",
          "pivot": [0, 6, 0],
          "cubes": [
            {
              "origin": [-0.5, 2, -0.5],
              "size": [1, 4, 1],
              "uv": {
                "north": { "uv": [0, 0], "uv_size": [16, 16] },
                "east": { "uv": [0, 0], "uv_size": [16, 16] },
                "south": { "uv": [0, 0], "uv_size": [16, 16] },
                "west": { "uv": [0, 0], "uv_size": [16, 16] }
              }
            },
            {
              "origin": [-3, 1, -3],
              "size": [6, 1, 6],
              "uv": {
                "north": { "uv": [0, 0], "uv_size": [16, 16] },
                "east": { "uv": [0, 0], "uv_size": [16, 16] },
                "south": { "uv": [0, 0], "uv_size": [16, 16] },
                "west": { "uv": [0, 0], "uv_size": [16, 16] },
                "up": { "uv": [0, 0], "uv_size": [16, 16] }
              }
            },
            {
              "origin": [-3, -6, -3],
              "size": [6, 1, 6],
              "uv": {
                "north": { "uv": [0, 0], "uv_size": [16, 16] },
                "east": { "uv": [0, 0], "uv_size": [16, 16] },
                "south": { "uv": [0, 0], "uv_size": [16, 16] },
                "west": { "uv": [0, 0], "uv_size": [16, 16] },
                "up": { "uv": [0, 0], "uv_size": [16, 16] }
              }
            },
            {
              "origin": [-3, -5, -3],
              "size": [1, 6, 1],
              "uv": {
                "north": { "uv": [0, 0], "uv_size": [16, 16] },
                "east": { "uv": [0, 0], "uv_size": [16, 16] },
                "south": { "uv": [0, 0], "uv_size": [16, 16] },
                "west": { "uv": [0, 0], "uv_size": [16, 16] }
              }
            },
            {
              "origin": [2, -5, -3],
              "size": [1, 6, 1],
              "uv": {
                "north": { "uv": [0, 0], "uv_size": [16, 16] },
                "east": { "uv": [0, 0], "uv_size": [16, 16] },
                "south": { "uv": [0, 0], "uv_size": [16, 16] },
                "west": { "uv": [0, 0], "uv_size": [16, 16] }
              }
            },
            {
              "origin": [-3, -5, 2],
              "size": [1, 6, 1],
              "uv": {
                "north": { "uv": [0, 0], "uv_size": [16, 16] },
                "east": { "uv": [0, 0], "uv_size": [16, 16] },
                "south": { "uv": [0, 0], "uv_size": [16, 16] },
                "west": { "uv": [0, 0], "uv_size": [16, 16] }
              }
            },
            {
              "origin": [2, -5, 2],
              "size": [1, 6, 1],
              "uv": {
                "north": { "uv": [0, 0], "uv_size": [16, 16] },
                "east": { "uv": [0, 0], "uv_size": [16, 16] },
                "south": { "uv": [0, 0], "uv_size": [16, 16] },
                "west": { "uv": [0, 0], "uv_size": [16, 16] }
              }
            }
          ]
        },
        {
          "name": "flame",
          "parent": "swing",
          "pivot": [0, -5, 0],
          "cubes": [
            {
              "origin": [-2, -5, 0],
              "size": [4, 6, 0],
              "uv": {
                "north": { "uv": [0, 0], "uv_size": [4, 6] },
                "south": { "uv": [0, 0], "uv_size": [4, 6] }
              }
            },
            {
              "origin": [0, -5, -2],
              "size": [0, 6, 4],
              "uv": {
                "east": { "uv": [0, 0], "uv_size": [4, 6] },
                "west": { "uv": [0, 0], "uv_size": [4, 6] }
              }
            }
          ]
        }
      ]
    }
  ]
}

Textures

FileSizeWhat is in it
torch.png16 by 16#8B5A2B at x 0 to 7, y 0 to 11, and #2E2118 at x 8 to 15, y 0 to 7
torch_flame.png16 by 64The four orange frames from Make the flame glow and move, one every 16 pixels
soul_flame.png16 by 64The same four frames in the soul colors
lantern.png16 by 16Filled with #3A3A44

The keys used on this page

Every key below is explained in full on the model parts pages. These are the ones this pack uses, with their defaults.

Keys of the definition
KeyTypeWhat it doesExample
itemsRequiredstring arrayThe items the definition covers. Item ids and # tags work, and an id without a namespace means minecraft.["minecraft:torch"]
geoRequiredresource idThe geometry file, used exactly as written: write the folders and the .geo.json ending.minecraft:punchy/model_parts_items/geo/torch.geo.json
textureRequiredresource idThe main texture. Under punchy/model_parts_items/textures/ only .png is added if it is missing.minecraft:punchy/model_parts_items/textures/torch
bone_texturesobjectA bone name and the texture it uses. A bone's children use it too, unless they have one of their own.
bone_texture_animobjectA bone name and its frames, frametime and frame_height. The bone's entry does not inherit the whole model's values, and its children do not take the animation.{ "flame": { "frames": 4, "frametime": 3 } }
bone_emissionobjectA bone name and its glow level, 0 to 100, plus the special keys blur, clamp and strength. Bone names must match exactly, and the glow does not pass to children. Do not name a bone like a special key.
camera_transparent_bonesstring arrayBones whose faces turned away from you are not drawn. Not applied to a bone that has physics.["flame"]
bone_physicsobjectA bone name and its physics: a pendulum mode, creature feedback or slime squash. A bone with none of them is dropped.
animationsresource id arrayThe item clip files, each written in full with its .animation.json ending.
modelPartsAnimationobject arrayThe entries that say which clip plays when.
particlesarrayEmitters, each written as an object, a script string or a bare particle id.
displayobjectThe transform of the model in each hand. Without it, Minecraft's own first person transform is used.
Keys of an animation entry
KeyTypeDefaultWhat it doesExample
typeRequiredstringThe moment the entry is for. idle is the clip that plays when nothing else does."idle"
animationstringThe clip to play, by name. name means the same. A name with no clip is ignored: an idle entry leaves the clip that is already playing, and an entry of another type falls back to the idle clip."flame_flicker"
inside_waterbooleanMust equal whether your eyes are under water. Scores 3, and keeps matching for a moment after you leave the water.
in_waterbooleanMust equal whether you touch water. Scores 2.
skip_blend_inbooleanfalseCuts to this clip with no blend.
skip_blend_outbooleanfalseWhen this entry is playing, cuts away from it with no blend.
disable_all_particlesbooleanfalseSilences every emitter of that hand while the entry is playing.
Keys of an item clip
KeyTypeDefaultWhat it doesExample
animation_lengthnumber0The length in seconds. Give a looping clip a length above 0.1.2
loopboolean or stringfalsetrue repeats the clip. An idle entry repeats its clip even without it, but write true on every clip that should repeat, so the file says what you mean.
bones.<bone>.scalelist or object[1, 1, 1]A multiplier on each axis. A list of three numbers is one key at time 0. An object maps times in seconds to lists.
Emitter keys used here
KeyTypeDefaultWhat it doesExample
typeparticle idminecraft:critPicks the picture the particle is drawn with. With no type the picture is the crit. A type with no picture of its own draws the flame sprite, unless its name has soul, smoke, campfire or ash in it."minecraft:flame"
bonetextThe bone the particles start at. With no match they start at your hand."flame"
offsetvector0:0:0Moves the start from the bone, in blocks.[0, 0.25, 0]
ratenumber0Releases a second, 0 to 120. With no triggers and no rate, an emitter releases once every game tick.5
countwhole number1Particles per release, 0 to 120.
lifeseconds1.1How long a particle lives, 0.05 to 60.0.6
sizenumber0.028The half width of the particle's square at the start, 0.001 to 2.0.03
size_endnumber0.006The half width at the end of its life, 0 to 2.0.005
alphanumber0.95The opacity at the start, 0 to 1.0.35
alpha_endnumber0The opacity at the end of its life.
spreadvector0:0:0A random scatter of the start, up to this far either way on each axis.[0.02, 0.01, 0.02]
velocityvector0:0:0The starting push of each particle. The examples on this page use a small push upward.[0, 0.012, 0]
fullbrightbooleantrueGives the particle full light, ignoring the light of the world, when Enable Model Parts Glow is on. Set false for a particle that follows the world's light.
Keys of a bone's pendulum
KeyTypeDefaultWhat it doesExample
pendulum_modestring or booleannonefull swings both ways and forward swings along your view. true means full. Without a mode, the bone's physics are dropped."full"
limit_degnumber55The furthest swing in degrees, up and down. limit_deg_up and limit_deg_down set each side.45
forcenumber0.75How strongly turning your view pushes it.1
speednumber16Damping of the swing.
camera_sensnumber0.3How much each turn of your view counts.
gravitynumber25The spring that pulls the bone back to hanging straight.
motion_sensnumber0.2How strongly walking, jumping and landing push it.0.3
invertbooleanfalseSwings the other way.

Things that stop it from working

Punchy! prints no message for any of these.

The vanilla item shows, or the model is missing

  • The definition was dropped. A value of the wrong kind drops the whole file: a text where a list belongs ("items": "minecraft:torch"), a list where a number belongs, or a missing comma that makes the JSON invalid. In Studio, the Lint panel in the Definition tab names the problem.
  • The geo id is wrong. It must be the whole id, with the folders and .geo.json.
  • The geometry is not Bedrock Entity format. Use per-face UV on every cube. If any cube in the file uses per-face UV, the box UV cubes of that file are not drawn.
  • The geometry file is missing or has the wrong name. The definition still claims the item, so later definitions for it are hidden and the vanilla item shows.
  • Another pack’s definition for the same item sorts first. Definitions are sorted by their full id, and the first one that matches wins. In Studio, File > Open Model Part… shows which definition is rendered and which is shadowed, and Export First in Order puts yours first.
  • A definition with a customName is in the way. It answers only items carrying that name, and while it exists for an item, no unnamed definition is used for it, so the vanilla model shows.
  • The pack is not in the Selected list of Resource Packs, or you did not reload after a change. Press F3+T.

The flame does not glow or move

  • The picture is not exactly 64 pixels tall. For a strip of 4 frames of 16 pixels, any other height switches the texture animation off, so the flame stops moving and looks squashed. frames of 1 switches it off too.
  • The bone name in bone_textures, bone_texture_anim or bone_emission does not match the geometry. Glow and texture animation look up the exact name and do not reach child bones.
  • The glow looks the same at 15 and at 100. That is expected without blur: levels above 15 add bloom only while blur is on.
  • In daylight or a lit room the glow hardly shows. Hold the torch in a dark place. With a shader pack on, Punchy! hands the glow to the shader pack, so check it with your shader pack on.

The flame does not go out under water

  • Your eyes must be under water. Standing in shallow water does not count for inside_water.
  • The clip name in the entry has a typo. Punchy! then keeps playing the clip that was already playing, so the flame stays lit.
  • A clip after a mistake in the animation file is missing. A time key that is not a number stops Punchy! reading that file at that clip, so the clips before it work and the ones after it are lost, with no message. Check the time keys of the first clip that is missing.
  • The animation file is missing or has the wrong name in animations. Then the entry has no clip to play.
  • The flame goes out but the smoke stays. The entry is missing disable_all_particles.
  • The glow stays on. A glow is drawn per bone, so the flame has to shrink or the glow stays. Check that flame_out scales the flame bone.
  • Both entries play at the wrong time. Entries with a score beat entries without one, and the file order only breaks ties.

There are no particles

  • Enable Particle System is off on the Effects tab of the F8 menu.
  • The emitter has the wrong bone, so the particles start at your hand and not at the flame.
  • The type has a typo. Punchy! then draws the flame sprite, or the crit picture when there is no type, so the particles show but look wrong.
  • In an object emitter, write the glow settings with the short names strength, blur and clamp, or write the emitter as a script string. Particles has the list.

The lantern does not swing

  • pendulum_mode is missing, so Punchy! drops that bone’s physics entry.
  • The bone name in bone_physics does not match. The flame must be a child of swing.
  • Nothing is moving. A pendulum reacts to your turning, walking, jumping and landing, so a still view looks still.
  • swing has a different pivot from handle. Give both the same pivot, at the ring.
  • The bone is listed in disable_physics_bones, in the definition or in the active entry.

Go further

  • A rain variant. Add a third idle entry with weather_detection and a clip that shrinks the flame a little. Conditions covers rain, time of day, nearby blocks and biomes.
  • A night variant. time_detection plays another clip at night, such as a brighter flame.
  • A pinned halo. A particle with lock_in_model and your own picture stays on the flame bone as a soft glow. See Particles.
  • Sparks on enchanted torches. enchantment_variants in a compat file adds emitters while the held item has certain enchantments. See Compat rules.
  • Presets. Punchy! picks one unnamed definition per item, by the sort order of the full id, so a second definition for the same item is shadowed, and a folder name only changes the sort order. Variants shows how to make presets you can switch between.
  • Left and right clips. Name a clip flame_flicker_left or flame_flicker_right and Punchy! picks it for that hand first.
  • Another item. The same pattern builds a campfire, a candle or a redstone torch: a flame bone, a glow, a strip and an emitter.

Last checked against the mod on 29 October 2026.