From bda53e4b08738372e26103a44b5d0d6373876479 Mon Sep 17 00:00:00 2001 From: Christian Knaapen Date: Sat, 20 Oct 2018 16:15:14 +0200 Subject: [PATCH] Check if can break and replace blocks. Breaking only works if your current held tool can break it. Replace only works with blocks that can be harvested with your hand. Damages used tool appropriately. Added block outlines to mirror and array. --- .../nl/requios/effortlessbuilding/Array.java | 56 +++++-- .../nl/requios/effortlessbuilding/Mirror.java | 148 +++++++++--------- .../effortlessbuilding/QuickReplace.java | 1 - .../effortlessbuilding/RenderHelper.java | 60 +++++++ .../effortlessbuilding/SurvivalHelper.java | 61 ++++++-- .../effortlessbuilding/proxy/ClientProxy.java | 6 +- .../assets/effortlessbuilding/lang/en_us.lang | 6 +- 7 files changed, 235 insertions(+), 103 deletions(-) create mode 100644 src/main/java/nl/requios/effortlessbuilding/RenderHelper.java diff --git a/src/main/java/nl/requios/effortlessbuilding/Array.java b/src/main/java/nl/requios/effortlessbuilding/Array.java index 95b4b41..f12f65b 100644 --- a/src/main/java/nl/requios/effortlessbuilding/Array.java +++ b/src/main/java/nl/requios/effortlessbuilding/Array.java @@ -2,19 +2,25 @@ package nl.requios.effortlessbuilding; import net.minecraft.block.Block; import net.minecraft.block.state.IBlockState; +import net.minecraft.client.Minecraft; import net.minecraft.entity.player.EntityPlayer; -import net.minecraft.item.ItemBlock; import net.minecraft.item.ItemStack; -import net.minecraft.util.EnumActionResult; import net.minecraft.util.EnumFacing; import net.minecraft.util.EnumHand; import net.minecraft.util.math.BlockPos; +import net.minecraft.util.math.RayTraceResult; import net.minecraft.util.math.Vec3i; import net.minecraft.world.World; +import net.minecraftforge.client.event.RenderWorldLastEvent; import net.minecraftforge.event.world.BlockEvent; +import net.minecraftforge.fml.common.Mod; +import net.minecraftforge.fml.common.eventhandler.SubscribeEvent; +import net.minecraftforge.fml.relauncher.Side; +import net.minecraftforge.fml.relauncher.SideOnly; import net.minecraftforge.items.IItemHandler; import nl.requios.effortlessbuilding.item.ItemRandomizerBag; +@Mod.EventBusSubscriber public class Array { //TODO config file public static final int MAX_COUNT = 100; @@ -24,7 +30,7 @@ public class Array { public BlockPos offset = BlockPos.ORIGIN; public int count = 5; - public ArraySettings(){ + public ArraySettings() { } public ArraySettings(boolean enabled, BlockPos offset, int count) { @@ -99,14 +105,46 @@ public class Array { 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 (event.getWorld().isBlockLoaded(pos, false)) { - //TODO check if can break + SurvivalHelper.breakBlock(event.getWorld(), event.getPlayer(), pos); + } + } - //Drop existing block - SurvivalHelper.dropBlock(event.getWorld(), pos, event.getPlayer()); + @SubscribeEvent + @SideOnly(Side.CLIENT) + public static void onRender(RenderWorldLastEvent event) { + EntityPlayer player = Minecraft.getMinecraft().player; + BuildSettingsManager.BuildSettings buildSettings = BuildSettingsManager.getBuildSettings(player); + if (buildSettings == null) return; + ArraySettings a = buildSettings.getArraySettings(); - event.getWorld().setBlockToAir(pos); - } + if (a == null || !a.enabled || (a.offset.getX() == 0 && a.offset.getY() == 0 && a.offset.getZ() == 0)) return; + + RenderHelper.begin(event.getPartialTicks()); + + //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); + + drawBlockOutlines(a, blockPos); + } + + RenderHelper.end(); + } + + @SideOnly(Side.CLIENT) + public static void drawBlockOutlines(ArraySettings a, BlockPos pos) { + if (a == null || !a.enabled || (a.offset.getX() == 0 && a.offset.getY() == 0 && a.offset.getZ() == 0)) return; + + Vec3i offset = new Vec3i(a.offset.getX(), a.offset.getY(), a.offset.getZ()); + + //RenderHelper.renderBlockOutline(blockPos); + for (int i = 0; i < a.count; i++) + { + pos = pos.add(offset); + RenderHelper.renderBlockOutline(pos); } } } diff --git a/src/main/java/nl/requios/effortlessbuilding/Mirror.java b/src/main/java/nl/requios/effortlessbuilding/Mirror.java index 77144f8..187fe61 100644 --- a/src/main/java/nl/requios/effortlessbuilding/Mirror.java +++ b/src/main/java/nl/requios/effortlessbuilding/Mirror.java @@ -3,6 +3,7 @@ package nl.requios.effortlessbuilding; import net.minecraft.block.*; import net.minecraft.block.state.IBlockState; import net.minecraft.client.Minecraft; +import net.minecraft.client.entity.EntityPlayerSP; import net.minecraft.client.renderer.BufferBuilder; import net.minecraft.client.renderer.Tessellator; import net.minecraft.client.renderer.vertex.DefaultVertexFormats; @@ -11,6 +12,7 @@ import net.minecraft.item.ItemStack; import net.minecraft.util.EnumFacing; import net.minecraft.util.EnumHand; import net.minecraft.util.math.BlockPos; +import net.minecraft.util.math.RayTraceResult; import net.minecraft.util.math.Vec3d; import net.minecraft.world.World; import net.minecraftforge.client.event.RenderWorldLastEvent; @@ -259,9 +261,7 @@ public class Mirror { double x = m.position.x + (m.position.x - oldBlockPos.getX() - 0.5); BlockPos newBlockPos = new BlockPos(x, oldBlockPos.getY(), oldBlockPos.getZ()); //break block - if (event.getWorld().isBlockLoaded(newBlockPos, true)) { - breakBlock(event, newBlockPos); - } + breakBlock(event, newBlockPos); if (m.mirrorY) breakMirrorY(event, m, newBlockPos); if (m.mirrorZ) breakMirrorZ(event, m, newBlockPos); } @@ -270,10 +270,8 @@ public class Mirror { //find mirror position double y = m.position.y + (m.position.y - oldBlockPos.getY() - 0.5); BlockPos newBlockPos = new BlockPos(oldBlockPos.getX(), y, oldBlockPos.getZ()); - //place block - if (event.getWorld().isBlockLoaded(newBlockPos, true)) { - breakBlock(event, newBlockPos); - } + //break block + breakBlock(event, newBlockPos); if (m.mirrorZ) breakMirrorZ(event, m, newBlockPos); } @@ -281,17 +279,14 @@ public class Mirror { //find mirror position double z = m.position.z + (m.position.z - oldBlockPos.getZ() - 0.5); BlockPos newBlockPos = new BlockPos(oldBlockPos.getX(), oldBlockPos.getY(), z); - //place block - if (event.getWorld().isBlockLoaded(newBlockPos, true)) { - breakBlock(event, newBlockPos); - } + //break block + breakBlock(event, newBlockPos); } private static void breakBlock(BlockEvent.BreakEvent event, BlockPos newBlockPos) { - //TODO check if can break + if (!event.getWorld().isBlockLoaded(newBlockPos, false)) return; - SurvivalHelper.dropBlock(event.getWorld(), newBlockPos, event.getPlayer()); - event.getWorld().setBlockToAir(newBlockPos); + SurvivalHelper.breakBlock(event.getWorld(), event.getPlayer(), newBlockPos); //Array synergy BlockEvent.BreakEvent breakEvent = new BlockEvent.BreakEvent(event.getWorld(), newBlockPos, event.getState(), event.getPlayer()); @@ -308,11 +303,8 @@ public class Mirror { if (m == null || !m.enabled || (!m.mirrorX && !m.mirrorY && !m.mirrorZ)) return; - double playerX = player.prevPosX + (player.posX - player.prevPosX) * event.getPartialTicks(); - double playerY = player.prevPosY + (player.posY - player.prevPosY) * event.getPartialTicks(); - double playerZ = player.prevPosZ + (player.posZ - player.prevPosZ) * event.getPartialTicks(); + RenderHelper.begin(event.getPartialTicks()); - Vec3d playerPos = new Vec3d(playerX, playerY, playerZ); Vec3d pos = m.position.add(epsilon); int radius = m.radius; @@ -320,45 +312,47 @@ public class Mirror { Vec3d posA = new Vec3d(pos.x, pos.y - radius, pos.z - radius); Vec3d posB = new Vec3d(pos.x, pos.y + radius, pos.z + radius); - drawMirrorPlane(playerPos, posA, posB, colorX, m.drawLines, m.drawPlanes); + drawMirrorPlane(posA, posB, colorX, m.drawLines, m.drawPlanes); } if (m.mirrorY) { Vec3d posA = new Vec3d(pos.x - radius, pos.y, pos.z - radius); Vec3d posB = new Vec3d(pos.x + radius, pos.y, pos.z + radius); - drawMirrorPlaneY(playerPos, posA, posB, colorY, m.drawLines, m.drawPlanes); + drawMirrorPlaneY(posA, posB, colorY, m.drawLines, m.drawPlanes); } if (m.mirrorZ) { Vec3d posA = new Vec3d(pos.x - radius, pos.y - radius, pos.z); Vec3d posB = new Vec3d(pos.x + radius, pos.y + radius, pos.z); - drawMirrorPlane(playerPos, posA, posB, colorZ, m.drawLines, m.drawPlanes); + drawMirrorPlane(posA, posB, colorZ, m.drawLines, m.drawPlanes); } //Draw axis coordinated colors if two or more axes are enabled //(If only one is enabled the lines are that planes color) if (m.drawLines && ((m.mirrorX && m.mirrorY) || (m.mirrorX && m.mirrorZ) || (m.mirrorY && m.mirrorZ))) { - drawMirrorLines(playerPos, m); + 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); + if (m.mirrorX) drawBlockOutlineX(buildSettings, blockPos); + if (m.mirrorY) drawBlockOutlineY(buildSettings, blockPos); + if (m.mirrorZ) drawBlockOutlineZ(buildSettings, blockPos); + } + + RenderHelper.end(); } @SideOnly(Side.CLIENT) - public static void drawMirrorPlane(Vec3d playerPos, Vec3d posA, Vec3d posB, Color c, boolean drawLines, boolean drawPlanes) { - - GL11.glPushAttrib(GL11.GL_ENABLE_BIT); - GL11.glPushMatrix(); - GL11.glDisable(GL11.GL_CULL_FACE); - GL11.glDisable(GL11.GL_LIGHTING); - GL11.glDisable(GL11.GL_TEXTURE_2D); - - GL11.glEnable(GL11.GL_BLEND); - GL11.glBlendFunc(GL11.GL_SRC_ALPHA, GL11.GL_ONE_MINUS_SRC_ALPHA); - - GL11.glTranslated(-playerPos.x, -playerPos.y, -playerPos.z); + public static void drawMirrorPlane(Vec3d posA, Vec3d posB, Color c, boolean drawLines, boolean drawPlanes) { GL11.glColor4d(c.getRed(), c.getGreen(), c.getBlue(), planeAlpha); - GL11.glLineWidth(2); - GL11.glDepthMask(false); Tessellator tessellator = Tessellator.getInstance(); BufferBuilder bufferBuilder = tessellator.getBuffer(); @@ -384,28 +378,12 @@ public class Mirror { tessellator.draw(); } - - GL11.glDepthMask(true); - GL11.glPopMatrix(); - GL11.glPopAttrib(); } @SideOnly(Side.CLIENT) - public static void drawMirrorPlaneY(Vec3d playerPos, Vec3d posA, Vec3d posB, Color c, boolean drawLines, boolean drawPlanes) { - - GL11.glPushAttrib(GL11.GL_ENABLE_BIT); - GL11.glPushMatrix(); - GL11.glDisable(GL11.GL_CULL_FACE); - GL11.glDisable(GL11.GL_LIGHTING); - GL11.glDisable(GL11.GL_TEXTURE_2D); - - GL11.glEnable(GL11.GL_BLEND); - GL11.glBlendFunc(GL11.GL_SRC_ALPHA, GL11.GL_ONE_MINUS_SRC_ALPHA); - GL11.glTranslated(-playerPos.x, -playerPos.y, -playerPos.z); + public static void drawMirrorPlaneY(Vec3d posA, Vec3d posB, Color c, boolean drawLines, boolean drawPlanes) { GL11.glColor4d(c.getRed(), c.getGreen(), c.getBlue(), c.getAlpha()); - GL11.glLineWidth(2); - GL11.glDepthMask(false); Tessellator tessellator = Tessellator.getInstance(); BufferBuilder bufferBuilder = tessellator.getBuffer(); @@ -431,30 +409,15 @@ public class Mirror { tessellator.draw(); } - - GL11.glDepthMask(true); - GL11.glPopMatrix(); - GL11.glPopAttrib(); } @SideOnly(Side.CLIENT) - public static void drawMirrorLines(Vec3d playerPos, MirrorSettings m) { + public static void drawMirrorLines(MirrorSettings m) { Vec3d pos = m.position.add(epsilon); - GL11.glPushAttrib(GL11.GL_ENABLE_BIT); - GL11.glPushMatrix(); - GL11.glDisable(GL11.GL_CULL_FACE); - GL11.glDisable(GL11.GL_LIGHTING); - GL11.glDisable(GL11.GL_TEXTURE_2D); - - GL11.glEnable(GL11.GL_BLEND); - GL11.glBlendFunc(GL11.GL_SRC_ALPHA, GL11.GL_ONE_MINUS_SRC_ALPHA); - GL11.glTranslated(-playerPos.x, -playerPos.y, -playerPos.z); - GL11.glColor4d(100, 100, 100, 255); GL11.glLineWidth(2); - GL11.glDepthMask(false); Tessellator tessellator = Tessellator.getInstance(); BufferBuilder bufferBuilder = tessellator.getBuffer(); @@ -468,11 +431,50 @@ public class Mirror { bufferBuilder.pos(pos.x, pos.y, pos.z + m.radius).color(colorX.getRed(), colorX.getGreen(), colorX.getBlue(), lineAlpha).endVertex(); tessellator.draw(); - - GL11.glDepthMask(true); - GL11.glPopMatrix(); - GL11.glPopAttrib(); } + @SideOnly(Side.CLIENT) + public static void drawBlockOutlineX(BuildSettingsManager.BuildSettings buildSettings, BlockPos oldBlockPos) { + MirrorSettings m = buildSettings.getMirrorSettings(); + //find mirror position + double x = m.position.x + (m.position.x - oldBlockPos.getX() - 0.5); + BlockPos newBlockPos = new BlockPos(x, oldBlockPos.getY(), oldBlockPos.getZ()); + + RenderHelper.renderBlockOutline(newBlockPos); + + //Array synergy + Array.drawBlockOutlines(buildSettings.getArraySettings(), newBlockPos); + + if (m.mirrorY) drawBlockOutlineY(buildSettings, newBlockPos); + if (m.mirrorZ) drawBlockOutlineZ(buildSettings, newBlockPos); + } + + @SideOnly(Side.CLIENT) + public static void drawBlockOutlineY(BuildSettingsManager.BuildSettings buildSettings, BlockPos oldBlockPos) { + MirrorSettings m = buildSettings.getMirrorSettings(); + //find mirror position + double y = m.position.y + (m.position.y - oldBlockPos.getY() - 0.5); + BlockPos newBlockPos = new BlockPos(oldBlockPos.getX(), y, oldBlockPos.getZ()); + + RenderHelper.renderBlockOutline(newBlockPos); + + //Array synergy + Array.drawBlockOutlines(buildSettings.getArraySettings(), newBlockPos); + + if (m.mirrorZ) drawBlockOutlineZ(buildSettings, newBlockPos); + } + + @SideOnly(Side.CLIENT) + public static void drawBlockOutlineZ(BuildSettingsManager.BuildSettings buildSettings, BlockPos oldBlockPos) { + MirrorSettings m = buildSettings.getMirrorSettings(); + //find mirror position + double z = m.position.z + (m.position.z - oldBlockPos.getZ() - 0.5); + BlockPos newBlockPos = new BlockPos(oldBlockPos.getX(), oldBlockPos.getY(), z); + + RenderHelper.renderBlockOutline(newBlockPos); + + //Array synergy + Array.drawBlockOutlines(buildSettings.getArraySettings(), newBlockPos); + } } diff --git a/src/main/java/nl/requios/effortlessbuilding/QuickReplace.java b/src/main/java/nl/requios/effortlessbuilding/QuickReplace.java index ed927f5..c69ad64 100644 --- a/src/main/java/nl/requios/effortlessbuilding/QuickReplace.java +++ b/src/main/java/nl/requios/effortlessbuilding/QuickReplace.java @@ -1,6 +1,5 @@ package nl.requios.effortlessbuilding; -import net.minecraft.block.Block; import net.minecraft.block.state.IBlockState; import net.minecraft.entity.player.EntityPlayer; import net.minecraft.entity.player.EntityPlayerMP; diff --git a/src/main/java/nl/requios/effortlessbuilding/RenderHelper.java b/src/main/java/nl/requios/effortlessbuilding/RenderHelper.java new file mode 100644 index 0000000..a3fe15c --- /dev/null +++ b/src/main/java/nl/requios/effortlessbuilding/RenderHelper.java @@ -0,0 +1,60 @@ +package nl.requios.effortlessbuilding; + +import net.minecraft.client.Minecraft; +import net.minecraft.client.renderer.BufferBuilder; +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.util.math.AxisAlignedBB; +import net.minecraft.util.math.BlockPos; +import net.minecraft.util.math.Vec3d; +import net.minecraftforge.fml.relauncher.Side; +import net.minecraftforge.fml.relauncher.SideOnly; +import org.lwjgl.opengl.GL11; +import org.lwjgl.util.Color; + +@SideOnly(Side.CLIENT) +public class RenderHelper { + public static void begin(float partialTicks) { + EntityPlayer player = Minecraft.getMinecraft().player; + double playerX = player.prevPosX + (player.posX - player.prevPosX) * partialTicks; + double playerY = player.prevPosY + (player.posY - player.prevPosY) * partialTicks; + double playerZ = player.prevPosZ + (player.posZ - player.prevPosZ) * partialTicks; + Vec3d playerPos = new Vec3d(playerX, playerY, playerZ); + + GL11.glPushAttrib(GL11.GL_ENABLE_BIT); + GL11.glPushMatrix(); + GL11.glDisable(GL11.GL_CULL_FACE); + GL11.glDisable(GL11.GL_LIGHTING); + GL11.glDisable(GL11.GL_TEXTURE_2D); + + GL11.glEnable(GL11.GL_BLEND); + GL11.glBlendFunc(GL11.GL_SRC_ALPHA, GL11.GL_ONE_MINUS_SRC_ALPHA); + + GL11.glTranslated(-playerPos.x, -playerPos.y, -playerPos.z); + + GL11.glLineWidth(2); + GL11.glDepthMask(false); + } + + public static void end() { + GL11.glDepthMask(true); + GL11.glPopMatrix(); + GL11.glPopAttrib(); + } + + public static void renderBlockOutline(BlockPos pos) { + renderBlockOutline(pos, pos); + } + + //Renders outline. Pos1 has to be minimal x,y,z and pos2 maximal x,y,z + public static void renderBlockOutline(BlockPos pos1, BlockPos pos2) { + GL11.glLineWidth(2); + + AxisAlignedBB aabb = new AxisAlignedBB(pos1, pos2.add(1, 1, 1)).grow(0.0020000000949949026); + + RenderGlobal.drawSelectionBoundingBox(aabb, 1f, 1f, 1f, 0.6f); + } + +} diff --git a/src/main/java/nl/requios/effortlessbuilding/SurvivalHelper.java b/src/main/java/nl/requios/effortlessbuilding/SurvivalHelper.java index 4d40ffb..69eecce 100644 --- a/src/main/java/nl/requios/effortlessbuilding/SurvivalHelper.java +++ b/src/main/java/nl/requios/effortlessbuilding/SurvivalHelper.java @@ -1,18 +1,15 @@ package nl.requios.effortlessbuilding; -import net.minecraft.advancements.CriteriaTriggers; 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.entity.Entity; import net.minecraft.entity.player.EntityPlayer; -import net.minecraft.entity.player.EntityPlayerMP; import net.minecraft.init.Blocks; import net.minecraft.item.Item; import net.minecraft.item.ItemBlock; import net.minecraft.item.ItemStack; -import net.minecraft.util.EnumActionResult; import net.minecraft.util.EnumFacing; import net.minecraft.util.SoundCategory; import net.minecraft.util.math.AxisAlignedBB; @@ -27,8 +24,11 @@ import java.util.List; public class SurvivalHelper { - //From ItemBlock#onItemUse + //Used for all placing of blocks in this mod. + //Checks if area is loaded, if player has the right permissions, if existing block can be replaced (drops it if so) and consumes an item from the stack. + //Based on ItemBlock#onItemUse public static boolean placeBlock(World world, EntityPlayer player, BlockPos pos, IBlockState blockState, ItemStack itemstack, EnumFacing facing, boolean skipCollisionCheck, boolean playSound) { + if (!world.isBlockLoaded(pos, true)) return false; //Randomizer bag synergy //Find itemstack that belongs to the blockstate @@ -39,18 +39,20 @@ public class SurvivalHelper { //Check if itemstack is correct if (!(itemstack.getItem() instanceof ItemBlock) || Block.getBlockFromItem(itemstack.getItem()) != blockState.getBlock()) { - EffortlessBuilding.log(player, "Cannot place block", true); + EffortlessBuilding.log(player, "Cannot replace block", true); EffortlessBuilding.log("SurvivalHelper#placeBlock: itemstack " + itemstack.toString() + " does not match blockstate " + blockState.toString()); return false; } Block block = ((ItemBlock) itemstack.getItem()).getBlock(); - if (!itemstack.isEmpty() && canPlayerEdit(player, world, pos, itemstack) && mayPlace(world, block, blockState, pos, skipCollisionCheck, facing.getOpposite(), player)) + if (!itemstack.isEmpty() && canPlayerEdit(player, world, pos, itemstack) && + mayPlace(world, block, blockState, pos, skipCollisionCheck, facing.getOpposite(), player) && + canReplace(world, player, pos)) { //Drop existing block //TODO check if can replace - dropBlock(world, pos, player); + dropBlock(world, player, pos); //From ItemBlock#placeBlockAt if (!world.setBlockState(pos, blockState, 11)) return false; @@ -79,18 +81,49 @@ public class SurvivalHelper { return false; } - public static boolean canBreak(){ - //Can break using held tool? (or in creative) - return true; + //Used for all breaking of blocks in this mod. + //Checks if area is loaded, if appropriate tool is used in survival mode, and drops the block directly into the players inventory + public static boolean breakBlock(World world, EntityPlayer player, BlockPos pos) { + if (!world.isBlockLoaded(pos, false)) return false; + + //Check if can break + if (canBreak(world, player, pos)) + { + //Drop existing block + dropBlock(world, player, pos); + + //Damage tool + player.getHeldItemMainhand().onBlockDestroyed(world, world.getBlockState(pos), pos, player); + + world.setBlockToAir(pos); + return true; + } + return false; } - public static boolean canReplace(){ - //Can be harvested with hand? (or in creative) - return true; + //Can break using held tool? (or in creative) + public static boolean canBreak(World world, EntityPlayer player, BlockPos pos) { + if (player.isCreative()) return true; + + IBlockState blockState = world.getBlockState(pos); + if (blockState.getBlock().canHarvestBlock(world, pos, player)) return true; + + return false; + } + + //Can be harvested with hand? (or in creative) + public static boolean canReplace(World world, EntityPlayer player, BlockPos pos){ + if (player.isCreative()) return true; + + IBlockState state = world.getBlockState(pos); + state = state.getBlock().getActualState(state, world, pos); + if (state.getMaterial().isToolNotRequired()) return true; + + return false; } //Gives items directly to player - public static void dropBlock(World world, BlockPos pos, EntityPlayer player){ + public static void dropBlock(World world, EntityPlayer player, BlockPos pos){ if (player.isCreative()) return; IBlockState blockState = world.getBlockState(pos); diff --git a/src/main/java/nl/requios/effortlessbuilding/proxy/ClientProxy.java b/src/main/java/nl/requios/effortlessbuilding/proxy/ClientProxy.java index 878ce4a..ea0c2d6 100644 --- a/src/main/java/nl/requios/effortlessbuilding/proxy/ClientProxy.java +++ b/src/main/java/nl/requios/effortlessbuilding/proxy/ClientProxy.java @@ -45,9 +45,9 @@ public class ClientProxy implements IProxy { keyBindings = new KeyBinding[3]; // instantiate the key bindings - keyBindings[0] = new KeyBinding("key.hud.desc", Keyboard.KEY_ADD, "key.effortlessbuilding.category"); - keyBindings[1] = new KeyBinding("key.replace.desc", Keyboard.KEY_SUBTRACT, "key.effortlessbuilding.category"); - keyBindings[2] = new KeyBinding("key.creative.desc", Keyboard.KEY_F4, "key.effortlessbuilding.category"); + keyBindings[0] = new KeyBinding("key.effortlessbuilding.hud.desc", Keyboard.KEY_ADD, "key.effortlessbuilding.category"); + keyBindings[1] = new KeyBinding("key.effortlessbuilding.replace.desc", Keyboard.KEY_SUBTRACT, "key.effortlessbuilding.category"); + keyBindings[2] = new KeyBinding("key.effortlessbuilding.creative.desc", Keyboard.KEY_F4, "key.effortlessbuilding.category"); // register all the key bindings for (int i = 0; i < keyBindings.length; ++i) { diff --git a/src/main/resources/assets/effortlessbuilding/lang/en_us.lang b/src/main/resources/assets/effortlessbuilding/lang/en_us.lang index fbc95b4..54fe9b3 100644 --- a/src/main/resources/assets/effortlessbuilding/lang/en_us.lang +++ b/src/main/resources/assets/effortlessbuilding/lang/en_us.lang @@ -1,6 +1,6 @@ key.effortlessbuilding.category=Effortless Building -key.hud.desc=Open Settings -key.replace.desc=Toggle QuickReplace -key.creative.desc=Toggle Creative/Survival +key.effortlessbuilding.hud.desc=Open Settings +key.effortlessbuilding.replace.desc=Toggle QuickReplace +key.effortlessbuilding.creative.desc=Toggle Survival/Creative Mode item.effortlessbuilding:randomizer_bag.name=Randomizer Bag \ No newline at end of file