code:
package astrotibs.notenoughpets.spawnegg;

import java.util.Collection;
import java.util.Collections;
import java.util.LinkedHashMap;
import java.util.Map;
import java.util.Random;

import astrotibs.notenoughpets.name.BlackCatNames;
import astrotibs.notenoughpets.util.LogHelper;
import astrotibs.notenoughpets.util.Reference;
import net.minecraft.block.BlockDispenser;
import net.minecraft.client.Minecraft;
import net.minecraft.client.renderer.block.model.ModelResourceLocation;
import net.minecraft.nbt.NBTTagCompound;
import net.minecraft.util.ResourceLocation;
import net.minecraftforge.fml.common.registry.GameRegistry;

/**
 * Adapted from Better Spawn Eggs:
 * https://github.com/DavidGoldman/BetterSpawnEggs/blob/master/com/mcf/davidee/spawneggs/SpawnEggRegistry.java
 * https://github.com/DavidGoldman/BetterSpawnEggs/blob/master/com/mcf/davidee/spawneggs/DefaultFunctionality.java
 * https://github.com/DavidGoldman/BetterSpawnEggs/blob/master/com/mcf/davidee/spawneggs/CustomTags.java
 * @author AstroTibs
 */

public class SpawnEggRegistry {

	private static final Map<Short, SpawnEggInfo> SPAWN_EGGS = new LinkedHashMap<Short, SpawnEggInfo>();
	private static final int MOD_MOBS_IDS_START = 1;

	public static final ItemSpawnEggNEP SPAWN_EGG = new ItemSpawnEggNEP();

	public static final Object[][] SPAWN_EGG_DATA = new Object[][]{
		// Cats are index 0 of mobStrings
		{0, "cat.ocelot",           catTypeNEC(0), 0xffdd74, 0x8e552a},
		{0, "cat.tuxedo",           catTypeNEC(1), 0x1c1827, 0xeaeaea},
		{0, "cat.redtabby",         catTypeNEC(2), 0xeaa939, 0xdb7920},
		{0, "cat.siamese",          catTypeNEC(3), 0xe1d6c3, 0x554c3b},
		{0, "cat.britishshorthair", catTypeNEC(4), 0xbcbcbc, 0x868a8a},
		{0, "cat.calico",           catTypeNEC(5), 0xdb9c3e, 0x423b32},
		{0, "cat.persian",          catTypeNEC(6), 0xffeacb, 0xf3ca8d},
		{0, "cat.ragdoll",          catTypeNEC(7), 0xf7f7f7, 0xab9e94},
		{0, "cat.white",            catTypeNEC(8), 0xfdf9fb, 0xf3f5f6},
		{0, "cat.jellie",           catTypeNEC(9), 0xf0f0f0, 0x4b4a4a},
		{0, "cat.black",            catTypeNEC(10), 0x161524, 0x12101d},
		{0, "cat.black_named",      catTypeNEC(10), 0x161524, 0xc07832},
		{0, "cat.browntabby",       catTypeNEC(11), 0x87654a, 0x5e422d},
		{0, "cat.graytabby",        catTypeNEC(12), 0x817a74, 0x423c38},
		{0, "cat.juno",             catTypeNEC(13), 0x382c24, 0xfcfbfb},
		{0, "cat.willie",           catTypeNEC(14), 0x5f5a55, 0xb7a897},
		{0, "cat.lily",             catTypeNEC(15), 0x1c100a, 0x6b442b},
		{0, "cat.boo",              catTypeNEC(16), 0x654827, 0xbc8851},
		{0, "cat.winslow",          catTypeNEC(17), 0xe28726, 0x363330},
		{0, "cat.blitzkrieg",       catTypeNEC(18), 0x505050, 0x3d3d3d},
		{0, "cat.princess",         catTypeNEC(19), 0xfcfbfb, 0x4f4d4f},
		{0, "cat.cocoa",            catTypeNEC(20), 0x9a715b, 0xb2846c},
		// Wolves and dogs are index 1
		{1, "dog.wolf",             dogTypeNEC(0), 0xdddadb, 0xd4b5a4},
		{1, "dog.blocco",           dogTypeNEC(1), 0x413b47, 0xf3f1f2},
		{1, "dog.brown",            dogTypeNEC(2), 0x8c4e2e, 0x49200d}, // Colors updated -- v2.1.0
		{1, "dog.cream",            dogTypeNEC(3), 0xe9e1c5, 0xd29e7c}, // Colors updated -- v2.1.0
		{1, "dog.white_terrier",    dogTypeNEC(4), 0xf5f1f2, 0xd3cfd1},
		{1, "dog.red_shiba_inu",    dogTypeNEC(5), 0xc68c65, 0xebe6e6},
		{1, "dog.beagle",           dogTypeNEC(6), 0xad6a2d, 0x3b383a},
		{1, "dog.pug",              dogTypeNEC(7), 0xdac09b, 0x3e3a3a},
		{1, "dog.border_collie",    dogTypeNEC(8), 0x2e2a26, 0x866a47},
		{1, "dog.boston_terrier",   dogTypeNEC(9), 0x292724, 0xffffff},
		{1, "dog.st_bernard",       dogTypeNEC(10), 0x9b7354, 0xf3f2ee}, // Added v2.1.0
		{1, "dog.golden_retriever", dogTypeNEC(11), 0xdcb04d, 0xc99727},
		{1, "dog.siberian_husky",   dogTypeNEC(12), 0xf3f0f1, 0x3f3945},
		// Mooshrooms are index 2
		{2, "mooshroom.red",        mooshroomTypeNEC(0), 0xa81012, 0xb3b3b3},
		{2, "mooshroom.brown",      mooshroomTypeNEC(1), 0x977251, 0xcc9978},
		// Parrots are index 3 - v2.0.0
		{3, "parrot.red",           parrotType(0), 0xfb0d0d, 0x037cf7},
		{3, "parrot.blue",          parrotType(1), 0x0c20dc, 0xfde803},
		{3, "parrot.green",         parrotType(2), 0x8ccf00, 0xf1eebf},
		{3, "parrot.cyan",          parrotType(3), 0x1ab9f7, 0xffd400},
		{3, "parrot.gray",          parrotType(4), 0xb0b0b0, 0xffe533},
		{3, "parrot.golden",        parrotType(5), 0xfee400, 0x53881a},
		{3, "parrot.white",         parrotType(6), 0xf8f7f3, 0xe7e2d6},
		{3, "parrot.black",         parrotType(7), 0x332b47, 0x201c32},
		{3, "parrot.rosy_faced",    parrotType(8), 0x67c72c, 0xff714d},
		{3, "parrot.dusky",         parrotType(9), 0x514d4c, 0xea3e21},
		{3, "parrot.african_grey",  parrotType(10), 0x656565, 0x7e7e7e},
		{3, "parrot.galah",         parrotType(11), 0xe15769, 0x938e90},
		{3, "parrot.rainbow",       parrotType(12), 0x3012ef, 0xfc7005},
	};

