HomeJavaModsBetter Coal
Better Coal
Better Coal — screenshot 1Better Coal — screenshot 2Better Coal — screenshot 3Better Coal — screenshot 4Better Coal — screenshot 5Better Coal — screenshot 6Better Coal — screenshot 7Better Coal — screenshot 8

Better Coal! Beta 1.7.3

This mod adds in 4 new coals from real life, Torches, and Blocks for each.

This was originally going to be a kind of realistic coal mod then I realized through research that there is actually a lot that goes into coal, their uses, temps, etc. So it just got turn more into a coal overhual.

This mod does require Modloader Beta 1.7.3, ModloaderMP Unofficial v2, and Forge V1.0.6. This video will show you have to navigate MCArchive and how to download those APIs. MCArchive: Best Place To Get Beta 1.7.3 Mods/APIs

Coal Details

Spoiler

Peat

Lignite

Normal Coal

Bituminous

Anthracite

Additional Information: Modloader recipes do not override existing recipes, so in order to get the Normal Torch recipes to produce 8 torches instead of 4, I made an edit to the RecipesCrafting class instead of the CraftingManager class because it is less sufficient in the grand scheme of things.

	public void addRecipes(CraftingManager craftingManager1) {
		craftingManager1.addRecipe(new ItemStack(Block.chest), new Object[]{"###", "# #", "###", '#', Block.planks});
		craftingManager1.addRecipe(new ItemStack(Block.stoneOvenIdle), new Object[]{"###", "# #", "###", '#', Block.cobblestone});
		craftingManager1.addRecipe(new ItemStack(Block.workbench), new Object[]{"##", "##", '#', Block.planks});
		craftingManager1.addRecipe(new ItemStack(Block.sandStone), new Object[]{"##", "##", '#', Block.sand});
		craftingManager1.addRecipe(new ItemStack(Block.torchWood, 8), new Object[]{"X", "#", 'X', Item.coal, '#', Item.stick});
		craftingManager1.addRecipe(new ItemStack(Block.torchWood, 8), new Object[]{"X", "#", 'X', new ItemStack(Item.coal, 1, 1), '#', Item.stick});
	}

For Light Value References a Glowstone Block has a light value of 1.0F being the brightest it gets. In the base game a Torch has the light value of 0.9375F. Which in this mod a regular torch has the light value of 0.7575F. I added the extra torches and changed the light values to give more of a use to the coals.

Generation Code

Spoiler
	public void GenerateSurface(World world, Random random, int chunkX, int chunkZ) {
	      int tries = 10;
	      int vein = 8;

	      int posX;
	      int posY;
	      int posZ;
	      int i;
	      
	      for(i = 0; i < tries; ++i) {
	          posX = chunkX + random.nextInt(16);
	          posY = random.nextInt(128);
	          posZ = chunkZ + random.nextInt(16);
	          (new WorldGenMinable(blockLignite.blockID, vein)).generate(world, random, posX, posY, posZ);
	       }
	      
	      for(i = 0; i < tries; ++i) {
	          posX = chunkX + random.nextInt(16);
	          posY = random.nextInt(64);
	          posZ = chunkZ + random.nextInt(16);
	          (new WorldGenMinable(blockBituminous.blockID, vein)).generate(world, random, posX, posY, posZ);
	       }
	      
	      for(i = 0; i < tries; ++i) {
	          posX = chunkX + random.nextInt(16);
	          posY = random.nextInt(32);
	          posZ = chunkZ + random.nextInt(16);
	          (new WorldGenMinable(blockAnthracite.blockID, vein)).generate(world, random, posX, posY, posZ);
	       }
	}

Because Modloader generation doesn't override base game generation code I had to edit ChunkProviderGenerate to change coal

		for(i13 = 0; i13 < 10; ++i13) {
			i14 = i4 + this.rand.nextInt(16);
			i15 = this.rand.nextInt(96);
			i16 = i5 + this.rand.nextInt(16);
			(new WorldGenMinable(Block.oreCoal.blockID, 8)).generate(this.worldObj, this.rand, i14, i15, i16);
		}

