package com.amadornes.framez.item;
import java.util.Collection;
import net.minecraft.client.Minecraft;
import net.minecraft.client.renderer.texture.IIconRegister;
import net.minecraft.entity.player.EntityPlayer;
import net.minecraft.item.Item;
import net.minecraft.item.ItemStack;
import net.minecraft.tileentity.TileEntity;
import net.minecraft.util.IIcon;
import net.minecraft.world.World;
import net.minecraftforge.client.event.MouseEvent;
import net.minecraftforge.common.MinecraftForge;
import net.minecraftforge.common.util.ForgeDirection;
import com.amadornes.framez.api.IFramezWrench;
import com.amadornes.framez.api.movement.IFrame;
import com.amadornes.framez.api.movement.IMovement;
import com.amadornes.framez.api.movement.IMovement.IMovementRotation;
import com.amadornes.framez.api.movement.IMovement.IMovementSlide;
import com.amadornes.framez.movement.FrameMovementRegistry;
import com.amadornes.framez.network.NetworkHandler;
import com.amadornes.framez.network.PacketWrenchMode;
import com.amadornes.framez.ref.ModInfo;
import com.amadornes.framez.ref.References;
import com.amadornes.framez.tile.TileMotor;
import cpw.mods.fml.common.eventhandler.SubscribeEvent;
import cpw.mods.fml.relauncher.Side;
import cpw.mods.fml.relauncher.SideOnly;
public class ItemWrench extends Item implements IFramezWrench {
@SideOnly(Side.CLIENT)
private IIcon normal, rotate, debug, config;
public ItemWrench() {
setUnlocalizedName(ModInfo.MODID + ":" + References.Item.WRENCH);
setFull3D();
setMaxStackSize(1);
setHarvestLevel("wrench", 0);
MinecraftForge.EVENT_BUS.register(this);
}
@Override
@SideOnly(Side.CLIENT)
public void registerIcons(IIconRegister reg) {
normal = reg.registerIcon(ModInfo.MODID + ":" + References.Texture.WRENCH_NORMAL);
rotate = reg.registerIcon(ModInfo.MODID + ":" + References.Texture.WRENCH_ROTATE);
debug = reg.registerIcon(ModInfo.MODID + ":" + References.Texture.WRENCH_DEBUG);
config = reg.registerIcon(ModInfo.MODID + ":" + References.Texture.WRENCH_CONFIG);
}
@Override
public IIcon getIcon(ItemStack stack, int pass) {
return normal;
}
@Override
public IIcon getIconIndex(ItemStack stack) {
if (stack.getItemDamage() == 0)
return normal;
if (stack.getItemDamage() == 1)
return rotate;
if (stack.getItemDamage() == 2)
return debug;
if (stack.getItemDamage() == 3)
return config;
return super.getIconIndex(stack);
}
@Override
public String getUnlocalizedName(ItemStack stack) {
return super.getUnlocalizedName(stack)
+ (stack.getItemDamage() == 0 ? ".normal" : (stack.getItemDamage() == 1 ? ".rotate"
: (stack.getItemDamage() == 2 ? ".debug" : ".config")));
}
@Override
public WrenchAction getWrenchAction(ItemStack stack) {
if (stack.getItemDamage() == 1)
return WrenchAction.ROTATE;
else if (stack.getItemDamage() == 2)
return WrenchAction.DEBUG;
else if (stack.getItemDamage() == 3)
return WrenchAction.CONFIG;
return null;
}
@Override
public boolean onItemUseFirst(ItemStack stack, EntityPlayer player, World world, int x, int y, int z, int side, float hitX, float hitY,
float hitZ) {
if (stack.getItemDamage() == 0) {
Collection<IFrame> frames = FrameMovementRegistry.instance().findFrames(world, x, y, z);
if (frames != null && frames.size() > 0) {
if (!world.isRemote) {
ForgeDirection d = ForgeDirection.getOrientation(side);
for (IFrame f : frames)
f.setSideHidden(d, !f.isSideHidden(d));
}
player.swingItem();
return !world.isRemote;
}
TileEntity te = world.getTileEntity(x, y, z);
if (te != null && te instanceof TileMotor) {
if (!world.isRemote) {
if (!player.isSneaking()) {
ForgeDirection face = ForgeDirection.getOrientation((((TileMotor) te).getFace().ordinal() + 1) % 6);
((TileMotor) te).setFace(face);
IMovement m = ((TileMotor) te).getMovement();
if (m instanceof IMovementSlide) {
ForgeDirection d = null;
for (ForgeDirection dir : ForgeDirection.VALID_DIRECTIONS) {
if (dir != face && dir != face.getOpposite()) {
d = dir;
break;
}
}
((IMovementSlide) m).setDirection(d);
} else if (m instanceof IMovementRotation)
((IMovementRotation) m).setAxis(face);
} else {
IMovement m = ((TileMotor) te).getMovement();
if (m instanceof IMovementSlide)
((IMovementSlide) m).setDirection(((IMovementSlide) m).getDirection().getRotation(((TileMotor) te).getFace()));
else if (m instanceof IMovementRotation)
((IMovementRotation) m).setAxis(((IMovementRotation) m).getAxis().getOpposite());
}
world.markBlockForUpdate(x, y, z);// FIXME Replace with proper update method
}
player.swingItem();
return !world.isRemote;
} else if (world.getBlock(x, y, z).rotateBlock(world, x, y, z, ForgeDirection.getOrientation(side))) {
return !world.isRemote;
}
}
return false;
}
@SideOnly(Side.CLIENT)
@SubscribeEvent
public void onMouseEvent(MouseEvent event) {
// We only want to process wheel events
if (event.button < 0) {
EntityPlayer entityPlayer = Minecraft.getMinecraft().thePlayer;
if (entityPlayer.isSneaking()) {
ItemStack itemStack = entityPlayer.getHeldItem();
if (itemStack != null && itemStack.getItem() == this) {
if (event.dwheel != 0)
NetworkHandler.instance().sendToServer(new PacketWrenchMode(entityPlayer.inventory.currentItem, event.dwheel < 0));
event.setCanceled(true);
}
}
}
}
}