Fixed having to click after breaking.

Outlines now adhere to bounding boxes.
Fixed not being able to place when holding sneak.
Repeated placing when holding is now possible in NormalPlus mode.
Repeated breaking when holding now only happens in NormalPlus mode.
Repeated placing and breaking is now possible when not moving the mouse.
Fixed not being able to break when clicking in air.
Sounds no longer depend on distance to player, all are in category BLOCKS, and breaking sound is played when appropriate when previewing.
This commit is contained in:
Christian Knaapen
2019-02-22 16:35:19 +01:00
parent 5328ae342d
commit 9a3fef218e
9 changed files with 207 additions and 96 deletions

View File

@@ -11,7 +11,7 @@ apply plugin: 'net.minecraftforge.gradle.forge'
//Only edit below this line, the above code adds and enables the necessary things for Forge to be setup. //Only edit below this line, the above code adds and enables the necessary things for Forge to be setup.
version = "1.12.2-2.1" version = "1.12.2-2.2"
group = "nl.requios.effortlessbuilding" // http://maven.apache.org/guides/mini/guide-naming-conventions.html group = "nl.requios.effortlessbuilding" // http://maven.apache.org/guides/mini/guide-naming-conventions.html
archivesBaseName = "effortlessbuilding" archivesBaseName = "effortlessbuilding"

View File

@@ -39,7 +39,7 @@ public class EffortlessBuilding
{ {
public static final String MODID = "effortlessbuilding"; public static final String MODID = "effortlessbuilding";
public static final String NAME = "Effortless Building"; public static final String NAME = "Effortless Building";
public static final String VERSION = "1.12.2-2.1"; public static final String VERSION = "1.12.2-2.2";
@Mod.Instance(EffortlessBuilding.MODID) @Mod.Instance(EffortlessBuilding.MODID)
public static EffortlessBuilding instance; public static EffortlessBuilding instance;

View File

@@ -88,7 +88,7 @@ public class EventHandler
event.setCanceled(true); event.setCanceled(true);
} else { } else {
//Normal mode, let vanilla handle block placing //Normal mode, let vanilla handle block placing
//But modifiers should still work //But modifiers and QuickReplace should still work
//Send message to client, which sends message back with raytrace info //Send message to client, which sends message back with raytrace info
EffortlessBuilding.packetHandler.sendTo(new RequestLookAtMessage(), (EntityPlayerMP) player); EffortlessBuilding.packetHandler.sendTo(new RequestLookAtMessage(), (EntityPlayerMP) player);
@@ -104,8 +104,8 @@ public class EventHandler
event.setCanceled(true); event.setCanceled(true);
} else { } else {
//Normal mode, let vanilla handle block breaking //Normal mode, let vanilla handle block breaking
//But modifiers should still work //But modifiers and QuickReplace should still work
BuildModes.onBlockBroken(event); BuildModes.onBlockBroken(event.getPlayer(), event.getPos());
} }
} }

View File

