Bedrock Wiki
  • Discord
  • Contribute
  • bedrock.dev
  • MS Learn
Beginner's Guide
  • Guide
    • 1. Introduction
      guide
    • 2. Add-Ons Explained
    • 3. Software & Preparation
    • 4. Project Setup
    • 5. Create a Custom Item
    • 6. Create a Custom Entity
    • 7. Blockbench: Modeling, Texturing & Animating
    • 8. Adding a Loot Table, Spawn Rule & Crafting Recipe
  • Extra
    • a. Understanding JSON
    • b. Download Example Packs
    • c. Troubleshooting
      help
    • d. Advanced Manifest
    • e. Format Versions
    • f. Project Setup Android
Animation Controllers
  • Intro to Animation Controllers
    guide
  • Entity Commands
  • AFK Detector
  • Death Commands
  • Molang into Scoreboard
  • Respawn Commands
Blocks
  • General
    • Intro to Blocks
      guide
    • Block Components
    • Block Tags
    • Block States
    • Block Traits
    • Block Permutations
    • Block Events
      Scripts
    • Block Event Migration
      help
    • Blocks as Items
    • Troubleshooting Blocks
      help
  • Visuals
    • Block Culling
    • Block Models
      guide
    • Block Texture Animation
    • Block Texture Variation
    • Block Tinting
  • Tutorials
    • Applying Constant Effects
      Scripts
    • Avoiding State Limit
    • Fake Blocks
    • Ore Loot Tables
      Scripts
    • Precise Interaction
      Scripts
    • Precise Rotation
      Scripts
    • Rotatable Blocks
  • Vanilla Re-Creations
    • Custom Crops
      Scripts
    • Custom Glass
    • Custom Glazed Terracotta
    • Custom Trapdoors
      Scripts
  • Documentation
    • Block Format History
    • Block Shapes
    • Block Sounds
    • Vanilla Block Models
Commands
  • General
    • Intro to Command Blocks
    • Functions
    • Block States
    • Coordinate System
    • NBT Commands
    • Scoreboard Operations
    • Understanding Selectors
  • Commands
    • Damage
    • Execute
    • Playanimation
    • Playsound
  • On Event Systems
    • On Player First Join
    • On Player Join
    • On Player Leave
    • On Player Death
    • On Player Respawn
    • On First World Load
  • Scoreboard Systems
    • Entity Counter
    • Scoreboard Timers
    • Comparing And Retrieving Scores
  • Techniques
    • Execute Logic Gates
    • MBE - Max's Block Entity
    • FMBE - A New Way to Create Display Entities
    • Look Detection
    • Movement Detections
    • Orbital Camera
  • Useful Creations
    • Custom Crafter
    • Multiplayer Position Rearrangement
      function
Concepts
  • contents.json
  • Emojis & Symbols
  • Molang
  • Namespaces
  • Overwriting Assets
  • Raw Text
  • Shaders
  • Sounds
  • Subpacks
  • Text and Localization
  • Texture Atlases
  • textures_list.json
Documentation
  • Shared Constructs
  • Advanced Molang
  • File Types
  • Fog IDs
  • Material Configuration Description
  • Menu Categories
  • Molang Queries
  • Pack Folder Structure
  • Sound Definitions
  • Vanilla Materials
Entities
  • General
    • Intro to Entities BP
      guide
    • Intro to Entities RP
      guide
    • Troubleshooting Entities
      help
    • Entity Events
    • Entity Properties
    • NPC Dialogues
    • Render Controllers
    • Spawn Rules
  • Tutorials
    • Convert Points Between Any Space (World, Entity, Bones)
    • Creating Boats
    • Detecting Other Entities
    • Disabling Team Damage
    • Dummy Entities
    • Entity Attacks
    • Entity Holds Item
    • Entity Movement
    • Entity Timers
    • Flying Entities
    • Introduction to AOE Clouds
    • Invulnerable Entities
    • Look at Entity
    • Sleeping Entities
    • Solid Entities
    • Spawning Tamed Entities
      Scripts
    • Village Mechanic
  • Documentation
    • Dummy Components
    • Non-Mob Runtime Identifiers
    • Projectiles
    • Runtime Identifiers
    • Vanilla Usage Components
    • Vanilla Usage Spawn Rules
