From 408d96622b8a05c45feb1160f0a3d918cae8faf9 Mon Sep 17 00:00:00 2001 From: Christian Knaapen Date: Fri, 14 Dec 2018 20:12:18 +0100 Subject: [PATCH] Implemented new block preview for mirror and array, quickreplace and randomizer bag. Refactored buildmodifiers to use findCoordinates and findBlockStates. --- .../nl/requios/effortlessbuilding/Array.java | 110 +++---- .../effortlessbuilding/BuildConfig.java | 6 +- .../effortlessbuilding/BuildModifiers.java | 172 ++++++++++ .../BuildSettingsManager.java | 17 +- .../EffortlessBuilding.java | 9 +- .../effortlessbuilding/EventHandler.java | 53 ++- .../nl/requios/effortlessbuilding/Mirror.java | 304 +++++------------- .../effortlessbuilding/QuickReplace.java | 74 ----- ...va => BuildModifierCapabilityManager.java} | 30 +- .../helper/RenderHelper.java | 234 ++++++-------- .../item/ItemRandomizerBag.java | 13 +- ...ceMessage.java => BlockPlacedMessage.java} | 37 ++- .../effortlessbuilding/proxy/ClientProxy.java | 13 +- .../effortlessbuilding/proxy/ServerProxy.java | 5 - 14 files changed, 505 insertions(+), 572 deletions(-) create mode 100644 src/main/java/nl/requios/effortlessbuilding/BuildModifiers.java delete mode 100644 src/main/java/nl/requios/effortlessbuilding/QuickReplace.java rename src/main/java/nl/requios/effortlessbuilding/capability/{BuildModifierCapability.java => BuildModifierCapabilityManager.java} (80%) rename src/main/java/nl/requios/effortlessbuilding/network/{QuickReplaceMessage.java => BlockPlacedMessage.java} (70%) diff --git a/src/main/java/nl/requios/effortlessbuilding/Array.java b/src/main/java/nl/requios/effortlessbuilding/Array.java index 1337742..50c4ac2 100644 --- a/src/main/java/nl/requios/effortlessbuilding/Array.java +++ b/src/main/java/nl/requios/effortlessbuilding/Array.java @@ -7,6 +7,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.Vec3d; import net.minecraft.util.math.Vec3i; import net.minecraft.world.World; import net.minecraftforge.event.entity.player.PlayerEvent; @@ -15,6 +16,9 @@ import net.minecraftforge.items.IItemHandler; import nl.requios.effortlessbuilding.helper.SurvivalHelper; import nl.requios.effortlessbuilding.item.ItemRandomizerBag; +import java.util.ArrayList; +import java.util.List; + public class Array { public static class ArraySettings{ @@ -42,21 +46,33 @@ public class Array { } } - //Called from EventHandler - public static boolean onBlockPlaced(BlockEvent.PlaceEvent event) { - if (event.getWorld().isRemote) return false; + public static List findCoordinates(EntityPlayer player, BlockPos startPos) { + List coordinates = new ArrayList<>(); - //find arraysettings for the player that placed the block - ArraySettings a = BuildSettingsManager.getBuildSettings(event.getPlayer()).getArraySettings(); - if (a == null || !a.enabled) return false; + //find arraysettings for the player + ArraySettings a = BuildSettingsManager.getBuildSettings(player).getArraySettings(); + if (!isEnabled(a)) return coordinates; - if (a.offset.getX() == 0 && a.offset.getY() == 0 && a.offset.getZ() == 0) return false; - - BlockPos pos = event.getPos(); + BlockPos pos = startPos; Vec3i offset = new Vec3i(a.offset.getX(), a.offset.getY(), a.offset.getZ()); - //Get itemstack - ItemStack itemStack = event.getPlayer().getHeldItem(event.getHand()); + for (int i = 0; i < a.count; i++) { + pos = pos.add(offset); + coordinates.add(pos); + } + + return coordinates; + } + + public static List findBlockStates(EntityPlayer player, BlockPos startPos, IBlockState blockState, ItemStack itemStack, List itemStacks) { + List blockStates = new ArrayList<>(); + + //find arraysettings for the player that placed the block + ArraySettings a = BuildSettingsManager.getBuildSettings(player).getArraySettings(); + if (!isEnabled(a)) return blockStates; + + BlockPos pos = startPos; + Vec3i offset = new Vec3i(a.offset.getX(), a.offset.getY(), a.offset.getZ()); //Randomizer bag synergy IItemHandler bagInventory = null; @@ -66,68 +82,26 @@ public class Array { for (int i = 0; i < a.count; i++) { pos = pos.add(offset); - if (event.getWorld().isBlockLoaded(pos, true)) { - if (itemStack.isEmpty()) break; - IBlockState blockState = event.getPlacedBlock(); - - //Randomizer bag synergy - if (bagInventory != null) { - itemStack = ItemRandomizerBag.pickRandomStack(bagInventory); - if (itemStack.isEmpty()) continue; - blockState = getBlockStateFromRandomizerBag(bagInventory, event.getWorld(), event.getPlayer(), event.getPos(), itemStack, event.getHand()); - if (blockState == null) continue; - } - - //TODO check if can place (ItemBlock) and if can break replaced - - SurvivalHelper.placeBlock(event.getWorld(), event.getPlayer(), pos, blockState, itemStack, EnumFacing.NORTH, true, false); + //Randomizer bag synergy + if (bagInventory != null) { + itemStack = ItemRandomizerBag.pickRandomStack(bagInventory); + blockState = BuildModifiers.getBlockStateFromItem(itemStack, player, startPos, EnumFacing.UP, new Vec3d(0, 0, 0), EnumHand.MAIN_HAND); } + + blockStates.add(blockState); + itemStacks.add(itemStack); } + return blockStates; + } + + public static boolean isEnabled(ArraySettings a) { + if (a == null || !a.enabled) return false; + + if (a.offset.getX() == 0 && a.offset.getY() == 0 && a.offset.getZ() == 0) return false; + return true; } - 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, hand); - } - - //Called from EventHandler - public static void onBlockBroken(BlockEvent.BreakEvent event) { - if (event.getWorld().isRemote) return; - - //find arraysettings for the player that broke the block - ArraySettings a = BuildSettingsManager.getBuildSettings(event.getPlayer()).getArraySettings(); - if (a == null || !a.enabled) return; - - if (a.offset.getX() == 0 && a.offset.getY() == 0 && a.offset.getZ() == 0) return; - - BlockPos pos = event.getPos(); - 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); - SurvivalHelper.breakBlock(event.getWorld(), event.getPlayer(), pos); - } - } - - //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/BuildConfig.java b/src/main/java/nl/requios/effortlessbuilding/BuildConfig.java index a6afa45..745cd92 100644 --- a/src/main/java/nl/requios/effortlessbuilding/BuildConfig.java +++ b/src/main/java/nl/requios/effortlessbuilding/BuildConfig.java @@ -47,8 +47,8 @@ public class BuildConfig { } public static class Visuals { - @Comment({"Shows a block preview for the block you manually place,", - "in addition to blocks placed by the mirror or array."}) - public boolean showOutlineOnCurrentBlock = false; + @Comment({"Show a block preview if you have a block in hand,", + "even when mirror and array are off."}) + public boolean alwaysShowBlockPreview = false; } } diff --git a/src/main/java/nl/requios/effortlessbuilding/BuildModifiers.java b/src/main/java/nl/requios/effortlessbuilding/BuildModifiers.java new file mode 100644 index 0000000..9f25e4d --- /dev/null +++ b/src/main/java/nl/requios/effortlessbuilding/BuildModifiers.java @@ -0,0 +1,172 @@ +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; +import net.minecraft.item.ItemBlock; +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.event.world.BlockEvent; +import net.minecraftforge.fml.common.gameevent.TickEvent; +import nl.requios.effortlessbuilding.helper.SurvivalHelper; +import nl.requios.effortlessbuilding.item.ItemRandomizerBag; +import nl.requios.effortlessbuilding.network.BlockPlacedMessage; + +import java.util.*; + +public class BuildModifiers { + + //Uses a network message to get the previous raytraceresult from the player + //The server could keep track of all raytraceresults but this might lag with many players + //Raytraceresult is needed for sideHit and hitVec + public static void onBlockPlacedMessage(EntityPlayer player, BlockPlacedMessage message) { + if (!message.isBlockHit() || message.getBlockPos() == null) return; + + World world = player.world; + ItemRandomizerBag.renewRandomness(); + + BlockPos startPos = message.getBlockPos(); + + //Offset in direction of sidehit if not quickreplace and not replaceable + BuildSettingsManager.BuildSettings buildSettings = BuildSettingsManager.getBuildSettings(player); + boolean replaceable = world.getBlockState(startPos).getBlock().isReplaceable(player.world, startPos); + if (!buildSettings.doQuickReplace() && !replaceable) { + startPos = startPos.offset(message.getSideHit()); + } + + //Get under tall grass and other replaceable blocks + if (buildSettings.doQuickReplace() && replaceable) { + startPos = startPos.down(); + } + + //Format hitvec to 0.x + Vec3d hitVec = message.getHitVec(); + hitVec = new Vec3d(Math.abs(hitVec.x - ((int) hitVec.x)), Math.abs(hitVec.y - ((int) hitVec.y)), Math.abs(hitVec.z - ((int) hitVec.z))); + + //find coordinates and blockstates + List coordinates = findCoordinates(player, startPos); + List itemStacks = new ArrayList<>(); + List blockStates = findBlockStates(player, startPos, hitVec, message.getSideHit(), itemStacks); + + //check if valid blockstates + if (blockStates.size() == 0 || coordinates.size() != blockStates.size()) return; + + //place blocks + for (int i = 0; i < coordinates.size(); i++) { + BlockPos blockPos = coordinates.get(i); + IBlockState blockState = blockStates.get(i); + ItemStack itemStack = itemStacks.get(i); + + if (world.isBlockLoaded(blockPos, true)) { + //check itemstack empty + if (itemStack.isEmpty()) continue; + SurvivalHelper.placeBlock(world, player, blockPos, blockState, itemStack, EnumFacing.UP, true, false); + } + } + } + + public static void onBlockPlaced(BlockEvent.PlaceEvent event) { + if (event.getWorld().isRemote) return; + + BuildSettingsManager.BuildSettings buildSettings = BuildSettingsManager.getBuildSettings(event.getPlayer()); + //Only use own place event if anything is enabled + if (isEnabled(buildSettings, event.getPos())) { + EffortlessBuilding.packetHandler.sendTo(new BlockPlacedMessage(), (EntityPlayerMP) event.getPlayer()); + event.setCanceled(true); + } + + } + + public static void onBlockBroken(BlockEvent.BreakEvent event) { + if (event.getWorld().isRemote) return; + + //get coordinates + List coordinates = findCoordinates(event.getPlayer(), event.getPos()); + + //break all those blocks + for (BlockPos coordinate : coordinates) { + if (event.getWorld().isBlockLoaded(coordinate, false)) { + SurvivalHelper.breakBlock(event.getWorld(), event.getPlayer(), coordinate); + } + } + } + + public static List findCoordinates(EntityPlayer player, BlockPos startPos) { + List coordinates = new ArrayList<>(); + //Add current block being placed too + coordinates.add(startPos); + + List mirrorCoordinates = Mirror.findCoordinates(player, startPos); + coordinates.addAll(mirrorCoordinates); + coordinates.addAll(Array.findCoordinates(player, startPos)); + //get array for each coordinate + for (BlockPos coordinate : mirrorCoordinates) { + coordinates.addAll(Array.findCoordinates(player, coordinate)); + } + + return coordinates; + } + + public static List findBlockStates(EntityPlayer player, BlockPos startPos, Vec3d hitVec, EnumFacing facing, List itemStacks) { + List blockStates = new ArrayList<>(); + itemStacks.clear(); + + //Get itemstack + ItemStack itemStack = player.getHeldItem(EnumHand.MAIN_HAND); + if (itemStack.isEmpty() || !(itemStack.getItem() instanceof ItemBlock || itemStack.getItem() instanceof ItemRandomizerBag)) { + itemStack = player.getHeldItem(EnumHand.OFF_HAND); + } + if (itemStack.isEmpty() || !(itemStack.getItem() instanceof ItemBlock || itemStack.getItem() instanceof ItemRandomizerBag)) { + return blockStates; + } + + //Get ItemBlock stack + ItemStack itemBlock = ItemStack.EMPTY; + if (itemStack.getItem() instanceof ItemBlock) itemBlock = itemStack; + ItemRandomizerBag.resetRandomness(); + if (itemStack.getItem() instanceof ItemRandomizerBag) itemBlock = ItemRandomizerBag.pickRandomStack(ItemRandomizerBag.getBagInventory(itemStack)); + + IBlockState blockState = getBlockStateFromItem(itemBlock, player, startPos, facing, hitVec, EnumHand.MAIN_HAND); + //Add current block being placed too + blockStates.add(blockState); + itemStacks.add(itemStack); + + List mirrorBlockStates = Mirror.findBlockStates(player, startPos, blockState, itemStack, itemStacks); + blockStates.addAll(mirrorBlockStates); + blockStates.addAll(Array.findBlockStates(player, startPos, blockState, itemStack, itemStacks)); + //add array for each mirror coordinate + List findCoordinates = Mirror.findCoordinates(player, startPos); + for (int i = 0; i < findCoordinates.size(); i++) { + BlockPos coordinate = findCoordinates.get(i); + IBlockState blockState1 = mirrorBlockStates.get(i); + blockStates.addAll(Array.findBlockStates(player, coordinate, blockState1, itemStack, itemStacks)); + } + + return blockStates; + } + + public static boolean isEnabled(BuildSettingsManager.BuildSettings buildSettings, BlockPos startPos) { + return Mirror.isEnabled(buildSettings.getMirrorSettings(), startPos) || + Array.isEnabled(buildSettings.getArraySettings()) || + buildSettings.doQuickReplace(); + } + + public static IBlockState getBlockStateFromItem(ItemStack itemStack, EntityPlayer player, BlockPos blockPos, EnumFacing facing, Vec3d hitVec, EnumHand hand) { + return Block.getBlockFromItem(itemStack.getItem()).getStateForPlacement(player.world, blockPos, facing, + ((float) hitVec.x), ((float) hitVec.y), ((float) hitVec.z), itemStack.getMetadata(), player, hand); + } + + //Returns true if equal (or both null) + public static boolean compareCoordinates(List coordinates1, List coordinates2) { + if (coordinates1 == null && coordinates2 == null) return true; + if (coordinates1 == null || coordinates2 == null) return false; + + return coordinates1.equals(coordinates2); + } +} diff --git a/src/main/java/nl/requios/effortlessbuilding/BuildSettingsManager.java b/src/main/java/nl/requios/effortlessbuilding/BuildSettingsManager.java index 368fb1f..90924aa 100644 --- a/src/main/java/nl/requios/effortlessbuilding/BuildSettingsManager.java +++ b/src/main/java/nl/requios/effortlessbuilding/BuildSettingsManager.java @@ -2,27 +2,27 @@ package nl.requios.effortlessbuilding; import net.minecraft.entity.player.EntityPlayer; import net.minecraft.entity.player.EntityPlayerMP; -import net.minecraft.util.text.TextFormatting; import net.minecraftforge.fml.common.Mod; import net.minecraftforge.fml.common.eventhandler.SubscribeEvent; import net.minecraftforge.fml.common.gameevent.PlayerEvent; -import nl.requios.effortlessbuilding.capability.BuildModifierCapability; +import nl.requios.effortlessbuilding.capability.BuildModifierCapabilityManager; import nl.requios.effortlessbuilding.network.BuildSettingsMessage; @Mod.EventBusSubscriber public class BuildSettingsManager { - //Retrieves the buildsettings of a player through the buildModifier capability + //Retrieves the buildsettings of a player through the buildModifierCapability capability //Never returns null public static BuildSettings getBuildSettings(EntityPlayer player){ - if (player.hasCapability(BuildModifierCapability.buildModifier, null)) { - BuildModifierCapability.IBuildModifier capability = player.getCapability(BuildModifierCapability.buildModifier, null); + if (player.hasCapability(BuildModifierCapabilityManager.buildModifierCapability, null)) { + BuildModifierCapabilityManager.IBuildModifierCapability capability = player.getCapability( + BuildModifierCapabilityManager.buildModifierCapability, null); if (capability.getBuildModifierData() == null) { capability.setBuildModifierData(new BuildSettings()); } return capability.getBuildModifierData(); } - throw new IllegalArgumentException("Player does not have buildModifier capability"); + throw new IllegalArgumentException("Player does not have buildModifierCapability capability"); } public static void setBuildSettings(EntityPlayer player, BuildSettings buildSettings) { @@ -30,8 +30,9 @@ public class BuildSettingsManager { EffortlessBuilding.log("Cannot set buildsettings, player is null"); return; } - if (player.hasCapability(BuildModifierCapability.buildModifier, null)) { - BuildModifierCapability.IBuildModifier capability = player.getCapability(BuildModifierCapability.buildModifier, null); + if (player.hasCapability(BuildModifierCapabilityManager.buildModifierCapability, null)) { + BuildModifierCapabilityManager.IBuildModifierCapability capability = player.getCapability( + BuildModifierCapabilityManager.buildModifierCapability, null); capability.setBuildModifierData(buildSettings); } else { EffortlessBuilding.log(player, "Saving buildsettings failed."); diff --git a/src/main/java/nl/requios/effortlessbuilding/EffortlessBuilding.java b/src/main/java/nl/requios/effortlessbuilding/EffortlessBuilding.java index 0684f2d..c9f9dd7 100644 --- a/src/main/java/nl/requios/effortlessbuilding/EffortlessBuilding.java +++ b/src/main/java/nl/requios/effortlessbuilding/EffortlessBuilding.java @@ -21,7 +21,7 @@ import nl.requios.effortlessbuilding.capability.*; import nl.requios.effortlessbuilding.gui.RandomizerBagGuiHandler; import nl.requios.effortlessbuilding.item.ItemRandomizerBag; import nl.requios.effortlessbuilding.network.BuildSettingsMessage; -import nl.requios.effortlessbuilding.network.QuickReplaceMessage; +import nl.requios.effortlessbuilding.network.BlockPlacedMessage; import nl.requios.effortlessbuilding.proxy.IProxy; import org.apache.logging.log4j.Logger; @@ -63,13 +63,14 @@ public class EffortlessBuilding { logger = event.getModLog(); - CapabilityManager.INSTANCE.register(BuildModifierCapability.IBuildModifier.class, new BuildModifierCapability.Storage(), BuildModifierCapability.BuildModifier.class); + CapabilityManager.INSTANCE.register( + BuildModifierCapabilityManager.IBuildModifierCapability.class, new BuildModifierCapabilityManager.Storage(), BuildModifierCapabilityManager.BuildModifierCapability.class); EffortlessBuilding.packetHandler.registerMessage(BuildSettingsMessage.MessageHandler.class, BuildSettingsMessage.class, 0, Side.SERVER); EffortlessBuilding.packetHandler.registerMessage(BuildSettingsMessage.MessageHandler.class, BuildSettingsMessage.class, 0, Side.CLIENT); - EffortlessBuilding.packetHandler.registerMessage(QuickReplaceMessage.MessageHandler.class, QuickReplaceMessage.class, 1, Side.SERVER); - EffortlessBuilding.packetHandler.registerMessage(QuickReplaceMessage.MessageHandler.class, QuickReplaceMessage.class, 1, Side.CLIENT); + EffortlessBuilding.packetHandler.registerMessage(BlockPlacedMessage.MessageHandler.class, BlockPlacedMessage.class, 1, Side.SERVER); + EffortlessBuilding.packetHandler.registerMessage(BlockPlacedMessage.MessageHandler.class, BlockPlacedMessage.class, 1, Side.CLIENT); proxy.preInit(event); } diff --git a/src/main/java/nl/requios/effortlessbuilding/EventHandler.java b/src/main/java/nl/requios/effortlessbuilding/EventHandler.java index 833ed71..208d185 100644 --- a/src/main/java/nl/requios/effortlessbuilding/EventHandler.java +++ b/src/main/java/nl/requios/effortlessbuilding/EventHandler.java @@ -7,31 +7,30 @@ import net.minecraft.entity.player.EntityPlayer; import net.minecraft.item.Item; import net.minecraft.item.ItemBlock; import net.minecraft.item.ItemStack; -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.util.math.Vec3d; import net.minecraft.world.World; -import net.minecraftforge.common.ForgeHooks; import net.minecraftforge.common.config.Config; import net.minecraftforge.common.config.ConfigManager; 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.client.event.ConfigChangedEvent; import net.minecraftforge.fml.common.Mod; import net.minecraftforge.fml.common.eventhandler.SubscribeEvent; import net.minecraftforge.fml.common.gameevent.TickEvent; -import nl.requios.effortlessbuilding.capability.BuildModifierCapability; +import nl.requios.effortlessbuilding.capability.BuildModifierCapabilityManager; +import nl.requios.effortlessbuilding.helper.SurvivalHelper; + +import java.util.ArrayList; +import java.util.List; @Mod.EventBusSubscriber public class EventHandler { - private static boolean placedBlock = false; - private static BlockEvent.PlaceEvent placeEvent = null; @SubscribeEvent public static void registerBlocks(RegistryEvent.Register event) @@ -53,7 +52,7 @@ public class EventHandler @SubscribeEvent public static void attachCapabilities(AttachCapabilitiesEvent event) { if (event.getObject() instanceof EntityPlayer) { - event.addCapability(new ResourceLocation(EffortlessBuilding.MODID, "BuildModifier"), new BuildModifierCapability.Provider()); + event.addCapability(new ResourceLocation(EffortlessBuilding.MODID, "BuildModifier"), new BuildModifierCapabilityManager.Provider()); } } @@ -66,33 +65,19 @@ public class EventHandler } } - @SubscribeEvent - public static void onServerTick(TickEvent.ServerTickEvent event) { - if (placedBlock) { - placedBlock = false; - - Mirror.onBlockPlaced(placeEvent); - Array.onBlockPlaced(placeEvent); - } - } +// @SubscribeEvent +// public static void onServerTick(TickEvent.ServerTickEvent event) { +// +// } @SubscribeEvent public static void onBlockPlaced(BlockEvent.PlaceEvent event) { - if (QuickReplace.onBlockPlaced(event)) { - event.setCanceled(true); - return; - } - - //Delay mirror and array by a tick so we can edit the held itemstack - //Otherwise the itemstack count would be overridden by ItemBlock#onItemUse - placedBlock = true; - placeEvent = event; + BuildModifiers.onBlockPlaced(event); } @SubscribeEvent public static void onBlockBroken(BlockEvent.BreakEvent event) { - Mirror.onBlockBroken(event); - Array.onBlockBroken(event); + BuildModifiers.onBlockBroken(event); } @SubscribeEvent @@ -108,8 +93,16 @@ public class EventHandler float originalBlockHardness = event.getState().getBlockHardness(world, pos); float totalBlockHardness = 0; - totalBlockHardness += Mirror.getTotalBlockHardness(world, player, pos); - totalBlockHardness += Array.getTotalBlockHardness(world, player, pos); + //get coordinates + List coordinates = BuildModifiers.findCoordinates(player, pos); + for (int i = 1; i < coordinates.size(); i++) { + BlockPos coordinate = coordinates.get(i); + //get existing blockstates at those coordinates + IBlockState blockState = world.getBlockState(coordinate); + //add hardness for each blockstate, if can break + if (SurvivalHelper.canBreak(world, player, coordinate)) + totalBlockHardness += world.getBlockState(coordinate).getBlockHardness(world, coordinate); + } //Grabbing percentage from config float percentage = (float) BuildConfig.survivalBalancers.miningTimePercentage / 100; diff --git a/src/main/java/nl/requios/effortlessbuilding/Mirror.java b/src/main/java/nl/requios/effortlessbuilding/Mirror.java index 697029b..1522503 100644 --- a/src/main/java/nl/requios/effortlessbuilding/Mirror.java +++ b/src/main/java/nl/requios/effortlessbuilding/Mirror.java @@ -16,6 +16,9 @@ import net.minecraftforge.items.IItemHandler; import nl.requios.effortlessbuilding.helper.SurvivalHelper; import nl.requios.effortlessbuilding.item.ItemRandomizerBag; +import java.util.ArrayList; +import java.util.List; + public class Mirror { public static class MirrorSettings { @@ -43,27 +46,53 @@ public class Mirror { return radius * 2; } } + + public static List findCoordinates(EntityPlayer player, BlockPos startPos) { + List coordinates = new ArrayList<>(); - //Called from EventHandler - public static boolean onBlockPlaced(BlockEvent.PlaceEvent event) { - if (event.getWorld().isRemote) return false; + //find mirrorsettings for the player + MirrorSettings m = BuildSettingsManager.getBuildSettings(player).getMirrorSettings(); + if (!isEnabled(m, startPos)) return coordinates; - //find mirrorsettings for the player that placed the block - MirrorSettings m = BuildSettingsManager.getBuildSettings(event.getPlayer()).getMirrorSettings(); - if (m == null) return false; + if (m.mirrorX) coordinateMirrorX(m, startPos, coordinates); + if (m.mirrorY) coordinateMirrorY(m, startPos, coordinates); + if (m.mirrorZ) coordinateMirrorZ(m, startPos, coordinates); - if (!m.enabled || (!m.mirrorX && !m.mirrorY && !m.mirrorZ)) return false; + return coordinates; + } - //if within mirror distance, mirror - BlockPos oldBlockPos = event.getPos(); + private static void coordinateMirrorX(MirrorSettings m, BlockPos oldBlockPos, List coordinates) { + //find mirror position + double x = m.position.x + (m.position.x - oldBlockPos.getX() - 0.5); + BlockPos newBlockPos = new BlockPos(x, oldBlockPos.getY(), oldBlockPos.getZ()); + coordinates.add(newBlockPos); - 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 false; + if (m.mirrorY) coordinateMirrorY(m, newBlockPos, coordinates); + if (m.mirrorZ) coordinateMirrorZ(m, newBlockPos, coordinates); + } - //Get itemstack - ItemStack itemStack = event.getPlayer().getHeldItem(event.getHand()); + private static void coordinateMirrorY(MirrorSettings m, BlockPos oldBlockPos, List coordinates) { + //find mirror position + double y = m.position.y + (m.position.y - oldBlockPos.getY() - 0.5); + BlockPos newBlockPos = new BlockPos(oldBlockPos.getX(), y, oldBlockPos.getZ()); + coordinates.add(newBlockPos); + + if (m.mirrorZ) coordinateMirrorZ(m, newBlockPos, coordinates); + } + + private static void coordinateMirrorZ(MirrorSettings m, BlockPos oldBlockPos, List coordinates) { + //find mirror position + double z = m.position.z + (m.position.z - oldBlockPos.getZ() - 0.5); + BlockPos newBlockPos = new BlockPos(oldBlockPos.getX(), oldBlockPos.getY(), z); + coordinates.add(newBlockPos); + } + + public static List findBlockStates(EntityPlayer player, BlockPos startPos, IBlockState blockState, ItemStack itemStack, List itemStacks) { + List blockStates = new ArrayList<>(); + + //find mirrorsettings for the player + MirrorSettings m = BuildSettingsManager.getBuildSettings(player).getMirrorSettings(); + if (!isEnabled(m, startPos)) return blockStates; //Randomizer bag synergy IItemHandler bagInventory = null; @@ -71,23 +100,15 @@ public class Mirror { bagInventory = ItemRandomizerBag.getBagInventory(itemStack); } - if (m.mirrorX) { - placeMirrorX(event.getWorld(), event.getPlayer(), m, event.getPos(), event.getPlacedBlock(), bagInventory, itemStack, event.getHand()); - } + if (m.mirrorX) blockStateMirrorX(player, m, startPos, blockState, bagInventory, itemStack, EnumHand.MAIN_HAND, blockStates, itemStacks); + if (m.mirrorY) blockStateMirrorY(player, m, startPos, blockState, bagInventory, itemStack, EnumHand.MAIN_HAND, blockStates, itemStacks); + if (m.mirrorZ) blockStateMirrorZ(player, m, startPos, blockState, bagInventory, itemStack, EnumHand.MAIN_HAND, blockStates, itemStacks); - if (m.mirrorY) { - 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, event.getHand()); - } - - return true; + return blockStates; } - private static void placeMirrorX(World world, EntityPlayer player, MirrorSettings m, BlockPos oldBlockPos, IBlockState oldBlockState, - IItemHandler bagInventory, ItemStack itemStack, EnumHand hand) { + private static void blockStateMirrorX(EntityPlayer player, MirrorSettings m, BlockPos oldBlockPos, IBlockState oldBlockState, + IItemHandler bagInventory, ItemStack itemStack, EnumHand hand, List blockStates, List itemStacks) { //find mirror position double x = m.position.x + (m.position.x - oldBlockPos.getX() - 0.5); BlockPos newBlockPos = new BlockPos(x, oldBlockPos.getY(), oldBlockPos.getZ()); @@ -95,22 +116,22 @@ public class Mirror { //Randomizer bag synergy if (bagInventory != null) { itemStack = ItemRandomizerBag.pickRandomStack(bagInventory); - if (itemStack.isEmpty()) return; - oldBlockState = getBlockStateFromRandomizerBag(bagInventory, world, player, oldBlockPos, itemStack, hand); - if (oldBlockState == null) return; + oldBlockState = BuildModifiers.getBlockStateFromItem(itemStack, player, oldBlockPos, EnumFacing.UP, new Vec3d(0, 0, 0), hand); } - IBlockState newBlockState = oldBlockState.withMirror(net.minecraft.util.Mirror.FRONT_BACK); - //place block - if (world.isBlockLoaded(newBlockPos, true)) { - placeBlock(world, player, newBlockPos, newBlockState, itemStack, hand); - } - if (m.mirrorY) placeMirrorY(world, player, m, newBlockPos, newBlockState, bagInventory, itemStack, hand); - if (m.mirrorZ) placeMirrorZ(world, player, m, newBlockPos, newBlockState, bagInventory, itemStack, hand); + //Find blockstate + IBlockState newBlockState = oldBlockState == null ? null : oldBlockState.withMirror(net.minecraft.util.Mirror.FRONT_BACK); + + //Store blockstate and itemstack + blockStates.add(newBlockState); + itemStacks.add(itemStack); + + if (m.mirrorY) blockStateMirrorY(player, m, newBlockPos, newBlockState, bagInventory, itemStack, hand, blockStates, itemStacks); + if (m.mirrorZ) blockStateMirrorZ(player, m, newBlockPos, newBlockState, bagInventory, itemStack, hand, blockStates, itemStacks); } - private static void placeMirrorY(World world, EntityPlayer player, MirrorSettings m, BlockPos oldBlockPos, IBlockState oldBlockState, - IItemHandler bagInventory, ItemStack itemStack, EnumHand hand) { + private static void blockStateMirrorY(EntityPlayer player, MirrorSettings m, BlockPos oldBlockPos, IBlockState oldBlockState, + IItemHandler bagInventory, ItemStack itemStack, EnumHand hand, List blockStates, List itemStacks) { //find mirror position double y = m.position.y + (m.position.y - oldBlockPos.getY() - 0.5); BlockPos newBlockPos = new BlockPos(oldBlockPos.getX(), y, oldBlockPos.getZ()); @@ -118,21 +139,21 @@ public class Mirror { //Randomizer bag synergy if (bagInventory != null) { itemStack = ItemRandomizerBag.pickRandomStack(bagInventory); - if (itemStack.isEmpty()) return; - oldBlockState = getBlockStateFromRandomizerBag(bagInventory, world, player, oldBlockPos, itemStack, hand); - if (oldBlockState == null) return; + oldBlockState = BuildModifiers.getBlockStateFromItem(itemStack, player, oldBlockPos, EnumFacing.UP, new Vec3d(0, 0, 0), hand); } - IBlockState newBlockState = getVerticalMirror(oldBlockState); - //place block - if (world.isBlockLoaded(newBlockPos, true)) { - placeBlock(world, player, newBlockPos, newBlockState, itemStack, hand); - } - if (m.mirrorZ) placeMirrorZ(world, player, m, newBlockPos, newBlockState, bagInventory, itemStack, hand); + //Find blockstate + IBlockState newBlockState = oldBlockState == null ? null : getVerticalMirror(oldBlockState); + + //Store blockstate and itemstack + blockStates.add(newBlockState); + itemStacks.add(itemStack); + + if (m.mirrorZ) blockStateMirrorZ(player, m, newBlockPos, newBlockState, bagInventory, itemStack, hand, blockStates, itemStacks); } - private static void placeMirrorZ(World world, EntityPlayer player, MirrorSettings m, BlockPos oldBlockPos, IBlockState oldBlockState, - IItemHandler bagInventory, ItemStack itemStack, EnumHand hand) { + private static void blockStateMirrorZ(EntityPlayer player, MirrorSettings m, BlockPos oldBlockPos, IBlockState oldBlockState, + IItemHandler bagInventory, ItemStack itemStack, EnumHand hand, List blockStates, List itemStacks) { //find mirror position double z = m.position.z + (m.position.z - oldBlockPos.getZ() - 0.5); BlockPos newBlockPos = new BlockPos(oldBlockPos.getX(), oldBlockPos.getY(), z); @@ -140,33 +161,27 @@ public class Mirror { //Randomizer bag synergy if (bagInventory != null) { itemStack = ItemRandomizerBag.pickRandomStack(bagInventory); - if (itemStack.isEmpty()) return; - oldBlockState = getBlockStateFromRandomizerBag(bagInventory, world, player, oldBlockPos, itemStack, hand); - if (oldBlockState == null) return; + oldBlockState = BuildModifiers.getBlockStateFromItem(itemStack, player, oldBlockPos, EnumFacing.UP, new Vec3d(0, 0, 0), hand); } - IBlockState newBlockState = oldBlockState.withMirror(net.minecraft.util.Mirror.LEFT_RIGHT); - //place block - if (world.isBlockLoaded(newBlockPos, true)) { - placeBlock(world, player, newBlockPos, newBlockState, itemStack, hand); - } + //Find blockstate + IBlockState newBlockState = oldBlockState == null ? null : oldBlockState.withMirror(net.minecraft.util.Mirror.LEFT_RIGHT); + + //Store blockstate and itemstack + blockStates.add(newBlockState); + itemStacks.add(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, hand); - } + public static boolean isEnabled(MirrorSettings m, BlockPos startPos) { + if (m == null || !m.enabled || (!m.mirrorX && !m.mirrorY && !m.mirrorZ)) return false; - 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 + //if within mirror distance, mirror + if (startPos.getX() + 0.5 < m.position.x - m.radius || startPos.getX() + 0.5 > m.position.x + m.radius || + startPos.getY() + 0.5 < m.position.y - m.radius || startPos.getY() + 0.5 > m.position.y + m.radius || + startPos.getZ() + 0.5 < m.position.z - m.radius || startPos.getZ() + 0.5 > m.position.z + m.radius) + return false; - SurvivalHelper.placeBlock(world, player, newBlockPos, newBlockState, itemStack, EnumFacing.NORTH, true, false); - - //Array synergy - BlockSnapshot blockSnapshot = new BlockSnapshot(world, newBlockPos, newBlockState); - BlockEvent.PlaceEvent placeEvent = new BlockEvent.PlaceEvent(blockSnapshot, newBlockState, player, hand); - Array.onBlockPlaced(placeEvent); + return true; } private static IBlockState getVerticalMirror(IBlockState blockState) { @@ -209,147 +224,4 @@ public class Mirror { return blockState; } - - //Called from EventHandler - public static void onBlockBroken(BlockEvent.BreakEvent event) { - if (event.getWorld().isRemote) return; - - //find mirrorsettings for the player that broke the block - MirrorSettings m = BuildSettingsManager.getBuildSettings(event.getPlayer()).getMirrorSettings(); - if (m == null) return; - - if (!m.enabled || (!m.mirrorX && !m.mirrorY && !m.mirrorZ)) return; - - //if within mirror distance, break mirror block - BlockPos oldBlockPos = event.getPos(); - - 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; - - if (m.mirrorX) { - breakMirrorX(event, m, oldBlockPos); - } - - if (m.mirrorY) { - breakMirrorY(event, m, oldBlockPos); - } - - if (m.mirrorZ) { - breakMirrorZ(event, m, oldBlockPos); - } - } - - private static void breakMirrorX(BlockEvent.BreakEvent event, MirrorSettings m, BlockPos oldBlockPos) { - //find mirror position - double x = m.position.x + (m.position.x - oldBlockPos.getX() - 0.5); - BlockPos newBlockPos = new BlockPos(x, oldBlockPos.getY(), oldBlockPos.getZ()); - //break block - breakBlock(event, newBlockPos); - if (m.mirrorY) breakMirrorY(event, m, newBlockPos); - if (m.mirrorZ) breakMirrorZ(event, m, newBlockPos); - } - - private static void breakMirrorY(BlockEvent.BreakEvent event, MirrorSettings m, BlockPos oldBlockPos) { - //find mirror position - double y = m.position.y + (m.position.y - oldBlockPos.getY() - 0.5); - BlockPos newBlockPos = new BlockPos(oldBlockPos.getX(), y, oldBlockPos.getZ()); - //break block - breakBlock(event, newBlockPos); - if (m.mirrorZ) breakMirrorZ(event, m, newBlockPos); - } - - private static void breakMirrorZ(BlockEvent.BreakEvent event, MirrorSettings m, BlockPos oldBlockPos) { - //find mirror position - double z = m.position.z + (m.position.z - oldBlockPos.getZ() - 0.5); - BlockPos newBlockPos = new BlockPos(oldBlockPos.getX(), oldBlockPos.getY(), z); - //break block - breakBlock(event, newBlockPos); - } - - private static void breakBlock(BlockEvent.BreakEvent event, BlockPos newBlockPos) { - if (!event.getWorld().isBlockLoaded(newBlockPos, false)) return; - - SurvivalHelper.breakBlock(event.getWorld(), event.getPlayer(), newBlockPos); - - //Array synergy - BlockEvent.BreakEvent breakEvent = new BlockEvent.BreakEvent(event.getWorld(), newBlockPos, event.getWorld().getBlockState(newBlockPos), event.getPlayer()); - 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 deleted file mode 100644 index 8a17661..0000000 --- a/src/main/java/nl/requios/effortlessbuilding/QuickReplace.java +++ /dev/null @@ -1,74 +0,0 @@ -package nl.requios.effortlessbuilding; - -import net.minecraft.block.state.IBlockState; -import net.minecraft.entity.player.EntityPlayer; -import net.minecraft.entity.player.EntityPlayerMP; -import net.minecraft.item.ItemStack; -import net.minecraft.util.EnumHand; -import net.minecraft.util.math.BlockPos; -import net.minecraftforge.common.util.BlockSnapshot; -import net.minecraftforge.event.world.BlockEvent; -import nl.requios.effortlessbuilding.helper.SurvivalHelper; -import nl.requios.effortlessbuilding.network.QuickReplaceMessage; - -import java.util.Dictionary; -import java.util.Hashtable; -import java.util.UUID; - -public class QuickReplace { - //Dilemma in getting blockstate from event to when message is received: - // 1) send via client. Then hacking makes it possible to place any block. - // 2) save serverside. Messages may not be received chronologically so data could get switched. - //Solution for now: save data serverside and per player. Messages from 1 player will rarely come unchronologically - //and players will rarely switch between blocks that quickly. - - 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; - //Only serverside - - BuildSettingsManager.BuildSettings buildSettings = BuildSettingsManager.getBuildSettings(event.getPlayer()); - if (!buildSettings.doQuickReplace()) return false; - - //TODO base on player facing instead, no more messages (or break block clientside) - - 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()); - - return true; - } - - public static void onMessageReceived(EntityPlayer player, QuickReplaceMessage message) { - BuildSettingsManager.BuildSettings buildSettings = BuildSettingsManager.getBuildSettings(player); - if (!buildSettings.doQuickReplace()) return; - - if (!message.isBlockHit() || message.getBlockPos() == null) return; - - BlockPos placedAgainstBlockPos = message.getBlockPos(); - - //Get under tall grass and other replaceable blocks - if (player.world.getBlockState(placedAgainstBlockPos).getBlock().isReplaceable(player.world, placedAgainstBlockPos)) { - placedAgainstBlockPos = placedAgainstBlockPos.down(); - } - - 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, hand); - Mirror.onBlockPlaced(placeEvent); - Array.onBlockPlaced(placeEvent); - } -} diff --git a/src/main/java/nl/requios/effortlessbuilding/capability/BuildModifierCapability.java b/src/main/java/nl/requios/effortlessbuilding/capability/BuildModifierCapabilityManager.java similarity index 80% rename from src/main/java/nl/requios/effortlessbuilding/capability/BuildModifierCapability.java rename to src/main/java/nl/requios/effortlessbuilding/capability/BuildModifierCapabilityManager.java index f5fccc5..3d38f91 100644 --- a/src/main/java/nl/requios/effortlessbuilding/capability/BuildModifierCapability.java +++ b/src/main/java/nl/requios/effortlessbuilding/capability/BuildModifierCapabilityManager.java @@ -19,18 +19,18 @@ import javax.annotation.Nonnull; import javax.annotation.Nullable; @Mod.EventBusSubscriber -public class BuildModifierCapability { +public class BuildModifierCapabilityManager { - @CapabilityInject(IBuildModifier.class) - public final static Capability buildModifier = null; + @CapabilityInject(IBuildModifierCapability.class) + public final static Capability buildModifierCapability = null; - public interface IBuildModifier { + public interface IBuildModifierCapability { BuildSettings getBuildModifierData(); void setBuildModifierData(BuildSettings buildSettings); } - public static class BuildModifier implements IBuildModifier { + public static class BuildModifierCapability implements IBuildModifierCapability { private BuildSettings buildSettings; @Override @@ -44,9 +44,9 @@ public class BuildModifierCapability { } } - public static class Storage implements Capability.IStorage { + public static class Storage implements Capability.IStorage { @Override - public NBTBase writeNBT(Capability capability, IBuildModifier instance, EnumFacing side) { + public NBTBase writeNBT(Capability capability, IBuildModifierCapability instance, EnumFacing side) { NBTTagCompound compound = new NBTTagCompound(); BuildSettings buildSettings = instance.getBuildModifierData(); if (buildSettings == null) buildSettings = new BuildSettings(); @@ -79,7 +79,7 @@ public class BuildModifierCapability { } @Override - public void readNBT(Capability capability, IBuildModifier instance, EnumFacing side, NBTBase nbt) { + public void readNBT(Capability capability, IBuildModifierCapability instance, EnumFacing side, NBTBase nbt) { NBTTagCompound compound = (NBTTagCompound) nbt; //MIRROR @@ -109,35 +109,35 @@ public class BuildModifierCapability { } public static class Provider implements ICapabilitySerializable { - IBuildModifier inst = buildModifier.getDefaultInstance(); + IBuildModifierCapability inst = buildModifierCapability.getDefaultInstance(); @Override public boolean hasCapability(@Nonnull Capability capability, @Nullable EnumFacing facing) { - return capability == buildModifier; + return capability == buildModifierCapability; } @Override public T getCapability(@Nonnull Capability capability, @Nullable EnumFacing facing) { - if (capability == buildModifier) return buildModifier.cast(inst); + if (capability == buildModifierCapability) return buildModifierCapability.cast(inst); return null; } @Override public NBTBase serializeNBT() { - return buildModifier.getStorage().writeNBT(buildModifier, inst, null); + return buildModifierCapability.getStorage().writeNBT(buildModifierCapability, inst, null); } @Override public void deserializeNBT(NBTBase nbt) { - buildModifier.getStorage().readNBT(buildModifier, inst, null, nbt); + buildModifierCapability.getStorage().readNBT(buildModifierCapability, inst, null, nbt); } } // Allows for the capability to persist after death. @SubscribeEvent public static void clonePlayer(PlayerEvent.Clone event) { - IBuildModifier original = event.getOriginal().getCapability(buildModifier, null); - IBuildModifier clone = event.getEntity().getCapability(buildModifier, null); + IBuildModifierCapability original = event.getOriginal().getCapability(buildModifierCapability, null); + IBuildModifierCapability clone = event.getEntity().getCapability(buildModifierCapability, null); clone.setBuildModifierData(original.getBuildModifierData()); } } diff --git a/src/main/java/nl/requios/effortlessbuilding/helper/RenderHelper.java b/src/main/java/nl/requios/effortlessbuilding/helper/RenderHelper.java index 5a4f0c0..5d9aa5c 100644 --- a/src/main/java/nl/requios/effortlessbuilding/helper/RenderHelper.java +++ b/src/main/java/nl/requios/effortlessbuilding/helper/RenderHelper.java @@ -10,9 +10,11 @@ import net.minecraft.entity.player.EntityPlayer; import net.minecraft.item.ItemBlock; import net.minecraft.item.ItemStack; import net.minecraft.item.ItemTool; -import net.minecraft.util.EnumFacing; +import net.minecraft.util.BlockRenderLayer; import net.minecraft.util.EnumHand; import net.minecraft.util.math.*; +import net.minecraftforge.client.ForgeHooksClient; +import net.minecraftforge.client.MinecraftForgeClient; import net.minecraftforge.client.event.RenderWorldLastEvent; import net.minecraftforge.fml.common.Mod; import net.minecraftforge.fml.common.eventhandler.SubscribeEvent; @@ -23,6 +25,9 @@ import org.lwjgl.opengl.GL11; import org.lwjgl.opengl.GL14; import org.lwjgl.util.Color; +import java.util.ArrayList; +import java.util.List; + @Mod.EventBusSubscriber(Side.CLIENT) public class RenderHelper { @@ -33,15 +38,23 @@ public class RenderHelper { private static final int planeAlpha = 75; private static final Vec3d epsilon = new Vec3d(0.001, 0.001, 0.001); //prevents z-fighting - public static void begin(float partialTicks) { + private static List previousCoordinates; + + private 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.glTranslated(-playerPos.x, -playerPos.y, -playerPos.z); + + GL11.glDepthMask(false); + } + + private static void beginLines() { + GL11.glPushAttrib(GL11.GL_ENABLE_BIT); GL11.glDisable(GL11.GL_CULL_FACE); GL11.glDisable(GL11.GL_LIGHTING); GL11.glDisable(GL11.GL_TEXTURE_2D); @@ -49,18 +62,23 @@ public class RenderHelper { 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(); + private static void endLines() { GL11.glPopAttrib(); } + private static void beginBlockPreviews() { + GL11.glPushAttrib(GL11.GL_ENABLE_BIT); + GL11.glEnable(GL11.GL_CULL_FACE); + GL11.glEnable(GL11.GL_TEXTURE_2D); + Minecraft.getMinecraft().renderEngine.bindTexture(TextureMap.LOCATION_BLOCKS_TEXTURE); + GlStateManager.enableBlend(); + GlStateManager.blendFunc(GL11.GL_CONSTANT_ALPHA, GL11.GL_ONE_MINUS_CONSTANT_ALPHA); + GL14.glBlendColor(1F, 1F, 1F, 0.6f); + } + public static void renderBlockOutline(BlockPos pos) { renderBlockOutline(pos, pos); } @@ -71,20 +89,40 @@ public class RenderHelper { AxisAlignedBB aabb = new AxisAlignedBB(pos1, pos2.add(1, 1, 1)).grow(0.0020000000949949026); - RenderGlobal.drawSelectionBoundingBox(aabb, 1f, 1f, 1f, 0.6f); + RenderGlobal.drawSelectionBoundingBox(aabb, 0f, 0f, 0f, 0.4f); + } + + private static void endBlockPreviews() { + GlStateManager.blendFunc(GL11.GL_SRC_ALPHA, GL11.GL_ONE_MINUS_SRC_ALPHA); + GlStateManager.disableBlend(); + GL11.glPopAttrib(); + } + + private static void end() { + GL11.glDepthMask(true); + GL11.glPopMatrix(); + } + + private static void renderBlockPreview(BlockRendererDispatcher dispatcher, BlockPos blockPos, IBlockState blockState) { + GlStateManager.pushMatrix(); + GlStateManager.translate(blockPos.getX(), blockPos.getY(), blockPos.getZ()); + GlStateManager.rotate(-90.0F, 0.0F, 1.0F, 0.0F); + GlStateManager.translate(-0.005f, -0.005f, 0.005f); + GlStateManager.scale(1.01f, 1.01f, 1.01f); + dispatcher.renderBlockBrightness(blockState, 1f); + GlStateManager.popMatrix(); } @SubscribeEvent public static void onRender(RenderWorldLastEvent event) { EntityPlayer player = Minecraft.getMinecraft().player; BuildSettingsManager.BuildSettings buildSettings = BuildSettingsManager.getBuildSettings(player); - if (buildSettings == null) return; - Mirror.MirrorSettings m = buildSettings.getMirrorSettings(); - Array.ArraySettings a = buildSettings.getArraySettings(); begin(event.getPartialTicks()); - //Mirror + //Mirror lines and areas + beginLines(); + Mirror.MirrorSettings m = buildSettings.getMirrorSettings(); if (m != null && m.enabled && (m.mirrorX || m.mirrorY || m.mirrorZ)) { Vec3d pos = m.position.add(epsilon); @@ -118,84 +156,73 @@ public class RenderHelper { { drawMirrorLines(m); } - } + endLines(); //Render block previews RayTraceResult objectMouseOver = Minecraft.getMinecraft().objectMouseOver; //Checking for null is necessary! Even in vanilla when looking down ladders it is occasionally null (instead of Type MISS) if (objectMouseOver != null && objectMouseOver.typeOfHit == RayTraceResult.Type.BLOCK) { - BlockPos blockPos = objectMouseOver.getBlockPos(); - ItemStack stack = ItemStack.EMPTY; - ItemStack mainhand = player.getHeldItemMainhand(); - IBlockState blockState = null; - if (mainhand.getItem() instanceof ItemBlock) { - stack = mainhand; - Block block = ((ItemBlock) stack.getItem()).getBlock(); - Vec3d hitVec = objectMouseOver.hitVec; - hitVec = new Vec3d(Math.abs(hitVec.x - ((int) hitVec.x)), Math.abs(hitVec.y - ((int) hitVec.y)), Math.abs(hitVec.z - ((int) hitVec.z))); - blockState = block.getStateForPlacement(player.world, blockPos, objectMouseOver.sideHit, - ((float) hitVec.x), ((float) hitVec.y), ((float) hitVec.z), stack.getMetadata(), player, EnumHand.MAIN_HAND); - } - if (mainhand.getItem() instanceof ItemRandomizerBag) { - //TODO figure this out - } - //TODO check offhand + beginBlockPreviews(); + BlockRendererDispatcher dispatcher = Minecraft.getMinecraft().getBlockRendererDispatcher(); + BlockPos startPos = objectMouseOver.getBlockPos(); //Check if tool (or none) in hand + ItemStack mainhand = player.getHeldItemMainhand(); boolean toolInHand = !mainhand.isEmpty() && mainhand.getItem() instanceof ItemTool; - if (!buildSettings.doQuickReplace() && !toolInHand) { - blockPos = blockPos.offset(objectMouseOver.sideHit); + boolean replaceable = + player.world.getBlockState(startPos).getBlock().isReplaceable(player.world, startPos); + if (!buildSettings.doQuickReplace() && !toolInHand && !replaceable) { + startPos = startPos.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(); + //Get under tall grass and other replaceable blocks + if (buildSettings.doQuickReplace() && !toolInHand && replaceable) { + startPos = startPos.down(); + } + + //get coordinates + List newCoordinates = BuildModifiers.findCoordinates(player, startPos); + + if (BuildModifiers.isEnabled(buildSettings, startPos) || BuildConfig.visuals.alwaysShowBlockPreview) { + //check if they are different from previous + if (!BuildModifiers.compareCoordinates(previousCoordinates, newCoordinates)) { + previousCoordinates = newCoordinates; + //if so, renew randomness of randomizer bag + ItemRandomizerBag.renewRandomness(); + } + + Vec3d hitVec = objectMouseOver.hitVec; + hitVec = new Vec3d(Math.abs(hitVec.x - ((int) hitVec.x)), Math.abs(hitVec.y - ((int) hitVec.y)), + Math.abs(hitVec.z - ((int) hitVec.z))); + List itemStacks = new ArrayList<>(); + List blockStates = BuildModifiers.findBlockStates(player, startPos, hitVec, objectMouseOver.sideHit, itemStacks); + + //check if valid blockstates + if (blockStates.size() != 0 && newCoordinates.size() == blockStates.size()) { + for (int i = 0; i < newCoordinates.size(); i++) { + BlockPos blockPos = newCoordinates.get(i); + IBlockState blockState = blockStates.get(i); + renderBlockPreview(dispatcher, blockPos, blockState); + } } } + endBlockPreviews(); - //Render current block outline based on config, or when QuickReplace is enabled - if (buildSettings.doQuickReplace() || BuildConfig.visuals.showOutlineOnCurrentBlock) { - RenderHelper.renderBlockOutline(blockPos); - } + beginLines(); + //Draw outlines if tool in hand + if (toolInHand) { + for (int i = 1; i < newCoordinates.size(); i++) { + BlockPos coordinate = newCoordinates.get(i); - //TODO testing - if (blockState != null) { - BlockRendererDispatcher dispatcher = Minecraft.getMinecraft().getBlockRendererDispatcher(); - GL11.glPushAttrib(GL11.GL_ENABLE_BIT); - GlStateManager.pushMatrix();//Push matrix again just because - GL11.glEnable(GL11.GL_CULL_FACE); - GL11.glEnable(GL11.GL_TEXTURE_2D); - Minecraft.getMinecraft().renderEngine.bindTexture(TextureMap.LOCATION_BLOCKS_TEXTURE); - GlStateManager.enableBlend(); - GlStateManager.blendFunc(GL11.GL_CONSTANT_ALPHA, GL11.GL_ONE_MINUS_CONSTANT_ALPHA); - GlStateManager.translate(blockPos.getX(), blockPos.getY(), blockPos.getZ()); - GlStateManager.rotate(-90.0F, 0.0F, 1.0F, 0.0F); - GlStateManager.translate(-0.005f, -0.005f, 0.005f); - GlStateManager.scale(1.01f, 1.01f, 1.01f); - GL14.glBlendColor(1F, 1F, 1F, 0.6f); - dispatcher.renderBlockBrightness(blockState, 1f); - GlStateManager.popMatrix(); - GL11.glPopAttrib(); - } - - //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)) { - drawArrayBlockOutlines(a, blockPos); + IBlockState blockState = player.world.getBlockState(coordinate); + if (!blockState.getBlock().isAir(blockState, player.world, coordinate)) { + renderBlockOutline(coordinate); + } + } } + endLines(); } end(); @@ -285,61 +312,4 @@ public class RenderHelper { tessellator.draw(); } - public static void drawMirrorBlockOutlineX(BuildSettingsManager.BuildSettings buildSettings, BlockPos oldBlockPos) { - Mirror.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 - drawArrayBlockOutlines(buildSettings.getArraySettings(), newBlockPos); - - if (m.mirrorY) drawMirrorBlockOutlineY(buildSettings, newBlockPos); - if (m.mirrorZ) drawMirrorBlockOutlineZ(buildSettings, newBlockPos); - } - - public static void drawMirrorBlockOutlineY(BuildSettingsManager.BuildSettings buildSettings, BlockPos oldBlockPos) { - Mirror.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 - drawArrayBlockOutlines(buildSettings.getArraySettings(), newBlockPos); - - if (m.mirrorZ) drawMirrorBlockOutlineZ(buildSettings, newBlockPos); - } - - public static void drawMirrorBlockOutlineZ(BuildSettingsManager.BuildSettings buildSettings, BlockPos oldBlockPos) { - Mirror.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 - drawArrayBlockOutlines(buildSettings.getArraySettings(), newBlockPos); - } - - - //----Array---- - - public static void drawArrayBlockOutlines(Array.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/item/ItemRandomizerBag.java b/src/main/java/nl/requios/effortlessbuilding/item/ItemRandomizerBag.java index 0095abf..627e2fb 100644 --- a/src/main/java/nl/requios/effortlessbuilding/item/ItemRandomizerBag.java +++ b/src/main/java/nl/requios/effortlessbuilding/item/ItemRandomizerBag.java @@ -24,13 +24,15 @@ import nl.requios.effortlessbuilding.helper.SurvivalHelper; import javax.annotation.Nullable; import java.util.ArrayList; +import java.util.Calendar; import java.util.List; import java.util.Random; public class ItemRandomizerBag extends Item { public static final int INV_SIZE = 5; - private static Random rand = new Random(1337); + private static long currentSeed = 1337; + private static Random rand = new Random(currentSeed); public ItemRandomizerBag() { this.setRegistryName(EffortlessBuilding.MODID, "randomizer_bag"); @@ -182,4 +184,13 @@ public class ItemRandomizerBag extends Item { public String getUnlocalizedName() { return super.getUnlocalizedName(); } + + public static void resetRandomness() { + rand.setSeed(currentSeed); + } + + public static void renewRandomness() { + currentSeed = Calendar.getInstance().getTimeInMillis(); + rand.setSeed(currentSeed); + } } diff --git a/src/main/java/nl/requios/effortlessbuilding/network/QuickReplaceMessage.java b/src/main/java/nl/requios/effortlessbuilding/network/BlockPlacedMessage.java similarity index 70% rename from src/main/java/nl/requios/effortlessbuilding/network/QuickReplaceMessage.java rename to src/main/java/nl/requios/effortlessbuilding/network/BlockPlacedMessage.java index 774c89d..9567234 100644 --- a/src/main/java/nl/requios/effortlessbuilding/network/QuickReplaceMessage.java +++ b/src/main/java/nl/requios/effortlessbuilding/network/BlockPlacedMessage.java @@ -4,30 +4,34 @@ import io.netty.buffer.ByteBuf; import net.minecraft.util.EnumFacing; import net.minecraft.util.math.BlockPos; import net.minecraft.util.math.RayTraceResult; +import net.minecraft.util.math.Vec3d; import net.minecraftforge.fml.common.network.simpleimpl.IMessage; import net.minecraftforge.fml.common.network.simpleimpl.IMessageHandler; import net.minecraftforge.fml.common.network.simpleimpl.MessageContext; import net.minecraftforge.fml.relauncher.Side; +import nl.requios.effortlessbuilding.BuildModifiers; import nl.requios.effortlessbuilding.EffortlessBuilding; -import nl.requios.effortlessbuilding.QuickReplace; import nl.requios.effortlessbuilding.proxy.ClientProxy; -public class QuickReplaceMessage implements IMessage { +public class BlockPlacedMessage implements IMessage { private boolean blockHit; private BlockPos blockPos; private EnumFacing sideHit; + private Vec3d hitVec; - public QuickReplaceMessage() { + public BlockPlacedMessage() { this.blockHit = false; this.blockPos = BlockPos.ORIGIN; this.sideHit = EnumFacing.UP; + this.hitVec = new Vec3d(0, 0, 0); } - public QuickReplaceMessage(RayTraceResult result) { + public BlockPlacedMessage(RayTraceResult result) { this.blockHit = result.typeOfHit == RayTraceResult.Type.BLOCK; this.blockPos = result.getBlockPos(); this.sideHit = result.sideHit; + this.hitVec = result.hitVec; } public boolean isBlockHit() { @@ -42,6 +46,10 @@ public class QuickReplaceMessage implements IMessage { return sideHit; } + public Vec3d getHitVec() { + return hitVec; + } + @Override public void toBytes(ByteBuf buf) { buf.writeBoolean(blockHit); @@ -49,6 +57,9 @@ public class QuickReplaceMessage implements IMessage { buf.writeInt(blockPos.getY()); buf.writeInt(blockPos.getZ()); buf.writeInt(sideHit.getIndex()); + buf.writeDouble(hitVec.x); + buf.writeDouble(hitVec.y); + buf.writeDouble(hitVec.z); } @Override @@ -56,33 +67,29 @@ public class QuickReplaceMessage implements IMessage { blockHit = buf.readBoolean(); blockPos = new BlockPos(buf.readInt(), buf.readInt(), buf.readInt()); sideHit = EnumFacing.getFront(buf.readInt()); + hitVec = new Vec3d(buf.readDouble(), buf.readDouble(), buf.readDouble()); } // The params of the IMessageHandler are - public static class MessageHandler implements IMessageHandler { + public static class MessageHandler implements IMessageHandler { // Do note that the default constructor is required, but implicitly defined in this case @Override - public IMessage onMessage(QuickReplaceMessage message, MessageContext ctx) { + public IMessage onMessage(BlockPlacedMessage message, MessageContext ctx) { //EffortlessBuilding.log("message received on " + ctx.side + " side"); if (ctx.side == Side.CLIENT){ //Received clientside //Send back your info - return new QuickReplaceMessage(ClientProxy.previousLookAt); - -// Minecraft.getMinecraft().addScheduledTask(() -> { -// EffortlessBuilding.packetHandler.sendToServer(new QuickReplaceMessage(Minecraft.getMinecraft().objectMouseOver)); -// }); - + return new BlockPlacedMessage(ClientProxy.previousLookAt); } else { //Received serverside EffortlessBuilding.proxy.getThreadListenerFromContext(ctx).addScheduledTask(() -> { - QuickReplace.onMessageReceived(ctx.getServerHandler().player, message); + BuildModifiers.onBlockPlacedMessage(ctx.getServerHandler().player, message); }); + // No response packet + return null; } - // No response packet - return null; } } } diff --git a/src/main/java/nl/requios/effortlessbuilding/proxy/ClientProxy.java b/src/main/java/nl/requios/effortlessbuilding/proxy/ClientProxy.java index 151235d..126fdc4 100644 --- a/src/main/java/nl/requios/effortlessbuilding/proxy/ClientProxy.java +++ b/src/main/java/nl/requios/effortlessbuilding/proxy/ClientProxy.java @@ -11,7 +11,9 @@ import net.minecraft.entity.player.EntityPlayerMP; import net.minecraft.item.Item; import net.minecraft.util.IThreadListener; import net.minecraft.util.math.RayTraceResult; +import net.minecraft.util.math.Vec3d; import net.minecraft.util.text.TextFormatting; +import net.minecraft.world.World; import net.minecraftforge.client.event.ModelRegistryEvent; import net.minecraftforge.client.model.ModelLoader; import net.minecraftforge.fml.client.registry.ClientRegistry; @@ -127,6 +129,8 @@ public class ClientProxy implements IProxy { public static void onClientTick(TickEvent.ClientTickEvent event) { if (event.phase != TickEvent.Phase.START) return; + //TODO increase range using getLookingAt + // Would also need other trigger than onBlockPlaced RayTraceResult objectMouseOver = Minecraft.getMinecraft().objectMouseOver; //Checking for null is necessary! Even in vanilla when looking down ladders it is occasionally null (instead of Type MISS) if (objectMouseOver == null) return; @@ -148,7 +152,14 @@ public class ClientProxy implements IProxy { } } } + } - + private static float rayTraceRange = 32f; + public static RayTraceResult getLookingAt(EntityPlayer player) { + World world = player.world; + Vec3d look = player.getLookVec(); + Vec3d start = new Vec3d(player.posX, player.posY + player.getEyeHeight(), player.posZ); + Vec3d end = new Vec3d(player.posX + look.x * rayTraceRange, player.posY + player.getEyeHeight() + look.y * rayTraceRange, player.posZ + look.z * rayTraceRange); + return world.rayTraceBlocks(start, end, false, false, false); } } diff --git a/src/main/java/nl/requios/effortlessbuilding/proxy/ServerProxy.java b/src/main/java/nl/requios/effortlessbuilding/proxy/ServerProxy.java index 36c9edb..42ff4ae 100644 --- a/src/main/java/nl/requios/effortlessbuilding/proxy/ServerProxy.java +++ b/src/main/java/nl/requios/effortlessbuilding/proxy/ServerProxy.java @@ -1,6 +1,5 @@ package nl.requios.effortlessbuilding.proxy; -import net.minecraft.client.entity.AbstractClientPlayer; import net.minecraft.entity.player.EntityPlayer; import net.minecraft.entity.player.EntityPlayerMP; import net.minecraft.util.IThreadListener; @@ -9,10 +8,6 @@ import net.minecraftforge.fml.common.event.FMLPostInitializationEvent; import net.minecraftforge.fml.common.event.FMLPreInitializationEvent; import net.minecraftforge.fml.common.event.FMLServerStartingEvent; import net.minecraftforge.fml.common.network.simpleimpl.MessageContext; -import net.minecraftforge.fml.relauncher.Side; -import nl.requios.effortlessbuilding.EffortlessBuilding; -import nl.requios.effortlessbuilding.network.BuildSettingsMessage; -import nl.requios.effortlessbuilding.network.QuickReplaceMessage; public class ServerProxy implements IProxy {