	public static void registerSpawnEgg(SpawnEggInfo info) throws IllegalArgumentException
	{
		if (info == null)
		{
			throw new IllegalArgumentException("SpawnEggInfo cannot be null");
		}

		if (!isValidSpawnEggID(info.eggID))
		{
			throw new IllegalArgumentException("Duplicate spawn egg with id " + info.eggID);
		}

		SPAWN_EGGS.put(info.eggID, info);
	}

	public static boolean isValidSpawnEggID(short id)
	{
		return !SPAWN_EGGS.containsKey(id);
	}

	public static SpawnEggInfo getEggInfo(short id)
	{
		return SPAWN_EGGS.get(id);
	}

	public static Collection<SpawnEggInfo> getEggInfoList()
	{
		return Collections.unmodifiableCollection(SPAWN_EGGS.values());
	}

	public static void addAllSpawnEggs()// throws RuntimeException
	{
		// Use this to index the mob strings
		String[] mobStrings = new String[]{
				Reference.MOB_OCELOT_NEP, // Index 0
				Reference.MOB_WOLF_NEP, // Index 1
				Reference.MOB_MOOSHROOM_NEP, // Index 2
				Reference.MOB_PARROT_NEP, // Index 3 - v2.0.0
				};

		int currentID;

		for (int i=0; i < SPAWN_EGG_DATA.length; i++)
		{
			currentID = i + MOD_MOBS_IDS_START;

			try {
				SpawnEggRegistry.registerSpawnEgg(new SpawnEggInfo(
						(short) currentID, // Meta ID that's going to try to load
						(mobStrings[(Integer)SPAWN_EGG_DATA[i][0]]), // Mob's internal name (e.g. Ocelot_NEC)
						(String)(SPAWN_EGG_DATA[i][1]), // The name to be displayed on the spawn egg item
						(NBTTagCompound)(SPAWN_EGG_DATA[i][2]), // Extra data to be applied to the mob
						(Integer)(SPAWN_EGG_DATA[i][3]), (Integer)(SPAWN_EGG_DATA[i][4]))); // The base and speckle colors of the spawn egg
			}
			catch(IllegalArgumentException e)
			{
				LogHelper.warn("Could not register spawn egg for entity " + (String)(SPAWN_EGG_DATA[i][1]) + " into ID " + currentID);
			}
		}
	}

	/*
	 * These methods attack custom NBT data to allow subtypes with the spawn egg
	 * I mean, otherwise, there's no point in having the eggs.
	 */

	public static NBTTagCompound addCatName(NBTTagCompound tag) {
		tag.setString("CustomName", BlackCatNames.newRandomName(new Random()));
		return tag;
	}

	public static NBTTagCompound catTypeNEC(int type) {
		NBTTagCompound tag = new NBTTagCompound();
		tag.setInteger("CatType", type);
		return tag;
	}

	public static NBTTagCompound dogTypeNEC(int type) {
		NBTTagCompound tag = new NBTTagCompound();
		tag.setInteger("DogType", type);
		return tag;
	}

	public static NBTTagCompound mooshroomTypeNEC(int type) {
		NBTTagCompound tag = new NBTTagCompound();
		tag.setInteger("MooshroomType", type);
		return tag;
	}

	//v2.0.0
	public static NBTTagCompound parrotType(int type) {
		NBTTagCompound tag = new NBTTagCompound();
		tag.setInteger("Variant", type);
		return tag;
	}

	public static void init()
	{
		// Register the item
		GameRegistry.register(SPAWN_EGG, new ResourceLocation(Reference.MOD_ID, "spawn_egg"));
		BlockDispenser.DISPENSE_BEHAVIOR_REGISTRY.putObject(SPAWN_EGG, new DispenserBehavior());
	}

	public static void inventoryRenders()
	{
		// Register meta 0 for use in the spawn tab
		Minecraft.getMinecraft().getRenderItem().getItemModelMesher().register(SpawnEggRegistry.SPAWN_EGG, 0, new ModelResourceLocation(Reference.MOD_ID + ":" + "spawn_egg", "inventory"));

		// Register the rest of them
		for (int i=0; i < SPAWN_EGG_DATA.length; i++)
		{
			Minecraft.getMinecraft().getRenderItem().getItemModelMesher().register(SpawnEggRegistry.SPAWN_EGG, i+MOD_MOBS_IDS_START, new ModelResourceLocation(Reference.MOD_ID + ":" + "spawn_egg", "inventory"));
		}
	}
}


code:
package astrotibs.notenoughpets.util;

import java.util.List;

import net.minecraft.block.Block;
import net.minecraft.entity.EntityAgeable;
import net.minecraft.item.Item;
import net.minecraft.item.ItemStack;
import net.minecraft.util.ResourceLocation;
import net.minecraft.util.math.MathHelper;
import net.minecraftforge.oredict.OreDictionary;

public class FunctionsNEP
{

	/**
	 * Input a "growing age" value--typically -24000 for a newborn and 0 for an adult,
	 * and return the median sound pitch that the animal should produce.
	 * @param entity - entity from which to extract a "growing age"
	 * @param range - the output pitch is distributed triangularly with this as the maximum offset
	 */
    public static float getScaledSoundPitch(EntityAgeable entity, float range)
    {
		return MathHelper.clamp_float(1.0F + 0.5F*(((float)entity.getGrowingAge())/-24000), 1.0F, 1.5F)
				+ (entity.worldObj.rand.nextFloat() - entity.worldObj.rand.nextFloat()) * range;
    }

    public static float getScaledSoundPitch(EntityAgeable entity)
    {
    	return getScaledSoundPitch(entity, 0.2F);
    }

    /**
     * Item equivalent of Block.getBlockFromName(String)
     */
    public static Item getItemFromName(String name)
    {
        ResourceLocation resourcelocation = new ResourceLocation(name);

        if (Item.REGISTRY.containsKey(resourcelocation))
        {
            return (Item)Item.REGISTRY.getObject(resourcelocation);
        }
        else
        {
            try
            {
                return (Item)Item.REGISTRY.getObjectById(Integer.parseInt(name));
            }
            catch (NumberFormatException var3)
            {
                return null;
            }
        }
    }

