package blusunrize.immersiveengineering.common.blocks.stone;
import blusunrize.immersiveengineering.api.Lib;
import blusunrize.immersiveengineering.common.blocks.IEBlockInterfaces.IBlockOverlayText;
import blusunrize.immersiveengineering.common.blocks.IEBlockInterfaces.IDirectionalTile;
import blusunrize.immersiveengineering.common.blocks.IEBlockInterfaces.IPlayerInteraction;
import blusunrize.immersiveengineering.common.blocks.IEBlockInterfaces.ITileDrop;
import blusunrize.immersiveengineering.common.blocks.TileEntityIEBase;
import blusunrize.immersiveengineering.common.util.ItemNBTHelper;
import net.minecraft.block.state.IBlockState;
import net.minecraft.client.resources.I18n;
import net.minecraft.entity.EntityLivingBase;
import net.minecraft.entity.item.EntityItem;
import net.minecraft.entity.player.EntityPlayer;
import net.minecraft.init.Items;
import net.minecraft.item.ItemMap;
import net.minecraft.item.ItemStack;
import net.minecraft.nbt.NBTTagCompound;
import net.minecraft.util.EnumFacing;
import net.minecraft.util.EnumHand;
import net.minecraft.util.math.RayTraceResult;
import net.minecraft.util.math.Vec4b;
import net.minecraft.util.text.ITextComponent;
import net.minecraft.util.text.TextComponentString;
import net.minecraft.util.text.TextComponentTranslation;
import net.minecraft.util.text.TextFormatting;
import net.minecraft.world.World;
import net.minecraft.world.storage.MapData;
import net.minecraftforge.common.DimensionManager;
import javax.annotation.Nullable;
import java.util.Locale;
public class TileEntityCoresample extends TileEntityIEBase implements IDirectionalTile, ITileDrop, IPlayerInteraction, IBlockOverlayText
{
public ItemStack coresample;
public EnumFacing facing = EnumFacing.NORTH;
@Override
public void readCustomNBT(NBTTagCompound nbt, boolean descPacket)
{
coresample = ItemStack.loadItemStackFromNBT(nbt.getCompoundTag("coresample"));
facing = EnumFacing.getFront(nbt.getInteger("facing"));
}
@Override
public void writeCustomNBT(NBTTagCompound nbt, boolean descPacket)
{
nbt.setTag("coresample", coresample.writeToNBT(new NBTTagCompound()));
nbt.setInteger("facing", facing.ordinal());
}
@Override
public EnumFacing getFacing()
{
return facing;
}
@Override
public void setFacing(EnumFacing facing)
{
this.facing = facing;
}
@Override
public int getFacingLimitation()
{
return 2;
}
@Override
public boolean mirrorFacingOnPlacement(EntityLivingBase placer)
{
return true;
}
@Override
public boolean canHammerRotate(EnumFacing side, float hitX, float hitY, float hitZ, EntityLivingBase entity)
{
return true;
}
@Override
public boolean canRotate(EnumFacing axis)
{
return true;
}
@Override
public boolean interact(EnumFacing side, EntityPlayer player, EnumHand hand, ItemStack heldItem, float hitX, float hitY, float hitZ)
{
if(player.isSneaking())
{
if(!getWorld().isRemote)
{
EntityItem entityitem = new EntityItem(getWorld(), getPos().getX()+.5,getPos().getY()+.5,getPos().getZ()+.5, getTileDrop(player, getWorld().getBlockState(getPos())));
entityitem.setDefaultPickupDelay();
getWorld().setBlockToAir(getPos());
getWorld().spawnEntityInWorld(entityitem);
}
return true;
}
else if(heldItem!=null && heldItem.getItem()==Items.FILLED_MAP && ItemNBTHelper.hasKey(coresample, "coords"))
{
if(!getWorld().isRemote)
{
MapData mapData = ((ItemMap)heldItem.getItem()).getMapData(heldItem, player.getEntityWorld());
if(mapData!=null)
{
int[] coords = ItemNBTHelper.getIntArray(coresample, "coords");
String ident = "ie:coresample_"+coords[0]+";"+coords[1]+";"+coords[2];
if(mapData.mapDecorations.containsKey(ident))
{
mapData.mapDecorations.remove(ident);
return true;
}
double sampleX = coords[1]*16+8.5;
double sampleZ = coords[2]*16+8.5;
int mapScale = 1<<mapData.scale;
float distX = (float)(sampleX-mapData.xCenter)/(float)mapScale;
float distZ = (float)(sampleZ-mapData.zCenter)/(float)mapScale;
byte mapX = (byte)((int)((double)(distX*2.0F)+0.5D));
byte mapZ = (byte)((int)((double)(distZ*2.0F)+0.5D));
byte b2 = (byte)8;
if(distX >= -63&&distX <= 63&&distZ >= -63&&distZ <= 63)
mapData.mapDecorations.put(ident, new Vec4b((byte)5, mapX, mapZ, b2));
else
player.addChatMessage(new TextComponentTranslation(Lib.CHAT_INFO+"coresample.mapFail"));
}
}
return true;
}
return false;
}
@Override
@Nullable
public ITextComponent getDisplayName()
{
return coresample.hasDisplayName()?new TextComponentString(coresample.getDisplayName()) : new TextComponentTranslation("item.immersiveengineering.coresample.name");
}
@Override
public ItemStack getTileDrop(EntityPlayer player, IBlockState state)
{
return this.coresample;
}
@Override
public void readOnPlacement(EntityLivingBase placer, ItemStack stack)
{
this.coresample = stack.copy();
}
@Override
public boolean preventInventoryDrop()
{
return true;
}
private String[] overlay = null;
@Override
public String[] getOverlayText(EntityPlayer player, RayTraceResult mop, boolean hammer)
{
if(coresample!=null && ItemNBTHelper.hasKey(coresample, "coords"))
{
if(overlay==null)
{
overlay = new String[3];
int[] coords = ItemNBTHelper.getIntArray(coresample, "coords");
overlay[0] = I18n.format(Lib.CHAT_INFO+"coresample.noMineral");
if(ItemNBTHelper.hasKey(coresample, "mineral"))
{
String mineral = ItemNBTHelper.getString(coresample, "mineral");
String unloc = Lib.DESC_INFO+"mineral."+mineral;
String loc = I18n.format(unloc);
overlay[0] = TextFormatting.GOLD+I18n.format(Lib.CHAT_INFO+"coresample.mineral", (unloc.equals(loc)?mineral: loc));
}
World world = DimensionManager.getWorld(coords[0]);
String s0 = (coords[1]*16)+", "+(coords[2]*16);
String s1 = (coords[1]*16+16)+", "+(coords[2]*16+16);
if(world!=null&&world.provider!=null)
{
String name = world.provider.getDimensionType().getName();
if(name.toLowerCase(Locale.ENGLISH).startsWith("the "))
name = name.substring(4);
overlay[1] = name;
}
else
overlay[1] = "Dimension "+coords[0];
overlay[2] = I18n.format(Lib.CHAT_INFO+"coresample.pos", s0, s1, "");
}
return overlay;
}
return new String[0];
}
@Override
public boolean useNixieFont(EntityPlayer player, RayTraceResult mop)
{
return false;
}
}