public static final String dependencies = "required-after:Thaumcraft@[5.1.6,);required-after:Baubles@[1.1.1.0,);required-after:DummyCore@[2.2.189.0,);"; public static final String modid = "thaumicbases"; public static final String name = "Thaumic Bases"; public static final String version = "2.1.189.32"; public class RevolverUpgrade {
	
	public static RevolverUpgrade[] allUpgrades = new RevolverUpgrade[24];
	public static Hashtable<String, Integer> textToIntMapping = new Hashtable<String, Integer>();
	public static Hashtable<Integer, String> intToTextMapping = new Hashtable<Integer, String>();
	
	public int maxLevel;
	public final int id;
	public final String text_id;
	public int instability;
	
	public static final ResourceLocation eldritchTextures = new ResourceLocation("thaumicbases","textures/items/revolver/revolverDarkMetalEldritch.png");
	public static final ResourceLocation primalTextures = new ResourceLocation("thaumicbases","textures/items/revolver/revolverGunPrimalUV.png");
	public static final ResourceLocation taintedTextures = new ResourceLocation("thaumicbases","textures/items/revolver/revolverGunTaintedUV.png");
	public static final ResourceLocation voidTextures = new ResourceLocation("thaumicbases","textures/items/revolver/revolverHandleVoidUV.png");
	
	public final ArrayList<RevolverUpgrade> conflicts = new ArrayList<RevolverUpgrade>();
	
	public RevolverUpgrade(int id, String name)
	{
		text_id = name;
		this.id = id;
		
		if(id < allUpgrades.length && allUpgrades[id] != null)
		{
			FMLLog.warning("[TB]Attempting to register revolver upgrade "+name+"["+id+"], but the ID is already occupied by "+allUpgrades[id].text_id+"["+allUpgrades[id].id+"], ignoring.", new Object[0]);
			return;
		}
		
		if (id >= allUpgrades.length)
		{
			RevolverUpgrade[] copied = new RevolverUpgrade[allUpgrades.length+1];
			System.arraycopy(allUpgrades, 0, copied, 0, allUpgrades.length);
			allUpgrades = copied;
		}
		
		allUpgrades[id] = this;
	}
	
	public String getName()
	{
		return StatCollector.translateToLocal("revolverUpgrade."+text_id+".name");
	}
	
	public int getID()
	{
		return id;
	}
	
	public String getTextID()
	{
		return text_id;
	}
	
	public int getMaxLevel()
	{
		return maxLevel;
	}
	
	public RevolverUpgrade setMaxLevel(int i)
	{
		maxLevel = i;
		return this;
	}
	
	public boolean conflictsWith(RevolverUpgrade upgrade)
	{
		return conflicts.contains(upgrade);
	}
	
	public RevolverUpgrade addConflict(RevolverUpgrade... upgrade)
	{
		for(RevolverUpgrade rUpgr : upgrade)
		{
			if(!conflicts.contains(rUpgr))
				conflicts.add(rUpgr);
			
			if(!rUpgr.conflicts.contains(this))
				rUpgr.conflicts.add(this);
		}
		
		return this;
	}
	
	public int getInstabilityForLevel(int level)
	{
		return instability * level;
	}
	
	public RevolverUpgrade setInstabilityPerLevel(int newValue)
	{
		instability = newValue;
		return this;
	}
	
	/**
	 * Modifies the revolver damage - pass 0
	 * @param base - the entity to modify against. null means that the modification is not applied for the attack, and rather is applied for the information.
	 * @param revolver - the revolver
	 * @param currentModification - damage BEFORE the modification
	 * @param modLevel - the level of this modifier
	 * @return the new damage value
	 */
	public float modifyDamage_start(EntityLivingBase base, ItemStack revolver, float currentModification, int modLevel)
	{
		if(base != null)
		{
			if(this == power)
				return (float) (currentModification*(Math.pow(1.1F, modLevel)));
			
			if(this == silver && (base.getCreatureAttribute() == EnumCreatureAttribute.UNDEAD || isBMEntity(base) || (base instanceof EntityPlayer && isWerewolf(EntityPlayer.class.cast(base)))))
				return (float) (currentModification*(Math.pow(1.2F, modLevel)));
		
			if(this == atropodsBane && base.getCreatureAttribute() == EnumCreatureAttribute.ARTHROPOD)
				return (float) (currentModification*(Math.pow(1.2F, modLevel)));
			
			if(this == eldritchBane && (base instanceof IEldritchMob || base instanceof EntityEnderman))
				return (float) (currentModification*(Math.pow(1.2F, modLevel)));
			
			if(this == dueling && base instanceof EntityPlayer)
				return (float) (currentModification*(Math.pow(1.2F, modLevel)));
			
			if(this == eldritch)
			{
				if(base instanceof IBossDisplayData)
					return (float) (currentModification*(Math.pow(1.3F, modLevel)));
				return currentModification / 1.2F;
			}
			
			if(this == piercig)
				return currentModification * 1.1F;
			
			if(this == tainted)
			{
				if(base instanceof ITaintedMob)
					return currentModification / 1.6F;
				return (float) (currentModification*(Math.pow(1.2F, modLevel)));
			}
		}
		return currentModification;
	}
	
	/**
	 * Modifies the revolver damage - pass 1
	 * @param base - the entity to modify against. null means that the modification is not applied for the attack, and rather is applied for the information.
	 * @param revolver - the revolver
	 * @param currentModification - damage BEFORE the modification
	 * @param modLevel - the level of this modifier
	 * @return the new damage value
	 */
	public float modifyDamage_end(EntityLivingBase base, ItemStack revolver, float currentModification, int modLevel)
	{
		if(this == primal)
			return currentModification * 2;
		
		return currentModification;
	}
	
	/**
	 * Used to check if the bullet is destroyed.
	 * @param base the entity damaged
	 * @param user the shooter(can be null?)
	 * @param revolver the revolver
	 * @param damageDealt the damage dealt
	 * @param modLevel the level of this upgrade
	 * @return true to destroy bulled, false otherwise
	 */
	public boolean afterhit(EntityLivingBase base, EntityPlayer user,ItemStack revolver,final float damageDealt, int modLevel)
	{
		if(this == tainted)
			if(base.worldObj.rand.nextDouble() <= 0.1D)
				base.addPotionEffect(new PotionEffect(PotionFluxTaint.instance.getId(),200,1,true,false));
		
		if(this == poisoned)
			base.addPotionEffect(new PotionEffect(Potion.poison.id,200,1,true,false));
		
		if(this == knowledge && base.getHealth() <= 0 && user != null)
		{
			if(user.worldObj.rand.nextInt(Math.max(1, 7-modLevel)) == 0)
			{
				AspectList aspectsCompound = AspectHelper.getEntityAspects(base);
				if(aspectsCompound != null && aspectsCompound.size() > 0)
				{
					aspectsCompound = AspectHelper.reduceToPrimals(aspectsCompound);
					Aspect[] al = aspectsCompound.getAspects();
					for(int i = 0; i < al.length; ++i)
					{
						EntityXPOrb xp = new EntityXPOrb(user.worldObj,user.posX,user.posY,user.posZ,aspectsCompound.getAmount(al[i]));
						if(!user.worldObj.isRemote)
							user.worldObj.spawnEntityInWorld(xp);
						if(user.worldObj.rand.nextBoolean())
							break;
					}
				}
			}
		}
		
		
		if(this == piercig)
			return false;
		
		return true;
	}
	
	/**
	 * Used to check if the bullet can travel through the ground or should get destroyed on contact
	 * @param user the player using the weapon(can be null?)
	 * @param revolver the revolver
	 * @param modLevel the level of this upgrade
	 * @return
	 */
	public boolean bulletNoclip(EntityPlayer user,ItemStack revolver, int modLevel)
	{
		if(this == primal)
			return true;
		
		return false;
	}
	
	/**
	 * Used to get the amount of shots 1 aspect point gives to the weapon
	 * @param user the player
	 * @param revolver the gun
	 * @param modLevel this level
	 * @param originalLevel 2 or the result of previous run of this
	 * @param hasPrimal if the primal upgrade is installed
	 * @return -1 for 2 consumption, anythingelse otherwise
	 */
	public int modifyShots(EntityPlayer user, ItemStack revolver, int modLevel, int originalLevel, boolean hasPrimal)
	{
		if(this == primal)
			return -1;
		
		if(this == efficiency)
			return hasPrimal ? modLevel == 5 ? 2 : -1 : originalLevel+modLevel;
		
		return originalLevel;
	}
	
	/**
	 * Used to modify the bullet speed
	 * @param user the player
	 * @param revolver the gun
	 * @param origSpeed the original bullet speed
	 * @param modLevel the level of the modifier
	 * @return
	 */
	public double modifySpeed(EntityPlayer user, ItemStack revolver, float origSpeed, int modLevel)
	{
		if(this == speed)
			return origSpeed*Math.pow(1.09F, modLevel);
		return origSpeed;
	}
	
	/**
	 * Used for rendering to override the texture for a specific part of the weapon. If 2 or more upgrades override the same part texture the latest in the list will get rendered.
	 * @param revolver the revolver
	 * @param part The actual part.<BR>0 = Handle<BR>1 = Cylinder<BR>2 = generic metal texture<BR>3 = Barrel<BR>4 = Trigger
	 * @param level The level of this upgrade
	 * @return null if the texture is not overriden, your texture otherwise.
	 */
	public ResourceLocation getOverridePartTexture(ItemStack revolver, int part, int level)
	{
		if(this == eldritch && part == 2) 
			return eldritchTextures;
		
		if(this == primal && part == 3) 
			return primalTextures;
		
		if(this == tainted && part == 3) 
			return taintedTextures;
		
		if(this == uvoid && part == 0) 
			return voidTextures;
		
		return null;
	}
	
	public boolean isBMEntity(EntityLivingBase base)
	{
		if(Loader.isModLoaded("AWWayofTime"))
		{
			try
			{
				Class<?> demonClass = Class.forName("WayofTime.alchemicalWizardry.common.IDemon");
				if(demonClass.isInstance(base))
					return true;
			}
			catch(Exception e)
			{
				return false;
			}
		}
		return false;
	}
	
	public boolean isWerewolf(EntityPlayer p)
	{
		if(Loader.isModLoaded("witchery"))
		{
			if(p.getExtendedProperties("WitcheryExtendedPlayer") != null)
			{
				IExtendedEntityProperties props = p.getExtendedProperties("WitcheryExtendedPlayer");
				NBTTagCompound tag = new NBTTagCompound();
				props.saveNBTData(tag);
				return tag.getCompoundTag("WitcheryExtendedPlayer").getInteger("WerewolfLevel") > 0 || tag.getInteger("WerewolfLevel") > 0;
			}
		}
		return false;
	}
	
	public static void initConflictingMappings()
	{
		power.addConflict(silver,atropodsBane,eldritchBane,dueling,eldritch);
		silver.addConflict(atropodsBane,eldritchBane,dueling,eldritch);
		atropodsBane.addConflict(eldritchBane,dueling,eldritch);
		eldritchBane.addConflict(dueling,eldritch);
		dueling.addConflict(eldritch);
		
		accuracy.addConflict(speed,efficiency);
		speed.addConflict(efficiency);
		
		poisoned.addConflict(primal,tainted,knowledge);
		primal.addConflict(tainted,knowledge);
		tainted.addConflict(knowledge);
	}
	
	public static final RevolverUpgrade power = new RevolverUpgrade(0,"POWER").setMaxLevel(5).setInstabilityPerLevel(2);
	public static final RevolverUpgrade accuracy = new RevolverUpgrade(1,"ACCURACY").setMaxLevel(3).setInstabilityPerLevel(1);
	public static final RevolverUpgrade silver = new RevolverUpgrade(2,"SILVER").setMaxLevel(5).setInstabilityPerLevel(3);
	public static final RevolverUpgrade poisoned = new RevolverUpgrade(3,"POISONED").setMaxLevel(3).setInstabilityPerLevel(1);
	public static final RevolverUpgrade atropodsBane = new RevolverUpgrade(4,"BANE_OF_ATROPODS").setMaxLevel(5).setInstabilityPerLevel(3);
	public static final RevolverUpgrade eldritchBane = new RevolverUpgrade(5,"BANE_OF_ELDRITCH").setMaxLevel(5).setInstabilityPerLevel(3);
	public static final RevolverUpgrade piercig = new RevolverUpgrade(6,"PIERCING").setMaxLevel(1).setInstabilityPerLevel(12);
	public static final RevolverUpgrade dueling = new RevolverUpgrade(7,"DUELING").setMaxLevel(5).setInstabilityPerLevel(3);
	public static final RevolverUpgrade tainted = new RevolverUpgrade(8,"TAINTED").setMaxLevel(3).setInstabilityPerLevel(5);
	public static final RevolverUpgrade primal = new RevolverUpgrade(9,"PRIMAL").setMaxLevel(1).setInstabilityPerLevel(12);
	public static final RevolverUpgrade speed = new RevolverUpgrade(10,"SPEED").setMaxLevel(5).setInstabilityPerLevel(2);
	public static final RevolverUpgrade efficiency = new RevolverUpgrade(11,"EFFICIENCY").setMaxLevel(5).setInstabilityPerLevel(4);
	public static final RevolverUpgrade eldritch = new RevolverUpgrade(12,"ELDRITCH").setMaxLevel(2).setInstabilityPerLevel(7);
	public static final RevolverUpgrade uvoid = new RevolverUpgrade(13,"VOID").setMaxLevel(3).setInstabilityPerLevel(4);
	public static final RevolverUpgrade knowledge = new RevolverUpgrade(14,"KNOWLEDGE").setMaxLevel(5).setInstabilityPerLevel(1);
	public static final RevolverUpgrade heavy = new RevolverUpgrade(15,"HEAVY").setMaxLevel(5).setInstabilityPerLevel(1);
} public class EnchantmentHandler {
	
	@SubscribeEvent
	public void itemExpire(ItemExpireEvent event)
	{
		if(event.entityItem != null && event.entityItem.getEntityItem() != null && !event.entityItem.worldObj.isRemote)
		{
			int x = MathHelper.floor_double(event.entityItem.posX);
			int y = MathHelper.floor_double(event.entityItem.posY);
			int z = MathHelper.floor_double(event.entityItem.posZ);
			World w = event.entityItem.worldObj;
			ItemStack is = event.entityItem.getEntityItem();
			
			EntityAuraNode node = (EntityAuraNode) MiscUtils.getClosestEntity(TBUtils.castLst(event.entityItem.worldObj.getEntitiesWithinAABB(EntityAuraNode.class, AxisAlignedBB.fromBounds(x, y, z, x, y, z).expand(8, 8, 8))),x,y,z);
			if(node != null && node.getNodeType() == 4)
			{
				if(is.getItem() instanceof ItemSword)
				{
					if(EnchantmentHelper.getEnchantmentLevel(TBEnchant.tainted.effectId, is) <= 0)
					{
						LinkedHashMap<Integer,Integer> lhm = (LinkedHashMap<Integer,Integer>)EnchantmentHelper.getEnchantments(is);
						boolean canApply = true;
						if(!lhm.isEmpty())
						{
							Iterator<Integer> $i = lhm.keySet().iterator();
							while($i.hasNext())
							{
								int i = $i.next();
								if(i < MiscUtils.enchantmentList().length && MiscUtils.enchantmentList()[i] != null)
								{
									Enchantment ench = MiscUtils.enchantmentList()[i];
									if(!ench.canApplyTogether(TBEnchant.tainted))
									{
										canApply = false;
										break;
									}
								}
							}
						}
						if(canApply)
						{
							is.addEnchantment(TBEnchant.tainted, 1+w.rand.nextInt(3));
							event.extraLife = 1000;
							event.setCanceled(true);
						}
					}
				}
			}
		}
	}
	
	@SubscribeEvent
	public void onMobDeath(LivingDeathEvent event)
	{
		if(event.entityLiving != null && !event.entityLiving.worldObj.isRemote && event.source != null && event.source.getSourceOfDamage() != null && event.source.getSourceOfDamage() instanceof EntityPlayer)
		{
			EntityPlayer player = EntityPlayer.class.cast(event.source.getSourceOfDamage());
			EntityLivingBase dyingMob = event.entityLiving;
			ItemStack currentItem = player.getCurrentEquippedItem();
			if(currentItem != null)
			{
				if(EnchantmentHelper.getEnchantmentLevel(TBEnchant.elderKnowledge.effectId, currentItem) > 0)
				{
					int enchLevel = EnchantmentHelper.getEnchantmentLevel(TBEnchant.elderKnowledge.effectId, currentItem);
					if(player.worldObj.rand.nextInt(Math.max(1, 7-enchLevel)) == 0)
					{
						AspectList al = AspectHelper.getEntityAspects(dyingMob);
						if(al != null)
							for(int i = 0; i < al.size(); ++i)
							{
								EntityXPOrb xp = new EntityXPOrb(player.worldObj,player.posX,player.posY,player.posZ,3+player.worldObj.rand.nextInt(2+enchLevel*2));
								if(!player.worldObj.isRemote)
									player.worldObj.spawnEntityInWorld(xp);
								if(player.worldObj.rand.nextBoolean())
									break;
							}
					}
				}
				if(EnchantmentHelper.getEnchantmentLevel(TBEnchant.magicTouch.effectId, currentItem) > 0)
				{
					int enchLevel = EnchantmentHelper.getEnchantmentLevel(TBEnchant.magicTouch.effectId, currentItem);
					AspectList aspectsCompound = AspectHelper.getEntityAspects(dyingMob);
					if ((aspectsCompound != null) && (aspectsCompound.size() > 0)) 
					{
						AspectList aspects = AspectHelper.reduceToPrimals(aspectsCompound);
						for(int i = 0; i < enchLevel; ++i)
						{
							for (Aspect aspect : aspects.getAspects())
								if (event.entityLiving.worldObj.rand.nextBoolean()) 
								{
									EntityAspectOrb orb = new EntityAspectOrb(event.entityLiving.worldObj, event.entityLiving.posX, event.entityLiving.posY, event.entityLiving.posZ, aspect, 1 + event.entityLiving.worldObj.rand.nextInt(aspects.getAmount(aspect)));
									event.entityLiving.worldObj.spawnEntityInWorld(orb);
								}
							
							if(player.worldObj.rand.nextBoolean())
								break;
						}
					}
				}
				if(EnchantmentHelper.getEnchantmentLevel(TBEnchant.vaporising.effectId, currentItem) > 0)
				{
					int enchLevel = EnchantmentHelper.getEnchantmentLevel(TBEnchant.vaporising.effectId, currentItem);
					if(event.entity.worldObj.rand.nextInt(Math.max(1, 5 - enchLevel)) == 0)
					{
						AspectList aspects = AspectHelper.getEntityAspects(event.entityLiving);
						if ((aspects != null) && (aspects.size() > 0))
							for (Aspect aspect : aspects.getAspects())
							{
								if (!event.entity.worldObj.rand.nextBoolean()) 
								{
									int size = 1 + event.entity.worldObj.rand.nextInt(aspects.getAmount(aspect));
									size = Math.max(1, size / 2);
									ItemStack stack = new ItemStack(ItemsTC.crystalEssence, size, 0);
									((ItemGenericEssentiaContainer)stack.getItem()).setAspects(stack, new AspectList().add(aspect, 1));
									EntityItem cEs = new EntityItem(event.entity.worldObj, event.entityLiving.posX, event.entityLiving.posY + event.entityLiving.getEyeHeight(), event.entityLiving.posZ, stack);
									event.entity.worldObj.spawnEntityInWorld(cEs);
								}
								if(event.entity.worldObj.rand.nextInt(2+enchLevel) == 0)
									break;
							}
					}
				}
			}
		}
	}
	
	@SubscribeEvent
	public void onMobDamage(LivingHurtEvent event)
	{
		if(event.entityLiving != null && !event.entityLiving.worldObj.isRemote && event.source != null && event.source.getSourceOfDamage() != null && event.source.getSourceOfDamage() instanceof EntityPlayer)
		{
			EntityPlayer player = EntityPlayer.class.cast(event.source.getSourceOfDamage());
			EntityLivingBase mob = event.entityLiving;
			ItemStack currentItem = player.getCurrentEquippedItem();
			if(currentItem != null)
			{
				if(mob instanceof EntityEnderman || mob instanceof IEldritchMob)
				{
					if(EnchantmentHelper.getEnchantmentLevel(TBEnchant.eldritchBane.effectId, currentItem) > 0)
					{
						int enchLevel = EnchantmentHelper.getEnchantmentLevel(TBEnchant.eldritchBane.effectId, currentItem);
						event.ammount += enchLevel*5F;
					}
				}
				if(EnchantmentHelper.getEnchantmentLevel(TBEnchant.tainted.effectId, currentItem) > 0)
				{
					int enchLevel = EnchantmentHelper.getEnchantmentLevel(TBEnchant.tainted.effectId, currentItem);
					if(!(mob instanceof ITaintedMob))
					{
						event.ammount += enchLevel*3F;
						if(player.worldObj.rand.nextInt(Math.max(1,4-enchLevel)) == 0)
						{
							mob.addPotionEffect(new PotionEffect(PotionFluxTaint.instance.getId(),200,enchLevel-1,true,false));
						}
					}
				}
			}
		}
	}
} public class EntityAspectOrb extends Entity implements IEntityAdditionalSpawnData{

	public int orbAge = 0;
	public int orbMaxAge = 150;
	private Aspect aspect;
	private int aspectValue;
	private EntityPlayer closestPlayer;
	
	public EntityAspectOrb(World w, double x, double y, double z, Aspect aspect, int value)
	{
	    super(w);
	    setSize(0.125F, 0.125F);
	    setPosition(x, y, z);
        this.motionX = (float)(Math.random() * 0.20000000298023224D - 0.10000000149011612D) * 2.0F;
        this.motionY = (float)(Math.random() * 0.2D) * 2.0F;
        this.motionZ = (float)(Math.random() * 0.20000000298023224D - 0.10000000149011612D) * 2.0F;
	    this.aspectValue = value*10;
	    setAspect(aspect);
	}
	
    protected boolean canTriggerWalking()
    {
        return false;
    }
    
    public EntityAspectOrb(World worldIn)
    {
        super(worldIn);
        this.setSize(0.25F, 0.25F);
    }

    protected void entityInit() {}
    
    @SideOnly(Side.CLIENT)
    public int getBrightnessForRender(float p_70070_1_)
    {
        float f1 = 0.5F;
        f1 = MathHelper.clamp_float(f1, 0.0F, 1.0F);
        int i = super.getBrightnessForRender(p_70070_1_);
        int j = i & 255;
        int k = i >> 16 & 255;
        j += (int)(f1 * 15.0F * 16.0F);

        if (j > 240)
        {
            j = 240;
        }

        return j | k << 16;
    }
    
    public void onUpdate()
    {
        super.onUpdate();

        this.prevPosX = this.posX;
        this.prevPosY = this.posY;
        this.prevPosZ = this.posZ;
        this.motionY -= 0.029999999329447746D;

        if (this.worldObj.getBlockState(new BlockPos(this)).getBlock().getMaterial() == Material.lava)
        {
            this.motionY = 0.20000000298023224D;
            this.motionX = (this.rand.nextFloat() - this.rand.nextFloat()) * 0.2F;
            this.motionZ = (this.rand.nextFloat() - this.rand.nextFloat()) * 0.2F;
            this.playSound("random.fizz", 0.4F, 2.0F + this.rand.nextFloat() * 0.4F);
        }

        this.pushOutOfBlocks(this.posX, (this.getEntityBoundingBox().minY + this.getEntityBoundingBox().maxY) / 2.0D, this.posZ);
        double d0 = 8.0D;

        EntityPlayer player = (EntityPlayer) MiscUtils.getClosestEntity(TBUtils.castLst(this.worldObj.getEntitiesWithinAABB(EntityPlayer.class, AxisAlignedBB.fromBounds(this.posX, this.posY, this.posZ, this.posX, this.posY, this.posZ).expand(8, 8, 8))), posX, posY, posZ);
        if(isWandInHotbarWithRoom(getAspect(), this.aspectValue,player) >= 0)
        	closestPlayer = player;
        
        if (this.closestPlayer != null && this.closestPlayer.isSpectator())
            this.closestPlayer = null;

        if (this.closestPlayer != null)
        {
            double d1 = (this.closestPlayer.posX - this.posX) / d0;
            double d2 = (this.closestPlayer.posY + this.closestPlayer.getEyeHeight() - this.posY) / d0;
            double d3 = (this.closestPlayer.posZ - this.posZ) / d0;
            double d4 = Math.sqrt(d1 * d1 + d2 * d2 + d3 * d3);
            double d5 = 1.0D - d4;

            if (d5 > 0.0D)
            {
                d5 *= d5;
                this.motionX += d1 / d4 * d5 * 0.1D;
                this.motionY += d2 / d4 * d5 * 0.1D;
                this.motionZ += d3 / d4 * d5 * 0.1D;
            }
        }

        this.moveEntity(this.motionX, this.motionY, this.motionZ);
        float f = 0.98F;

        if (this.onGround)
            f = this.worldObj.getBlockState(new BlockPos(MathHelper.floor_double(this.posX), MathHelper.floor_double(this.getEntityBoundingBox().minY) - 1, MathHelper.floor_double(this.posZ))).getBlock().slipperiness * 0.98F;

        this.motionX *= f;
        this.motionY *= 0.9800000190734863D;
        this.motionZ *= f;

        if (this.onGround)
            this.motionY *= -0.8999999761581421D;

        ++this.orbAge;

        if (this.orbAge >= this.orbMaxAge)
            this.setDead();
    }
    
    public boolean handleWaterMovement()
    {
        return this.worldObj.handleMaterialAcceleration(this.getEntityBoundingBox(), Material.water, this);
    }
    
    protected void dealFireDamage(int amount)
    {
        this.attackEntityFrom(DamageSource.inFire, amount);
    }
    
    public boolean attackEntityFrom(DamageSource source, float amount)
    {
        if (this.isEntityInvulnerable(source))
        {
            return false;
        }
        
		this.setBeenAttacked();
		this.setDead();
		return false;
    }
    
    public void onCollideWithPlayer(EntityPlayer entityIn)
    {
    	if (!worldObj.isRemote && !isDead)
    	{
    		int slot = isWandInHotbarWithRoom(getAspect(), this.aspectValue, entityIn);
    		if (entityIn.xpCooldown == 0 && getAspect().isPrimal() && slot >= 0)
    		{
    			ItemWand wand = ItemWand.class.cast(entityIn.inventory.getStackInSlot(slot).getItem());
    			wand.addVis(entityIn.inventory.getStackInSlot(slot), getAspect(), this.aspectValue, true);
    			entityIn.xpCooldown = 2;
    	        playSound("random.orb", 0.1F, 0.5F * MathUtils.randomFloat(rand) * 0.7F + 1.8F);
    	        setDead();
    		}
    	}
    }
	
    public int isWandInHotbarWithRoom(Aspect aspect, int amount, EntityPlayer player)
    {
    	if(player == null)
    		return -1;
    	
	    for (int i = 0; i < InventoryPlayer.getHotbarSize(); ++i)
		    if (player.inventory.getStackInSlot(i) != null && player.inventory.getStackInSlot(i).getItem() instanceof ItemWand)
			    if (ItemWand.class.cast(player.inventory.getStackInSlot(i).getItem()).addVis(player.inventory.getStackInSlot(i), aspect, amount, false) < amount)
			    	return i;
	    return -1;
    }
    
    public void writeEntityToNBT(NBTTagCompound tag)
    {
    	tag.setShort("Age", (short)this.orbAge);
    	tag.setShort("Value", (short)this.aspectValue);
    	tag.setString("Aspect", getAspect().getTag());
    }

    public void readEntityFromNBT(NBTTagCompound tag)
    {
    	this.orbAge = tag.getShort("Age");
    	this.aspectValue = tag.getShort("Value");
    	setAspect(Aspect.getAspect(tag.getString("Aspect")));
    }
    
    public void writeSpawnData(ByteBuf data)
    {
	    if (getAspect() != null){
		    data.writeShort(getAspect().getTag().length());
		    for (char c : getAspect().getTag().toCharArray())
		    	data.writeChar(c);
	    }
    }

    public void readSpawnData(ByteBuf data)
    {
	    try{
		    int l = data.readShort();
		    StringBuilder s = new StringBuilder();
		    for (int i = 0; i < l; ++i){
		    	s.append(data.readChar());
		    }
		    setAspect(Aspect.getAspect(s.toString()));
	    }
	    catch (Exception e){e.printStackTrace();}
    }
    
    public int getAspectValue()
    {
    	return this.aspectValue;
    }

    public boolean canAttackWithItem()
    {
    	return false;
    }

    public Aspect getAspect()
    {
    	return this.aspect;
    }

    public void setAspect(Aspect aspect) 
    {
    	this.aspect = aspect;
    }
} public class EntityRevolverBullet extends EntityThrowable
{
	public Entity shooter;
	public ItemStack revolver;
	ArrayList<Pair<RevolverUpgrade,Integer>> upgrades;
	boolean isPrimal;
	
	public EntityRevolverBullet(World w)
	{
		super(w);
	}
	
	public EntityRevolverBullet(World w, EntityLivingBase shooter)
	{
		super(w, shooter);
		revolver = shooter.getHeldItem();
		this.shooter = shooter;
		if(revolver != null && revolver.getItem() instanceof ItemRevolver)
		{
			upgrades = ItemRevolver.getAllUpgradesFor(revolver);
			boolean allowNoclip = false;
			float speedIndex = 1;
			for(Pair<RevolverUpgrade,Integer> p : upgrades)
			{
				if(!allowNoclip)
					allowNoclip = p.getFirst().bulletNoclip((EntityPlayer) shooter, revolver, p.getSecond());
				
				speedIndex = (float) p.getFirst().modifySpeed((EntityPlayer) shooter, revolver, speedIndex, p.getSecond());
				
				if(p.getFirst() == RevolverUpgrade.primal)
					isPrimal = true;
			}
			if(allowNoclip)
				noClip = true;
			
			this.motionX *=3;
			this.motionY *=3;
			this.motionZ *=3;
			
			this.motionX *= speedIndex;
			this.motionY *= speedIndex;
			this.motionZ *= speedIndex;
		}
	}
	
    public void onUpdate()
    {
    	if(this.worldObj.isRemote)
    		Thaumcraft.proxy.getFX().sparkle((float)posX, (float)posY, (float)posZ, 4);
    	
    	if(this.worldObj.isRemote)
    		Thaumcraft.proxy.getFX().sparkle((float)(posX-motionX/20), (float)(posY-motionY/20), (float)(posZ-motionZ/20), 4);
    	
    	if(this.ticksExisted >= 200) //<- loop exit for primal
    		this.setDead();
    	
    	super.onUpdate();
    	
    	if(isPrimal && !isDead)
    	{
    		++ticksExisted; 
    		onUpdate(); //<- loop to turn into a hit-scan
    	}
    }
	
    protected float getGravityVelocity()
    {
        return isPrimal ? 0 : 0.01F;
    }

	@Override
	protected void onImpact(MovingObjectPosition object)
	{
		if(this.isDead)
			return;
		
		if(!this.worldObj.isRemote && object.typeOfHit == MovingObjectType.BLOCK)
		{
			if(noClip)
				return;
			if(this.worldObj.isBlockNormalCube(object.getBlockPos(), true))
				this.setDead();
		}
		if(object.typeOfHit == MovingObjectType.ENTITY)
		{
			Entity e = object.entityHit;
			if(e instanceof EntityLivingBase && e != this.shooter && !(e instanceof EntityRevolverBullet))
			{
				EntityLivingBase elb = (EntityLivingBase) e;
				float initialDamage = 14;
				for(Pair<RevolverUpgrade,Integer> p : upgrades)
					initialDamage = p.getFirst().modifyDamage_start(elb, revolver, initialDamage, p.getSecond());
				
				for(Pair<RevolverUpgrade,Integer> p : upgrades)
					initialDamage = p.getFirst().modifyDamage_end(elb, revolver, initialDamage, p.getSecond());
				
				elb.attackEntityFrom(new RevolverDamage("revolver"), initialDamage);
				
				boolean destroy = true;
				
				for(Pair<RevolverUpgrade,Integer> p : upgrades)
				{
					if(destroy)
						destroy = p.getFirst().afterhit(elb, (EntityPlayer) shooter, revolver, initialDamage, p.getSecond());
					else
						p.getFirst().afterhit(elb, (EntityPlayer) shooter, revolver, initialDamage, p.getSecond());
				}
				
				if(destroy)
					this.setDead();
			}
		}
	}
	
	public static class RevolverDamage extends DamageSource
	{

		public RevolverDamage(String damage) {
			super(damage);
		}
		
	}

    public void writeEntityToNBT(NBTTagCompound tag)
    {
    	super.writeEntityToNBT(tag);
    	if(revolver != null)
    	{
	    	NBTTagCompound revolverTag = new NBTTagCompound();
	    	revolver.writeToNBT(revolverTag);
	    	tag.setTag("revolverTag", revolverTag);
    	}
    	tag.setBoolean("noclip", noClip);
    	tag.setBoolean("primal", isPrimal);
    }
    
    public void readEntityFromNBT(NBTTagCompound tag)
    {
    	super.readEntityFromNBT(tag);
    	
    	if(tag.hasKey("revolverTag"))
    	{
    		revolver = ItemStack.loadItemStackFromNBT(tag.getCompoundTag("revolverTag"));
			upgrades = ItemRevolver.getAllUpgradesFor(revolver);
    	}
    	noClip = tag.getBoolean("noclip");
    	isPrimal = tag.getBoolean("primal");
    }
} public class TBEventHandler {
	
	public static int clientUkuleleSoundPlayDelay = 0;
	
	@SubscribeEvent
	public void bucketFill(FillBucketEvent event)
	{
		if(event.target != null && event.world != null && event.target.typeOfHit == MovingObjectType.BLOCK && event.world.getBlockState(event.target.getBlockPos()).getBlock() instanceof BlockPyrofluid)
			{event.result = new ItemStack(Items.lava_bucket,1,0);event.setCanceled(true);}
	}
	
	@SubscribeEvent
	public void nameFormatEvent(NameFormat event)
	{
		if(TBConfig.allowHSNicknameChange)
			if(event.entityPlayer != null && event.entityPlayer.getCurrentEquippedItem() != null && event.entityPlayer.getCurrentEquippedItem().getItem() instanceof ItemHerobrinesScythe)
				event.displayname = "Herobrine";
	}
	
	@SubscribeEvent
	public void clientWorldTickEvent(ClientTickEvent event)
	{
		World world = TBCore.proxy.clientWorld();
		if(event.side == Side.CLIENT && event.phase == Phase.END && world != null && world.provider != null)
		{
			--clientUkuleleSoundPlayDelay;
			if(Minecraft.getMinecraft().thePlayer != null && Minecraft.getMinecraft().thePlayer.ticksExisted % 20 * 20 == 0)
			{
				TBUtils.loadedClientSpawners.clear();
				if(world.loadedTileEntityList != null)
					for(int i = 0; i < world.loadedTileEntityList.size(); ++i)
					{
						Object obj = world.loadedTileEntityList.get(i);
						if(obj instanceof TileEntity && obj instanceof TileEntityMobSpawner && !TileEntity.class.cast(obj).isInvalid() && TileEntity.class.cast(obj) instanceof ITickable)
						{
							TileEntity tile = TileEntity.class.cast(obj);
							Coord3D coords = new Coord3D(tile.getPos().getX(),tile.getPos().getY(),tile.getPos().getZ());
							Pair<Integer, Coord3D> tileCoords = new Pair<Integer, Coord3D>(world.provider.getDimensionId(),coords);
							TBUtils.loadedClientSpawners.add(tileCoords);
						}
					}
			}
		}
	}

} public class TBBlocks {
	
	public static void setup()
	{
		BlocksRegistry.registerBlock(crystalBlock,"crystalBlock",core, ItemBlockCrystal.class);
		OreDictionary.registerOre("blockCrystalCluster", new ItemStack(crystalBlock,1,OreDictionary.WILDCARD_VALUE));
		BlocksRegistry.registerBlock(genLogs, "genLogs",core,ItemBlockTBLogs.class);
		OreDictionary.registerOre("logWood", new ItemStack(genLogs,1,OreDictionary.WILDCARD_VALUE));
		BlocksRegistry.registerBlock(genLeaves, "genLeaves",core,ItemBlockTBLeaves.class);
		BlocksRegistry.registerBlock(sapling, "goldenOakSapling",core,ItemBlockTBSapling.class);
		OreDictionary.registerOre("treeSapling", sapling);
		BlocksRegistry.registerBlock(planks, "planks",core,ItemBlockTBPlanks.class);
		OreDictionary.registerOre("plankWood", new ItemStack(planks,1,OreDictionary.WILDCARD_VALUE));
		
		BlocksRegistry.registerBlock(quicksilverBlock, "quicksilverBlock",core,ItemBlock.class);
		OreDictionary.registerOre("blockQuicksilver", quicksilverBlock);
		BlocksRegistry.registerBlock(quicksilverBrick, "quicksilverBrick",core,ItemBlock.class);
		OreDictionary.registerOre("blockQuicksilver", quicksilverBrick);
		BlocksRegistry.registerBlock(dustBlock, "blockSalisMundus",core,ItemBlock.class);
		OreDictionary.registerOre("blockSalisMundus", dustBlock);
		BlocksRegistry.registerBlock(thauminiteBlock, "thauminiteBlock",core,ItemBlock.class);
		OreDictionary.registerOre("blockThauminite", thauminiteBlock);
		BlocksRegistry.registerBlock(eldritchArk, "eldritchArk",core,ItemBlock.class);
		BlocksRegistry.registerBlock(ironGreatwood, "ironGreatwood",core,ItemBlock.class);
		
		BlocksRegistry.registerBlock(oldCobble, "oldCobble",core,ItemBlock.class);
		oldCobble.setHarvestLevel("pickaxe", 0);
		OreDictionary.registerOre("cobblestone", oldCobble);
		BlocksRegistry.registerBlock(oldCobbleMossy, "oldCobbleMossy",core,ItemBlock.class);
		oldCobbleMossy.setHarvestLevel("pickaxe", 0);
		OreDictionary.registerOre("cobblestone", oldCobbleMossy);
		OreDictionary.registerOre("mossyCobblestone", oldCobbleMossy);
		BlocksRegistry.registerBlock(oldGravel, "oldGravel",core,ItemBlock.class);
		oldGravel.setHarvestLevel("shovel", 0);
		OreDictionary.registerOre("gravel", oldGravel);
		BlocksRegistry.registerBlock(oldBrick, "oldBrick",core,ItemBlock.class);
		oldBrick.setHarvestLevel("pickaxe", 0);
		OreDictionary.registerOre("brick", oldBrick);
		BlocksRegistry.registerBlock(oldLapis, "oldLapis",core,ItemBlock.class);
		oldLapis.setHarvestLevel("pickaxe", 0);
		OreDictionary.registerOre("blockLapis", oldLapis);
		BlocksRegistry.registerBlock(oldIron, "oldIron",core,ItemBlock.class);
		oldIron.setHarvestLevel("pickaxe", 0);
		OreDictionary.registerOre("blockIron", oldIron);
		BlocksRegistry.registerBlock(oldGold, "oldGold",core,ItemBlock.class);
		oldGold.setHarvestLevel("pickaxe", 0);
		OreDictionary.registerOre("blockGold", oldGold);
		BlocksRegistry.registerBlock(oldDiamond, "oldDiamond",core,ItemBlock.class);
		oldDiamond.setHarvestLevel("pickaxe", 0);
		OreDictionary.registerOre("blockDiamond", oldDiamond);
		
		BlocksRegistry.registerBlock(plax, "plax",core,ItemBlock.class);
		BlocksRegistry.registerBlock(aureliaPetal, "aureliaPetal",core,ItemBlock.class);
		BlocksRegistry.registerBlock(aurelia, "aurelia",core,ItemBlock.class);
		BlocksRegistry.registerBlock(metalleat, "metalleat",core,ItemBlock.class);
		BlocksRegistry.registerBlock(lucrite, "lucrite",core,ItemBlock.class);
		BlocksRegistry.registerBlock(knose, "knose",core,ItemBlock.class);
		BlocksRegistry.registerBlock(sweed, "sweed",core,ItemBlock.class);
		BlocksRegistry.registerBlock(lazullia, "lazullia",core,ItemBlock.class);
		BlocksRegistry.registerBlock(ashroom, "ashroom",core,ItemBlock.class);
		BlocksRegistry.registerBlock(flaxium, "flaxium",core,ItemBlock.class);
		BlocksRegistry.registerBlock(glieonia, "glieonia",core,ItemBlock.class);
		BlocksRegistry.registerBlock(briar, "briar",core,ItemBlock.class);
		BlocksRegistry.registerBlock(tobacco, "tobacco",core,ItemBlock.class);
		BlocksRegistry.registerBlock(voidPlant, "voidPlant",core,ItemBlock.class);
		BlocksRegistry.registerBlock(rainbowCactus, "rainbowCactus",core,ItemBlock.class);
		BlocksRegistry.registerBlock(redlonStem, "redlonStem",core,ItemBlock.class);
		
		BlocksRegistry.registerBlock(spike, "spike",core,ItemBlockSpike.class);
		BlocksRegistry.registerBlock(cryingObsidian, "cryingObsidian",core,ItemBlock.class);
		BlocksRegistry.registerBlock(pyrofluid,"pyrofluid",core, ItemBlockPyrofluid.class);
		BlocksRegistry.registerBlock(thaumicAnvil, "thaumicAnvil",core,ItemAnvilBlock.class);
		BlocksRegistry.registerBlock(voidAnvil, "voidAnvil",core,ItemAnvilBlock.class);
		
		BlocksRegistry.registerBlock(crystalSlab, "crystalSlab",core,ItemBlockCrystalSlab.class);
		BlocksRegistry.registerBlock(crystalSlab_full, "crystalSlab_full",core,ItemBlockCrystalSlab.class);
		BlocksRegistry.registerBlock(genericSlab, "genericSlab",core,ItemBlockHalfSlab.class);
		BlocksRegistry.registerBlock(genericSlab_full, "genericSlab_full",core,ItemBlockHalfSlab.class);
		BlocksRegistry.registerBlock(woodSlab, "woodSlab",core,ItemBlockWoodSlab.class);
		BlocksRegistry.registerBlock(woodSlab_full, "woodSlab_full",core,ItemBlockWoodSlab.class);
		
		BlocksRegistry.registerBlock(overchanter, "overchanter",core,ItemBlock.class);
		BlocksRegistry.registerBlock(campfire, "campfire",core,ItemBlock.class);
		BlocksRegistry.registerBlock(braizer, "brazier",core,ItemBlock.class);
		BlocksRegistry.registerBlock(auraLinker, "auraLinker",core,ItemBlock.class);
		BlocksRegistry.registerBlock(nodeManipulator, "nodeManipulator",core,ItemBlock.class);
		
		Blocks.fire.setFireInfo(genLogs, 5, 5);
		Blocks.fire.setFireInfo(genLeaves, 30, 60);
		Blocks.fire.setFireInfo(planks, 5, 20);
	}
	
	public static Block quicksilverBlock = new TBBlock(Material.rock,false).setBlockTextureName("thaumicbases:quicksilverBlock").stabilise().setUnlocalizedName("quicksilverBlock").setHardness(0.5F);
	public static Block quicksilverBrick = new TBBlock(Material.rock,true).setBlockTextureName("thaumicbases:quicksilverBrick").stabilise().setUnlocalizedName("quicksilverBrick").setHardness(0.5F);
	public static Block dustBlock = new TBBlock(Material.sand,false).setBlockTextureName("thaumicbases:dust_block").stabilise().setStepSound(Block.soundTypeSand).setUnlocalizedName("salisMundusBlock").setHardness(1);
	public static Block thauminiteBlock = new TBBlock(Material.iron,false).setBlockTextureName("thaumicbases:thauminiteblock").stabilise().setUnlocalizedName("thauminiteBlock").setHardness(2F);
	public static Block eldritchArk = new TBBlock(Material.rock,false).setBlockTextureName("thaumicbases:eldritchArk").setUnlocalizedName("eldritchArk").setHardness(3F);
	public static Block ironGreatwood = new TBBlock(Material.wood,false).setBlockTextureName("thaumicbases:ironGreatwood").setUnlocalizedName("ironGreatwood").setHardness(1F).setStepSound(Block.soundTypeWood);
	
	public static Block oldCobble = new TBBlock(Material.rock,false).setBlockName("TBoldCobblestone").setBlockTextureName("thaumicbases:cobblestone").setHardness(1).setResistance(1);
	public static Block oldCobbleMossy = new TBBlock(Material.rock,false).setBlockName("TBoldCobblestoneMossy").setBlockTextureName("thaumicbases:cobblestone_mossy").setHardness(1).setResistance(1);
	public static Block oldGravel = new TBBlock(Material.sand, false).setBlockName("TBoldGravel").setBlockTextureName("thaumicbases:gravel").setHardness(0.6F).setResistance(0).setStepSound(Block.soundTypeGravel);
	public static Block oldBrick = new TBBlock(Material.rock,false).setBlockName("TBoldBricks").setBlockTextureName("thaumicbases:brick").setHardness(1).setResistance(1);
	public static Block oldLapis = new TBBlock(Material.rock,false).setBlockName("TBoldLapis").setBlockTextureName("thaumicbases:lapis_block").setHardness(1).setResistance(1);
	public static Block oldIron = new TBSidedBlock(Material.rock,false).setBlockName("TBoldIron").setBlockTextureName("thaumicbases:iron_block").setHardness(1).setResistance(1);
	public static Block oldGold = new TBSidedBlock(Material.rock,false).setBlockName("TBoldGold").setBlockTextureName("thaumicbases:gold_block").setHardness(1).setResistance(1);
	public static Block oldDiamond = new TBSidedBlock(Material.rock,false).setBlockName("TBoldDiamond").setBlockTextureName("thaumicbases:diamond_block").setHardness(1).setResistance(1);
	
	
	public static Block crystalBlock = new BlockCrystalBlock().setUnlocalizedName("crystalBlock");
	public static Block genLogs = new BlockTBLog();
	public static Block genLeaves = new BlockTBLeaves();
	public static Block sapling = new BlockTBSapling();
	public static Block planks = new BlockTBPlanks().setUnlocalizedName("tb.planks");
	
	public static Block ashroom = new BlockAshroom(4,8,false).setBlockName("ashroom").setBlockTextureName("thaumicbases:aspectshroom/");
	public static Block plax = new BlockTBPlant(8,4,true).setBlockName("plax").setBlockTextureName("thaumicbases:plax/");
	public static Block aureliaPetal = new BlockAureliaLeaf().setBlockName("aureliaPetal").setBlockTextureName("thaumicbases:aurelia/petal").setHardness(0).setStepSound(Block.soundTypeGrass);
	public static Block aurelia = new BlockAureliaPlant().setBlockName("aurelia").setBlockTextureName("thaumicbases:aurelia/").setHardness(0).setStepSound(Block.soundTypeGrass);
	public static Block metalleat = new BlockTBPlant(8,8,true).setBlockName("metalleat").setBlockTextureName("thaumicbases:metalleat/");
	public static Block lucrite = new BlockLucritePlant(8,16,true).setBlockName("lucrite").setBlockTextureName("thaumicbases:lucrite/");
	public static Block knose = new BlockKnose(4,16,false).setBlockName("knose").setBlockTextureName("thaumicbases:knoze/");
	public static Block sweed = new BlockSweed(4,4,false).setBlockName("sweed").setBlockTextureName("thaumicbases:sweed/");
	public static Block lazullia = new BlockTBPlant(8,16,true).setBlockName("lazullia").setBlockTextureName("thaumicbases:lazullia/");
	public static Block flaxium = new BlockFlaxium().setBlockName("flaxium").setBlockTextureName("thaumicbases:flaxium").setStepSound(Block.soundTypeGrass);
	public static Block glieonia = new BlockTBPlant(4,12,false).setBlockName("glieonia").setBlockTextureName("thaumicbases:glieonia/");
	public static Block briar = new BlockBriar(8,4).setBlockName("briar").setBlockTextureName("thaumicbases:briar/").setStepSound(Block.soundTypeGrass);
	public static Block tobacco = new BlockTBPlant(8,16,true).setBlockName("tobacco").setBlockTextureName("thaumicbases:tobacco/");
	public static Block voidPlant = new BlockTBPlant(4,32,true).setBlockName("voidPlant").setBlockTextureName("thaumicbases:voidPlant/");
	public static Block rainbowCactus = new BlockRainbowCactus().setBlockName("rainbowCactus").setBlockTextureName("thaumicbases:rainbowCacti/").setStepSound(Block.soundTypeCloth).setHardness(0.5F);
	public static Block redlonStem = new BlockRedlonStem(Blocks.redstone_block).setBlockName("redlonStem").setBlockTextureName("thaumicbases:redlon/redlon").setStepSound(Block.soundTypeGrass);
	
	public static Block spike = new BlockSpike().setUnlocalizedName("spike").setHardness(3).setResistance(3).setStepSound(Block.soundTypeMetal);
	public static Block cryingObsidian = new BlockCryingObelisk().setBlockName("cryingObsidian").setBlockTextureName("thaumicbases:cryingObelisk/").setHardness(10).setResistance(10);
	public static Block pyrofluid = new BlockPyrofluid().setUnlocalizedName("pyrofluid").setLightLevel(1);
	public static Block thaumicAnvil = new BlockThaumicAnvil().setBlockName("thaumicAnvil").setBlockTextureName("thaumicbases:thaumiumAnvil/").setHardness(6).setResistance(16).setStepSound(Block.soundTypeAnvil);
	public static Block voidAnvil = new BlockVoidAnvil().setBlockName("voidAnvil").setBlockTextureName("thaumicbases:voidAnvil/");
	
	public static Block crystalSlab = new BlockCrystalSlab(false,Material.glass).setUnlocalizedName("tb.crystalslab.");
	public static Block crystalSlab_full = new BlockCrystalSlab(true,Material.glass).setUnlocalizedName("tb.crystalslab.");
	public static Block genericSlab = new BlockHalfSlab(false,Material.rock).setHardness(1).setResistance(10).setUnlocalizedName("tb.slab.");
	public static Block genericSlab_full = new BlockHalfSlab(true,Material.rock).setHardness(1).setResistance(10).setUnlocalizedName("tb.slab.");
	public static Block woodSlab = new BlockWoodSlab(false,Material.wood).setUnlocalizedName("tb.woodSlab.");
	public static Block woodSlab_full = new BlockWoodSlab(true,Material.wood).setUnlocalizedName("tb.woodSlab.");
	
	public static Block overchanter = new BlockOverchanter().setUnlocalizedName("overchanter").setHardness(5).setResistance(5);
	public static Block campfire = new BlockCampfire().setBlockTextureName("thaumicbases:campfire").setUnlocalizedName("tb.campfire").setLightLevel(1);
	public static Block braizer = new BlockBraizer().setUnlocalizedName("tb.brazier").setLightLevel(1);
	public static Block auraLinker = new BlockAuraLinker().setUnlocalizedName("nodeLinker").setHardness(1);
	public static Block nodeManipulator = new BlockNodeManipulator().setUnlocalizedName("nodeManipulator").setHardness(1);
	
	public static final Class<TBCore> core = TBCore.class;
} public class TBEnchant {
	
	public static void setup()
	{
		elderKnowledge = new EnchantmentElderKnowledge(TBConfig.elderKnowledgeID,12).setName("elderKnowledge");
		eldritchBane = new EnchantmentEldritchBane(TBConfig.eldritchBaneID,7).setName("eldritchBane");
		magicTouch = new EnchantmentMagicTouch(TBConfig.magicTouchID,11).setName("magicTouch");
		tainted = new EnchantmentTainted(TBConfig.taintedID,9).setName("tainted");
		vaporising = new EnchantmentVaporising(TBConfig.vaporisingID,6).setName("vaporising");

		Enchantment.addToBookList(elderKnowledge);
		Enchantment.addToBookList(eldritchBane);
		Enchantment.addToBookList(magicTouch);
		Enchantment.addToBookList(vaporising);
		Enchantment.addToBookList(tainted);
		
		if(Loader.isModLoaded("ThaumicTinkerer") && TBConfig.enableTTCompathability)
		{
			try
			{
				Class<?> c = Class.forName("thaumic.tinkerer.common.enchantment.core.EnchantmentManager");
				Method reg = c.getMethod("registerExponentialCostData", Enchantment.class,String.class,boolean.class,AspectList.class);
				reg.invoke(null, elderKnowledge,"thaumicbases:textures/enchantments/elder_knowledge.png",false,new AspectList().add(Aspect.AIR, 8).add(Aspect.ORDER, 12).add(Aspect.EARTH, 16));
				reg.invoke(null, eldritchBane,"thaumicbases:textures/enchantments/eldritch_bane.png",false,new AspectList().add(Aspect.FIRE, 12).add(Aspect.ENTROPY, 12).add(Aspect.ORDER, 8));
				reg.invoke(null, magicTouch,"thaumicbases:textures/enchantments/magic_touched.png",false,new AspectList().add(Aspect.FIRE, 16).add(Aspect.ORDER, 16).add(Aspect.WATER, 8).add(Aspect.ENTROPY, 12));
				reg.invoke(null, tainted,"thaumicbases:textures/enchantments/tainted.png",false,new AspectList().add(Aspect.FIRE, 12).add(Aspect.ENTROPY, 16));
				reg.invoke(null, vaporising,"thaumicbases:textures/enchantments/vaporising.png",false,new AspectList().add(Aspect.ENTROPY, 8).add(Aspect.ORDER, 12).add(Aspect.FIRE, 16));
			}
			catch(Exception e)
			{
				System.out.println("[ThaumicBases]Unable to add ThaumicTinkerer integration - mod not found");
				return;
			}
		}
	}
	
	public static Enchantment 
	elderKnowledge,
	eldritchBane,
	magicTouch,
	tainted,
	vaporising;
} public class TBItems {
	
	public static void setup()
	{
		ItemRegistry.registerItem(resource, "resource",core);
		ItemRegistry.registerItem(spawnerCompass, "spawnerCompass",core);
		
		ItemRegistry.registerItem(tobacco, "tobaccoPowder",core);
		ItemRegistry.registerItem(greatwoodPipe, "greatwoodPipe",core);
		ItemRegistry.registerItem(silverwoodPipe, "silverwoodPipe",core);
		
		ItemRegistry.registerItem(bloodyChest, "bloodyChest",core);
		ItemRegistry.registerItem(bloodyLeggings, "bloodyLeggings",core);
		ItemRegistry.registerItem(bloodyBoots, "bloodyBoots",core);
		ItemRegistry.registerItem(knoseFragment, "knoseFragment",core);
		
		ItemRegistry.registerItem(castingBracelet, "castingBracelet",core);
		ItemRegistry.registerItem(herobrinesScythe, "herobrinesScythe",core);
		
		ItemRegistry.registerItem(nodeFoci, "nodeFoci",core);
		ItemRegistry.registerItem(voidShears, "voidShears",core);
		ItemRegistry.registerItem(voidFAS, "voidFAS",core);
		
		ItemRegistry.registerItem(thauminiteHelmet, "thauminiteHelmet",core);
		ItemRegistry.registerItem(thauminiteChest, "thauminiteChest",core);
		ItemRegistry.registerItem(thauminiteLeggings, "thauminiteLeggings",core);
		ItemRegistry.registerItem(thauminiteBoots, "thauminiteBoots",core);
		ItemRegistry.registerItem(pyroBucket, "pyroBucket",core);
		ItemRegistry.registerItem(plaxSeed, "plaxSeed",core);
		ItemRegistry.registerItem(metalleatSeeds, "metalleatSeeds",core);
		ItemRegistry.registerItem(lucriteSeeds, "lucriteSeeds",core);
		ItemRegistry.registerItem(knoseSeed, "knoseSeed",core);
		ItemRegistry.registerItem(sweedSeeds, "sweedSeeds",core);
		ItemRegistry.registerItem(lazulliaSeeds, "lazulliaSeeds",core);
		ItemRegistry.registerItem(redlonSeeds, "redlonSeeds",core);
		ItemRegistry.registerItem(glieoniaSeed, "glieoniaSeed",core);
		ItemRegistry.registerItem(rosehipSyrup, "rosehipSyrup",core);
		ItemRegistry.registerItem(tobaccoSeeds, "tobaccoSeeds",core);
		ItemRegistry.registerItem(mortar, "mortar",core);
		ItemRegistry.registerItem(voidSeed, "voidSeed",core);
		
		ItemRegistry.registerItem(thauminiteAxe, "thauminiteAxe",core);
		thauminiteAxe.setHarvestLevel("axe", 3);
		ItemRegistry.registerItem(thauminiteHoe, "thauminiteHoe",core);
		thauminiteHoe.setHarvestLevel("hoe", 3);
		ItemRegistry.registerItem(thauminitePickaxe, "thauminitePickaxe",core);
		thauminitePickaxe.setHarvestLevel("pickaxe", 3);
		ItemRegistry.registerItem(thauminiteShears, "thauminiteShears",core);
		thauminiteShears.setHarvestLevel("shears", 3);
		ItemRegistry.registerItem(thauminiteShovel, "thauminiteShovel",core);
		thauminiteShovel.setHarvestLevel("shovel", 3);
		ItemRegistry.registerItem(thauminiteSword, "thauminiteSword",core);
		thauminiteSword.setHarvestLevel("sword", 3);
		ItemRegistry.registerItem(revolver, "revolver",core);
		ItemRegistry.registerItem(ukulele, "ukulele",core);
		ItemRegistry.registerItem(shardCluster, "shardCluster",core);
		
		WAND_CAP_THAUMINITE = new WandCap("thauminite",0.85F,1,new ItemStack(resource,1,2),6,new ResourceLocation("thaumicbases","items/thauminite/wand_cap_thauminite_uv"));	
		WAND_ROD_THAUMIUM = new WandRod("tbthaumium", 450, new ItemStack(resource,1,3), 6, new WandRodPrimalOnUpdate(), new ResourceLocation("thaumicbases","items/wand_rod_thaumium_uv"));
		WAND_ROD_VOID = new WandRod("tbvoid", 750, new ItemStack(resource,1,4), 16, new WandRodPrimalOnUpdate(), new ResourceLocation("thaumicbases","items/wand_rod_void_uv"));

	}
	
	public static ToolMaterial thauminite = EnumHelper.addToolMaterial("THAUMINITE", 3, 974, 7F, 2.8F, 15);
	public static ArmorMaterial thauminiteA = EnumHelper.addArmorMaterial("ATHAUMINITE", "thaumicbases:textures/items/armor/thauminite/thauminite", 27, new int[]{3, 8, 6, 3}, 17);
	public static ArmorMaterial bloodyA = EnumHelper.addArmorMaterial("TBBLOODY", "thaumicbases:textures/items/armor/bloody/bloody" ,21, new int[]{2, 6, 5, 2}, 21);
	
	public static Item resource = new TBResource().setUnlocalizedName("resource");
	public static Item spawnerCompass = new ItemSpawnerCompass().setFull3D().setMaxStackSize(1).setMaxDamage(0).setUnlocalizedName("tb.spawnerCompass");
	
	public static Item tobacco = new TBTobacco().setUnlocalizedName("tobacco");
	public static Item greatwoodPipe = new ItemSmokingPipe(false).setTextureName("thaumicbases:smokingPipe").setUnlocalizedName("greatwoodPipe");
	public static Item silverwoodPipe = new ItemSmokingPipe(true).setTextureName("thaumicbases:smokingPipe_silverwood").setUnlocalizedName("silverwoodPipe");
	
	public static Item bloodyChest = new ItemBloodyArmor(bloodyA,1).setTextureName("thaumicbases:bloodyRobes/bloodychest").setUnlocalizedName("bloodyChest");
	public static Item bloodyLeggings = new ItemBloodyArmor(bloodyA,2).setTextureName("thaumicbases:bloodyRobes/bloodylegs").setUnlocalizedName("bloodyLegs");
	public static Item bloodyBoots = new ItemBloodyArmor(bloodyA,3).setTextureName("thaumicbases:bloodyRobes/bloodyboots").setUnlocalizedName("bloodyBoots");
	
	public static Item knoseFragment = new ItemKnoseFragment().setTextureName("thaumicbases:knose/").setUnlocalizedName("knoseFragment.");
	
	public static Item castingBracelet = new ItemCastingBracelet().setUnlocalizedName("tb.bracelet");
	public static Item herobrinesScythe = new ItemHerobrinesScythe().setTextureName("thaumicbases:herobrinesScythe").setUnlocalizedName("herobrinesScythe");
	
	public static Item thauminiteAxe = new ItemThauminiteAxe(thauminite).setTextureName("thaumicbases:thauminite/thauminiteaxe").setUnlocalizedName("thauminiteAxe");
	public static Item thauminiteHoe = new ItemThauminiteHoe(thauminite).setTextureName("thaumicbases:thauminite/thauminitehoe").setUnlocalizedName("thauminiteHoe");
	public static Item thauminitePickaxe = new ItemThauminitePickaxe(thauminite).setTextureName("thaumicbases:thauminite/thauminitepick").setUnlocalizedName("thauminitePickaxe");
	public static Item thauminiteShears = new ItemThauminiteShears().setTextureName("thaumicbases:thauminite/thauminiteshears").setUnlocalizedName("thauminiteShears").setFull3D().setMaxStackSize(1).setMaxDamage(974);
	public static Item thauminiteShovel = new ItemThauminiteShovel(thauminite).setTextureName("thaumicbases:thauminite/thauminiteshovel").setUnlocalizedName("thauminiteShovel");
	public static Item thauminiteSword = new ItemThauminiteSword(thauminite).setTextureName("thaumicbases:thauminite/thauminitesword").setUnlocalizedName("thauminiteSword");

	public static Item thauminiteHelmet = new ItemThauminiteArmor(thauminiteA,0).setTextureName("thaumicbases:thauminite/thauminitehelm").setUnlocalizedName("thauminiteHelmet");
	public static Item thauminiteChest = new ItemThauminiteArmor(thauminiteA,1).setTextureName("thaumicbases:thauminite/thauminitechest").setUnlocalizedName("thauminiteChest");
	public static Item thauminiteLeggings = new ItemThauminiteArmor(thauminiteA,2).setTextureName("thaumicbases:thauminite/thauminitelegs").setUnlocalizedName("thauminiteLegs");
	public static Item thauminiteBoots = new ItemThauminiteArmor(thauminiteA,3).setTextureName("thaumicbases:thauminite/thauminiteboots").setUnlocalizedName("thauminiteBoots");

	public static Item pyroBucket = new ItemPyrofluidBucket().setTextureName("thaumicbases:bucket_blazing_fluid").setUnlocalizedName("pyrofluidBucket");
	
	public static Item plaxSeed = new ItemSeeds(TBBlocks.plax, Blocks.farmland).setTextureName("thaumicbases:plax_seeds").setUnlocalizedName("plaxSeeds");
	public static Item metalleatSeeds = new ItemSeeds(TBBlocks.metalleat, Blocks.farmland).setTextureName("thaumicbases:metalleat_seeds").setUnlocalizedName("metalleatSeeds");
	public static Item lucriteSeeds = new ItemSeeds(TBBlocks.lucrite, Blocks.farmland).setTextureName("thaumicbases:lucrite_seeds").setUnlocalizedName("lucriteSeeds");
	public static Item knoseSeed = new ItemSeeds(TBBlocks.knose, TBBlocks.crystalBlock).setTextureName("thaumicbases:knose_seed").setUnlocalizedName("knoseSeed");
	public static Item sweedSeeds = new ItemSeeds(TBBlocks.sweed,Blocks.grass).setTextureName("thaumicbases:seeds_sweed").setUnlocalizedName("sweedSeeds");
	public static Item lazulliaSeeds = new ItemSeeds(TBBlocks.lazullia,Blocks.farmland).setTextureName("thaumicbases:lazullia_seeds").setUnlocalizedName("lazulliaSeeds");
	public static Item redlonSeeds = new ItemSeeds(TBBlocks.redlonStem,Blocks.farmland).setTextureName("thaumicbases:redlon_seed").setUnlocalizedName("redlonSeeds");
	public static Item glieoniaSeed = new ItemSeeds(TBBlocks.glieonia,Blocks.grass).setTextureName("thaumicbases:glieonia_seed").setUnlocalizedName("glieoniaSeed");
	public static Item rosehipSyrup = new ItemRosehipSyrup().setTextureName("thaumicbases:rosehip_syrup").setUnlocalizedName("rosehipSyrup").setMaxStackSize(16);
	public static Item tobaccoSeeds = new ItemSeeds(TBBlocks.tobacco,Blocks.farmland).setTextureName("thaumicbases:tobacco_seeds").setUnlocalizedName("tobaccoSeeds");
	public static Item mortar = new ItemMortarAndPestle().setTextureName("thaumicbases:mortar").setUnlocalizedName("mortar");
	public static Item voidSeed = new ItemSeeds(TBBlocks.voidPlant,Blocks.farmland).setTextureName("thaumicbases:void_seed").setUnlocalizedName("voidSeed");
	
	public static Item nodeFoci = new ItemNodeFoci().setUnlocalizedName("nodeFoci.");
	public static Item voidShears = new ItemVoidShears().setTextureName("thaumicbases:shears").setUnlocalizedName("tb.voidShears").setFull3D().setMaxDamage(184).setFull3D().setMaxStackSize(1);
	public static Item voidFAS = new ItemVoidFlintAndSteel().setTextureName("thaumicbases:flint_and_steel").setUnlocalizedName("tb.voidFAS").setFull3D().setMaxDamage(184).setFull3D().setMaxStackSize(1);
	public static Item revolver = new ItemRevolver().setMaxDamage(1561).setMaxStackSize(1).setFull3D().setUnlocalizedName("tb.revolver");
	public static Item ukulele = new ItemUkulele().setFull3D().setMaxStackSize(1).setMaxDamage(0).setUnlocalizedName("tb.ukulele");
	public static Item shardCluster = new ItemShardCluster();
	
	public static WandCap WAND_CAP_THAUMINITE;
	
	public static WandRod WAND_ROD_THAUMIUM;
	public static WandRod WAND_ROD_VOID;
	
	
	public static final Class<TBCore> core = TBCore.class;
} public class TBRecipes {
	
	@SuppressWarnings("unused")
	public static void setup()
	{
		new BraceletState.BraceletStateGeneric("iron", loc("thaumcraft","textures/blocks/base_metal.png"), ConfigItems.WAND_CAP_IRON, ConfigItems.WAND_ROD_WOOD, 50);
		new BraceletState.BraceletStateGeneric("gold", loc("thaumcraft","textures/blocks/base_gold.png"), ConfigItems.WAND_CAP_GOLD, ConfigItems.WAND_ROD_WOOD, 75);
		new BraceletState.BraceletStateGeneric("greatwood", loc("thaumcraft","textures/blocks/greatwood_plank.png"), ConfigItems.WAND_CAP_GOLD, ConfigItems.WAND_ROD_GREATWOOD, 80);
		new BraceletState.BraceletStateGeneric("brass", loc("thaumcraft","textures/blocks/base_brass.png"), ConfigItems.WAND_CAP_BRASS, ConfigItems.WAND_ROD_GREATWOOD, 90);
		new BraceletState.BraceletStateGeneric("thaumium", loc("thaumcraft","textures/blocks/thaumium_metal.png"), TBItems.WAND_CAP_THAUMINITE, TBItems.WAND_ROD_THAUMIUM, 100);
		new BraceletState.BraceletStateGeneric("silverwood", loc("thaumcraft","textures/blocks/silverwood_plank.png"), ConfigItems.WAND_CAP_THAUMIUM, ConfigItems.WAND_ROD_SILVERWOOD, 110);
		new BraceletState.BraceletStateGeneric("reed", loc("thaumicbases","textures/blocks/sugarcaneblock.png"), ConfigItems.WAND_CAP_THAUMIUM, ConfigItems.WAND_ROD_REED, 110);
		new BraceletState.BraceletStateGeneric("bone", loc("thaumicbases","textures/blocks/boneblock.png"), ConfigItems.WAND_CAP_THAUMIUM, ConfigItems.WAND_ROD_BONE, 110);
		new BraceletState.BraceletStateGeneric("obsidian", loc("minecraft","textures/blocks/obsidian.png"), ConfigItems.WAND_CAP_THAUMIUM, ConfigItems.WAND_ROD_OBSIDIAN, 110);
		new BraceletState.BraceletStateGeneric("blaze", loc("thaumicbases","textures/blocks/blazeblock.png"), ConfigItems.WAND_CAP_THAUMIUM, ConfigItems.WAND_ROD_BLAZE, 110);
		new BraceletState.BraceletStateGeneric("ice", loc("minecraft","textures/blocks/ice_packed.png"), ConfigItems.WAND_CAP_THAUMIUM, ConfigItems.WAND_ROD_ICE, 110);
		new BraceletState.BraceletStateGeneric("quartz", loc("minecraft","textures/blocks/quartz_block_bottom.png"), ConfigItems.WAND_CAP_THAUMIUM, ConfigItems.WAND_ROD_QUARTZ, 110);
		new BraceletState.BraceletStateGeneric("void", loc("thaumicbases","textures/blocks/voidblock.png"), ConfigItems.WAND_CAP_THAUMIUM, TBItems.WAND_ROD_VOID, 150);
		new BraceletState.BraceletStateGeneric("primal", loc("thaumcraft","textures/blocks/eldritch_door.png"), ConfigItems.WAND_CAP_VOID, ConfigItems.STAFF_ROD_PRIMAL, 225);
	
		OreDictionary.registerOre("obsidian", Blocks.obsidian);
		
		ShapelessOreRecipe qBl = new ShapelessOreRecipe(new ItemStack(TBBlocks.quicksilverBlock), new Object[]{"quicksilver","quicksilver","quicksilver","quicksilver","quicksilver","quicksilver","quicksilver","quicksilver","quicksilver"});
		ShapelessOreRecipe qSi = new ShapelessOreRecipe(new ItemStack(ItemsTC.quicksilver, 9, 0),new Object[]{"blockQuicksilver"});
		ShapelessOreRecipe qBr = new ShapelessOreRecipe(new ItemStack(TBBlocks.quicksilverBrick, 4, 0),new Object[]{"blockQuicksilver","blockQuicksilver","blockQuicksilver","blockQuicksilver"});
		ShapelessOreRecipe smB = new ShapelessOreRecipe(new ItemStack(ItemsTC.salisMundus,9,0),new Object[]{"blockSalisMundus"});
		ShapelessOreRecipe tnU = new ShapelessOreRecipe(new ItemStack(TBItems.resource,9,0),new Object[]{new ItemStack(TBItems.resource,1,1)});
		ShapelessOreRecipe tnI = new ShapelessOreRecipe(new ItemStack(TBItems.resource,1,1),new Object[]{new ItemStack(TBItems.resource,1,0),new ItemStack(TBItems.resource,1,0),new ItemStack(TBItems.resource,1,0),new ItemStack(TBItems.resource,1,0),new ItemStack(TBItems.resource,1,0),new ItemStack(TBItems.resource,1,0),new ItemStack(TBItems.resource,1,0),new ItemStack(TBItems.resource,1,0),new ItemStack(TBItems.resource,1,0)});
		ShapelessOreRecipe tnB = new ShapelessOreRecipe(new ItemStack(TBBlocks.thauminiteBlock, 1, 0),new Object[]{"ingotThauminite","ingotThauminite","ingotThauminite","ingotThauminite","ingotThauminite","ingotThauminite","ingotThauminite","ingotThauminite","ingotThauminite"});
		ShapelessOreRecipe tiB = new ShapelessOreRecipe(new ItemStack(TBItems.resource,9,1),new Object[]{TBBlocks.thauminiteBlock});
		ShapelessOreRecipe enP = new ShapelessOreRecipe(new ItemStack(TBBlocks.planks,4,0),new Object[]{new ItemStack(TBBlocks.genLogs,1,2)});
		ShapelessOreRecipe goP = new ShapelessOreRecipe(new ItemStack(TBBlocks.planks,4,1),new Object[]{new ItemStack(TBBlocks.genLogs,1,3)});
		ShapelessOreRecipe peP = new ShapelessOreRecipe(new ItemStack(TBBlocks.planks,4,2),new Object[]{new ItemStack(TBBlocks.genLogs,1,0)});
		ShapelessOreRecipe neP = new ShapelessOreRecipe(new ItemStack(TBBlocks.planks,4,3),new Object[]{new ItemStack(TBBlocks.genLogs,1,1)});
		
		ShapedOreRecipe eAr = new ShapedOreRecipe(new ItemStack(TBBlocks.eldritchArk,5,0),new Object[]{
			"@#@",
			"###",
			"@#@",
			'@',"nuggetGold",
			'#',"obsidian"
		});
		
		ShapedOreRecipe iGw = new ShapedOreRecipe(new ItemStack(TBBlocks.ironGreatwood,5,0),new Object[]{
			"@#@",
			"###",
			"@#@",
			'@',"nuggetIron",
			'#',new ItemStack(BlocksTC.plank,1,0)
		});
		
		GameRegistry.addSmelting(new ItemStack(TBBlocks.genLogs,1,0), new ItemStack(Items.coal,1,1), 0.15F);
		GameRegistry.addSmelting(new ItemStack(TBBlocks.genLogs,1,1), new ItemStack(Items.coal,1,1), 0.15F);
		GameRegistry.addSmelting(new ItemStack(TBBlocks.genLogs,1,2), new ItemStack(Items.coal,1,1), 0.15F);
		
		recipes.put("quicksilverBlock", qBl);
		recipes.put("quicksilver", qSi);
		recipes.put("quicksilverBrick", qBr);
		recipes.put("salisMundusFromBlock", smB);
		recipes.put("thauminiteNugget", tnU);
		recipes.put("thauminiteIngot", tnI);
		recipes.put("thauminiteIngotFromBlock", tiB);
		recipes.put("thauminiteBlock", tnB);
		recipes.put("eldritchArk", eAr);
		recipes.put("ironGreatwood", iGw);
		recipes.put("enderPlanks", enP);
		recipes.put("goldenOakPlanks", goP);
		recipes.put("peacefullTreePlanks", peP);
		recipes.put("netherTreePlanks", neP);
		GameRegistry.addRecipe(qBl);
		GameRegistry.addRecipe(qSi);
		GameRegistry.addRecipe(qBr);
		GameRegistry.addRecipe(smB);
		GameRegistry.addRecipe(tnU);
		GameRegistry.addRecipe(tnI);
		GameRegistry.addRecipe(tiB);
		GameRegistry.addRecipe(tnB);
		GameRegistry.addRecipe(eAr);
		GameRegistry.addRecipe(iGw);
		GameRegistry.addRecipe(enP);
		GameRegistry.addRecipe(goP);
		GameRegistry.addRecipe(peP);
		GameRegistry.addRecipe(neP);
		
		for(int i = 0; i < BlockHalfSlab.parents.length; ++i)
		{
			ShapedOreRecipe slabRec = new ShapedOreRecipe(new ItemStack(TBBlocks.genericSlab,6,i),new Object[]{
				"###",
				'#',BlockHalfSlab.parents[i]
			});
			slabs.add(slabRec);
			GameRegistry.addRecipe(slabRec);
		}
		
		for(int i = 0; i < 8; ++i)
		{
			ShapedOreRecipe slabRec = new ShapedOreRecipe(new ItemStack(TBBlocks.crystalSlab,6,i),new Object[]{
				"###",
				'#',new ItemStack(TBBlocks.crystalBlock,1,i)
			});
			slabs.add(slabRec);
			GameRegistry.addRecipe(slabRec);
		}
		
		for(int i = 0; i < 4; ++i)
		{
			ShapedOreRecipe slabRec = new ShapedOreRecipe(new ItemStack(TBBlocks.woodSlab,6,i),new Object[]{
				"###",
				'#',new ItemStack(TBBlocks.planks,1,i)
			});
			slabs.add(slabRec);
			GameRegistry.addRecipe(slabRec);
		}
		
		BlockTBPlant.class.cast(TBBlocks.plax).dropItem = new ItemStack(Items.string,3,0);
		BlockTBPlant.class.cast(TBBlocks.plax).dropSeed = new ItemStack(TBItems.plaxSeed,1,0);
		
		BlockTBPlant.class.cast(TBBlocks.metalleat).dropItem = new ItemStack(ItemsTC.nuggets,2,0);
		BlockTBPlant.class.cast(TBBlocks.metalleat).dropSeed = new ItemStack(TBItems.metalleatSeeds,1,0);
		
		BlockTBPlant.class.cast(TBBlocks.lucrite).dropItem = new ItemStack(Items.gold_nugget,3,0);
		BlockTBPlant.class.cast(TBBlocks.lucrite).dropSeed = new ItemStack(TBItems.lucriteSeeds,1,0);
		
		BlockTBPlant.class.cast(TBBlocks.knose).dropSeed = new ItemStack(TBItems.knoseSeed,1,0);
		
		BlockTBPlant.class.cast(TBBlocks.sweed).dropSeed = new ItemStack(TBItems.sweedSeeds,1,0);
		
		BlockTBPlant.class.cast(TBBlocks.lazullia).dropItem = new ItemStack(Items.dye,1,4);
		BlockTBPlant.class.cast(TBBlocks.lazullia).dropSeed = new ItemStack(TBItems.lazulliaSeeds,1,0);
		
		BlockTBPlant.class.cast(TBBlocks.ashroom).dropSeed = new ItemStack(TBBlocks.ashroom,1,0);
		
		BlockTBPlant.class.cast(TBBlocks.glieonia).dropItem = new ItemStack(Items.glowstone_dust,2,0);
		BlockTBPlant.class.cast(TBBlocks.glieonia).dropSeed = new ItemStack(TBItems.glieoniaSeed,1,0);
		
		BlockTBPlant.class.cast(TBBlocks.tobacco).dropItem = new ItemStack(TBItems.resource,1,7);
		BlockTBPlant.class.cast(TBBlocks.tobacco).dropSeed = new ItemStack(TBItems.tobaccoSeeds,1,0);
		
		BlockTBPlant.class.cast(TBBlocks.voidPlant).dropItem = new ItemStack(ItemsTC.voidSeed,1,0);
		BlockTBPlant.class.cast(TBBlocks.voidPlant).dropSeed = new ItemStack(TBItems.voidSeed,1,0);
		
		EntityEnderman.setCarriable(TBBlocks.genLogs, true);
		
		CropUtils.addStandardCrop(new ItemStack(TBBlocks.aureliaPetal), 0);
		CropUtils.addStandardCrop(new ItemStack(TBBlocks.briar), 7);
		CropUtils.addStandardCrop(new ItemStack(TBBlocks.glieonia), 3);
		CropUtils.addStandardCrop(new ItemStack(TBBlocks.knose), 3);
		CropUtils.addStandardCrop(new ItemStack(TBBlocks.lazullia), 7);
		CropUtils.addStandardCrop(new ItemStack(TBBlocks.lucrite), 7);
		CropUtils.addStandardCrop(new ItemStack(TBBlocks.metalleat), 7);
		CropUtils.addStandardCrop(new ItemStack(TBBlocks.plax), 7);
		CropUtils.addStandardCrop(new ItemStack(TBBlocks.sweed), 3);
		CropUtils.addStandardCrop(new ItemStack(TBBlocks.tobacco), 7);
		CropUtils.addStandardCrop(new ItemStack(TBBlocks.voidPlant), 7);
	}	

	public static final ResourceLocation loc(String domain, String path)
	{
		return new ResourceLocation(domain,path);
	}
	
	public static final Hashtable<String, IRecipe> recipes = new Hashtable<String, IRecipe>();
	
	public static final List<ShapedOreRecipe> slabs = new ArrayList<ShapedOreRecipe>();
} public class TBThaumonomicon {
	
	public static void setup()
	{
		OreDictionary.registerOre("pestleAndMortar", new ItemStack(TBItems.mortar,1,OreDictionary.WILDCARD_VALUE));
		
		ThaumcraftApi.registerObjectTag(new ItemStack(TBBlocks.pyrofluid,1,OreDictionary.WILDCARD_VALUE), new AspectList().add(Aspect.FIRE, 16).add(Aspect.BEAST, 8).add(Aspect.LIGHT, 6));
		ThaumcraftApi.registerObjectTag(new ItemStack(TBBlocks.ironGreatwood,1,OreDictionary.WILDCARD_VALUE), new AspectList().add(Aspect.PLANT, 1).add(Aspect.METAL, 1));
		ThaumcraftApi.registerObjectTag(new ItemStack(TBItems.plaxSeed), new AspectList().add(Aspect.PLANT, 1).add(Aspect.CRAFT, 1));
		ThaumcraftApi.registerObjectTag(new ItemStack(TBBlocks.aurelia,1,OreDictionary.WILDCARD_VALUE), new AspectList().add(Aspect.PLANT, 1).add(Aspect.AURA, 3).add(Aspect.LIGHT, 1).add(Aspect.SENSES, 1).add(Aspect.LIFE, 1));
		ThaumcraftApi.registerObjectTag(new ItemStack(TBBlocks.aureliaPetal,1,OreDictionary.WILDCARD_VALUE), new AspectList().add(Aspect.PLANT, 1).add(Aspect.AURA, 6).add(Aspect.SENSES, 1));
		ThaumcraftApi.registerObjectTag(new ItemStack(TBItems.resource,1,5), new AspectList().add(Aspect.PLANT, 1).add(Aspect.AURA, 6));
		ThaumcraftApi.registerObjectTag(new ItemStack(TBItems.resource,1,6), new AspectList().add(Aspect.PLANT, 1).add(Aspect.LIFE, 1));
		ThaumcraftApi.registerObjectTag(new ItemStack(TBItems.resource,1,7), new AspectList().add(Aspect.PLANT, 1).add(Aspect.MAN, 1));
		ThaumcraftApi.registerObjectTag(new ItemStack(TBItems.tobacco,1,0), new AspectList().add(Aspect.PLANT, 1).add(Aspect.MAN, 1).add(Aspect.ENTROPY, 0));
		ThaumcraftApi.registerObjectTag(new ItemStack(TBItems.mortar,1,OreDictionary.WILDCARD_VALUE), new AspectList().add(Aspect.PLANT, 6).add(Aspect.TOOL, 1));
		
		ThaumcraftApi.registerObjectTag(new ItemStack(TBItems.knoseFragment,1,0), new AspectList().add(Aspect.PLANT, 1).add(Aspect.AIR, 6));
		ThaumcraftApi.registerObjectTag(new ItemStack(TBItems.knoseFragment,1,1), new AspectList().add(Aspect.PLANT, 1).add(Aspect.FIRE, 6));
		ThaumcraftApi.registerObjectTag(new ItemStack(TBItems.knoseFragment,1,2), new AspectList().add(Aspect.PLANT, 1).add(Aspect.WATER, 6));
		ThaumcraftApi.registerObjectTag(new ItemStack(TBItems.knoseFragment,1,3), new AspectList().add(Aspect.PLANT, 1).add(Aspect.EARTH, 6));
		ThaumcraftApi.registerObjectTag(new ItemStack(TBItems.knoseFragment,1,4), new AspectList().add(Aspect.PLANT, 1).add(Aspect.ORDER, 6));
		ThaumcraftApi.registerObjectTag(new ItemStack(TBItems.knoseFragment,1,5), new AspectList().add(Aspect.PLANT, 1).add(Aspect.ENTROPY, 6));
		ThaumcraftApi.registerObjectTag(new ItemStack(TBItems.knoseFragment,1,6), new AspectList().add(Aspect.PLANT, 1).add(primals(2)));
		ThaumcraftApi.registerObjectTag(new ItemStack(TBItems.knoseFragment,1,7), new AspectList().add(Aspect.PLANT, 1).add(Aspect.FLUX, 6));
		
		ThaumcraftApi.registerObjectTag(new ItemStack(TBBlocks.genLeaves,1,0),new int[]{0,8}, new AspectList().add(Aspect.PLANT, 1));
		ThaumcraftApi.registerObjectTag(new ItemStack(TBBlocks.genLeaves,1,1),new int[]{1,9}, new AspectList().add(Aspect.PLANT, 1).add(Aspect.LIFE, 1));
		ThaumcraftApi.registerObjectTag(new ItemStack(TBBlocks.genLeaves,1,2),new int[]{2,10}, new AspectList().add(Aspect.PLANT, 1).add(Aspect.FIRE, 1));
		ThaumcraftApi.registerObjectTag(new ItemStack(TBBlocks.genLeaves,1,3),new int[]{3,11}, new AspectList().add(Aspect.PLANT, 1).add(Aspect.ELDRITCH, 1));
		
		ThaumcraftApi.registerObjectTag(new ItemStack(TBBlocks.genLogs,1,0), new int[]{0,4,8}, new AspectList().add(Aspect.PLANT, 3).add(Aspect.BEAST, 1).add(Aspect.LIFE, 1));
		ThaumcraftApi.registerObjectTag(new ItemStack(TBBlocks.genLogs,1,1), new int[]{1,5,9}, new AspectList().add(Aspect.PLANT, 3).add(Aspect.FIRE, 1).add(Aspect.FIRE, 1));
		ThaumcraftApi.registerObjectTag(new ItemStack(TBBlocks.genLogs,1,2), new int[]{2,6,10}, new AspectList().add(Aspect.PLANT, 3).add(Aspect.ELDRITCH, 1).add(Aspect.VOID, 1));
		
		ThaumcraftApi.registerObjectTag(new ItemStack(TBBlocks.sapling,1,0), new int[]{0,8}, new AspectList().add(Aspect.PLANT, 3).add(Aspect.DESIRE, 1));
		ThaumcraftApi.registerObjectTag(new ItemStack(TBBlocks.sapling,1,1), new int[]{1,9}, new AspectList().add(Aspect.PLANT, 3).add(Aspect.LIFE, 1));
		ThaumcraftApi.registerObjectTag(new ItemStack(TBBlocks.sapling,1,2), new int[]{2,10}, new AspectList().add(Aspect.PLANT, 3).add(Aspect.FIRE, 1));
		ThaumcraftApi.registerObjectTag(new ItemStack(TBBlocks.sapling,1,3), new int[]{3,11}, new AspectList().add(Aspect.PLANT, 3).add(Aspect.ELDRITCH, 1));

		ResearchCategories.registerCategory(catName,null, icon, back,back2);
		
		ResearchCategoryList ALCHEMY = ResearchCategories.getResearchList("ALCHEMY");
		ResearchItem crucRes = ALCHEMY.research.get("CRUCIBLE");
		
		copy(crucRes,"TB.CRUCIBLE",catName,0,0).setHidden().registerResearchItem();
		
		copy(ResearchCategories.getResearchList("ALCHEMY").research.get("METALLURGY"),"TB.METALLURGY",catName,7,1).setHidden().registerResearchItem();
		
		copy(ResearchCategories.getResearchList("ARTIFICE").research.get("INFUSION"),"TB.INFUSION",catName,0,-18).setHidden().registerResearchItem();
		
		copy(ResearchCategories.getResearchList("ELDRITCH").research.get("VOIDMETAL"),"TB.VOIDMETAL",catName,13,1).setHidden().registerResearchItem();
		
		copy(ResearchCategories.getResearchList("ARTIFICE").research.get("ENCHFABRIC"),"TB.ENCHFABRIC",catName,7,-4).setHidden().registerResearchItem();
		
		copy(ResearchCategories.getResearchList("ARTIFICE").research.get("ARCANEEAR"),"TB.ARCANEEAR",catName,-10,-16).setHidden().registerResearchItem();
		
		CrucibleRecipe wool3Rec = new CrucibleRecipe(new String[]{"TB.AdvancedEntropy"},new ItemStack(Items.string,3,0),new ItemStack(Blocks.wool,1,OreDictionary.WILDCARD_VALUE),new AspectList().add(Aspect.ENTROPY, 1));
		CrucibleRecipe sandstone3Rec = new CrucibleRecipe(new String[]{"TB.AdvancedEntropy"},new ItemStack(Blocks.sand,3,0),new ItemStack(Blocks.sandstone,1,OreDictionary.WILDCARD_VALUE),new AspectList().add(Aspect.ENTROPY, 1));
		CrucibleRecipe blaze3Rec = new CrucibleRecipe(new String[]{"TB.AdvancedEntropy"},new ItemStack(Items.blaze_powder,3,0),new ItemStack(Items.blaze_rod,1,0),new AspectList().add(Aspect.ENTROPY, 1));	
		
		CrucibleRecipe wool4Rec = new CrucibleRecipe(new String[]{"TB.MasterEntropy"},new ItemStack(Items.string,4,0),new ItemStack(Blocks.wool,1,OreDictionary.WILDCARD_VALUE),new AspectList().add(Aspect.ENTROPY, 1).add(Aspect.CRAFT, 1));
		CrucibleRecipe sandstone4Rec = new CrucibleRecipe(new String[]{"TB.MasterEntropy"},new ItemStack(Blocks.sand,4,0),new ItemStack(Blocks.sandstone,1,OreDictionary.WILDCARD_VALUE),new AspectList().add(Aspect.ENTROPY, 1).add(Aspect.CRAFT, 1));
		CrucibleRecipe blaze4Rec = new CrucibleRecipe(new String[]{"TB.MasterEntropy"},new ItemStack(Items.blaze_powder,4,0),new ItemStack(Items.blaze_rod,1,0),new AspectList().add(Aspect.ENTROPY, 1).add(Aspect.CRAFT, 1));	
		
		CrucibleRecipe glassSand = new CrucibleRecipe(new String[]{"TB.StrongEntropy"},new ItemStack(Blocks.sand,1,0),"blockGlass",new AspectList().add(Aspect.ENTROPY, 1));
		CrucibleRecipe gravelSand = new CrucibleRecipe(new String[]{"TB.StrongEntropy"},new ItemStack(Blocks.sand,1,0),new ItemStack(Blocks.gravel),new AspectList().add(Aspect.ENTROPY, 1));
		CrucibleRecipe barsIron = new CrucibleRecipe(new String[]{"TB.StrongEntropy"},new ItemStack(ItemsTC.nuggets,3,0),new ItemStack(Blocks.iron_bars),new AspectList().add(Aspect.ENTROPY, 1));
		
		CrucibleRecipe arrows = new CrucibleRecipe(new String[]{"TB.SimpleDublication"},new ItemStack(Items.arrow,2,0),new ItemStack(Items.arrow,1,0),new AspectList().add(Aspect.AVERSION, 1));
		CrucibleRecipe snowball = new CrucibleRecipe(new String[]{"TB.SimpleDublication"},new ItemStack(Items.snowball,2,0),new ItemStack(Items.snowball,1,0),new AspectList().add(Aspect.COLD, 1));
		CrucibleRecipe redstone = new CrucibleRecipe(new String[]{"TB.SimpleDublication"},new ItemStack(Items.redstone,2,0),new ItemStack(Items.redstone,1,0),new AspectList().add(Aspect.MECHANISM, 1).add(Aspect.ENERGY, 1));
		
		CrucibleRecipe amber = new CrucibleRecipe(new String[]{"TB.Amber"},new ItemStack(ItemsTC.amber,1,0),new ItemStack(Blocks.sapling,1,1),new AspectList().add(Aspect.TRAP, 2));
		CrucibleRecipe cinnabar = new CrucibleRecipe(new String[]{"TB.Quicksilver"},new ItemStack(ItemsTC.quicksilver, 3, 0),new ItemStack(BlocksTC.log,1,3),new AspectList().add(Aspect.ORDER, 1).add(Aspect.EXCHANGE, 1));
		CrucibleRecipe salisMundis = new CrucibleRecipe(new String[]{"TB.SM"},new ItemStack(ItemsTC.salisMundus, 2, 0),new ItemStack(ItemsTC.salisMundus,1,0),new AspectList().add(primals(2)).add(Aspect.ENERGY, 3));
		
		CrucibleRecipe gravel2Cobble = new CrucibleRecipe(new String[]{"TB.AlchemyRestoration"},new ItemStack(Blocks.cobblestone,1,0),new ItemStack(Blocks.gravel,1,0),new AspectList().add(Aspect.ORDER, 1));
		CrucibleRecipe icePacking = new CrucibleRecipe(new String[]{"TB.AlchemyRestoration"},new ItemStack(Blocks.packed_ice,1,0),new ItemStack(Blocks.ice,1,0),new AspectList().add(Aspect.EARTH, 1));
		
		CrucibleRecipe blazepowderRest = new CrucibleRecipe(new String[]{"TB.Backprocessing"},new ItemStack(Items.blaze_rod,1,0),new ItemStack(Items.blaze_powder,1,0),new AspectList().add(Aspect.ORDER, 6).add(Aspect.FIRE, 3).add(Aspect.ENERGY, 2).add(Aspect.CRAFT, 8).add(Aspect.EXCHANGE, 6).add(Aspect.ENERGY, 3));
		CrucibleRecipe boneRest = new CrucibleRecipe(new String[]{"TB.Backprocessing"},new ItemStack(Items.bone,1,0),new ItemStack(Items.dye,1,15),new AspectList().add(Aspect.ORDER, 2).add(Aspect.SENSES, 6).add(Aspect.CRAFT, 2).add(Aspect.EXCHANGE, 1).add(Aspect.DEATH, 4));
		CrucibleRecipe sugarRest = new CrucibleRecipe(new String[]{"TB.Backprocessing"},new ItemStack(Items.reeds,1,0),new ItemStack(Items.sugar,1,0),new AspectList().add(Aspect.ORDER, 1).add(Aspect.LIFE, 2));
		CrucibleRecipe cactiRest = new CrucibleRecipe(new String[]{"TB.Backprocessing"},new ItemStack(Blocks.cactus,1,0),new ItemStack(Items.dye,1,2),new AspectList().add(Aspect.ORDER, 1).add(Aspect.LIFE, 2).add(Aspect.EARTH, 1));
		
		CrucibleRecipe thauminiteRec = new CrucibleRecipe(new String[]{"TB.Thauminite"},new ItemStack(TBItems.resource,8,0),new ItemStack(ItemsTC.ingots,1,0),new AspectList().add(primals(1)).add(Aspect.CRYSTAL, 8).add(Aspect.CRAFT, 2));
		
		CrucibleRecipe pyrofluidRec = new CrucibleRecipe(new String[]{"TB.Pyrofluid"},new ItemStack(TBItems.pyroBucket,1,0),new ItemStack(Items.lava_bucket,1,0),new AspectList().add(Aspect.FIRE, 24).add(Aspect.ENERGY, 8));
		
		CrucibleRecipe plaxRec = new CrucibleRecipe(new String[]{"TB.Plax"},new ItemStack(TBItems.plaxSeed,1,0),new ItemStack(Items.wheat_seeds),new AspectList().add(Aspect.CRAFT, 4));
		CrucibleRecipe metalleatRec = new CrucibleRecipe(new String[]{"TB.Metalleat"},new ItemStack(TBItems.metalleatSeeds,1,0),new ItemStack(Items.wheat_seeds),new AspectList().add(Aspect.ORDER, 4).add(Aspect.METAL, 12).add(Aspect.LIFE, 4));
		CrucibleRecipe lucriteRec = new CrucibleRecipe(new String[]{"TB.Lucrite"},new ItemStack(TBItems.lucriteSeeds,1,0),new ItemStack(Items.golden_carrot),new AspectList().add(Aspect.DEATH, 4).add(Aspect.DESIRE, 12).add(Aspect.LIFE, 4));
		
		CrucibleRecipe aureliaRec = new CrucibleRecipe(new String[]{"TB.Aurelia"},new ItemStack(TBBlocks.aurelia),new ItemStack(Blocks.red_flower,1,7),new AspectList().add(Aspect.PLANT, 8).add(Aspect.ELDRITCH, 2).add(Aspect.AURA, 2));
		CrucibleRecipe knoseRec = new CrucibleRecipe(new String[]{"TB.Knose"},new ItemStack(TBItems.knoseSeed),new ItemStack(Blocks.double_plant,1,4),new AspectList().add(Aspect.MIND, 16).add(Aspect.LIFE, 8).add(Aspect.ENERGY, 2));
		CrucibleRecipe knowledgeFragmentRec = new CrucibleRecipe(new String[]{"TB.Knose"},new ItemStack(ItemsTC.knowledgeFragment,1,0),new ItemStack(TBItems.knoseFragment,1,OreDictionary.WILDCARD_VALUE),new AspectList().add(Aspect.ORDER, 1).add(Aspect.EXCHANGE, 1));
		CrucibleRecipe sweedRec = new CrucibleRecipe(new String[]{"TB.BasicPlants"},new ItemStack(TBItems.sweedSeeds),new ItemStack(Blocks.tallgrass,1,OreDictionary.WILDCARD_VALUE),new AspectList().add(Aspect.MOTION, 2).add(Aspect.LIFE, 1));
		CrucibleRecipe lazulliaRec = new CrucibleRecipe(new String[]{"TB.Lazullia"},new ItemStack(TBItems.lazulliaSeeds),new ItemStack(Items.wheat_seeds),new AspectList().add(Aspect.SENSES, 12).add(Aspect.DESIRE, 3));
		CrucibleRecipe rainbowCactiRec = new CrucibleRecipe(new String[]{"TB.RainbowCacti"},new ItemStack(TBBlocks.rainbowCactus),new ItemStack(Blocks.cactus),new AspectList().add(Aspect.EXCHANGE, 24).add(Aspect.SENSES, 6));
		CrucibleRecipe redlonRec = new CrucibleRecipe(new String[]{"TB.Redlon"},new ItemStack(TBItems.redlonSeeds),new ItemStack(Items.melon_seeds),new AspectList().add(Aspect.MECHANISM, 16).add(Aspect.ENERGY, 16));
		CrucibleRecipe aspectShroomRec = new CrucibleRecipe(new String[]{"TB.Ashroom"},new ItemStack(TBBlocks.ashroom,1,0),new ItemStack(BlocksTC.vishroom,1,0),new AspectList().add(Aspect.ENTROPY, 4).add(Aspect.PLANT, 2));
		CrucibleRecipe flaxiumRec = new CrucibleRecipe(new String[]{"TB.Flaxium"},new ItemStack(TBBlocks.flaxium,1,0),new ItemStack(Blocks.red_flower,1,2),new AspectList().add(Aspect.ENTROPY, 1).add(Aspect.ENERGY, 2));
		CrucibleRecipe glieoniaRec = new CrucibleRecipe(new String[]{"TB.Glieonia"},new ItemStack(TBItems.glieoniaSeed,1,0),new ItemStack(Blocks.red_flower,1,3),new AspectList().add(Aspect.LIGHT, 8).add(Aspect.ENERGY, 6).add(Aspect.LIFE, 4));
		CrucibleRecipe briarRec = new CrucibleRecipe(new String[]{"TB.Briar"},new ItemStack(TBBlocks.briar,1,0),new ItemStack(Blocks.double_plant,1,4),new AspectList().add(Aspect.LIFE, 4).add(Aspect.LIFE, 4).add(Aspect.PLANT, 4));
		CrucibleRecipe cleanEFabricRec = new CrucibleRecipe(new String[]{"TB.Spike.Iron"},new ItemStack(ItemsTC.fabric,1,0),new ItemStack(TBItems.resource,1,8),new AspectList().add(Aspect.ORDER, 1));
		
		ShapelessArcaneRecipe salisMundusBlockRec = new ShapelessArcaneRecipe("TB.SMB", new ItemStack(TBBlocks.dustBlock), new AspectList().add(primals(1)), new Object[]{new ItemStack(ItemsTC.salisMundus,1,0),new ItemStack(ItemsTC.salisMundus,1,0),new ItemStack(ItemsTC.salisMundus,1,0),new ItemStack(ItemsTC.salisMundus,1,0),new ItemStack(ItemsTC.salisMundus,1,0),new ItemStack(ItemsTC.salisMundus,1,0),new ItemStack(ItemsTC.salisMundus,1,0),new ItemStack(ItemsTC.salisMundus,1,0),new ItemStack(ItemsTC.salisMundus,1,0)});
		ShapelessArcaneRecipe rosehipRec = new ShapelessArcaneRecipe("TB.Briar",new ItemStack(TBItems.rosehipSyrup),new AspectList().add(Aspect.FIRE, 3).add(Aspect.WATER, 5), new Object[]{
			new ItemStack(ItemsTC.phial,1,0),
			new ItemStack(TBItems.resource,1,6),
			new ItemStack(Items.sugar,1,0)
		});
		
		ShapedArcaneRecipe[] toolsRec = new ShapedArcaneRecipe[10];
		
		ItemStack tiG = new ItemStack(TBItems.resource,1,1);
		
		toolsRec[0] = new ShapedArcaneRecipe("TB.Thauminite",new ItemStack(TBItems.thauminiteAxe),primals(15),new Object[]{
			"##",
			"#|",
			" |",
			'#',tiG,
			'|',"stickWood"
		});
		
		toolsRec[1] = new ShapedArcaneRecipe("TB.Thauminite",new ItemStack(TBItems.thauminiteHoe),primals(15),new Object[]{
			"##",
			" |",
			" |",
			'#',tiG,
			'|',"stickWood"
		});
		
		toolsRec[2] = new ShapedArcaneRecipe("TB.Thauminite",new ItemStack(TBItems.thauminiteShovel),primals(15),new Object[]{
			"#",
			"|",
			"|",
			'#',tiG,
			'|',"stickWood"
		});
		
		toolsRec[3] = new ShapedArcaneRecipe("TB.Thauminite",new ItemStack(TBItems.thauminiteSword),primals(15),new Object[]{
			"#",
			"#",
			"|",
			'#',tiG,
			'|',"stickWood"
		});
		
		toolsRec[4] = new ShapedArcaneRecipe("TB.Thauminite",new ItemStack(TBItems.thauminiteShears),primals(15),new Object[]{
			" #",
			"# ",
			'#',tiG
		});
		
		toolsRec[5] = new ShapedArcaneRecipe("TB.Thauminite",new ItemStack(TBItems.thauminitePickaxe),primals(15),new Object[]{
			"###",
			" | ",
			" | ",
			'#',tiG,
			'|',"stickWood"
		});
		
		toolsRec[6] = new ShapedArcaneRecipe("TB.Thauminite",new ItemStack(TBItems.thauminiteHelmet),primals(25),new Object[]{
			"###",
			"# #",
			'#',tiG
		});
		
		toolsRec[7] = new ShapedArcaneRecipe("TB.Thauminite",new ItemStack(TBItems.thauminiteChest),primals(25),new Object[]{
			"# #",
			"###",
			"###",
			'#',tiG
		});
		
		toolsRec[8] = new ShapedArcaneRecipe("TB.Thauminite",new ItemStack(TBItems.thauminiteLeggings),primals(25),new Object[]{
			"###",
			"# #",
			"# #",
			'#',tiG
		});
		
		toolsRec[9] = new ShapedArcaneRecipe("TB.Thauminite",new ItemStack(TBItems.thauminiteBoots),primals(25),new Object[]{
			"# #",
			"# #",
			'#',tiG
		});
		

		ShapedArcaneRecipe thauminiteCaps = new ShapedArcaneRecipe("CAP_thauminite", new ItemStack(TBItems.resource,1,2), primals(25), new Object[]{
			"###",
			"#@#",
			"@@@",
			'#',new ItemStack(TBItems.resource,1,0),
			'@',new ItemStack(ItemsTC.salisMundus,1,0)
		});
		
		ShapedArcaneRecipe thaumicWandCore = new ShapedArcaneRecipe("ROD_tbthaumium", new ItemStack(TBItems.resource,1,3), primals(50), new Object[]{
			" @#",
			"@#@",
			"#@ ",
			'#',new ItemStack(ItemsTC.ingots,1,0),
			'@',new ItemStack(ItemsTC.salisMundus,1,0)
		});
		
		ShapedArcaneRecipe ironSpikeRec = new ShapedArcaneRecipe("TB.Spike.Iron",new ItemStack(TBBlocks.spike,1,0),new AspectList().add(Aspect.FIRE, 1).add(Aspect.ENTROPY, 1), new Object[]{
			" * ",
			"*#*",
			"#_#",
			'*',"nuggetIron",
			'#',"ingotIron",
			'_',new ItemStack(Blocks.heavy_weighted_pressure_plate,1,0)
		});
		
		ShapedArcaneRecipe thaumiumSpikeRec = new ShapedArcaneRecipe("TB.Spike.Thaumic",new ItemStack(TBBlocks.spike,1,2),primals(4), new Object[]{
			" * ",
			"*#*",
			"#_#",
			'*',"nuggetThaumium",
			'#',"ingotThaumium",
			'_',new ItemStack(TBBlocks.spike,1,0)
		});
		
		ShapedArcaneRecipe voidSpikeRec = new ShapedArcaneRecipe("TB.Spike.Void",new ItemStack(TBBlocks.spike,1,4),primals(4), new Object[]{
			" * ",
			"*#*",
			"#_#",
			'*',"nuggetVoid",
			'#',"ingotVoid",
			'_',new ItemStack(TBBlocks.spike,1,2)
		});
		
		CrucibleRecipe[] cBlocks = new CrucibleRecipe[8];
		
		int[] shardClusterMeta = new int[]{
			3,0,1,2,4,5,6,7
		};
		
		for(int i = 0; i < 8; ++i)
			if(i < 6)
				cBlocks[i] = new CrucibleRecipe(new String[]{"TB.CrystalBlocks"},new ItemStack(TBBlocks.crystalBlock,1,i),new ItemStack(TBItems.shardCluster,1,shardClusterMeta[i]),new AspectList().add(primals(1)).add(Aspect.CRAFT, 2).add(getPrimalForLoop(i), 2));
			else
				if(i == 7)
					cBlocks[i] = new CrucibleRecipe(new String[]{"TB.CrystalBlocks"},new ItemStack(TBBlocks.crystalBlock,1,i),new ItemStack(TBItems.shardCluster,1,shardClusterMeta[i]),new AspectList().add(primals(1)).add(Aspect.CRAFT, 2).add(primals(1)));
				else
					cBlocks[i] = new CrucibleRecipe(new String[]{"TB.CrystalBlocks"},new ItemStack(TBBlocks.crystalBlock,1,i),new ItemStack(TBItems.shardCluster,1,shardClusterMeta[i]),new AspectList().add(primals(1)).add(Aspect.CRAFT, 2).add(Aspect.FLUX, 2).add(primals(1)));
		
		InfusionRecipe voidRodRecipe = new InfusionRecipe("ROD_tbvoid", new ItemStack(TBItems.resource,1,4), 6, new AspectList().add(Aspect.ELDRITCH, 64).add(Aspect.VOID, 64).add(Aspect.ENERGY, 64).add(Aspect.AURA, 24).add(Aspect.ENERGY, 24), new ItemStack(TBItems.resource,1,3), new ItemStack[]{
			new ItemStack(ItemsTC.ingots,1,1),
			new ItemStack(ItemsTC.ingots,1,1),
			new ItemStack(ItemsTC.ingots,1,1),
			new ItemStack(ItemsTC.ingots,1,1),
			new ItemStack(TBBlocks.dustBlock,1,0),
			new ItemStack(TBBlocks.dustBlock,1,0),
			new ItemStack(TBBlocks.crystalBlock,1,7),
			new ItemStack(TBBlocks.crystalBlock,1,7)
		});
		
		InfusionRecipe voidSeedRec = new InfusionRecipe("TB.VoidSeed",new ItemStack(TBItems.voidSeed,1,0),3,new AspectList().add(Aspect.ELDRITCH, 16).add(Aspect.DARKNESS, 16).add(Aspect.PLANT, 16),new ItemStack(ItemsTC.voidSeed),new ItemStack[]{
			new ItemStack(Items.wheat_seeds,1,0),
			new ItemStack(Items.pumpkin_seeds,1,0),
			new ItemStack(Items.melon_seeds,1,0),
			new ItemStack(Items.poisonous_potato,1,0),
			new ItemStack(Items.carrot,1,0),
			new ItemStack(Items.nether_wart,1,0),
		});
		
		ShapedArcaneRecipe bloodyChestRec = new ShapedArcaneRecipe("TB.BloodyRobes",new ItemStack(TBItems.bloodyChest,1,0),new AspectList().add(Aspect.AIR, 5), new Object[]{
			"# #",
			"###",
			"###",
			'#',new ItemStack(TBItems.resource,1,8)
		});
		
		ShapedArcaneRecipe bloodyLegsRec = new ShapedArcaneRecipe("TB.BloodyRobes",new ItemStack(TBItems.bloodyLeggings,1,0),new AspectList().add(Aspect.WATER, 5), new Object[]{
			"###",
			"# #",
			"# #",
			'#',new ItemStack(TBItems.resource,1,8)
		});
		
		ShapedArcaneRecipe bloodyBootsRec = new ShapedArcaneRecipe("TB.BloodyRobes",new ItemStack(TBItems.bloodyBoots,1,0),new AspectList().add(Aspect.EARTH, 3), new Object[]{
			"# #",
			"# #",
			'#',new ItemStack(TBItems.resource,1,8)
		});
		
		ShapelessArcaneRecipe[] clusters = new ShapelessArcaneRecipe[8];
		
		int[] shardMeta = new int[]{
			1,2,3,0,4,5,6,6
		};
		
		for(int i = 0; i < 8; ++i)
		{
			Object[] obj = new Object[7];
			obj[0] = new ItemStack(Items.stick,1,0);
			if(i == 6)
			{
				for(int j = 0; j < 6; ++j)
					obj[1+j] = new ItemStack(ItemsTC.shard,1,shardMeta[j]);
			}else
				for(int j = 0; j < 6; ++j)
					obj[1+j] = new ItemStack(ItemsTC.shard,1,shardMeta[i]);
			clusters[i] = new ShapelessArcaneRecipe("TB.Clusters", new ItemStack(TBItems.shardCluster,1,i), new AspectList().add(Aspect.ORDER, 1), obj);
		}
		
		/*
		InfusionRecipe drainFociRec = new InfusionRecipe("TB.Foci.Drain",new ItemStack(TBItems.fociDrain),0,new AspectList().add(Aspect.WATER, 3).add(Aspect.VOID, 6),new ItemStack(ItemsTC.focusExcavation,1,0),new ItemStack[]{
			new ItemStack(Items.bucket),
			new ItemStack(Items.bucket),
			new ItemStack(ConfigBlocks.blockJar,1,3),
			new ItemStack(ConfigBlocks.blockJar,1,3)
		});
		
		InfusionRecipe expFociRec = new InfusionRecipe("TB.Foci.Experience",new ItemStack(TBItems.fociExperience),5,new AspectList().add(Aspect.DESIRE, 32).add(Aspect.VOID, 32).add(Aspect.MIND, 16).add(Aspect.DEATH, 32).add(Aspect.MINE, 8),new ItemStack(ItemsTC.focusExcavation,1,0),new ItemStack[]{
			new ItemStack(Items.gold_ingot),
			new ItemStack(Items.gold_ingot),
			new ItemStack(Items.emerald),
			new ItemStack(Items.emerald),
			new ItemStack(Items.iron_axe,1,OreDictionary.WILDCARD_VALUE),
			new ItemStack(Items.iron_pickaxe,1,OreDictionary.WILDCARD_VALUE),
			new ItemStack(Items.iron_shovel,1,OreDictionary.WILDCARD_VALUE),
			new ItemStack(Items.shears,1,OreDictionary.WILDCARD_VALUE)
		});
		
		InfusionRecipe fluxFociRec = new InfusionRecipe("TB.Foci.Flux",new ItemStack(TBItems.fociFlux),3,new AspectList().add(Aspect.WATER, 16).add(Aspect.VOID, 16).add(Aspect.ORDER, 16),new ItemStack(Items.diamond,1,0),new ItemStack[]{
			new ItemStack(ItemsTC.shard,1,6),
			new ItemStack(ItemsTC.shard,1,6),
			new ItemStack(BlocksTC.wandWorkbench,1,0),
			new ItemStack(ConfigBlocks.blockJar,1,3)
		});
		
		InfusionRecipe activationFociRec = new InfusionRecipe("TB.Foci.Activation",new ItemStack(TBItems.fociActivation),0,new AspectList().add(Aspect.MOTION, 8).add(Aspect.SENSES, 8).add(Aspect.MOTION, 8),new ItemStack(ItemsTC.mirroredGlass,1,0),new ItemStack[]{
			new ItemStack(ItemsTC.knowledgeFragment,1,0),
			new ItemStack(ItemsTC.knowledgeFragment,1,0),
			new ItemStack(ItemsTC.salisMundus,1,0),
			new ItemStack(ItemsTC.salisMundus,1,0)
		});
		*/
		
		Block[] recBlocks = new Block[]{
			Blocks.cobblestone,
			Blocks.gravel,
			Blocks.mossy_cobblestone,
			Blocks.iron_block,
			Blocks.diamond_block,
			Blocks.lapis_block,
			Blocks.gold_block,
			Blocks.brick_block
		};
		
		Block[] recResult = new Block[]{
				TBBlocks.oldCobble,
				TBBlocks.oldGravel,
				TBBlocks.oldCobbleMossy,
				TBBlocks.oldIron,
				TBBlocks.oldDiamond,
				TBBlocks.oldLapis,
				TBBlocks.oldGold,
				TBBlocks.oldBrick
			};
		
		ShapedArcaneRecipe[] oldRec = new ShapedArcaneRecipe[recResult.length];
		
		for(int i = 0; i < oldRec.length; ++i)
			oldRec[i] = new ShapedArcaneRecipe("TB.DecoBlocks",new ItemStack(recResult[i],6,0),new AspectList().add(Aspect.ENTROPY, 1),new Object[]{
				"# #",
				"# #",
				"# #",
				'#',new ItemStack(recBlocks[i],1,0)
			});
		
		/*
		ShapedArcaneRecipe advFurnaceRecipe = new ShapedArcaneRecipe("TB.AdvAlc",TBBlocks.advAlchFurnace,new AspectList().add(Aspect.WATER, 20).add(Aspect.FIRE, 20).add(Aspect.AIR, 10),new Object[]{
			"# #",
			"#@#",
			"$$$",
			'#',new ItemStack(ItemsTC.ingots,1,0),
			'@',new ItemStack(ConfigBlocks.blockStoneDevice,1,0),
			'$',new ItemStack(ConfigBlocks.blockWoodenDevice,1,0)
		});
		*/
		
		InfusionRecipe cryingObsidianRec = new InfusionRecipe("TB.CryingObs", new ItemStack(TBBlocks.cryingObsidian,1,0), 2, new AspectList().add(Aspect.MOTION, 16).add(Aspect.LIFE, 16).add(Aspect.SOUL, 16), new ItemStack(Blocks.obsidian), new ItemStack[]{
			new ItemStack(Items.diamond),
			new ItemStack(Items.bed),
			new ItemStack(TBBlocks.oldLapis),
			new ItemStack(TBBlocks.oldLapis)
		});
		
		InfusionRecipe overchanterRec = new InfusionRecipe("TB.Overchanter",new ItemStack(TBBlocks.overchanter,1,0),4,new AspectList().add(primals(32)).add(Aspect.ENERGY, 32).add(Aspect.MECHANISM, 32).add(Aspect.MIND, 16),new ItemStack(Blocks.enchanting_table),new ItemStack[]{
			new ItemStack(TBBlocks.crystalBlock,1,0),
			new ItemStack(TBBlocks.crystalBlock,1,1),
			new ItemStack(TBBlocks.crystalBlock,1,2),
			new ItemStack(TBBlocks.crystalBlock,1,3),
			new ItemStack(TBBlocks.crystalBlock,1,4),
			new ItemStack(TBBlocks.crystalBlock,1,5),
			new ItemStack(TBBlocks.crystalBlock,1,6),
			new ItemStack(TBBlocks.crystalBlock,1,6),
			new ItemStack(TBBlocks.dustBlock,1,0),
			new ItemStack(TBBlocks.dustBlock,1,0),
			new ItemStack(BlocksTC.metal,1,0),
			new ItemStack(BlocksTC.metal,1,0)
		});
		
		InfusionRecipe goldenOakRec = new InfusionRecipe("TB.GoldenOak",new ItemStack(TBBlocks.sapling),2,new AspectList().add(Aspect.PLANT, 16).add(Aspect.DESIRE, 64),new ItemStack(Blocks.sapling,1,0),new ItemStack[]{
			new ItemStack(Items.apple),
			new ItemStack(Items.apple),
			new ItemStack(Items.golden_apple),
			new ItemStack(Items.golden_apple)
		});
		
		InfusionRecipe nodeManipulatorRec = new InfusionRecipe("TB.NodeMan",new ItemStack(TBBlocks.nodeManipulator,1,0),6,new AspectList().add(Aspect.MECHANISM, 32).add(Aspect.AURA, 32).add(Aspect.ENERGY,16).add(Aspect.ENERGY, 64).add(Aspect.VOID, 16),new ItemStack(BlocksTC.infusionMatrix,1,0),new ItemStack[]{
			new ItemStack(BlocksTC.dioptra,1,0),
			new ItemStack(BlocksTC.mirror,1,0),
			new ItemStack(BlocksTC.mirrorEssentia,1,0),
			new ItemStack(BlocksTC.wandWorkbench,1,0),
			new ItemStack(TBBlocks.dustBlock,1,0),
			new ItemStack(BlocksTC.dioptra,1,0),
			new ItemStack(BlocksTC.mirror,1,0),
			new ItemStack(BlocksTC.mirrorEssentia,1,0),
			new ItemStack(BlocksTC.wandWorkbench,1,0),
			new ItemStack(TBBlocks.dustBlock,1,0)
		});
		
		boolean flag = TBConfig.brightFociRequiresPrimordialPearl;
		
		InfusionRecipe brightFociRec = new InfusionRecipe("TB.NodeFoci.Bright",new ItemStack(TBItems.nodeFoci,1,0),3,new AspectList().add(Aspect.AURA, flag ? 256 : 64).add(Aspect.LIGHT, flag ? 64 : 16).add(Aspect.ENERGY, flag ? 256 : 32),flag ? new ItemStack(ItemsTC.primordialPearl,1,0) : new ItemStack(ItemsTC.primalCharm,1,0),new ItemStack[]{
			new ItemStack(BlocksTC.lampArcane,1,0),
			new ItemStack(ItemsTC.salisMundus,1,0),
			new ItemStack(BlocksTC.cinderpearl,1,0),
			new ItemStack(ItemsTC.salisMundus,1,0),
			new ItemStack(BlocksTC.lampArcane,1,0),
			new ItemStack(ItemsTC.salisMundus,1,0),
			new ItemStack(BlocksTC.cinderpearl,1,0),
			new ItemStack(ItemsTC.salisMundus,1,0)
		});
		
		InfusionRecipe destructionFociRec = new InfusionRecipe("TB.NodeFoci.Destr",new ItemStack(TBItems.nodeFoci,1,1),5,new AspectList().add(Aspect.AURA, 64).add(Aspect.VOID, 16).add(Aspect.DEATH, 32),new ItemStack(ItemsTC.primalCharm,1,0),new ItemStack[]{
			new ItemStack(ItemsTC.amber,1,0),
			new ItemStack(TBBlocks.crystalBlock,1,7),
			new ItemStack(BlocksTC.crystallizer,1,0),
			new ItemStack(ItemsTC.focusExcavation,1,0),
			new ItemStack(ItemsTC.amber,1,0),
			new ItemStack(TBBlocks.crystalBlock,1,7),
			new ItemStack(BlocksTC.crystallizer,1,0),
			new ItemStack(ItemsTC.focusExcavation,1,0)
		});
		
		InfusionRecipe efficiencyFociRec = new InfusionRecipe("TB.NodeFoci.Efficiency",new ItemStack(TBItems.nodeFoci,1,2),1,new AspectList().add(Aspect.AURA, 64).add(Aspect.VOID, 16).add(Aspect.DEATH, 32),new ItemStack(ItemsTC.primalCharm,1,0),new ItemStack[]{
			new ItemStack(ItemsTC.shard,1,6),
			new ItemStack(TBBlocks.dustBlock,1,0),
			new ItemStack(ItemsTC.shard,1,6),
			new ItemStack(TBBlocks.dustBlock,1,0),
			new ItemStack(ItemsTC.shard,1,6),
			new ItemStack(TBBlocks.dustBlock,1,0),
			new ItemStack(ItemsTC.shard,1,6),
			new ItemStack(TBBlocks.dustBlock,1,0)
		});
		
		InfusionRecipe hungerFociRec = new InfusionRecipe("TB.NodeFoci.Hunger",new ItemStack(TBItems.nodeFoci,1,3),7,new AspectList().add(Aspect.AURA, 64).add(Aspect.VOID, 64).add(Aspect.DEATH, 256).add(Aspect.DESIRE, 64).add(Aspect.ENERGY, 128),new ItemStack(ItemsTC.primalCharm,1,0),new ItemStack[]{
			new ItemStack(ItemsTC.salisMundus,1,0),
			new ItemStack(ItemsTC.thaumometer,1,0),
			new ItemStack(ItemsTC.salisMundus,1,0),
			new ItemStack(BlocksTC.infusionMatrix,1,0),
			new ItemStack(ItemsTC.salisMundus,1,0),
			new ItemStack(ItemsTC.thaumometer,1,0),
			new ItemStack(ItemsTC.salisMundus,1,0),
			new ItemStack(BlocksTC.infusionMatrix,1,0)
		});
		
		InfusionRecipe unstableFociRec = new InfusionRecipe("TB.NodeFoci.Unstable",new ItemStack(TBItems.nodeFoci,1,4),3,new AspectList().add(Aspect.AURA, 64).add(Aspect.DEATH, 32).add(Aspect.ENTROPY, 64),new ItemStack(ItemsTC.primalCharm,1,0),new ItemStack[]{
			new ItemStack(Items.ender_pearl),
			new ItemStack(TBBlocks.crystalBlock,1,5),
			new ItemStack(Items.ender_pearl),
			new ItemStack(TBBlocks.crystalBlock,1,5),
			new ItemStack(Items.ender_pearl),
			new ItemStack(TBBlocks.crystalBlock,1,5),
			new ItemStack(Items.ender_pearl),
			new ItemStack(TBBlocks.crystalBlock,1,5)
		});
		
		InfusionRecipe pureFociRec = new InfusionRecipe("TB.NodeFoci.Purity",new ItemStack(TBItems.nodeFoci,1,5),0,new AspectList().add(Aspect.AURA, 64).add(Aspect.LIFE, 64).add(Aspect.ORDER, 64),new ItemStack(ItemsTC.primalCharm,1,0),new ItemStack[]{
			new ItemStack(BlocksTC.sapling,1,1),
			new ItemStack(BlocksTC.bloom,1,0),
			new ItemStack(BlocksTC.log,1,3),
			new ItemStack(BlocksTC.shimmerleaf,1,0),
			new ItemStack(BlocksTC.leaf,1,1),
			new ItemStack(BlocksTC.bloom,1,0),
			new ItemStack(BlocksTC.log,1,3),
			new ItemStack(BlocksTC.shimmerleaf,1,0)
		});
		
		InfusionRecipe sinisterFociRec = new InfusionRecipe("TB.NodeFoci.Sinister",new ItemStack(TBItems.nodeFoci,1,6),4,new AspectList().add(Aspect.AURA, 64).add(Aspect.DARKNESS, 32).add(Aspect.UNDEAD, 64),new ItemStack(ItemsTC.primalCharm,1,0),new ItemStack[]{
			new ItemStack(ItemsTC.wispyEssence,1,0),
			new ItemStack(TBBlocks.crystalBlock,1,7),
			new ItemStack(ItemsTC.focusPech,1,0),
			new ItemStack(TBBlocks.crystalBlock,1,6),
			new ItemStack(ItemsTC.wispyEssence,1,0),
			new ItemStack(TBBlocks.crystalBlock,1,7),
			new ItemStack(ItemsTC.focusPech,1,0),
			new ItemStack(TBBlocks.crystalBlock,1,6)
		});
		
		InfusionRecipe speedFociRec = new InfusionRecipe("TB.NodeFoci.Speed",new ItemStack(TBItems.nodeFoci,1,7),1,new AspectList().add(Aspect.AURA, 64).add(Aspect.MOTION, 32).add(Aspect.ENERGY, 16),new ItemStack(ItemsTC.primalCharm,1,0),new ItemStack[]{
			new ItemStack(TBBlocks.crystalBlock,1,6),
			new ItemStack(TBBlocks.dustBlock,1,0),
			new ItemStack(TBBlocks.crystalBlock,1,6),
			new ItemStack(TBBlocks.dustBlock,1,0),
			new ItemStack(TBBlocks.crystalBlock,1,6),
			new ItemStack(TBBlocks.dustBlock,1,0),
			new ItemStack(TBBlocks.crystalBlock,1,6),
			new ItemStack(TBBlocks.dustBlock,1,0)
		});
		
		InfusionRecipe stabilityFociRec = new InfusionRecipe("TB.NodeFoci.Stability",new ItemStack(TBItems.nodeFoci,1,8),1,new AspectList().add(Aspect.AURA, 64).add(Aspect.ORDER, 32).add(Aspect.EXCHANGE, 16),new ItemStack(ItemsTC.primalCharm,1,0),new ItemStack[]{
			new ItemStack(TBBlocks.dustBlock,1,0),
			new ItemStack(ItemsTC.mirroredGlass,1,0),
			new ItemStack(TBBlocks.dustBlock,1,0),
			new ItemStack(TBBlocks.crystalBlock,1,6),
			new ItemStack(TBBlocks.dustBlock,1,0),
			new ItemStack(ItemsTC.mirroredGlass,1,0),
			new ItemStack(TBBlocks.dustBlock,1,0),
			new ItemStack(TBBlocks.crystalBlock,1,6)
		});
		
		InfusionRecipe taintFociRec = new InfusionRecipe("TB.NodeFoci.Taint",new ItemStack(TBItems.nodeFoci,1,9),5,new AspectList().add(Aspect.AURA, 64).add(Aspect.FLUX, 64).add(Aspect.ENTROPY, 16),new ItemStack(ItemsTC.primalCharm,1,0),new ItemStack[]{
			new ItemStack(ItemsTC.tainted,1,0),
			new ItemStack(TBBlocks.crystalBlock,1,7),
			new ItemStack(ItemsTC.tainted,1,1),
			new ItemStack(TBItems.knoseFragment,1,7),
			new ItemStack(ItemsTC.tainted,1,0),
			new ItemStack(TBBlocks.crystalBlock,1,7),
			new ItemStack(ItemsTC.tainted,1,1),
			new ItemStack(TBItems.knoseFragment,1,7),
		});
		
		InfusionRecipe herobrinesScytheRec = new InfusionRecipe("TB.HerobrinesScythe",new ItemStack(TBItems.herobrinesScythe,1,0),7,new AspectList().add(Aspect.AVERSION, 128).add(Aspect.ENERGY, 64).add(Aspect.AURA, 12).add(Aspect.ELDRITCH, 32).add(Aspect.DEATH, 64),new ItemStack(ItemsTC.voidHoe),new ItemStack[]{
			new ItemStack(Items.nether_star),
			new ItemStack(ItemsTC.bucketDeath),
			new ItemStack(ItemsTC.wandRods,1,16),
			new ItemStack(ItemsTC.bucketDeath)
		});
		
		ShapedOreRecipe voidShearsRec = new ShapedOreRecipe(new ItemStack(TBItems.voidShears),new Object[]{
			" #",
			"# ",
			'#',new ItemStack(ItemsTC.ingots,1,1)
		});
		
		ShapedOreRecipe voidFlint = new ShapedOreRecipe(new ItemStack(TBItems.voidFAS),new Object[]{
			"# ",
			" C",
			'#',new ItemStack(ItemsTC.ingots,1,1),
			'C',new ItemStack(Items.flint)
		});
		
		ShapedArcaneRecipe thaumicAnvilRec = new ShapedArcaneRecipe("TB.ThaumicAnvil",new ItemStack(TBBlocks.thaumicAnvil,1,0),primals(25),new Object[]{
			"###",
			" $ ",
			"$$$",
			'#',new ItemStack(BlocksTC.metal,1,0),
			'$',new ItemStack(ItemsTC.ingots,1,0)
		});
		
		InfusionRecipe voidAnvilRec = new InfusionRecipe("TB.VoidAnvil",new ItemStack(TBBlocks.voidAnvil,1,0),3,new AspectList().add(Aspect.CRAFT,32).add(Aspect.TOOL, 24).add(Aspect.AVERSION,24).add(Aspect.ORDER, 48),new ItemStack(TBBlocks.thaumicAnvil,1,0),new ItemStack[]{
			new ItemStack(BlocksTC.metal,1,1),
			new ItemStack(BlocksTC.metal,1,1),
			new ItemStack(BlocksTC.metal,1,1),
			new ItemStack(BlocksTC.metal,1,1),
			new ItemStack(BlocksTC.metal,1,1)
		});
		
		InfusionRecipe peacefulSaplingRec = new InfusionRecipe("TB.PeacefulSapling",new ItemStack(TBBlocks.sapling,1,1),2,new AspectList().add(Aspect.PLANT, 16).add(Aspect.LIFE, 12).add(Aspect.LIFE, 6),new ItemStack(Blocks.sapling,1,2),new ItemStack[]{
			new ItemStack(Items.slime_ball),
			new ItemStack(ItemsTC.salisMundus,1,0),
			new ItemStack(Items.slime_ball),
			new ItemStack(BlocksTC.shimmerleaf,1,0),
			new ItemStack(ItemsTC.salisMundus,1,0),
			new ItemStack(BlocksTC.lampFertility,1,0),
			new ItemStack(ItemsTC.salisMundus,1,0),
			new ItemStack(BlocksTC.shimmerleaf,1,0)
		});
		
		InfusionRecipe netherSaplingRec = new InfusionRecipe("TB.NetherSapling",new ItemStack(TBBlocks.sapling,1,2),5,new AspectList().add(Aspect.PLANT, 32).add(Aspect.FIRE, 32).add(Aspect.DEATH, 16),new ItemStack(BlocksTC.sapling,1,0),new ItemStack[]{
			new ItemStack(BlocksTC.cinderpearl,1,0),
			new ItemStack(ItemsTC.shard,1,1),
			new ItemStack(BlocksTC.cinderpearl,1,0),
			new ItemStack(BlocksTC.bloom,1,0),
			new ItemStack(BlocksTC.cinderpearl,1,0),
			new ItemStack(BlocksTC.cinderpearl,1,0),
			new ItemStack(ItemsTC.shard,1,1),
			new ItemStack(Items.lava_bucket,1,0),
			new ItemStack(ItemsTC.shard,1,1),
			new ItemStack(BlocksTC.bloom,1,0)
		});
		
		InfusionRecipe enderSaplingRec = new InfusionRecipe("TB.EnderSapling",new ItemStack(TBBlocks.sapling,1,3),7,new AspectList().add(Aspect.PLANT, 64).add(Aspect.ELDRITCH, 24).add(Aspect.VOID, 16).add(Aspect.DARKNESS, 8),new ItemStack(BlocksTC.sapling,1,1),new ItemStack[]{
			new ItemStack(ItemsTC.shard,1,6),
			new ItemStack(Items.ender_pearl,1,0),
			new ItemStack(ItemsTC.shard,1,6),
			new ItemStack(BlocksTC.nitor,1,OreDictionary.WILDCARD_VALUE),
			new ItemStack(Items.ender_pearl,1,0),
			new ItemStack(Items.ender_pearl,1,0),
			new ItemStack(BlocksTC.bloom,1,0),
			new ItemStack(ItemsTC.shard,1,6),
			new ItemStack(Items.ender_pearl,1,0),
			new ItemStack(ItemsTC.shard,1,6),
			new ItemStack(BlocksTC.nitor,1,OreDictionary.WILDCARD_VALUE)
		});
		
		InfusionRecipe revolverRec = new InfusionRecipe("TB.Revolver",new ItemStack(TBItems.revolver,1,0),5,new AspectList().add(Aspect.AVERSION, 256).add(Aspect.METAL, 32).add(Aspect.PLANT, 16).add(Aspect.TOOL, 12).add(Aspect.ENERGY, 32).add(Aspect.MECHANISM, 12).add(Aspect.VOID, 16).add(Aspect.FIRE, 32),new ItemStack(Blocks.iron_block),new ItemStack[]{
			new ItemStack(Items.fire_charge,1,0),
			new ItemStack(Items.gunpowder,1,0),
			new ItemStack(ItemsTC.primalCharm,1,0),
			new ItemStack(BlocksTC.log,1,0),
			new ItemStack(Items.gunpowder,1,0),
			new ItemStack(ItemsTC.focusFire,1,0),
			new ItemStack(Items.fire_charge,1,0),
			new ItemStack(Items.gunpowder,1,0),
			new ItemStack(ItemsTC.boneBow,1,0),
			new ItemStack(BlocksTC.log,1,0),
			new ItemStack(Items.gunpowder,1,0),
			new ItemStack(Blocks.redstone_torch,1,0)
		});
		
		RevolverInfusionRecipe accuracyRec = new RevolverInfusionRecipe("TB.Revolver.Accuracy", RevolverUpgrade.accuracy, 1, new AspectList().add(Aspect.ORDER, 8).add(Aspect.SENSES,8), new ItemStack[]{
			new ItemStack(Blocks.glass_pane,1,0),
			new ItemStack(Items.carrot,1,0),
			new ItemStack(Blocks.glass_pane,1,0),
			new ItemStack(Blocks.glass_pane,1,0),
			new ItemStack(ItemsTC.salisMundus,1,0),
			new ItemStack(Blocks.glass_pane,1,0)
		});
		
		RevolverInfusionRecipe atropodsRec = new RevolverInfusionRecipe("TB.Revolver.Atropods", RevolverUpgrade.atropodsBane, 1, new AspectList().add(Aspect.DEATH, 8).add(Aspect.BEAST, 8).add(Aspect.CRAFT, 8), new ItemStack[]{
			new ItemStack(Items.spider_eye,1,0),
			new ItemStack(Items.fermented_spider_eye,1,0),
			new ItemStack(Items.spider_eye,1,0),
			new ItemStack(ItemsTC.salisMundus,1,0)
		});
		
		RevolverInfusionRecipe eldritchBRec = new RevolverInfusionRecipe("TB.Revolver.EldritchBane", RevolverUpgrade.eldritchBane, 2, new AspectList().add(Aspect.DEATH, 8).add(Aspect.ELDRITCH, 8), new ItemStack[]{
			new ItemStack(Items.ender_eye,1,0),
			new ItemStack(ItemsTC.salisMundus,1,0),
			new ItemStack(Items.ender_pearl,1,0)
		});
		
		RevolverInfusionRecipe duelingRec = new RevolverInfusionRecipe("TB.Revolver.Dueling", RevolverUpgrade.dueling, 2, new AspectList().add(Aspect.DEATH, 8).add(Aspect.MAN, 8), new ItemStack[]{
			new ItemStack(ItemsTC.salisMundus,1,0),
			new ItemStack(Items.bed,1,0),
			new ItemStack(ItemsTC.salisMundus,1,0),
			new ItemStack(Items.ghast_tear,1,0),
			new ItemStack(ItemsTC.salisMundus,1,0)
		});
		
		RevolverInfusionRecipe efficiencyRec = new RevolverInfusionRecipe("TB.Revolver.Efficiency", RevolverUpgrade.efficiency, 0, new AspectList().add(Aspect.ORDER, 8).add(Aspect.EXCHANGE, 8), new ItemStack[]{
			new ItemStack(ItemsTC.salisMundus,1,0),
			new ItemStack(Items.blaze_powder,1,0),
			new ItemStack(ItemsTC.salisMundus,1,0),
			new ItemStack(Items.enchanted_book,1,0),
			new ItemStack(ItemsTC.salisMundus,1,0)
		});
		
		RevolverInfusionRecipe eldritchRec = new RevolverInfusionRecipe("TB.Revolver.Eldritch", RevolverUpgrade.eldritch, 5, new AspectList().add(Aspect.ELDRITCH, 8).add(Aspect.VOID, 8), new ItemStack[]{
			new ItemStack(ItemsTC.eldritchEye,1,0),
			new ItemStack(ItemsTC.salisMundus,1,0),
			new ItemStack(ItemsTC.eldritchEye,1,0),
			new ItemStack(ItemsTC.salisMundus,1,0)
		});
		
		RevolverInfusionRecipe heavyRec = new RevolverInfusionRecipe("TB.Revolver.Heavy", RevolverUpgrade.heavy, 0, new AspectList().add(Aspect.AVERSION, 8).add(Aspect.METAL, 8), new ItemStack[]{
			new ItemStack(ItemsTC.salisMundus,1,0),
			new ItemStack(Items.iron_sword,1,OreDictionary.WILDCARD_VALUE),
			new ItemStack(ItemsTC.salisMundus,1,0)
		});
		
		RevolverInfusionRecipe knowledgeRec = new RevolverInfusionRecipe("TB.Revolver.Knowledge", RevolverUpgrade.knowledge, 0, new AspectList().add(Aspect.MIND, 8).add(Aspect.AURA, 8), new ItemStack[]{
			new ItemStack(ItemsTC.scribingTools,1,OreDictionary.WILDCARD_VALUE),
			new ItemStack(ItemsTC.salisMundus,1,0),
			new ItemStack(Items.book,1,0),
			new ItemStack(ItemsTC.salisMundus,1,0),
			new ItemStack(Items.paper,1,0)
		});
		
		RevolverInfusionRecipe piercingRec = new RevolverInfusionRecipe("TB.Revolver.Piercing", RevolverUpgrade.piercig, 12, new AspectList().add(Aspect.AVERSION, 32).add(Aspect.AIR, 64), new ItemStack[]{
			new ItemStack(ItemsTC.primalArrows,1,0),
			new ItemStack(ItemsTC.primalArrows,1,1),
			new ItemStack(ItemsTC.primalArrows,1,2),
			new ItemStack(Items.diamond_sword,1,OreDictionary.WILDCARD_VALUE),
			new ItemStack(ItemsTC.primalArrows,1,3),
			new ItemStack(ItemsTC.primalArrows,1,4),
			new ItemStack(ItemsTC.primalArrows,1,5)
		});
		
		RevolverInfusionRecipe powerRec = new RevolverInfusionRecipe("TB.Revolver.Power", RevolverUpgrade.power, 2, new AspectList().add(Aspect.AVERSION, 16), new ItemStack[]{
			new ItemStack(Items.gunpowder),
			new ItemStack(ItemsTC.salisMundus,1,0),
			new ItemStack(Items.fire_charge),
			new ItemStack(ItemsTC.salisMundus,1,0),
			new ItemStack(Items.fireworks,1,0)
		});
		
		RevolverInfusionRecipe primalRec = new RevolverInfusionRecipe("TB.Revolver.Primal", RevolverUpgrade.primal, 12, new AspectList().add(Aspect.AVERSION, 64).add(primals(64)).add(Aspect.ENERGY, 64), new ItemStack[]{
			new ItemStack(ItemsTC.salisMundus,1,0),
			new ItemStack(ItemsTC.primordialPearl,1,0),
			new ItemStack(Items.diamond),
			new ItemStack(ItemsTC.primordialPearl,1,0),
			new ItemStack(ItemsTC.salisMundus,1,0),
		});
		
		ItemStack silver = OreDictUtils.oreDictionaryContains("ingotSilver") && OreDictionary.getOres("ingotSilver") != null && OreDictionary.getOres("ingotSilver").size() > 0? OreDictionary.getOres("ingotSilver").get(0) : new ItemStack(ItemsTC.primalCharm,1,0);
		
		RevolverInfusionRecipe silverRec = new RevolverInfusionRecipe("TB.Revolver.Silver", RevolverUpgrade.silver, 0, new AspectList().add(Aspect.DEATH, 8).add(Aspect.BEAST, 8).add(Aspect.UNDEAD, 8), new ItemStack[]{
			new ItemStack(ItemsTC.salisMundus,1,0),
			new ItemStack(ItemsTC.quicksilver,1,0),
			silver,
			new ItemStack(ItemsTC.quicksilver,1,0),
			new ItemStack(ItemsTC.salisMundus,1,0),
		});
		
		RevolverInfusionRecipe speedRec = new RevolverInfusionRecipe("TB.Revolver.Speed", RevolverUpgrade.speed, 2, new AspectList().add(Aspect.MOTION, 8).add(Aspect.AIR, 8), new ItemStack[]{
			new ItemStack(ItemsTC.salisMundus,1,0),
			new ItemStack(Items.feather),
			new ItemStack(ItemsTC.salisMundus,1,0),
		});
		
		RevolverInfusionRecipe taintedRec = new RevolverInfusionRecipe("TB.Revolver.Tainted", RevolverUpgrade.tainted, 4, new AspectList().add(Aspect.FLUX, 8).add(Aspect.AVERSION, 8), new ItemStack[]{
			new ItemStack(ItemsTC.tainted,1,0),
			new ItemStack(ItemsTC.salisMundus,1,0),
			new ItemStack(ItemsTC.tainted,1,1),
			new ItemStack(ItemsTC.salisMundus,1,0)
		});
		
		RevolverInfusionRecipe voidRec = new RevolverInfusionRecipe("TB.Revolver.Void", RevolverUpgrade.uvoid, 4, new AspectList().add(Aspect.VOID, 8).add(Aspect.TOOL, 8), new ItemStack[]{
			new ItemStack(ItemsTC.ingots,1,1),
			new ItemStack(ItemsTC.ingots,1,1),
			new ItemStack(ItemsTC.ingots,1,1),
			new ItemStack(ItemsTC.ingots,1,1),
			new ItemStack(ItemsTC.ingots,1,1)
		});
		
		ShapedArcaneRecipe nodeLinkRec = new ShapedArcaneRecipe("TB.AuraLinker", new ItemStack(TBBlocks.auraLinker,1,0), primals(5), new Object[]{
			"TPT",
			"ANA",
			"BOB",
			'T',new ItemStack(BlocksTC.arcaneWorkbenchCharger,1,0),
			'P',new ItemStack(ItemsTC.primalCharm,1,0),
			'A',new ItemStack(BlocksTC.auraTotem,1,0),
			'B',new ItemStack(BlocksTC.auraTotem,1,1),
			'O',new ItemStack(Blocks.obsidian,1,0),
			'N',new ItemStack(ItemsTC.alumentum,1,0)
		});
		
		ShapedArcaneRecipe campfireRec = new ShapedArcaneRecipe("TB.Campfire",new ItemStack(TBBlocks.campfire),new AspectList().add(Aspect.FIRE, 5).add(Aspect.ENTROPY, 3),new Object[]{
			"SSS",
			"COC",
			"GGG",
			'S',"stickWood",
			'C',"cobblestone",
			'O',new ItemStack(Items.coal,1,0),
			'G',new ItemStack(Blocks.gravel,1,0)
		});
		
		ShapedArcaneRecipe brazierRec = new ShapedArcaneRecipe("TB.Brazier",new ItemStack(TBBlocks.braizer),new AspectList().add(Aspect.FIRE, 5).add(Aspect.ENTROPY, 3),new Object[]{
			"SCS",
			" V ",
			"SSS",
			'S',new ItemStack(BlocksTC.slabStone,1,0),
			'C',new ItemStack(Items.coal,1,0),
			'V',new ItemStack(BlocksTC.auraTotem,1,0)
		});
		
		ShapedArcaneRecipe ironBraceletRec = new ShapedArcaneRecipe("TB.Bracelet.Iron",new ItemStack(TBItems.castingBracelet,1,0),primals(1),new Object[]{
			"CIC",
			"N N",
			'C',new ItemStack(ItemsTC.wandCaps,1,0),
			'I',"ingotIron",
			'N',"nuggetIron"
		});
		
		ShapedArcaneRecipe goldBraceletRec = new ShapedArcaneRecipe("TB.Bracelet.Gold",new ItemStack(TBItems.castingBracelet,1,1),primals(5),new Object[]{
			"CIC",
			"N N",
			'C',new ItemStack(ItemsTC.wandCaps,1,1),
			'I',"ingotGold",
			'N',"nuggetGold"
		});
		
		ShapedArcaneRecipe greatwoodBraceletRec = new ShapedArcaneRecipe("TB.Bracelet.Greatwood",new ItemStack(TBItems.castingBracelet,1,2),primals(25),new Object[]{
			"CIC",
			"I I",
			'C',new ItemStack(ItemsTC.wandCaps,1,1),
			'I',new ItemStack(BlocksTC.log,1,0)
		});
		
		ShapedArcaneRecipe brassBraceletRec = new ShapedArcaneRecipe("TB.Bracelet.Brass",new ItemStack(TBItems.castingBracelet,1,3),primals(25),new Object[]{
				"CIC",
				"I I",
				'C',new ItemStack(ItemsTC.wandCaps,1,2),
				'I',new ItemStack(BlocksTC.log,1,0)
			});
		
		ShapedArcaneRecipe thaumiumBraceletRec = new ShapedArcaneRecipe("TB.Bracelet.Thaumium",new ItemStack(TBItems.castingBracelet,1,4),primals(25),new Object[]{
			"CIC",
			"INI",
			"N N",
			'C',new ItemStack(TBItems.resource,1,2),
			'I',new ItemStack(ItemsTC.ingots,1,0),
			'N',new ItemStack(ItemsTC.salisMundus,1,0)
		});
		
		InfusionRecipe silverwoodBraceletRec = new InfusionRecipe("TB.Bracelet.Silverwood",new ItemStack(TBItems.castingBracelet,1,5),5,primals(17).add(Aspect.ENERGY, 17),new ItemStack(ItemsTC.wandRods,1,1),new ItemStack[]{
			new ItemStack(ItemsTC.wandCaps,1,4),
			new ItemStack(ItemsTC.shard,1,6),
			new ItemStack(BlocksTC.log,1,3),
			new ItemStack(TBItems.shardCluster,1,6),
			new ItemStack(ItemsTC.wandCaps,1,4),
			new ItemStack(ItemsTC.shard,1,6),
			new ItemStack(BlocksTC.log,1,3),
			new ItemStack(TBItems.shardCluster,1,6)
		});
		
		InfusionRecipe voidBraceletRec = new InfusionRecipe("TB.Bracelet.Void",new ItemStack(TBItems.castingBracelet,1,12),8,new AspectList().add(Aspect.ELDRITCH, 64).add(Aspect.VOID, 64).add(Aspect.ENERGY, 64).add(Aspect.AURA, 24).add(Aspect.ENERGY, 24),new ItemStack(TBItems.resource,1,4),new ItemStack[]{
			new ItemStack(ItemsTC.wandCaps,1,4),
			new ItemStack(TBBlocks.dustBlock,1,0),
			new ItemStack(ItemsTC.ingots,1,1),
			new ItemStack(TBBlocks.crystalBlock,1,6),
			new ItemStack(ItemsTC.wandCaps,1,4),
			new ItemStack(TBBlocks.dustBlock,1,0),
			new ItemStack(ItemsTC.ingots,1,1),
			new ItemStack(TBBlocks.crystalBlock,1,6)
		});
		
		InfusionRecipe reedBraceletRec = new InfusionRecipe("TB.Bracelet.Reed",new ItemStack(TBItems.castingBracelet,1,6),2,new AspectList().add(Aspect.AIR, 24).add(Aspect.MOTION, 12).add(Aspect.ENERGY,8),new ItemStack(ItemsTC.wandRods,1,7),new ItemStack[]{
			new ItemStack(ItemsTC.wandCaps,1,4),
			new ItemStack(ItemsTC.shard,1,0),
			new ItemStack(ItemsTC.wandCaps,1,4),
			new ItemStack(ItemsTC.shard,1,0)
		});
		
		InfusionRecipe boneBraceletRec = new InfusionRecipe("TB.Bracelet.Bone",new ItemStack(TBItems.castingBracelet,1,7),2,new AspectList().add(Aspect.ENTROPY, 24).add(Aspect.UNDEAD, 12).add(Aspect.ENERGY,8),new ItemStack(ItemsTC.wandRods,1,6),new ItemStack[]{
			new ItemStack(ItemsTC.wandCaps,1,4),
			new ItemStack(ItemsTC.shard,1,5),
			new ItemStack(ItemsTC.wandCaps,1,4),
			new ItemStack(ItemsTC.shard,1,5)
		});
		
		InfusionRecipe obsidianBraceletRec = new InfusionRecipe("TB.Bracelet.Obsidian",new ItemStack(TBItems.castingBracelet,1,8),2,new AspectList().add(Aspect.EARTH, 24).add(Aspect.DARKNESS, 12).add(Aspect.ENERGY,8),new ItemStack(ItemsTC.wandRods,1,2),new ItemStack[]{
			new ItemStack(ItemsTC.wandCaps,1,4),
			new ItemStack(ItemsTC.shard,1,3),
			new ItemStack(ItemsTC.wandCaps,1,4),
			new ItemStack(ItemsTC.shard,1,3)
		});
		
		InfusionRecipe blazeBraceletRec = new InfusionRecipe("TB.Bracelet.Blaze",new ItemStack(TBItems.castingBracelet,1,9),2,new AspectList().add(Aspect.FIRE, 24).add(Aspect.BEAST, 12).add(Aspect.ENERGY,8),new ItemStack(ItemsTC.wandRods,1,3),new ItemStack[]{
			new ItemStack(ItemsTC.wandCaps,1,4),
			new ItemStack(ItemsTC.shard,1,1),
			new ItemStack(ItemsTC.wandCaps,1,4),
			new ItemStack(ItemsTC.shard,1,1)
		});
		
		InfusionRecipe iceBraceletRec = new InfusionRecipe("TB.Bracelet.Ice",new ItemStack(TBItems.castingBracelet,1,10),2,new AspectList().add(Aspect.WATER, 24).add(Aspect.COLD, 12).add(Aspect.ENERGY,8),new ItemStack(ItemsTC.wandRods,1,4),new ItemStack[]{
			new ItemStack(ItemsTC.wandCaps,1,4),
			new ItemStack(ItemsTC.shard,1,2),
			new ItemStack(ItemsTC.wandCaps,1,4),
			new ItemStack(ItemsTC.shard,1,2)
		});
		
		InfusionRecipe quartzBraceletRec = new InfusionRecipe("TB.Bracelet.Quartz",new ItemStack(TBItems.castingBracelet,1,11),2,new AspectList().add(Aspect.ORDER, 24).add(Aspect.ENERGY, 12).add(Aspect.ENERGY,8),new ItemStack(ItemsTC.wandRods,1,5),new ItemStack[]{
			new ItemStack(ItemsTC.wandCaps,1,4),
			new ItemStack(ItemsTC.shard,1,4),
			new ItemStack(ItemsTC.wandCaps,1,4),
			new ItemStack(ItemsTC.shard,1,4)
		});
		
		InfusionRecipe primalBraceletRec = new InfusionRecipe("TB.Bracelet.Primal",new ItemStack(TBItems.castingBracelet,1,13),7,primals(48).add(Aspect.ENERGY,96),new ItemStack(ItemsTC.primalCharm,1,0),new ItemStack[]{
			new ItemStack(ItemsTC.wandCaps,1,6),
			new ItemStack(TBItems.castingBracelet,1,5),
			new ItemStack(TBItems.castingBracelet,1,6),
			new ItemStack(TBItems.castingBracelet,1,7),
			new ItemStack(ItemsTC.wandCaps,1,6),
			new ItemStack(TBItems.castingBracelet,1,8),
			new ItemStack(TBItems.castingBracelet,1,9),
			new ItemStack(TBItems.castingBracelet,1,10)
		});
		
		InfusionRecipe spawnerCompassRec = new InfusionRecipe("TB.SpawnerCompass",new ItemStack(TBItems.spawnerCompass,1,0),3,new AspectList().add(Aspect.UNDEAD, 18).add(Aspect.DEATH, 18).add(Aspect.MOTION, 18).add(Aspect.SENSES, 36),new ItemStack(ItemsTC.sinisterStone,1,0),new ItemStack[]{
			new ItemStack(TBItems.resource,1,1),
			new ItemStack(Items.compass,1,0),
			new ItemStack(TBItems.resource,1,1),
			new ItemStack(ItemsTC.salisMundus,1,0),
			new ItemStack(TBItems.resource,1,1),
			new ItemStack(Items.compass,1,0),
			new ItemStack(TBItems.resource,1,1),
			new ItemStack(ItemsTC.salisMundus,1,0)
		});
		
		InfusionRecipe ukuleleRec = new InfusionRecipe("TB.Ukulele",new ItemStack(TBItems.ukulele),5,new AspectList().add(Aspect.SENSES, 64).add(Aspect.ENERGY, 64).add(Aspect.MAN, 32).add(Aspect.TOOL, 48),new ItemStack(BlocksTC.log,1,0),new ItemStack[]{
			new ItemStack(Blocks.noteblock),
			new ItemStack(Blocks.jukebox),
			new ItemStack(Blocks.noteblock),
			new ItemStack(BlocksTC.arcaneEar,1,0),
			new ItemStack(Items.string),
			new ItemStack(Blocks.noteblock),
			new ItemStack(Blocks.redstone_lamp),
			new ItemStack(Blocks.noteblock),
			new ItemStack(BlocksTC.arcaneEar,1,0),
			new ItemStack(BlocksTC.jar,1,0)
		});
		
		
		InfusionRecipe knowledgeUkuleleRec = new InfusionRecipe("TB.Ukulele.Knowledge",new ItemStack(TBItems.ukulele,1,1),4,new AspectList().add(Aspect.MIND, 72).add(Aspect.AURA, 18),new ItemStack(TBItems.ukulele,0),new ItemStack[]{
			new ItemStack(ItemsTC.knowledgeFragment,1,0),
			new ItemStack(ItemsTC.scribingTools,1,OreDictionary.WILDCARD_VALUE),
			new ItemStack(ItemsTC.knowledgeFragment,1,0),
			new ItemStack(ItemsTC.thaumonomicon,1,0),
			new ItemStack(ItemsTC.knowledgeFragment,1,0),
			new ItemStack(ItemsTC.scribingTools,1,OreDictionary.WILDCARD_VALUE),
			new ItemStack(ItemsTC.knowledgeFragment,1,0),
			new ItemStack(ItemsTC.thaumonomicon,1,0)
		});
		
		InfusionRecipe sanityUkuleleRec = new InfusionRecipe("TB.Ukulele.Sanity",new ItemStack(TBItems.ukulele,1,2),6,new AspectList().add(Aspect.AURA, 48).add(Aspect.LIFE, 36).add(Aspect.ORDER, 64).add(Aspect.MIND, 12),new ItemStack(TBItems.ukulele,0),new ItemStack[]{
			new ItemStack(ItemsTC.salisMundus,1,0),
			new ItemStack(ItemsTC.bathSalts),
			new ItemStack(ItemsTC.salisMundus,1,0),
			new ItemStack(ItemsTC.bucketPure,1,0),
			new ItemStack(ItemsTC.salisMundus,1,0),
			new ItemStack(ItemsTC.bathSalts),
			new ItemStack(ItemsTC.salisMundus,1,0),
			new ItemStack(ItemsTC.bucketPure,1,0)
		});
		
		InfusionRecipe electricUkuleleRec = new InfusionRecipe("TB.Ukulele.Electric",new ItemStack(TBItems.ukulele,1,3),3,new AspectList().add(Aspect.AURA, 16).add(Aspect.AIR, 36).add(Aspect.ENERGY, 64).add(Aspect.ENTROPY, 12).add(Aspect.AVERSION, 24),new ItemStack(TBItems.ukulele,0),new ItemStack[]{
				new ItemStack(ItemsTC.focusShock,1,0),
				new ItemStack(TBBlocks.crystalBlock,1,5),
				new ItemStack(BlocksTC.mirrorEssentia,1,0),
				new ItemStack(TBBlocks.crystalBlock,1,0),
				new ItemStack(ItemsTC.focusShock,1,0),
				new ItemStack(TBBlocks.crystalBlock,1,5),
				new ItemStack(TBItems.shardCluster,1,0),
				new ItemStack(TBBlocks.crystalBlock,1,0)
		});
		
		InfusionRecipe resistanceUkuleleRec = new InfusionRecipe("TB.Ukulele.Resistance",new ItemStack(TBItems.ukulele,1,4),8,new AspectList().add(Aspect.AURA, 64).add(Aspect.PROTECT, 48).add(Aspect.LIFE, 64).add(Aspect.EXCHANGE, 36),new ItemStack(TBItems.ukulele,0),new ItemStack[]{
				new ItemStack(ItemsTC.primalCharm,1,0),
				new ItemStack(ItemsTC.primordialPearl,1,0),
				new ItemStack(ItemsTC.primalCharm,1,0)
		});
		
		InfusionRecipe buffingUkuleleRec = new InfusionRecipe("TB.Ukulele.Buffs",new ItemStack(TBItems.ukulele,1,5),3,new AspectList().add(Aspect.AURA, 48).add(Aspect.LIFE, 36).add(Aspect.ENERGY, 36).add(Aspect.ENERGY, 24),new ItemStack(TBItems.ukulele,0),new ItemStack[]{
				new ItemStack(Items.potionitem,1,8229),
				new ItemStack(Items.potionitem,1,8226),
				new ItemStack(Items.potionitem,1,8233),
				new ItemStack(Items.potionitem,1,8225),
				new ItemStack(Items.potionitem,1,8229),
				new ItemStack(Items.potionitem,1,8226),
				new ItemStack(Items.potionitem,1,8233),
				new ItemStack(Items.potionitem,1,8225)
		});
		
		InfusionRecipe confusionUkuleleRec = new InfusionRecipe("TB.Ukulele.Confusion",new ItemStack(TBItems.ukulele,1,6),5,new AspectList().add(Aspect.AURA, 48).add(Aspect.DEATH, 24).add(Aspect.ENTROPY, 36).add(Aspect.MIND, 24),new ItemStack(TBItems.ukulele,0),new ItemStack[]{
				new ItemStack(Items.ghast_tear,1,0),
				new ItemStack(ItemsTC.bucketDeath,1,0),
				new ItemStack(Items.nether_wart,1,0),
				new ItemStack(BlocksTC.arcaneEar,1,0),
				new ItemStack(Items.fermented_spider_eye,1,0),
				new ItemStack(ItemsTC.bucketDeath,1,0),
				new ItemStack(Items.ender_pearl,1,0),
				new ItemStack(BlocksTC.arcaneEar,1,0)
		});
		
		InfusionRecipe growthUkuleleRec = new InfusionRecipe("TB.Ukulele.Growth",new ItemStack(TBItems.ukulele,1,7),3,new AspectList().add(Aspect.AURA, 12).add(Aspect.LIFE, 24).add(Aspect.LIGHT, 36).add(Aspect.WATER, 24).add(Aspect.EARTH, 24),new ItemStack(TBItems.ukulele,0),new ItemStack[]{
				new ItemStack(TBBlocks.dustBlock,1,0),
				new ItemStack(BlocksTC.lampGrowth,1,0),
				new ItemStack(ItemsTC.shard,1,3),
				new ItemStack(BlocksTC.lampGrowth,1,0),
				new ItemStack(TBBlocks.dustBlock,1,0),
				new ItemStack(BlocksTC.lampGrowth,1,0),
				new ItemStack(ItemsTC.shard,1,3),
				new ItemStack(BlocksTC.lampGrowth,1,0)
		});
		
		InfusionRecipe loveUkuleleRec = new InfusionRecipe("TB.Ukulele.Love",new ItemStack(TBItems.ukulele,1,8),3,new AspectList().add(Aspect.AURA, 12).add(Aspect.LIFE, 48).add(Aspect.LIFE, 36).add(Aspect.BEAST, 24).add(Aspect.PLANT, 24),new ItemStack(TBItems.ukulele,0),new ItemStack[]{
				new ItemStack(Items.golden_apple,1,0),
				new ItemStack(BlocksTC.lampFertility,1,0),
				new ItemStack(Items.carrot,1,0),
				new ItemStack(BlocksTC.lampFertility,1,0),
				new ItemStack(Items.wheat_seeds,1,0),
				new ItemStack(BlocksTC.lampFertility,1,0),
				new ItemStack(Items.wheat,1,0),
				new ItemStack(BlocksTC.lampFertility,1,0)
		});
		
		//TODO recipes

		ResearchItem voidIngot = ResearchCategories.getResearchList("ELDRITCH").research.get("VOIDMETAL");
		
		ResearchPage[] currentPages = voidIngot.getPages();
		ResearchPage[] newPages = new ResearchPage[currentPages.length+2];
		System.arraycopy(currentPages, 0, newPages, 0, currentPages.length);
		newPages[newPages.length-2] = new ResearchPage(voidFlint);
		newPages[newPages.length-1] = new ResearchPage(voidShearsRec);
		voidIngot.setPages(newPages);
		
		IRecipe[] slabs = new IRecipe[12];
		slabs = TBRecipes.slabs.toArray(slabs);
		
		new ResearchItem("TB.DecoBlocks",catName,new AspectList(),-2,0,0,new ItemStack(TBBlocks.quicksilverBlock,1,0))
		.setRound()
		.setAutoUnlock()
		.setPages(
			new ResearchPage("tb.rec.decoBlocks.page.0"),
			new ResearchPage(TBRecipes.recipes.get("quicksilverBlock")),
			new ResearchPage(TBRecipes.recipes.get("quicksilver")),
			new ResearchPage(TBRecipes.recipes.get("quicksilverBrick")),
			new ResearchPage(TBRecipes.recipes.get("eldritchArk")),
			new ResearchPage(TBRecipes.recipes.get("ironGreatwood")),
			new ResearchPage(oldRec),
			new ResearchPage(slabs)
			).registerResearchItem();
		
		new ResearchItem("TB.AdvancedEntropy",catName,new AspectList().add(Aspect.ENTROPY, 3).add(Aspect.ENERGY, 3).add(Aspect.CRAFT, 3),-1,-2,1,new ItemStack(Items.blaze_powder,1,0))
			.setParents("TB.CRUCIBLE")
			.setPages(
				new ResearchPage("tb.rec.advEntr.page.0"),
				new ResearchPage(wool3Rec),
				new ResearchPage(sandstone3Rec),
				new ResearchPage(blaze3Rec)
				).registerResearchItem();
		
		new ResearchItem("TB.AlchemyRestoration",catName,new AspectList().add(Aspect.ORDER, 3).add(Aspect.ENERGY, 3).add(Aspect.CRAFT, 3),1,-2,1,new ItemStack(Blocks.packed_ice,1,0))
		.setParents("TB.CRUCIBLE")
		.setPages(
			new ResearchPage("tb.rec.alcRest.page.0"),
			new ResearchPage(gravel2Cobble),
			new ResearchPage(icePacking)
			).registerResearchItem();
		
		new ResearchItem("TB.Pyrofluid",catName,new AspectList().add(Aspect.FIRE, 16).add(Aspect.ENERGY, 6).add(Aspect.ELDRITCH, 8).add(Aspect.DESIRE, 6),3,-2,4,new ItemStack(TBItems.pyroBucket,1,0))
		.setParents("TB.CRUCIBLE")
		.setPages(
			new ResearchPage("tb.rec.pyrofluid.page.0"),
			new ResearchPage(pyrofluidRec)
			).registerResearchItem();
		
		new ResearchItem("TB.Clusters",catName,new AspectList().add(primals(8)),2,-4,1,new ItemStack(TBItems.shardCluster,1,OreDictionary.WILDCARD_VALUE))
		.setParents("TB.AlchemyRestoration")
		.setPages(
			new ResearchPage("tb.rec.clusters.page.0"),
			new ResearchPage(clusters)
			).registerResearchItem();
		
		new ResearchItem("TB.CrystalBlocks",catName,new AspectList().add(primals(8)),3,-6,1,new ItemStack(TBBlocks.crystalBlock,1,OreDictionary.WILDCARD_VALUE))
		.setParents("TB.Clusters")
		.setPages(
			new ResearchPage("tb.rec.cBlocks.page.0"),
			new ResearchPage(cBlocks)
			).registerResearchItem();
		
		new ResearchItem("TB.Backprocessing",catName,new AspectList().add(Aspect.ORDER, 8).add(Aspect.EXCHANGE, 8).add(Aspect.CRAFT, 8),0,-3,1,new ItemStack(Items.reeds,1,0))
		.setParents("TB.AlchemyRestoration","TB.AdvancedEntropy")
		.setSecondary()
		
		.setPages(
			new ResearchPage("tb.rec.backProc.page.0"),
			new ResearchPage(blazepowderRest),
			new ResearchPage(boneRest),
			new ResearchPage(sugarRest),
			new ResearchPage(cactiRest)
			).registerResearchItem();
		
		//0, -3
		
		new ResearchItem("TB.MasterEntropy",catName,new AspectList().add(Aspect.ENTROPY, 8).add(Aspect.ENERGY, 4).add(Aspect.DESIRE, 2),-2,-3,3,new ItemStack(Items.string,1,0))
		.setParents("TB.AdvancedEntropy")
		.setPages(
			new ResearchPage("tb.rec.mastEntr.page.0"),
			new ResearchPage(wool4Rec),
			new ResearchPage(sandstone4Rec),
			new ResearchPage(blaze4Rec)
			).registerResearchItem();
		
		new ResearchItem("TB.StrongEntropy",catName,new AspectList().add(Aspect.ENTROPY, 2).add(Aspect.AVERSION, 2),-1,-4,3,new ItemStack(Blocks.sand,1,0))
		.setParents("TB.AdvancedEntropy")
		.setSecondary()
		.setPages(
			new ResearchPage("tb.rec.strEntr.page.0"),
			new ResearchPage(glassSand),
			new ResearchPage(gravelSand),
			new ResearchPage(barsIron)
			).registerResearchItem();
		
		new ResearchItem("TB.SimpleDublication",catName,new AspectList().add(Aspect.EXCHANGE, 6).add(Aspect.ORDER, 6),3,0,1,new ItemStack(Items.arrow,1,0))
		.setParents("TB.CRUCIBLE")
		.setSecondary()
		.setPages(
			new ResearchPage("tb.rec.simDup.page.0"),
			new ResearchPage(arrows),
			new ResearchPage(snowball),
			new ResearchPage(redstone)
			).registerResearchItem();
		
		new ResearchItem("TB.Amber",catName,new AspectList().add(Aspect.TRAP, 6).add(Aspect.ORDER, 6),1,1,1,new ItemStack(ItemsTC.amber))
		.setParents("TB.CRUCIBLE")
		.setSecondary()
		.setPages(
			new ResearchPage("tb.rec.amber.page.0"),
			new ResearchPage(amber)
			).registerResearchItem();
		
		new ResearchItem("TB.Quicksilver",catName,new AspectList().add(Aspect.PLANT, 6).add(Aspect.ORDER, 6),-1,1,1,new ItemStack(ItemsTC.quicksilver))
		.setParents("TB.CRUCIBLE")
		.setSecondary()
		.setPages(
			new ResearchPage("tb.rec.cinnabar.page.0"),
			new ResearchPage(cinnabar)
			).registerResearchItem();
		
		new ResearchItem("TB.Thauminite",catName,new AspectList().add(Aspect.METAL, 4).add(Aspect.ENERGY, 3).add(Aspect.CRYSTAL, 8).add(Aspect.CRAFT, 2),9,0,2,new ItemStack(TBItems.resource,1,1))
		.setParents("TB.METALLURGY")
		
		.setPages(
			new ResearchPage("tb.rec.thauminite.page.0"),
			new ResearchPage(thauminiteRec),
			new ResearchPage(TBRecipes.recipes.get("thauminiteIngot")),
			new ResearchPage(TBRecipes.recipes.get("thauminiteNugget")),
			new ResearchPage(TBRecipes.recipes.get("thauminiteBlock")),
			new ResearchPage(toolsRec)
			).registerResearchItem();
		
		new ResearchItem("ROD_tbthaumium",catName,new AspectList().add(Aspect.METAL, 4).add(Aspect.ENERGY, 3).add(Aspect.AURA, 4).add(Aspect.CRAFT, 2).add(Aspect.MAN, 6),9,2,2,new ItemStack(TBItems.resource,1,3))
		.setParents("TB.METALLURGY")
		
		.setPages(
			new ResearchPage("tb.rec.thaumRod.page.0"),
			new ResearchPage(thaumicWandCore)
			).registerResearchItem();
		
		new ResearchItem("ROD_tbvoid",catName,new AspectList().add(Aspect.ELDRITCH, 4).add(Aspect.ENERGY, 3).add(Aspect.AURA, 4).add(Aspect.VOID, 2).add(Aspect.MIND, 6),11,2,4,new ItemStack(TBItems.resource,1,4))
		.setParents("ROD_tbthaumium","TB.VOIDMETAL")
		
		.setSpecial()
		.setPages(
			new ResearchPage("tb.rec.voidRod.page.0"),
			new ResearchPage(voidRodRecipe)
			).registerResearchItem();
		
		new ResearchItem("CAP_thauminite",catName,new AspectList().add(Aspect.METAL, 4).add(Aspect.ENERGY, 3).add(Aspect.AURA, 4),10,-2,2,new ItemStack(TBItems.resource,1,2))
		.setParents("TB.Thauminite")
		
		.setPages(
			new ResearchPage("tb.rec.capthauminite.page.0"),
			new ResearchPage(thauminiteCaps)
			).registerResearchItem();
		
		new ResearchItem("TB.SM",catName,new AspectList().add(primals(4)),0,2,1,new ItemStack(ItemsTC.salisMundus))
		.setParents("TB.CRUCIBLE","TB.Quicksilver","TB.Amber")
		.setSecondary()
		
		.setPages(
			new ResearchPage("tb.rec.sm.page.0"),
			new ResearchPage(salisMundis)
			).registerResearchItem();
		
		new ResearchItem("TB.SMB",catName,new AspectList().add(primals(6)).add(Aspect.CRAFT, 2),0,3,1,new ItemStack(TBBlocks.dustBlock))
		.setParents("TB.SM")
		
		.setPages(
			new ResearchPage("tb.rec.smb.page.0"),
			new ResearchPage(salisMundusBlockRec)
			).registerResearchItem();
		
		new ResearchItem("TB.Enchantments",catName,new AspectList(),-3,2,0,new ResourceLocation("thaumicbases","textures/thaumonomicon/enchantments_icon.png"))
		.setAutoUnlock()
		.setRound()
		.setStub()
		.setPages(
			new ResearchPage("tb.rec.enchantments.page.0"),
			new ResearchPage("tb.rec.enchantments.page.1"),
			new ResearchPage("tb.rec.enchantments.page.2"),
			new ResearchPage("tb.rec.enchantments.page.3"),
			new ResearchPage("tb.rec.enchantments.page.4"),
			new ResearchPage("tb.rec.enchantments.page.5")
			).registerResearchItem();
		
		/*
		new ResearchItem("TB.ElderKnowledge",catName,new AspectList().add(Aspect.ENERGY, 8).add(Aspect.MIND, 8).add(Aspect.AVERSION, 8),-5,3,1,new ResourceLocation("thaumicbases","textures/enchantments/elder_knowledge.png"))
		.setParents("TB.INFUSIONENCHANTMENT","TB.Enchantments")
		.setSecondary()
		
		.setPages(
			new ResearchPage(elderKnowledgeEnch)
			).registerResearchItem();
		
		new ResearchItem("TB.EldritchBane",catName,new AspectList().add(Aspect.DEATH, 8).add(Aspect.ELDRITCH, 8).add(Aspect.AVERSION, 8),-4,4,1,new ResourceLocation("thaumicbases","textures/enchantments/eldritch_bane.png"))
		.setParents("TB.INFUSIONENCHANTMENT","TB.Enchantments")
		.setSecondary()
		
		.setPages(
			new ResearchPage(elderBaneEnch)
			).registerResearchItem();
		
		new ResearchItem("TB.MagicTouch",catName,new AspectList().add(Aspect.ENERGY, 8).add(Aspect.AURA, 8).add(Aspect.AVERSION, 8),-4,2,1,new ResourceLocation("thaumicbases","textures/enchantments/magic_touched.png"))
		.setParents("TB.INFUSIONENCHANTMENT","TB.Enchantments")
		.setSecondary()
		
		.setPages(
			new ResearchPage(magicTouchEnch)
			).registerResearchItem();
		
		new ResearchItem("TB.Vaporising",catName,new AspectList().add(Aspect.ENERGY, 8).add(Aspect.CRYSTAL, 8).add(Aspect.TRAP, 8),-3,3,1,new ResourceLocation("thaumicbases","textures/enchantments/vaporising.png"))
		.setParents("TB.INFUSIONENCHANTMENT","TB.Enchantments")
		.setSecondary()
		
		.setPages(
			new ResearchPage(vaporisingEnch)
			).registerResearchItem();
		
		new ResearchItem("TB.Tainted",catName,new AspectList().add(Aspect.FLUX, 16),-5,4,1,new ResourceLocation("thaumicbases","textures/enchantments/tainted.png"))
		.setParents("TB.INFUSIONENCHANTMENT","TB.Enchantments")
		.setSecondary()
		
		.setPages(
			new ResearchPage(taintedEnch)
			).registerResearchItem();
		*/
		new ResearchItem("TB.BasicPlants",catName,new AspectList(),0,-8,0,new ItemStack(Items.wheat_seeds,1,0))
		.setParents("TB.CRUCIBLE")
		.setRound()
		.setPages(
			new ResearchPage("tb.rec.basicPlants.page.0"),
			new ResearchPage(sweedRec)
			).registerResearchItem();
		
		new ResearchItem("TB.Plax",catName,new AspectList().add(Aspect.PLANT, 1).add(Aspect.CRAFT, 1),0,-10,1,new ItemStack(TBItems.plaxSeed,1,0))
		.setParents("TB.BasicPlants")
		.setPages(
			new ResearchPage("tb.rec.plax.page.0"),
			new ResearchPage(plaxRec)
			).registerResearchItem();
		
		new ResearchItem("TB.Briar",catName,new AspectList().add(Aspect.PLANT, 4).add(Aspect.PLANT, 4).add(Aspect.BEAST, 4),-1,-13,1,new ItemStack(TBItems.resource,1,6))
		.setParents("TB.Plax")
		
		.setPages(
			new ResearchPage("tb.rec.briar.page.0"),
			new ResearchPage(briarRec),
			new ResearchPage(rosehipRec)
			).registerResearchItem();
		
		new ResearchItem("TB.Aurelia",catName,new AspectList().add(Aspect.LIFE, 6).add(Aspect.ENERGY, 6).add(Aspect.AURA, 6),3,-9,0,new ItemStack(TBBlocks.aurelia,1,0))
		.setParents("TB.BasicPlants")
		.setPages(
			new ResearchPage("tb.rec.aurelia.page.0"),
			new ResearchPage("tb.rec.aurelia.page.1"),
			new ResearchPage(aureliaRec)
			).registerResearchItem();
		
		new ResearchItem("TB.Knose",catName,new AspectList().add(Aspect.LIFE, 6).add(Aspect.MIND, 6).add(Aspect.EARTH, 6),2,-11,0,new ItemStack(TBItems.knoseFragment,1,OreDictionary.WILDCARD_VALUE))
		.setParents("TB.Aurelia")
		
		.setPages(
			new ResearchPage("tb.rec.knose.page.0"),
			new ResearchPage("tb.rec.knose.page.1"),
			new ResearchPage(knoseRec),
			new ResearchPage(knowledgeFragmentRec)
			).registerResearchItem();
		
		new ResearchItem("TB.Ashroom",catName,new AspectList().add(Aspect.LIFE, 6).add(Aspect.ENTROPY, 6).add(Aspect.AURA, 6).add(Aspect.AIR, 6).add(Aspect.PLANT, 4),4,-11,2,new ItemStack(TBBlocks.ashroom))
		.setParents("TB.Aurelia")
		
		.setPages(
			new ResearchPage("tb.rec.ashroom.page.0"),
			new ResearchPage(aspectShroomRec)
			).registerResearchItem();
		
		new ResearchItem("TB.Glieonia",catName,new AspectList().add(Aspect.LIFE, 6).add(Aspect.LIGHT, 6).add(Aspect.SENSES, 6).add(Aspect.FIRE, 6).add(Aspect.PLANT, 4),5,-10,2,new ItemStack(TBItems.glieoniaSeed))
		.setParents("TB.Aurelia")
		
		.setPages(
			new ResearchPage("tb.rec.glieonia.page.0"),
			new ResearchPage(glieoniaRec)
			).registerResearchItem();
		
		new ResearchItem("TB.Flaxium",catName,new AspectList().add(Aspect.LIFE, 6).add(Aspect.ENTROPY, 6).add(Aspect.AURA, 6).add(Aspect.ENERGY, 6),3,-12,2,new ItemStack(TBBlocks.flaxium))
		.setParents("TB.Aurelia")
		
		.setPages(
			new ResearchPage("tb.rec.flaxium.page.0"),
			new ResearchPage(flaxiumRec)
			).registerResearchItem();
		
		new ResearchItem("TB.Metalleat",catName,new AspectList().add(Aspect.LIFE, 6).add(Aspect.ENERGY, 6).add(Aspect.METAL, 6).add(Aspect.EXCHANGE, 6),-3,-9,0,new ItemStack(TBItems.metalleatSeeds,1,0))
		.setParents("TB.BasicPlants")
		.setPages(
			new ResearchPage("tb.rec.metalleat.page.0"),
			new ResearchPage(metalleatRec)
			).registerResearchItem();
		
		new ResearchItem("TB.Lazullia",catName,new AspectList().add(Aspect.LIFE, 6).add(Aspect.ENERGY, 6).add(Aspect.DESIRE, 6).add(Aspect.CRYSTAL, 6).add(Aspect.PLANT, 6).add(Aspect.SENSES, 8),-5,-10,2,new ItemStack(TBItems.lazulliaSeeds,1,0))
		.setParents("TB.Metalleat")
		
		.setPages(
			new ResearchPage("tb.rec.lazullia.page.0"+(Loader.isModLoaded("essentialcraft") ? "_ec3" : "")),
			new ResearchPage(lazulliaRec)
			).registerResearchItem();
		
		new ResearchItem("TB.RainbowCacti",catName,new AspectList().add(Aspect.LIFE, 6).add(Aspect.ENERGY, 6).add(Aspect.EXCHANGE, 6).add(Aspect.PLANT, 6).add(Aspect.ENTROPY, 6).add(Aspect.SENSES, 8),-4,-11,2,new ItemStack(TBBlocks.rainbowCactus,1,0))
		.setParents("TB.Metalleat")
		
		.setPages(
			new ResearchPage("tb.rec.rainCacti.page.0"),
			new ResearchPage(rainbowCactiRec)
			).registerResearchItem();
		
		new ResearchItem("TB.Lucrite",catName,new AspectList().add(Aspect.DESIRE, 6).add(Aspect.ENERGY, 6).add(Aspect.PLANT, 6).add(Aspect.DEATH, 6),-2,-11,0,new ItemStack(TBItems.lucriteSeeds,1,0))
		.setParents("TB.Metalleat")
		
		.setPages(
			new ResearchPage("tb.rec.lucrite.page.0"),
			new ResearchPage(lucriteRec)
			).registerResearchItem();
		
		new ResearchItem("TB.Redlon",catName,new AspectList().add(Aspect.LIFE, 6).add(Aspect.MECHANISM, 6).add(Aspect.ENERGY, 6).add(Aspect.PLANT, 6).add(Aspect.ORDER, 6).add(Aspect.DESIRE, 8),-3,-12,3,new ItemStack(TBItems.redlonSeeds,1,0))
		.setParents("TB.Metalleat")
		
		.setPages(
			new ResearchPage("tb.rec.redlon.page.0"),
			new ResearchPage(redlonRec)
			).registerResearchItem();

		
		new ResearchItem("TB.VoidSeed",catName,new AspectList().add(Aspect.LIFE, 6).add(Aspect.ELDRITCH, 6).add(Aspect.DARKNESS, 6),13,-3,1,new ItemStack(TBItems.voidSeed,1,0))
		.setParents("TB.VOIDMETAL")
		
		.setPages(
			new ResearchPage("tb.rec.voidSeed.page.0"),
			new ResearchPage(voidSeedRec)
			).registerResearchItem();
		
		new ResearchItem("TB.Spike.Iron",catName,new AspectList().add(Aspect.AVERSION, 6).add(Aspect.DEATH, 6).add(Aspect.METAL, 6),6,-6,1,new ItemStack(TBBlocks.spike,1,0))
		.setParents("TB.ENCHFABRIC")
		.setPages(
			new ResearchPage("tb.rec.spikeIron.page.0"),
			new ResearchPage(ironSpikeRec),
			new ResearchPage(cleanEFabricRec)
			).registerResearchItem();
		
		new ResearchItem("TB.Spike.Thaumic",catName,new AspectList().add(Aspect.AVERSION, 6).add(Aspect.ENERGY, 6).add(Aspect.MECHANISM, 6),8,-6,1,new ItemStack(TBBlocks.spike,1,2))
		
		.setParents("TB.METALLURGY","TB.Spike.Iron")
		.setPages(
			new ResearchPage("tb.rec.spikeThaumic.page.0"),
			new ResearchPage(thaumiumSpikeRec)
			).registerResearchItem();
		
		new ResearchItem("TB.BloodyRobes",catName,new AspectList().add(Aspect.DEATH, 6).add(Aspect.BEAST, 6).add(Aspect.PROTECT, 6),7,-8,1,new ItemStack(TBItems.bloodyChest,1,0))
		
		.setParents("TB.Spike.Iron")
		.setPages(
			new ResearchPage("tb.rec.bloodyRobes.page.0"),
			new ResearchPage(bloodyChestRec),
			new ResearchPage(bloodyLegsRec),
			new ResearchPage(bloodyBootsRec)
			).registerResearchItem();
		
		new ResearchItem("TB.Spike.Void",catName,new AspectList().add(Aspect.AVERSION, 6).add(Aspect.ELDRITCH, 6).add(Aspect.PROTECT, 6),11,-6,2,new ItemStack(TBBlocks.spike,1,4))
		
		.setParents("TB.VOIDMETAL","TB.Spike.Thaumic")
		.setPages(
			new ResearchPage("tb.rec.spikeVoid.page.0"),
			new ResearchPage(voidSpikeRec)
			).registerResearchItem();
		
		/*
		new ResearchItem("TB.Foci.Drain",catName,new AspectList().add(Aspect.WATER, 6).add(Aspect.VOID, 3),-1,-20,0,new ItemStack(TBItems.fociDrain))
		.setParents("TB.INFUSION","TB.FOCUSEXCAVATION","TB.JARVOID")
		
		.setSecondary()
		.setPages(
			new ResearchPage("tb.rec.drainFoci.page.0"),
			new ResearchPage(drainFociRec),
			new ResearchPage("tb.rec.drainFoci.page.1"),
			new ResearchPage("tb.rec.drainFoci.page.2")
			).registerResearchItem();
		
		new ResearchItem("TB.Foci.Experience",catName,new AspectList().add(Aspect.DESIRE, 16).add(Aspect.DEATH, 16).add(Aspect.MINE, 2).add(Aspect.MIND, 8),-2,-20,1,new ItemStack(TBItems.fociExperience))
		.setParents("TB.INFUSION","TB.FOCUSEXCAVATION")
		
		.setPages(
			new ResearchPage("tb.rec.expFoci.page.0"),
			new ResearchPage(expFociRec),
			new ResearchPage("tb.rec.expFoci.page.1"),
			new ResearchPage("tb.rec.expFoci.page.2")
			).registerResearchItem();
		
		new ResearchItem("TB.Foci.Flux",catName,new AspectList().add(Aspect.WATER, 4).add(Aspect.ORDER, 4).add(Aspect.VOID, 4),-1,-19,0,new ItemStack(TBItems.fociFlux))
		.setParents("TB.INFUSION","TB.JARVOID","TB.FLUXSCRUB")
		
		.setSecondary()
		.setPages(
			new ResearchPage("tb.rec.fluxFoci.page.0"),
			new ResearchPage(fluxFociRec),
			new ResearchPage("tb.rec.fluxFoci.page.1"),
			new ResearchPage("tb.rec.fluxFoci.page.2"),
			new ResearchPage("tb.rec.fluxFoci.page.3")
			).registerResearchItem();
		
		new ResearchItem("TB.Foci.Activation",catName,new AspectList().add(Aspect.MOTION, 4).add(Aspect.MOTION, 4).add(Aspect.SENSES, 4),-2,-19,0,new ItemStack(TBItems.fociActivation))
		.setParents("TB.INFUSION","TB.MIRRORHAND")
		
		.setSecondary()
		.setPages(
			new ResearchPage("tb.rec.actFoci.page.0"),
			new ResearchPage(activationFociRec),
			new ResearchPage("tb.rec.actFoci.page.1")
			).registerResearchItem();
		
		new ResearchItem("TB.AdvAlc",catName,new AspectList().add(Aspect.MOTION, 16).add(Aspect.AIR, 16).add(Aspect.FIRE, 8).add(Aspect.CRAFT, 4),7,3,2,new ItemStack(TBBlocks.advAlchFurnace))
		.setParents("TB.METALLURGY","TB.DISTILESSENTIA","TB.BELLOWS")
		.setPages(
			new ResearchPage("tb.rec.advAlc.page.0"),
			new ResearchPage(advFurnaceRecipe)
			).registerResearchItem();
		*/
		new ResearchItem("TB.CryingObs",catName,new AspectList().add(Aspect.MOTION, 8).add(Aspect.LIFE, 8).add(Aspect.SOUL, 8),6,-18,2,new ItemStack(TBBlocks.cryingObsidian,1,0))
		.setParents("TB.INFUSION")
		
		.setPages(
			new ResearchPage("tb.rec.cryingObs.page.0"),
			new ResearchPage(cryingObsidianRec)
			).registerResearchItem();
		
		new ResearchItem("TB.Overchanter",catName,new AspectList().add(primals(8)).add(Aspect.MIND, 8).add(Aspect.ENERGY, 8),6,-20,3,new ItemStack(TBBlocks.overchanter,1,0))
		.setParents("TB.INFUSION")
		
		.setPages(
			new ResearchPage("tb.rec.overchanter.page.0"),
			new ResearchPage("tb.rec.overchanter.page.1"),
			new ResearchPage("tb.rec.overchanter.page.2"),
			new ResearchPage(overchanterRec)
			).registerResearchItem();
		
		new ResearchItem("TB.GoldenOak",catName,new AspectList().add(Aspect.DESIRE, 8).add(Aspect.DEATH, 8).add(Aspect.PLANT, 8),-4,-16,0,new ItemStack(TBBlocks.sapling,1,0))
		.setParents("TB.INFUSION","TB.Briar")
		
		.setPages(
			new ResearchPage("tb.rec.goldenOak.page.0"),
			new ResearchPage(goldenOakRec)
			).registerResearchItem();
		
		new ResearchItem("TB.NodeMan",catName,new AspectList().add(Aspect.MECHANISM, 8).add(Aspect.AURA, 8).add(Aspect.ENERGY, 16).add(Aspect.ENERGY, 8),0,-25,3,new ItemStack(TBBlocks.nodeManipulator))
		.setParents("TB.INFUSION")
		
		.setPages(
			new ResearchPage("tb.rec.nodeMan.page.0"),
			new ResearchPage("tb.rec.nodeMan.page.1"),
			new ResearchPage("tb.rec.nodeMan.page.2"),
			new ResearchPage("tb.rec.nodeMan.page.3"),
			new ResearchPage(nodeManipulatorRec)
			).registerResearchItem();
		
		if(flag)
			copy(ResearchCategories.getResearchList("ELDRITCH").research.get("PRIMPEARL"),"TB.PRIMPEARL",catName,3,-29).setHidden().registerResearchItem();
		
		String[] bParents = flag ? new String[]{"TB.NodeMan","TB.PRIMPEARL"} : new String[]{"TB.NodeMan"};
		
		new ResearchItem("TB.NodeFoci.Bright",catName,new AspectList().add(Aspect.AURA, 8).add(Aspect.LIGHT, 8),2,-28,0,new ItemStack(TBItems.nodeFoci,1,0))
		.setParents(bParents)
		
		.setSecondary()
		.setPages(
			new ResearchPage("tb.rec.foci.bright.page.0"),
			new ResearchPage(brightFociRec)
			).registerResearchItem();
		
		new ResearchItem("TB.NodeFoci.Destr",catName,new AspectList().add(Aspect.AURA, 8).add(Aspect.DEATH, 8).add(Aspect.VOID, 8),1,-28,0,new ItemStack(TBItems.nodeFoci,1,1))
		.setParents("TB.NodeMan")
		
		.setSecondary()
		.setPages(
			new ResearchPage("tb.rec.foci.destr.page.0"),
			new ResearchPage(destructionFociRec)
			).registerResearchItem();
		
		new ResearchItem("TB.NodeFoci.Efficiency",catName,new AspectList().add(Aspect.AURA, 8).add(Aspect.ENERGY, 8).add(Aspect.ENERGY, 8),-1,-28,0,new ItemStack(TBItems.nodeFoci,1,2))
		.setParents("TB.NodeMan")
		
		.setSecondary()
		.setPages(
			new ResearchPage("tb.rec.foci.efficiency.page.0"),
			new ResearchPage(efficiencyFociRec)
			).registerResearchItem();
		
		new ResearchItem("TB.NodeFoci.Hunger",catName,new AspectList().add(Aspect.AURA, 8).add(Aspect.DEATH, 16).add(Aspect.ENERGY, 16),0,-29,0,new ItemStack(TBItems.nodeFoci,1,3))
		.setParents("TB.NodeMan")
		
		.setSecondary()
		.setSpecial()
		.setPages(
			new ResearchPage("tb.rec.foci.hunger.page.0"),
			new ResearchPage(hungerFociRec)
			).registerResearchItem();
		
		new ResearchItem("TB.NodeFoci.Unstable",catName,new AspectList().add(Aspect.AURA, 8).add(Aspect.ENTROPY, 8).add(Aspect.VOID, 8),-2,-28,0,new ItemStack(TBItems.nodeFoci,1,4))
		.setParents("TB.NodeMan")
		
		.setSecondary()
		.setPages(
			new ResearchPage("tb.rec.foci.unstable.page.0"),
			new ResearchPage(unstableFociRec)
			).registerResearchItem();
		
		new ResearchItem("TB.NodeFoci.Purity",catName,new AspectList().add(Aspect.AURA, 8).add(Aspect.LIFE, 8).add(Aspect.ORDER, 8),3,-27,0,new ItemStack(TBItems.nodeFoci,1,5))
		.setParents("TB.NodeMan")
		
		.setSecondary()
		.setPages(
			new ResearchPage("tb.rec.foci.pure.page.0"),
			new ResearchPage(pureFociRec)
			).registerResearchItem();
		
		new ResearchItem("TB.NodeFoci.Sinister",catName,new AspectList().add(Aspect.AURA, 8).add(Aspect.UNDEAD, 8).add(Aspect.ENTROPY, 8),-3,-27,0,new ItemStack(TBItems.nodeFoci,1,6))
		.setParents("TB.NodeMan")
		
		.setSecondary()
		.setPages(
			new ResearchPage("tb.rec.foci.sinister.page.0"),
			new ResearchPage(sinisterFociRec)
			).registerResearchItem();
		
		new ResearchItem("TB.NodeFoci.Speed",catName,new AspectList().add(Aspect.AURA, 8).add(Aspect.MOTION, 8).add(Aspect.ENERGY, 8),-4,-26,0,new ItemStack(TBItems.nodeFoci,1,7))
		.setParents("TB.NodeMan")
		
		.setSecondary()
		.setPages(
			new ResearchPage("tb.rec.foci.speed.page.0"),
			new ResearchPage(speedFociRec)
			).registerResearchItem();
		
		new ResearchItem("TB.NodeFoci.Stability",catName,new AspectList().add(Aspect.AURA, 8).add(Aspect.ORDER, 8).add(Aspect.EXCHANGE, 8),4,-26,0,new ItemStack(TBItems.nodeFoci,1,8))
		.setParents("TB.NodeMan")
		
		.setSecondary()
		.setPages(
			new ResearchPage("tb.rec.foci.stability.page.0"),
			new ResearchPage(stabilityFociRec)
			).registerResearchItem();
		
		new ResearchItem("TB.NodeFoci.Taint",catName,new AspectList().add(Aspect.AURA, 8).add(Aspect.FLUX, 16).add(Aspect.ENERGY, 8),5,-25,0,new ItemStack(TBItems.nodeFoci,1,9))
		.setParents("TB.NodeMan")
		
		.setSecondary()
		.setPages(
			new ResearchPage("tb.rec.foci.taint.page.0"),
			new ResearchPage(taintFociRec)
			).registerResearchItem();
		
		new ResearchItem("TB.HerobrinesScythe",catName,new AspectList().add(Aspect.ELDRITCH, 16).add(Aspect.DEATH, 16).add(Aspect.AVERSION, 16).add(Aspect.AURA, 8).add(Aspect.ENERGY, 6),15,1,4,new ItemStack(TBItems.herobrinesScythe,1,0))
		.setParents("TB.VOIDMETAL")
		
		.setSpecial()
		.setPages(
			new ResearchPage("tb.rec.hScythe.page.0"),
			new ResearchPage("tb.rec.hScythe.page.1"),
			new ResearchPage(herobrinesScytheRec)
			).registerResearchItem();
		
		new ResearchItem("TB.ThaumicAnvil",catName,new AspectList().add(Aspect.METAL, 4).add(Aspect.CRAFT, 3),8,4,2,new ItemStack(TBBlocks.thaumicAnvil,1,0))
		.setParents("TB.METALLURGY")
		
		.setPages(
			new ResearchPage("tb.rec.thaumicAnvil.page.0"),
			new ResearchPage(thaumicAnvilRec)
			).registerResearchItem();
		
		new ResearchItem("TB.VoidAnvil",catName,new AspectList().add(Aspect.METAL, 4).add(Aspect.CRAFT, 3).add(Aspect.TOOL,4).add(Aspect.ELDRITCH, 4),12,4,2,new ItemStack(TBBlocks.voidAnvil,1,0))
		.setParents("TB.VOIDMETAL","TB.ThaumicAnvil")
		
		.setPages(
			new ResearchPage("tb.rec.voidAnvil.page.0"),
			new ResearchPage("tb.rec.voidAnvil.page.1"),
			new ResearchPage(voidAnvilRec)
			).registerResearchItem();
		
		new ResearchItem("TB.PeacefulSapling",catName,new AspectList().add(Aspect.LIFE, 8).add(Aspect.BEAST, 8).add(Aspect.PLANT, 8),-7,-16,0,new ItemStack(TBBlocks.sapling,1,1))
		.setParents("TB.GoldenOak")
		
		.setPages(
			new ResearchPage("tb.rec.peacefulTree.page.0"),
			new ResearchPage(peacefulSaplingRec)
			).registerResearchItem();
		
		new ResearchItem("TB.NetherSapling",catName,new AspectList().add(Aspect.PLANT, 8).add(Aspect.FIRE, 8).add(Aspect.FIRE, 8),-6,-15,0,new ItemStack(TBBlocks.sapling,1,2))
		.setParents("TB.GoldenOak")
		
		.setPages(
			new ResearchPage("tb.rec.netherTree.page.0"),
			new ResearchPage(netherSaplingRec)
			).registerResearchItem();
		
		new ResearchItem("TB.EnderSapling",catName,new AspectList().add(Aspect.PLANT, 8).add(Aspect.ELDRITCH, 8).add(Aspect.VOID, 8),-6,-17,0,new ItemStack(TBBlocks.sapling,1,3))
		.setParents("TB.GoldenOak")
		
		.setPages(
			new ResearchPage("tb.rec.enderTree.page.0"),
			new ResearchPage(enderSaplingRec)
			).registerResearchItem();
		
		new ResearchItem("TB.Revolver",catName,new AspectList().add(Aspect.AVERSION, 5).add(Aspect.FIRE, 5).add(Aspect.VOID, 4).add(Aspect.TOOL, 2).add(Aspect.ENERGY, 2),-6,-21,4,new ItemStack(TBItems.revolver,1,0))
		.setParents("TB.INFUSION")
		
		.setPages(
			new ResearchPage("tb.rec.revolver.page.0"),
			new ResearchPage("tb.rec.revolver.page.1"),
			new ResearchPage("tb.rec.revolver.page.2"),
			new ResearchPage(revolverRec)
			).registerResearchItem();
		
		new ResearchItem("TB.Revolver.Accuracy",catName,new AspectList().add(Aspect.ORDER, 8).add(Aspect.MECHANISM, 8).add(Aspect.SENSES, 4),-9,-19,0,new ResourceLocation("thaumicbases","textures/thaumonomicon/revolver/ACCURACY.png"))
		.setParents("TB.Revolver")
		
		.setSecondary()
		.setPages(
			new ResearchPage("tb.rec.revolver.acc.page.0"),
			new ResearchPage(accuracyRec)
			).registerResearchItem();
		
		new ResearchItem("TB.Revolver.Atropods",catName,new AspectList().add(Aspect.DEATH, 8).add(Aspect.BEAST, 8).add(Aspect.CRAFT, 4),-10,-20,0,new ResourceLocation("thaumicbases","textures/thaumonomicon/revolver/BANE_OF_ATROPODS.png"))
		.setParents("TB.Revolver")
		
		.setSecondary()
		.setPages(
			new ResearchPage("tb.rec.revolver.atr.page.0"),
			new ResearchPage(atropodsRec)
			).registerResearchItem();
		
		new ResearchItem("TB.Revolver.EldritchBane",catName,new AspectList().add(Aspect.DEATH, 8).add(Aspect.ELDRITCH, 4),-2,-20,0,new ResourceLocation("thaumicbases","textures/thaumonomicon/revolver/BANE_OF_ELDRITCH.png"))
		.setParents("TB.Revolver")
		
		.setSecondary()
		.setPages(
			new ResearchPage("tb.rec.revolver.elb.page.0"),
			new ResearchPage(eldritchBRec)
			).registerResearchItem();
		
		new ResearchItem("TB.Revolver.Dueling",catName,new AspectList().add(Aspect.DEATH, 8).add(Aspect.MAN, 8),-11,-21,0,new ResourceLocation("thaumicbases","textures/thaumonomicon/revolver/DUELING.png"))
		.setParents("TB.Revolver")
		
		.setSecondary()
		.setPages(
			new ResearchPage("tb.rec.revolver.duel.page.0"),
			new ResearchPage(duelingRec)
			).registerResearchItem();
		
		new ResearchItem("TB.Revolver.Efficiency",catName,new AspectList().add(Aspect.ORDER, 8).add(Aspect.EXCHANGE, 8),-10,-22,0,new ResourceLocation("thaumicbases","textures/thaumonomicon/revolver/EFFICIENCY.png"))
		.setParents("TB.Revolver")
		
		.setSecondary()
		.setPages(
			new ResearchPage("tb.rec.revolver.eff.page.0"),
			new ResearchPage(efficiencyRec)
			).registerResearchItem();
		
		new ResearchItem("TB.Revolver.Eldritch",catName,new AspectList().add(Aspect.ELDRITCH, 8).add(Aspect.VOID, 8),-3,-19,0,new ResourceLocation("thaumicbases","textures/thaumonomicon/revolver/ELDRITCH.png"))
		.setParents("TB.Revolver")
		
		.setSecondary()
		.setPages(
			new ResearchPage("tb.rec.revolver.eld.page.0"),
			new ResearchPage(eldritchRec)
			).registerResearchItem();
		
		new ResearchItem("TB.Revolver.Heavy",catName,new AspectList().add(Aspect.AVERSION, 8).add(Aspect.METAL, 8),-9,-23,0,new ResourceLocation("thaumicbases","textures/thaumonomicon/revolver/HEAVY.png"))
		.setParents("TB.Revolver")
		
		.setSecondary()
		.setPages(
			new ResearchPage("tb.rec.revolver.hev.page.0"),
			new ResearchPage(heavyRec)
			).registerResearchItem();
		
		new ResearchItem("TB.Revolver.Knowledge",catName,new AspectList().add(Aspect.MIND, 8).add(Aspect.ENERGY, 8),-8,-24,0,new ResourceLocation("thaumicbases","textures/thaumonomicon/revolver/KNOWLEGDE.png"))
		.setParents("TB.Revolver")
		
		.setSecondary()
		.setPages(
			new ResearchPage("tb.rec.revolver.kno.page.0"),
			new ResearchPage(knowledgeRec)
			).registerResearchItem();
		
		new ResearchItem("TB.Revolver.Piercing",catName,new AspectList().add(Aspect.AVERSION, 8).add(Aspect.AIR, 8),-2,-22,0,new ResourceLocation("thaumicbases","textures/thaumonomicon/revolver/PIERCING.png"))
		.setParents("TB.Revolver")
		
		.setSecondary()
		.setPages(
			new ResearchPage("tb.rec.revolver.pir.page.0"),
			new ResearchPage(piercingRec)
			).registerResearchItem();
		
		new ResearchItem("TB.Revolver.Power",catName,new AspectList().add(Aspect.AVERSION, 8).add(Aspect.MECHANISM, 8),-7,-24,0,new ResourceLocation("thaumicbases","textures/thaumonomicon/revolver/POWER.png"))
		.setParents("TB.Revolver")
		
		.setSecondary()
		.setPages(
			new ResearchPage("tb.rec.revolver.pow.page.0"),
			new ResearchPage(powerRec)
			).registerResearchItem();
		
		new ResearchItem("TB.Revolver.Primal",catName,new AspectList().add(Aspect.AVERSION, 8).add(Aspect.AURA, 8).add(primals(16)),-1,-21,0,new ResourceLocation("thaumicbases","textures/thaumonomicon/revolver/PRIMAL.png"))
		.setParents("TB.Revolver")
		
		.setSecondary()
		.setSpecial()
		.setPages(
			new ResearchPage("tb.rec.revolver.primal.page.0"),
			new ResearchPage(primalRec)
			).registerResearchItem();
		
		new ResearchItem("TB.Revolver.Silver",catName,new AspectList().add(Aspect.DEATH, 8).add(Aspect.UNDEAD, 8),-6,-24,0,new ResourceLocation("thaumicbases","textures/thaumonomicon/revolver/SILVER.png"))
		.setParents("TB.Revolver")
		
		.setSecondary()
		.setPages(
			new ResearchPage("tb.rec.revolver.sil.page.0"),
			new ResearchPage(silverRec)
			).registerResearchItem();
		
		new ResearchItem("TB.Revolver.Speed",catName,new AspectList().add(Aspect.MOTION, 8).add(Aspect.AIR, 8),-5,-24,0,new ResourceLocation("thaumicbases","textures/thaumonomicon/revolver/SPEED.png"))
		.setParents("TB.Revolver")
		
		.setSecondary()
		.setPages(
			new ResearchPage("tb.rec.revolver.spe.page.0"),
			new ResearchPage(speedRec)
			).registerResearchItem();
		
		new ResearchItem("TB.Revolver.Tainted",catName,new AspectList().add(Aspect.FLUX, 8).add(Aspect.ENERGY, 8),-4,-24,0,new ResourceLocation("thaumicbases","textures/thaumonomicon/revolver/TAINTED.png"))
		.setParents("TB.Revolver")
		
		.setSecondary()
		.setPages(
			new ResearchPage("tb.rec.revolver.tai.page.0"),
			new ResearchPage(taintedRec)
			).registerResearchItem();
		
		new ResearchItem("TB.Revolver.Void",catName,new AspectList().add(Aspect.VOID, 8).add(Aspect.METAL, 8),-3,-23,0,new ResourceLocation("thaumicbases","textures/thaumonomicon/revolver/VOID.png"))
		.setParents("TB.Revolver")
		
		.setSecondary()
		.setPages(
			new ResearchPage("tb.rec.revolver.void.page.0"),
			new ResearchPage(voidRec)
			).registerResearchItem();
		
		new ResearchItem("TB.NodeLinker",catName,new AspectList().add(Aspect.MECHANISM, 8).add(Aspect.AURA, 8).add(Aspect.MOTION, 16).add(Aspect.ENERGY, 8),4,-23,3,new ItemStack(TBBlocks.auraLinker))
		.setParents("TB.INFUSION")
		
		.setPages(
			new ResearchPage("tb.rec.nodeLink.page.0"),
			new ResearchPage("tb.rec.nodeLink.page.1"),
			new ResearchPage("tb.rec.nodeLink.page.2"),
			new ResearchPage(nodeLinkRec)
			).registerResearchItem();
		
		new ResearchItem("TB.Campfire",catName,new AspectList().add(Aspect.FIRE, 3).add(Aspect.MIND, 3).add(Aspect.ENTROPY, 3),3,6,1,new ItemStack(TBBlocks.campfire,1,0))
		.setRound()
		.setPages(
			new ResearchPage("tb.rec.campfire.page.0"),
			new ResearchPage(campfireRec)
			).registerResearchItem();
		
		new ResearchItem("TB.Brazier",catName,new AspectList().add(Aspect.FIRE, 3).add(Aspect.MIND, 3).add(Aspect.ENTROPY, 3).add(Aspect.ENERGY, 3).add(Aspect.MOTION, 3),3,8,0,new ItemStack(TBBlocks.braizer,1,0))
		.setParents("TB.Campfire")
		.setSecondary()
		.setPages(
			new ResearchPage("tb.rec.brazier.page.0"),
			new ResearchPage(brazierRec)
			).registerResearchItem();
		
		copy(ResearchCategories.getResearchList("THAUMATURGY").research.get("CAP_gold"),"TB.CAP_gold",catName,-8,-3).setHidden().registerResearchItem();
		copy(ResearchCategories.getResearchList("THAUMATURGY").research.get("ROD_greatwood"),"TB.ROD_greatwood",catName,-11,-3).setHidden().registerResearchItem();
		copy(ResearchCategories.getResearchList("THAUMATURGY").research.get("ROD_silverwood"),"TB.ROD_silverwood",catName,-12,-5).setHidden().registerResearchItem();
		
		copy(ResearchCategories.getResearchList("THAUMATURGY").research.get("PRIMALRODS"),"TB.PRIMALRODS",catName,-14,-2).setHidden().registerResearchItem();
		copy(ResearchCategories.getResearchList("ELDRITCH").research.get("ROD_primal_staff"),"TB.ROD_primal_staff",catName,-19,-6).setHidden().registerResearchItem();
		
		new ResearchItem("TB.Bracelet.Iron",catName,new AspectList().add(Aspect.METAL, 3).add(Aspect.ENERGY, 3),-5,0,0,new ItemStack(TBItems.castingBracelet,1,0))
		.setRound()
		.setPages(
			new ResearchPage("tb.rec.bracelet.iron.page.0"),
			new ResearchPage("tb.rec.bracelet.iron.page.1"),
			new ResearchPage("tb.rec.bracelet.iron.page.2"),
			new ResearchPage(ironBraceletRec)
			).registerResearchItem();
		
		new ResearchItem("TB.Bracelet.Gold",catName,new AspectList().add(Aspect.METAL, 3).add(Aspect.ENERGY, 3).add(Aspect.DESIRE, 3),-8,-1,0,new ItemStack(TBItems.castingBracelet,1,1))
		.setParents("TB.Bracelet.Iron","TB.CAP_gold")
		.setPages(
			new ResearchPage("tb.rec.bracelet.gold.page.0"),
			new ResearchPage(goldBraceletRec)
			).registerResearchItem();
		
		new ResearchItem("TB.Bracelet.Greatwood",catName,new AspectList().add(Aspect.PLANT, 3).add(Aspect.ENERGY, 3).add(Aspect.ENERGY, 3),-11,-1,0,new ItemStack(TBItems.castingBracelet,1,2))
		
		.setParents("TB.Bracelet.Gold","TB.ROD_greatwood")
		.setPages(
			new ResearchPage("tb.rec.bracelet.greatwood.page.0"),
			new ResearchPage(greatwoodBraceletRec)
			).registerResearchItem();
		
		new ResearchItem("TB.Bracelet.Brass",catName,new AspectList().add(Aspect.PLANT, 3).add(Aspect.ENERGY, 3).add(Aspect.ENERGY, 3),-10,-2,0,new ItemStack(TBItems.castingBracelet,1,3))
		
		.setParents("TB.Bracelet.Gold","TB.ROD_greatwood")
		.setPages(
			new ResearchPage("tb.rec.bracelet.brass.page.0"),
			new ResearchPage(brassBraceletRec)
			).registerResearchItem();
		
		new ResearchItem("TB.Bracelet.Thaumium",catName,new AspectList().add(Aspect.METAL, 3).add(Aspect.ENERGY, 3).add(Aspect.ENERGY, 3).add(Aspect.AURA, 3),-11,2,0,new ItemStack(TBItems.castingBracelet,1,4))
		
		.setParents("TB.Bracelet.Greatwood")
		.setPages(
			new ResearchPage("tb.rec.bracelet.thaumium.page.0"),
			new ResearchPage(thaumiumBraceletRec)
			).registerResearchItem();
		
		new ResearchItem("TB.Bracelet.Silverwood",catName,new AspectList().add(Aspect.ORDER, 3).add(Aspect.ENERGY, 3).add(Aspect.PLANT, 3).add(Aspect.AURA, 3).add(Aspect.EXCHANGE, 3),-13,-3,1,new ItemStack(TBItems.castingBracelet,1,5))
		
		.setParents("TB.Bracelet.Greatwood","TB.ROD_silverwood")
		.setPages(
			new ResearchPage("tb.rec.bracelet.silverwood.page.0"),
			new ResearchPage(silverwoodBraceletRec)
			).registerResearchItem();
		
		new ResearchItem("TB.Bracelet.Void",catName,new AspectList().add(Aspect.VOID, 3).add(Aspect.ENERGY, 3).add(Aspect.ELDRITCH, 3).add(Aspect.AURA, 3).add(Aspect.EXCHANGE, 3),-13,0,3,new ItemStack(TBItems.castingBracelet,1,12))
		
		.setParents("TB.Bracelet.Silverwood")
		.setPages(
			new ResearchPage("tb.rec.bracelet.void.page.0"),
			new ResearchPage(voidBraceletRec)
			).registerResearchItem();
		
		new ResearchItem("TB.Bracelet.Reed",catName,new AspectList().add(Aspect.AIR, 3).add(Aspect.ENERGY, 3).add(Aspect.CRAFT, 3).add(Aspect.AURA, 3).add(Aspect.EXCHANGE, 3),-17,-6,2,new ItemStack(TBItems.castingBracelet,1,6))
		
		.setParents("TB.PRIMALRODS")
		.setPages(
			new ResearchPage("tb.rec.bracelet.reed.page.0"),
			new ResearchPage(reedBraceletRec)
			).registerResearchItem();
		
		new ResearchItem("TB.Bracelet.Blaze",catName,new AspectList().add(Aspect.FIRE, 3).add(Aspect.ENERGY, 3).add(Aspect.CRAFT, 3).add(Aspect.AURA, 3).add(Aspect.EXCHANGE, 3),-15,-5,2,new ItemStack(TBItems.castingBracelet,1,9))
		
		.setParents("TB.PRIMALRODS")
		.setPages(
			new ResearchPage("tb.rec.bracelet.blaze.page.0"),
			new ResearchPage(blazeBraceletRec)
			).registerResearchItem();
		
		new ResearchItem("TB.Bracelet.Obsidian",catName,new AspectList().add(Aspect.EARTH, 3).add(Aspect.ENERGY, 3).add(Aspect.CRAFT, 3).add(Aspect.AURA, 3).add(Aspect.EXCHANGE, 3),-17,-4,2,new ItemStack(TBItems.castingBracelet,1,8))
		
		.setParents("TB.PRIMALRODS")
		.setPages(
			new ResearchPage("tb.rec.bracelet.obsidian.page.0"),
			new ResearchPage(obsidianBraceletRec)
			).registerResearchItem();
		
		new ResearchItem("TB.Bracelet.Ice",catName,new AspectList().add(Aspect.WATER, 3).add(Aspect.ENERGY, 3).add(Aspect.CRAFT, 3).add(Aspect.AURA, 3).add(Aspect.EXCHANGE, 3),-16,-2,2,new ItemStack(TBItems.castingBracelet,1,10))
		
		.setParents("TB.PRIMALRODS")
		.setPages(
			new ResearchPage("tb.rec.bracelet.ice.page.0"),
			new ResearchPage(iceBraceletRec)
			).registerResearchItem();
		
		new ResearchItem("TB.Bracelet.Quartz",catName,new AspectList().add(Aspect.ORDER, 3).add(Aspect.ENERGY, 3).add(Aspect.CRAFT, 3).add(Aspect.AURA, 3).add(Aspect.EXCHANGE, 3),-18,-1,2,new ItemStack(TBItems.castingBracelet,1,11))
		
		.setParents("TB.PRIMALRODS")
		.setPages(
			new ResearchPage("tb.rec.bracelet.quartz.page.0"),
			new ResearchPage(quartzBraceletRec)
			).registerResearchItem();
		
		new ResearchItem("TB.Bracelet.Bone",catName,new AspectList().add(Aspect.ENTROPY, 3).add(Aspect.ENERGY, 3).add(Aspect.CRAFT, 3).add(Aspect.AURA, 3).add(Aspect.EXCHANGE, 3),-16,0,2,new ItemStack(TBItems.castingBracelet,1,7))
		
		.setParents("TB.PRIMALRODS")
		.setPages(
			new ResearchPage("tb.rec.bracelet.bone.page.0"),
			new ResearchPage(boneBraceletRec)
			).registerResearchItem();
		
		new ResearchItem("TB.Bracelet.Primal",catName,primals(6).add(Aspect.ENERGY, 12).add(Aspect.ELDRITCH, 12),-19,-4,4,new ItemStack(TBItems.castingBracelet,1,13))
		
		.setSpecial()
		.setParents(
			"TB.ROD_primal_staff",
			"TB.Bracelet.Bone",
			"TB.Bracelet.Quartz",
			"TB.Bracelet.Ice",
			"TB.Bracelet.Obsidian",
			"TB.Bracelet.Blaze",
			"TB.Bracelet.Reed",
			"TB.Bracelet.Silverwood"
		)
		.setPages(
			new ResearchPage("tb.rec.bracelet.primal.page.0"),
			new ResearchPage(primalBraceletRec)
			).registerResearchItem();
		
		copy(ResearchCategories.getResearchList("ELDRITCH").research.get("SINSTONE"),"TB.SINSTONE",catName,-7,-13).setHidden().registerResearchItem();
		
		new ResearchItem("TB.SpawnerCompass",catName,new AspectList().add(Aspect.UNDEAD, 3).add(Aspect.DEATH, 3).add(Aspect.MOTION, 3).add(Aspect.SENSES, 3),-9,-13,2,new ItemStack(TBItems.spawnerCompass,1,0))
		
		.setParents("TB.SINSTONE")
		.setPages(
			new ResearchPage("tb.rec.sc.page.0"),
			new ResearchPage(spawnerCompassRec)
			).registerResearchItem();
		
		new ResearchItem("TB.Ukulele",catName,new AspectList().add(Aspect.AURA, 3).add(Aspect.PLANT, 3).add(Aspect.VOID, 3).add(Aspect.SENSES, 3),-12,-14,0,new ResourceLocation("thaumicbases","textures/thaumonomicon/ukulele/base.png"))
		
		.setParents("TB.ARCANEEAR")
		.setPages(
			new ResearchPage("tb.rec.ukulele.base.page.0"),
			new ResearchPage("tb.rec.ukulele.base.page.1"),
			new ResearchPage(ukuleleRec)
			).registerResearchItem();
		
		new ResearchItem("TB.Ukulele.Knowledge",catName,new AspectList().add(Aspect.MIND, 3).add(Aspect.AURA, 3).add(Aspect.EXCHANGE, 3),-10,-12,0,new ResourceLocation("thaumicbases","textures/thaumonomicon/ukulele/knowledge.png"))
		.setSecondary()
		.setParents("TB.Ukulele")
		.setPages(
			new ResearchPage("tb.rec.ukulele.knowledge.page.0"),
			new ResearchPage(knowledgeUkuleleRec)
			).registerResearchItem();
		
		new ResearchItem("TB.Ukulele.Sanity",catName,new AspectList().add(Aspect.AURA, 3).add(Aspect.LIFE, 3).add(Aspect.MIND, 3),-15,-15,0,new ResourceLocation("thaumicbases","textures/thaumonomicon/ukulele/calming.png"))
		.setSecondary()
		.setParents("TB.Ukulele")
		.setPages(
			new ResearchPage("tb.rec.ukulele.sanity.page.0"),
			new ResearchPage(sanityUkuleleRec)
			).registerResearchItem();
		
		new ResearchItem("TB.Ukulele.Electric",catName,new AspectList().add(Aspect.ENERGY, 3).add(Aspect.AVERSION, 3).add(Aspect.FIRE, 3),-15,-13,0,new ResourceLocation("thaumicbases","textures/thaumonomicon/ukulele/electric.png"))
		.setSecondary()
		.setParents("TB.Ukulele")
		.setPages(
			new ResearchPage("tb.rec.ukulele.electric.page.0"),
			new ResearchPage(electricUkuleleRec)
			).registerResearchItem();
		
		new ResearchItem("TB.Ukulele.Resistance",catName,new AspectList().add(Aspect.PROTECT, 3).add(Aspect.EARTH, 3).add(Aspect.METAL, 3),-14,-12,0,new ResourceLocation("thaumicbases","textures/thaumonomicon/ukulele/resistance.png"))
		.setSecondary()
		.setParents("TB.Ukulele")
		.setPages(
			new ResearchPage("tb.rec.ukulele.resistance.page.0"),
			new ResearchPage(resistanceUkuleleRec)
			).registerResearchItem();
		
		new ResearchItem("TB.Ukulele.Buffs",catName,new AspectList().add(Aspect.AURA, 3).add(Aspect.MAN, 3).add(Aspect.BEAST, 3),-14,-16,0,new ResourceLocation("thaumicbases","textures/thaumonomicon/ukulele/buffing.png"))
		.setSecondary()
		.setParents("TB.Ukulele")
		.setPages(
			new ResearchPage("tb.rec.ukulele.buffing.page.0"),
			new ResearchPage(buffingUkuleleRec)
			).registerResearchItem();
		
		new ResearchItem("TB.Ukulele.Confusion",catName,new AspectList().add(Aspect.ENTROPY, 3).add(Aspect.DEATH, 3).add(Aspect.MIND, 3),-13,-17,0,new ResourceLocation("thaumicbases","textures/thaumonomicon/ukulele/confusing.png"))
		.setSecondary()
		.setParents("TB.Ukulele")
		.setPages(
			new ResearchPage("tb.rec.ukulele.confusion.page.0"),
			new ResearchPage(confusionUkuleleRec)
			).registerResearchItem();
		
		new ResearchItem("TB.Ukulele.Growth",catName,new AspectList().add(Aspect.PLANT, 3).add(Aspect.LIFE, 3).add(Aspect.PLANT, 3),-13,-11,0,new ResourceLocation("thaumicbases","textures/thaumonomicon/ukulele/growth.png"))
		.setSecondary()
		.setParents("TB.Ukulele")
		.setPages(
			new ResearchPage("tb.rec.ukulele.growth.page.0"),
			new ResearchPage(growthUkuleleRec)
			).registerResearchItem();
		
		new ResearchItem("TB.Ukulele.Love",catName,new AspectList().add(Aspect.LIFE, 3).add(Aspect.BEAST, 3).add(Aspect.BEAST, 3),-16,-14,0,new ResourceLocation("thaumicbases","textures/thaumonomicon/ukulele/love.png"))
		.setSecondary()
		.setParents("TB.Ukulele")
		.setPages(
			new ResearchPage("tb.rec.ukulele.live.page.0"),
			new ResearchPage(loveUkuleleRec)
			).registerResearchItem();
		
		//TODO last recipes
		//-4,-14
		
		ResearchCategories.getResearch("TB.CRUCIBLE").setSiblings("TB.BasicPlants");
		
		ThaumcraftApi.addWarpToResearch("TB.HerobrinesScythe", 4);
		ThaumcraftApi.addWarpToResearch("TB.Tainted", 3);
		ThaumcraftApi.addWarpToResearch("TB.Aurelia", 2);
		ThaumcraftApi.addWarpToResearch("TB.Flaxium", 2);
		ThaumcraftApi.addWarpToResearch("TB.Lucrite", 1);
		ThaumcraftApi.addWarpToResearch("TB.Tobacco.Eldritch", 2);
		ThaumcraftApi.addWarpToResearch("TB.Tobacco.Tainted", 3);
		ThaumcraftApi.addWarpToResearch("TB.BloodyRobes", 2);
		ThaumcraftApi.addWarpToResearch("TB.TaintMinor", 4);
		ThaumcraftApi.addWarpToResearch("TB.CryingObs", 1);
		ThaumcraftApi.addWarpToResearch("TB.EntityDec", 2);
		ThaumcraftApi.addWarpToResearch("TB.NodeMan", 1);
		ThaumcraftApi.addWarpToResearch("TB.NodeFoci.Destr", 2);
		ThaumcraftApi.addWarpToResearch("TB.NodeFoci.Taint", 3);
		ThaumcraftApi.addWarpToResearch("TB.VoidAnvil", 2);
		ThaumcraftApi.addWarpToResearch("TB.Revolver.Eldritch", 2);
		ThaumcraftApi.addWarpToResearch("TB.Revolver.Primal", 4);
		ThaumcraftApi.addWarpToResearch("TB.Revolver.Tainted", 3);
		ThaumcraftApi.addWarpToResearch("TB.Revolver.Void", 2);
		ThaumcraftApi.addWarpToResearch("TB.Bracelet.Void", 2);
		ThaumcraftApi.addWarpToResearch("TB.Bracelet.Bone", 1);
		ThaumcraftApi.addWarpToResearch("TB.Bracelet.Primal", 4);
		

		add(wool3Rec);
		add(sandstone3Rec);
		add(blaze3Rec);
		add(wool4Rec);
		add(sandstone4Rec);
		add(blaze4Rec);
		add(glassSand);
		add(gravelSand);
		add(barsIron);
		add(arrows);
		add(snowball);
		add(redstone);
		add(amber);
		
		add(cinnabar);
		add(salisMundis);
		add(gravel2Cobble);
		add(icePacking);
		add(blazepowderRest);
		add(boneRest);
		add(sugarRest);
		add(cactiRest);
		
		add(salisMundusBlockRec);
		
		add(thauminiteRec);
		
		add(thauminiteCaps);
		
		add(pyrofluidRec);
		add(aureliaRec);
		
		add(thaumicWandCore);
		add(voidRodRecipe);
		add(plaxRec);
		add(metalleatRec);
		add(lucriteRec);
		add(knoseRec);
		add(knowledgeFragmentRec);
		add(sweedRec);
		add(lazulliaRec);
		add(rainbowCactiRec);
		add(redlonRec);
		add(aspectShroomRec);
		add(flaxiumRec);
		add(glieoniaRec);
		add(briarRec);
		add(rosehipRec);
		
		
		if(TBConfig.allowTobacco)
		{
			
			ShapelessArcaneRecipe saturatingTobaccoRec = new ShapelessArcaneRecipe("TB.Tobacco.Saturating",new ItemStack(TBItems.tobacco,1,3),new AspectList().add(Aspect.EARTH, 10).add(Aspect.FIRE, 10).add(Aspect.WATER, 10),new Object[]{new ItemStack(TBItems.tobacco,1,0),new ItemStack(Items.pumpkin_seeds)});
			ShapelessArcaneRecipe saturatingTobaccoRecM = new ShapelessArcaneRecipe("TB.Tobacco.Saturating",new ItemStack(TBItems.tobacco,1,3),new AspectList().add(Aspect.EARTH, 10).add(Aspect.FIRE, 10).add(Aspect.WATER, 10),new Object[]{new ItemStack(TBItems.tobacco,1,0),new ItemStack(Items.melon_seeds)});
			InfusionRecipe silverwoodPipeRec = new InfusionRecipe("TB.SilverwoodPipe",new ItemStack(TBItems.silverwoodPipe,1,0),4,new AspectList().add(Aspect.AURA, 8).add(Aspect.ORDER, 32).add(Aspect.LIFE, 16),new ItemStack(TBItems.greatwoodPipe,1,0),new ItemStack[]{
				new ItemStack(ItemsTC.salisMundus),
				new ItemStack(ItemsTC.salisMundus),
				new ItemStack(ItemsTC.salisMundus),
				new ItemStack(BlocksTC.plank,1,1),
				new ItemStack(BlocksTC.plank,1,1),
				new ItemStack(BlocksTC.plank,1,1),
				new ItemStack(BlocksTC.plank,1,1),
				new ItemStack(BlocksTC.shimmerleaf)
			});
			InfusionRecipe eldritchTobacoRec = new InfusionRecipe("TB.Tobacco.Eldritch",new ItemStack(TBItems.tobacco,1,1),1,new AspectList().add(Aspect.ELDRITCH, 4).add(Aspect.DEATH, 1),new ItemStack(TBItems.tobacco,1,0),new ItemStack[]{
				new ItemStack(Items.ender_eye,1,0),
				new ItemStack(Items.arrow,1,0)
			});
			
			InfusionRecipe wispyTobaccoRec = new InfusionRecipe("TB.Tobacco.Wispy",new ItemStack(TBItems.tobacco,1,8),1,new AspectList().add(Aspect.AURA, 4).add(Aspect.ENERGY, 6),new ItemStack(TBItems.tobacco,1,0),new ItemStack[]{
				new ItemStack(ItemsTC.salisMundus),
				new ItemStack(ItemsTC.wispyEssence,1,0)
			});
			ShapelessArcaneRecipe pestleRecipe = new ShapelessArcaneRecipe("TB.Tobacco",new ItemStack(TBItems.mortar),new AspectList().add(primals(4)),new Object[]{
				new ItemStack(Items.bowl),
				new ItemStack(Items.stick),
				new ItemStack(Blocks.wooden_slab),
				new ItemStack(Blocks.wooden_slab),
				new ItemStack(Blocks.wooden_slab)
			});
			ShapedArcaneRecipe pipeRecipe = new ShapedArcaneRecipe("TB.Tobacco",new ItemStack(TBItems.greatwoodPipe),new AspectList().add(primals(4)),new Object[]{
				"#@ ",
				" ##",
				'#',new ItemStack(BlocksTC.plank,1,0),
				'@',new ItemStack(ItemsTC.salisMundus)
			});
			ShapelessArcaneRecipe genTobaccoRec = new ShapelessArcaneRecipe("TB.Tobacco",new ItemStack(TBItems.tobacco,1,0),new AspectList().add(Aspect.ORDER, 1).add(Aspect.ENTROPY, 1), new Object[]{
				"pestleAndMortar",
				new ItemStack(TBItems.resource,1,7)
			});
			CrucibleRecipe tobaccoSeedRec = new CrucibleRecipe(new String[]{"TB.Tobacco"},new ItemStack(TBItems.tobaccoSeeds,1,0),new ItemStack(Items.wheat_seeds,1,0),new AspectList().add(Aspect.MIND, 4).add(Aspect.WATER, 4).add(Aspect.MAN, 4).add(Aspect.CRAFT, 4));
			CrucibleRecipe angryTobaccoRec = new CrucibleRecipe(new String[]{"TB.Tobacco.Angry"},new ItemStack(TBItems.tobacco,1,2),new ItemStack(TBItems.tobacco,1,0),new AspectList().add(Aspect.AVERSION, 4).add(Aspect.DEATH, 4));
			CrucibleRecipe miningTobaccoRec = new CrucibleRecipe(new String[]{"TB.Tobacco.Mining"},new ItemStack(TBItems.tobacco,1,5),new ItemStack(TBItems.tobacco,1,0),new AspectList().add(Aspect.ENTROPY, 4).add(Aspect.MOTION, 4));
			CrucibleRecipe wisdomTobaccoRec = new CrucibleRecipe(new String[]{"TB.Tobacco.Wisdom"},new ItemStack(TBItems.tobacco,1,4),new ItemStack(TBItems.tobacco,1,0),new AspectList().add(Aspect.MIND, 4).add(Aspect.AIR, 4));
			CrucibleRecipe taintTobaccoRec = new CrucibleRecipe(new String[]{"TB.Tobacco.Tainted"},new ItemStack(TBItems.tobacco,1,7),new ItemStack(TBItems.tobacco,1,0),new AspectList().add(Aspect.FLUX, 4).add(Aspect.MIND, 4));
			ShapelessArcaneRecipe sanityTobaccoRec = new ShapelessArcaneRecipe("TB.Tobacco.Sanity",new ItemStack(TBItems.tobacco,1,6),new AspectList().add(Aspect.ORDER, 10).add(Aspect.AIR, 10).add(Aspect.ENTROPY, 10),new Object[]{new ItemStack(TBItems.tobacco,1,0)});
			
			new ResearchItem("TB.Tobacco",catName,new AspectList().add(Aspect.PLANT, 4).add(Aspect.CRAFT, 4).add(Aspect.MAN, 4).add(Aspect.MIND, 4),1,-13,3,new ItemStack(TBItems.greatwoodPipe,1,0))
			.setParents("TB.Plax")
			
			.setPages(
				new ResearchPage("tb.rec.tobacco.page.0"),
				new ResearchPage(tobaccoSeedRec),
				new ResearchPage("tb.rec.tobacco.page.1"),
				new ResearchPage(pipeRecipe),
				new ResearchPage(pestleRecipe),
				new ResearchPage(genTobaccoRec),
				new ResearchPage("tb.rec.tobacco.page.2")
				).registerResearchItem();
			
			new ResearchItem("TB.Tobacco.Eldritch",catName,new AspectList().add(Aspect.DEATH, 4).add(Aspect.ELDRITCH, 4),1,-15,0,new ItemStack(TBItems.tobacco,1,1))
			.setParents("TB.Tobacco","TB.INFUSION")
			
			.setSecondary()
			.setPages(
				new ResearchPage("tb.rec.etobacco.page.0"),
				new ResearchPage(eldritchTobacoRec)
				).registerResearchItem();
			
			new ResearchItem("TB.Tobacco.Wispy",catName,new AspectList().add(Aspect.AURA, 4).add(Aspect.ENERGY, 4),2,-15,0,new ItemStack(TBItems.tobacco,1,8))
			.setParents("TB.Tobacco","TB.INFUSION")
			
			.setSecondary()
			.setPages(
				new ResearchPage("tb.rec.wtobacco.page.0"),
				new ResearchPage(wispyTobaccoRec)
				).registerResearchItem();
			
			new ResearchItem("TB.Tobacco.Angry",catName,new AspectList().add(Aspect.AVERSION, 4).add(Aspect.DEATH, 4),6,-14,0,new ItemStack(TBItems.tobacco,1,2))
			.setParents("TB.Tobacco")
			
			.setSecondary()
			.setPages(
				new ResearchPage("tb.rec.atobacco.page.0"),
				new ResearchPage(angryTobaccoRec)
				).registerResearchItem();
			
			new ResearchItem("TB.Tobacco.Mining",catName,new AspectList().add(Aspect.ENTROPY, 4).add(Aspect.MOTION, 4),6,-12,0,new ItemStack(TBItems.tobacco,1,5))
			.setParents("TB.Tobacco")
			
			.setSecondary()
			.setPages(
				new ResearchPage("tb.rec.mtobacco.page.0"),
				new ResearchPage(miningTobaccoRec)
				).registerResearchItem();
			
			new ResearchItem("TB.Tobacco.Wisdom",catName,new AspectList().add(Aspect.MIND, 4).add(Aspect.AIR, 4),7,-15,0,new ItemStack(TBItems.tobacco,1,4))
			.setParents("TB.Tobacco")
			
			.setSecondary()
			.setPages(
				new ResearchPage("tb.rec.witobacco.page.0"),
				new ResearchPage(wisdomTobaccoRec)
				).registerResearchItem();
			
			new ResearchItem("TB.Tobacco.Tainted",catName,new AspectList().add(Aspect.MIND, 4).add(Aspect.FLUX, 4),7,-11,0,new ItemStack(TBItems.tobacco,1,7))
			.setParents("TB.Tobacco")
			
			.setSecondary()
			.setPages(
				new ResearchPage("tb.rec.ttobacco.page.0"),
				new ResearchPage(taintTobaccoRec)
				).registerResearchItem();
			
			new ResearchItem("TB.Tobacco.Saturating",catName,new AspectList().add(Aspect.BEAST, 4).add(Aspect.DEATH, 4),8,-14,0,new ItemStack(TBItems.tobacco,1,3))
			.setParents("TB.Tobacco")
			
			.setSecondary()
			.setPages(
				new ResearchPage("tb.rec.stobacco.page.0"),
				new ResearchPage(new ShapelessArcaneRecipe[]{saturatingTobaccoRec,saturatingTobaccoRecM})
				).registerResearchItem();
			
			new ResearchItem("TB.Tobacco.Sanity",catName,new AspectList().add(Aspect.ORDER, 4).add(Aspect.MIND, 4),8,-12,0,new ItemStack(TBItems.tobacco,1,6))
			.setParents("TB.Tobacco")
			
			.setSecondary()
			.setPages(
				new ResearchPage("tb.rec.satobacco.page.0"),
				new ResearchPage(sanityTobaccoRec)
				).registerResearchItem();
			
			new ResearchItem("TB.SilverwoodPipe",catName,new AspectList().add(Aspect.ORDER, 8).add(Aspect.BEAST, 8).add(Aspect.AURA, 8),5,-17,1,new ItemStack(TBItems.silverwoodPipe,1,0))
			.setParents("TB.Tobacco","TB.INFUSION")
			
			.setPages(
				new ResearchPage("tb.rec.silverPipe.page.0"),
				new ResearchPage(silverwoodPipeRec)
				).registerResearchItem();
			
			add(tobaccoSeedRec);
			add(pestleRecipe);
			add(pipeRecipe);
			add(genTobaccoRec);
			add(eldritchTobacoRec);
			add(wispyTobaccoRec);
			add(angryTobaccoRec);
			add(miningTobaccoRec);
			add(wisdomTobaccoRec);
			add(taintTobaccoRec);
			add(saturatingTobaccoRec);
			add(saturatingTobaccoRecM);
			add(sanityTobaccoRec);
			add(silverwoodPipeRec);
		}
		add(voidSeedRec);
		add(ironSpikeRec);
		add(thaumiumSpikeRec);
		add(voidSpikeRec);
		add(cleanEFabricRec);
		add(bloodyChestRec);
		add(bloodyLegsRec);
		add(bloodyBootsRec);
		add(cryingObsidianRec);
		add(overchanterRec);
		add(goldenOakRec);
		add(nodeManipulatorRec);
		
		add(brightFociRec);
		add(destructionFociRec);
		add(efficiencyFociRec);
		add(hungerFociRec);
		add(unstableFociRec);
		add(pureFociRec);
		add(sinisterFociRec);
		add(speedFociRec);
		add(stabilityFociRec);
		add(taintFociRec);
		add(herobrinesScytheRec);
		add(thaumicAnvilRec);
		add(voidAnvilRec);
		add(peacefulSaplingRec);
		add(netherSaplingRec);
		add(enderSaplingRec);
		
		CraftingManager.getInstance().getRecipeList().add(voidShearsRec);
		CraftingManager.getInstance().getRecipeList().add(voidFlint);
		
		add(revolverRec);
		add(accuracyRec);
		add(atropodsRec);
		add(eldritchBRec);
		add(duelingRec);
		add(efficiencyRec);
		add(eldritchRec);
		add(heavyRec);
		add(knowledgeRec);
		add(piercingRec);
		add(powerRec);
		add(primalRec);
		add(silverRec);
		add(speedRec);
		add(taintedRec);
		add(voidRec);
		
		add(nodeLinkRec);
		add(campfireRec);
		add(brazierRec);
		
		add(ironBraceletRec);
		add(goldBraceletRec);
		add(greatwoodBraceletRec);
		add(thaumiumBraceletRec);
		add(silverwoodBraceletRec);
		add(voidBraceletRec);
		add(reedBraceletRec);
		add(boneBraceletRec);
		add(obsidianBraceletRec);
		add(blazeBraceletRec);
		add(iceBraceletRec);
		add(quartzBraceletRec);
		add(primalBraceletRec);
		
		add(spawnerCompassRec);
		
		
		add(ukuleleRec);
		add(knowledgeUkuleleRec);
		add(sanityUkuleleRec);
		add(electricUkuleleRec);
		add(resistanceUkuleleRec);
		add(buffingUkuleleRec);
		add(confusionUkuleleRec);
		add(growthUkuleleRec);
		add(loveUkuleleRec);
		
		//TODO actual recipes
		
		for(int i = 0; i < oldRec.length; ++i)
			add(oldRec[i]);
		
		for(int i = 0; i < 10; ++i)
			add(toolsRec[i]);

		for(int i = 0; i < cBlocks.length; ++i)
			add(cBlocks[i]);
		
		for(int i = 0; i < clusters.length; ++i)
			add(clusters[i]);
	}
	
	@SuppressWarnings("unchecked")
	public static void add(Object rec)
	{
		if(rec instanceof IRecipe)
		{
			if(rec instanceof ShapedArcaneRecipe || rec instanceof ShapelessArcaneRecipe)
				CraftingManager.getInstance().addRecipe((IRecipe) rec);
		}
		ThaumcraftApi.getCraftingRecipes().add(rec);
	}
	
	public static Aspect getPrimalForLoop(int loopInt)
	{
		switch(loopInt)
		{
			case 0:
				return Aspect.AIR;
			case 1:
				return Aspect.FIRE;
			case 2:
				return Aspect.WATER;
			case 3:
				return Aspect.EARTH;
			case 4:
				return Aspect.ORDER;
			case 5:
				return Aspect.ENTROPY;
			default:
				return Aspect.AIR;
		}
	}
	
	public static AspectList primals(int amount)
	{
		return new AspectList().add(Aspect.AIR, amount).add(Aspect.WATER, amount).add(Aspect.EARTH, amount).add(Aspect.FIRE, amount).add(Aspect.ORDER, amount).add(Aspect.ENTROPY, amount);
	}
	
	public static ResearchItem copy(ResearchItem res, String newKey, String newCat, int dC, int dR)
	{
		ResearchItem rItem;
		
		if(res.icon_resource != null)
			rItem = new ResearchItem(newKey,newCat,res.tags,dC,dR,res.getComplexity(),Object[].class.cast(res.icon_resource));
		else
			rItem = new ResearchItem(newKey,newCat,res.tags,dC,dR,res.getComplexity(),Object[].class.cast(res.icon_item));
		
		rItem.parents = res.parents;
		rItem.parentsHidden = res.parentsHidden;
		rItem.siblings = res.siblings;
		rItem.setPages(res.getPages());
		
		rItem.setHidden();
		
		if(res.isAutoUnlock())
			rItem.setAutoUnlock();
		
		if(res.isFlipped())
			rItem.setFlipped();
		
		if(res.isHidden())
			rItem.setHidden();
		
		if(res.isRound())
			rItem.setRound();
		
		if(res.isSecondary())
			rItem.setSecondary();
		
		if(res.isSpecial())
			rItem.setSpecial();
		
		if(res.isStub())
			rItem.setStub();
		
		if(res.siblings != null && res.siblings.length > 0)
		{
			String[] sibStr = new String[res.siblings.length+1];
			for(int i = 0; i < res.siblings.length; ++i)
				sibStr[i] = res.siblings[i];
			
			sibStr[sibStr.length - 1] = newKey;
			
			res.setSiblings(sibStr);
		}else
		{
			res.setSiblings(newKey);
		}
		
		if(rItem.siblings != null && rItem.siblings.length > 0)
		{
			String[] sibStr = new String[rItem.siblings.length+1];
			for(int i = 0; i < rItem.siblings.length; ++i)
				sibStr[i] = rItem.siblings[i];
			
			sibStr[sibStr.length - 1] = res.key;
			
			rItem.setSiblings(sibStr);
		}else
		{
			rItem.setSiblings(res.key);
		}
		
		return rItem;
	}
	
	public static final String catName = "THAUMICBASES";
	public static final ResourceLocation icon = new ResourceLocation("thaumicbases","textures/thaumonomicon/bases.png");
	public static final ResourceLocation back = new ResourceLocation("thaumicbases","textures/thaumonomicon/background.png");
	public static final ResourceLocation back2 = new ResourceLocation("thaumcraft","textures/gui/gui_research_back_over.png");
} public class TBTiles {

	public static void setup()
	{
		GameRegistry.registerTileEntity(TileOverchanter.class, "tb.overchanter");
		GameRegistry.registerTileEntity(TileCampfire.class, "tb.campfire");
		GameRegistry.registerTileEntity(TileBraizer.class, "tb.brazier");
		GameRegistry.registerTileEntity(TileAuraLinker.class, "tb.auraLinker");
		GameRegistry.registerTileEntity(TileNodeManipulator.class, "tb.nodeManipulator");
	}
} public class PacketTB implements IMessage{

	int id;
	NBTTagCompound sent;
	
	public PacketTB()
	{
		//FML registry
	}
	
	public PacketTB(NBTTagCompound tag, int i)
	{
		id = i;
		sent = tag;
	}
	
	@Override
	public void fromBytes(ByteBuf buf) {
		id = ByteBufUtils.readVarInt(buf, 1);
		sent = ByteBufUtils.readTag(buf);
	}

	@Override
	public void toBytes(ByteBuf buf) {
		ByteBufUtils.writeVarInt(buf, id, 1);
		ByteBufUtils.writeTag(buf, sent);
	}

} @ChannelHandler.Sharable
public class TBNetworkManager implements IMessageHandler<PacketTB,IMessage>
{