    /**
     * Checks whether your itemstack appears on a given string list of items,
     * including possibly those with meta values or which are oredict entries.
     * Number of items in the stack is irrelevant.
     */
    public static boolean isItemStackOnList(ItemStack itemStack, List<String> itemList)
    {
    	if (itemStack==null || itemStack.stackSize<=0) {return false;}

    	for (int i=0; i<itemList.size(); i++)
    	{
    		String listEntry = itemList.get(i);
    		String[] itemstackSplit = listEntry.split(":");

    		if (itemstackSplit.length < 2) {continue;} // An item needs at least a rootname and an entry name

    		String itemNamespace = itemstackSplit[0] + ":" + itemstackSplit[1];

    		if (itemstackSplit[0].equals("ore"))
    		{
    			// This is an oredict entry
    			List<ItemStack> listOfOredictItemstacks = OreDictionary.getOres(itemstackSplit[1]);
    			for (int j=0; j < listOfOredictItemstacks.size(); j++)
    			{
    				if (ItemStack.areItemStacksEqual(itemStack, listOfOredictItemstacks.get(j))) {return true;}
    			}
    		}
    		else
    		{
    			// This is not an oredict entry

    			Item tryItem = getItemFromName(itemNamespace);
        		if (tryItem==null)
        		{
        			Block tryBlock = Block.getBlockFromName(itemNamespace);

        			if (tryBlock==null)
        			{
        				continue; // Item is not an item or a block
        			}
        			else
        			{
        				// Item is a block
        				tryItem = Item.getItemFromBlock(tryBlock);

            			if (tryItem==null)
            			{
            				continue; // Item can not be obtained as a block-item
            			}
            		}
        		}

        		int tryMeta = -1;
        		if (itemstackSplit.length==3)
        		{
        			try {tryMeta = Integer.parseInt(itemstackSplit[2]);}
        			catch (Exception e) {}
        		}

        		if (
        				itemStack.getItem() == tryItem
        				&& (
        						itemstackSplit.length==2 // List entry did not specify meta, so ignore it
        						|| itemStack.getItemDamage()==tryMeta
        						)
        				)
        		{
        			return true;
        		}
    		}
    	}

    	return false;
    }
}

license: unknown


code:
package astrotibs.notenoughpets.util;

import org.apache.logging.log4j.Level;

import net.minecraftforge.fml.common.FMLLog;

public class LogHelper {

	public static void log(Level logLevel, Object object) {
		FMLLog.log(Reference.MOD_NAME, logLevel, String.valueOf(object));
	}

	public static void all(Object object) {
		log(Level.ALL, object);
		}

	public static void debug(Object object) {
		log(Level.DEBUG, object);
		}

	public static void error(Object object) {
		log(Level.ERROR, object);
		}

	public static void fatal(Object object) {
		log(Level.FATAL, object);
		}

	public static void info(Object object) {
		log(Level.INFO, object);
		}

	public static void off(Object object) {
		log(Level.OFF, object);
		}

	public static void trace(Object object) {
		log(Level.TRACE, object);
		}

	public static void warn(Object object) {
		log(Level.WARN, object);
		}

}


code:
package astrotibs.notenoughpets.util;

import net.minecraft.util.ResourceLocation;
import net.minecraft.util.SoundEvent;
import net.minecraft.util.text.TextFormatting;
import net.minecraftforge.fml.common.registry.GameRegistry;

public class Reference
{
	// Contains common constants for the mod
	public static final String MOD_ID = "notenoughpets";
	public static final String MOD_NAME = "Not Enough Pets";
	public static final String MOD_NAME_COLORIZED = TextFormatting.YELLOW + MOD_NAME;
	public static final String VERSION = "@VERSION@";
	public static final String URL = "https://www.curseforge.com/minecraft/mc-mods/not-enough-pets";
	public static final String VERSION_CHECKER_URL = "https://gitgud.io/AstroTibs/not-enough-cats/raw/1.9.4/CURRENT_VERSION"; // Updated to gitgud because i'm a good codey boi
	public static final String MOD_CHANNEL = "nep_channel";

	//public static final String MOD_CHANNEL = "necChannel";
	public static final String CLIENT_PROXY = "astrotibs.notenoughpets.proxy.ClientProxy";
	public static final String SERVER_PROXY = "astrotibs.notenoughpets.proxy.ServerProxy";
	public static final String COMMON_PROXY = "astrotibs.notenoughpets.proxy.CommonProxy";
	public static final String GUI_FACTORY = "astrotibs.notenoughpets.config.NEPGuiFactory";

	// 1.9 requires you to register SoundEvent entries
	public static final SoundEvent SE_CAT_STRAY_IDLE;
	public static final SoundEvent SE_CAT_BEG;
	public static final SoundEvent SE_CAT_EAT;
	public static final SoundEvent SE_CAT_OCELOT_IDLE;
	public static final SoundEvent SE_ENTITY_CAT_OCELOT_DEATH;

	public static final SoundEvent SE_CAT_HISS;
	public static final SoundEvent SE_DYE_COLLAR;
	public static final SoundEvent ENTITY_PARROT_AMBIENT;
	public static final SoundEvent ENTITY_PARROT_DEATH;
	public static final SoundEvent ENTITY_PARROT_EAT;
	public static final SoundEvent ENTITY_PARROT_FLY;
	public static final SoundEvent ENTITY_PARROT_HURT;
	public static final SoundEvent ENTITY_PARROT_STEP;

	public static final int VILLAGE_RADIUS_BUFFER=32; // The radius outside a village to check spawning
	public static final double SPAWN_BLOCK_OFFSET=0.5D; // If you obtained the spawn x,y,z as ints, add this offset to x and z to ensure it's in the center of the block.
	// The stray limit in a village is raised by 1 for this many blocks in a village area. Only used if "Use Village Radius To Limit Strays" is true
	public static final int VILLAGE_BLOCKS_PER_STRAY_LIMIT=500;

	public static final String MOB_OCELOT_NEP = "Ocelot_NEP";
	public static final String MOB_WOLF_NEP = "Wolf_NEP";
	public static final String MOB_MOOSHROOM_NEP = "Mooshroom_NEP";
	public static final String MOB_PARROT_NEP = "Parrot_NEP";
	public static final String ENTITY_OCELOT_CLASSPATH = "net.minecraft.entity.passive.EntityOcelot";
	public static final String ENTITY_WOLF_CLASSPATH = "net.minecraft.entity.passive.EntityWolf";
	public static final String ENTITY_MOOSHROOM_CLASSPATH = "net.minecraft.entity.passive.EntityMooshroom";

	// ------------ //
	// -- Sounds -- //
	// ------------ //

	static
	{
		SE_CAT_STRAY_IDLE = registerSound("mob.cat.stray.idle");
		SE_CAT_BEG = registerSound("mob.cat.beg");
		SE_CAT_EAT = registerSound("mob.cat.eat");
		SE_CAT_OCELOT_IDLE = registerSound("mob.cat.ocelot.idle");
		SE_ENTITY_CAT_OCELOT_DEATH = registerSound("mob.cat.ocelot.death");

		SE_CAT_HISS = registerSound("entity.cat.hiss");
		SE_DYE_COLLAR = registerSound("collar.dye");

		ENTITY_PARROT_AMBIENT = registerSound("entity.parrot.ambient");
		ENTITY_PARROT_DEATH = registerSound("entity.parrot.death");
		ENTITY_PARROT_EAT = registerSound("entity.parrot.eat");
		ENTITY_PARROT_FLY = registerSound("entity.parrot.fly");
		ENTITY_PARROT_HURT = registerSound("entity.parrot.hurt");
		ENTITY_PARROT_STEP = registerSound("entity.parrot.step");
	}

