package ttftcuts.physis.common.block;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.Random;
import java.util.Map.Entry;
import ttftcuts.physis.Physis;
import ttftcuts.physis.api.item.ITrowel;
import ttftcuts.physis.client.render.RenderDigSite;
import ttftcuts.physis.client.texture.DigStripTexture;
import ttftcuts.physis.common.PhysisItems;
import ttftcuts.physis.common.block.tile.DigSiteLocale;
import ttftcuts.physis.common.block.tile.DigSiteRenderLayer;
import ttftcuts.physis.common.block.tile.TileEntityDigSite;
import ttftcuts.physis.common.helper.TextureHelper;
import cpw.mods.fml.relauncher.Side;
import cpw.mods.fml.relauncher.SideOnly;
import net.minecraft.block.Block;
import net.minecraft.block.material.Material;
import net.minecraft.client.renderer.texture.IIconRegister;
import net.minecraft.client.renderer.texture.TextureMap;
import net.minecraft.creativetab.CreativeTabs;
import net.minecraft.entity.EntityLivingBase;
import net.minecraft.entity.player.EntityPlayer;
import net.minecraft.item.Item;
import net.minecraft.item.ItemStack;
import net.minecraft.nbt.NBTTagCompound;
import net.minecraft.nbt.NBTTagList;
import net.minecraft.nbt.NBTTagString;
import net.minecraft.tileentity.TileEntity;
import net.minecraft.util.IIcon;
import net.minecraft.util.ResourceLocation;
import net.minecraft.world.IBlockAccess;
import net.minecraft.world.World;
public class BlockDigSite extends BlockContainerPhysis {
public static ResourceLocation blankTexture = new ResourceLocation(Physis.MOD_ID, "textures/items/journal.png");
public static Map<String, DigSiteLocale> locales;
static {
locales = new HashMap<String, DigSiteLocale>();
locales.put("dirt", new DigSiteLocale("dirt", "dirt", "dig", Material.ground, Block.soundTypeGravel,
"square", "triangle", "circle", 0xFF0000, 0x80FF80, 0x000080));
locales.put("sand", new DigSiteLocale("sand", "sand", "dig", Material.sand, Block.soundTypeSand,
"square", "triangle", "circle", 0xFF0000, 0x80FF80, 0x000080));
locales.put("clay", new DigSiteLocale("clay", "clay", "dig", Material.ground, Block.soundTypeGravel,
"square", "triangle", "circle", 0xFF0000, 0x80FF80, 0x000080));
}
public static Map<String,ResourceLocation> artifacts;
static {
artifacts = new HashMap<String,ResourceLocation>();
artifacts.put("testobject", new ResourceLocation(Physis.MOD_ID, "textures/blocks/digsite/testobject.png"));
}
public static Map<String,ResourceLocation> digtextures;
static {
digtextures = new HashMap<String,ResourceLocation>();
digtextures.put("dig", new ResourceLocation(Physis.MOD_ID, "textures/blocks/digsite/testdig.png"));
}
public IIcon testicon;
public IIcon transparent;
public final DigSiteLocale locale;
public BlockDigSite(String localename) {
super(locales.get(localename).material);
this.setCreativeTab(Physis.digsiteTab);
this.locale = locales.get(localename);
this.setStepSound(locale.sounds);
this.setHardness(4.0F);
this.setResistance(10.0F);
this.setBlockName("digsite."+locale.name);
}
@Override
public boolean renderAsNormalBlock() {
return false;
}
@Override
public int getRenderType() {
return RenderDigSite.renderid;
}
@SuppressWarnings({ "rawtypes", "unchecked" })
@Override
@SideOnly(Side.CLIENT)
public void getSubBlocks(Item item, CreativeTabs tab, List subtypes)
{
for (int i = 0; i < 10; ++i)
{
ItemStack stack = new ItemStack(this, 1, 0);
NBTTagCompound tag = new NBTTagCompound();
NBTTagCompound display = new NBTTagCompound();
tag.setTag("display", display);
NBTTagList lore = new NBTTagList();
lore.appendTag(new NBTTagString("Level "+(i+1)));
display.setTag("Lore", lore);
tag.setInteger(TileEntityDigSite.LEVELTAG, i);
stack.setTagCompound(tag);
subtypes.add(stack);
}
}
@Override
public TileEntity createNewTileEntity(World world, int meta) {
return new TileEntityDigSite();
}
@Override
@SideOnly(Side.CLIENT)
public IIcon getIcon(int side, int meta) {
//meta = Math.min(meta, locales.length-1);
return this.locale.icons.get("testobject")[0];
}
@Override
@SideOnly(Side.CLIENT)
public IIcon getIcon(IBlockAccess world, int x, int y, int z, int side)
{
TileEntity btile = world.getTileEntity(x, y, z);
//int meta = world.getBlockMetadata(x, y, z);
if (btile != null && btile instanceof TileEntityDigSite)
{
TileEntityDigSite tile = (TileEntityDigSite)btile;
int renderlayer = tile.renderlayer;
if (renderlayer == 0) {
int i = tile.getDigFrame();
return this.locale.icons.get("testobject")[i];
} else {
DigSiteRenderLayer r = tile.renderdata.get(renderlayer-1);
if ( r != null) {
if (r.shapes[side] == -1) { return transparent; }
return this.locale.shapes[r.shapes[side]][r.positions[side]];
}
return testicon;
}
}
return this.getIcon(side, 0);
}
@Override
@SideOnly(Side.CLIENT)
public int colorMultiplier(IBlockAccess world, int x, int y, int z)
{
TileEntity btile = world.getTileEntity(x, y, z);
if (btile != null && btile instanceof TileEntityDigSite) {
TileEntityDigSite tile = (TileEntityDigSite)btile;
int renderlayer = tile.renderlayer;
if (renderlayer != 0) {
DigSiteRenderLayer r = tile.renderdata.get(renderlayer-1);
if ( r != null) {
return this.locale.colours[r.colour];
}
}
}
return 0xFFFFFF;
}
public static String getDigTextureName(String dig, String dug) {
return "physis_digsite_dig_" + dig + "_" + dug;
}
@Override
@SideOnly(Side.CLIENT)
public void registerBlockIcons(IIconRegister register)
{
if (register instanceof TextureMap) {
TextureMap map = (TextureMap) register;
int n = DigStripTexture.numFrames;
for (Entry<String, ResourceLocation> art : artifacts.entrySet()) {
for (Entry<String, ResourceLocation> dig : digtextures.entrySet()) {
ResourceLocation[] digtex = new ResourceLocation[n];
for (int i=0; i<n; i++) {
String name = getDigTextureName(dig.getKey(), art.getKey()) + "_" + i;
digtex[i] = TextureHelper.loadTexture(name, new DigStripTexture(name, dig.getValue(), art.getValue(), i));
}
}
for(Entry<String,DigSiteLocale> entry : locales.entrySet()) {
DigSiteLocale locale = entry.getValue();
locale.addIconSet(map, art.getKey());
}
}
String shapepath = Physis.MOD_ID+":digsite/shapes/";
for(Entry<String,DigSiteLocale> entry : locales.entrySet()) {
DigSiteLocale locale = entry.getValue();
IIcon[] s1 = new IIcon[8];
IIcon[] s2 = new IIcon[8];
IIcon[] s3 = new IIcon[8];
for(int i=0; i<8; i++) {
s1[i] = register.registerIcon(shapepath+locale.shapename1+i);
s2[i] = register.registerIcon(shapepath+locale.shapename2+i);
s3[i] = register.registerIcon(shapepath+locale.shapename3+i);
}
IIcon[][] s = {s1,s2,s3};
locale.shapes = s;
}
}
testicon = register.registerIcon("physis:digsite/testmarking");
transparent = register.registerIcon("physis:transparent");
}
@Override
public void onBlockPlacedBy(World world, int x, int y, int z, EntityLivingBase player, ItemStack stack)
{
TileEntity tile = world.getTileEntity(x, y, z);
if (tile != null && tile instanceof TileEntityDigSite) {
if(stack.hasTagCompound()) {
NBTTagCompound tag = stack.getTagCompound();
if (tag.hasKey(TileEntityDigSite.LEVELTAG)) {
((TileEntityDigSite)tile).onPlaced(tag.getInteger(TileEntityDigSite.LEVELTAG));
}
}
}
}
@Override
public boolean onBlockActivated(World world, int x, int y, int z, EntityPlayer player, int side, float px, float py, float pz)
{
ItemStack held = player.getHeldItem();
TileEntity btile = world.getTileEntity(x, y, z);
if (held != null && held.getItem() instanceof ITrowel) {
if (btile != null && btile instanceof TileEntityDigSite) {
TileEntityDigSite tile = (TileEntityDigSite)btile;
return tile.onActivation(world, player, side);
}
}
return false;
}
@Override
public Item getItemDropped(int p_149650_1_, Random p_149650_2_, int p_149650_3_)
{
return PhysisItems.component;
}
@Override
public int quantityDroppedWithBonus(int bonus, Random rand)
{
return this.quantityDropped(rand) + (bonus > 0 ? Math.max(0, rand.nextInt(bonus)-2) : 0);
}
@Override
public int quantityDropped(Random rand)
{
return 1;
}
@Override
public int damageDropped(int meta)
{
return 0;
}
}