From b7c2d8e898cee44d0c43cc00d4471f25202b2ce6 Mon Sep 17 00:00:00 2001 From: Tschipp Date: Wed, 20 Oct 2021 22:38:34 +0200 Subject: [PATCH] Should now be harder to place blocks where they shouldn't be placed --- gradle.properties | 2 +- .../carryon/common/event/ItemEvents.java | 56 +++++++++++++------ 2 files changed, 40 insertions(+), 18 deletions(-) diff --git a/gradle.properties b/gradle.properties index af0736a..c235296 100644 --- a/gradle.properties +++ b/gradle.properties @@ -1,5 +1,5 @@ # Sets default memory used for gradle commands. Can be overridden by user or command line properties. # This is required to provide enough memory for the Minecraft decompilation process. org.gradle.jvmargs=-Xmx3G -version=1.12.4 +version=1.12.5 minecraft_version=1.12.2 \ No newline at end of file diff --git a/src/main/java/tschipp/carryon/common/event/ItemEvents.java b/src/main/java/tschipp/carryon/common/event/ItemEvents.java index 57ab370..d3ef387 100644 --- a/src/main/java/tschipp/carryon/common/event/ItemEvents.java +++ b/src/main/java/tschipp/carryon/common/event/ItemEvents.java @@ -26,6 +26,7 @@ import net.minecraft.tileentity.TileEntity; import net.minecraft.util.EnumFacing; import net.minecraft.util.EnumHand; import net.minecraft.util.math.BlockPos; +import net.minecraft.util.math.BlockPos.MutableBlockPos; import net.minecraft.util.text.TextComponentString; import net.minecraft.util.text.TextFormatting; import net.minecraft.util.text.event.ClickEvent; @@ -104,6 +105,7 @@ public class ItemEvents World world = event.getWorld(); if (e instanceof EntityItem) { + System.out.println("Foo"); EntityItem eitem = (EntityItem) e; ItemStack stack = eitem.getItem(); Item item = stack.getItem(); @@ -112,23 +114,19 @@ public class ItemEvents BlockPos pos = eitem.getPosition(); BlockPos finalPos = pos; Block block = ItemTile.getBlock(stack); - if (!world.getBlockState(pos).getBlock().isReplaceable(world, pos) || !block.canPlaceBlockAt(world, pos)) + boolean replaceable = world.getBlockState(pos).getBlock().isReplaceable(world, pos); + boolean placeable = block.canPlaceBlockAt(world, pos); + if (!replaceable || !placeable) { - for (EnumFacing facing : EnumFacing.VALUES) - { - BlockPos offsetPos = pos.offset(facing); - if (world.getBlockState(offsetPos).getBlock().isReplaceable(world, offsetPos) && block.canPlaceBlockAt(world, offsetPos)) - { - finalPos = offsetPos; - break; - } - } + finalPos = getBestPosForPlacement(block, pos, world); } world.setBlockState(finalPos, ItemTile.getBlockState(stack)); TileEntity tile = world.getTileEntity(finalPos); if (tile != null) { - tile.readFromNBT(ItemTile.getTileData(stack)); + NBTTagCompound nbt = ItemTile.getTileData(stack); + ItemTile.updateTileLocation(nbt, finalPos); + tile.readFromNBT(nbt); tile.setPos(finalPos); } ItemTile.clearTileData(stack); @@ -144,6 +142,28 @@ public class ItemEvents } + private BlockPos getBestPosForPlacement(Block block, BlockPos pos, World world) + { + MutableBlockPos m = new MutableBlockPos(pos); + int x = pos.getX(); + int y = pos.getY(); + int z = pos.getZ(); + + for (int i = 0; i < 64; i++) + { + for (int k = 0; k < 64; k++) + { + for (int j = 0; j + y < 256; j++) + { + m.setPos(x + i, y + j, z + k); + if (world.getBlockState(m).getBlock().isReplaceable(world, m) && block.canPlaceBlockAt(world, m)) + return m; + } + } + } + return m; + } + @SubscribeEvent public void onPlayerLogin(PlayerLoggedInEvent event) { @@ -272,7 +292,7 @@ public class ItemEvents public void onWorldTick(TickEvent.WorldTickEvent event) { Set> set = new HashSet>(positions.entrySet()); - + for (Entry entry : set) { entry.setValue(entry.getValue() + 1); @@ -474,13 +494,15 @@ public class ItemEvents getSlots(player, RegistrationHandler.itemEntity, itemSlots); ItemStack inHand = player.getHeldItemMainhand(); - if (itemSlots.size() > 1 || (itemSlots.size() > 0 - && (inHand.getItem() != RegistrationHandler.itemTile && inHand.getItem() != RegistrationHandler.itemEntity))) + if (itemSlots.size() > 1 || (itemSlots.size() > 0 && (inHand.getItem() != RegistrationHandler.itemTile && inHand.getItem() != RegistrationHandler.itemEntity))) { - // if there is only one item, and it's in the hotbar, just force the selection there - // this is necessary, because when switching dimensions, Minecraft will reset selection to 0 for one tick + // if there is only one item, and it's in the hotbar, just + // force the selection there + // this is necessary, because when switching dimensions, + // Minecraft will reset selection to 0 for one tick // and completely reset it to 0 when returning from the end - // if there are multiple, drop all of them, as it's likely a player trying to exploit a bug + // if there are multiple, drop all of them, as it's likely a + // player trying to exploit a bug if (itemSlots.size() == 1 && InventoryPlayer.isHotbar(itemSlots.get(0))) { player.inventory.currentItem = itemSlots.get(0);