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.
-
Blockbench
-
Punchy! Studio
This page has not been translated into Finnish 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
/givecommand. - 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:
| Effect | What makes it | Where |
|---|---|---|
| The 3D model | A Bedrock geometry file and a texture, tied to the item by a definition | Model the torch |
| The glow | bone_ on the flame bone | Make the flame glow and move |
| The moving flame | A tall PNG of four frames and bone_ on the flame bone | Make the flame glow and move |
| The flicker | An item clip that scales the flame bone | Animate the flame and put it out under water |
| The flame going out | A second idle entry that plays while your eyes are under water | Animate the flame and put it out under water |
| The particles | Emitters on the flame bone | Add flame particles |
| The swinging lantern | bone_ with a pendulum on the swing bone | Make 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.
| Bone | Parent | Pivot | Cube origin | Cube size | What it is |
|---|---|---|---|---|---|
torch | none | 0, 0, 0 | -1, -5, -1 | 2, 10, 2 | The stick |
head | torch | 0, 5, 0 | -2, 5, -2 | 4, 2, 4 | The wrapped top |
flame | head | 0, 7, 0 | -2, 7, 0 | 4, 6, 0 | First card, facing north and south |
flame | head | 0, 7, 0 | 0, 7, -2 | 0, 6, 4 | Second 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:
| Face | Stick | Head | Flame cards |
|---|---|---|---|
| north | 0, 0, 2, 10 | 8, 0, 4, 2 | 0, 0, 4, 6 (first card) |
| east | 2, 0, 2, 10 | 12, 0, 4, 2 | 0, 0, 4, 6 (second card) |
| south | 4, 0, 2, 10 | 8, 2, 4, 2 | 0, 0, 4, 6 (first card) |
| west | 6, 0, 2, 10 | 12, 2, 4, 2 | 0, 0, 4, 6 (second card) |
| up | 0, 10, 2, 2 | 8, 4, 4, 4 | none |
| down | 2, 10, 2, 2 | 12, 4, 4, 4 | none |
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.
In Blockbench
-
Choose File > New > Bedrock Entity.
Do not pick Bedrock Legacy Model. It writes the old layout that Punchy! cannot read.
-
Choose File > Project…. Set Default UV Mode to Per-face UV and Texture Size to 16 and 16, then press Confirm.
-
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. -
Add a group named
head. Drag it ontotorchin 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. -
Add a group named
flame. Drag it ontohead, 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. -
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. -
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.
-
In the Textures panel, use Create Texture to make a 16 by 16 texture named
torch. You paint it in the next section. -
Choose File > Export > Export Bedrock Geometry and save the file as
torch.geo.json.
Video coming soon
Video coming soon
In Punchy! Studio
- 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. - Choose File > New Model Part. Type
torchin Name andminecraft:torchin Held Item, then press Create. The new model part starts with one bone and one textured cube. - Select the bone in the Outliner. In the Bone tab, type
torchin Name. Select its cube. In the Cube tab, set Origin to -1, -5, -1 and Size to 2, 10, 2. - Select the
torchbone and press Add Child Bone in the Bone Actions panel. Select the new bone, name itheadand 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. - Select
headand press Add Child Bone again. Name the new boneflameand set its Pivot to 0, 7, 0. Press Add Cube and set Origin to -2, 7, 0 and Size to 4, 6, 0. - With
flameselected, press Add Cube once more. Set Origin to 0, 7, -2 and Size to 0, 6, 4. - 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
Video coming soon
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.
| Rectangle | Color | What 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 |
In Blockbench
- Click the
torchtexture in the Textures panel, then switch to Paint mode with the mode tab at the top right. - 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#2E2118and cover x 8 to 15 and y 0 to 7. - Save the texture as
torch.png.
Video coming soon
In Punchy! Studio
- Select the
torchbone and press 5 for Paint mode. The image editor shows the main texture. - 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.
- 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
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.
In Blockbench
- In your
resourcepacksfolder, make a folder calledTorchlight. Inside it, makepack.mcmetawith the text from The complete files. - Make the folders
assets/minecraft/punchy/model_parts_items/withdefinitions,geo,texturesandanimationsinside it. - Put
torch.geo.jsoningeoandtorch.pngintextures. Save the definition above astorch.jsonindefinitions. - In the game, open Options, then Resource Packs, move
Torchlightto the right-hand list, and press Done. - Join a creative world, run
/give @s torch, hold it and switch to first person. - After every later edit, press F3+T to reload.
In Punchy! Studio
- Choose View > Live Link with Punchy (Ctrl+L). Punchy! now draws your unsaved model in your hand. Hold a torch to see it.
- Open the Definition tab. The Lint panel says Nothing to report. when Punchy! will load the definition.
- Choose File > Export Model Part… (Ctrl+E). Type
Torchlightin Pack, tick Activate the pack and play it now, and press Export.
Video coming soon
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.
| Letter | Torch color | Soul 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.
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.
- 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.
- Save it as
torch_flame.pngin thetexturesfolder. - Open
torch.jsonand add the keys from the next block. The next section explains each of them. - Press F3+T in the game and hold the torch.
Video coming soon
In Punchy! Studio
- Select the
flamebone. Choose Image > New Image…. Typetorch_flameas 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 theflamebone. - In the Bone tab, open Bone Texture Animation. Set Frames to 4 and Frame Time to 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.
- Still in the Bone tab, set Glow Level to 100 under Glow.
- Open the Material tab. Under Glow Settings, tick Blur Glow and Clamp Glow.
- In the Bone tab, open Flags and switch on Camera Transparent.
- Choose View > Show Glow to preview the glow on the stage, and look at the real thing through the live link.
Video coming soon
Video coming soon
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_texturesgives theflamebone its own picture. Every other bone keeps the main texture.bone_texture_animplays that picture as four frames.frametimecounts 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 exactlyframestimes 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_emissiondraws theflamebone 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.bluradds a soft, slightly larger copy for the bloom, and it also makes the glow read the picture smoothly.clampkeeps 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_boneshides 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
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_flickerloops and scales the flame by a few percent. It is the normal idle.flame_outloops 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: truematches while your eyes are under water. It keeps matching for a very short moment after you come up.disable_all_particlesclears every emitter of that hand while the entry is playing. This is what stops the smoke under water.skip_blend_inandskip_blend_outmake 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. Withskip_blend_inthe blend into the clip is 0 seconds. A cut looks like a flame being snuffed out and relit.
In Blockbench
- With the torch project open, press Animate, the mode tab at the top right. If you closed it, open
torch.geo.jsonwith File > Open Model first. - In the Animations panel, press Add Animation. Type
flame_flickerin Name, set Loop Mode to Loop, and press Confirm. Set Animation Length to 1.2. - Select
flamein 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). - 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. - Choose Animation > Export Animations…, tick both animations in Select Animations to Export, press Confirm, and save the file as
flame.animation.jsoninanimations. - Add the
animationsandmodelPartsAnimationkeys from above totorch.json, and press F3+T in the game.
Video coming soon
In Punchy! Studio
- Open the Animation tab in the Properties column and press Add Clip. In the Item Clip panel, type
flame_flickerin Name and1.2in Length, and choose Loop on the Loop row. - Select the
flamebone 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. - Press Add Clip again. Name it
flame_out, set Length to1and choose Loop. Key theflamebone’s Scale at 0 with 0.001 on all three axes. - Press Add Entry. Set Type to
idleand Clip toflame_flicker. - Press Add Entry again. Set Type to
idleand Clip toflame_out. Set Under Water to Yes, and switch on No Particles, Skip Blend In and Skip Blend Out. - Open the Environment tab. Under Weather and Water, set Eyes in Water to yes. What Reacts Now says that
idleplaysflame_out, and the live link shows the flame go out in your hand. Set it back when you are done.
Video coming soon
Video coming soon
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
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:
typepicks the picture. Punchy! does not spawn the game’s particle. It draws its own square with the picture that the type uses, sominecraft:flamedraws the flame sprite. With notypeat all you get the crit picture, and a type with no picture of its own draws the flame sprite.boneis where the particles start: the pivot of that bone. If the name does not match a bone, they start at your hand instead.offsetmoves the start from the bone, in blocks. 0.25 blocks is 4 pixels, which puts the embers near the top of the flame.rateis how many times a second the emitter releases. With no triggers, an emitter runs all the time. Each release makes one particle, sincecountis 1 by default.lifeis how long a particle lives, in seconds.sizeis the starting half width of its square andsize_endis the size at the end of its life, so the embers shrink as they rise.spreadscatters the starting point a little, andvelocitygives 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.
In Blockbench
- Open
torch.jsonand add theparticleslist from above next to the other keys. Keep a comma between keys. - Press F3+T in the game and hold the torch. Embers rise from the flame and smoke drifts off its tip.
- If the particles start at your hand, the
bonename does not match a bone in the geometry.
In Punchy! Studio
- Press 3 for Particles mode. Choose Add > Add Emitter. The emitter appears under Particles in the Outliner.
- In the Particles tab, set Type to
minecraft:flameand Bone toflame. 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. - 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.
- Choose Add > Add Emitter again for the smoke. Set Type to
minecraft:smoke, Bone toflame, 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. - The Script panel shows each emitter as it will be written. The Trigger Test panel at the bottom shows which emitters would emit now.
- With the live link on, hold the torch to see the particles in your hand. Press Ctrl+E to export again.
Video coming soon
Video coming soon
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:
itemsisminecraft:soul_torch.- The
flamebone’s picture issoul_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:rate1,life1.2,size0.045,size_end0.02 andalpha0.7. It does not setfullbright, so the wisps keep the default and glow in the dark.
In Blockbench
- Paint
soul_flame.pngliketorch_flame.png, with the soul colors, and save it intextures. - Copy
torch.jsontosoul_torch.json. Changeitems, theflameentry ofbone_textures, and the two particle types. On the smoke emitter, also setrateto 1,lifeto 1.2,sizeto 0.045,size_endto 0.02 andalphato 0.7, and delete itsfullbrightline. Take the full file from The complete files if you want to compare. - Reload with F3+T and run
/give @s soul_torch.
In Punchy! Studio
- Choose File > Open Model Part… (Ctrl+O), pick Resource Packs, select the
torchdefinition ofTorchlightand press Open. Studio copies it into a new project and never changes the pack. - In the Definition tab, set Name and File Name to
soul_torchand Items tominecraft:soul_torch. - Select
flame. Choose Image > New Image…, make a 16 by 64 image namedsoul_flame, and paint the four frames with the soul colors. Frames and Frame Time carry over from the torch. - In Particles mode, change the two emitters’ Type to
minecraft:soul_fire_flameandminecraft: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. - Press Ctrl+E, keep
Torchlightin Pack, choose Project for Paths, and press Export.
Video coming soon
Video coming soon
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:
| Bone | Parent | Pivot | Cubes | What it is |
|---|---|---|---|---|
handle | none | 0, 6, 0 | One bar, origin -2, 6, -0.5, size 4, 1, 1 | The ring you hold. It never moves. |
swing | handle | 0, 6, 0 | Chain, cap, base and four posts | Everything that hangs and swings |
flame | swing | 0, -5, 0 | Two crossing cards, origins -2, -5, 0 and 0, -5, -2, sizes 4, 6, 0 and 0, 6, 4 | The 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 swing | Origin | Size |
|---|---|---|
| Chain | -0.5, 2, -0.5 | 1, 4, 1 |
| Cap | -3, 1, -3 | 6, 1, 6 |
| Base | -3, -6, -3 | 6, 1, 6 |
| Posts | -3, -5, -3 and 2, -5, -3 and -3, -5, 2 and 2, -5, 2 | 1, 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.
In Blockbench
- Save the geometry from The complete files as
lantern.geo.jsoningeo, and open it with File > Open Model to look at the bones. - 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
handleandswing, and to 0, -5, 0 onflame. Give the faces that the finished file lists on the cubes inhandleandswing(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. - Make a 16 by 16 texture named
lantern, fill it with#3A3A44, and save it aslantern.pngintextures. - Save the definition from The complete files as
lantern.json, reload with F3+T and run/give @s lantern.
In Punchy! Studio
- Choose File > New Model Part. Type
lanternin Name andminecraft:lanternin Held Item, then press Create. - Drop
lantern.geo.jsonfrom 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. - Select the
flamebone and use Image > New Image… to add a 16 by 64 image namedtorch_flame, or drop a copy of yourtorch_flame.pngon the window withflameselected. - With
flamestill 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. - Select the
swingbone 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. - 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, Boneflame, 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. - Export with Ctrl+E into
Torchlight.
Video coming soon
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_modeisfullto swing both ways, forward and back and left and right, orforwardto 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_degis the furthest it can swing, in degrees. The default is 55.forcescales how strongly turning your view pushes it. The default is 0.75.motion_sensscales 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.
In Blockbench
- Add the
bone_physicskey from above tolantern.json. - Reload with F3+T, hold the lantern, turn your view quickly and walk around. It swings and settles.
- Change one number at a time and reload. Raise
limit_degfor a looser lantern. Raiseforceormotion_sensfor a livelier one.
In Punchy! Studio
- Press 4 for Physics mode and select the
swingbone. - In the Physics tab, pick the Item Pendulum Default preset in Presets. It starts the bone with Punchy!‘s defaults, and Punchy! keeps it.
- In Pendulum, set Mode to Full, Limit to 45, Force to 1 and Motion Sensitivity to 0.3.
- 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
Video coming soon
Make the soul lantern
The soul lantern is the lantern with three changes, the same as for the soul torch:
itemsisminecraft:soul_lantern.- The
flamepicture issoul_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
- Turn
Torchlighton under Options, then Resource Packs, and press Done. After later edits, press F3+T in a world. - Run
/give @s torch, then the same forsoul_torch,lanternandsoul_lantern. Hold each one in first person. - Go to a dark place. Check that the flame glows, steps through its frames and flickers, and that embers and smoke rise from it.
- 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.
- Hold a lantern, turn your view quickly, walk and jump. The cage swings and settles, and the flame swings with it.
- 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
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
| File | Size | What is in it |
|---|---|---|
torch.png | 16 by 16 | #8B5A2B at x 0 to 7, y 0 to 11, and #2E2118 at x 8 to 15, y 0 to 7 |
torch_ | 16 by 64 | The four orange frames from Make the flame glow and move, one every 16 pixels |
soul_ | 16 by 64 | The same four frames in the soul colors |
lantern.png | 16 by 16 | Filled 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.
| Key | Type | What it does | Example |
|---|---|---|---|
itemsRequired | string array | The items the definition covers. Item ids and # tags work, and an id without a namespace means minecraft. | ["minecraft: |
geoRequired | resource id | The geometry file, used exactly as written: write the folders and the .geo.json ending. | minecraft: |
textureRequired | resource id | The main texture. Under punchy/ only .png is added if it is missing. | minecraft: |
bone_ | object | A bone name and the texture it uses. A bone's children use it too, unless they have one of their own. | |
bone_ | object | A bone name and its frames, frametime and frame_. 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_ | object | A 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_ | string array | Bones whose faces turned away from you are not drawn. Not applied to a bone that has physics. | ["flame"] |
bone_ | object | A bone name and its physics: a pendulum mode, creature feedback or slime squash. A bone with none of them is dropped. | |
animations | resource id array | The item clip files, each written in full with its . ending. | |
model | object array | The entries that say which clip plays when. | |
particles | array | Emitters, each written as an object, a script string or a bare particle id. | |
display | object | The transform of the model in each hand. Without it, Minecraft's own first person transform is used. |
| Key | Type | Default | What it does | Example |
|---|---|---|---|---|
typeRequired | string | The moment the entry is for. idle is the clip that plays when nothing else does. | "idle" | |
animation | string | The 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_ | |
inside_ | boolean | Must equal whether your eyes are under water. Scores 3, and keeps matching for a moment after you leave the water. | ||
in_water | boolean | Must equal whether you touch water. Scores 2. | ||
skip_ | boolean | false | Cuts to this clip with no blend. | |
skip_ | boolean | false | When this entry is playing, cuts away from it with no blend. | |
disable_ | boolean | false | Silences every emitter of that hand while the entry is playing. |
| Key | Type | Default | What it does | Example |
|---|---|---|---|---|
animation_ | number | 0 | The length in seconds. Give a looping clip a length above 0. | 1.2 |
loop | boolean or string | false | true 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. | list 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. |
| Key | Type | Default | What it does | Example |
|---|---|---|---|---|
type | particle id | minecraft: | Picks 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: |
bone | text | The bone the particles start at. With no match they start at your hand. | "flame" | |
offset | vector | 0:0:0 | Moves the start from the bone, in blocks. | [0, 0.25, 0] |
rate | number | 0 | Releases a second, 0 to 120. With no triggers and no rate, an emitter releases once every game tick. | 5 |
count | whole number | 1 | Particles per release, 0 to 120. | |
life | seconds | 1.1 | How long a particle lives, 0.05 to 60. | 0.6 |
size | number | 0.028 | The half width of the particle's square at the start, 0.001 to 2. | 0.03 |
size_end | number | 0.006 | The half width at the end of its life, 0 to 2. | 0.005 |
alpha | number | 0.95 | The opacity at the start, 0 to 1. | 0.35 |
alpha_end | number | 0 | The opacity at the end of its life. | |
spread | vector | 0:0:0 | A random scatter of the start, up to this far either way on each axis. | [0.02, 0.01, 0.02] |
velocity | vector | 0:0:0 | The starting push of each particle. The examples on this page use a small push upward. | [0, 0.012, 0] |
fullbright | boolean | true | Gives 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. |
| Key | Type | Default | What it does | Example |
|---|---|---|---|---|
pendulum_ | string or boolean | none | full swings both ways and forward swings along your view. true means full. Without a mode, the bone's physics are dropped. | "full" |
limit_deg | number | 55 | The furthest swing in degrees, up and down. limit_ and limit_ set each side. | 45 |
force | number | 0.75 | How strongly turning your view pushes it. | 1 |
speed | number | 16 | Damping of the swing. | |
camera_ | number | 0.3 | How much each turn of your view counts. | |
gravity | number | 25 | The spring that pulls the bone back to hanging straight. | |
motion_ | number | 0.2 | How strongly walking, jumping and landing push it. | 0.3 |
invert | boolean | false | Swings 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
geoid 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
customNameis 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.
framesof 1 switches it off too. - The bone name in
bone_textures,bone_texture_animorbone_emissiondoes 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 whilebluris 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_outscales theflamebone. - 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
typehas a typo. Punchy! then draws the flame sprite, or the crit picture when there is notype, so the particles show but look wrong. - In an object emitter, write the glow settings with the short names
strength,blurandclamp, or write the emitter as a script string. Particles has the list.
The lantern does not swing
pendulum_modeis missing, so Punchy! drops that bone’s physics entry.- The bone name in
bone_physicsdoes not match. The flame must be a child ofswing. - Nothing is moving. A pendulum reacts to your turning, walking, jumping and landing, so a still view looks still.
swinghas a different pivot fromhandle. 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
idleentry withweather_detectionand a clip that shrinks the flame a little. Conditions covers rain, time of day, nearby blocks and biomes. - A night variant.
time_detectionplays another clip at night, such as a brighter flame. - A pinned halo. A particle with
lock_in_modeland your own picture stays on the flame bone as a soft glow. See Particles. - Sparks on enchanted torches.
enchantment_variantsin 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_leftorflame_flicker_rightand 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.
Related pages
- Model parts: the overview of how a definition, its files and its extras fit together.
- Model part definitions: the fields that match items, set
displayand link clips. - Geometry and textures: the geometry file, UV, bone textures, animated textures and glow.
- Item clips: animate the bones of a model part, with idle variants.
- Conditions: water, rain, time of day, blocks and biomes.
- Particles: every emitter key, triggers and your own particle pictures.
- Item physics: pendulums on the whole held item.
- Recreate a 3D bucket pack: the same techniques on buckets.
- Punchy! Studio: the Model workspace, with its live link, painting and export.
- Resource packs: where each file goes and what wins when packs disagree.
Last checked against the mod on 29 October 2026.