aboutsummaryrefslogtreecommitdiff
path: root/src/main/java/gregtech/common/tools/ToolWrench.java
diff options
context:
space:
mode:
Diffstat (limited to 'src/main/java/gregtech/common/tools/ToolWrench.java')
-rw-r--r--src/main/java/gregtech/common/tools/ToolWrench.java279
1 files changed, 279 insertions, 0 deletions
diff --git a/src/main/java/gregtech/common/tools/ToolWrench.java b/src/main/java/gregtech/common/tools/ToolWrench.java
new file mode 100644
index 0000000000..3d2adf4896
--- /dev/null
+++ b/src/main/java/gregtech/common/tools/ToolWrench.java
@@ -0,0 +1,279 @@
+package gregtech.common.tools;
+
+import static gregtech.api.items.MetaGeneratedTool.getPrimaryMaterial;
+
+import java.util.Arrays;
+import java.util.List;
+
+import javax.annotation.Nonnull;
+
+import net.minecraft.block.Block;
+import net.minecraft.block.material.Material;
+import net.minecraft.entity.Entity;
+import net.minecraft.entity.EntityLivingBase;
+import net.minecraft.entity.monster.EntityIronGolem;
+import net.minecraft.entity.player.EntityPlayer;
+import net.minecraft.init.Blocks;
+import net.minecraft.item.ItemStack;
+import net.minecraft.tileentity.TileEntity;
+import net.minecraft.util.ChatComponentText;
+import net.minecraft.util.EnumChatFormatting;
+import net.minecraft.util.IChatComponent;
+import net.minecraft.util.MovingObjectPosition;
+import net.minecraft.world.World;
+import net.minecraftforge.event.world.BlockEvent;
+
+import appeng.api.parts.IPartHost;
+import appeng.block.AEBaseTileBlock;
+import appeng.parts.PartPlacement;
+import appeng.util.Platform;
+import gregtech.api.enums.SoundResource;
+import gregtech.api.enums.Textures;
+import gregtech.api.interfaces.IIconContainer;
+import gregtech.api.items.MetaGeneratedTool;
+import gregtech.api.util.GTToolHarvestHelper;
+import gregtech.common.items.behaviors.BehaviourSwitchMode;
+import gregtech.common.items.behaviors.BehaviourWrench;
+import ic2.api.tile.IWrenchable;
+
+public class ToolWrench extends GTTool {
+
+ public static final List<String> mEffectiveList = Arrays
+ .asList(EntityIronGolem.class.getName(), "EntityTowerGuardian");
+
+ @Override
+ public float getNormalDamageAgainstEntity(float aOriginalDamage, Entity aEntity, ItemStack aStack,
+ EntityPlayer aPlayer) {
+ String tName = aEntity.getClass()
+ .getName();
+ tName = tName.substring(tName.lastIndexOf('.') + 1);
+ return (mEffectiveList.contains(tName)) || (tName.contains("Golem")) ? aOriginalDamage * 2.0F : aOriginalDamage;
+ }
+
+ @Override
+ public int getToolDamagePerBlockBreak() {
+ return 50;
+ }
+
+ @Override
+ public int getToolDamagePerDropConversion() {
+ return 100;
+ }
+
+ @Override
+ public int getToolDamagePerContainerCraft() {
+ return 800;
+ }
+
+ @Override
+ public int getToolDamagePerEntityAttack() {
+ return 200;
+ }
+
+ @Override
+ public int getBaseQuality() {
+ return 0;
+ }
+
+ @Override
+ public float getBaseDamage() {
+ return 3.0F;
+ }
+
+ @Override
+ public int getHurtResistanceTime(int aOriginalHurtResistance, Entity aEntity) {
+ return aOriginalHurtResistance * 2;
+ }
+
+ @Override
+ public float getSpeedMultiplier() {
+ return 1.0F;
+ }
+
+ @Override
+ public float getMaxDurabilityMultiplier() {
+ return 1.0F;
+ }
+
+ @Override
+ public String getCraftingSound() {
+ return SoundResource.IC2_TOOLS_WRENCH.toString();
+ }
+
+ @Override
+ public String getEntityHitSound() {
+ return null;
+ }
+
+ @Override
+ public String getMiningSound() {
+ return SoundResource.IC2_TOOLS_WRENCH.toString();
+ }
+
+ @Override
+ public boolean canBlock() {
+ return false;
+ }
+
+ @Override
+ public boolean isCrowbar() {
+ return false;
+ }
+
+ @Override
+ public boolean isWrench() {
+ return true;
+ }
+
+ @Override
+ public boolean isMinableBlock(Block block, byte aMetaData) {
+ return GTToolHarvestHelper.isAppropriateTool(block, aMetaData, "wrench")
+ || GTToolHarvestHelper.isAppropriateMaterial(block, Material.piston)
+ || block instanceof AEBaseTileBlock
+ || GTToolHarvestHelper.isSpecialBlock(block, Blocks.crafting_table, Blocks.bookshelf)
+ || BehaviourWrench.isVanillaRotatable(block)
+ || GTToolHarvestHelper.isIC2Wrenchable(block);
+ }
+
+ @Override
+ public ItemStack getBrokenItem(ItemStack aStack) {
+ return null;
+ }
+
+ @Override
+ public IIconContainer getIcon(boolean aIsToolHead, ItemStack aStack) {
+ return aIsToolHead ? Textures.ItemIcons.WRENCH : null;
+ }
+
+ @Override
+ public short[] getRGBa(boolean aIsToolHead, ItemStack aStack) {
+ return aIsToolHead ? getPrimaryMaterial(aStack).mRGBa : null;
+ }
+
+ @Override
+ public void onStatsAddedToTool(MetaGeneratedTool aItem, int aID) {
+ aItem.addItemBehavior(aID, new BehaviourSwitchMode());
+ aItem.addItemBehavior(aID, new BehaviourWrench(100));
+ }
+
+ @Override
+ public IChatComponent getDeathMessage(EntityLivingBase aPlayer, EntityLivingBase aEntity) {
+ return new ChatComponentText(
+ EnumChatFormatting.GREEN + aPlayer.getCommandSenderName()
+ + EnumChatFormatting.WHITE
+ + " threw a Monkey Wrench into the Plans of "
+ + EnumChatFormatting.RED
+ + aEntity.getCommandSenderName()
+ + EnumChatFormatting.WHITE);
+ }
+
+ /**
+ * <p>
+ * holding drop from {@link IWrenchable#getWrenchDrop(EntityPlayer)}
+ * </p>
+ * Since no tile available during
+ * {@link #convertBlockDrops(List, ItemStack, EntityPlayer, Block, int, int, int, byte, int, boolean, BlockEvent.HarvestDropsEvent)},
+ * this is filled during
+ * {@link #onBreakBlock(EntityPlayer, int, int, int, Block, byte, TileEntity, BlockEvent.BreakEvent)}
+ */
+ private ItemStack wrenchableDrop = null;
+ /**
+ * <p>
+ * drop rate from {@link IWrenchable#getWrenchDropRate()}
+ * </p>
+ * see {@link #wrenchableDrop}
+ */
+ private float wrenchableDropRate = 0.0f;
+
+ /**
+ * <p>
+ * prevent recursion from
+ * {@link AEBaseTileBlock#onBlockActivated(World, int, int, int, EntityPlayer, int, float, float, float)}
+ * </p>
+ */
+ private boolean LastEventFromThis = false;
+
+ @Override
+ public void onBreakBlock(@Nonnull EntityPlayer player, int x, int y, int z, @Nonnull Block block, byte metadata,
+ TileEntity tile, @Nonnull BlockEvent.BreakEvent event) {
+ if (tile instanceof IWrenchable wrenchable) {
+ if (!wrenchable.wrenchCanRemove(player)) {
+ event.setCanceled(true);
+ return;
+ }
+ wrenchableDrop = wrenchable.getWrenchDrop(player);
+ wrenchableDropRate = wrenchable.getWrenchDropRate();
+ }
+ if (block instanceof AEBaseTileBlock aeBaseTileBlock) {
+ if (LastEventFromThis) {
+ return;
+ }
+ final boolean sneak = player.isSneaking();
+ try {
+ LastEventFromThis = true;
+ player.setSneaking(true);
+ final MovingObjectPosition movObjPosition = Platform.rayTrace(player, true, false);
+ if (movObjPosition == null) {
+ event.setCanceled(true);
+ return;
+ }
+
+ final int sideHit = movObjPosition.sideHit;
+ if (tile instanceof IPartHost) {
+ if (sneak && PartPlacement.place(
+ player.getHeldItem(),
+ x,
+ y,
+ z,
+ sideHit,
+ player,
+ player.worldObj,
+ PartPlacement.PlaceType.INTERACT_FIRST_PASS,
+ 0)) {
+ event.setCanceled(true);
+ }
+ return;
+ }
+ if (aeBaseTileBlock.onBlockActivated(event.world, x, y, z, player, sideHit, x, y, z)) {
+ event.setCanceled(true);
+ }
+ } finally {
+ LastEventFromThis = false;
+ player.setSneaking(sneak);
+ }
+ }
+ }
+
+ @Override
+ public int convertBlockDrops(List<ItemStack> drops, ItemStack Stack, EntityPlayer player, Block block, int x, int y,
+ int z, byte metaData, int fortune, boolean silkTouch, BlockEvent.HarvestDropsEvent event) {
+ ItemStack drop = null;
+ int modified = 0;
+ if (wrenchableDrop != null) {
+ drop = wrenchableDrop;
+ wrenchableDrop = null;
+ modified = wrenchableDropRate == 1.0f ? 3 : 10;
+ wrenchableDropRate = 0.0f;
+ } else if (block == Blocks.bookshelf || block == Blocks.ender_chest) {
+ drop = new ItemStack(block);
+ modified = 1;
+ }
+
+ if (drop != null) {
+ event.dropChance = 1.0f;
+ drops.clear();
+ drops.add(drop);
+ }
+ return modified;
+ }
+
+ @Override
+ public byte getMaxMode() {
+ return 2;
+ }
+
+ @Override
+ public String getToolTypeName() {
+ return "wrench";
+ }
+}