package com.amadornes.framez.util;
import net.minecraft.block.Block;
import net.minecraft.entity.player.EntityPlayer;
import net.minecraft.item.ItemStack;
import net.minecraft.tileentity.TileEntity;
import net.minecraft.util.MovingObjectPosition;
import net.minecraft.util.MovingObjectPosition.MovingObjectType;
import net.minecraft.world.World;
import net.minecraftforge.common.util.ForgeDirection;
import net.minecraftforge.event.entity.player.PlayerInteractEvent;
import net.minecraftforge.event.entity.player.PlayerInteractEvent.Action;
import uk.co.qmunity.lib.raytrace.RayTracer;
import com.amadornes.framez.Framez;
import com.amadornes.framez.api.IDebuggable;
import com.amadornes.framez.api.IFramezWrench;
import com.amadornes.framez.api.IFramezWrench.WrenchAction;
import com.amadornes.framez.compat.CompatibilityUtils;
import com.amadornes.framez.tile.TileMotor;
import cpw.mods.fml.common.eventhandler.SubscribeEvent;
public class WrenchUtils {
public static WrenchAction getWrenchAction(ItemStack stack) {
if (stack == null)
return null;
if (stack.getItem() == null)
return null;
if (stack.getItem() instanceof IFramezWrench)
return ((IFramezWrench) stack.getItem()).getWrenchAction(stack);
return CompatibilityUtils.getWrenchAction(stack);
}
@SubscribeEvent
public void onItemUse(PlayerInteractEvent event) {
if (event.action == Action.LEFT_CLICK_BLOCK)
return;
if (event.entityPlayer == null)
return;
World world = event.world;
int x = event.x;
int y = event.y;
int z = event.z;
int side = event.face;
EntityPlayer player = event.entityPlayer;
ItemStack stack = event.entityPlayer.getHeldItem();
MovingObjectPosition mop = world.rayTraceBlocks(RayTracer.instance().getStartVector(player).toVec3(), RayTracer.instance()
.getEndVector(player).toVec3());
WrenchAction a = getWrenchAction(stack);
if (a == null)
return;
if (a == WrenchAction.ROTATE && mop != null && mop.typeOfHit == MovingObjectType.BLOCK) {
TileEntity te = world.getTileEntity(x, y, z);
if (te != null && te instanceof TileMotor && ((TileMotor) te).rotate(ForgeDirection.getOrientation(side))) {
player.swingItem();
event.setCanceled(!world.isRemote);
return;
} else if (world.getBlock(x, y, z).rotateBlock(world, x, y, z, ForgeDirection.getOrientation(side))) {
event.setCanceled(!world.isRemote);
return;
}
}
if (a == WrenchAction.DEBUG && mop != null && mop.typeOfHit == MovingObjectType.BLOCK) {
IDebuggable debuggable = findDebuggable(world, x, y, z);
if (debuggable != null) {
if (debuggable.debug(world, x, y, z, ForgeDirection.getOrientation(side), player)) {
player.swingItem();
event.setCanceled(true);
return;
}
}
}
if (a == WrenchAction.CONFIG) {
if (player.isSneaking() || mop == null || mop.typeOfHit == MovingObjectType.MISS) {
player.swingItem();
player.openGui(Framez.instance, 0, world, x, y, z);
event.setCanceled(true);
return;
} else if (mop != null && mop.typeOfHit == MovingObjectType.BLOCK) {
TileEntity te = world.getTileEntity(x, y, z);
if (te != null && te instanceof TileMotor) {
player.swingItem();
player.openGui(Framez.instance, 1, world, x, y, z);
event.setCanceled(true);
return;
}
}
}
}
private IDebuggable findDebuggable(World world, int x, int y, int z) {
Block b = world.getBlock(x, y, z);
if (b instanceof IDebuggable)
return (IDebuggable) b;
TileEntity te = world.getTileEntity(x, y, z);
if (te != null && te instanceof IDebuggable)
return (IDebuggable) te;
return null;
}
}