/*
* Copyright (c) CovertJaguar, 2014 http://railcraft.info
*
* This code is the property of CovertJaguar
* and may only be used with explicit written
* permission unless otherwise specified on the
* license page at http://railcraft.info/wiki/info:license.
*/
package mods.railcraft.common.blocks.aesthetics;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import mods.railcraft.client.sounds.RailcraftSound;
import mods.railcraft.common.blocks.aesthetics.brick.BlockBrick;
import mods.railcraft.common.blocks.aesthetics.brick.EnumBrick;
import mods.railcraft.common.blocks.aesthetics.cube.BlockCube;
import mods.railcraft.common.blocks.aesthetics.cube.EnumCube;
import net.minecraft.block.Block;
import net.minecraft.block.Block.SoundType;
import net.minecraft.entity.Entity;
import net.minecraft.init.Blocks;
import net.minecraft.item.ItemStack;
import net.minecraft.util.IIcon;
import net.minecraft.world.World;
/**
*
* @author CovertJaguar <http://www.railcraft.info>
*/
public enum EnumBlockMaterial implements IDerivedBlock {
SANDY_BRICK,
INFERNAL_BRICK,
CONCRETE,
SNOW,
ICE,
PACKED_ICE,
IRON,
GOLD,
DIAMOND,
FROSTBOUND_BRICK,
QUARRIED_BRICK,
BLEACHEDBONE_BRICK,
BLOODSTAINED_BRICK,
ABYSSAL_BRICK,
SANDY_FITTED,
INFERNAL_FITTED,
FROSTBOUND_FITTED,
QUARRIED_FITTED,
BLEACHEDBONE_FITTED,
BLOODSTAINED_FITTED,
ABYSSAL_FITTED,
NETHER_FITTED,
SANDY_BLOCK,
INFERNAL_BLOCK,
FROSTBOUND_BLOCK,
QUARRIED_BLOCK,
BLEACHEDBONE_BLOCK,
BLOODSTAINED_BLOCK,
ABYSSAL_BLOCK,
NETHER_BLOCK,
SANDY_COBBLE,
INFERNAL_COBBLE,
FROSTBOUND_COBBLE,
QUARRIED_COBBLE,
BLEACHEDBONE_COBBLE,
BLOODSTAINED_COBBLE,
ABYSSAL_COBBLE,
NETHER_COBBLE,
CREOSOTE,
OBSIDIAN,
COPPER,
TIN,
LEAD,
STEEL;
public static final EnumBlockMaterial[] VALUES = values();
public static final Map<String, EnumBlockMaterial> NAMES = new HashMap<String, EnumBlockMaterial>();
public static final List<EnumBlockMaterial> creativeList = new ArrayList<EnumBlockMaterial>();
private static boolean needsInit = true;
private SoundType sound;
private Block source;
private int sourceMeta = 0;
private String oreTag = null;
private String toolClass = "pickaxe";
private int toolLevel = 0;
public static void initialize() {
if (!needsInit)
return;
needsInit = false;
INFERNAL_BRICK.source = EnumBrick.INFERNAL.getBlock();
SANDY_BRICK.source = EnumBrick.SANDY.getBlock();
FROSTBOUND_BRICK.source = EnumBrick.FROSTBOUND.getBlock();
QUARRIED_BRICK.source = EnumBrick.QUARRIED.getBlock();
BLEACHEDBONE_BRICK.source = EnumBrick.BLEACHEDBONE.getBlock();
BLOODSTAINED_BRICK.source = EnumBrick.BLOODSTAINED.getBlock();
ABYSSAL_BRICK.source = EnumBrick.ABYSSAL.getBlock();
SANDY_FITTED.source = EnumBrick.SANDY.getBlock();
SANDY_FITTED.sourceMeta = 1;
INFERNAL_FITTED.source = EnumBrick.INFERNAL.getBlock();
INFERNAL_FITTED.sourceMeta = 1;
FROSTBOUND_FITTED.source = EnumBrick.FROSTBOUND.getBlock();
FROSTBOUND_FITTED.sourceMeta = 1;
QUARRIED_FITTED.source = EnumBrick.QUARRIED.getBlock();
QUARRIED_FITTED.sourceMeta = 1;
BLEACHEDBONE_FITTED.source = EnumBrick.BLEACHEDBONE.getBlock();
BLEACHEDBONE_FITTED.sourceMeta = 1;
BLOODSTAINED_FITTED.source = EnumBrick.BLOODSTAINED.getBlock();
BLOODSTAINED_FITTED.sourceMeta = 1;
ABYSSAL_FITTED.source = EnumBrick.ABYSSAL.getBlock();
ABYSSAL_FITTED.sourceMeta = 1;
NETHER_FITTED.source = EnumBrick.NETHER.getBlock();
NETHER_FITTED.sourceMeta = 1;
SANDY_BLOCK.source = EnumBrick.SANDY.getBlock();
SANDY_BLOCK.sourceMeta = 2;
INFERNAL_BLOCK.source = EnumBrick.INFERNAL.getBlock();
INFERNAL_BLOCK.sourceMeta = 2;
FROSTBOUND_BLOCK.source = EnumBrick.FROSTBOUND.getBlock();
FROSTBOUND_BLOCK.sourceMeta = 2;
QUARRIED_BLOCK.source = EnumBrick.QUARRIED.getBlock();
QUARRIED_BLOCK.sourceMeta = 2;
BLEACHEDBONE_BLOCK.source = EnumBrick.BLEACHEDBONE.getBlock();
BLEACHEDBONE_BLOCK.sourceMeta = 2;
BLOODSTAINED_BLOCK.source = EnumBrick.BLOODSTAINED.getBlock();
BLOODSTAINED_BLOCK.sourceMeta = 2;
ABYSSAL_BLOCK.source = EnumBrick.ABYSSAL.getBlock();
ABYSSAL_BLOCK.sourceMeta = 2;
NETHER_BLOCK.source = EnumBrick.NETHER.getBlock();
NETHER_BLOCK.sourceMeta = 2;
SANDY_COBBLE.source = EnumBrick.SANDY.getBlock();
SANDY_COBBLE.sourceMeta = 5;
INFERNAL_COBBLE.source = EnumBrick.INFERNAL.getBlock();
INFERNAL_COBBLE.sourceMeta = 5;
FROSTBOUND_COBBLE.source = EnumBrick.FROSTBOUND.getBlock();
FROSTBOUND_COBBLE.sourceMeta = 5;
QUARRIED_COBBLE.source = EnumBrick.QUARRIED.getBlock();
QUARRIED_COBBLE.sourceMeta = 5;
BLEACHEDBONE_COBBLE.source = EnumBrick.BLEACHEDBONE.getBlock();
BLEACHEDBONE_COBBLE.sourceMeta = 5;
BLOODSTAINED_COBBLE.source = EnumBrick.BLOODSTAINED.getBlock();
BLOODSTAINED_COBBLE.sourceMeta = 5;
ABYSSAL_COBBLE.source = EnumBrick.ABYSSAL.getBlock();
ABYSSAL_COBBLE.sourceMeta = 5;
NETHER_COBBLE.source = EnumBrick.NETHER.getBlock();
NETHER_COBBLE.sourceMeta = 5;
CONCRETE.source = BlockCube.getBlock();
CONCRETE.sourceMeta = EnumCube.CONCRETE_BLOCK.ordinal();
CREOSOTE.source = BlockCube.getBlock();
CREOSOTE.sourceMeta = EnumCube.CREOSOTE_BLOCK.ordinal();
SNOW.source = Blocks.snow;
SNOW.toolClass = "shovel";
ICE.source = Blocks.ice;
PACKED_ICE.source = Blocks.packed_ice;
IRON.source = Blocks.iron_block;
GOLD.source = Blocks.gold_block;
DIAMOND.source = Blocks.diamond_block;
OBSIDIAN.source = Blocks.obsidian;
COPPER.source = BlockCube.getBlock();
COPPER.sourceMeta = EnumCube.COPPER_BLOCK.ordinal();
COPPER.oreTag = "blockCopper";
TIN.source = BlockCube.getBlock();
TIN.sourceMeta = EnumCube.TIN_BLOCK.ordinal();
TIN.oreTag = "blockTin";
LEAD.source = BlockCube.getBlock();
LEAD.sourceMeta = EnumCube.LEAD_BLOCK.ordinal();
LEAD.oreTag = "blockLead";
STEEL.source = BlockCube.getBlock();
STEEL.sourceMeta = EnumCube.STEEL_BLOCK.ordinal();
STEEL.oreTag = "blockSteel";
for (EnumBlockMaterial mat : VALUES) {
NAMES.put(mat.name(), mat);
switch (mat) {
case CONCRETE:
mat.sound = Block.soundTypeStone;
break;
case CREOSOTE:
mat.sound = Block.soundTypeWood;
break;
case COPPER:
case TIN:
case LEAD:
case STEEL:
mat.sound = Block.soundTypeMetal;
break;
default:
mat.sound = mat.source.stepSound;
}
if (mat.sound == RailcraftSound.getInstance())
throw new RuntimeException("Invalid Sound Defined!");
}
creativeList.add(SNOW);
creativeList.add(ICE);
creativeList.add(PACKED_ICE);
creativeList.add(IRON);
creativeList.add(STEEL);
creativeList.add(COPPER);
creativeList.add(TIN);
creativeList.add(LEAD);
creativeList.add(GOLD);
creativeList.add(DIAMOND);
creativeList.add(OBSIDIAN);
creativeList.add(CONCRETE);
creativeList.add(CREOSOTE);
creativeList.add(ABYSSAL_BRICK);
creativeList.add(ABYSSAL_FITTED);
creativeList.add(ABYSSAL_BLOCK);
creativeList.add(ABYSSAL_COBBLE);
creativeList.add(INFERNAL_BRICK);
creativeList.add(INFERNAL_FITTED);
creativeList.add(INFERNAL_BLOCK);
creativeList.add(INFERNAL_COBBLE);
creativeList.add(BLOODSTAINED_BRICK);
creativeList.add(BLOODSTAINED_FITTED);
creativeList.add(BLOODSTAINED_BLOCK);
creativeList.add(BLOODSTAINED_COBBLE);
creativeList.add(SANDY_BRICK);
creativeList.add(SANDY_FITTED);
creativeList.add(SANDY_BLOCK);
creativeList.add(SANDY_COBBLE);
creativeList.add(BLEACHEDBONE_BRICK);
creativeList.add(BLEACHEDBONE_FITTED);
creativeList.add(BLEACHEDBONE_BLOCK);
creativeList.add(BLEACHEDBONE_COBBLE);
creativeList.add(NETHER_FITTED);
creativeList.add(NETHER_BLOCK);
creativeList.add(NETHER_COBBLE);
creativeList.add(QUARRIED_BRICK);
creativeList.add(QUARRIED_FITTED);
creativeList.add(QUARRIED_BLOCK);
creativeList.add(QUARRIED_COBBLE);
creativeList.add(FROSTBOUND_BRICK);
creativeList.add(FROSTBOUND_FITTED);
creativeList.add(FROSTBOUND_BLOCK);
creativeList.add(FROSTBOUND_COBBLE);
}
public static EnumBlockMaterial fromOrdinal(int id) {
if (id < 0 || id >= VALUES.length)
return VALUES[0];
return VALUES[id];
}
public static EnumBlockMaterial fromName(String name) {
EnumBlockMaterial stair = NAMES.get(name);
if (stair != null)
return stair;
return SANDY_BRICK;
}
public IIcon getIcon(int side) {
return getSourceBlock().getIcon(side, sourceMeta);
}
@Override
public Block getSourceBlock() {
if (source == null) return Blocks.stonebrick;
return source;
}
@Override
public int getSourceMeta() {
return sourceMeta;
}
public String getOreTag() {
return oreTag;
}
public SoundType getSound() {
return sound;
}
public ItemStack getSourceItem() {
if (source == null) return null;
return new ItemStack(source, 1, sourceMeta);
}
public Object getCraftingEquivelent() {
if (oreTag != null) return oreTag;
if (source == null) return null;
return new ItemStack(source, 1, sourceMeta);
}
public boolean isTransparent() {
return this == ICE;
}
public float getBlockHardness(World world, int x, int y, int z) {
switch (this) {
case CONCRETE:
return EnumCube.CONCRETE_BLOCK.getHardness();
case COPPER:
return EnumCube.COPPER_BLOCK.getHardness();
case TIN:
return EnumCube.TIN_BLOCK.getHardness();
case LEAD:
return EnumCube.LEAD_BLOCK.getHardness();
case STEEL:
return EnumCube.STEEL_BLOCK.getHardness();
default:
Block block = getSourceBlock();
if (block == null)
return Blocks.brick_block.getBlockHardness(world, x, y, z);
return block.getBlockHardness(world, x, y, z);
}
}
public float getExplosionResistance(Entity entity) {
switch (this) {
case CONCRETE:
return EnumCube.CONCRETE_BLOCK.getResistance() * 3f / 5f;
case COPPER:
return EnumCube.COPPER_BLOCK.getResistance() * 3f / 5f;
case TIN:
return EnumCube.TIN_BLOCK.getResistance() * 3f / 5f;
case LEAD:
return EnumCube.LEAD_BLOCK.getResistance() * 3f / 5f;
case STEEL:
return EnumCube.STEEL_BLOCK.getResistance() * 3f / 5f;
default:
Block block = getSourceBlock();
if (block == null)
return Blocks.brick_block.getExplosionResistance(entity);
return block.getExplosionResistance(entity);
}
}
}