Originally

		for(i13 = 0; i13 < 20; ++i13) {
			i14 = i4 + this.rand.nextInt(16);
			i15 = this.rand.nextInt(128);
			i16 = i5 + this.rand.nextInt(16);
			(new WorldGenMinable(Block.oreCoal.blockID, 16)).generate(this.worldObj, this.rand, i14, i15, i16);
		}

Here is the main mod class, you'll need to download the mod to view the source code of the other classes. This is a straight copy and paste from my work space, I am not fixing it up to make it more legible on here.

Spoiler
package net.minecraft.src;

import forge.Configuration;
import forge.ITextureProvider;
import forge.MinecraftForge;
import forge.MinecraftForgeClient;
import scifi.bettercoal.BlockAnthracite;
import scifi.bettercoal.BlockBetterCoalStorage;
import scifi.bettercoal.BlockBituminous;
import scifi.bettercoal.BlockLignite;
import scifi.bettercoal.BlockTorchAnthracite;
import scifi.bettercoal.BlockTorchBituminous;
import scifi.bettercoal.BlockTorchLignite;
import scifi.bettercoal.BlockTorchPeat;
import scifi.bettercoal.ItemAnthracite;
import scifi.bettercoal.ItemBituminous;
import scifi.bettercoal.ItemLignite;
import scifi.bettercoal.ItemPeat;

import java.io.File;
import java.lang.reflect.Field;
import java.util.Random;

public class mod_BetterCoal extends BaseModMp {
	private static Configuration config;
	public static Item itemAnthracite;
	public static Item itemBituminous;
	public static Item itemLignite;
	public static Item itemPeat;
	public static int anthraciteID = 6543;
	public static int bituminousID = 6544;
	public static int ligniteID = 6545;
	public static int peatID = 6546;
	public static int idAnthracite;
	public static int idBituminous;
	public static int idLignite;
	public static int idAnthraciteTorch;
	public static int idBituminousTorch;
	public static int idLigniteTorch;
	public static int idPeatTorch;
	public static int idAnthraciteBlock;
	public static int idBituminousBlock;
	public static int idCoalBlock;
	public static int idLigniteBlock;
	public static int idPeatBlock;
	public static Block blockAnthracite;
	public static Block blockBituminous;
	public static Block blockLignite;
	public static Block blockAnthraciteTorch;
	public static Block blockBituminousTorch;
	public static Block blockLigniteTorch;
	public static Block blockPeatTorch;
	public static Block blockAnthraciteBlock;
	public static Block blockBituminousBlock;
	public static Block blockCoalBlock;
	public static Block blockLigniteBlock;
	public static Block blockPeatBlock;
	