@@ -1,5 +1,6 @@
package nl.requios.effortlessbuilding.buildmode; package nl.requios.effortlessbuilding.buildmode;
import net.minecraft.block.state.IBlockState;
import net.minecraft.entity.player.EntityPlayer; import net.minecraft.entity.player.EntityPlayer;
import net.minecraft.util.EnumFacing; import net.minecraft.util.EnumFacing;
import net.minecraft.util.EnumHand; import net.minecraft.util.EnumHand;
@@ -10,6 +11,7 @@ import nl.requios.effortlessbuilding.EffortlessBuilding;
import nl.requios.effortlessbuilding.buildmodifier.*; import nl.requios.effortlessbuilding.buildmodifier.*;
import nl.requios.effortlessbuilding.compatibility.CompatHelper; import nl.requios.effortlessbuilding.compatibility.CompatHelper;
import nl.requios.effortlessbuilding.helper.ReachHelper; import nl.requios.effortlessbuilding.helper.ReachHelper;
import nl.requios.effortlessbuilding.helper.SurvivalHelper;
import nl.requios.effortlessbuilding.network.BlockBrokenMessage; import nl.requios.effortlessbuilding.network.BlockBrokenMessage;
import nl.requios.effortlessbuilding.network.BlockPlacedMessage; import nl.requios.effortlessbuilding.network.BlockPlacedMessage;
@@ -61,7 +63,6 @@ public class BuildModes {
ModifierSettingsManager.ModifierSettings modifierSettings = ModifierSettingsManager.getModifierSettings(player); ModifierSettingsManager.ModifierSettings modifierSettings = ModifierSettingsManager.getModifierSettings(player);
ModeSettingsManager.ModeSettings modeSettings = ModeSettingsManager.getModeSettings(player); ModeSettingsManager.ModeSettings modeSettings = ModeSettingsManager.getModeSettings(player);
BuildModeEnum buildMode = modeSettings.getBuildMode(); BuildModeEnum buildMode = modeSettings.getBuildMode();
int maxReach = ReachHelper.getMaxReach(player);
BlockPos startPos = null; BlockPos startPos = null;
@@ -70,7 +71,8 @@ public class BuildModes {
//Offset in direction of sidehit if not quickreplace and not replaceable //Offset in direction of sidehit if not quickreplace and not replaceable
boolean replaceable = player.world.getBlockState(startPos).getBlock().isReplaceable(player.world, startPos); boolean replaceable = player.world.getBlockState(startPos).getBlock().isReplaceable(player.world, startPos);
if (!modifierSettings.doQuickReplace() && !replaceable) { boolean becomesDoubleSlab = SurvivalHelper.doesBecomeDoubleSlab(player, startPos, message.getSideHit());
if (!modifierSettings.doQuickReplace() && !replaceable && !becomesDoubleSlab) {
startPos = startPos.offset(message.getSideHit()); startPos = startPos.offset(message.getSideHit());
} }
@@ -80,6 +82,7 @@ public class BuildModes {
} }
//Check if player reach does not exceed startpos //Check if player reach does not exceed startpos
int maxReach = ReachHelper.getMaxReach(player);
if (player.getPosition().distanceSq(startPos) > maxReach * maxReach) { if (player.getPosition().distanceSq(startPos) > maxReach * maxReach) {
EffortlessBuilding.log(player, "Placement exceeds your reach."); EffortlessBuilding.log(player, "Placement exceeds your reach.");
return; return;
@@ -117,19 +120,16 @@ public class BuildModes {
//Use a network message to break blocks in the distance using clientside mouse input //Use a network message to break blocks in the distance using clientside mouse input
public static void onBlockBrokenMessage(EntityPlayer player, BlockBrokenMessage message) { public static void onBlockBrokenMessage(EntityPlayer player, BlockBrokenMessage message) {
BlockPos blockPos = message.getBlockPos();
if (ReachHelper.canBreakFar(player) && message.isBlockHit() && if (ReachHelper.canBreakFar(player) &&
!CompatHelper.chiselsAndBitsProxy.isHoldingChiselTool(EnumHand.MAIN_HAND)) { !CompatHelper.chiselsAndBitsProxy.isHoldingChiselTool(EnumHand.MAIN_HAND)) {
BlockEvent.BreakEvent event = new BlockEvent.BreakEvent(player.world, blockPos, player.world.getBlockState(blockPos), player); BlockPos startPos = message.isBlockHit() ? message.getBlockPos() : null;
onBlockBroken(event); onBlockBroken(player, startPos);
} }
} }
public static void onBlockBroken(BlockEvent.BreakEvent event) { public static void onBlockBroken(EntityPlayer player, BlockPos startPos) {
EntityPlayer player = event.getPlayer();
BlockPos pos = event.getPos();
//Check if not in the middle of placing //Check if not in the middle of placing
Dictionary<EntityPlayer, Boolean> currentlyBreaking = player.world.isRemote ? currentlyBreakingClient : currentlyBreakingServer; Dictionary<EntityPlayer, Boolean> currentlyBreaking = player.world.isRemote ? currentlyBreakingClient : currentlyBreakingServer;
@@ -139,18 +139,28 @@ public class BuildModes {
return; return;
} }
//get coordinates //If first click
if (currentlyBreaking.get(player) == null) {
//If startpos is null, dont do anything
if (startPos == null) return;
}
//Get coordinates
ModeSettingsManager.ModeSettings modeSettings = ModeSettingsManager.getModeSettings(player); ModeSettingsManager.ModeSettings modeSettings = ModeSettingsManager.getModeSettings(player);
BuildModeEnum buildMode = modeSettings.getBuildMode(); BuildModeEnum buildMode = modeSettings.getBuildMode();
List<BlockPos> coordinates = buildMode.instance.onRightClick(player, pos, EnumFacing.UP, Vec3d.ZERO, true); List<BlockPos> coordinates = buildMode.instance.onRightClick(player, startPos, EnumFacing.UP, Vec3d.ZERO, true);
if (coordinates.isEmpty()) { if (coordinates.isEmpty()) {
currentlyBreaking.put(player, true); currentlyBreaking.put(player, true);
return; return;
} }
//let buildmodifiers break blocks //Let buildmodifiers break blocks
BuildModifiers.onBlockBroken(player, coordinates); BuildModifiers.onBlockBroken(player, coordinates);
//Only works when finishing a buildmode is equal to breaking some blocks
//No intermediate blocks allowed
currentlyBreaking.remove(player);
} }
public static List<BlockPos> findCoordinates(EntityPlayer player, BlockPos startPos, boolean skipRaytrace) { public static List<BlockPos> findCoordinates(EntityPlayer player, BlockPos startPos, boolean skipRaytrace) {

View File

@@ -35,11 +35,11 @@ public class CompatHelper {
// /dank/null, or plain old blocks. // /dank/null, or plain old blocks.
public static boolean isItemBlockProxy(ItemStack stack) { public static boolean isItemBlockProxy(ItemStack stack) {
Item item = stack.getItem(); Item item = stack.getItem();
if(item instanceof ItemBlock) if (item instanceof ItemBlock)
return true; return true;
if((item instanceof ItemRandomizerBag)) if ((item instanceof ItemRandomizerBag))
return true; return true;
if(item == dankNullItem) if (item == dankNullItem)
return true; return true;
return false; return false;
} }
@@ -48,14 +48,20 @@ public class CompatHelper {
// pointed to by nbt integer selectedIndex. // pointed to by nbt integer selectedIndex.
public static ItemStack getItemBlockFromStack(ItemStack stack) { public static ItemStack getItemBlockFromStack(ItemStack stack) {
Item item = stack.getItem(); Item item = stack.getItem();
if(item instanceof ItemRandomizerBag) {
if (item instanceof ItemBlock)
return stack;
if (item instanceof ItemRandomizerBag)
return ItemRandomizerBag.pickRandomStack(ItemRandomizerBag.getBagInventory(stack)); return ItemRandomizerBag.pickRandomStack(ItemRandomizerBag.getBagInventory(stack));
} else if(item == dankNullItem) {
if(item == dankNullItem) {
int index = 0; int index = 0;
if(stack.hasTagCompound() && stack.getTagCompound().hasKey("selectedIndex")) if(stack.hasTagCompound() && stack.getTagCompound().hasKey("selectedIndex"))
index = stack.getTagCompound().getInteger("selectedIndex"); index = stack.getTagCompound().getInteger("selectedIndex");
return stack.getCapability(CapabilityItemHandler.ITEM_HANDLER_CAPABILITY, null).getStackInSlot(index); return stack.getCapability(CapabilityItemHandler.ITEM_HANDLER_CAPABILITY, null).getStackInSlot(index);
} }
return ItemStack.EMPTY; return ItemStack.EMPTY;
} }

View File

@@ -2,8 +2,10 @@ package nl.requios.effortlessbuilding.helper;
import net.minecraft.block.Block; import net.minecraft.block.Block;
import net.minecraft.block.BlockLiquid; import net.minecraft.block.BlockLiquid;
import net.minecraft.block.BlockSlab;
import net.minecraft.block.SoundType; import net.minecraft.block.SoundType;
import net.minecraft.block.material.Material; import net.minecraft.block.material.Material;
import net.minecraft.block.properties.IProperty;
import net.minecraft.block.state.IBlockState; import net.minecraft.block.state.IBlockState;
import net.minecraft.enchantment.EnchantmentHelper; import net.minecraft.enchantment.EnchantmentHelper;
import net.minecraft.entity.Entity; import net.minecraft.entity.Entity;
@@ -12,15 +14,20 @@ import net.minecraft.init.Blocks;
import net.minecraft.init.Enchantments; import net.minecraft.init.Enchantments;
import net.minecraft.item.Item; import net.minecraft.item.Item;
import net.minecraft.item.ItemBlock; import net.minecraft.item.ItemBlock;
import net.minecraft.item.ItemSlab;
import net.minecraft.item.ItemStack; import net.minecraft.item.ItemStack;
import net.minecraft.stats.StatList; import net.minecraft.stats.StatList;
import net.minecraft.util.EnumActionResult;
import net.minecraft.util.EnumFacing; import net.minecraft.util.EnumFacing;
import net.minecraft.util.EnumHand;
import net.minecraft.util.SoundCategory; import net.minecraft.util.SoundCategory;
import net.minecraft.util.math.AxisAlignedBB; import net.minecraft.util.math.AxisAlignedBB;
import net.minecraft.util.math.BlockPos; import net.minecraft.util.math.BlockPos;
import net.minecraft.util.math.Vec3d; import net.minecraft.util.math.Vec3d;
import net.minecraft.world.IBlockAccess; import net.minecraft.world.IBlockAccess;
import net.minecraft.world.World; import net.minecraft.world.World;
import net.minecraftforge.common.ForgeHooks;
import net.minecraftforge.event.entity.player.PlayerInteractEvent;
import net.minecraftforge.items.ItemHandlerHelper; import net.minecraftforge.items.ItemHandlerHelper;
import nl.requios.effortlessbuilding.EffortlessBuilding; import nl.requios.effortlessbuilding.EffortlessBuilding;
import nl.requios.effortlessbuilding.buildmodifier.ModifierSettingsManager; import nl.requios.effortlessbuilding.buildmodifier.ModifierSettingsManager;
@@ -43,13 +50,15 @@ public class SurvivalHelper {
//Randomizer bag, other proxy item synergy //Randomizer bag, other proxy item synergy
//Preliminary compatibility code for other items that hold blocks //Preliminary compatibility code for other items that hold blocks
if(CompatHelper.isItemBlockProxy(itemstack)) if (CompatHelper.isItemBlockProxy(itemstack))
itemstack = CompatHelper.getItemBlockByState(itemstack, blockState); itemstack = CompatHelper.getItemBlockByState(itemstack, blockState);
if(!(itemstack.getItem() instanceof ItemBlock)) if (!(itemstack.getItem() instanceof ItemBlock))
return false; return false;
Block block = ((ItemBlock) itemstack.getItem()).getBlock(); Block block = ((ItemBlock) itemstack.getItem()).getBlock();
//More manual with ItemBlock#placeBlockAt
if (canPlace(world, player, pos, blockState, itemstack, skipCollisionCheck, facing.getOpposite())) { if (canPlace(world, player, pos, blockState, itemstack, skipCollisionCheck, facing.getOpposite())) {
//Drop existing block //Drop existing block
dropBlock(world, player, pos); dropBlock(world, player, pos);
@@ -71,6 +80,30 @@ public class SurvivalHelper {
return true; return true;
} }
return false; return false;
//Using ItemBlock#onItemUse
// EnumActionResult result;
// PlayerInteractEvent.RightClickBlock event = ForgeHooks.onRightClickBlock(player, EnumHand.MAIN_HAND, pos, facing, net.minecraftforge.common.ForgeHooks.rayTraceEyeHitVec(player, ReachHelper.getPlacementReach(player)));
// if (player.isCreative())
// {
// int i = itemstack.getMetadata();
// int j = itemstack.getCount();
// if (event.getUseItem() != net.minecraftforge.fml.common.eventhandler.Event.Result.DENY) {
// EnumActionResult enumactionresult = itemstack.getItem().onItemUse(player, world, pos, EnumHand.MAIN_HAND, facing, (float) hitVec.x, (float) hitVec.y, (float) hitVec.z);
// itemstack.setItemDamage(i);
// itemstack.setCount(j);
// return enumactionresult == EnumActionResult.SUCCESS;
// } else return false;
// }
// else
// {
// ItemStack copyForUse = itemstack.copy();
// if (event.getUseItem() != net.minecraftforge.fml.common.eventhandler.Event.Result.DENY)
// result = itemstack.getItem().onItemUse(player, world, pos, EnumHand.MAIN_HAND, facing, (float) hitVec.x, (float) hitVec.y, (float) hitVec.z);
// if (itemstack.isEmpty()) net.minecraftforge.event.ForgeEventFactory.onPlayerDestroyItem(player, copyForUse, EnumHand.MAIN_HAND);
// return false;
// }
} }
//Used for all breaking of blocks in this mod. //Used for all breaking of blocks in this mod.
@@ -202,6 +235,11 @@ public class SurvivalHelper {
return false; return false;
} }
//Check if double slab
if (placer != null && doesBecomeDoubleSlab(((EntityPlayer) placer), pos, sidePlacedOn)) {
return true;
}
//Check if same block //Check if same block
//Necessary otherwise extra items will be dropped //Necessary otherwise extra items will be dropped
if (iblockstate1 == newBlockState) { if (iblockstate1 == newBlockState) {
@@ -266,4 +304,29 @@ public class SurvivalHelper {
return toolLevel >= block.getHarvestLevel(state); return toolLevel >= block.getHarvestLevel(state);
} }
public static boolean doesBecomeDoubleSlab(EntityPlayer player, BlockPos pos, EnumFacing facing) {
IBlockState placedBlockState = player.world.getBlockState(pos);
ItemStack itemstack = player.getHeldItem(EnumHand.MAIN_HAND);
if (CompatHelper.isItemBlockProxy(itemstack))
itemstack = CompatHelper.getItemBlockFromStack(itemstack);
if (itemstack.isEmpty() || !(itemstack.getItem() instanceof ItemSlab)) return false;
BlockSlab heldSlab = (BlockSlab) ((ItemSlab) itemstack.getItem()).getBlock();
if (placedBlockState.getBlock() == heldSlab) {
IProperty<?> variantProperty = heldSlab.getVariantProperty();
Comparable<?> placedVariant = placedBlockState.getValue(variantProperty);
BlockSlab.EnumBlockHalf placedHalf = placedBlockState.getValue(BlockSlab.HALF);
Comparable<?> heldVariant = heldSlab.getTypeForItem(itemstack);
if ((facing == EnumFacing.UP && placedHalf == BlockSlab.EnumBlockHalf.BOTTOM || facing == EnumFacing.DOWN && placedHalf == BlockSlab.EnumBlockHalf.TOP) && placedVariant == heldVariant)
{
return true;
}
}
return false;
}
} }

View File

@@ -13,6 +13,7 @@ import net.minecraft.client.settings.KeyBinding;
import net.minecraft.entity.player.EntityPlayer; import net.minecraft.entity.player.EntityPlayer;
import net.minecraft.entity.player.EntityPlayerMP; import net.minecraft.entity.player.EntityPlayerMP;
import net.minecraft.item.Item; import net.minecraft.item.Item;
import net.minecraft.item.ItemBlock;
import net.minecraft.item.ItemStack; import net.minecraft.item.ItemStack;
import net.minecraft.util.EnumHand; import net.minecraft.util.EnumHand;
import net.minecraft.util.IThreadListener; import net.minecraft.util.IThreadListener;
@@ -52,6 +53,7 @@ import nl.requios.effortlessbuilding.render.ShaderHandler;
import nl.requios.effortlessbuilding.network.*; import nl.requios.effortlessbuilding.network.*;
import org.lwjgl.input.Keyboard; import org.lwjgl.input.Keyboard;
import javax.annotation.Nullable;
import java.util.HashMap; import java.util.HashMap;
@Mod.EventBusSubscriber(Side.CLIENT) @Mod.EventBusSubscriber(Side.CLIENT)
@@ -59,6 +61,7 @@ public class ClientProxy implements IProxy {
public static KeyBinding[] keyBindings; public static KeyBinding[] keyBindings;
public static RayTraceResult previousLookAt; public static RayTraceResult previousLookAt;
public static RayTraceResult currentLookAt; public static RayTraceResult currentLookAt;
private static int placeCooldown = 0;
private static int breakCooldown = 0; private static int breakCooldown = 0;
public static int ticksInGame = 0; public static int ticksInGame = 0;
@@ -143,63 +146,111 @@ public class ClientProxy implements IProxy {
} }
@SubscribeEvent @SubscribeEvent
public static void onMouseInput(InputEvent.MouseInputEvent event) { public static void onClientTick(TickEvent.ClientTickEvent event) {
if (event.phase == TickEvent.Phase.START) {
onMouseInput();
//Update previousLookAt
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;
if (currentLookAt == null) {
currentLookAt = objectMouseOver;
previousLookAt = objectMouseOver;
return;
}
if (objectMouseOver.typeOfHit == RayTraceResult.Type.BLOCK) {
if (currentLookAt.typeOfHit != RayTraceResult.Type.BLOCK) {
currentLookAt = objectMouseOver;
previousLookAt = objectMouseOver;
} else {
if (currentLookAt.getBlockPos() != objectMouseOver.getBlockPos()) {
previousLookAt = currentLookAt;
currentLookAt = objectMouseOver;
}
}
}
} else if (event.phase == TickEvent.Phase.END){
GuiScreen gui = Minecraft.getMinecraft().currentScreen;
if(gui == null || !gui.doesGuiPauseGame()) {
ticksInGame++;
}
}
}
private static void onMouseInput() {
Minecraft mc = Minecraft.getMinecraft(); Minecraft mc = Minecraft.getMinecraft();
EntityPlayerSP player = mc.player; EntityPlayerSP player = mc.player;
if (player == null) return;
BuildModes.BuildModeEnum buildMode = ModeSettingsManager.getModeSettings(player).getBuildMode();
if (Minecraft.getMinecraft().currentScreen != null || if (Minecraft.getMinecraft().currentScreen != null ||
ModeSettingsManager.getModeSettings(player).getBuildMode() == BuildModes.BuildModeEnum.Normal || buildMode == BuildModes.BuildModeEnum.Normal ||
RadialMenu.instance.isVisible()) { RadialMenu.instance.isVisible()) {
return; return;
} }
if (mc.gameSettings.keyBindUseItem.isPressed()) { if (mc.gameSettings.keyBindUseItem.isKeyDown()) {
//KeyBinding.setKeyBindState(mc.gameSettings.keyBindUseItem.getKeyCode(), false); //KeyBinding.setKeyBindState(mc.gameSettings.keyBindUseItem.getKeyCode(), false);
ItemStack currentItemStack = player.getHeldItem(EnumHand.MAIN_HAND); if (placeCooldown <= 0) {
if (CompatHelper.isItemBlockProxy(currentItemStack) && !player.isSneaking()) { placeCooldown = 4;
//find position in distance ItemStack currentItemStack = player.getHeldItem(EnumHand.MAIN_HAND);
RayTraceResult lookingAt = getLookingAt(player); if (currentItemStack.getItem() instanceof ItemBlock ||
BuildModes.onBlockPlacedMessage(player, new BlockPlacedMessage(lookingAt)); (CompatHelper.isItemBlockProxy(currentItemStack) && !player.isSneaking())) {
EffortlessBuilding.packetHandler.sendToServer(new BlockPlacedMessage(lookingAt));
//play sound if further than normal //find position in distance
if (lookingAt != null && lookingAt.typeOfHit == RayTraceResult.Type.BLOCK && RayTraceResult lookingAt = getLookingAt(player);
(lookingAt.hitVec.subtract(player.getPositionEyes(1f))).lengthSquared() > 25f) { BuildModes.onBlockPlacedMessage(player, lookingAt == null ? new BlockPlacedMessage() : new BlockPlacedMessage(lookingAt));
EffortlessBuilding.packetHandler.sendToServer(lookingAt == null ? new BlockPlacedMessage() : new BlockPlacedMessage(lookingAt));
BlockPos blockPos = lookingAt.getBlockPos(); //play sound if further than normal
IBlockState state = player.world.getBlockState(blockPos); if (lookingAt != null && lookingAt.typeOfHit == RayTraceResult.Type.BLOCK &&
SoundType soundtype = state.getBlock().getSoundType(state, player.world, blockPos, player); (lookingAt.hitVec.subtract(player.getPositionEyes(1f))).lengthSquared() > 25f) {
player.world.playSound(player, blockPos, soundtype.getPlaceSound(), SoundCategory.BLOCKS,
(soundtype.getVolume() + 1.0F) / 2.0F, soundtype.getPitch() * 0.8F); IBlockState state = ((ItemBlock) currentItemStack.getItem()).getBlock().getDefaultState();
player.swingArm(EnumHand.MAIN_HAND); BlockPos blockPos = lookingAt.getBlockPos();
SoundType soundType = state.getBlock().getSoundType(state, player.world, blockPos, player);
player.world.playSound(player, player.getPosition(), soundType.getPlaceSound(), SoundCategory.BLOCKS,
0.4f, soundType.getPitch() * 1f);
player.swingArm(EnumHand.MAIN_HAND);
}
} }
} else if (buildMode == BuildModes.BuildModeEnum.NormalPlus) {
placeCooldown--;
} }
} else {
placeCooldown = 0;
} }
if (mc.gameSettings.keyBindAttack.isKeyDown()) { if (mc.gameSettings.keyBindAttack.isKeyDown()) {
//KeyBinding.setKeyBindState(mc.gameSettings.keyBindAttack.getKeyCode(), false);
//Break block in distance in creative (or survival if enabled in config) //Break block in distance in creative (or survival if enabled in config)
if (ReachHelper.canBreakFar(player)) { if (ReachHelper.canBreakFar(player)) {
if (breakCooldown <= 0) { if (breakCooldown <= 0) {
breakCooldown = 6; breakCooldown = 4;
RayTraceResult lookingAt = getLookingAt(player); RayTraceResult lookingAt = getLookingAt(player);
BuildModes.onBlockBrokenMessage(player, new BlockBrokenMessage(lookingAt)); BuildModes.onBlockBrokenMessage(player, lookingAt == null ? new BlockBrokenMessage() : new BlockBrokenMessage(lookingAt));
EffortlessBuilding.packetHandler.sendToServer(new BlockBrokenMessage(lookingAt)); EffortlessBuilding.packetHandler.sendToServer(lookingAt == null ? new BlockBrokenMessage() : new BlockBrokenMessage(lookingAt));
//play sound if further than normal
if (lookingAt != null && lookingAt.typeOfHit == RayTraceResult.Type.BLOCK &&
(lookingAt.hitVec.subtract(player.getPositionEyes(1f))).lengthSquared() > 25f) {
//play sound
if (lookingAt != null && lookingAt.typeOfHit == RayTraceResult.Type.BLOCK) {
BlockPos blockPos = lookingAt.getBlockPos(); BlockPos blockPos = lookingAt.getBlockPos();
IBlockState state = player.world.getBlockState(blockPos); IBlockState state = player.world.getBlockState(blockPos);
SoundType soundtype = state.getBlock().getSoundType(state, player.world, blockPos, player); SoundType soundtype = state.getBlock().getSoundType(state, player.world, blockPos, player);
player.world.playSound(player, blockPos, soundtype.getBreakSound(), SoundCategory.BLOCKS, player.world.playSound(player, player.getPosition(), soundtype.getBreakSound(), SoundCategory.BLOCKS,
(soundtype.getVolume() + 1.0F) / 2.0F, soundtype.getPitch() * 0.8F); 0.4f, soundtype.getPitch() * 1f);
player.swingArm(EnumHand.MAIN_HAND); player.swingArm(EnumHand.MAIN_HAND);
} }
} else { } else if (buildMode == BuildModes.BuildModeEnum.NormalPlus) {
breakCooldown--; breakCooldown--;
} }
} }
@@ -209,7 +260,6 @@ public class ClientProxy implements IProxy {
} else { } else {
breakCooldown = 0; breakCooldown = 0;
} }
event.setResult(Event.Result.ALLOW);
} }
@SubscribeEvent(priority = EventPriority.NORMAL, receiveCanceled = true) @SubscribeEvent(priority = EventPriority.NORMAL, receiveCanceled = true)
@@ -257,39 +307,6 @@ public class ClientProxy implements IProxy {
} }
@SubscribeEvent
public static void onClientTick(TickEvent.ClientTickEvent event) {
if (event.phase == TickEvent.Phase.START) {
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;
if (currentLookAt == null) {
currentLookAt = objectMouseOver;
previousLookAt = objectMouseOver;
return;
}
if (objectMouseOver.typeOfHit == RayTraceResult.Type.BLOCK) {
if (currentLookAt.typeOfHit != RayTraceResult.Type.BLOCK) {
currentLookAt = objectMouseOver;
previousLookAt = objectMouseOver;
} else {
if (currentLookAt.getBlockPos() != objectMouseOver.getBlockPos()) {
previousLookAt = currentLookAt;
currentLookAt = objectMouseOver;
}
}
}
} else if (event.phase == TickEvent.Phase.END){
GuiScreen gui = Minecraft.getMinecraft().currentScreen;
if(gui == null || !gui.doesGuiPauseGame()) {
ticksInGame++;
}
}
}
@SubscribeEvent @SubscribeEvent
public static void onGuiOpen(GuiOpenEvent event) { public static void onGuiOpen(GuiOpenEvent event) {
EntityPlayer player = Minecraft.getMinecraft().player; EntityPlayer player = Minecraft.getMinecraft().player;
@@ -298,6 +315,7 @@ public class ClientProxy implements IProxy {
} }
} }
@Nullable
public static RayTraceResult getLookingAt(EntityPlayer player) { public static RayTraceResult getLookingAt(EntityPlayer player) {
// World world = player.world; // World world = player.world;

View File

@@ -1,5 +1,6 @@
package nl.requios.effortlessbuilding.render; package nl.requios.effortlessbuilding.render;
import net.minecraft.block.SoundType;
import net.minecraft.block.state.IBlockState; import net.minecraft.block.state.IBlockState;
import net.minecraft.client.Minecraft; import net.minecraft.client.Minecraft;
import net.minecraft.client.entity.EntityPlayerSP; import net.minecraft.client.entity.EntityPlayerSP;
@@ -11,10 +12,9 @@ import net.minecraft.entity.player.EntityPlayer;
import net.minecraft.item.ItemStack; import net.minecraft.item.ItemStack;
import net.minecraft.util.EnumFacing; import net.minecraft.util.EnumFacing;
import net.minecraft.util.ResourceLocation; import net.minecraft.util.ResourceLocation;
import net.minecraft.util.math.BlockPos; import net.minecraft.util.SoundCategory;
import net.minecraft.util.math.MathHelper; import net.minecraft.util.SoundEvent;
import net.minecraft.util.math.RayTraceResult; import net.minecraft.util.math.*;
import net.minecraft.util.math.Vec3d;
import net.minecraftforge.fml.relauncher.Side; import net.minecraftforge.fml.relauncher.Side;
import net.minecraftforge.fml.relauncher.SideOnly; import net.minecraftforge.fml.relauncher.SideOnly;
import nl.requios.effortlessbuilding.BuildConfig; import nl.requios.effortlessbuilding.BuildConfig;
@@ -114,7 +114,8 @@ public class BlockPreviewRenderer {
//Check if tool (or none) in hand //Check if tool (or none) in hand
boolean replaceable = player.world.getBlockState(startPos).getBlock().isReplaceable(player.world, startPos); boolean replaceable = player.world.getBlockState(startPos).getBlock().isReplaceable(player.world, startPos);
if (!modifierSettings.doQuickReplace() && !toolInHand && !replaceable) { boolean becomesDoubleSlab = SurvivalHelper.doesBecomeDoubleSlab(player, startPos, lookingAt.sideHit);
if (!modifierSettings.doQuickReplace() && !toolInHand && !replaceable && !becomesDoubleSlab) {
startPos = startPos.offset(lookingAt.sideHit); startPos = startPos.offset(lookingAt.sideHit);
} }
@@ -196,9 +197,11 @@ public class BlockPreviewRenderer {
//and play sound (max once every tick) //and play sound (max once every tick)
if (startCoordinates.size() > 1 && blockStates.size() > 1 && soundTime < ClientProxy.ticksInGame - 0) { if (startCoordinates.size() > 1 && blockStates.size() > 1 && soundTime < ClientProxy.ticksInGame - 0) {
soundTime = ClientProxy.ticksInGame; soundTime = ClientProxy.ticksInGame;
//player.playSound(EffortlessBuilding.SOUND_BUILD_CLICK, 0.2f, 1f);
player.playSound(blockStates.get(0).getBlock().getSoundType(blockStates.get(0), player.world, SoundType soundType = blockStates.get(0).getBlock().getSoundType(blockStates.get(0), player.world,
newCoordinates.get(0), player).getPlaceSound(), 0.3f, 1f); newCoordinates.get(0), player);
player.world.playSound(player, player.getPosition(), breaking ? soundType.getBreakSound() : soundType.getPlaceSound(),
SoundCategory.BLOCKS, 0.3f, 0.8f);
} }
} }
@@ -220,7 +223,8 @@ public class BlockPreviewRenderer {
if (breaking) color = new Vec3d(1f, 0f, 0f); if (breaking) color = new Vec3d(1f, 0f, 0f);
for (int i = newCoordinates.size() - 1; i >= 0; i--) { for (int i = newCoordinates.size() - 1; i >= 0; i--) {
RenderHandler.renderBlockOutline(newCoordinates.get(i), color); AxisAlignedBB boundingBox = blockStates.get(i).getBoundingBox(player.world, newCoordinates.get(i));
RenderHandler.renderBlockOutline(newCoordinates.get(i), boundingBox, color);
} }
RenderHandler.endLines(); RenderHandler.endLines();
@@ -244,7 +248,8 @@ public class BlockPreviewRenderer {
IBlockState blockState = player.world.getBlockState(coordinate); IBlockState blockState = player.world.getBlockState(coordinate);
if (!blockState.getBlock().isAir(blockState, player.world, coordinate)) { if (!blockState.getBlock().isAir(blockState, player.world, coordinate)) {
if (SurvivalHelper.canBreak(player.world, player, coordinate) || i == 0) { if (SurvivalHelper.canBreak(player.world, player, coordinate) || i == 0) {
RenderHandler.renderBlockOutline(coordinate, new Vec3d(0f, 0f, 0f)); AxisAlignedBB boundingBox = blockState.getBoundingBox(player.world, coordinate);
RenderHandler.renderBlockOutline(coordinate, boundingBox, new Vec3d(0f, 0f, 0f));
} }
} }
} }
@@ -278,7 +283,7 @@ public class BlockPreviewRenderer {
//Check if can place //Check if can place
//If check is turned off, check if blockstate is the same (for dissolve effect) //If check is turned off, check if blockstate is the same (for dissolve effect)
if ((!checkCanPlace /*&& player.world.getBlockState(blockPos) == blockState*/) || if ((!checkCanPlace /*&& player.world.getBlockState(blockPos) == blockState*/) || //TODO enable
SurvivalHelper.canPlace(player.world, player, blockPos, blockState, itemstack, modifierSettings.doQuickReplace(), EnumFacing.UP)) { SurvivalHelper.canPlace(player.world, player, blockPos, blockState, itemstack, modifierSettings.doQuickReplace(), EnumFacing.UP)) {
ShaderHandler.useShader(ShaderHandler.dissolve, generateShaderCallback(dissolve, ShaderHandler.useShader(ShaderHandler.dissolve, generateShaderCallback(dissolve,

View File

@@ -219,6 +219,15 @@ public class RenderHandler implements IWorldEventListener {
RenderGlobal.drawSelectionBoundingBox(aabb, (float) color.x, (float) color.y, (float) color.z, 0.4f); RenderGlobal.drawSelectionBoundingBox(aabb, (float) color.x, (float) color.y, (float) color.z, 0.4f);
} }
//Renders outline with given bounding box
protected static void renderBlockOutline(BlockPos pos, AxisAlignedBB boundingBox, Vec3d color) {
GL11.glLineWidth(2);
AxisAlignedBB aabb = boundingBox.offset(pos).grow(0.0020000000949949026);
RenderGlobal.drawSelectionBoundingBox(aabb, (float) color.x, (float) color.y, (float) color.z, 0.4f);
}
//IWORLDEVENTLISTENER IMPLEMENTATION //IWORLDEVENTLISTENER IMPLEMENTATION