Testing an idea on how to handle block registry

This is both to help me do modding better as well to test how i want to
handle block creation in my game.
This commit is contained in:
DarkGuardsman 2013-08-28 16:54:44 -04:00
parent 75eeae764b
commit a66aa8e053
6 changed files with 208 additions and 26 deletions

View file

@ -1,6 +1,8 @@
package dark.common.transmit; package dark.common.transmit;
import java.util.List; import java.util.List;
import java.util.Map.Entry;
import java.util.Set;
import net.minecraft.block.Block; import net.minecraft.block.Block;
import net.minecraft.block.material.Material; import net.minecraft.block.material.Material;
@ -16,9 +18,11 @@ import universalelectricity.core.block.IConductor;
import universalelectricity.core.vector.Vector3; import universalelectricity.core.vector.Vector3;
import universalelectricity.prefab.tile.TileEntityConductor; import universalelectricity.prefab.tile.TileEntityConductor;
import dark.core.DarkMain; import dark.core.DarkMain;
import dark.core.IExtraObjectInfo;
import dark.core.helpers.Pair;
import dark.prefab.BlockMachine; import dark.prefab.BlockMachine;
public class BlockWire extends BlockMachine public class BlockWire extends BlockMachine implements IExtraObjectInfo
{ {
public boolean isWireCollision = true; public boolean isWireCollision = true;
@ -66,7 +70,6 @@ public class BlockWire extends BlockMachine
return new TileEntityWire(); return new TileEntityWire();
} }
@Override @Override
public void onBlockAdded(World world, int x, int y, int z) public void onBlockAdded(World world, int x, int y, int z)
{ {
@ -80,7 +83,6 @@ public class BlockWire extends BlockMachine
} }
} }
@Override @Override
public void onNeighborBlockChange(World world, int x, int y, int z, int blockID) public void onNeighborBlockChange(World world, int x, int y, int z, int blockID)
{ {
@ -92,7 +94,6 @@ public class BlockWire extends BlockMachine
} }
} }
@Override @Override
public AxisAlignedBB getCollisionBoundingBoxFromPool(World world, int x, int y, int z) public AxisAlignedBB getCollisionBoundingBoxFromPool(World world, int x, int y, int z)
{ {
@ -222,4 +223,37 @@ public class BlockWire extends BlockMachine
super.addCollisionBoxesToList(world, x, y, z, axisalignedbb, list, entity); super.addCollisionBoxesToList(world, x, y, z, axisalignedbb, list, entity);
} }
} }
@Override
public void loadRecipes()
{
// TODO Auto-generated method stub
}
@Override
public void getTileEntities(int blockID, Set<Pair<String, TileEntity>> list)
{
list.add(new Pair<String, TileEntity>("DMWireTile", new TileEntityWire()));
}
@Override
public boolean hasExtraConfigs()
{
return false;
}
@Override
public void loadExtraConfigs(Configuration config)
{
//TODO add config options for max amps, and resistance
}
@Override
public void loadOreNames()
{
// TODO Auto-generated method stub
}
} }

View file

