diff --git a/src/main/java/net/minestom/server/instance/block/BlockImpl.java b/src/main/java/net/minestom/server/instance/block/BlockImpl.java
index 7395633fd..672dd6c7a 100644
--- a/src/main/java/net/minestom/server/instance/block/BlockImpl.java
+++ b/src/main/java/net/minestom/server/instance/block/BlockImpl.java
@@ -1,13 +1,11 @@
package net.minestom.server.instance.block;
-import com.github.benmanes.caffeine.cache.Cache;
-import com.github.benmanes.caffeine.cache.Caffeine;
+import it.unimi.dsi.fastutil.ints.Int2ObjectArrayMap;
import it.unimi.dsi.fastutil.objects.Object2ObjectArrayMap;
import it.unimi.dsi.fastutil.objects.Object2ObjectMaps;
import net.kyori.adventure.nbt.CompoundBinaryTag;
import net.minestom.server.registry.Registry;
import net.minestom.server.tag.Tag;
-import net.minestom.server.utils.ArrayUtils;
import net.minestom.server.utils.block.BlockUtils;
import net.minestom.server.utils.collection.MergedMap;
import net.minestom.server.utils.collection.ObjectArray;
@@ -16,20 +14,30 @@ import org.jetbrains.annotations.Nullable;
import org.jetbrains.annotations.UnknownNullability;
import org.jetbrains.annotations.Unmodifiable;
-import java.time.Duration;
-import java.util.*;
-import java.util.function.Function;
+import java.util.Collection;
+import java.util.List;
+import java.util.Map;
+import java.util.Objects;
record BlockImpl(@NotNull Registry.BlockEntry registry,
- byte @NotNull [] propertiesArray,
+ int propertiesArray,
@Nullable CompoundBinaryTag nbt,
@Nullable BlockHandler handler) implements Block {
+ /**
+ * Number of bits used to store the index of a property value.
+ *
+ * Block states are all stored within a single number.
+ */
+ private static final int BITS_PER_INDEX = 4;
+
+ private static final int MAX_STATES = Integer.SIZE / BITS_PER_INDEX;
+
// Block state -> block object
private static final ObjectArray BLOCK_STATE_MAP = ObjectArray.singleThread();
// Block id -> valid property keys (order is important for lookup)
private static final ObjectArray PROPERTIES_TYPE = ObjectArray.singleThread();
- // Block id -> Map
- private static final ObjectArray