	/**
	 * Adapted from Choonster:
	 * https://github.com/Choonster-Minecraft-Mods/TestMod3/blob/1.9.4/src/main/java/choonster/testmod3/init/ModSoundEvents.java
	 */

	/**
	 * Register the {@link SoundEvent}s.
	 */
	public static void registerSounds() {
		// Dummy method to make sure the static initialiser runs
	}

	/**
	 * Register a {@link SoundEvent}.
	 *
	 * @param soundName The SoundEvent's name without the modid prefix
	 * @return The SoundEvent
	 */
	private static SoundEvent registerSound(String soundName) {
		final ResourceLocation soundID = new ResourceLocation(MOD_ID.toLowerCase(), soundName);
		return GameRegistry.register(new SoundEvent(soundID).setRegistryName(soundID));
	}

}


code:
package astrotibs.notenoughpets.util;

import net.minecraft.util.ResourceLocation;

/**
 * Created because a server won't instantiate the Ocelot/Wolf renderer classes,
 * and so no methods can count their total number of skin variations.
 */
public class SkinVariations {

	// ------------ //
	// --- CATS --- //
	// ------------ //

	public static final ResourceLocation[][] catSkinArray = new ResourceLocation[][] {

		// Vanilla skins
		{ // Type 0
			new ResourceLocation("textures/entity/cat/ocelot.png"),
			new ResourceLocation("textures/entity/cat/ocelot_tame.png")
			},
		{ // Type 1
			new ResourceLocation("textures/entity/cat/black.png"),
			new ResourceLocation("textures/entity/cat/black_tame.png")
			},
		{ // Type 2
			new ResourceLocation("textures/entity/cat/red.png"),
			new ResourceLocation("textures/entity/cat/red_tame.png")
			},
		{ // Type 3
			new ResourceLocation("textures/entity/cat/siamese.png"),
			new ResourceLocation("textures/entity/cat/siamese_tame.png")
			},

		// Official skins from other versions/ports
		{ // Type 4
			new ResourceLocation("textures/entity/cat/british_shorthair.png"),
			new ResourceLocation("textures/entity/cat/british_shorthair_tame.png")
			},
		{ // Type 5
			new ResourceLocation("textures/entity/cat/calico.png"),
			new ResourceLocation("textures/entity/cat/calico_tame.png")
			},
		{ // Type 6
			new ResourceLocation("textures/entity/cat/persian.png"),
			new ResourceLocation("textures/entity/cat/persian_tame.png")
			},
		{ // Type 7
			new ResourceLocation("textures/entity/cat/ragdoll.png"),
			new ResourceLocation("textures/entity/cat/ragdoll_tame.png")
			},
		{ // Type 8
			new ResourceLocation("textures/entity/cat/white.png"),
			new ResourceLocation("textures/entity/cat/white_tame.png")
			},
		{ // Type 9
			new ResourceLocation("textures/entity/cat/jellie.png"),
			new ResourceLocation("textures/entity/cat/jellie_tame.png")
			},
		{ // Type 10
			new ResourceLocation("textures/entity/cat/all_black.png"),
			new ResourceLocation("textures/entity/cat/all_black_tame.png")
			},
		{ // Type 11
			new ResourceLocation("textures/entity/cat/tabby.png"),
			new ResourceLocation("textures/entity/cat/tabby_tame.png")
			},
		{ // Type 12
			new ResourceLocation("textures/entity/cat/gray_tabby.png"),
			new ResourceLocation("textures/entity/cat/gray_tabby_tame.png")
			},

		// Custom skins by AstroTibs
		{ // Type 13
			new ResourceLocation(Reference.MOD_ID, "textures/entity/cat/juno.png"),
			new ResourceLocation(Reference.MOD_ID, "textures/entity/cat/juno_tame.png")
			},
		{ // Type 14
			new ResourceLocation(Reference.MOD_ID, "textures/entity/cat/willie.png"),
			new ResourceLocation(Reference.MOD_ID, "textures/entity/cat/willie_tame.png")
			},
		{ // Type 15
			new ResourceLocation(Reference.MOD_ID, "textures/entity/cat/lily.png"),
			new ResourceLocation(Reference.MOD_ID, "textures/entity/cat/lily_tame.png")
			},

		// Additional skins
		{ // Type 16 by Asher Applegate
			new ResourceLocation(Reference.MOD_ID, "textures/entity/cat/boo.png"),
			new ResourceLocation(Reference.MOD_ID, "textures/entity/cat/boo_tame.png")
			},
		{ // Type 17 - Winslow from Minecraft: Story Mode Season Two by AstroTibs
			new ResourceLocation(Reference.MOD_ID, "textures/entity/cat/winslow.png"),
			new ResourceLocation(Reference.MOD_ID, "textures/entity/cat/winslow_tame.png")
			},
		{ // Type 18 by Shahayhay
			new ResourceLocation(Reference.MOD_ID, "textures/entity/cat/blitzkrieg.png"),
			new ResourceLocation(Reference.MOD_ID, "textures/entity/cat/blitzkrieg_tame.png")
			},
		{ // Type 19 by Chara Violet
			new ResourceLocation(Reference.MOD_ID, "textures/entity/cat/princess.png"),
			new ResourceLocation(Reference.MOD_ID, "textures/entity/cat/princess_tame.png")
			},
		{ // Type 20 by _MashedTaters_
			new ResourceLocation(Reference.MOD_ID, "textures/entity/cat/cocoa.png"),
			new ResourceLocation(Reference.MOD_ID, "textures/entity/cat/cocoa_tame.png")
			},
	};

	// ------------ //
	// --- DOGS --- //
	// ------------ //

