2015-06-15 22:06:07 +02:00
package ellpeck.actuallyadditions.items ;
2015-07-16 16:52:28 +02:00
import cofh.api.energy.IEnergyContainerItem ;
2015-06-15 22:06:07 +02:00
import com.google.common.collect.Multimap ;
import cpw.mods.fml.relauncher.Side ;
import cpw.mods.fml.relauncher.SideOnly ;
import ellpeck.actuallyadditions.ActuallyAdditions ;
2015-06-21 02:28:49 +02:00
import ellpeck.actuallyadditions.config.values.ConfigFloatValues ;
import ellpeck.actuallyadditions.config.values.ConfigIntValues ;
2015-06-15 22:06:07 +02:00
import ellpeck.actuallyadditions.inventory.GuiHandler ;
2015-06-21 02:28:49 +02:00
import ellpeck.actuallyadditions.util.INameableItem ;
import ellpeck.actuallyadditions.util.ModUtil ;
2015-07-07 20:20:24 +02:00
import ellpeck.actuallyadditions.util.WorldUtil ;
2015-06-15 22:06:07 +02:00
import net.minecraft.block.Block ;
import net.minecraft.block.material.Material ;
2015-07-17 05:11:49 +02:00
import net.minecraft.client.Minecraft ;
2015-06-15 22:06:07 +02:00
import net.minecraft.client.renderer.texture.IIconRegister ;
2015-07-07 14:32:10 +02:00
import net.minecraft.enchantment.Enchantment ;
import net.minecraft.enchantment.EnchantmentHelper ;
2015-07-16 16:52:28 +02:00
import net.minecraft.entity.Entity ;
2015-06-15 22:06:07 +02:00
import net.minecraft.entity.EntityLivingBase ;
import net.minecraft.entity.SharedMonsterAttributes ;
import net.minecraft.entity.ai.attributes.AttributeModifier ;
import net.minecraft.entity.player.EntityPlayer ;
2015-07-17 05:11:49 +02:00
import net.minecraft.entity.player.EntityPlayerMP ;
2015-06-21 02:28:49 +02:00
import net.minecraft.entity.player.InventoryPlayer ;
2015-07-15 05:33:02 +02:00
import net.minecraft.init.Blocks ;
2015-06-15 22:06:07 +02:00
import net.minecraft.item.EnumRarity ;
import net.minecraft.item.ItemStack ;
import net.minecraft.nbt.NBTTagCompound ;
import net.minecraft.nbt.NBTTagList ;
2015-07-17 05:11:49 +02:00
import net.minecraft.network.play.client.C07PacketPlayerDigging ;
import net.minecraft.network.play.server.S23PacketBlockChange ;
2015-06-21 02:28:49 +02:00
import net.minecraft.util.ChatComponentText ;
2015-06-15 22:06:07 +02:00
import net.minecraft.util.IIcon ;
import net.minecraft.util.MovingObjectPosition ;
import net.minecraft.world.World ;
2015-06-21 02:28:49 +02:00
import org.apache.logging.log4j.Level ;
2015-06-15 22:06:07 +02:00
import java.util.HashSet ;
import java.util.Set ;
@SuppressWarnings ( " unchecked " )
2015-07-07 20:20:24 +02:00
public class ItemDrill extends ItemEnergy implements INameableItem {
2015-06-15 22:06:07 +02:00
public ItemDrill ( ) {
2015-07-16 16:52:28 +02:00
super ( 500000 , 5000 , 4 ) ;
2015-06-15 22:06:07 +02:00
}
2015-06-21 02:28:49 +02:00
public static float defaultEfficiency = ConfigFloatValues . DRILL_DAMAGE . getValue ( ) ;
public static int energyUsePerBlockOrHit = ConfigIntValues . DRILL_ENERGY_USE . getValue ( ) ;
2015-06-15 22:06:07 +02:00
2015-06-21 02:28:49 +02:00
@Override
2015-07-17 05:11:49 +02:00
//Places Blocks if the Placing Upgrade is installed
2015-06-21 02:28:49 +02:00
public boolean onItemUse ( ItemStack stack , EntityPlayer player , World world , int x , int y , int z , int hitSide , float hitX , float hitY , float hitZ ) {
ItemStack upgrade = this . getHasUpgradeAsStack ( stack , ItemDrillUpgrade . UpgradeType . PLACER ) ;
if ( upgrade ! = null ) {
int slot = ItemDrillUpgrade . getSlotToPlaceFrom ( upgrade ) ;
2015-06-22 18:09:00 +02:00
if ( slot > = 0 & & slot < InventoryPlayer . getHotbarSize ( ) ) {
2015-07-17 05:11:49 +02:00
ItemStack anEquip = player . inventory . getStackInSlot ( slot ) ;
2015-06-22 18:09:00 +02:00
if ( anEquip ! = null & & anEquip ! = stack ) {
ItemStack equip = anEquip . copy ( ) ;
2015-06-21 02:28:49 +02:00
if ( ! world . isRemote ) {
2015-07-17 05:11:49 +02:00
//tryPlaceItemIntoWorld could throw an Exception
2015-06-21 02:28:49 +02:00
try {
2015-07-17 05:11:49 +02:00
//Places the Block into the World
2015-06-22 18:09:00 +02:00
if ( equip . tryPlaceItemIntoWorld ( player , world , x , y , z , hitSide , hitX , hitY , hitZ ) ) {
2015-07-17 05:11:49 +02:00
if ( ! player . capabilities . isCreativeMode )
player . inventory . setInventorySlotContents ( slot , equip . stackSize < = 0 ? null : equip . copy ( ) ) ;
//Synchronizes the Client
2015-06-22 18:09:00 +02:00
player . inventoryContainer . detectAndSendChanges ( ) ;
return true ;
}
2015-06-21 02:28:49 +02:00
}
2015-07-17 05:11:49 +02:00
//Notify the Player and log the Exception
2015-06-21 02:28:49 +02:00
catch ( Exception e ) {
player . addChatComponentMessage ( new ChatComponentText ( " Ouch! That really hurt! You must have done something wrong, don't do that again please! " ) ) ;
ModUtil . LOGGER . log ( Level . ERROR , " Player " + player . getDisplayName ( ) + " who should place a Block using a Drill at " + player . posX + " , " + player . posY + " , " + player . posZ + " in World " + world . provider . dimensionId + " threw an Exception! Don't let that happen again! " ) ;
}
}
else return true ;
}
}
}
return false ;
}
2015-07-17 05:11:49 +02:00
//Checks for Energy Containers in the Upgrade Slots and charges the Drill from them
@Override
2015-07-16 16:52:28 +02:00
public void onUpdate ( ItemStack stack , World world , Entity entity , int par4 , boolean par5 ) {
ItemStack [ ] slots = this . getSlotsFromNBT ( stack ) ;
if ( slots ! = null & & slots . length > 0 ) {
for ( ItemStack slotStack : slots ) {
if ( slotStack ! = null & & slotStack . getItem ( ) instanceof IEnergyContainerItem ) {
if ( this . getEnergyStored ( stack ) < this . getMaxEnergyStored ( stack ) ) {
int energy = ( ( IEnergyContainerItem ) slotStack . getItem ( ) ) . getEnergyStored ( slotStack ) ;
if ( energy > 0 ) {
2015-07-17 05:11:49 +02:00
//Charge the Drill and discharge the "Upgrade"
2015-07-16 17:42:19 +02:00
int toReceive = ( ( IEnergyContainerItem ) stack . getItem ( ) ) . receiveEnergy ( stack , energy , true ) ;
int actualReceive = ( ( IEnergyContainerItem ) slotStack . getItem ( ) ) . extractEnergy ( slotStack , toReceive , false ) ;
( ( IEnergyContainerItem ) stack . getItem ( ) ) . receiveEnergy ( stack , actualReceive , false ) ;
2015-07-16 16:52:28 +02:00
}
}
}
}
}
}
2015-07-17 05:11:49 +02:00
/ * *
* Gets the Mining Speed of the Drill
* @param stack The Drill
* @return The Mining Speed depending on the Speed Upgrades
* /
2015-06-21 02:28:49 +02:00
public float getEfficiencyFromUpgrade ( ItemStack stack ) {
float efficiency = defaultEfficiency ;
if ( this . getHasUpgrade ( stack , ItemDrillUpgrade . UpgradeType . SPEED ) ) {
if ( this . getHasUpgrade ( stack , ItemDrillUpgrade . UpgradeType . SPEED_II ) ) {
if ( this . getHasUpgrade ( stack , ItemDrillUpgrade . UpgradeType . SPEED_III ) ) efficiency + = 37 . 0F ;
2015-07-09 11:56:38 +02:00
else efficiency + = 25 . 0F ;
2015-06-15 22:06:07 +02:00
}
2015-07-09 11:56:38 +02:00
else efficiency + = 8 . 0F ;
2015-06-15 22:06:07 +02:00
}
2015-06-21 02:28:49 +02:00
return efficiency ;
2015-06-18 13:14:57 +02:00
}
2015-06-15 22:06:07 +02:00
2015-07-17 05:11:49 +02:00
/ * *
* Gets the Energy that is used per Block broken
* @param stack The Drill
* @return The Energy use per Block
* /
2015-06-18 13:14:57 +02:00
public int getEnergyUsePerBlock ( ItemStack stack ) {
int use = energyUsePerBlockOrHit ;
2015-06-21 02:28:49 +02:00
2015-07-17 05:11:49 +02:00
//Speed
2015-06-21 02:28:49 +02:00
if ( this . getHasUpgrade ( stack , ItemDrillUpgrade . UpgradeType . SPEED ) ) {
use + = ConfigIntValues . DRILL_SPEED_EXTRA_USE . getValue ( ) ;
if ( this . getHasUpgrade ( stack , ItemDrillUpgrade . UpgradeType . SPEED_II ) ) {
use + = ConfigIntValues . DRILL_SPEED_II_EXTRA_USE . getValue ( ) ;
2015-07-17 05:11:49 +02:00
if ( this . getHasUpgrade ( stack , ItemDrillUpgrade . UpgradeType . SPEED_III ) )
use + = ConfigIntValues . DRILL_SPEED_III_EXTRA_USE . getValue ( ) ;
2015-06-15 22:06:07 +02:00
}
}
2015-07-17 05:11:49 +02:00
//Silk Touch
if ( this . getHasUpgrade ( stack , ItemDrillUpgrade . UpgradeType . SILK_TOUCH ) )
use + = ConfigIntValues . DRILL_SILK_EXTRA_USE . getValue ( ) ;
2015-06-21 02:28:49 +02:00
2015-07-17 05:11:49 +02:00
//Fortune
2015-06-21 02:28:49 +02:00
if ( this . getHasUpgrade ( stack , ItemDrillUpgrade . UpgradeType . FORTUNE ) ) {
use + = ConfigIntValues . DRILL_FORTUNE_EXTRA_USE . getValue ( ) ;
2015-07-17 05:11:49 +02:00
if ( this . getHasUpgrade ( stack , ItemDrillUpgrade . UpgradeType . FORTUNE_II ) )
use + = ConfigIntValues . DRILL_FORTUNE_II_EXTRA_USE . getValue ( ) ;
2015-06-15 22:06:07 +02:00
}
2015-07-17 05:11:49 +02:00
//Size
2015-06-21 02:28:49 +02:00
if ( this . getHasUpgrade ( stack , ItemDrillUpgrade . UpgradeType . THREE_BY_THREE ) ) {
use + = ConfigIntValues . DRILL_THREE_BY_THREE_EXTRA_USE . getValue ( ) ;
2015-07-17 05:11:49 +02:00
if ( this . getHasUpgrade ( stack , ItemDrillUpgrade . UpgradeType . FIVE_BY_FIVE ) )
use + = ConfigIntValues . DRILL_FIVE_BY_FIVE_EXTRA_USE . getValue ( ) ;
2015-06-15 22:06:07 +02:00
}
2015-06-21 02:28:49 +02:00
return use ;
2015-06-15 22:06:07 +02:00
}
@Override
public EnumRarity getRarity ( ItemStack stack ) {
return EnumRarity . epic ;
}
2015-07-17 05:11:49 +02:00
/ * *
* Checks if a certain Upgrade is applied
* @param stack The Drill
* @param upgrade The Upgrade to be checked
* @return Is the Upgrade applied ?
* /
2015-06-15 22:06:07 +02:00
public boolean getHasUpgrade ( ItemStack stack , ItemDrillUpgrade . UpgradeType upgrade ) {
2015-06-21 02:28:49 +02:00
return this . getHasUpgradeAsStack ( stack , upgrade ) ! = null ;
}
2015-06-15 22:06:07 +02:00
2015-07-17 05:11:49 +02:00
/ * *
* Checks if a certain Upgrade is installed and returns it as an ItemStack
* @param stack The Drill
* @param upgrade The Upgrade to be checked
* @return The Upgrade , if it ' s installed
* /
2015-06-21 02:28:49 +02:00
public ItemStack getHasUpgradeAsStack ( ItemStack stack , ItemDrillUpgrade . UpgradeType upgrade ) {
2015-06-15 22:06:07 +02:00
NBTTagCompound compound = stack . getTagCompound ( ) ;
2015-06-21 02:28:49 +02:00
if ( compound = = null ) return null ;
2015-06-15 22:06:07 +02:00
ItemStack [ ] slots = this . getSlotsFromNBT ( stack ) ;
if ( slots ! = null & & slots . length > 0 ) {
for ( ItemStack slotStack : slots ) {
if ( slotStack ! = null & & slotStack . getItem ( ) instanceof ItemDrillUpgrade ) {
2015-06-21 02:28:49 +02:00
if ( ( ( ItemDrillUpgrade ) slotStack . getItem ( ) ) . type = = upgrade ) return slotStack ;
2015-06-15 22:06:07 +02:00
}
}
}
2015-06-21 02:28:49 +02:00
return null ;
2015-06-15 22:06:07 +02:00
}
@Override
public IIcon getIcon ( ItemStack stack , int pass ) {
return this . itemIcon ;
}
@Override
@SideOnly ( Side . CLIENT )
public void registerIcons ( IIconRegister iconReg ) {
2015-07-17 05:11:49 +02:00
this . itemIcon = iconReg . registerIcon ( ModUtil . MOD_ID_LOWER + " : " + this . getName ( ) ) ;
2015-06-15 22:06:07 +02:00
}
2015-07-17 05:11:49 +02:00
/ * *
* Writes all of the Slots to NBT
* @param slots The Slots
* @param stack The Drill
* /
2015-06-15 22:06:07 +02:00
public void writeSlotsToNBT ( ItemStack [ ] slots , ItemStack stack ) {
NBTTagCompound compound = stack . getTagCompound ( ) ;
if ( compound = = null ) compound = new NBTTagCompound ( ) ;
if ( slots ! = null & & slots . length > 0 ) {
compound . setInteger ( " SlotAmount " , slots . length ) ;
NBTTagList tagList = new NBTTagList ( ) ;
for ( int currentIndex = 0 ; currentIndex < slots . length ; currentIndex + + ) {
if ( slots [ currentIndex ] ! = null ) {
NBTTagCompound tagCompound = new NBTTagCompound ( ) ;
tagCompound . setByte ( " Slot " , ( byte ) currentIndex ) ;
slots [ currentIndex ] . writeToNBT ( tagCompound ) ;
tagList . appendTag ( tagCompound ) ;
}
}
compound . setTag ( " Items " , tagList ) ;
}
stack . setTagCompound ( compound ) ;
}
2015-07-17 05:11:49 +02:00
/ * *
* Gets all of the Slots from NBT
* @param stack The Drill
* @return All of the Slots
* /
2015-06-15 22:06:07 +02:00
public ItemStack [ ] getSlotsFromNBT ( ItemStack stack ) {
NBTTagCompound compound = stack . getTagCompound ( ) ;
if ( compound = = null ) return null ;
int slotAmount = compound . getInteger ( " SlotAmount " ) ;
ItemStack [ ] slots = new ItemStack [ slotAmount ] ;
if ( slots . length > 0 ) {
NBTTagList tagList = compound . getTagList ( " Items " , 10 ) ;
for ( int i = 0 ; i < tagList . tagCount ( ) ; i + + ) {
NBTTagCompound tagCompound = tagList . getCompoundTagAt ( i ) ;
byte slotIndex = tagCompound . getByte ( " Slot " ) ;
if ( slotIndex > = 0 & & slotIndex < slots . length ) {
slots [ slotIndex ] = ItemStack . loadItemStackFromNBT ( tagCompound ) ;
}
}
}
return slots ;
}
2015-07-17 05:11:49 +02:00
/ * *
* Breaks Blocks in a certain Radius
* Has to be called on both Server and Client
* @param stack The Drill
* @param radius The Radius to break Blocks in ( 0 means only 1 Block will be broken ! )
* @param world The World
* @param x The X Coord of the main Block to break
* @param y The Y Coord of the main Block to break
* @param z The Z Coord of the main Block to break
* @param player The Player who breaks the Blocks
* /
2015-07-20 22:06:08 +02:00
public boolean breakBlocks ( ItemStack stack , int radius , World world , int x , int y , int z , EntityPlayer player ) {
2015-06-15 22:06:07 +02:00
int xRange = radius ;
int yRange = radius ;
int zRange = 0 ;
2015-07-17 05:11:49 +02:00
//Block hit
2015-07-08 11:49:38 +02:00
MovingObjectPosition pos = WorldUtil . getNearestBlockWithDefaultReachDistance ( world , player ) ;
2015-07-20 22:06:08 +02:00
if ( pos = = null ) return false ;
2015-07-07 20:20:24 +02:00
2015-07-20 22:06:08 +02:00
//Corrects Blocks to hit depending on Side of original Block hit
int side = pos . sideHit ;
if ( side = = 0 | | side = = 1 ) {
zRange = radius ;
yRange = 0 ;
}
if ( side = = 4 | | side = = 5 ) {
xRange = 0 ;
zRange = radius ;
}
2015-06-15 22:06:07 +02:00
2015-07-20 22:06:08 +02:00
//Not defined later because main Block is getting broken below
float mainHardness = world . getBlock ( x , y , z ) . getBlockHardness ( world , x , y , z ) ;
2015-07-15 05:33:02 +02:00
2015-07-20 22:06:08 +02:00
//Break Middle Block first
int use = this . getEnergyUsePerBlock ( stack ) ;
if ( this . getEnergyStored ( stack ) > = use ) {
if ( ! this . tryHarvestBlock ( world , x , y , z , false , stack , player , use ) ) return false ;
}
else return false ;
//Break Blocks around
if ( radius > 0 ) {
for ( int xPos = x - xRange ; xPos < = x + xRange ; xPos + + ) {
for ( int yPos = y - yRange ; yPos < = y + yRange ; yPos + + ) {
for ( int zPos = z - zRange ; zPos < = z + zRange ; zPos + + ) {
if ( ! ( x = = xPos & & y = = yPos & & z = = zPos ) ) {
if ( this . getEnergyStored ( stack ) > = use ) {
//Only break Blocks around that are (about) as hard or softer
if ( world . getBlock ( xPos , yPos , zPos ) . getBlockHardness ( world , xPos , yPos , zPos ) < = mainHardness + 5 . 0F ) {
this . tryHarvestBlock ( world , xPos , yPos , zPos , true , stack , player , use ) ;
2015-07-09 14:20:37 +02:00
}
2015-06-15 22:06:07 +02:00
}
2015-07-20 22:06:08 +02:00
else return false ;
2015-06-15 22:06:07 +02:00
}
}
}
}
}
2015-07-20 22:06:08 +02:00
return true ;
2015-07-09 00:43:54 +02:00
}
2015-07-17 05:11:49 +02:00
/ * *
* Tries to harvest a certain Block
* Breaks the Block , drops Particles etc .
* Has to be called on both Server and Client
* @param world The World
* @param xPos The X Position of the Block to break
* @param yPos The Y Position of the Block to break
* @param zPos The Z Position of the Block to break
* @param isExtra If the Block is the Block that was looked at when breaking or an additional Block
* @param stack The Drill
* @param player The Player breaking the Blocks
* @param use The Energy that should be extracted per Block
* /
2015-07-20 22:06:08 +02:00
private boolean tryHarvestBlock ( World world , int xPos , int yPos , int zPos , boolean isExtra , ItemStack stack , EntityPlayer player , int use ) {
2015-07-09 00:43:54 +02:00
Block block = world . getBlock ( xPos , yPos , zPos ) ;
float hardness = block . getBlockHardness ( world , xPos , yPos , zPos ) ;
int meta = world . getBlockMetadata ( xPos , yPos , zPos ) ;
2015-07-20 22:06:08 +02:00
boolean canHarvest = this . canHarvestBlock ( block , stack ) & & ( ! isExtra | | this . getDigSpeed ( stack , block , meta ) > 1 . 0F ) ;
if ( hardness > = 0 . 0F & & ( ! isExtra | | ( canHarvest & & ! block . hasTileEntity ( meta ) ) ) ) {
2015-07-09 14:20:37 +02:00
this . extractEnergy ( stack , use , false ) ;
2015-07-09 00:43:54 +02:00
2015-07-17 05:11:49 +02:00
if ( ! world . isRemote ) {
//Server-Side only, special cases
block . onBlockHarvested ( world , xPos , yPos , zPos , meta , player ) ;
}
else {
//Shows the Harvest Particles and plays the Block's Sound
world . playAuxSFX ( 2001 , xPos , yPos , zPos , Block . getIdFromBlock ( block ) + ( meta < < 12 ) ) ;
}
2015-07-20 22:06:08 +02:00
//If the Block was actually "removed", meaning it will drop an Item
boolean removed = block . removedByPlayer ( world , player , xPos , yPos , zPos , canHarvest ) ;
2015-07-17 05:11:49 +02:00
//Actually removes the Block from the World
2015-07-20 22:06:08 +02:00
if ( removed ) {
2015-07-17 05:11:49 +02:00
//Before the Block is destroyed, special cases
2015-07-09 14:20:37 +02:00
block . onBlockDestroyedByPlayer ( world , xPos , yPos , zPos , meta ) ;
2015-07-09 00:43:54 +02:00
2015-07-17 05:11:49 +02:00
if ( ! world . isRemote & & ! player . capabilities . isCreativeMode ) {
//Actually drops the Block's Items etc.
2015-07-20 22:06:08 +02:00
if ( canHarvest ) {
block . harvestBlock ( world , player , xPos , yPos , zPos , meta ) ;
}
2015-07-17 05:11:49 +02:00
//Only drop XP when no Silk Touch is applied
2015-07-15 05:33:02 +02:00
if ( ! EnchantmentHelper . getSilkTouchModifier ( player ) ) {
2015-07-17 05:11:49 +02:00
//Drop XP depending on Fortune Level
2015-07-15 05:33:02 +02:00
block . dropXpOnBlockBreak ( world , xPos , yPos , zPos , block . getExpDrop ( world , meta , EnchantmentHelper . getFortuneModifier ( player ) ) ) ;
}
2015-07-09 00:43:54 +02:00
}
2015-07-09 01:07:20 +02:00
}
2015-07-09 01:28:53 +02:00
2015-07-17 05:11:49 +02:00
if ( ! world . isRemote ) {
//Update the Client of a Block Change
( ( EntityPlayerMP ) player ) . playerNetServerHandler . sendPacket ( new S23PacketBlockChange ( xPos , yPos , zPos , world ) ) ;
}
else {
//Check the Server if a Block that changed on the Client really changed, if not, revert the change
Minecraft . getMinecraft ( ) . getNetHandler ( ) . addToSendQueue ( new C07PacketPlayerDigging ( 2 , xPos , yPos , zPos , Minecraft . getMinecraft ( ) . objectMouseOver . sideHit ) ) ;
2015-07-09 00:43:54 +02:00
}
2015-07-20 22:06:08 +02:00
return removed ;
2015-07-09 00:43:54 +02:00
}
2015-07-20 22:06:08 +02:00
return false ;
2015-06-15 22:06:07 +02:00
}
@Override
public String getName ( ) {
return " itemDrill " ;
}
@Override
2015-07-09 14:54:53 +02:00
public boolean onBlockStartBreak ( ItemStack stack , int x , int y , int z , EntityPlayer player ) {
2015-07-20 22:06:08 +02:00
boolean toReturn = true ;
2015-07-09 15:16:18 +02:00
int use = this . getEnergyUsePerBlock ( stack ) ;
if ( this . getEnergyStored ( stack ) > = use ) {
2015-07-17 05:11:49 +02:00
//Enchants the Drill depending on the Upgrades it has
if ( this . getHasUpgrade ( stack , ItemDrillUpgrade . UpgradeType . SILK_TOUCH ) )
stack . addEnchantment ( Enchantment . silkTouch , 1 ) ;
else {
if ( this . getHasUpgrade ( stack , ItemDrillUpgrade . UpgradeType . FORTUNE ) )
stack . addEnchantment ( Enchantment . fortune , this . getHasUpgrade ( stack , ItemDrillUpgrade . UpgradeType . FORTUNE_II ) ? 3 : 1 ) ;
}
2015-07-07 14:32:10 +02:00
2015-07-17 05:11:49 +02:00
//Breaks the Blocks
if ( ! player . isSneaking ( ) & & this . getHasUpgrade ( stack , ItemDrillUpgrade . UpgradeType . THREE_BY_THREE ) ) {
if ( this . getHasUpgrade ( stack , ItemDrillUpgrade . UpgradeType . FIVE_BY_FIVE ) ) {
2015-07-20 22:06:08 +02:00
toReturn = this . breakBlocks ( stack , 2 , player . worldObj , x , y , z , player ) ;
2015-07-09 01:07:20 +02:00
}
2015-07-20 22:06:08 +02:00
else toReturn = this . breakBlocks ( stack , 1 , player . worldObj , x , y , z , player ) ;
2015-07-17 05:11:49 +02:00
}
2015-07-20 22:06:08 +02:00
else toReturn = this . breakBlocks ( stack , 0 , player . worldObj , x , y , z , player ) ;
2015-07-17 05:11:49 +02:00
//Removes Enchantments added above
NBTTagList ench = stack . getEnchantmentTagList ( ) ;
if ( ench ! = null ) {
for ( int i = 0 ; i < ench . tagCount ( ) ; i + + ) {
short id = ench . getCompoundTagAt ( i ) . getShort ( " id " ) ;
if ( id = = Enchantment . silkTouch . effectId | | id = = Enchantment . fortune . effectId ) {
ench . removeTag ( i ) ;
2015-07-07 14:32:10 +02:00
}
2015-06-15 22:06:07 +02:00
}
}
}
2015-07-20 22:06:08 +02:00
return toReturn ;
2015-06-15 22:06:07 +02:00
}
@Override
public boolean hitEntity ( ItemStack stack , EntityLivingBase entity1 , EntityLivingBase entity2 ) {
2015-06-18 13:14:57 +02:00
int use = this . getEnergyUsePerBlock ( stack ) ;
if ( this . getEnergyStored ( stack ) > = use ) {
this . extractEnergy ( stack , use , false ) ;
2015-06-15 22:06:07 +02:00
}
return true ;
}
2015-07-15 05:33:02 +02:00
@Override
public float getDigSpeed ( ItemStack stack , Block block , int meta ) {
return this . getEnergyStored ( stack ) > = this . getEnergyUsePerBlock ( stack ) ? ( this . getToolClasses ( stack ) . contains ( block . getHarvestTool ( meta ) ) ? this . getEfficiencyFromUpgrade ( stack ) : 1 . 0F ) : 0 . 0F ;
}
2015-06-15 22:06:07 +02:00
@Override
public boolean canHarvestBlock ( Block block , ItemStack stack ) {
2015-07-15 05:33:02 +02:00
return this . getEnergyStored ( stack ) > = this . getEnergyUsePerBlock ( stack ) & & ( block . getMaterial ( ) . isToolNotRequired ( ) | | ( block = = Blocks . snow_layer | | block = = Blocks . snow | | ( block = = Blocks . obsidian ? ToolMaterial . EMERALD . getHarvestLevel ( ) = = 3 : ( block ! = Blocks . diamond_block & & block ! = Blocks . diamond_ore ? ( block ! = Blocks . emerald_ore & & block ! = Blocks . emerald_block ? ( block ! = Blocks . gold_block & & block ! = Blocks . gold_ore ? ( block ! = Blocks . iron_block & & block ! = Blocks . iron_ore ? ( block ! = Blocks . lapis_block & & block ! = Blocks . lapis_ore ? ( block ! = Blocks . redstone_ore & & block ! = Blocks . lit_redstone_ore ? ( block . getMaterial ( ) = = Material . rock | | ( block . getMaterial ( ) = = Material . iron | | block . getMaterial ( ) = = Material . anvil ) ) : ToolMaterial . EMERALD . getHarvestLevel ( ) > = 2 ) : ToolMaterial . EMERALD . getHarvestLevel ( ) > = 1 ) : ToolMaterial . EMERALD . getHarvestLevel ( ) > = 1 ) : ToolMaterial . EMERALD . getHarvestLevel ( ) > = 2 ) : ToolMaterial . EMERALD . getHarvestLevel ( ) > = 2 ) : ToolMaterial . EMERALD . getHarvestLevel ( ) > = 2 ) ) ) ) ;
2015-06-15 22:06:07 +02:00
}
@Override
public ItemStack onItemRightClick ( ItemStack stack , World world , EntityPlayer player ) {
2015-06-22 18:09:00 +02:00
if ( ! world . isRemote & & player . isSneaking ( ) & & stack = = player . getCurrentEquippedItem ( ) ) {
2015-07-17 09:03:31 +02:00
player . openGui ( ActuallyAdditions . instance , GuiHandler . GuiTypes . DRILL . ordinal ( ) , world , ( int ) player . posX , ( int ) player . posY , ( int ) player . posZ ) ;
2015-06-21 02:28:49 +02:00
}
2015-06-15 22:06:07 +02:00
return stack ;
}
@Override
public int getHarvestLevel ( ItemStack stack , String toolClass ) {
return ToolMaterial . EMERALD . getHarvestLevel ( ) ;
}
@Override
public Set < String > getToolClasses ( ItemStack stack ) {
2015-07-17 23:22:10 +02:00
HashSet < String > hashSet = new HashSet < String > ( ) ;
2015-06-15 22:06:07 +02:00
hashSet . add ( " pickaxe " ) ;
hashSet . add ( " shovel " ) ;
return hashSet ;
}
@Override
public Multimap getAttributeModifiers ( ItemStack stack ) {
Multimap map = super . getAttributeModifiers ( stack ) ;
2015-06-18 13:14:57 +02:00
map . put ( SharedMonsterAttributes . attackDamage . getAttributeUnlocalizedName ( ) , new AttributeModifier ( field_111210_e , " Tool modifier " , this . getEnergyStored ( stack ) > = energyUsePerBlockOrHit ? 8 . 0F : 0 . 0F , 0 ) ) ;
2015-06-15 22:06:07 +02:00
return map ;
}
}