package com.rwtema.zoology.entities; import com.google.common.cache.CacheBuilder; import com.google.common.cache.CacheLoader; import com.google.common.cache.LoadingCache; import com.google.common.collect.LinkedHashMultimap; import com.google.common.collect.Maps; import com.google.common.collect.Sets; import com.rwtema.zoology.genes.GenePool; import com.rwtema.zoology.phenes.Phenotype; import com.rwtema.zoology.phenotypes.visualphenes.IVisualPhene; import com.rwtema.zoology.phenotypes.visualphenes.VisualInfo; import java.util.HashMap; import java.util.HashSet; import java.util.Set; import javax.annotation.Nonnull; import net.minecraft.entity.Entity; import net.minecraft.entity.passive.EntityAnimal; public class EntityGeneRegistry { public static HashSet> validClasses = Sets.newHashSet(); private static LinkedHashMultimap, Phenotype> phenotypes = LinkedHashMultimap.create(); private static HashMap, Class> equivalentClasses = Maps.newHashMap(); private static LoadingCache, GenePool> loader = CacheBuilder.newBuilder().build(new CacheLoader, GenePool>() { @Override public GenePool load(@Nonnull Class key) throws Exception { return new GenePool(key); } }); public static GenePool getGenePool(Class clazz) { return (GenePool) loader.getUnchecked(getEquiv(clazz)); } public static void register(Class clazz, Phenotype phenotype) { validClasses.add(clazz); phenotypes.put(clazz, phenotype); if(phenotype instanceof IVisualPhene){ VisualInfo.register(clazz, (IVisualPhene) phenotype); } } public static void registerClassEquivalency(Class baseClazz, Class otherClazz) { validClasses.add(otherClazz); equivalentClasses.put(otherClazz, baseClazz); } public static Class getEquiv(Class clazz) { Class equivClass = equivalentClasses.get(clazz); return equivClass != null ? equivClass : clazz; } public static void recreateGenePool() { loader.invalidateAll(); for (Class aClass : phenotypes.keySet()) { loader.getUnchecked(aClass); } } public static void setGenePool(Class clazz, GenePool pool) { loader.put(clazz, pool); } public static Set getPhenotypes(Class clazz) { return phenotypes.get(clazz); } public static Set> getClasses() { return phenotypes.keySet(); } }