	public mod_BetterCoal() {
		MinecraftForgeClient.preloadTexture("/scifi/bettercoal/map.png");
		itemAnthracite = new ItemAnthracite(anthraciteID);
		itemBituminous = new ItemBituminous(bituminousID);
		itemLignite = new ItemLignite(ligniteID);
		itemPeat = new ItemPeat(peatID);
		ModLoader.AddName(itemAnthracite, "Anthracite");
		ModLoader.AddName(itemBituminous, "Bituminous");
		ModLoader.AddName(itemLignite, "Lignite");
		ModLoader.AddName(itemPeat, "Peat");
		ModLoader.AddName(blockAnthracite, "Anthracite Ore");
		ModLoader.RegisterBlock(blockAnthracite);
		ModLoader.AddName(blockBituminous, "Bituminous Ore");
		ModLoader.RegisterBlock(blockBituminous);
		ModLoader.AddName(blockLignite, "Lignite Ore");
		ModLoader.RegisterBlock(blockLignite);
		ModLoader.AddName(blockAnthraciteTorch, "Anthracite Torch");
		ModLoader.RegisterBlock(blockAnthraciteTorch);
		ModLoader.AddName(blockBituminousTorch, "Bituminous Torch");
		ModLoader.RegisterBlock(blockBituminousTorch);
		ModLoader.AddName(blockLigniteTorch, "Lignite Torch");
		ModLoader.RegisterBlock(blockLigniteTorch);
		ModLoader.AddName(blockPeatTorch, "Peat Torch");
		ModLoader.RegisterBlock(blockPeatTorch);
		ModLoader.AddName(blockAnthraciteBlock, "Anthracite Block");
		ModLoader.RegisterBlock(blockAnthraciteBlock);
		ModLoader.AddName(blockBituminousBlock, "Bituminous Block");
		ModLoader.RegisterBlock(blockBituminousBlock);
		ModLoader.AddName(blockCoalBlock, "Coal Block");
		ModLoader.RegisterBlock(blockCoalBlock);
		ModLoader.AddName(blockLigniteBlock, "Lignite Block");
		ModLoader.RegisterBlock(blockLigniteBlock);
		ModLoader.AddName(blockPeatBlock, "Peat Block");
		ModLoader.RegisterBlock(blockPeatBlock);
		MinecraftForge.setBlockHarvestLevel(blockAnthracite, "pickaxe", 0);
		MinecraftForge.setBlockHarvestLevel(blockBituminous, "pickaxe", 0);
		MinecraftForge.setBlockHarvestLevel(blockLignite, "pickaxe", 0);
		MinecraftForge.setBlockHarvestLevel(blockAnthraciteBlock, "pickaxe", 0);
		MinecraftForge.setBlockHarvestLevel(blockBituminousBlock, "pickaxe", 0);
		MinecraftForge.setBlockHarvestLevel(blockCoalBlock, "pickaxe", 0);
		MinecraftForge.setBlockHarvestLevel(blockLigniteBlock, "pickaxe", 0);
		MinecraftForge.setBlockHarvestLevel(blockPeatBlock, "axe", 0);
//		ModLoader.AddRecipe(new ItemStack(blockPeatBlock, 64), new Object[]{"Y", 'Y', Block.dirt});
//		ModLoader.AddShapelessRecipe(new ItemStack(itemPeat, 2), new Object[]{Block.pumpkin, Block.pumpkin, Block.pumpkin, Block.pumpkin});
		
		ModLoader.AddRecipe(new ItemStack(blockAnthraciteTorch, 4), new Object[]{"X", "Y", 'X', itemAnthracite, 'Y', Item.stick});
		ModLoader.AddRecipe(new ItemStack(blockBituminousTorch, 6), new Object[]{"X", "Y", 'X', itemBituminous, 'Y', Item.stick});
		ModLoader.AddRecipe(new ItemStack(blockLigniteTorch, 10), new Object[]{"X", "Y", 'X', itemLignite, 'Y', Item.stick});
		ModLoader.AddRecipe(new ItemStack(blockPeatTorch, 12), new Object[]{"X", "Y", 'X', itemPeat, 'Y', Item.stick});
		ModLoader.AddRecipe(new ItemStack(Item.diamond, 1), new Object[]{"XXX", "XXX", "XXX", 'X', blockAnthraciteBlock});
		ModLoader.AddRecipe(new ItemStack(blockAnthraciteBlock, 1), new Object[]{"XX", "XX", 'X', blockBituminousBlock});
		ModLoader.AddRecipe(new ItemStack(blockBituminousBlock, 1), new Object[]{"XX", "XX", 'X', blockCoalBlock});
		ModLoader.AddRecipe(new ItemStack(blockCoalBlock, 1), new Object[]{"XX", "XX", 'X', blockLigniteBlock});
		ModLoader.AddRecipe(new ItemStack(blockLigniteBlock, 1), new Object[]{"XX", "XX", 'X', blockPeatBlock});
		ModLoader.AddRecipe(new ItemStack(blockPeatBlock, 1), new Object[]{"XX", "XX", 'X', itemPeat});
		ModLoader.AddShapelessRecipe(new ItemStack(itemPeat, 4), new Object[]{Item.appleGold, Item.appleGold, Item.appleGold, Item.appleGold});
		ModLoader.AddShapelessRecipe(new ItemStack(Block.cobblestoneMossy, 1), new Object[]{Block.cobblestone, itemPeat, itemPeat, itemPeat, itemPeat});
		ModLoader.AddShapelessRecipe(new ItemStack(itemLignite, 1), new Object[]{itemPeat, itemPeat, itemPeat, itemPeat, itemPeat, itemPeat, itemPeat, itemPeat, itemPeat});
		ModLoader.AddShapelessRecipe(new ItemStack(Item.coal, 1), new Object[]{itemLignite, itemLignite, itemPeat, itemPeat, itemPeat, itemPeat, itemPeat, itemPeat, itemPeat});
		ModLoader.AddShapelessRecipe(new ItemStack(itemBituminous, 1), new Object[]{Item.coal, Item.coal, Item.coal, itemPeat, itemPeat, itemPeat, itemPeat, itemPeat, itemPeat});
		ModLoader.AddShapelessRecipe(new ItemStack(itemAnthracite, 1), new Object[]{itemBituminous, itemBituminous, itemBituminous, itemBituminous, itemPeat, itemPeat, itemPeat, itemPeat, itemPeat});
		
		Object[] itemIDs = new Object[]{Item.appleRed, Block.cactus, Block.deadBush, new ItemStack(Block.leaves, 1, 0), new ItemStack(Block.leaves, 1, 1), new ItemStack(Block.leaves, 1, 2),
				Block.mushroomBrown, Block.mushroomRed, Block.plantYellow, Block.plantRed, Block.pumpkin, Item.reed, Block.reed,
				new ItemStack(Block.sapling, 1, 0), new ItemStack(Block.sapling, 1, 1), new ItemStack(Block.sapling, 1, 2), Item.seeds, Block.tallGrass, Item.wheat};
		//Apple, Cactus, DeadBush, Golden Apple, Leaves, MushroomBrown, MushroomRed, PlanetYellow, PlanetRed, Pumpkin, Reed, Sapling, Seeds, TallGrass, Wheat
		 for(int one = 0; one < itemIDs.length; one++) {
		   for(int two = 0; two < itemIDs.length; two++) {
		     for(int three = 0; three < itemIDs.length; three++) {
		       for(int four = 0; four < itemIDs.length; four++) {
		         ModLoader.AddShapelessRecipe(new ItemStack(itemPeat, 2), new Object[]{itemIDs[one],itemIDs[two],itemIDs[three],itemIDs[four]});
		       }
		     }
		   }
		 }
		 
			Block.blocksList[Block.oreCoal.blockID] = null;
			Block.blocksList[Block.torchWood.blockID] = null;
			Field[] fields = Block.class.getDeclaredFields();

			for(int i = 0; i < fields.length; ++i) {
				Field field = fields[i];

				try {
					Field modifiers;
					if(((Block)field.get((Object)null)).equals(Block.oreCoal)) {
						field.setAccessible(true);
						modifiers = Field.class.getDeclaredField("modifiers");
						modifiers.setAccessible(true);
						modifiers.set(field, field.getModifiers() & -17);
						field.set((Object)null, new OverridenBlockOre());
					}
					
					if(((Block)field.get((Object)null)).equals(Block.torchWood)) {
						field.setAccessible(true);
						modifiers = Field.class.getDeclaredField("modifiers");
						modifiers.setAccessible(true);
						modifiers.set(field, field.getModifiers() & -17);
						field.set((Object)null, new OverridenBlockTorch());
					}

				} catch (Exception exception5) {
				}
			}

			ModLoader.SetInGameHook(this, true, false);
		 
	}