	public static final ResourceLocation[][] dogSkinArray = new ResourceLocation[][] {

		// Vanilla skins
		{ // Type 0
			new ResourceLocation("textures/entity/wolf/wolf.png"),
			new ResourceLocation("textures/entity/wolf/wolf_angry.png"),
			new ResourceLocation("textures/entity/wolf/wolf_tame.png")
			},

		// Official skins from other versions/ports
		{ // Type 1
			new ResourceLocation(Reference.MOD_ID, "textures/entity/dog/blocco.png"),
			new ResourceLocation(Reference.MOD_ID, "textures/entity/dog/blocco_angry.png"),
			new ResourceLocation(Reference.MOD_ID, "textures/entity/dog/blocco_tame.png")
			},

		// User-submitted skins
		{ // Type 2 by inkdear
			new ResourceLocation(Reference.MOD_ID, "textures/entity/dog/brown_wolf.png"),
			new ResourceLocation(Reference.MOD_ID, "textures/entity/dog/brown_wolf_angry.png"),
			new ResourceLocation(Reference.MOD_ID, "textures/entity/dog/brown_wolf_tame.png")
			},
		{ // Type 3 by inkdear
			new ResourceLocation(Reference.MOD_ID, "textures/entity/dog/cream_wolf.png"),
			new ResourceLocation(Reference.MOD_ID, "textures/entity/dog/cream_wolf_angry.png"),
			new ResourceLocation(Reference.MOD_ID, "textures/entity/dog/cream_wolf_tame.png")
			},
		{ // Type 4 by AstroTibs
			new ResourceLocation(Reference.MOD_ID, "textures/entity/dog/white_terrier.png"),
			new ResourceLocation(Reference.MOD_ID, "textures/entity/dog/white_terrier_angry.png"),
			new ResourceLocation(Reference.MOD_ID, "textures/entity/dog/white_terrier_tame.png")
			},
		{ // Type 5 by AstroTibs
			new ResourceLocation(Reference.MOD_ID, "textures/entity/dog/red_shiba_inu.png"),
			new ResourceLocation(Reference.MOD_ID, "textures/entity/dog/red_shiba_inu_angry.png"),
			new ResourceLocation(Reference.MOD_ID, "textures/entity/dog/red_shiba_inu_tame.png")
			},
		{ // Type 6 by AstroTibs
			new ResourceLocation(Reference.MOD_ID, "textures/entity/dog/beagle.png"),
			new ResourceLocation(Reference.MOD_ID, "textures/entity/dog/beagle_angry.png"),
			new ResourceLocation(Reference.MOD_ID, "textures/entity/dog/beagle_tame.png")
			},
		{ // Type 7 by AstroTibs
			new ResourceLocation(Reference.MOD_ID, "textures/entity/dog/pug.png"),
			new ResourceLocation(Reference.MOD_ID, "textures/entity/dog/pug_angry.png"),
			new ResourceLocation(Reference.MOD_ID, "textures/entity/dog/pug_tame.png")
			},
		{ // Type 8 by AstroTibs
			new ResourceLocation(Reference.MOD_ID, "textures/entity/dog/border_collie.png"),
			new ResourceLocation(Reference.MOD_ID, "textures/entity/dog/border_collie_angry.png"),
			new ResourceLocation(Reference.MOD_ID, "textures/entity/dog/border_collie_tame.png")
			},
		{ // Type 9 by AstroTibs
			new ResourceLocation(Reference.MOD_ID, "textures/entity/dog/boston_terrier.png"),
			new ResourceLocation(Reference.MOD_ID, "textures/entity/dog/boston_terrier_angry.png"),
			new ResourceLocation(Reference.MOD_ID, "textures/entity/dog/boston_terrier_tame.png")
			},
		{ // Type 10 by AstroTibs
			new ResourceLocation(Reference.MOD_ID, "textures/entity/dog/st_bernard.png"),
			new ResourceLocation(Reference.MOD_ID, "textures/entity/dog/st_bernard_angry.png"),
			new ResourceLocation(Reference.MOD_ID, "textures/entity/dog/st_bernard_tame.png")
			},
		{ // Type 11 by Tild09
			new ResourceLocation(Reference.MOD_ID, "textures/entity/dog/golden_retriever.png"),
			new ResourceLocation(Reference.MOD_ID, "textures/entity/dog/golden_retriever_angry.png"),
			new ResourceLocation(Reference.MOD_ID, "textures/entity/dog/golden_retriever_tame.png")
			},
		{ // Type 12 by Tild09
			new ResourceLocation(Reference.MOD_ID, "textures/entity/dog/siberian_husky.png"),
			new ResourceLocation(Reference.MOD_ID, "textures/entity/dog/siberian_husky_angry.png"),
			new ResourceLocation(Reference.MOD_ID, "textures/entity/dog/siberian_husky_tame.png")
			},
	};

	// ------------------ //
	// --- MOOSHROOMS --- //
	// ------------------ //

	public static final ResourceLocation[] mooshroomSkinArray = new ResourceLocation[] {

			// Vanilla
			new ResourceLocation("textures/entity/cow/red_mooshroom.png"), // Type 0

			// Official skins from other versions/ports
			new ResourceLocation("textures/entity/cow/brown_mooshroom.png"), // Type 1
	};

	// --------------- //
	// --- PARROTS --- //
	// --------------- //

	public static final ResourceLocation[] parrotSkinArray = new ResourceLocation[] {

			// Vanilla
			new ResourceLocation("textures/entity/parrot/parrot_red_blue.png"), // Type 0
			new ResourceLocation("textures/entity/parrot/parrot_blue.png"), // Type 1
			new ResourceLocation("textures/entity/parrot/parrot_green.png"), // Type 2
			new ResourceLocation("textures/entity/parrot/parrot_yellow_blue.png"), // Type 3
			new ResourceLocation("textures/entity/parrot/parrot_grey.png"), // Type 4

			// Custom skins by AstroTibs
			new ResourceLocation(Reference.MOD_ID, "textures/entity/parrot/parrot_golden.png"), // Type 5
			new ResourceLocation(Reference.MOD_ID, "textures/entity/parrot/parrot_white.png"), // Type 6
			new ResourceLocation(Reference.MOD_ID, "textures/entity/parrot/parrot_black.png"), // Type 7
			new ResourceLocation(Reference.MOD_ID, "textures/entity/parrot/parrot_rosy_faced.png"), // Type 8
			new ResourceLocation(Reference.MOD_ID, "textures/entity/parrot/parrot_dusky.png"), // Type 9
			new ResourceLocation(Reference.MOD_ID, "textures/entity/parrot/parrot_african_grey.png"), // Type 10
			new ResourceLocation(Reference.MOD_ID, "textures/entity/parrot/parrot_galah.png"), // Type 11
			new ResourceLocation(Reference.MOD_ID, "textures/entity/parrot/parrot_rainbow.png"), // Type 12
	};

}


code:
package astrotibs.notenoughpets.version;

import astrotibs.notenoughpets.util.Reference;
import net.minecraft.util.text.TextComponentString;
import net.minecraft.util.text.TextFormatting;
import net.minecraftforge.common.MinecraftForge;
import net.minecraftforge.fml.common.eventhandler.EventPriority;
import net.minecraftforge.fml.common.eventhandler.SubscribeEvent;
import net.minecraftforge.fml.common.gameevent.TickEvent.PlayerTickEvent;

public class DevVersionWarning
{
	public static DevVersionWarning instance = new DevVersionWarning();

	@SubscribeEvent(priority=EventPriority.NORMAL, receiveCanceled=true)
	public void onPlayerTickEvent(PlayerTickEvent event)
	{
		if (event.player.worldObj.isRemote)
		{
    		event.player.addChatComponentMessage(
            		new TextComponentString(
            				"You're using a "
            				+ TextFormatting.RED + "development version" + TextFormatting.RESET + " of " + Reference.MOD_NAME + "."
            		 ));

    		event.player.addChatComponentMessage(
            		new TextComponentString(
            				TextFormatting.RED + "This version is not meant for public use."
            		 ));

    		MinecraftForge.EVENT_BUS.unregister(instance);
    	}
	}
}


