package universalelectricity.prefab.block; import java.lang.reflect.Method; import net.minecraft.block.Block; import net.minecraft.block.material.Material; import net.minecraft.entity.player.EntityPlayer; import net.minecraft.item.ItemStack; import net.minecraft.world.World; /** * An advanced block class that is to be extended for wrenching capabilities. */ public abstract class BlockAdvanced extends Block { public BlockAdvanced(int id, Material material) { super(id, material); this.setHardness(0.6f); } /** * DO NOT OVERRIDE THIS FUNCTION! Called when the block is right clicked by the player. This * modified version detects electric items and wrench actions on your machine block. Do not * override this function. Use onMachineActivated instead! (It does the same thing) * * @param world The World Object. * @param x , y, z The coordinate of the block. * @param side The side the player clicked on. * @param hitX , hitY, hitZ The position the player clicked on relative to the block. */ @Override public boolean onBlockActivated(World world, int x, int y, int z, EntityPlayer entityPlayer, int side, float hitX, float hitY, float hitZ) { int metadata = world.getBlockMetadata(x, y, z); /** * Check if the player is holding a wrench or an electric item. If so, call the wrench * event. */ if (this.isUsableWrench(entityPlayer, entityPlayer.inventory.getCurrentItem(), x, y, z)) { this.damageWrench(entityPlayer, entityPlayer.inventory.getCurrentItem(), x, y, z); if (entityPlayer.isSneaking()) { if (this.onSneakUseWrench(world, x, y, z, entityPlayer, side, hitX, hitY, hitZ)) { return true; } } if (this.onUseWrench(world, x, y, z, entityPlayer, side, hitX, hitY, hitZ)) { return true; } } if (entityPlayer.isSneaking()) { if (this.onSneakMachineActivated(world, x, y, z, entityPlayer, side, hitX, hitY, hitZ)) { return true; } } return this.onMachineActivated(world, x, y, z, entityPlayer, side, hitX, hitY, hitZ); } /** * A function that denotes if an itemStack is a wrench that can be used. Override this for more * wrench compatibility. Compatible with Buildcraft and IC2 wrench API via reflection. * * @return True if it is a wrench. */ public boolean isUsableWrench(EntityPlayer entityPlayer, ItemStack itemStack, int x, int y, int z) { if (entityPlayer != null && itemStack != null) { Class wrenchClass = itemStack.getItem().getClass(); /** * UE and Buildcraft */ try { Method methodCanWrench = wrenchClass.getMethod("canWrench", EntityPlayer.class, Integer.TYPE, Integer.TYPE, Integer.TYPE); return (Boolean) methodCanWrench.invoke(itemStack.getItem(), entityPlayer, x, y, z); } catch (NoClassDefFoundError e) { } catch (Exception e) { } /** * Industrialcraft */ try { if (wrenchClass == Class.forName("ic2.core.item.tool.ItemToolWrench") || wrenchClass == Class.forName("ic2.core.item.tool.ItemToolWrenchElectric")) { return itemStack.getItemDamage() < itemStack.getMaxDamage(); } } catch (Exception e) { } } return false; } /** * This function damages a wrench. Works with Buildcraft and Industrialcraft wrenches. * * @return True if damage was successfull. */ public boolean damageWrench(EntityPlayer entityPlayer, ItemStack itemStack, int x, int y, int z) { if (this.isUsableWrench(entityPlayer, itemStack, x, y, z)) { Class wrenchClass = itemStack.getItem().getClass(); /** * UE and Buildcraft */ try { Method methodWrenchUsed = wrenchClass.getMethod("wrenchUsed", EntityPlayer.class, Integer.TYPE, Integer.TYPE, Integer.TYPE); methodWrenchUsed.invoke(itemStack.getItem(), entityPlayer, x, y, z); return true; } catch (Exception e) { } /** * Industrialcraft */ try { if (wrenchClass == Class.forName("ic2.core.item.tool.ItemToolWrench") || wrenchClass == Class.forName("ic2.core.item.tool.ItemToolWrenchElectric")) { Method methodWrenchDamage = wrenchClass.getMethod("damage", ItemStack.class, Integer.TYPE, EntityPlayer.class); methodWrenchDamage.invoke(itemStack.getItem(), itemStack, 1, entityPlayer); return true; } } catch (Exception e) { } } return false; } /** * Called when the machine is right clicked by the player * * @return True if something happens */ public boolean onMachineActivated(World world, int x, int y, int z, EntityPlayer entityPlayer, int side, float hitX, float hitY, float hitZ) { return false; } /** * Called when the machine is being wrenched by a player while sneaking. * * @return True if something happens */ public boolean onSneakMachineActivated(World world, int x, int y, int z, EntityPlayer entityPlayer, int side, float hitX, float hitY, float hitZ) { return false; } /** * Called when a player uses a wrench on the machine * * @return True if some happens */ public boolean onUseWrench(World world, int x, int y, int z, EntityPlayer entityPlayer, int side, float hitX, float hitY, float hitZ) { return false; } /** * Called when a player uses a wrench on the machine while sneaking. Only works with the UE * wrench. * * @return True if some happens */ public boolean onSneakUseWrench(World world, int x, int y, int z, EntityPlayer entityPlayer, int side, float hitX, float hitY, float hitZ) { return this.onUseWrench(world, x, y, z, entityPlayer, side, hitX, hitY, hitZ); } }