Jump to content

NovaViper

Forge Modder
  • Posts

    1061
  • Joined

  • Last visited

Posts posted by NovaViper

  1. Hey, I decided to use the internal mcmod information instead of using the file. And I need help using the requiredMods parameter, as to what exactly do I put for that? On the file version, your suppose to put the modid of the mod (I'm trying to put Forge but it says it doesn't do strings)

     

    My information so far

    package net.novaviper.zeroquest;
    
    import net.minecraft.util.EnumChatFormatting;
    import net.minecraftforge.common.ForgeVersion;
    import net.minecraftforge.fml.common.event.FMLPreInitializationEvent;
    import net.novaviper.zeroquest.common.lib.Constants;
    
    //@formatter:off
    public class McModInformation {
    
    public static void load(FMLPreInitializationEvent event) {
    	// hard-code mod information so don't need mcmod.info file
    	event.getModMetadata().autogenerated = false; // stops it from complaining about missing mcmod.info
    	event.getModMetadata().credits = EnumChatFormatting.BLUE + Constants.credits;
    	event.getModMetadata().authorList.add(EnumChatFormatting.RED + Constants.author);
    	event.getModMetadata().description = EnumChatFormatting.YELLOW + Constants.description;
    	event.getModMetadata().url = Constants.url;
    	event.getModMetadata().logoFile = Constants.logo;
    	event.getModMetadata().requiredMods = ForgeVersion.getVersion();
    }
    
    }
    

  2. Also here is my Config Handler and Registers:

    package net.novaviper.zeroquest.common.config;
    
    import java.io.File;
    import java.util.ArrayList;
    import java.util.List;
    
    import net.minecraftforge.common.config.Configuration;
    import net.novaviper.zeroquest.common.lib.Constants;
    import net.novaviper.zeroquest.common.lib.IDs;
    import net.novaviper.zeroquest.common.lib.Registers;
    
    public class ConfigHandler {
    
    // Add more Categories for GuiFactory\\
    public static Configuration config;
    public static final String CATEGORY_LOAD = "load";
    public static final String CATEGORY_FUNCTION = "function";
    public static final String CATEGORY_MISC = "miscellaneous";
    public static final String CATEGORY_DIMENSION = "dimensions";
    public static final String CATEGORY_BIOME = "biomes";
    
    public static void init(File file) {
    	config = new Configuration(file, Constants.configVersion);
    	loadConfig();
    	Registers.addFMLCommonEventBus(new ConfigEvent());
    }
    
    public static void loadConfig() {
    	config.addCustomCategoryComment(CATEGORY_FUNCTION, "Here you can manage all mod and entity functions");
    	config.addCustomCategoryComment(CATEGORY_LOAD, "Here you can manage what the mod loads into the game");
    	config.addCustomCategoryComment(CATEGORY_MISC, "Here you can manage the miscellaneous functions of the mod");
    	config.addCustomCategoryComment(CATEGORY_DIMENSION, "Here you can manage the mod's dimension factors");
    	config.addCustomCategoryComment(CATEGORY_BIOME, "Here you can manage the mod's biome factors");
    
    	//@formatter:off
    	/*=================================Function Configurations==========================================*/
    	//@formatter:on
    	List<String> orderFunc = new ArrayList<String>();
    	Constants.DEF_MODCHECKER = config.get(CATEGORY_FUNCTION, "ModCheck", Constants.DEF_MODCHECKER).setLanguageKey(Constants.guiKey + "ModCheck").getBoolean(Constants.DEF_MODCHECKER);
    	orderFunc.add("ModCheck");
    	Constants.DEF_HEALING = config.get(CATEGORY_FUNCTION, "Healing", Constants.DEF_HEALING).setLanguageKey(Constants.guiKey + "Healing").getBoolean(Constants.DEF_HEALING);
    	orderFunc.add("Healing");
    	Constants.DEF_SNOWSTEP = config.get(CATEGORY_FUNCTION, "SnowStep", Constants.DEF_SNOWSTEP).setLanguageKey(Constants.guiKey + "SnowStep").getBoolean(Constants.DEF_SNOWSTEP);
    	orderFunc.add("SnowStep");
    	Constants.DEF_GRASSSTEP = config.get(CATEGORY_FUNCTION, "GrassStep", Constants.DEF_GRASSSTEP).setLanguageKey(Constants.guiKey + "GrassStep").getBoolean(Constants.DEF_GRASSSTEP);
    	orderFunc.add("GrassStep");
    
    	config.setCategoryPropertyOrder(CATEGORY_FUNCTION, orderFunc);
    
    	//@formatter:off
    	/*=================================Load Configurations==========================================*/
    	//@formatter:on
    	List<String> orderLoad = new ArrayList<String>();
    	Constants.DEF_DARKLOAD = config.get(CATEGORY_LOAD, "DarkElements", Constants.DEF_DARKLOAD).setLanguageKey(Constants.guiKey + "DarkElements").setRequiresMcRestart(true).getBoolean(Constants.DEF_DARKLOAD);
    	orderLoad.add("DarkElements");
    	Constants.DEF_STARTING_ITEMS = config.get(CATEGORY_LOAD, "StartingItems", Constants.DEF_STARTING_ITEMS).setLanguageKey(Constants.guiKey + "StartingItems").getBoolean(Constants.DEF_STARTING_ITEMS);
    	orderLoad.add("StartingItems");
    
    	config.setCategoryPropertyOrder(CATEGORY_LOAD, orderLoad);
    
    	//@formatter:off
    	/*=================================Miscellaneous Configurations==========================================*/
    	//@formatter:on
    	List<String> orderMisc = new ArrayList<String>();
    	Constants.DEF_HOWL = config.get(CATEGORY_MISC, "Howl", Constants.DEF_HOWL).setLanguageKey(Constants.guiKey + "Howl").getBoolean(Constants.DEF_HOWL);
    	orderMisc.add("Howl");
    	Constants.DEF_IS_HUNGER_ON = config.get(CATEGORY_MISC, "HungerDecay", Constants.DEF_IS_HUNGER_ON).setLanguageKey(Constants.guiKey + "HungerDecay").getBoolean(Constants.DEF_IS_HUNGER_ON);
    	orderMisc.add("HungerDecay");
    
    	config.setCategoryPropertyOrder(CATEGORY_MISC, orderMisc);
    	//@formatter:off
    	/*=================================DimensionsConfigurations==========================================*/
    	//@formatter:on
    	List<String> orderDimensions = new ArrayList<String>();
    	IDs.Nillax = config.get(CATEGORY_DIMENSION, "NillaxID", IDs.Nillax).setLanguageKey(Constants.guiKey + "NillaxID").setRequiresMcRestart(true).getInt(IDs.Nillax);
    	orderDimensions.add("NillaxID");
    	IDs.Darkax = config.get(CATEGORY_DIMENSION, "DarkaxID", IDs.Darkax).setLanguageKey(Constants.guiKey + "DarkaxID").setRequiresMcRestart(true).getInt(IDs.Darkax);
    	orderDimensions.add("DarkaxID");
    
    	config.setCategoryPropertyOrder(CATEGORY_DIMENSION, orderDimensions);
    
    	//@formatter:off
    	/*=================================BiomesConfigurations==========================================*/
    	//@formatter:on
    	List<String> orderBiomes = new ArrayList<String>();
    	IDs.bioZone = config.get(CATEGORY_BIOME, "BioZoneID", IDs.bioZone).setLanguageKey(Constants.guiKey + "BioZoneID").setRequiresMcRestart(true).getInt(IDs.bioZone);
    	orderBiomes.add("BioZoneID");
    	IDs.redSeed = config.get(CATEGORY_BIOME, "RedSeedID", IDs.redSeed).setLanguageKey(Constants.guiKey + "RedSeedID").setRequiresMcRestart(true).getInt(IDs.redSeed);
    	orderBiomes.add("RedSeedID");
    	IDs.blueTaiga = config.get(CATEGORY_BIOME, "BlueTaigaID", IDs.blueTaiga).setLanguageKey(Constants.guiKey + "BlueTaigaID").setRequiresMcRestart(true).getInt(IDs.blueTaiga);
    	orderBiomes.add("BlueTaigaID");
    	IDs.blueTaigaHills = config.get(CATEGORY_BIOME, "BlueTaigaHillsID", IDs.blueTaigaHills).setLanguageKey(Constants.guiKey + "BlueTaigaHillsID").setRequiresMcRestart(true).getInt(IDs.blueTaigaHills);
    	orderBiomes.add("BlueTaigaHillsID");
    	IDs.blueColdTaiga = config.get(CATEGORY_BIOME, "BlueColdTaigaID", IDs.blueColdTaiga).setLanguageKey(Constants.guiKey + "BlueColdTaigaID").setRequiresMcRestart(true).getInt(IDs.blueColdTaiga);
    	orderBiomes.add("BlueColdTaigaID");
    	IDs.blueColdTaigaHills = config.get(CATEGORY_BIOME, "BlueColdTaigaHillsID", IDs.blueColdTaigaHills).setLanguageKey(Constants.guiKey + "BlueColdTaigaHillsID").setRequiresMcRestart(true).getInt(IDs.blueColdTaigaHills);
    	orderBiomes.add("BlueColdTaigaHillsID");
    	IDs.blueMegaTaiga = config.get(CATEGORY_BIOME, "BlueMegaTaigaID", IDs.blueMegaTaiga).setLanguageKey(Constants.guiKey + "BlueMegaTaigaID").setRequiresMcRestart(true).getInt(IDs.blueMegaTaiga);
    	orderBiomes.add("BlueMegaTaigaID");
    	IDs.blueMegaTaigaHills = config.get(CATEGORY_BIOME, "BlueMegaTaigaHillsID", IDs.blueMegaTaigaHills).setLanguageKey(Constants.guiKey + "BlueMegaTaigaHillsID").setRequiresMcRestart(true).getInt(IDs.blueMegaTaigaHills);
    	orderBiomes.add("BlueMegaTaigaHillsID");
    	IDs.pinkZone = config.get(CATEGORY_BIOME, "PinkZoneID", IDs.pinkZone).setLanguageKey(Constants.guiKey + "PinkZoneID").setRequiresMcRestart(true).getInt(IDs.pinkZone);
    	orderBiomes.add("PinkZoneID");
    	IDs.destroZone = config.get(CATEGORY_BIOME, "DestroZoneID", IDs.destroZone).setLanguageKey(Constants.guiKey + "DestroZoneID").setRequiresMcRestart(true).getInt(IDs.destroZone);
    	orderBiomes.add("DestroZoneID");
    	IDs.destroZoneHills = config.get(CATEGORY_BIOME, "DestroZoneHillsID", IDs.destroZoneHills).setLanguageKey(Constants.guiKey + "DestroZoneHillsID").setRequiresMcRestart(true).getInt(IDs.destroZoneHills);
    	orderBiomes.add("DestroZoneHillsID");
    	IDs.walRockland = config.get(CATEGORY_BIOME, "WalRocklandID", IDs.walRockland).setLanguageKey(Constants.guiKey + "WalRocklandID").setRequiresMcRestart(true).getInt(IDs.walRockland);
    	orderBiomes.add("WalRocklandID");
    	IDs.nileSavanna = config.get(CATEGORY_BIOME, "NileSavannaID", IDs.nileSavanna).setLanguageKey(Constants.guiKey + "NileSavannaID").setRequiresMcRestart(true).getInt(IDs.nileSavanna);
    	orderBiomes.add("NileSavannaID");
    	IDs.nileSavannaPlateau = config.get(CATEGORY_BIOME, "NileSavannaPlateauID", IDs.nileSavannaPlateau).setLanguageKey(Constants.guiKey + "NileSavannaPlateauID").setRequiresMcRestart(true).getInt(IDs.nileSavannaPlateau);
    	orderBiomes.add("NileSavannaPlateauID");
    	IDs.nileJungle = config.get(CATEGORY_BIOME, "NileJungleID", IDs.nileJungle).setLanguageKey(Constants.guiKey + "NileJungleID").setRequiresMcRestart(true).getInt(IDs.nileJungle);
    	orderBiomes.add("NileJungleID");
    	IDs.nileJungleHills = config.get(CATEGORY_BIOME, "NileJungleHillsID", IDs.nileJungleHills).setLanguageKey(Constants.guiKey + "NileJungleHillsID").setRequiresMcRestart(true).getInt(IDs.nileJungleHills);
    	orderBiomes.add("NileJungleHillsID");
    	IDs.nileJungleEdge = config.get(CATEGORY_BIOME, "NileJungleEdgeID", IDs.nileJungleEdge).setLanguageKey(Constants.guiKey + "NileJungleEdgeID").setRequiresMcRestart(true).getInt(IDs.nileJungleEdge);
    	orderBiomes.add("NileJungleEdgeID");
    	IDs.nileSwampland = config.get(CATEGORY_BIOME, "NileSwamplandID", IDs.nileSwampland).setLanguageKey(Constants.guiKey + "NileSwamplandID").setRequiresMcRestart(true).getInt(IDs.nileSwampland);
    	orderBiomes.add("NileSwamplandID");
    	IDs.nileMesa = config.get(CATEGORY_BIOME, "NileMesaID", IDs.nileMesa).setLanguageKey(Constants.guiKey + "NileMesaID").setRequiresMcRestart(true).getInt(IDs.nileMesa);
    	orderBiomes.add("NileMesaID");
    	IDs.nileMesaPlateau_F = config.get(CATEGORY_BIOME, "NileMesaPlateauFID", IDs.nileMesaPlateau_F).setLanguageKey(Constants.guiKey + "NileMesaPlateauFID").setRequiresMcRestart(true).getInt(IDs.nileMesaPlateau_F);
    	orderBiomes.add("NileMesaPlateauFID");
    	IDs.nileMesaPlateau = config.get(CATEGORY_BIOME, "NileMesaPlateauID", IDs.nileMesaPlateau).setLanguageKey(Constants.guiKey + "NileMesaPlateauID").setRequiresMcRestart(true).getInt(IDs.nileMesaPlateau);
    	orderBiomes.add("NileMesaPlateauID");
    	IDs.nileMountains = config.get(CATEGORY_BIOME, "NileMountainsID", IDs.nileMountains).setLanguageKey(Constants.guiKey + "NileMountainsID").setRequiresMcRestart(true).getInt(IDs.nileMountains);
    	orderBiomes.add("NileMountainsID");
    	IDs.nileMountainsEdge = config.get(CATEGORY_BIOME, "NileMountainsEdgeID", IDs.nileMountainsEdge).setLanguageKey(Constants.guiKey + "NileMountainsEdgeID").setRequiresMcRestart(true).getInt(IDs.nileMountainsEdge);
    	orderBiomes.add("NileMountainsEdgeID");
    	IDs.nileMountainsPlus = config.get(CATEGORY_BIOME, "NileMountainsPlusID", IDs.nileMountainsPlus).setLanguageKey(Constants.guiKey + "NileMountainsPlusID").setRequiresMcRestart(true).getInt(IDs.nileMountainsPlus);
    	orderBiomes.add("NileMountainsPlusID");
    	IDs.darkWasteland = config.get(CATEGORY_BIOME, "DarkaxBiomeID", IDs.darkWasteland).setLanguageKey(Constants.guiKey + "DarkaxBiomeID").setRequiresMcRestart(true).getInt(IDs.darkWasteland);
    	orderBiomes.add("DarkaxBiomeID");
    
    	config.setCategoryPropertyOrder(CATEGORY_BIOME, orderBiomes);
    
    	if (config.hasChanged()) {
    		config.save();
    	}
    }
    }

     

    package net.novaviper.zeroquest.common.lib;
    
    import net.minecraft.block.Block;
    import net.minecraft.block.properties.IProperty;
    import net.minecraft.client.Minecraft;
    import net.minecraft.client.renderer.block.statemap.StateMap;
    import net.minecraft.client.renderer.entity.Render;
    import net.minecraft.client.renderer.tileentity.TileEntitySpecialRenderer;
    import net.minecraft.client.resources.model.ModelBakery;
    import net.minecraft.client.resources.model.ModelResourceLocation;
    import net.minecraft.client.settings.KeyBinding;
    import net.minecraft.command.ICommand;
    import net.minecraft.command.ServerCommandManager;
    import net.minecraft.entity.Entity;
    import net.minecraft.entity.EntityList;
    import net.minecraft.entity.EnumCreatureType;
    import net.minecraft.item.Item;
    import net.minecraft.item.ItemStack;
    import net.minecraft.server.MinecraftServer;
    import net.minecraft.tileentity.TileEntity;
    import net.minecraft.world.WorldProvider;
    import net.minecraft.world.biome.BiomeGenBase;
    import net.minecraftforge.client.model.ModelLoader;
    import net.minecraftforge.common.DimensionManager;
    import net.minecraftforge.common.MinecraftForge;
    import net.minecraftforge.fluids.Fluid;
    import net.minecraftforge.fluids.FluidContainerRegistry;
    import net.minecraftforge.fluids.FluidRegistry;
    import net.minecraftforge.fluids.FluidStack;
    import net.minecraftforge.fml.client.registry.ClientRegistry;
    import net.minecraftforge.fml.client.registry.RenderingRegistry;
    import net.minecraftforge.fml.common.FMLCommonHandler;
    import net.minecraftforge.fml.common.IFuelHandler;
    import net.minecraftforge.fml.common.IWorldGenerator;
    import net.minecraftforge.fml.common.network.IGuiHandler;
    import net.minecraftforge.fml.common.network.NetworkRegistry;
    import net.minecraftforge.fml.common.registry.EntityRegistry;
    import net.minecraftforge.fml.common.registry.GameRegistry;
    import net.novaviper.zeroquest.common.api.interfaces.ITalent;
    import net.novaviper.zeroquest.common.api.registry.TalentRegistry;
    import net.novaviper.zeroquest.common.handlers.BucketHandler;
    
    public class Registers {
    
    public static final String tag = "EntityName";
    public static int startEntityId = 300;
    
    // Zero Quest Registers\\
    public static void addGuiHandler(Object mod, IGuiHandler handler) {
    	NetworkRegistry.INSTANCE.registerGuiHandler(mod, handler);
    }
    
    public static void addWorldGenerator(IWorldGenerator generator, int modGenerationWeight) {
    	GameRegistry.registerWorldGenerator(generator, modGenerationWeight);
    }
    
    public static void addFuelHandler(IFuelHandler handler) {
    	GameRegistry.registerFuelHandler(handler);
    }
    
    public static void addCommand(ICommand command) {
    	MinecraftServer server = MinecraftServer.getServer();
    	ServerCommandManager cmdman = (ServerCommandManager) server.getCommandManager();
    	cmdman.registerCommand(command);
    }
    
    public static void addForgeEventBus(Object target) {
    	MinecraftForge.EVENT_BUS.register(target);
    }
    
    public static void addFMLCommonEventBus(Object target) {
    	FMLCommonHandler.instance().bus().register(target);
    }
    
    public static void addDimensionProviderType(int id, Class<? extends WorldProvider> provider, boolean keepLoaded) {
    	DimensionManager.registerProviderType(id, provider, keepLoaded);
    }
    
    public static void addDimension(int id, int providerType) {
    	DimensionManager.registerDimension(id, providerType);
    }
    
    // Block Registers\\
    public static void addBlock(Block block, String name) {
    	GameRegistry.registerBlock(block, name);
    }
    
    public static void addBlockWithClass(Block block, Class itemClass, String name) {
    	GameRegistry.registerBlock(block, itemClass, name);
    }
    
    public static void addBlockRender(Block block, int metadata, String blockString, String location) {
    	Minecraft.getMinecraft().getRenderItem().getItemModelMesher().register(Item.getItemFromBlock(block), metadata, new ModelResourceLocation(blockString, location));
    }
    
    // Entity Registers\\
    public static void addEntitySpawn(Class entityClass, int weightedProb, int min, int max, EnumCreatureType typeOfCreature, BiomeGenBase... biomes) {
    	EntityRegistry.addSpawn(entityClass, weightedProb, min, max, typeOfCreature, biomes);
    }
    
    public static void addEntity(Class entityClass, String saveName, int id, Object mod) {
    	EntityRegistry.registerModEntity(entityClass, saveName, id, mod, 120, 1, true);
    }
    
    public static void addEntityEgg(Class<? extends Entity> entity, int main, int spots) {
    	int id = getUniqueEntityId();
    	EntityList.idToClassMapping.put(id, entity);
    	EntityList.entityEggs.put(id, new EntityList.EntityEggInfo(id, main, spots));
    }
    
    public static void addTileEntity(Class entityTileClass, String saveName) {
    	GameRegistry.registerTileEntity(entityTileClass, saveName);
    }
    
    public static void addProjectileEntity(Class entityClass, String saveName, int id, Object mod) {
    	EntityRegistry.registerModEntity(entityClass, saveName, id, mod, 128, 1, true);
    }
    
    public static int getUniqueEntityId() {
    	do {
    		startEntityId++;
    	}
    	while (EntityList.getStringFromID(startEntityId) != null);
    
    	return startEntityId;
    }
    
    // Item Registers\\
    public static void addItem(Item item, String name) {
    	GameRegistry.registerItem(item, name);
    }
    
    public static void addItemRender(Item item, int metadata, String itemString, String location) {
    	Minecraft.getMinecraft().getRenderItem().getItemModelMesher().register(item, metadata, new ModelResourceLocation(itemString, location));
    }
    
    public static void addItemVariant(Item item, String... names) {
    	ModelBakery.addVariantName(item, names);
    }
    // Liquids Registers\\
    public static void putLiquidsInBuckets(Block liquid, Item liquidBucket) {
    	BucketHandler.INSTANCE.buckets.put(liquid, liquidBucket);
    }
    
    // Talent Registers\\
    public static void registerTalent(ITalent talent) {
    	TalentRegistry.registerTalent(talent);
    }
    
    //Fluid Registers\\
    public static void addFluidContainer(FluidStack stack, ItemStack filledContainer, ItemStack emptyContainer) {
    	FluidContainerRegistry.registerFluidContainer(stack, filledContainer, emptyContainer);
    }
    
    public static void addFluid(Fluid fluid) {
    	FluidRegistry.registerFluid(fluid);
    }
    
    // Recipes Registers\\
    public static void addSmelting(ItemStack input, ItemStack output, float xp) {
    	GameRegistry.addSmelting(input, output, xp);
    }
    
    public static void addShapedRecipe(ItemStack output, Object... params) {
    	GameRegistry.addShapedRecipe(output, params);
    }
    
    public static void addShapelessRecipe(ItemStack output, Object... params) {
    	GameRegistry.addShapelessRecipe(output, params);
    }
    
    public static void addRecipe(ItemStack output, Object... params) {
    	GameRegistry.addRecipe(output, params);
    }
    
    // Client Registers\\
    public static void addKeyBinding(KeyBinding key) {
    	ClientRegistry.registerKeyBinding(key);
    }
    
    public static void bindTileEntitySpecialRenderer(Class<? extends TileEntity> tileentity, TileEntitySpecialRenderer render) {
    	ClientRegistry.bindTileEntitySpecialRenderer(tileentity, render);
    }
    
    public static void addEntityRender(Class entityClass, Render render) {
    	RenderingRegistry.registerEntityRenderingHandler(entityClass, render);
    }
    
    public static void addStateMapperToIgnore(Block block, IProperty property) {
    	ModelLoader.setCustomStateMapper(block, (new StateMap.Builder()).addPropertiesToIgnore(new IProperty[] { property }).build());
    }
    }

  3. Hey, someone reported to me that when running their server, my mod Zero Quest crashes, so I ran a clean server on eclipse and got the same exact crash.

     

    [08:31:58] [main/INFO] [GradleStart]: Extra: []
    [08:31:59] [main/INFO] [GradleStart]: Running with arguments: [--tweakClass, net.minecraftforge.fml.common.launcher.FMLServerTweaker, --tweakClass, net.minecraftforge.gradle.tweakers.CoremodTweaker]
    [08:31:59] [main/INFO] [LaunchWrapper]: Loading tweak class name net.minecraftforge.fml.common.launcher.FMLServerTweaker
    [08:31:59] [main/INFO] [LaunchWrapper]: Using primary tweak class name net.minecraftforge.fml.common.launcher.FMLServerTweaker
    [08:31:59] [main/INFO] [LaunchWrapper]: Loading tweak class name net.minecraftforge.gradle.tweakers.CoremodTweaker
    [08:31:59] [main/INFO] [LaunchWrapper]: Calling tweak class net.minecraftforge.fml.common.launcher.FMLServerTweaker
    [08:31:59] [main/INFO] [FML]: Forge Mod Loader version 8.99.188.1495 for Minecraft 1.8 loading
    [08:31:59] [main/INFO] [FML]: Java is Java HotSpot(TM) 64-Bit Server VM, version 1.8.0_51, running on Windows 8.1:amd64:6.3, installed at C:\Program Files\Java\jre1.8.0_51
    [08:31:59] [main/INFO] [FML]: Managed to load a deobfuscated Minecraft name- we are in a deobfuscated environment. Skipping runtime deobfuscation
    [08:32:00] [main/WARN] [FML]: The coremod codechicken.core.launch.CodeChickenCorePlugin does not have a MCVersion annotation, it may cause issues with this version of Minecraft
    [08:32:01] [main/WARN] [FML]: The coremod codechicken.lib.asm.CCLCorePlugin does not have a MCVersion annotation, it may cause issues with this version of Minecraft
    [08:32:01] [main/WARN] [FML]: The coremod codechicken.lib.asm.CCLCorePlugin does not have a MCVersion annotation, it may cause issues with this version of Minecraft
    [08:32:01] [main/WARN] [FML]: The coremod codechicken.nei.asm.NEICorePlugin does not have a MCVersion annotation, it may cause issues with this version of Minecraft
    [08:32:01] [main/INFO] [LaunchWrapper]: Calling tweak class net.minecraftforge.gradle.tweakers.CoremodTweaker
    [08:32:01] [main/INFO] [GradleStart]: Injecting location in coremod net.minecraftforge.fml.relauncher.FMLCorePlugin
    [08:32:01] [main/INFO] [GradleStart]: Injecting location in coremod net.minecraftforge.classloading.FMLForgePlugin
    [08:32:01] [main/INFO] [GradleStart]: Injecting location in coremod codechicken.core.asm.MCPDeobfuscationTransformer.LoadPlugin
    [08:32:01] [main/INFO] [GradleStart]: Injecting location in coremod codechicken.lib.asm.CCLCorePlugin
    [08:32:01] [main/INFO] [GradleStart]: Injecting location in coremod codechicken.core.launch.CodeChickenCorePlugin
    [08:32:01] [main/INFO] [GradleStart]: Injecting location in coremod codechicken.lib.asm.CCLCorePlugin
    [08:32:01] [main/INFO] [GradleStart]: Injecting location in coremod codechicken.nei.asm.NEICorePlugin
    [08:32:01] [main/INFO] [LaunchWrapper]: Loading tweak class name net.minecraftforge.fml.common.launcher.FMLInjectionAndSortingTweaker
    [08:32:01] [main/INFO] [LaunchWrapper]: Loading tweak class name net.minecraftforge.fml.common.launcher.FMLDeobfTweaker
    [08:32:01] [main/INFO] [LaunchWrapper]: Loading tweak class name net.minecraftforge.gradle.tweakers.AccessTransformerTweaker
    [08:32:01] [main/INFO] [LaunchWrapper]: Calling tweak class net.minecraftforge.fml.common.launcher.FMLInjectionAndSortingTweaker
    [08:32:01] [main/INFO] [LaunchWrapper]: Calling tweak class net.minecraftforge.fml.common.launcher.FMLInjectionAndSortingTweaker
    [08:32:01] [main/INFO] [LaunchWrapper]: Calling tweak class net.minecraftforge.fml.relauncher.CoreModManager$FMLPluginWrapper
    [08:32:02] [main/ERROR] [FML]: The binary patch set is missing. Either you are in a development environment, or things are not going to work!
    [08:32:17] [main/ERROR] [FML]: FML appears to be missing any signature data. This is not a good thing
    [08:32:17] [main/INFO] [LaunchWrapper]: Calling tweak class net.minecraftforge.fml.relauncher.CoreModManager$FMLPluginWrapper
    [08:32:18] [main/INFO] [LaunchWrapper]: Calling tweak class net.minecraftforge.fml.relauncher.CoreModManager$FMLPluginWrapper
    [08:32:19] [main/INFO] [LaunchWrapper]: Calling tweak class net.minecraftforge.fml.relauncher.CoreModManager$FMLPluginWrapper
    [08:32:20] [main/INFO] [LaunchWrapper]: Calling tweak class net.minecraftforge.fml.relauncher.CoreModManager$FMLPluginWrapper
    [08:32:20] [main/INFO] [LaunchWrapper]: Calling tweak class net.minecraftforge.fml.relauncher.CoreModManager$FMLPluginWrapper
    [08:32:20] [main/INFO] [LaunchWrapper]: Calling tweak class net.minecraftforge.fml.relauncher.CoreModManager$FMLPluginWrapper
    [08:32:20] [main/INFO] [LaunchWrapper]: Calling tweak class net.minecraftforge.fml.common.launcher.FMLDeobfTweaker
    [08:32:23] [main/INFO] [LaunchWrapper]: Calling tweak class net.minecraftforge.gradle.tweakers.AccessTransformerTweaker
    [08:32:24] [main/INFO] [GradleStart]: Remapping AccessTransformer rules...
    [08:32:24] [main/INFO] [LaunchWrapper]: Loading tweak class name net.minecraftforge.fml.common.launcher.TerminalTweaker
    [08:32:24] [main/INFO] [LaunchWrapper]: Calling tweak class net.minecraftforge.fml.common.launcher.TerminalTweaker
    [08:32:31] [main/INFO] [LaunchWrapper]: Launching wrapped minecraft {net.minecraft.server.MinecraftServer}
    [08:32:55] [server thread/INFO]: Starting minecraft server version 1.8
    [08:32:57] [server thread/INFO] [MinecraftForge]: Attempting early MinecraftForge initialization
    [08:32:57] [server thread/INFO] [FML]: MinecraftForge v11.14.3.1495 Initialized
    [08:32:58] [server thread/INFO] [FML]: Replaced 204 ore recipies
    [08:33:00] [server thread/INFO] [MinecraftForge]: Completed early MinecraftForge initialization
    [08:33:02] [server thread/INFO] [FML]: Found 0 mods from the command line. Injecting into mod discoverer
    [08:33:02] [server thread/INFO] [FML]: Searching C:\Users\NovaPC\Desktop\ModStuff\Mods\ZeroQuest\eclipse\mods for mods
    [08:33:02] [server thread/INFO] [FML]: Also searching C:\Users\NovaPC\Desktop\ModStuff\Mods\ZeroQuest\eclipse\mods\1.8 for mods
    [08:33:36] [server thread/INFO] [FML]: Forge Mod Loader has identified 6 mods to load
    [08:33:42] [server thread/INFO] [FML]: Attempting connection with missing mods [mcp, FML, Forge, CodeChickenCore, NotEnoughItems, zero_quest] at CLIENT
    [08:33:42] [server thread/INFO] [FML]: Attempting connection with missing mods [mcp, FML, Forge, CodeChickenCore, NotEnoughItems, zero_quest] at SERVER
    [08:33:49] [server thread/INFO] [FML]: Processing ObjectHolder annotations
    [08:33:49] [server thread/INFO] [FML]: Found 384 ObjectHolder annotations
    [08:33:50] [server thread/INFO] [FML]: Identifying ItemStackHolder annotations
    [08:33:50] [server thread/INFO] [FML]: Found 0 ItemStackHolder annotations
    [08:33:53] [server thread/INFO] [FML]: Configured a dormant chunk cache size of 0
    [08:33:54] [server thread/INFO] [FML]: Applying holder lookups
    [08:33:54] [server thread/INFO] [FML]: Holder lookups applied
    [08:33:54] [server thread/INFO] [FML]: Injecting itemstacks
    [08:33:54] [server thread/INFO] [FML]: Itemstack injection complete
    [08:33:54] [server thread/ERROR] [FML]: Fatal errors were detected during the transition from PREINITIALIZATION to INITIALIZATION. Loading cannot continue
    [08:33:54] [server thread/ERROR] [FML]: 
    States: 'U' = Unloaded 'L' = Loaded 'C' = Constructed 'H' = Pre-initialized 'I' = Initialized 'J' = Post-initialized 'A' = Available 'D' = Disabled 'E' = Errored
    UCH	mcp{9.05} [Minecraft Coder Pack] (minecraft.jar) 
    UCH	FML{8.0.99.99} [Forge Mod Loader] (forgeSrc-1.8-11.14.3.1495.jar) 
    UCH	Forge{11.14.3.1495} [Minecraft Forge] (forgeSrc-1.8-11.14.3.1495.jar) 
    UCH	CodeChickenCore{1.0.5.36} [CodeChicken Core] (minecraft.jar) 
    UCH	NotEnoughItems{1.0.5.104} [Not Enough Items] (NotEnoughItems-1.8-1.0.5.104-dev.jar) 
    UCE	zero_quest{v1.9.0} [Zero Quest] (bin) 
    [08:33:54] [server thread/ERROR] [FML]: The following problems were captured during this phase
    [08:33:54] [server thread/ERROR] [FML]: Caught exception from zero_quest
    java.lang.NoClassDefFoundError: net/minecraft/client/renderer/block/statemap/IStateMapper
    at net.novaviper.zeroquest.common.config.ConfigHandler.init(ConfigHandler.java:25) ~[ConfigHandler.class:?]
    at net.novaviper.zeroquest.ZeroQuest.preInit(ZeroQuest.java:57) ~[ZeroQuest.class:?]
    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) ~[?:1.8.0_51]
    at sun.reflect.NativeMethodAccessorImpl.invoke(Unknown Source) ~[?:1.8.0_51]
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(Unknown Source) ~[?:1.8.0_51]
    at java.lang.reflect.Method.invoke(Unknown Source) ~[?:1.8.0_51]
    at net.minecraftforge.fml.common.FMLModContainer.handleModStateEvent(FMLModContainer.java:537) ~[FMLModContainer.class:?]
    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) ~[?:1.8.0_51]
    at sun.reflect.NativeMethodAccessorImpl.invoke(Unknown Source) ~[?:1.8.0_51]
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(Unknown Source) ~[?:1.8.0_51]
    at java.lang.reflect.Method.invoke(Unknown Source) ~[?:1.8.0_51]
    at com.google.common.eventbus.EventSubscriber.handleEvent(EventSubscriber.java:74) ~[guava-17.0.jar:?]
    at com.google.common.eventbus.SynchronizedEventSubscriber.handleEvent(SynchronizedEventSubscriber.java:47) ~[guava-17.0.jar:?]
    at com.google.common.eventbus.EventBus.dispatch(EventBus.java:322) ~[guava-17.0.jar:?]
    at com.google.common.eventbus.EventBus.dispatchQueuedEvents(EventBus.java:304) ~[guava-17.0.jar:?]
    at com.google.common.eventbus.EventBus.post(EventBus.java:275) ~[guava-17.0.jar:?]
    at net.minecraftforge.fml.common.LoadController.sendEventToModContainer(LoadController.java:212) ~[LoadController.class:?]
    at net.minecraftforge.fml.common.LoadController.propogateStateMessage(LoadController.java:190) ~[LoadController.class:?]
    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) ~[?:1.8.0_51]
    at sun.reflect.NativeMethodAccessorImpl.invoke(Unknown Source) ~[?:1.8.0_51]
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(Unknown Source) ~[?:1.8.0_51]
    at java.lang.reflect.Method.invoke(Unknown Source) ~[?:1.8.0_51]
    at com.google.common.eventbus.EventSubscriber.handleEvent(EventSubscriber.java:74) ~[guava-17.0.jar:?]
    at com.google.common.eventbus.SynchronizedEventSubscriber.handleEvent(SynchronizedEventSubscriber.java:47) ~[guava-17.0.jar:?]
    at com.google.common.eventbus.EventBus.dispatch(EventBus.java:322) ~[guava-17.0.jar:?]
    at com.google.common.eventbus.EventBus.dispatchQueuedEvents(EventBus.java:304) ~[guava-17.0.jar:?]
    at com.google.common.eventbus.EventBus.post(EventBus.java:275) ~[guava-17.0.jar:?]
    at net.minecraftforge.fml.common.LoadController.distributeStateMessage(LoadController.java:119) [LoadController.class:?]
    at net.minecraftforge.fml.common.Loader.preinitializeMods(Loader.java:550) [Loader.class:?]
    at net.minecraftforge.fml.server.FMLServerHandler.beginServerLoading(FMLServerHandler.java:88) [FMLServerHandler.class:?]
    at net.minecraftforge.fml.common.FMLCommonHandler.onServerStart(FMLCommonHandler.java:355) [FMLCommonHandler.class:?]
    at net.minecraft.server.dedicated.DedicatedServer.startServer(DedicatedServer.java:120) [DedicatedServer.class:?]
    at net.minecraft.server.MinecraftServer.run(MinecraftServer.java:500) [MinecraftServer.class:?]
    at java.lang.Thread.run(Unknown Source) [?:1.8.0_51]
    Caused by: java.lang.ClassNotFoundException: net.minecraft.client.renderer.block.statemap.IStateMapper
    at net.minecraft.launchwrapper.LaunchClassLoader.findClass(LaunchClassLoader.java:191) ~[launchwrapper-1.12.jar:?]
    at java.lang.ClassLoader.loadClass(Unknown Source) ~[?:1.8.0_51]
    at java.lang.ClassLoader.loadClass(Unknown Source) ~[?:1.8.0_51]
    ... 34 more
    Caused by: net.minecraftforge.fml.common.asm.ASMTransformerWrapper$TransformerException: Exception in class transformer net.minecraftforge.fml.common.asm.transformers.SideTransformer@4afcd809 from coremod FMLCorePlugin
    at net.minecraftforge.fml.common.asm.ASMTransformerWrapper$TransformerWrapper.transform(ASMTransformerWrapper.java:234) ~[forgeSrc-1.8-11.14.3.1495.jar:?]
    at net.minecraft.launchwrapper.LaunchClassLoader.runTransformers(LaunchClassLoader.java:279) ~[launchwrapper-1.12.jar:?]
    at net.minecraft.launchwrapper.LaunchClassLoader.findClass(LaunchClassLoader.java:176) ~[launchwrapper-1.12.jar:?]
    at java.lang.ClassLoader.loadClass(Unknown Source) ~[?:1.8.0_51]
    at java.lang.ClassLoader.loadClass(Unknown Source) ~[?:1.8.0_51]
    ... 34 more
    Caused by: java.lang.RuntimeException: Attempted to load class net/minecraft/client/renderer/block/statemap/IStateMapper for invalid side SERVER
    at net.minecraftforge.fml.common.asm.transformers.SideTransformer.transform(SideTransformer.java:49) ~[forgeSrc-1.8-11.14.3.1495.jar:?]
    at net.minecraftforge.fml.common.asm.ASMTransformerWrapper$TransformerWrapper.transform(ASMTransformerWrapper.java:230) ~[forgeSrc-1.8-11.14.3.1495.jar:?]
    at net.minecraft.launchwrapper.LaunchClassLoader.runTransformers(LaunchClassLoader.java:279) ~[launchwrapper-1.12.jar:?]
    at net.minecraft.launchwrapper.LaunchClassLoader.findClass(LaunchClassLoader.java:176) ~[launchwrapper-1.12.jar:?]
    at java.lang.ClassLoader.loadClass(Unknown Source) ~[?:1.8.0_51]
    at java.lang.ClassLoader.loadClass(Unknown Source) ~[?:1.8.0_51]
    ... 34 more
    [08:33:54] [server thread/ERROR]: Encountered an unexpected exception
    net.minecraftforge.fml.common.LoaderException: java.lang.NoClassDefFoundError: net/minecraft/client/renderer/block/statemap/IStateMapper
    
    at net.minecraftforge.fml.common.LoadController.transition(LoadController.java:163) ~[LoadController.class:?]
    at net.minecraftforge.fml.common.Loader.preinitializeMods(Loader.java:553) ~[Loader.class:?]
    at net.minecraftforge.fml.server.FMLServerHandler.beginServerLoading(FMLServerHandler.java:88) ~[FMLServerHandler.class:?]
    at net.minecraftforge.fml.common.FMLCommonHandler.onServerStart(FMLCommonHandler.java:355) ~[FMLCommonHandler.class:?]
    at net.minecraft.server.dedicated.DedicatedServer.startServer(DedicatedServer.java:120) ~[DedicatedServer.class:?]
    at net.minecraft.server.MinecraftServer.run(MinecraftServer.java:500) [MinecraftServer.class:?]
    at java.lang.Thread.run(Unknown Source) [?:1.8.0_51]
    Caused by: java.lang.NoClassDefFoundError: net/minecraft/client/renderer/block/statemap/IStateMapper
    at net.novaviper.zeroquest.common.config.ConfigHandler.init(ConfigHandler.java:25) ~[ConfigHandler.class:?]
    at net.novaviper.zeroquest.ZeroQuest.preInit(ZeroQuest.java:57) ~[ZeroQuest.class:?]
    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) ~[?:1.8.0_51]
    at sun.reflect.NativeMethodAccessorImpl.invoke(Unknown Source) ~[?:1.8.0_51]
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(Unknown Source) ~[?:1.8.0_51]
    at java.lang.reflect.Method.invoke(Unknown Source) ~[?:1.8.0_51]
    at net.minecraftforge.fml.common.FMLModContainer.handleModStateEvent(FMLModContainer.java:537) ~[FMLModContainer.class:?]
    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) ~[?:1.8.0_51]
    at sun.reflect.NativeMethodAccessorImpl.invoke(Unknown Source) ~[?:1.8.0_51]
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(Unknown Source) ~[?:1.8.0_51]
    at java.lang.reflect.Method.invoke(Unknown Source) ~[?:1.8.0_51]
    at com.google.common.eventbus.EventSubscriber.handleEvent(EventSubscriber.java:74) ~[guava-17.0.jar:?]
    at com.google.common.eventbus.SynchronizedEventSubscriber.handleEvent(SynchronizedEventSubscriber.java:47) ~[guava-17.0.jar:?]
    at com.google.common.eventbus.EventBus.dispatch(EventBus.java:322) ~[guava-17.0.jar:?]
    at com.google.common.eventbus.EventBus.dispatchQueuedEvents(EventBus.java:304) ~[guava-17.0.jar:?]
    at com.google.common.eventbus.EventBus.post(EventBus.java:275) ~[guava-17.0.jar:?]
    at net.minecraftforge.fml.common.LoadController.sendEventToModContainer(LoadController.java:212) ~[LoadController.class:?]
    at net.minecraftforge.fml.common.LoadController.propogateStateMessage(LoadController.java:190) ~[LoadController.class:?]
    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) ~[?:1.8.0_51]
    at sun.reflect.NativeMethodAccessorImpl.invoke(Unknown Source) ~[?:1.8.0_51]
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(Unknown Source) ~[?:1.8.0_51]
    at java.lang.reflect.Method.invoke(Unknown Source) ~[?:1.8.0_51]
    at com.google.common.eventbus.EventSubscriber.handleEvent(EventSubscriber.java:74) ~[guava-17.0.jar:?]
    at com.google.common.eventbus.SynchronizedEventSubscriber.handleEvent(SynchronizedEventSubscriber.java:47) ~[guava-17.0.jar:?]
    at com.google.common.eventbus.EventBus.dispatch(EventBus.java:322) ~[guava-17.0.jar:?]
    at com.google.common.eventbus.EventBus.dispatchQueuedEvents(EventBus.java:304) ~[guava-17.0.jar:?]
    at com.google.common.eventbus.EventBus.post(EventBus.java:275) ~[guava-17.0.jar:?]
    at net.minecraftforge.fml.common.LoadController.distributeStateMessage(LoadController.java:119) ~[LoadController.class:?]
    at net.minecraftforge.fml.common.Loader.preinitializeMods(Loader.java:550) ~[Loader.class:?]
    ... 5 more
    Caused by: java.lang.ClassNotFoundException: net.minecraft.client.renderer.block.statemap.IStateMapper
    at net.minecraft.launchwrapper.LaunchClassLoader.findClass(LaunchClassLoader.java:191) ~[launchwrapper-1.12.jar:?]
    at java.lang.ClassLoader.loadClass(Unknown Source) ~[?:1.8.0_51]
    at java.lang.ClassLoader.loadClass(Unknown Source) ~[?:1.8.0_51]
    at net.novaviper.zeroquest.common.config.ConfigHandler.init(ConfigHandler.java:25) ~[ConfigHandler.class:?]
    at net.novaviper.zeroquest.ZeroQuest.preInit(ZeroQuest.java:57) ~[ZeroQuest.class:?]
    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) ~[?:1.8.0_51]
    at sun.reflect.NativeMethodAccessorImpl.invoke(Unknown Source) ~[?:1.8.0_51]
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(Unknown Source) ~[?:1.8.0_51]
    at java.lang.reflect.Method.invoke(Unknown Source) ~[?:1.8.0_51]
    at net.minecraftforge.fml.common.FMLModContainer.handleModStateEvent(FMLModContainer.java:537) ~[FMLModContainer.class:?]
    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) ~[?:1.8.0_51]
    at sun.reflect.NativeMethodAccessorImpl.invoke(Unknown Source) ~[?:1.8.0_51]
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(Unknown Source) ~[?:1.8.0_51]
    at java.lang.reflect.Method.invoke(Unknown Source) ~[?:1.8.0_51]
    at com.google.common.eventbus.EventSubscriber.handleEvent(EventSubscriber.java:74) ~[guava-17.0.jar:?]
    at com.google.common.eventbus.SynchronizedEventSubscriber.handleEvent(SynchronizedEventSubscriber.java:47) ~[guava-17.0.jar:?]
    at com.google.common.eventbus.EventBus.dispatch(EventBus.java:322) ~[guava-17.0.jar:?]
    at com.google.common.eventbus.EventBus.dispatchQueuedEvents(EventBus.java:304) ~[guava-17.0.jar:?]
    at com.google.common.eventbus.EventBus.post(EventBus.java:275) ~[guava-17.0.jar:?]
    at net.minecraftforge.fml.common.LoadController.sendEventToModContainer(LoadController.java:212) ~[LoadController.class:?]
    at net.minecraftforge.fml.common.LoadController.propogateStateMessage(LoadController.java:190) ~[LoadController.class:?]
    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) ~[?:1.8.0_51]
    at sun.reflect.NativeMethodAccessorImpl.invoke(Unknown Source) ~[?:1.8.0_51]
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(Unknown Source) ~[?:1.8.0_51]
    at java.lang.reflect.Method.invoke(Unknown Source) ~[?:1.8.0_51]
    at com.google.common.eventbus.EventSubscriber.handleEvent(EventSubscriber.java:74) ~[guava-17.0.jar:?]
    at com.google.common.eventbus.SynchronizedEventSubscriber.handleEvent(SynchronizedEventSubscriber.java:47) ~[guava-17.0.jar:?]
    at com.google.common.eventbus.EventBus.dispatch(EventBus.java:322) ~[guava-17.0.jar:?]
    at com.google.common.eventbus.EventBus.dispatchQueuedEvents(EventBus.java:304) ~[guava-17.0.jar:?]
    at com.google.common.eventbus.EventBus.post(EventBus.java:275) ~[guava-17.0.jar:?]
    at net.minecraftforge.fml.common.LoadController.distributeStateMessage(LoadController.java:119) ~[LoadController.class:?]
    at net.minecraftforge.fml.common.Loader.preinitializeMods(Loader.java:550) ~[Loader.class:?]
    ... 5 more
    Caused by: net.minecraftforge.fml.common.asm.ASMTransformerWrapper$TransformerException: Exception in class transformer net.minecraftforge.fml.common.asm.transformers.SideTransformer@4afcd809 from coremod FMLCorePlugin
    at net.minecraftforge.fml.common.asm.ASMTransformerWrapper$TransformerWrapper.transform(ASMTransformerWrapper.java:234) ~[forgeSrc-1.8-11.14.3.1495.jar:?]
    at net.minecraft.launchwrapper.LaunchClassLoader.runTransformers(LaunchClassLoader.java:279) ~[launchwrapper-1.12.jar:?]
    at net.minecraft.launchwrapper.LaunchClassLoader.findClass(LaunchClassLoader.java:176) ~[launchwrapper-1.12.jar:?]
    at java.lang.ClassLoader.loadClass(Unknown Source) ~[?:1.8.0_51]
    at java.lang.ClassLoader.loadClass(Unknown Source) ~[?:1.8.0_51]
    at net.novaviper.zeroquest.common.config.ConfigHandler.init(ConfigHandler.java:25) ~[ConfigHandler.class:?]
    at net.novaviper.zeroquest.ZeroQuest.preInit(ZeroQuest.java:57) ~[ZeroQuest.class:?]
    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) ~[?:1.8.0_51]
    at sun.reflect.NativeMethodAccessorImpl.invoke(Unknown Source) ~[?:1.8.0_51]
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(Unknown Source) ~[?:1.8.0_51]
    at java.lang.reflect.Method.invoke(Unknown Source) ~[?:1.8.0_51]
    at net.minecraftforge.fml.common.FMLModContainer.handleModStateEvent(FMLModContainer.java:537) ~[FMLModContainer.class:?]
    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) ~[?:1.8.0_51]
    at sun.reflect.NativeMethodAccessorImpl.invoke(Unknown Source) ~[?:1.8.0_51]
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(Unknown Source) ~[?:1.8.0_51]
    at java.lang.reflect.Method.invoke(Unknown Source) ~[?:1.8.0_51]
    at com.google.common.eventbus.EventSubscriber.handleEvent(EventSubscriber.java:74) ~[guava-17.0.jar:?]
    at com.google.common.eventbus.SynchronizedEventSubscriber.handleEvent(SynchronizedEventSubscriber.java:47) ~[guava-17.0.jar:?]
    at com.google.common.eventbus.EventBus.dispatch(EventBus.java:322) ~[guava-17.0.jar:?]
    at com.google.common.eventbus.EventBus.dispatchQueuedEvents(EventBus.java:304) ~[guava-17.0.jar:?]
    at com.google.common.eventbus.EventBus.post(EventBus.java:275) ~[guava-17.0.jar:?]
    at net.minecraftforge.fml.common.LoadController.sendEventToModContainer(LoadController.java:212) ~[LoadController.class:?]
    at net.minecraftforge.fml.common.LoadController.propogateStateMessage(LoadController.java:190) ~[LoadController.class:?]
    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) ~[?:1.8.0_51]
    at sun.reflect.NativeMethodAccessorImpl.invoke(Unknown Source) ~[?:1.8.0_51]
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(Unknown Source) ~[?:1.8.0_51]
    at java.lang.reflect.Method.invoke(Unknown Source) ~[?:1.8.0_51]
    at com.google.common.eventbus.EventSubscriber.handleEvent(EventSubscriber.java:74) ~[guava-17.0.jar:?]
    at com.google.common.eventbus.SynchronizedEventSubscriber.handleEvent(SynchronizedEventSubscriber.java:47) ~[guava-17.0.jar:?]
    at com.google.common.eventbus.EventBus.dispatch(EventBus.java:322) ~[guava-17.0.jar:?]
    at com.google.common.eventbus.EventBus.dispatchQueuedEvents(EventBus.java:304) ~[guava-17.0.jar:?]
    at com.google.common.eventbus.EventBus.post(EventBus.java:275) ~[guava-17.0.jar:?]
    at net.minecraftforge.fml.common.LoadController.distributeStateMessage(LoadController.java:119) ~[LoadController.class:?]
    at net.minecraftforge.fml.common.Loader.preinitializeMods(Loader.java:550) ~[Loader.class:?]
    ... 5 more
    Caused by: java.lang.RuntimeException: Attempted to load class net/minecraft/client/renderer/block/statemap/IStateMapper for invalid side SERVER
    at net.minecraftforge.fml.common.asm.transformers.SideTransformer.transform(SideTransformer.java:49) ~[forgeSrc-1.8-11.14.3.1495.jar:?]
    at net.minecraftforge.fml.common.asm.ASMTransformerWrapper$TransformerWrapper.transform(ASMTransformerWrapper.java:230) ~[forgeSrc-1.8-11.14.3.1495.jar:?]
    at net.minecraft.launchwrapper.LaunchClassLoader.runTransformers(LaunchClassLoader.java:279) ~[launchwrapper-1.12.jar:?]
    at net.minecraft.launchwrapper.LaunchClassLoader.findClass(LaunchClassLoader.java:176) ~[launchwrapper-1.12.jar:?]
    at java.lang.ClassLoader.loadClass(Unknown Source) ~[?:1.8.0_51]
    at java.lang.ClassLoader.loadClass(Unknown Source) ~[?:1.8.0_51]
    at net.novaviper.zeroquest.common.config.ConfigHandler.init(ConfigHandler.java:25) ~[ConfigHandler.class:?]
    at net.novaviper.zeroquest.ZeroQuest.preInit(ZeroQuest.java:57) ~[ZeroQuest.class:?]
    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) ~[?:1.8.0_51]
    at sun.reflect.NativeMethodAccessorImpl.invoke(Unknown Source) ~[?:1.8.0_51]
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(Unknown Source) ~[?:1.8.0_51]
    at java.lang.reflect.Method.invoke(Unknown Source) ~[?:1.8.0_51]
    at net.minecraftforge.fml.common.FMLModContainer.handleModStateEvent(FMLModContainer.java:537) ~[FMLModContainer.class:?]
    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) ~[?:1.8.0_51]
    at sun.reflect.NativeMethodAccessorImpl.invoke(Unknown Source) ~[?:1.8.0_51]
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(Unknown Source) ~[?:1.8.0_51]
    at java.lang.reflect.Method.invoke(Unknown Source) ~[?:1.8.0_51]
    at com.google.common.eventbus.EventSubscriber.handleEvent(EventSubscriber.java:74) ~[guava-17.0.jar:?]
    at com.google.common.eventbus.SynchronizedEventSubscriber.handleEvent(SynchronizedEventSubscriber.java:47) ~[guava-17.0.jar:?]
    at com.google.common.eventbus.EventBus.dispatch(EventBus.java:322) ~[guava-17.0.jar:?]
    at com.google.common.eventbus.EventBus.dispatchQueuedEvents(EventBus.java:304) ~[guava-17.0.jar:?]
    at com.google.common.eventbus.EventBus.post(EventBus.java:275) ~[guava-17.0.jar:?]
    at net.minecraftforge.fml.common.LoadController.sendEventToModContainer(LoadController.java:212) ~[LoadController.class:?]
    at net.minecraftforge.fml.common.LoadController.propogateStateMessage(LoadController.java:190) ~[LoadController.class:?]
    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) ~[?:1.8.0_51]
    at sun.reflect.NativeMethodAccessorImpl.invoke(Unknown Source) ~[?:1.8.0_51]
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(Unknown Source) ~[?:1.8.0_51]
    at java.lang.reflect.Method.invoke(Unknown Source) ~[?:1.8.0_51]
    at com.google.common.eventbus.EventSubscriber.handleEvent(EventSubscriber.java:74) ~[guava-17.0.jar:?]
    at com.google.common.eventbus.SynchronizedEventSubscriber.handleEvent(SynchronizedEventSubscriber.java:47) ~[guava-17.0.jar:?]
    at com.google.common.eventbus.EventBus.dispatch(EventBus.java:322) ~[guava-17.0.jar:?]
    at com.google.common.eventbus.EventBus.dispatchQueuedEvents(EventBus.java:304) ~[guava-17.0.jar:?]
    at com.google.common.eventbus.EventBus.post(EventBus.java:275) ~[guava-17.0.jar:?]
    at net.minecraftforge.fml.common.LoadController.distributeStateMessage(LoadController.java:119) ~[LoadController.class:?]
    at net.minecraftforge.fml.common.Loader.preinitializeMods(Loader.java:550) ~[Loader.class:?]
    ... 5 more
    [08:33:55] [server thread/ERROR]: This crash report has been saved to: C:\Users\NovaPC\Desktop\ModStuff\Mods\ZeroQuest\eclipse\.\crash-reports\crash-2015-07-24_08.33.54-server.txt
    

     

    My code in the main class is like this:

     

    package net.novaviper.zeroquest;
    
    import java.io.File;
    
    import net.minecraft.creativetab.CreativeTabs;
    import net.minecraft.item.Item.ToolMaterial;
    import net.minecraftforge.common.util.EnumHelper;
    import net.minecraftforge.fml.common.Mod;
    import net.minecraftforge.fml.common.Mod.EventHandler;
    import net.minecraftforge.fml.common.Mod.Instance;
    import net.minecraftforge.fml.common.SidedProxy;
    import net.minecraftforge.fml.common.event.FMLInitializationEvent;
    import net.minecraftforge.fml.common.event.FMLPostInitializationEvent;
    import net.minecraftforge.fml.common.event.FMLPreInitializationEvent;
    import net.minecraftforge.fml.common.event.FMLServerStartingEvent;
    import net.novaviper.zeroquest.common.CommonProxy;
    import net.novaviper.zeroquest.common.api.ZeroQuestAPI;
    import net.novaviper.zeroquest.common.command.CommandZeroQuest;
    import net.novaviper.zeroquest.common.config.ConfigEvent;
    import net.novaviper.zeroquest.common.config.ConfigHandler;
    import net.novaviper.zeroquest.common.creativetab.DarkQuestTab;
    import net.novaviper.zeroquest.common.creativetab.ZeroQuestTab;
    import net.novaviper.zeroquest.common.events.AchievementEvents;
    import net.novaviper.zeroquest.common.events.BlastResistanceEvent;
    import net.novaviper.zeroquest.common.events.FOVEvent;
    import net.novaviper.zeroquest.common.events.FireEventHandler;
    import net.novaviper.zeroquest.common.handlers.ConnectionHandler;
    import net.novaviper.zeroquest.common.handlers.FuelHandler;
    import net.novaviper.zeroquest.common.helper.LogHelper;
    import net.novaviper.zeroquest.common.lib.Constants;
    import net.novaviper.zeroquest.common.lib.IDs;
    import net.novaviper.zeroquest.common.lib.OreDic;
    import net.novaviper.zeroquest.common.lib.Registers;
    import net.novaviper.zeroquest.common.message.PacketHandler;
    import net.novaviper.zeroquest.common.world.WorldProviderDarkax;
    import net.novaviper.zeroquest.common.world.WorldProviderNillax;
    import net.novaviper.zeroquest.common.world.gen.WorldGenZQuest;
    
    @Mod(modid = Constants.modid, name = Constants.name, version = Constants.version, useMetadata = true, guiFactory = Constants.guiFactory)
    public class ZeroQuest {
    @Instance(value = Constants.modid)
    public static ZeroQuest instance;
    
    @SidedProxy(clientSide = Constants.clientProxy, serverSide = Constants.serverProxy)
    public static CommonProxy proxy;
    
    // Put sounds from Sound in sounds.json
    
    public static CreativeTabs ZeroTab;
    public static CreativeTabs DarkTab;
    
    public static ToolMaterial nileEssence;
    public static ToolMaterial darkEssence;
    
    @EventHandler
    public void preInit(FMLPreInitializationEvent event) {
    	ConfigHandler.init(new File(event.getModConfigurationDirectory().getAbsolutePath() + File.separator + Constants.modid + File.separator + Constants.modid + ".cfg"));
    	if (Constants.DEF_MODCHECKER == true) {
    		Registers.addFMLCommonEventBus(new ModVersionCheck(Constants.version, "ZeroQuest", Constants.isBeta));
    	}
    	LogHelper.info("-----PRE-CONTENT LOAD INITATING-----");
    	LogHelper.info("Loading Main Stuff...");
    	this.ZeroTab = new ZeroQuestTab(CreativeTabs.getNextID());
    	if (Constants.DEF_DARKLOAD == true) {
    		this.DarkTab = new DarkQuestTab(CreativeTabs.getNextID());
    	}
    	Registers.addGuiHandler(Constants.modid, proxy);
    	proxy.registerMoreThings();
    	LogHelper.info("Load Stuff Loaded Successfully!");
    	LogHelper.info("Loading Block, Liquids, Recipes, Events and Items...");
    	nileEssence = EnumHelper.addToolMaterial("NileEssence", 4, 4000, 20.0F, 4.0F, 30);
    	ModBlocks.load();
    	ModItems.load();
    	ModEntities.loadCreatures();
    	ModEntities.loadOthers();
    	Registers.addForgeEventBus(new FOVEvent());
    	Registers.addForgeEventBus(new BlastResistanceEvent());
    	Registers.addFMLCommonEventBus(new ConfigEvent());
    	ZeroQuestCrafting.loadRecipes();
    	if (Constants.DEF_DARKLOAD == true) {
    		darkEssence = EnumHelper.addToolMaterial("DarkEssence", 4, 5000, 21.0F, 5.0F, 40);
    		ModBlocks.loadDarkBlocks();
    		ModItems.loadDarkItems();
    		ZeroQuestCrafting.loadDarkRecipes();
    		ModEntities.loadDarkCreatures();
    	}
    
    	Registers.addFMLCommonEventBus(new ConnectionHandler());
    	LogHelper.info("Blocks, Recipes, Entites, Events and Items Loaded Successfully!");
    	LogHelper.info("-----PRE-CONTENT LOAD FINISHED-----");
    }
    
    @EventHandler
    public void load(FMLInitializationEvent event) {
    	LogHelper.info("-----CONTENT LOAD INITATING-----");
    	LogHelper.info("Loading Packets...");
    	PacketHandler.registerPackets();
    	LogHelper.info("Packets Loaded Successfully!");
    	LogHelper.info("Loading Renderers, Achievements, Biomes and Ore Dictionary...");
    	OreDic.loadOre();
    	ModAchievements.load();
    	Registers.addFMLCommonEventBus(new AchievementEvents());
    	ModBiomes.loadBiomes();
    	if (event.getSide().isClient()) {
    		Registers.addForgeEventBus(new FireEventHandler());
    		ModBlocks.loadRenderers();
    		ModItems.loadRenderers();
    		proxy.registerStateMappings();
    		if (Constants.DEF_DARKLOAD == true) {
    			ModItems.loadDarkRenderers();
    			ModBlocks.loadDarkRenderers();
    			proxy.registerStateMappingsForDark();
    		}
    	}
    	proxy.registerRenderThings();
    	LogHelper.info("Renderers, Achievements, Biomes and Ore Dictionary Loaded Successfully!");
    	LogHelper.info("Loading Crucial Stuff and Dimensions...");
    	proxy.registerChestItems();
    	Registers.addFuelHandler(new FuelHandler());
    	Registers.addWorldGenerator(new WorldGenZQuest(), 0);
    	ModEntities.loadSpawns();
    	Registers.addDimensionProviderType(IDs.Nillax, WorldProviderNillax.class, false);
    	Registers.addDimension(IDs.Nillax, IDs.Nillax);
    	LogHelper.info("Crucial Stuff and Dimensions Loaded Successfully!");
    
    	if (Constants.DEF_DARKLOAD == true) {
    		LogHelper.warn("Dark Elemental Load is ENABLED!");
    		LogHelper.info("Initating Dark Elemental Load!");
    		ModBiomes.loadDarkBiomes();
    		ModAchievements.loadDark();
    		OreDic.loadDarkOre();
    		Registers.addDimensionProviderType(IDs.Darkax, WorldProviderDarkax.class, false);
    		Registers.addDimension(IDs.Darkax, IDs.Darkax);
    		ModEntities.loadDarkSpawns();
    		LogHelper.info("Dark Elements Loaded Successfully!");
    	}
    	else {
    		LogHelper.warn("Dark Elemental Load is not ENABLED! Change configurations to enable!");
    		LogHelper.info("Skipping Dark Elemental Load");
    
    	}
    	LogHelper.info("-----CONTENT LOAD FINSHED-----");
    }
    
    @EventHandler
    public void PostInt(FMLPostInitializationEvent event) {
    	LogHelper.info("-----POST-CONTENT LOAD INITATING-----");
    	LogHelper.info("Loading Talents and Item Lists...");
    	ZeroQuestAPI.breedList.registerItem(ModItems.dogTreat);
    	ZeroQuestAPI.begNileList.registerItem(ModItems.toy);
    	ZeroQuestAPI.begNileList.registerItem(ModItems.nileBone);
    	if (Constants.DEF_DARKLOAD == true) {
    		ZeroQuestAPI.begDarkList.registerItem(ModItems.darkBone);
    	}
    	ModTalents.loadTalents();
    	LogHelper.info("Talents and Item Lists Loaded Successfully!");
    	LogHelper.info("-----POST-CONTENT LOAD FINSHED-----");
    
    }
    
    @EventHandler
    public void serverStart(FMLServerStartingEvent event) {
    	LogHelper.info("-----SERVER CONTENT LOAD INITATING-----");
    	LogHelper.info("Loading Commands...");
    	Registers.addCommand(new CommandZeroQuest());
    	LogHelper.info("Commands Loaded Successfully!");
    	LogHelper.info("-----SERVER CONTENT LOAD FINSHED-----");
    
    }
    }

     

    I moved it to where the renderer loaders are at and it still crashes. Anyone know why?

  4. Hey guys, I got my animations to work but I want the entity to stay at the end of the animation until I activate another one. Also, I have an angry animation that doesn't trigger immediately when the entity is angry at another one.

     

    Animation event

    	@Override
    public void onUpdate() {
    	super.onUpdate();
    
    	boolean isDying = false;
    	boolean isAngry = false;
    	if (this.isAngry() && !this.isTamed()) {
    		this.getAnimationHandler().activateAnimation("angry", 0);
    		isAngry = true;
    	}
    	else if (isAngry == true && !this.isAngry() && !this.isTamed()) {
    		this.getAnimationHandler().activateAnimation("notangry", 0);
    		isAngry = false;
    	}
    
    	if (this.getHealth() <= Constants.lowHP) {
    		this.getAnimationHandler().activateAnimation("dying", 0);
    		isDying = true;
    	}
    	else if (isDying == true) {
    		this.getAnimationHandler().activateAnimation("dyingheal", 0);
    		isDying = false;
    	}
    }
    

  5. Alright.. I'm having issues activating my animations, they're not turning on.

     

    ModelBase

    package net.novaviper.zeroquest.client.model;
    
    import java.util.HashMap;
    
    import org.lwjgl.opengl.GL11;
    
    import net.minecraft.client.model.ModelBase;
    import net.minecraft.entity.Entity;
    import net.novaviper.zeroquest.client.MCAClientLibrary.MCAModelRenderer;
    import net.novaviper.zeroquest.common.entity.EntityZertumEntity;
    import net.novaviper.zeroquest.common.mca.MCAVersionChecker;
    import net.novaviper.zeroquest.common.mca.animation.AnimationHandler;
    import net.novaviper.zeroquest.common.mca.math.*;
    
    public class ModelZertumStage1 extends ModelBase {
    public final int MCA_MIN_REQUESTED_VERSION = 5;
    public HashMap<String, MCAModelRenderer> parts = new HashMap<String, MCAModelRenderer>();
    
    MCAModelRenderer leftHindLeg1;
    MCAModelRenderer rightHindLeg1;
    MCAModelRenderer rightLeg;
    MCAModelRenderer leftLeg;
    MCAModelRenderer torso;
    MCAModelRenderer pad3;
    MCAModelRenderer leftHindLeg2;
    MCAModelRenderer rightHindLeg2;
    MCAModelRenderer mane1;
    MCAModelRenderer tail1;
    MCAModelRenderer pad2;
    MCAModelRenderer seat2;
    MCAModelRenderer pad4;
    MCAModelRenderer leftHindLeg3;
    MCAModelRenderer rightHindLeg3;
    MCAModelRenderer mane2;
    MCAModelRenderer tail2;
    MCAModelRenderer pad1;
    MCAModelRenderer seat1;
    MCAModelRenderer rope1;
    MCAModelRenderer rope2;
    MCAModelRenderer neck;
    MCAModelRenderer tail3;
    MCAModelRenderer padPart1;
    MCAModelRenderer padPart2;
    MCAModelRenderer metal1;
    MCAModelRenderer metal2;
    MCAModelRenderer head;
    MCAModelRenderer nose;
    MCAModelRenderer ear1;
    MCAModelRenderer ear2;
    
    public ModelZertumStage1() {
    	MCAVersionChecker.checkForLibraryVersion(getClass(), MCA_MIN_REQUESTED_VERSION);
    
    	textureWidth = 128;
    	textureHeight = 64;
    
    	leftHindLeg1 = new MCAModelRenderer(this, "LeftHindLeg1", 11, 18);
    	leftHindLeg1.mirror = false;
    	leftHindLeg1.addBox(-1.0F, -5.0F, -2.0F, 2, 5, 3);
    	leftHindLeg1.setInitialRotationPoint(1.5F, -11.0F, -3.0F);
    	leftHindLeg1.setInitialRotationMatrix(new Matrix4f().set(new Quaternion(-0.14816688F, 0.0F, 0.0F, 0.98896235F)).transpose());
    	leftHindLeg1.setTextureSize(128, 64);
    	parts.put(leftHindLeg1.boxName, leftHindLeg1);
    
    	rightHindLeg1 = new MCAModelRenderer(this, "RightHindLeg1", 11, 31);
    	rightHindLeg1.mirror = false;
    	rightHindLeg1.addBox(-1.0F, -5.0F, -2.0F, 2, 5, 3);
    	rightHindLeg1.setInitialRotationPoint(-2.5F, -11.0F, -3.0F);
    	rightHindLeg1.setInitialRotationMatrix(new Matrix4f().set(new Quaternion(-0.14816688F, 0.0F, 0.0F, 0.98896235F)).transpose());
    	rightHindLeg1.setTextureSize(128, 64);
    	parts.put(rightHindLeg1.boxName, rightHindLeg1);
    
    	rightLeg = new MCAModelRenderer(this, "RightLeg", 0, 30);
    	rightLeg.mirror = false;
    	rightLeg.addBox(-1.0F, -10.0F, -1.0F, 2, 10, 2);
    	rightLeg.setInitialRotationPoint(-3.0F, -12.0F, 6.0F);
    	rightLeg.setInitialRotationMatrix(new Matrix4f().set(new Quaternion(0.0F, 0.0F, 0.0F, 1.0F)).transpose());
    	rightLeg.setTextureSize(128, 64);
    	parts.put(rightLeg.boxName, rightLeg);
    
    	leftLeg = new MCAModelRenderer(this, "LeftLeg", 0, 16);
    	leftLeg.mirror = false;
    	leftLeg.addBox(-1.0F, -10.0F, -1.0F, 2, 10, 2);
    	leftLeg.setInitialRotationPoint(2.0F, -12.0F, 6.0F);
    	leftLeg.setInitialRotationMatrix(new Matrix4f().set(new Quaternion(0.0F, 0.0F, 0.0F, 1.0F)).transpose());
    	leftLeg.setTextureSize(128, 64);
    	parts.put(leftLeg.boxName, leftLeg);
    
    	torso = new MCAModelRenderer(this, "Torso", 69, 0);
    	torso.mirror = false;
    	torso.addBox(-2.5F, -6.0F, -2.0F, 5, 9, 5);
    	torso.setInitialRotationPoint(-0.5F, -10.5F, 1.0F);
    	torso.setInitialRotationMatrix(new Matrix4f().set(new Quaternion(0.6803349F, 0.0F, 0.0F, 0.73290133F)).transpose());
    	torso.setTextureSize(128, 64);
    	parts.put(torso.boxName, torso);
    
    	pad3 = new MCAModelRenderer(this, "Pad3", 110, 39);
    	pad3.mirror = false;
    	pad3.addBox(-2.0F, -1.0F, -4.0F, 5, 1, 4);
    	pad3.setInitialRotationPoint(-1.0F, -7.5F, 1.8F);
    	pad3.setInitialRotationMatrix(new Matrix4f().set(new Quaternion(-0.03252245F, 0.0F, 0.0F, 0.999471F)).transpose());
    	pad3.setTextureSize(128, 64);
    	parts.put(pad3.boxName, pad3);
    
    	leftHindLeg2 = new MCAModelRenderer(this, "LeftHindLeg2", 3, 44);
    	leftHindLeg2.mirror = false;
    	leftHindLeg2.addBox(-1.0F, -4.0F, -1.0F, 2, 4, 2);
    	leftHindLeg2.setInitialRotationPoint(0.0F, -4.3F, 0.2F);
    	leftHindLeg2.setInitialRotationMatrix(new Matrix4f().set(new Quaternion(0.39073113F, 0.0F, 0.0F, 0.92050487F)).transpose());
    	leftHindLeg2.setTextureSize(128, 64);
    	parts.put(leftHindLeg2.boxName, leftHindLeg2);
    	leftHindLeg1.addChild(leftHindLeg2);
    
    	rightHindLeg2 = new MCAModelRenderer(this, "RightHindLeg2", 3, 44);
    	rightHindLeg2.mirror = false;
    	rightHindLeg2.addBox(-1.0F, -4.0F, -1.0F, 2, 4, 2);
    	rightHindLeg2.setInitialRotationPoint(0.0F, -4.3F, 0.2F);
    	rightHindLeg2.setInitialRotationMatrix(new Matrix4f().set(new Quaternion(0.39073113F, 0.0F, 0.0F, 0.92050487F)).transpose());
    	rightHindLeg2.setTextureSize(128, 64);
    	parts.put(rightHindLeg2.boxName, rightHindLeg2);
    	rightHindLeg1.addChild(rightHindLeg2);
    
    	mane1 = new MCAModelRenderer(this, "Mane1", 43, 0);
    	mane1.mirror = false;
    	mane1.addBox(-3.0F, -3.0F, -4.0F, 6, 6, 7);
    	mane1.setInitialRotationPoint(0.0F, 4.0F, 1.5F);
    	mane1.setInitialRotationMatrix(new Matrix4f().set(new Quaternion(0.043619387F, 0.0F, 0.0F, 0.99904823F)).transpose());
    	mane1.setTextureSize(128, 64);
    	parts.put(mane1.boxName, mane1);
    	torso.addChild(mane1);
    
    	tail1 = new MCAModelRenderer(this, "Tail1", 91, 0);
    	tail1.mirror = false;
    	tail1.addBox(-1.5F, -8.0F, -2.0F, 4, 8, 4);
    	tail1.setInitialRotationPoint(-0.5F, -5.3F, 0.5F);
    	tail1.setInitialRotationMatrix(new Matrix4f().set(new Quaternion(-0.0784591F, 0.0F, 0.0F, 0.9969173F)).transpose());
    	tail1.setTextureSize(128, 64);
    	parts.put(tail1.boxName, tail1);
    	torso.addChild(tail1);
    
    	pad2 = new MCAModelRenderer(this, "Pad2", 110, 35);
    	pad2.mirror = false;
    	pad2.addBox(-3.0F, -1.0F, -2.0F, 6, 1, 2);
    	pad2.setInitialRotationPoint(0.5F, 0.0F, 1.7F);
    	pad2.setInitialRotationMatrix(new Matrix4f().set(new Quaternion(0.008726535F, 0.0F, 0.0F, 0.9999619F)).transpose());
    	pad2.setTextureSize(128, 64);
    	parts.put(pad2.boxName, pad2);
    	pad3.addChild(pad2);
    
    	seat2 = new MCAModelRenderer(this, "Seat2", 100, 49);
    	seat2.mirror = false;
    	seat2.addBox(-2.0F, -1.0F, -1.0F, 4, 1, 1);
    	seat2.setInitialRotationPoint(0.5F, 0.7F, -3.0F);
    	seat2.setInitialRotationMatrix(new Matrix4f().set(new Quaternion(0.0F, 0.0F, 0.0F, 1.0F)).transpose());
    	seat2.setTextureSize(128, 64);
    	parts.put(seat2.boxName, seat2);
    	pad3.addChild(seat2);
    
    	pad4 = new MCAModelRenderer(this, "Pad4", 110, 48);
    	pad4.mirror = false;
    	pad4.addBox(-1.5F, -1.0F, -1.0F, 3, 1, 1);
    	pad4.setInitialRotationPoint(0.5F, 0.0F, -4.0F);
    	pad4.setInitialRotationMatrix(new Matrix4f().set(new Quaternion(-0.03252245F, 0.0F, 0.0F, 0.999471F)).transpose());
    	pad4.setTextureSize(128, 64);
    	parts.put(pad4.boxName, pad4);
    	pad3.addChild(pad4);
    
    	leftHindLeg3 = new MCAModelRenderer(this, "LeftHindLeg3", 0, 51);
    	leftHindLeg3.mirror = false;
    	leftHindLeg3.addBox(-1.0F, -4.0F, -1.0F, 2, 4, 2);
    	leftHindLeg3.setInitialRotationPoint(0.0F, -3.5F, -0.2F);
    	leftHindLeg3.setInitialRotationMatrix(new Matrix4f().set(new Quaternion(-0.25038F, 0.0F, 0.0F, 0.96814764F)).transpose());
    	leftHindLeg3.setTextureSize(128, 64);
    	parts.put(leftHindLeg3.boxName, leftHindLeg3);
    	leftHindLeg2.addChild(leftHindLeg3);
    
    	rightHindLeg3 = new MCAModelRenderer(this, "RightHindLeg3", 9, 51);
    	rightHindLeg3.mirror = false;
    	rightHindLeg3.addBox(-1.0F, -4.0F, -1.0F, 2, 4, 2);
    	rightHindLeg3.setInitialRotationPoint(0.0F, -3.5F, -0.2F);
    	rightHindLeg3.setInitialRotationMatrix(new Matrix4f().set(new Quaternion(-0.25038F, 0.0F, 0.0F, 0.96814764F)).transpose());
    	rightHindLeg3.setTextureSize(128, 64);
    	parts.put(rightHindLeg3.boxName, rightHindLeg3);
    	rightHindLeg2.addChild(rightHindLeg3);
    
    	mane2 = new MCAModelRenderer(this, "Mane2", 18, 0);
    	mane2.mirror = false;
    	mane2.addBox(-2.5F, 1.0F, -3.4F, 5, 6, 7);
    	mane2.setInitialRotationPoint(-0.5F, 0.0F, 0.0F);
    	mane2.setInitialRotationMatrix(new Matrix4f().set(new Quaternion(-0.1478094F, 0.0F, 0.0F, 0.9890159F)).transpose());
    	mane2.setTextureSize(128, 64);
    	parts.put(mane2.boxName, mane2);
    	mane1.addChild(mane2);
    
    	tail2 = new MCAModelRenderer(this, "Tail2", 110, 0);
    	tail2.mirror = false;
    	tail2.addBox(-1.5F, -8.0F, -1.5F, 3, 8, 3);
    	tail2.setInitialRotationPoint(0.5F, -6.299999F, 0.0F);
    	tail2.setInitialRotationMatrix(new Matrix4f().set(new Quaternion(-0.043619387F, 0.0F, 0.0F, 0.99904823F)).transpose());
    	tail2.setTextureSize(128, 64);
    	parts.put(tail2.boxName, tail2);
    	tail1.addChild(tail2);
    
    	pad1 = new MCAModelRenderer(this, "Pad1", 110, 32);
    	pad1.mirror = false;
    	pad1.addBox(-2.0F, -1.0F, -1.0F, 4, 1, 1);
    	pad1.setInitialRotationPoint(0.0F, 0.0F, 1.0F);
    	pad1.setInitialRotationMatrix(new Matrix4f().set(new Quaternion(0.02617695F, 0.0F, 0.0F, 0.99965733F)).transpose());
    	pad1.setTextureSize(128, 64);
    	parts.put(pad1.boxName, pad1);
    	pad2.addChild(pad1);
    
    	seat1 = new MCAModelRenderer(this, "Seat1", 100, 45);
    	seat1.mirror = false;
    	seat1.addBox(-1.0F, -1.0F, -1.0F, 2, 1, 1);
    	seat1.setInitialRotationPoint(0.0F, 0.5F, 0.0F);
    	seat1.setInitialRotationMatrix(new Matrix4f().set(new Quaternion(0.008726535F, 0.0F, 0.0F, 0.9999619F)).transpose());
    	seat1.setTextureSize(128, 64);
    	parts.put(seat1.boxName, seat1);
    	pad2.addChild(seat1);
    
    	rope1 = new MCAModelRenderer(this, "Rope1", 105, 32);
    	rope1.mirror = false;
    	rope1.addBox(0.0F, -4.0F, -0.5F, 1, 4, 1);
    	rope1.setInitialRotationPoint(2.5F, -0.39999998F, -1.0F);
    	rope1.setInitialRotationMatrix(new Matrix4f().set(new Quaternion(0.02617695F, 0.0F, 0.0F, 0.99965733F)).transpose());
    	rope1.setTextureSize(128, 64);
    	parts.put(rope1.boxName, rope1);
    	pad2.addChild(rope1);
    
    	rope2 = new MCAModelRenderer(this, "Rope2", 105, 32);
    	rope2.mirror = false;
    	rope2.addBox(-1.0F, -4.0F, -0.5F, 1, 4, 1);
    	rope2.setInitialRotationPoint(-2.5F, -0.4F, -1.0F);
    	rope2.setInitialRotationMatrix(new Matrix4f().set(new Quaternion(0.02617695F, 0.0F, 0.0F, 0.99965733F)).transpose());
    	rope2.setTextureSize(128, 64);
    	parts.put(rope2.boxName, rope2);
    	pad2.addChild(rope2);
    
    	neck = new MCAModelRenderer(this, "Neck", 0, 0);
    	neck.mirror = false;
    	neck.addBox(-2.0F, 0.0F, -2.0F, 4, 7, 4);
    	neck.setInitialRotationPoint(0.0F, 6.0F, 0.0F);
    	neck.setInitialRotationMatrix(new Matrix4f().set(new Quaternion(-0.11320321F, 0.0F, 0.0F, 0.9935719F)).transpose());
    	neck.setTextureSize(128, 64);
    	parts.put(neck.boxName, neck);
    	mane2.addChild(neck);
    
    	tail3 = new MCAModelRenderer(this, "Tail3", 110, 13);
    	tail3.mirror = false;
    	tail3.addBox(-1.0F, -8.0F, -1.0F, 2, 8, 2);
    	tail3.setInitialRotationPoint(0.0F, -7.0F, 0.0F);
    	tail3.setInitialRotationMatrix(new Matrix4f().set(new Quaternion(-0.008726535F, 0.0F, 0.0F, 0.9999619F)).transpose());
    	tail3.setTextureSize(128, 64);
    	parts.put(tail3.boxName, tail3);
    	tail2.addChild(tail3);
    
    	padPart1 = new MCAModelRenderer(this, "PadPart1", 110, 29);
    	padPart1.mirror = false;
    	padPart1.addBox(-0.5F, -1.0F, -1.0F, 1, 1, 1);
    	padPart1.setInitialRotationPoint(1.5F, 0.0F, 1.0F);
    	padPart1.setInitialRotationMatrix(new Matrix4f().set(new Quaternion(-0.03252245F, 0.0F, 0.0F, 0.999471F)).transpose());
    	padPart1.setTextureSize(128, 64);
    	parts.put(padPart1.boxName, padPart1);
    	pad1.addChild(padPart1);
    
    	padPart2 = new MCAModelRenderer(this, "PadPart2", 110, 29);
    	padPart2.mirror = false;
    	padPart2.addBox(-0.5F, -1.0F, -1.0F, 1, 1, 1);
    	padPart2.setInitialRotationPoint(-1.5F, 0.0F, 1.0F);
    	padPart2.setInitialRotationMatrix(new Matrix4f().set(new Quaternion(-0.03252245F, 0.0F, 0.0F, 0.999471F)).transpose());
    	padPart2.setTextureSize(128, 64);
    	parts.put(padPart2.boxName, padPart2);
    	pad1.addChild(padPart2);
    
    	metal1 = new MCAModelRenderer(this, "Metal1", 102, 39);
    	metal1.mirror = false;
    	metal1.addBox(0.0F, -1.0F, -1.0F, 1, 1, 2);
    	metal1.setInitialRotationPoint(0.01F, -4.0F, 0.0F);
    	metal1.setInitialRotationMatrix(new Matrix4f().set(new Quaternion(0.0F, 0.0F, 0.0F, 1.0F)).transpose());
    	metal1.setTextureSize(128, 64);
    	parts.put(metal1.boxName, metal1);
    	rope1.addChild(metal1);
    
    	metal2 = new MCAModelRenderer(this, "Metal2", 102, 39);
    	metal2.mirror = false;
    	metal2.addBox(-1.0F, -1.0F, -1.0F, 1, 1, 2);
    	metal2.setInitialRotationPoint(-0.01F, -4.0F, 0.0F);
    	metal2.setInitialRotationMatrix(new Matrix4f().set(new Quaternion(0.0F, 0.0F, 0.0F, 1.0F)).transpose());
    	metal2.setTextureSize(128, 64);
    	parts.put(metal2.boxName, metal2);
    	rope2.addChild(metal2);
    
    	head = new MCAModelRenderer(this, "Head", 25, 15);
    	head.mirror = false;
    	head.addBox(-2.5F, -3.0F, 0.0F, 6, 6, 5);
    	head.setInitialRotationPoint(-0.5F, 6.0F, -0.5F);
    	head.setInitialRotationMatrix(new Matrix4f().set(new Quaternion(-0.5F, 0.0F, 0.0F, 0.8660254F)).transpose());
    	head.setTextureSize(128, 64);
    	parts.put(head.boxName, head);
    	neck.addChild(head);
    
    	nose = new MCAModelRenderer(this, "Nose", 25, 27);
    	nose.mirror = false;
    	nose.addBox(-1.5F, -3.0F, -1.0F, 3, 3, 4);
    	nose.setInitialRotationPoint(0.5F, 0.0F, 5.0F);
    	nose.setInitialRotationMatrix(new Matrix4f().set(new Quaternion(0.0F, 0.0F, 0.0F, 1.0F)).transpose());
    	nose.setTextureSize(128, 64);
    	parts.put(nose.boxName, nose);
    	head.addChild(nose);
    
    	ear1 = new MCAModelRenderer(this, "Ear1", 40, 28);
    	ear1.mirror = false;
    	ear1.addBox(-1.0F, 0.0F, -1.0F, 2, 3, 1);
    	ear1.setInitialRotationPoint(-1.5F, 3.0F, 1.0F);
    	ear1.setInitialRotationMatrix(new Matrix4f().set(new Quaternion(0.0F, 0.0F, 0.0F, 1.0F)).transpose());
    	ear1.setTextureSize(128, 64);
    	parts.put(ear1.boxName, ear1);
    	head.addChild(ear1);
    
    	ear2 = new MCAModelRenderer(this, "Ear2", 40, 28);
    	ear2.mirror = false;
    	ear2.addBox(-1.0F, 0.0F, -1.0F, 2, 3, 1);
    	ear2.setInitialRotationPoint(2.5F, 3.0F, 1.0F);
    	ear2.setInitialRotationMatrix(new Matrix4f().set(new Quaternion(0.0F, 0.0F, 0.0F, 1.0F)).transpose());
    	ear2.setTextureSize(128, 64);
    	parts.put(ear2.boxName, ear2);
    	head.addChild(ear2);
    
    }
    
    @Override
    public void render(Entity par1Entity, float par2, float par3, float par4, float par5, float par6, float par7) {
    	EntityZertumEntity entityzertum = (EntityZertumEntity) par1Entity;
    	boolean flag = entityzertum.isSaddled();
    
    	// Render every non-child part
    	if (this.isChild) {
    		float f6 = 2.0F;
    		GL11.glPushMatrix();
    		GL11.glScalef(1.0F / f6, 1.0F / f6, 1.0F / f6);
    		GL11.glTranslatef(0.0F, 6.9F * par7, 0.0F);
    		leftHindLeg1.render(par7);
    		rightHindLeg1.render(par7);
    		rightLeg.render(par7);
    		leftLeg.render(par7);
    		torso.render(par7);
    		GL11.glPopMatrix();
    	}
    	else {
    		GL11.glPushMatrix();
    		GL11.glScalef(1.5F, 1.5F, 1.5F);
    		GL11.glTranslatef(0.0F, 1.05F, 0.0F);
    		leftHindLeg1.render(par7);
    		rightHindLeg1.render(par7);
    		rightLeg.render(par7);
    		leftLeg.render(par7);
    		torso.render(par7);
    		if (flag) {
    			pad3.render(par7);
    		}
    		GL11.glPopMatrix();
    	}
    
    	AnimationHandler.performAnimationInModel(parts, entityzertum);
    }
    
    @Override
    public void setRotationAngles(float par1, float par2, float par3, float par4, float par5, float par6, Entity par7Entity) {}
    
    public MCAModelRenderer getModelRendererFromName(String name) {
    	return parts.get(name);
    }
    }

     

    AnimationHandlerEntity

    package net.novaviper.zeroquest.common.animations.zertum;
    
    import java.util.HashMap;
    
    import net.novaviper.zeroquest.common.mca.IMCAnimatedEntity;
    import net.novaviper.zeroquest.common.mca.animation.AnimationHandler;
    import net.novaviper.zeroquest.common.mca.animation.Channel;
    
    public class AnimationHandlerZertum extends AnimationHandler {
    /** Map with all the animations. */
    public static HashMap<String, Channel> animChannels = new HashMap<String, Channel>();
    static {
    	animChannels.put("idle", new IdleZertum("idle", 5.0F, 10, Channel.LOOP));
    	animChannels.put("walk", new WalkZertum("walk", 10.0F, 11, Channel.LOOP));
    	animChannels.put("ridden", new RiddenZertum("ridden", 10.0F, 11, Channel.LOOP));
    	animChannels.put("sit", new SitZertum("sit", 5.0F, 5, Channel.LINEAR));
    	animChannels.put("standup", new StandupZertum("standup", 5.0F, 5, Channel.LINEAR));
    	animChannels.put("dying", new DyingZertum("dying", 5.0F, 5, Channel.LINEAR));
    	animChannels.put("dyingheal", new ReviveZertum("revive", 5.0F, 5, Channel.LINEAR));
    	animChannels.put("begging", new ZertumBegging("begging", 5.0F, 5, Channel.LINEAR));
    	animChannels.put("angry", new AngryZertum("angry", 5.0F, 5, Channel.LINEAR));
    	animChannels.put("notangry", new NotAngryZertum("notangry", 5.0F, 5, Channel.LINEAR));
    	animChannels.put("leap", new LeapZertum("leap", 5.0F, 10, Channel.LINEAR));
    }
    
    public AnimationHandlerZertum(IMCAnimatedEntity entity) {
    	super(entity);
    }
    
    @Override
    public void activateAnimation(String name, float startingFrame) {
    	super.activateAnimation(animChannels, name, startingFrame);
    }
    
    @Override
    public void stopAnimation(String name) {
    	super.stopAnimation(animChannels, name);
    }
    
    @Override
    public void fireAnimationEventClientSide(Channel anim, float prevFrame, float frame) {}
    
    @Override
    public void fireAnimationEventServerSide(Channel anim, float prevFrame, float frame) {}
    }

     

    Angry Animation

    package net.novaviper.zeroquest.common.animations.zertum;
    
    import net.novaviper.zeroquest.common.mca.animation.Channel;
    import net.novaviper.zeroquest.common.mca.animation.KeyFrame;
    import net.novaviper.zeroquest.common.mca.math.Quaternion;
    import net.novaviper.zeroquest.common.mca.math.Vector3f;
    
    public class AngryZertum extends Channel {
    public AngryZertum(String _name, float _fps, int _totalFrames, byte _mode) {
    	super(_name, _fps, _totalFrames, _mode);
    }
    
    @Override
    protected void initializeAllFrames() {
    	KeyFrame frame0 = new KeyFrame();
    	frame0.modelRenderersRotations.put("Tail2", new Quaternion(-0.043619387F, 0.0F, 0.0F, 0.99904823F));
    	frame0.modelRenderersRotations.put("Mane2", new Quaternion(-0.1478094F, 0.0F, 0.0F, 0.9890159F));
    	frame0.modelRenderersRotations.put("Mane1", new Quaternion(0.043619387F, 0.0F, 0.0F, 0.99904823F));
    	frame0.modelRenderersRotations.put("Tail3", new Quaternion(-0.008726535F, 0.0F, 0.0F, 0.9999619F));
    	frame0.modelRenderersRotations.put("Head", new Quaternion(-0.5F, 0.0F, 0.0F, 0.8660254F));
    	frame0.modelRenderersRotations.put("Ear1", new Quaternion(0.0F, 0.0F, 0.0F, 1.0F));
    	frame0.modelRenderersRotations.put("Neck", new Quaternion(-0.11320321F, 0.0F, 0.0F, 0.9935719F));
    	frame0.modelRenderersRotations.put("Tail1", new Quaternion(-0.0784591F, 0.0F, 0.0F, 0.9969173F));
    	frame0.modelRenderersRotations.put("Ear2", new Quaternion(0.0F, 0.0F, 0.0F, 1.0F));
    	frame0.modelRenderersTranslations.put("Tail2", new Vector3f(0.5F, -6.299999F, 0.0F));
    	frame0.modelRenderersTranslations.put("Mane2", new Vector3f(-0.5F, 0.0F, 0.0F));
    	frame0.modelRenderersTranslations.put("Mane1", new Vector3f(0.0F, 4.0F, 1.5F));
    	frame0.modelRenderersTranslations.put("Tail3", new Vector3f(0.0F, -7.0F, 0.0F));
    	frame0.modelRenderersTranslations.put("Head", new Vector3f(-0.5F, 6.0F, -0.5F));
    	frame0.modelRenderersTranslations.put("Ear1", new Vector3f(-1.5F, 3.0F, 1.0F));
    	frame0.modelRenderersTranslations.put("Neck", new Vector3f(0.0F, 6.0F, 0.0F));
    	frame0.modelRenderersTranslations.put("Tail1", new Vector3f(-0.5F, -5.3F, 0.5F));
    	frame0.modelRenderersTranslations.put("Ear2", new Vector3f(2.5F, 3.0F, 1.0F));
    	keyFrames.put(0, frame0);
    
    	KeyFrame frame4 = new KeyFrame();
    	frame4.modelRenderersRotations.put("Tail2", new Quaternion(0.084547415F, 0.0F, 0.0F, 0.9964194F));
    	frame4.modelRenderersRotations.put("Mane2", new Quaternion(-0.050592944F, 0.0F, 0.0F, 0.99871933F));
    	frame4.modelRenderersRotations.put("Mane1", new Quaternion(0.050592944F, 0.0F, 0.0F, 0.99871933F));
    	frame4.modelRenderersRotations.put("Tail3", new Quaternion(0.1010563F, 0.0F, 0.0F, 0.99488074F));
    	frame4.modelRenderersRotations.put("Head", new Quaternion(-0.63876784F, 0.0F, 0.0F, 0.7693996F));
    	frame4.modelRenderersRotations.put("Ear1", new Quaternion(-0.3632512F, 0.0F, 0.0F, 0.9316912F));
    	frame4.modelRenderersRotations.put("Neck", new Quaternion(-0.084547415F, 0.0F, 0.0F, 0.9964194F));
    	frame4.modelRenderersRotations.put("Tail1", new Quaternion(0.13485092F, 0.0F, 0.0F, 0.9908659F));
    	frame4.modelRenderersRotations.put("Ear2", new Quaternion(-0.3632512F, 0.0F, 0.0F, 0.9316912F));
    	frame4.modelRenderersTranslations.put("Tail2", new Vector3f(0.5F, -6.299999F, 0.0F));
    	frame4.modelRenderersTranslations.put("Mane2", new Vector3f(-0.5F, 0.0F, 0.0F));
    	frame4.modelRenderersTranslations.put("Mane1", new Vector3f(0.0F, 4.0F, 1.5F));
    	frame4.modelRenderersTranslations.put("Tail3", new Vector3f(0.0F, -7.0F, 0.0F));
    	frame4.modelRenderersTranslations.put("Head", new Vector3f(-0.5F, 6.0F, -0.5F));
    	frame4.modelRenderersTranslations.put("Ear1", new Vector3f(-1.5F, 3.0F, 1.0F));
    	frame4.modelRenderersTranslations.put("Neck", new Vector3f(0.0F, 6.0F, 0.0F));
    	frame4.modelRenderersTranslations.put("Tail1", new Vector3f(-0.5F, -5.3F, 0.5F));
    	frame4.modelRenderersTranslations.put("Ear2", new Vector3f(2.5F, 3.0F, 1.0F));
    	keyFrames.put(4, frame4);
    
    }
    }

     

    EntityClass

    package net.novaviper.zeroquest.common.entity;
    
    import java.util.HashMap;
    import java.util.Map;
    
    import net.minecraft.block.Block;
    import net.minecraft.block.material.Material;
    import net.minecraft.entity.Entity;
    import net.minecraft.entity.EntityLivingBase;
    import net.minecraft.entity.SharedMonsterAttributes;
    import net.minecraft.entity.ai.EntityAIAttackOnCollide;
    import net.minecraft.entity.ai.EntityAIHurtByTarget;
    import net.minecraft.entity.ai.EntityAILeapAtTarget;
    import net.minecraft.entity.ai.EntityAILookIdle;
    import net.minecraft.entity.ai.EntityAIMate;
    import net.minecraft.entity.ai.EntityAISwimming;
    import net.minecraft.entity.ai.EntityAIWander;
    import net.minecraft.entity.ai.EntityAIWatchClosest;
    import net.minecraft.entity.monster.EntityCreeper;
    import net.minecraft.entity.monster.EntityGhast;
    import net.minecraft.entity.monster.EntityZombie;
    import net.minecraft.entity.passive.EntityAnimal;
    import net.minecraft.entity.passive.EntityHorse;
    import net.minecraft.entity.player.EntityPlayer;
    import net.minecraft.entity.projectile.EntityArrow;
    import net.minecraft.init.Items;
    import net.minecraft.item.EnumDyeColor;
    import net.minecraft.item.Item;
    import net.minecraft.item.ItemBow;
    import net.minecraft.item.ItemFood;
    import net.minecraft.item.ItemStack;
    import net.minecraft.item.ItemSword;
    import net.minecraft.item.ItemTool;
    import net.minecraft.nbt.NBTTagCompound;
    import net.minecraft.pathfinding.PathNavigateGround;
    import net.minecraft.potion.PotionEffect;
    import net.minecraft.util.BlockPos;
    import net.minecraft.util.DamageSource;
    import net.minecraft.util.EnumChatFormatting;
    import net.minecraft.util.EnumParticleTypes;
    import net.minecraft.util.MathHelper;
    import net.minecraft.world.World;
    import net.minecraftforge.fml.relauncher.Side;
    import net.minecraftforge.fml.relauncher.SideOnly;
    import net.novaviper.zeroquest.ModAchievements;
    import net.novaviper.zeroquest.ModItems;
    import net.novaviper.zeroquest.client.model.ModelZertumStage2;
    import net.novaviper.zeroquest.client.model.ModelZertumStage3;
    import net.novaviper.zeroquest.common.animations.zertum.AnimationHandlerZertum;
    import net.novaviper.zeroquest.common.api.ZeroQuestAPI;
    import net.novaviper.zeroquest.common.container.InventoryPack;
    import net.novaviper.zeroquest.common.entity.ai.EntityAIBeg;
    import net.novaviper.zeroquest.common.entity.ai.EntityAIFetchToy;
    import net.novaviper.zeroquest.common.entity.ai.EntityAIFollowOwner;
    import net.novaviper.zeroquest.common.entity.ai.EntityAIModeAttackTarget;
    import net.novaviper.zeroquest.common.entity.ai.EntityAIOwnerHurtByTarget;
    import net.novaviper.zeroquest.common.entity.ai.EntityAIOwnerHurtTarget;
    import net.novaviper.zeroquest.common.entity.ai.EntityAIRoundUp;
    import net.novaviper.zeroquest.common.entity.creature.EntityDarkZertum;
    import net.novaviper.zeroquest.common.entity.creature.EntityDestroZertum;
    import net.novaviper.zeroquest.common.entity.creature.EntityForisZertum;
    import net.novaviper.zeroquest.common.entity.creature.EntityIceZertum;
    import net.novaviper.zeroquest.common.entity.creature.EntityMetalZertum;
    import net.novaviper.zeroquest.common.entity.creature.EntityRedZertum;
    import net.novaviper.zeroquest.common.entity.creature.EntityZertum;
    import net.novaviper.zeroquest.common.entity.util.LevelUtil;
    import net.novaviper.zeroquest.common.entity.util.ModeUtil;
    import net.novaviper.zeroquest.common.entity.util.ModeUtil.EnumMode;
    import net.novaviper.zeroquest.common.entity.util.TalentHelper;
    import net.novaviper.zeroquest.common.entity.util.TalentUtil;
    import net.novaviper.zeroquest.common.helper.ChatHelper;
    import net.novaviper.zeroquest.common.lib.Constants;
    import net.novaviper.zeroquest.common.lib.DataValues;
    import net.novaviper.zeroquest.common.lib.Sound;
    import net.novaviper.zeroquest.common.mca.IMCAnimatedEntity;
    import net.novaviper.zeroquest.common.mca.animation.AnimationHandler;
    
    public abstract class EntityZertumEntity extends EntityCustomTameable implements IMCAnimatedEntity {
    
    protected AnimationHandler animHandler = new AnimationHandlerZertum(this);
    protected EntityAILeapAtTarget aiLeap = new EntityAILeapAtTarget(this, 0.4F);
    public EntityAIWatchClosest aiStareAtPlayer = new EntityAIWatchClosest(this, EntityPlayer.class, 8.0F);
    public EntityAIWatchClosest aiGlareAtCreeper = new EntityAIWatchClosest(this, EntityCreeper.class, this.talents.getLevel("creeperspotter") * 6);
    public EntityAIFetchToy aiFetchBone;
    
    private float timeDogBegging;
    private float prevTimeDogBegging;
    public float headRotationCourse;
    public float headRotationCourseOld;
    public boolean isWet;
    public boolean isShaking;
    public float timeWolfIsShaking;
    public float prevTimeWolfIsShaking;
    private int hungerTick;
    private int prevHungerTick;
    private int healingTick;
    private int prevHealingTick;
    private int regenerationTick;
    private int prevRegenerationTick;
    public TalentUtil talents;
    public LevelUtil levels;
    public ModeUtil mode;
    public Map<String, Object> objects;
    private boolean hasToy;
    private float timeWolfIsHappy;
    private float prevTimeWolfIsHappy;
    private boolean isWolfHappy;
    public boolean hiyaMaster;
    private float mouthOpenness;
    private float prevMouthOpenness;
    private int openMouthCounter;
    
    public EntityZertumEntity(World worldIn) {
    	super(worldIn);
    	this.objects = new HashMap<String, Object>();
    	((PathNavigateGround) this.getNavigator()).setAvoidsWater(true);
    	this.tasks.addTask(1, new EntityAISwimming(this));
    	this.tasks.addTask(2, this.aiSit);
    	this.tasks.addTask(3, this.aiLeap);
    	this.tasks.addTask(4, new EntityAIAttackOnCollide(this, 1.0D, true));
    	this.tasks.addTask(5, new EntityAIFollowOwner(this, 1.0D, 10.0F, 2.0F));
    	this.tasks.addTask(6, this.aiFetchBone = new EntityAIFetchToy(this, 1.0D, 0.5F, 20.0F));
    	this.tasks.addTask(7, new EntityAIMate(this, 1.0D));
    	this.tasks.addTask(8, new EntityAIWander(this, 1.0D));
    	this.tasks.addTask(9, new EntityAIBeg(this, 8.0F));
    	this.tasks.addTask(10, aiStareAtPlayer);
    	this.tasks.addTask(10, new EntityAILookIdle(this));
    	this.targetTasks.addTask(1, new EntityAIOwnerHurtByTarget(this));
    	this.targetTasks.addTask(2, new EntityAIOwnerHurtTarget(this));
    	this.targetTasks.addTask(3, new EntityAIModeAttackTarget(this));
    	this.targetTasks.addTask(4, new EntityAIHurtByTarget(this, true));
    	this.setTamed(false);
    	this.setEvolved(false);
    	this.setFinalStage(false);
    	this.inventory = new InventoryPack(this);
    	this.targetTasks.addTask(6, new EntityAIRoundUp(this, EntityAnimal.class, 0, false));
    	TalentHelper.onClassCreation(this);
    
    	if (!this.hasEvolved() && !this.inFinalStage()) {
    		this.setSize(0.6F, 1.5F);
    	}
    	else if (this.hasEvolved() && this.inFinalStage()) {
    		this.setSize(2F, 3F);
    	}
    }
    
    @Override
    public void applyEntityAttributes() {
    	super.applyEntityAttributes();
    	this.getEntityAttribute(SharedMonsterAttributes.movementSpeed).setBaseValue(0.30000001192092896);
    	this.getEntityAttribute(SharedMonsterAttributes.maxHealth).setBaseValue(this.wildHealth());
    	this.getEntityAttribute(SharedMonsterAttributes.attackDamage).setBaseValue(this.wildDamage());
    	this.updateEntityAttributes();
    }
    
    public void updateEntityAttributes() {
    	if (this.isTamed()) {
    		if (!this.isChild() && !this.hasEvolved() && !this.inFinalStage()) {
    			this.getEntityAttribute(SharedMonsterAttributes.maxHealth).setBaseValue(this.tamedHealth() + this.effectiveLevel());
    			this.getEntityAttribute(SharedMonsterAttributes.attackDamage).setBaseValue(this.tamedDamage());
    		}
    		else if (!this.isChild() && this.hasEvolved() && !this.inFinalStage()) {
    			this.getEntityAttribute(SharedMonsterAttributes.maxHealth).setBaseValue(this.evoHealth() + this.effectiveLevel());
    			this.getEntityAttribute(SharedMonsterAttributes.attackDamage).setBaseValue(this.tamedDamage());
    		}
    		else if (!this.isChild() && this.hasEvolved() && this.inFinalStage()) {
    			this.getEntityAttribute(SharedMonsterAttributes.maxHealth).setBaseValue(this.finalEvoHealth() + this.effectiveLevel());
    			this.getEntityAttribute(SharedMonsterAttributes.attackDamage).setBaseValue(this.finalEvoDamage());
    		}
    		else {
    			this.getEntityAttribute(SharedMonsterAttributes.maxHealth).setBaseValue(this.babyHealth());
    			this.getEntityAttribute(SharedMonsterAttributes.attackDamage).setBaseValue(this.babyDamage());
    		}
    	}
    	else {
    		if (this.isChild()) {
    			this.getEntityAttribute(SharedMonsterAttributes.maxHealth).setBaseValue(this.babyHealth());
    			this.getEntityAttribute(SharedMonsterAttributes.attackDamage).setBaseValue(this.babyDamage());
    		}
    	}
    }
    
    @Override
    public void setTamed(boolean p_70903_1_) {
    	super.setTamed(p_70903_1_);
    	this.updateEntityAttributes();
    }
    
    public double tamedHealth() {
    	if (this instanceof EntityZertum || this instanceof EntityRedZertum) {
    		return 35;
    	}
    	else if (this instanceof EntityMetalZertum || this instanceof EntityIceZertum || this instanceof EntityForisZertum || this instanceof EntityDestroZertum || this instanceof EntityDarkZertum) {
    		return 40;
    	}
    	return 0;
    }
    
    public double tamedDamage() {
    	if (this instanceof EntityZertum || this instanceof EntityRedZertum || this instanceof EntityMetalZertum || this instanceof EntityIceZertum || this instanceof EntityForisZertum) {
    		return 8;
    	}
    	else if (this instanceof EntityDestroZertum) {
    		return 10;
    	}
    	else if (this instanceof EntityDarkZertum) {
    		return 12;
    	}
    	return 0;
    }
    
    public double evoHealth() {
    	if (this instanceof EntityZertum || this instanceof EntityRedZertum || this instanceof EntityIceZertum) {
    		return 45;
    	}
    	else if (this instanceof EntityMetalZertum || this instanceof EntityForisZertum || this instanceof EntityDestroZertum) {
    		return 50;
    	}
    	else if (this instanceof EntityDarkZertum) {
    		return 60;
    	}
    	return 0;
    }
    
    public double finalEvoHealth() {
    	if (this instanceof EntityZertum || this instanceof EntityRedZertum || this instanceof EntityIceZertum) {
    		return 55;
    	}
    	else if (this instanceof EntityMetalZertum || this instanceof EntityForisZertum || this instanceof EntityDestroZertum) {
    		return 60;
    	}
    	else if (this instanceof EntityDarkZertum) {
    		return 70;
    	}
    	return 0;
    }
    
    public double finalEvoDamage() {
    	if (this instanceof EntityZertum || this instanceof EntityRedZertum || this instanceof EntityMetalZertum || this instanceof EntityIceZertum || this instanceof EntityForisZertum) {
    		return 12;
    	}
    	else if (this instanceof EntityDestroZertum) {
    		return 18;
    	}
    	else if (this instanceof EntityDarkZertum) {
    		return 22;
    	}
    	return 0;
    }
    
    public double wildHealth() {
    	if (this instanceof EntityZertum || this instanceof EntityRedZertum || this instanceof EntityForisZertum) {
    		return 25;
    	}
    	else if (this instanceof EntityMetalZertum || this instanceof EntityDestroZertum || this instanceof EntityDarkZertum) {
    		return 30;
    	}
    	else if (this instanceof EntityIceZertum) {
    		return 35;
    	}
    	return 0;
    }
    
    public double wildDamage() {
    	if (this instanceof EntityZertum || this instanceof EntityRedZertum || this instanceof EntityMetalZertum || this instanceof EntityIceZertum || this instanceof EntityForisZertum) {
    		return 6;
    	}
    	else if (this instanceof EntityDestroZertum) {
    		return 8;
    	}
    	else if (this instanceof EntityDarkZertum) {
    		return 10;
    	}
    	return 0;
    }
    
    public double babyHealth() {
    	return 11;
    }
    
    public double babyDamage() {
    	if (this instanceof EntityZertum || this instanceof EntityRedZertum || this instanceof EntityMetalZertum) {
    		return 2;
    	}
    	else if (this instanceof EntityIceZertum || this instanceof EntityForisZertum || this instanceof EntityDarkZertum) {
    		return 4;
    	}
    	else if (this instanceof EntityDestroZertum) {
    		return 3;
    	}
    	return 0;
    }
    
    /**
     * Sets the active target the Task system uses for tracking
     */
    @Override
    public void setAttackTarget(EntityLivingBase p_70624_1_) {
    	super.setAttackTarget(p_70624_1_);
    	if (p_70624_1_ == null) {
    		this.setAngry(false);
    	}
    	else if (!this.isTamed()) {
    		this.setAngry(true);
    	}
    }
    
    @Override
    public String getCommandSenderName() {
    	String name = this.getPetName();
    	if (name != "" && this.isTamed()) {
    		return name;
    	}
    	else {
    		return super.getCommandSenderName();
    	}
    }
    
    @Override
    @SideOnly(Side.CLIENT)
    public boolean getAlwaysRenderNameTagForRender() {
    	return true;
    }
    
    //@formatter:off
    @Override
    protected void entityInit() {
    	super.entityInit();
    	this.talents = new TalentUtil(this);
    	this.levels = new LevelUtil(this);
    	this.mode = new ModeUtil(this);
    	this.dataWatcher.addObject(DataValues.ownerName, new String("")); //Owner Name
    	this.dataWatcher.addObject(DataValues.ownerID, new String("")); //Owner Id
    	this.dataWatcher.addObject(DataValues.collarCollar, new Byte((byte) EnumDyeColor.RED.getMetadata())); //Collar
    	this.dataWatcher.addObject(DataValues.dogName, new String("")); //Dog Name
    	this.dataWatcher.addObject(DataValues.talentData, new String("")); //Talent Data
    	this.dataWatcher.addObject(DataValues.hungerTicks, new Integer(Constants.hungerTicks)); //Dog Hunger
    	this.dataWatcher.addObject(DataValues.levelData, new String("0:0")); //Level Data
    	this.dataWatcher.addObject(DataValues.evolve, Byte.valueOf((byte)0)); //Evolution
    	this.dataWatcher.addObject(DataValues.obeyOthers, new Integer(0)); //Obey Others
    	this.dataWatcher.addObject(DataValues.zertumMode, new Integer(0)); //Zertum Mode
    	this.dataWatcher.addObject(DataValues.mouth, Integer.valueOf(0)); //Mouth
    	this.dataWatcher.addObject(DataValues.beg, new Byte((byte) 0)); //Begging
    }
    //@formatter:on
    @Override
    public AnimationHandler getAnimationHandler() {
    	return animHandler;
    }
    
    @Override
    public void writeEntityToNBT(NBTTagCompound tagCompound) {
    	super.writeEntityToNBT(tagCompound);
    	tagCompound.setString("ownerId", this.getOwnerID());
    	tagCompound.setString("ownerName", this.getOwnerName());
    	tagCompound.setByte("collarColor", (byte) this.getCollarColor().getDyeDamage());
    	tagCompound.setBoolean("evolve", this.hasEvolved());
    	tagCompound.setBoolean("finalEvolve", this.inFinalStage());
    	tagCompound.setString("version", Constants.version);
    	tagCompound.setString("dogName", this.getPetName());
    	tagCompound.setInteger("dogHunger", this.getZertumHunger());
    	tagCompound.setBoolean("willObey", this.willObeyOthers());
    	tagCompound.setBoolean("dogBeg", this.isBegging());
    
    	this.talents.writeTalentsToNBT(tagCompound);
    	this.levels.writeTalentsToNBT(tagCompound);
    	this.mode.writeToNBT(tagCompound);
    	TalentHelper.writeToNBT(this, tagCompound);
    }
    
    @Override
    public void readEntityFromNBT(NBTTagCompound tagCompound) {
    	super.readEntityFromNBT(tagCompound);
    	this.saveOwnerName(tagCompound.getString("ownerName"));
    	this.saveOwnerID(tagCompound.getString("ownerId"));
    	this.setEvolved(tagCompound.getBoolean("evolve"));
    	this.setFinalStage(tagCompound.getBoolean("finalEvolve"));
    
    	if (tagCompound.hasKey("collarColor", 99)) {
    		this.setCollarColor(EnumDyeColor.byDyeDamage(tagCompound.getByte("collarColor")));
    	}
    
    	String lastVersion = tagCompound.getString("version");
    	this.setPetName(tagCompound.getString("dogName"));
    	this.setZertumHunger(tagCompound.getInteger("dogHunger"));
    	this.setWillObeyOthers(tagCompound.getBoolean("willObey"));
    	this.setBegging(tagCompound.getBoolean("dogBeg"));
    	this.talents.readTalentsFromNBT(tagCompound);
    	this.levels.readTalentsFromNBT(tagCompound);
    	this.mode.readFromNBT(tagCompound);
    	TalentHelper.readFromNBT(this, tagCompound);
    }
    
    @Override
    protected void playStepSound(BlockPos p_180429_1_, Block p_180429_2_) {
    	this.playSound("mob.wolf.step", 0.15F, 1.0F);
    }
    
    /**
     * Returns the sound this mob makes while it's alive.
     */
    @Override
    protected String getLivingSound() {
    	this.openMouth();
    	String sound = TalentHelper.getLivingSound(this);
    	if (!"".equals(sound)) {
    		return sound;
    	}
    
    	// if(!this.inFinalStage()){
    	return this.isAngry() ? "mob.wolf.growl" : this.wantToHowl ? Sound.ZertumHowl
    			: (this.rand.nextInt(3) == 0
    			? (this.isTamed() && this.getHealth() <= Constants.lowHP ? "mob.wolf.whine"
    					: "mob.wolf.panting") : "mob.wolf.bark");
    	/* }else{ return Sound.; } */
    }
    
    /**
     * Returns the sound this mob makes when it is hurt.
     */
    @Override
    protected String getHurtSound() {
    	this.openMouth();
    	return "mob.wolf.hurt";
    }
    
    /**
     * Returns the sound this mob makes on death.
     */
    @Override
    protected String getDeathSound() {
    	this.openMouth();
    	return "mob.wolf.death";
    }
    
    /**
     * Returns the volume for the sounds this mob makes.
     */
    @Override
    public float getSoundVolume() {
    	return 1F;
    }
    
    /**
     * Gets the pitch of living sounds in living entities.
     */
    @Override
    public float getPitch() {
    	if (!this.isChild()) {
    		return super.getSoundPitch();
    	}
    	else {
    		return super.getSoundPitch() * 1;
    	}
    }
    
    /**
     * Get number of ticks, at least during which the living entity will be
     * silent.
     */
    @Override
    public int getTalkInterval() {
    	int ticks = TalentHelper.getTalkInterval(this);
    	if (ticks != 0) {
    		return ticks;
    	}
    	else if (this.wantToHowl) {
    		return 150;
    	}
    	else if (this.getHealth() <= Constants.lowHP) {
    		return 20;
    	}
    	else {
    		return 200;
    	}
    }
    
    /**
     * Returns the item ID for the item the mob drops on death.
     */
    @Override
    protected void dropFewItems(boolean par1, int par2) {
    	rare = rand.nextInt(20);
    	{
    		if (this.isBurning()) {
    			this.dropItem(ModItems.zertumMeatCooked, 1);
    		}
    		else if (rare <= 12) {
    			this.dropItem(ModItems.zertumMeatRaw, 1);
    		}
    		if (rare <= 6 && !this.isTamed() && !(this instanceof EntityDarkZertum)) {
    			this.dropItem(ModItems.nileGrain, 1);
    		}
    		if (rare <= 6 && !this.isTamed() && (this instanceof EntityDarkZertum)) {
    			this.dropItem(ModItems.darkGrain, 1);
    		}
    		if (this.isSaddled()) {
    			this.dropItem(Items.saddle, 1);
    		}
    		else {
    
    		}
    
    	}
    }
    
    /**
     * Called frequently so the entity can update its state every tick as
     * required. For example, zombies and skeletons use this to react to
     * sunlight and start to burn.
     */
    @Override
    public void onLivingUpdate() // NAV: Living Updates
    {
    	super.onLivingUpdate();
    	if (isServer() && this.isWet && !this.isShaking && !this.hasPath() && this.onGround) {
    		this.isShaking = true;
    		this.timeWolfIsShaking = 0.0F;
    		this.prevTimeWolfIsShaking = 0.0F;
    		this.worldObj.setEntityState(this, (byte) ;
    	}
    
    	if (Constants.DEF_IS_HUNGER_ON) {
    		this.prevHungerTick = this.hungerTick;
    
    		if (this.riddenByEntity == null && !this.isSitting()) {
    			this.hungerTick += 1;
    		}
    
    		this.hungerTick += TalentHelper.onHungerTick(this, this.hungerTick - this.prevHungerTick);
    
    		if (this.hungerTick > 400) {
    			this.setZertumHunger(this.getZertumHunger() - 1);
    			this.hungerTick -= 400;
    		}
    	}
    
    	if (this.getHealth() != Constants.lowHP) {
    		this.prevHealingTick = this.healingTick;
    		this.healingTick += this.nourishment();
    
    		if (this.healingTick >= 6000) {
    			if (this.getHealth() < this.getMaxHealth()) {
    				this.setHealth(this.getHealth() + 1);
    			}
    
    			this.healingTick = 0;
    		}
    	}
    
    	if (this.getZertumHunger() == 0 && this.worldObj.getWorldInfo().getWorldTime() % 100L == 0L && this.getHealth() > Constants.lowHP) {
    		this.attackEntityFrom(DamageSource.generic, 1);
    	}
    
    	if (isServer() && (this.getAttackTarget() == null || this.getAttackTarget().isDead) && this.isAngry()) {
    		this.setAngry(false);
    	}
    
    	if (this.isAngry()) {
    		this.getAnimationHandler().activateAnimation("angry", 0);
    	}
    
    	if (this.getHealth() <= Constants.lowHP && !this.getAnimationHandler().isAnimationActive("dying")) {
    		this.getAnimationHandler().activateAnimation("dying", 0);
    	}
    	else if (this.getHealth() == 11 && !this.getAnimationHandler().isAnimationActive("dyingheal")) {
    		this.getAnimationHandler().activateAnimation("dyingheal", 0);
    	}
    
    	if (Constants.DEF_HOWL == true) {
    		if (this.isServer()) {
    			if (this.worldObj.isDaytime() && this.isChild()) {
    				wantToHowl = false;
    			}
    			else if (!this.isChild()) {
    				wantToHowl = true;
    			}
    		}
    	}
    	TalentHelper.onLivingUpdate(this);
    }
    
    /**
     * Called to update the entity's position/logic.
     */
    @Override
    public void onUpdate() {
    	super.onUpdate();
    	this.prevTimeDogBegging = this.timeDogBegging;
    
    	if (this.isBegging()) {
    		this.timeDogBegging += (1.0F - this.timeDogBegging) * 0.4F;
    	}
    	else {
    		this.timeDogBegging += (0.0F - this.timeDogBegging) * 0.4F;
    	}
    
    	if (this.openMouthCounter > 0 && ++this.openMouthCounter > 30) {
    		this.openMouthCounter = 0;
    		this.setHorseWatchableBoolean(128, false);
    	}
    
    	this.prevMouthOpenness = this.mouthOpenness;
    
    	if (this.getHorseWatchableBoolean(128)) {
    		this.mouthOpenness += (1.0F - this.mouthOpenness) * 0.7F + 0.05F;
    
    		if (this.mouthOpenness > 1.0F) {
    			this.mouthOpenness = 1.0F;
    		}
    	}
    	else {
    		this.mouthOpenness += (0.0F - this.mouthOpenness) * 0.7F - 0.05F;
    
    		if (this.mouthOpenness < 0.0F) {
    			this.mouthOpenness = 0.0F;
    		}
    	}
    	this.headRotationCourseOld = this.headRotationCourse;
    
    	if (this.isBegging()) {
    		this.headRotationCourse += (1.0F - this.headRotationCourse) * 0.4F;
    	}
    	else {
    		this.headRotationCourse += (0.0F - this.headRotationCourse) * 0.4F;
    	}
    
    	if (this.isWet()) {
    		this.isWet = true;
    		this.isShaking = false;
    		this.timeWolfIsShaking = 0.0F;
    		this.prevTimeWolfIsShaking = 0.0F;
    	}
    	else if ((this.isWet || this.isShaking) && this.isShaking) {
    		if (this.timeWolfIsShaking == 0.0F) {
    			this.playSound("mob.wolf.shake", this.getSoundVolume(), (this.rand.nextFloat() - this.rand.nextFloat()) * 0.2F + 1.0F);
    		}
    
    		this.prevTimeWolfIsShaking = this.timeWolfIsShaking;
    		this.timeWolfIsShaking += 0.05F;
    
    		if (this.prevTimeWolfIsShaking >= 2.0F) {
    			if (this.rand.nextInt(15) < this.talents.getLevel("fishing") * 2) {
    				if (this.rand.nextInt(15) < this.talents.getLevel("flamingelemental") * 2 && this instanceof EntityRedZertum) {
    					if (isServer()) {
    						dropItem(Items.cooked_fish, 1);
    					}
    				}
    				else {
    					if (isServer()) {
    						dropItem(Items.fish, 1);
    					}
    				}
    			}
    			this.isWet = false;
    			this.isShaking = false;
    			this.prevTimeWolfIsShaking = 0.0F;
    			this.timeWolfIsShaking = 0.0F;
    		}
    
    		if (this.timeWolfIsShaking > 0.4F) {
    			float f = (float) this.getEntityBoundingBox().minY;
    			int i = (int) (MathHelper.sin((this.timeWolfIsShaking - 0.4F) * (float) Math.PI) * 7.0F);
    
    			for (int j = 0; j < i; ++j) {
    				float f1 = (this.rand.nextFloat() * 2.0F - 1.0F) * this.width * 0.5F;
    				float f2 = (this.rand.nextFloat() * 2.0F - 1.0F) * this.width * 0.5F;
    				this.worldObj.spawnParticle(EnumParticleTypes.WATER_SPLASH, this.posX + f1, f + 0.8F, this.posZ + f2, this.motionX, this.motionY, this.motionZ, new int[0]);
    			}
    		}
    	}
    
    	if (this.rand.nextInt(200) == 0 && this.hasEvolved()) {
    		this.hiyaMaster = true;
    	}
    
    	if (((this.isBegging()) || (this.hiyaMaster)) && (!this.isWolfHappy) && this.hasEvolved()) {
    		this.isWolfHappy = true;
    		this.timeWolfIsHappy = 0.0F;
    		this.prevTimeWolfIsHappy = 0.0F;
    	}
    	else {
    		hiyaMaster = false;
    	}
    	if (this.isWolfHappy) {
    		if (this.timeWolfIsHappy % 1.0F == 0.0F) {
    			if (!(this instanceof EntityMetalZertum)) {
    				this.openMouth();
    
    				this.worldObj.playSoundAtEntity(this, "mob.wolf.panting", this.getSoundVolume(), (this.rand.nextFloat() - this.rand.nextFloat()) * 0.2F + 1.0F);
    			}
    			else if (this instanceof EntityMetalZertum) {
    				this.openMouth();
    				this.worldObj.playSoundAtEntity(this, Sound.MetalZertumPant, this.getSoundVolume(), (this.rand.nextFloat() - this.rand.nextFloat()) * 0.2F + 1.0F);
    			}
    		}
    		this.prevTimeWolfIsHappy = this.timeWolfIsHappy;
    		this.timeWolfIsHappy += 0.05F;
    		if (this.prevTimeWolfIsHappy >= 8.0F) {
    			this.isWolfHappy = false;
    			this.prevTimeWolfIsHappy = 0.0F;
    			this.timeWolfIsHappy = 0.0F;
    		}
    	}
    
    	if (this.isTamed()) {
    		EntityPlayer player = (EntityPlayer) this.getOwner();
    
    		if (player != null) {
    			float distanceToOwner = player.getDistanceToEntity(this);
    
    			if (distanceToOwner <= 2F && this.hasToy()) {
    				if (isServer()) {
    					this.entityDropItem(new ItemStack(ModItems.toy, 1, 1), 0.0F);
    				}
    				this.setHasToy(false);
    			}
    		}
    	}
    
    	TalentHelper.onUpdate(this);
    }
    
    public float getWagAngle(float f, float f1) {
    	float f2 = (this.prevTimeWolfIsHappy + (this.timeWolfIsHappy - this.prevTimeWolfIsHappy) * f + f1) / 2.0F;
    	if (f2 < 0.0F) {
    		f2 = 0.0F;
    	}
    	else if (f2 > 2.0F) {
    		f2 %= 2.0F;
    	}
    	return MathHelper.sin(f2 * (float) Math.PI * 5.0F) * 0.3F * (float) Math.PI;
    }
    
    @Override
    public void moveEntityWithHeading(float strafe, float forward) {
    	if (this.riddenByEntity instanceof EntityPlayer) {
    		this.prevRotationYaw = this.rotationYaw = this.riddenByEntity.rotationYaw;
    		this.rotationPitch = this.riddenByEntity.rotationPitch * 0.5F;
    		this.setRotation(this.rotationYaw, this.rotationPitch);
    		this.rotationYawHead = this.renderYawOffset = this.rotationYaw;
    		strafe = ((EntityPlayer) this.riddenByEntity).moveStrafing * 0.5F;
    		forward = ((EntityPlayer) this.riddenByEntity).moveForward;
    
    		if (forward <= 0.0F) {
    			forward *= 0.25F;
    		}
    
    		if (this.onGround) {
    			if (forward > 0.0F) {
    				float f2 = MathHelper.sin(this.rotationYaw * (float) Math.PI / 180.0F);
    				float f3 = MathHelper.cos(this.rotationYaw * (float) Math.PI / 180.0F);
    				this.motionX += -0.4F * f2 * 0.15F; // May change
    				this.motionZ += 0.4F * f3 * 0.15F;
    			}
    		}
    
    		this.stepHeight = 1.0F;
    		this.jumpMovementFactor = this.getAIMoveSpeed() * 0.2F;
    
    		if (isServer()) {
    			this.setAIMoveSpeed((float) this.getEntityAttribute(SharedMonsterAttributes.movementSpeed).getAttributeValue() / 4);
    			super.moveEntityWithHeading(strafe, forward);
    		}
    
    		if (this.onGround) {
    			// this.jumpPower = 0.0F;
    			// this.setHorseJumping(false);
    		}
    
    		this.prevLimbSwingAmount = this.limbSwingAmount;
    		double d0 = this.posX - this.prevPosX;
    		double d1 = this.posZ - this.prevPosZ;
    		float f4 = MathHelper.sqrt_double(d0 * d0 + d1 * d1) * 4.0F;
    
    		if (f4 > 1.0F) {
    			f4 = 1.0F;
    		}
    
    		this.limbSwingAmount += (f4 - this.limbSwingAmount) * 0.4F;
    		this.limbSwing += this.limbSwingAmount;
    	}
    	else {
    		this.stepHeight = 0.5F;
    		this.jumpMovementFactor = 0.02F;
    		super.moveEntityWithHeading(strafe, forward);
    	}
    }
    
    @Override
    public float getAIMoveSpeed() {
    	double speed = this.getEntityAttribute(SharedMonsterAttributes.movementSpeed).getAttributeValue();
    	speed += TalentHelper.addToMoveSpeed(this);
    
    	if ((!(this.getAttackTarget() instanceof EntityZertumEntity) && !(this.getAttackTarget() instanceof EntityPlayer)) || this.riddenByEntity instanceof EntityPlayer) {
    		if (this.levels.getLevel() == Constants.stage2Level && this.hasEvolved()) {
    			speed += 0.3D;
    		}
    		else if (this.hasEvolved() && this.levels.getLevel() != Constants.stage2Level) {
    			speed += 0.3D;
    		}
    	}
    
    	if (this.riddenByEntity instanceof EntityPlayer) {
    		speed /= 4;
    	}
    
    	return (float) speed;
    }
    
    public float getAIAttackDamage() {
    	double damage = this.getEntityAttribute(SharedMonsterAttributes.attackDamage).getAttributeValue();
    	damage += TalentHelper.addToAttackDamage(this);
    
    	if ((!(this.getAttackTarget() instanceof EntityZertumEntity) && !(this.getAttackTarget() instanceof EntityPlayer))) {
    		if (this.levels.getLevel() == Constants.stage2Level && this.hasEvolved() && !this.inFinalStage()) {
    			damage += 1.0D;
    		}
    		else if (this.levels.getLevel() == Constants.maxLevel && this.hasEvolved() && this.inFinalStage()) {
    			damage += 3.0D;
    		}
    	}
    	return (float) damage;
    }
    
    @Override
    public void fall(float distance, float damageMultiplier) {
    	if (distance > 1.0F) {
    		if (!this.inFinalStage()) {
    			this.playSound("game.neutral.hurt.fall.small", 0.4F, 1.0F);
    		}
    		else {
    			this.playSound(Sound.Land, 0.4F, 1.0F);
    		}
    	}
    
    	int i = MathHelper.ceiling_float_int(((distance * 0.5F - 3.0F) - TalentHelper.fallProtection(this)) * damageMultiplier);
    
    	if (i > 0 && !TalentHelper.isImmuneToFalls(this) && !this.inFinalStage()) {
    		this.attackEntityFrom(DamageSource.fall, i);
    
    		if (this.riddenByEntity != null) {
    			this.riddenByEntity.attackEntityFrom(DamageSource.fall, i);
    		}
    
    		Block block = this.worldObj.getBlockState(new BlockPos(this.posX, this.posY - 0.2D - this.prevRotationYaw, this.posZ)).getBlock();
    
    		if (block.getMaterial() != Material.air && !this.isSilent()) {
    			Block.SoundType soundtype = block.stepSound;
    			this.worldObj.playSoundAtEntity(this, soundtype.getStepSound(), soundtype.getVolume() * 0.5F, soundtype.getFrequency() * 0.75F);
    		}
    	}
    	else if (i > 3 && !TalentHelper.isImmuneToFalls(this) && this.inFinalStage()) {
    		this.attackEntityFrom(DamageSource.fall, i);
    
    		if (this.riddenByEntity != null) {
    			this.riddenByEntity.attackEntityFrom(DamageSource.fall, i);
    		}
    
    		Block block = this.worldObj.getBlockState(new BlockPos(this.posX, this.posY - 0.2D - this.prevRotationYaw, this.posZ)).getBlock();
    
    		if (block.getMaterial() != Material.air && !this.isSilent()) {
    			Block.SoundType soundtype = block.stepSound;
    			this.worldObj.playSoundAtEntity(this, soundtype.getStepSound(), soundtype.getVolume() * 0.5F, soundtype.getFrequency() * 0.75F);
    		}
    	}
    }
    
    @SideOnly(Side.CLIENT)
    public boolean isWolfWet() {
    	return this.isWet;
    }
    
    @SideOnly(Side.CLIENT)
    public float getShadingWhileWet(float p_70915_1_) {
    	return 0.75F + (this.prevTimeWolfIsShaking + (this.timeWolfIsShaking - this.prevTimeWolfIsShaking) * p_70915_1_) / 2.0F * 0.25F;
    }
    
    @SideOnly(Side.CLIENT)
    public float getShakeAngle(float p_70923_1_, float p_70923_2_) {
    	float f2 = (this.prevTimeWolfIsShaking + (this.timeWolfIsShaking - this.prevTimeWolfIsShaking) * p_70923_1_ + p_70923_2_) / 1.8F;
    
    	if (f2 < 0.0F) {
    		f2 = 0.0F;
    	}
    	else if (f2 > 1.0F) {
    		f2 = 1.0F;
    	}
    
    	return MathHelper.sin(f2 * (float) Math.PI) * MathHelper.sin(f2 * (float) Math.PI * 11.0F) * 0.15F * (float) Math.PI;
    }
    
    @SideOnly(Side.CLIENT)
    public float getInterestedAngle(float partialTickTime) {
    	return (this.prevTimeDogBegging + (this.timeDogBegging - this.prevTimeDogBegging) * partialTickTime) * 0.15F * (float) Math.PI;
    }
    
    @Override
    public float getEyeHeight() { // NAV
    	return this.height;
    }
    
    @Override
    public int getVerticalFaceSpeed() {
    	return this.isSitting() ? 20 : super.getVerticalFaceSpeed();
    }
    
    @Override
    public boolean attackEntityFrom(DamageSource damageSource, float damage) {
    	if (this.isEntityInvulnerable(damageSource)) {
    		return false;
    	}
    	else {
    		if (!TalentHelper.attackEntityFrom(this, damageSource, damage)) {
    			return false;
    		}
    
    		Entity entity = damageSource.getEntity();
    		this.aiSit.setSitting(false);
    
    		if (entity != null && !(entity instanceof EntityPlayer) && !(entity instanceof EntityArrow)) {
    			damage = (damage + 1.0F) / 2.0F;
    		}
    
    		return super.attackEntityFrom(damageSource, damage);
    	}
    }
    
    @Override
    public boolean attackEntityAsMob(Entity entity) {
    	if (!TalentHelper.shouldDamageMob(this, entity)) {
    		return false;
    	}
    
    	int damage = (int) (4 + (this.getEntityAttribute(SharedMonsterAttributes.attackDamage).getBaseValue()) / 2);
    	damage = TalentHelper.attackEntityAsMob(this, entity, damage);
    
    	if (entity instanceof EntityZombie) {
    		((EntityZombie) entity).setAttackTarget(this);
    	}
    
    	return entity.attackEntityFrom(DamageSource.causeMobDamage(this), damage);
    }
    
    /**
     * Called when the mob's health reaches 0.
     */
    @Override
    public void onDeath(DamageSource par1DamageSource) {
    	super.onDeath(par1DamageSource);
    
    	if (par1DamageSource.getEntity() instanceof EntityPlayer) {
    		EntityPlayer entityplayer = (EntityPlayer) par1DamageSource.getEntity();
    		{
    			entityplayer.triggerAchievement(ModAchievements.ZertKill);
    			this.dropChestItems();
    
    		}
    	}
    }
    
    @Override
    protected boolean isMovementBlocked() {
    	return this.isPlayerSleeping() || this.ridingEntity != null || this.riddenByEntity instanceof EntityPlayer || super.isMovementBlocked();
    }
    
    @Override
    public double getYOffset() {
    	return this.ridingEntity instanceof EntityPlayer ? 0.5D : 0.0D;
    }
    
    @Override
    public boolean isPotionApplicable(PotionEffect potionEffect) {
    	if (this.getHealth() <= Constants.lowHP) {
    		return false;
    	}
    
    	if (!TalentHelper.isPostionApplicable(this, potionEffect)) {
    		return false;
    	}
    
    	return true;
    }
    
    @Override
    public void setFire(int amount) {
    	if (TalentHelper.setFire(this, amount)) {
    		super.setFire(amount);
    	}
    }
    
    public int foodValue(ItemStack stack) {
    	if (stack == null || stack.getItem() == null) {
    		return 0;
    	}
    
    	int foodValue = 0;
    
    	Item item = stack.getItem();
    
    	if (stack.getItem() != Items.rotten_flesh && item instanceof ItemFood) {
    		ItemFood itemfood = (ItemFood) item;
    
    		if (itemfood.isWolfsFavoriteMeat()) {
    			foodValue = 40;
    		}
    	}
    
    	foodValue = TalentHelper.changeFoodValue(this, stack, foodValue);
    
    	return foodValue;
    }
    
    public int masterOrder() { // NAV: Master Order
    	int order = 0;
    	EntityPlayer player = (EntityPlayer) this.getOwner();
    
    	if (player != null) {
    
    		float distanceAway = player.getDistanceToEntity(this);
    		ItemStack itemstack = player.inventory.getCurrentItem();
    
    		if (itemstack != null && (itemstack.getItem() instanceof ItemTool) && distanceAway <= 20F) {
    			order = 1;
    		}
    
    		if (itemstack != null && ((itemstack.getItem() instanceof ItemSword) || (itemstack.getItem() instanceof ItemBow))) {
    			order = 2;
    		}
    
    		if (itemstack != null && itemstack.getItem() == Items.wheat) {
    			order = 3;
    		}
    
    		if (itemstack != null && itemstack.getItem() == Items.bone) {
    			order = 4;
    		}
    	}
    
    	return order;
    }
    
    @Override
    public boolean canBreatheUnderwater() {
    	return TalentHelper.canBreatheUnderwater(this);
    }
    
    @Override
    public boolean canInteract(EntityPlayer player) {
    	return this.isOwner(player) || this.willObeyOthers();
    }
    
    public int nourishment() {
    	int amount = 0;
    
    	if (this.getZertumHunger() > 0) {
    		amount = 40 + 4 * (this.effectiveLevel() + 1);
    
    		if (isSitting() && this.talents.getLevel("rapidregen") == 5) {
    			amount += 20 + 2 * (this.effectiveLevel() + 1);
    		}
    
    		if (!this.isSitting()) {
    			amount *= 5 + this.talents.getLevel("rapidregen");
    			amount /= 10;
    		}
    	}
    
    	return amount;
    }
    
    public int effectiveLevel() {
    	return (this.levels.getLevel()) / 10;
    }
    
    public String getPetName() {
    	return this.dataWatcher.getWatchableObjectString(DataValues.dogName);
    }
    
    public void setPetName(String var1) {
    	this.dataWatcher.updateObject(DataValues.dogName, var1);
    }
    
    public void setWillObeyOthers(boolean flag) {
    	this.dataWatcher.updateObject(DataValues.obeyOthers, flag ? 1 : 0);
    }
    
    public boolean willObeyOthers() {
    	return this.dataWatcher.getWatchableObjectInt(DataValues.obeyOthers) != 0;
    }
    
    public int points() {
    	return this.levels.getLevel() + (this.getGrowingAge() < 0 ? 0 : Constants.startingPoints);
    }
    
    public int spendablePoints() {
    	return this.points() - this.usedPoints();
    }
    
    public int usedPoints() {
    	return TalentHelper.getUsedPoints(this);
    }
    
    public int getZertumHunger() {
    	return this.dataWatcher.getWatchableObjectInt(DataValues.hungerTicks);
    }
    
    public void setZertumHunger(int par1) {
    	this.dataWatcher.updateObject(DataValues.hungerTicks, MathHelper.clamp_int(par1, 0, Constants.hungerTicks));
    }
    
    @Override
    public boolean func_142018_a(EntityLivingBase entityToAttack, EntityLivingBase owner) {
    	if (TalentHelper.canAttackEntity(this, entityToAttack)) {
    		return true;
    	}
    
    	if (!(entityToAttack instanceof EntityCreeper) && !(entityToAttack instanceof EntityGhast)) {
    		if (entityToAttack instanceof EntityZertumEntity) {
    			EntityZertumEntity entityZertum = (EntityZertumEntity) entityToAttack;
    
    			if (entityZertum.isTamed() && entityZertum.getOwner() == owner) {
    				return false;
    			}
    		}
    
    		return entityToAttack instanceof EntityPlayer && owner instanceof EntityPlayer && !((EntityPlayer) owner).canAttackPlayer((EntityPlayer) entityToAttack)
    				? false
    						: !(entityToAttack instanceof EntityHorse) || !((EntityHorse) entityToAttack).isTame();
    	}
    	else {
    		return false;
    	}
    }
    
    @Override
    public boolean canAttackClass(Class p_70686_1_) {
    	if (TalentHelper.canAttackClass(this, p_70686_1_)) {
    		return true;
    	}
    
    	return super.canAttackClass(p_70686_1_);
    }
    
    public void setHasToy(boolean hasToy) {
    	this.hasToy = hasToy;
    }
    
    public boolean hasToy() {
    	return this.hasToy;
    }
    
    @Override
    @SideOnly(Side.CLIENT)
    public void handleHealthUpdate(byte p_70103_1_) {
    	if (p_70103_1_ ==  {
    		this.isShaking = true;
    		this.timeWolfIsShaking = 0.0F;
    		this.prevTimeWolfIsShaking = 0.0F;
    	}
    	else {
    		super.handleHealthUpdate(p_70103_1_);
    	}
    }
    
    /**
     * Checks if the parameter is an item which this animal can be fed to breed
     * it (wheat, carrots or seeds depending on the animal type)
     */
    @Override
    public boolean isBreedingItem(ItemStack stack) {
    	return stack != null && ZeroQuestAPI.breedList.containsItem(stack);
    }
    
    @Override
    public int getMaxSpawnedInChunk() {
    	return 8;
    }
    
    public EnumDyeColor getCollarColor() {
    	return EnumDyeColor.byDyeDamage(this.dataWatcher.getWatchableObjectByte(DataValues.collarCollar) & 15);
    }
    
    public void setCollarColor(EnumDyeColor collarcolor) {
    	this.dataWatcher.updateObject(DataValues.collarCollar, Byte.valueOf((byte) (collarcolor.getDyeDamage() & 15)));
    }
    
    private boolean getHorseWatchableBoolean(int p_110233_1_) {
    	return (this.dataWatcher.getWatchableObjectInt(DataValues.mouth) & p_110233_1_) != 0;
    }
    
    private void setHorseWatchableBoolean(int p_110208_1_, boolean p_110208_2_) {
    	int j = this.dataWatcher.getWatchableObjectInt(DataValues.mouth);
    
    	if (p_110208_2_) {
    		this.dataWatcher.updateObject(DataValues.mouth, Integer.valueOf(j | p_110208_1_));
    	}
    	else {
    		this.dataWatcher.updateObject(DataValues.mouth, Integer.valueOf(j & ~p_110208_1_));
    	}
    }
    
    @SideOnly(Side.CLIENT)
    public float getMouthOpennessAngle(float p_110201_1_) {
    	return this.prevMouthOpenness + (this.mouthOpenness - this.prevMouthOpenness) * p_110201_1_;
    }
    
    public void openMouth() {
    	if (isServer()) {
    		this.openMouthCounter = 1;
    		this.setHorseWatchableBoolean(128, true);
    	}
    }
    
    /**
     * Determines if an entity can be despawned, used on idle far away entities
     */
    @Override
    protected boolean canDespawn() {
    	return !this.isTamed() && this.ticksExisted > 2400;
    }
    
    @Override
    public boolean allowLeashing() {
    	return !this.isAngry() && super.allowLeashing();
    }
    
    public void setBegging(boolean flag) {
    	this.dataWatcher.updateObject(DataValues.beg, Byte.valueOf((byte) (flag ? 1 : 0)));
    }
    
    public boolean isBegging() {
    	return this.dataWatcher.getWatchableObjectByte(DataValues.beg) == 1;
    }
    
    public boolean hasEvolved() {
    	return (this.dataWatcher.getWatchableObjectByte(DataValues.evolve) & 4) != 0;
    }
    
    public void setEvolved(boolean evolved) {
    	byte b0 = this.dataWatcher.getWatchableObjectByte(DataValues.evolve);
    
    	if (evolved) {
    		this.dataWatcher.updateObject(DataValues.evolve, Byte.valueOf((byte) (b0 | 4)));
    	}
    	else {
    		this.dataWatcher.updateObject(DataValues.evolve, Byte.valueOf((byte) (b0 & -5)));
    	}
    	this.updateEntityAttributes();
    }
    
    public boolean inFinalStage() {
    	return (this.dataWatcher.getWatchableObjectByte(DataValues.evolve) & 2) != 0;
    }
    
    public void setFinalStage(boolean finalStage) {
    	byte b0 = this.dataWatcher.getWatchableObjectByte(DataValues.evolve);
    
    	if (finalStage) {
    		this.dataWatcher.updateObject(DataValues.evolve, Byte.valueOf((byte) (b0 | 2)));
    	}
    	else {
    		this.dataWatcher.updateObject(DataValues.evolve, Byte.valueOf((byte) (b0 & -3)));
    	}
    	this.updateEntityAttributes();
    }
    
    public String getOwnerName() {
    	return this.dataWatcher.getWatchableObjectString(DataValues.ownerName);
    }
    
    public void saveOwnerName(String name) {
    	this.dataWatcher.updateObject(DataValues.ownerName, name);
    }
    
    public String getOwnerID() {
    	return this.dataWatcher.getWatchableObjectString(DataValues.ownerID);
    }
    
    public void saveOwnerID(String id) {
    	this.dataWatcher.updateObject(DataValues.ownerID, id);
    }
    
    /** Custom Zertum Taming Code */
    @Override
    public void tamedFor(EntityPlayer player, boolean successful) {
    	if (successful) {
    		this.setTamed(true);
    		this.updateEntityAttributes();
    		this.navigator.clearPathEntity();
    		this.setAttackTarget((EntityLivingBase) null);
    		this.aiSit.setSitting(false);
    		this.setOwnerId(player.getUniqueID().toString());
    		this.playTameEffect(true);
    		this.worldObj.setEntityState(this, (byte) 7);
    		this.saveOwnerName(player.getDisplayNameString());
    		this.saveOwnerID(player.getUniqueID().toString());
    		player.triggerAchievement(ModAchievements.ZertTame);
    		//@formatter:off
    		//System.out.println("ID: " + zertum.getOwnerID() + ", Name: " + zertum.getOwnerName());
    		//@formatter:on
    	}
    	else {
    		this.playTameEffect(false);
    		this.worldObj.setEntityState(this, (byte) 6);
    	}
    }
    
    public void unTame() {
    	this.setTamed(false);
    	this.setEvolved(false);
    	this.setFinalStage(false);
    	this.navigator.clearPathEntity();
    	this.setSitting(false);
    	this.talents.resetTalents();
    	this.levels.resetLevel();
    	this.setOwnerId("");
    	this.saveOwnerName("");
    	this.saveOwnerID("");
    	this.setPetName("");
    	this.setWillObeyOthers(false);
    	this.mode.setMode(EnumMode.DOCILE);
    	this.updateEntityAttributes();
    }
    
    public void evolveOnClient(EntityPlayer player) {
    	this.setEvolved(true);
    	this.worldObj.playBroadcastSound(1013, new BlockPos(this), 0);
    	this.updateEntityAttributes();
    	this.setHealth(this.getMaxHealth());
    	player.addChatMessage(ChatHelper.getChatComponent(EnumChatFormatting.GREEN + this.getPetName() + " has been evolved!"));
    }
    
    public void evolveOnServer(EntityZertumEntity entity, EntityPlayer player) {
    	entity.setEvolved(true);
    	entity.worldObj.playBroadcastSound(1013, new BlockPos(entity), 0);
    	this.updateEntityAttributes();
    	entity.setHealth(entity.getMaxHealth());
    	player.addChatMessage(ChatHelper.getChatComponent(EnumChatFormatting.GREEN + entity.getPetName() + " has been evolved!"));
    }
    
    public void finaEvolveOnClient(EntityPlayer player) {
    	this.setFinalStage(true);
    	this.worldObj.playBroadcastSound(1013, new BlockPos(this), 0);
    	this.updateEntityAttributes();
    	this.setHealth(this.getMaxHealth());
    	player.addChatMessage(ChatHelper.getChatComponent(EnumChatFormatting.GREEN + this.getPetName() + " has been evolved to the final stage!"));
    }
    
    public void finaEvolveOnServer(EntityZertumEntity entity, EntityPlayer player) {
    	entity.setFinalStage(true);
    	entity.worldObj.playBroadcastSound(1013, new BlockPos(entity), 0);
    	this.updateEntityAttributes();
    	entity.setHealth(entity.getMaxHealth());
    	player.addChatMessage(ChatHelper.getChatComponent(EnumChatFormatting.GREEN + entity.getPetName() + " has been evolved to the final stage!"));
    }
    
    public void devolveOnServer(EntityZertumEntity entity, EntityPlayer player) {
    	if (entity.hasEvolved() && !entity.inFinalStage()) {
    		entity.setEvolved(false);
    	}
    	else if (entity.hasEvolved() && entity.inFinalStage()) {
    		entity.setFinalStage(false);
    	}
    	entity.worldObj.playBroadcastSound(1013, new BlockPos(entity), 0);
    	this.updateEntityAttributes();
    	entity.setHealth(entity.getMaxHealth());
    	player.addChatMessage(ChatHelper.getChatComponent(EnumChatFormatting.DARK_RED + entity.getPetName() + " has been devolved!"));
    }
    
    public String genderPronoun() {
    	if (this.getGender() == true) {
    		return "him";
    	}
    	else {
    		return "her";
    	}
    }
    
    public String genderSubject() {
    	if (this.getGender() == true) {
    		return "he";
    	}
    	else {
    		return "she";
    	}
    }
    
    public void doNotOwnMessage(EntityZertumEntity zertum, EntityPlayer player) {
    	player.addChatMessage(ChatHelper.getChatComponent(EnumChatFormatting.RED + "You do not own " + zertum.getPetName() + " and " + zertum.getOwnerName() + " doesn't allow " + zertum.genderPronoun() + EnumChatFormatting.RED + " to" + EnumChatFormatting.RED + " obey" + EnumChatFormatting.RED + "non-owners!"));
    }
    }

     

    Renderer

    package net.novaviper.zeroquest.client.render.entity.zertum;
    
    import net.minecraft.client.gui.FontRenderer;
    import net.minecraft.client.model.ModelBase;
    import net.minecraft.client.renderer.GlStateManager;
    import net.minecraft.client.renderer.Tessellator;
    import net.minecraft.client.renderer.WorldRenderer;
    import net.minecraft.client.renderer.entity.RenderLiving;
    import net.minecraft.client.renderer.entity.RenderManager;
    import net.minecraft.entity.Entity;
    import net.minecraft.entity.EntityLiving;
    import net.minecraft.entity.EntityLivingBase;
    import net.minecraft.util.ResourceLocation;
    import net.minecraftforge.fml.relauncher.Side;
    import net.minecraftforge.fml.relauncher.SideOnly;
    import net.novaviper.zeroquest.client.model.ModelZertumStage2;
    import net.novaviper.zeroquest.client.model.ModelZertumStage3;
    import net.novaviper.zeroquest.client.render.entity.layers.LayersZertum;
    import net.novaviper.zeroquest.common.entity.creature.EntityZertum;
    import net.novaviper.zeroquest.common.util.ResourceReference;
    
    import org.lwjgl.opengl.GL11;
    
    @SideOnly(Side.CLIENT)
    public class RenderZertum extends RenderLiving {
    
    private final ModelBase model1, model2, model3;
    
    public RenderZertum(RenderManager render, ModelBase base, float par1) {
    	super(render, base, par1);
    	this.addLayer(new LayersZertum(this));
    	model1 = base;
    	model2 = new ModelZertumStage2();
    	model3 = new ModelZertumStage3();
    }
    
    public void func_177135_a(EntityZertum entity, double par1, double par2, double par3, float par4, float par5) {
    	if (entity.isWolfWet()) {
    		float f2 = entity.getBrightness(par5) * entity.getShadingWhileWet(par5);
    		GlStateManager.color(f2, f2, f2);
    	}
    
    	super.doRender(entity, par1, par2, par3, par4, par5);
    }
    
    @Override
    public void doRender(Entity _entity, double posX, double posY, double posZ, float var8, float var9) {
    	EntityZertum entity = (EntityZertum) _entity;
    	GL11.glPushMatrix();
    	GL11.glDisable(GL11.GL_CULL_FACE);
    	super.doRender(_entity, posX, posY, posZ, var8, var9);
    	GL11.glEnable(GL11.GL_CULL_FACE);
    	GL11.glPopMatrix();
    }
    
    @Override
    protected void preRenderCallback(EntityLivingBase entityliving, float f) {
    	GL11.glRotatef(180F, 0, 1F, 0F);
    	GL11.glRotatef(180F, 0, 0, 1F);
    	GL11.glTranslatef(0, 2f, 0);
    }
    
    protected ResourceLocation getEntityTexture(EntityZertum entity) {
    	if (!entity.hasEvolved()) {
    		if (entity.isTamed()) {
    			return ResourceReference.getZTameSkins("");
    		}
    		else if (entity.isAngry()) {
    			return ResourceReference.getZAngrySkins("");
    		}
    		else if (!entity.isTamed() && !entity.isAngry()) {
    			return ResourceReference.getZWildSkins("");
    		}
    	}
    	else if (entity.hasEvolved()) {
    		if (!entity.inFinalStage()) {
    			return ResourceReference.getZEvoSkins("");
    		}
    		else if (entity.inFinalStage()) {
    			return ResourceReference.getZFinalSkins("");
    		}
    	}
    	return null;
    }
    
    @Override
    public void doRender(EntityLiving entity, double par1, double par2, double par3, float par4, float par5) {
    	EntityZertum zertum = (EntityZertum) entity;
    	if (!zertum.hasEvolved() && !zertum.inFinalStage()) {
    		this.mainModel = model1;
    	}
    	else if (zertum.hasEvolved() && !zertum.inFinalStage()) {
    		this.mainModel = model2;
    	}
    	else if (zertum.hasEvolved() && zertum.inFinalStage()) {
    		this.mainModel = model3;
    	}
    
    	this.func_177135_a((EntityZertum) entity, par1, par2, par3, par4, par5);
    }
    
    @Override
    public void doRender(EntityLivingBase entity, double par1, double par2, double par3, float par4, float par5) {
    	this.func_177135_a((EntityZertum) entity, par1, par2, par3, par4, par5);
    }
    
    @Override
    protected ResourceLocation getEntityTexture(Entity p_110775_1_) {
    	return this.getEntityTexture((EntityZertum) p_110775_1_);
    }
    
    @Override
    public void passSpecialRender(EntityLivingBase entityLivingBase, double par1, double par2, double par3) {
    	EntityZertum dog = (EntityZertum) entityLivingBase;
    
    	if (!dog.getPetName().isEmpty()) {
    		super.passSpecialRender(entityLivingBase, par1, par2, par3);
    	}
    }
    
    @Override
    protected void renderOffsetLivingLabel(Entity entity, double x, double y, double z, String displayName, float scale, double distanceFromPlayer) {
    	super.renderOffsetLivingLabel(entity, x, y, z, displayName, scale, distanceFromPlayer);
    
    	EntityZertum dog = (EntityZertum) entity;
    
    	if (distanceFromPlayer < 100.0D) {
    
    		y += this.getFontRendererFromRenderManager().FONT_HEIGHT * 1.15F * 0.016666668F * 0.7F;
    
    		String tip = dog.mode.getMode().getTip();
    
    		String label = String.format("%s[%d]", tip, dog.getZertumHunger());
    
    		if (dog.isPlayerSleeping()) {
    			this.renderLivingLabel(dog, label, x, y - 0.5D, z, 64, 0.7F);
    		}
    		else {
    			this.renderLivingLabel(dog, label, x, y, z, 64, 0.7F);
    		}
    	}
    
    	if (distanceFromPlayer < 100.0D) {
    		y += this.getFontRendererFromRenderManager().FONT_HEIGHT * 1.15F * 0.016666668F * 0.5F;
    
    		if (this.renderManager.livingPlayer.isSneaking()) {
    			EntityLivingBase owner = dog.getOwnerEntity();
    			if (owner != null) {
    				this.renderLivingLabel(dog, owner.getDisplayName().getUnformattedText(), x, y, z, 5, 0.5F);
    			}
    			else {
    				this.renderLivingLabel(dog, dog.getOwnerName(), x, y, z, 5, 0.5F);
    			}
    		}
    	}
    }
    
    protected void renderLivingLabel(Entity p_147906_1_, String p_147906_2_, double p_147906_3_, double p_147906_5_, double p_147906_7_, int p_147906_9_, float scale) {
    	double d3 = p_147906_1_.getDistanceSqToEntity(this.renderManager.livingPlayer);
    
    	if (d3 <= p_147906_9_ * p_147906_9_) {
    		FontRenderer fontrenderer = this.getFontRendererFromRenderManager();
    		float f1 = 0.016666668F * scale;
    		GlStateManager.pushMatrix();
    		GlStateManager.translate((float) p_147906_3_ + 0.0F, (float) p_147906_5_ + p_147906_1_.height + 0.5F, (float) p_147906_7_);
    		GL11.glNormal3f(0.0F, 1.0F, 0.0F);
    		GlStateManager.rotate(-this.renderManager.playerViewY, 0.0F, 1.0F, 0.0F);
    		GlStateManager.rotate(this.renderManager.playerViewX, 1.0F, 0.0F, 0.0F);
    		GlStateManager.scale(-f1, -f1, f1);
    		GlStateManager.disableLighting();
    		GlStateManager.depthMask(false);
    		GlStateManager.disableDepth();
    		GlStateManager.enableBlend();
    		GlStateManager.tryBlendFuncSeparate(770, 771, 1, 0);
    		Tessellator tessellator = Tessellator.getInstance();
    		WorldRenderer worldrenderer = tessellator.getWorldRenderer();
    		byte b0 = 0;
    
    		if (p_147906_2_.equals("deadmau5")) {
    			b0 = -10;
    		}
    
    		GlStateManager.disableTexture2D();
    		worldrenderer.startDrawingQuads();
    		int j = fontrenderer.getStringWidth(p_147906_2_) / 2;
    		worldrenderer.setColorRGBA_F(0.0F, 0.0F, 0.0F, 0.25F);
    		worldrenderer.addVertex(-j - 1, -1 + b0, 0.0D);
    		worldrenderer.addVertex(-j - 1, 8 + b0, 0.0D);
    		worldrenderer.addVertex(j + 1, 8 + b0, 0.0D);
    		worldrenderer.addVertex(j + 1, -1 + b0, 0.0D);
    		tessellator.draw();
    		GlStateManager.enableTexture2D();
    		fontrenderer.drawString(p_147906_2_, -fontrenderer.getStringWidth(p_147906_2_) / 2, b0, 553648127);
    		GlStateManager.enableDepth();
    		GlStateManager.depthMask(true);
    		fontrenderer.drawString(p_147906_2_, -fontrenderer.getStringWidth(p_147906_2_) / 2, b0, -1);
    		GlStateManager.enableLighting();
    		GlStateManager.disableBlend();
    		GlStateManager.color(1.0F, 1.0F, 1.0F, 1.0F);
    		GlStateManager.popMatrix();
    	}
    }
    
    }

  6. Hm.. I try to install LLibrary for eclipse and when I run Minecraft, it gives this in the console

     

    [21:22:07] [main/INFO] [GradleStart]: Extra: []
    [21:22:08] [main/INFO] [GradleStart]: Running with arguments: [--userProperties, {}, --assetsDir, C:/Users/NovaPC/.gradle/caches/minecraft/assets, --assetIndex, 1.8, --accessToken, {REDACTED}, --version, 1.8, --tweakClass, net.minecraftforge.fml.common.launcher.FMLTweaker, --tweakClass, net.minecraftforge.gradle.tweakers.CoremodTweaker]
    [21:22:08] [main/INFO] [LaunchWrapper]: Loading tweak class name net.minecraftforge.fml.common.launcher.FMLTweaker
    [21:22:08] [main/INFO] [LaunchWrapper]: Using primary tweak class name net.minecraftforge.fml.common.launcher.FMLTweaker
    [21:22:08] [main/INFO] [LaunchWrapper]: Loading tweak class name net.minecraftforge.gradle.tweakers.CoremodTweaker
    [21:22:08] [main/INFO] [LaunchWrapper]: Calling tweak class net.minecraftforge.fml.common.launcher.FMLTweaker
    [21:22:08] [main/INFO] [FML]: Forge Mod Loader version 8.99.174.1483 for Minecraft 1.8 loading
    [21:22:08] [main/INFO] [FML]: Java is Java HotSpot(TM) 64-Bit Server VM, version 1.8.0_45, running on Windows 8.1:amd64:6.3, installed at C:\Program Files\Java\jre1.8.0_45
    [21:22:08] [main/INFO] [FML]: Managed to load a deobfuscated Minecraft name- we are in a deobfuscated environment. Skipping runtime deobfuscation
    [21:22:09] [main/WARN] [FML]: The coremod codechicken.core.launch.CodeChickenCorePlugin does not have a MCVersion annotation, it may cause issues with this version of Minecraft
    [21:22:10] [main/WARN] [FML]: The coremod codechicken.lib.asm.CCLCorePlugin does not have a MCVersion annotation, it may cause issues with this version of Minecraft
    [21:22:10] [main/WARN] [FML]: The coremod codechicken.lib.asm.CCLCorePlugin does not have a MCVersion annotation, it may cause issues with this version of Minecraft
    [21:22:10] [main/WARN] [FML]: The coremod codechicken.nei.asm.NEICorePlugin does not have a MCVersion annotation, it may cause issues with this version of Minecraft
    [21:22:10] [main/INFO] [LaunchWrapper]: Calling tweak class net.minecraftforge.gradle.tweakers.CoremodTweaker
    [21:22:10] [main/INFO] [GradleStart]: Injecting location in coremod net.minecraftforge.fml.relauncher.FMLCorePlugin
    [21:22:10] [main/INFO] [GradleStart]: Injecting location in coremod net.minecraftforge.classloading.FMLForgePlugin
    [21:22:10] [main/INFO] [GradleStart]: Injecting location in coremod codechicken.core.asm.MCPDeobfuscationTransformer.LoadPlugin
    [21:22:10] [main/INFO] [GradleStart]: Injecting location in coremod codechicken.lib.asm.CCLCorePlugin
    [21:22:10] [main/INFO] [GradleStart]: Injecting location in coremod codechicken.core.launch.CodeChickenCorePlugin
    [21:22:10] [main/INFO] [GradleStart]: Injecting location in coremod codechicken.lib.asm.CCLCorePlugin
    [21:22:10] [main/INFO] [GradleStart]: Injecting location in coremod codechicken.nei.asm.NEICorePlugin
    [21:22:10] [main/INFO] [LaunchWrapper]: Loading tweak class name net.minecraftforge.fml.common.launcher.FMLInjectionAndSortingTweaker
    [21:22:10] [main/INFO] [LaunchWrapper]: Loading tweak class name net.minecraftforge.fml.common.launcher.FMLDeobfTweaker
    [21:22:10] [main/INFO] [LaunchWrapper]: Loading tweak class name net.minecraftforge.gradle.tweakers.AccessTransformerTweaker
    [21:22:10] [main/INFO] [LaunchWrapper]: Calling tweak class net.minecraftforge.fml.common.launcher.FMLInjectionAndSortingTweaker
    [21:22:10] [main/INFO] [LaunchWrapper]: Calling tweak class net.minecraftforge.fml.common.launcher.FMLInjectionAndSortingTweaker
    [21:22:10] [main/INFO] [LaunchWrapper]: Calling tweak class net.minecraftforge.fml.relauncher.CoreModManager$FMLPluginWrapper
    [21:22:11] [main/ERROR] [FML]: The binary patch set is missing. Either you are in a development environment, or things are not going to work!
    [21:22:21] [main/ERROR] [FML]: FML appears to be missing any signature data. This is not a good thing
    [21:22:21] [main/INFO] [LaunchWrapper]: Calling tweak class net.minecraftforge.fml.relauncher.CoreModManager$FMLPluginWrapper
    [21:22:21] [main/INFO] [LaunchWrapper]: Calling tweak class net.minecraftforge.fml.relauncher.CoreModManager$FMLPluginWrapper
    [21:22:22] [main/INFO] [LaunchWrapper]: Calling tweak class net.minecraftforge.fml.relauncher.CoreModManager$FMLPluginWrapper
    [21:22:22] [main/INFO] [LaunchWrapper]: Calling tweak class net.minecraftforge.fml.relauncher.CoreModManager$FMLPluginWrapper
    [21:22:23] [main/INFO] [LaunchWrapper]: Calling tweak class net.minecraftforge.fml.relauncher.CoreModManager$FMLPluginWrapper
    [21:22:23] [main/INFO] [LaunchWrapper]: Calling tweak class net.minecraftforge.fml.relauncher.CoreModManager$FMLPluginWrapper
    [21:22:23] [main/INFO] [LaunchWrapper]: Calling tweak class net.minecraftforge.fml.common.launcher.FMLDeobfTweaker
    [21:22:25] [main/INFO] [LaunchWrapper]: Calling tweak class net.minecraftforge.gradle.tweakers.AccessTransformerTweaker
    [21:22:26] [main/INFO] [GradleStart]: Remapping AccessTransformer rules...
    [21:22:26] [main/INFO] [LaunchWrapper]: Loading tweak class name net.minecraftforge.fml.common.launcher.TerminalTweaker
    [21:22:26] [main/INFO] [LaunchWrapper]: Calling tweak class net.minecraftforge.fml.common.launcher.TerminalTweaker
    [21:22:26] [main/INFO] [LaunchWrapper]: Launching wrapped minecraft {net.minecraft.client.main.Main}
    [21:22:35] [Client thread/INFO]: Setting user: Player695
    [21:22:47] [Client thread/INFO]: LWJGL Version: 2.9.1
    [21:22:49] [Client thread/INFO] [sTDOUT]: [net.minecraftforge.fml.client.SplashProgress:start:235]: ---- Minecraft Crash Report ----
    
    WARNING: coremods are present:
      CCLCorePlugin (CodeChickenLib-1.8-1.1.2.133-dev.jar)
      CCCDeobfPlugin (unknown)
      CodeChickenCorePlugin (CodeChickenCore-1.8-1.0.5.36-dev.jar)
      NEICorePlugin (NotEnoughItems-1.8-1.0.5.104-dev.jar)
    Contact their authors BEFORE contacting forge
    
    // Everything's going to plan. No, really, that was supposed to happen.
    
    Time: 6/29/15 9:22 PM
    Description: Loading screen debug info
    
    This is just a prompt for computer specs to be printed. THIS IS NOT A ERROR
    
    
    A detailed walkthrough of the error, its code path and all known details is as follows:
    ---------------------------------------------------------------------------------------
    
    -- System Details --
    Details:
    Minecraft Version: 1.8
    Operating System: Windows 8.1 (amd64) version 6.3
    Java Version: 1.8.0_45, Oracle Corporation
    Java VM Version: Java HotSpot(TM) 64-Bit Server VM (mixed mode), Oracle Corporation
    Memory: 728272160 bytes (694 MB) / 1038876672 bytes (990 MB) up to 1038876672 bytes (990 MB)
    JVM Flags: 3 total; -Xincgc -Xmx1024M -Xms1024M
    IntCache: cache: 0, tcache: 0, allocated: 0, tallocated: 0
    FML: 
    Loaded coremods (and transformers): 
    CCLCorePlugin (CodeChickenLib-1.8-1.1.2.133-dev.jar)
      codechicken.lib.asm.ClassHeirachyManager
      codechicken.lib.asm.RenderHookTransformer
    CCCDeobfPlugin (unknown)
      
    CodeChickenCorePlugin (CodeChickenCore-1.8-1.0.5.36-dev.jar)
      codechicken.core.asm.InterfaceDependancyTransformer
      codechicken.core.asm.TweakTransformer
      codechicken.core.asm.DelegatedTransformer
      codechicken.core.asm.DefaultImplementationTransformer
    NEICorePlugin (NotEnoughItems-1.8-1.0.5.104-dev.jar)
      codechicken.nei.asm.NEITransformer
    GL info: ' Vendor: 'ATI Technologies Inc.' Version: '4.4.13283 Compatibility Profile Context 14.501.1003.0' Renderer: 'AMD Radeon(TM) R5 Graphics'
    [21:22:49] [Client thread/INFO] [MinecraftForge]: Attempting early MinecraftForge initialization
    [21:22:49] [Client thread/INFO] [FML]: MinecraftForge v11.14.3.1483 Initialized
    [21:22:49] [Client thread/INFO] [FML]: Replaced 204 ore recipies
    [21:22:50] [Client thread/INFO] [MinecraftForge]: Completed early MinecraftForge initialization
    [21:22:51] [Client thread/INFO] [FML]: Found 0 mods from the command line. Injecting into mod discoverer
    [21:22:51] [Client thread/INFO] [FML]: Searching C:\Users\NovaPC\Desktop\ModStuff\Code1.8\eclipse\mods for mods
    [21:22:51] [Client thread/INFO] [FML]: Also searching C:\Users\NovaPC\Desktop\ModStuff\Code1.8\eclipse\mods\1.8 for mods
    [21:23:02] [Client thread/INFO] [FML]: Forge Mod Loader has identified 7 mods to load
    [21:23:04] [Client thread/INFO] [FML]: Attempting connection with missing mods [mcp, FML, Forge, CodeChickenCore, NotEnoughItems, zero_quest, llibrary] at CLIENT
    [21:23:04] [Client thread/INFO] [FML]: Attempting connection with missing mods [mcp, FML, Forge, CodeChickenCore, NotEnoughItems, zero_quest, llibrary] at SERVER
    [21:23:08] [Client thread/INFO]: Reloading ResourceManager: Default, FMLFileResourcePack:Forge Mod Loader, FMLFileResourcePack:Minecraft Forge, FMLFileResourcePack:Not Enough Items, FMLFileResourcePack:Zero Quest, FMLFileResourcePack:LLibrary
    [21:23:09] [Client thread/INFO] [FML]: Processing ObjectHolder annotations
    [21:23:09] [Client thread/INFO] [FML]: Found 384 ObjectHolder annotations
    [21:23:09] [Client thread/INFO] [FML]: Identifying ItemStackHolder annotations
    [21:23:09] [Client thread/INFO] [FML]: Found 0 ItemStackHolder annotations
    [21:23:09] [Client thread/INFO] [FML]: Configured a dormant chunk cache size of 0
    [21:23:11] [Client thread/INFO] [Zero Quest]: -----PRE-CONTENT LOAD INITATING-----
    [21:23:11] [Client thread/INFO] [Zero Quest]: Loading Main Stuff...
    [21:23:11] [Client thread/INFO] [Zero Quest]: Load Stuff Loaded Successfully!
    [21:23:11] [Client thread/INFO] [Zero Quest]: Loading Block, Liquids, Recipes, Events and Items...
    [21:23:19] [Client thread/INFO] [Zero Quest]: Blocks, Recipes, Entites, Events and Items Loaded Successfully!
    [21:23:19] [Client thread/INFO] [Zero Quest]: -----PRE-CONTENT LOAD FINISHED-----
    [21:23:20] [Client thread/INFO] [FML]: Applying holder lookups
    [21:23:20] [Client thread/INFO] [FML]: Holder lookups applied
    [21:23:20] [Client thread/INFO] [FML]: Injecting itemstacks
    [21:23:20] [Client thread/INFO] [FML]: Itemstack injection complete
    [21:23:21] [sound Library Loader/INFO]: Starting up SoundSystem...
    [21:23:21] [Thread-10/INFO]: Initializing LWJGL OpenAL
    [21:23:21] [Thread-10/INFO]: (The LWJGL binding of OpenAL.  For more information, see http://www.lwjgl.org)
    [21:23:21] [Thread-10/INFO]: OpenAL initialized.
    [21:23:21] [sound Library Loader/INFO]: Sound engine started
    [21:23:39] [Client thread/INFO] [FML]: Max texture size: 16384
    [21:23:39] [Client thread/INFO]: Created: 16x16 textures-atlas
    [21:23:43] [Client thread/INFO] [Zero Quest]: -----CONTENT LOAD INITATING-----
    [21:23:43] [Client thread/INFO] [Zero Quest]: Loading Network Packets...
    [21:23:43] [Client thread/INFO] [Zero Quest]: Network Packets Loaded Successfully!
    [21:23:43] [Client thread/INFO] [Zero Quest]: Loading Renderers, Achievements, Biomes and Ore Dictionary...
    [21:23:44] [Client thread/INFO] [Zero Quest]: Renderers, Achievements, Biomes and Ore Dictionary Loaded Successfully!
    [21:23:44] [Client thread/INFO] [Zero Quest]: Loading Crucial Stuff and Dimensions...
    [21:23:45] [Client thread/INFO] [Zero Quest]: Crucial Stuff and Dimensions Loaded Successfully!
    [21:23:45] [Client thread/WARN] [Zero Quest]: Dark Elemental Load is ENABLED!
    [21:23:45] [Client thread/INFO] [Zero Quest]: Initating Dark Elemental Load!
    [21:23:45] [Client thread/INFO] [Zero Quest]: Dark Elements Loaded Successfully!
    [21:23:45] [Client thread/INFO] [Zero Quest]: -----CONTENT LOAD FINSHED-----
    [21:23:45] [Client thread/INFO] [FML]: Injecting itemstacks
    [21:23:45] [Client thread/INFO] [FML]: Itemstack injection complete
    [21:23:45] [Client thread/INFO] [Zero Quest]: -----POST-CONTENT LOAD INITATING-----
    [21:23:45] [Client thread/INFO] [Zero Quest]: Loading Talents and Item Lists...
    [21:23:45] [Client thread/INFO] [Zero Quest]: The item item.dogTreat meta 32767 was register to an item list
    [21:23:45] [Client thread/INFO] [Zero Quest]: The item item.toy meta 32767 was register to an item list
    [21:23:45] [Client thread/INFO] [Zero Quest]: The item item.nileBone meta 32767 was register to an item list
    [21:23:45] [Client thread/WARN] [Zero Quest]: The item item.toy meta 32767 is already registered in this item list
    [21:23:45] [Client thread/INFO] [Zero Quest]: The item item.darkBone meta 32767 was register to an item list
    [21:23:45] [Client thread/INFO] [Zero Quest]: Registered the talent with the id blastresist
    [21:23:45] [Client thread/INFO] [Zero Quest]: Registered the talent with the id bodymuncher
    [21:23:45] [Client thread/INFO] [Zero Quest]: Registered the talent with the id creeperspotter
    [21:23:45] [Client thread/INFO] [Zero Quest]: Registered the talent with the id criticalclaw
    [21:23:45] [Client thread/INFO] [Zero Quest]: Registered the talent with the id dasher
    [21:23:45] [Client thread/INFO] [Zero Quest]: Registered the talent with the id deatheningroar
    [21:23:45] [Client thread/INFO] [Zero Quest]: Registered the talent with the id fishing
    [21:23:45] [Client thread/INFO] [Zero Quest]: Registered the talent with the id flamingelemental
    [21:23:45] [Client thread/INFO] [Zero Quest]: Registered the talent with the id frigidfrost
    [21:23:45] [Client thread/INFO] [Zero Quest]: Registered the talent with the id hardenedskin
    [21:23:45] [Client thread/INFO] [Zero Quest]: Registered the talent with the id hunter
    [21:23:45] [Client thread/INFO] [Zero Quest]: Registered the talent with the id lifegiver
    [21:23:45] [Client thread/INFO] [Zero Quest]: Registered the talent with the id lightfall
    [21:23:45] [Client thread/INFO] [Zero Quest]: Registered the talent with the id mount
    [21:23:45] [Client thread/INFO] [Zero Quest]: Registered the talent with the id pestslayer
    [21:23:45] [Client thread/INFO] [Zero Quest]: Registered the talent with the id rapidregen
    [21:23:45] [Client thread/INFO] [Zero Quest]: Registered the talent with the id roundup
    [21:23:45] [Client thread/INFO] [Zero Quest]: Registered the talent with the id sharpen
    [21:23:45] [Client thread/INFO] [Zero Quest]: Talents and Item Lists Loaded Successfully!
    [21:23:45] [Client thread/INFO] [Zero Quest]: -----POST-CONTENT LOAD FINSHED-----
    [21:23:45] [Client thread/INFO] [FML]: Forge Mod Loader has successfully loaded 7 mods
    [21:23:45] [Client thread/INFO]: Reloading ResourceManager: Default, FMLFileResourcePack:Forge Mod Loader, FMLFileResourcePack:Minecraft Forge, FMLFileResourcePack:Not Enough Items, FMLFileResourcePack:Zero Quest, FMLFileResourcePack:LLibrary
    [21:23:46] [Client thread/INFO]: SoundSystem shutting down...
    [21:23:46] [Client thread/WARN]: Author: Paul Lamb, www.paulscode.com
    [21:23:46] [sound Library Loader/INFO]: Starting up SoundSystem...
    [21:23:46] [Thread-13/INFO]: Initializing LWJGL OpenAL
    [21:23:46] [Thread-13/INFO]: (The LWJGL binding of OpenAL.  For more information, see http://www.lwjgl.org)
    [21:23:46] [Thread-13/INFO]: OpenAL initialized.
    [21:23:46] [sound Library Loader/INFO]: Sound engine started
    [21:24:01] [Client thread/INFO] [FML]: Max texture size: 16384
    [21:24:03] [Client thread/INFO]: Created: 512x512 textures-atlas
    [21:24:29] [Client thread/INFO]: Deleting level New World
    [21:24:29] [Client thread/INFO]: Attempt 1...
    [21:24:37] [server thread/INFO]: Starting integrated minecraft server version 1.8
    [21:24:37] [server thread/INFO]: Generating keypair
    [21:24:38] [server thread/INFO]: Converting map!
    [21:24:38] [server thread/INFO]: Scanning folders...
    [21:24:38] [server thread/INFO]: Total conversion count is 0
    [21:24:38] [server thread/INFO] [FML]: Injecting existing block and item data into this server instance
    [21:24:38] [server thread/INFO] [FML]: Applying holder lookups
    [21:24:38] [server thread/INFO] [FML]: Holder lookups applied
    [21:24:38] [server thread/INFO] [FML]: Loading dimension 0 (New World) (net.minecraft.server.integrated.IntegratedServer@2212c32b)
    [21:24:40] [server thread/INFO] [FML]: Loading dimension 3 (New World) (net.minecraft.server.integrated.IntegratedServer@2212c32b)
    [21:24:40] [server thread/INFO] [FML]: Loading dimension 2 (New World) (net.minecraft.server.integrated.IntegratedServer@2212c32b)
    [21:24:40] [server thread/INFO] [FML]: Loading dimension 1 (New World) (net.minecraft.server.integrated.IntegratedServer@2212c32b)
    [21:24:41] [server thread/INFO] [FML]: Loading dimension -1 (New World) (net.minecraft.server.integrated.IntegratedServer@2212c32b)
    [21:24:41] [server thread/INFO]: Preparing start region for level 0
    [21:24:42] [server thread/INFO]: Preparing spawn area: 3%
    [21:24:43] [server thread/INFO]: Preparing spawn area: 4%
    [21:24:44] [server thread/INFO]: Preparing spawn area: 5%
    [21:24:45] [server thread/INFO]: Preparing spawn area: 6%
    [21:24:46] [server thread/INFO]: Preparing spawn area: 6%
    [21:24:47] [server thread/INFO]: Preparing spawn area: 8%
    [21:24:48] [server thread/INFO]: Preparing spawn area: 9%
    [21:24:49] [server thread/INFO]: Preparing spawn area: 11%
    [21:24:50] [server thread/INFO]: Preparing spawn area: 13%
    [21:24:51] [server thread/INFO]: Preparing spawn area: 15%
    [21:24:52] [server thread/INFO]: Preparing spawn area: 17%
    [21:24:53] [server thread/INFO]: Preparing spawn area: 20%
    [21:24:54] [server thread/INFO]: Preparing spawn area: 24%
    [21:24:55] [server thread/INFO]: Preparing spawn area: 28%
    [21:24:56] [server thread/INFO]: Preparing spawn area: 32%
    [21:24:57] [server thread/INFO]: Preparing spawn area: 37%
    [21:24:58] [server thread/INFO]: Preparing spawn area: 42%
    [21:24:59] [server thread/INFO]: Preparing spawn area: 48%
    [21:25:00] [server thread/INFO]: Preparing spawn area: 53%
    [21:25:01] [server thread/INFO]: Preparing spawn area: 58%
    [21:25:02] [server thread/INFO]: Preparing spawn area: 64%
    [21:25:04] [server thread/INFO]: Preparing spawn area: 69%
    [21:25:05] [server thread/INFO]: Preparing spawn area: 76%
    [21:25:06] [server thread/INFO]: Preparing spawn area: 82%
    [21:25:07] [server thread/INFO]: Preparing spawn area: 86%
    [21:25:08] [server thread/INFO]: Preparing spawn area: 93%
    [21:25:09] [server thread/INFO]: Preparing spawn area: 99%
    [21:25:09] [server thread/INFO] [Zero Quest]: -----SERVER CONTENT LOAD INITATING-----
    [21:25:09] [server thread/INFO] [Zero Quest]: Loading Commands...
    [21:25:09] [server thread/INFO] [Zero Quest]: Commands Loaded Successfully!
    [21:25:09] [server thread/INFO] [Zero Quest]: -----SERVER CONTENT LOAD FINSHED-----
    [21:25:09] [server thread/ERROR] [FML]: Fatal errors were detected during the transition from SERVER_ABOUT_TO_START to SERVER_STARTING. Loading cannot continue
    [21:25:09] [server thread/ERROR] [FML]: 
    States: 'U' = Unloaded 'L' = Loaded 'C' = Constructed 'H' = Pre-initialized 'I' = Initialized 'J' = Post-initialized 'A' = Available 'D' = Disabled 'E' = Errored
    UCHIJAAA	mcp{9.05} [Minecraft Coder Pack] (minecraft.jar) 
    UCHIJAAA	FML{8.0.99.99} [Forge Mod Loader] (forgeSrc-1.8-11.14.3.1483.jar) 
    UCHIJAAA	Forge{11.14.3.1483} [Minecraft Forge] (forgeSrc-1.8-11.14.3.1483.jar) 
    UCHIJAAA	CodeChickenCore{1.0.5.36} [CodeChicken Core] (minecraft.jar) 
    UCHIJAAA	NotEnoughItems{1.0.5.104} [Not Enough Items] (NotEnoughItems-1.8-1.0.5.104-dev.jar) 
    UCHIJAAA	zero_quest{v1.8.0} [Zero Quest] (bin) 
    UCHIJAAE	llibrary{0.2.0-1.8} [LLibrary] (LLibrary-0.2.0-1.8-dev.jar) 
    [21:25:09] [server thread/ERROR] [FML]: The following problems were captured during this phase
    [21:25:09] [server thread/ERROR] [FML]: Caught exception from llibrary
    java.lang.AbstractMethodError
    at net.minecraft.command.CommandHandler.registerCommand(CommandHandler.java:141) ~[forgeSrc-1.8-11.14.3.1483.jar:?]
    at net.minecraftforge.fml.common.event.FMLServerStartingEvent.registerServerCommand(FMLServerStartingEvent.java:44) ~[forgeSrc-1.8-11.14.3.1483.jar:?]
    at net.ilexiconn.llibrary.LLibrary.serverStart(LLibrary.java:44) ~[LLibrary-0.2.0-1.8-dev.jar:?]
    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) ~[?:1.8.0_45]
    at sun.reflect.NativeMethodAccessorImpl.invoke(Unknown Source) ~[?:1.8.0_45]
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(Unknown Source) ~[?:1.8.0_45]
    at java.lang.reflect.Method.invoke(Unknown Source) ~[?:1.8.0_45]
    at net.minecraftforge.fml.common.FMLModContainer.handleModStateEvent(FMLModContainer.java:537) ~[forgeSrc-1.8-11.14.3.1483.jar:?]
    at sun.reflect.GeneratedMethodAccessor6.invoke(Unknown Source) ~[?:?]
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(Unknown Source) ~[?:1.8.0_45]
    at java.lang.reflect.Method.invoke(Unknown Source) ~[?:1.8.0_45]
    at com.google.common.eventbus.EventSubscriber.handleEvent(EventSubscriber.java:74) ~[guava-17.0.jar:?]
    at com.google.common.eventbus.SynchronizedEventSubscriber.handleEvent(SynchronizedEventSubscriber.java:47) ~[guava-17.0.jar:?]
    at com.google.common.eventbus.EventBus.dispatch(EventBus.java:322) ~[guava-17.0.jar:?]
    at com.google.common.eventbus.EventBus.dispatchQueuedEvents(EventBus.java:304) ~[guava-17.0.jar:?]
    at com.google.common.eventbus.EventBus.post(EventBus.java:275) ~[guava-17.0.jar:?]
    at net.minecraftforge.fml.common.LoadController.sendEventToModContainer(LoadController.java:212) ~[forgeSrc-1.8-11.14.3.1483.jar:?]
    at net.minecraftforge.fml.common.LoadController.propogateStateMessage(LoadController.java:190) ~[forgeSrc-1.8-11.14.3.1483.jar:?]
    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) ~[?:1.8.0_45]
    at sun.reflect.NativeMethodAccessorImpl.invoke(Unknown Source) ~[?:1.8.0_45]
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(Unknown Source) ~[?:1.8.0_45]
    at java.lang.reflect.Method.invoke(Unknown Source) ~[?:1.8.0_45]
    at com.google.common.eventbus.EventSubscriber.handleEvent(EventSubscriber.java:74) ~[guava-17.0.jar:?]
    at com.google.common.eventbus.SynchronizedEventSubscriber.handleEvent(SynchronizedEventSubscriber.java:47) ~[guava-17.0.jar:?]
    at com.google.common.eventbus.EventBus.dispatch(EventBus.java:322) ~[guava-17.0.jar:?]
    at com.google.common.eventbus.EventBus.dispatchQueuedEvents(EventBus.java:304) ~[guava-17.0.jar:?]
    at com.google.common.eventbus.EventBus.post(EventBus.java:275) ~[guava-17.0.jar:?]
    at net.minecraftforge.fml.common.LoadController.distributeStateMessage(LoadController.java:119) [LoadController.class:?]
    at net.minecraftforge.fml.common.Loader.serverStarting(Loader.java:781) [Loader.class:?]
    at net.minecraftforge.fml.common.FMLCommonHandler.handleServerStarting(FMLCommonHandler.java:319) [FMLCommonHandler.class:?]
    at net.minecraft.server.integrated.IntegratedServer.startServer(IntegratedServer.java:132) [integratedServer.class:?]
    at net.minecraft.server.MinecraftServer.run(MinecraftServer.java:500) [MinecraftServer.class:?]
    at java.lang.Thread.run(Unknown Source) [?:1.8.0_45]
    [21:25:09] [server thread/ERROR] [FML]: A fatal exception occurred during the server starting event
    net.minecraftforge.fml.common.LoaderException: java.lang.AbstractMethodError
    
    at net.minecraftforge.fml.common.LoadController.transition(LoadController.java:163) ~[LoadController.class:?]
    at net.minecraftforge.fml.common.Loader.serverStarting(Loader.java:782) [Loader.class:?]
    at net.minecraftforge.fml.common.FMLCommonHandler.handleServerStarting(FMLCommonHandler.java:319) [FMLCommonHandler.class:?]
    at net.minecraft.server.integrated.IntegratedServer.startServer(IntegratedServer.java:132) [integratedServer.class:?]
    at net.minecraft.server.MinecraftServer.run(MinecraftServer.java:500) [MinecraftServer.class:?]
    at java.lang.Thread.run(Unknown Source) [?:1.8.0_45]
    Caused by: java.lang.AbstractMethodError
    at net.minecraft.command.CommandHandler.registerCommand(CommandHandler.java:141) ~[forgeSrc-1.8-11.14.3.1483.jar:?]
    at net.minecraftforge.fml.common.event.FMLServerStartingEvent.registerServerCommand(FMLServerStartingEvent.java:44) ~[forgeSrc-1.8-11.14.3.1483.jar:?]
    at net.ilexiconn.llibrary.LLibrary.serverStart(LLibrary.java:44) ~[LLibrary-0.2.0-1.8-dev.jar:?]
    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) ~[?:1.8.0_45]
    at sun.reflect.NativeMethodAccessorImpl.invoke(Unknown Source) ~[?:1.8.0_45]
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(Unknown Source) ~[?:1.8.0_45]
    at java.lang.reflect.Method.invoke(Unknown Source) ~[?:1.8.0_45]
    at net.minecraftforge.fml.common.FMLModContainer.handleModStateEvent(FMLModContainer.java:537) ~[forgeSrc-1.8-11.14.3.1483.jar:?]
    at sun.reflect.GeneratedMethodAccessor6.invoke(Unknown Source) ~[?:?]
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(Unknown Source) ~[?:1.8.0_45]
    at java.lang.reflect.Method.invoke(Unknown Source) ~[?:1.8.0_45]
    at com.google.common.eventbus.EventSubscriber.handleEvent(EventSubscriber.java:74) ~[guava-17.0.jar:?]
    at com.google.common.eventbus.SynchronizedEventSubscriber.handleEvent(SynchronizedEventSubscriber.java:47) ~[guava-17.0.jar:?]
    at com.google.common.eventbus.EventBus.dispatch(EventBus.java:322) ~[guava-17.0.jar:?]
    at com.google.common.eventbus.EventBus.dispatchQueuedEvents(EventBus.java:304) ~[guava-17.0.jar:?]
    at com.google.common.eventbus.EventBus.post(EventBus.java:275) ~[guava-17.0.jar:?]
    at net.minecraftforge.fml.common.LoadController.sendEventToModContainer(LoadController.java:212) ~[LoadController.class:?]
    at net.minecraftforge.fml.common.LoadController.propogateStateMessage(LoadController.java:190) ~[LoadController.class:?]
    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) ~[?:1.8.0_45]
    at sun.reflect.NativeMethodAccessorImpl.invoke(Unknown Source) ~[?:1.8.0_45]
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(Unknown Source) ~[?:1.8.0_45]
    at java.lang.reflect.Method.invoke(Unknown Source) ~[?:1.8.0_45]
    at com.google.common.eventbus.EventSubscriber.handleEvent(EventSubscriber.java:74) ~[guava-17.0.jar:?]
    at com.google.common.eventbus.SynchronizedEventSubscriber.handleEvent(SynchronizedEventSubscriber.java:47) ~[guava-17.0.jar:?]
    at com.google.common.eventbus.EventBus.dispatch(EventBus.java:322) ~[guava-17.0.jar:?]
    at com.google.common.eventbus.EventBus.dispatchQueuedEvents(EventBus.java:304) ~[guava-17.0.jar:?]
    at com.google.common.eventbus.EventBus.post(EventBus.java:275) ~[guava-17.0.jar:?]
    at net.minecraftforge.fml.common.LoadController.distributeStateMessage(LoadController.java:119) ~[LoadController.class:?]
    at net.minecraftforge.fml.common.Loader.serverStarting(Loader.java:781) ~[Loader.class:?]
    ... 4 more
    [21:25:09] [server thread/INFO] [FML]: Applying holder lookups
    [21:25:09] [server thread/INFO] [FML]: Holder lookups applied
    [21:25:09] [server thread/INFO] [FML]: The state engine was in incorrect state ERRORED and forced into state SERVER_STOPPED. Errors may have been discarded.
    [21:25:09] [server thread/INFO] [FML]: The state engine was in incorrect state ERRORED and forced into state AVAILABLE. Errors may have been discarded.
    

  7. The bounding box isn't changing but everything else I have does work

     

    package common.zeroquest.entity.zertum;
    
    import java.util.HashMap;
    import java.util.Map;
    
    import net.minecraft.block.Block;
    import net.minecraft.block.material.Material;
    import net.minecraft.entity.Entity;
    import net.minecraft.entity.EntityLivingBase;
    import net.minecraft.entity.SharedMonsterAttributes;
    import net.minecraft.entity.ai.EntityAIAttackOnCollide;
    import net.minecraft.entity.ai.EntityAIHurtByTarget;
    import net.minecraft.entity.ai.EntityAILeapAtTarget;
    import net.minecraft.entity.ai.EntityAILookIdle;
    import net.minecraft.entity.ai.EntityAIMate;
    import net.minecraft.entity.ai.EntityAISwimming;
    import net.minecraft.entity.ai.EntityAIWander;
    import net.minecraft.entity.ai.EntityAIWatchClosest;
    import net.minecraft.entity.monster.EntityCreeper;
    import net.minecraft.entity.monster.EntityGhast;
    import net.minecraft.entity.monster.EntityZombie;
    import net.minecraft.entity.passive.EntityAnimal;
    import net.minecraft.entity.passive.EntityHorse;
    import net.minecraft.entity.player.EntityPlayer;
    import net.minecraft.entity.projectile.EntityArrow;
    import net.minecraft.init.Items;
    import net.minecraft.item.EnumDyeColor;
    import net.minecraft.item.Item;
    import net.minecraft.item.ItemBow;
    import net.minecraft.item.ItemFood;
    import net.minecraft.item.ItemStack;
    import net.minecraft.item.ItemSword;
    import net.minecraft.item.ItemTool;
    import net.minecraft.nbt.NBTTagCompound;
    import net.minecraft.pathfinding.PathNavigateGround;
    import net.minecraft.potion.PotionEffect;
    import net.minecraft.util.BlockPos;
    import net.minecraft.util.DamageSource;
    import net.minecraft.util.EnumChatFormatting;
    import net.minecraft.util.EnumParticleTypes;
    import net.minecraft.util.MathHelper;
    import net.minecraft.world.World;
    import net.minecraftforge.fml.relauncher.Side;
    import net.minecraftforge.fml.relauncher.SideOnly;
    
    import common.zeroquest.ModAchievements;
    import common.zeroquest.ModItems;
    import common.zeroquest.api.ZeroQuestAPI;
    import common.zeroquest.core.helper.ChatHelper;
    import common.zeroquest.entity.EntityCustomTameable;
    import common.zeroquest.entity.ai.EntityAIBeg;
    import common.zeroquest.entity.ai.EntityAIFetchToy;
    import common.zeroquest.entity.ai.EntityAIFollowOwner;
    import common.zeroquest.entity.ai.EntityAIModeAttackTarget;
    import common.zeroquest.entity.ai.EntityAIOwnerHurtByTarget;
    import common.zeroquest.entity.ai.EntityAIOwnerHurtTarget;
    import common.zeroquest.entity.ai.EntityAIRoundUp;
    import common.zeroquest.entity.zertum.util.LevelUtil;
    import common.zeroquest.entity.zertum.util.ModeUtil;
    import common.zeroquest.entity.zertum.util.ModeUtil.EnumMode;
    import common.zeroquest.entity.zertum.util.TalentHelper;
    import common.zeroquest.entity.zertum.util.TalentUtil;
    import common.zeroquest.inventory.InventoryPack;
    import common.zeroquest.lib.Constants;
    import common.zeroquest.lib.DataValues;
    import common.zeroquest.lib.Sound;
    
    public abstract class EntityZertumEntity extends EntityCustomTameable {
    
    protected EntityAILeapAtTarget aiLeap = new EntityAILeapAtTarget(this, 0.4F);
    public EntityAIWatchClosest aiStareAtPlayer = new EntityAIWatchClosest(this, EntityPlayer.class, 8.0F);
    public EntityAIWatchClosest aiGlareAtCreeper = new EntityAIWatchClosest(this, EntityCreeper.class, this.talents.getLevel("creeperspotter") * 6);
    public EntityAIFetchToy aiFetchBone;
    
    private float timeDogBegging;
    private float prevTimeDogBegging;
    public float headRotationCourse;
    public float headRotationCourseOld;
    public boolean isWet;
    public boolean isShaking;
    public float timeWolfIsShaking;
    public float prevTimeWolfIsShaking;
    private int hungerTick;
    private int prevHungerTick;
    private int healingTick;
    private int prevHealingTick;
    private int regenerationTick;
    private int prevRegenerationTick;
    public TalentUtil talents;
    public LevelUtil levels;
    public ModeUtil mode;
    public Map<String, Object> objects;
    private boolean hasToy;
    private float timeWolfIsHappy;
    private float prevTimeWolfIsHappy;
    private boolean isWolfHappy;
    public boolean hiyaMaster;
    private float mouthOpenness;
    private float prevMouthOpenness;
    private int openMouthCounter;
    
    public EntityZertumEntity(World worldIn) {
    	super(worldIn);
    	if (!this.hasEvolved() && !this.inFinalStage()) {
    		this.setSize(0.6F, 1.5F);
    	}
    	else if (this.hasEvolved() && this.inFinalStage()) {
    		this.setSize(16F, 16F);
    	}
    
    	this.objects = new HashMap<String, Object>();
    	((PathNavigateGround) this.getNavigator()).setAvoidsWater(true);
    	this.tasks.addTask(1, new EntityAISwimming(this));
    	this.tasks.addTask(2, this.aiSit);
    	this.tasks.addTask(3, this.aiLeap);
    	this.tasks.addTask(4, new EntityAIAttackOnCollide(this, 1.0D, true));
    	this.tasks.addTask(5, new EntityAIFollowOwner(this, 1.0D, 10.0F, 2.0F));
    	this.tasks.addTask(6, this.aiFetchBone = new EntityAIFetchToy(this, 1.0D, 0.5F, 20.0F));
    	this.tasks.addTask(7, new EntityAIMate(this, 1.0D));
    	this.tasks.addTask(8, new EntityAIWander(this, 1.0D));
    	this.tasks.addTask(9, new EntityAIBeg(this, 8.0F));
    	this.tasks.addTask(10, aiStareAtPlayer);
    	this.tasks.addTask(10, new EntityAILookIdle(this));
    	this.targetTasks.addTask(1, new EntityAIOwnerHurtByTarget(this));
    	this.targetTasks.addTask(2, new EntityAIOwnerHurtTarget(this));
    	this.targetTasks.addTask(3, new EntityAIModeAttackTarget(this));
    	this.targetTasks.addTask(4, new EntityAIHurtByTarget(this, true));
    	this.setTamed(false);
    	this.setEvolved(false);
    	this.inventory = new InventoryPack(this);
    	this.targetTasks.addTask(6, new EntityAIRoundUp(this, EntityAnimal.class, 0, false));
    	TalentHelper.onClassCreation(this);
    }
    
    @Override
    public void applyEntityAttributes() {
    	super.applyEntityAttributes();
    	this.getEntityAttribute(SharedMonsterAttributes.movementSpeed).setBaseValue(0.30000001192092896);
    	this.getEntityAttribute(SharedMonsterAttributes.maxHealth).setBaseValue(this.wildHealth());
    	this.getEntityAttribute(SharedMonsterAttributes.attackDamage).setBaseValue(this.wildDamage());
    	this.updateEntityAttributes();
    }
    
    public void updateEntityAttributes() {
    	if (this.isTamed()) {
    		if (!this.isChild() && !this.hasEvolved()) {
    			this.getEntityAttribute(SharedMonsterAttributes.maxHealth).setBaseValue(this.tamedHealth() + this.effectiveLevel());
    			this.getEntityAttribute(SharedMonsterAttributes.attackDamage).setBaseValue(this.tamedDamage());
    		}
    		else if (!this.isChild() && this.hasEvolved()) {
    			this.getEntityAttribute(SharedMonsterAttributes.maxHealth).setBaseValue(this.evoHealth() + this.effectiveLevel());
    		}
    		else {
    			this.getEntityAttribute(SharedMonsterAttributes.maxHealth).setBaseValue(this.babyHealth());
    			this.getEntityAttribute(SharedMonsterAttributes.attackDamage).setBaseValue(this.babyDamage());
    		}
    	}
    	else {
    		if (this.isChild()) {
    			this.getEntityAttribute(SharedMonsterAttributes.maxHealth).setBaseValue(this.babyHealth());
    			this.getEntityAttribute(SharedMonsterAttributes.attackDamage).setBaseValue(this.babyDamage());
    		}
    	}
    }
    
    @Override
    public void setTamed(boolean p_70903_1_) {
    	super.setTamed(p_70903_1_);
    	if (p_70903_1_) {
    		if (!this.isChild() && !this.hasEvolved()) {
    			this.getEntityAttribute(SharedMonsterAttributes.maxHealth).setBaseValue(this.tamedHealth() + this.effectiveLevel());
    			this.getEntityAttribute(SharedMonsterAttributes.attackDamage).setBaseValue(this.tamedDamage());
    		}
    		else if (!this.isChild() && this.hasEvolved()) {
    			this.getEntityAttribute(SharedMonsterAttributes.maxHealth).setBaseValue(this.evoHealth());
    		}
    		else {
    			this.getEntityAttribute(SharedMonsterAttributes.maxHealth).setBaseValue(this.babyHealth());
    			this.getEntityAttribute(SharedMonsterAttributes.attackDamage).setBaseValue(this.babyDamage());
    		}
    	}
    	else {
    		if (this.isChild()) {
    			this.getEntityAttribute(SharedMonsterAttributes.maxHealth).setBaseValue(this.babyHealth());
    			this.getEntityAttribute(SharedMonsterAttributes.attackDamage).setBaseValue(this.babyDamage());
    		}
    	}
    }
    
    public double tamedHealth() {
    	if (this instanceof EntityZertum || this instanceof EntityRedZertum) {
    		return 35;
    	}
    	else if (this instanceof EntityMetalZertum || this instanceof EntityIceZertum || this instanceof EntityForisZertum || this instanceof EntityDestroZertum || this instanceof EntityDarkZertum) {
    		return 40;
    	}
    	return 0;
    }
    
    public double tamedDamage() {
    	if (this instanceof EntityZertum || this instanceof EntityRedZertum || this instanceof EntityMetalZertum || this instanceof EntityIceZertum || this instanceof EntityForisZertum) {
    		return 8;
    	}
    	else if (this instanceof EntityDestroZertum) {
    		return 10;
    	}
    	else if (this instanceof EntityDarkZertum) {
    		return 12;
    	}
    	return 0;
    }
    
    public double evoHealth() {
    	if (this instanceof EntityZertum || this instanceof EntityRedZertum || this instanceof EntityIceZertum) {
    		return 45;
    	}
    	else if (this instanceof EntityMetalZertum || this instanceof EntityForisZertum || this instanceof EntityDestroZertum) {
    		return 50;
    	}
    	else if (this instanceof EntityDarkZertum) {
    		return 60;
    	}
    	return 0;
    }
    
    public double wildHealth() {
    	if (this instanceof EntityZertum || this instanceof EntityRedZertum || this instanceof EntityForisZertum) {
    		return 25;
    	}
    	else if (this instanceof EntityMetalZertum || this instanceof EntityDestroZertum || this instanceof EntityDarkZertum) {
    		return 30;
    	}
    	else if (this instanceof EntityIceZertum) {
    		return 35;
    	}
    	return 0;
    }
    
    public double wildDamage() {
    	if (this instanceof EntityZertum || this instanceof EntityRedZertum || this instanceof EntityMetalZertum || this instanceof EntityIceZertum || this instanceof EntityForisZertum) {
    		return 6;
    	}
    	else if (this instanceof EntityDestroZertum) {
    		return 8;
    	}
    	else if (this instanceof EntityDarkZertum) {
    		return 10;
    	}
    	return 0;
    }
    
    public double babyHealth() {
    	return 11;
    }
    
    public double babyDamage() {
    	if (this instanceof EntityZertum || this instanceof EntityRedZertum || this instanceof EntityMetalZertum) {
    		return 2;
    	}
    	else if (this instanceof EntityIceZertum || this instanceof EntityForisZertum || this instanceof EntityDarkZertum) {
    		return 4;
    	}
    	else if (this instanceof EntityDestroZertum) {
    		return 3;
    	}
    	return 0;
    }
    
    /**
     * Sets the active target the Task system uses for tracking
     */
    @Override
    public void setAttackTarget(EntityLivingBase p_70624_1_) {
    	super.setAttackTarget(p_70624_1_);
    	if (p_70624_1_ == null) {
    		this.setAngry(false);
    	}
    	else if (!this.isTamed()) {
    		this.setAngry(true);
    	}
    }
    
    @Override
    public String getCommandSenderName() {
    	String name = this.getPetName();
    	if (name != "" && this.isTamed()) {
    		return name;
    	}
    	else {
    		return super.getCommandSenderName();
    	}
    }
    
    @Override
    @SideOnly(Side.CLIENT)
    public boolean getAlwaysRenderNameTagForRender() {
    	return true;
    }
    
    //@formatter:off
    @Override
    protected void entityInit() {
    	super.entityInit();
    	this.talents = new TalentUtil(this);
    	this.levels = new LevelUtil(this);
    	this.mode = new ModeUtil(this);
    	this.dataWatcher.addObject(DataValues.ownerName, new String("")); //Owner Name
    	this.dataWatcher.addObject(DataValues.ownerID, new String("")); //Owner Id
    	this.dataWatcher.addObject(DataValues.collarCollar, new Byte((byte) EnumDyeColor.RED.getMetadata())); //Collar
    	this.dataWatcher.addObject(DataValues.dogName, new String("")); //Dog Name
    	this.dataWatcher.addObject(DataValues.talentData, new String("")); //Talent Data
    	this.dataWatcher.addObject(DataValues.hungerTicks, new Integer(Constants.hungerTicks)); //Dog Hunger
    	this.dataWatcher.addObject(DataValues.levelData, new String("0:0")); //Level Data
    	this.dataWatcher.addObject(DataValues.evolve, Byte.valueOf((byte)0)); //Evolution
    	this.dataWatcher.addObject(DataValues.obeyOthers, new Integer(0)); //Obey Others
    	this.dataWatcher.addObject(DataValues.zertumMode, new Integer(0)); //Zertum Mode
    	this.dataWatcher.addObject(DataValues.mouth, Integer.valueOf(0)); //Mouth
    	this.dataWatcher.addObject(DataValues.beg, new Byte((byte) 0)); //Begging
    }
    //@formatter:on
    @Override
    public void writeEntityToNBT(NBTTagCompound tagCompound) {
    	super.writeEntityToNBT(tagCompound);
    	tagCompound.setString("ownerId", this.getOwnerID());
    	tagCompound.setString("ownerName", this.getOwnerName());
    	tagCompound.setByte("collarColor", (byte) this.getCollarColor().getDyeDamage());
    	tagCompound.setBoolean("evolve", this.hasEvolved());
    	tagCompound.setBoolean("finalEvolve", this.inFinalStage());
    	tagCompound.setString("version", Constants.version);
    	tagCompound.setString("dogName", this.getPetName());
    	tagCompound.setInteger("dogHunger", this.getZertumHunger());
    	tagCompound.setBoolean("willObey", this.willObeyOthers());
    	tagCompound.setBoolean("dogBeg", this.isBegging());
    
    	this.talents.writeTalentsToNBT(tagCompound);
    	this.levels.writeTalentsToNBT(tagCompound);
    	this.mode.writeToNBT(tagCompound);
    	TalentHelper.writeToNBT(this, tagCompound);
    }
    
    @Override
    public void readEntityFromNBT(NBTTagCompound tagCompound) {
    	super.readEntityFromNBT(tagCompound);
    	this.saveOwnerID(tagCompound.getString("ownerId"));
    	this.saveOwnerName(tagCompound.getString("ownerName"));
    	if (tagCompound.hasKey("collarColor", 99)) {
    		this.setCollarColor(EnumDyeColor.byDyeDamage(tagCompound.getByte("collarColor")));
    	}
    	this.setEvolved(tagCompound.getBoolean("evolve"));
    	this.setFinalStage(tagCompound.getBoolean("finalEvolve"));
    	String lastVersion = tagCompound.getString("version");
    	this.setPetName(tagCompound.getString("dogName"));
    	this.setZertumHunger(tagCompound.getInteger("dogHunger"));
    	this.setWillObeyOthers(tagCompound.getBoolean("willObey"));
    	this.setBegging(tagCompound.getBoolean("dogBeg"));
    
    	this.talents.readTalentsFromNBT(tagCompound);
    	this.levels.readTalentsFromNBT(tagCompound);
    	this.mode.readFromNBT(tagCompound);
    	TalentHelper.readFromNBT(this, tagCompound);
    }
    
    @Override
    protected void playStepSound(BlockPos p_180429_1_, Block p_180429_2_) {
    	this.playSound("mob.wolf.step", 0.15F, 1.0F);
    }
    
    /**
     * Returns the sound this mob makes while it's alive.
     */
    @Override
    protected String getLivingSound() {
    	this.openMouth();
    	String sound = TalentHelper.getLivingSound(this);
    	if (!"".equals(sound)) {
    		return sound;
    	}
    
    	// if(!this.inFinalStage()){
    	return this.isAngry() ? "mob.wolf.growl" : this.wantToHowl ? Sound.ZertumHowl
    			: (this.rand.nextInt(3) == 0
    					? (this.isTamed() && this.getHealth() <= Constants.lowHP ? "mob.wolf.whine"
    							: "mob.wolf.panting") : "mob.wolf.bark");
    	// }else{ return Sound.; }
    }
    
    /**
     * Returns the sound this mob makes when it is hurt.
     */
    @Override
    protected String getHurtSound() {
    	this.openMouth();
    	return "mob.wolf.hurt";
    }
    
    /**
     * Returns the sound this mob makes on death.
     */
    @Override
    protected String getDeathSound() {
    	this.openMouth();
    	return "mob.wolf.death";
    }
    
    /**
     * Returns the volume for the sounds this mob makes.
     */
    @Override
    public float getSoundVolume() {
    	return 1F;
    }
    
    /**
     * Gets the pitch of living sounds in living entities.
     */
    @Override
    public float getPitch() {
    	if (!this.isChild()) {
    		return super.getSoundPitch();
    	}
    	else {
    		return super.getSoundPitch() * 1;
    	}
    }
    
    /**
     * Get number of ticks, at least during which the living entity will be
     * silent.
     */
    @Override
    public int getTalkInterval() {
    	int ticks = TalentHelper.getTalkInterval(this);
    	if (ticks != 0) {
    		return ticks;
    	}
    	else if (this.wantToHowl) {
    		return 150;
    	}
    	else if (this.getHealth() <= Constants.lowHP) {
    		return 20;
    	}
    	else {
    		return 200;
    	}
    }
    
    /**
     * Returns the item ID for the item the mob drops on death.
     */
    @Override
    protected void dropFewItems(boolean par1, int par2) {
    	rare = rand.nextInt(20);
    	{
    		if (this.isBurning()) {
    			this.dropItem(ModItems.zertumMeatCooked, 1);
    		}
    		else if (rare <= 12) {
    			this.dropItem(ModItems.zertumMeatRaw, 1);
    		}
    		if (rare <= 6 && !this.isTamed() && !(this instanceof EntityDarkZertum)) {
    			this.dropItem(ModItems.nileGrain, 1);
    		}
    		if (rare <= 6 && !this.isTamed() && (this instanceof EntityDarkZertum)) {
    			this.dropItem(ModItems.darkGrain, 1);
    		}
    		if (this.isSaddled()) {
    			this.dropItem(Items.saddle, 1);
    		}
    		else {
    
    		}
    
    	}
    }
    
    /**
     * Called frequently so the entity can update its state every tick as
     * required. For example, zombies and skeletons use this to react to
     * sunlight and start to burn.
     */
    @Override
    public void onLivingUpdate() // NAV: Living Updates
    {
    	super.onLivingUpdate();
    	if (isServer() && this.isWet && !this.isShaking && !this.hasPath() && this.onGround) {
    		this.isShaking = true;
    		this.timeWolfIsShaking = 0.0F;
    		this.prevTimeWolfIsShaking = 0.0F;
    		this.worldObj.setEntityState(this, (byte) ;
    	}
    
    	if (Constants.DEF_IS_HUNGER_ON) {
    		this.prevHungerTick = this.hungerTick;
    
    		if (this.riddenByEntity == null && !this.isSitting()) {
    			this.hungerTick += 1;
    		}
    
    		this.hungerTick += TalentHelper.onHungerTick(this, this.hungerTick - this.prevHungerTick);
    
    		if (this.hungerTick > 400) {
    			this.setZertumHunger(this.getZertumHunger() - 1);
    			this.hungerTick -= 400;
    		}
    	}
    
    	if (this.getHealth() != Constants.lowHP) {
    		this.prevHealingTick = this.healingTick;
    		this.healingTick += this.nourishment();
    
    		if (this.healingTick >= 6000) {
    			if (this.getHealth() < this.getMaxHealth()) {
    				this.setHealth(this.getHealth() + 1);
    			}
    
    			this.healingTick = 0;
    		}
    	}
    
    	if (this.getZertumHunger() == 0 && this.worldObj.getWorldInfo().getWorldTime() % 100L == 0L && this.getHealth() >= Constants.lowHP) {
    		this.attackEntityFrom(DamageSource.generic, 1);
    	}
    
    	if (isServer() && this.getAttackTarget() == null && this.isAngry()) {
    		this.setAngry(false);
    	}
    
    	if (Constants.DEF_HOWL == true) {
    		if (this.isServer()) {
    			if (this.worldObj.isDaytime() && this.isChild()) {
    				wantToHowl = false;
    			}
    			else if (!this.isChild()) {
    				wantToHowl = true;
    			}
    		}
    	}
    	TalentHelper.onLivingUpdate(this);
    }
    
    /**
     * Called to update the entity's position/logic.
     */
    @Override
    public void onUpdate() {
    	super.onUpdate();
    	this.prevTimeDogBegging = this.timeDogBegging;
    
    	if (this.isBegging()) {
    		this.timeDogBegging += (1.0F - this.timeDogBegging) * 0.4F;
    	}
    	else {
    		this.timeDogBegging += (0.0F - this.timeDogBegging) * 0.4F;
    	}
    
    	if (this.openMouthCounter > 0 && ++this.openMouthCounter > 30) {
    		this.openMouthCounter = 0;
    		this.setHorseWatchableBoolean(128, false);
    	}
    
    	this.prevMouthOpenness = this.mouthOpenness;
    
    	if (this.getHorseWatchableBoolean(128)) {
    		this.mouthOpenness += (1.0F - this.mouthOpenness) * 0.7F + 0.05F;
    
    		if (this.mouthOpenness > 1.0F) {
    			this.mouthOpenness = 1.0F;
    		}
    	}
    	else {
    		this.mouthOpenness += (0.0F - this.mouthOpenness) * 0.7F - 0.05F;
    
    		if (this.mouthOpenness < 0.0F) {
    			this.mouthOpenness = 0.0F;
    		}
    	}
    	this.headRotationCourseOld = this.headRotationCourse;
    
    	if (this.isBegging()) {
    		this.headRotationCourse += (1.0F - this.headRotationCourse) * 0.4F;
    	}
    	else {
    		this.headRotationCourse += (0.0F - this.headRotationCourse) * 0.4F;
    	}
    
    	if (this.isWet()) {
    		this.isWet = true;
    		this.isShaking = false;
    		this.timeWolfIsShaking = 0.0F;
    		this.prevTimeWolfIsShaking = 0.0F;
    	}
    	else if ((this.isWet || this.isShaking) && this.isShaking) {
    		if (this.timeWolfIsShaking == 0.0F) {
    			this.playSound("mob.wolf.shake", this.getSoundVolume(), (this.rand.nextFloat() - this.rand.nextFloat()) * 0.2F + 1.0F);
    		}
    
    		this.prevTimeWolfIsShaking = this.timeWolfIsShaking;
    		this.timeWolfIsShaking += 0.05F;
    
    		if (this.prevTimeWolfIsShaking >= 2.0F) {
    			if (this.rand.nextInt(15) < this.talents.getLevel("fishing") * 2) {
    				if (this.rand.nextInt(15) < this.talents.getLevel("flamingelemental") * 2 && this instanceof EntityRedZertum) {
    					if (isServer()) {
    						dropItem(Items.cooked_fish, 1);
    					}
    				}
    				else {
    					if (isServer()) {
    						dropItem(Items.fish, 1);
    					}
    				}
    			}
    			this.isWet = false;
    			this.isShaking = false;
    			this.prevTimeWolfIsShaking = 0.0F;
    			this.timeWolfIsShaking = 0.0F;
    		}
    
    		if (this.timeWolfIsShaking > 0.4F) {
    			float f = (float) this.getEntityBoundingBox().minY;
    			int i = (int) (MathHelper.sin((this.timeWolfIsShaking - 0.4F) * (float) Math.PI) * 7.0F);
    
    			for (int j = 0; j < i; ++j) {
    				float f1 = (this.rand.nextFloat() * 2.0F - 1.0F) * this.width * 0.5F;
    				float f2 = (this.rand.nextFloat() * 2.0F - 1.0F) * this.width * 0.5F;
    				this.worldObj.spawnParticle(EnumParticleTypes.WATER_SPLASH, this.posX + f1, f + 0.8F, this.posZ + f2, this.motionX, this.motionY, this.motionZ, new int[0]);
    			}
    		}
    	}
    
    	if (this.rand.nextInt(200) == 0 && this.hasEvolved()) {
    		this.hiyaMaster = true;
    	}
    
    	if (((this.isBegging()) || (this.hiyaMaster)) && (!this.isWolfHappy) && this.hasEvolved()) {
    		this.isWolfHappy = true;
    		this.timeWolfIsHappy = 0.0F;
    		this.prevTimeWolfIsHappy = 0.0F;
    	}
    	else {
    		hiyaMaster = false;
    	}
    	if (this.isWolfHappy) {
    		if (this.timeWolfIsHappy % 1.0F == 0.0F) {
    			if (!(this instanceof EntityMetalZertum)) {
    				this.openMouth();
    				this.worldObj.playSoundAtEntity(this, "mob.wolf.panting", this.getSoundVolume(), (this.rand.nextFloat() - this.rand.nextFloat()) * 0.2F + 1.0F);
    			}
    			else if (this instanceof EntityMetalZertum) {
    				this.openMouth();
    				this.worldObj.playSoundAtEntity(this, Sound.MetalZertumPant, this.getSoundVolume(), (this.rand.nextFloat() - this.rand.nextFloat()) * 0.2F + 1.0F);
    			}
    		}
    		this.prevTimeWolfIsHappy = this.timeWolfIsHappy;
    		this.timeWolfIsHappy += 0.05F;
    		if (this.prevTimeWolfIsHappy >= 8.0F) {
    			this.isWolfHappy = false;
    			this.prevTimeWolfIsHappy = 0.0F;
    			this.timeWolfIsHappy = 0.0F;
    		}
    	}
    
    	if (this.isTamed()) {
    		EntityPlayer player = (EntityPlayer) this.getOwner();
    
    		if (player != null) {
    			float distanceToOwner = player.getDistanceToEntity(this);
    
    			if (distanceToOwner <= 2F && this.hasToy()) {
    				if (isServer()) {
    					this.entityDropItem(new ItemStack(ModItems.toy, 1, 1), 0.0F);
    				}
    				this.setHasToy(false);
    			}
    		}
    	}
    
    	TalentHelper.onUpdate(this);
    }
    
    public float getWagAngle(float f, float f1) {
    	float f2 = (this.prevTimeWolfIsHappy + (this.timeWolfIsHappy - this.prevTimeWolfIsHappy) * f + f1) / 2.0F;
    	if (f2 < 0.0F) {
    		f2 = 0.0F;
    	}
    	else if (f2 > 2.0F) {
    		f2 %= 2.0F;
    	}
    	return MathHelper.sin(f2 * (float) Math.PI * 5.0F) * 0.3F * (float) Math.PI;
    }
    
    @Override
    public void moveEntityWithHeading(float strafe, float forward) {
    	if (this.riddenByEntity instanceof EntityPlayer) {
    		this.prevRotationYaw = this.rotationYaw = this.riddenByEntity.rotationYaw;
    		this.rotationPitch = this.riddenByEntity.rotationPitch * 0.5F;
    		this.setRotation(this.rotationYaw, this.rotationPitch);
    		this.rotationYawHead = this.renderYawOffset = this.rotationYaw;
    		strafe = ((EntityPlayer) this.riddenByEntity).moveStrafing * 0.5F;
    		forward = ((EntityPlayer) this.riddenByEntity).moveForward;
    
    		if (forward <= 0.0F) {
    			forward *= 0.25F;
    		}
    
    		if (this.onGround) {
    			if (forward > 0.0F) {
    				float f2 = MathHelper.sin(this.rotationYaw * (float) Math.PI / 180.0F);
    				float f3 = MathHelper.cos(this.rotationYaw * (float) Math.PI / 180.0F);
    				this.motionX += -0.4F * f2 * 0.15F; // May change
    				this.motionZ += 0.4F * f3 * 0.15F;
    			}
    		}
    
    		this.stepHeight = 1.0F;
    		this.jumpMovementFactor = this.getAIMoveSpeed() * 0.2F;
    
    		if (isServer()) {
    			this.setAIMoveSpeed((float) this.getEntityAttribute(SharedMonsterAttributes.movementSpeed).getAttributeValue() / 4);
    			super.moveEntityWithHeading(strafe, forward);
    		}
    
    		if (this.onGround) {
    			// this.jumpPower = 0.0F;
    			// this.setHorseJumping(false);
    		}
    
    		this.prevLimbSwingAmount = this.limbSwingAmount;
    		double d0 = this.posX - this.prevPosX;
    		double d1 = this.posZ - this.prevPosZ;
    		float f4 = MathHelper.sqrt_double(d0 * d0 + d1 * d1) * 4.0F;
    
    		if (f4 > 1.0F) {
    			f4 = 1.0F;
    		}
    
    		this.limbSwingAmount += (f4 - this.limbSwingAmount) * 0.4F;
    		this.limbSwing += this.limbSwingAmount;
    	}
    	else {
    		this.stepHeight = 0.5F;
    		this.jumpMovementFactor = 0.02F;
    		super.moveEntityWithHeading(strafe, forward);
    	}
    }
    
    @Override
    public float getAIMoveSpeed() {
    	double speed = this.getEntityAttribute(SharedMonsterAttributes.movementSpeed).getAttributeValue();
    	speed += TalentHelper.addToMoveSpeed(this);
    
    	if ((!(this.getAttackTarget() instanceof EntityZertumEntity) && !(this.getAttackTarget() instanceof EntityPlayer)) || this.riddenByEntity instanceof EntityPlayer) {
    		if (this.levels.getLevel() == Constants.stage2Level && this.hasEvolved()) {
    			speed += 0.3D;
    		}
    		else if (this.hasEvolved() && this.levels.getLevel() != Constants.stage2Level) {
    			speed += 0.3D;
    		}
    	}
    
    	if (this.riddenByEntity instanceof EntityPlayer) {
    		speed /= 4;
    	}
    
    	return (float) speed;
    }
    
    public float getAIAttackDamage() {
    	double damage = this.getEntityAttribute(SharedMonsterAttributes.attackDamage).getAttributeValue();
    	damage += TalentHelper.addToAttackDamage(this);
    
    	if ((!(this.getAttackTarget() instanceof EntityZertumEntity) && !(this.getAttackTarget() instanceof EntityPlayer))) {
    		if (this.levels.getLevel() == Constants.stage2Level && this.hasEvolved()) {
    			damage += 1.0D;
    		}
    		else if (this.hasEvolved() && this.levels.getLevel() != Constants.stage2Level) {
    			damage += 1.0D;
    		}
    		else if (this.levels.getLevel() == Constants.maxLevel && this.hasEvolved() && this.inFinalStage()) {
    			damage += 3.0D;
    		}
    	}
    	return (float) damage;
    }
    
    @Override
    public void fall(float distance, float damageMultiplier) {
    	if (distance > 1.0F) {
    		this.playSound("game.neutral.hurt.fall.small", 0.4F, 1.0F);
    	}
    
    	int i = MathHelper.ceiling_float_int(((distance * 0.5F - 3.0F) - TalentHelper.fallProtection(this)) * damageMultiplier);
    
    	if (i > 0 && !TalentHelper.isImmuneToFalls(this)) {
    		this.attackEntityFrom(DamageSource.fall, i);
    
    		if (this.riddenByEntity != null) {
    			this.riddenByEntity.attackEntityFrom(DamageSource.fall, i);
    		}
    
    		Block block = this.worldObj.getBlockState(new BlockPos(this.posX, this.posY - 0.2D - this.prevRotationYaw, this.posZ)).getBlock();
    
    		if (block.getMaterial() != Material.air && !this.isSilent()) {
    			Block.SoundType soundtype = block.stepSound;
    			this.worldObj.playSoundAtEntity(this, soundtype.getStepSound(), soundtype.getVolume() * 0.5F, soundtype.getFrequency() * 0.75F);
    		}
    	}
    }
    
    @SideOnly(Side.CLIENT)
    public boolean isWolfWet() {
    	return this.isWet;
    }
    
    @SideOnly(Side.CLIENT)
    public float getShadingWhileWet(float p_70915_1_) {
    	return 0.75F + (this.prevTimeWolfIsShaking + (this.timeWolfIsShaking - this.prevTimeWolfIsShaking) * p_70915_1_) / 2.0F * 0.25F;
    }
    
    @SideOnly(Side.CLIENT)
    public float getShakeAngle(float p_70923_1_, float p_70923_2_) {
    	float f2 = (this.prevTimeWolfIsShaking + (this.timeWolfIsShaking - this.prevTimeWolfIsShaking) * p_70923_1_ + p_70923_2_) / 1.8F;
    
    	if (f2 < 0.0F) {
    		f2 = 0.0F;
    	}
    	else if (f2 > 1.0F) {
    		f2 = 1.0F;
    	}
    
    	return MathHelper.sin(f2 * (float) Math.PI) * MathHelper.sin(f2 * (float) Math.PI * 11.0F) * 0.15F * (float) Math.PI;
    }
    
    @SideOnly(Side.CLIENT)
    public float getInterestedAngle(float partialTickTime) {
    	return (this.prevTimeDogBegging + (this.timeDogBegging - this.prevTimeDogBegging) * partialTickTime) * 0.15F * (float) Math.PI;
    }
    
    @Override
    public float getEyeHeight() {
    	return this.height * 0.8F;
    }
    
    @Override
    public int getVerticalFaceSpeed() {
    	return this.isSitting() ? 20 : super.getVerticalFaceSpeed();
    }
    
    @Override
    public boolean attackEntityFrom(DamageSource damageSource, float damage) {
    	if (this.isEntityInvulnerable(damageSource)) {
    		return false;
    	}
    	else {
    		if (!TalentHelper.attackEntityFrom(this, damageSource, damage)) {
    			return false;
    		}
    
    		Entity entity = damageSource.getEntity();
    		this.aiSit.setSitting(false);
    
    		if (entity != null && !(entity instanceof EntityPlayer) && !(entity instanceof EntityArrow)) {
    			damage = (damage + 1.0F) / 2.0F;
    		}
    
    		return super.attackEntityFrom(damageSource, damage);
    	}
    }
    
    @Override
    public boolean attackEntityAsMob(Entity entity) {
    	if (!TalentHelper.shouldDamageMob(this, entity)) {
    		return false;
    	}
    
    	int damage = (int) (4 + (this.getEntityAttribute(SharedMonsterAttributes.attackDamage).getBaseValue()) / 2);
    	damage = TalentHelper.attackEntityAsMob(this, entity, damage);
    
    	if (entity instanceof EntityZombie) {
    		((EntityZombie) entity).setAttackTarget(this);
    	}
    
    	return entity.attackEntityFrom(DamageSource.causeMobDamage(this), damage);
    }
    
    /**
     * Called when the mob's health reaches 0.
     */
    @Override
    public void onDeath(DamageSource par1DamageSource) {
    	super.onDeath(par1DamageSource);
    
    	if (par1DamageSource.getEntity() instanceof EntityPlayer) {
    		EntityPlayer entityplayer = (EntityPlayer) par1DamageSource.getEntity();
    		{
    			entityplayer.triggerAchievement(ModAchievements.ZertKill);
    			this.dropChestItems();
    
    		}
    	}
    }
    
    @Override
    protected boolean isMovementBlocked() {
    	return this.isPlayerSleeping() || this.ridingEntity != null || this.riddenByEntity instanceof EntityPlayer || super.isMovementBlocked();
    }
    
    @Override
    public double getYOffset() {
    	return this.ridingEntity instanceof EntityPlayer ? 0.5D : 0.0D;
    }
    
    @Override
    public boolean isPotionApplicable(PotionEffect potionEffect) {
    	if (this.getHealth() <= Constants.lowHP) {
    		return false;
    	}
    
    	if (!TalentHelper.isPostionApplicable(this, potionEffect)) {
    		return false;
    	}
    
    	return true;
    }
    
    @Override
    public void setFire(int amount) {
    	if (TalentHelper.setFire(this, amount)) {
    		super.setFire(amount);
    	}
    }
    
    public int foodValue(ItemStack stack) {
    	if (stack == null || stack.getItem() == null) {
    		return 0;
    	}
    
    	int foodValue = 0;
    
    	Item item = stack.getItem();
    
    	if (stack.getItem() != Items.rotten_flesh && item instanceof ItemFood) {
    		ItemFood itemfood = (ItemFood) item;
    
    		if (itemfood.isWolfsFavoriteMeat()) {
    			foodValue = 40;
    		}
    	}
    
    	foodValue = TalentHelper.changeFoodValue(this, stack, foodValue);
    
    	return foodValue;
    }
    
    public int masterOrder() { // NAV: Master Order
    	int order = 0;
    	EntityPlayer player = (EntityPlayer) this.getOwner();
    
    	if (player != null) {
    
    		float distanceAway = player.getDistanceToEntity(this);
    		ItemStack itemstack = player.inventory.getCurrentItem();
    
    		if (itemstack != null && (itemstack.getItem() instanceof ItemTool) && distanceAway <= 20F) {
    			order = 1;
    		}
    
    		if (itemstack != null && ((itemstack.getItem() instanceof ItemSword) || (itemstack.getItem() instanceof ItemBow))) {
    			order = 2;
    		}
    
    		if (itemstack != null && itemstack.getItem() == Items.wheat) {
    			order = 3;
    		}
    
    		if (itemstack != null && itemstack.getItem() == Items.bone) {
    			order = 4;
    		}
    	}
    
    	return order;
    }
    
    @Override
    public boolean canBreatheUnderwater() {
    	return TalentHelper.canBreatheUnderwater(this);
    }
    
    @Override
    public boolean canInteract(EntityPlayer player) {
    	return this.isOwner(player) || this.willObeyOthers();
    }
    
    public int nourishment() {
    	int amount = 0;
    
    	if (this.getZertumHunger() > 0) {
    		amount = 40 + 4 * (this.effectiveLevel() + 1);
    
    		if (isSitting() && this.talents.getLevel("rapidregen") == 5) {
    			amount += 20 + 2 * (this.effectiveLevel() + 1);
    		}
    
    		if (!this.isSitting()) {
    			amount *= 5 + this.talents.getLevel("rapidregen");
    			amount /= 10;
    		}
    	}
    
    	return amount;
    }
    
    public int effectiveLevel() {
    	return (this.levels.getLevel()) / 10;
    }
    
    public String getPetName() {
    	return this.dataWatcher.getWatchableObjectString(DataValues.dogName);
    }
    
    public void setPetName(String var1) {
    	this.dataWatcher.updateObject(DataValues.dogName, var1);
    }
    
    public void setWillObeyOthers(boolean flag) {
    	this.dataWatcher.updateObject(DataValues.obeyOthers, flag ? 1 : 0);
    }
    
    public boolean willObeyOthers() {
    	return this.dataWatcher.getWatchableObjectInt(DataValues.obeyOthers) != 0;
    }
    
    public int points() {
    	return this.levels.getLevel() + (this.getGrowingAge() < 0 ? 0 : Constants.startingPoints);
    }
    
    public int spendablePoints() {
    	return this.points() - this.usedPoints();
    }
    
    public int usedPoints() {
    	return TalentHelper.getUsedPoints(this);
    }
    
    public int getZertumHunger() {
    	return this.dataWatcher.getWatchableObjectInt(DataValues.hungerTicks);
    }
    
    public void setZertumHunger(int par1) {
    	this.dataWatcher.updateObject(DataValues.hungerTicks, MathHelper.clamp_int(par1, 0, Constants.hungerTicks));
    }
    
    @Override
    public boolean func_142018_a(EntityLivingBase entityToAttack, EntityLivingBase owner) {
    	if (TalentHelper.canAttackEntity(this, entityToAttack)) {
    		return true;
    	}
    
    	if (!(entityToAttack instanceof EntityCreeper) && !(entityToAttack instanceof EntityGhast)) {
    		if (entityToAttack instanceof EntityZertumEntity) {
    			EntityZertumEntity entityZertum = (EntityZertumEntity) entityToAttack;
    
    			if (entityZertum.isTamed() && entityZertum.getOwner() == owner) {
    				return false;
    			}
    		}
    
    		return entityToAttack instanceof EntityPlayer && owner instanceof EntityPlayer && !((EntityPlayer) owner).canAttackPlayer((EntityPlayer) entityToAttack)
    				? false
    				: !(entityToAttack instanceof EntityHorse) || !((EntityHorse) entityToAttack).isTame();
    	}
    	else {
    		return false;
    	}
    }
    
    @Override
    public boolean canAttackClass(Class p_70686_1_) {
    	if (TalentHelper.canAttackClass(this, p_70686_1_)) {
    		return true;
    	}
    
    	return super.canAttackClass(p_70686_1_);
    }
    
    public void setHasToy(boolean hasBone) {
    	this.hasToy = hasBone;
    }
    
    public boolean hasToy() {
    	return this.hasToy;
    }
    
    @Override
    @SideOnly(Side.CLIENT)
    public void handleHealthUpdate(byte p_70103_1_) {
    	if (p_70103_1_ ==  {
    		this.isShaking = true;
    		this.timeWolfIsShaking = 0.0F;
    		this.prevTimeWolfIsShaking = 0.0F;
    	}
    	else {
    		super.handleHealthUpdate(p_70103_1_);
    	}
    }
    
    /**
     * Checks if the parameter is an item which this animal can be fed to breed
     * it (wheat, carrots or seeds depending on the animal type)
     */
    @Override
    public boolean isBreedingItem(ItemStack stack) {
    	return stack != null && ZeroQuestAPI.breedList.containsItem(stack);
    }
    
    @Override
    public int getMaxSpawnedInChunk() {
    	return 8;
    }
    
    public EnumDyeColor getCollarColor() {
    	return EnumDyeColor.byDyeDamage(this.dataWatcher.getWatchableObjectByte(DataValues.collarCollar) & 15);
    }
    
    public void setCollarColor(EnumDyeColor collarcolor) {
    	this.dataWatcher.updateObject(DataValues.collarCollar, Byte.valueOf((byte) (collarcolor.getDyeDamage() & 15)));
    }
    
    private boolean getHorseWatchableBoolean(int p_110233_1_) {
    	return (this.dataWatcher.getWatchableObjectInt(DataValues.mouth) & p_110233_1_) != 0;
    }
    
    private void setHorseWatchableBoolean(int p_110208_1_, boolean p_110208_2_) {
    	int j = this.dataWatcher.getWatchableObjectInt(DataValues.mouth);
    
    	if (p_110208_2_) {
    		this.dataWatcher.updateObject(DataValues.mouth, Integer.valueOf(j | p_110208_1_));
    	}
    	else {
    		this.dataWatcher.updateObject(DataValues.mouth, Integer.valueOf(j & ~p_110208_1_));
    	}
    }
    
    @SideOnly(Side.CLIENT)
    public float getMouthOpennessAngle(float p_110201_1_) {
    	return this.prevMouthOpenness + (this.mouthOpenness - this.prevMouthOpenness) * p_110201_1_;
    }
    
    public void openMouth() {
    	if (isServer()) {
    		this.openMouthCounter = 1;
    		this.setHorseWatchableBoolean(128, true);
    	}
    }
    
    /**
     * Determines if an entity can be despawned, used on idle far away entities
     */
    @Override
    protected boolean canDespawn() {
    	return !this.isTamed() && this.ticksExisted > 2400;
    }
    
    @Override
    public boolean allowLeashing() {
    	return !this.isAngry() && super.allowLeashing();
    }
    
    public void setBegging(boolean flag) {
    	this.dataWatcher.updateObject(DataValues.beg, Byte.valueOf((byte) (flag ? 1 : 0)));
    }
    
    public boolean isBegging() {
    	return this.dataWatcher.getWatchableObjectByte(DataValues.beg) == 1;
    }
    
    public boolean hasEvolved() {
    	return (this.dataWatcher.getWatchableObjectByte(DataValues.evolve) & 4) != 0;
    }
    
    public void setEvolved(boolean evolved) {
    	byte b0 = this.dataWatcher.getWatchableObjectByte(DataValues.evolve);
    
    	if (evolved) {
    		this.dataWatcher.updateObject(DataValues.evolve, Byte.valueOf((byte) (b0 | 4)));
    	}
    	else {
    		this.dataWatcher.updateObject(DataValues.evolve, Byte.valueOf((byte) (b0 & -5)));
    	}
    
    	if (evolved) {
    		if (!this.isChild() && !this.hasEvolved()) {
    			this.getEntityAttribute(SharedMonsterAttributes.maxHealth).setBaseValue(this.tamedHealth() + this.effectiveLevel());
    			this.getEntityAttribute(SharedMonsterAttributes.attackDamage).setBaseValue(this.tamedDamage());
    		}
    		else if (!this.isChild() && this.hasEvolved()) {
    			this.getEntityAttribute(SharedMonsterAttributes.maxHealth).setBaseValue(this.evoHealth());
    		}
    		else {
    			this.getEntityAttribute(SharedMonsterAttributes.maxHealth).setBaseValue(this.babyHealth());
    			this.getEntityAttribute(SharedMonsterAttributes.attackDamage).setBaseValue(this.babyDamage());
    		}
    	}
    	else {
    		if (this.isChild()) {
    			this.getEntityAttribute(SharedMonsterAttributes.maxHealth).setBaseValue(this.babyHealth());
    			this.getEntityAttribute(SharedMonsterAttributes.attackDamage).setBaseValue(this.babyDamage());
    		}
    	}
    }
    
    public boolean inFinalStage() {
    	return (this.dataWatcher.getWatchableObjectByte(DataValues.evolve) & 2) != 0;
    }
    
    public void setFinalStage(boolean finalStage) {
    	byte b0 = this.dataWatcher.getWatchableObjectByte(DataValues.evolve);
    
    	if (finalStage) {
    		this.dataWatcher.updateObject(DataValues.evolve, Byte.valueOf((byte) (b0 | 2)));
    	}
    	else {
    		this.dataWatcher.updateObject(DataValues.evolve, Byte.valueOf((byte) (b0 & -3)));
    	}
    }
    
    public String getOwnerName() {
    	return this.dataWatcher.getWatchableObjectString(DataValues.ownerName);
    }
    
    public void saveOwnerName(String name) {
    	this.dataWatcher.updateObject(DataValues.ownerName, name);
    }
    
    public String getOwnerID() {
    	return this.dataWatcher.getWatchableObjectString(DataValues.ownerID);
    }
    
    public void saveOwnerID(String id) {
    	this.dataWatcher.updateObject(DataValues.ownerID, id);
    }
    
    /** Custom Zertum Taming Code */
    @Override
    public void tamedFor(EntityPlayer player, boolean successful) {
    	if (successful) {
    		this.setTamed(true);
    		this.navigator.clearPathEntity();
    		this.setAttackTarget((EntityLivingBase) null);
    		this.aiSit.setSitting(false);
    		this.setOwnerId(player.getUniqueID().toString());
    		this.playTameEffect(true);
    		this.worldObj.setEntityState(this, (byte) 7);
    		this.saveOwnerName(player.getDisplayNameString());
    		this.saveOwnerID(player.getUniqueID().toString());
    		player.triggerAchievement(ModAchievements.ZertTame);
    		//@formatter:off
    		//System.out.println("ID: " + zertum.getOwnerID() + ", Name: " + zertum.getOwnerName());
    		//@formatter:on
    	}
    	else {
    		this.playTameEffect(false);
    		this.worldObj.setEntityState(this, (byte) 6);
    	}
    }
    
    public void unTame() {
    	this.setTamed(false);
    	this.setEvolved(false);
    	this.setFinalStage(false);
    	this.navigator.clearPathEntity();
    	this.setSitting(false);
    	this.talents.resetTalents();
    	this.levels.resetLevel();
    	this.setOwnerId("");
    	this.saveOwnerName("");
    	this.setPetName("");
    	this.setWillObeyOthers(false);
    	this.mode.setMode(EnumMode.DOCILE);
    }
    
    public void evolveOnClient(EntityPlayer player) {
    	this.setEvolved(true);
    	this.worldObj.playBroadcastSound(1013, new BlockPos(this), 0);
    	this.setHealth(this.getMaxHealth());
    	player.addChatMessage(ChatHelper.getChatComponent(EnumChatFormatting.GREEN + this.getPetName() + " has been evolved!"));
    }
    
    public void evolveOnServer(EntityZertumEntity entity, EntityPlayer player) {
    	entity.setEvolved(true);
    	entity.worldObj.playBroadcastSound(1013, new BlockPos(entity), 0);
    	entity.setHealth(entity.getMaxHealth());
    	player.addChatMessage(ChatHelper.getChatComponent(EnumChatFormatting.GREEN + entity.getPetName() + " has been evolved!"));
    }
    
    public void finaEvolveOnClient(EntityPlayer player) {
    	this.setFinalStage(true);
    	this.worldObj.playBroadcastSound(1013, new BlockPos(this), 0);
    	this.setHealth(this.getMaxHealth());
    	player.addChatMessage(ChatHelper.getChatComponent(EnumChatFormatting.GREEN + this.getPetName() + " has been evolved to the final stage!"));
    }
    
    public void finaEvolveOnServer(EntityZertumEntity entity, EntityPlayer player) {
    	entity.setFinalStage(true);
    	entity.worldObj.playBroadcastSound(1013, new BlockPos(entity), 0);
    	entity.setHealth(entity.getMaxHealth());
    	player.addChatMessage(ChatHelper.getChatComponent(EnumChatFormatting.GREEN + entity.getPetName() + " has been evolved to the final stage!"));
    }
    
    public void devolveOnServer(EntityZertumEntity entity, EntityPlayer player) {
    	if (entity.hasEvolved() && !entity.inFinalStage()) {
    		entity.setEvolved(false);
    	}
    	else if (entity.hasEvolved() && entity.inFinalStage()) {
    		entity.setFinalStage(false);
    	}
    	entity.worldObj.playBroadcastSound(1013, new BlockPos(entity), 0);
    	entity.setHealth(entity.getMaxHealth());
    	player.addChatMessage(ChatHelper.getChatComponent(EnumChatFormatting.DARK_RED + entity.getPetName() + " has been devolved!"));
    }
    
    public String genderPronoun() {
    	if (this.getGender() == true) {
    		return "him";
    	}
    	else {
    		return "her";
    	}
    }
    
    public String genderSubject() {
    	if (this.getGender() == true) {
    		return "he";
    	}
    	else {
    		return "she";
    	}
    }
    
    public void doNotOwnMessage(EntityZertumEntity zertum, EntityPlayer player) {
    	player.addChatMessage(ChatHelper.getChatComponent(EnumChatFormatting.RED + "You do not own " + zertum.getPetName() + " and " + zertum.getOwnerName() + " doesn't allow " + zertum.genderPronoun() + EnumChatFormatting.RED + " to" + EnumChatFormatting.RED + " obey" + EnumChatFormatting.RED + "non-owners!"));
    }
    }

     

    For the female, it's suppose to not render the male textures at all, which is what it is doing. But when the male is wild, it shows the tamed male textures and vice versa.

     

    Here

×
×
  • Create New...

Important Information

By using this site, you agree to our Terms of Use.