Items
  • General
    • Intro to Items
      guide
    • Item Components
    • Item Tags
    • Item Events
      Scripts
    • Item Event Migration
      help
    • Troubleshooting Items
      help
  • Tutorials
    • Custom Armor
    • Custom Food
      Scripts
    • Custom Pottery Sherds
    • Custom Weapons
    • Equipment-Based Commands
    • High Resolution Items
    • Spawning Items
    • Throwable Items
  • Documentation
    • Enchantments
    • Attachables
    • Item Format History
    • Numerical Item IDs
    • Vanilla Item Identifiers
    • Vanilla Usage Components
JSON UI
  • General
    • Intro to JSON UI
      guide
    • Best Practices
      guide
  • Tutorials
    • Adding HUD Elements
    • Aseprite Animations
    • Buttons and Toggles
    • Modifying Server Forms
    • Preserve Title Texts
    • String to Number
  • Documentation
    • JSON UI Documentation
Loot, Recipes & Trading
  • General
    • Trading Behavior
  • Documentation
    • Loot Tables
    • Trade Tables
    • Recipes
    • Item Functions
  • Tutorials
    • Randomized Structure Loot
Meta
  • Add-On Performance
  • Style Guide
  • Useful Links
  • Using Schemas
  • Version Control
  • Q&A
    • Blocks and Items Q&A 2024/08/30
    • Deferred Technical Preview Q&A 2024/02/23
    • GameTest Q&A 2021/08/06
    • Scripting and Editor Q&A 2023/09/22
    • World Generation Q&A 2024/11/15
NBT
  • General
    • .mcstructure
  • Tutorials
    • Experiments in Education Edition
    • Extending Structure Limits
  • NBT in Depth
    • About NBT (Named Binary Tag)
    • NBT Libraries
    • Reading NBT Example
Particles
  • General
    • Intro to Particles
      guide
  • Tutorials
    • Disabling Particles
  • Documentation
    • Vanilla Particles
Scripting
  • General
    • Intro to Scripting
    • What is Script API?
    • API Modules
  • Tutorials
    • Block Placement Prevention
    • GameTests
    • Script Core Features
    • Script Forms
    • Script Requests API
    • Simple Chat Commands
  • Documentation
    • Engine Environment
    • Script Resources
    • Script Watchdog
    • Troubleshooting JavaScript
    • TypeScript
Servers
  • Software
    • Bedrock Server Software
  • Protocols
    • Bedrock Protocol
    • NetherNet Protocol
    • RakNet Protocol
Visuals
  • General
    • Introduction to Entity Visuals
      guide
    • Bedrock Modeling
    • Custom Death Animations
    • Effects in Animations
    • Material Creations
    • Materials
    • Math-Based Animations
    • Skin Packs
  • Tutorials
    • Entity Texture Animation
    • Glowing Entity Texture
    • Hurt Animations
    • Leash Position
    • Player Geometry
    • Remove Entity Shadows
    • Retexturing Spawn Eggs
  • Ideas
    • Structure Presentation
World Generation
  • General
    • Intro to World Generation
      guide
    • Biomes
      guide
    • Feature Types
  • Tutorials
    • Block Conditions for Features
    • Generating Custom Ores
    • Generating Custom Structures
    • Generating Patches
    • Heightmap Noise
  • Documentation
    • Biome Tags

Precise Rotation

expert
scripting
Precise Rotation
  • Block Model
  • Initial Block JSON
  • Block States
  • Initial Script
  • Rotation Calculation
  • Setting Rotation
  • Rotation Permutations
  • Rotation Bone Visibility
  • Collision/Selection Boxes
  • Final Block JSON & Script
  • Result
  • Download Example Pack

FORMAT & MIN ENGINE VERSION 1.21.70

This tutorial assumes an advanced understanding of blocks and scripting. Check out the blocks guide before starting.

This tutorial guides you through making a block with sub-cardinal rotation (e.g. creeper heads and signs), providing examples of a "shell" block with this rotation type.

Looking for regular rotation? Learn about it here!

Custom shell blocks oriented randomly