	public String Version() {
		return "v1.0";
	}

	public String Name() {
		return "Better Coal";
	}

	public int AddFuel(int id) {
		if (id == blockAnthraciteBlock.blockID) {
	          return 9600;
	       } else if (id == blockBituminousBlock.blockID) {
	          return 8000;
	       } else if (id == blockCoalBlock.blockID) {
	          return 6400;
	       } else if (id == blockLigniteBlock.blockID) {
	          return 4800;
	       } else if (id == blockPeatBlock.blockID) {
	          return 3200;
	       } else if (id == itemAnthracite.shiftedIndex) {
	          return 2400;
	       } else if (id == itemBituminous.shiftedIndex) {
	          return 2000;
	       } else if (id == itemLignite.shiftedIndex) {
		      return 1200;
		   } else {
	          return id == itemPeat.shiftedIndex ? 800 : 0;
	       }
	}
	
	public void GenerateSurface(World world, Random random, int chunkX, int chunkZ) {
	      int tries = 10;
	      int vein = 8;

	      int posX;
	      int posY;
	      int posZ;
	      int i;
	      
	      for(i = 0; i < tries; ++i) {
	          posX = chunkX + random.nextInt(16);
	          posY = random.nextInt(128);
	          posZ = chunkZ + random.nextInt(16);
	          (new WorldGenMinable(blockLignite.blockID, vein)).generate(world, random, posX, posY, posZ);
	       }
	      
	      for(i = 0; i < tries; ++i) {
	          posX = chunkX + random.nextInt(16);
	          posY = random.nextInt(64);
	          posZ = chunkZ + random.nextInt(16);
	          (new WorldGenMinable(blockBituminous.blockID, vein)).generate(world, random, posX, posY, posZ);
	       }
	      
	      for(i = 0; i < tries; ++i) {
	          posX = chunkX + random.nextInt(16);
	          posY = random.nextInt(32);
	          posZ = chunkZ + random.nextInt(16);
	          (new WorldGenMinable(blockAnthracite.blockID, vein)).generate(world, random, posX, posY, posZ);
	       }
	}
	
