package mcjty.rftools.blocks.spawner;
import mcjty.lib.varia.Logging;
import net.minecraft.block.Block;
import net.minecraft.init.Blocks;
import net.minecraft.init.Items;
import net.minecraft.item.Item;
import net.minecraft.item.ItemBlock;
import net.minecraft.item.ItemStack;
import net.minecraftforge.common.config.ConfigCategory;
import net.minecraftforge.common.config.Configuration;
import net.minecraftforge.common.config.Property;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
public class SpawnerConfiguration {
public static final String CATEGORY_SPAWNER = "spawner";
public static final String CATEGORY_MOBSPAWNAMOUNTS = "mobspawnamounts";
public static final String CATEGORY_MOBSPAWNRF = "mobspawnrf";
public static final String CATEGORY_LIVINGMATTER = "livingmatter";
public static final Map<String,Integer> mobSpawnRf = new HashMap<String, Integer>();
public static final Map<String,List<MobSpawnAmount>> mobSpawnAmounts = new HashMap<String, List<MobSpawnAmount>>();
public static final Map<Object,Float> livingMatter = new HashMap<Object, Float>();
public static final int MATERIALTYPE_KEY = 0;
public static final int MATERIALTYPE_BULK = 1;
public static final int MATERIALTYPE_LIVING = 2;
public static int SPAWNER_MAXENERGY = 200000;
public static int SPAWNER_RECEIVEPERTICK = 2000;
public static int BEAMER_MAXENERGY = 200000;
public static int BEAMER_RECEIVEPERTICK = 1000;
public static int beamRfPerObject = 2000;
public static int beamBlocksPerSend = 1;
public static int maxBeamDistance = 8;
public static int maxMatterStorage = 64 * 100;
// public static int maxEntitiesAroundSpawner = 300;
public static void init(Configuration cfg) {
SPAWNER_MAXENERGY = cfg.get(CATEGORY_SPAWNER, "spawnerMaxRF", SPAWNER_MAXENERGY,
"Maximum RF storage that the spawner can hold").getInt();
SPAWNER_RECEIVEPERTICK = cfg.get(CATEGORY_SPAWNER, "spawnerRFPerTick", SPAWNER_RECEIVEPERTICK,
"RF per tick that the spawner can receive").getInt();
BEAMER_MAXENERGY = cfg.get(CATEGORY_SPAWNER, "beamerMaxRF", BEAMER_MAXENERGY,
"Maximum RF storage that the matter beamer can hold").getInt();
BEAMER_RECEIVEPERTICK = cfg.get(CATEGORY_SPAWNER, "beamerRFPerTick", BEAMER_RECEIVEPERTICK,
"RF per tick that the matter beamer can receive").getInt();
beamRfPerObject = cfg.get(CATEGORY_SPAWNER, "beamerRfPerSend", beamRfPerObject,
"RF per tick that the matter beamer will use for sending over a single object").getInt();
beamBlocksPerSend = cfg.get(CATEGORY_SPAWNER, "beamerBlocksPerSend", beamBlocksPerSend,
"The amount of blocks that the matter beamer will use send in one operation (every 20 ticks)").getInt();
maxMatterStorage = cfg.get(CATEGORY_SPAWNER, "spawnerMaxMatterStorage", maxMatterStorage,
"The maximum amount of energized matter that this spawner can store (per type)").getInt();
maxBeamDistance = cfg.get(CATEGORY_SPAWNER, "maxBeamDistance", maxBeamDistance,
"The maximum distance that a laser can travel between the beamer and the spawner").getInt();
// maxEntitiesAroundSpawner = cfg.get(CATEGORY_SPAWNER, "maxEntitiesAroundSpawner", maxEntitiesAroundSpawner,
// "If the number of entities around the spawner exceeds this number it will automatically stop spawning").getInt();
readLivingConfig(cfg);
}
public static void readLivingConfig(Configuration cfg) {
ConfigCategory category = cfg.getCategory(CATEGORY_LIVINGMATTER);
if (category.isEmpty()) {
setupInitialLivingConfig(cfg);
} else {
for (Map.Entry<String, Property> entry : category.entrySet()) {
String[] value = entry.getValue().getStringList();
try {
String type = value[0];
String name = value[1];
Float factor = Float.parseFloat(value[2]);
if ("B".equals(type)) {
Object block = Block.blockRegistry.getObject(name);
livingMatter.put(block, factor);
} else {
Object item = Item.itemRegistry.getObject(name);
livingMatter.put(item, factor);
}
} catch (Exception e) {
Logging.logError("Badly formatted 'livingmatter' configuration option!");
return;
}
}
}
}
private static void setupInitialLivingConfig(Configuration cfg) {
int counter = 0;
counter = addLiving(cfg, Blocks.leaves, counter, 1.0f);
counter = addLiving(cfg, Blocks.leaves2, counter, 1.0f);
counter = addLiving(cfg, Blocks.sapling, counter, 1.0f);
counter = addLiving(cfg, Blocks.hay_block, counter, 1.0f);
counter = addLiving(cfg, Blocks.melon_block, counter, 1.0f);
counter = addLiving(cfg, Blocks.cactus, counter, 0.8f);
counter = addLiving(cfg, Items.apple, counter, 1.0f);
counter = addLiving(cfg, Items.wheat, counter, 1.5f);
counter = addLiving(cfg, Items.wheat_seeds, counter, 0.8f);
counter = addLiving(cfg, Items.potato, counter, 1.5f);
counter = addLiving(cfg, Items.carrot, counter, 1.5f);
counter = addLiving(cfg, Items.pumpkin_seeds, counter, 0.8f);
counter = addLiving(cfg, Items.melon_seeds, counter, 0.8f);
counter = addLiving(cfg, Items.beef, counter, 2.0f);
counter = addLiving(cfg, Items.porkchop, counter, 2.0f);
counter = addLiving(cfg, Items.chicken, counter, 2.0f);
}
private static int addLiving(Configuration cfg, Block block, int counter, float factor) {
String name = Block.blockRegistry.getNameForObject(block);
cfg.get(CATEGORY_LIVINGMATTER, "living." + counter, new String[] { "B", name, Float.toString(factor) });
livingMatter.put(block, factor);
return counter+1;
}
private static int addLiving(Configuration cfg, Item item, int counter, float factor) {
String name = Item.itemRegistry.getNameForObject(item);
cfg.get(CATEGORY_LIVINGMATTER, "living." + counter, new String[] { "I", name, Float.toString(factor) });
livingMatter.put(item, factor);
return counter+1;
}
public static void readMobSpawnAmountConfig(Configuration cfg) {
addMobSpawnRF(cfg, "Bat", 100);
addMobSpawnAmount(cfg, "Bat", MATERIALTYPE_KEY, Items.feather, 0, .1f);
addMobSpawnAmount(cfg, "Bat", MATERIALTYPE_BULK, Blocks.dirt, 0, 20);
addMobSpawnAmount(cfg, "Bat", MATERIALTYPE_LIVING, null, 0, 2);
addMobSpawnRF(cfg, "Blaze", 1000);
addMobSpawnAmount(cfg, "Blaze", MATERIALTYPE_KEY, Items.blaze_rod, 0, 0.1f);
addMobSpawnAmount(cfg, "Blaze", MATERIALTYPE_BULK, Blocks.netherrack, 0, 60);
addMobSpawnAmount(cfg, "Blaze", MATERIALTYPE_LIVING, null, 0, 9);
addMobSpawnRF(cfg, "Cave Spider", 500);
addMobSpawnAmount(cfg, "Cave Spider", MATERIALTYPE_KEY, Items.string, 0, 0.1f);
addMobSpawnAmount(cfg, "Cave Spider", MATERIALTYPE_BULK, Blocks.dirt, 0, 40);
addMobSpawnAmount(cfg, "Cave Spider", MATERIALTYPE_LIVING, null, 0, 5);
addMobSpawnRF(cfg, "Chicken", 500);
addMobSpawnAmount(cfg, "Chicken", MATERIALTYPE_KEY, Items.feather, 0, 0.1f);
addMobSpawnAmount(cfg, "Chicken", MATERIALTYPE_BULK, Blocks.dirt, 0, 30);
addMobSpawnAmount(cfg, "Chicken", MATERIALTYPE_LIVING, null, 0, 5);
addMobSpawnRF(cfg, "Cow", 800);
addMobSpawnAmount(cfg, "Cow", MATERIALTYPE_KEY, Items.leather, 0, 0.1f);
addMobSpawnAmount(cfg, "Cow", MATERIALTYPE_BULK, Blocks.dirt, 0, 50);
addMobSpawnAmount(cfg, "Cow", MATERIALTYPE_LIVING, null, 0, 8);
addMobSpawnRF(cfg, "Creeper", 800);
addMobSpawnAmount(cfg, "Creeper", MATERIALTYPE_KEY, Items.gunpowder, 0, 0.1f);
addMobSpawnAmount(cfg, "Creeper", MATERIALTYPE_BULK, Blocks.dirt, 0, 60);
addMobSpawnAmount(cfg, "Creeper", MATERIALTYPE_LIVING, null, 0, 5);
addMobSpawnRF(cfg, "Dragon", 100000);
addMobSpawnAmount(cfg, "Dragon", MATERIALTYPE_KEY, Items.experience_bottle, 0, 0.1f);
addMobSpawnAmount(cfg, "Dragon", MATERIALTYPE_BULK, Blocks.end_stone, 0, 200);
addMobSpawnAmount(cfg, "Dragon", MATERIALTYPE_LIVING, null, 0, 200);
addMobSpawnRF(cfg, "Enderman", 2000);
addMobSpawnAmount(cfg, "Enderman", MATERIALTYPE_KEY, Items.ender_pearl, 0, 0.1f);
addMobSpawnAmount(cfg, "Enderman", MATERIALTYPE_BULK, Blocks.end_stone, 0, 20);
addMobSpawnAmount(cfg, "Enderman", MATERIALTYPE_LIVING, null, 0, 11);
addMobSpawnRF(cfg, "Ghast", 2000);
addMobSpawnAmount(cfg, "Ghast", MATERIALTYPE_KEY, Items.ghast_tear, 0, 0.1f);
addMobSpawnAmount(cfg, "Ghast", MATERIALTYPE_BULK, Blocks.netherrack, 0, 50);
addMobSpawnAmount(cfg, "Ghast", MATERIALTYPE_LIVING, null, 0, 12);
addMobSpawnRF(cfg, "Horse", 1000);
addMobSpawnAmount(cfg, "Horse", MATERIALTYPE_KEY, Items.leather, 0, 0.1f);
addMobSpawnAmount(cfg, "Horse", MATERIALTYPE_BULK, Blocks.dirt, 0, 50);
addMobSpawnAmount(cfg, "Horse", MATERIALTYPE_LIVING, null, 0, 8);
addMobSpawnRF(cfg, "Iron Golem", 2000);
addMobSpawnAmount(cfg, "Iron Golem", MATERIALTYPE_KEY, Items.iron_ingot, 0, 0.1f);
addMobSpawnAmount(cfg, "Iron Golem", MATERIALTYPE_BULK, Blocks.dirt, 0, 50);
addMobSpawnAmount(cfg, "Iron Golem", MATERIALTYPE_LIVING, 38, 0, 0.1f); // Poppy
addMobSpawnRF(cfg, "Magma Cube", 600);
addMobSpawnAmount(cfg, "Magma Cube", MATERIALTYPE_KEY, Items.magma_cream, 0, 0.1f);
addMobSpawnAmount(cfg, "Magma Cube", MATERIALTYPE_BULK, Blocks.netherrack, 0, 50);
addMobSpawnAmount(cfg, "Magma Cube", MATERIALTYPE_LIVING, null, 0, 5);
addMobSpawnRF(cfg, "Mooshroom", 800);
addMobSpawnAmount(cfg, "Mooshroom", MATERIALTYPE_KEY, Items.leather, 0, 0.1f);
addMobSpawnAmount(cfg, "Mooshroom", MATERIALTYPE_BULK, Blocks.dirt, 0, 50);
addMobSpawnAmount(cfg, "Mooshroom", MATERIALTYPE_LIVING, null, 0, 8);
addMobSpawnRF(cfg, "Ocelot", 800);
addMobSpawnAmount(cfg, "Ocelot", MATERIALTYPE_KEY, Items.fish, 0, 0.1f);
addMobSpawnAmount(cfg, "Ocelot", MATERIALTYPE_BULK, Blocks.dirt, 0, 50);
addMobSpawnAmount(cfg, "Ocelot", MATERIALTYPE_LIVING, null, 0, 8);
addMobSpawnRF(cfg, "Pig", 800);
addMobSpawnAmount(cfg, "Pig", MATERIALTYPE_KEY, Items.leather, 0, 0.1f);
addMobSpawnAmount(cfg, "Pig", MATERIALTYPE_BULK, Blocks.dirt, 0, 50);
addMobSpawnAmount(cfg, "Pig", MATERIALTYPE_LIVING, null, 0, 8);
addMobSpawnRF(cfg, "Sheep", 800);
addMobSpawnAmount(cfg, "Sheep", MATERIALTYPE_KEY, Blocks.wool, 0, 0.1f);
addMobSpawnAmount(cfg, "Sheep", MATERIALTYPE_BULK, Blocks.dirt, 0, 50);
addMobSpawnAmount(cfg, "Sheep", MATERIALTYPE_LIVING, null, 0, 8);
addMobSpawnRF(cfg, "Skeleton", 800);
addMobSpawnAmount(cfg, "Skeleton", MATERIALTYPE_KEY, Items.bone, 0, 0.1f);
addMobSpawnAmount(cfg, "Skeleton", MATERIALTYPE_BULK, Blocks.dirt, 0, 30);
addMobSpawnAmount(cfg, "Skeleton", MATERIALTYPE_LIVING, null, 0, 5);
addMobSpawnRF(cfg, "Slime", 600);
addMobSpawnAmount(cfg, "Slime", MATERIALTYPE_KEY, Items.slime_ball, 0, 0.1f);
addMobSpawnAmount(cfg, "Slime", MATERIALTYPE_BULK, Blocks.dirt, 0, 40);
addMobSpawnAmount(cfg, "Slime", MATERIALTYPE_LIVING, null, 0, 5);
addMobSpawnRF(cfg, "Snowman", 600);
addMobSpawnAmount(cfg, "Snowman", MATERIALTYPE_KEY, Items.snowball, 0, 0.1f);
addMobSpawnAmount(cfg, "Snowman", MATERIALTYPE_BULK, Blocks.dirt, 0, 40);
addMobSpawnAmount(cfg, "Snowman", MATERIALTYPE_LIVING, null, 0, 4);
addMobSpawnRF(cfg, "Spider", 500);
addMobSpawnAmount(cfg, "Spider", MATERIALTYPE_KEY, Items.string, 0, 0.1f);
addMobSpawnAmount(cfg, "Spider", MATERIALTYPE_BULK, Blocks.dirt, 0, 40);
addMobSpawnAmount(cfg, "Spider", MATERIALTYPE_LIVING, null, 0, 5);
addMobSpawnRF(cfg, "Squid", 500);
addMobSpawnAmount(cfg, "Squid", MATERIALTYPE_KEY, 351, 0, 0.1f); // Ink sac
addMobSpawnAmount(cfg, "Squid", MATERIALTYPE_BULK, Blocks.dirt, 0, 40);
addMobSpawnAmount(cfg, "Squid", MATERIALTYPE_LIVING, null, 0, 4);
addMobSpawnRF(cfg, "Villager", 2000);
addMobSpawnAmount(cfg, "Villager", MATERIALTYPE_KEY, Items.book, 0, 0.1f);
addMobSpawnAmount(cfg, "Villager", MATERIALTYPE_BULK, Blocks.dirt, 0, 40);
addMobSpawnAmount(cfg, "Villager", MATERIALTYPE_LIVING, null, 0, 7);
addMobSpawnRF(cfg, "Witch", 1200);
addMobSpawnAmount(cfg, "Witch", MATERIALTYPE_KEY, Items.glass_bottle, 0, 0.1f);
addMobSpawnAmount(cfg, "Witch", MATERIALTYPE_BULK, Blocks.dirt, 0, 40);
addMobSpawnAmount(cfg, "Witch", MATERIALTYPE_LIVING, null, 0, 7);
addMobSpawnRF(cfg, "Wither", 20000);
addMobSpawnAmount(cfg, "Wither", MATERIALTYPE_KEY, Items.nether_star, 0, 0.1f);
addMobSpawnAmount(cfg, "Wither", MATERIALTYPE_BULK, Blocks.soul_sand, 0, 40);
addMobSpawnAmount(cfg, "Wither", MATERIALTYPE_LIVING, null, 0, 6);
addMobSpawnRF(cfg, "Wolf", 800);
addMobSpawnAmount(cfg, "Wolf", MATERIALTYPE_KEY, Items.bone, 0, 0.1f);
addMobSpawnAmount(cfg, "Wolf", MATERIALTYPE_BULK, Blocks.dirt, 0, 50);
addMobSpawnAmount(cfg, "Wolf", MATERIALTYPE_LIVING, null, 0, 8);
addMobSpawnRF(cfg, "Zombie Pigman", 1200);
addMobSpawnAmount(cfg, "Zombie Pigman", MATERIALTYPE_KEY, Items.gold_nugget, 0, 0.1f);
addMobSpawnAmount(cfg, "Zombie Pigman", MATERIALTYPE_BULK, Blocks.netherrack, 0, 30);
addMobSpawnAmount(cfg, "Zombie Pigman", MATERIALTYPE_LIVING, null, 0, 5);
addMobSpawnRF(cfg, "Zombie", 800);
addMobSpawnAmount(cfg, "Zombie", MATERIALTYPE_KEY, Items.rotten_flesh, 0, 0.1f);
addMobSpawnAmount(cfg, "Zombie", MATERIALTYPE_BULK, Blocks.dirt, 0, 30);
addMobSpawnAmount(cfg, "Zombie", MATERIALTYPE_LIVING, null, 0, 5);
}
public static void readModdedMobSpawnAmountConfig(Configuration cfg) {
addMobSpawnRF(cfg, "Blizz", 1000);
addMobSpawnAmount(cfg, "Blizz", MATERIALTYPE_KEY, Items.snowball, 0, 0.1f);
addMobSpawnAmount(cfg, "Blizz", MATERIALTYPE_BULK, Blocks.dirt, 0, 50);
addMobSpawnAmount(cfg, "Blizz", MATERIALTYPE_LIVING, null, 0, 9);
addMobSpawnRF(cfg, "Wisp", 2000);
addMobSpawnAmount(cfg, "Wisp", MATERIALTYPE_KEY, Items.diamond, 0, 0.1f);
addMobSpawnAmount(cfg, "Wisp", MATERIALTYPE_BULK, Blocks.dirt, 0, 50);
addMobSpawnAmount(cfg, "Wisp", MATERIALTYPE_LIVING, null, 0, 4);
}
public static void addMobSpawnRF(Configuration cfg, String name, int rf) {
rf = cfg.get(CATEGORY_MOBSPAWNRF, name, rf).getInt();
mobSpawnRf.put(name, rf);
}
public static void addMobSpawnAmount(Configuration cfg, String name, int materialType, Object object, int meta, float amount) {
String type;
String itemname;
if (object instanceof Item) {
type = "I";
itemname = Item.itemRegistry.getNameForObject(object);
} else if (object instanceof Block) {
type = "B";
itemname = Block.blockRegistry.getNameForObject(object);
} else if (object instanceof String) {
type = "S";
itemname = (String) object;
} else if (object instanceof Integer) {
Integer id = (Integer) object;
if (id < 0) {
type = "B";
} else {
type = "I";
}
itemname = Integer.toString(id);
} else {
type = "L";
itemname = "";
}
String[] splitted = cfg.get(CATEGORY_MOBSPAWNAMOUNTS, name + ".spawnamount." + materialType,
new String[] { type, itemname, Integer.toString(meta), Float.toString(amount) }).getStringList();
try {
type = splitted[0];
itemname = splitted[1];
meta = Integer.parseInt(splitted[2]);
amount = Float.parseFloat(splitted[3]);
} catch (NumberFormatException e) {
Logging.logError("Something went wrong parsing the spawnamount setting for '" + name + "'!");
return;
}
ItemStack stack = null;
if ("I".equals(type)) {
Item item;
try {
Integer id = Integer.parseInt(itemname);
item = (Item) Item.itemRegistry.getObjectById(id);
} catch (NumberFormatException e) {
item = (Item) Item.itemRegistry.getObject(itemname);
}
stack = new ItemStack(item, 1, meta);
} else if ("B".equals(type)) {
Block block;
try {
Integer id = Integer.parseInt(itemname);
block = (Block) Block.blockRegistry.getObjectById(id);
} catch (NumberFormatException e) {
block = (Block) Block.blockRegistry.getObject(itemname);
}
stack = new ItemStack(block, 1, meta);
} else if ("S".equals(type)) {
}
List<MobSpawnAmount> list = mobSpawnAmounts.get(name);
if (list == null) {
list = new ArrayList<MobSpawnAmount>(3);
list.add(null);
list.add(null);
list.add(null);
mobSpawnAmounts.put(name, list);
}
list.set(materialType, new MobSpawnAmount(stack, amount));
}
public static class MobSpawnAmount {
private final ItemStack object;
private final float amount;
public MobSpawnAmount(ItemStack object, float amount) {
this.object = object;
this.amount = amount;
}
public ItemStack getObject() {
return object;
}
public float getAmount() {
return amount;
}
public Float match(ItemStack stack) {
if (object == null) {
// Living?
Item item = stack.getItem();
if (item instanceof ItemBlock) {
Block block = ((ItemBlock) item).field_150939_a;
return livingMatter.get(block);
} else {
return livingMatter.get(item);
}
}
if (stack.isItemEqual(object)) {
return 1.0f;
}
return null;
}
}
}