- Set Up Two Geometries
In your entity.json, define two geometries:
"geo.local_model" – The bunny model (no held item expected)
"geo.dummy_model" – A hidden version with correct item bone (vanilla-based, invisible body but working hand bone)
- Conditionally Switch Based on
query.is_local_player
In your animations or geometry file:
"geometry": "query.is_local_player ? 'geo.local_model' : 'geo.dummy_model'"
BUT... Minecraft doesn’t actually allow query.is_local_player in geometry selectors, so instead:
🔁 Use Two Render Controllers:
In render_controllers.json:
"controller.render.custom_player": {
"geometry": "controller.geoswitch",
"materials": [ "material.default" ],
"textures": {
"*": "textures/entity/bunny"
}
}
In the component groups or animation controllers, use this logic:
"animation_controllers": {
"controller.player_mode_switch": {
"states": {
"default": {
"transitions": [
{
"is_local": "query.is_local_player"
}
]
},
"is_local": {
"on_entry": ["/geometry geo.local_model"]
},
"not_local": {
"on_entry": ["/geometry geo.dummy_model"]
}
}
}
}
- Hide the Dummy Model
In geo.dummy_model:
- Set all bones to size 0 or hidden
- Keep only the "right_arm" bone with correct transforms
- Minecraft will render the item at this bone's position
- Fake a Held Item
If your visual model needs the item to appear in a different hand pose, you can:
- Add a bone to your
geo.local_model named hand_item
- Attach a custom model of a pickaxe in your resource pack to that bone
- Sync its animation with the actual held item (just for show)