package com.jaquadro.minecraft.gardenapi.internal.registry;
import com.jaquadro.minecraft.gardenapi.api.machine.ICompostMaterial;
import com.jaquadro.minecraft.gardenapi.api.machine.ICompostRegistry;
import com.jaquadro.minecraft.gardenapi.api.machine.StandardCompostMaterial;
import com.jaquadro.minecraft.gardencore.util.UniqueMetaIdentifier;
import com.jaquadro.minecraft.gardencore.util.UniqueMetaRegistry;
import net.minecraft.block.Block;
import net.minecraft.block.BlockLeavesBase;
import net.minecraft.block.BlockVine;
import net.minecraft.block.IGrowable;
import net.minecraft.init.Blocks;
import net.minecraft.init.Items;
import net.minecraft.item.ItemBlock;
import net.minecraft.item.ItemFood;
import net.minecraft.item.ItemStack;
import net.minecraftforge.common.IPlantable;
import net.minecraftforge.oredict.OreDictionary;
import java.util.HashMap;
import java.util.Map;
public class CompostRegistry implements ICompostRegistry
{
private static ICompostMaterial defaultMaterial = new StandardCompostMaterial();
private UniqueMetaRegistry<ICompostMaterial> itemRegistry;
private Map<String, ICompostMaterial> oreDictRegistry;
private Map<Class, ICompostMaterial> classRegistry;
public CompostRegistry () {
itemRegistry = new UniqueMetaRegistry<ICompostMaterial>();
oreDictRegistry = new HashMap<String, ICompostMaterial>();
classRegistry = new HashMap<Class, ICompostMaterial>();
init();
}
private void init () {
registerCompostMaterial(new ItemStack(Blocks.melon_block), defaultMaterial);
registerCompostMaterial(new ItemStack(Blocks.pumpkin), defaultMaterial);
registerCompostMaterial(new ItemStack(Blocks.hay_block), defaultMaterial);
registerCompostMaterial(new ItemStack(Items.string), new StandardCompostMaterial(100, 0.0625f));
registerCompostMaterial(new ItemStack(Items.wheat), new StandardCompostMaterial(100, 0.125f));
registerCompostMaterial(new ItemStack(Items.reeds), new StandardCompostMaterial(150, 0.125f));
registerCompostMaterial(new ItemStack(Items.feather), new StandardCompostMaterial(50, 0.0625f));
registerCompostMaterial(new ItemStack(Items.rotten_flesh), new StandardCompostMaterial(150, 0.125f));
registerCompostMaterial(new ItemStack(Items.leather), new StandardCompostMaterial(150, 0.125f));
registerCompostMaterial("treeWood", new StandardCompostMaterial(300, 0.25f));
registerCompostMaterial("logWood", new StandardCompostMaterial(300, 0.25f));
registerCompostMaterial("treeLeaves", defaultMaterial);
registerCompostMaterial("treeSapling", defaultMaterial);
registerCompostMaterial("stickWood", defaultMaterial);
registerCompostMaterial(IPlantable.class, defaultMaterial);
registerCompostMaterial(IGrowable.class, defaultMaterial);
registerCompostMaterial(BlockLeavesBase.class, defaultMaterial);
registerCompostMaterial(BlockVine.class, defaultMaterial);
registerCompostMaterial(ItemFood.class, defaultMaterial);
}
@Override
public void registerCompostMaterial (String modId, String itemId, int meta, ICompostMaterial materialInfo) {
if (modId != null && itemId != null && materialInfo != null) {
UniqueMetaIdentifier id = new UniqueMetaIdentifier(modId, itemId, meta);
itemRegistry.register(id, materialInfo);
}
}
@Override
public void registerCompostMaterial (String modId, String itemId, ICompostMaterial materialInfo) {
if (modId != null && itemId != null && materialInfo != null) {
UniqueMetaIdentifier id = new UniqueMetaIdentifier(modId, itemId);
itemRegistry.register(id, materialInfo);
}
}
@Override
public void registerCompostMaterial (ItemStack itemStack, ICompostMaterial materialInfo) {
UniqueMetaIdentifier id = UniqueMetaIdentifier.createFor(itemStack);
if (id != null && materialInfo != null)
itemRegistry.register(id, materialInfo);
}
@Override
public void registerCompostMaterial (String oreDictionaryKey, ICompostMaterial materialInfo) {
if (oreDictionaryKey != null && materialInfo != null)
oreDictRegistry.put(oreDictionaryKey, materialInfo);
}
@Override
public void registerCompostMaterial (Class clazz, ICompostMaterial materialInfo) {
if (clazz != null && materialInfo != null)
classRegistry.put(clazz, materialInfo);
}
@Override
public void removeCompostMaterial (ItemStack itemStack) {
itemRegistry.remove(UniqueMetaIdentifier.createFor(itemStack));
}
@Override
public void removeCompostMaterial (String oreDictionaryKey) {
if (oreDictionaryKey != null)
oreDictRegistry.remove(oreDictionaryKey);
}
@Override
public void removeCompostMaterial (Class clazz) {
if (clazz != null)
classRegistry.remove(clazz);
}
@Override
public void clear () {
itemRegistry.clear();
oreDictRegistry.clear();
classRegistry.clear();
}
@Override
public ICompostMaterial getCompostMaterialInfo (ItemStack itemStack) {
if (itemStack == null)
return null;
UniqueMetaIdentifier id = UniqueMetaIdentifier.createFor(itemStack);
if (id != null) {
ICompostMaterial entry = itemRegistry.getEntry(id);
if (entry != null)
return entry;
}
for (int oreId : OreDictionary.getOreIDs(itemStack)) {
String oreEntry = OreDictionary.getOreName(oreId);
if (oreEntry == null)
continue;
ICompostMaterial entry = oreDictRegistry.get(oreEntry);
if (entry != null)
return entry;
}
if (itemStack.getItem() instanceof ItemBlock) {
Block block = Block.getBlockFromItem(itemStack.getItem());
Class clazz = block.getClass();
while (clazz != null) {
if (classRegistry.containsKey(clazz))
return classRegistry.get(clazz);
for (Class iface : clazz.getInterfaces()) {
if (classRegistry.containsKey(iface))
return classRegistry.get(iface);
}
clazz = clazz.getSuperclass();
}
}
else if (itemStack.getItem() != null) {
Class clazz = itemStack.getItem().getClass();
while (clazz != null) {
if (classRegistry.containsKey(clazz))
return classRegistry.get(clazz);
for (Class iface : clazz.getInterfaces()) {
if (classRegistry.containsKey(iface))
return classRegistry.get(iface);
}
clazz = clazz.getSuperclass();
}
}
return null;
}
}