/* * 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.ore; import cpw.mods.fml.relauncher.Side; import cpw.mods.fml.relauncher.SideOnly; import mods.railcraft.client.particles.ParticleHelper; import mods.railcraft.client.particles.ParticleHelperCallback; import mods.railcraft.common.blocks.aesthetics.cube.EnumCube; import mods.railcraft.common.carts.EntityTunnelBore; import mods.railcraft.common.core.Railcraft; import mods.railcraft.common.core.RailcraftConfig; import mods.railcraft.common.items.ItemDust; import mods.railcraft.common.items.Metal; import mods.railcraft.common.items.RailcraftItem; import mods.railcraft.common.plugins.forestry.ForestryPlugin; import mods.railcraft.common.plugins.forge.CraftingPlugin; import mods.railcraft.common.plugins.forge.CreativePlugin; import mods.railcraft.common.plugins.forge.HarvestPlugin; import mods.railcraft.common.plugins.forge.RailcraftRegistry; import mods.railcraft.common.util.misc.MiscTools; import net.minecraft.block.Block; import net.minecraft.block.material.Material; import net.minecraft.client.particle.EffectRenderer; import net.minecraft.client.particle.EntityDiggingFX; import net.minecraft.client.renderer.texture.IIconRegister; import net.minecraft.creativetab.CreativeTabs; import net.minecraft.entity.player.EntityPlayer; import net.minecraft.init.Blocks; import net.minecraft.init.Items; import net.minecraft.item.Item; import net.minecraft.item.ItemStack; import net.minecraft.util.IIcon; import net.minecraft.util.MathHelper; import net.minecraft.util.MovingObjectPosition; import net.minecraft.world.IBlockAccess; import net.minecraft.world.World; import net.minecraftforge.common.util.ForgeDirection; import net.minecraftforge.oredict.OreDictionary; import java.util.ArrayList; import java.util.List; import java.util.Random; /** * @author CovertJaguar <http://www.railcraft.info> */ public class BlockOre extends Block { private static final ParticleHelperCallback callback = new ParticleCallback(); public static int renderPass; private static BlockOre instance; private final int renderType; private final Random rand = new Random(); public BlockOre(int renderId) { super(Material.rock); renderType = renderId; setBlockName("railcraft.ore"); setResistance(5); setHardness(3); setStepSound(Block.soundTypeStone); setCreativeTab(CreativePlugin.RAILCRAFT_TAB); } public static BlockOre getBlock() { return instance; } public static void registerBlock() { if (instance == null && RailcraftConfig.isBlockEnabled("ore")) { int renderId = Railcraft.getProxy().getRenderId(); instance = new BlockOre(renderId); RailcraftRegistry.register(instance, ItemOre.class); EntityTunnelBore.addMineableBlock(instance); for (EnumOre ore : EnumOre.values()) { ForestryPlugin.addBackpackItem("miner", ore.getItem()); switch (ore) { case FIRESTONE: HarvestPlugin.setHarvestLevel(instance, ore.ordinal(), "pickaxe", 3); break; case DARK_LAPIS: case POOR_IRON: case POOR_TIN: case POOR_COPPER: HarvestPlugin.setHarvestLevel(instance, ore.ordinal(), "pickaxe", 1); break; default: HarvestPlugin.setHarvestLevel(instance, ore.ordinal(), "pickaxe", 2); } } RailcraftItem.dust.registerItem(); registerOre("oreSulfur", EnumOre.SULFUR); registerOre("oreSaltpeter", EnumOre.SALTPETER); registerOre("oreDiamond", EnumOre.DARK_DIAMOND); registerOre("oreEmerald", EnumOre.DARK_EMERALD); registerOre("oreLapis", EnumOre.DARK_LAPIS); registerOre("oreFirestone", EnumOre.FIRESTONE); registerOre("orePoorCopper", EnumOre.POOR_COPPER); registerOre("orePoorGold", EnumOre.POOR_GOLD); registerOre("orePoorIron", EnumOre.POOR_IRON); registerOre("orePoorTin", EnumOre.POOR_TIN); registerOre("orePoorLead", EnumOre.POOR_LEAD); registerPoorOreRecipe(Metal.COPPER); registerPoorOreRecipe(Metal.GOLD); registerPoorOreRecipe(Metal.IRON); registerPoorOreRecipe(Metal.TIN); registerPoorOreRecipe(Metal.LEAD); } } private static void registerPoorOreRecipe(Metal metal) { CraftingPlugin.addFurnaceRecipe(metal.getPoorOre(), metal.getNugget(2), 0.1F); } private static void registerOre(String name, EnumOre ore) { if (!ore.isDepecriated() && ore.isEnabled()) OreDictionary.registerOre(name, ore.getItem()); } @Override public int getRenderType() { return renderType; } @Override public void getSubBlocks(Item item, CreativeTabs tab, List list) { for (EnumOre ore : EnumOre.values()) { if (!ore.isDepecriated() && ore.isEnabled()) list.add(ore.getItem()); } } @Override public ItemStack getPickBlock(MovingObjectPosition target, World world, int x, int y, int z, EntityPlayer player) { int meta = world.getBlockMetadata(x, y, z); return EnumOre.fromMeta(meta).getItem(); } @Override public void dropBlockAsItemWithChance(World world, int x, int y, int z, int meta, float par6, int fortune) { super.dropBlockAsItemWithChance(world, x, y, z, meta, par6, fortune); switch (EnumOre.fromMeta(meta)) { case SULFUR: case SALTPETER: case DARK_DIAMOND: case DARK_EMERALD: case DARK_LAPIS: { int xp = MathHelper.getRandomIntegerInRange(world.rand, 2, 5); this.dropXpOnBlockBreak(world, x, y, z, xp); } } } @Override public ArrayList<ItemStack> getDrops(World world, int x, int y, int z, int meta, int fortune) { ArrayList<ItemStack> drops = new ArrayList<ItemStack>(); switch (EnumOre.fromMeta(meta)) { case SULFUR: { int qty = 2 + rand.nextInt(4) + rand.nextInt(fortune + 1); drops.add(RailcraftItem.dust.getStack(qty, ItemDust.EnumDust.SULFUR)); return drops; } case SALTPETER: { int qty = 1 + rand.nextInt(2) + rand.nextInt(fortune + 1); drops.add(RailcraftItem.dust.getStack(qty, ItemDust.EnumDust.SALTPETER)); return drops; } case DARK_DIAMOND: { int bonus = rand.nextInt(fortune + 2) - 1; if (bonus < 0) bonus = 0; int qty = 1 * (bonus + 1); drops.add(new ItemStack(Items.diamond, qty)); return drops; } case DARK_EMERALD: { int bonus = rand.nextInt(fortune + 2) - 1; if (bonus < 0) bonus = 0; int qty = 1 * (bonus + 1); drops.add(new ItemStack(Items.emerald, qty)); return drops; } case DARK_LAPIS: { int bonus = rand.nextInt(fortune + 2) - 1; if (bonus < 0) bonus = 0; int qty = (4 + rand.nextInt(5)) * (bonus + 1); drops.add(new ItemStack(Items.dye, qty, 4)); return drops; } default: return super.getDrops(world, x, y, z, meta, fortune); } } @Override public int damageDropped(int meta) { return meta; } @Override public boolean canSilkHarvest(World world, EntityPlayer player, int x, int y, int z, int metadata) { return true; } @Override public void registerBlockIcons(IIconRegister iconRegister) { for (EnumOre ore : EnumOre.VALUES) { if (ore != EnumOre.WATERSTONE) ore.setTexture(iconRegister.registerIcon("railcraft:" + MiscTools.cleanTag(ore.getTag()))); } } @Override public IIcon getIcon(int side, int meta) { if (renderPass == 0) switch (EnumOre.fromMeta(meta)) { case SALTPETER: return Blocks.sandstone.getIcon(ForgeDirection.DOWN.ordinal(), 0); case FIRESTONE: return Blocks.netherrack.getIcon(0, 0); case DARK_DIAMOND: case DARK_EMERALD: case DARK_LAPIS: IIcon icon = EnumCube.ABYSSAL_STONE.getIcon(); if (icon != null) return icon; default: return Blocks.stone.getIcon(side, 0); } return EnumOre.fromMeta(meta).getTexture(side); } @Override public void setBlockBoundsForItemRender() { setBlockBounds(0, 0, 0, 1, 1, 1); } @SideOnly(Side.CLIENT) @Override public boolean addHitEffects(World worldObj, MovingObjectPosition target, EffectRenderer effectRenderer) { return ParticleHelper.addHitEffects(worldObj, instance, target, effectRenderer, callback); } @SideOnly(Side.CLIENT) @Override public boolean addDestroyEffects(World worldObj, int x, int y, int z, int meta, EffectRenderer effectRenderer) { return ParticleHelper.addDestroyEffects(worldObj, instance, x, y, z, meta, effectRenderer, callback); } @Override public int getLightValue(IBlockAccess world, int x, int y, int z) { int meta = world.getBlockMetadata(x, y, z); if (EnumOre.FIRESTONE.ordinal() == meta) return 15; return super.getLightValue(world, x, y, z); } private static class ParticleCallback implements ParticleHelperCallback { @Override @SideOnly(Side.CLIENT) public void addHitEffects(EntityDiggingFX fx, World world, int x, int y, int z, int meta) { setTexture(fx, world, x, y, z, meta); } @Override @SideOnly(Side.CLIENT) public void addDestroyEffects(EntityDiggingFX fx, World world, int x, int y, int z, int meta) { setTexture(fx, world, x, y, z, meta); } @SideOnly(Side.CLIENT) private void setTexture(EntityDiggingFX fx, World world, int x, int y, int z, int meta) { renderPass = 0; fx.setParticleIcon(instance.getIcon(0, meta)); } } }