From b82854f0f7e2b036c40dc2da1c84484a5620e555 Mon Sep 17 00:00:00 2001
From: Taylor <taylordspivey@gmail.com>
Date: Tue, 24 Sep 2024 12:32:56 -0500
Subject: [PATCH 01/13] Finished adding a custom shape override callback

---
 .../mods/kubejs/block/BlockBuilder.java       |  9 +++-
 .../kubejs/block/ShapeOverrideCallbackJS.java | 48 +++++++++++++++++++
 .../kubejs/block/custom/BasicBlockJS.java     |  8 +++-
 3 files changed, 63 insertions(+), 2 deletions(-)
 create mode 100644 common/src/main/java/dev/latvian/mods/kubejs/block/ShapeOverrideCallbackJS.java

diff --git a/common/src/main/java/dev/latvian/mods/kubejs/block/BlockBuilder.java b/common/src/main/java/dev/latvian/mods/kubejs/block/BlockBuilder.java
index 8228be755..10bd9218a 100644
--- a/common/src/main/java/dev/latvian/mods/kubejs/block/BlockBuilder.java
+++ b/common/src/main/java/dev/latvian/mods/kubejs/block/BlockBuilder.java
@@ -72,6 +72,7 @@ public abstract class BlockBuilder extends BuilderBase<Block> {
 	public transient String model;
 	public transient BlockItemBuilder itemBuilder;
 	public transient List<AABB> customShape;
+	public Consumer<ShapeOverrideCallbackJS> customShapeOverrideCallback;
 	public transient boolean noCollision;
 	public transient boolean notSolid;
 	public transient float slipperiness = Float.NaN;
@@ -237,7 +238,7 @@ protected void generateBlockModelJsons(AssetJsonGenerator generator) {
 				mg.textures(textures);
 			}
 
-			if (tint != null || !customShape.isEmpty()) {
+			if (tint != null || customShape != null) {
 				List<AABB> boxes = new ArrayList<>(customShape);
 
 				if (boxes.isEmpty()) {
@@ -507,6 +508,12 @@ public BlockBuilder box(double x0, double y0, double z0, double x1, double y1, d
 		return box(x0, y0, z0, x1, y1, z1, true);
 	}
 
+	@Info("Crates a callback for the shape of the block. '.box' will set be used if not present.")
+	public BlockBuilder shape(@Nullable Consumer<ShapeOverrideCallbackJS> shapeOverrideCallback) {
+		this.customShapeOverrideCallback = shapeOverrideCallback;
+		return this;
+	}
+
 	public static VoxelShape createShape(List<AABB> boxes) {
 		if (boxes.isEmpty()) {
 			return Shapes.block();
diff --git a/common/src/main/java/dev/latvian/mods/kubejs/block/ShapeOverrideCallbackJS.java b/common/src/main/java/dev/latvian/mods/kubejs/block/ShapeOverrideCallbackJS.java
new file mode 100644
index 000000000..d36279a55
--- /dev/null
+++ b/common/src/main/java/dev/latvian/mods/kubejs/block/ShapeOverrideCallbackJS.java
@@ -0,0 +1,48 @@
+package dev.latvian.mods.kubejs.block;
+
+import dev.latvian.mods.kubejs.typings.Info;
+import net.minecraft.world.level.block.state.BlockState;
+import net.minecraft.world.phys.AABB;
+import net.minecraft.world.phys.shapes.CollisionContext;
+
+import java.util.ArrayList;
+import java.util.List;
+import java.util.concurrent.atomic.AtomicReference;
+
+public class ShapeOverrideCallbackJS {
+	public BlockState block;
+	public CollisionContext context;
+	public List<AABB> shape;
+
+	public ShapeOverrideCallbackJS(BlockState containerJS, CollisionContext context) {
+		this.block = containerJS;
+		this.context = context;
+		this.shape = new ArrayList<>();
+	}
+
+	public CollisionContext getCollisionContext() {
+		return this.context;
+	}
+
+	@Info("Set the shape of the block.")
+	public void box(double x0, double y0, double z0, double x1, double y1, double z1, boolean scale16) {
+		if (scale16) {
+			shape.add(new AABB(x0 / 16D, y0 / 16D, z0 / 16D, x1 / 16D, y1 / 16D, z1 / 16D));
+		} else {
+			shape.add(new AABB(x0, y0, z0, x1, y1, z1));
+		}
+	}
+
+	@Info("Set the shape of the block.")
+	public void box(double x0, double y0, double z0, double x1, double y1, double z1) {
+		box(x0, y0, z0, x1, y1, z1, true);
+	}
+
+	public Object getStateValue(String name) {
+		AtomicReference<Object> returnValue = new AtomicReference<>();
+		block.getProperties().forEach((v) -> {
+			if(v.getName().matches(name)) returnValue.set(block.getValue(v));
+		});
+		return returnValue;
+	}
+}
diff --git a/common/src/main/java/dev/latvian/mods/kubejs/block/custom/BasicBlockJS.java b/common/src/main/java/dev/latvian/mods/kubejs/block/custom/BasicBlockJS.java
index 36f7f5645..cccae1ae3 100644
--- a/common/src/main/java/dev/latvian/mods/kubejs/block/custom/BasicBlockJS.java
+++ b/common/src/main/java/dev/latvian/mods/kubejs/block/custom/BasicBlockJS.java
@@ -2,6 +2,7 @@
 
 import dev.latvian.mods.kubejs.block.BlockBuilder;
 import dev.latvian.mods.kubejs.block.BlockRightClickedEventJS;
+import dev.latvian.mods.kubejs.block.ShapeOverrideCallbackJS;
 import dev.latvian.mods.kubejs.block.KubeJSBlockProperties;
 import dev.latvian.mods.kubejs.block.RandomTickCallbackJS;
 import dev.latvian.mods.kubejs.block.callbacks.AfterEntityFallenOnBlockCallbackJS;
@@ -92,11 +93,13 @@ public <T extends BlockEntity> BlockEntityTicker<T> getTicker(Level level, Block
 
 	public final BlockBuilder blockBuilder;
 	public final VoxelShape shape;
+	public final Consumer<ShapeOverrideCallbackJS> shapeOverrideCallback;
 
 	public BasicBlockJS(BlockBuilder p) {
 		super(p.createProperties());
 		blockBuilder = p;
 		shape = BlockBuilder.createShape(p.customShape);
+		this.shapeOverrideCallback = p.customShapeOverrideCallback;
 
 		var blockState = stateDefinition.any();
 		if (blockBuilder.defaultStateModification != null) {
@@ -126,7 +129,10 @@ public MutableComponent getName() {
 	@Override
 	@Deprecated
 	public VoxelShape getShape(BlockState state, BlockGetter level, BlockPos pos, CollisionContext context) {
-		return shape;
+		if(shapeOverrideCallback == null) return shape;
+		ShapeOverrideCallbackJS callback = new ShapeOverrideCallbackJS(state, context);
+		shapeOverrideCallback.accept(callback);
+		return BlockBuilder.createShape(callback.shape);
 	}
 
 	@Override

From a288cd5917db9810ac88f826ac456accf0a86e52 Mon Sep 17 00:00:00 2001
From: Taylor <taylordspivey@gmail.com>
Date: Tue, 24 Sep 2024 12:39:07 -0500
Subject: [PATCH 02/13] Finished adding a custom shape override callback

---
 .../main/java/dev/latvian/mods/kubejs/block/BlockBuilder.java   | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/common/src/main/java/dev/latvian/mods/kubejs/block/BlockBuilder.java b/common/src/main/java/dev/latvian/mods/kubejs/block/BlockBuilder.java
index 10bd9218a..2703cbf53 100644
--- a/common/src/main/java/dev/latvian/mods/kubejs/block/BlockBuilder.java
+++ b/common/src/main/java/dev/latvian/mods/kubejs/block/BlockBuilder.java
@@ -238,7 +238,7 @@ protected void generateBlockModelJsons(AssetJsonGenerator generator) {
 				mg.textures(textures);
 			}
 
-			if (tint != null || customShape != null) {
+			if (tint != null || customShape.isEmpty()) {
 				List<AABB> boxes = new ArrayList<>(customShape);
 
 				if (boxes.isEmpty()) {

From bfced0c7f2adb3cf8d5a09953b99a3c77fe6ba52 Mon Sep 17 00:00:00 2001
From: Taylor <taylordspivey@gmail.com>
Date: Tue, 24 Sep 2024 12:40:12 -0500
Subject: [PATCH 03/13] Finished adding a custom shape override callback

---
 .../main/java/dev/latvian/mods/kubejs/block/BlockBuilder.java   | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/common/src/main/java/dev/latvian/mods/kubejs/block/BlockBuilder.java b/common/src/main/java/dev/latvian/mods/kubejs/block/BlockBuilder.java
index 2703cbf53..e8fdda628 100644
--- a/common/src/main/java/dev/latvian/mods/kubejs/block/BlockBuilder.java
+++ b/common/src/main/java/dev/latvian/mods/kubejs/block/BlockBuilder.java
@@ -238,7 +238,7 @@ protected void generateBlockModelJsons(AssetJsonGenerator generator) {
 				mg.textures(textures);
 			}
 
-			if (tint != null || customShape.isEmpty()) {
+			if (tint != null || !customShape.isEmpty()) {
 				List<AABB> boxes = new ArrayList<>(customShape);
 
 				if (boxes.isEmpty()) {

From 21cd08197d85ffb06dbf380b3016a87463528391 Mon Sep 17 00:00:00 2001
From: Taylor <taylordspivey@gmail.com>
Date: Wed, 25 Sep 2024 15:54:44 -0500
Subject: [PATCH 04/13] Reworked the system to be more performant.

---
 .../mods/kubejs/block/BlockBuilder.java       | 82 ++++++++++++++++++-
 .../kubejs/block/custom/BasicBlockJS.java     | 32 ++++++--
 2 files changed, 104 insertions(+), 10 deletions(-)

diff --git a/common/src/main/java/dev/latvian/mods/kubejs/block/BlockBuilder.java b/common/src/main/java/dev/latvian/mods/kubejs/block/BlockBuilder.java
index e8fdda628..87147263c 100644
--- a/common/src/main/java/dev/latvian/mods/kubejs/block/BlockBuilder.java
+++ b/common/src/main/java/dev/latvian/mods/kubejs/block/BlockBuilder.java
@@ -43,9 +43,13 @@
 import org.jetbrains.annotations.Nullable;
 
 import java.util.ArrayList;
+import java.util.Collection;
+import java.util.HashMap;
 import java.util.HashSet;
 import java.util.List;
+import java.util.Map;
 import java.util.Set;
+import java.util.concurrent.atomic.AtomicBoolean;
 import java.util.function.Consumer;
 import java.util.function.Function;
 import java.util.function.Predicate;
@@ -72,7 +76,7 @@ public abstract class BlockBuilder extends BuilderBase<Block> {
 	public transient String model;
 	public transient BlockItemBuilder itemBuilder;
 	public transient List<AABB> customShape;
-	public Consumer<ShapeOverrideCallbackJS> customShapeOverrideCallback;
+	public Map<Map<String, Object>, List<AABB>> shapeMap;
 	public transient boolean noCollision;
 	public transient boolean notSolid;
 	public transient float slipperiness = Float.NaN;
@@ -118,6 +122,7 @@ public BlockBuilder(ResourceLocation i) {
 		itemBuilder = getOrCreateItemBuilder();
 		itemBuilder.blockBuilder = this;
 		customShape = new ArrayList<>();
+		shapeMap = new HashMap<>();
 		noCollision = false;
 		notSolid = false;
 		randomTickCallback = null;
@@ -508,9 +513,22 @@ public BlockBuilder box(double x0, double y0, double z0, double x1, double y1, d
 		return box(x0, y0, z0, x1, y1, z1, true);
 	}
 
+	@Info("Set the shape of the block.")
+	public BlockBuilder box(Map<String, Object> condition, double x0, double y0, double z0, double x1, double y1, double z1) {
+		return box(condition, x0, y0, z0, x1, y1, z1, true);
+	}
+
 	@Info("Crates a callback for the shape of the block. '.box' will set be used if not present.")
-	public BlockBuilder shape(@Nullable Consumer<ShapeOverrideCallbackJS> shapeOverrideCallback) {
-		this.customShapeOverrideCallback = shapeOverrideCallback;
+	public BlockBuilder box(Map<String, Object> condition, double x0, double y0, double z0, double x1, double y1, double z1, boolean scale16) {
+		System.out.println("condition: " + condition.entrySet());
+		List<AABB> cubes = shapeMap.getOrDefault(condition, new ArrayList<>());
+		System.out.println("box: " + shapeMap + " " + cubes);
+		if (scale16) {
+			cubes.add(new AABB(x0 / 16D, y0 / 16D, z0 / 16D, x1 / 16D, y1 / 16D, z1 / 16D));
+		} else {
+			cubes.add(new AABB(x0, y0, z0, x1, y1, z1));
+		}
+		shapeMap.put(condition, cubes);
 		return this;
 	}
 
@@ -840,4 +858,62 @@ public Block.Properties createProperties() {
 
 		return properties;
 	}
+
+	public Map<Map<String, Object>, VoxelShape> getShapeMap(Collection<Property<?>> properties) {
+		System.out.println("shape map: " + shapeMap);
+		final Map<Map<String, Object>, List<AABB>>[] cubeMap = new Map[]{new HashMap<>()};
+		properties.forEach(property -> {
+			if(cubeMap[0].isEmpty()) {
+				property.getPossibleValues().forEach(value -> {
+					Map<String, Object> propMap = new HashMap<>();
+					propMap.put(property.getName(), value);
+					cubeMap[0].put(propMap, new ArrayList<>());
+				});
+			}
+			else {
+				var oldMap = cubeMap[0];
+				cubeMap[0] = new HashMap<>();
+				oldMap.forEach((k,v) -> {
+					property.getPossibleValues().forEach(value -> {
+						Map<String, Object> propMap = k;
+						k.put(property.getName(), value);
+						cubeMap[0].put(propMap, v);
+					});
+				});
+			}
+		});
+		cubeMap[0].forEach((_k,_v) -> {
+			shapeMap.forEach((k,v) -> {
+				AtomicBoolean match = new AtomicBoolean(true);
+				k.forEach((K,V) -> {
+					if(!compareValue(V,_k.get(K))) match.set(false);
+				});
+				if(match.get()) _v.addAll(v);
+			});
+		});
+		System.out.println("cubeMap: " + cubeMap[0]);
+		final Map<Map<String, Object>, VoxelShape> voxelShapeMap = new HashMap<>();
+		cubeMap[0].forEach((k,v) -> {
+			voxelShapeMap.put(k,BlockBuilder.createShape(v));
+		});
+		System.out.println("voxelShapeMap: " + cubeMap[0] + " " + voxelShapeMap);
+		return voxelShapeMap;
+	}
+	private boolean compareValue(Object o1, Object o2) {
+		if(o1.getClass() == Double.class || o1.getClass() == Float.class || o1.getClass() == Integer.class) {
+			if(o2.getClass() == Double.class || o2.getClass() == Float.class || o2.getClass() == Integer.class) {
+				double d1 = 0;
+				double d2 = 0;
+				if(o1.getClass() == Double.class) d1 = (double) o1;
+				if(o1.getClass() == Float.class) d1 = (double)(float) o1;
+				if(o1.getClass() == Integer.class) d1 = (double)(int) o1;
+				if(o2.getClass() == Double.class) d2 = (double) o2;
+				if(o2.getClass() == Float.class) d2 = (double)(float) o2;
+				if(o2.getClass() == Integer.class) d2 = (double)(int) o2;
+				return d1 == d2;
+			}
+		}
+		else return o1.equals(o2);
+		return false;
+	}
 }
\ No newline at end of file
diff --git a/common/src/main/java/dev/latvian/mods/kubejs/block/custom/BasicBlockJS.java b/common/src/main/java/dev/latvian/mods/kubejs/block/custom/BasicBlockJS.java
index cccae1ae3..c737f73c8 100644
--- a/common/src/main/java/dev/latvian/mods/kubejs/block/custom/BasicBlockJS.java
+++ b/common/src/main/java/dev/latvian/mods/kubejs/block/custom/BasicBlockJS.java
@@ -2,7 +2,6 @@
 
 import dev.latvian.mods.kubejs.block.BlockBuilder;
 import dev.latvian.mods.kubejs.block.BlockRightClickedEventJS;
-import dev.latvian.mods.kubejs.block.ShapeOverrideCallbackJS;
 import dev.latvian.mods.kubejs.block.KubeJSBlockProperties;
 import dev.latvian.mods.kubejs.block.RandomTickCallbackJS;
 import dev.latvian.mods.kubejs.block.callbacks.AfterEntityFallenOnBlockCallbackJS;
@@ -48,6 +47,7 @@
 import net.minecraft.world.level.block.state.BlockState;
 import net.minecraft.world.level.block.state.StateDefinition;
 import net.minecraft.world.level.block.state.properties.BlockStateProperties;
+import net.minecraft.world.level.block.state.properties.Property;
 import net.minecraft.world.level.material.Fluid;
 import net.minecraft.world.level.material.FluidState;
 import net.minecraft.world.level.material.Fluids;
@@ -58,7 +58,11 @@
 import org.jetbrains.annotations.Nullable;
 
 import java.util.Collections;
+import java.util.HashMap;
+import java.util.Map;
 import java.util.Optional;
+import java.util.concurrent.atomic.AtomicBoolean;
+import java.util.concurrent.atomic.AtomicReference;
 import java.util.function.Consumer;
 
 public class BasicBlockJS extends Block implements BlockKJS, SimpleWaterloggedBlock {
@@ -93,15 +97,15 @@ public <T extends BlockEntity> BlockEntityTicker<T> getTicker(Level level, Block
 
 	public final BlockBuilder blockBuilder;
 	public final VoxelShape shape;
-	public final Consumer<ShapeOverrideCallbackJS> shapeOverrideCallback;
+	public Map<Map<String, Object>, VoxelShape> shapeMap = new HashMap<>();
 
 	public BasicBlockJS(BlockBuilder p) {
 		super(p.createProperties());
 		blockBuilder = p;
 		shape = BlockBuilder.createShape(p.customShape);
-		this.shapeOverrideCallback = p.customShapeOverrideCallback;
 
 		var blockState = stateDefinition.any();
+		this.shapeMap = p.getShapeMap(blockState.getProperties());
 		if (blockBuilder.defaultStateModification != null) {
 			var callbackJS = new BlockStateModifyCallbackJS(blockState);
 			if (safeCallback(blockBuilder.defaultStateModification, callbackJS, "Error while creating default blockState for block " + p.id)) {
@@ -129,10 +133,24 @@ public MutableComponent getName() {
 	@Override
 	@Deprecated
 	public VoxelShape getShape(BlockState state, BlockGetter level, BlockPos pos, CollisionContext context) {
-		if(shapeOverrideCallback == null) return shape;
-		ShapeOverrideCallbackJS callback = new ShapeOverrideCallbackJS(state, context);
-		shapeOverrideCallback.accept(callback);
-		return BlockBuilder.createShape(callback.shape);
+		Map<String, Object> blockPropertyValues = new HashMap<>();
+		state.getProperties().forEach((property) -> {
+			blockPropertyValues.put(property.getName(), state.getValue(property));
+		});
+		//final AtomicReference<VoxelShape> voxelShape = new AtomicReference<>();
+		/*System.out.println(shapeMap);
+		shapeMap.forEach((k,v) -> {
+			System.out.println("getShape: " + k + " " + blockPropertyValues);
+			AtomicBoolean match = new AtomicBoolean(true);
+			if(k != null) k.forEach((K,V) -> {
+				if(match.get() && compareValue(V, blockPropertyValues.get(K))) match.set(false);
+				System.out.println(V.getClass() + " " + blockPropertyValues.get(K).getClass());
+			});
+			if(match.get()) voxelShape.set(v);
+		});*/
+		var voxelShape = shapeMap.get(blockPropertyValues);
+		if(voxelShape.isEmpty()) return shape;
+		return voxelShape;
 	}
 
 	@Override

From 0e9fe070bfd0826bbbb20d907622b069762e1bc3 Mon Sep 17 00:00:00 2001
From: Taylor <taylordspivey@gmail.com>
Date: Wed, 25 Sep 2024 16:02:56 -0500
Subject: [PATCH 05/13] Removed debug println-s

---
 .../dev/latvian/mods/kubejs/block/BlockBuilder.java   |  5 -----
 .../mods/kubejs/block/custom/BasicBlockJS.java        | 11 -----------
 2 files changed, 16 deletions(-)

diff --git a/common/src/main/java/dev/latvian/mods/kubejs/block/BlockBuilder.java b/common/src/main/java/dev/latvian/mods/kubejs/block/BlockBuilder.java
index 87147263c..32b85a912 100644
--- a/common/src/main/java/dev/latvian/mods/kubejs/block/BlockBuilder.java
+++ b/common/src/main/java/dev/latvian/mods/kubejs/block/BlockBuilder.java
@@ -520,9 +520,7 @@ public BlockBuilder box(Map<String, Object> condition, double x0, double y0, dou
 
 	@Info("Crates a callback for the shape of the block. '.box' will set be used if not present.")
 	public BlockBuilder box(Map<String, Object> condition, double x0, double y0, double z0, double x1, double y1, double z1, boolean scale16) {
-		System.out.println("condition: " + condition.entrySet());
 		List<AABB> cubes = shapeMap.getOrDefault(condition, new ArrayList<>());
-		System.out.println("box: " + shapeMap + " " + cubes);
 		if (scale16) {
 			cubes.add(new AABB(x0 / 16D, y0 / 16D, z0 / 16D, x1 / 16D, y1 / 16D, z1 / 16D));
 		} else {
@@ -860,7 +858,6 @@ public Block.Properties createProperties() {
 	}
 
 	public Map<Map<String, Object>, VoxelShape> getShapeMap(Collection<Property<?>> properties) {
-		System.out.println("shape map: " + shapeMap);
 		final Map<Map<String, Object>, List<AABB>>[] cubeMap = new Map[]{new HashMap<>()};
 		properties.forEach(property -> {
 			if(cubeMap[0].isEmpty()) {
@@ -891,12 +888,10 @@ public Map<Map<String, Object>, VoxelShape> getShapeMap(Collection<Property<?>>
 				if(match.get()) _v.addAll(v);
 			});
 		});
-		System.out.println("cubeMap: " + cubeMap[0]);
 		final Map<Map<String, Object>, VoxelShape> voxelShapeMap = new HashMap<>();
 		cubeMap[0].forEach((k,v) -> {
 			voxelShapeMap.put(k,BlockBuilder.createShape(v));
 		});
-		System.out.println("voxelShapeMap: " + cubeMap[0] + " " + voxelShapeMap);
 		return voxelShapeMap;
 	}
 	private boolean compareValue(Object o1, Object o2) {
diff --git a/common/src/main/java/dev/latvian/mods/kubejs/block/custom/BasicBlockJS.java b/common/src/main/java/dev/latvian/mods/kubejs/block/custom/BasicBlockJS.java
index c737f73c8..d4189c32e 100644
--- a/common/src/main/java/dev/latvian/mods/kubejs/block/custom/BasicBlockJS.java
+++ b/common/src/main/java/dev/latvian/mods/kubejs/block/custom/BasicBlockJS.java
@@ -137,17 +137,6 @@ public VoxelShape getShape(BlockState state, BlockGetter level, BlockPos pos, Co
 		state.getProperties().forEach((property) -> {
 			blockPropertyValues.put(property.getName(), state.getValue(property));
 		});
-		//final AtomicReference<VoxelShape> voxelShape = new AtomicReference<>();
-		/*System.out.println(shapeMap);
-		shapeMap.forEach((k,v) -> {
-			System.out.println("getShape: " + k + " " + blockPropertyValues);
-			AtomicBoolean match = new AtomicBoolean(true);
-			if(k != null) k.forEach((K,V) -> {
-				if(match.get() && compareValue(V, blockPropertyValues.get(K))) match.set(false);
-				System.out.println(V.getClass() + " " + blockPropertyValues.get(K).getClass());
-			});
-			if(match.get()) voxelShape.set(v);
-		});*/
 		var voxelShape = shapeMap.get(blockPropertyValues);
 		if(voxelShape.isEmpty()) return shape;
 		return voxelShape;

From 059dad73a28ca187e06cf6bcc62ef77b70199c1b Mon Sep 17 00:00:00 2001
From: Taylor <taylordspivey@gmail.com>
Date: Wed, 25 Sep 2024 16:13:46 -0500
Subject: [PATCH 06/13] Removed old ShapeOverrideCallbackJS.java file, as it
 was no longer used.

---
 .../kubejs/block/ShapeOverrideCallbackJS.java | 48 -------------------
 1 file changed, 48 deletions(-)
 delete mode 100644 common/src/main/java/dev/latvian/mods/kubejs/block/ShapeOverrideCallbackJS.java

diff --git a/common/src/main/java/dev/latvian/mods/kubejs/block/ShapeOverrideCallbackJS.java b/common/src/main/java/dev/latvian/mods/kubejs/block/ShapeOverrideCallbackJS.java
deleted file mode 100644
index d36279a55..000000000
--- a/common/src/main/java/dev/latvian/mods/kubejs/block/ShapeOverrideCallbackJS.java
+++ /dev/null
@@ -1,48 +0,0 @@
-package dev.latvian.mods.kubejs.block;
-
-import dev.latvian.mods.kubejs.typings.Info;
-import net.minecraft.world.level.block.state.BlockState;
-import net.minecraft.world.phys.AABB;
-import net.minecraft.world.phys.shapes.CollisionContext;
-
-import java.util.ArrayList;
-import java.util.List;
-import java.util.concurrent.atomic.AtomicReference;
-
-public class ShapeOverrideCallbackJS {
-	public BlockState block;
-	public CollisionContext context;
-	public List<AABB> shape;
-
-	public ShapeOverrideCallbackJS(BlockState containerJS, CollisionContext context) {
-		this.block = containerJS;
-		this.context = context;
-		this.shape = new ArrayList<>();
-	}
-
-	public CollisionContext getCollisionContext() {
-		return this.context;
-	}
-
-	@Info("Set the shape of the block.")
-	public void box(double x0, double y0, double z0, double x1, double y1, double z1, boolean scale16) {
-		if (scale16) {
-			shape.add(new AABB(x0 / 16D, y0 / 16D, z0 / 16D, x1 / 16D, y1 / 16D, z1 / 16D));
-		} else {
-			shape.add(new AABB(x0, y0, z0, x1, y1, z1));
-		}
-	}
-
-	@Info("Set the shape of the block.")
-	public void box(double x0, double y0, double z0, double x1, double y1, double z1) {
-		box(x0, y0, z0, x1, y1, z1, true);
-	}
-
-	public Object getStateValue(String name) {
-		AtomicReference<Object> returnValue = new AtomicReference<>();
-		block.getProperties().forEach((v) -> {
-			if(v.getName().matches(name)) returnValue.set(block.getValue(v));
-		});
-		return returnValue;
-	}
-}

From 720366df912362312d985d8c77beb995cbce48fb Mon Sep 17 00:00:00 2001
From: Taylor <taylordspivey@gmail.com>
Date: Wed, 25 Sep 2024 17:51:30 -0500
Subject: [PATCH 07/13] Fixed a bug.

---
 .../java/dev/latvian/mods/kubejs/block/custom/BasicBlockJS.java | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/common/src/main/java/dev/latvian/mods/kubejs/block/custom/BasicBlockJS.java b/common/src/main/java/dev/latvian/mods/kubejs/block/custom/BasicBlockJS.java
index d4189c32e..a14b3c463 100644
--- a/common/src/main/java/dev/latvian/mods/kubejs/block/custom/BasicBlockJS.java
+++ b/common/src/main/java/dev/latvian/mods/kubejs/block/custom/BasicBlockJS.java
@@ -138,7 +138,7 @@ public VoxelShape getShape(BlockState state, BlockGetter level, BlockPos pos, Co
 			blockPropertyValues.put(property.getName(), state.getValue(property));
 		});
 		var voxelShape = shapeMap.get(blockPropertyValues);
-		if(voxelShape.isEmpty()) return shape;
+		if(voxelShape == null || voxelShape.isEmpty()) return shape;
 		return voxelShape;
 	}
 

From 3af3049a37334026ccc81dcfe1a8a865ad1d601a Mon Sep 17 00:00:00 2001
From: Taylor <taylordspivey@gmail.com>
Date: Thu, 26 Sep 2024 13:30:07 -0500
Subject: [PATCH 08/13] Fixed critical a bug.

---
 .../mods/kubejs/block/BlockBuilder.java       | 20 +++++++------------
 .../kubejs/block/custom/BasicBlockJS.java     |  4 +---
 gradle.properties                             |  2 +-
 3 files changed, 9 insertions(+), 17 deletions(-)

diff --git a/common/src/main/java/dev/latvian/mods/kubejs/block/BlockBuilder.java b/common/src/main/java/dev/latvian/mods/kubejs/block/BlockBuilder.java
index 32b85a912..5e686b1b5 100644
--- a/common/src/main/java/dev/latvian/mods/kubejs/block/BlockBuilder.java
+++ b/common/src/main/java/dev/latvian/mods/kubejs/block/BlockBuilder.java
@@ -860,6 +860,7 @@ public Block.Properties createProperties() {
 	public Map<Map<String, Object>, VoxelShape> getShapeMap(Collection<Property<?>> properties) {
 		final Map<Map<String, Object>, List<AABB>>[] cubeMap = new Map[]{new HashMap<>()};
 		properties.forEach(property -> {
+			System.out.println(property);
 			if(cubeMap[0].isEmpty()) {
 				property.getPossibleValues().forEach(value -> {
 					Map<String, Object> propMap = new HashMap<>();
@@ -872,13 +873,15 @@ public Map<Map<String, Object>, VoxelShape> getShapeMap(Collection<Property<?>>
 				cubeMap[0] = new HashMap<>();
 				oldMap.forEach((k,v) -> {
 					property.getPossibleValues().forEach(value -> {
-						Map<String, Object> propMap = k;
-						k.put(property.getName(), value);
+						System.out.println(value);
+						Map<String, Object> propMap = new HashMap<>(k);
+						propMap.put(property.getName(), value);
 						cubeMap[0].put(propMap, v);
 					});
 				});
 			}
 		});
+		System.out.println(cubeMap);
 		cubeMap[0].forEach((_k,_v) -> {
 			shapeMap.forEach((k,v) -> {
 				AtomicBoolean match = new AtomicBoolean(true);
@@ -896,17 +899,8 @@ public Map<Map<String, Object>, VoxelShape> getShapeMap(Collection<Property<?>>
 	}
 	private boolean compareValue(Object o1, Object o2) {
 		if(o1.getClass() == Double.class || o1.getClass() == Float.class || o1.getClass() == Integer.class) {
-			if(o2.getClass() == Double.class || o2.getClass() == Float.class || o2.getClass() == Integer.class) {
-				double d1 = 0;
-				double d2 = 0;
-				if(o1.getClass() == Double.class) d1 = (double) o1;
-				if(o1.getClass() == Float.class) d1 = (double)(float) o1;
-				if(o1.getClass() == Integer.class) d1 = (double)(int) o1;
-				if(o2.getClass() == Double.class) d2 = (double) o2;
-				if(o2.getClass() == Float.class) d2 = (double)(float) o2;
-				if(o2.getClass() == Integer.class) d2 = (double)(int) o2;
-				return d1 == d2;
-			}
+			if(o2.getClass() == Double.class || o2.getClass() == Float.class || o2.getClass() == Integer.class)
+				return ((Number) o1).doubleValue() == ((Number) o2).doubleValue();
 		}
 		else return o1.equals(o2);
 		return false;
diff --git a/common/src/main/java/dev/latvian/mods/kubejs/block/custom/BasicBlockJS.java b/common/src/main/java/dev/latvian/mods/kubejs/block/custom/BasicBlockJS.java
index a14b3c463..0378004fd 100644
--- a/common/src/main/java/dev/latvian/mods/kubejs/block/custom/BasicBlockJS.java
+++ b/common/src/main/java/dev/latvian/mods/kubejs/block/custom/BasicBlockJS.java
@@ -137,9 +137,7 @@ public VoxelShape getShape(BlockState state, BlockGetter level, BlockPos pos, Co
 		state.getProperties().forEach((property) -> {
 			blockPropertyValues.put(property.getName(), state.getValue(property));
 		});
-		var voxelShape = shapeMap.get(blockPropertyValues);
-		if(voxelShape == null || voxelShape.isEmpty()) return shape;
-		return voxelShape;
+		return shapeMap.getOrDefault(blockPropertyValues, shape);
 	}
 
 	@Override
diff --git a/gradle.properties b/gradle.properties
index 254eddf22..5de5a4353 100644
--- a/gradle.properties
+++ b/gradle.properties
@@ -3,7 +3,7 @@ org.gradle.daemon=false
 mod_id=kubejs
 archives_base_name=kubejs
 mod_name=KubeJS
-mod_version=2001.6.5
+mod_version=2001.6.5-custom-0.2
 maven_group=dev.latvian.mods
 mod_author=LatvianModder
 curseforge_id=238086

From fed002efaeabc9b11d073bcdf9f9b3ec646d72a1 Mon Sep 17 00:00:00 2001
From: Taylor <taylordspivey@gmail.com>
Date: Thu, 26 Sep 2024 13:37:11 -0500
Subject: [PATCH 09/13] Reverted version change for personal builds (did not
 mean to commit)

---
 gradle.properties | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/gradle.properties b/gradle.properties
index 5de5a4353..254eddf22 100644
--- a/gradle.properties
+++ b/gradle.properties
@@ -3,7 +3,7 @@ org.gradle.daemon=false
 mod_id=kubejs
 archives_base_name=kubejs
 mod_name=KubeJS
-mod_version=2001.6.5-custom-0.2
+mod_version=2001.6.5
 maven_group=dev.latvian.mods
 mod_author=LatvianModder
 curseforge_id=238086

From 07554e1710956c83a533515618d7f63233a2136b Mon Sep 17 00:00:00 2001
From: Taylor <taylordspivey@gmail.com>
Date: Thu, 26 Sep 2024 16:13:48 -0500
Subject: [PATCH 10/13] GetShapeMap now uses a stream for more optimal value
 checking.

---
 .../mods/kubejs/block/BlockBuilder.java       | 20 ++++++-------------
 .../kubejs/block/custom/BasicBlockJS.java     |  2 ++
 2 files changed, 8 insertions(+), 14 deletions(-)

diff --git a/common/src/main/java/dev/latvian/mods/kubejs/block/BlockBuilder.java b/common/src/main/java/dev/latvian/mods/kubejs/block/BlockBuilder.java
index 5e686b1b5..3640d6a8d 100644
--- a/common/src/main/java/dev/latvian/mods/kubejs/block/BlockBuilder.java
+++ b/common/src/main/java/dev/latvian/mods/kubejs/block/BlockBuilder.java
@@ -53,6 +53,7 @@
 import java.util.function.Consumer;
 import java.util.function.Function;
 import java.util.function.Predicate;
+import java.util.stream.Stream;
 
 @SuppressWarnings({"unused", "UnusedReturnValue"})
 public abstract class BlockBuilder extends BuilderBase<Block> {
@@ -858,9 +859,8 @@ public Block.Properties createProperties() {
 	}
 
 	public Map<Map<String, Object>, VoxelShape> getShapeMap(Collection<Property<?>> properties) {
-		final Map<Map<String, Object>, List<AABB>>[] cubeMap = new Map[]{new HashMap<>()};
+		final Map<Map<String, Object>, List<AABB>>[] cubeMap = new Map[]{new HashMap<Map<String, Object>, List<AABB>>()};
 		properties.forEach(property -> {
-			System.out.println(property);
 			if(cubeMap[0].isEmpty()) {
 				property.getPossibleValues().forEach(value -> {
 					Map<String, Object> propMap = new HashMap<>();
@@ -873,7 +873,6 @@ public Map<Map<String, Object>, VoxelShape> getShapeMap(Collection<Property<?>>
 				cubeMap[0] = new HashMap<>();
 				oldMap.forEach((k,v) -> {
 					property.getPossibleValues().forEach(value -> {
-						System.out.println(value);
 						Map<String, Object> propMap = new HashMap<>(k);
 						propMap.put(property.getName(), value);
 						cubeMap[0].put(propMap, v);
@@ -881,20 +880,13 @@ public Map<Map<String, Object>, VoxelShape> getShapeMap(Collection<Property<?>>
 				});
 			}
 		});
-		System.out.println(cubeMap);
-		cubeMap[0].forEach((_k,_v) -> {
-			shapeMap.forEach((k,v) -> {
-				AtomicBoolean match = new AtomicBoolean(true);
-				k.forEach((K,V) -> {
-					if(!compareValue(V,_k.get(K))) match.set(false);
-				});
-				if(match.get()) _v.addAll(v);
+		cubeMap[0].forEach((cubeMapKey,cubeMapValue) -> {
+			shapeMap.forEach((shapeMapKey,shapeMapValue) -> {
+				if(shapeMapKey.entrySet().stream().allMatch(entry -> compareValue(entry.getValue(),cubeMapKey.get(entry.getKey())))) cubeMapValue.addAll(shapeMapValue);
 			});
 		});
 		final Map<Map<String, Object>, VoxelShape> voxelShapeMap = new HashMap<>();
-		cubeMap[0].forEach((k,v) -> {
-			voxelShapeMap.put(k,BlockBuilder.createShape(v));
-		});
+		cubeMap[0].forEach((cubeMapKey,cubeMapValue) -> voxelShapeMap.put(cubeMapKey,BlockBuilder.createShape(cubeMapValue)));
 		return voxelShapeMap;
 	}
 	private boolean compareValue(Object o1, Object o2) {
diff --git a/common/src/main/java/dev/latvian/mods/kubejs/block/custom/BasicBlockJS.java b/common/src/main/java/dev/latvian/mods/kubejs/block/custom/BasicBlockJS.java
index 0378004fd..8530a10e2 100644
--- a/common/src/main/java/dev/latvian/mods/kubejs/block/custom/BasicBlockJS.java
+++ b/common/src/main/java/dev/latvian/mods/kubejs/block/custom/BasicBlockJS.java
@@ -1,5 +1,6 @@
 package dev.latvian.mods.kubejs.block.custom;
 
+import com.mojang.serialization.MapCodec;
 import dev.latvian.mods.kubejs.block.BlockBuilder;
 import dev.latvian.mods.kubejs.block.BlockRightClickedEventJS;
 import dev.latvian.mods.kubejs.block.KubeJSBlockProperties;
@@ -37,6 +38,7 @@
 import net.minecraft.world.level.Level;
 import net.minecraft.world.level.LevelAccessor;
 import net.minecraft.world.level.block.Block;
+import net.minecraft.world.level.block.Blocks;
 import net.minecraft.world.level.block.EntityBlock;
 import net.minecraft.world.level.block.Mirror;
 import net.minecraft.world.level.block.Rotation;

From 49b3e6e4fbf10a88cee685de460c8c012bc7e1c7 Mon Sep 17 00:00:00 2001
From: Taylor <taylordspivey@gmail.com>
Date: Fri, 27 Sep 2024 11:28:14 -0500
Subject: [PATCH 11/13] Added a callback to override a blocks pick block
 result.

---
 .../mods/kubejs/block/BlockBuilder.java       | 12 +++++++
 .../kubejs/block/PickBlockCallbackJS.java     | 36 +++++++++++++++++++
 .../kubejs/block/custom/BasicBlockJS.java     | 15 +++++++-
 gradle.properties                             |  2 +-
 4 files changed, 63 insertions(+), 2 deletions(-)
 create mode 100644 common/src/main/java/dev/latvian/mods/kubejs/block/PickBlockCallbackJS.java

diff --git a/common/src/main/java/dev/latvian/mods/kubejs/block/BlockBuilder.java b/common/src/main/java/dev/latvian/mods/kubejs/block/BlockBuilder.java
index 3640d6a8d..ced755073 100644
--- a/common/src/main/java/dev/latvian/mods/kubejs/block/BlockBuilder.java
+++ b/common/src/main/java/dev/latvian/mods/kubejs/block/BlockBuilder.java
@@ -84,6 +84,7 @@ public abstract class BlockBuilder extends BuilderBase<Block> {
 	public transient float speedFactor = Float.NaN;
 	public transient float jumpFactor = Float.NaN;
 	public Consumer<RandomTickCallbackJS> randomTickCallback;
+	public Consumer<PickBlockCallbackJS> pickBlockCallback;
 	public Consumer<LootBuilder> lootTable;
 	public JsonObject blockstateJson;
 	public JsonObject modelJson;
@@ -788,6 +789,17 @@ public BlockBuilder blockEntity(Consumer<BlockEntityInfo> callback) {
 		return this;
 	}
 
+	/**
+	 * Sets random tick callback for this black.
+	 *
+	 * @param pickBlockCallback A callback using a block container and a random.
+	 */
+	@Info("Sets pick block callback for this block.")
+	public BlockBuilder pickBlock(@Nullable Consumer<PickBlockCallbackJS> pickBlockCallback) {
+		this.pickBlockCallback = pickBlockCallback;
+		return this;
+	}
+
 	public Block.Properties createProperties() {
 		// FIXME: Implement all the other ex-Material properties
 		//var properties = BlockBehaviour.Properties.of();
diff --git a/common/src/main/java/dev/latvian/mods/kubejs/block/PickBlockCallbackJS.java b/common/src/main/java/dev/latvian/mods/kubejs/block/PickBlockCallbackJS.java
new file mode 100644
index 000000000..ab5637baa
--- /dev/null
+++ b/common/src/main/java/dev/latvian/mods/kubejs/block/PickBlockCallbackJS.java
@@ -0,0 +1,36 @@
+package dev.latvian.mods.kubejs.block;
+
+import net.minecraft.core.BlockPos;
+import net.minecraft.core.registries.BuiltInRegistries;
+import net.minecraft.resources.ResourceLocation;
+import net.minecraft.server.MinecraftServer;
+import net.minecraft.world.item.Item;
+import net.minecraft.world.item.ItemStack;
+import net.minecraft.world.level.BlockGetter;
+import net.minecraft.world.level.block.state.BlockState;
+
+public class PickBlockCallbackJS {
+	public BlockGetter block;
+	public BlockPos pos;
+	public BlockState state;
+	public Item item;
+
+	public PickBlockCallbackJS(BlockGetter blockGetter, BlockPos blockPos, BlockState blockState) {
+		this.block = blockGetter;
+		this.pos = blockPos;
+		this.state = blockState;
+	}
+
+	public BlockState getState() {
+		return this.state;
+	}
+	public BlockPos getBlockPos() {
+		return this.pos;
+	}
+	public BlockGetter getBlockGetter() {
+		return this.block;
+	}
+	public void setPickBlockItem(String item) {
+		this.item = BuiltInRegistries.ITEM.get(new ResourceLocation(item));
+	}
+}
diff --git a/common/src/main/java/dev/latvian/mods/kubejs/block/custom/BasicBlockJS.java b/common/src/main/java/dev/latvian/mods/kubejs/block/custom/BasicBlockJS.java
index 8530a10e2..6c4992cd4 100644
--- a/common/src/main/java/dev/latvian/mods/kubejs/block/custom/BasicBlockJS.java
+++ b/common/src/main/java/dev/latvian/mods/kubejs/block/custom/BasicBlockJS.java
@@ -4,6 +4,7 @@
 import dev.latvian.mods.kubejs.block.BlockBuilder;
 import dev.latvian.mods.kubejs.block.BlockRightClickedEventJS;
 import dev.latvian.mods.kubejs.block.KubeJSBlockProperties;
+import dev.latvian.mods.kubejs.block.PickBlockCallbackJS;
 import dev.latvian.mods.kubejs.block.RandomTickCallbackJS;
 import dev.latvian.mods.kubejs.block.callbacks.AfterEntityFallenOnBlockCallbackJS;
 import dev.latvian.mods.kubejs.block.callbacks.BlockExplodedCallbackJS;
@@ -32,6 +33,7 @@
 import net.minecraft.world.entity.LivingEntity;
 import net.minecraft.world.entity.player.Player;
 import net.minecraft.world.item.ItemStack;
+import net.minecraft.world.item.Items;
 import net.minecraft.world.item.context.BlockPlaceContext;
 import net.minecraft.world.level.BlockGetter;
 import net.minecraft.world.level.Explosion;
@@ -106,6 +108,7 @@ public BasicBlockJS(BlockBuilder p) {
 		blockBuilder = p;
 		shape = BlockBuilder.createShape(p.customShape);
 
+
 		var blockState = stateDefinition.any();
 		this.shapeMap = p.getShapeMap(blockState.getProperties());
 		if (blockBuilder.defaultStateModification != null) {
@@ -267,7 +270,7 @@ public ItemStack pickupBlock(LevelAccessor levelAccessor, BlockPos blockPos, Blo
 			return SimpleWaterloggedBlock.super.pickupBlock(levelAccessor, blockPos, blockState);
 		}
 
-		return ItemStack.EMPTY;
+		return Items.STONE.getDefaultInstance();
 	}
 
 	@Override
@@ -383,4 +386,14 @@ public void setPlacedBy(Level level, BlockPos blockPos, BlockState blockState, @
 			e.placerId = livingEntity.getUUID();
 		}
 	}
+
+	@Override
+	public ItemStack getCloneItemStack(BlockGetter blockGetter, BlockPos blockPos, BlockState blockState) {
+		if(blockBuilder.pickBlockCallback != null) {
+			var callback = new PickBlockCallbackJS(blockGetter, blockPos, blockState);
+			safeCallback(blockBuilder.pickBlockCallback, callback, "Error while getting pick block item ");
+			if(callback.item != null) return new ItemStack(callback.item);
+		}
+		return super.getCloneItemStack(blockGetter, blockPos, blockState);
+	}
 }
\ No newline at end of file
diff --git a/gradle.properties b/gradle.properties
index 254eddf22..6dc255a7b 100644
--- a/gradle.properties
+++ b/gradle.properties
@@ -3,7 +3,7 @@ org.gradle.daemon=false
 mod_id=kubejs
 archives_base_name=kubejs
 mod_name=KubeJS
-mod_version=2001.6.5
+mod_version=2001.6.5-custom-0.4
 maven_group=dev.latvian.mods
 mod_author=LatvianModder
 curseforge_id=238086

From bd5c99c000cb209f6c556e1cb55edf1102fa642b Mon Sep 17 00:00:00 2001
From: Taylor <taylordspivey@gmail.com>
Date: Fri, 27 Sep 2024 11:39:49 -0500
Subject: [PATCH 12/13] Cleanup.

---
 .../mods/kubejs/block/BlockBuilder.java       | 57 -------------------
 .../kubejs/block/custom/BasicBlockJS.java     | 13 +----
 2 files changed, 1 insertion(+), 69 deletions(-)

diff --git a/common/src/main/java/dev/latvian/mods/kubejs/block/BlockBuilder.java b/common/src/main/java/dev/latvian/mods/kubejs/block/BlockBuilder.java
index ced755073..05305a88a 100644
--- a/common/src/main/java/dev/latvian/mods/kubejs/block/BlockBuilder.java
+++ b/common/src/main/java/dev/latvian/mods/kubejs/block/BlockBuilder.java
@@ -515,23 +515,6 @@ public BlockBuilder box(double x0, double y0, double z0, double x1, double y1, d
 		return box(x0, y0, z0, x1, y1, z1, true);
 	}
 
-	@Info("Set the shape of the block.")
-	public BlockBuilder box(Map<String, Object> condition, double x0, double y0, double z0, double x1, double y1, double z1) {
-		return box(condition, x0, y0, z0, x1, y1, z1, true);
-	}
-
-	@Info("Crates a callback for the shape of the block. '.box' will set be used if not present.")
-	public BlockBuilder box(Map<String, Object> condition, double x0, double y0, double z0, double x1, double y1, double z1, boolean scale16) {
-		List<AABB> cubes = shapeMap.getOrDefault(condition, new ArrayList<>());
-		if (scale16) {
-			cubes.add(new AABB(x0 / 16D, y0 / 16D, z0 / 16D, x1 / 16D, y1 / 16D, z1 / 16D));
-		} else {
-			cubes.add(new AABB(x0, y0, z0, x1, y1, z1));
-		}
-		shapeMap.put(condition, cubes);
-		return this;
-	}
-
 	public static VoxelShape createShape(List<AABB> boxes) {
 		if (boxes.isEmpty()) {
 			return Shapes.block();
@@ -869,44 +852,4 @@ public Block.Properties createProperties() {
 
 		return properties;
 	}
-
-	public Map<Map<String, Object>, VoxelShape> getShapeMap(Collection<Property<?>> properties) {
-		final Map<Map<String, Object>, List<AABB>>[] cubeMap = new Map[]{new HashMap<Map<String, Object>, List<AABB>>()};
-		properties.forEach(property -> {
-			if(cubeMap[0].isEmpty()) {
-				property.getPossibleValues().forEach(value -> {
-					Map<String, Object> propMap = new HashMap<>();
-					propMap.put(property.getName(), value);
-					cubeMap[0].put(propMap, new ArrayList<>());
-				});
-			}
-			else {
-				var oldMap = cubeMap[0];
-				cubeMap[0] = new HashMap<>();
-				oldMap.forEach((k,v) -> {
-					property.getPossibleValues().forEach(value -> {
-						Map<String, Object> propMap = new HashMap<>(k);
-						propMap.put(property.getName(), value);
-						cubeMap[0].put(propMap, v);
-					});
-				});
-			}
-		});
-		cubeMap[0].forEach((cubeMapKey,cubeMapValue) -> {
-			shapeMap.forEach((shapeMapKey,shapeMapValue) -> {
-				if(shapeMapKey.entrySet().stream().allMatch(entry -> compareValue(entry.getValue(),cubeMapKey.get(entry.getKey())))) cubeMapValue.addAll(shapeMapValue);
-			});
-		});
-		final Map<Map<String, Object>, VoxelShape> voxelShapeMap = new HashMap<>();
-		cubeMap[0].forEach((cubeMapKey,cubeMapValue) -> voxelShapeMap.put(cubeMapKey,BlockBuilder.createShape(cubeMapValue)));
-		return voxelShapeMap;
-	}
-	private boolean compareValue(Object o1, Object o2) {
-		if(o1.getClass() == Double.class || o1.getClass() == Float.class || o1.getClass() == Integer.class) {
-			if(o2.getClass() == Double.class || o2.getClass() == Float.class || o2.getClass() == Integer.class)
-				return ((Number) o1).doubleValue() == ((Number) o2).doubleValue();
-		}
-		else return o1.equals(o2);
-		return false;
-	}
 }
\ No newline at end of file
diff --git a/common/src/main/java/dev/latvian/mods/kubejs/block/custom/BasicBlockJS.java b/common/src/main/java/dev/latvian/mods/kubejs/block/custom/BasicBlockJS.java
index 6c4992cd4..568be0951 100644
--- a/common/src/main/java/dev/latvian/mods/kubejs/block/custom/BasicBlockJS.java
+++ b/common/src/main/java/dev/latvian/mods/kubejs/block/custom/BasicBlockJS.java
@@ -1,6 +1,5 @@
 package dev.latvian.mods.kubejs.block.custom;
 
-import com.mojang.serialization.MapCodec;
 import dev.latvian.mods.kubejs.block.BlockBuilder;
 import dev.latvian.mods.kubejs.block.BlockRightClickedEventJS;
 import dev.latvian.mods.kubejs.block.KubeJSBlockProperties;
@@ -40,7 +39,6 @@
 import net.minecraft.world.level.Level;
 import net.minecraft.world.level.LevelAccessor;
 import net.minecraft.world.level.block.Block;
-import net.minecraft.world.level.block.Blocks;
 import net.minecraft.world.level.block.EntityBlock;
 import net.minecraft.world.level.block.Mirror;
 import net.minecraft.world.level.block.Rotation;
@@ -51,7 +49,6 @@
 import net.minecraft.world.level.block.state.BlockState;
 import net.minecraft.world.level.block.state.StateDefinition;
 import net.minecraft.world.level.block.state.properties.BlockStateProperties;
-import net.minecraft.world.level.block.state.properties.Property;
 import net.minecraft.world.level.material.Fluid;
 import net.minecraft.world.level.material.FluidState;
 import net.minecraft.world.level.material.Fluids;
@@ -65,8 +62,6 @@
 import java.util.HashMap;
 import java.util.Map;
 import java.util.Optional;
-import java.util.concurrent.atomic.AtomicBoolean;
-import java.util.concurrent.atomic.AtomicReference;
 import java.util.function.Consumer;
 
 public class BasicBlockJS extends Block implements BlockKJS, SimpleWaterloggedBlock {
@@ -101,7 +96,6 @@ public <T extends BlockEntity> BlockEntityTicker<T> getTicker(Level level, Block
 
 	public final BlockBuilder blockBuilder;
 	public final VoxelShape shape;
-	public Map<Map<String, Object>, VoxelShape> shapeMap = new HashMap<>();
 
 	public BasicBlockJS(BlockBuilder p) {
 		super(p.createProperties());
@@ -110,7 +104,6 @@ public BasicBlockJS(BlockBuilder p) {
 
 
 		var blockState = stateDefinition.any();
-		this.shapeMap = p.getShapeMap(blockState.getProperties());
 		if (blockBuilder.defaultStateModification != null) {
 			var callbackJS = new BlockStateModifyCallbackJS(blockState);
 			if (safeCallback(blockBuilder.defaultStateModification, callbackJS, "Error while creating default blockState for block " + p.id)) {
@@ -138,11 +131,7 @@ public MutableComponent getName() {
 	@Override
 	@Deprecated
 	public VoxelShape getShape(BlockState state, BlockGetter level, BlockPos pos, CollisionContext context) {
-		Map<String, Object> blockPropertyValues = new HashMap<>();
-		state.getProperties().forEach((property) -> {
-			blockPropertyValues.put(property.getName(), state.getValue(property));
-		});
-		return shapeMap.getOrDefault(blockPropertyValues, shape);
+		return shape;
 	}
 
 	@Override

From aa5a6eb7a9142f084cc87b57ca80ac9e2a18dd54 Mon Sep 17 00:00:00 2001
From: Taylor <taylordspivey@gmail.com>
Date: Fri, 27 Sep 2024 11:44:44 -0500
Subject: [PATCH 13/13] Cleanup.

---
 .../main/java/dev/latvian/mods/kubejs/block/BlockBuilder.java  | 2 --
 .../dev/latvian/mods/kubejs/block/custom/BasicBlockJS.java     | 3 +--
 gradle.properties                                              | 2 +-
 3 files changed, 2 insertions(+), 5 deletions(-)

diff --git a/common/src/main/java/dev/latvian/mods/kubejs/block/BlockBuilder.java b/common/src/main/java/dev/latvian/mods/kubejs/block/BlockBuilder.java
index 05305a88a..32ab7be5f 100644
--- a/common/src/main/java/dev/latvian/mods/kubejs/block/BlockBuilder.java
+++ b/common/src/main/java/dev/latvian/mods/kubejs/block/BlockBuilder.java
@@ -77,7 +77,6 @@ public abstract class BlockBuilder extends BuilderBase<Block> {
 	public transient String model;
 	public transient BlockItemBuilder itemBuilder;
 	public transient List<AABB> customShape;
-	public Map<Map<String, Object>, List<AABB>> shapeMap;
 	public transient boolean noCollision;
 	public transient boolean notSolid;
 	public transient float slipperiness = Float.NaN;
@@ -124,7 +123,6 @@ public BlockBuilder(ResourceLocation i) {
 		itemBuilder = getOrCreateItemBuilder();
 		itemBuilder.blockBuilder = this;
 		customShape = new ArrayList<>();
-		shapeMap = new HashMap<>();
 		noCollision = false;
 		notSolid = false;
 		randomTickCallback = null;
diff --git a/common/src/main/java/dev/latvian/mods/kubejs/block/custom/BasicBlockJS.java b/common/src/main/java/dev/latvian/mods/kubejs/block/custom/BasicBlockJS.java
index 568be0951..4448b67a7 100644
--- a/common/src/main/java/dev/latvian/mods/kubejs/block/custom/BasicBlockJS.java
+++ b/common/src/main/java/dev/latvian/mods/kubejs/block/custom/BasicBlockJS.java
@@ -102,7 +102,6 @@ public BasicBlockJS(BlockBuilder p) {
 		blockBuilder = p;
 		shape = BlockBuilder.createShape(p.customShape);
 
-
 		var blockState = stateDefinition.any();
 		if (blockBuilder.defaultStateModification != null) {
 			var callbackJS = new BlockStateModifyCallbackJS(blockState);
@@ -259,7 +258,7 @@ public ItemStack pickupBlock(LevelAccessor levelAccessor, BlockPos blockPos, Blo
 			return SimpleWaterloggedBlock.super.pickupBlock(levelAccessor, blockPos, blockState);
 		}
 
-		return Items.STONE.getDefaultInstance();
+		return ItemStack.EMPTY;
 	}
 
 	@Override
diff --git a/gradle.properties b/gradle.properties
index 6dc255a7b..254eddf22 100644
--- a/gradle.properties
+++ b/gradle.properties
@@ -3,7 +3,7 @@ org.gradle.daemon=false
 mod_id=kubejs
 archives_base_name=kubejs
 mod_name=KubeJS
-mod_version=2001.6.5-custom-0.4
+mod_version=2001.6.5
 maven_group=dev.latvian.mods
 mod_author=LatvianModder
 curseforge_id=238086