package mhfc.net.common.core;
import java.util.Collections;
import java.util.HashMap;
import java.util.LinkedHashMap;
import java.util.Map;
import java.util.Set;
import org.apache.logging.log4j.Level;
import org.apache.logging.log4j.Logger;
import cpw.mods.fml.common.FMLLog;
import mhfc.net.MHFCMain;
import net.minecraft.entity.Entity;
import net.minecraft.nbt.NBTTagCompound;
import net.minecraft.stats.StatBase;
import net.minecraft.util.ChatComponentTranslation;
import net.minecraft.world.World;
public class MHFCMobList {
private static final Logger logger = MHFCMain.logger();;
private static Map<String, Class<? extends Entity>> stringToClassMapping = new HashMap<>();
private static Map<Class<? extends Entity>, String> classToStringMapping = new HashMap<>();
private static Map<Integer, Class<? extends Entity>> IDtoClassMapping = new HashMap<>();
private static Map<Class<? extends Entity>, Integer> classToIDMapping = new HashMap<>();
private static Map<String, Integer> stringToIDMapping = new HashMap<>();
private static Map<Integer, MHFCEggInfo> entityEggs = new LinkedHashMap<>();
public static void addMapping(Class<? extends Entity> clazz, String name, int id) {
stringToClassMapping.put(name, clazz);
classToStringMapping.put(clazz, name);
IDtoClassMapping.put(Integer.valueOf(id), clazz);
classToIDMapping.put(clazz, Integer.valueOf(id));
stringToIDMapping.put(name, Integer.valueOf(id));
}
public static void addMapping(
Class<? extends Entity> clazz,
String name,
int id,
int foregroundcolor,
int backgroundcolor) {
addMapping(clazz, name, id);
entityEggs.put(Integer.valueOf(id), new MHFCEggInfo(id, foregroundcolor, backgroundcolor));
}
private static Entity createEntityByClass(Class<? extends Entity> oclass, World world) {
if (oclass == null) {
return null;
}
Entity entity = null;
try {
entity = oclass.getConstructor(new Class[] { World.class }).newInstance(new Object[] { world });
} catch (Exception exception) {
exception.printStackTrace();
}
return entity;
}
public static Entity createEntityByName(String name, World world) {
Entity entity = createEntityByClass(getClassFromName(name), world);
if (entity == null) {
logger.warn("Skipping Entity with id " + name);
}
return entity;
}
public static Entity createEntityFromNBT(NBTTagCompound nbtTag, World world) {
Class<? extends Entity> oclass = stringToClassMapping.get(nbtTag.getString("id"));
Entity entity = createEntityByClass(oclass, world);
if (entity == null) {
logger.warn("Skipping Entity with id " + nbtTag.getString("id"));
return null;
}
try {
entity.readFromNBT(nbtTag);
} catch (Exception e) {
FMLLog.log(
Level.ERROR,
e,
"An Entity %s(%s) has thrown an exception during loading, its state cannot be restored. Report this to the mod author",
nbtTag.getString("id"),
oclass.getName());
entity = null;
}
return entity;
}
public static Entity createEntityByID(int par0, World par1World) {
Entity entity = createEntityByClass(getClassFromID(par0), par1World);
if (entity == null) {
logger.warn("Skipping Entity with id " + par0);
}
return entity;
}
public static int getEntityID(Entity entity) {
Class<? extends Entity> oclass = entity.getClass();
return classToIDMapping.containsKey(oclass) ? classToIDMapping.get(oclass).intValue() : -1;
}
public static String getEntityString(Entity entity) {
return classToStringMapping.get(entity.getClass());
}
public static Class<? extends Entity> getClassFromName(String name) {
return stringToClassMapping.get(name);
}
public static Class<? extends Entity> getClassFromID(int id) {
return IDtoClassMapping.get(Integer.valueOf(id));
}
public static String getStringFromID(int id) {
Class<? extends Entity> oclass = getClassFromID(id);
return oclass != null ? classToStringMapping.get(oclass) : null;
}
public static Set<String> nameset() {
return Collections.unmodifiableSet(stringToIDMapping.keySet());
}
public static Map<Integer, MHFCEggInfo> registeredEggs() {
return Collections.unmodifiableMap(entityEggs);
}
public static class MHFCEggInfo {
/**
* The entityID of the spawned mob
*/
public final int spawnedID;
/**
* Base color of the egg
*/
public final int primaryColor;
/**
* Color of the egg spots
*/
public final int secondaryColor;
public final StatBase field_151512_d;
public final StatBase field_151513_e;
public MHFCEggInfo(int par1, int par2, int par3) {
this.spawnedID = par1;
this.primaryColor = par2;
this.secondaryColor = par3;
this.field_151512_d = MHFCMobList.getKills(this);
this.field_151513_e = MHFCMobList.getKilledBy(this);
}
}
public static StatBase getKills(MHFCMobList.MHFCEggInfo eggInfo) {
String s = MHFCMobList.getStringFromID(eggInfo.spawnedID);
return s == null
? null
: (new StatBase(
"stat.killEntity." + s,
new ChatComponentTranslation(
"stat.entityKill",
new Object[] { new ChatComponentTranslation("entity." + s + ".name", new Object[0]) })))
.registerStat();
}
public static StatBase getKilledBy(MHFCMobList.MHFCEggInfo eggInfo) {
String s = MHFCMobList.getStringFromID(eggInfo.spawnedID);
return s == null
? null
: (new StatBase(
"stat.entityKilledBy." + s,
new ChatComponentTranslation(
"stat.entityKilledBy",
new Object[] { new ChatComponentTranslation("entity." + s + ".name", new Object[0]) })))
.registerStat();
}
}