Features:

  • Can be placed on the top of blocks, with 16 possible rotations
  • Can be placed on the side faces of blocks (north, east, south & west)
  • Rotation behaves the same as vanilla mob heads - without the performance hit from block entities!

Block Model ​

To allow for more precise rotation, your block's model will need a few extra bones.

There are 4 bones required for precise ground rotation, each with different Y axis rotations:

  • up_0 (Y rotation = 0)
  • up_22_5 (Y rotation = 22.5)
  • up_45 (Y rotation = 45)
  • up_67_5 (Y rotation = 67.5)

These rotations are in a clockwise direction.

The bones will likely be duplicates of each other, excluding rotation change.

TIP

Keep your bones' pivots set to [0, 0, 0] so that their rotation is around the middle of the block.

In addition, a side bone will be necessary for placement on side faces.

The following model for a "shell" block can be used as a reference:

Shell Example Model
RP/models/blocks/shell.geo.json
json
{
    "format_version": "1.21.70",
    "minecraft:geometry": [
        {
            "description": {
                "identifier": "geometry.shell",
                "texture_width": 16,
                "texture_height": 16
            },
            "bones": [
                {
                    "name": "shell",
                    "pivot": [0, 0, 0]
                },
                {
                    "name": "up_0",
                    "parent": "shell",
                    "pivot": [0, 0, 0],
                    "cubes": [
                        {
                            "origin": [-3, 0, -3],
                            "size": [6, 3, 6],
                            "uv": {
                                "north": { "uv": [0, 6], "uv_size": [6, 3] },
                                "east": { "uv": [0, 6], "uv_size": [6, 3] },
                                "south": { "uv": [0, 6], "uv_size": [6, 3] },
                                "west": { "uv": [0, 6], "uv_size": [6, 3] },
                                "up": { "uv": [6, 6], "uv_size": [-6, -6] },
                                "down": { "uv": [6, 6], "uv_size": [-6, -6] }
                            }
                        }
                    ]
                },
                {
                    "name": "up_22_5",
                    "parent": "shell",
                    "pivot": [0, 0, 0],
                    "rotation": [0, 22.5, 0],
                    "cubes": [
                        {
                            "origin": [-3, 0, -3],
                            "size": [6, 3, 6],
                            "uv": {
                                "north": { "uv": [0, 6], "uv_size": [6, 3] },
                                "east": { "uv": [0, 6], "uv_size": [6, 3] },
                                "south": { "uv": [0, 6], "uv_size": [6, 3] },
                                "west": { "uv": [0, 6], "uv_size": [6, 3] },
                                "up": { "uv": [6, 6], "uv_size": [-6, -6] },
                                "down": { "uv": [6, 6], "uv_size": [-6, -6] }
                            }
                        }
                    ]
                },
                {
                    "name": "up_45",
                    "parent": "shell",
                    "pivot": [0, 0, 0],
                    "rotation": [0, 45, 0],
                    "cubes": [
                        {
                            "origin": [-3, 0, -3],
                            "size": [6, 3, 6],
                            "uv": {
                                "north": { "uv": [0, 6], "uv_size": [6, 3] },
                                "east": { "uv": [0, 6], "uv_size": [6, 3] },
                                "south": { "uv": [0, 6], "uv_size": [6, 3] },
                                "west": { "uv": [0, 6], "uv_size": [6, 3] },
                                "up": { "uv": [6, 6], "uv_size": [-6, -6] },
                                "down": { "uv": [6, 6], "uv_size": [-6, -6] }
                            }
                        }
                    ]
                },
                {
                    "name": "up_67_5",
                    "parent": "shell",
                    "pivot": [0, 0, 0],
                    "rotation": [0, 67.5, 0],
                    "cubes": [
                        {
                            "origin": [-3, 0, -3],
                            "size": [6, 3, 6],
                            "uv": {
                                "north": { "uv": [0, 6], "uv_size": [6, 3] },
                                "east": { "uv": [0, 6], "uv_size": [6, 3] },
                                "south": { "uv": [0, 6], "uv_size": [6, 3] },
                                "west": { "uv": [0, 6], "uv_size": [6, 3] },
                                "up": { "uv": [6, 6], "uv_size": [-6, -6] },
                                "down": { "uv": [6, 6], "uv_size": [-6, -6] }
                            }
                        }
                    ]
                },
                {
                    "name": "side",
                    "parent": "shell",
                    "pivot": [0, 5, 8],
                    "rotation": [90, 0, 0],
                    "cubes": [
                        {
                            "origin": [-3, 5, 8],
                            "size": [6, 3, 6],
                            "uv": {
                                "north": { "uv": [0, 6], "uv_size": [6, 3] },
                                "east": { "uv": [0, 6], "uv_size": [6, 3] },
                                "south": { "uv": [0, 6], "uv_size": [6, 3] },
                                "west": { "uv": [0, 6], "uv_size": [6, 3] },
                                "up": { "uv": [6, 6], "uv_size": [-6, -6] },
                                "down": { "uv": [6, 6], "uv_size": [-6, -6] }
                            }
                        }
                    ]
                }
            ]
        }
    ]
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117

Initial Block JSON ​

Below is the base "shell" block we will be adding advanced rotation to.

BP/blocks/shell.json
json
{
    "format_version": "1.21.70",
    "minecraft:block": {
        "description": {
            "identifier": "wiki:shell",
            "menu_category": {
                "category": "nature"
            }
        },
        "components": {
            // `up` face collision/selection boxes
            "minecraft:collision_box": {
                "origin": [-3, 0, -3],
                "size": [6, 3, 6]
            },
            "minecraft:selection_box": {
                "origin": [-3, 0, -3],
                "size": [6, 3, 6]
            },
            "minecraft:material_instances": {
                "*": {
                    "texture": "wiki:shell" // Shortname defined in `RP/textures/terrain_texture.json`
                }
            },
            // Prevent block from being placed on `down` face
            "minecraft:placement_filter": {
                "conditions": [
                    {
                        "allowed_faces": ["up", "side"]
                    }
                ]
            }
        }
    }
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35

Block States ​

For head-like rotation, you need to add 2 states to your block:

minecraft:block
json
"description": {
    ...
    "traits": {
        // Face block is placed on - default is `down` (which won't be accessible through placement)
        "minecraft:placement_position": {
            "enabled_states": ["minecraft:block_face"]
        }
    },
    "states": {
        // Precise rotation of block when placed on `up` face
        "wiki:rotation": {
            "values": { "min": 0, "max": 15 } // An alternative state value format to define larger integer ranges easily
        }
    }
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15

Initial Script ​

Before we start writing our script, make sure you have it linked to your pack manifest by importing it into your entry file.

BP/scripts/main.js
js
import "./shell.js";
1

Now, in our shell.js file, we need to import the world object from @minecraft/server:

BP/scripts/shell.js
js
import { world } from "@minecraft/server";
1

Rotation Calculation ​

Rather than manually typing bounds for each wiki:rotation value, you can use some division and rounding to return the values desired!

Add the following function to your script:

BP/scripts/shell.js
js
/** @param {number} playerYRotation */
function getPreciseRotation(playerYRotation) {
    // Transform player's head Y rotation to a positive
    if (playerYRotation < 0) playerYRotation += 360;
    // How many 16ths of 360 is the head rotation? - rounded
    const rotation = Math.round(playerYRotation / 22.5);

    // 0 and 16 represent duplicate rotations (0 degrees and 360 degrees), so 0 is returned if the value of `rotation` is 16
    return rotation !== 16 ? rotation : 0;
}
1
2
3
4
5
6
7
8
9
10

Setting Rotation ​

Time to use this function to set the block state you have added!

We will update our block state before the block is placed by using custom components and, more specifically, the beforeOnPlayerPlace hook. This means that, in our event handler, we have access to the player's rotation.

Add the following to your script to register a custom wiki:shell_rotation component:

TIP

Think of a unique custom component identifier. There can't be duplicate custom components between packs!

BP/scripts/shell.js
js
/** @type {import("@minecraft/server").BlockCustomComponent} */
const BlockShellRotationComponent = {
    beforeOnPlayerPlace(event) {
        const { player } = event;
        if (!player) return; // Exit if the player is undefined

        const blockFace = event.permutationToPlace.getState("minecraft:block_face");
        if (blockFace !== "up") return; // Exit if the block hasn't been placed on the top of another block

        // Get the rotation using the function from earlier
        const playerYRotation = player.getRotation().y;
        const rotation = getPreciseRotation(playerYRotation);

        // Tell Minecraft to place the correct `wiki:rotation` value
        event.permutationToPlace = event.permutationToPlace.withState("wiki:rotation", rotation);
    },
};

world.beforeEvents.worldInitialize.subscribe(({ blockComponentRegistry }) => {
    blockComponentRegistry.registerCustomComponent(
        "wiki:shell_rotation",
        BlockShellRotationComponent
    );
});
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24

Now you can apply this custom component to your block!

minecraft:block
json
"components": {
    ...
    "minecraft:custom_components": ["wiki:shell_rotation"]
}
1
2
3
4

Rotation Permutations ​

Then, use permutations to define the base cardinal rotations which will be expanded by the precise bones in our model.

Insert the following permutations into your block JSON (in the presented order):

minecraft:block
json
"permutations": [
  {
    "condition": "q.block_state('wiki:rotation') >= 4 || q.block_state('minecraft:block_face') == 'east'",
    "components": {
      "minecraft:transformation": { "rotation": [0, -90, 0] }
    }
  },
  {
    "condition": "q.block_state('wiki:rotation') >= 8 || q.block_state('minecraft:block_face') == 'south'",
    "components": {
      "minecraft:transformation": { "rotation": [0, 180, 0] }
    }
  },
  {
    "condition": "q.block_state('wiki:rotation') >= 12 || q.block_state('minecraft:block_face') == 'west'",
    "components": {
      "minecraft:transformation": { "rotation": [0, 90, 0] }
    }
  }
]
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20

Rotation Bone Visibility ​

Not all bones in your model should be visible, so we make use of the bone visibility minecraft:geometry property to ensure that only the required bones are rendered. The reason behind having multiple bones is that minecraft:transformation only supports multiples of 90 degrees, while precise rotation requires 22.5 degree steps.

Add the following component to your block:

minecraft:block > components
json
"minecraft:geometry": {
    "identifier": "geometry.shell", // Model created in first step
    "bone_visibility": {
        "up_0": "q.block_state('minecraft:block_face') == 'up' && math.mod(q.block_state('wiki:rotation'), 4) == 0",
        "up_22_5": "q.block_state('minecraft:block_face') == 'up' && math.mod(q.block_state('wiki:rotation'), 4) == 1",
        "up_45": "q.block_state('minecraft:block_face') == 'up' && math.mod(q.block_state('wiki:rotation'), 4) == 2",
        "up_67_5": "q.block_state('minecraft:block_face') == 'up' && math.mod(q.block_state('wiki:rotation'), 4) == 3",
        "side": "q.block_state('minecraft:block_face') != 'up'"
    }
}
1
2
3
4
5
6
7
8
9
10

Collision/Selection Boxes ​

If you would like your block to have a different collision/selection box when placed on the side of a block, as with my "shell" block, add something similar to this permutation:

minecraft:block > permutations
json
{
    "condition": "q.block_state('minecraft:block_face') != 'up'",
    "components": {
        // Add your collision/selection boxes
        "minecraft:collision_box": {
            "origin": [-3, 5, 5],
            "size": [6, 6, 3]
        },
        "minecraft:selection_box": {
            "origin": [-3, 5, 5],
            "size": [6, 6, 3]
        }
    }
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14

Final Block JSON & Script ​

Your block JSON and script files after the above steps should look similar to those below:

Shell Example Block JSON
BP/blocks/shell.json
json
{
    "format_version": "1.21.70",
    "minecraft:block": {
        "description": {
            "identifier": "wiki:shell",
            "menu_category": {
                "category": "nature"
            },
            "traits": {
                "minecraft:placement_position": {
                    "enabled_states": ["minecraft:block_face"]
                }
            },
            "states": {
                "wiki:rotation": {
                    "values": { "min": 0, "max": 15 }
                }
            }
        },
        "components": {
            "minecraft:collision_box": {
                "origin": [-3, 0, -3],
                "size": [6, 3, 6]
            },
            "minecraft:selection_box": {
                "origin": [-3, 0, -3],
                "size": [6, 3, 6]
            },
            "minecraft:geometry": {
                "identifier": "geometry.shell",
                "bone_visibility": {
                    "up_0": "q.block_state('minecraft:block_face') == 'up' && math.mod(q.block_state('wiki:rotation'), 4) == 0",
                    "up_22_5": "q.block_state('minecraft:block_face') == 'up' && math.mod(q.block_state('wiki:rotation'), 4) == 1",
                    "up_45": "q.block_state('minecraft:block_face') == 'up' && math.mod(q.block_state('wiki:rotation'), 4) == 2",
                    "up_67_5": "q.block_state('minecraft:block_face') == 'up' && math.mod(q.block_state('wiki:rotation'), 4) == 3",
                    "side": "q.block_state('minecraft:block_face') != 'up'"
                }
            },
            "minecraft:material_instances": {
                "*": {
                    "texture": "wiki:shell"
                }
            },
            "minecraft:placement_filter": {
                "conditions": [
                    {
                        "allowed_faces": ["up", "side"]
                    }
                ]
            },
            "minecraft:custom_components": ["wiki:shell_rotation"]
        },
        "permutations": [
            {
                "condition": "q.block_state('wiki:rotation') >= 4 || q.block_state('minecraft:block_face') == 'east'",
                "components": {
                    "minecraft:transformation": { "rotation": [0, -90, 0] }
                }
            },
            {
                "condition": "q.block_state('wiki:rotation') >= 8 || q.block_state('minecraft:block_face') == 'south'",
                "components": {
                    "minecraft:transformation": { "rotation": [0, 180, 0] }
                }
            },
            {
                "condition": "q.block_state('wiki:rotation') >= 12 || q.block_state('minecraft:block_face') == 'west'",
                "components": {
                    "minecraft:transformation": { "rotation": [0, 90, 0] }
                }
            },
            {
                "condition": "q.block_state('minecraft:block_face') != 'up'",
                "components": {
                    "minecraft:collision_box": {
                        "origin": [-3, 5, 5],
                        "size": [6, 6, 3]
                    },
                    "minecraft:selection_box": {
                        "origin": [-3, 5, 5],
                        "size": [6, 6, 3]
                    }
                }
            }
        ]
    }
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
Shell Example Script
BP/scripts/shell.js
js
import { world } from "@minecraft/server";

/** @param {number} playerYRotation */
function getPreciseRotation(playerYRotation) {
    if (playerYRotation < 0) playerYRotation += 360;
    const rotation = Math.round(playerYRotation / 22.5);

    return rotation !== 16 ? rotation : 0;
}

/** @type {import("@minecraft/server").BlockCustomComponent} */
const BlockShellRotationComponent = {
    beforeOnPlayerPlace(event) {
        const { player } = event;
        if (!player) return;

        const blockFace = event.permutationToPlace.getState("minecraft:block_face");
        if (blockFace !== "up") return;

        const playerYRotation = player.getRotation().y;
        const rotation = getPreciseRotation(playerYRotation);

        event.permutationToPlace = event.permutationToPlace.withState("wiki:rotation", rotation);
    },
};

world.beforeEvents.worldInitialize.subscribe(({ blockComponentRegistry }) => {
    blockComponentRegistry.registerCustomComponent(
        "wiki:shell_rotation",
        BlockShellRotationComponent
    );
});
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32

Result ​

What you have created:


Custom shell blocks in a square formation, each pointing towards the middle

Download Example Pack ​

Template pack made according to this tutorial, adding a "shell" block into the Nature tab.

Download MCADDON

Contributors

Edit Precise Rotation on GitHub

Text and image content on this page is licensed under the Creative Commons Attribution 4.0 International License

Code samples on this page are licensed under the MIT License

Bedrock Wiki by Bedrock OSS

"Minecraft" is a trademark of Mojang AB.

Bedrock OSS, Bedrock Wiki and bedrock.dev are not affiliated in any way with Microsoft or Mojang AB.

  • Privacy Policy
  • Join our Discord
  • Learn how to Contribute
  • Visit our Repository