From 3891cc349f1ecdcece099dffb8dd815b5f4a1382 Mon Sep 17 00:00:00 2001 From: Christian Knaapen Date: Sun, 4 Nov 2018 18:43:16 +0100 Subject: [PATCH] Mining speed is decreased based on blocks mined (extra blocks count for 50%, which will be configurable). Tool durability is checked after each block break (no more breaking 5 blocks with 1 durability). Fortune is taken into account. Outlines now change to blocks that will be broken when holding tools. Added indication QuickReplace is on: outline of current block will be white. Fixed opening Randomizer Bag in offhand. Fixed placing blocks with Randomizer Bag in offhand. Fixed mirror block outline showing up outside range. Fixed outline of QuickReplace not being under replaceables like tall grass. --- build.gradle | 2 +- .../nl/requios/effortlessbuilding/Array.java | 40 ++++-- .../EffortlessBuilding.java | 2 +- .../effortlessbuilding/EventHandler.java | 29 +++++ .../nl/requios/effortlessbuilding/Mirror.java | 121 +++++++++++++++--- .../effortlessbuilding/QuickReplace.java | 5 +- .../effortlessbuilding/RenderHelper.java | 56 +++++--- .../effortlessbuilding/SurvivalHelper.java | 40 +++++- .../gui/RandomizerBagGuiHandler.java | 13 +- .../effortlessbuilding/gui/SettingsGui.java | 3 - .../item/ItemRandomizerBag.java | 10 +- 11 files changed, 253 insertions(+), 68 deletions(-) diff --git a/build.gradle b/build.gradle index da359c8..c97cc96 100644 --- a/build.gradle +++ b/build.gradle @@ -11,7 +11,7 @@ apply plugin: 'net.minecraftforge.gradle.forge' //Only edit below this line, the above code adds and enables the necessary things for Forge to be setup. -version = "0.3.3" +version = "0.3.4" group = "nl.requios.effortlessbuilding" // http://maven.apache.org/guides/mini/guide-naming-conventions.html archivesBaseName = "effortlessbuilding" diff --git a/src/main/java/nl/requios/effortlessbuilding/Array.java b/src/main/java/nl/requios/effortlessbuilding/Array.java index f710bf5..40ef703 100644 --- a/src/main/java/nl/requios/effortlessbuilding/Array.java +++ b/src/main/java/nl/requios/effortlessbuilding/Array.java @@ -9,6 +9,7 @@ import net.minecraft.util.EnumHand; import net.minecraft.util.math.BlockPos; import net.minecraft.util.math.Vec3i; import net.minecraft.world.World; +import net.minecraftforge.event.entity.player.PlayerEvent; import net.minecraftforge.event.world.BlockEvent; import net.minecraftforge.items.IItemHandler; import nl.requios.effortlessbuilding.item.ItemRandomizerBag; @@ -45,15 +46,15 @@ public class Array { BlockPos pos = event.getPos(); Vec3i offset = new Vec3i(a.offset.getX(), a.offset.getY(), a.offset.getZ()); - //Randomizer bag synergy - IItemHandler bagInventory = null; - if (event.getPlayer().getHeldItemMainhand().getItem() instanceof ItemRandomizerBag) { - bagInventory = ItemRandomizerBag.getBagInventory(event.getPlayer().getHeldItemMainhand()); - } - //Get itemstack ItemStack itemStack = event.getPlayer().getHeldItem(event.getHand()); + //Randomizer bag synergy + IItemHandler bagInventory = null; + if (!itemStack.isEmpty() && itemStack.getItem() instanceof ItemRandomizerBag) { + bagInventory = ItemRandomizerBag.getBagInventory(itemStack); + } + for (int i = 0; i < a.count; i++) { pos = pos.add(offset); if (event.getWorld().isBlockLoaded(pos, true)) { @@ -65,7 +66,7 @@ public class Array { if (bagInventory != null) { itemStack = ItemRandomizerBag.pickRandomStack(bagInventory); if (itemStack.isEmpty()) continue; - blockState = getBlockStateFromRandomizerBag(bagInventory, event.getWorld(), event.getPlayer(), event.getPos(), itemStack); + blockState = getBlockStateFromRandomizerBag(bagInventory, event.getWorld(), event.getPlayer(), event.getPos(), itemStack, event.getHand()); if (blockState == null) continue; } @@ -78,16 +79,16 @@ public class Array { return true; } - private static IBlockState getBlockStateFromRandomizerBag(IItemHandler bagInventory, World world, EntityPlayer player, BlockPos pos, ItemStack itemStack) { + private static IBlockState getBlockStateFromRandomizerBag(IItemHandler bagInventory, World world, EntityPlayer player, BlockPos pos, ItemStack itemStack, EnumHand hand) { //TODO get facing from getPlacedAgainst and getPlacedBlock - return Block.getBlockFromItem(itemStack.getItem()).getStateForPlacement(world, pos, EnumFacing.NORTH, 0, 0, 0, itemStack.getMetadata(), player, EnumHand.MAIN_HAND); + return Block.getBlockFromItem(itemStack.getItem()).getStateForPlacement(world, pos, EnumFacing.NORTH, 0, 0, 0, itemStack.getMetadata(), player, hand); } //Called from EventHandler public static void onBlockBroken(BlockEvent.BreakEvent event) { if (event.getWorld().isRemote) return; - //find arraysettings for the player that placed the block + //find arraysettings for the player that broke the block ArraySettings a = BuildSettingsManager.getBuildSettings(event.getPlayer()).getArraySettings(); if (a == null || !a.enabled) return; @@ -101,4 +102,23 @@ public class Array { } } + //Called from EventHandler + public static float getTotalBlockHardness(World world, EntityPlayer player, BlockPos pos) { + float hardness = 0; + + //find arraysettings for the player that broke the block + ArraySettings a = BuildSettingsManager.getBuildSettings(player).getArraySettings(); + if (a == null || !a.enabled) return 0; + + if (a.offset.getX() == 0 && a.offset.getY() == 0 && a.offset.getZ() == 0) return 0; + + Vec3i offset = new Vec3i(a.offset.getX(), a.offset.getY(), a.offset.getZ()); + for (int i = 0; i < a.count; i++) { + pos = pos.add(offset); + if (SurvivalHelper.canBreak(world, player, pos)) + hardness += world.getBlockState(pos).getBlockHardness(world, pos); + } + return hardness; + } + } diff --git a/src/main/java/nl/requios/effortlessbuilding/EffortlessBuilding.java b/src/main/java/nl/requios/effortlessbuilding/EffortlessBuilding.java index 98e68d4..7be4ea7 100644 --- a/src/main/java/nl/requios/effortlessbuilding/EffortlessBuilding.java +++ b/src/main/java/nl/requios/effortlessbuilding/EffortlessBuilding.java @@ -29,7 +29,7 @@ public class EffortlessBuilding { public static final String MODID = "effortlessbuilding"; public static final String NAME = "Effortless Building"; - public static final String VERSION = "0.3.3"; + public static final String VERSION = "0.3.4"; @Mod.Instance(EffortlessBuilding.MODID) public static EffortlessBuilding instance; diff --git a/src/main/java/nl/requios/effortlessbuilding/EventHandler.java b/src/main/java/nl/requios/effortlessbuilding/EventHandler.java index 47985b5..4329282 100644 --- a/src/main/java/nl/requios/effortlessbuilding/EventHandler.java +++ b/src/main/java/nl/requios/effortlessbuilding/EventHandler.java @@ -11,8 +11,12 @@ import net.minecraft.item.crafting.IRecipe; import net.minecraft.util.EnumFacing; import net.minecraft.util.EnumHand; import net.minecraft.util.ResourceLocation; +import net.minecraft.util.math.BlockPos; +import net.minecraft.world.World; +import net.minecraftforge.common.ForgeHooks; import net.minecraftforge.event.AttachCapabilitiesEvent; import net.minecraftforge.event.RegistryEvent; +import net.minecraftforge.event.entity.player.PlayerEvent; import net.minecraftforge.event.entity.player.PlayerInteractEvent; import net.minecraftforge.event.world.BlockEvent; import net.minecraftforge.fml.common.Mod; @@ -79,4 +83,29 @@ public class EventHandler Array.onBlockBroken(event); } + @SubscribeEvent + public static void breakSpeed(PlayerEvent.BreakSpeed event) { + //TODO disable with config + EntityPlayer player = event.getEntityPlayer(); + World world = player.world; + BlockPos pos = event.getPos(); + + //EffortlessBuilding.log(player, String.valueOf(event.getNewSpeed())); + + float originalBlockHardness = event.getState().getBlockHardness(world, pos); + float totalBlockHardness = 0; + totalBlockHardness += Mirror.getTotalBlockHardness(world, player, pos); + totalBlockHardness += Array.getTotalBlockHardness(world, player, pos); + + //TODO get percentage from config + float percentage = 0.5f; + totalBlockHardness *= percentage; + totalBlockHardness += originalBlockHardness; + + float newSpeed = event.getOriginalSpeed() / totalBlockHardness * originalBlockHardness; + if (Float.isNaN(newSpeed) || newSpeed == 0f) newSpeed = 1f; + event.setNewSpeed(newSpeed); + + //EffortlessBuilding.log(player, String.valueOf(event.getNewSpeed())); + } } diff --git a/src/main/java/nl/requios/effortlessbuilding/Mirror.java b/src/main/java/nl/requios/effortlessbuilding/Mirror.java index dc40ad8..bd42789 100644 --- a/src/main/java/nl/requios/effortlessbuilding/Mirror.java +++ b/src/main/java/nl/requios/effortlessbuilding/Mirror.java @@ -8,6 +8,7 @@ import net.minecraft.util.EnumFacing; import net.minecraft.util.EnumHand; import net.minecraft.util.math.BlockPos; import net.minecraft.util.math.Vec3d; +import net.minecraft.util.math.Vec3i; import net.minecraft.world.World; import net.minecraftforge.common.util.BlockSnapshot; import net.minecraftforge.event.world.BlockEvent; @@ -59,30 +60,32 @@ public class Mirror { oldBlockPos.getZ() + 0.5 < m.position.z - m.radius || oldBlockPos.getZ() + 0.5 > m.position.z + m.radius) return false; + //Get itemstack ItemStack itemStack = event.getPlayer().getHeldItem(event.getHand()); //Randomizer bag synergy IItemHandler bagInventory = null; - if (event.getPlayer().getHeldItem(event.getHand()).getItem() == EffortlessBuilding.ITEM_RANDOMIZER_BAG) { - bagInventory = ItemRandomizerBag.getBagInventory(event.getPlayer().getHeldItem(EnumHand.MAIN_HAND)); + if (!itemStack.isEmpty() && itemStack.getItem() instanceof ItemRandomizerBag) { + bagInventory = ItemRandomizerBag.getBagInventory(itemStack); } if (m.mirrorX) { - placeMirrorX(event.getWorld(), event.getPlayer(), m, event.getPos(), event.getPlacedBlock(), bagInventory, itemStack); + placeMirrorX(event.getWorld(), event.getPlayer(), m, event.getPos(), event.getPlacedBlock(), bagInventory, itemStack, event.getHand()); } if (m.mirrorY) { - placeMirrorY(event.getWorld(), event.getPlayer(), m, oldBlockPos, event.getPlacedBlock(), bagInventory, itemStack); + placeMirrorY(event.getWorld(), event.getPlayer(), m, oldBlockPos, event.getPlacedBlock(), bagInventory, itemStack, event.getHand()); } if (m.mirrorZ) { - placeMirrorZ(event.getWorld(), event.getPlayer(), m, oldBlockPos, event.getPlacedBlock(), bagInventory, itemStack); + placeMirrorZ(event.getWorld(), event.getPlayer(), m, oldBlockPos, event.getPlacedBlock(), bagInventory, itemStack, event.getHand()); } return true; } - private static void placeMirrorX(World world, EntityPlayer player, MirrorSettings m, BlockPos oldBlockPos, IBlockState oldBlockState, IItemHandler bagInventory, ItemStack itemStack) { + private static void placeMirrorX(World world, EntityPlayer player, MirrorSettings m, BlockPos oldBlockPos, IBlockState oldBlockState, + IItemHandler bagInventory, ItemStack itemStack, EnumHand hand) { //find mirror position double x = m.position.x + (m.position.x - oldBlockPos.getX() - 0.5); BlockPos newBlockPos = new BlockPos(x, oldBlockPos.getY(), oldBlockPos.getZ()); @@ -91,20 +94,21 @@ public class Mirror { if (bagInventory != null) { itemStack = ItemRandomizerBag.pickRandomStack(bagInventory); if (itemStack.isEmpty()) return; - oldBlockState = getBlockStateFromRandomizerBag(bagInventory, world, player, oldBlockPos, itemStack); + oldBlockState = getBlockStateFromRandomizerBag(bagInventory, world, player, oldBlockPos, itemStack, hand); if (oldBlockState == null) return; } IBlockState newBlockState = oldBlockState.withMirror(net.minecraft.util.Mirror.FRONT_BACK); //place block if (world.isBlockLoaded(newBlockPos, true)) { - placeBlock(world, player, newBlockPos, newBlockState, itemStack); + placeBlock(world, player, newBlockPos, newBlockState, itemStack, hand); } - if (m.mirrorY) placeMirrorY(world, player, m, newBlockPos, newBlockState, bagInventory, itemStack); - if (m.mirrorZ) placeMirrorZ(world, player, m, newBlockPos, newBlockState, bagInventory, itemStack); + if (m.mirrorY) placeMirrorY(world, player, m, newBlockPos, newBlockState, bagInventory, itemStack, hand); + if (m.mirrorZ) placeMirrorZ(world, player, m, newBlockPos, newBlockState, bagInventory, itemStack, hand); } - private static void placeMirrorY(World world, EntityPlayer player, MirrorSettings m, BlockPos oldBlockPos, IBlockState oldBlockState, IItemHandler bagInventory, ItemStack itemStack) { + private static void placeMirrorY(World world, EntityPlayer player, MirrorSettings m, BlockPos oldBlockPos, IBlockState oldBlockState, + IItemHandler bagInventory, ItemStack itemStack, EnumHand hand) { //find mirror position double y = m.position.y + (m.position.y - oldBlockPos.getY() - 0.5); BlockPos newBlockPos = new BlockPos(oldBlockPos.getX(), y, oldBlockPos.getZ()); @@ -113,19 +117,20 @@ public class Mirror { if (bagInventory != null) { itemStack = ItemRandomizerBag.pickRandomStack(bagInventory); if (itemStack.isEmpty()) return; - oldBlockState = getBlockStateFromRandomizerBag(bagInventory, world, player, oldBlockPos, itemStack); + oldBlockState = getBlockStateFromRandomizerBag(bagInventory, world, player, oldBlockPos, itemStack, hand); if (oldBlockState == null) return; } IBlockState newBlockState = getVerticalMirror(oldBlockState); //place block if (world.isBlockLoaded(newBlockPos, true)) { - placeBlock(world, player, newBlockPos, newBlockState, itemStack); + placeBlock(world, player, newBlockPos, newBlockState, itemStack, hand); } - if (m.mirrorZ) placeMirrorZ(world, player, m, newBlockPos, newBlockState, bagInventory, itemStack); + if (m.mirrorZ) placeMirrorZ(world, player, m, newBlockPos, newBlockState, bagInventory, itemStack, hand); } - private static void placeMirrorZ(World world, EntityPlayer player, MirrorSettings m, BlockPos oldBlockPos, IBlockState oldBlockState, IItemHandler bagInventory, ItemStack itemStack) { + private static void placeMirrorZ(World world, EntityPlayer player, MirrorSettings m, BlockPos oldBlockPos, IBlockState oldBlockState, + IItemHandler bagInventory, ItemStack itemStack, EnumHand hand) { //find mirror position double z = m.position.z + (m.position.z - oldBlockPos.getZ() - 0.5); BlockPos newBlockPos = new BlockPos(oldBlockPos.getX(), oldBlockPos.getY(), z); @@ -134,23 +139,23 @@ public class Mirror { if (bagInventory != null) { itemStack = ItemRandomizerBag.pickRandomStack(bagInventory); if (itemStack.isEmpty()) return; - oldBlockState = getBlockStateFromRandomizerBag(bagInventory, world, player, oldBlockPos, itemStack); + oldBlockState = getBlockStateFromRandomizerBag(bagInventory, world, player, oldBlockPos, itemStack, hand); if (oldBlockState == null) return; } IBlockState newBlockState = oldBlockState.withMirror(net.minecraft.util.Mirror.LEFT_RIGHT); //place block if (world.isBlockLoaded(newBlockPos, true)) { - placeBlock(world, player, newBlockPos, newBlockState, itemStack); + placeBlock(world, player, newBlockPos, newBlockState, itemStack, hand); } } - private static IBlockState getBlockStateFromRandomizerBag(IItemHandler bagInventory, World world, EntityPlayer player, BlockPos pos, ItemStack itemStack) { + private static IBlockState getBlockStateFromRandomizerBag(IItemHandler bagInventory, World world, EntityPlayer player, BlockPos pos, ItemStack itemStack, EnumHand hand) { //TODO get facing from getPlacedAgainst and getPlacedBlock - return Block.getBlockFromItem(itemStack.getItem()).getStateForPlacement(world, pos, EnumFacing.NORTH, 0, 0, 0, itemStack.getMetadata(), player, EnumHand.MAIN_HAND); + return Block.getBlockFromItem(itemStack.getItem()).getStateForPlacement(world, pos, EnumFacing.NORTH, 0, 0, 0, itemStack.getMetadata(), player, hand); } - private static void placeBlock(World world, EntityPlayer player, BlockPos newBlockPos, IBlockState newBlockState, ItemStack itemStack) { + private static void placeBlock(World world, EntityPlayer player, BlockPos newBlockPos, IBlockState newBlockState, ItemStack itemStack, EnumHand hand) { //TODO check if can place //TODO check if can break @@ -158,7 +163,7 @@ public class Mirror { //Array synergy BlockSnapshot blockSnapshot = new BlockSnapshot(world, newBlockPos, newBlockState); - BlockEvent.PlaceEvent placeEvent = new BlockEvent.PlaceEvent(blockSnapshot, newBlockState, player, EnumHand.MAIN_HAND); + BlockEvent.PlaceEvent placeEvent = new BlockEvent.PlaceEvent(blockSnapshot, newBlockState, player, hand); Array.onBlockPlaced(placeEvent); } @@ -271,4 +276,78 @@ public class Mirror { Array.onBlockBroken(breakEvent); } + + //Called from EventHandler + public static float getTotalBlockHardness(World world, EntityPlayer player, BlockPos oldBlockPos) { + float hardness = 0; + + //find mirrorsettings for the player that broke the block + MirrorSettings m = BuildSettingsManager.getBuildSettings(player).getMirrorSettings(); + if (m == null) return 0; + + if (!m.enabled || (!m.mirrorX && !m.mirrorY && !m.mirrorZ)) return 0; + + //if within mirror distance, break mirror block + if (oldBlockPos.getX() + 0.5 < m.position.x - m.radius || oldBlockPos.getX() + 0.5 > m.position.x + m.radius || + oldBlockPos.getY() + 0.5 < m.position.y - m.radius || oldBlockPos.getY() + 0.5 > m.position.y + m.radius || + oldBlockPos.getZ() + 0.5 < m.position.z - m.radius || oldBlockPos.getZ() + 0.5 > m.position.z + m.radius) + return 0; + + if (m.mirrorX) { + hardness += getHardnessX(world, player, m, oldBlockPos); + } + + if (m.mirrorY) { + hardness += getHardnessY(world, player, m, oldBlockPos); + } + + if (m.mirrorZ) { + hardness += getHardnessZ(world, player, m, oldBlockPos); + } + return hardness; + } + + private static float getHardnessX(World world, EntityPlayer player, MirrorSettings m, BlockPos oldBlockPos) { + float hardness = 0; + + //find mirror position + double x = m.position.x + (m.position.x - oldBlockPos.getX() - 0.5); + BlockPos newBlockPos = new BlockPos(x, oldBlockPos.getY(), oldBlockPos.getZ()); + + if (SurvivalHelper.canBreak(world, player, newBlockPos)) + hardness += world.getBlockState(newBlockPos).getBlockHardness(world, newBlockPos); + + if (m.mirrorY) hardness += getHardnessY(world, player, m, newBlockPos); + if (m.mirrorZ) hardness += getHardnessZ(world, player, m, newBlockPos); + + return hardness; + } + + private static float getHardnessY(World world, EntityPlayer player, MirrorSettings m, BlockPos oldBlockPos) { + float hardness = 0; + + //find mirror position + double y = m.position.y + (m.position.y - oldBlockPos.getY() - 0.5); + BlockPos newBlockPos = new BlockPos(oldBlockPos.getX(), y, oldBlockPos.getZ()); + + if (SurvivalHelper.canBreak(world, player, newBlockPos)) + hardness += world.getBlockState(newBlockPos).getBlockHardness(world, newBlockPos); + + if (m.mirrorZ) hardness += getHardnessZ(world, player, m, newBlockPos); + + return hardness; + } + + private static float getHardnessZ(World world, EntityPlayer player, MirrorSettings m, BlockPos oldBlockPos) { + float hardness = 0; + + //find mirror position + double z = m.position.z + (m.position.z - oldBlockPos.getZ() - 0.5); + BlockPos newBlockPos = new BlockPos(oldBlockPos.getX(), oldBlockPos.getY(), z); + + if (SurvivalHelper.canBreak(world, player, newBlockPos)) + hardness += world.getBlockState(newBlockPos).getBlockHardness(world, newBlockPos); + + return hardness; + } } diff --git a/src/main/java/nl/requios/effortlessbuilding/QuickReplace.java b/src/main/java/nl/requios/effortlessbuilding/QuickReplace.java index 5d649c5..d6bce29 100644 --- a/src/main/java/nl/requios/effortlessbuilding/QuickReplace.java +++ b/src/main/java/nl/requios/effortlessbuilding/QuickReplace.java @@ -23,6 +23,7 @@ public class QuickReplace { private static Dictionary blockStates = new Hashtable<>(); private static Dictionary itemStacks = new Hashtable<>(); + private static Dictionary hands = new Hashtable<>(); public static boolean onBlockPlaced(BlockEvent.PlaceEvent event) { if (event.getWorld().isRemote) return true; @@ -35,6 +36,7 @@ public class QuickReplace { blockStates.put(event.getPlayer().getUniqueID(), event.getPlacedBlock()); itemStacks.put(event.getPlayer().getUniqueID(), event.getPlayer().getHeldItem(event.getHand())); + hands.put(event.getPlayer().getUniqueID(), event.getHand()); //RayTraceResult result = event.getWorld().rayTraceBlocks(event.getPlayer().getPositionEyes(1f), event.getPlayer().getLookVec()); EffortlessBuilding.packetHandler.sendTo(new QuickReplaceMessage(), (EntityPlayerMP) event.getPlayer()); @@ -57,13 +59,14 @@ public class QuickReplace { IBlockState blockState = blockStates.get(player.getUniqueID()); ItemStack itemStack = itemStacks.get(player.getUniqueID()); + EnumHand hand = hands.get(player.getUniqueID()); SurvivalHelper.placeBlock(player.world, player, placedAgainstBlockPos, blockState, itemStack, message.getSideHit(), true, false); //Mirror and Array synergy blockState = player.world.getBlockState(placedAgainstBlockPos); BlockSnapshot blockSnapshot = new BlockSnapshot(player.world, placedAgainstBlockPos, blockState); - BlockEvent.PlaceEvent placeEvent = new BlockEvent.PlaceEvent(blockSnapshot, blockState, player, EnumHand.MAIN_HAND); + BlockEvent.PlaceEvent placeEvent = new BlockEvent.PlaceEvent(blockSnapshot, blockState, player, hand); Mirror.onBlockPlaced(placeEvent); Array.onBlockPlaced(placeEvent); } diff --git a/src/main/java/nl/requios/effortlessbuilding/RenderHelper.java b/src/main/java/nl/requios/effortlessbuilding/RenderHelper.java index c958bee..510ea59 100644 --- a/src/main/java/nl/requios/effortlessbuilding/RenderHelper.java +++ b/src/main/java/nl/requios/effortlessbuilding/RenderHelper.java @@ -6,6 +6,8 @@ import net.minecraft.client.renderer.RenderGlobal; import net.minecraft.client.renderer.Tessellator; import net.minecraft.client.renderer.vertex.DefaultVertexFormats; import net.minecraft.entity.player.EntityPlayer; +import net.minecraft.item.ItemStack; +import net.minecraft.item.ItemTool; import net.minecraft.util.math.*; import net.minecraftforge.client.event.RenderWorldLastEvent; import net.minecraftforge.fml.common.Mod; @@ -110,30 +112,48 @@ public class RenderHelper { drawMirrorLines(m); } - //Render block outlines - RayTraceResult objectMouseOver = Minecraft.getMinecraft().objectMouseOver; - if (objectMouseOver.typeOfHit == RayTraceResult.Type.BLOCK) - { - BlockPos blockPos = objectMouseOver.getBlockPos(); - if (!buildSettings.doQuickReplace()) blockPos = blockPos.offset(objectMouseOver.sideHit); + } - //RenderHelper.renderBlockOutline(blockPos); + //Render block outlines + RayTraceResult objectMouseOver = Minecraft.getMinecraft().objectMouseOver; + if (objectMouseOver.typeOfHit == RayTraceResult.Type.BLOCK) + { + BlockPos blockPos = objectMouseOver.getBlockPos(); + + //Check if tool (or none) in hand + ItemStack mainhand = player.getHeldItemMainhand(); + //ItemStack offhand = player.getHeldItemOffhand(); + //boolean noneInHand = mainhand.isEmpty() && (offhand.isEmpty() || offhand.getItem() instanceof ItemTool); + boolean toolInHand = !mainhand.isEmpty() && mainhand.getItem() instanceof ItemTool; + if (!buildSettings.doQuickReplace() && !toolInHand) { + blockPos = blockPos.offset(objectMouseOver.sideHit); + } + + if (buildSettings.doQuickReplace() && !toolInHand) { + //Get under tall grass and other replaceable blocks + if (player.world.getBlockState(blockPos).getBlock().isReplaceable(player.world, blockPos)) { + blockPos = blockPos.down(); + } + } + + //TODO render current block outline based on config + if (buildSettings.doQuickReplace()) { + RenderHelper.renderBlockOutline(blockPos); + } + + //Mirror + if (m != null && m.enabled && (m.mirrorX || m.mirrorY || m.mirrorZ) && + !(blockPos.getX() + 0.5 < m.position.x - m.radius) && !(blockPos.getX() + 0.5 > m.position.x + m.radius) && + !(blockPos.getY() + 0.5 < m.position.y - m.radius) && !(blockPos.getY() + 0.5 > m.position.y + m.radius) && + !(blockPos.getZ() + 0.5 < m.position.z - m.radius) && !(blockPos.getZ() + 0.5 > m.position.z + m.radius)) + { if (m.mirrorX) drawMirrorBlockOutlineX(buildSettings, blockPos); if (m.mirrorY) drawMirrorBlockOutlineY(buildSettings, blockPos); if (m.mirrorZ) drawMirrorBlockOutlineZ(buildSettings, blockPos); } - } - - //Array - if (a != null && a.enabled && (a.offset.getX() != 0 || a.offset.getY() != 0 || a.offset.getZ() != 0)) - { - //Render block outlines - RayTraceResult objectMouseOver = Minecraft.getMinecraft().objectMouseOver; - if (objectMouseOver.typeOfHit == RayTraceResult.Type.BLOCK) - { - BlockPos blockPos = objectMouseOver.getBlockPos(); - if (!buildSettings.doQuickReplace()) blockPos = blockPos.offset(objectMouseOver.sideHit); + //Array + if (a != null && a.enabled && (a.offset.getX() != 0 || a.offset.getY() != 0 || a.offset.getZ() != 0)) { drawArrayBlockOutlines(a, blockPos); } } diff --git a/src/main/java/nl/requios/effortlessbuilding/SurvivalHelper.java b/src/main/java/nl/requios/effortlessbuilding/SurvivalHelper.java index 69eecce..5812f51 100644 --- a/src/main/java/nl/requios/effortlessbuilding/SurvivalHelper.java +++ b/src/main/java/nl/requios/effortlessbuilding/SurvivalHelper.java @@ -4,9 +4,11 @@ import net.minecraft.block.Block; import net.minecraft.block.SoundType; import net.minecraft.block.material.Material; import net.minecraft.block.state.IBlockState; +import net.minecraft.enchantment.EnchantmentHelper; import net.minecraft.entity.Entity; import net.minecraft.entity.player.EntityPlayer; import net.minecraft.init.Blocks; +import net.minecraft.init.Enchantments; import net.minecraft.item.Item; import net.minecraft.item.ItemBlock; import net.minecraft.item.ItemStack; @@ -14,11 +16,13 @@ import net.minecraft.util.EnumFacing; import net.minecraft.util.SoundCategory; import net.minecraft.util.math.AxisAlignedBB; import net.minecraft.util.math.BlockPos; +import net.minecraft.world.IBlockAccess; import net.minecraft.world.World; import net.minecraftforge.items.IItemHandler; import net.minecraftforge.items.ItemHandlerHelper; import nl.requios.effortlessbuilding.item.ItemRandomizerBag; +import javax.annotation.Nonnull; import javax.annotation.Nullable; import java.util.List; @@ -39,7 +43,7 @@ public class SurvivalHelper { //Check if itemstack is correct if (!(itemstack.getItem() instanceof ItemBlock) || Block.getBlockFromItem(itemstack.getItem()) != blockState.getBlock()) { - EffortlessBuilding.log(player, "Cannot replace block", true); + EffortlessBuilding.log(player, "Cannot (re)place block", true); EffortlessBuilding.log("SurvivalHelper#placeBlock: itemstack " + itemstack.toString() + " does not match blockstate " + blockState.toString()); return false; } @@ -106,9 +110,36 @@ public class SurvivalHelper { if (player.isCreative()) return true; IBlockState blockState = world.getBlockState(pos); - if (blockState.getBlock().canHarvestBlock(world, pos, player)) return true; + return canHarvestBlock(blockState.getBlock(), player, world, pos); - return false; + } + + //From ForgeHooks#canHarvestBlock + public static boolean canHarvestBlock(@Nonnull Block block, @Nonnull EntityPlayer player, @Nonnull IBlockAccess world, @Nonnull BlockPos pos) + { + IBlockState state = world.getBlockState(pos); + state = state.getBlock().getActualState(state, world, pos); + if (state.getMaterial().isToolNotRequired()) + { + return true; + } + + ItemStack stack = player.getHeldItemMainhand(); + String tool = block.getHarvestTool(state); + if (stack.isEmpty() || tool == null) + { + return player.canHarvestBlock(state); + } + + if (stack.getItemDamage() >= stack.getMaxDamage()) return false; + + int toolLevel = stack.getItem().getHarvestLevel(stack, tool, player, state); + if (toolLevel < 0) + { + return player.canHarvestBlock(state); + } + + return toolLevel >= block.getHarvestLevel(state); } //Can be harvested with hand? (or in creative) @@ -128,7 +159,8 @@ public class SurvivalHelper { IBlockState blockState = world.getBlockState(pos); - List drops = blockState.getBlock().getDrops(world, pos, blockState, 0); + int fortune = EnchantmentHelper.getEnchantmentLevel(Enchantments.FORTUNE, player.getHeldItemMainhand()); + List drops = blockState.getBlock().getDrops(world, pos, blockState, fortune); for (ItemStack drop : drops) { ItemHandlerHelper.giveItemToPlayer(player, drop); diff --git a/src/main/java/nl/requios/effortlessbuilding/gui/RandomizerBagGuiHandler.java b/src/main/java/nl/requios/effortlessbuilding/gui/RandomizerBagGuiHandler.java index c32a43b..e0b0998 100644 --- a/src/main/java/nl/requios/effortlessbuilding/gui/RandomizerBagGuiHandler.java +++ b/src/main/java/nl/requios/effortlessbuilding/gui/RandomizerBagGuiHandler.java @@ -7,6 +7,7 @@ import net.minecraftforge.fml.common.network.IGuiHandler; import net.minecraftforge.fml.relauncher.Side; import net.minecraftforge.fml.relauncher.SideOnly; import net.minecraftforge.items.CapabilityItemHandler; +import net.minecraftforge.items.IItemHandler; import nl.requios.effortlessbuilding.EffortlessBuilding; import javax.annotation.Nullable; @@ -17,8 +18,10 @@ public class RandomizerBagGuiHandler implements IGuiHandler { public Object getServerGuiElement(int ID, EntityPlayer player, World world, int x, int y, int z) { if (ID == EffortlessBuilding.RANDOMIZER_BAG_GUI) { // Use the player's held item to create the container - return new RandomizerBagContainer(player.inventory, - player.getHeldItem(EnumHand.MAIN_HAND).getCapability(CapabilityItemHandler.ITEM_HANDLER_CAPABILITY, null)); + IItemHandler capability = player.getHeldItemMainhand().hasCapability(CapabilityItemHandler.ITEM_HANDLER_CAPABILITY, null) ? + player.getHeldItemMainhand().getCapability(CapabilityItemHandler.ITEM_HANDLER_CAPABILITY, null) : + player.getHeldItemOffhand().getCapability(CapabilityItemHandler.ITEM_HANDLER_CAPABILITY, null); + return new RandomizerBagContainer(player.inventory, capability); } return null; } @@ -29,8 +32,10 @@ public class RandomizerBagGuiHandler implements IGuiHandler { public Object getClientGuiElement(int ID, EntityPlayer player, World world, int x, int y, int z) { if (ID == EffortlessBuilding.RANDOMIZER_BAG_GUI) { // Use the player's held item to create the client-side gui container - return new RandomizerBagGuiContainer(player.inventory, - player.getHeldItem(EnumHand.MAIN_HAND).getCapability(CapabilityItemHandler.ITEM_HANDLER_CAPABILITY, null)); + IItemHandler capability = player.getHeldItemMainhand().hasCapability(CapabilityItemHandler.ITEM_HANDLER_CAPABILITY, null) ? + player.getHeldItemMainhand().getCapability(CapabilityItemHandler.ITEM_HANDLER_CAPABILITY, null) : + player.getHeldItemOffhand().getCapability(CapabilityItemHandler.ITEM_HANDLER_CAPABILITY, null); + return new RandomizerBagGuiContainer(player.inventory, capability); } return null; } diff --git a/src/main/java/nl/requios/effortlessbuilding/gui/SettingsGui.java b/src/main/java/nl/requios/effortlessbuilding/gui/SettingsGui.java index 1970632..13bee5f 100644 --- a/src/main/java/nl/requios/effortlessbuilding/gui/SettingsGui.java +++ b/src/main/java/nl/requios/effortlessbuilding/gui/SettingsGui.java @@ -2,9 +2,7 @@ package nl.requios.effortlessbuilding.gui; import net.minecraft.client.Minecraft; import net.minecraft.client.gui.GuiButton; -import net.minecraft.client.gui.GuiButtonImage; import net.minecraft.client.gui.GuiScreen; -import net.minecraft.client.gui.GuiTextField; import net.minecraft.util.ResourceLocation; import net.minecraft.util.math.BlockPos; import net.minecraft.util.math.Vec3d; @@ -15,7 +13,6 @@ import nl.requios.effortlessbuilding.EffortlessBuilding; import nl.requios.effortlessbuilding.Mirror; import nl.requios.effortlessbuilding.network.BuildSettingsMessage; import nl.requios.effortlessbuilding.proxy.ClientProxy; -import org.lwjgl.input.Keyboard; import org.lwjgl.input.Mouse; import java.io.IOException; diff --git a/src/main/java/nl/requios/effortlessbuilding/item/ItemRandomizerBag.java b/src/main/java/nl/requios/effortlessbuilding/item/ItemRandomizerBag.java index 8a71343..39a2eb1 100644 --- a/src/main/java/nl/requios/effortlessbuilding/item/ItemRandomizerBag.java +++ b/src/main/java/nl/requios/effortlessbuilding/item/ItemRandomizerBag.java @@ -90,25 +90,25 @@ public class ItemRandomizerBag extends Item { @Override public ActionResult onItemRightClick(World world, EntityPlayer player, EnumHand hand) { + ItemStack bag = player.getHeldItem(hand); if (player.isSneaking()) { - if (world.isRemote) return new ActionResult<>(EnumActionResult.SUCCESS, player.getHeldItem(hand)); + if (world.isRemote) return new ActionResult<>(EnumActionResult.SUCCESS, bag); //Open inventory player.openGui(EffortlessBuilding.instance, EffortlessBuilding.RANDOMIZER_BAG_GUI, world, 0, 0, 0); } else { //Use item //Get bag inventory - ItemStack bag = player.getHeldItem(hand); IItemHandler bagInventory = getBagInventory(bag); if (bagInventory == null) - return new ActionResult<>(EnumActionResult.FAIL, player.getHeldItem(hand)); + return new ActionResult<>(EnumActionResult.FAIL, bag); ItemStack toUse = pickRandomStack(bagInventory); - if (toUse.isEmpty()) return new ActionResult<>(EnumActionResult.FAIL, player.getHeldItem(hand)); + if (toUse.isEmpty()) return new ActionResult<>(EnumActionResult.FAIL, bag); return toUse.useItemRightClick(world, player, hand); } - return new ActionResult<>(EnumActionResult.PASS, player.getHeldItem(hand)); + return new ActionResult<>(EnumActionResult.PASS, bag); } /**