code:
package astrotibs.notenoughpets.version;

import java.io.InputStream;
import java.net.URL;
import java.nio.charset.Charset;

import org.apache.commons.io.IOUtils;

import astrotibs.notenoughpets.config.GeneralConfig;
import astrotibs.notenoughpets.util.LogHelper;
import astrotibs.notenoughpets.util.Reference;
import net.minecraft.util.text.TextComponentString;
import net.minecraft.util.text.TextFormatting;
import net.minecraftforge.common.ForgeHooks;
import net.minecraftforge.common.MinecraftForge;
import net.minecraftforge.fml.common.eventhandler.EventPriority;
import net.minecraftforge.fml.common.eventhandler.SubscribeEvent;
import net.minecraftforge.fml.common.gameevent.TickEvent.Phase;
import net.minecraftforge.fml.common.gameevent.TickEvent.PlayerTickEvent;

/**
 * Adapted from Jabelar's tutorials
 * http://jabelarminecraft.blogspot.com/p/minecraft-forge-1721710-making-mod.html
 * Parallel threading provided by Roadhog360
 * @author AstroTibs
 */
public class VersionChecker extends Thread
{
	public static VersionChecker instance = new VersionChecker();

	private static boolean isLatestVersion = false;
	private static boolean warnaboutfailure = false;
    private static String latestVersion = "";
    private static boolean isUpdateCheckFinished = false;
    private static boolean quitChecking = false;
    private static boolean hasThreadStarted = false;

    private static final String CHECK_FOR_VERSIONS_AT_URL = "You can check for new versions at "+Reference.URL;

	@Override
	public void run()
	{
        InputStream in = null;

        try
        {
        	URL url = new URL(Reference.VERSION_CHECKER_URL);
            in = url.openStream();
        }
        catch (Exception e)
        {
        	if (!warnaboutfailure)
        	{
            	LogHelper.error("Could not connect with server to compare " + Reference.MOD_NAME + " version");
        		LogHelper.error(CHECK_FOR_VERSIONS_AT_URL);
            	warnaboutfailure=true;
        	}
        }

        try
        {
            latestVersion = IOUtils.readLines(in, Charset.defaultCharset()).get(0);
        }
        catch (Exception e)
        {
        	if (!warnaboutfailure)
        	{
        		LogHelper.error("Failed to compare " + Reference.MOD_NAME + " version");
        		LogHelper.error(CHECK_FOR_VERSIONS_AT_URL);
        		warnaboutfailure=true;
        	}
        }
        finally
        {
            IOUtils.closeQuietly(in);
        }

        isLatestVersion = Reference.VERSION.equals(latestVersion);

        if (!this.isLatestVersion() && !latestVersion.equals("") && !latestVersion.equals(null))
        {
        	LogHelper.info("This version of "+Reference.MOD_NAME_COLORIZED+" (" + Reference.VERSION + ") differs from the latest version: " + latestVersion);
        }

        isUpdateCheckFinished = true;
    }

    public boolean isLatestVersion()
    {
    	return isLatestVersion;
    }

    public String getLatestVersion()
    {
    	return latestVersion;
    }

    /**
     * PlayerTickEvent is going to be used for version checking.
     * @param event
     */

    @SubscribeEvent(priority=EventPriority.NORMAL, receiveCanceled=true)
    public void onPlayerTickEvent(PlayerTickEvent event)
    {
    	// Used to repeat the version check
    	if (
    			(latestVersion.equals(null) || latestVersion.equals(""))
    			&& !warnaboutfailure // Skip the "run" if a failure was detected
    			&& !hasThreadStarted
    			)
    	{
    		start();
    		hasThreadStarted=true;
    	}

    	if (
    			event.player.ticksExisted>=200
    			&& !quitChecking
    			&& isUpdateCheckFinished)
    	{
    		LogHelper.error(Reference.MOD_NAME+" version check failed.");
    		LogHelper.error(CHECK_FOR_VERSIONS_AT_URL);
    		quitChecking=true;
    	}

        if (
        		event.player.worldObj.isRemote
        		&& event.phase == Phase.END // Stops doubling the checks unnecessarily
        		&& event.player.ticksExisted>=30
        		&& isUpdateCheckFinished
        		&& !quitChecking
        		)
        {
            quitChecking=true;

        	// Ordinary version checker
        	if (
            		GeneralConfig.versionChecker
            		&& !instance.isLatestVersion()
            		&& !latestVersion.equals(null)
            		&& !latestVersion.equals("")
            		&& !(Reference.VERSION).contains("DEV")
        			)
        	{
                event.player.addChatComponentMessage(
                		new TextComponentString(
                				Reference.MOD_NAME_COLORIZED +
                				TextFormatting.RESET + " version " + TextFormatting.YELLOW + this.getLatestVersion() + TextFormatting.RESET +
                				" is available! Get it at:"
                		 ));
                event.player.addChatComponentMessage(ForgeHooks.newChatWithLinks(Reference.URL));
        	}
        }

        if (quitChecking || !GeneralConfig.versionChecker)
        {
            MinecraftForge.EVENT_BUS.unregister(instance);
            return;
        }
    }
}


code:
# Creative Tab
itemGroup.notenoughpets=Not Enough Pets Spawn Eggs

# Entities
entity.notenoughpets.Ocelot_NEP.name=Ocelot
entity.notenoughpets.Wolf_NEP.name=Wolf
entity.notenoughpets.Mooshroom_NEP.name=Mooshroom
entity.notenoughpets.Parrot_NEP.name=Parrot

# Spawn Eggs
eggdisplay.notenoughpets.cat.ocelot.name=Ocelot (NEP)
eggdisplay.notenoughpets.cat.tuxedo.name=Tuxedo Cat
eggdisplay.notenoughpets.cat.redtabby.name=Red Tabby Cat
eggdisplay.notenoughpets.cat.siamese.name=Siamese Cat
eggdisplay.notenoughpets.cat.britishshorthair.name=British Shorthair Cat
eggdisplay.notenoughpets.cat.calico.name=Calico Cat
eggdisplay.notenoughpets.cat.persian.name=Persian Cat
eggdisplay.notenoughpets.cat.ragdoll.name=Ragdoll Cat
eggdisplay.notenoughpets.cat.white.name=White Cat
eggdisplay.notenoughpets.cat.jellie.name=Jellie Cat
eggdisplay.notenoughpets.cat.black.name=Black Cat
eggdisplay.notenoughpets.cat.black_named.name=Named Black Cat
eggdisplay.notenoughpets.cat.browntabby.name=Brown Tabby Cat
eggdisplay.notenoughpets.cat.graytabby.name=Gray Tabby Cat
eggdisplay.notenoughpets.cat.juno.name=Juno Cat
eggdisplay.notenoughpets.cat.willie.name=Willie Cat
eggdisplay.notenoughpets.cat.lily.name=Lily Cat
eggdisplay.notenoughpets.cat.boo.name=Boo Cat
eggdisplay.notenoughpets.cat.winslow.name=Winslow Cat
eggdisplay.notenoughpets.cat.blitzkrieg.name=Blitzkrieg Cat
eggdisplay.notenoughpets.cat.princess.name=Princess Cat
eggdisplay.notenoughpets.cat.cocoa.name=Cocoa Cat