	@Override
	public IMessage onMessage(PacketTB message, MessageContext ctx)
	{
		if(message.id == 0)
		{
			NBTTagCompound tag = message.sent;
			World w = TBCore.proxy.clientWorld();
			w.playSound(tag.getDouble("x"), tag.getDouble("y"), tag.getDouble("z"), tag.getString("snd"), tag.getFloat("v"), tag.getFloat("p"), false);
		}
		return null;
	}
	
	public static void playSoundOnServer(World w, String sound, double x, double y, double z, float volume, float pitch)
	{
		NBTTagCompound tg = new NBTTagCompound();
		tg.setString("snd", sound);
		tg.setDouble("x", x);
		tg.setDouble("y", y);
		tg.setDouble("z", z);
		tg.setFloat("v", volume);
		tg.setFloat("p", pitch);
		TBCore.network.sendToAllAround(new PacketTB(tg,0), new TargetPoint(w.provider.getDimensionId(),x,y,z,32));
	}

} public class TBServer implements IGuiHandler{

	public void playGuitarSound(String sound)
	{
		
	}
	
	@Override
	public Object getServerGuiElement(int ID, EntityPlayer player, World world,	int x, int y, int z) {
		
		if(ID == 0x421922)
		{
			TileEntity tile = world.getTileEntity(new BlockPos(x, y, z));
			
			if(tile != null)
			{
				if(tile instanceof TileOverchanter)
				{
					return new ContainerOverchanter(player.inventory,tile);
				}
			}
		}else
		{
			if(ID == 0x421921)
				return new ContainerThaumicAnvil(player.inventory, world, new BlockPos(x, y, z), player);
			
			
			if(ID == 0x421920)
				return new ContainerVoidAnvil(player.inventory, world, new BlockPos(x, y, z), player);
			
			if(ID == 0x421919)
				return new ContainerRevolver(player.inventory, world, x, y, z);
		}
		
		return null;
	}

	@Override
	public Object getClientGuiElement(int ID, EntityPlayer player, World world,	int x, int y, int z) {
		return null;
	}
	
	public void registerRenderInformation()
	{
		
	}
	
	public void lightning(World world, double sx, double sy, double sz, double ex, double ey, double ez, int dur, float curve, int speed, int type)
	{
		
	}
	
	public void sparkle(World w, double x, double y, double z, double dx, double dy, double dz, int color, float scale)
	{
		
	}
	
	public World clientWorld()
	{
		return null;
	}

} public class RecipesFragmentAdditions implements IRecipe{

	public static final Random rnd = new Random();
	
	public boolean isRNCompleted(ItemStack rn)
	{
		return false;
	}
	
	@Override
	public boolean matches(InventoryCrafting ic, World worldIn) {
        ItemStack itemstack = null;
        ArrayList<ItemStack> arraylist = Lists.newArrayList();
        
        for (int i = 0; i < ic.getSizeInventory(); ++i)
        {
            ItemStack itemstack1 = ic.getStackInSlot(i);

            if (itemstack1 != null)
            {
            	if(itemstack1.getItem() instanceof ItemResearchNotes)
            	{
            		if(itemstack != null || isRNCompleted(itemstack1))
            			return false;
            		
            		itemstack = itemstack1;
            	}else
            	{
            		if(!(itemstack1.getItem() instanceof ItemKnoseFragment))
            			return false;
            		
            		arraylist.add(itemstack1);
            	}
            }
        }
        
        return itemstack != null && !arraylist.isEmpty();
	}

	@Override
	public ItemStack getCraftingResult(InventoryCrafting ic) {
		ItemStack rn = null;
		ArrayList<ItemStack> fragments = Lists.newArrayList();
		
        for (int i = 0; i < ic.getSizeInventory(); ++i)
        {
            ItemStack itemstack1 = ic.getStackInSlot(i);

            if (itemstack1 != null)
            {
            	if(itemstack1.getItem() instanceof ItemResearchNotes)
            	{
            		if(isRNCompleted(itemstack1))
            			return null;
            		rn = itemstack1;
            	}else
            	{
            		if(!(itemstack1.getItem() instanceof ItemKnoseFragment))
            			return null;
            		
            		fragments.add(itemstack1);
            	}
            }
        }
        
        if(rn == null)
        	return null;
        
        if(fragments.isEmpty())
        	return null;
        
        ItemStack arn = rn.copy();
        
        NBTTagCompound mTag = MiscUtils.getStackTag(arn);
        if(!mTag.hasKey("aspects"))
        	return null;
        
        NBTTagList aspects = mTag.getTagList("aspects", 10);
        AspectList al = new AspectList();
        for(ItemStack stk : fragments)
        {
        	int meta = stk.getMetadata();
        	AspectList added = null;
        	if(meta < 7)
        		added = ItemKnoseFragment.addedAspects[meta];
        	else
        	{
        		added = new AspectList();
	    		for(Aspect a : Aspect.getCompoundAspects())
	    		{
	    			if(rnd.nextBoolean())
	    				added.add(a, 1);
    				if(rnd.nextInt(24) == 0)
    					break;
	    		}
        	}
        	al.add(added);
        }
		
        for(int i = 0; i < al.size(); ++i)
        {
        	Aspect added = al.getAspects()[i];
        	if(added == null)
        		continue;
        	int a = al.getAmount(added);
        	String key = added.getTag();
        	NBTTagCompound tag = null;
        	boolean found = false;
        	for(int j = 0; j < aspects.tagCount(); ++j)
        	{
        		NBTTagCompound temp = aspects.getCompoundTagAt(j);
        		if(temp.hasKey("key")&&temp.getString("key").equalsIgnoreCase(key))
        		{
        			tag = temp;
        			found = true;
        		}
        	}
        	if(!found || tag == null)
        	{
        		tag = new NBTTagCompound();
        		tag.setString("key", key);
        		tag.setInteger("amount", 0);
        	}
        	
        	tag.setInteger("amount", tag.getInteger("amount")+a);
        	if(!found)
        		aspects.appendTag(tag);
        }
        
        mTag.setTag("aspects", aspects);
        arn.setTagCompound(mTag);
        
		return arn;
	}

	@Override
	public int getRecipeSize() {
		return 10;
	}

	@Override
	public ItemStack getRecipeOutput() {
		return null;
	}

	@Override
	public ItemStack[] getRemainingItems(InventoryCrafting ic) {
		
        ItemStack[] aitemstack = new ItemStack[ic.getSizeInventory()];

        for (int i = 0; i < aitemstack.length; ++i)
        {
            ItemStack itemstack = ic.getStackInSlot(i);
            aitemstack[i] = net.minecraftforge.common.ForgeHooks.getContainerItem(itemstack);
        }

        return aitemstack;
	}

} public class TBConfig implements IDummyConfig{

	@Override
	public void load(Configuration config) {
		cfg = config;
		Enchantment[] eArray = MiscUtils.enchantmentList();
		elderKnowledgeID = cfg.getInt("elderKnowledgeEnchantmentID", "Enchantments", 98, 0, eArray.length, "");
		eldritchBaneID = cfg.getInt("eldritchBaneEnchantmentID", "Enchantments", 99, 0, eArray.length, "");
		magicTouchID = cfg.getInt("magicTouchEnchantmentID", "Enchantments", 100, 0, eArray.length, "");
		taintedID = cfg.getInt("taintedEnchantmentID", "Enchantments", 101, 0, eArray.length, "");
		vaporisingID = cfg.getInt("vaporisingEnchantmentID", "Enchantments", 102, 0, eArray.length, "");
	
		aquaticFociUID = cfg.getInt("aquaticFociUID", "Foci", 42, 0, Integer.MAX_VALUE, "");
		nethericFociUID = cfg.getInt("nethericFociUID", "Foci", 43, 0, Integer.MAX_VALUE, "");
		decomposingFociUID = cfg.getInt("decomposingFociUID", "Foci", 44, 0, Integer.MAX_VALUE, "");
		vaporisingFociUID = cfg.getInt("vaporisingFociUID", "Foci", 45, 0, Integer.MAX_VALUE, "");
		calmingFociUID = cfg.getInt("calmingFociUID", "Foci", 46, 0, Integer.MAX_VALUE, "");
		crystalizationFociUID = cfg.getInt("crystalizationFociUID", "Foci", 47, 0, Integer.MAX_VALUE, "");
		warpingFociUID = cfg.getInt("warpingFociUID", "Foci", 48, 0, Integer.MAX_VALUE, "");
		
		allowTobacco = cfg.getBoolean("allowTobacco", "General", true, "If set to falso the tobacco will be disabled - there will be no recipes/no entries in Thaumonomicon");
		minBlazePowderFromPyrofluid = cfg.getInt("minBlazePowderFromPyrofluid", "Pyrofluid", 5, 0, Integer.MAX_VALUE, "");
		maxBlazePowderFromPyrofluid = cfg.getInt("maxBlazePowderFromPyrofluid", "Pyrofluid", 5+32, 0, Integer.MAX_VALUE, "");
	
		speedMultiplierForFurnace = cfg.getInt("speedMultiplierForFurnace", "Advanced Alchemy Furnace", 2, 0, Integer.MAX_VALUE, "This is the speed of the Advanced Alchamical Furnace. TC's basic has 1.");
		makeRequireAlumentium = cfg.getBoolean("makeRequireAlumentium", "Advanced Alchemy Furnace", true, "Does the Advanced Alchemical Furnace requires Alumentium to work faster");
		
		shardsFromOre = cfg.getInt("shardsFromOre", "General", 8, 1, 64, "Amount of shards recieved from crucible ore processing");
		brightFociRequiresPrimordialPearl = cfg.getBoolean("brightFociRequiresPrimordialPearl", "General", true, "Does the Brightness Foci for the Node Manipulator requires a Primordial Pearl");
	
		enableTTCompathability = cfg.getBoolean("enableTTCompathability", "General", true, "Allow the mod to register it's enchantments in the Thaumic Tinkerer's enchanter? Set to false if Thaumic Tinkerer is crashing you.");
	
		allowHSNicknameChange = cfg.getBoolean("allowHerobrinesScytheNicknameChange", "General", true, "Will the Scythe of the white eyed one change the player's nickname to Herobrine while he is holding it.");
	}
	
	static Configuration cfg;
	
	public static int elderKnowledgeID;
	public static int eldritchBaneID;
	public static int magicTouchID;
	public static int taintedID;
	public static int vaporisingID;
	
	public static int aquaticFociUID;
	public static int nethericFociUID;
	public static int decomposingFociUID;
	public static int vaporisingFociUID;
	public static int calmingFociUID;
	public static int crystalizationFociUID;
	public static int warpingFociUID;
	
	public static boolean allowTobacco;
	public static boolean enableTTCompathability;
	
	public static int minBlazePowderFromPyrofluid;
	public static int maxBlazePowderFromPyrofluid;
	
	public static int speedMultiplierForFurnace;
	public static boolean makeRequireAlumentium;
	
	public static int shardsFromOre;
	public static boolean brightFociRequiresPrimordialPearl;
	
	public static boolean allowHSNicknameChange;

}
import static tb.core.TBCore.dependencies;
import static tb.core.TBCore.modid;
import static tb.core.TBCore.name;
import static tb.core.TBCore.version;
import java.util.ArrayList;
import DummyCore.Core.Core;
import net.minecraft.item.crafting.CraftingManager;
import net.minecraftforge.common.MinecraftForge;
import net.minecraftforge.fml.common.Mod;
import net.minecraftforge.fml.common.Mod.EventHandler;
import net.minecraftforge.fml.common.ModMetadata;
import net.minecraftforge.fml.common.SidedProxy;
import net.minecraftforge.fml.common.event.FMLInitializationEvent;
import net.minecraftforge.fml.common.event.FMLInterModComms;
import net.minecraftforge.fml.common.event.FMLPostInitializationEvent;
import net.minecraftforge.fml.common.event.FMLPreInitializationEvent;
import net.minecraftforge.fml.common.network.NetworkRegistry;
import net.minecraftforge.fml.common.network.simpleimpl.SimpleNetworkWrapper;
import net.minecraftforge.fml.common.registry.EntityRegistry;
import net.minecraftforge.fml.relauncher.Side;
import tb.api.RevolverUpgrade;
import tb.common.enchantment.EnchantmentHandler;
import tb.common.entity.EntityAspectOrb;
import tb.common.entity.EntityRevolverBullet;
import tb.common.event.TBEventHandler;
import tb.init.TBBlocks;
import tb.init.TBEnchant;
import tb.init.TBItems;
import tb.init.TBRecipes;
import tb.init.TBThaumonomicon;
import tb.init.TBTiles;
import tb.network.proxy.PacketTB;
import tb.network.proxy.TBNetworkManager;
import tb.network.proxy.TBServer;
import tb.utils.RecipesFragmentAdditions;
import tb.utils.TBConfig;
package tb.core;




