package openblocks.common.item;
import com.google.common.base.Strings;
import cpw.mods.fml.relauncher.Side;
import cpw.mods.fml.relauncher.SideOnly;
import java.util.List;
import java.util.Map;
import net.minecraft.creativetab.CreativeTabs;
import net.minecraft.entity.player.EntityPlayer;
import net.minecraft.entity.player.EntityPlayerMP;
import net.minecraft.item.Item;
import net.minecraft.item.ItemStack;
import net.minecraft.nbt.NBTTagCompound;
import net.minecraft.util.ChatComponentTranslation;
import net.minecraft.util.StatCollector;
import net.minecraft.world.ChunkPosition;
import net.minecraft.world.World;
import net.minecraft.world.WorldServer;
import openblocks.Config;
import openblocks.OpenBlocks;
import openblocks.common.entity.EntityGoldenEye;
import openmods.Log;
import openmods.utils.ItemUtils;
import openmods.world.StructureRegistry;
public class ItemGoldenEye extends Item {
public static final int MAX_DAMAGE = 100;
private static final String TAG_STRUCTURE = "Structure";
public ItemGoldenEye() {
setMaxDamage(MAX_DAMAGE);
setCreativeTab(OpenBlocks.tabOpenBlocks);
setMaxStackSize(1);
}
@Override
public ItemStack onItemRightClick(ItemStack stack, World world, EntityPlayer player) {
if (world instanceof WorldServer && player instanceof EntityPlayerMP) {
EntityPlayerMP betterPlayer = (EntityPlayerMP)player;
if (player.isSneaking()) tryLearnStructure(stack, (WorldServer)world, betterPlayer);
else {
if (trySpawnEntity(stack, (WorldServer)world, betterPlayer)) stack.stackSize = 0;
}
}
return stack;
}
private static void tryLearnStructure(ItemStack stack, WorldServer world, EntityPlayerMP player) {
Map<String, ChunkPosition> nearbyStructures = StructureRegistry.instance.getNearestStructures(world, (int)player.posX, (int)player.posY, (int)player.posZ);
String structureName = "";
double max = Double.MAX_VALUE;
for (Map.Entry<String, ChunkPosition> e : nearbyStructures.entrySet()) {
ChunkPosition pos = e.getValue();
if (Config.eyeDebug) player.addChatMessage(new ChatComponentTranslation(
"openblocks.misc.structure_pos", e.getKey(), pos.chunkPosX, pos.chunkPosY, pos.chunkPosZ));
double dx = pos.chunkPosX - player.posX;
double dy = pos.chunkPosY - player.posY;
double dz = pos.chunkPosZ - player.posZ;
double dist = (dx * dx) + (dy * dy) + (dz * dz);
if (dist < max) {
max = dist;
structureName = e.getKey();
}
}
if (!Strings.isNullOrEmpty(structureName)) {
Log.info("Learned structure %s, d = %f", structureName, max);
NBTTagCompound tag = ItemUtils.getItemTag(stack);
tag.setString(TAG_STRUCTURE, structureName);
}
}
private static boolean trySpawnEntity(ItemStack stack, WorldServer world, EntityPlayerMP player) {
int damage = stack.getItemDamage();
if (damage >= stack.getMaxDamage()) return false;
NBTTagCompound tag = ItemUtils.getItemTag(stack);
String structureName = tag.getString(TAG_STRUCTURE);
if (Strings.isNullOrEmpty(structureName)) return false;
Map<String, ChunkPosition> nearbyStructures = StructureRegistry.instance.getNearestStructures(world, (int)player.posX, (int)player.posY, (int)player.posZ);
ChunkPosition structurePos = nearbyStructures.get(structureName);
if (structurePos != null) {
if (Config.eyeDebug) player.addChatComponentMessage(new ChatComponentTranslation(
"openblocks.misc.structure_pos", structureName, structurePos.chunkPosX, structurePos.chunkPosY, structurePos.chunkPosZ));
stack.setItemDamage(damage + 1);
EntityGoldenEye eye = new EntityGoldenEye(world, stack, player, structurePos);
world.spawnEntityInWorld(eye);
world.playSoundAtEntity(player, "random.bow", 0.5F, 0.4F / (itemRand.nextFloat() * 0.4F + 0.8F));
return true;
}
return false;
}
@Override
@SideOnly(Side.CLIENT)
@SuppressWarnings({ "rawtypes", "unchecked" })
public void getSubItems(Item item, CreativeTabs tab, List result) {
result.add(new ItemStack(item, 1, 0));
result.add(new ItemStack(item, 1, getMaxDamage()));
}
@Override
@SideOnly(Side.CLIENT)
@SuppressWarnings({ "rawtypes", "unchecked" })
public void addInformation(ItemStack stack, EntityPlayer player, List result, boolean expanded) {
NBTTagCompound tag = ItemUtils.getItemTag(stack);
if (tag.hasKey(TAG_STRUCTURE)) result.add(StatCollector.translateToLocal("openblocks.misc.locked"));
}
}