From 8dbfe1baad42d1fcb93f44050d44577648da3900 Mon Sep 17 00:00:00 2001 From: boni Date: Sat, 20 Aug 2016 00:54:37 +0200 Subject: [PATCH] Expand getHarvestLevel to include player and blockstate (#3192) --- .../net/minecraft/item/Item.java.patch | 27 +++++++++++++------ .../net/minecraft/item/ItemTool.java.patch | 4 +-- .../net/minecraftforge/common/ForgeHooks.java | 4 +-- .../debug/ItemLayerModelDebug.java | 19 +++++++++++++ 4 files changed, 42 insertions(+), 12 deletions(-) diff --git a/patches/minecraft/net/minecraft/item/Item.java.patch b/patches/minecraft/net/minecraft/item/Item.java.patch index a8abb75fbb..5496a45b80 100644 --- a/patches/minecraft/net/minecraft/item/Item.java.patch +++ b/patches/minecraft/net/minecraft/item/Item.java.patch @@ -522,13 +522,9 @@ + } + + /** -+ * Queries the harvest level of this item stack for the specifred tool class, -+ * Returns -1 if this tool is not of the specified type -+ * -+ * @param stack This item stack instance -+ * @param toolClass Tool Class -+ * @return Harvest level, or -1 if not the specified tool type. ++ * Deprecated, Use the position aware variant instead + */ ++ @Deprecated + public int getHarvestLevel(ItemStack stack, String toolClass) + { + Integer ret = toolClasses.get(toolClass); @@ -536,6 +532,21 @@ + } + + /** ++ * Queries the harvest level of this item stack for the specified tool class, ++ * Returns -1 if this tool is not of the specified type ++ * ++ * @param stack This item stack instance ++ * @param toolClass Tool Class ++ * @param player The player trying to harvest the given blockstate ++ * @param blockState The block to harvest ++ * @return Harvest level, or -1 if not the specified tool type. ++ */ ++ public int getHarvestLevel(ItemStack stack, String toolClass, @Nullable EntityPlayer player, @Nullable IBlockState blockState) ++ { ++ return getHarvestLevel(stack, toolClass); ++ } ++ ++ /** + * ItemStack sensitive version of getItemEnchantability + * + * @param stack The ItemStack @@ -622,7 +633,7 @@ public static void func_150900_l() { func_179214_a(Blocks.field_150348_b, (new ItemMultiTexture(Blocks.field_150348_b, Blocks.field_150348_b, new Function() -@@ -962,6 +1526,10 @@ +@@ -962,6 +1537,10 @@ private final float field_78011_i; private final int field_78008_j; @@ -633,7 +644,7 @@ private ToolMaterial(int p_i1874_3_, int p_i1874_4_, float p_i1874_5_, float p_i1874_6_, int p_i1874_7_) { this.field_78001_f = p_i1874_3_; -@@ -996,9 +1564,36 @@ +@@ -996,9 +1575,36 @@ return this.field_78008_j; } diff --git a/patches/minecraft/net/minecraft/item/ItemTool.java.patch b/patches/minecraft/net/minecraft/item/ItemTool.java.patch index efb12b0b58..2c46440352 100644 --- a/patches/minecraft/net/minecraft/item/ItemTool.java.patch +++ b/patches/minecraft/net/minecraft/item/ItemTool.java.patch @@ -50,9 +50,9 @@ + /*===================================== FORGE START =================================*/ + private String toolClass; + @Override -+ public int getHarvestLevel(ItemStack stack, String toolClass) ++ public int getHarvestLevel(ItemStack stack, String toolClass, @javax.annotation.Nullable net.minecraft.entity.player.EntityPlayer player, @javax.annotation.Nullable IBlockState blockState) + { -+ int level = super.getHarvestLevel(stack, toolClass); ++ int level = super.getHarvestLevel(stack, toolClass, player, blockState); + if (level == -1 && toolClass != null && toolClass.equals(this.toolClass)) + { + return this.field_77862_b.func_77996_d(); diff --git a/src/main/java/net/minecraftforge/common/ForgeHooks.java b/src/main/java/net/minecraftforge/common/ForgeHooks.java index 5dce692d56..fe1acd8a39 100644 --- a/src/main/java/net/minecraftforge/common/ForgeHooks.java +++ b/src/main/java/net/minecraftforge/common/ForgeHooks.java @@ -169,7 +169,7 @@ public class ForgeHooks return player.canHarvestBlock(state); } - int toolLevel = stack.getItem().getHarvestLevel(stack, tool); + int toolLevel = stack.getItem().getHarvestLevel(stack, tool, player, state); if (toolLevel < 0) { return player.canHarvestBlock(state); @@ -184,7 +184,7 @@ public class ForgeHooks state = state.getBlock().getActualState(state, world, pos); String tool = state.getBlock().getHarvestTool(state); if (stack == null || tool == null) return false; - return stack.getItem().getHarvestLevel(stack, tool) >= state.getBlock().getHarvestLevel(state); + return stack.getItem().getHarvestLevel(stack, tool, null, null) >= state.getBlock().getHarvestLevel(state); } public static float blockStrength(IBlockState state, EntityPlayer player, World world, BlockPos pos) diff --git a/src/test/java/net/minecraftforge/debug/ItemLayerModelDebug.java b/src/test/java/net/minecraftforge/debug/ItemLayerModelDebug.java index 904f559111..f9af0d1d8d 100644 --- a/src/test/java/net/minecraftforge/debug/ItemLayerModelDebug.java +++ b/src/test/java/net/minecraftforge/debug/ItemLayerModelDebug.java @@ -1,8 +1,11 @@ package net.minecraftforge.debug; +import net.minecraft.block.state.IBlockState; import net.minecraft.client.renderer.block.model.ModelResourceLocation; import net.minecraft.creativetab.CreativeTabs; import net.minecraft.entity.Entity; +import net.minecraft.entity.player.EntityPlayer; +import net.minecraft.inventory.EntityEquipmentSlot; import net.minecraft.item.Item; import net.minecraft.item.ItemStack; import net.minecraft.nbt.NBTTagCompound; @@ -17,6 +20,8 @@ import net.minecraftforge.fml.common.registry.GameRegistry; import java.util.Random; +import javax.annotation.Nullable; + @Mod(modid = ItemLayerModelDebug.MODID, name = "ForgeDebugItemLayerModel", version = ItemLayerModelDebug.VERSION) public class ItemLayerModelDebug { @@ -86,5 +91,19 @@ public class ItemLayerModelDebug newStack.setTagCompound(null); return !ItemStack.areItemStacksEqual(oldStack, newStack); } + + @Override + public int getHarvestLevel(ItemStack stack, String toolClass, @Nullable EntityPlayer player, @Nullable IBlockState blockState) { + // This tool is a super pickaxe if the player is wearing a helment + if("pickaxe".equals(toolClass) && player != null && player.getItemStackFromSlot(EntityEquipmentSlot.HEAD) != null) { + return 5; + } + return super.getHarvestLevel(stack, toolClass, player, blockState); + } + + @Override + public float getStrVsBlock(ItemStack stack, IBlockState state) { + return 10f; + } } }