From 3348400268fc281f6cb600b6390c32683a051c63 Mon Sep 17 00:00:00 2001
From: asofold <asofold@web.de>
Date: Sun, 16 Sep 2012 23:40:19 +0200
Subject: [PATCH] Adjustments to fastbreak + debug output.

---
 .../checks/blockbreak/BlockBreakListener.java |  1 +
 .../checks/blockbreak/FastBreak.java          | 29 +++++++++++++------
 .../utilities/BlockProperties.java            | 23 +++++++++++++++
 3 files changed, 44 insertions(+), 9 deletions(-)

diff --git a/src/fr/neatmonster/nocheatplus/checks/blockbreak/BlockBreakListener.java b/src/fr/neatmonster/nocheatplus/checks/blockbreak/BlockBreakListener.java
index 8edbf201..81df8522 100644
--- a/src/fr/neatmonster/nocheatplus/checks/blockbreak/BlockBreakListener.java
+++ b/src/fr/neatmonster/nocheatplus/checks/blockbreak/BlockBreakListener.java
@@ -220,6 +220,7 @@ public class BlockBreakListener implements Listener {
             return;
         
         // Skip if already set to the same block without breaking.
+        // TODO: should probably always set or depending on configuration.
         if (data.fastBreakBreakTime < data.fastBreakfirstDamage && data.clickedX == block.getX() &&  data.clickedZ == block.getZ() &&  data.clickedY == block.getY())
         	return;
         
diff --git a/src/fr/neatmonster/nocheatplus/checks/blockbreak/FastBreak.java b/src/fr/neatmonster/nocheatplus/checks/blockbreak/FastBreak.java
index 15e46b7b..b938779d 100644
--- a/src/fr/neatmonster/nocheatplus/checks/blockbreak/FastBreak.java
+++ b/src/fr/neatmonster/nocheatplus/checks/blockbreak/FastBreak.java
@@ -37,14 +37,14 @@ public class FastBreak extends Check {
      *            the player
      * @param block
      *            the block
+     * @param isInstaBreak 
      * @param data 
      * @param cc 
      * @param elaspedTime
      * @return true, if successful
      */
-    public boolean check(final Player player, final Block block, final BlockBreakConfig cc, final BlockBreakData data) {
+    public boolean check(final Player player, final Block block, final boolean isInstaBreak, final BlockBreakConfig cc, final BlockBreakData data) {
     	final long now = System.currentTimeMillis();
-
         boolean cancel = false;
         
         // First, check the game mode of the player and choose the right limit.
@@ -56,9 +56,12 @@ public class FastBreak extends Check {
         	breakingTime = Math.round((double) cc.fastBreakModSurvival / 100D * (double) BlockProperties.getBreakingDuration(block.getTypeId(), player));
     	// fastBreakfirstDamage is the first interact on block (!).
         final long elapsedTime = (data.fastBreakBreakTime > data.fastBreakfirstDamage) ? 0 : now - data.fastBreakfirstDamage;
-        
+          
         // Check if the time used time is lower than expected.
-    	if (elapsedTime + cc.fastBreakDelay < breakingTime){
+        if (isInstaBreak){
+        	// Ignore those for now.
+        }
+        else if (elapsedTime + cc.fastBreakDelay < breakingTime){
     		// lag or cheat or Minecraft.
     		        		
     		final long missingTime = breakingTime - elapsedTime;
@@ -79,11 +82,19 @@ public class FastBreak extends Check {
     		data.fastBreakVL *= 0.9D;
     	}
     	
-    	 if (cc.fastBreakDebug && player.hasPermission(Permissions.ADMINISTRATION_DEBUG) && data.stats != null){
-             data.stats.addStats(data.stats.getId(Integer.toString(block.getTypeId())+"u", true), elapsedTime);
-             data.stats.addStats(data.stats.getId(Integer.toString(block.getTypeId())+ "r", true), breakingTime);
-             player.sendMessage(data.stats.getStatsStr(true));
-         }
+        if (cc.fastBreakDebug && player.hasPermission(Permissions.ADMINISTRATION_DEBUG)){
+        	// General stats:
+        	if (data.stats != null){
+                data.stats.addStats(data.stats.getId(Integer.toString(block.getTypeId())+"u", true), elapsedTime);
+                data.stats.addStats(data.stats.getId(Integer.toString(block.getTypeId())+ "r", true), breakingTime);
+                player.sendMessage(data.stats.getStatsStr(true));
+            }
+        	// Send info about current break:
+        	final int blockId = block.getTypeId();
+        	final boolean isValidTool = BlockProperties.isValidTool(blockId, player.getItemInHand());
+        	String msg = (isInstaBreak ? "[Insta]" : "[Normal]") + "[" + blockId + "] "+ elapsedTime + "u / " + breakingTime +"r (" + (isValidTool?"tool":"no-tool") + ")";
+        	player.sendMessage(msg);
+        }
     	 
     	 // (The break time is set in the listener).
         
diff --git a/src/fr/neatmonster/nocheatplus/utilities/BlockProperties.java b/src/fr/neatmonster/nocheatplus/utilities/BlockProperties.java
index 65824ff1..aa325f24 100644
--- a/src/fr/neatmonster/nocheatplus/utilities/BlockProperties.java
+++ b/src/fr/neatmonster/nocheatplus/utilities/BlockProperties.java
@@ -453,6 +453,11 @@ public class BlockProperties {
 		return new long[]{v, v, v, v, v, v};
 	}
 	
+	public static ToolProps getToolProps(final ItemStack stack){
+		if (stack == null) return noTool;
+		else return getToolProps(stack.getTypeId());
+	}
+	
 	public static ToolProps getToolProps(final Material mat){
 		if (mat == null) return noTool;
 		else return getToolProps(mat.getId());
@@ -464,6 +469,16 @@ public class BlockProperties {
 		else return props;
 	}
 	
+	public static BlockProps getBlockProps(final ItemStack stack){
+		if (stack == null) return defaultBlockProps;
+		else return getBlockProps(stack.getTypeId());
+	}
+	
+	public static BlockProps getBlockProps(final Material mat){
+		if (mat == null) return defaultBlockProps;
+		else return getBlockProps(mat.getId());
+	}
+	
 	public static BlockProps getBlockProps(final int blockId){
 		if (blockId <0 || blockId >= blocks.length || blocks[blockId] == null) return defaultBlockProps;
 		else return blocks[blockId];
@@ -665,4 +680,12 @@ public class BlockProperties {
 		if (blockId < 0 || blockId >= blocks.length) throw new IllegalArgumentException("The blockId is outside of supported range: " + blockId);
 		blocks[blockId] = blockProps;
 	}
+
+
+	public static boolean isValidTool(final int blockId, final ItemStack itemInHand) {
+		final BlockProps blockProps = getBlockProps(blockId);
+		final ToolProps toolProps = getToolProps(itemInHand);
+		final int efficiency = itemInHand == null ? 0 : itemInHand.getEnchantmentLevel(Enchantment.DIG_SPEED);
+		return isValidTool(blockId, blockProps, toolProps, efficiency);
+	}
 }