From f41d493552133bfde457e4a345fa512d7ebeef68 Mon Sep 17 00:00:00 2001 From: TelepathicGrunt <40846040+TelepathicGrunt@users.noreply.github.com> Date: Thu, 21 Jul 2022 16:06:02 -0400 Subject: [PATCH] Allow modded blocks overriding canStickTo prevent sticking to vanilla blocks/other modded blocks (#8837) --- .../piston/PistonStructureResolver.java.patch | 4 +- .../common/extensions/IForgeBlockState.java | 3 +- .../debug/block/StickyBlockTest.java | 60 ++++++++++++++----- 3 files changed, 49 insertions(+), 18 deletions(-) diff --git a/patches/minecraft/net/minecraft/world/level/block/piston/PistonStructureResolver.java.patch b/patches/minecraft/net/minecraft/world/level/block/piston/PistonStructureResolver.java.patch index 60100d54f6..5fb185eb0a 100644 --- a/patches/minecraft/net/minecraft/world/level/block/piston/PistonStructureResolver.java.patch +++ b/patches/minecraft/net/minecraft/world/level/block/piston/PistonStructureResolver.java.patch @@ -46,7 +46,7 @@ + oldState = blockstate; blockstate = this.f_60409_.m_8055_(blockpos); - if (blockstate.m_60795_() || !m_155939_(blockstate1, blockstate) || !PistonBaseBlock.m_60204_(blockstate, this.f_60409_, blockpos, this.f_60413_, false, this.f_60413_.m_122424_()) || blockpos.equals(this.f_60410_)) { -+ if (blockstate.m_60795_() || !oldState.canStickTo(blockstate) || !PistonBaseBlock.m_60204_(blockstate, this.f_60409_, blockpos, this.f_60413_, false, this.f_60413_.m_122424_()) || blockpos.equals(this.f_60410_)) { ++ if (blockstate.m_60795_() || !(oldState.canStickTo(blockstate) && blockstate.canStickTo(oldState)) || !PistonBaseBlock.m_60204_(blockstate, this.f_60409_, blockpos, this.f_60413_, false, this.f_60413_.m_122424_()) || blockpos.equals(this.f_60410_)) { break; } @@ -64,7 +64,7 @@ BlockPos blockpos = p_60432_.m_121945_(direction); BlockState blockstate1 = this.f_60409_.m_8055_(blockpos); - if (m_155939_(blockstate1, blockstate) && !this.m_60433_(blockpos, direction)) { -+ if (blockstate1.canStickTo(blockstate) && !this.m_60433_(blockpos, direction)) { ++ if (blockstate1.canStickTo(blockstate) && blockstate.canStickTo(blockstate1) && !this.m_60433_(blockpos, direction)) { return false; } } diff --git a/src/main/java/net/minecraftforge/common/extensions/IForgeBlockState.java b/src/main/java/net/minecraftforge/common/extensions/IForgeBlockState.java index 31d465afaa..fe55e30aeb 100644 --- a/src/main/java/net/minecraftforge/common/extensions/IForgeBlockState.java +++ b/src/main/java/net/minecraftforge/common/extensions/IForgeBlockState.java @@ -39,6 +39,7 @@ import net.minecraft.world.level.block.SoundType; import net.minecraft.world.level.block.state.BlockState; import net.minecraftforge.common.ToolAction; import net.minecraftforge.common.ToolActions; +import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; public interface IForgeBlockState @@ -441,7 +442,7 @@ public interface IForgeBlockState * @param other Other block * @return True to link blocks */ - default boolean canStickTo(BlockState other) + default boolean canStickTo(@NotNull BlockState other) { return self().getBlock().canStickTo(self(), other); } diff --git a/src/test/java/net/minecraftforge/debug/block/StickyBlockTest.java b/src/test/java/net/minecraftforge/debug/block/StickyBlockTest.java index fd862cd533..10f11359d1 100644 --- a/src/test/java/net/minecraftforge/debug/block/StickyBlockTest.java +++ b/src/test/java/net/minecraftforge/debug/block/StickyBlockTest.java @@ -6,16 +6,23 @@ package net.minecraftforge.debug.block; import net.minecraft.world.level.block.Block; +import net.minecraft.world.level.block.Blocks; import net.minecraft.world.level.block.state.BlockState; import net.minecraft.world.level.material.Material; import net.minecraft.world.item.BlockItem; import net.minecraft.world.item.Item; +import net.minecraftforge.common.MinecraftForge; +import net.minecraftforge.eventbus.api.IEventBus; import net.minecraftforge.eventbus.api.SubscribeEvent; import net.minecraftforge.fml.common.Mod; import net.minecraftforge.fml.common.Mod.EventBusSubscriber.Bus; +import net.minecraftforge.fml.javafmlmod.FMLJavaModLoadingContext; +import net.minecraftforge.registries.DeferredRegister; import net.minecraftforge.registries.ForgeRegistries; import net.minecraftforge.registries.ObjectHolder; import net.minecraftforge.registries.RegisterEvent; +import net.minecraftforge.registries.RegistryObject; +import org.jetbrains.annotations.Nullable; @Mod(StickyBlockTest.MODID) @Mod.EventBusSubscriber(bus = Bus.MOD) @@ -23,26 +30,49 @@ public class StickyBlockTest { static final String MODID = "custom_slime_block_test"; static final String BLOCK_ID = "test_block"; + static final String BLOCK_ID_2 = "test_block_2"; - @ObjectHolder(registryName = "block", value = BLOCK_ID) - public static Block BLUE_BLOCK; + public static final DeferredRegister BLOCKS = DeferredRegister.create(ForgeRegistries.BLOCKS, MODID); + public static final DeferredRegister ITEMS = DeferredRegister.create(ForgeRegistries.ITEMS.getRegistryName(), MODID); - @SubscribeEvent - public static void registerBlocks(RegisterEvent event) + public static final RegistryObject BLUE_BLOCK = BLOCKS.register(BLOCK_ID, () -> new Block(Block.Properties.of(Material.STONE)) { - event.register(ForgeRegistries.Keys.BLOCKS, helper -> helper.register(BLOCK_ID, new Block(Block.Properties.of(Material.STONE)) + @Override + public boolean isStickyBlock(BlockState state) { - @Override - public boolean isStickyBlock(BlockState state) - { - return true; - } - })); - } + return true; + } + }); - @SubscribeEvent - public static void registerItems(RegisterEvent event) + public static final RegistryObject RED_BLOCK = BLOCKS.register(BLOCK_ID_2, () -> new Block(Block.Properties.of(Material.STONE)) { - event.register(ForgeRegistries.Keys.ITEMS, helper -> helper.register(BLOCK_ID, new BlockItem(BLUE_BLOCK, new Item.Properties()))); + @Override + public boolean isStickyBlock(BlockState state) + { + return true; + } + + @Override + public boolean isSlimeBlock(BlockState state) + { + return true; + } + + @Override + public boolean canStickTo(BlockState state, BlockState other) + { + if (state.getBlock() == RED_BLOCK.get() && other.getBlock() == Blocks.SLIME_BLOCK) return false; + return state.isStickyBlock() || other.isStickyBlock(); + } + }); + + public static final RegistryObject BLUE_BLOCK_ITEM = ITEMS.register(BLOCK_ID, () -> new BlockItem(BLUE_BLOCK.get(), new Item.Properties())); + public static final RegistryObject RED_BLOCK_ITEM = ITEMS.register(BLOCK_ID_2, () -> new BlockItem(RED_BLOCK.get(), new Item.Properties())); + + public StickyBlockTest() + { + IEventBus modEventBus = FMLJavaModLoadingContext.get().getModEventBus(); + BLOCKS.register(modEventBus); + ITEMS.register(modEventBus); } }