@Mod(modid = modid, version = version, name = name,dependencies=dependencies)
public class TBCore {
	
	public static final String modid = "thaumicbases";
	public static final String version = "2.1.189.32";
	public static final String name = "Thaumic Bases";
	public static final String serverProxy = "tb.network.proxy.TBServer";
	public static final String clientProxy = "tb.network.proxy.TBClient";
	public static final String dependencies = "required-after:Thaumcraft@[5.1.6,);required-after:Baubles@[1.1.1.0,);required-after:DummyCore@[2.2.189.0,);";

	@SidedProxy(serverSide = serverProxy,clientSide = clientProxy)
	public static TBServer proxy;
	public static SimpleNetworkWrapper network;
	
	public static TBCore instance;
	public static final TBConfig cfg = new TBConfig();
	
	@EventHandler
	public void preInit(FMLPreInitializationEvent event)
	{
		instance = this;
		Core.registerModAbsolute(getClass(), name, event.getModConfigurationDirectory().getAbsolutePath(), cfg);
		setupModInfo(event.getModMetadata());
		TBBlocks.setup();
		TBItems.setup();
		TBEnchant.setup();
		TBTiles.setup();
		FMLInterModComms.sendMessage("Waila", "register", "tb.utils.WAILACompat.callbackRegister");	
	}
	
	@EventHandler
	public void init(FMLInitializationEvent event)
	{
		MinecraftForge.EVENT_BUS.register(new EnchantmentHandler());
		MinecraftForge.EVENT_BUS.register(new TBEventHandler());
		//FMLCommonHandler.instance().bus().register(new TBEventHandler());
		NetworkRegistry.INSTANCE.registerGuiHandler(instance, proxy);
		
		EntityRegistry.registerModEntity(EntityAspectOrb.class, "tb.old.tc.aspectOrb", 0, this, 32, 1, true);