@ -1,25 +1,99 @@
package dark.core; package dark.core;
import java.io.File;
import java.util.HashMap; import java.util.HashMap;
import java.util.HashSet;
import java.util.List;
import java.util.Map.Entry;
import java.util.Set;
import net.minecraft.block.Block; import net.minecraft.block.Block;
import net.minecraft.item.ItemBlock; import net.minecraft.item.ItemBlock;
import net.minecraft.tileentity.TileEntity; import net.minecraft.tileentity.TileEntity;
import net.minecraftforge.common.Configuration;
import cpw.mods.fml.common.Loader;
import cpw.mods.fml.common.registry.GameRegistry;
import dark.core.helpers.Pair;
/** Handler to make registering all parts of a block a bit easier /** Handler to make registering all parts of a block a bit easier
* *
* @author DarkGuardsman */ * @author DarkGuardsman */
public class BlockRegistry public class BlockRegistry
{ {
private static Configuration masterBlockConfig = new Configuration(new File(Loader.instance().getConfigDir(), "Dark/EnabledBlocks.cfg"));
private static HashMap<Block, BlockData> blockMap = new HashMap<Block, BlockData>(); private static HashMap<Block, BlockData> blockMap = new HashMap<Block, BlockData>();
/** Adds a block to the mapping to be registered next call */
public static void addBlockToRegister(BlockData data) public static void addBlockToRegister(BlockData data)
{
synchronized (blockMap)
{ {
if (data != null && data.block != null && !blockMap.containsKey(data.block)) if (data != null && data.block != null && !blockMap.containsKey(data.block))
{ {
blockMap.put(data.block, data); blockMap.put(data.block, data);
} }
} }
}
public static void addBlocks(List<BlockData> data)
{
for (BlockData entry : data)
{
BlockRegistry.addBlockToRegister(entry);
}
}
/** Runs threw the list of entries and then registers all parts */
public static void registerAllBlocks()
{
masterBlockConfig.load();
synchronized (blockMap)
{
HashMap<String, TileEntity> tileList = new HashMap<String, TileEntity>();
for (Entry<Block, BlockData> entry : blockMap.entrySet())
{
BlockData blockData = entry.getValue();
Block block = blockData.block;
if (!blockData.allowDisable || blockData.allowDisable && masterBlockConfig.get("EnabledList", "Enable_" + blockData.block.getUnlocalizedName(), true).getBoolean(true))
{
if (blockData.itemBlock != null)
{
GameRegistry.registerBlock(blockData.block, blockData.itemBlock, blockData.modBlockID);
}
else
{
GameRegistry.registerBlock(blockData.block, blockData.modBlockID);
}
if (blockData.block instanceof IExtraObjectInfo)
{
if (((IExtraObjectInfo) block).hasExtraConfigs())
{
Configuration extraBlockConfig = new Configuration(new File(Loader.instance().getConfigDir(), "Dark/blocks/" + block.getUnlocalizedName() + ".cfg"));
extraBlockConfig.load();
((IExtraObjectInfo) block).loadExtraConfigs(extraBlockConfig);
extraBlockConfig.save();
}
((IExtraObjectInfo) block).loadOreNames();
Set<Pair<String, TileEntity>> tileListNew = new HashSet<Pair<String, TileEntity>>();
((IExtraObjectInfo) block).getTileEntities(block.blockID, tileListNew);
for (Pair<String, TileEntity> par : tileListNew)
{
if (!tileList.containsKey(par.getKey()) && !tileList.containsValue(par.getValue()))
{
tileList.put(par.getKey(), par.getValue());
}
else if(par.getValue() != null)
{
System.out.println("BlockRegistry tried to list a tile or tileName that was already listed");
System.out.println("Tile>" + par.getValue().toString() + " | Name>" + par.getKey());
}
}
}
}
}
}
masterBlockConfig.save();
}
/** Used to store info on the block that will later be used to register all parts of the block */ /** Used to store info on the block that will later be used to register all parts of the block */
public static class BlockData public static class BlockData
@ -28,6 +102,7 @@ public class BlockRegistry
public Class<? extends ItemBlock> itemBlock; public Class<? extends ItemBlock> itemBlock;
public String modBlockID; public String modBlockID;
public HashMap<String, TileEntity> tiles = new HashMap<String, TileEntity>(); public HashMap<String, TileEntity> tiles = new HashMap<String, TileEntity>();
public boolean allowDisable = true;
public BlockData(Block block, String name) public BlockData(Block block, String name)
{ {

View file

@ -1,7 +1,9 @@
package dark.core; package dark.core;
import java.io.File; import java.io.File;
import java.util.ArrayList;
import java.util.Arrays; import java.util.Arrays;
import java.util.List;
import net.minecraft.item.ItemStack; import net.minecraft.item.ItemStack;
import net.minecraftforge.common.Configuration; import net.minecraftforge.common.Configuration;
@ -29,6 +31,7 @@ import dark.common.debug.BlockDebug;
import dark.common.debug.BlockDebug.debugBlocks; import dark.common.debug.BlockDebug.debugBlocks;
import dark.common.transmit.BlockWire; import dark.common.transmit.BlockWire;
import dark.common.transmit.TileEntityWire; import dark.common.transmit.TileEntityWire;
import dark.core.BlockRegistry.BlockData;
import dark.core.blocks.BlockOre; import dark.core.blocks.BlockOre;
import dark.core.helpers.FluidRestrictionHandler; import dark.core.helpers.FluidRestrictionHandler;
import dark.core.helpers.SaveManager; import dark.core.helpers.SaveManager;
@ -112,9 +115,6 @@ public class DarkMain extends ModPrefab
if (CoreRecipeLoader.blockOre != null) if (CoreRecipeLoader.blockOre != null)
{ {
GameRegistry.registerBlock(CoreRecipeLoader.blockOre, ItemBlockOre.class, "DMOre");
BlockOre.regiserOreNames();
for (int i = 0; i < EnumMeterials.values().length; i++) for (int i = 0; i < EnumMeterials.values().length; i++)
{ {
if (EnumMeterials.values()[i].doWorldGen) if (EnumMeterials.values()[i].doWorldGen)
@ -174,8 +174,9 @@ public class DarkMain extends ModPrefab
} }
@Override @Override
public void loadConfig() public List<BlockData> getBlocks()
{ {
List<BlockData> dataList = new ArrayList<BlockData>();
if (recipeLoader == null) if (recipeLoader == null)
{ {
recipeLoader = new CoreRecipeLoader(); recipeLoader = new CoreRecipeLoader();
@ -188,6 +189,7 @@ public class DarkMain extends ModPrefab
if (CONFIGURATION.get("general", "LoadOre", true, "Disabling this also disabled the items that go with the ores").getBoolean(true)) if (CONFIGURATION.get("general", "LoadOre", true, "Disabling this also disabled the items that go with the ores").getBoolean(true))
{ {
CoreRecipeLoader.blockOre = new BlockOre(getNextID(), CONFIGURATION); CoreRecipeLoader.blockOre = new BlockOre(getNextID(), CONFIGURATION);
dataList.add(new BlockData(CoreRecipeLoader.blockOre, ItemBlockOre.class, "DMOre"));
} }
if (CONFIGURATION.get("general", "EnableWires", true).getBoolean(true)) if (CONFIGURATION.get("general", "EnableWires", true).getBoolean(true))
{ {
@ -218,7 +220,7 @@ public class DarkMain extends ModPrefab
CONFIGURATION.save(); CONFIGURATION.save();
/* CONFIG END */ /* CONFIG END */
return dataList;
} }
@Override @Override

View file

@ -0,0 +1,34 @@
package dark.core;
import java.util.HashMap;
import java.util.Map.Entry;
import java.util.Set;
import dark.core.helpers.Pair;
import net.minecraft.tileentity.TileEntity;
import net.minecraftforge.common.Configuration;
/** Used to handle info about the block that would normally be handled by the mod main class. Use the
* BlockRegistry in order for these methods to be called on load of the mod.
*
* @author DarkGuardsman */
public interface IExtraObjectInfo
{
/** List of all tileEntities this block needs */
public void getTileEntities(int blockID, Set<Pair<String, TileEntity>> list);
/** True will cause a config file to be generated for this block */
public boolean hasExtraConfigs();
/** Loads the config file for this block */
public void loadExtraConfigs(Configuration config);
/** Optional way to handle recipes based out of the block/item class */
public void loadRecipes();
/** Loads the names used to reference this item in a recipe */
public void loadOreNames();
}

View file

@ -1,19 +1,24 @@
package dark.core.blocks; package dark.core.blocks;
import java.util.HashMap;
import java.util.List; import java.util.List;
import java.util.Set;
import net.minecraft.block.Block; import net.minecraft.block.Block;
import net.minecraft.block.material.Material; import net.minecraft.block.material.Material;
import net.minecraft.client.renderer.texture.IconRegister; import net.minecraft.client.renderer.texture.IconRegister;
import net.minecraft.creativetab.CreativeTabs; import net.minecraft.creativetab.CreativeTabs;
import net.minecraft.item.ItemStack; import net.minecraft.item.ItemStack;
import net.minecraft.tileentity.TileEntity;
import net.minecraft.util.Icon; import net.minecraft.util.Icon;
import net.minecraftforge.common.Configuration; import net.minecraftforge.common.Configuration;
import net.minecraftforge.oredict.OreDictionary; import net.minecraftforge.oredict.OreDictionary;
import dark.core.DarkMain; import dark.core.DarkMain;
import dark.core.IExtraObjectInfo;
import dark.core.helpers.Pair;
import dark.core.items.EnumMeterials; import dark.core.items.EnumMeterials;
public class BlockOre extends Block public class BlockOre extends Block implements IExtraObjectInfo
{ {
Icon[] icons = new Icon[EnumMeterials.values().length]; Icon[] icons = new Icon[EnumMeterials.values().length];
@ -24,17 +29,6 @@ public class BlockOre extends Block
this.setUnlocalizedName(DarkMain.getInstance().PREFIX + "Ore"); this.setUnlocalizedName(DarkMain.getInstance().PREFIX + "Ore");
} }
public static void regiserOreNames()
{
for (int i = 0; i < EnumMeterials.values().length; i++)
{
if (EnumMeterials.values()[i].doWorldGen)
{
OreDictionary.registerOre(EnumMeterials.values()[i].name + "Ore", new ItemStack(DarkMain.recipeLoader.blockOre.blockID, 1, i));
}
}
}
@Override @Override
public void getSubBlocks(int par1, CreativeTabs par2CreativeTabs, List par3List) public void getSubBlocks(int par1, CreativeTabs par2CreativeTabs, List par3List)
{ {
@ -68,4 +62,40 @@ public class BlockOre extends Block
} }
return Block.stone.getIcon(side, metadata); return Block.stone.getIcon(side, metadata);
} }
@Override
public void loadRecipes()
{
}
@Override
public void getTileEntities(int blockID, Set<Pair<String, TileEntity>> list)
{
}
@Override
public boolean hasExtraConfigs()
{
return false;
}
@Override
public void loadExtraConfigs(Configuration config)
{
// TODO Auto-generated method stub
}
@Override
public void loadOreNames()
{
for (int i = 0; i < EnumMeterials.values().length; i++)
{
if (EnumMeterials.values()[i].doWorldGen)
{
OreDictionary.registerOre(EnumMeterials.values()[i].name + "Ore", new ItemStack(DarkMain.recipeLoader.blockOre.blockID, 1, i));
}
}
}
} }

View file

@ -1,5 +1,7 @@
package dark.prefab; package dark.prefab;
import java.util.List;
import net.minecraft.block.Block; import net.minecraft.block.Block;
import org.modstats.Modstats; import org.modstats.Modstats;
@ -10,6 +12,8 @@ import cpw.mods.fml.common.event.FMLInitializationEvent;
import cpw.mods.fml.common.event.FMLPostInitializationEvent; import cpw.mods.fml.common.event.FMLPostInitializationEvent;
import cpw.mods.fml.common.event.FMLPreInitializationEvent; import cpw.mods.fml.common.event.FMLPreInitializationEvent;
import cpw.mods.fml.relauncher.Side; import cpw.mods.fml.relauncher.Side;
import dark.core.BlockRegistry;
import dark.core.BlockRegistry.BlockData;
public abstract class ModPrefab public abstract class ModPrefab
{ {
@ -58,13 +62,13 @@ public abstract class ModPrefab
{ {
this.loadModMeta(); this.loadModMeta();
Modstats.instance().getReporter().registerMod(this); Modstats.instance().getReporter().registerMod(this);
this.loadConfig(); BlockRegistry.addBlocks(this.getBlocks());
} }
@EventHandler @EventHandler
public void init(FMLInitializationEvent event) public void init(FMLInitializationEvent event)
{ {
BlockRegistry.registerAllBlocks();
} }
@EventHandler @EventHandler
@ -79,7 +83,10 @@ public abstract class ModPrefab
System.out.println(" " + data); System.out.println(" " + data);
} }
public abstract void loadConfig(); /** Grabs a list of all the mods block Data used to register the block, tileEntities, and extra
* configs */
public abstract List<BlockData> getBlocks();
/** Loads the settings that tell what this mod is named, about, and other info to the user */
public abstract void loadModMeta(); public abstract void loadModMeta();
} }