	static {
		try {
			(config = new Configuration(new File("./config/BetterCoal.cfg"))).load();
		} catch (Exception exception1) {
			System.out.println("[Better Coal] Error while trying to access configuration!");
			throw new RuntimeException(exception1);
		}

		anthraciteID = Integer.valueOf(config.getOrCreateIntProperty("Anthracite Item ID", 2, 6543).value).intValue();
		bituminousID = Integer.valueOf(config.getOrCreateIntProperty("Bituminous Item ID", 2, 6544).value).intValue();
		ligniteID = Integer.valueOf(config.getOrCreateIntProperty("Lignite Item ID", 2, 6545).value).intValue();
		peatID = Integer.valueOf(config.getOrCreateIntProperty("Peat Item ID", 2, 6546).value).intValue();
		idAnthracite = Integer.valueOf(config.getOrCreateIntProperty("Anthracite Ore Block ID", 1, 167).value).intValue();
		idBituminous = Integer.valueOf(config.getOrCreateIntProperty("Bituminous Ore Block ID", 1, 168).value).intValue();
		idLignite = Integer.valueOf(config.getOrCreateIntProperty("Lignite Ore Block ID", 1, 169).value).intValue();
		idAnthraciteTorch = Integer.valueOf(config.getOrCreateIntProperty("Anthracite Torch Block ID", 1, 170).value).intValue();
		idBituminousTorch = Integer.valueOf(config.getOrCreateIntProperty("Bituminous Torch Block ID", 1, 171).value).intValue();
		idLigniteTorch = Integer.valueOf(config.getOrCreateIntProperty("Lignite Torch Block ID", 1, 172).value).intValue();
		idPeatTorch = Integer.valueOf(config.getOrCreateIntProperty("Peat Torch Block ID", 1, 173).value).intValue();
		idAnthraciteBlock = Integer.valueOf(config.getOrCreateIntProperty("Anthracite Block ID", 1, 174).value).intValue();
		idBituminousBlock = Integer.valueOf(config.getOrCreateIntProperty("Bituminous Block ID", 1, 175).value).intValue();
		idCoalBlock = Integer.valueOf(config.getOrCreateIntProperty("Coal Block ID", 1, 176).value).intValue();
		idLigniteBlock = Integer.valueOf(config.getOrCreateIntProperty("Lignite Block ID", 1, 177).value).intValue();
		idPeatBlock = Integer.valueOf(config.getOrCreateIntProperty("Peat Block ID", 1, 178).value).intValue();
		if(config != null) {
			config.save();
		}

		blockAnthracite = (new BlockAnthracite(idAnthracite, 0)).setHardness(5.0F).setResistance(15.0F).setStepSound(Block.soundStoneFootstep).setBlockName("Anthracite Ore");
		blockBituminous = (new BlockBituminous(idBituminous, 1)).setHardness(4.0F).setResistance(10.0F).setStepSound(Block.soundStoneFootstep).setBlockName("Bituminous Ore");
		blockLignite = (new BlockLignite(idLignite, 2)).setHardness(2.0F).setResistance(4.0F).setStepSound(Block.soundStoneFootstep).setBlockName("Lignite Ore");
		blockAnthraciteTorch = (new BlockTorchAnthracite(idAnthraciteTorch, 7)).setResistance(15.0F).setStepSound(Block.soundWoodFootstep).setBlockName("Anthracite Torch");
		blockBituminousTorch = (new BlockTorchBituminous(idBituminousTorch, 8)).setResistance(10.0F).setStepSound(Block.soundWoodFootstep).setBlockName("Bituminous Torch");
		blockLigniteTorch = (new BlockTorchLignite(idLigniteTorch, 9)).setResistance(4.0F).setStepSound(Block.soundWoodFootstep).setBlockName("Lignite Torch");
		blockPeatTorch = (new BlockTorchPeat(idPeatTorch, 10)).setResistance(4.0F).setStepSound(Block.soundWoodFootstep).setBlockName("Peat Torch");
		blockAnthraciteBlock = (new BlockBetterCoalStorage(idAnthraciteBlock, 11)).setHardness(7.0F).setResistance(20.0F).setStepSound(Block.soundStoneFootstep).setBlockName("Anthracite Block");
		blockBituminousBlock = (new BlockBetterCoalStorage(idBituminousBlock, 12)).setHardness(6.0F).setResistance(15.0F).setStepSound(Block.soundStoneFootstep).setBlockName("Bituminous Block");
		blockCoalBlock = (new BlockBetterCoalStorage(idCoalBlock, 13)).setHardness(5.0F).setResistance(10.0F).setStepSound(Block.soundStoneFootstep).setBlockName("Coal Block");
		blockLigniteBlock = (new BlockBetterCoalStorage(idLigniteBlock, 14)).setHardness(4.0F).setResistance(9.0F).setStepSound(Block.soundStoneFootstep).setBlockName("Lignite Block");
		blockPeatBlock = (new BlockBetterCoalStorage(idPeatBlock, 15)).setHardness(1.0F).setResistance(1.0F).setStepSound(Block.soundGrassFootstep).setBlockName("Peat Block");
	}
	
