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 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"));
 }
  private static void saveTank(ItemStack container, FluidTank tank) {
    if (tank.getFluidAmount() > 0) {
      NBTTagCompound itemTag = ItemUtils.getItemTag(container);

      NBTTagCompound tankTag = new NBTTagCompound();
      tank.writeToNBT(tankTag);
      itemTag.setTag(TANK_TAG, tankTag);
    } else {
      container.stackTagCompound = null;
    }
  }
  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);
    }
  }
 public static ItemStack putMetadata(ItemStack stack, Trophy trophy) {
   NBTTagCompound tag = ItemUtils.getItemTag(stack);
   tag.setString(TAG_ENTITY, trophy.name());
   return stack;
 }