From 2c058fe4b33694edeb07e3c445406b54200c450c Mon Sep 17 00:00:00 2001 From: MCTian-mi <35869948+MCTian-mi@users.noreply.github.com> Date: Thu, 28 Aug 2025 00:17:15 +0800 Subject: [PATCH 1/3] fix: let mobs spawn on stone blocks --- .../java/gregtech/common/blocks/StoneVariantBlock.java | 9 --------- 1 file changed, 9 deletions(-) diff --git a/src/main/java/gregtech/common/blocks/StoneVariantBlock.java b/src/main/java/gregtech/common/blocks/StoneVariantBlock.java index 72fcb6d5180..ead36803b8b 100644 --- a/src/main/java/gregtech/common/blocks/StoneVariantBlock.java +++ b/src/main/java/gregtech/common/blocks/StoneVariantBlock.java @@ -12,11 +12,8 @@ import net.minecraft.block.properties.PropertyEnum; import net.minecraft.block.state.BlockStateContainer; import net.minecraft.block.state.IBlockState; -import net.minecraft.entity.EntityLiving; import net.minecraft.item.Item; import net.minecraft.util.IStringSerializable; -import net.minecraft.util.math.BlockPos; -import net.minecraft.world.IBlockAccess; import org.jetbrains.annotations.NotNull; @@ -51,12 +48,6 @@ protected BlockStateContainer createBlockState() { return new BlockStateContainer(this, VARIANT); } - @Override - public boolean canCreatureSpawn(@NotNull IBlockState state, @NotNull IBlockAccess world, @NotNull BlockPos pos, - @NotNull EntityLiving.SpawnPlacementType type) { - return false; - } - @Override protected boolean canSilkHarvest() { return this.stoneVariant == StoneVariant.SMOOTH; From 06d8f60ce2267cbae6285ae884ca40d878bf5f2b Mon Sep 17 00:00:00 2001 From: MCTian-mi <35869948+MCTian-mi@users.noreply.github.com> Date: Mon, 1 Sep 2025 16:39:01 +0800 Subject: [PATCH 2/3] ban spawning on concrete blocks --- .../gregtech/api/block/IStateSpawnControl.java | 10 ++++++++++ .../java/gregtech/api/block/VariantBlock.java | 11 +++++++++++ .../common/blocks/StoneVariantBlock.java | 18 +++++++++++++++--- 3 files changed, 36 insertions(+), 3 deletions(-) create mode 100644 src/main/java/gregtech/api/block/IStateSpawnControl.java diff --git a/src/main/java/gregtech/api/block/IStateSpawnControl.java b/src/main/java/gregtech/api/block/IStateSpawnControl.java new file mode 100644 index 00000000000..f632f394841 --- /dev/null +++ b/src/main/java/gregtech/api/block/IStateSpawnControl.java @@ -0,0 +1,10 @@ +package gregtech.api.block; + +import net.minecraft.block.state.IBlockState; + +import org.jetbrains.annotations.NotNull; + +public interface IStateSpawnControl { + + boolean canCreatureSpawn(@NotNull IBlockState state); +} diff --git a/src/main/java/gregtech/api/block/VariantBlock.java b/src/main/java/gregtech/api/block/VariantBlock.java index 4440d6d60b5..e5cdcc3bd52 100644 --- a/src/main/java/gregtech/api/block/VariantBlock.java +++ b/src/main/java/gregtech/api/block/VariantBlock.java @@ -13,10 +13,12 @@ import net.minecraft.client.util.ITooltipFlag; import net.minecraft.creativetab.CreativeTabs; import net.minecraft.entity.Entity; +import net.minecraft.entity.EntityLiving; import net.minecraft.item.ItemStack; import net.minecraft.util.IStringSerializable; import net.minecraft.util.NonNullList; import net.minecraft.util.math.BlockPos; +import net.minecraft.world.IBlockAccess; import net.minecraft.world.World; import net.minecraftforge.fml.relauncher.Side; import net.minecraftforge.fml.relauncher.SideOnly; @@ -125,6 +127,15 @@ public SoundType getSoundType(@NotNull IBlockState state, @NotNull World world, return super.getSoundType(state, world, pos, entity); } + @Override + public boolean canCreatureSpawn(@NotNull IBlockState state, @NotNull IBlockAccess world, @NotNull BlockPos pos, + @NotNull EntityLiving.SpawnPlacementType type) { + if (getState(state) instanceof IStateSpawnControl stateSpawnControl) { + return stateSpawnControl.canCreatureSpawn(state); + } + return super.canCreatureSpawn(state, world, pos, type); + } + // magic is here @SuppressWarnings("unchecked") protected static Class getActualTypeParameter(Class thisClass, Class declaringClass) { diff --git a/src/main/java/gregtech/common/blocks/StoneVariantBlock.java b/src/main/java/gregtech/common/blocks/StoneVariantBlock.java index ead36803b8b..f678c8facae 100644 --- a/src/main/java/gregtech/common/blocks/StoneVariantBlock.java +++ b/src/main/java/gregtech/common/blocks/StoneVariantBlock.java @@ -1,5 +1,6 @@ package gregtech.common.blocks; +import gregtech.api.block.IStateSpawnControl; import gregtech.api.block.VariantBlock; import gregtech.api.items.toolitem.ToolClasses; import gregtech.api.unification.material.Material; @@ -60,21 +61,27 @@ public Item getItemDropped(@NotNull IBlockState state, @NotNull Random rand, int MetaBlocks.STONE_BLOCKS.get(StoneVariant.COBBLE) : this); } - public enum StoneType implements IStringSerializable { + public enum StoneType implements IStringSerializable, IStateSpawnControl { BLACK_GRANITE("black_granite", MapColor.BLACK), RED_GRANITE("red_granite", MapColor.RED), MARBLE("marble", MapColor.QUARTZ), BASALT("basalt", MapColor.BLACK_STAINED_HARDENED_CLAY), - CONCRETE_LIGHT("concrete_light", MapColor.STONE), - CONCRETE_DARK("concrete_dark", MapColor.STONE); + CONCRETE_LIGHT("concrete_light", MapColor.STONE, false), + CONCRETE_DARK("concrete_dark", MapColor.STONE, false); private final String name; + private final boolean allowSpawn; public final MapColor mapColor; StoneType(@NotNull String name, @NotNull MapColor mapColor) { + this(name, mapColor, true); + } + + StoneType(@NotNull String name, @NotNull MapColor mapColor, boolean allowSpawn) { this.name = name; this.mapColor = mapColor; + this.allowSpawn = allowSpawn; } @NotNull @@ -99,6 +106,11 @@ public Material getMaterial() { case CONCRETE_LIGHT, CONCRETE_DARK -> Materials.Concrete; }; } + + @Override + public boolean canCreatureSpawn(@NotNull IBlockState state) { + return this.allowSpawn; + } } public enum StoneVariant { From d8f11348b4837f7cba1e3940e4f05568f4030b52 Mon Sep 17 00:00:00 2001 From: MCTian-mi <35869948+MCTian-mi@users.noreply.github.com> Date: Mon, 1 Sep 2025 16:41:48 +0800 Subject: [PATCH 3/3] feat: be more informative --- src/main/java/gregtech/api/block/IStateSpawnControl.java | 6 +++++- src/main/java/gregtech/api/block/VariantBlock.java | 2 +- src/main/java/gregtech/common/blocks/StoneVariantBlock.java | 6 +++++- 3 files changed, 11 insertions(+), 3 deletions(-) diff --git a/src/main/java/gregtech/api/block/IStateSpawnControl.java b/src/main/java/gregtech/api/block/IStateSpawnControl.java index f632f394841..f1c0e8f7354 100644 --- a/src/main/java/gregtech/api/block/IStateSpawnControl.java +++ b/src/main/java/gregtech/api/block/IStateSpawnControl.java @@ -1,10 +1,14 @@ package gregtech.api.block; import net.minecraft.block.state.IBlockState; +import net.minecraft.entity.EntityLiving; +import net.minecraft.util.math.BlockPos; +import net.minecraft.world.IBlockAccess; import org.jetbrains.annotations.NotNull; public interface IStateSpawnControl { - boolean canCreatureSpawn(@NotNull IBlockState state); + boolean canCreatureSpawn(@NotNull IBlockState state, @NotNull IBlockAccess world, @NotNull BlockPos pos, + @NotNull EntityLiving.SpawnPlacementType type); } diff --git a/src/main/java/gregtech/api/block/VariantBlock.java b/src/main/java/gregtech/api/block/VariantBlock.java index e5cdcc3bd52..73edd6f052e 100644 --- a/src/main/java/gregtech/api/block/VariantBlock.java +++ b/src/main/java/gregtech/api/block/VariantBlock.java @@ -131,7 +131,7 @@ public SoundType getSoundType(@NotNull IBlockState state, @NotNull World world, public boolean canCreatureSpawn(@NotNull IBlockState state, @NotNull IBlockAccess world, @NotNull BlockPos pos, @NotNull EntityLiving.SpawnPlacementType type) { if (getState(state) instanceof IStateSpawnControl stateSpawnControl) { - return stateSpawnControl.canCreatureSpawn(state); + return stateSpawnControl.canCreatureSpawn(state, world, pos, type); } return super.canCreatureSpawn(state, world, pos, type); } diff --git a/src/main/java/gregtech/common/blocks/StoneVariantBlock.java b/src/main/java/gregtech/common/blocks/StoneVariantBlock.java index f678c8facae..2dc1d13a527 100644 --- a/src/main/java/gregtech/common/blocks/StoneVariantBlock.java +++ b/src/main/java/gregtech/common/blocks/StoneVariantBlock.java @@ -13,8 +13,11 @@ import net.minecraft.block.properties.PropertyEnum; import net.minecraft.block.state.BlockStateContainer; import net.minecraft.block.state.IBlockState; +import net.minecraft.entity.EntityLiving; import net.minecraft.item.Item; import net.minecraft.util.IStringSerializable; +import net.minecraft.util.math.BlockPos; +import net.minecraft.world.IBlockAccess; import org.jetbrains.annotations.NotNull; @@ -108,7 +111,8 @@ public Material getMaterial() { } @Override - public boolean canCreatureSpawn(@NotNull IBlockState state) { + public boolean canCreatureSpawn(@NotNull IBlockState state, @NotNull IBlockAccess world, @NotNull BlockPos pos, + @NotNull EntityLiving.SpawnPlacementType type) { return this.allowSpawn; } }