eggdisplay.notenoughpets.dog.wolf.name=Wolf (NEP)
eggdisplay.notenoughpets.dog.blocco.name=Blocco Dog
eggdisplay.notenoughpets.dog.brown.name=Brown Wolf
eggdisplay.notenoughpets.dog.cream.name=Cream Wolf
eggdisplay.notenoughpets.dog.white_terrier.name=White Terrier
eggdisplay.notenoughpets.dog.red_shiba_inu.name=Red Shiba Inu
eggdisplay.notenoughpets.dog.beagle.name=Beagle
eggdisplay.notenoughpets.dog.pug.name=Pug
eggdisplay.notenoughpets.dog.border_collie.name=Border Collie
eggdisplay.notenoughpets.dog.boston_terrier.name=Boston Terrier
eggdisplay.notenoughpets.dog.st_bernard.name=St. Bernard
eggdisplay.notenoughpets.dog.golden_retriever.name=Golden Retriever
eggdisplay.notenoughpets.dog.siberian_husky.name=Siberian Husky

eggdisplay.notenoughpets.mooshroom.red.name=Mooshroom (NEP)
eggdisplay.notenoughpets.mooshroom.brown.name=Brown Mooshroom

eggdisplay.notenoughpets.parrot.red.name=Scarlet Parrot
eggdisplay.notenoughpets.parrot.blue.name=Hyacinth Parrot
eggdisplay.notenoughpets.parrot.green.name=Great Green Parrot
eggdisplay.notenoughpets.parrot.cyan.name=Blue-And-Yellow Parrot
eggdisplay.notenoughpets.parrot.gray.name=Cockatiel Parrot
eggdisplay.notenoughpets.parrot.golden.name=Golden Parrot
eggdisplay.notenoughpets.parrot.white.name=White Parrot
eggdisplay.notenoughpets.parrot.black.name=Black Parrot
eggdisplay.notenoughpets.parrot.rosy_faced.name=Rosy-Faced Parrot
eggdisplay.notenoughpets.parrot.dusky.name=Dusky Parrot
eggdisplay.notenoughpets.parrot.african_grey.name=African Grey Parrot
eggdisplay.notenoughpets.parrot.galah.name=Galah Parrot
eggdisplay.notenoughpets.parrot.rainbow.name=Rainbow Parrot


category: neutral


code:
###############################################################################
# Set default behavior to automatically normalize line endings.
###############################################################################
* text=auto

###############################################################################
# Set default behavior for command prompt diff.
#
# This is need for earlier builds of msysgit that does not have it on by
# default for csharp files.
# Note: This is only used by command line
###############################################################################
#*.cs     diff=csharp

###############################################################################
# Set the merge driver for project and solution files
#
# Merging from the command prompt will add diff markers to the files if there
# are conflicts (Merging from VS is not affected by the settings below, in VS
# the diff markers are never inserted). Diff markers may cause the following
# file extensions to fail to load in VS. An alternative would be to treat
# these files as binary and thus will always conflict and require user
# intervention with every merge. To do so, just uncomment the entries below
###############################################################################
#*.sln       merge=binary
#*.csproj    merge=binary
#*.vbproj    merge=binary
#*.vcxproj   merge=binary
#*.vcproj    merge=binary
#*.dbproj    merge=binary
#*.fsproj    merge=binary
#*.lsproj    merge=binary
#*.wixproj   merge=binary
#*.modelproj merge=binary
#*.sqlproj   merge=binary
#*.wwaproj   merge=binary

###############################################################################
# behavior for image files
#
# image files are treated as binary by default.
###############################################################################
#*.jpg   binary
#*.png   binary
#*.gif   binary

###############################################################################
# diff behavior for common document formats
#
# Convert binary document formats to text before diffing them. This feature
# is only available from the command line. Turn it on by uncommenting the
# entries below.
###############################################################################
#*.doc   diff=astextplain
#*.DOC   diff=astextplain
#*.docx  diff=astextplain
#*.DOCX  diff=astextplain
#*.dot   diff=astextplain
#*.DOT   diff=astextplain
#*.pdf   diff=astextplain
#*.PDF   diff=astextplain
#*.rtf   diff=astextplain
#*.RTF   diff=astextplain

repo_name: reireirow/rimworld

path: .gitattributes


code:
## Ignore Visual Studio temporary files, build results, and
## files generated by popular Visual Studio add-ons.
##
## Get latest from https://github.com/github/gitignore/blob/master/VisualStudio.gitignore

# User-specific files
*.rsuser
*.suo
*.user
*.userosscache
*.sln.docstates

# User-specific files (MonoDevelop/Xamarin Studio)
*.userprefs

# Build results
[Dd]ebug/
[Dd]ebugPublic/
[Rr]elease/
[Rr]eleases/
x64/
x86/
[Aa][Rr][Mm]/
[Aa][Rr][Mm]64/
bld/
[Bb]in/
[Oo]bj/
[Ll]og/

# Visual Studio 2015/2017 cache/options directory
.vs/
# Uncomment if you have tasks that create the project's static files in wwwroot
#wwwroot/

# Visual Studio 2017 auto generated files
Generated\ Files/

# MSTest test Results
[Tt]est[Rr]esult*/
[Bb]uild[Ll]og.*

# NUNIT
*.VisualState.xml
TestResult.xml

# Build Results of an ATL Project
[Dd]ebugPS/
[Rr]eleasePS/
dlldata.c

# Benchmark Results
BenchmarkDotNet.Artifacts/

# .NET Core
project.lock.json
project.fragment.lock.json
artifacts/

# StyleCop
StyleCopReport.xml

# Files built by Visual Studio
*_i.c
*_p.c
*_h.h
*.ilk
*.meta
*.obj
*.iobj
*.pch
*.pdb
*.ipdb
*.pgc
*.pgd
*.rsp
*.sbr
*.tlb
*.tli
*.tlh
*.tmp
*.tmp_proj
*_wpftmp.csproj
*.log
*.vspscc
*.vssscc
.builds
*.pidb
*.svclog
*.scc

# Chutzpah Test files
_Chutzpah*

# Visual C++ cache files
ipch/
*.aps
*.ncb
*.opendb
*.opensdf
*.sdf
*.cachefile
*.VC.db
*.VC.VC.opendb