	public class OverridenBlockOre extends BlockOre {
		public OverridenBlockOre() {
			super(Block.oreCoal.blockID, Block.oreCoal.blockIndexInTexture);
			this.setHardness(Block.oreCoal.blockHardness);
			this.setResistance(Block.oreCoal.blockResistance);
			this.setStepSound(Block.oreCoal.stepSound);
			this.setBlockName("oreCoal");
			this.setTickOnLoad(true);
		}

		public int quantityDropped(Random random1) {
			return this.blockID == Block.oreLapis.blockID ? 4 + random1.nextInt(5) : this.blockID == Block.oreCoal.blockID ? 1 + random1.nextInt(3) : 1;
		}
	}
	
	public class OverridenBlockTorch extends BlockTorch {
		protected OverridenBlockTorch() {
			super(Block.torchWood.blockID, Block.torchWood.blockIndexInTexture);
			this.setHardness(Block.torchWood.blockHardness);
			this.setResistance(Block.torchWood.blockResistance);
			this.setStepSound(Block.torchWood.stepSound);
			this.setBlockName("torch");
			this.setTickOnLoad(true);
		}
		
		private boolean func_31032_h(World world, int i, int j, int k) {
			return world.isBlockSolidOnSide(i, j, k, 1) || world.getBlockId(i, j, k) == Block.fence.blockID;
		}

		public void onBlockPlaced(World world, int i, int j, int k, int l) {
			this.setLightValue(0.7575F);
			int i1 = world.getBlockMetadata(i, j, k);
			if(l == 1 && this.func_31032_h(world, i, j - 1, k)) {
				i1 = 5;
			}

			if(l == 2 && world.isBlockSolidOnSide(i, j, k + 1, 2)) {
				i1 = 4;
			}

			if(l == 3 && world.isBlockSolidOnSide(i, j, k - 1, 3)) {
				i1 = 3;
			}

			if(l == 4 && world.isBlockSolidOnSide(i + 1, j, k, 4)) {
				i1 = 2;
			}

			if(l == 5 && world.isBlockSolidOnSide(i - 1, j, k, 5)) {
				i1 = 1;
			}

			world.setBlockMetadataWithNotify(i, j, k, i1);
		}
	}

}

Sorry, for any horrible gammar it is late. I am going to bed now.

Edit: Still tired but I made the code look better using the Markdown supported formatting. - 18/03/2024

Quick facts

Install steps are the general flow for this file type — How to install Minecraft Java mods & modpacks walks through it step by step.

Verified by MCModsHub

These come from our own check of the pack file, not from the source page.

Explore more