# Visual Studio profiler
*.psess
*.vsp
*.vspx
*.sap

# Visual Studio Trace Files
*.e2e

# TFS 2012 Local Workspace
$tf/

# Guidance Automation Toolkit
*.gpState

# ReSharper is a .NET coding add-in
_ReSharper*/
*.[Rr]e[Ss]harper
*.DotSettings.user

# JustCode is a .NET coding add-in
.JustCode

# TeamCity is a build add-in
_TeamCity*

# DotCover is a Code Coverage Tool
*.dotCover

# AxoCover is a Code Coverage Tool
.axoCover/*
!.axoCover/settings.json

# Visual Studio code coverage results
*.coverage
*.coveragexml

# NCrunch
_NCrunch_*
.*crunch*.local.xml
nCrunchTemp_*

# MightyMoose
*.mm.*
AutoTest.Net/

# Web workbench (sass)
.sass-cache/

# Installshield output folder
[Ee]xpress/

# DocProject is a documentation generator add-in
DocProject/buildhelp/
DocProject/Help/*.HxT
DocProject/Help/*.HxC
DocProject/Help/*.hhc
DocProject/Help/*.hhk
DocProject/Help/*.hhp
DocProject/Help/Html2
DocProject/Help/html

# Click-Once directory
publish/

# Publish Web Output
*.[Pp]ublish.xml
*.azurePubxml
# Note: Comment the next line if you want to checkin your web deploy settings,
# but database connection strings (with potential passwords) will be unencrypted
*.pubxml
*.publishproj

# Microsoft Azure Web App publish settings. Comment the next line if you want to
# checkin your Azure Web App publish settings, but sensitive information contained
# in these scripts will be unencrypted
PublishScripts/

# NuGet Packages
*.nupkg
# The packages folder can be ignored because of Package Restore
**/[Pp]ackages/*
# except build/, which is used as an MSBuild target.
!**/[Pp]ackages/build/
# Uncomment if necessary however generally it will be regenerated when needed
#!**/[Pp]ackages/repositories.config
# NuGet v3's project.json files produces more ignorable files
*.nuget.props
*.nuget.targets

# Microsoft Azure Build Output
csx/
*.build.csdef

# Microsoft Azure Emulator
ecf/
rcf/

# Windows Store app package directories and files
AppPackages/
BundleArtifacts/
Package.StoreAssociation.xml
_pkginfo.txt
*.appx

# Visual Studio cache files
# files ending in .cache can be ignored
*.[Cc]ache
# but keep track of directories ending in .cache
!?*.[Cc]ache/

# Others
ClientBin/
~$*
*~
*.dbmdl
*.dbproj.schemaview
*.jfm
*.pfx
*.publishsettings
orleans.codegen.cs

# Including strong name files can present a security risk
# (https://github.com/github/gitignore/pull/2483#issue-259490424)
#*.snk

# Since there are multiple workflows, uncomment next line to ignore bower_components
# (https://github.com/github/gitignore/pull/1529#issuecomment-104372622)
#bower_components/

# RIA/Silverlight projects
Generated_Code/

# Backup & report files from converting an old project file
# to a newer Visual Studio version. Backup files are not needed,
# because we have git ;-)
_UpgradeReport_Files/
Backup*/
UpgradeLog*.XML
UpgradeLog*.htm
ServiceFabricBackup/
*.rptproj.bak

# SQL Server files
*.mdf
*.ldf
*.ndf

# Business Intelligence projects
*.rdl.data
*.bim.layout
*.bim_*.settings
*.rptproj.rsuser
*- Backup*.rdl

# Microsoft Fakes
FakesAssemblies/

# GhostDoc plugin setting file
*.GhostDoc.xml

# Node.js Tools for Visual Studio
.ntvs_analysis.dat
node_modules/

# Visual Studio 6 build log
*.plg

# Visual Studio 6 workspace options file
*.opt

# Visual Studio 6 auto-generated workspace file (contains which files were open etc.)
*.vbw

# Visual Studio LightSwitch build output
**/*.HTMLClient/GeneratedArtifacts
**/*.DesktopClient/GeneratedArtifacts
**/*.DesktopClient/ModelManifest.xml
**/*.Server/GeneratedArtifacts
**/*.Server/ModelManifest.xml
_Pvt_Extensions

# Paket dependency manager
.paket/paket.exe
paket-files/

# FAKE - F# Make
.fake/

# JetBrains Rider
.idea/
*.sln.iml

# CodeRush personal settings
.cr/personal

# Python Tools for Visual Studio (PTVS)
__pycache__/
*.pyc

# Cake - Uncomment if you are using it
# tools/**
# !tools/packages.config

# Tabs Studio
*.tss

# Telerik's JustMock configuration file
*.jmconfig

# BizTalk build output
*.btp.cs
*.btm.cs
*.odx.cs
*.xsd.cs

# OpenCover UI analysis results
OpenCover/

# Azure Stream Analytics local run output
ASALocalRun/

# MSBuild Binary and Structured Log
*.binlog

# NVidia Nsight GPU debugger configuration file
*.nvuser

# MFractors (Xamarin productivity tool) working folder
.mfractor/

# Local History for Visual Studio
.localhistory/

# BeatPulse healthcheck temp database
healthchecksdb
/Source/Patches/PawnAnimationPatches/HarmonyPatch_Pawn_DrawTracker.cs
/Source/Patches/PawnAnimationPatches/HarmonyPatch_PawnRotation.cs
/Source/Patches/PawnAnimationPatches/HarmonyPatch_PawnRenderer.cs
/Source/Patches/OtherModPatches/HarmonyPatch_ShowHairWithHats.cs
/Source/Patches/OtherModPatches/HarmonyPatch_FacialAnimation.cs
/Source/Patches/OtherModPatches/HarmonyPatch_DontShaveYourHead.cs
/Source/Patches/OtherModPatches/HarmonyPatch_CSL.cs
/Source/Patches/OtherModPatches/HarmonyPatch_AlienRace.cs
/Source/Patches/ThingAnimationPatches/HarmonyPatch_ThingDrawAt.cs
/Defs/AnimationDefs/Animations_SexToys.xml
/1.5/Defs/AnimationDefs/BasicBestiality/HumanRotatedOffset.xml
/1.5/Defs/AnimationDefs/BasicBestiality/BasicBestiality4v1.xml
/1.5/Defs/AnimationDefs/BasicBestiality/BasicBestiality3v1.xml
/1.5/Defs/AnimationDefs/BasicBestiality/BasicBestiality2v1.xml
/1.5/Defs/AnimationDefs/BasicBestiality/BasicBestiality1v1.xml
/1.5/Defs/AnimationDefs/BasicBestiality/!BasicBestiality.xml
/1.5/Defs/TestDoNotPush
/1.5/Textures/AnimationProps/BEV

path: .gitignore