Testing the creation of hell
This commit is contained in:
parent
796e75b1f9
commit
a2b006105e
2587 changed files with 0 additions and 129617 deletions
22
src/api/java/thaumcraft/api/IGoggles.java
Normal file
22
src/api/java/thaumcraft/api/IGoggles.java
Normal file
|
@ -0,0 +1,22 @@
|
|||
package thaumcraft.api;
|
||||
|
||||
import net.minecraft.entity.EntityLivingBase;
|
||||
import net.minecraft.item.ItemStack;
|
||||
|
||||
/**
|
||||
*
|
||||
* @author Azanor
|
||||
*
|
||||
* Equipped head slot items that extend this class will be able to perform most functions that
|
||||
* goggles of revealing can apart from view nodes which is handled by IRevealer.
|
||||
*
|
||||
*/
|
||||
|
||||
public interface IGoggles {
|
||||
|
||||
/*
|
||||
* If this method returns true things like block essentia contents will be shown.
|
||||
*/
|
||||
public boolean showIngamePopups(ItemStack itemstack, EntityLivingBase player);
|
||||
|
||||
}
|
13
src/api/java/thaumcraft/api/IRepairable.java
Normal file
13
src/api/java/thaumcraft/api/IRepairable.java
Normal file
|
@ -0,0 +1,13 @@
|
|||
package thaumcraft.api;
|
||||
|
||||
|
||||
|
||||
/**
|
||||
* @author Azanor
|
||||
* Items, armor and tools with this interface can receive the Repair enchantment.
|
||||
* Repairs 1 point of durability every 10 seconds (2 for repair II)
|
||||
*/
|
||||
public interface IRepairable {
|
||||
|
||||
|
||||
}
|
17
src/api/java/thaumcraft/api/IRepairableExtended.java
Normal file
17
src/api/java/thaumcraft/api/IRepairableExtended.java
Normal file
|
@ -0,0 +1,17 @@
|
|||
package thaumcraft.api;
|
||||
|
||||
import net.minecraft.entity.player.EntityPlayer;
|
||||
import net.minecraft.item.ItemStack;
|
||||
|
||||
|
||||
|
||||
/**
|
||||
* @author Azanor
|
||||
* Items, armor and tools with this interface can receive the Repair enchantment.
|
||||
* Repairs 1 point of durability every 10 seconds (2 for repair II)
|
||||
*/
|
||||
public interface IRepairableExtended extends IRepairable {
|
||||
|
||||
public boolean doRepair(ItemStack stack, EntityPlayer player, int enchantlevel);
|
||||
|
||||
}
|
22
src/api/java/thaumcraft/api/IRunicArmor.java
Normal file
22
src/api/java/thaumcraft/api/IRunicArmor.java
Normal file
|
@ -0,0 +1,22 @@
|
|||
package thaumcraft.api;
|
||||
|
||||
import net.minecraft.item.ItemStack;
|
||||
|
||||
/**
|
||||
*
|
||||
* @author Azanor
|
||||
*
|
||||
* Armor or bauble slot items that implement this interface can provide runic shielding.
|
||||
* Recharging, hardening, etc. is handled internally by thaumcraft.
|
||||
*
|
||||
*/
|
||||
|
||||
public interface IRunicArmor {
|
||||
|
||||
/**
|
||||
* returns how much charge this item can provide. This is the base shielding value - any hardening is stored and calculated internally.
|
||||
*/
|
||||
public int getRunicCharge(ItemStack itemstack);
|
||||
|
||||
|
||||
}
|
14
src/api/java/thaumcraft/api/IScribeTools.java
Normal file
14
src/api/java/thaumcraft/api/IScribeTools.java
Normal file
|
@ -0,0 +1,14 @@
|
|||
package thaumcraft.api;
|
||||
|
||||
|
||||
/**
|
||||
*
|
||||
* @author Azanor
|
||||
*
|
||||
* Interface used to identify scribing tool items used in research table
|
||||
*
|
||||
*/
|
||||
|
||||
public interface IScribeTools {
|
||||
|
||||
}
|
20
src/api/java/thaumcraft/api/IVisDiscountGear.java
Normal file
20
src/api/java/thaumcraft/api/IVisDiscountGear.java
Normal file
|
@ -0,0 +1,20 @@
|
|||
package thaumcraft.api;
|
||||
|
||||
import net.minecraft.entity.player.EntityPlayer;
|
||||
import net.minecraft.item.ItemStack;
|
||||
import thaumcraft.api.aspects.Aspect;
|
||||
|
||||
|
||||
|
||||
|
||||
/**
|
||||
* @author Azanor
|
||||
* ItemArmor with this interface will grant a discount to the vis cost of actions the wearer performs with casting wands.
|
||||
* The amount returned is the percentage by which the cost is discounted. There is a built-int max discount of 50%, but
|
||||
* individual items really shouldn't have a discount more than 5%
|
||||
*/
|
||||
public interface IVisDiscountGear {
|
||||
|
||||
int getVisDiscount(ItemStack stack, EntityPlayer player, Aspect aspect);
|
||||
|
||||
}
|
70
src/api/java/thaumcraft/api/ItemApi.java
Normal file
70
src/api/java/thaumcraft/api/ItemApi.java
Normal file
|
@ -0,0 +1,70 @@
|
|||
package thaumcraft.api;
|
||||
|
||||
import net.minecraft.block.Block;
|
||||
import net.minecraft.item.Item;
|
||||
import net.minecraft.item.ItemStack;
|
||||
import cpw.mods.fml.common.FMLLog;
|
||||
|
||||
/**
|
||||
* @author Azanor
|
||||
*
|
||||
* This is used to gain access to the items in my mod.
|
||||
* I only give some examples and it will probably still
|
||||
* require a bit of work for you to get hold of everything you need.
|
||||
*
|
||||
*/
|
||||
public class ItemApi {
|
||||
|
||||
public static ItemStack getItem(String itemString, int meta) {
|
||||
ItemStack item = null;
|
||||
|
||||
try {
|
||||
String itemClass = "thaumcraft.common.config.ConfigItems";
|
||||
Object obj = Class.forName(itemClass).getField(itemString).get(null);
|
||||
if (obj instanceof Item) {
|
||||
item = new ItemStack((Item) obj,1,meta);
|
||||
} else if (obj instanceof ItemStack) {
|
||||
item = (ItemStack) obj;
|
||||
}
|
||||
} catch (Exception ex) {
|
||||
FMLLog.warning("[Thaumcraft] Could not retrieve item identified by: " + itemString);
|
||||
}
|
||||
|
||||
return item;
|
||||
}
|
||||
|
||||
public static ItemStack getBlock(String itemString, int meta) {
|
||||
ItemStack item = null;
|
||||
|
||||
try {
|
||||
String itemClass = "thaumcraft.common.config.ConfigBlocks";
|
||||
Object obj = Class.forName(itemClass).getField(itemString).get(null);
|
||||
if (obj instanceof Block) {
|
||||
item = new ItemStack((Block) obj,1,meta);
|
||||
} else if (obj instanceof ItemStack) {
|
||||
item = (ItemStack) obj;
|
||||
}
|
||||
} catch (Exception ex) {
|
||||
FMLLog.warning("[Thaumcraft] Could not retrieve block identified by: " + itemString);
|
||||
}
|
||||
|
||||
return item;
|
||||
}
|
||||
|
||||
/**
|
||||
*
|
||||
* Some examples
|
||||
*
|
||||
* Casting Wands:
|
||||
* itemWandCasting
|
||||
*
|
||||
* Resources:
|
||||
* itemEssence, itemWispEssence, itemResource, itemShard, itemNugget,
|
||||
* itemNuggetChicken, itemNuggetBeef, itemNuggetPork, itemTripleMeatTreat
|
||||
*
|
||||
* Research:
|
||||
* itemResearchNotes, itemInkwell, itemThaumonomicon
|
||||
*
|
||||
*/
|
||||
|
||||
}
|
21
src/api/java/thaumcraft/api/ItemRunic.java
Normal file
21
src/api/java/thaumcraft/api/ItemRunic.java
Normal file
|
@ -0,0 +1,21 @@
|
|||
package thaumcraft.api;
|
||||
|
||||
import net.minecraft.item.Item;
|
||||
import net.minecraft.item.ItemStack;
|
||||
|
||||
public class ItemRunic extends Item implements IRunicArmor {
|
||||
|
||||
int charge;
|
||||
|
||||
public ItemRunic (int charge)
|
||||
{
|
||||
super();
|
||||
this.charge = charge;
|
||||
}
|
||||
|
||||
@Override
|
||||
public int getRunicCharge(ItemStack itemstack) {
|
||||
return charge;
|
||||
}
|
||||
|
||||
}
|
507
src/api/java/thaumcraft/api/ThaumcraftApi.java
Normal file
507
src/api/java/thaumcraft/api/ThaumcraftApi.java
Normal file
|
@ -0,0 +1,507 @@
|
|||
package thaumcraft.api;
|
||||
|
||||
import java.util.ArrayList;
|
||||
import java.util.Arrays;
|
||||
import java.util.HashMap;
|
||||
import java.util.List;
|
||||
import java.util.concurrent.ConcurrentHashMap;
|
||||
|
||||
import net.minecraft.block.Block;
|
||||
import net.minecraft.enchantment.Enchantment;
|
||||
import net.minecraft.entity.player.EntityPlayer;
|
||||
import net.minecraft.item.Item;
|
||||
import net.minecraft.item.Item.ToolMaterial;
|
||||
import net.minecraft.item.ItemArmor.ArmorMaterial;
|
||||
import net.minecraft.item.ItemStack;
|
||||
import net.minecraftforge.common.util.EnumHelper;
|
||||
import net.minecraftforge.oredict.OreDictionary;
|
||||
import thaumcraft.api.aspects.Aspect;
|
||||
import thaumcraft.api.aspects.AspectList;
|
||||
import thaumcraft.api.crafting.CrucibleRecipe;
|
||||
import thaumcraft.api.crafting.InfusionEnchantmentRecipe;
|
||||
import thaumcraft.api.crafting.InfusionRecipe;
|
||||
import thaumcraft.api.crafting.ShapedArcaneRecipe;
|
||||
import thaumcraft.api.crafting.ShapelessArcaneRecipe;
|
||||
import thaumcraft.api.research.IScanEventHandler;
|
||||
import thaumcraft.api.research.ResearchCategories;
|
||||
import thaumcraft.api.research.ResearchCategoryList;
|
||||
import thaumcraft.api.research.ResearchItem;
|
||||
import thaumcraft.api.research.ResearchPage;
|
||||
|
||||
|
||||
/**
|
||||
* @author Azanor
|
||||
*
|
||||
*
|
||||
* IMPORTANT: If you are adding your own aspects to items it is a good idea to do it AFTER Thaumcraft adds its aspects, otherwise odd things may happen.
|
||||
*
|
||||
*/
|
||||
public class ThaumcraftApi {
|
||||
|
||||
//Materials
|
||||
public static ToolMaterial toolMatThaumium = EnumHelper.addToolMaterial("THAUMIUM", 3, 400, 7F, 2, 22);
|
||||
public static ToolMaterial toolMatElemental = EnumHelper.addToolMaterial("THAUMIUM_ELEMENTAL", 3, 1500, 10F, 3, 18);
|
||||
public static ArmorMaterial armorMatThaumium = EnumHelper.addArmorMaterial("THAUMIUM", 25, new int[] { 2, 6, 5, 2 }, 25);
|
||||
public static ArmorMaterial armorMatSpecial = EnumHelper.addArmorMaterial("SPECIAL", 25, new int[] { 1, 3, 2, 1 }, 25);
|
||||
|
||||
//Enchantment references
|
||||
public static int enchantFrugal;
|
||||
public static int enchantPotency;
|
||||
public static int enchantWandFortune;
|
||||
public static int enchantHaste;
|
||||
public static int enchantRepair;
|
||||
|
||||
//Miscellaneous
|
||||
/**
|
||||
* Portable Hole Block-id Blacklist.
|
||||
* Simply add the block-id's of blocks you don't want the portable hole to go through.
|
||||
*/
|
||||
public static ArrayList<Block> portableHoleBlackList = new ArrayList<Block>();
|
||||
|
||||
|
||||
//RESEARCH/////////////////////////////////////////
|
||||
public static ArrayList<IScanEventHandler> scanEventhandlers = new ArrayList<IScanEventHandler>();
|
||||
public static ArrayList<EntityTags> scanEntities = new ArrayList<EntityTags>();
|
||||
public static class EntityTagsNBT {
|
||||
public EntityTagsNBT(String name, Object value) {
|
||||
this.name = name;
|
||||
this.value = value;
|
||||
}
|
||||
public String name;
|
||||
public Object value;
|
||||
}
|
||||
public static class EntityTags {
|
||||
public EntityTags(String entityName, AspectList aspects, EntityTagsNBT... nbts) {
|
||||
this.entityName = entityName;
|
||||
this.nbts = nbts;
|
||||
this.aspects = aspects;
|
||||
}
|
||||
public String entityName;
|
||||
public EntityTagsNBT[] nbts;
|
||||
public AspectList aspects;
|
||||
}
|
||||
|
||||
/**
|
||||
* not really working atm, so ignore it for now
|
||||
* @param scanEventHandler
|
||||
*/
|
||||
public static void registerScanEventhandler(IScanEventHandler scanEventHandler) {
|
||||
scanEventhandlers.add(scanEventHandler);
|
||||
}
|
||||
|
||||
/**
|
||||
* This is used to add aspects to entities which you can then scan using a thaumometer.
|
||||
* Also used to calculate vis drops from mobs.
|
||||
* @param entityName
|
||||
* @param aspects
|
||||
* @param nbt you can specify certain nbt keys and their values
|
||||
* to differentiate between mobs. <br>For example the normal and wither skeleton:
|
||||
* <br>ThaumcraftApi.registerEntityTag("Skeleton", (new AspectList()).add(Aspect.DEATH, 5));
|
||||
* <br>ThaumcraftApi.registerEntityTag("Skeleton", (new AspectList()).add(Aspect.DEATH, 8), new NBTTagByte("SkeletonType",(byte) 1));
|
||||
*/
|
||||
public static void registerEntityTag(String entityName, AspectList aspects, EntityTagsNBT... nbt ) {
|
||||
scanEntities.add(new EntityTags(entityName,aspects,nbt));
|
||||
}
|
||||
|
||||
//RECIPES/////////////////////////////////////////
|
||||
private static ArrayList craftingRecipes = new ArrayList();
|
||||
private static HashMap<Object,ItemStack> smeltingBonus = new HashMap<Object,ItemStack>();
|
||||
|
||||
/**
|
||||
* This method is used to determine what bonus items are generated when the infernal furnace smelts items
|
||||
* @param in The input of the smelting operation. e.g. new ItemStack(Block.oreGold)
|
||||
* @param out The bonus item that can be produced from the smelting operation e.g. new ItemStack(nuggetGold,0,0).
|
||||
* Stacksize should be 0 unless you want to guarantee that at least 1 item is always produced.
|
||||
*/
|
||||
public static void addSmeltingBonus(ItemStack in, ItemStack out) {
|
||||
smeltingBonus.put(
|
||||
Arrays.asList(in.getItem(),in.getItemDamage()),
|
||||
new ItemStack(out.getItem(),0,out.getItemDamage()));
|
||||
}
|
||||
|
||||
/**
|
||||
* This method is used to determine what bonus items are generated when the infernal furnace smelts items
|
||||
* @param in The ore dictionary input of the smelting operation. e.g. "oreGold"
|
||||
* @param out The bonus item that can be produced from the smelting operation e.g. new ItemStack(nuggetGold,0,0).
|
||||
* Stacksize should be 0 unless you want to guarantee that at least 1 item is always produced.
|
||||
*/
|
||||
public static void addSmeltingBonus(String in, ItemStack out) {
|
||||
smeltingBonus.put( in, new ItemStack(out.getItem(),0,out.getItemDamage()));
|
||||
}
|
||||
|
||||
/**
|
||||
* Returns the bonus item produced from a smelting operation in the infernal furnace
|
||||
* @param in The input of the smelting operation. e.g. new ItemStack(oreGold)
|
||||
* @return the The bonus item that can be produced
|
||||
*/
|
||||
public static ItemStack getSmeltingBonus(ItemStack in) {
|
||||
ItemStack out = smeltingBonus.get(Arrays.asList(in.getItem(),in.getItemDamage()));
|
||||
if (out==null) {
|
||||
out = smeltingBonus.get(Arrays.asList(in.getItem(),OreDictionary.WILDCARD_VALUE));
|
||||
}
|
||||
if (out==null) {
|
||||
String od = OreDictionary.getOreName( OreDictionary.getOreID(in));
|
||||
out = smeltingBonus.get(od);
|
||||
}
|
||||
return out;
|
||||
}
|
||||
|
||||
public static List getCraftingRecipes() {
|
||||
return craftingRecipes;
|
||||
}
|
||||
|
||||
/**
|
||||
* @param research the research key required for this recipe to work. Leave blank if it will work without research
|
||||
* @param result the recipe output
|
||||
* @param aspects the vis cost per aspect.
|
||||
* @param recipe The recipe. Format is exactly the same as vanilla recipes. Input itemstacks are NBT sensitive.
|
||||
*/
|
||||
public static ShapedArcaneRecipe addArcaneCraftingRecipe(String research, ItemStack result, AspectList aspects, Object ... recipe)
|
||||
{
|
||||
ShapedArcaneRecipe r= new ShapedArcaneRecipe(research, result, aspects, recipe);
|
||||
craftingRecipes.add(r);
|
||||
return r;
|
||||
}
|
||||
|
||||
/**
|
||||
* @param research the research key required for this recipe to work. Leave blank if it will work without research
|
||||
* @param result the recipe output
|
||||
* @param aspects the vis cost per aspect
|
||||
* @param recipe The recipe. Format is exactly the same as vanilla shapeless recipes. Input itemstacks are NBT sensitive.
|
||||
*/
|
||||
public static ShapelessArcaneRecipe addShapelessArcaneCraftingRecipe(String research, ItemStack result, AspectList aspects, Object ... recipe)
|
||||
{
|
||||
ShapelessArcaneRecipe r = new ShapelessArcaneRecipe(research, result, aspects, recipe);
|
||||
craftingRecipes.add(r);
|
||||
return r;
|
||||
}
|
||||
|
||||
/**
|
||||
* @param research the research key required for this recipe to work. Leave blank if it will work without research
|
||||
* @param result the recipe output. It can either be an itemstack or an nbt compound tag that will be added to the central item
|
||||
* @param instability a number that represents the N in 1000 chance for the infusion altar to spawn an
|
||||
* instability effect each second while the crafting is in progress
|
||||
* @param aspects the essentia cost per aspect.
|
||||
* @param aspects input the central item to be infused
|
||||
* @param recipe An array of items required to craft this. Input itemstacks are NBT sensitive.
|
||||
* Infusion crafting components are automatically "fuzzy" and the oredict will be checked for possible matches.
|
||||
*
|
||||
*/
|
||||
public static InfusionRecipe addInfusionCraftingRecipe(String research, Object result, int instability, AspectList aspects, ItemStack input,ItemStack[] recipe)
|
||||
{
|
||||
if (!(result instanceof ItemStack || result instanceof Object[])) return null;
|
||||
InfusionRecipe r= new InfusionRecipe(research, result, instability, aspects, input, recipe);
|
||||
craftingRecipes.add(r);
|
||||
return r;
|
||||
}
|
||||
|
||||
/**
|
||||
* @param research the research key required for this recipe to work. Leave blank if it will work without research
|
||||
* @param enchantment the enchantment that will be applied to the item
|
||||
* @param instability a number that represents the N in 1000 chance for the infusion altar to spawn an
|
||||
* instability effect each second while the crafting is in progress
|
||||
* @param aspects the essentia cost per aspect.
|
||||
* @param recipe An array of items required to craft this. Input itemstacks are NBT sensitive.
|
||||
* Infusion crafting components are automatically "fuzzy" and the oredict will be checked for possible matches.
|
||||
*
|
||||
*/
|
||||
public static InfusionEnchantmentRecipe addInfusionEnchantmentRecipe(String research, Enchantment enchantment, int instability, AspectList aspects, ItemStack[] recipe)
|
||||
{
|
||||
InfusionEnchantmentRecipe r= new InfusionEnchantmentRecipe(research, enchantment, instability, aspects, recipe);
|
||||
craftingRecipes.add(r);
|
||||
return r;
|
||||
}
|
||||
|
||||
/**
|
||||
* @param stack the recipe result
|
||||
* @return the recipe
|
||||
*/
|
||||
public static InfusionRecipe getInfusionRecipe(ItemStack res) {
|
||||
for (Object r:getCraftingRecipes()) {
|
||||
if (r instanceof InfusionRecipe) {
|
||||
if (((InfusionRecipe)r).getRecipeOutput() instanceof ItemStack) {
|
||||
if (((ItemStack) ((InfusionRecipe)r).getRecipeOutput()).isItemEqual(res))
|
||||
return (InfusionRecipe)r;
|
||||
}
|
||||
}
|
||||
}
|
||||
return null;
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* @param key the research key required for this recipe to work.
|
||||
* @param result the output result
|
||||
* @param catalyst an itemstack of the catalyst or a string if it is an ore dictionary item
|
||||
* @param cost the vis cost
|
||||
* @param tags the aspects required to craft this
|
||||
*/
|
||||
public static CrucibleRecipe addCrucibleRecipe(String key, ItemStack result, Object catalyst, AspectList tags) {
|
||||
CrucibleRecipe rc = new CrucibleRecipe(key, result, catalyst, tags);
|
||||
getCraftingRecipes().add(rc);
|
||||
return rc;
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* @param stack the recipe result
|
||||
* @return the recipe
|
||||
*/
|
||||
public static CrucibleRecipe getCrucibleRecipe(ItemStack stack) {
|
||||
for (Object r:getCraftingRecipes()) {
|
||||
if (r instanceof CrucibleRecipe) {
|
||||
if (((CrucibleRecipe)r).getRecipeOutput().isItemEqual(stack))
|
||||
return (CrucibleRecipe)r;
|
||||
}
|
||||
}
|
||||
return null;
|
||||
}
|
||||
|
||||
/**
|
||||
* Used by the thaumonomicon drilldown feature.
|
||||
* @param stack the item
|
||||
* @return the thaumcraft recipe key that produces that item.
|
||||
*/
|
||||
private static HashMap<int[],Object[]> keyCache = new HashMap<int[],Object[]>();
|
||||
|
||||
public static Object[] getCraftingRecipeKey(EntityPlayer player, ItemStack stack) {
|
||||
int[] key = new int[] {Item.getIdFromItem(stack.getItem()),stack.getItemDamage()};
|
||||
if (keyCache.containsKey(key)) {
|
||||
if (keyCache.get(key)==null) return null;
|
||||
if (ThaumcraftApiHelper.isResearchComplete(player.getCommandSenderName(), (String)(keyCache.get(key))[0]))
|
||||
return keyCache.get(key);
|
||||
else
|
||||
return null;
|
||||
}
|
||||
for (ResearchCategoryList rcl:ResearchCategories.researchCategories.values()) {
|
||||
for (ResearchItem ri:rcl.research.values()) {
|
||||
if (ri.getPages()==null) continue;
|
||||
for (int a=0;a<ri.getPages().length;a++) {
|
||||
ResearchPage page = ri.getPages()[a];
|
||||
if (page.recipeOutput!=null && stack !=null && page.recipeOutput.isItemEqual(stack)) {
|
||||
keyCache.put(key,new Object[] {ri.key,a});
|
||||
if (ThaumcraftApiHelper.isResearchComplete(player.getCommandSenderName(), ri.key))
|
||||
return new Object[] {ri.key,a};
|
||||
else
|
||||
return null;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
keyCache.put(key,null);
|
||||
return null;
|
||||
}
|
||||
|
||||
//ASPECTS////////////////////////////////////////
|
||||
|
||||
public static ConcurrentHashMap<List,AspectList> objectTags = new ConcurrentHashMap<List,AspectList>();
|
||||
|
||||
/**
|
||||
* Checks to see if the passed item/block already has aspects associated with it.
|
||||
* @param id
|
||||
* @param meta
|
||||
* @return
|
||||
*/
|
||||
public static boolean exists(Item item, int meta) {
|
||||
AspectList tmp = ThaumcraftApi.objectTags.get(Arrays.asList(item,meta));
|
||||
if (tmp==null) {
|
||||
tmp = ThaumcraftApi.objectTags.get(Arrays.asList(item,OreDictionary.WILDCARD_VALUE));
|
||||
if (meta==OreDictionary.WILDCARD_VALUE && tmp==null) {
|
||||
int index=0;
|
||||
do {
|
||||
tmp = ThaumcraftApi.objectTags.get(Arrays.asList(item,index));
|
||||
index++;
|
||||
} while (index<16 && tmp==null);
|
||||
}
|
||||
if (tmp==null) return false;
|
||||
}
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
/**
|
||||
* Used to assign apsects to the given item/block. Here is an example of the declaration for cobblestone:<p>
|
||||
* <i>ThaumcraftApi.registerObjectTag(new ItemStack(Blocks.cobblestone), (new AspectList()).add(Aspect.ENTROPY, 1).add(Aspect.EARTH, 1));</i>
|
||||
* @param item the item passed. Pass OreDictionary.WILDCARD_VALUE if all damage values of this item/block should have the same aspects
|
||||
* @param aspects A ObjectTags object of the associated aspects
|
||||
*/
|
||||
public static void registerObjectTag(ItemStack item, AspectList aspects) {
|
||||
if (aspects==null) aspects=new AspectList();
|
||||
try {
|
||||
objectTags.put(Arrays.asList(item.getItem(),item.getItemDamage()), aspects);
|
||||
} catch (Exception e) {}
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* Used to assign apsects to the given item/block. Here is an example of the declaration for cobblestone:<p>
|
||||
* <i>ThaumcraftApi.registerObjectTag(new ItemStack(Blocks.cobblestone), new int[]{0,1}, (new AspectList()).add(Aspect.ENTROPY, 1).add(Aspect.EARTH, 1));</i>
|
||||
* @param item
|
||||
* @param meta A range of meta values if you wish to lump several item meta's together as being the "same" item (i.e. stair orientations)
|
||||
* @param aspects A ObjectTags object of the associated aspects
|
||||
*/
|
||||
public static void registerObjectTag(ItemStack item, int[] meta, AspectList aspects) {
|
||||
if (aspects==null) aspects=new AspectList();
|
||||
try {
|
||||
objectTags.put(Arrays.asList(item.getItem(),meta), aspects);
|
||||
} catch (Exception e) {}
|
||||
}
|
||||
|
||||
/**
|
||||
* Used to assign apsects to the given ore dictionary item.
|
||||
* @param oreDict the ore dictionary name
|
||||
* @param aspects A ObjectTags object of the associated aspects
|
||||
*/
|
||||
public static void registerObjectTag(String oreDict, AspectList aspects) {
|
||||
if (aspects==null) aspects=new AspectList();
|
||||
ArrayList<ItemStack> ores = OreDictionary.getOres(oreDict);
|
||||
if (ores!=null && ores.size()>0) {
|
||||
for (ItemStack ore:ores) {
|
||||
try {
|
||||
objectTags.put(Arrays.asList(ore.getItem(), ore.getItemDamage()), aspects);
|
||||
} catch (Exception e) {}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Used to assign aspects to the given item/block.
|
||||
* Attempts to automatically generate aspect tags by checking registered recipes.
|
||||
* Here is an example of the declaration for pistons:<p>
|
||||
* <i>ThaumcraftApi.registerComplexObjectTag(new ItemStack(Blocks.cobblestone), (new AspectList()).add(Aspect.MECHANISM, 2).add(Aspect.MOTION, 4));</i>
|
||||
* @param item, pass OreDictionary.WILDCARD_VALUE to meta if all damage values of this item/block should have the same aspects
|
||||
* @param aspects A ObjectTags object of the associated aspects
|
||||
*/
|
||||
public static void registerComplexObjectTag(ItemStack item, AspectList aspects ) {
|
||||
if (!exists(item.getItem(),item.getItemDamage())) {
|
||||
AspectList tmp = ThaumcraftApiHelper.generateTags(item.getItem(), item.getItemDamage());
|
||||
if (tmp != null && tmp.size()>0) {
|
||||
for(Aspect tag:tmp.getAspects()) {
|
||||
aspects.add(tag, tmp.getAmount(tag));
|
||||
}
|
||||
}
|
||||
registerObjectTag(item,aspects);
|
||||
} else {
|
||||
AspectList tmp = ThaumcraftApiHelper.getObjectAspects(item);
|
||||
for(Aspect tag:aspects.getAspects()) {
|
||||
tmp.merge(tag, tmp.getAmount(tag));
|
||||
}
|
||||
registerObjectTag(item,tmp);
|
||||
}
|
||||
}
|
||||
|
||||
//WARP ///////////////////////////////////////////////////////////////////////////////////////
|
||||
private static HashMap<Object,Integer> warpMap = new HashMap<Object,Integer>();
|
||||
|
||||
/**
|
||||
* This method is used to determine how much warp is gained if the item is crafted
|
||||
* @param craftresult The item crafted
|
||||
* @param amount how much warp is gained
|
||||
*/
|
||||
public static void addWarpToItem(ItemStack craftresult, int amount) {
|
||||
warpMap.put(Arrays.asList(craftresult.getItem(),craftresult.getItemDamage()),amount);
|
||||
}
|
||||
|
||||
/**
|
||||
* This method is used to determine how much warp is gained if the sent item is crafted
|
||||
* @param in The item crafted
|
||||
* @param amount how much warp is gained
|
||||
*/
|
||||
public static void addWarpToResearch(String research, int amount) {
|
||||
warpMap.put(research, amount);
|
||||
}
|
||||
|
||||
/**
|
||||
* Returns how much warp is gained from the item or research passed in
|
||||
* @param in itemstack or string
|
||||
* @return how much warp it will give
|
||||
*/
|
||||
public static int getWarp(Object in) {
|
||||
if (in==null) return 0;
|
||||
if (in instanceof ItemStack && warpMap.containsKey(Arrays.asList(((ItemStack)in).getItem(),((ItemStack)in).getItemDamage()))) {
|
||||
return warpMap.get(Arrays.asList(((ItemStack)in).getItem(),((ItemStack)in).getItemDamage()));
|
||||
} else
|
||||
if (in instanceof String && warpMap.containsKey((String)in)) {
|
||||
return warpMap.get((String)in);
|
||||
}
|
||||
return 0;
|
||||
}
|
||||
|
||||
//CROPS //////////////////////////////////////////////////////////////////////////////////////////
|
||||
|
||||
/**
|
||||
* To define mod crops you need to use FMLInterModComms in your @Mod.Init method.
|
||||
* There are two 'types' of crops you can add. Standard crops and clickable crops.
|
||||
*
|
||||
* Standard crops work like normal vanilla crops - they grow until a certain metadata
|
||||
* value is reached and you harvest them by destroying the block and collecting the blocks.
|
||||
* You need to create and ItemStack that tells the golem what block id and metadata represents
|
||||
* the crop when fully grown. Sending a metadata of [OreDictionary.WILDCARD_VALUE] will mean the metadata won't get
|
||||
* checked.
|
||||
* Example for vanilla wheat:
|
||||
* FMLInterModComms.sendMessage("Thaumcraft", "harvestStandardCrop", new ItemStack(Block.crops,1,7));
|
||||
*
|
||||
* Clickable crops are crops that you right click to gather their bounty instead of destroying them.
|
||||
* As for standard crops, you need to create and ItemStack that tells the golem what block id
|
||||
* and metadata represents the crop when fully grown. The golem will trigger the blocks onBlockActivated method.
|
||||
* Sending a metadata of [OreDictionary.WILDCARD_VALUE] will mean the metadata won't get checked.
|
||||
* Example (this will technically do nothing since clicking wheat does nothing, but you get the idea):
|
||||
* FMLInterModComms.sendMessage("Thaumcraft", "harvestClickableCrop", new ItemStack(Block.crops,1,7));
|
||||
*
|
||||
* Stacked crops (like reeds) are crops that you wish the bottom block should remain after harvesting.
|
||||
* As for standard crops, you need to create and ItemStack that tells the golem what block id
|
||||
* and metadata represents the crop when fully grown. Sending a metadata of [OreDictionary.WILDCARD_VALUE] will mean the actualy md won't get
|
||||
* checked. If it has the order upgrade it will only harvest if the crop is more than one block high.
|
||||
* Example:
|
||||
* FMLInterModComms.sendMessage("Thaumcraft", "harvestStackedCrop", new ItemStack(Block.reed,1,7));
|
||||
*/
|
||||
|
||||
//NATIVE CLUSTERS //////////////////////////////////////////////////////////////////////////////////
|
||||
|
||||
/**
|
||||
* You can define certain ores that will have a chance to produce native clusters via FMLInterModComms
|
||||
* in your @Mod.Init method using the "nativeCluster" string message.
|
||||
* The format should be:
|
||||
* "[ore item/block id],[ore item/block metadata],[cluster item/block id],[cluster item/block metadata],[chance modifier float]"
|
||||
*
|
||||
* NOTE: The chance modifier is a multiplier applied to the default chance for that cluster to be produced (default 27.5% for a pickaxe of the core)
|
||||
*
|
||||
* Example for vanilla iron ore to produce one of my own native iron clusters (assuming default id's) at double the default chance:
|
||||
* FMLInterModComms.sendMessage("Thaumcraft", "nativeCluster","15,0,25016,16,2.0");
|
||||
*/
|
||||
|
||||
//LAMP OF GROWTH BLACKLIST ///////////////////////////////////////////////////////////////////////////
|
||||
/**
|
||||
* You can blacklist crops that should not be effected by the Lamp of Growth via FMLInterModComms
|
||||
* in your @Mod.Init method using the "lampBlacklist" itemstack message.
|
||||
* Sending a metadata of [OreDictionary.WILDCARD_VALUE] will mean the metadata won't get checked.
|
||||
* Example for vanilla wheat:
|
||||
* FMLInterModComms.sendMessage("Thaumcraft", "lampBlacklist", new ItemStack(Block.crops,1,OreDictionary.WILDCARD_VALUE));
|
||||
*/
|
||||
|
||||
//DIMENSION BLACKLIST ///////////////////////////////////////////////////////////////////////////
|
||||
/**
|
||||
* You can blacklist a dimension to not spawn certain thaumcraft features
|
||||
* in your @Mod.Init method using the "dimensionBlacklist" string message in the format "[dimension]:[level]"
|
||||
* The level values are as follows:
|
||||
* [0] stop all tc spawning and generation
|
||||
* [1] allow ore and node generation
|
||||
* [2] allow mob spawning
|
||||
* [3] allow ore and node gen + mob spawning
|
||||
* Example:
|
||||
* FMLInterModComms.sendMessage("Thaumcraft", "dimensionBlacklist", "15:1");
|
||||
*/
|
||||
|
||||
//BIOME BLACKLIST ///////////////////////////////////////////////////////////////////////////
|
||||
/**
|
||||
* You can blacklist a biome to not spawn certain thaumcraft features
|
||||
* in your @Mod.Init method using the "biomeBlacklist" string message in the format "[biome id]:[level]"
|
||||
* The level values are as follows:
|
||||
* [0] stop all tc spawning and generation
|
||||
* [1] allow ore and node generation
|
||||
* [2] allow mob spawning
|
||||
* [3] allow ore and node gen + mob spawning
|
||||
* Example:
|
||||
* FMLInterModComms.sendMessage("Thaumcraft", "biomeBlacklist", "180:2");
|
||||
*/
|
||||
}
|
269
src/api/java/thaumcraft/api/ThaumcraftApiHelper.java
Normal file
269
src/api/java/thaumcraft/api/ThaumcraftApiHelper.java
Normal file
|
@ -0,0 +1,269 @@
|
|||
package thaumcraft.api;
|
||||
|
||||
import java.lang.reflect.Method;
|
||||
import java.util.HashMap;
|
||||
|
||||
import net.minecraft.entity.player.EntityPlayer;
|
||||
import net.minecraft.item.Item;
|
||||
import net.minecraft.item.ItemStack;
|
||||
import net.minecraft.tileentity.TileEntity;
|
||||
import net.minecraft.world.IBlockAccess;
|
||||
import net.minecraft.world.World;
|
||||
import net.minecraftforge.common.util.ForgeDirection;
|
||||
import net.minecraftforge.oredict.OreDictionary;
|
||||
import thaumcraft.api.aspects.Aspect;
|
||||
import thaumcraft.api.aspects.AspectList;
|
||||
import thaumcraft.api.aspects.IEssentiaTransport;
|
||||
import cpw.mods.fml.common.FMLLog;
|
||||
|
||||
public class ThaumcraftApiHelper {
|
||||
|
||||
public static AspectList cullTags(AspectList temp) {
|
||||
AspectList temp2 = new AspectList();
|
||||
for (Aspect tag:temp.getAspects()) {
|
||||
if (tag!=null)
|
||||
temp2.add(tag, temp.getAmount(tag));
|
||||
}
|
||||
while (temp2!=null && temp2.size()>10) {
|
||||
Aspect lowest = null;
|
||||
int low = Integer.MAX_VALUE;
|
||||
for (Aspect tag:temp2.getAspects()) {
|
||||
if (tag==null) continue;
|
||||
if (temp2.getAmount(tag)<low) {
|
||||
low = temp2.getAmount(tag);
|
||||
lowest = tag;
|
||||
}
|
||||
}
|
||||
temp2.aspects.remove(lowest);
|
||||
}
|
||||
return temp2;
|
||||
}
|
||||
|
||||
public static boolean areItemsEqual(ItemStack s1,ItemStack s2)
|
||||
{
|
||||
if (s1.isItemStackDamageable() && s2.isItemStackDamageable())
|
||||
{
|
||||
return s1.getItem() == s2.getItem();
|
||||
} else
|
||||
return s1.getItem() == s2.getItem() && s1.getItemDamage() == s2.getItemDamage();
|
||||
}
|
||||
|
||||
static Method isResearchComplete;
|
||||
static Method getObjectTags;
|
||||
static Method getBonusTags;
|
||||
static Method generateTags;
|
||||
public static boolean isResearchComplete(String username, String researchkey) {
|
||||
boolean ot = false;
|
||||
try {
|
||||
if(isResearchComplete == null) {
|
||||
Class fake = Class.forName("thaumcraft.common.lib.research.ResearchManager");
|
||||
isResearchComplete = fake.getMethod("isResearchComplete", String.class, String.class);
|
||||
}
|
||||
ot = (Boolean) isResearchComplete.invoke(null, username, researchkey);
|
||||
} catch(Exception ex) {
|
||||
FMLLog.warning("[Thaumcraft API] Could not invoke thaumcraft.common.lib.research.ResearchManager method isResearchComplete");
|
||||
}
|
||||
return ot;
|
||||
}
|
||||
|
||||
public static ItemStack getStackInRowAndColumn(Object instance, int row, int column) {
|
||||
ItemStack ot = null;
|
||||
try {
|
||||
Class fake = Class.forName("thaumcraft.common.tiles.TileMagicWorkbench");
|
||||
Method getStackInRowAndColumn = fake.getMethod("getStackInRowAndColumn", int.class, int.class);
|
||||
ot = (ItemStack) getStackInRowAndColumn.invoke(instance, row, column);
|
||||
} catch(Exception ex) {
|
||||
FMLLog.warning("[Thaumcraft API] Could not invoke thaumcraft.common.tiles.TileMagicWorkbench method getStackInRowAndColumn");
|
||||
}
|
||||
return ot;
|
||||
}
|
||||
|
||||
public static AspectList getObjectAspects(ItemStack is) {
|
||||
AspectList ot = null;
|
||||
try {
|
||||
if(getObjectTags == null) {
|
||||
Class fake = Class.forName("thaumcraft.common.lib.crafting.ThaumcraftCraftingManager");
|
||||
getObjectTags = fake.getMethod("getObjectTags", ItemStack.class);
|
||||
}
|
||||
ot = (AspectList) getObjectTags.invoke(null, is);
|
||||
} catch(Exception ex) {
|
||||
FMLLog.warning("[Thaumcraft API] Could not invoke thaumcraft.common.lib.crafting.ThaumcraftCraftingManager method getObjectTags");
|
||||
}
|
||||
return ot;
|
||||
}
|
||||
|
||||
public static AspectList getBonusObjectTags(ItemStack is,AspectList ot) {
|
||||
|
||||
try {
|
||||
if(getBonusTags == null) {
|
||||
Class fake = Class.forName("thaumcraft.common.lib.crafting.ThaumcraftCraftingManager");
|
||||
getBonusTags = fake.getMethod("getBonusTags", ItemStack.class, AspectList.class);
|
||||
}
|
||||
ot = (AspectList) getBonusTags.invoke(null, is, ot);
|
||||
} catch(Exception ex) {
|
||||
FMLLog.warning("[Thaumcraft API] Could not invoke thaumcraft.common.lib.crafting.ThaumcraftCraftingManager method getBonusTags");
|
||||
}
|
||||
return ot;
|
||||
}
|
||||
|
||||
public static AspectList generateTags(Item item, int meta) {
|
||||
try {
|
||||
if(generateTags == null) {
|
||||
Class fake = Class.forName("thaumcraft.common.lib.crafting.ThaumcraftCraftingManager");
|
||||
generateTags = fake.getMethod("generateTags", Item.class, int.class);
|
||||
}
|
||||
return (AspectList) generateTags.invoke(null, item, meta);
|
||||
} catch(Exception ex) {
|
||||
FMLLog.warning("[Thaumcraft API] Could not invoke thaumcraft.common.lib.crafting.ThaumcraftCraftingManager method generateTags");
|
||||
}
|
||||
return null;
|
||||
}
|
||||
|
||||
public static boolean containsMatch(boolean strict, ItemStack[] inputs, ItemStack... targets)
|
||||
{
|
||||
for (ItemStack input : inputs)
|
||||
{
|
||||
for (ItemStack target : targets)
|
||||
{
|
||||
if (itemMatches(target, input, strict))
|
||||
{
|
||||
return true;
|
||||
}
|
||||
}
|
||||
}
|
||||
return false;
|
||||
}
|
||||
|
||||
public static boolean itemMatches(ItemStack target, ItemStack input, boolean strict)
|
||||
{
|
||||
if (input == null && target != null || input != null && target == null)
|
||||
{
|
||||
return false;
|
||||
}
|
||||
return (target.getItem() == input.getItem() &&
|
||||
((target.getItemDamage() == OreDictionary.WILDCARD_VALUE && !strict) || target.getItemDamage() == input.getItemDamage()));
|
||||
}
|
||||
|
||||
|
||||
public static TileEntity getConnectableTile(World world, int x, int y, int z, ForgeDirection face) {
|
||||
TileEntity te = world.getTileEntity(x+face.offsetX, y+face.offsetY, z+face.offsetZ);
|
||||
if (te instanceof IEssentiaTransport && ((IEssentiaTransport)te).isConnectable(face.getOpposite()))
|
||||
return te;
|
||||
else
|
||||
return null;
|
||||
}
|
||||
|
||||
public static TileEntity getConnectableTile(IBlockAccess world, int x, int y, int z, ForgeDirection face) {
|
||||
TileEntity te = world.getTileEntity(x+face.offsetX, y+face.offsetY, z+face.offsetZ);
|
||||
if (te instanceof IEssentiaTransport && ((IEssentiaTransport)te).isConnectable(face.getOpposite()))
|
||||
return te;
|
||||
else
|
||||
return null;
|
||||
}
|
||||
|
||||
private static HashMap<Integer, AspectList> allAspects= new HashMap<Integer, AspectList>();
|
||||
private static HashMap<Integer, AspectList> allCompoundAspects= new HashMap<Integer, AspectList>();
|
||||
|
||||
public static AspectList getAllAspects(int amount) {
|
||||
if (allAspects.get(amount)==null) {
|
||||
AspectList al = new AspectList();
|
||||
for (Aspect aspect:Aspect.aspects.values()) {
|
||||
al.add(aspect, amount);
|
||||
}
|
||||
allAspects.put(amount, al);
|
||||
}
|
||||
return allAspects.get(amount);
|
||||
}
|
||||
|
||||
public static AspectList getAllCompoundAspects(int amount) {
|
||||
if (allCompoundAspects.get(amount)==null) {
|
||||
AspectList al = new AspectList();
|
||||
for (Aspect aspect:Aspect.getCompoundAspects()) {
|
||||
al.add(aspect, amount);
|
||||
}
|
||||
allCompoundAspects.put(amount, al);
|
||||
}
|
||||
return allCompoundAspects.get(amount);
|
||||
}
|
||||
|
||||
static Method consumeVisFromWand;
|
||||
/**
|
||||
* Use to subtract vis from a wand for most operations
|
||||
* Wands store vis differently so "real" vis costs need to be multiplied by 100 before calling this method
|
||||
* @param wand the wand itemstack
|
||||
* @param player the player using the wand
|
||||
* @param cost the cost of the operation.
|
||||
* @param doit actually subtract the vis from the wand if true - if false just simulate the result
|
||||
* @param crafting is this a crafting operation or not - if
|
||||
* false then things like frugal and potency will apply to the costs
|
||||
* @return was the vis successfully subtracted
|
||||
*/
|
||||
public static boolean consumeVisFromWand(ItemStack wand, EntityPlayer player,
|
||||
AspectList cost, boolean doit, boolean crafting) {
|
||||
boolean ot = false;
|
||||
try {
|
||||
if(consumeVisFromWand == null) {
|
||||
Class fake = Class.forName("thaumcraft.common.items.wands.ItemWandCasting");
|
||||
consumeVisFromWand = fake.getMethod("consumeAllVis",
|
||||
ItemStack.class, EntityPlayer.class, AspectList.class, boolean.class, boolean.class);
|
||||
}
|
||||
ot = (Boolean) consumeVisFromWand.invoke(
|
||||
consumeVisFromWand.getDeclaringClass().cast(wand.getItem()), wand, player, cost, doit, crafting);
|
||||
} catch(Exception ex) {
|
||||
FMLLog.warning("[Thaumcraft API] Could not invoke thaumcraft.common.items.wands.ItemWandCasting method consumeAllVis");
|
||||
}
|
||||
return ot;
|
||||
}
|
||||
|
||||
static Method consumeVisFromWandCrafting;
|
||||
/**
|
||||
* Subtract vis for use by a crafting mechanic. Costs are calculated slightly
|
||||
* differently and things like the frugal enchant is ignored
|
||||
* Must NOT be multiplied by 100 - send the actual vis cost
|
||||
* @param wand the wand itemstack
|
||||
* @param player the player using the wand
|
||||
* @param cost the cost of the operation.
|
||||
* @param doit actually subtract the vis from the wand if true - if false just simulate the result
|
||||
* @return was the vis successfully subtracted
|
||||
*/
|
||||
public static boolean consumeVisFromWandCrafting(ItemStack wand, EntityPlayer player,
|
||||
AspectList cost, boolean doit) {
|
||||
boolean ot = false;
|
||||
try {
|
||||
if(consumeVisFromWandCrafting == null) {
|
||||
Class fake = Class.forName("thaumcraft.common.items.wands.ItemWandCasting");
|
||||
consumeVisFromWandCrafting = fake.getMethod("consumeAllVisCrafting",
|
||||
ItemStack.class, EntityPlayer.class, AspectList.class, boolean.class);
|
||||
}
|
||||
ot = (Boolean) consumeVisFromWandCrafting.invoke(
|
||||
consumeVisFromWandCrafting.getDeclaringClass().cast(wand.getItem()), wand, player, cost, doit);
|
||||
} catch(Exception ex) {
|
||||
FMLLog.warning("[Thaumcraft API] Could not invoke thaumcraft.common.items.wands.ItemWandCasting method consumeAllVisCrafting");
|
||||
}
|
||||
return ot;
|
||||
}
|
||||
|
||||
static Method consumeVisFromInventory;
|
||||
/**
|
||||
* Subtract vis from a wand the player is carrying. Works like consumeVisFromWand in that actual vis
|
||||
* costs should be multiplied by 100. The costs are handled like crafting however and things like
|
||||
* frugal don't effect them
|
||||
* @param player the player using the wand
|
||||
* @param cost the cost of the operation.
|
||||
* @return was the vis successfully subtracted
|
||||
*/
|
||||
public static boolean consumeVisFromInventory(EntityPlayer player, AspectList cost) {
|
||||
boolean ot = false;
|
||||
try {
|
||||
if(consumeVisFromInventory == null) {
|
||||
Class fake = Class.forName("thaumcraft.common.items.wands.WandManager");
|
||||
consumeVisFromInventory = fake.getMethod("consumeVisFromInventory",
|
||||
EntityPlayer.class, AspectList.class);
|
||||
}
|
||||
ot = (Boolean) consumeVisFromInventory.invoke(null, player, cost);
|
||||
} catch(Exception ex) {
|
||||
FMLLog.warning("[Thaumcraft API] Could not invoke thaumcraft.common.items.wands.WandManager method consumeVisFromInventory");
|
||||
}
|
||||
return ot;
|
||||
}
|
||||
}
|
63
src/api/java/thaumcraft/api/TileThaumcraft.java
Normal file
63
src/api/java/thaumcraft/api/TileThaumcraft.java
Normal file
|
@ -0,0 +1,63 @@
|
|||
package thaumcraft.api;
|
||||
|
||||
import net.minecraft.nbt.NBTTagCompound;
|
||||
import net.minecraft.network.NetworkManager;
|
||||
import net.minecraft.network.Packet;
|
||||
import net.minecraft.network.play.server.S35PacketUpdateTileEntity;
|
||||
import net.minecraft.tileentity.TileEntity;
|
||||
|
||||
/**
|
||||
*
|
||||
* @author azanor
|
||||
*
|
||||
* Custom tile entity class I use for most of my tile entities. Setup in such a way that only
|
||||
* the nbt data within readCustomNBT / writeCustomNBT will be sent to the client when the tile
|
||||
* updates. Apart from all the normal TE data that gets sent that is.
|
||||
*
|
||||
*/
|
||||
public class TileThaumcraft extends TileEntity {
|
||||
|
||||
//NBT stuff
|
||||
|
||||
@Override
|
||||
public void readFromNBT(NBTTagCompound nbttagcompound)
|
||||
{
|
||||
super.readFromNBT(nbttagcompound);
|
||||
readCustomNBT(nbttagcompound);
|
||||
}
|
||||
|
||||
public void readCustomNBT(NBTTagCompound nbttagcompound)
|
||||
{
|
||||
//TODO
|
||||
}
|
||||
|
||||
@Override
|
||||
public void writeToNBT(NBTTagCompound nbttagcompound)
|
||||
{
|
||||
super.writeToNBT(nbttagcompound);
|
||||
writeCustomNBT(nbttagcompound);
|
||||
}
|
||||
|
||||
public void writeCustomNBT(NBTTagCompound nbttagcompound)
|
||||
{
|
||||
//TODO
|
||||
}
|
||||
|
||||
//Client Packet stuff
|
||||
@Override
|
||||
public Packet getDescriptionPacket() {
|
||||
NBTTagCompound nbttagcompound = new NBTTagCompound();
|
||||
this.writeCustomNBT(nbttagcompound);
|
||||
return new S35PacketUpdateTileEntity(this.xCoord, this.yCoord, this.zCoord, -999, nbttagcompound);
|
||||
}
|
||||
|
||||
@Override
|
||||
public void onDataPacket(NetworkManager net, S35PacketUpdateTileEntity pkt) {
|
||||
super.onDataPacket(net, pkt);
|
||||
this.readCustomNBT(pkt.func_148857_g());
|
||||
}
|
||||
|
||||
|
||||
|
||||
|
||||
}
|
117
src/api/java/thaumcraft/api/WorldCoordinates.java
Normal file
117
src/api/java/thaumcraft/api/WorldCoordinates.java
Normal file
|
@ -0,0 +1,117 @@
|
|||
package thaumcraft.api;
|
||||
|
||||
import net.minecraft.nbt.NBTTagCompound;
|
||||
import net.minecraft.tileentity.TileEntity;
|
||||
|
||||
public class WorldCoordinates implements Comparable
|
||||
{
|
||||
public int x;
|
||||
|
||||
/** the y coordinate */
|
||||
public int y;
|
||||
|
||||
/** the z coordinate */
|
||||
public int z;
|
||||
|
||||
public int dim;
|
||||
|
||||
public WorldCoordinates() {}
|
||||
|
||||
public WorldCoordinates(int par1, int par2, int par3, int d)
|
||||
{
|
||||
this.x = par1;
|
||||
this.y = par2;
|
||||
this.z = par3;
|
||||
this.dim = d;
|
||||
}
|
||||
|
||||
public WorldCoordinates(TileEntity tile)
|
||||
{
|
||||
this.x = tile.xCoord;
|
||||
this.y = tile.yCoord;
|
||||
this.z = tile.zCoord;
|
||||
this.dim = tile.getWorldObj().provider.dimensionId;
|
||||
}
|
||||
|
||||
public WorldCoordinates(WorldCoordinates par1ChunkCoordinates)
|
||||
{
|
||||
this.x = par1ChunkCoordinates.x;
|
||||
this.y = par1ChunkCoordinates.y;
|
||||
this.z = par1ChunkCoordinates.z;
|
||||
this.dim = par1ChunkCoordinates.dim;
|
||||
}
|
||||
|
||||
public boolean equals(Object par1Obj)
|
||||
{
|
||||
if (!(par1Obj instanceof WorldCoordinates))
|
||||
{
|
||||
return false;
|
||||
}
|
||||
else
|
||||
{
|
||||
WorldCoordinates coordinates = (WorldCoordinates)par1Obj;
|
||||
return this.x == coordinates.x && this.y == coordinates.y && this.z == coordinates.z && this.dim == coordinates.dim ;
|
||||
}
|
||||
}
|
||||
|
||||
public int hashCode()
|
||||
{
|
||||
return this.x + this.y << 8 + this.z << 16 + this.dim << 24;
|
||||
}
|
||||
|
||||
/**
|
||||
* Compare the coordinate with another coordinate
|
||||
*/
|
||||
public int compareWorldCoordinate(WorldCoordinates par1)
|
||||
{
|
||||
return this.dim == par1.dim ? (
|
||||
this.y == par1.y ? (this.z == par1.z ? this.x - par1.x : this.z - par1.z) : this.y - par1.y) : -1;
|
||||
}
|
||||
|
||||
public void set(int par1, int par2, int par3, int d)
|
||||
{
|
||||
this.x = par1;
|
||||
this.y = par2;
|
||||
this.z = par3;
|
||||
this.dim = d;
|
||||
}
|
||||
|
||||
/**
|
||||
* Returns the squared distance between this coordinates and the coordinates given as argument.
|
||||
*/
|
||||
public float getDistanceSquared(int par1, int par2, int par3)
|
||||
{
|
||||
float f = (float)(this.x - par1);
|
||||
float f1 = (float)(this.y - par2);
|
||||
float f2 = (float)(this.z - par3);
|
||||
return f * f + f1 * f1 + f2 * f2;
|
||||
}
|
||||
|
||||
/**
|
||||
* Return the squared distance between this coordinates and the ChunkCoordinates given as argument.
|
||||
*/
|
||||
public float getDistanceSquaredToWorldCoordinates(WorldCoordinates par1ChunkCoordinates)
|
||||
{
|
||||
return this.getDistanceSquared(par1ChunkCoordinates.x, par1ChunkCoordinates.y, par1ChunkCoordinates.z);
|
||||
}
|
||||
|
||||
public int compareTo(Object par1Obj)
|
||||
{
|
||||
return this.compareWorldCoordinate((WorldCoordinates)par1Obj);
|
||||
}
|
||||
|
||||
public void readNBT(NBTTagCompound nbt) {
|
||||
this.x = nbt.getInteger("w_x");
|
||||
this.y = nbt.getInteger("w_y");
|
||||
this.z = nbt.getInteger("w_z");
|
||||
this.dim = nbt.getInteger("w_d");
|
||||
}
|
||||
|
||||
public void writeNBT(NBTTagCompound nbt) {
|
||||
nbt.setInteger("w_x",x);
|
||||
nbt.setInteger("w_y",y);
|
||||
nbt.setInteger("w_z",z);
|
||||
nbt.setInteger("w_d",dim);
|
||||
}
|
||||
|
||||
}
|
201
src/api/java/thaumcraft/api/aspects/Aspect.java
Normal file
201
src/api/java/thaumcraft/api/aspects/Aspect.java
Normal file
|
@ -0,0 +1,201 @@
|
|||
package thaumcraft.api.aspects;
|
||||
|
||||
import java.util.ArrayList;
|
||||
import java.util.Collection;
|
||||
import java.util.LinkedHashMap;
|
||||
|
||||
import net.minecraft.util.ResourceLocation;
|
||||
import net.minecraft.util.StatCollector;
|
||||
|
||||
import org.apache.commons.lang3.text.WordUtils;
|
||||
|
||||
public class Aspect {
|
||||
|
||||
String tag;
|
||||
Aspect[] components;
|
||||
int color;
|
||||
private String chatcolor;
|
||||
ResourceLocation image;
|
||||
int blend;
|
||||
|
||||
/**
|
||||
* Use this constructor to register your own aspects.
|
||||
* @param tag the key that will be used to reference this aspect, as well as its latin display name
|
||||
* @param color color to display the tag in
|
||||
* @param components the aspects this one is formed from
|
||||
* @param image ResourceLocation pointing to a 32x32 icon of the aspect
|
||||
* @param blend GL11 blendmode (1 or 771). Used for rendering nodes. Default is 1
|
||||
*/
|
||||
public Aspect(String tag, int color, Aspect[] components, ResourceLocation image, int blend) {
|
||||
if (aspects.containsKey(tag)) throw new IllegalArgumentException(tag+" already registered!");
|
||||
this.tag = tag;
|
||||
this.components = components;
|
||||
this.color = color;
|
||||
this.image = image;
|
||||
this.blend = blend;
|
||||
aspects.put(tag, this);
|
||||
}
|
||||
|
||||
/**
|
||||
* Shortcut constructor I use for the default aspects - you shouldn't be using this.
|
||||
*/
|
||||
public Aspect(String tag, int color, Aspect[] components) {
|
||||
this(tag,color,components,new ResourceLocation("thaumcraft","textures/aspects/"+tag.toLowerCase()+".png"),1);
|
||||
}
|
||||
|
||||
/**
|
||||
* Shortcut constructor I use for the default aspects - you shouldn't be using this.
|
||||
*/
|
||||
public Aspect(String tag, int color, Aspect[] components, int blend) {
|
||||
this(tag,color,components,new ResourceLocation("thaumcraft","textures/aspects/"+tag.toLowerCase()+".png"),blend);
|
||||
}
|
||||
|
||||
/**
|
||||
* Shortcut constructor I use for the primal aspects -
|
||||
* you shouldn't use this as making your own primal aspects will break all the things.
|
||||
*/
|
||||
public Aspect(String tag, int color, String chatcolor, int blend) {
|
||||
this(tag,color,(Aspect[])null, blend);
|
||||
this.setChatcolor(chatcolor);
|
||||
}
|
||||
|
||||
public int getColor() {
|
||||
return color;
|
||||
}
|
||||
|
||||
public String getName() {
|
||||
return WordUtils.capitalizeFully(tag);
|
||||
}
|
||||
|
||||
public String getLocalizedDescription() {
|
||||
return StatCollector.translateToLocal("tc.aspect."+tag);
|
||||
}
|
||||
|
||||
public String getTag() {
|
||||
return tag;
|
||||
}
|
||||
|
||||
public void setTag(String tag) {
|
||||
this.tag = tag;
|
||||
}
|
||||
|
||||
public Aspect[] getComponents() {
|
||||
return components;
|
||||
}
|
||||
|
||||
public void setComponents(Aspect[] components) {
|
||||
this.components = components;
|
||||
}
|
||||
|
||||
public ResourceLocation getImage() {
|
||||
return image;
|
||||
}
|
||||
|
||||
public static Aspect getAspect(String tag) {
|
||||
return aspects.get(tag);
|
||||
}
|
||||
|
||||
public int getBlend() {
|
||||
return blend;
|
||||
}
|
||||
|
||||
public void setBlend(int blend) {
|
||||
this.blend = blend;
|
||||
}
|
||||
|
||||
public boolean isPrimal() {
|
||||
return getComponents()==null || getComponents().length!=2;
|
||||
}
|
||||
|
||||
///////////////////////////////
|
||||
public static ArrayList<Aspect> getPrimalAspects() {
|
||||
ArrayList<Aspect> primals = new ArrayList<Aspect>();
|
||||
Collection<Aspect> pa = aspects.values();
|
||||
for (Aspect aspect:pa) {
|
||||
if (aspect.isPrimal()) primals.add(aspect);
|
||||
}
|
||||
return primals;
|
||||
}
|
||||
|
||||
public static ArrayList<Aspect> getCompoundAspects() {
|
||||
ArrayList<Aspect> compounds = new ArrayList<Aspect>();
|
||||
Collection<Aspect> pa = aspects.values();
|
||||
for (Aspect aspect:pa) {
|
||||
if (!aspect.isPrimal()) compounds.add(aspect);
|
||||
}
|
||||
return compounds;
|
||||
}
|
||||
|
||||
public String getChatcolor() {
|
||||
return chatcolor;
|
||||
}
|
||||
|
||||
public void setChatcolor(String chatcolor) {
|
||||
this.chatcolor = chatcolor;
|
||||
}
|
||||
|
||||
|
||||
///////////////////////////////
|
||||
public static LinkedHashMap<String,Aspect> aspects = new LinkedHashMap<String,Aspect>();
|
||||
|
||||
//PRIMAL
|
||||
public static final Aspect AIR = new Aspect("aer",0xffff7e,"e",1);
|
||||
public static final Aspect EARTH = new Aspect("terra",0x56c000,"2",1);
|
||||
public static final Aspect FIRE = new Aspect("ignis",0xff5a01,"c",1);
|
||||
public static final Aspect WATER = new Aspect("aqua",0x3cd4fc,"3",1);
|
||||
public static final Aspect ORDER = new Aspect("ordo",0xd5d4ec,"7",1);
|
||||
public static final Aspect ENTROPY = new Aspect("perditio",0x404040,"8",771);
|
||||
|
||||
//SECONDARY
|
||||
public static final Aspect VOID = new Aspect("vacuos",0x888888, new Aspect[] {AIR, ENTROPY},771);
|
||||
public static final Aspect LIGHT = new Aspect("lux",0xfff663, new Aspect[] {AIR, FIRE});
|
||||
public static final Aspect WEATHER = new Aspect("tempestas",0xFFFFFF, new Aspect[] {AIR, WATER});
|
||||
public static final Aspect MOTION = new Aspect("motus",0xcdccf4, new Aspect[] {AIR, ORDER});
|
||||
public static final Aspect COLD = new Aspect("gelum",0xe1ffff, new Aspect[] {FIRE, ENTROPY});
|
||||
public static final Aspect CRYSTAL = new Aspect("vitreus",0x80ffff, new Aspect[] {EARTH, ORDER});
|
||||
public static final Aspect LIFE = new Aspect("victus",0xde0005, new Aspect[] {WATER, EARTH});
|
||||
public static final Aspect POISON = new Aspect("venenum",0x89f000, new Aspect[] {WATER, ENTROPY});
|
||||
public static final Aspect ENERGY = new Aspect("potentia",0xc0ffff, new Aspect[] {ORDER, FIRE});
|
||||
public static final Aspect EXCHANGE = new Aspect("permutatio",0x578357, new Aspect[] {ENTROPY, ORDER});
|
||||
// public static final Aspect ?? = new Aspect("??",0xcdccf4, new Aspect[] {AIR, EARTH});
|
||||
// public static final Aspect ?? = new Aspect("??",0xcdccf4, new Aspect[] {FIRE, EARTH});
|
||||
// public static final Aspect ?? = new Aspect("??",0xcdccf4, new Aspect[] {FIRE, WATER});
|
||||
// public static final Aspect ?? = new Aspect("??",0xcdccf4, new Aspect[] {ORDER, WATER});
|
||||
// public static final Aspect ?? = new Aspect("??",0xcdccf4, new Aspect[] {EARTH, ENTROPY});
|
||||
|
||||
//TERTIARY
|
||||
public static final Aspect METAL = new Aspect("metallum",0xb5b5cd, new Aspect[] {EARTH, CRYSTAL});
|
||||
public static final Aspect DEATH = new Aspect("mortuus",0x887788, new Aspect[] {LIFE, ENTROPY});
|
||||
public static final Aspect FLIGHT = new Aspect("volatus",0xe7e7d7, new Aspect[] {AIR, MOTION});
|
||||
public static final Aspect DARKNESS = new Aspect("tenebrae",0x222222, new Aspect[] {VOID, LIGHT});
|
||||
public static final Aspect SOUL = new Aspect("spiritus",0xebebfb, new Aspect[] {LIFE, DEATH});
|
||||
public static final Aspect HEAL = new Aspect("sano",0xff2f34, new Aspect[] {LIFE, ORDER});
|
||||
public static final Aspect TRAVEL = new Aspect("iter",0xe0585b, new Aspect[] {MOTION, EARTH});
|
||||
public static final Aspect ELDRITCH = new Aspect("alienis",0x805080, new Aspect[] {VOID, DARKNESS});
|
||||
public static final Aspect MAGIC = new Aspect("praecantatio",0x9700c0, new Aspect[] {VOID, ENERGY});
|
||||
public static final Aspect AURA = new Aspect("auram",0xffc0ff, new Aspect[] {MAGIC, AIR});
|
||||
public static final Aspect TAINT = new Aspect("vitium",0x800080, new Aspect[] {MAGIC, ENTROPY});
|
||||
public static final Aspect SLIME = new Aspect("limus",0x01f800, new Aspect[] {LIFE, WATER});
|
||||
public static final Aspect PLANT = new Aspect("herba",0x01ac00, new Aspect[] {LIFE, EARTH});
|
||||
public static final Aspect TREE = new Aspect("arbor",0x876531, new Aspect[] {AIR, PLANT});
|
||||
public static final Aspect BEAST = new Aspect("bestia",0x9f6409, new Aspect[] {MOTION, LIFE});
|
||||
public static final Aspect FLESH = new Aspect("corpus",0xee478d, new Aspect[] {DEATH, BEAST});
|
||||
public static final Aspect UNDEAD = new Aspect("exanimis",0x3a4000, new Aspect[] {MOTION, DEATH});
|
||||
public static final Aspect MIND = new Aspect("cognitio",0xffc2b3, new Aspect[] {EARTH, SOUL});
|
||||
public static final Aspect SENSES = new Aspect("sensus",0x0fd9ff, new Aspect[] {AIR, SOUL});
|
||||
public static final Aspect MAN = new Aspect("humanus",0xffd7c0, new Aspect[] {BEAST, MIND});
|
||||
public static final Aspect CROP = new Aspect("messis",0xe1b371, new Aspect[] {PLANT, MAN});
|
||||
public static final Aspect MINE = new Aspect("perfodio",0xdcd2d8, new Aspect[] {MAN, EARTH});
|
||||
public static final Aspect TOOL = new Aspect("instrumentum",0x4040ee, new Aspect[] {MAN, ORDER});
|
||||
public static final Aspect HARVEST = new Aspect("meto",0xeead82, new Aspect[] {CROP, TOOL});
|
||||
public static final Aspect WEAPON = new Aspect("telum",0xc05050, new Aspect[] {TOOL, ENTROPY});
|
||||
public static final Aspect ARMOR = new Aspect("tutamen",0x00c0c0, new Aspect[] {TOOL, EARTH});
|
||||
public static final Aspect HUNGER = new Aspect("fames",0x9a0305, new Aspect[] {LIFE, VOID});
|
||||
public static final Aspect GREED = new Aspect("lucrum",0xe6be44, new Aspect[] {MAN, HUNGER});
|
||||
public static final Aspect CRAFT = new Aspect("fabrico",0x809d80, new Aspect[] {MAN, TOOL});
|
||||
public static final Aspect CLOTH = new Aspect("pannus",0xeaeac2, new Aspect[] {TOOL, BEAST});
|
||||
public static final Aspect MECHANISM = new Aspect("machina",0x8080a0, new Aspect[] {MOTION, TOOL});
|
||||
public static final Aspect TRAP = new Aspect("vinculum",0x9a8080, new Aspect[] {MOTION, ENTROPY});
|
||||
|
||||
|
||||
}
|
256
src/api/java/thaumcraft/api/aspects/AspectList.java
Normal file
256
src/api/java/thaumcraft/api/aspects/AspectList.java
Normal file
|
@ -0,0 +1,256 @@
|
|||
package thaumcraft.api.aspects;
|
||||
|
||||
import java.io.Serializable;
|
||||
import java.util.LinkedHashMap;
|
||||
|
||||
import net.minecraft.item.ItemStack;
|
||||
import net.minecraft.nbt.NBTTagCompound;
|
||||
import net.minecraft.nbt.NBTTagList;
|
||||
import thaumcraft.api.ThaumcraftApiHelper;
|
||||
|
||||
public class AspectList implements Serializable {
|
||||
|
||||
public LinkedHashMap<Aspect,Integer> aspects = new LinkedHashMap<Aspect,Integer>();//aspects associated with this object
|
||||
|
||||
|
||||
/**
|
||||
* this creates a new aspect list with preloaded values based off the aspects of the given item.
|
||||
* @param the itemstack of the given item
|
||||
*/
|
||||
public AspectList(ItemStack stack) {
|
||||
try {
|
||||
AspectList temp = ThaumcraftApiHelper.getObjectAspects(stack);
|
||||
if (temp!=null)
|
||||
for (Aspect tag:temp.getAspects()) {
|
||||
add(tag,temp.getAmount(tag));
|
||||
}
|
||||
} catch (Exception e) {}
|
||||
}
|
||||
|
||||
public AspectList() {
|
||||
}
|
||||
|
||||
public AspectList copy() {
|
||||
AspectList out = new AspectList();
|
||||
for (Aspect a:this.getAspects())
|
||||
out.add(a, this.getAmount(a));
|
||||
return out;
|
||||
}
|
||||
|
||||
/**
|
||||
* @return the amount of different aspects in this collection
|
||||
*/
|
||||
public int size() {
|
||||
return aspects.size();
|
||||
}
|
||||
|
||||
/**
|
||||
* @return the amount of total vis in this collection
|
||||
*/
|
||||
public int visSize() {
|
||||
int q = 0;
|
||||
|
||||
for (Aspect as:aspects.keySet()) {
|
||||
q+=this.getAmount(as);
|
||||
}
|
||||
|
||||
return q;
|
||||
}
|
||||
|
||||
/**
|
||||
* @return an array of all the aspects in this collection
|
||||
*/
|
||||
public Aspect[] getAspects() {
|
||||
Aspect[] q = new Aspect[1];
|
||||
return aspects.keySet().toArray(q);
|
||||
}
|
||||
|
||||
/**
|
||||
* @return an array of all the aspects in this collection
|
||||
*/
|
||||
public Aspect[] getPrimalAspects() {
|
||||
AspectList t = new AspectList();
|
||||
for (Aspect as:aspects.keySet()) {
|
||||
if (as.isPrimal()) {
|
||||
t.add(as,1);
|
||||
}
|
||||
}
|
||||
Aspect[] q = new Aspect[1];
|
||||
return t.aspects.keySet().toArray(q);
|
||||
}
|
||||
|
||||
/**
|
||||
* @return an array of all the aspects in this collection sorted by name
|
||||
*/
|
||||
public Aspect[] getAspectsSorted() {
|
||||
try {
|
||||
Aspect[] out = aspects.keySet().toArray(new Aspect[1]);
|
||||
boolean change=false;
|
||||
do {
|
||||
change=false;
|
||||
for(int a=0;a<out.length-1;a++) {
|
||||
Aspect e1 = out[a];
|
||||
Aspect e2 = out[a+1];
|
||||
if (e1!=null && e2!=null && e1.getTag().compareTo(e2.getTag())>0) {
|
||||
out[a] = e2;
|
||||
out[a+1] = e1;
|
||||
change = true;
|
||||
break;
|
||||
}
|
||||
}
|
||||
} while (change==true);
|
||||
return out;
|
||||
} catch (Exception e) {
|
||||
return this.getAspects();
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* @return an array of all the aspects in this collection sorted by amount
|
||||
*/
|
||||
public Aspect[] getAspectsSortedAmount() {
|
||||
try {
|
||||
Aspect[] out = aspects.keySet().toArray(new Aspect[1]);
|
||||
boolean change=false;
|
||||
do {
|
||||
change=false;
|
||||
for(int a=0;a<out.length-1;a++) {
|
||||
int e1 = getAmount(out[a]);
|
||||
int e2 = getAmount(out[a+1]);
|
||||
if (e1>0 && e2>0 && e2>e1) {
|
||||
Aspect ea = out[a];
|
||||
Aspect eb = out[a+1];
|
||||
out[a] = eb;
|
||||
out[a+1] = ea;
|
||||
change = true;
|
||||
break;
|
||||
}
|
||||
}
|
||||
} while (change==true);
|
||||
return out;
|
||||
} catch (Exception e) {
|
||||
return this.getAspects();
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* @param key
|
||||
* @return the amount associated with the given aspect in this collection
|
||||
*/
|
||||
public int getAmount(Aspect key) {
|
||||
return aspects.get(key)==null?0:aspects.get(key);
|
||||
}
|
||||
|
||||
/**
|
||||
* Reduces the amount of an aspect in this collection by the given amount.
|
||||
* @param key
|
||||
* @param amount
|
||||
* @return
|
||||
*/
|
||||
public boolean reduce(Aspect key, int amount) {
|
||||
if (getAmount(key)>=amount) {
|
||||
int am = getAmount(key)-amount;
|
||||
aspects.put(key, am);
|
||||
return true;
|
||||
}
|
||||
return false;
|
||||
}
|
||||
|
||||
/**
|
||||
* Reduces the amount of an aspect in this collection by the given amount.
|
||||
* If reduced to 0 or less the aspect will be removed completely.
|
||||
* @param key
|
||||
* @param amount
|
||||
* @return
|
||||
*/
|
||||
public AspectList remove(Aspect key, int amount) {
|
||||
int am = getAmount(key)-amount;
|
||||
if (am<=0) aspects.remove(key); else
|
||||
this.aspects.put(key, am);
|
||||
return this;
|
||||
}
|
||||
|
||||
/**
|
||||
* Simply removes the aspect from the list
|
||||
* @param key
|
||||
* @param amount
|
||||
* @return
|
||||
*/
|
||||
public AspectList remove(Aspect key) {
|
||||
aspects.remove(key);
|
||||
return this;
|
||||
}
|
||||
|
||||
/**
|
||||
* Adds this aspect and amount to the collection.
|
||||
* If the aspect exists then its value will be increased by the given amount.
|
||||
* @param aspect
|
||||
* @param amount
|
||||
* @return
|
||||
*/
|
||||
public AspectList add(Aspect aspect, int amount) {
|
||||
if (this.aspects.containsKey(aspect)) {
|
||||
int oldamount = this.aspects.get(aspect);
|
||||
amount+=oldamount;
|
||||
}
|
||||
this.aspects.put( aspect, amount );
|
||||
return this;
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* Adds this aspect and amount to the collection.
|
||||
* If the aspect exists then only the highest of the old or new amount will be used.
|
||||
* @param aspect
|
||||
* @param amount
|
||||
* @return
|
||||
*/
|
||||
public AspectList merge(Aspect aspect, int amount) {
|
||||
if (this.aspects.containsKey(aspect)) {
|
||||
int oldamount = this.aspects.get(aspect);
|
||||
if (amount<oldamount) amount=oldamount;
|
||||
|
||||
}
|
||||
this.aspects.put( aspect, amount );
|
||||
return this;
|
||||
}
|
||||
|
||||
/**
|
||||
* Reads the list of aspects from nbt
|
||||
* @param nbttagcompound
|
||||
* @return
|
||||
*/
|
||||
public void readFromNBT(NBTTagCompound nbttagcompound)
|
||||
{
|
||||
aspects.clear();
|
||||
NBTTagList tlist = nbttagcompound.getTagList("Aspects",(byte)10);
|
||||
for (int j = 0; j < tlist.tagCount(); j++) {
|
||||
NBTTagCompound rs = (NBTTagCompound) tlist.getCompoundTagAt(j);
|
||||
if (rs.hasKey("key")) {
|
||||
add( Aspect.getAspect(rs.getString("key")),
|
||||
rs.getInteger("amount"));
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Writes the list of aspects to nbt
|
||||
* @param nbttagcompound
|
||||
* @return
|
||||
*/
|
||||
public void writeToNBT(NBTTagCompound nbttagcompound)
|
||||
{
|
||||
NBTTagList tlist = new NBTTagList();
|
||||
nbttagcompound.setTag("Aspects", tlist);
|
||||
for (Aspect aspect : getAspects())
|
||||
if (aspect != null) {
|
||||
NBTTagCompound f = new NBTTagCompound();
|
||||
f.setString("key", aspect.getTag());
|
||||
f.setInteger("amount", getAmount(aspect));
|
||||
tlist.appendTag(f);
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
|
||||
}
|
58
src/api/java/thaumcraft/api/aspects/AspectSourceHelper.java
Normal file
58
src/api/java/thaumcraft/api/aspects/AspectSourceHelper.java
Normal file
|
@ -0,0 +1,58 @@
|
|||
package thaumcraft.api.aspects;
|
||||
|
||||
import java.lang.reflect.Method;
|
||||
|
||||
import net.minecraft.tileentity.TileEntity;
|
||||
import net.minecraftforge.common.util.ForgeDirection;
|
||||
import cpw.mods.fml.common.FMLLog;
|
||||
|
||||
public class AspectSourceHelper {
|
||||
|
||||
static Method drainEssentia;
|
||||
static Method findEssentia;
|
||||
/**
|
||||
* This method is what is used to drain essentia from jars and other sources for things like
|
||||
* infusion crafting or powering the arcane furnace. A record of possible sources are kept track of
|
||||
* and refreshed as needed around the calling tile entity. This also renders the essentia trail particles.
|
||||
* Only 1 essentia is drained at a time
|
||||
* @param tile the tile entity that is draining the essentia
|
||||
* @param aspect the aspect that you are looking for
|
||||
* @param direction the direction from which you wish to drain. Forgedirection.Unknown simply seeks in all directions.
|
||||
* @param range how many blocks you wish to search for essentia sources.
|
||||
* @return boolean returns true if essentia was found and removed from a source.
|
||||
*/
|
||||
public static boolean drainEssentia(TileEntity tile, Aspect aspect, ForgeDirection direction, int range) {
|
||||
try {
|
||||
if(drainEssentia == null) {
|
||||
Class fake = Class.forName("thaumcraft.common.lib.events.EssentiaHandler");
|
||||
drainEssentia = fake.getMethod("drainEssentia", TileEntity.class, Aspect.class, ForgeDirection.class, int.class);
|
||||
}
|
||||
return (Boolean) drainEssentia.invoke(null, tile, aspect, direction, range);
|
||||
} catch(Exception ex) {
|
||||
FMLLog.warning("[Thaumcraft API] Could not invoke thaumcraft.common.lib.events.EssentiaHandler method drainEssentia");
|
||||
}
|
||||
return false;
|
||||
}
|
||||
|
||||
/**
|
||||
* This method returns if there is any essentia of the passed type that can be drained. It in no way checks how
|
||||
* much there is, only if an essentia container nearby contains at least 1 point worth.
|
||||
* @param tile the tile entity that is checking the essentia
|
||||
* @param aspect the aspect that you are looking for
|
||||
* @param direction the direction from which you wish to drain. Forgedirection.Unknown simply seeks in all directions.
|
||||
* @param range how many blocks you wish to search for essentia sources.
|
||||
* @return boolean returns true if essentia was found and removed from a source.
|
||||
*/
|
||||
public static boolean findEssentia(TileEntity tile, Aspect aspect, ForgeDirection direction, int range) {
|
||||
try {
|
||||
if(findEssentia == null) {
|
||||
Class fake = Class.forName("thaumcraft.common.lib.events.EssentiaHandler");
|
||||
findEssentia = fake.getMethod("findEssentia", TileEntity.class, Aspect.class, ForgeDirection.class, int.class);
|
||||
}
|
||||
return (Boolean) findEssentia.invoke(null, tile, aspect, direction, range);
|
||||
} catch(Exception ex) {
|
||||
FMLLog.warning("[Thaumcraft API] Could not invoke thaumcraft.common.lib.events.EssentiaHandler method findEssentia");
|
||||
}
|
||||
return false;
|
||||
}
|
||||
}
|
80
src/api/java/thaumcraft/api/aspects/IAspectContainer.java
Normal file
80
src/api/java/thaumcraft/api/aspects/IAspectContainer.java
Normal file
|
@ -0,0 +1,80 @@
|
|||
package thaumcraft.api.aspects;
|
||||
|
||||
|
||||
/**
|
||||
*
|
||||
* @author azanor
|
||||
*
|
||||
* Used by blocks like the crucible and alembic to hold their aspects.
|
||||
* Tiles extending this interface will have their aspects show up when viewed by goggles of revealing
|
||||
*
|
||||
*/
|
||||
public interface IAspectContainer {
|
||||
public AspectList getAspects();
|
||||
|
||||
|
||||
public void setAspects(AspectList aspects);
|
||||
|
||||
|
||||
/**
|
||||
* This method is used to determine of a specific aspect can be added to this container.
|
||||
* @param tag
|
||||
* @return true or false
|
||||
*/
|
||||
public boolean doesContainerAccept(Aspect tag);
|
||||
|
||||
/**
|
||||
* This method is used to add a certain amount of an aspect to the tile entity.
|
||||
* @param tag
|
||||
* @param amount
|
||||
* @return the amount of aspect left over that could not be added.
|
||||
*/
|
||||
public int addToContainer(Aspect tag, int amount);
|
||||
|
||||
/**
|
||||
* Removes a certain amount of a specific aspect from the tile entity
|
||||
* @param tag
|
||||
* @param amount
|
||||
* @return true if that amount of aspect was available and was removed
|
||||
*/
|
||||
public boolean takeFromContainer(Aspect tag, int amount);
|
||||
|
||||
/**
|
||||
* removes a bunch of different aspects and amounts from the tile entity.
|
||||
* @param ot the ObjectTags object that contains the aspects and their amounts.
|
||||
* @return true if all the aspects and their amounts were available and successfully removed
|
||||
*
|
||||
* Going away in the next major patch
|
||||
*/
|
||||
@Deprecated
|
||||
public boolean takeFromContainer(AspectList ot);
|
||||
|
||||
/**
|
||||
* Checks if the tile entity contains the listed amount (or more) of the aspect
|
||||
* @param tag
|
||||
* @param amount
|
||||
* @return
|
||||
*/
|
||||
public boolean doesContainerContainAmount(Aspect tag,int amount);
|
||||
|
||||
/**
|
||||
* Checks if the tile entity contains all the listed aspects and their amounts
|
||||
* @param ot the ObjectTags object that contains the aspects and their amounts.
|
||||
* @return
|
||||
*
|
||||
* Going away in the next major patch
|
||||
*/
|
||||
@Deprecated
|
||||
public boolean doesContainerContain(AspectList ot);
|
||||
|
||||
/**
|
||||
* Returns how much of the aspect this tile entity contains
|
||||
* @param tag
|
||||
* @return the amount of that aspect found
|
||||
*/
|
||||
public int containerContains(Aspect tag);
|
||||
|
||||
}
|
||||
|
||||
|
||||
|
16
src/api/java/thaumcraft/api/aspects/IAspectSource.java
Normal file
16
src/api/java/thaumcraft/api/aspects/IAspectSource.java
Normal file
|
@ -0,0 +1,16 @@
|
|||
package thaumcraft.api.aspects;
|
||||
|
||||
|
||||
|
||||
/**
|
||||
* @author Azanor
|
||||
*
|
||||
* This interface is implemented by tile entites (or possibly anything else) like jars
|
||||
* so that they can act as an essentia source for blocks like the infusion altar.
|
||||
*
|
||||
*/
|
||||
public interface IAspectSource extends IAspectContainer {
|
||||
|
||||
|
||||
|
||||
}
|
|
@ -0,0 +1,37 @@
|
|||
package thaumcraft.api.aspects;
|
||||
|
||||
import net.minecraft.item.ItemStack;
|
||||
import net.minecraft.nbt.NBTTagCompound;
|
||||
|
||||
/**
|
||||
*
|
||||
* @author azanor
|
||||
*
|
||||
* Used by wispy essences and essentia phials to hold their aspects.
|
||||
* Useful for similar item containers that store their aspect information in nbt form so TC
|
||||
* automatically picks up the aspects they contain
|
||||
*
|
||||
*/
|
||||
public interface IEssentiaContainerItem {
|
||||
public AspectList getAspects(ItemStack itemstack);
|
||||
public void setAspects(ItemStack itemstack, AspectList aspects);
|
||||
}
|
||||
|
||||
//Example implementation
|
||||
/*
|
||||
@Override
|
||||
public AspectList getAspects(ItemStack itemstack) {
|
||||
if (itemstack.hasTagCompound()) {
|
||||
AspectList aspects = new AspectList();
|
||||
aspects.readFromNBT(itemstack.getTagCompound());
|
||||
return aspects.size()>0?aspects:null;
|
||||
}
|
||||
return null;
|
||||
}
|
||||
|
||||
@Override
|
||||
public void setAspects(ItemStack itemstack, AspectList aspects) {
|
||||
if (!itemstack.hasTagCompound()) itemstack.setTagCompound(new NBTTagCompound());
|
||||
aspects.writeToNBT(itemstack.getTagCompound());
|
||||
}
|
||||
*/
|
100
src/api/java/thaumcraft/api/aspects/IEssentiaTransport.java
Normal file
100
src/api/java/thaumcraft/api/aspects/IEssentiaTransport.java
Normal file
|
@ -0,0 +1,100 @@
|
|||
package thaumcraft.api.aspects;
|
||||
|
||||
import net.minecraftforge.common.util.ForgeDirection;
|
||||
|
||||
|
||||
/**
|
||||
* @author Azanor
|
||||
* This interface is used by tiles that use or transport vis.
|
||||
* Only tiles that implement this interface will be able to connect to vis conduits or other thaumic devices
|
||||
*/
|
||||
public interface IEssentiaTransport {
|
||||
/**
|
||||
* Is this tile able to connect to other vis users/sources on the specified side?
|
||||
* @param face
|
||||
* @return
|
||||
*/
|
||||
public boolean isConnectable(ForgeDirection face);
|
||||
|
||||
/**
|
||||
* Is this side used to input essentia?
|
||||
* @param face
|
||||
* @return
|
||||
*/
|
||||
boolean canInputFrom(ForgeDirection face);
|
||||
|
||||
/**
|
||||
* Is this side used to output essentia?
|
||||
* @param face
|
||||
* @return
|
||||
*/
|
||||
boolean canOutputTo(ForgeDirection face);
|
||||
|
||||
/**
|
||||
* Sets the amount of suction this block will apply
|
||||
* @param suction
|
||||
*/
|
||||
public void setSuction(Aspect aspect, int amount);
|
||||
|
||||
/**
|
||||
* Returns the type of suction this block is applying.
|
||||
* @param loc
|
||||
* the location from where the suction is being checked
|
||||
* @return
|
||||
* a return type of null indicates the suction is untyped and the first thing available will be drawn
|
||||
*/
|
||||
public Aspect getSuctionType(ForgeDirection face);
|
||||
|
||||
/**
|
||||
* Returns the strength of suction this block is applying.
|
||||
* @param loc
|
||||
* the location from where the suction is being checked
|
||||
* @return
|
||||
*/
|
||||
public int getSuctionAmount(ForgeDirection face);
|
||||
|
||||
/**
|
||||
* remove the specified amount of essentia from this transport tile
|
||||
* @return how much was actually taken
|
||||
*/
|
||||
public int takeEssentia(Aspect aspect, int amount, ForgeDirection face);
|
||||
|
||||
/**
|
||||
* add the specified amount of essentia to this transport tile
|
||||
* @return how much was actually added
|
||||
*/
|
||||
public int addEssentia(Aspect aspect, int amount, ForgeDirection face);
|
||||
|
||||
/**
|
||||
* What type of essentia this contains
|
||||
* @param face
|
||||
* @return
|
||||
*/
|
||||
public Aspect getEssentiaType(ForgeDirection face);
|
||||
|
||||
/**
|
||||
* How much essentia this block contains
|
||||
* @param face
|
||||
* @return
|
||||
*/
|
||||
public int getEssentiaAmount(ForgeDirection face);
|
||||
|
||||
|
||||
|
||||
/**
|
||||
* Essentia will not be drawn from this container unless the suction exceeds this amount.
|
||||
* @return the amount
|
||||
*/
|
||||
public int getMinimumSuction();
|
||||
|
||||
/**
|
||||
* Return true if you want the conduit to extend a little further into the block.
|
||||
* Used by jars and alembics that have smaller than normal hitboxes
|
||||
* @return
|
||||
*/
|
||||
boolean renderExtendedTube();
|
||||
|
||||
|
||||
|
||||
}
|
||||
|
95
src/api/java/thaumcraft/api/crafting/CrucibleRecipe.java
Normal file
95
src/api/java/thaumcraft/api/crafting/CrucibleRecipe.java
Normal file
|
@ -0,0 +1,95 @@
|
|||
package thaumcraft.api.crafting;
|
||||
|
||||
import java.util.ArrayList;
|
||||
|
||||
import net.minecraft.item.ItemStack;
|
||||
import net.minecraftforge.oredict.OreDictionary;
|
||||
import thaumcraft.api.ThaumcraftApiHelper;
|
||||
import thaumcraft.api.aspects.Aspect;
|
||||
import thaumcraft.api.aspects.AspectList;
|
||||
|
||||
public class CrucibleRecipe {
|
||||
|
||||
private ItemStack recipeOutput;
|
||||
|
||||
|
||||
public Object catalyst;
|
||||
public AspectList aspects;
|
||||
public String key;
|
||||
|
||||
public CrucibleRecipe(String researchKey, ItemStack result, Object cat, AspectList tags) {
|
||||
recipeOutput = result;
|
||||
this.aspects = tags;
|
||||
this.key = researchKey;
|
||||
this.catalyst = cat;
|
||||
if (cat instanceof String) {
|
||||
this.catalyst = OreDictionary.getOres((String) cat);
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
public boolean matches(AspectList itags, ItemStack cat) {
|
||||
if (catalyst instanceof ItemStack &&
|
||||
!ThaumcraftApiHelper.itemMatches((ItemStack) catalyst,cat,false)) {
|
||||
return false;
|
||||
} else
|
||||
if (catalyst instanceof ArrayList && ((ArrayList<ItemStack>)catalyst).size()>0) {
|
||||
ItemStack[] ores = ((ArrayList<ItemStack>)catalyst).toArray(new ItemStack[]{});
|
||||
if (!ThaumcraftApiHelper.containsMatch(false, new ItemStack[]{cat},ores)) return false;
|
||||
}
|
||||
if (itags==null) return false;
|
||||
for (Aspect tag:aspects.getAspects()) {
|
||||
if (itags.getAmount(tag)<aspects.getAmount(tag)) return false;
|
||||
}
|
||||
return true;
|
||||
}
|
||||
|
||||
public boolean catalystMatches(ItemStack cat) {
|
||||
if (catalyst instanceof ItemStack && ThaumcraftApiHelper.itemMatches((ItemStack) catalyst,cat,false)) {
|
||||
return true;
|
||||
} else
|
||||
if (catalyst instanceof ArrayList && ((ArrayList<ItemStack>)catalyst).size()>0) {
|
||||
ItemStack[] ores = ((ArrayList<ItemStack>)catalyst).toArray(new ItemStack[]{});
|
||||
if (ThaumcraftApiHelper.containsMatch(false, new ItemStack[]{cat},ores)) return true;
|
||||
}
|
||||
return false;
|
||||
}
|
||||
|
||||
public AspectList removeMatching(AspectList itags) {
|
||||
AspectList temptags = new AspectList();
|
||||
temptags.aspects.putAll(itags.aspects);
|
||||
|
||||
for (Aspect tag:aspects.getAspects()) {
|
||||
temptags.remove(tag, aspects.getAmount(tag));
|
||||
// if (!temptags.remove(tag, aspects.getAmount(tag))) return null;
|
||||
}
|
||||
|
||||
itags = temptags;
|
||||
return itags;
|
||||
}
|
||||
|
||||
public ItemStack getRecipeOutput() {
|
||||
return recipeOutput;
|
||||
}
|
||||
|
||||
|
||||
// @Override
|
||||
// public int hashCode() {
|
||||
// String hash = "";
|
||||
// if (catalyst instanceof ItemStack) {
|
||||
// hash += ((ItemStack)catalyst).toString();
|
||||
// } else if (catalyst instanceof ArrayList && ((ArrayList<ItemStack>)catalyst).size()>0) {
|
||||
// for (ItemStack s:(ArrayList<ItemStack>)catalyst) {
|
||||
// hash += s.toString();
|
||||
// }
|
||||
// } else {
|
||||
// hash += catalyst.hashCode();
|
||||
// }
|
||||
// hash += getRecipeOutput().toString();
|
||||
// for (Aspect a:aspects.getAspectsSorted()) {
|
||||
// hash += a.getTag() + aspects.getAmount(a);
|
||||
// }
|
||||
// return hash.hashCode();
|
||||
// }
|
||||
|
||||
}
|
35
src/api/java/thaumcraft/api/crafting/IArcaneRecipe.java
Normal file
35
src/api/java/thaumcraft/api/crafting/IArcaneRecipe.java
Normal file
|
@ -0,0 +1,35 @@
|
|||
package thaumcraft.api.crafting;
|
||||
|
||||
import net.minecraft.entity.player.EntityPlayer;
|
||||
import net.minecraft.inventory.IInventory;
|
||||
import net.minecraft.item.ItemStack;
|
||||
import net.minecraft.world.World;
|
||||
import thaumcraft.api.aspects.AspectList;
|
||||
|
||||
public interface IArcaneRecipe
|
||||
{
|
||||
|
||||
|
||||
/**
|
||||
* Used to check if a recipe matches current crafting inventory
|
||||
* @param player
|
||||
*/
|
||||
boolean matches(IInventory var1, World world, EntityPlayer player);
|
||||
|
||||
/**
|
||||
* Returns an Item that is the result of this recipe
|
||||
*/
|
||||
ItemStack getCraftingResult(IInventory var1);
|
||||
|
||||
/**
|
||||
* Returns the size of the recipe area
|
||||
*/
|
||||
int getRecipeSize();
|
||||
|
||||
ItemStack getRecipeOutput();
|
||||
AspectList getAspects();
|
||||
AspectList getAspects(IInventory var1);
|
||||
String getResearch();
|
||||
|
||||
|
||||
}
|
|
@ -0,0 +1,19 @@
|
|||
package thaumcraft.api.crafting;
|
||||
|
||||
import net.minecraft.world.World;
|
||||
|
||||
/**
|
||||
*
|
||||
* @author Azanor
|
||||
*
|
||||
* Blocks that implement this interface act as infusion crafting stabilisers like candles and skulls
|
||||
*
|
||||
*/
|
||||
public interface IInfusionStabiliser {
|
||||
|
||||
/**
|
||||
* returns true if the block can stabilise things
|
||||
*/
|
||||
public boolean canStabaliseInfusion(World world, int x, int y, int z);
|
||||
|
||||
}
|
|
@ -0,0 +1,156 @@
|
|||
package thaumcraft.api.crafting;
|
||||
|
||||
import java.util.ArrayList;
|
||||
import java.util.Iterator;
|
||||
import java.util.Map;
|
||||
|
||||
import net.minecraft.enchantment.Enchantment;
|
||||
import net.minecraft.enchantment.EnchantmentHelper;
|
||||
import net.minecraft.entity.player.EntityPlayer;
|
||||
import net.minecraft.item.ItemStack;
|
||||
import net.minecraft.world.World;
|
||||
import net.minecraftforge.oredict.OreDictionary;
|
||||
import thaumcraft.api.ThaumcraftApiHelper;
|
||||
import thaumcraft.api.aspects.AspectList;
|
||||
|
||||
public class InfusionEnchantmentRecipe
|
||||
{
|
||||
|
||||
public AspectList aspects;
|
||||
public String research;
|
||||
public ItemStack[] components;
|
||||
public Enchantment enchantment;
|
||||
public int recipeXP;
|
||||
public int instability;
|
||||
|
||||
public InfusionEnchantmentRecipe(String research, Enchantment input, int inst,
|
||||
AspectList aspects2, ItemStack[] recipe) {
|
||||
this.research = research;
|
||||
this.enchantment = input;
|
||||
this.aspects = aspects2;
|
||||
this.components = recipe;
|
||||
this.instability = inst;
|
||||
this.recipeXP = Math.max(1, input.getMinEnchantability(1)/3);
|
||||
}
|
||||
|
||||
/**
|
||||
* Used to check if a recipe matches current crafting inventory
|
||||
* @param player
|
||||
*/
|
||||
public boolean matches(ArrayList<ItemStack> input, ItemStack central, World world, EntityPlayer player) {
|
||||
if (research.length()>0 && !ThaumcraftApiHelper.isResearchComplete(player.getCommandSenderName(), research)) {
|
||||
return false;
|
||||
}
|
||||
|
||||
if (!enchantment.canApply(central) || !central.getItem().isItemTool(central)) {
|
||||
return false;
|
||||
}
|
||||
|
||||
Map map1 = EnchantmentHelper.getEnchantments(central);
|
||||
Iterator iterator = map1.keySet().iterator();
|
||||
while (iterator.hasNext())
|
||||
{
|
||||
int j1 = ((Integer)iterator.next()).intValue();
|
||||
Enchantment ench = Enchantment.enchantmentsList[j1];
|
||||
if (j1 == enchantment.effectId &&
|
||||
EnchantmentHelper.getEnchantmentLevel(j1, central)>=ench.getMaxLevel())
|
||||
return false;
|
||||
if (enchantment.effectId != ench.effectId &&
|
||||
(!enchantment.canApplyTogether(ench) ||
|
||||
!ench.canApplyTogether(enchantment))) {
|
||||
return false;
|
||||
}
|
||||
}
|
||||
|
||||
ItemStack i2 = null;
|
||||
|
||||
ArrayList<ItemStack> ii = new ArrayList<ItemStack>();
|
||||
for (ItemStack is:input) {
|
||||
ii.add(is.copy());
|
||||
}
|
||||
|
||||
for (ItemStack comp:components) {
|
||||
boolean b=false;
|
||||
for (int a=0;a<ii.size();a++) {
|
||||
i2 = ii.get(a).copy();
|
||||
if (comp.getItemDamage()==OreDictionary.WILDCARD_VALUE) {
|
||||
i2.setItemDamage(OreDictionary.WILDCARD_VALUE);
|
||||
}
|
||||
if (areItemStacksEqual(i2, comp,true)) {
|
||||
ii.remove(a);
|
||||
b=true;
|
||||
break;
|
||||
}
|
||||
}
|
||||
if (!b) return false;
|
||||
}
|
||||
// System.out.println(ii.size());
|
||||
return ii.size()==0?true:false;
|
||||
}
|
||||
|
||||
private boolean areItemStacksEqual(ItemStack stack0, ItemStack stack1, boolean fuzzy)
|
||||
{
|
||||
if (stack0==null && stack1!=null) return false;
|
||||
if (stack0!=null && stack1==null) return false;
|
||||
if (stack0==null && stack1==null) return true;
|
||||
boolean t1=false;
|
||||
if (fuzzy) {
|
||||
t1=true;
|
||||
int od = OreDictionary.getOreID(stack0);
|
||||
if (od!=-1) {
|
||||
ItemStack[] ores = OreDictionary.getOres(od).toArray(new ItemStack[]{});
|
||||
if (ThaumcraftApiHelper.containsMatch(false, new ItemStack[]{stack1}, ores))
|
||||
return true;
|
||||
}
|
||||
}
|
||||
else
|
||||
t1=ItemStack.areItemStackTagsEqual(stack0, stack1);
|
||||
return stack0.getItem() != stack1.getItem() ? false : (stack0.getItemDamage() != stack1.getItemDamage() ? false : (stack0.stackSize > stack0.getMaxStackSize() ? false : t1));
|
||||
}
|
||||
|
||||
|
||||
public Enchantment getEnchantment() {
|
||||
return enchantment;
|
||||
|
||||
}
|
||||
|
||||
public AspectList getAspects() {
|
||||
return aspects;
|
||||
|
||||
}
|
||||
|
||||
public String getResearch() {
|
||||
return research;
|
||||
|
||||
}
|
||||
|
||||
public int calcInstability(ItemStack recipeInput) {
|
||||
int i = 0;
|
||||
Map map1 = EnchantmentHelper.getEnchantments(recipeInput);
|
||||
Iterator iterator = map1.keySet().iterator();
|
||||
while (iterator.hasNext())
|
||||
{
|
||||
int j1 = ((Integer)iterator.next()).intValue();
|
||||
i += EnchantmentHelper.getEnchantmentLevel(j1, recipeInput);
|
||||
}
|
||||
return (i/2) + instability;
|
||||
}
|
||||
|
||||
public int calcXP(ItemStack recipeInput) {
|
||||
return recipeXP * (1+EnchantmentHelper.getEnchantmentLevel(enchantment.effectId, recipeInput));
|
||||
}
|
||||
|
||||
public float getEssentiaMod(ItemStack recipeInput) {
|
||||
float mod = EnchantmentHelper.getEnchantmentLevel(enchantment.effectId, recipeInput);
|
||||
Map map1 = EnchantmentHelper.getEnchantments(recipeInput);
|
||||
Iterator iterator = map1.keySet().iterator();
|
||||
while (iterator.hasNext())
|
||||
{
|
||||
int j1 = ((Integer)iterator.next()).intValue();
|
||||
if (j1 != enchantment.effectId)
|
||||
mod += EnchantmentHelper.getEnchantmentLevel(j1, recipeInput) * .1f;
|
||||
}
|
||||
return mod;
|
||||
}
|
||||
|
||||
}
|
128
src/api/java/thaumcraft/api/crafting/InfusionRecipe.java
Normal file
128
src/api/java/thaumcraft/api/crafting/InfusionRecipe.java
Normal file
|
@ -0,0 +1,128 @@
|
|||
package thaumcraft.api.crafting;
|
||||
|
||||
import java.util.ArrayList;
|
||||
|
||||
import net.minecraft.entity.player.EntityPlayer;
|
||||
import net.minecraft.item.ItemStack;
|
||||
import net.minecraft.world.World;
|
||||
import net.minecraftforge.oredict.OreDictionary;
|
||||
import thaumcraft.api.ThaumcraftApiHelper;
|
||||
import thaumcraft.api.aspects.AspectList;
|
||||
|
||||
public class InfusionRecipe
|
||||
{
|
||||
protected AspectList aspects;
|
||||
protected String research;
|
||||
private ItemStack[] components;
|
||||
private ItemStack recipeInput;
|
||||
protected Object recipeOutput;
|
||||
protected int instability;
|
||||
|
||||
public InfusionRecipe(String research, Object output, int inst,
|
||||
AspectList aspects2, ItemStack input, ItemStack[] recipe) {
|
||||
this.research = research;
|
||||
this.recipeOutput = output;
|
||||
this.recipeInput = input;
|
||||
this.aspects = aspects2;
|
||||
this.components = recipe;
|
||||
this.instability = inst;
|
||||
}
|
||||
|
||||
/**
|
||||
* Used to check if a recipe matches current crafting inventory
|
||||
* @param player
|
||||
*/
|
||||
public boolean matches(ArrayList<ItemStack> input, ItemStack central, World world, EntityPlayer player) {
|
||||
if (getRecipeInput()==null) return false;
|
||||
|
||||
if (research.length()>0 && !ThaumcraftApiHelper.isResearchComplete(player.getCommandSenderName(), research)) {
|
||||
return false;
|
||||
}
|
||||
|
||||
ItemStack i2 = central.copy();
|
||||
if (getRecipeInput().getItemDamage()==OreDictionary.WILDCARD_VALUE) {
|
||||
i2.setItemDamage(OreDictionary.WILDCARD_VALUE);
|
||||
}
|
||||
|
||||
if (!areItemStacksEqual(i2, getRecipeInput(), true)) return false;
|
||||
|
||||
ArrayList<ItemStack> ii = new ArrayList<ItemStack>();
|
||||
for (ItemStack is:input) {
|
||||
ii.add(is.copy());
|
||||
}
|
||||
|
||||
for (ItemStack comp:getComponents()) {
|
||||
boolean b=false;
|
||||
for (int a=0;a<ii.size();a++) {
|
||||
i2 = ii.get(a).copy();
|
||||
if (comp.getItemDamage()==OreDictionary.WILDCARD_VALUE) {
|
||||
i2.setItemDamage(OreDictionary.WILDCARD_VALUE);
|
||||
}
|
||||
if (areItemStacksEqual(i2, comp,true)) {
|
||||
ii.remove(a);
|
||||
b=true;
|
||||
break;
|
||||
}
|
||||
}
|
||||
if (!b) return false;
|
||||
}
|
||||
return ii.size()==0?true:false;
|
||||
}
|
||||
|
||||
protected boolean areItemStacksEqual(ItemStack stack0, ItemStack stack1, boolean fuzzy)
|
||||
{
|
||||
if (stack0==null && stack1!=null) return false;
|
||||
if (stack0!=null && stack1==null) return false;
|
||||
if (stack0==null && stack1==null) return true;
|
||||
boolean t1=false;
|
||||
if (fuzzy) {
|
||||
t1=true;
|
||||
int od = OreDictionary.getOreID(stack0);
|
||||
if (od!=-1) {
|
||||
ItemStack[] ores = OreDictionary.getOres(od).toArray(new ItemStack[]{});
|
||||
if (ThaumcraftApiHelper.containsMatch(false, new ItemStack[]{stack1}, ores))
|
||||
return true;
|
||||
}
|
||||
}
|
||||
else
|
||||
t1=ItemStack.areItemStackTagsEqual(stack0, stack1);
|
||||
return stack0.getItem() != stack1.getItem() ? false : (stack0.getItemDamage() != stack1.getItemDamage() ? false : (stack0.stackSize > stack0.getMaxStackSize() ? false : t1));
|
||||
}
|
||||
|
||||
|
||||
public Object getRecipeOutput() {
|
||||
return getRecipeOutput(this.getRecipeInput());
|
||||
}
|
||||
|
||||
public AspectList getAspects() {
|
||||
return getAspects(this.getRecipeInput());
|
||||
}
|
||||
|
||||
public int getInstability() {
|
||||
return getInstability(this.getRecipeInput());
|
||||
}
|
||||
|
||||
public String getResearch() {
|
||||
return research;
|
||||
}
|
||||
|
||||
public ItemStack getRecipeInput() {
|
||||
return recipeInput;
|
||||
}
|
||||
|
||||
public ItemStack[] getComponents() {
|
||||
return components;
|
||||
}
|
||||
|
||||
public Object getRecipeOutput(ItemStack input) {
|
||||
return recipeOutput;
|
||||
}
|
||||
|
||||
public AspectList getAspects(ItemStack input) {
|
||||
return aspects;
|
||||
}
|
||||
|
||||
public int getInstability(ItemStack input) {
|
||||
return instability;
|
||||
}
|
||||
}
|
261
src/api/java/thaumcraft/api/crafting/ShapedArcaneRecipe.java
Normal file
261
src/api/java/thaumcraft/api/crafting/ShapedArcaneRecipe.java
Normal file
|
@ -0,0 +1,261 @@
|
|||
package thaumcraft.api.crafting;
|
||||
|
||||
import java.util.ArrayList;
|
||||
import java.util.HashMap;
|
||||
|
||||
import net.minecraft.block.Block;
|
||||
import net.minecraft.entity.player.EntityPlayer;
|
||||
import net.minecraft.inventory.IInventory;
|
||||
import net.minecraft.item.Item;
|
||||
import net.minecraft.item.ItemStack;
|
||||
import net.minecraft.world.World;
|
||||
import net.minecraftforge.oredict.OreDictionary;
|
||||
import thaumcraft.api.ThaumcraftApiHelper;
|
||||
import thaumcraft.api.aspects.AspectList;
|
||||
|
||||
public class ShapedArcaneRecipe implements IArcaneRecipe
|
||||
{
|
||||
//Added in for future ease of change, but hard coded for now.
|
||||
private static final int MAX_CRAFT_GRID_WIDTH = 3;
|
||||
private static final int MAX_CRAFT_GRID_HEIGHT = 3;
|
||||
|
||||
public ItemStack output = null;
|
||||
public Object[] input = null;
|
||||
public AspectList aspects = null;
|
||||
public String research;
|
||||
public int width = 0;
|
||||
public int height = 0;
|
||||
private boolean mirrored = true;
|
||||
|
||||
public ShapedArcaneRecipe(String research, Block result, AspectList aspects, Object... recipe){ this(research, new ItemStack(result), aspects, recipe); }
|
||||
public ShapedArcaneRecipe(String research, Item result, AspectList aspects, Object... recipe){ this(research, new ItemStack(result), aspects, recipe); }
|
||||
public ShapedArcaneRecipe(String research, ItemStack result, AspectList aspects, Object... recipe)
|
||||
{
|
||||
output = result.copy();
|
||||
this.research = research;
|
||||
this.aspects = aspects;
|
||||
String shape = "";
|
||||
|
||||
int idx = 0;
|
||||
|
||||
if (recipe[idx] instanceof Boolean)
|
||||
{
|
||||
mirrored = (Boolean)recipe[idx];
|
||||
if (recipe[idx+1] instanceof Object[])
|
||||
{
|
||||
recipe = (Object[])recipe[idx+1];
|
||||
}
|
||||
else
|
||||
{
|
||||
idx = 1;
|
||||
}
|
||||
}
|
||||
|
||||
if (recipe[idx] instanceof String[])
|
||||
{
|
||||
String[] parts = ((String[])recipe[idx++]);
|
||||
|
||||
for (String s : parts)
|
||||
{
|
||||
width = s.length();
|
||||
shape += s;
|
||||
}
|
||||
|
||||
height = parts.length;
|
||||
}
|
||||
else
|
||||
{
|
||||
while (recipe[idx] instanceof String)
|
||||
{
|
||||
String s = (String)recipe[idx++];
|
||||
shape += s;
|
||||
width = s.length();
|
||||
height++;
|
||||
}
|
||||
}
|
||||
|
||||
if (width * height != shape.length())
|
||||
{
|
||||
String ret = "Invalid shaped ore recipe: ";
|
||||
for (Object tmp : recipe)
|
||||
{
|
||||
ret += tmp + ", ";
|
||||
}
|
||||
ret += output;
|
||||
throw new RuntimeException(ret);
|
||||
}
|
||||
|
||||
HashMap<Character, Object> itemMap = new HashMap<Character, Object>();
|
||||
|
||||
for (; idx < recipe.length; idx += 2)
|
||||
{
|
||||
Character chr = (Character)recipe[idx];
|
||||
Object in = recipe[idx + 1];
|
||||
|
||||
if (in instanceof ItemStack)
|
||||
{
|
||||
itemMap.put(chr, ((ItemStack)in).copy());
|
||||
}
|
||||
else if (in instanceof Item)
|
||||
{
|
||||
itemMap.put(chr, new ItemStack((Item)in));
|
||||
}
|
||||
else if (in instanceof Block)
|
||||
{
|
||||
itemMap.put(chr, new ItemStack((Block)in, 1, OreDictionary.WILDCARD_VALUE));
|
||||
}
|
||||
else if (in instanceof String)
|
||||
{
|
||||
itemMap.put(chr, OreDictionary.getOres((String)in));
|
||||
}
|
||||
else
|
||||
{
|
||||
String ret = "Invalid shaped ore recipe: ";
|
||||
for (Object tmp : recipe)
|
||||
{
|
||||
ret += tmp + ", ";
|
||||
}
|
||||
ret += output;
|
||||
throw new RuntimeException(ret);
|
||||
}
|
||||
}
|
||||
|
||||
input = new Object[width * height];
|
||||
int x = 0;
|
||||
for (char chr : shape.toCharArray())
|
||||
{
|
||||
input[x++] = itemMap.get(chr);
|
||||
}
|
||||
}
|
||||
|
||||
@Override
|
||||
public ItemStack getCraftingResult(IInventory var1){ return output.copy(); }
|
||||
|
||||
@Override
|
||||
public int getRecipeSize(){ return input.length; }
|
||||
|
||||
@Override
|
||||
public ItemStack getRecipeOutput(){ return output; }
|
||||
|
||||
@Override
|
||||
public boolean matches(IInventory inv, World world, EntityPlayer player)
|
||||
{
|
||||
if (research.length()>0 && !ThaumcraftApiHelper.isResearchComplete(player.getCommandSenderName(), research)) {
|
||||
return false;
|
||||
}
|
||||
for (int x = 0; x <= MAX_CRAFT_GRID_WIDTH - width; x++)
|
||||
{
|
||||
for (int y = 0; y <= MAX_CRAFT_GRID_HEIGHT - height; ++y)
|
||||
{
|
||||
if (checkMatch(inv, x, y, false))
|
||||
{
|
||||
return true;
|
||||
}
|
||||
|
||||
if (mirrored && checkMatch(inv, x, y, true))
|
||||
{
|
||||
return true;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
return false;
|
||||
}
|
||||
|
||||
private boolean checkMatch(IInventory inv, int startX, int startY, boolean mirror)
|
||||
{
|
||||
for (int x = 0; x < MAX_CRAFT_GRID_WIDTH; x++)
|
||||
{
|
||||
for (int y = 0; y < MAX_CRAFT_GRID_HEIGHT; y++)
|
||||
{
|
||||
int subX = x - startX;
|
||||
int subY = y - startY;
|
||||
Object target = null;
|
||||
|
||||
if (subX >= 0 && subY >= 0 && subX < width && subY < height)
|
||||
{
|
||||
if (mirror)
|
||||
{
|
||||
target = input[width - subX - 1 + subY * width];
|
||||
}
|
||||
else
|
||||
{
|
||||
target = input[subX + subY * width];
|
||||
}
|
||||
}
|
||||
|
||||
ItemStack slot = ThaumcraftApiHelper.getStackInRowAndColumn(inv, x, y);
|
||||
|
||||
if (target instanceof ItemStack)
|
||||
{
|
||||
if (!checkItemEquals((ItemStack)target, slot))
|
||||
{
|
||||
return false;
|
||||
}
|
||||
}
|
||||
else if (target instanceof ArrayList)
|
||||
{
|
||||
boolean matched = false;
|
||||
|
||||
for (ItemStack item : (ArrayList<ItemStack>)target)
|
||||
{
|
||||
matched = matched || checkItemEquals(item, slot);
|
||||
}
|
||||
|
||||
if (!matched)
|
||||
{
|
||||
return false;
|
||||
}
|
||||
}
|
||||
else if (target == null && slot != null)
|
||||
{
|
||||
return false;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
private boolean checkItemEquals(ItemStack target, ItemStack input)
|
||||
{
|
||||
if (input == null && target != null || input != null && target == null)
|
||||
{
|
||||
return false;
|
||||
}
|
||||
return (target.getItem() == input.getItem() &&
|
||||
(!target.hasTagCompound() || ItemStack.areItemStackTagsEqual(target, input)) &&
|
||||
(target.getItemDamage() == OreDictionary.WILDCARD_VALUE|| target.getItemDamage() == input.getItemDamage()));
|
||||
}
|
||||
|
||||
public ShapedArcaneRecipe setMirrored(boolean mirror)
|
||||
{
|
||||
mirrored = mirror;
|
||||
return this;
|
||||
}
|
||||
|
||||
/**
|
||||
* Returns the input for this recipe, any mod accessing this value should never
|
||||
* manipulate the values in this array as it will effect the recipe itself.
|
||||
* @return The recipes input vales.
|
||||
*/
|
||||
public Object[] getInput()
|
||||
{
|
||||
return this.input;
|
||||
}
|
||||
|
||||
@Override
|
||||
public AspectList getAspects() {
|
||||
return aspects;
|
||||
}
|
||||
|
||||
@Override
|
||||
public AspectList getAspects(IInventory inv) {
|
||||
return aspects;
|
||||
}
|
||||
|
||||
@Override
|
||||
public String getResearch() {
|
||||
return research;
|
||||
}
|
||||
}
|
157
src/api/java/thaumcraft/api/crafting/ShapelessArcaneRecipe.java
Normal file
157
src/api/java/thaumcraft/api/crafting/ShapelessArcaneRecipe.java
Normal file
|
@ -0,0 +1,157 @@
|
|||
package thaumcraft.api.crafting;
|
||||
|
||||
import java.util.ArrayList;
|
||||
import java.util.Iterator;
|
||||
|
||||
import net.minecraft.block.Block;
|
||||
import net.minecraft.entity.player.EntityPlayer;
|
||||
import net.minecraft.inventory.IInventory;
|
||||
import net.minecraft.item.Item;
|
||||
import net.minecraft.item.ItemStack;
|
||||
import net.minecraft.world.World;
|
||||
import net.minecraftforge.oredict.OreDictionary;
|
||||
import thaumcraft.api.ThaumcraftApiHelper;
|
||||
import thaumcraft.api.aspects.AspectList;
|
||||
|
||||
public class ShapelessArcaneRecipe implements IArcaneRecipe
|
||||
{
|
||||
private ItemStack output = null;
|
||||
private ArrayList input = new ArrayList();
|
||||
|
||||
public AspectList aspects = null;
|
||||
public String research;
|
||||
|
||||
public ShapelessArcaneRecipe(String research, Block result, AspectList aspects, Object... recipe){ this(research,new ItemStack(result),aspects, recipe); }
|
||||
public ShapelessArcaneRecipe(String research, Item result, AspectList aspects, Object... recipe){ this(research,new ItemStack(result),aspects, recipe); }
|
||||
|
||||
public ShapelessArcaneRecipe(String research, ItemStack result, AspectList aspects, Object... recipe)
|
||||
{
|
||||
output = result.copy();
|
||||
this.research = research;
|
||||
this.aspects = aspects;
|
||||
for (Object in : recipe)
|
||||
{
|
||||
if (in instanceof ItemStack)
|
||||
{
|
||||
input.add(((ItemStack)in).copy());
|
||||
}
|
||||
else if (in instanceof Item)
|
||||
{
|
||||
input.add(new ItemStack((Item)in));
|
||||
}
|
||||
else if (in instanceof Block)
|
||||
{
|
||||
input.add(new ItemStack((Block)in));
|
||||
}
|
||||
else if (in instanceof String)
|
||||
{
|
||||
input.add(OreDictionary.getOres((String)in));
|
||||
}
|
||||
else
|
||||
{
|
||||
String ret = "Invalid shapeless ore recipe: ";
|
||||
for (Object tmp : recipe)
|
||||
{
|
||||
ret += tmp + ", ";
|
||||
}
|
||||
ret += output;
|
||||
throw new RuntimeException(ret);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@Override
|
||||
public int getRecipeSize(){ return input.size(); }
|
||||
|
||||
@Override
|
||||
public ItemStack getRecipeOutput(){ return output; }
|
||||
|
||||
@Override
|
||||
public ItemStack getCraftingResult(IInventory var1){ return output.copy(); }
|
||||
|
||||
@Override
|
||||
public boolean matches(IInventory var1, World world, EntityPlayer player)
|
||||
{
|
||||
if (research.length()>0 && !ThaumcraftApiHelper.isResearchComplete(player.getCommandSenderName(), research)) {
|
||||
return false;
|
||||
}
|
||||
|
||||
ArrayList required = new ArrayList(input);
|
||||
|
||||
for (int x = 0; x < 9; x++)
|
||||
{
|
||||
ItemStack slot = var1.getStackInSlot(x);
|
||||
|
||||
if (slot != null)
|
||||
{
|
||||
boolean inRecipe = false;
|
||||
Iterator req = required.iterator();
|
||||
|
||||
while (req.hasNext())
|
||||
{
|
||||
boolean match = false;
|
||||
|
||||
Object next = req.next();
|
||||
|
||||
if (next instanceof ItemStack)
|
||||
{
|
||||
match = checkItemEquals((ItemStack)next, slot);
|
||||
}
|
||||
else if (next instanceof ArrayList)
|
||||
{
|
||||
for (ItemStack item : (ArrayList<ItemStack>)next)
|
||||
{
|
||||
match = match || checkItemEquals(item, slot);
|
||||
}
|
||||
}
|
||||
|
||||
if (match)
|
||||
{
|
||||
inRecipe = true;
|
||||
required.remove(next);
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
if (!inRecipe)
|
||||
{
|
||||
return false;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
return required.isEmpty();
|
||||
}
|
||||
|
||||
private boolean checkItemEquals(ItemStack target, ItemStack input)
|
||||
{
|
||||
return (target.getItem() == input.getItem() &&
|
||||
(!target.hasTagCompound() || ItemStack.areItemStackTagsEqual(target, input)) &&
|
||||
(target.getItemDamage() == OreDictionary.WILDCARD_VALUE || target.getItemDamage() == input.getItemDamage()));
|
||||
}
|
||||
|
||||
/**
|
||||
* Returns the input for this recipe, any mod accessing this value should never
|
||||
* manipulate the values in this array as it will effect the recipe itself.
|
||||
* @return The recipes input vales.
|
||||
*/
|
||||
public ArrayList getInput()
|
||||
{
|
||||
return this.input;
|
||||
}
|
||||
|
||||
@Override
|
||||
public AspectList getAspects() {
|
||||
return aspects;
|
||||
}
|
||||
|
||||
@Override
|
||||
public AspectList getAspects(IInventory inv) {
|
||||
return aspects;
|
||||
}
|
||||
|
||||
@Override
|
||||
public String getResearch() {
|
||||
return research;
|
||||
}
|
||||
}
|
|
@ -0,0 +1,32 @@
|
|||
package thaumcraft.api.damagesource;
|
||||
|
||||
import net.minecraft.entity.Entity;
|
||||
import net.minecraft.util.DamageSource;
|
||||
import net.minecraft.util.EntityDamageSourceIndirect;
|
||||
|
||||
public class DamageSourceIndirectThaumcraftEntity extends EntityDamageSourceIndirect {
|
||||
|
||||
private boolean fireDamage;
|
||||
private float hungerDamage;
|
||||
private boolean isUnblockable;
|
||||
|
||||
|
||||
public DamageSourceIndirectThaumcraftEntity(String par1Str,
|
||||
Entity par2Entity, Entity par3Entity) {
|
||||
super(par1Str, par2Entity, par3Entity);
|
||||
}
|
||||
|
||||
|
||||
public DamageSource setFireDamage()
|
||||
{
|
||||
this.fireDamage = true;
|
||||
return this;
|
||||
}
|
||||
|
||||
public DamageSource setDamageBypassesArmor()
|
||||
{
|
||||
this.isUnblockable = true;
|
||||
this.hungerDamage = 0.0F;
|
||||
return this;
|
||||
}
|
||||
}
|
|
@ -0,0 +1,46 @@
|
|||
package thaumcraft.api.damagesource;
|
||||
|
||||
import net.minecraft.entity.EntityLivingBase;
|
||||
import net.minecraft.util.DamageSource;
|
||||
import net.minecraft.util.EntityDamageSource;
|
||||
|
||||
public class DamageSourceThaumcraft extends DamageSource
|
||||
{
|
||||
|
||||
public static DamageSource taint = new DamageSourceThaumcraft("taint").setDamageBypassesArmor().setMagicDamage();
|
||||
public static DamageSource tentacle = new DamageSourceThaumcraft("tentacle");
|
||||
public static DamageSource swarm = new DamageSourceThaumcraft("swarm");
|
||||
|
||||
protected DamageSourceThaumcraft(String par1Str) {
|
||||
super(par1Str);
|
||||
}
|
||||
|
||||
/** This kind of damage can be blocked or not. */
|
||||
private boolean isUnblockable = false;
|
||||
private boolean isDamageAllowedInCreativeMode = false;
|
||||
private float hungerDamage = 0.3F;
|
||||
|
||||
/** This kind of damage is based on fire or not. */
|
||||
private boolean fireDamage;
|
||||
|
||||
/** This kind of damage is based on a projectile or not. */
|
||||
private boolean projectile;
|
||||
|
||||
/**
|
||||
* Whether this damage source will have its damage amount scaled based on the current difficulty.
|
||||
*/
|
||||
private boolean difficultyScaled;
|
||||
private boolean magicDamage = false;
|
||||
private boolean explosion = false;
|
||||
|
||||
public static DamageSource causeSwarmDamage(EntityLivingBase par0EntityLiving)
|
||||
{
|
||||
return new EntityDamageSource("swarm", par0EntityLiving);
|
||||
}
|
||||
|
||||
public static DamageSource causeTentacleDamage(EntityLivingBase par0EntityLiving)
|
||||
{
|
||||
return new EntityDamageSource("tentacle", par0EntityLiving);
|
||||
}
|
||||
|
||||
}
|
5
src/api/java/thaumcraft/api/entities/ITaintedMob.java
Normal file
5
src/api/java/thaumcraft/api/entities/ITaintedMob.java
Normal file
|
@ -0,0 +1,5 @@
|
|||
package thaumcraft.api.entities;
|
||||
|
||||
public interface ITaintedMob {
|
||||
|
||||
}
|
53
src/api/java/thaumcraft/api/nodes/INode.java
Normal file
53
src/api/java/thaumcraft/api/nodes/INode.java
Normal file
|
@ -0,0 +1,53 @@
|
|||
package thaumcraft.api.nodes;
|
||||
|
||||
import thaumcraft.api.aspects.Aspect;
|
||||
import thaumcraft.api.aspects.AspectList;
|
||||
import thaumcraft.api.aspects.IAspectContainer;
|
||||
|
||||
public interface INode extends IAspectContainer {
|
||||
|
||||
/**
|
||||
* Unique identifier to distinguish nodes. Normal node id's are based on world id and coordinates
|
||||
* @return
|
||||
*/
|
||||
public String getId();
|
||||
|
||||
public AspectList getAspectsBase();
|
||||
|
||||
/**
|
||||
* Return the type of node
|
||||
* @return
|
||||
*/
|
||||
public NodeType getNodeType();
|
||||
|
||||
/**
|
||||
* Set the type of node
|
||||
* @return
|
||||
*/
|
||||
public void setNodeType(NodeType nodeType);
|
||||
|
||||
/**
|
||||
* Return the node modifier
|
||||
* @return
|
||||
*/
|
||||
public void setNodeModifier(NodeModifier nodeModifier);
|
||||
|
||||
/**
|
||||
* Set the node modifier
|
||||
* @return
|
||||
*/
|
||||
public NodeModifier getNodeModifier();
|
||||
|
||||
/**
|
||||
* Return the maximum capacity of each aspect the node can hold
|
||||
* @return
|
||||
*/
|
||||
public int getNodeVisBase(Aspect aspect);
|
||||
|
||||
/**
|
||||
* Set the maximum capacity of each aspect the node can hold
|
||||
* @return
|
||||
*/
|
||||
public void setNodeVisBase(Aspect aspect, short nodeVisBase);
|
||||
|
||||
}
|
22
src/api/java/thaumcraft/api/nodes/IRevealer.java
Normal file
22
src/api/java/thaumcraft/api/nodes/IRevealer.java
Normal file
|
@ -0,0 +1,22 @@
|
|||
package thaumcraft.api.nodes;
|
||||
|
||||
import net.minecraft.entity.EntityLivingBase;
|
||||
import net.minecraft.item.ItemStack;
|
||||
|
||||
/**
|
||||
*
|
||||
* @author Azanor
|
||||
*
|
||||
* Equipped head slot items that extend this class will make nodes visible in world.
|
||||
*
|
||||
*/
|
||||
|
||||
public interface IRevealer {
|
||||
|
||||
/*
|
||||
* If this method returns true the nodes will be visible.
|
||||
*/
|
||||
public boolean showNodes(ItemStack itemstack, EntityLivingBase player);
|
||||
|
||||
|
||||
}
|
6
src/api/java/thaumcraft/api/nodes/NodeModifier.java
Normal file
6
src/api/java/thaumcraft/api/nodes/NodeModifier.java
Normal file
|
@ -0,0 +1,6 @@
|
|||
package thaumcraft.api.nodes;
|
||||
|
||||
public enum NodeModifier
|
||||
{
|
||||
BRIGHT, PALE, FADING
|
||||
}
|
6
src/api/java/thaumcraft/api/nodes/NodeType.java
Normal file
6
src/api/java/thaumcraft/api/nodes/NodeType.java
Normal file
|
@ -0,0 +1,6 @@
|
|||
package thaumcraft.api.nodes;
|
||||
|
||||
public enum NodeType
|
||||
{
|
||||
NORMAL, UNSTABLE, DARK, TAINTED, HUNGRY, PURE
|
||||
}
|
4
src/api/java/thaumcraft/api/package-info.java
Normal file
4
src/api/java/thaumcraft/api/package-info.java
Normal file
|
@ -0,0 +1,4 @@
|
|||
@API(owner = "Thaumcraft", apiVersion = "4.2.0.0", provides = "Thaumcraft|API")
|
||||
package thaumcraft.api;
|
||||
|
||||
import cpw.mods.fml.common.API;
|
67
src/api/java/thaumcraft/api/potions/PotionFluxTaint.java
Normal file
67
src/api/java/thaumcraft/api/potions/PotionFluxTaint.java
Normal file
|
@ -0,0 +1,67 @@
|
|||
package thaumcraft.api.potions;
|
||||
|
||||
import net.minecraft.client.Minecraft;
|
||||
import net.minecraft.entity.EntityLivingBase;
|
||||
import net.minecraft.entity.player.EntityPlayer;
|
||||
import net.minecraft.potion.Potion;
|
||||
import net.minecraft.util.ResourceLocation;
|
||||
import thaumcraft.api.damagesource.DamageSourceThaumcraft;
|
||||
import thaumcraft.api.entities.ITaintedMob;
|
||||
import cpw.mods.fml.relauncher.Side;
|
||||
import cpw.mods.fml.relauncher.SideOnly;
|
||||
|
||||
public class PotionFluxTaint extends Potion
|
||||
{
|
||||
public static PotionFluxTaint instance = null; // will be instantiated at runtime
|
||||
private int statusIconIndex = -1;
|
||||
|
||||
public PotionFluxTaint(int par1, boolean par2, int par3)
|
||||
{
|
||||
super(par1,par2,par3);
|
||||
setIconIndex(0, 0);
|
||||
}
|
||||
|
||||
public static void init()
|
||||
{
|
||||
instance.setPotionName("potion.fluxtaint");
|
||||
instance.setIconIndex(3, 1);
|
||||
instance.setEffectiveness(0.25D);
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean isBadEffect() {
|
||||
return true;
|
||||
}
|
||||
|
||||
@Override
|
||||
@SideOnly(Side.CLIENT)
|
||||
public int getStatusIconIndex() {
|
||||
Minecraft.getMinecraft().renderEngine.bindTexture(rl);
|
||||
return super.getStatusIconIndex();
|
||||
}
|
||||
|
||||
ResourceLocation rl = new ResourceLocation("thaumcraft","textures/misc/potions.png");
|
||||
|
||||
@Override
|
||||
public void performEffect(EntityLivingBase target, int par2) {
|
||||
if (target instanceof ITaintedMob) {
|
||||
target.heal(1);
|
||||
} else
|
||||
if (!target.isEntityUndead() && !(target instanceof EntityPlayer))
|
||||
{
|
||||
target.attackEntityFrom(DamageSourceThaumcraft.taint, 1);
|
||||
}
|
||||
else
|
||||
if (!target.isEntityUndead() && (target.getMaxHealth() > 1 || (target instanceof EntityPlayer)))
|
||||
{
|
||||
target.attackEntityFrom(DamageSourceThaumcraft.taint, 1);
|
||||
}
|
||||
}
|
||||
|
||||
public boolean isReady(int par1, int par2)
|
||||
{
|
||||
int k = 40 >> par2;
|
||||
return k > 0 ? par1 % k == 0 : true;
|
||||
}
|
||||
|
||||
}
|
|
@ -0,0 +1,9 @@
|
|||
package thaumcraft.api.research;
|
||||
|
||||
import net.minecraft.entity.player.EntityPlayer;
|
||||
import net.minecraft.item.ItemStack;
|
||||
import net.minecraft.world.World;
|
||||
|
||||
public interface IScanEventHandler {
|
||||
ScanResult scanPhenomena(ItemStack stack, World world, EntityPlayer player);
|
||||
}
|
101
src/api/java/thaumcraft/api/research/ResearchCategories.java
Normal file
101
src/api/java/thaumcraft/api/research/ResearchCategories.java
Normal file
|
@ -0,0 +1,101 @@
|
|||
package thaumcraft.api.research;
|
||||
|
||||
import java.util.Collection;
|
||||
import java.util.LinkedHashMap;
|
||||
|
||||
import net.minecraft.util.ResourceLocation;
|
||||
import net.minecraft.util.StatCollector;
|
||||
|
||||
import org.apache.logging.log4j.Level;
|
||||
|
||||
import cpw.mods.fml.common.FMLLog;
|
||||
|
||||
public class ResearchCategories {
|
||||
|
||||
//Research
|
||||
public static LinkedHashMap <String, ResearchCategoryList> researchCategories = new LinkedHashMap <String,ResearchCategoryList>();
|
||||
|
||||
/**
|
||||
* @param key
|
||||
* @return the research item linked to this key
|
||||
*/
|
||||
public static ResearchCategoryList getResearchList(String key) {
|
||||
return researchCategories.get(key);
|
||||
}
|
||||
|
||||
/**
|
||||
* @param key
|
||||
* @return the name of the research category linked to this key.
|
||||
* Must be stored as localization information in the LanguageRegistry.
|
||||
*/
|
||||
public static String getCategoryName(String key) {
|
||||
return StatCollector.translateToLocal("tc.research_category."+key);
|
||||
}
|
||||
|
||||
/**
|
||||
* @param key the research key
|
||||
* @return the ResearchItem object.
|
||||
*/
|
||||
public static ResearchItem getResearch(String key) {
|
||||
Collection rc = researchCategories.values();
|
||||
for (Object cat:rc) {
|
||||
Collection rl = ((ResearchCategoryList)cat).research.values();
|
||||
for (Object ri:rl) {
|
||||
if ((((ResearchItem)ri).key).equals(key)) return (ResearchItem)ri;
|
||||
}
|
||||
}
|
||||
return null;
|
||||
}
|
||||
|
||||
/**
|
||||
* This should only be done at the PostInit stage
|
||||
* @param key the key used for this category
|
||||
* @param icon the icon to be used for the research category tab
|
||||
* @param background the resource location of the background image to use for this category
|
||||
* @return the name of the research linked to this key
|
||||
*/
|
||||
public static void registerCategory(String key, ResourceLocation icon, ResourceLocation background) {
|
||||
if (getResearchList(key)==null) {
|
||||
ResearchCategoryList rl = new ResearchCategoryList(icon, background);
|
||||
researchCategories.put(key, rl);
|
||||
}
|
||||
}
|
||||
|
||||
public static void addResearch(ResearchItem ri) {
|
||||
ResearchCategoryList rl = getResearchList(ri.category);
|
||||
if (rl!=null && !rl.research.containsKey(ri.key)) {
|
||||
|
||||
if (!ri.isVirtual()) {
|
||||
for (ResearchItem rr:rl.research.values()) {
|
||||
if (rr.displayColumn == ri.displayColumn && rr.displayRow == ri.displayRow) {
|
||||
FMLLog.log(Level.FATAL, "[Thaumcraft] Research ["+ri.getName()+"] not added as it overlaps with existing research ["+rr.getName()+"]");
|
||||
return;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
rl.research.put(ri.key, ri);
|
||||
|
||||
if (ri.displayColumn < rl.minDisplayColumn)
|
||||
{
|
||||
rl.minDisplayColumn = ri.displayColumn;
|
||||
}
|
||||
|
||||
if (ri.displayRow < rl.minDisplayRow)
|
||||
{
|
||||
rl.minDisplayRow = ri.displayRow;
|
||||
}
|
||||
|
||||
if (ri.displayColumn > rl.maxDisplayColumn)
|
||||
{
|
||||
rl.maxDisplayColumn = ri.displayColumn;
|
||||
}
|
||||
|
||||
if (ri.displayRow > rl.maxDisplayRow)
|
||||
{
|
||||
rl.maxDisplayRow = ri.displayRow;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
|
@ -0,0 +1,37 @@
|
|||
package thaumcraft.api.research;
|
||||
|
||||
import java.util.HashMap;
|
||||
import java.util.Map;
|
||||
|
||||
import net.minecraft.util.ResourceLocation;
|
||||
|
||||
public class ResearchCategoryList {
|
||||
|
||||
/** Is the smallest column used on the GUI. */
|
||||
public int minDisplayColumn;
|
||||
|
||||
/** Is the smallest row used on the GUI. */
|
||||
public int minDisplayRow;
|
||||
|
||||
/** Is the biggest column used on the GUI. */
|
||||
public int maxDisplayColumn;
|
||||
|
||||
/** Is the biggest row used on the GUI. */
|
||||
public int maxDisplayRow;
|
||||
|
||||
/** display variables **/
|
||||
public ResourceLocation icon;
|
||||
public ResourceLocation background;
|
||||
|
||||
public ResearchCategoryList(ResourceLocation icon, ResourceLocation background) {
|
||||
this.icon = icon;
|
||||
this.background = background;
|
||||
}
|
||||
|
||||
//Research
|
||||
public Map<String, ResearchItem> research = new HashMap<String,ResearchItem>();
|
||||
|
||||
|
||||
|
||||
|
||||
}
|
367
src/api/java/thaumcraft/api/research/ResearchItem.java
Normal file
367
src/api/java/thaumcraft/api/research/ResearchItem.java
Normal file
|
@ -0,0 +1,367 @@
|
|||
package thaumcraft.api.research;
|
||||
|
||||
import net.minecraft.item.ItemStack;
|
||||
import net.minecraft.util.ResourceLocation;
|
||||
import net.minecraft.util.StatCollector;
|
||||
import thaumcraft.api.aspects.Aspect;
|
||||
import thaumcraft.api.aspects.AspectList;
|
||||
|
||||
public class ResearchItem
|
||||
{
|
||||
/**
|
||||
* A short string used as a key for this research. Must be unique
|
||||
*/
|
||||
public final String key;
|
||||
|
||||
/**
|
||||
* A short string used as a reference to the research category to which this must be added.
|
||||
*/
|
||||
public final String category;
|
||||
|
||||
/**
|
||||
* The aspect tags and their values required to complete this research
|
||||
*/
|
||||
public final AspectList tags;
|
||||
|
||||
/**
|
||||
* This links to any research that needs to be completed before this research can be discovered or learnt.
|
||||
*/
|
||||
public String[] parents = null;
|
||||
|
||||
/**
|
||||
* Like parent above, but a line will not be displayed in the thaumonomicon linking them. Just used to prevent clutter.
|
||||
*/
|
||||
public String[] parentsHidden = null;
|
||||
/**
|
||||
* any research linked to this that will be unlocked automatically when this research is complete
|
||||
*/
|
||||
public String[] siblings = null;
|
||||
|
||||
/**
|
||||
* the horizontal position of the research icon
|
||||
*/
|
||||
public final int displayColumn;
|
||||
|
||||
/**
|
||||
* the vertical position of the research icon
|
||||
*/
|
||||
public final int displayRow;
|
||||
|
||||
/**
|
||||
* the icon to be used for this research
|
||||
*/
|
||||
public final ItemStack icon_item;
|
||||
|
||||
/**
|
||||
* the icon to be used for this research
|
||||
*/
|
||||
public final ResourceLocation icon_resource;
|
||||
|
||||
/**
|
||||
* How large the research grid is. Valid values are 1 to 3.
|
||||
*/
|
||||
private int complexity;
|
||||
|
||||
/**
|
||||
* Special research has a spiky border. Used for important research milestones.
|
||||
*/
|
||||
private boolean isSpecial;
|
||||
|
||||
/**
|
||||
* Research that can be directly purchased with RP in normal research difficulty.
|
||||
*/
|
||||
private boolean isSecondary;
|
||||
|
||||
/**
|
||||
* This indicates if the research should use a circular icon border. Usually used for "passive" research
|
||||
* that doesn't have recipes and grants passive effects, or that unlock automatically.
|
||||
*/
|
||||
private boolean isRound;
|
||||
|
||||
/**
|
||||
* Stub research cannot be discovered by normal means, but can be unlocked via the sibling system.
|
||||
*/
|
||||
private boolean isStub;
|
||||
|
||||
/**
|
||||
* This indicated that the research is completely hidden and cannot be discovered by any
|
||||
* player-controlled means. The recipes will never show up in the thaumonomicon.
|
||||
* Usually used to unlock "hidden" recipes via sibling unlocking, like
|
||||
* the various cap and rod combos for wands.
|
||||
*/
|
||||
private boolean isVirtual;
|
||||
|
||||
@Deprecated
|
||||
private boolean isLost;
|
||||
|
||||
/**
|
||||
* Concealed research does not display in the thaumonomicon until parent researches are discovered.
|
||||
*/
|
||||
private boolean isConcealed;
|
||||
|
||||
/**
|
||||
* Hidden research can only be discovered via scanning or knowledge fragments
|
||||
*/
|
||||
private boolean isHidden;
|
||||
|
||||
/**
|
||||
* These research items will automatically unlock for all players on game start
|
||||
*/
|
||||
private boolean isAutoUnlock;
|
||||
|
||||
/**
|
||||
* Scanning these items will have a chance of revealing hidden knowledge in the thaumonomicon
|
||||
*/
|
||||
private ItemStack[] itemTriggers;
|
||||
|
||||
/**
|
||||
* Scanning these entities will have a chance of revealing hidden knowledge in the thaumonomicon
|
||||
*/
|
||||
private String[] entityTriggers;
|
||||
|
||||
/**
|
||||
* Scanning things with these aspects will have a chance of revealing hidden knowledge in the thaumonomicon
|
||||
*/
|
||||
private Aspect[] aspectTriggers;
|
||||
|
||||
private ResearchPage[] pages = null;
|
||||
|
||||
public ResearchItem(String key, String category)
|
||||
{
|
||||
this.key = key;
|
||||
this.category = category;
|
||||
this.tags = new AspectList();
|
||||
this.icon_resource = null;
|
||||
this.icon_item = null;
|
||||
this.displayColumn = 0;
|
||||
this.displayRow = 0;
|
||||
this.setVirtual();
|
||||
|
||||
}
|
||||
|
||||
public ResearchItem(String key, String category, AspectList tags, int col, int row, int complex, ResourceLocation icon)
|
||||
{
|
||||
this.key = key;
|
||||
this.category = category;
|
||||
this.tags = tags;
|
||||
this.icon_resource = icon;
|
||||
this.icon_item = null;
|
||||
this.displayColumn = col;
|
||||
this.displayRow = row;
|
||||
this.complexity = complex;
|
||||
if (complexity < 1) this.complexity = 1;
|
||||
if (complexity > 3) this.complexity = 3;
|
||||
}
|
||||
|
||||
public ResearchItem(String key, String category, AspectList tags, int col, int row, int complex, ItemStack icon)
|
||||
{
|
||||
this.key = key;
|
||||
this.category = category;
|
||||
this.tags = tags;
|
||||
this.icon_item = icon;
|
||||
this.icon_resource = null;
|
||||
this.displayColumn = col;
|
||||
this.displayRow = row;
|
||||
this.complexity = complex;
|
||||
if (complexity < 1) this.complexity = 1;
|
||||
if (complexity > 3) this.complexity = 3;
|
||||
}
|
||||
|
||||
public ResearchItem setSpecial()
|
||||
{
|
||||
this.isSpecial = true;
|
||||
return this;
|
||||
}
|
||||
|
||||
public ResearchItem setStub()
|
||||
{
|
||||
this.isStub = true;
|
||||
return this;
|
||||
}
|
||||
|
||||
@Deprecated
|
||||
public ResearchItem setLost()
|
||||
{
|
||||
this.isLost = true;
|
||||
return this;
|
||||
}
|
||||
|
||||
public ResearchItem setConcealed()
|
||||
{
|
||||
this.isConcealed = true;
|
||||
return this;
|
||||
}
|
||||
|
||||
public ResearchItem setHidden()
|
||||
{
|
||||
this.isHidden = true;
|
||||
return this;
|
||||
}
|
||||
|
||||
public ResearchItem setVirtual()
|
||||
{
|
||||
this.isVirtual = true;
|
||||
return this;
|
||||
}
|
||||
|
||||
public ResearchItem setParents(String... par)
|
||||
{
|
||||
this.parents = par;
|
||||
return this;
|
||||
}
|
||||
|
||||
|
||||
|
||||
public ResearchItem setParentsHidden(String... par)
|
||||
{
|
||||
this.parentsHidden = par;
|
||||
return this;
|
||||
}
|
||||
|
||||
public ResearchItem setSiblings(String... sib)
|
||||
{
|
||||
this.siblings = sib;
|
||||
return this;
|
||||
}
|
||||
|
||||
public ResearchItem setPages(ResearchPage... par)
|
||||
{
|
||||
this.pages = par;
|
||||
return this;
|
||||
}
|
||||
|
||||
public ResearchPage[] getPages() {
|
||||
return pages;
|
||||
}
|
||||
|
||||
public ResearchItem setItemTriggers(ItemStack... par)
|
||||
{
|
||||
this.itemTriggers = par;
|
||||
return this;
|
||||
}
|
||||
|
||||
public ResearchItem setEntityTriggers(String... par)
|
||||
{
|
||||
this.entityTriggers = par;
|
||||
return this;
|
||||
}
|
||||
|
||||
public ResearchItem setAspectTriggers(Aspect... par)
|
||||
{
|
||||
this.aspectTriggers = par;
|
||||
return this;
|
||||
}
|
||||
|
||||
public ItemStack[] getItemTriggers() {
|
||||
return itemTriggers;
|
||||
}
|
||||
|
||||
public String[] getEntityTriggers() {
|
||||
return entityTriggers;
|
||||
}
|
||||
|
||||
public Aspect[] getAspectTriggers() {
|
||||
return aspectTriggers;
|
||||
}
|
||||
|
||||
public ResearchItem registerResearchItem()
|
||||
{
|
||||
ResearchCategories.addResearch(this);
|
||||
return this;
|
||||
}
|
||||
|
||||
public String getName()
|
||||
{
|
||||
return StatCollector.translateToLocal("tc.research_name."+key);
|
||||
}
|
||||
|
||||
public String getText()
|
||||
{
|
||||
return StatCollector.translateToLocal("tc.research_text."+key);
|
||||
}
|
||||
|
||||
public boolean isSpecial()
|
||||
{
|
||||
return this.isSpecial;
|
||||
}
|
||||
|
||||
public boolean isStub()
|
||||
{
|
||||
return this.isStub;
|
||||
}
|
||||
|
||||
@Deprecated
|
||||
public boolean isLost()
|
||||
{
|
||||
return this.isLost;
|
||||
}
|
||||
|
||||
public boolean isConcealed()
|
||||
{
|
||||
return this.isConcealed;
|
||||
}
|
||||
|
||||
public boolean isHidden()
|
||||
{
|
||||
return this.isHidden;
|
||||
}
|
||||
|
||||
public boolean isVirtual()
|
||||
{
|
||||
return this.isVirtual;
|
||||
}
|
||||
|
||||
public boolean isAutoUnlock() {
|
||||
return isAutoUnlock;
|
||||
}
|
||||
|
||||
public ResearchItem setAutoUnlock()
|
||||
{
|
||||
this.isAutoUnlock = true;
|
||||
return this;
|
||||
}
|
||||
|
||||
public boolean isRound() {
|
||||
return isRound;
|
||||
}
|
||||
|
||||
public ResearchItem setRound() {
|
||||
this.isRound = true;
|
||||
return this;
|
||||
}
|
||||
|
||||
public boolean isSecondary() {
|
||||
return isSecondary;
|
||||
}
|
||||
|
||||
public ResearchItem setSecondary() {
|
||||
this.isSecondary = true;
|
||||
return this;
|
||||
}
|
||||
|
||||
public int getComplexity() {
|
||||
return complexity;
|
||||
}
|
||||
|
||||
public ResearchItem setComplexity(int complexity) {
|
||||
this.complexity = complexity;
|
||||
return this;
|
||||
}
|
||||
|
||||
/**
|
||||
* @return the aspect aspects ordinal with the highest value. Used to determine scroll color and similar things
|
||||
*/
|
||||
public Aspect getResearchPrimaryTag() {
|
||||
Aspect aspect=null;
|
||||
int highest=0;
|
||||
if (tags!=null)
|
||||
for (Aspect tag:tags.getAspects()) {
|
||||
if (tags.getAmount(tag)>highest) {
|
||||
aspect=tag;
|
||||
highest=tags.getAmount(tag);
|
||||
};
|
||||
}
|
||||
return aspect;
|
||||
}
|
||||
|
||||
}
|
193
src/api/java/thaumcraft/api/research/ResearchPage.java
Normal file
193
src/api/java/thaumcraft/api/research/ResearchPage.java
Normal file
|
@ -0,0 +1,193 @@
|
|||
package thaumcraft.api.research;
|
||||
|
||||
import java.util.List;
|
||||
|
||||
import net.minecraft.item.ItemStack;
|
||||
import net.minecraft.item.crafting.FurnaceRecipes;
|
||||
import net.minecraft.item.crafting.IRecipe;
|
||||
import net.minecraft.util.ResourceLocation;
|
||||
import net.minecraft.util.StatCollector;
|
||||
import thaumcraft.api.aspects.AspectList;
|
||||
import thaumcraft.api.crafting.CrucibleRecipe;
|
||||
import thaumcraft.api.crafting.IArcaneRecipe;
|
||||
import thaumcraft.api.crafting.InfusionEnchantmentRecipe;
|
||||
import thaumcraft.api.crafting.InfusionRecipe;
|
||||
|
||||
public class ResearchPage {
|
||||
public static enum PageType
|
||||
{
|
||||
TEXT,
|
||||
TEXT_CONCEALED,
|
||||
IMAGE,
|
||||
CRUCIBLE_CRAFTING,
|
||||
ARCANE_CRAFTING,
|
||||
ASPECTS,
|
||||
NORMAL_CRAFTING,
|
||||
INFUSION_CRAFTING,
|
||||
COMPOUND_CRAFTING,
|
||||
INFUSION_ENCHANTMENT,
|
||||
SMELTING
|
||||
}
|
||||
|
||||
public PageType type = PageType.TEXT;
|
||||
|
||||
public String text=null;
|
||||
public String research=null;
|
||||
public ResourceLocation image=null;
|
||||
public AspectList aspects=null;
|
||||
public Object recipe=null;
|
||||
public ItemStack recipeOutput=null;
|
||||
|
||||
/**
|
||||
* @param text this can (but does not have to) be a reference to a localization variable, not the actual text.
|
||||
*/
|
||||
public ResearchPage(String text) {
|
||||
this.type = PageType.TEXT;
|
||||
this.text = text;
|
||||
}
|
||||
|
||||
/**
|
||||
* @param research this page will only be displayed if the player has discovered this research
|
||||
* @param text this can (but does not have to) be a reference to a localization variable, not the actual text.
|
||||
*/
|
||||
public ResearchPage(String research, String text) {
|
||||
this.type = PageType.TEXT_CONCEALED;
|
||||
this.research = research;
|
||||
this.text = text;
|
||||
}
|
||||
|
||||
/**
|
||||
* @param recipe a vanilla crafting recipe.
|
||||
*/
|
||||
public ResearchPage(IRecipe recipe) {
|
||||
this.type = PageType.NORMAL_CRAFTING;
|
||||
this.recipe = recipe;
|
||||
this.recipeOutput = recipe.getRecipeOutput();
|
||||
}
|
||||
|
||||
/**
|
||||
* @param recipe a collection of vanilla crafting recipes.
|
||||
*/
|
||||
public ResearchPage(IRecipe[] recipe) {
|
||||
this.type = PageType.NORMAL_CRAFTING;
|
||||
this.recipe = recipe;
|
||||
}
|
||||
|
||||
/**
|
||||
* @param recipe a collection of arcane crafting recipes.
|
||||
*/
|
||||
public ResearchPage(IArcaneRecipe[] recipe) {
|
||||
this.type = PageType.ARCANE_CRAFTING;
|
||||
this.recipe = recipe;
|
||||
}
|
||||
|
||||
/**
|
||||
* @param recipe a collection of arcane crafting recipes.
|
||||
*/
|
||||
public ResearchPage(CrucibleRecipe[] recipe) {
|
||||
this.type = PageType.CRUCIBLE_CRAFTING;
|
||||
this.recipe = recipe;
|
||||
}
|
||||
|
||||
/**
|
||||
* @param recipe a collection of infusion crafting recipes.
|
||||
*/
|
||||
public ResearchPage(InfusionRecipe[] recipe) {
|
||||
this.type = PageType.INFUSION_CRAFTING;
|
||||
this.recipe = recipe;
|
||||
}
|
||||
|
||||
/**
|
||||
* @param recipe a compound crafting recipe.
|
||||
*/
|
||||
public ResearchPage(List recipe) {
|
||||
this.type = PageType.COMPOUND_CRAFTING;
|
||||
this.recipe = recipe;
|
||||
}
|
||||
|
||||
/**
|
||||
* @param recipe an arcane worktable crafting recipe.
|
||||
*/
|
||||
public ResearchPage(IArcaneRecipe recipe) {
|
||||
this.type = PageType.ARCANE_CRAFTING;
|
||||
this.recipe = recipe;
|
||||
this.recipeOutput = recipe.getRecipeOutput();
|
||||
}
|
||||
|
||||
/**
|
||||
* @param recipe an alchemy crafting recipe.
|
||||
*/
|
||||
public ResearchPage(CrucibleRecipe recipe) {
|
||||
this.type = PageType.CRUCIBLE_CRAFTING;
|
||||
this.recipe = recipe;
|
||||
this.recipeOutput = recipe.getRecipeOutput();
|
||||
}
|
||||
|
||||
/**
|
||||
* @param recipe a furnace smelting crafting recipe.
|
||||
*/
|
||||
public ResearchPage(ItemStack input) {
|
||||
this.type = PageType.SMELTING;
|
||||
this.recipe = input;
|
||||
this.recipeOutput = FurnaceRecipes.smelting().getSmeltingResult(input);
|
||||
}
|
||||
|
||||
/**
|
||||
* @param recipe an infusion crafting recipe.
|
||||
*/
|
||||
public ResearchPage(InfusionRecipe recipe) {
|
||||
this.type = PageType.INFUSION_CRAFTING;
|
||||
this.recipe = recipe;
|
||||
if (recipe.getRecipeOutput() instanceof ItemStack) {
|
||||
this.recipeOutput = (ItemStack) recipe.getRecipeOutput();
|
||||
} else {
|
||||
this.recipeOutput = recipe.getRecipeInput();
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* @param recipe an infusion crafting recipe.
|
||||
*/
|
||||
public ResearchPage(InfusionEnchantmentRecipe recipe) {
|
||||
this.type = PageType.INFUSION_ENCHANTMENT;
|
||||
this.recipe = recipe;
|
||||
// if (recipe.recipeOutput instanceof ItemStack) {
|
||||
// this.recipeOutput = (ItemStack) recipe.recipeOutput;
|
||||
// } else {
|
||||
// this.recipeOutput = recipe.recipeInput;
|
||||
// }
|
||||
}
|
||||
|
||||
/**
|
||||
* @param image
|
||||
* @param caption this can (but does not have to) be a reference to a localization variable, not the actual text.
|
||||
*/
|
||||
public ResearchPage(ResourceLocation image, String caption) {
|
||||
this.type = PageType.IMAGE;
|
||||
this.image = image;
|
||||
this.text = caption;
|
||||
}
|
||||
|
||||
/**
|
||||
* This function should really not be called directly - used internally
|
||||
*/
|
||||
public ResearchPage(AspectList as) {
|
||||
this.type = PageType.ASPECTS;
|
||||
this.aspects = as;
|
||||
}
|
||||
|
||||
/**
|
||||
* returns a localized text of the text field (if one exists). Returns the text field itself otherwise.
|
||||
* @return
|
||||
*/
|
||||
public String getTranslatedText() {
|
||||
String ret="";
|
||||
if (text != null) {
|
||||
ret = StatCollector.translateToLocal(text);
|
||||
if (ret.isEmpty()) ret = text;
|
||||
}
|
||||
return ret;
|
||||
}
|
||||
|
||||
|
||||
}
|
39
src/api/java/thaumcraft/api/research/ScanResult.java
Normal file
39
src/api/java/thaumcraft/api/research/ScanResult.java
Normal file
|
@ -0,0 +1,39 @@
|
|||
package thaumcraft.api.research;
|
||||
|
||||
import net.minecraft.entity.Entity;
|
||||
|
||||
public class ScanResult {
|
||||
public byte type = 0; //1=blocks,2=entities,3=phenomena
|
||||
public int id;
|
||||
public int meta;
|
||||
public Entity entity;
|
||||
public String phenomena;
|
||||
|
||||
public ScanResult(byte type, int blockId, int blockMeta, Entity entity,
|
||||
String phenomena) {
|
||||
super();
|
||||
this.type = type;
|
||||
this.id = blockId;
|
||||
this.meta = blockMeta;
|
||||
this.entity = entity;
|
||||
this.phenomena = phenomena;
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean equals(Object obj) {
|
||||
if (obj instanceof ScanResult) {
|
||||
ScanResult sr = (ScanResult) obj;
|
||||
if (type != sr.type)
|
||||
return false;
|
||||
if (type == 1
|
||||
&& (id != sr.id || meta != sr.meta))
|
||||
return false;
|
||||
if (type == 2 && entity.getEntityId() != sr.entity.getEntityId())
|
||||
return false;
|
||||
if (type == 3 && !phenomena.equals(sr.phenomena))
|
||||
return false;
|
||||
}
|
||||
return true;
|
||||
}
|
||||
|
||||
}
|
188
src/api/java/thaumcraft/api/visnet/TileVisNode.java
Normal file
188
src/api/java/thaumcraft/api/visnet/TileVisNode.java
Normal file
|
@ -0,0 +1,188 @@
|
|||
package thaumcraft.api.visnet;
|
||||
|
||||
import java.lang.ref.WeakReference;
|
||||
import java.util.ArrayList;
|
||||
import java.util.HashMap;
|
||||
|
||||
import thaumcraft.api.TileThaumcraft;
|
||||
import thaumcraft.api.WorldCoordinates;
|
||||
import thaumcraft.api.aspects.Aspect;
|
||||
|
||||
/**
|
||||
* @author Azanor
|
||||
*
|
||||
* The tile entity used by nodes in the vis energy network. A node is either a source (like an aura node),
|
||||
* a transport relay or vis receiver (like the infernal furnace).
|
||||
*
|
||||
*/
|
||||
public abstract class TileVisNode extends TileThaumcraft {
|
||||
|
||||
WeakReference<TileVisNode> parent = null;
|
||||
ArrayList<WeakReference<TileVisNode>> children = new ArrayList<WeakReference<TileVisNode>>();
|
||||
|
||||
/**
|
||||
* @return the WorldCoordinates location of where this node is located
|
||||
*/
|
||||
public WorldCoordinates getLocation() {
|
||||
return new WorldCoordinates(this);
|
||||
}
|
||||
|
||||
/**
|
||||
* @return the number of blocks away this node will check for parent nodes to connect to.
|
||||
*/
|
||||
public abstract int getRange();
|
||||
|
||||
/**
|
||||
* @return true if this is the source or root node of the vis network.
|
||||
*/
|
||||
public abstract boolean isSource();
|
||||
|
||||
/**
|
||||
* This method should never be called directly. Use VisNetHandler.drainVis() instead
|
||||
* @param aspect what aspect to drain
|
||||
* @param vis how much to drain
|
||||
* @return how much was actually drained
|
||||
*/
|
||||
public int consumeVis(Aspect aspect, int vis) {
|
||||
if (VisNetHandler.isNodeValid(getParent())) {
|
||||
int out = getParent().get().consumeVis(aspect, vis);
|
||||
if (out>0) {
|
||||
triggerConsumeEffect(aspect);
|
||||
}
|
||||
return out;
|
||||
}
|
||||
return 0;
|
||||
}
|
||||
|
||||
public void removeThisNode() {
|
||||
for (WeakReference<TileVisNode> n:getChildren()) {
|
||||
if (n!=null && n.get()!=null) {
|
||||
n.get().removeThisNode();
|
||||
}
|
||||
}
|
||||
|
||||
children = new ArrayList<WeakReference<TileVisNode>>();
|
||||
if (VisNetHandler.isNodeValid(this.getParent())) {
|
||||
this.getParent().get().nodeRefresh=true;
|
||||
}
|
||||
this.setParent(null);
|
||||
this.parentChanged();
|
||||
|
||||
if (this.isSource()) {
|
||||
HashMap<WorldCoordinates, WeakReference<TileVisNode>> sourcelist = VisNetHandler.sources.get(worldObj.provider.dimensionId);
|
||||
if (sourcelist==null) {
|
||||
sourcelist = new HashMap<WorldCoordinates, WeakReference<TileVisNode>>();
|
||||
}
|
||||
sourcelist.remove(getLocation());
|
||||
VisNetHandler.sources.put( worldObj.provider.dimensionId, sourcelist );
|
||||
}
|
||||
|
||||
worldObj.markBlockForUpdate(xCoord, yCoord, zCoord);
|
||||
}
|
||||
|
||||
|
||||
|
||||
@Override
|
||||
public void invalidate() {
|
||||
removeThisNode();
|
||||
super.invalidate();
|
||||
}
|
||||
|
||||
public void triggerConsumeEffect(Aspect aspect) { }
|
||||
|
||||
/**
|
||||
* @return
|
||||
*/
|
||||
public WeakReference<TileVisNode> getParent() {
|
||||
return parent;
|
||||
}
|
||||
|
||||
/**
|
||||
* @return
|
||||
*/
|
||||
public WeakReference<TileVisNode> getRootSource() {
|
||||
return VisNetHandler.isNodeValid(getParent()) ?
|
||||
getParent().get().getRootSource() : this.isSource() ?
|
||||
new WeakReference(this) : null;
|
||||
}
|
||||
|
||||
/**
|
||||
* @param parent
|
||||
*/
|
||||
public void setParent(WeakReference<TileVisNode> parent) {
|
||||
this.parent = parent;
|
||||
}
|
||||
|
||||
/**
|
||||
* @return
|
||||
*/
|
||||
public ArrayList<WeakReference<TileVisNode>> getChildren() {
|
||||
return children;
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean canUpdate() {
|
||||
return true;
|
||||
}
|
||||
|
||||
protected int nodeCounter = 0;
|
||||
private boolean nodeRegged = false;
|
||||
public boolean nodeRefresh = false;
|
||||
|
||||
@Override
|
||||
public void updateEntity() {
|
||||
|
||||
if (!worldObj.isRemote && ((nodeCounter++) % 40==0 || nodeRefresh)) {
|
||||
//check for changes
|
||||
if (!nodeRefresh && children.size()>0) {
|
||||
for (WeakReference<TileVisNode> n:children) {
|
||||
if (n==null || n.get()==null) {
|
||||
nodeRefresh=true;
|
||||
break;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
//refresh linked nodes
|
||||
if (nodeRefresh) {
|
||||
for (WeakReference<TileVisNode> n:children) {
|
||||
if (n.get()!=null) {
|
||||
n.get().nodeRefresh=true;
|
||||
}
|
||||
}
|
||||
children.clear();
|
||||
parent=null;
|
||||
}
|
||||
|
||||
//redo stuff
|
||||
if (isSource() && !nodeRegged) {
|
||||
VisNetHandler.addSource(getWorldObj(), this);
|
||||
nodeRegged = true;
|
||||
} else
|
||||
if (!isSource() && !VisNetHandler.isNodeValid(getParent())) {
|
||||
setParent(VisNetHandler.addNode(getWorldObj(), this));
|
||||
nodeRefresh=true;
|
||||
}
|
||||
|
||||
if (nodeRefresh) {
|
||||
worldObj.markBlockForUpdate(xCoord, yCoord, zCoord);
|
||||
parentChanged();
|
||||
}
|
||||
nodeRefresh=false;
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
public void parentChanged() { }
|
||||
|
||||
/**
|
||||
* @return the type of shard this is attuned to:
|
||||
* none -1, air 0, fire 1, water 2, earth 3, order 4, entropy 5
|
||||
* Should return -1 for most implementations
|
||||
*/
|
||||
public byte getAttunement() {
|
||||
return -1;
|
||||
}
|
||||
|
||||
|
||||
}
|
284
src/api/java/thaumcraft/api/visnet/VisNetHandler.java
Normal file
284
src/api/java/thaumcraft/api/visnet/VisNetHandler.java
Normal file
|
@ -0,0 +1,284 @@
|
|||
package thaumcraft.api.visnet;
|
||||
|
||||
import java.lang.ref.WeakReference;
|
||||
import java.lang.reflect.Method;
|
||||
import java.util.ArrayList;
|
||||
import java.util.HashMap;
|
||||
|
||||
import net.minecraft.world.World;
|
||||
import thaumcraft.api.WorldCoordinates;
|
||||
import thaumcraft.api.aspects.Aspect;
|
||||
import cpw.mods.fml.common.FMLLog;
|
||||
|
||||
public class VisNetHandler {
|
||||
|
||||
// / NODE DRAINING
|
||||
/**
|
||||
* This method drains vis from a relay or source near the passed in
|
||||
* location. The amount received can be less than the amount requested so
|
||||
* take that into account.
|
||||
*
|
||||
* @param world
|
||||
* @param x the x position of the draining block or entity
|
||||
* @param y the y position of the draining block or entity
|
||||
* @param z the z position of the draining block or entity
|
||||
* @param aspect what aspect to drain
|
||||
* @param vis how much to drain
|
||||
* @return how much was actually drained
|
||||
*/
|
||||
public static int drainVis(World world, int x, int y, int z, Aspect aspect, int amount) {
|
||||
|
||||
int drainedAmount = 0;
|
||||
|
||||
WorldCoordinates drainer = new WorldCoordinates(x, y, z,
|
||||
world.provider.dimensionId);
|
||||
if (!nearbyNodes.containsKey(drainer)) {
|
||||
calculateNearbyNodes(world, x, y, z);
|
||||
}
|
||||
|
||||
ArrayList<WeakReference<TileVisNode>> nodes = nearbyNodes.get(drainer);
|
||||
if (nodes!=null && nodes.size()>0)
|
||||
for (WeakReference<TileVisNode> noderef : nodes) {
|
||||
|
||||
TileVisNode node = noderef.get();
|
||||
|
||||
if (node == null) continue;
|
||||
|
||||
int a = node.consumeVis(aspect, amount);
|
||||
drainedAmount += a;
|
||||
amount -= a;
|
||||
if (a>0) {
|
||||
int color = Aspect.getPrimalAspects().indexOf(aspect);
|
||||
generateVisEffect(world.provider.dimensionId, x, y, z, node.xCoord, node.yCoord, node.zCoord, color);
|
||||
}
|
||||
if (amount <= 0) {
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
return drainedAmount;
|
||||
}
|
||||
|
||||
static Method generateVisEffect;
|
||||
public static void generateVisEffect(int dim, int x, int y, int z, int x2, int y2, int z2, int color) {
|
||||
try {
|
||||
if(generateVisEffect == null) {
|
||||
Class fake = Class.forName("thaumcraft.common.lib.Utils");
|
||||
generateVisEffect = fake.getMethod("generateVisEffect", int.class, int.class, int.class, int.class, int.class, int.class, int.class, int.class);
|
||||
}
|
||||
generateVisEffect.invoke(null, dim, x,y,z,x2,y2,z2,color);
|
||||
} catch(Exception ex) {
|
||||
FMLLog.warning("[Thaumcraft API] Could not invoke thaumcraft.common.lib.Utils method generateVisEffect");
|
||||
}
|
||||
}
|
||||
|
||||
public static HashMap<Integer, HashMap<WorldCoordinates, WeakReference<TileVisNode>>> sources = new HashMap<Integer, HashMap<WorldCoordinates, WeakReference<TileVisNode>>>();
|
||||
|
||||
public static void addSource(World world, TileVisNode vs) {
|
||||
HashMap<WorldCoordinates, WeakReference<TileVisNode>> sourcelist = sources
|
||||
.get(world.provider.dimensionId);
|
||||
if (sourcelist == null) {
|
||||
sourcelist = new HashMap<WorldCoordinates, WeakReference<TileVisNode>>();
|
||||
}
|
||||
sourcelist.put(vs.getLocation(), new WeakReference(vs));
|
||||
sources.put(world.provider.dimensionId, sourcelist);
|
||||
nearbyNodes.clear();
|
||||
}
|
||||
|
||||
public static boolean isNodeValid(WeakReference<TileVisNode> node) {
|
||||
if (node == null || node.get() == null || node.get().isInvalid())
|
||||
return false;
|
||||
return true;
|
||||
}
|
||||
|
||||
public static WeakReference<TileVisNode> addNode(World world, TileVisNode vn) {
|
||||
WeakReference ref = new WeakReference(vn);
|
||||
|
||||
HashMap<WorldCoordinates, WeakReference<TileVisNode>> sourcelist = sources
|
||||
.get(world.provider.dimensionId);
|
||||
if (sourcelist == null) {
|
||||
sourcelist = new HashMap<WorldCoordinates, WeakReference<TileVisNode>>();
|
||||
return null;
|
||||
}
|
||||
|
||||
ArrayList<Object[]> nearby = new ArrayList<Object[]>();
|
||||
|
||||
for (WeakReference<TileVisNode> root : sourcelist.values()) {
|
||||
if (!isNodeValid(root))
|
||||
continue;
|
||||
|
||||
TileVisNode source = root.get();
|
||||
|
||||
float r = inRange(world, vn.getLocation(), source.getLocation(),
|
||||
vn.getRange());
|
||||
if (r > 0) {
|
||||
nearby.add(new Object[] { source, r - vn.getRange() * 2 });
|
||||
}
|
||||
nearby = findClosestNodes(vn, source, nearby);
|
||||
}
|
||||
|
||||
float dist = Float.MAX_VALUE;
|
||||
TileVisNode closest = null;
|
||||
if (nearby.size() > 0) {
|
||||
for (Object[] o : nearby) {
|
||||
if ((Float) o[1] < dist) {// && canNodeBeSeen(vn,(TileVisNode)
|
||||
// o[0])) {
|
||||
dist = (Float) o[1];
|
||||
closest = (TileVisNode) o[0];
|
||||
}
|
||||
}
|
||||
}
|
||||
if (closest != null) {
|
||||
closest.getChildren().add(ref);
|
||||
nearbyNodes.clear();
|
||||
return new WeakReference(closest);
|
||||
}
|
||||
|
||||
return null;
|
||||
}
|
||||
|
||||
public static ArrayList<Object[]> findClosestNodes(TileVisNode target,
|
||||
TileVisNode root, ArrayList<Object[]> in) {
|
||||
TileVisNode closestChild = null;
|
||||
|
||||
for (WeakReference<TileVisNode> child : root.getChildren()) {
|
||||
TileVisNode n = child.get();
|
||||
|
||||
if (n != null
|
||||
&& !n.equals(target)
|
||||
&& !n.equals(root)
|
||||
&& (target.getAttunement() == -1 || n.getAttunement() == -1 || n
|
||||
.getAttunement() == target.getAttunement())) {
|
||||
|
||||
float r2 = inRange(n.getWorldObj(), n.getLocation(),
|
||||
target.getLocation(), target.getRange());
|
||||
if (r2 > 0) {
|
||||
in.add(new Object[] { n, r2 });
|
||||
}
|
||||
|
||||
in = findClosestNodes(target, n, in);
|
||||
}
|
||||
}
|
||||
return in;
|
||||
}
|
||||
|
||||
private static float inRange(World world, WorldCoordinates cc1,
|
||||
WorldCoordinates cc2, int range) {
|
||||
float distance = cc1.getDistanceSquaredToWorldCoordinates(cc2);
|
||||
return distance > range * range ? -1 : distance;
|
||||
}
|
||||
|
||||
private static HashMap<WorldCoordinates, ArrayList<WeakReference<TileVisNode>>> nearbyNodes = new HashMap<WorldCoordinates, ArrayList<WeakReference<TileVisNode>>>();
|
||||
|
||||
private static void calculateNearbyNodes(World world, int x, int y, int z) {
|
||||
|
||||
HashMap<WorldCoordinates, WeakReference<TileVisNode>> sourcelist = sources
|
||||
.get(world.provider.dimensionId);
|
||||
if (sourcelist == null) {
|
||||
sourcelist = new HashMap<WorldCoordinates, WeakReference<TileVisNode>>();
|
||||
return;
|
||||
}
|
||||
|
||||
ArrayList<WeakReference<TileVisNode>> cn = new ArrayList<WeakReference<TileVisNode>>();
|
||||
WorldCoordinates drainer = new WorldCoordinates(x, y, z,
|
||||
world.provider.dimensionId);
|
||||
|
||||
ArrayList<Object[]> nearby = new ArrayList<Object[]>();
|
||||
|
||||
for (WeakReference<TileVisNode> root : sourcelist.values()) {
|
||||
|
||||
if (!isNodeValid(root))
|
||||
continue;
|
||||
|
||||
TileVisNode source = root.get();
|
||||
|
||||
TileVisNode closest = null;
|
||||
float range = Float.MAX_VALUE;
|
||||
|
||||
float r = inRange(world, drainer, source.getLocation(),
|
||||
source.getRange());
|
||||
if (r > 0) {
|
||||
range = r;
|
||||
closest = source;
|
||||
}
|
||||
|
||||
ArrayList<WeakReference<TileVisNode>> children = new ArrayList<WeakReference<TileVisNode>>();
|
||||
children = getAllChildren(source,children);
|
||||
|
||||
for (WeakReference<TileVisNode> child : children) {
|
||||
TileVisNode n = child.get();
|
||||
if (n != null && !n.equals(root)) {
|
||||
|
||||
float r2 = inRange(n.getWorldObj(), n.getLocation(),
|
||||
drainer, n.getRange());
|
||||
if (r2 > 0 && r2 < range) {
|
||||
range = r2;
|
||||
closest = n;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
if (closest != null) {
|
||||
|
||||
cn.add(new WeakReference(closest));
|
||||
}
|
||||
}
|
||||
|
||||
nearbyNodes.put(drainer, cn);
|
||||
}
|
||||
|
||||
private static ArrayList<WeakReference<TileVisNode>> getAllChildren(TileVisNode source, ArrayList<WeakReference<TileVisNode>> list) {
|
||||
for (WeakReference<TileVisNode> child : source.getChildren()) {
|
||||
TileVisNode n = child.get();
|
||||
if (n != null) {
|
||||
list.add(child);
|
||||
list = getAllChildren(n,list);
|
||||
}
|
||||
}
|
||||
return list;
|
||||
}
|
||||
|
||||
// public static boolean canNodeBeSeen(TileVisNode source,TileVisNode
|
||||
// target)
|
||||
// {
|
||||
// double d = Math.sqrt(source.getDistanceFrom(target.xCoord, target.yCoord,
|
||||
// target.zCoord));
|
||||
// double xd = (source.xCoord-target.xCoord) / d;
|
||||
// double yd = (source.yCoord-target.yCoord) / d;
|
||||
// double zd = (source.zCoord-target.zCoord) / d;
|
||||
// return source.getWorldObj().rayTraceBlocks(
|
||||
// Vec3.createVectorHelper(source.xCoord-xd+.5+.5, source.yCoord-yd,
|
||||
// source.zCoord-zd),
|
||||
// Vec3.createVectorHelper(target.xCoord+.5, target.yCoord+.5,
|
||||
// target.zCoord+.5)) == null;
|
||||
// }
|
||||
|
||||
// public static HashMap<WorldCoordinates,WeakReference<TileVisNode>>
|
||||
// noderef = new HashMap<WorldCoordinates,WeakReference<TileVisNode>>();
|
||||
//
|
||||
// public static TileVisNode getClosestNodeWithinRadius(World world, int x,
|
||||
// int y, int z, int radius) {
|
||||
// TileVisNode out = null;
|
||||
// WorldCoordinates wc = null;
|
||||
// float cd = Float.MAX_VALUE;
|
||||
// for (int sx = x - radius; sx <= x + radius; sx++) {
|
||||
// for (int sy = y - radius; sy <= y + radius; sy++) {
|
||||
// for (int sz = z - radius; sz <= z + radius; sz++) {
|
||||
// wc = new WorldCoordinates(sx,sy,sz,world.provider.dimensionId);
|
||||
// if (noderef.containsKey(wc)) {
|
||||
// float d = wc.getDistanceSquared(x, y, z);
|
||||
// if (d<radius*radius && noderef.get(wc).get()!=null &&
|
||||
// !noderef.get(wc).get().isReceiver() &&
|
||||
// isNodeValid(noderef.get(wc).get().getParent())
|
||||
// ) {
|
||||
// out = noderef.get(wc).get();
|
||||
// cd = d;
|
||||
// }
|
||||
// }
|
||||
// }
|
||||
// }
|
||||
// }
|
||||
// return out;
|
||||
// }
|
||||
|
||||
}
|
64
src/api/java/thaumcraft/api/wands/IWandFocus.java
Normal file
64
src/api/java/thaumcraft/api/wands/IWandFocus.java
Normal file
|
@ -0,0 +1,64 @@
|
|||
package thaumcraft.api.wands;
|
||||
|
||||
import net.minecraft.entity.player.EntityPlayer;
|
||||
import net.minecraft.item.ItemStack;
|
||||
import net.minecraft.util.IIcon;
|
||||
import net.minecraft.util.MovingObjectPosition;
|
||||
import net.minecraft.world.World;
|
||||
import thaumcraft.api.aspects.AspectList;
|
||||
|
||||
|
||||
public interface IWandFocus {
|
||||
|
||||
public enum WandFocusAnimation {
|
||||
WAVE, CHARGE;
|
||||
}
|
||||
|
||||
/**
|
||||
* @return The color the focus should be changed to.
|
||||
*/
|
||||
public int getFocusColor();
|
||||
|
||||
/**
|
||||
* @return An icon that will be drawn as a block inside the focus "block".
|
||||
*/
|
||||
IIcon getFocusDepthLayerIcon();
|
||||
|
||||
public IIcon getOrnament();
|
||||
|
||||
public WandFocusAnimation getAnimation();
|
||||
|
||||
/**
|
||||
* Gets the amount of vis used per aspect per click or tick. This cost is actually listed as
|
||||
* a hundredth of a single point of vis, so a cost of 100 will equal one vis per tick/click.
|
||||
* It is returned as an AspectList to allow for multiple vis types in different ratios.
|
||||
*/
|
||||
public AspectList getVisCost();
|
||||
|
||||
public boolean isVisCostPerTick();
|
||||
|
||||
public ItemStack onFocusRightClick(ItemStack itemstack, World world, EntityPlayer player, MovingObjectPosition movingobjectposition);
|
||||
|
||||
public void onUsingFocusTick(ItemStack itemstack, EntityPlayer player, int count);
|
||||
|
||||
public void onPlayerStoppedUsingFocus(ItemStack itemstack, World world, EntityPlayer player, int count);
|
||||
|
||||
/**
|
||||
* Helper method to determine in what order foci should be iterated through when
|
||||
* the user presses the 'change focus' keybinding.
|
||||
* @return a string of characters that foci will be sorted against.
|
||||
* For example AA00 will be placed before FG12
|
||||
* <br>As a guide build the sort string from two alphanumeric characters followed by
|
||||
* two numeric characters based on... whatever.
|
||||
*/
|
||||
public String getSortingHelper(ItemStack itemstack);
|
||||
|
||||
boolean onFocusBlockStartBreak(ItemStack itemstack, int x, int y, int z, EntityPlayer player);
|
||||
|
||||
public boolean acceptsEnchant(int id);
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
}
|
16
src/api/java/thaumcraft/api/wands/IWandRodOnUpdate.java
Normal file
16
src/api/java/thaumcraft/api/wands/IWandRodOnUpdate.java
Normal file
|
@ -0,0 +1,16 @@
|
|||
package thaumcraft.api.wands;
|
||||
|
||||
import net.minecraft.entity.player.EntityPlayer;
|
||||
import net.minecraft.item.ItemStack;
|
||||
|
||||
/**
|
||||
*
|
||||
* @author azanor
|
||||
*
|
||||
* Implemented by a class that you wish to be called whenever a wand with this rod performs its
|
||||
* update tick.
|
||||
*
|
||||
*/
|
||||
public interface IWandRodOnUpdate {
|
||||
void onUpdate(ItemStack itemstack, EntityPlayer player);
|
||||
}
|
12
src/api/java/thaumcraft/api/wands/IWandTriggerManager.java
Normal file
12
src/api/java/thaumcraft/api/wands/IWandTriggerManager.java
Normal file
|
@ -0,0 +1,12 @@
|
|||
package thaumcraft.api.wands;
|
||||
|
||||
import net.minecraft.entity.player.EntityPlayer;
|
||||
import net.minecraft.item.ItemStack;
|
||||
import net.minecraft.world.World;
|
||||
|
||||
public interface IWandTriggerManager {
|
||||
|
||||
public boolean performTrigger(World world, ItemStack wand, EntityPlayer player,
|
||||
int x, int y, int z, int side, int event);
|
||||
|
||||
}
|
25
src/api/java/thaumcraft/api/wands/IWandable.java
Normal file
25
src/api/java/thaumcraft/api/wands/IWandable.java
Normal file
|
@ -0,0 +1,25 @@
|
|||
package thaumcraft.api.wands;
|
||||
|
||||
import net.minecraft.entity.player.EntityPlayer;
|
||||
import net.minecraft.item.ItemStack;
|
||||
import net.minecraft.world.World;
|
||||
|
||||
/**
|
||||
*
|
||||
* @author azanor
|
||||
*
|
||||
* Add this to a tile entity that you wish wands to interact with in some way.
|
||||
*
|
||||
*/
|
||||
|
||||
public interface IWandable {
|
||||
|
||||
public int onWandRightClick(World world, ItemStack wandstack, EntityPlayer player, int x, int y, int z, int side, int md);
|
||||
|
||||
public ItemStack onWandRightClick(World world, ItemStack wandstack, EntityPlayer player);
|
||||
|
||||
public void onUsingWandTick(ItemStack wandstack, EntityPlayer player, int count);
|
||||
|
||||
public void onWandStoppedUsing(ItemStack wandstack, World world, EntityPlayer player, int count);
|
||||
|
||||
}
|
166
src/api/java/thaumcraft/api/wands/ItemFocusBasic.java
Normal file
166
src/api/java/thaumcraft/api/wands/ItemFocusBasic.java
Normal file
|
@ -0,0 +1,166 @@
|
|||
package thaumcraft.api.wands;
|
||||
|
||||
import java.text.DecimalFormat;
|
||||
import java.util.List;
|
||||
import java.util.Map;
|
||||
|
||||
import net.minecraft.enchantment.EnchantmentHelper;
|
||||
import net.minecraft.entity.player.EntityPlayer;
|
||||
import net.minecraft.item.EnumRarity;
|
||||
import net.minecraft.item.Item;
|
||||
import net.minecraft.item.ItemStack;
|
||||
import net.minecraft.util.IIcon;
|
||||
import net.minecraft.util.MovingObjectPosition;
|
||||
import net.minecraft.util.StatCollector;
|
||||
import net.minecraft.world.World;
|
||||
import thaumcraft.api.ThaumcraftApi;
|
||||
import thaumcraft.api.aspects.Aspect;
|
||||
import thaumcraft.api.aspects.AspectList;
|
||||
import cpw.mods.fml.relauncher.Side;
|
||||
import cpw.mods.fml.relauncher.SideOnly;
|
||||
|
||||
public class ItemFocusBasic extends Item implements IWandFocus {
|
||||
|
||||
public ItemFocusBasic ()
|
||||
{
|
||||
super();
|
||||
maxStackSize = 1;
|
||||
canRepair=false;
|
||||
this.setMaxDamage(0);
|
||||
}
|
||||
|
||||
public IIcon icon;
|
||||
|
||||
@SideOnly(Side.CLIENT)
|
||||
@Override
|
||||
public IIcon getIconFromDamage(int par1) {
|
||||
return icon;
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean isItemTool(ItemStack par1ItemStack)
|
||||
{
|
||||
return true;
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean isDamageable() {
|
||||
return true;
|
||||
}
|
||||
|
||||
@Override
|
||||
public void addInformation(ItemStack stack,EntityPlayer player, List list, boolean par4) {
|
||||
AspectList al = this.getVisCost();
|
||||
if (al!=null && al.size()>0) {
|
||||
list.add(StatCollector.translateToLocal(isVisCostPerTick()?"item.Focus.cost2":"item.Focus.cost1"));
|
||||
for (Aspect aspect:al.getAspectsSorted()) {
|
||||
DecimalFormat myFormatter = new DecimalFormat("#####.##");
|
||||
String amount = myFormatter.format(al.getAmount(aspect)/100f);
|
||||
list.add(" \u00A7"+aspect.getChatcolor()+aspect.getName()+"\u00A7r x "+ amount);
|
||||
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@Override
|
||||
public int getItemEnchantability() {
|
||||
return 5;
|
||||
}
|
||||
|
||||
@Override
|
||||
public EnumRarity getRarity(ItemStack itemstack)
|
||||
{
|
||||
return EnumRarity.rare;
|
||||
}
|
||||
|
||||
|
||||
@Override
|
||||
public int getFocusColor() {
|
||||
// TODO Auto-generated method stub
|
||||
return 0;
|
||||
}
|
||||
|
||||
@Override
|
||||
public AspectList getVisCost() {
|
||||
// TODO Auto-generated method stub
|
||||
return null;
|
||||
}
|
||||
|
||||
@Override
|
||||
public ItemStack onFocusRightClick(ItemStack itemstack, World world,
|
||||
EntityPlayer player, MovingObjectPosition movingobjectposition) {
|
||||
// TODO Auto-generated method stub
|
||||
return null;
|
||||
}
|
||||
|
||||
@Override
|
||||
public void onUsingFocusTick(ItemStack itemstack, EntityPlayer player,
|
||||
int count) {
|
||||
// TODO Auto-generated method stub
|
||||
}
|
||||
|
||||
@Override
|
||||
public void onPlayerStoppedUsingFocus(ItemStack itemstack, World world,
|
||||
EntityPlayer player, int count) {
|
||||
// TODO Auto-generated method stub
|
||||
|
||||
}
|
||||
|
||||
/**
|
||||
* Just insert two alphanumeric characters before this string in your focus item class
|
||||
*/
|
||||
@Override
|
||||
public String getSortingHelper(ItemStack itemstack) {
|
||||
Map<Integer,Integer> ench = EnchantmentHelper.getEnchantments(itemstack);
|
||||
String out="";
|
||||
for (Integer lvl:ench.values()) {
|
||||
out = out + lvl + "";
|
||||
}
|
||||
return out;
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean isVisCostPerTick() {
|
||||
return false;
|
||||
}
|
||||
|
||||
@Override
|
||||
public IIcon getOrnament() {
|
||||
// TODO Auto-generated method stub
|
||||
return null;
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean onFocusBlockStartBreak(ItemStack itemstack, int x, int y,
|
||||
int z, EntityPlayer player) {
|
||||
// TODO Auto-generated method stub
|
||||
return false;
|
||||
}
|
||||
|
||||
@Override
|
||||
public WandFocusAnimation getAnimation() {
|
||||
return WandFocusAnimation.WAVE;
|
||||
}
|
||||
|
||||
@Override
|
||||
public IIcon getFocusDepthLayerIcon() {
|
||||
// TODO Auto-generated method stub
|
||||
return null;
|
||||
}
|
||||
|
||||
/**
|
||||
* @see thaumcraft.api.wands.IWandFocus#acceptsEnchant(int)
|
||||
* By default fortune is off for all wands
|
||||
**/
|
||||
@Override
|
||||
public boolean acceptsEnchant(int id) {
|
||||
if (id==ThaumcraftApi.enchantFrugal||
|
||||
id==ThaumcraftApi.enchantPotency) return true;
|
||||
return false;
|
||||
}
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
}
|
48
src/api/java/thaumcraft/api/wands/StaffRod.java
Normal file
48
src/api/java/thaumcraft/api/wands/StaffRod.java
Normal file
|
@ -0,0 +1,48 @@
|
|||
package thaumcraft.api.wands;
|
||||
|
||||
import net.minecraft.item.ItemStack;
|
||||
import net.minecraft.util.ResourceLocation;
|
||||
|
||||
/**
|
||||
*
|
||||
* @author Azanor
|
||||
*
|
||||
* This class is used to keep the material information for the various rods.
|
||||
* It is also used to generate the wand recipes ingame.
|
||||
*
|
||||
*/
|
||||
public class StaffRod extends WandRod {
|
||||
|
||||
boolean runes=false;
|
||||
|
||||
public StaffRod(String tag, int capacity, ItemStack item, int craftCost) {
|
||||
super(tag+"_staff", capacity, item, craftCost);
|
||||
this.texture = new ResourceLocation("thaumcraft","textures/models/wand_rod_"+tag+".png");
|
||||
}
|
||||
|
||||
public StaffRod(String tag, int capacity, ItemStack item, int craftCost,
|
||||
IWandRodOnUpdate onUpdate, ResourceLocation texture) {
|
||||
super(tag+"_staff", capacity, item, craftCost, onUpdate, texture);
|
||||
}
|
||||
|
||||
public StaffRod(String tag, int capacity, ItemStack item, int craftCost,
|
||||
IWandRodOnUpdate onUpdate) {
|
||||
super(tag+"_staff", capacity, item, craftCost, onUpdate);
|
||||
this.texture = new ResourceLocation("thaumcraft","textures/models/wand_rod_"+tag+".png");
|
||||
}
|
||||
|
||||
public StaffRod(String tag, int capacity, ItemStack item, int craftCost,
|
||||
ResourceLocation texture) {
|
||||
super(tag+"_staff", capacity, item, craftCost, texture);
|
||||
}
|
||||
|
||||
public boolean hasRunes() {
|
||||
return runes;
|
||||
}
|
||||
|
||||
public void setRunes(boolean hasRunes) {
|
||||
this.runes = hasRunes;
|
||||
}
|
||||
|
||||
|
||||
}
|
129
src/api/java/thaumcraft/api/wands/WandCap.java
Normal file
129
src/api/java/thaumcraft/api/wands/WandCap.java
Normal file
|
@ -0,0 +1,129 @@
|
|||
package thaumcraft.api.wands;
|
||||
|
||||
import java.util.LinkedHashMap;
|
||||
import java.util.List;
|
||||
|
||||
import net.minecraft.item.ItemStack;
|
||||
import net.minecraft.util.ResourceLocation;
|
||||
import thaumcraft.api.aspects.Aspect;
|
||||
|
||||
/**
|
||||
* This class is used to keep the material information for the various caps.
|
||||
* It is also used to generate the wand recipes ingame.
|
||||
* @author Azanor
|
||||
*
|
||||
*/
|
||||
public class WandCap {
|
||||
|
||||
private String tag;
|
||||
|
||||
/**
|
||||
* Cost to craft this wand. Combined with the rod cost.
|
||||
*/
|
||||
private int craftCost;
|
||||
|
||||
/**
|
||||
* the amount by which all aspect costs are multiplied
|
||||
*/
|
||||
float baseCostModifier;
|
||||
|
||||
/**
|
||||
* specifies a list of primal aspects that use the special discount figure instead of the normal discount.
|
||||
*/
|
||||
List<Aspect> specialCostModifierAspects;
|
||||
|
||||
/**
|
||||
* the amount by which the specified aspect costs are multiplied
|
||||
*/
|
||||
float specialCostModifier;
|
||||
|
||||
/**
|
||||
* The texture that will be used for the ingame wand cap
|
||||
*/
|
||||
ResourceLocation texture;
|
||||
|
||||
/**
|
||||
* the actual item that makes up this cap and will be used to generate the wand recipes
|
||||
*/
|
||||
ItemStack item;
|
||||
|
||||
public static LinkedHashMap<String,WandCap> caps = new LinkedHashMap<String,WandCap>();
|
||||
|
||||
public WandCap (String tag, float discount, ItemStack item, int craftCost) {
|
||||
this.setTag(tag);
|
||||
this.baseCostModifier = discount;
|
||||
this.specialCostModifierAspects = null;
|
||||
texture = new ResourceLocation("thaumcraft","textures/models/wand_cap_"+getTag()+".png");
|
||||
this.item=item;
|
||||
this.setCraftCost(craftCost);
|
||||
caps.put(tag, this);
|
||||
}
|
||||
|
||||
public WandCap (String tag, float discount, List<Aspect> specialAspects, float discountSpecial, ItemStack item, int craftCost) {
|
||||
this.setTag(tag);
|
||||
this.baseCostModifier = discount;
|
||||
this.specialCostModifierAspects = specialAspects;
|
||||
this.specialCostModifier = discountSpecial;
|
||||
texture = new ResourceLocation("thaumcraft","textures/models/wand_cap_"+getTag()+".png");
|
||||
this.item=item;
|
||||
this.setCraftCost(craftCost);
|
||||
caps.put(tag, this);
|
||||
}
|
||||
|
||||
public float getBaseCostModifier() {
|
||||
return baseCostModifier;
|
||||
}
|
||||
|
||||
public List<Aspect> getSpecialCostModifierAspects() {
|
||||
return specialCostModifierAspects;
|
||||
}
|
||||
|
||||
public float getSpecialCostModifier() {
|
||||
return specialCostModifier;
|
||||
}
|
||||
|
||||
public ResourceLocation getTexture() {
|
||||
return texture;
|
||||
}
|
||||
|
||||
public void setTexture(ResourceLocation texture) {
|
||||
this.texture = texture;
|
||||
}
|
||||
|
||||
public String getTag() {
|
||||
return tag;
|
||||
}
|
||||
|
||||
public void setTag(String tag) {
|
||||
this.tag = tag;
|
||||
}
|
||||
|
||||
|
||||
public ItemStack getItem() {
|
||||
return item;
|
||||
}
|
||||
|
||||
public void setItem(ItemStack item) {
|
||||
this.item = item;
|
||||
}
|
||||
|
||||
public int getCraftCost() {
|
||||
return craftCost;
|
||||
}
|
||||
|
||||
public void setCraftCost(int craftCost) {
|
||||
this.craftCost = craftCost;
|
||||
}
|
||||
|
||||
/**
|
||||
* The research a player needs to have finished to be able to craft a wand with this cap.
|
||||
*/
|
||||
public String getResearch() {
|
||||
return "CAP_"+getTag();
|
||||
}
|
||||
|
||||
// Some examples:
|
||||
// WandCap WAND_CAP_IRON = new WandCap("iron", 1.1f, Arrays.asList(Aspect.ORDER),1, new ItemStack(ConfigItems.itemWandCap,1,0),1);
|
||||
// WandCap WAND_CAP_GOLD = new WandCap("gold", 1f, new ItemStack(ConfigItems.itemWandCap,1,1),3);
|
||||
|
||||
}
|
158
src/api/java/thaumcraft/api/wands/WandRod.java
Normal file
158
src/api/java/thaumcraft/api/wands/WandRod.java
Normal file
|
@ -0,0 +1,158 @@
|
|||
package thaumcraft.api.wands;
|
||||
|
||||
import java.util.LinkedHashMap;
|
||||
|
||||
import net.minecraft.item.ItemStack;
|
||||
import net.minecraft.util.ResourceLocation;
|
||||
|
||||
/**
|
||||
*
|
||||
* @author Azanor
|
||||
*
|
||||
* This class is used to keep the material information for the various rods.
|
||||
* It is also used to generate the wand recipes ingame.
|
||||
*
|
||||
*/
|
||||
public class WandRod {
|
||||
|
||||
|
||||
private String tag;
|
||||
|
||||
/**
|
||||
* Cost to craft this wand. Combined with the rod cost.
|
||||
*/
|
||||
private int craftCost;
|
||||
|
||||
/**
|
||||
* The amount of vis that can be stored - this number is actually multiplied
|
||||
* by 100 for use by the wands internals
|
||||
*/
|
||||
int capacity;
|
||||
|
||||
/**
|
||||
* The texture that will be used for the ingame wand rod
|
||||
*/
|
||||
protected ResourceLocation texture;
|
||||
|
||||
/**
|
||||
* the actual item that makes up this rod and will be used to generate the wand recipes
|
||||
*/
|
||||
ItemStack item;
|
||||
|
||||
/**
|
||||
* A class that will be called whenever the wand onUpdate tick is run
|
||||
*/
|
||||
IWandRodOnUpdate onUpdate;
|
||||
|
||||
/**
|
||||
* Does the rod glow in the dark?
|
||||
*/
|
||||
boolean glow;
|
||||
|
||||
public static LinkedHashMap<String,WandRod> rods = new LinkedHashMap<String,WandRod>();
|
||||
|
||||
public WandRod (String tag, int capacity, ItemStack item, int craftCost, ResourceLocation texture) {
|
||||
this.setTag(tag);
|
||||
this.capacity = capacity;
|
||||
this.texture = texture;
|
||||
this.item=item;
|
||||
this.setCraftCost(craftCost);
|
||||
rods.put(tag, this);
|
||||
}
|
||||
|
||||
public WandRod (String tag, int capacity, ItemStack item, int craftCost, IWandRodOnUpdate onUpdate, ResourceLocation texture) {
|
||||
this.setTag(tag);
|
||||
this.capacity = capacity;
|
||||
this.texture = texture;
|
||||
this.item=item;
|
||||
this.setCraftCost(craftCost);
|
||||
rods.put(tag, this);
|
||||
this.onUpdate = onUpdate;
|
||||
}
|
||||
|
||||
public WandRod (String tag, int capacity, ItemStack item, int craftCost) {
|
||||
this.setTag(tag);
|
||||
this.capacity = capacity;
|
||||
this.texture = new ResourceLocation("thaumcraft","textures/models/wand_rod_"+getTag()+".png");
|
||||
this.item=item;
|
||||
this.setCraftCost(craftCost);
|
||||
rods.put(tag, this);
|
||||
}
|
||||
|
||||
public WandRod (String tag, int capacity, ItemStack item, int craftCost, IWandRodOnUpdate onUpdate) {
|
||||
this.setTag(tag);
|
||||
this.capacity = capacity;
|
||||
this.texture = new ResourceLocation("thaumcraft","textures/models/wand_rod_"+getTag()+".png");
|
||||
this.item=item;
|
||||
this.setCraftCost(craftCost);
|
||||
rods.put(tag, this);
|
||||
this.onUpdate = onUpdate;
|
||||
}
|
||||
|
||||
public String getTag() {
|
||||
return tag;
|
||||
}
|
||||
|
||||
public void setTag(String tag) {
|
||||
this.tag = tag;
|
||||
}
|
||||
|
||||
public int getCapacity() {
|
||||
return capacity;
|
||||
}
|
||||
|
||||
public void setCapacity(int capacity) {
|
||||
this.capacity = capacity;
|
||||
}
|
||||
|
||||
public ResourceLocation getTexture() {
|
||||
return texture;
|
||||
}
|
||||
|
||||
public void setTexture(ResourceLocation texture) {
|
||||
this.texture = texture;
|
||||
}
|
||||
|
||||
public ItemStack getItem() {
|
||||
return item;
|
||||
}
|
||||
|
||||
public void setItem(ItemStack item) {
|
||||
this.item = item;
|
||||
}
|
||||
|
||||
public int getCraftCost() {
|
||||
return craftCost;
|
||||
}
|
||||
|
||||
public void setCraftCost(int craftCost) {
|
||||
this.craftCost = craftCost;
|
||||
}
|
||||
|
||||
public IWandRodOnUpdate getOnUpdate() {
|
||||
return onUpdate;
|
||||
}
|
||||
|
||||
public void setOnUpdate(IWandRodOnUpdate onUpdate) {
|
||||
this.onUpdate = onUpdate;
|
||||
}
|
||||
|
||||
public boolean isGlowing() {
|
||||
return glow;
|
||||
}
|
||||
|
||||
public void setGlowing(boolean hasGlow) {
|
||||
this.glow = hasGlow;
|
||||
}
|
||||
|
||||
/**
|
||||
* The research a player needs to have finished to be able to craft a wand with this rod.
|
||||
*/
|
||||
public String getResearch() {
|
||||
return "ROD_"+getTag();
|
||||
}
|
||||
|
||||
// Some examples:
|
||||
// WandRod WAND_ROD_WOOD = new WandRod("wood",25,new ItemStack(Item.stick),1);
|
||||
// WandRod WAND_ROD_BLAZE = new WandRod("blaze",100,new ItemStack(Item.blazeRod),7,new WandRodBlazeOnUpdate());
|
||||
}
|
72
src/api/java/thaumcraft/api/wands/WandTriggerRegistry.java
Normal file
72
src/api/java/thaumcraft/api/wands/WandTriggerRegistry.java
Normal file
|
@ -0,0 +1,72 @@
|
|||
package thaumcraft.api.wands;
|
||||
|
||||
import java.util.Arrays;
|
||||
import java.util.HashMap;
|
||||
import java.util.List;
|
||||
|
||||
import net.minecraft.block.Block;
|
||||
import net.minecraft.entity.player.EntityPlayer;
|
||||
import net.minecraft.item.ItemStack;
|
||||
import net.minecraft.world.World;
|
||||
|
||||
/**
|
||||
* This class serves a similar function to IWandable in that it allows wands to interact
|
||||
* with object in the world. In this case it is most useful for adding interaction with non-mod
|
||||
* blocks where you can't control what happens in their code.
|
||||
* Example where it is used is in crafting the thaumonomicon from a bookshelf and the
|
||||
* crucible from a cauldron
|
||||
*
|
||||
* @author azanor
|
||||
*
|
||||
*/
|
||||
public class WandTriggerRegistry {
|
||||
|
||||
/**
|
||||
* Registers an action to perform when a casting wand right clicks on a specific block.
|
||||
* A manager class needs to be created that implements IWandTriggerManager.
|
||||
* @param manager
|
||||
* @param event a logical number that you can use to differentiate different events or actions
|
||||
* @param block
|
||||
* @param meta send -1 as a wildcard value for all possible meta values
|
||||
*/
|
||||
public static void registerWandBlockTrigger(IWandTriggerManager manager, int event, Block block, int meta) {
|
||||
triggers.put(Arrays.asList(block,meta),
|
||||
Arrays.asList(manager,event));
|
||||
|
||||
}
|
||||
|
||||
private static HashMap<List,List> triggers = new HashMap<List,List>();
|
||||
|
||||
public static boolean hasTrigger(Block block, int meta) {
|
||||
if (triggers.containsKey(Arrays.asList(block,meta)) ||
|
||||
triggers.containsKey(Arrays.asList(block,-1))) return true;
|
||||
return false;
|
||||
}
|
||||
|
||||
/**
|
||||
* This is called by the onItemUseFirst function in wands.
|
||||
* Parameters and return value functions like you would expect for that function.
|
||||
* @param world
|
||||
* @param wand
|
||||
* @param player
|
||||
* @param x
|
||||
* @param y
|
||||
* @param z
|
||||
* @param side
|
||||
* @param block
|
||||
* @param meta
|
||||
* @return
|
||||
*/
|
||||
public static boolean performTrigger(World world, ItemStack wand, EntityPlayer player,
|
||||
int x, int y, int z, int side, Block block, int meta) {
|
||||
|
||||
List l = triggers.get(Arrays.asList(block,meta));
|
||||
if (l==null) l = triggers.get(Arrays.asList(block,-1));
|
||||
if (l==null) return false;
|
||||
|
||||
IWandTriggerManager manager = (IWandTriggerManager) l.get(0);
|
||||
int event = (Integer) l.get(1);
|
||||
return manager.performTrigger(world, wand, player, x, y, z, side, event);
|
||||
}
|
||||
|
||||
}
|
363
src/api/java/vazkii/botania/api/BotaniaAPI.java
Normal file
363
src/api/java/vazkii/botania/api/BotaniaAPI.java
Normal file
|
@ -0,0 +1,363 @@
|
|||
/**
|
||||
* This class was created by <Vazkii>. It's distributed as
|
||||
* part of the Botania Mod. Get the Source Code in github:
|
||||
* https://github.com/Vazkii/Botania
|
||||
*
|
||||
* Botania is Open Source and distributed under a
|
||||
* Creative Commons Attribution-NonCommercial-ShareAlike 3.0 License
|
||||
* (http://creativecommons.org/licenses/by-nc-sa/3.0/deed.en_GB)
|
||||
*
|
||||
* File Created @ [Jan 14, 2014, 6:15:28 PM (GMT)]
|
||||
*/
|
||||
package vazkii.botania.api;
|
||||
|
||||
import java.util.ArrayList;
|
||||
import java.util.HashMap;
|
||||
import java.util.LinkedHashSet;
|
||||
import java.util.List;
|
||||
import java.util.Map;
|
||||
import java.util.Set;
|
||||
|
||||
import net.minecraft.block.Block;
|
||||
import net.minecraft.init.Blocks;
|
||||
import net.minecraft.init.Items;
|
||||
import net.minecraft.item.Item;
|
||||
import net.minecraft.item.Item.ToolMaterial;
|
||||
import net.minecraft.item.ItemArmor.ArmorMaterial;
|
||||
import net.minecraft.item.ItemStack;
|
||||
import net.minecraft.item.crafting.CraftingManager;
|
||||
import net.minecraft.item.crafting.IRecipe;
|
||||
import net.minecraft.util.EnumChatFormatting;
|
||||
import net.minecraftforge.common.util.EnumHelper;
|
||||
import vazkii.botania.api.internal.DummyMethodHandler;
|
||||
import vazkii.botania.api.internal.DummySubTile;
|
||||
import vazkii.botania.api.internal.IInternalMethodHandler;
|
||||
import vazkii.botania.api.lexicon.KnowledgeType;
|
||||
import vazkii.botania.api.lexicon.LexiconCategory;
|
||||
import vazkii.botania.api.lexicon.LexiconEntry;
|
||||
import vazkii.botania.api.recipe.RecipeElvenTrade;
|
||||
import vazkii.botania.api.recipe.RecipeManaInfusion;
|
||||
import vazkii.botania.api.recipe.RecipePetals;
|
||||
import vazkii.botania.api.recipe.RecipeRuneAltar;
|
||||
import vazkii.botania.api.subtile.SubTileEntity;
|
||||
import vazkii.botania.api.wiki.IWikiProvider;
|
||||
import vazkii.botania.api.wiki.SimpleWikiProvider;
|
||||
import vazkii.botania.api.wiki.WikiHooks;
|
||||
|
||||
import com.google.common.collect.BiMap;
|
||||
import com.google.common.collect.HashBiMap;
|
||||
|
||||
public final class BotaniaAPI {
|
||||
|
||||
private static List<LexiconCategory> categories = new ArrayList<LexiconCategory>();
|
||||
private static List<LexiconEntry> allEntries = new ArrayList<LexiconEntry>();
|
||||
|
||||
public static Map<String, KnowledgeType> knowledgeTypes = new HashMap<String, KnowledgeType>();
|
||||
|
||||
public static List<RecipePetals> petalRecipes = new ArrayList<RecipePetals>();
|
||||
public static List<RecipeRuneAltar> runeAltarRecipes = new ArrayList<RecipeRuneAltar>();
|
||||
public static List<RecipeManaInfusion> manaInfusionRecipes = new ArrayList<RecipeManaInfusion>();
|
||||
public static List<RecipeElvenTrade> elvenTradeRecipes = new ArrayList<RecipeElvenTrade>();
|
||||
|
||||
private static BiMap<String, Class<? extends SubTileEntity>> subTiles = HashBiMap.<String, Class<? extends SubTileEntity>> create();
|
||||
public static Set<String> subtilesForCreativeMenu = new LinkedHashSet();
|
||||
|
||||
public static Map<String, Integer> oreWeights = new HashMap<String, Integer>();
|
||||
|
||||
public static Map<Item, Block> seeds = new HashMap();
|
||||
|
||||
public static ArmorMaterial manasteelArmorMaterial = EnumHelper.addArmorMaterial("MANASTEEL", 16, new int[] { 2, 6, 5, 2 }, 18);
|
||||
public static ToolMaterial manasteelToolMaterial = EnumHelper.addToolMaterial("MANASTEEL", 3, 300, 6.2F, 2F, 20);
|
||||
|
||||
public static ArmorMaterial elementiumArmorMaterial = EnumHelper.addArmorMaterial("B_ELEMENTIUM", 18, new int[] { 2, 6, 5, 2 }, 18);
|
||||
public static ToolMaterial elementiumToolMaterial = EnumHelper.addToolMaterial("B_ELEMENTIUM", 3, 720, 6.2F, 2F, 20);
|
||||
|
||||
public static ArmorMaterial terrasteelArmorMaterial = EnumHelper.addArmorMaterial("TERRASTEEL", 34, new int[] {3, 8, 6, 3}, 26);
|
||||
public static ToolMaterial terrasteelToolMaterial = EnumHelper.addToolMaterial("TERRASTEEL", 3, 2300, 9F, 3F, 26);
|
||||
|
||||
public static KnowledgeType basicKnowledge, elvenKnowledge;
|
||||
|
||||
static {
|
||||
registerSubTile("", DummySubTile.class);
|
||||
|
||||
basicKnowledge = registerKnowledgeType("minecraft", EnumChatFormatting.RESET, true);
|
||||
elvenKnowledge = registerKnowledgeType("alfheim", EnumChatFormatting.DARK_GREEN, false);
|
||||
|
||||
addOreWeight("oreAluminum", 3940); // Tinkers' Construct
|
||||
addOreWeight("oreAmber", 2075); // Thaumcraft
|
||||
addOreWeight("oreApatite", 1595); // Forestry
|
||||
addOreWeight("oreBlueTopaz", 3195); // Ars Magica
|
||||
addOreWeight("oreCassiterite", 1634); // GregTech
|
||||
addOreWeight("oreCertusQuartz", 3975); // Applied Energistics
|
||||
addOreWeight("oreChimerite", 3970); // Ars Magica
|
||||
addOreWeight("oreCinnabar", 2585); // Thaumcraft
|
||||
addOreWeight("oreCoal", 46525); // Vanilla
|
||||
addOreWeight("oreCooperite", 5); // GregTech
|
||||
addOreWeight("oreCopper", 8325); // IC2, Thermal Expansion, Tinkers' Construct, etc.
|
||||
addOreWeight("oreDarkIron", 1700); // Factorization
|
||||
addOreWeight("oreDiamond", 1265); // Vanilla
|
||||
addOreWeight("oreEmerald", 780); // Vanilla
|
||||
addOreWeight("oreEmery", 415); // GregTech
|
||||
addOreWeight("oreGalena", 1000); // Factorization
|
||||
addOreWeight("oreGold", 2970); // Vanilla
|
||||
addOreWeight("oreInfusedAir", 925); // Thaumcraft
|
||||
addOreWeight("oreInfusedEarth", 925); // Thaumcraft
|
||||
addOreWeight("oreInfusedEntropy", 925); // Thaumcraft
|
||||
addOreWeight("oreInfusedFire", 925); // Thaumcraft
|
||||
addOreWeight("oreInfusedOrder", 925); // Thaumcraft
|
||||
addOreWeight("oreInfusedWater", 925); // Thaumcraft
|
||||
addOreWeight("oreIridium", 30); // GregTech
|
||||
addOreWeight("oreIron", 20665); // Vanilla
|
||||
addOreWeight("oreLapis", 1285); // Vanilla
|
||||
addOreWeight("oreLead", 7985); // IC2, Thermal Expansion, Factorization, etc.
|
||||
addOreWeight("oreMCropsEssence", 3085); // Magical Crops
|
||||
addOreWeight("oreNickel", 2275); // Thermal Expansion
|
||||
addOreWeight("oreOlivine", 1100); // Project RED
|
||||
addOreWeight("oreRedstone", 6885); // Vanilla
|
||||
addOreWeight("oreRuby", 1100); // Project RED
|
||||
addOreWeight("oreSapphire", 1100); // Project RED
|
||||
addOreWeight("oreSilver", 6300); // Thermal Expansion, Factorization, etc.
|
||||
addOreWeight("oreSphalerite", 25); // GregTech
|
||||
addOreWeight("oreSulfur", 1105); // Railcraft
|
||||
addOreWeight("oreTetrahedrite", 4040); // GregTech
|
||||
addOreWeight("oreTin", 9450); // IC2, Thermal Expansion, etc.
|
||||
addOreWeight("oreTungstate", 20); // GregTech
|
||||
addOreWeight("oreUranium", 1337); // IC2
|
||||
addOreWeight("oreVinteum", 5925); // Ars Magica
|
||||
addOreWeight("oreYellorite", 3520); // Big Reactors
|
||||
addOreWeight("oreZinc", 6485); // Flaxbeard's Steam Power
|
||||
|
||||
addSeed(Items.wheat_seeds, Blocks.wheat);
|
||||
addSeed(Items.potato, Blocks.potatoes);
|
||||
addSeed(Items.carrot, Blocks.carrots);
|
||||
addSeed(Items.nether_wart, Blocks.nether_wart);
|
||||
addSeed(Items.pumpkin_seeds, Blocks.pumpkin_stem);
|
||||
addSeed(Items.melon_seeds, Blocks.melon_stem);
|
||||
|
||||
registerModWiki("Minecraft", new SimpleWikiProvider("Minecraft Wiki", "http://minecraft.gamepedia.com/%s"));
|
||||
|
||||
IWikiProvider technicWiki = new SimpleWikiProvider("Technic Wiki", "http://wiki.technicpack.net/%s");
|
||||
IWikiProvider mekanismWiki = new SimpleWikiProvider("Mekanism Wiki", "http://wiki.aidancbrady.com/wiki/%s");
|
||||
IWikiProvider buildcraftWiki = new SimpleWikiProvider("BuildCraft Wiki", "http://www.mod-buildcraft.com/wiki/doku.php?id=%s");
|
||||
|
||||
registerModWiki("Mekanism", mekanismWiki);
|
||||
registerModWiki("MekanismGenerators", mekanismWiki);
|
||||
registerModWiki("MekanismTools", mekanismWiki);
|
||||
registerModWiki("EnderIO", new SimpleWikiProvider("EnderIO Wiki", "http://wiki.enderio.com/%s"));
|
||||
registerModWiki("TropiCraft", new SimpleWikiProvider("Tropicraft Wiki", "http://wiki.tropicraft.net/wiki/%s"));
|
||||
registerModWiki("RandomThings", new SimpleWikiProvider("Random Things Wiki", "http://randomthingsminecraftmod.wikispaces.com/%s"));
|
||||
registerModWiki("Witchery", new SimpleWikiProvider("Witchery Wiki", "https://sites.google.com/site/witcherymod/%s", "-"));
|
||||
registerModWiki("AppliedEnergistics2", new SimpleWikiProvider("AE2 Wiki", "http://ae-mod.info/%s"));
|
||||
registerModWiki("BigReactors", technicWiki);
|
||||
registerModWiki("BuildCraft|Core", buildcraftWiki);
|
||||
registerModWiki("BuildCraft|Builders", buildcraftWiki);
|
||||
registerModWiki("BuildCraft|Energy", buildcraftWiki);
|
||||
registerModWiki("BuildCraft|Factory", buildcraftWiki);
|
||||
registerModWiki("BuildCraft|Silicon", buildcraftWiki);
|
||||
registerModWiki("BuildCraft|Transport", buildcraftWiki);
|
||||
registerModWiki("ArsMagica2", new SimpleWikiProvider("ArsMagica2 Wiki", "http://wiki.arsmagicamod.com/wiki/%s"));
|
||||
registerModWiki("PneumaticCraft", new SimpleWikiProvider("PneumaticCraft Wiki", "http://www.minemaarten.com/wikis/pneumaticcraft-wiki/pneumaticcraft-wiki-%s"));
|
||||
registerModWiki("StevesCarts2", new SimpleWikiProvider("Steve's Carts Wiki", "http://stevescarts2.wikispaces.com/%s"));
|
||||
registerModWiki("GanysSurface", new SimpleWikiProvider("Gany's Surface Wiki", "http://ganys-surface.wikia.com/wiki/%s"));
|
||||
registerModWiki("GanysNether", new SimpleWikiProvider("Gany's Nether Wiki", "http://ganys-nether.wikia.com/wiki/%s"));
|
||||
registerModWiki("GanysEnd", new SimpleWikiProvider("Gany's End Wiki", "http://ganys-end.wikia.com/wiki/%s"));
|
||||
}
|
||||
|
||||
/**
|
||||
* The internal method handler in use. Do not overwrite.
|
||||
* @see IInternalMethodHandler
|
||||
*/
|
||||
public static IInternalMethodHandler internalHandler = new DummyMethodHandler();
|
||||
|
||||
|
||||
/**
|
||||
* Registers a new Knowledge Type.
|
||||
* @param id The ID for this knowledge type.
|
||||
* @param color The color to display this knowledge type as.
|
||||
*/
|
||||
public static KnowledgeType registerKnowledgeType(String id, EnumChatFormatting color, boolean autoUnlock) {
|
||||
KnowledgeType type = new KnowledgeType(id, color, autoUnlock);
|
||||
knowledgeTypes.put(id, type);
|
||||
return type;
|
||||
}
|
||||
|
||||
/**
|
||||
* Registers a Petal Recipe.
|
||||
* @param output The ItemStack to craft.
|
||||
* @param inputs The objects for crafting. Can be ItemStack, MappableStackWrapper
|
||||
* or String (case for Ore Dictionary). The array can't be larger than 16.
|
||||
* @return The recipe created.
|
||||
*/
|
||||
public static RecipePetals registerPetalRecipe(ItemStack output, Object... inputs) {
|
||||
RecipePetals recipe = new RecipePetals(output, inputs);
|
||||
petalRecipes.add(recipe);
|
||||
return recipe;
|
||||
}
|
||||
|
||||
/**
|
||||
* Registers a Rune Altar
|
||||
* @param output The ItemStack to craft.
|
||||
* @param mana The amount of mana required. Don't go over 100000!
|
||||
* @param inputs The objects for crafting. Can be ItemStack, MappableStackWrapper
|
||||
* or String (case for Ore Dictionary). The array can't be larger than 16.
|
||||
* @return The recipe created.
|
||||
*/
|
||||
public static RecipeRuneAltar registerRuneAltarRecipe(ItemStack output, int mana, Object... inputs) {
|
||||
RecipeRuneAltar recipe = new RecipeRuneAltar(output, mana, inputs);
|
||||
runeAltarRecipes.add(recipe);
|
||||
return recipe;
|
||||
}
|
||||
|
||||
/**
|
||||
* Registers a Mana Infusion Recipe (throw an item in a mana pool)
|
||||
* @param output The ItemStack to craft
|
||||
* @param input The input item, be it an ItemStack or an ore dictionary entry String.
|
||||
* @param mana The amount of mana required. Don't go over 100000!
|
||||
* @return The recipe created.
|
||||
*/
|
||||
public static RecipeManaInfusion registerManaInfusionRecipe(ItemStack output, Object input, int mana) {
|
||||
RecipeManaInfusion recipe = new RecipeManaInfusion(output, input, mana);
|
||||
manaInfusionRecipes.add(recipe);
|
||||
return recipe;
|
||||
}
|
||||
|
||||
/**
|
||||
* Register a Mana Infusion Recipe and flags it as an Alchemy recipe (requires an
|
||||
* Alchemy Catalyst below the pool).
|
||||
* @see BotaniaAPI#registerManaInfusionRecipe
|
||||
*/
|
||||
public static RecipeManaInfusion registerManaAlchemyRecipe(ItemStack output, Object input, int mana) {
|
||||
RecipeManaInfusion recipe = registerManaInfusionRecipe(output, input, mana);
|
||||
recipe.setAlchemy(true);
|
||||
return recipe;
|
||||
}
|
||||
|
||||
/**
|
||||
* Register a Mana Infusion Recipe and flags it as an Conjuration recipe (requires a
|
||||
* Conjuration Catalyst below the pool).
|
||||
* @see BotaniaAPI#registerManaInfusionRecipe
|
||||
*/
|
||||
public static RecipeManaInfusion registerManaConjurationRecipe(ItemStack output, Object input, int mana) {
|
||||
RecipeManaInfusion recipe = registerManaInfusionRecipe(output, input, mana);
|
||||
recipe.setConjuration(true);
|
||||
return recipe;
|
||||
}
|
||||
|
||||
/**
|
||||
* Registers a Elven Trade recipe (throw an item in an Alfheim Portal).
|
||||
* @param output The ItemStack to return.
|
||||
* @param inputs The items required, can be ItemStack or ore dictionary entry string.
|
||||
* @return The recipe created.
|
||||
*/
|
||||
public static RecipeElvenTrade registerElvenTradeRecipe(ItemStack output, Object... inputs) {
|
||||
RecipeElvenTrade recipe = new RecipeElvenTrade(output, inputs);
|
||||
elvenTradeRecipes.add(recipe);
|
||||
return recipe;
|
||||
}
|
||||
|
||||
/**
|
||||
* Registers a SubTileEntity, a new special flower. Look in the subtile package of the API.
|
||||
*/
|
||||
public static void registerSubTile(String key, Class<? extends SubTileEntity> subtileClass) {
|
||||
subTiles.put(key, subtileClass);
|
||||
}
|
||||
|
||||
/**
|
||||
* Adds the key for a SubTileEntity into the creative menu. This goes into the
|
||||
* subtilesForCreativeMenu Set.
|
||||
*/
|
||||
public static void addSubTileToCreativeMenu(String key) {
|
||||
subtilesForCreativeMenu.add(key);
|
||||
}
|
||||
|
||||
/**
|
||||
* Adds a category to the list of registered categories to appear in the Lexicon.
|
||||
*/
|
||||
public static void addCategory(LexiconCategory category) {
|
||||
categories.add(category);
|
||||
}
|
||||
|
||||
/**
|
||||
* Gets all registered categories.
|
||||
*/
|
||||
public static List<LexiconCategory> getAllCategories() {
|
||||
return categories;
|
||||
}
|
||||
|
||||
/**
|
||||
* Gets all registered entries.
|
||||
*/
|
||||
public static List<LexiconEntry> getAllEntries() {
|
||||
return allEntries;
|
||||
}
|
||||
|
||||
/**
|
||||
* Registers a Lexicon Entry and adds it to the category passed in.
|
||||
*/
|
||||
public static void addEntry(LexiconEntry entry, LexiconCategory category) {
|
||||
allEntries.add(entry);
|
||||
category.entries.add(entry);
|
||||
}
|
||||
|
||||
/**
|
||||
* Maps an ore (ore dictionary key) to it's weight on the world generation. This
|
||||
* is used for the Orechid flower. Check the static block in the BotaniaAPI class
|
||||
* to get the weights for the vanilla blocks.<br>
|
||||
* Alternatively get the values with the OreDetector mod:<br>
|
||||
* https://gist.github.com/Vazkii/9493322
|
||||
*/
|
||||
public static void addOreWeight(String ore, int weight) {
|
||||
oreWeights.put(ore, weight);
|
||||
}
|
||||
|
||||
public static int getOreWeight(String ore) {
|
||||
return oreWeights.get(ore);
|
||||
}
|
||||
|
||||
/**
|
||||
* Allows an item to be counted as a seed. Any item in this list can be
|
||||
* dispensed by a dispenser, the block is the block to be placed.
|
||||
*/
|
||||
public static void addSeed(Item item, Block block) {
|
||||
seeds.put(item, block);
|
||||
}
|
||||
|
||||
/**
|
||||
* Gets the last recipe to have been added to the recipe list.
|
||||
*/
|
||||
public static IRecipe getLatestAddedRecipe() {
|
||||
List<IRecipe> list = CraftingManager.getInstance().getRecipeList();
|
||||
return list.get(list.size() - 1);
|
||||
}
|
||||
|
||||
/**
|
||||
* Gets the last x recipes added to the recipe list.
|
||||
*/
|
||||
public static List<IRecipe> getLatestAddedRecipes(int x) {
|
||||
List<IRecipe> list = CraftingManager.getInstance().getRecipeList();
|
||||
List<IRecipe> newList = new ArrayList();
|
||||
for(int i = x - 1; i >= 0; i--)
|
||||
newList.add(list.get(list.size() - 1 - i));
|
||||
|
||||
return newList;
|
||||
}
|
||||
|
||||
/**
|
||||
* Registers a Wiki provider for a mod so it uses that instead of the fallback
|
||||
* FTB wiki. Make sure to call this on PostInit only!
|
||||
*/
|
||||
public static void registerModWiki(String mod, IWikiProvider provider) {
|
||||
WikiHooks.registerModWiki(mod, provider);
|
||||
}
|
||||
|
||||
public static Class<? extends SubTileEntity> getSubTileMapping(String key) {
|
||||
if(!subTiles.containsKey(key))
|
||||
key = "";
|
||||
|
||||
return subTiles.get(key);
|
||||
}
|
||||
|
||||
public static String getSubTileStringMapping(Class<? extends SubTileEntity> clazz) {
|
||||
return subTiles.inverse().get(clazz);
|
||||
}
|
||||
}
|
|
@ -0,0 +1,51 @@
|
|||
/**
|
||||
* This class was created by <Vazkii>. It's distributed as
|
||||
* part of the Botania Mod. Get the Source Code in github:
|
||||
* https://github.com/Vazkii/Botania
|
||||
*
|
||||
* Botania is Open Source and distributed under a
|
||||
* Creative Commons Attribution-NonCommercial-ShareAlike 3.0 License
|
||||
* (http://creativecommons.org/licenses/by-nc-sa/3.0/deed.en_GB)
|
||||
*
|
||||
* File Created @ [Mar 7, 2014, 3:47:43 PM (GMT)]
|
||||
*/
|
||||
package vazkii.botania.api.internal;
|
||||
|
||||
import java.util.ArrayList;
|
||||
import java.util.List;
|
||||
|
||||
import net.minecraft.tileentity.TileEntity;
|
||||
import net.minecraft.util.ChunkCoordinates;
|
||||
import net.minecraft.world.World;
|
||||
import vazkii.botania.api.mana.TileSignature;
|
||||
|
||||
public class DummyManaNetwork implements IManaNetwork {
|
||||
|
||||
public static final DummyManaNetwork instance = new DummyManaNetwork();
|
||||
|
||||
@Override
|
||||
public void clear() {
|
||||
// NO-OP
|
||||
}
|
||||
|
||||
@Override
|
||||
public TileEntity getClosestPool(ChunkCoordinates pos, World world, int limit) {
|
||||
return null;
|
||||
}
|
||||
|
||||
@Override
|
||||
public TileEntity getClosestCollector(ChunkCoordinates pos, World world, int limit) {
|
||||
return null;
|
||||
}
|
||||
|
||||
@Override
|
||||
public List<TileSignature> getAllCollectorsInWorld(World world) {
|
||||
return new ArrayList();
|
||||
}
|
||||
|
||||
@Override
|
||||
public List<TileSignature> getAllPoolsInWorld(World world) {
|
||||
return new ArrayList();
|
||||
}
|
||||
|
||||
}
|
135
src/api/java/vazkii/botania/api/internal/DummyMethodHandler.java
Normal file
135
src/api/java/vazkii/botania/api/internal/DummyMethodHandler.java
Normal file
|
@ -0,0 +1,135 @@
|
|||
/**
|
||||
* This class was created by <Vazkii>. It's distributed as
|
||||
* part of the Botania Mod. Get the Source Code in github:
|
||||
* https://github.com/Vazkii/Botania
|
||||
*
|
||||
* Botania is Open Source and distributed under a
|
||||
* Creative Commons Attribution-NonCommercial-ShareAlike 3.0 License
|
||||
* (http://creativecommons.org/licenses/by-nc-sa/3.0/deed.en_GB)
|
||||
*
|
||||
* File Created @ [Jan 14, 2014, 6:43:03 PM (GMT)]
|
||||
*/
|
||||
package vazkii.botania.api.internal;
|
||||
|
||||
import java.util.List;
|
||||
|
||||
import net.minecraft.client.gui.ScaledResolution;
|
||||
import net.minecraft.entity.player.EntityPlayer;
|
||||
import net.minecraft.init.Blocks;
|
||||
import net.minecraft.inventory.IInventory;
|
||||
import net.minecraft.item.ItemStack;
|
||||
import net.minecraft.item.crafting.IRecipe;
|
||||
import net.minecraft.util.IIcon;
|
||||
import net.minecraft.world.World;
|
||||
import vazkii.botania.api.lexicon.LexiconPage;
|
||||
import vazkii.botania.api.recipe.RecipeElvenTrade;
|
||||
import vazkii.botania.api.recipe.RecipeManaInfusion;
|
||||
import vazkii.botania.api.recipe.RecipePetals;
|
||||
import vazkii.botania.api.recipe.RecipeRuneAltar;
|
||||
|
||||
public class DummyMethodHandler implements IInternalMethodHandler {
|
||||
|
||||
@Override
|
||||
public LexiconPage textPage(String key) {
|
||||
return dummyPage(key);
|
||||
}
|
||||
|
||||
@Override
|
||||
public LexiconPage imagePage(String key, String resource) {
|
||||
return dummyPage(key);
|
||||
}
|
||||
|
||||
@Override
|
||||
public LexiconPage craftingRecipesPage(String key, List<IRecipe> recipes) {
|
||||
return dummyPage(key);
|
||||
}
|
||||
|
||||
@Override
|
||||
public LexiconPage craftingRecipePage(String key, IRecipe recipe) {
|
||||
return dummyPage(key);
|
||||
}
|
||||
|
||||
@Override
|
||||
public LexiconPage petalRecipesPage(String key, List<RecipePetals> recipes) {
|
||||
return dummyPage(key);
|
||||
}
|
||||
|
||||
@Override
|
||||
public LexiconPage petalRecipePage(String key, RecipePetals recipe) {
|
||||
return dummyPage(key);
|
||||
}
|
||||
|
||||
@Override
|
||||
public LexiconPage runeRecipesPage(String key, List<RecipeRuneAltar> recipes) {
|
||||
return dummyPage(key);
|
||||
}
|
||||
|
||||
@Override
|
||||
public LexiconPage runeRecipePage(String key, RecipeRuneAltar recipe) {
|
||||
return dummyPage(key);
|
||||
}
|
||||
|
||||
@Override
|
||||
public LexiconPage manaInfusionRecipesPage(String key, List<RecipeManaInfusion> recipes) {
|
||||
return dummyPage(key);
|
||||
}
|
||||
|
||||
@Override
|
||||
public LexiconPage manaInfusionRecipePage(String key, RecipeManaInfusion recipe) {
|
||||
return dummyPage(key);
|
||||
}
|
||||
|
||||
@Override
|
||||
public LexiconPage elvenTradePage(String key, List<RecipeElvenTrade> recipes) {
|
||||
return dummyPage(key);
|
||||
}
|
||||
|
||||
@Override
|
||||
public LexiconPage elvenTradesPage(String key, RecipeElvenTrade recipe) {
|
||||
return dummyPage(key);
|
||||
}
|
||||
|
||||
private LexiconPage dummyPage(String key) {
|
||||
return new DummyPage(key);
|
||||
}
|
||||
|
||||
@Override
|
||||
public ItemStack getSubTileAsStack(String subTile) {
|
||||
return new ItemStack(Blocks.stone, 0, 0);
|
||||
}
|
||||
|
||||
@Override
|
||||
public IIcon getSubTileIconForName(String name) {
|
||||
return Blocks.red_flower.getIcon(0, 0);
|
||||
}
|
||||
|
||||
@Override
|
||||
public IManaNetwork getManaNetworkInstance() {
|
||||
return DummyManaNetwork.instance;
|
||||
}
|
||||
|
||||
@Override
|
||||
public void drawSimpleManaHUD(int color, int mana, int maxMana, String name, ScaledResolution res) {
|
||||
// NO-OP
|
||||
}
|
||||
|
||||
@Override
|
||||
public void sparkleFX(World world, double x, double y, double z, float r, float g, float b, float size, int m) {
|
||||
// NO-OP
|
||||
}
|
||||
|
||||
@Override
|
||||
public IInventory getBaublesInventory(EntityPlayer player) {
|
||||
return null;
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean shouldForceCheck() {
|
||||
return true;
|
||||
}
|
||||
|
||||
@Override
|
||||
public int getPassiveFlowerDecay() {
|
||||
return 0;
|
||||
}
|
||||
}
|
35
src/api/java/vazkii/botania/api/internal/DummyPage.java
Normal file
35
src/api/java/vazkii/botania/api/internal/DummyPage.java
Normal file
|
@ -0,0 +1,35 @@
|
|||
/**
|
||||
* This class was created by <Vazkii>. It's distributed as
|
||||
* part of the Botania Mod. Get the Source Code in github:
|
||||
* https://github.com/Vazkii/Botania
|
||||
*
|
||||
* Botania is Open Source and distributed under a
|
||||
* Creative Commons Attribution-NonCommercial-ShareAlike 3.0 License
|
||||
* (http://creativecommons.org/licenses/by-nc-sa/3.0/deed.en_GB)
|
||||
*
|
||||
* File Created @ [Jan 14, 2014, 6:41:23 PM (GMT)]
|
||||
*/
|
||||
package vazkii.botania.api.internal;
|
||||
|
||||
import vazkii.botania.api.lexicon.LexiconPage;
|
||||
import cpw.mods.fml.relauncher.Side;
|
||||
import cpw.mods.fml.relauncher.SideOnly;
|
||||
|
||||
/**
|
||||
* A dummy page. It does absolutely nothing and is only
|
||||
* existant to make sure everything goes right even if
|
||||
* Botania isn't loaded.
|
||||
*/
|
||||
public class DummyPage extends LexiconPage {
|
||||
|
||||
public DummyPage(String unlocalizedName) {
|
||||
super(unlocalizedName);
|
||||
}
|
||||
|
||||
@Override
|
||||
@SideOnly(Side.CLIENT)
|
||||
public void renderScreen(IGuiLexiconEntry gui, int x, int y) {
|
||||
// NO-OP
|
||||
}
|
||||
|
||||
}
|
18
src/api/java/vazkii/botania/api/internal/DummySubTile.java
Normal file
18
src/api/java/vazkii/botania/api/internal/DummySubTile.java
Normal file
|
@ -0,0 +1,18 @@
|
|||
/**
|
||||
* This class was created by <Vazkii>. It's distributed as
|
||||
* part of the Botania Mod. Get the Source Code in github:
|
||||
* https://github.com/Vazkii/Botania
|
||||
*
|
||||
* Botania is Open Source and distributed under a
|
||||
* Creative Commons Attribution-NonCommercial-ShareAlike 3.0 License
|
||||
* (http://creativecommons.org/licenses/by-nc-sa/3.0/deed.en_GB)
|
||||
*
|
||||
* File Created @ [Jan 24, 2014, 4:17:33 PM (GMT)]
|
||||
*/
|
||||
package vazkii.botania.api.internal;
|
||||
|
||||
import vazkii.botania.api.subtile.SubTileEntity;
|
||||
|
||||
public class DummySubTile extends SubTileEntity {
|
||||
|
||||
}
|
|
@ -0,0 +1,57 @@
|
|||
/**
|
||||
* This class was created by <Vazkii>. It's distributed as
|
||||
* part of the Botania Mod. Get the Source Code in github:
|
||||
* https://github.com/Vazkii/Botania
|
||||
*
|
||||
* Botania is Open Source and distributed under a
|
||||
* Creative Commons Attribution-NonCommercial-ShareAlike 3.0 License
|
||||
* (http://creativecommons.org/licenses/by-nc-sa/3.0/deed.en_GB)
|
||||
*
|
||||
* File Created @ [Jan 14, 2014, 6:48:41 PM (GMT)]
|
||||
*/
|
||||
package vazkii.botania.api.internal;
|
||||
|
||||
import vazkii.botania.api.lexicon.LexiconEntry;
|
||||
|
||||
/**
|
||||
* Internal interface for the Lexicon Entry GUI. This contains
|
||||
* everything that can be accessed from it. It's safe to cast
|
||||
* this type to GuiScreen.
|
||||
*/
|
||||
public interface IGuiLexiconEntry {
|
||||
|
||||
/**
|
||||
* Gets the entry currently portrayed in this gui.
|
||||
*/
|
||||
public LexiconEntry getEntry();
|
||||
|
||||
/**
|
||||
* Gets the current page the lexicon GUI is browsing.
|
||||
*/
|
||||
public int getPageOn();
|
||||
|
||||
/**
|
||||
* Gets the leftmost part of the GUI.
|
||||
*/
|
||||
public int getLeft();
|
||||
|
||||
/**
|
||||
* Gets the topmost part of the GUI.
|
||||
*/
|
||||
public int getTop();
|
||||
|
||||
/**
|
||||
* Gets the GUI's width.
|
||||
*/
|
||||
public int getWidth();
|
||||
|
||||
/**
|
||||
* Gets the GUI's height
|
||||
*/
|
||||
public int getHeight();
|
||||
|
||||
/**
|
||||
* Gets the GUI's Z level for rendering.
|
||||
*/
|
||||
public float getZLevel();
|
||||
}
|
|
@ -0,0 +1,81 @@
|
|||
/**
|
||||
* This class was created by <Vazkii>. It's distributed as
|
||||
* part of the Botania Mod. Get the Source Code in github:
|
||||
* https://github.com/Vazkii/Botania
|
||||
*
|
||||
* Botania is Open Source and distributed under a
|
||||
* Creative Commons Attribution-NonCommercial-ShareAlike 3.0 License
|
||||
* (http://creativecommons.org/licenses/by-nc-sa/3.0/deed.en_GB)
|
||||
*
|
||||
* File Created @ [Jan 14, 2014, 6:34:34 PM (GMT)]
|
||||
*/
|
||||
package vazkii.botania.api.internal;
|
||||
|
||||
import java.util.List;
|
||||
|
||||
import net.minecraft.client.gui.ScaledResolution;
|
||||
import net.minecraft.entity.player.EntityPlayer;
|
||||
import net.minecraft.inventory.IInventory;
|
||||
import net.minecraft.item.ItemStack;
|
||||
import net.minecraft.item.crafting.IRecipe;
|
||||
import net.minecraft.util.IIcon;
|
||||
import net.minecraft.world.World;
|
||||
import vazkii.botania.api.lexicon.LexiconPage;
|
||||
import vazkii.botania.api.recipe.RecipeElvenTrade;
|
||||
import vazkii.botania.api.recipe.RecipeManaInfusion;
|
||||
import vazkii.botania.api.recipe.RecipePetals;
|
||||
import vazkii.botania.api.recipe.RecipeRuneAltar;
|
||||
import cpw.mods.fml.relauncher.Side;
|
||||
import cpw.mods.fml.relauncher.SideOnly;
|
||||
|
||||
/**
|
||||
* Any methods that refer to internal methods in Botania are here.
|
||||
* This is defaulted to a dummy handler, whose methods do nothing.
|
||||
* This handler is set to a proper one on PreInit. Make sure to
|
||||
* make your mod load after Botania if you have any intention of
|
||||
* doing anythign with this on PreInit.
|
||||
*/
|
||||
public interface IInternalMethodHandler {
|
||||
|
||||
public LexiconPage textPage(String key);
|
||||
|
||||
public LexiconPage imagePage(String key, String resource);
|
||||
|
||||
public LexiconPage craftingRecipesPage(String key, List<IRecipe> recipes);
|
||||
|
||||
public LexiconPage craftingRecipePage(String key, IRecipe recipe);
|
||||
|
||||
public LexiconPage petalRecipesPage(String key, List<RecipePetals> recipes);
|
||||
|
||||
public LexiconPage petalRecipePage(String key, RecipePetals recipe);
|
||||
|
||||
public LexiconPage runeRecipesPage(String key, List<RecipeRuneAltar> recipes);
|
||||
|
||||
public LexiconPage runeRecipePage(String key, RecipeRuneAltar recipe);
|
||||
|
||||
public LexiconPage manaInfusionRecipesPage(String key, List<RecipeManaInfusion> recipes);
|
||||
|
||||
public LexiconPage manaInfusionRecipePage(String key, RecipeManaInfusion recipe);
|
||||
|
||||
public LexiconPage elvenTradePage(String key, List<RecipeElvenTrade> recipes);
|
||||
|
||||
public LexiconPage elvenTradesPage(String key, RecipeElvenTrade recipe);
|
||||
|
||||
public IManaNetwork getManaNetworkInstance();
|
||||
|
||||
public ItemStack getSubTileAsStack(String subTile);
|
||||
|
||||
public IIcon getSubTileIconForName(String name);
|
||||
|
||||
public boolean shouldForceCheck();
|
||||
|
||||
public int getPassiveFlowerDecay();
|
||||
|
||||
public IInventory getBaublesInventory(EntityPlayer player);
|
||||
|
||||
@SideOnly(Side.CLIENT)
|
||||
public void drawSimpleManaHUD(int color, int mana, int maxMana, String name, ScaledResolution res);
|
||||
|
||||
public void sparkleFX(World world, double x, double y, double z, float r, float g, float b, float size, int m);
|
||||
|
||||
}
|
62
src/api/java/vazkii/botania/api/internal/IManaBurst.java
Normal file
62
src/api/java/vazkii/botania/api/internal/IManaBurst.java
Normal file
|
@ -0,0 +1,62 @@
|
|||
/**
|
||||
* This class was created by <Vazkii>. It's distributed as
|
||||
* part of the Botania Mod. Get the Source Code in github:
|
||||
* https://github.com/Vazkii/Botania
|
||||
*
|
||||
* Botania is Open Source and distributed under a
|
||||
* Creative Commons Attribution-NonCommercial-ShareAlike 3.0 License
|
||||
* (http://creativecommons.org/licenses/by-nc-sa/3.0/deed.en_GB)
|
||||
*
|
||||
* File Created @ [Jan 31, 2014, 4:36:13 PM (GMT)]
|
||||
*/
|
||||
package vazkii.botania.api.internal;
|
||||
|
||||
import net.minecraft.item.ItemStack;
|
||||
import net.minecraft.util.ChunkCoordinates;
|
||||
|
||||
/**
|
||||
* Interface for the Mana Burst entity. This can safely be casted to EntityThrowable.
|
||||
*/
|
||||
public interface IManaBurst {
|
||||
|
||||
public boolean isFake();
|
||||
|
||||
public void setMotion(double x, double y, double z);
|
||||
|
||||
public int getColor();
|
||||
|
||||
public void setColor(int color);
|
||||
|
||||
public int getMana();
|
||||
|
||||
public void setMana(int mana);
|
||||
|
||||
public int getStartingMana();
|
||||
|
||||
public void setStartingMana(int mana);
|
||||
|
||||
public int getMinManaLoss();
|
||||
|
||||
public void setMinManaLoss(int minManaLoss);
|
||||
|
||||
public float getManaLossPerTick();
|
||||
|
||||
public void setManaLossPerTick(float mana);
|
||||
|
||||
public float getGravity();
|
||||
|
||||
public void setGravity(float gravity);
|
||||
|
||||
public ChunkCoordinates getBurstSourceChunkCoordinates();
|
||||
|
||||
public void setBurstSourceCoords(int x, int y, int z);
|
||||
|
||||
public ItemStack getSourceLens();
|
||||
|
||||
public void setSourceLens(ItemStack lens);
|
||||
|
||||
public boolean hasAlreadyCollidedAt(int x, int y, int z);
|
||||
|
||||
public int getTicksExisted();
|
||||
|
||||
}
|
68
src/api/java/vazkii/botania/api/internal/IManaNetwork.java
Normal file
68
src/api/java/vazkii/botania/api/internal/IManaNetwork.java
Normal file
|
@ -0,0 +1,68 @@
|
|||
/**
|
||||
* This class was created by <Vazkii>. It's distributed as
|
||||
* part of the Botania Mod. Get the Source Code in github:
|
||||
* https://github.com/Vazkii/Botania
|
||||
*
|
||||
* Botania is Open Source and distributed under a
|
||||
* Creative Commons Attribution-NonCommercial-ShareAlike 3.0 License
|
||||
* (http://creativecommons.org/licenses/by-nc-sa/3.0/deed.en_GB)
|
||||
*
|
||||
* File Created @ [Mar 7, 2014, 3:39:48 PM (GMT)]
|
||||
*/
|
||||
package vazkii.botania.api.internal;
|
||||
|
||||
import java.util.List;
|
||||
|
||||
import net.minecraft.tileentity.TileEntity;
|
||||
import net.minecraft.util.ChunkCoordinates;
|
||||
import net.minecraft.world.World;
|
||||
import vazkii.botania.api.mana.TileSignature;
|
||||
|
||||
/**
|
||||
* A basic interface for a world's Mana Network.
|
||||
* @see IInternalMethodHandler#getManaNetworkInstance()
|
||||
*/
|
||||
public interface IManaNetwork {
|
||||
|
||||
/**
|
||||
* Clears the entire Mana Network of all it's contents, you probably
|
||||
* don't want to call this unless you have a very good reason.
|
||||
*/
|
||||
public void clear();
|
||||
|
||||
/**
|
||||
* Gets the closest Mana Collector (eg. Mana Spreader) in the network to the Chunk
|
||||
* Coordinates passed in, in the given dimension.<br>
|
||||
* A way of getting the dimension is via worldObj.provider.dimensionId<br>
|
||||
* Note that this function *can* get performance intensive, it's reccomended you
|
||||
* call it sparingly and take cache of the value returned.
|
||||
* @param limit The maximum distance the closest block can be, if the closest block
|
||||
* is farther away than that, null will be returned instead.
|
||||
*/
|
||||
public TileEntity getClosestCollector(ChunkCoordinates pos, World world, int limit);
|
||||
|
||||
/**
|
||||
* Gets the closest Mana Pool in the network to the Chunk Coordinates passed in,
|
||||
* in the given dimension.<br>
|
||||
* A way of getting the dimension is via worldObj.provider.dimensionId<br>
|
||||
* Note that this function *can* get performance intensive, it's reccomended you
|
||||
* call it sparingly and take cache of the value returned.
|
||||
* @param limit The maximum distance the closest block can be, if the closest block
|
||||
* is farther away than that, null will be returned instead.
|
||||
*/
|
||||
public TileEntity getClosestPool(ChunkCoordinates pos, World world, int limit);
|
||||
|
||||
/**
|
||||
* Gets the list of all Mana Collectors (eg. Mana Spreader) in the dimension
|
||||
* passed in. Note that this is the actual list and not a copy, make sure to
|
||||
* clone the list if you intend to change it in any way.
|
||||
*/
|
||||
public List<TileSignature> getAllCollectorsInWorld(World world);
|
||||
|
||||
/**
|
||||
* Gets the list of all Mana Pools in the dimension passed in. Note that this
|
||||
* is the actual list and not a copy, make sure to clone the list if you intend
|
||||
* to change it in any way.
|
||||
*/
|
||||
public List<TileSignature> getAllPoolsInWorld(World world);
|
||||
}
|
44
src/api/java/vazkii/botania/api/item/IExoflameHeatable.java
Normal file
44
src/api/java/vazkii/botania/api/item/IExoflameHeatable.java
Normal file
|
@ -0,0 +1,44 @@
|
|||
/**
|
||||
* This class was created by <Vazkii>. It's distributed as
|
||||
* part of the Botania Mod. Get the Source Code in github:
|
||||
* https://github.com/Vazkii/Botania
|
||||
*
|
||||
* Botania is Open Source and distributed under a
|
||||
* Creative Commons Attribution-NonCommercial-ShareAlike 3.0 License
|
||||
* (http://creativecommons.org/licenses/by-nc-sa/3.0/deed.en_GB)
|
||||
*
|
||||
* File Created @ [Aug 30, 2014, 4:28:29 PM (GMT)]
|
||||
*/
|
||||
package vazkii.botania.api.item;
|
||||
|
||||
/**
|
||||
* A TileEntity that implements this can be heated by an Exoflame flower.
|
||||
*/
|
||||
public interface IExoflameHeatable {
|
||||
|
||||
/**
|
||||
* Can this TileEntity smelt its contents. If true, the Exoflame is allowed
|
||||
* to fuel it.
|
||||
*/
|
||||
public boolean canSmelt();
|
||||
|
||||
/**
|
||||
* Gets the amount of ticks left for the fuel. If below 2, the exoflame
|
||||
* will call boostBurnTime.
|
||||
*/
|
||||
public int getBurnTime();
|
||||
|
||||
/**
|
||||
* Called to increase the amount of time this furnace should be burning
|
||||
* the fuel for. Even if it doesn't have any fuel.
|
||||
*/
|
||||
public void boostBurnTime();
|
||||
|
||||
/**
|
||||
* Called once every two ticks to increase the speed of the furnace. Feel
|
||||
* free to not do anything if all you want is to allow the exoflame to feed
|
||||
* it, not make it faster.
|
||||
*/
|
||||
public void boostCookTime();
|
||||
|
||||
}
|
|
@ -0,0 +1,29 @@
|
|||
/**
|
||||
* This class was created by <Vazkii>. It's distributed as
|
||||
* part of the Botania Mod. Get the Source Code in github:
|
||||
* https://github.com/Vazkii/Botania
|
||||
*
|
||||
* Botania is Open Source and distributed under a
|
||||
* Creative Commons Attribution-NonCommercial-ShareAlike 3.0 License
|
||||
* (http://creativecommons.org/licenses/by-nc-sa/3.0/deed.en_GB)
|
||||
*
|
||||
* File Created @ [Aug 6, 2014, 6:02:29 PM (GMT)]
|
||||
*/
|
||||
package vazkii.botania.api.item;
|
||||
|
||||
/**
|
||||
* An interface that defines an instance of PlayerControllerMP with
|
||||
* the ability to modify reach. See vazkii.botania.client.core.handler.BotaniaPlayerController
|
||||
*/
|
||||
public interface IExtendedPlayerController {
|
||||
|
||||
/**
|
||||
* Sets the extra reach the player should have.
|
||||
*/
|
||||
public void setReachDistanceExtension(float f);
|
||||
|
||||
/**
|
||||
* Gets the current reach extension.
|
||||
*/
|
||||
public float getReachDistanceExtension();
|
||||
}
|
30
src/api/java/vazkii/botania/api/item/IPetalApothecary.java
Normal file
30
src/api/java/vazkii/botania/api/item/IPetalApothecary.java
Normal file
|
@ -0,0 +1,30 @@
|
|||
/**
|
||||
* This class was created by <Vazkii>. It's distributed as
|
||||
* part of the Botania Mod. Get the Source Code in github:
|
||||
* https://github.com/Vazkii/Botania
|
||||
*
|
||||
* Botania is Open Source and distributed under a
|
||||
* Creative Commons Attribution-NonCommercial-ShareAlike 3.0 License
|
||||
* (http://creativecommons.org/licenses/by-nc-sa/3.0/deed.en_GB)
|
||||
*
|
||||
* File Created @ [Aug 30, 2014, 4:22:15 PM (GMT)]
|
||||
*/
|
||||
package vazkii.botania.api.item;
|
||||
|
||||
/**
|
||||
* Base Interface for the Petal Apothecary block. Can
|
||||
* be safely casted to TileEntity.
|
||||
*/
|
||||
public interface IPetalApothecary {
|
||||
|
||||
/**
|
||||
* Sets if the the apothecary has water or not.
|
||||
*/
|
||||
public void setWater(boolean water);
|
||||
|
||||
/**
|
||||
* Does the apothecary have water in it?
|
||||
*/
|
||||
public boolean hasWater();
|
||||
|
||||
}
|
30
src/api/java/vazkii/botania/api/item/IPixieSpawner.java
Normal file
30
src/api/java/vazkii/botania/api/item/IPixieSpawner.java
Normal file
|
@ -0,0 +1,30 @@
|
|||
/**
|
||||
* This class was created by <Vazkii>. It's distributed as
|
||||
* part of the Botania Mod. Get the Source Code in github:
|
||||
* https://github.com/Vazkii/Botania
|
||||
*
|
||||
* Botania is Open Source and distributed under a
|
||||
* Creative Commons Attribution-NonCommercial-ShareAlike 3.0 License
|
||||
* (http://creativecommons.org/licenses/by-nc-sa/3.0/deed.en_GB)
|
||||
*
|
||||
* File Created @ [Aug 6, 2014, 6:06:27 PM (GMT)]
|
||||
*/
|
||||
package vazkii.botania.api.item;
|
||||
|
||||
import net.minecraft.item.ItemStack;
|
||||
|
||||
/**
|
||||
* Any item that implements this allows for pixies to be spawned when the player takes damage when...<br>
|
||||
* - Case the item is armor, having it equipped.<br>
|
||||
* - Case the item is a bauble, having it worn.<br>
|
||||
* - On any other case, having the item being the current held item.
|
||||
*/
|
||||
public interface IPixieSpawner {
|
||||
|
||||
/**
|
||||
* The chance this item adds for pixies to be spawned. From 0.0 to 1.0. All values
|
||||
* are put together when calculating.
|
||||
*/
|
||||
public float getPixieChance(ItemStack stack);
|
||||
|
||||
}
|
29
src/api/java/vazkii/botania/api/lexicon/IAddonEntry.java
Normal file
29
src/api/java/vazkii/botania/api/lexicon/IAddonEntry.java
Normal file
|
@ -0,0 +1,29 @@
|
|||
/**
|
||||
* This class was created by <Vazkii>. It's distributed as
|
||||
* part of the Botania Mod. Get the Source Code in github:
|
||||
* https://github.com/Vazkii/Botania
|
||||
*
|
||||
* Botania is Open Source and distributed under a
|
||||
* Creative Commons Attribution-NonCommercial-ShareAlike 3.0 License
|
||||
* (http://creativecommons.org/licenses/by-nc-sa/3.0/deed.en_GB)
|
||||
*
|
||||
* File Created @ [Jun 8, 2014, 7:02:48 PM (GMT)]
|
||||
*/
|
||||
package vazkii.botania.api.lexicon;
|
||||
|
||||
/**
|
||||
* Have a LexiconEntry implement this to signify it's an "Addon entry", as
|
||||
* in, one provided by an Addon. This allows it to draw a subtitle of
|
||||
* sorts, to prevent the [Mod tag here] nonsense that happened with thaumcraft
|
||||
* addons. It can also be used for other purposes, such as stating an
|
||||
* entry is WIP.
|
||||
*/
|
||||
public interface IAddonEntry {
|
||||
|
||||
/**
|
||||
* Returns the <b>unlocalized</b> subtitle to show below the title. Here you'd
|
||||
* return something like "(This Entry is provided by the Botanic Tinkerer addon)".
|
||||
*/
|
||||
public String getSubtitle();
|
||||
|
||||
}
|
21
src/api/java/vazkii/botania/api/lexicon/ILexicon.java
Normal file
21
src/api/java/vazkii/botania/api/lexicon/ILexicon.java
Normal file
|
@ -0,0 +1,21 @@
|
|||
package vazkii.botania.api.lexicon;
|
||||
|
||||
import net.minecraft.item.ItemStack;
|
||||
|
||||
/**
|
||||
* Basic interface for the Lexica Botania.
|
||||
*/
|
||||
public interface ILexicon {
|
||||
|
||||
/**
|
||||
* Gets if a specific knowledge is unlocked. Check the knowledge types in
|
||||
* BotaniaAPI.
|
||||
*/
|
||||
public boolean isKnowledgeUnlocked(ItemStack stack, KnowledgeType knowledge);
|
||||
|
||||
/**
|
||||
* Unlocks a specfic type of knowledge.
|
||||
*/
|
||||
public void unlockKnowledge(ItemStack stack, KnowledgeType knowledge);
|
||||
|
||||
}
|
29
src/api/java/vazkii/botania/api/lexicon/ILexiconable.java
Normal file
29
src/api/java/vazkii/botania/api/lexicon/ILexiconable.java
Normal file
|
@ -0,0 +1,29 @@
|
|||
/**
|
||||
* This class was created by <Vazkii>. It's distributed as
|
||||
* part of the Botania Mod. Get the Source Code in github:
|
||||
* https://github.com/Vazkii/Botania
|
||||
*
|
||||
* Botania is Open Source and distributed under a
|
||||
* Creative Commons Attribution-NonCommercial-ShareAlike 3.0 License
|
||||
* (http://creativecommons.org/licenses/by-nc-sa/3.0/deed.en_GB)
|
||||
*
|
||||
* File Created @ [Jan 20, 2014, 7:05:44 PM (GMT)]
|
||||
*/
|
||||
package vazkii.botania.api.lexicon;
|
||||
|
||||
import net.minecraft.entity.player.EntityPlayer;
|
||||
import net.minecraft.item.ItemStack;
|
||||
import net.minecraft.world.World;
|
||||
|
||||
/**
|
||||
* Any block that implements this can be right clicked with
|
||||
* a Lexica Botania to open a entry page.
|
||||
*/
|
||||
public interface ILexiconable {
|
||||
|
||||
/**
|
||||
* Gets the lexicon entry to open at this location. null works too.
|
||||
*/
|
||||
public LexiconEntry getEntry(World world, int x, int y, int z, EntityPlayer player, ItemStack lexicon);
|
||||
|
||||
}
|
|
@ -0,0 +1,24 @@
|
|||
/**
|
||||
* This class was created by <Vazkii>. It's distributed as
|
||||
* part of the Botania Mod. Get the Source Code in github:
|
||||
* https://github.com/Vazkii/Botania
|
||||
*
|
||||
* Botania is Open Source and distributed under a
|
||||
* Creative Commons Attribution-NonCommercial-ShareAlike 3.0 License
|
||||
* (http://creativecommons.org/licenses/by-nc-sa/3.0/deed.en_GB)
|
||||
*
|
||||
* File Created @ [Mar 20, 2014, 6:08:48 PM (GMT)]
|
||||
*/
|
||||
package vazkii.botania.api.lexicon;
|
||||
|
||||
import net.minecraft.item.ItemStack;
|
||||
|
||||
/**
|
||||
* Have an Item implement this so that the method used for mapping it into
|
||||
* the lexicon recipe mappings isn't the typical id:meta key.
|
||||
*/
|
||||
public interface IRecipeKeyProvider {
|
||||
|
||||
public String getKey(ItemStack stack);
|
||||
|
||||
}
|
20
src/api/java/vazkii/botania/api/lexicon/KnowledgeType.java
Normal file
20
src/api/java/vazkii/botania/api/lexicon/KnowledgeType.java
Normal file
|
@ -0,0 +1,20 @@
|
|||
package vazkii.botania.api.lexicon;
|
||||
|
||||
import net.minecraft.util.EnumChatFormatting;
|
||||
|
||||
public class KnowledgeType {
|
||||
|
||||
public final String id;
|
||||
public final EnumChatFormatting color;
|
||||
public final boolean autoUnlock;
|
||||
|
||||
public KnowledgeType(String id, EnumChatFormatting color, boolean autoUnlock) {
|
||||
this.id = id;
|
||||
this.color = color;
|
||||
this.autoUnlock = autoUnlock;
|
||||
}
|
||||
|
||||
public String getUnlocalizedName() {
|
||||
return "botania.knowledge." + id;
|
||||
}
|
||||
}
|
32
src/api/java/vazkii/botania/api/lexicon/LexiconCategory.java
Normal file
32
src/api/java/vazkii/botania/api/lexicon/LexiconCategory.java
Normal file
|
@ -0,0 +1,32 @@
|
|||
/**
|
||||
* This class was created by <Vazkii>. It's distributed as
|
||||
* part of the Botania Mod. Get the Source Code in github:
|
||||
* https://github.com/Vazkii/Botania
|
||||
*
|
||||
* Botania is Open Source and distributed under a
|
||||
* Creative Commons Attribution-NonCommercial-ShareAlike 3.0 License
|
||||
* (http://creativecommons.org/licenses/by-nc-sa/3.0/deed.en_GB)
|
||||
*
|
||||
* File Created @ [Jan 14, 2014, 6:23:47 PM (GMT)]
|
||||
*/
|
||||
package vazkii.botania.api.lexicon;
|
||||
|
||||
import java.util.ArrayList;
|
||||
import java.util.List;
|
||||
|
||||
public final class LexiconCategory {
|
||||
|
||||
public final String unlocalizedName;
|
||||
public final List<LexiconEntry> entries = new ArrayList<LexiconEntry>();
|
||||
|
||||
/**
|
||||
* @param unlocalizedName The unlocalized name of this category. This will be localized by the client display.
|
||||
*/
|
||||
public LexiconCategory(String unlocalizedName) {
|
||||
this.unlocalizedName = unlocalizedName;
|
||||
}
|
||||
|
||||
public String getUnlocalizedName() {
|
||||
return unlocalizedName;
|
||||
}
|
||||
}
|
97
src/api/java/vazkii/botania/api/lexicon/LexiconEntry.java
Normal file
97
src/api/java/vazkii/botania/api/lexicon/LexiconEntry.java
Normal file
|
@ -0,0 +1,97 @@
|
|||
/**
|
||||
* This class was created by <Vazkii>. It's distributed as
|
||||
* part of the Botania Mod. Get the Source Code in github:
|
||||
* https://github.com/Vazkii/Botania
|
||||
*
|
||||
* Botania is Open Source and distributed under a
|
||||
* Creative Commons Attribution-NonCommercial-ShareAlike 3.0 License
|
||||
* (http://creativecommons.org/licenses/by-nc-sa/3.0/deed.en_GB)
|
||||
*
|
||||
* File Created @ [Jan 14, 2014, 6:17:06 PM (GMT)]
|
||||
*/
|
||||
package vazkii.botania.api.lexicon;
|
||||
|
||||
import java.util.ArrayList;
|
||||
import java.util.Arrays;
|
||||
import java.util.List;
|
||||
|
||||
import net.minecraft.util.StatCollector;
|
||||
import vazkii.botania.api.BotaniaAPI;
|
||||
|
||||
public class LexiconEntry implements Comparable<LexiconEntry> {
|
||||
|
||||
public final String unlocalizedName;
|
||||
public final LexiconCategory category;
|
||||
|
||||
private KnowledgeType type = BotaniaAPI.basicKnowledge;
|
||||
|
||||
public List<LexiconPage> pages = new ArrayList<LexiconPage>();
|
||||
private boolean priority = false;
|
||||
|
||||
/**
|
||||
* @param unlocalizedName The unlocalized name of this entry. This will be localized by the client display.
|
||||
*/
|
||||
public LexiconEntry(String unlocalizedName, LexiconCategory category) {
|
||||
this.unlocalizedName = unlocalizedName;
|
||||
this.category = category;
|
||||
}
|
||||
|
||||
/**
|
||||
* Sets this page as prioritized, as in, will appear before others in the lexicon.
|
||||
*/
|
||||
public LexiconEntry setPriority() {
|
||||
priority = true;
|
||||
return this;
|
||||
}
|
||||
|
||||
/**
|
||||
* Sets the Knowledge type of this entry.
|
||||
*/
|
||||
public LexiconEntry setKnowledgeType(KnowledgeType type) {
|
||||
this.type = type;
|
||||
return this;
|
||||
}
|
||||
|
||||
public KnowledgeType getKnowledgeType() {
|
||||
return type;
|
||||
}
|
||||
|
||||
public boolean isPriority() {
|
||||
return priority;
|
||||
}
|
||||
|
||||
public String getUnlocalizedName() {
|
||||
return unlocalizedName;
|
||||
}
|
||||
|
||||
/**
|
||||
* Sets what pages you want this entry to have.
|
||||
*/
|
||||
public LexiconEntry setLexiconPages(LexiconPage... pages) {
|
||||
this.pages.addAll(Arrays.asList(pages));
|
||||
|
||||
for(int i = 0; i < this.pages.size(); i++) {
|
||||
LexiconPage page = this.pages.get(i);
|
||||
if(!page.skipRegistry)
|
||||
page.onPageAdded(this, i);
|
||||
}
|
||||
|
||||
return this;
|
||||
}
|
||||
|
||||
/**
|
||||
* Adds a page to the list of pages.
|
||||
*/
|
||||
public void addPage(LexiconPage page) {
|
||||
pages.add(page);
|
||||
}
|
||||
|
||||
public final String getNameForSorting() {
|
||||
return (priority ? 0 : 1) + StatCollector.translateToLocal(getUnlocalizedName());
|
||||
}
|
||||
|
||||
@Override
|
||||
public int compareTo(LexiconEntry o) {
|
||||
return getNameForSorting().compareTo(o.getNameForSorting());
|
||||
}
|
||||
}
|
67
src/api/java/vazkii/botania/api/lexicon/LexiconPage.java
Normal file
67
src/api/java/vazkii/botania/api/lexicon/LexiconPage.java
Normal file
|
@ -0,0 +1,67 @@
|
|||
/**
|
||||
* This class was created by <Vazkii>. It's distributed as
|
||||
* part of the Botania Mod. Get the Source Code in github:
|
||||
* https://github.com/Vazkii/Botania
|
||||
*
|
||||
* Botania is Open Source and distributed under a
|
||||
* Creative Commons Attribution-NonCommercial-ShareAlike 3.0 License
|
||||
* (http://creativecommons.org/licenses/by-nc-sa/3.0/deed.en_GB)
|
||||
*
|
||||
* File Created @ [Jan 14, 2014, 6:17:24 PM (GMT)]
|
||||
*/
|
||||
package vazkii.botania.api.lexicon;
|
||||
|
||||
import vazkii.botania.api.internal.IGuiLexiconEntry;
|
||||
import cpw.mods.fml.relauncher.Side;
|
||||
import cpw.mods.fml.relauncher.SideOnly;
|
||||
|
||||
public abstract class LexiconPage {
|
||||
|
||||
public String unlocalizedName;
|
||||
public boolean skipRegistry;
|
||||
|
||||
public LexiconPage(String unlocalizedName) {
|
||||
this.unlocalizedName = unlocalizedName;
|
||||
}
|
||||
|
||||
/**
|
||||
* Does the rendering for this page.
|
||||
* @param gui The active GuiScreen
|
||||
* @param mx The mouse's relative X position.
|
||||
* @param my The mouse's relative Y position.
|
||||
*/
|
||||
@SideOnly(Side.CLIENT)
|
||||
public abstract void renderScreen(IGuiLexiconEntry gui, int mx, int my);
|
||||
|
||||
/**
|
||||
* Called per update tick.
|
||||
*/
|
||||
@SideOnly(Side.CLIENT)
|
||||
public void updateScreen() {
|
||||
// NO-OP
|
||||
}
|
||||
|
||||
/**
|
||||
* Called when a key is pressed.
|
||||
*/
|
||||
@SideOnly(Side.CLIENT)
|
||||
public void onKeyPressed(char c, int key) {
|
||||
// NO-OP
|
||||
}
|
||||
|
||||
/**
|
||||
* Called when {@link LexiconEntry#setLexiconPages(LexiconPage...)} is called.
|
||||
*/
|
||||
public void onPageAdded(LexiconEntry entry, int index) {
|
||||
// NO-OP
|
||||
}
|
||||
|
||||
public String getUnlocalizedName() {
|
||||
return unlocalizedName;
|
||||
}
|
||||
|
||||
public LexiconPage setSkipRegistry() {
|
||||
skipRegistry = true;
|
||||
return this;
|
||||
}
|
||||
}
|
|
@ -0,0 +1,66 @@
|
|||
/**
|
||||
* This class was created by <Vazkii>. It's distributed as
|
||||
* part of the Botania Mod. Get the Source Code in github:
|
||||
* https://github.com/Vazkii/Botania
|
||||
*
|
||||
* Botania is Open Source and distributed under a
|
||||
* Creative Commons Attribution-NonCommercial-ShareAlike 3.0 License
|
||||
* (http://creativecommons.org/licenses/by-nc-sa/3.0/deed.en_GB)
|
||||
*
|
||||
* File Created @ [Mar 6, 2014, 3:54:12 PM (GMT)]
|
||||
*/
|
||||
package vazkii.botania.api.lexicon;
|
||||
|
||||
import java.util.HashMap;
|
||||
import java.util.Map;
|
||||
|
||||
import net.minecraft.item.ItemStack;
|
||||
|
||||
/**
|
||||
* This class contains mappings for which entry and page correspond to each
|
||||
* craftable ItemStack. Use the map method to map an ItemStack to a page in
|
||||
* an entry in the lexicon.
|
||||
*/
|
||||
public final class LexiconRecipeMappings {
|
||||
|
||||
private static Map<String, EntryData> mappings = new HashMap();
|
||||
|
||||
/**
|
||||
* Maps the given stack to the given page of the entry.
|
||||
*/
|
||||
public static void map(ItemStack stack, LexiconEntry entry, int page, boolean force) {
|
||||
EntryData data = new EntryData(entry, page);
|
||||
String str = stackToString(stack);
|
||||
|
||||
if(force || !mappings.containsKey(str))
|
||||
mappings.put(str, data);
|
||||
}
|
||||
|
||||
public static void map(ItemStack stack, LexiconEntry entry, int page) {
|
||||
map(stack, entry, page, false);
|
||||
}
|
||||
|
||||
|
||||
public static EntryData getDataForStack(ItemStack stack) {
|
||||
return mappings.get(stackToString(stack));
|
||||
}
|
||||
|
||||
public static String stackToString(ItemStack stack) {
|
||||
if(stack.hasTagCompound() && stack.getItem() instanceof IRecipeKeyProvider)
|
||||
return ((IRecipeKeyProvider) stack.getItem()).getKey(stack);
|
||||
|
||||
return stack.getUnlocalizedName() + "~" + stack.getItemDamage();
|
||||
}
|
||||
|
||||
public static class EntryData {
|
||||
|
||||
public final LexiconEntry entry;
|
||||
public final int page;
|
||||
|
||||
public EntryData(LexiconEntry entry, int page) {
|
||||
this.entry = entry;
|
||||
this.page = page;
|
||||
}
|
||||
|
||||
}
|
||||
}
|
37
src/api/java/vazkii/botania/api/mana/BurstProperties.java
Normal file
37
src/api/java/vazkii/botania/api/mana/BurstProperties.java
Normal file
|
@ -0,0 +1,37 @@
|
|||
/**
|
||||
* This class was created by <Vazkii>. It's distributed as
|
||||
* part of the Botania Mod. Get the Source Code in github:
|
||||
* https://github.com/Vazkii/Botania
|
||||
*
|
||||
* Botania is Open Source and distributed under a
|
||||
* Creative Commons Attribution-NonCommercial-ShareAlike 3.0 License
|
||||
* (http://creativecommons.org/licenses/by-nc-sa/3.0/deed.en_GB)
|
||||
*
|
||||
* File Created @ [Jan 31, 2014, 3:49:30 PM (GMT)]
|
||||
*/
|
||||
package vazkii.botania.api.mana;
|
||||
|
||||
/**
|
||||
* The properties of a mana burst, when shot. This is passed to the lens
|
||||
* currently on the mana spreader to apply changes.
|
||||
*/
|
||||
public final class BurstProperties {
|
||||
|
||||
public int maxMana;
|
||||
public int ticksBeforeManaLoss;
|
||||
public float manaLossPerTick;
|
||||
public float gravity;
|
||||
public float motionModifier;
|
||||
|
||||
public int color;
|
||||
|
||||
public BurstProperties(int maxMana, int ticksBeforeManaLoss, float manaLossPerTick, float gravity, float motionModifier, int color) {
|
||||
this.maxMana = maxMana;
|
||||
this.ticksBeforeManaLoss = ticksBeforeManaLoss;
|
||||
this.manaLossPerTick = manaLossPerTick;
|
||||
this.gravity = gravity;
|
||||
this.motionModifier = motionModifier;
|
||||
this.color = color;
|
||||
}
|
||||
|
||||
}
|
21
src/api/java/vazkii/botania/api/mana/IClientManaHandler.java
Normal file
21
src/api/java/vazkii/botania/api/mana/IClientManaHandler.java
Normal file
|
@ -0,0 +1,21 @@
|
|||
/**
|
||||
* This class was created by <Vazkii>. It's distributed as
|
||||
* part of the Botania Mod. Get the Source Code in github:
|
||||
* https://github.com/Vazkii/Botania
|
||||
*
|
||||
* Botania is Open Source and distributed under a
|
||||
* Creative Commons Attribution-NonCommercial-ShareAlike 3.0 License
|
||||
* (http://creativecommons.org/licenses/by-nc-sa/3.0/deed.en_GB)
|
||||
*
|
||||
* File Created @ [Jul 2, 2014, 5:26:02 PM (GMT)]
|
||||
*/
|
||||
package vazkii.botania.api.mana;
|
||||
|
||||
/**
|
||||
* A TileEntity that implements this will get it's recieveMana call
|
||||
* called on both client and server. If this is not implemented
|
||||
* the call will only occur on the server.
|
||||
*/
|
||||
public interface IClientManaHandler extends IManaReceiver {
|
||||
|
||||
}
|
|
@ -0,0 +1,26 @@
|
|||
/**
|
||||
* This class was created by <Vazkii>. It's distributed as
|
||||
* part of the Botania Mod. Get the Source Code in github:
|
||||
* https://github.com/Vazkii/Botania
|
||||
*
|
||||
* Botania is Open Source and distributed under a
|
||||
* Creative Commons Attribution-NonCommercial-ShareAlike 3.0 License
|
||||
* (http://creativecommons.org/licenses/by-nc-sa/3.0/deed.en_GB)
|
||||
*
|
||||
* File Created @ [May 25, 2014, 7:34:00 PM (GMT)]
|
||||
*/
|
||||
package vazkii.botania.api.mana;
|
||||
|
||||
import net.minecraft.item.ItemStack;
|
||||
|
||||
/**
|
||||
* Have an item implement this to flag it as an infinite
|
||||
* mana source for the purposes of the HUD rendered when
|
||||
* an IManaUserItem implementing item is present.
|
||||
*/
|
||||
public interface ICreativeManaProvider {
|
||||
|
||||
public boolean isCreative(ItemStack stack);
|
||||
|
||||
}
|
||||
|
30
src/api/java/vazkii/botania/api/mana/IKeyLocked.java
Normal file
30
src/api/java/vazkii/botania/api/mana/IKeyLocked.java
Normal file
|
@ -0,0 +1,30 @@
|
|||
/**
|
||||
* This class was created by <Vazkii>. It's distributed as
|
||||
* part of the Botania Mod. Get the Source Code in github:
|
||||
* https://github.com/Vazkii/Botania
|
||||
*
|
||||
* Botania is Open Source and distributed under a
|
||||
* Creative Commons Attribution-NonCommercial-ShareAlike 3.0 License
|
||||
* (http://creativecommons.org/licenses/by-nc-sa/3.0/deed.en_GB)
|
||||
*
|
||||
* File Created @ [Jul 11, 2014, 4:29:32 PM (GMT)]
|
||||
*/
|
||||
package vazkii.botania.api.mana;
|
||||
|
||||
/**
|
||||
* A TileEntity that implements this interface has an IO key lock. This
|
||||
* interface defines an input and output key.<br><br>
|
||||
*
|
||||
* A Spreader can only shoot mana into a IKeyLocked interfaced TE if the Input
|
||||
* key of the TE is equal to the Output key of the Spreader.<br><br>
|
||||
*
|
||||
* A Spreader can only pull mana from a IKeyLocked interfaced IManaPool TE if the
|
||||
* Output key of the IManaPool is equal to the Input key of the Spreader.
|
||||
*/
|
||||
public interface IKeyLocked {
|
||||
|
||||
public String getInputKey();
|
||||
|
||||
public String getOutputKey();
|
||||
|
||||
}
|
23
src/api/java/vazkii/botania/api/mana/ILaputaImmobile.java
Normal file
23
src/api/java/vazkii/botania/api/mana/ILaputaImmobile.java
Normal file
|
@ -0,0 +1,23 @@
|
|||
/**
|
||||
* This class was created by <Vazkii>. It's distributed as
|
||||
* part of the Botania Mod. Get the Source Code in github:
|
||||
* https://github.com/Vazkii/Botania
|
||||
*
|
||||
* Botania is Open Source and distributed under a
|
||||
* Creative Commons Attribution-NonCommercial-ShareAlike 3.0 License
|
||||
* (http://creativecommons.org/licenses/by-nc-sa/3.0/deed.en_GB)
|
||||
*
|
||||
* File Created @ [Jul 26, 2014, 9:51:58 PM (GMT)]
|
||||
*/
|
||||
package vazkii.botania.api.mana;
|
||||
|
||||
import net.minecraft.world.World;
|
||||
|
||||
/**
|
||||
* A block that implements this has a flag for whether it can be moved by the Shard of Laputa.
|
||||
*/
|
||||
public interface ILaputaImmobile {
|
||||
|
||||
public boolean canMove(World world, int x, int y, int z);
|
||||
|
||||
}
|
43
src/api/java/vazkii/botania/api/mana/ILens.java
Normal file
43
src/api/java/vazkii/botania/api/mana/ILens.java
Normal file
|
@ -0,0 +1,43 @@
|
|||
/**
|
||||
* This class was created by <Vazkii>. It's distributed as
|
||||
* part of the Botania Mod. Get the Source Code in github:
|
||||
* https://github.com/Vazkii/Botania
|
||||
*
|
||||
* Botania is Open Source and distributed under a
|
||||
* Creative Commons Attribution-NonCommercial-ShareAlike 3.0 License
|
||||
* (http://creativecommons.org/licenses/by-nc-sa/3.0/deed.en_GB)
|
||||
*
|
||||
* File Created @ [Jan 31, 2014, 3:03:04 PM (GMT)]
|
||||
*/
|
||||
package vazkii.botania.api.mana;
|
||||
|
||||
import net.minecraft.item.ItemStack;
|
||||
import cpw.mods.fml.relauncher.Side;
|
||||
import cpw.mods.fml.relauncher.SideOnly;
|
||||
|
||||
/**
|
||||
* Have an Item implement this to be counted as a lens for the mana spreader.
|
||||
*/
|
||||
public interface ILens extends ILensEffect {
|
||||
|
||||
@SideOnly(Side.CLIENT)
|
||||
public int getLensColor(ItemStack stack);
|
||||
|
||||
/**
|
||||
* Can the source lens be combined with the composite lens? This is called
|
||||
* for both the ILens instance of ItemStack.getItem() of sourceLens and compositeLens.
|
||||
*/
|
||||
public boolean canCombineLenses(ItemStack sourceLens, ItemStack compositeLens);
|
||||
|
||||
/**
|
||||
* Gets the composite lens in the stack passed in, return null for none.
|
||||
*/
|
||||
public ItemStack getCompositeLens(ItemStack stack);
|
||||
|
||||
/**
|
||||
* Sets the composite lens for the sourceLens as the compositeLens, returns
|
||||
* the ItemStack with the combination.
|
||||
*/
|
||||
public ItemStack setCompositeLens(ItemStack sourceLens, ItemStack compositeLens);
|
||||
|
||||
}
|
49
src/api/java/vazkii/botania/api/mana/ILensEffect.java
Normal file
49
src/api/java/vazkii/botania/api/mana/ILensEffect.java
Normal file
|
@ -0,0 +1,49 @@
|
|||
/**
|
||||
* This class was created by <Vazkii>. It's distributed as
|
||||
* part of the Botania Mod. Get the Source Code in github:
|
||||
* https://github.com/Vazkii/Botania
|
||||
*
|
||||
* Botania is Open Source and distributed under a
|
||||
* Creative Commons Attribution-NonCommercial-ShareAlike 3.0 License
|
||||
* (http://creativecommons.org/licenses/by-nc-sa/3.0/deed.en_GB)
|
||||
*
|
||||
* File Created @ [Apr 14, 2014, 7:30:00 PM (GMT)]
|
||||
*/
|
||||
package vazkii.botania.api.mana;
|
||||
|
||||
import net.minecraft.item.ItemStack;
|
||||
import net.minecraft.util.MovingObjectPosition;
|
||||
import vazkii.botania.api.internal.IManaBurst;
|
||||
|
||||
/**
|
||||
* Have an item implement this for it to count as a lens effect and
|
||||
* be able to change the properties of Mana Bursts.
|
||||
*/
|
||||
public interface ILensEffect {
|
||||
|
||||
/**
|
||||
* Called when a mana spreader that has this focus shoots a burst. This is where
|
||||
* you change the properties of the burst.
|
||||
*/
|
||||
public void apply(ItemStack stack, BurstProperties props);
|
||||
|
||||
/**
|
||||
* Called when a mana burst fired from a mana spreader with this focus collides against
|
||||
* any block. This is called after the collision is handled.
|
||||
* @return True to kill the burst. False to keep it alive.
|
||||
*/
|
||||
public boolean collideBurst(IManaBurst burst, MovingObjectPosition pos, boolean isManaBlock, boolean dead, ItemStack stack);
|
||||
|
||||
/**
|
||||
* Called when a mana burst fired from a mana spreader with this focus is updated.
|
||||
* This is called before the update is handled.
|
||||
*/
|
||||
public void updateBurst(IManaBurst burst, ItemStack stack);
|
||||
|
||||
/**
|
||||
* Called when the mana burst should do it's particles. Return false to not
|
||||
* do any particles.
|
||||
*/
|
||||
public boolean doParticles(IManaBurst burst, ItemStack stack);
|
||||
|
||||
}
|
26
src/api/java/vazkii/botania/api/mana/IManaBlock.java
Normal file
26
src/api/java/vazkii/botania/api/mana/IManaBlock.java
Normal file
|
@ -0,0 +1,26 @@
|
|||
/**
|
||||
* This class was created by <Vazkii>. It's distributed as
|
||||
* part of the Botania Mod. Get the Source Code in github:
|
||||
* https://github.com/Vazkii/Botania
|
||||
*
|
||||
* Botania is Open Source and distributed under a
|
||||
* Creative Commons Attribution-NonCommercial-ShareAlike 3.0 License
|
||||
* (http://creativecommons.org/licenses/by-nc-sa/3.0/deed.en_GB)
|
||||
*
|
||||
* File Created @ [Jan 22, 2014, 4:59:05 PM (GMT)]
|
||||
*/
|
||||
package vazkii.botania.api.mana;
|
||||
|
||||
/**
|
||||
* A TileEntity that implements this is considered a Mana Block.
|
||||
* Just being a Mana Block doesn't mean much, look at the other IMana
|
||||
* interfaces.
|
||||
*/
|
||||
public interface IManaBlock {
|
||||
|
||||
/**
|
||||
* Gets the amount of mana currently in this block.
|
||||
*/
|
||||
public int getCurrentMana();
|
||||
|
||||
}
|
43
src/api/java/vazkii/botania/api/mana/IManaCollector.java
Normal file
43
src/api/java/vazkii/botania/api/mana/IManaCollector.java
Normal file
|
@ -0,0 +1,43 @@
|
|||
/**
|
||||
* This class was created by <Vazkii>. It's distributed as
|
||||
* part of the Botania Mod. Get the Source Code in github:
|
||||
* https://github.com/Vazkii/Botania
|
||||
*
|
||||
* Botania is Open Source and distributed under a
|
||||
* Creative Commons Attribution-NonCommercial-ShareAlike 3.0 License
|
||||
* (http://creativecommons.org/licenses/by-nc-sa/3.0/deed.en_GB)
|
||||
*
|
||||
* File Created @ [Jan 22, 2014, 5:01:19 PM (GMT)]
|
||||
*/
|
||||
package vazkii.botania.api.mana;
|
||||
|
||||
import vazkii.botania.api.internal.IManaBurst;
|
||||
|
||||
/**
|
||||
* Any TileEntity that implements this is considered a mana collector, by
|
||||
* which nearby generating flowers will pump mana into it.<br><br>
|
||||
*
|
||||
* <b>Implementation Instructions:</b><br>
|
||||
* - Override invalidate() and onChunkUnload(), calling <i>ManaNetworkEvent.removeCollector(this);</i> on both.<br>
|
||||
* - On the first tick of onUpdate(), call </i>ManaNetworkEvent.addCollector(this);<i>
|
||||
*/
|
||||
public interface IManaCollector extends IManaReceiver {
|
||||
|
||||
/**
|
||||
* Called every tick on the client case the player is holding a Wand of the Forest.
|
||||
*/
|
||||
public void onClientDisplayTick();
|
||||
|
||||
/**
|
||||
* Get the multiplier of mana to input into the block, 1.0 is the original amount of mana
|
||||
* in the burst. 0.9, for example, is 90%, so 10% of the mana in the burst will get
|
||||
* dissipated.
|
||||
*/
|
||||
public float getManaYieldMultiplier(IManaBurst burst);
|
||||
|
||||
/**
|
||||
* Gets the maximum amount of mana this collector can have.
|
||||
*/
|
||||
public int getMaxMana();
|
||||
|
||||
}
|
|
@ -0,0 +1,22 @@
|
|||
/**
|
||||
* This class was created by <Vazkii>. It's distributed as
|
||||
* part of the Botania Mod. Get the Source Code in github:
|
||||
* https://github.com/Vazkii/Botania
|
||||
*
|
||||
* Botania is Open Source and distributed under a
|
||||
* Creative Commons Attribution-NonCommercial-ShareAlike 3.0 License
|
||||
* (http://creativecommons.org/licenses/by-nc-sa/3.0/deed.en_GB)
|
||||
*
|
||||
* File Created @ [Mar 10, 2014, 7:49:19 PM (GMT)]
|
||||
*/
|
||||
package vazkii.botania.api.mana;
|
||||
|
||||
/**
|
||||
* Any TileEntity that implements this can be counted as a "ghost" block of
|
||||
* sorts, that won't call the collision code for the mana bursts.
|
||||
*/
|
||||
public interface IManaCollisionGhost {
|
||||
|
||||
public boolean isGhost();
|
||||
|
||||
}
|
69
src/api/java/vazkii/botania/api/mana/IManaItem.java
Normal file
69
src/api/java/vazkii/botania/api/mana/IManaItem.java
Normal file
|
@ -0,0 +1,69 @@
|
|||
/**
|
||||
* This class was created by <Vazkii>. It's distributed as
|
||||
* part of the Botania Mod. Get the Source Code in github:
|
||||
* https://github.com/Vazkii/Botania
|
||||
*
|
||||
* Botania is Open Source and distributed under a
|
||||
* Creative Commons Attribution-NonCommercial-ShareAlike 3.0 License
|
||||
* (http://creativecommons.org/licenses/by-nc-sa/3.0/deed.en_GB)
|
||||
*
|
||||
* File Created @ [Mar 6, 2014, 9:07:40 AM (GMT)]
|
||||
*/
|
||||
package vazkii.botania.api.mana;
|
||||
|
||||
import net.minecraft.item.ItemStack;
|
||||
import net.minecraft.tileentity.TileEntity;
|
||||
|
||||
/**
|
||||
* An item that implements this can be counted as an item that can
|
||||
* contain mana.
|
||||
*/
|
||||
public interface IManaItem {
|
||||
|
||||
/**
|
||||
* Gets the amount of mana this item contains
|
||||
*/
|
||||
public int getMana(ItemStack stack);
|
||||
|
||||
/**
|
||||
* Gets the max amount of mana this item can hold.
|
||||
*/
|
||||
public int getMaxMana(ItemStack stack);
|
||||
|
||||
/**
|
||||
* Adds mana to this item.
|
||||
*/
|
||||
public void addMana(ItemStack stack, int mana);
|
||||
|
||||
/**
|
||||
* Can this item receive mana from a mana Pool?
|
||||
* @param pool The pool it's receiving mana from, can be casted to IManaPool.
|
||||
* @see IManaPool#isOutputtingPower()
|
||||
*/
|
||||
public boolean canReceiveManaFromPool(ItemStack stack, TileEntity pool);
|
||||
|
||||
/**
|
||||
* Can this item recieve mana from another item?
|
||||
*/
|
||||
public boolean canReceiveManaFromItem(ItemStack stack, ItemStack otherStack);
|
||||
|
||||
/**
|
||||
* Can this item export mana to a mana Pool?
|
||||
* @param pool The pool it's exporting mana to, can be casted to IManaPool.
|
||||
* @see IManaPool#isOutputtingPower()
|
||||
*/
|
||||
public boolean canExportManaToPool(ItemStack stack,TileEntity pool);
|
||||
|
||||
/**
|
||||
* Can this item export mana to another item?
|
||||
*/
|
||||
public boolean canExportManaToItem(ItemStack stack, ItemStack otherStack);
|
||||
|
||||
/**
|
||||
* If this item simply does not export mana at all, set this to true. This is
|
||||
* used to skip items that contain mana but can't export it when drawing the
|
||||
* mana bar above the XP bar.
|
||||
*/
|
||||
public boolean isNoExport(ItemStack stack);
|
||||
|
||||
}
|
31
src/api/java/vazkii/botania/api/mana/IManaPool.java
Normal file
31
src/api/java/vazkii/botania/api/mana/IManaPool.java
Normal file
|
@ -0,0 +1,31 @@
|
|||
/**
|
||||
* This class was created by <Vazkii>. It's distributed as
|
||||
* part of the Botania Mod. Get the Source Code in github:
|
||||
* https://github.com/Vazkii/Botania
|
||||
*
|
||||
* Botania is Open Source and distributed under a
|
||||
* Creative Commons Attribution-NonCommercial-ShareAlike 3.0 License
|
||||
* (http://creativecommons.org/licenses/by-nc-sa/3.0/deed.en_GB)
|
||||
*
|
||||
* File Created @ [Jan 22, 2014, 5:03:09 PM (GMT)]
|
||||
*/
|
||||
package vazkii.botania.api.mana;
|
||||
|
||||
/**
|
||||
* Any TileEntity that implements this is considered a Mana Pool,
|
||||
* by which nearby functional flowers will pull mana from it.<br>
|
||||
* Mana Distributors will also accept it as valid output.<br><br>
|
||||
*
|
||||
* <b>Implementation Instructions:</b><br>
|
||||
* - Override invalidate() and onChunkUnload(), calling <i>ManaNetworkEvent.removePool(this);</i> on both.<br>
|
||||
* - On the first tick of onUpdate(), call <i>ManaNetworkEvent.addPool(this);</i>
|
||||
*/
|
||||
public interface IManaPool extends IManaReceiver {
|
||||
|
||||
/**
|
||||
* Returns false if the mana pool is accepting power from other power items,
|
||||
* true if it's sending power into them.
|
||||
*/
|
||||
public boolean isOutputtingPower();
|
||||
|
||||
}
|
35
src/api/java/vazkii/botania/api/mana/IManaReceiver.java
Normal file
35
src/api/java/vazkii/botania/api/mana/IManaReceiver.java
Normal file
|
@ -0,0 +1,35 @@
|
|||
/**
|
||||
* This class was created by <Vazkii>. It's distributed as
|
||||
* part of the Botania Mod. Get the Source Code in github:
|
||||
* https://github.com/Vazkii/Botania
|
||||
*
|
||||
* Botania is Open Source and distributed under a
|
||||
* Creative Commons Attribution-NonCommercial-ShareAlike 3.0 License
|
||||
* (http://creativecommons.org/licenses/by-nc-sa/3.0/deed.en_GB)
|
||||
*
|
||||
* File Created @ [Jan 22, 2014, 4:55:00 PM (GMT)]
|
||||
*/
|
||||
package vazkii.botania.api.mana;
|
||||
|
||||
/**
|
||||
* Any TileEntity that implements this can receive mana from mana bursts.
|
||||
*/
|
||||
public interface IManaReceiver extends IManaBlock {
|
||||
|
||||
/**
|
||||
* Is this Mana Receiver is full? Being full means no mana bursts will be sent.
|
||||
*/
|
||||
public boolean isFull();
|
||||
|
||||
/**
|
||||
* Called when this receiver receives mana.
|
||||
*/
|
||||
public void recieveMana(int mana);
|
||||
|
||||
/**
|
||||
* Can this tile receive mana from bursts? Generally set to false for
|
||||
* implementations of IManaCollector.
|
||||
*/
|
||||
public boolean canRecieveManaFromBursts();
|
||||
|
||||
}
|
24
src/api/java/vazkii/botania/api/mana/IManaTrigger.java
Normal file
24
src/api/java/vazkii/botania/api/mana/IManaTrigger.java
Normal file
|
@ -0,0 +1,24 @@
|
|||
/**
|
||||
* This class was created by <Vazkii>. It's distributed as
|
||||
* part of the Botania Mod. Get the Source Code in github:
|
||||
* https://github.com/Vazkii/Botania
|
||||
*
|
||||
* Botania is Open Source and distributed under a
|
||||
* Creative Commons Attribution-NonCommercial-ShareAlike 3.0 License
|
||||
* (http://creativecommons.org/licenses/by-nc-sa/3.0/deed.en_GB)
|
||||
*
|
||||
* File Created @ [May 16, 2014, 7:52:53 PM (GMT)]
|
||||
*/
|
||||
package vazkii.botania.api.mana;
|
||||
|
||||
import net.minecraft.world.World;
|
||||
import vazkii.botania.api.internal.IManaBurst;
|
||||
|
||||
/**
|
||||
* Have a block implement this class to make it do something when a mana burst collides with it.
|
||||
*/
|
||||
public interface IManaTrigger {
|
||||
|
||||
public void onBurstCollision(IManaBurst burst, World world, int x, int y, int z);
|
||||
|
||||
}
|
26
src/api/java/vazkii/botania/api/mana/IManaUsingItem.java
Normal file
26
src/api/java/vazkii/botania/api/mana/IManaUsingItem.java
Normal file
|
@ -0,0 +1,26 @@
|
|||
/**
|
||||
* This class was created by <Vazkii>. It's distributed as
|
||||
* part of the Botania Mod. Get the Source Code in github:
|
||||
* https://github.com/Vazkii/Botania
|
||||
*
|
||||
* Botania is Open Source and distributed under a
|
||||
* Creative Commons Attribution-NonCommercial-ShareAlike 3.0 License
|
||||
* (http://creativecommons.org/licenses/by-nc-sa/3.0/deed.en_GB)
|
||||
*
|
||||
* File Created @ [May 25, 2014, 7:32:10 PM (GMT)]
|
||||
*/
|
||||
package vazkii.botania.api.mana;
|
||||
|
||||
import net.minecraft.item.ItemStack;
|
||||
|
||||
/**
|
||||
* Any item that implements this interface is an item that would use mana
|
||||
* from the player's inventory. If there's any items in the inventory or
|
||||
* equipped in either the baubles or armor inventories that implement
|
||||
* this interface, a mana bar will be rendered.
|
||||
*/
|
||||
public interface IManaUsingItem {
|
||||
|
||||
public boolean usesMana(ItemStack stack);
|
||||
|
||||
}
|
|
@ -0,0 +1,26 @@
|
|||
/**
|
||||
* This class was created by <Vazkii>. It's distributed as
|
||||
* part of the Botania Mod. Get the Source Code in github:
|
||||
* https://github.com/Vazkii/Botania
|
||||
*
|
||||
* Botania is Open Source and distributed under a
|
||||
* Creative Commons Attribution-NonCommercial-ShareAlike 3.0 License
|
||||
* (http://creativecommons.org/licenses/by-nc-sa/3.0/deed.en_GB)
|
||||
*
|
||||
* File Created @ [Jul 2, 2014, 6:36:54 PM (GMT)]
|
||||
*/
|
||||
package vazkii.botania.api.mana;
|
||||
|
||||
import net.minecraft.util.IIcon;
|
||||
import net.minecraft.world.World;
|
||||
|
||||
/**
|
||||
* A block that implements this can provide an IIcon (block icons only)
|
||||
* to be used as an overlay for the mana pool, similarly to the mana void
|
||||
* and catalysts.
|
||||
*/
|
||||
public interface IPoolOverlayProvider {
|
||||
|
||||
public IIcon getIcon(World world, int x, int y, int z);
|
||||
|
||||
}
|
24
src/api/java/vazkii/botania/api/mana/ITinyPlanetExcempt.java
Normal file
24
src/api/java/vazkii/botania/api/mana/ITinyPlanetExcempt.java
Normal file
|
@ -0,0 +1,24 @@
|
|||
/**
|
||||
* This class was created by <Vazkii>. It's distributed as
|
||||
* part of the Botania Mod. Get the Source Code in github:
|
||||
* https://github.com/Vazkii/Botania
|
||||
*
|
||||
* Botania is Open Source and distributed under a
|
||||
* Creative Commons Attribution-NonCommercial-ShareAlike 3.0 License
|
||||
* (http://creativecommons.org/licenses/by-nc-sa/3.0/deed.en_GB)
|
||||
*
|
||||
* File Created @ [Jul 22, 2014, 2:26:14 PM (GMT)]
|
||||
*/
|
||||
package vazkii.botania.api.mana;
|
||||
|
||||
import net.minecraft.item.ItemStack;
|
||||
|
||||
/**
|
||||
* Any Item that implements ILensEffect and this will have
|
||||
* a check before being pulled by the Tiny Planet.
|
||||
*/
|
||||
public interface ITinyPlanetExcempt {
|
||||
|
||||
public boolean shouldPull(ItemStack stack);
|
||||
|
||||
}
|
201
src/api/java/vazkii/botania/api/mana/ManaItemHandler.java
Normal file
201
src/api/java/vazkii/botania/api/mana/ManaItemHandler.java
Normal file
|
@ -0,0 +1,201 @@
|
|||
/**
|
||||
* This class was created by <Vazkii>. It's distributed as
|
||||
* part of the Botania Mod. Get the Source Code in github:
|
||||
* https://github.com/Vazkii/Botania
|
||||
*
|
||||
* Botania is Open Source and distributed under a
|
||||
* Creative Commons Attribution-NonCommercial-ShareAlike 3.0 License
|
||||
* (http://creativecommons.org/licenses/by-nc-sa/3.0/deed.en_GB)
|
||||
*
|
||||
* File Created @ [Mar 13, 2014, 5:32:24 PM (GMT)]
|
||||
*/
|
||||
package vazkii.botania.api.mana;
|
||||
|
||||
import net.minecraft.entity.player.EntityPlayer;
|
||||
import net.minecraft.inventory.IInventory;
|
||||
import net.minecraft.item.ItemStack;
|
||||
import vazkii.botania.api.BotaniaAPI;
|
||||
|
||||
public final class ManaItemHandler {
|
||||
|
||||
/**
|
||||
* Requests mana from items in a given player's inventory.
|
||||
* @param manaToGet How much mana is to be requested, if less mana exists than this amount,
|
||||
* the amount of mana existent will be returned instead, if you want exact values use requestManaExact.
|
||||
* @param remove If true, the mana will be removed from the target item. Set to false to just check.
|
||||
* @return The amount of mana received from the request.
|
||||
*/
|
||||
public static int requestMana(ItemStack stack, EntityPlayer player, int manaToGet, boolean remove) {
|
||||
if(stack == null)
|
||||
return 0;
|
||||
|
||||
IInventory mainInv = player.inventory;
|
||||
IInventory baublesInv = BotaniaAPI.internalHandler.getBaublesInventory(player);
|
||||
|
||||
int invSize = mainInv.getSizeInventory();
|
||||
int size = invSize;
|
||||
if(baublesInv != null)
|
||||
size += baublesInv.getSizeInventory();
|
||||
|
||||
for(int i = 0; i < size; i++) {
|
||||
boolean useBaubles = i >= invSize;
|
||||
IInventory inv = useBaubles ? baublesInv : mainInv;
|
||||
ItemStack stackInSlot = inv.getStackInSlot(i - (useBaubles ? invSize : 0));
|
||||
if(stackInSlot == stack)
|
||||
continue;
|
||||
|
||||
if(stackInSlot != null && stackInSlot.getItem() instanceof IManaItem) {
|
||||
IManaItem manaItem = (IManaItem) stackInSlot.getItem();
|
||||
if(manaItem.canExportManaToItem(stackInSlot, stack) && manaItem.getMana(stackInSlot) > 0) {
|
||||
if(stack.getItem() instanceof IManaItem && !((IManaItem) stack.getItem()).canReceiveManaFromItem(stack, stackInSlot))
|
||||
continue;
|
||||
|
||||
int mana = Math.min(manaToGet, manaItem.getMana(stackInSlot));
|
||||
|
||||
if(remove)
|
||||
manaItem.addMana(stackInSlot, -mana);
|
||||
|
||||
return mana;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
/**
|
||||
* Requests an exact amount of mana from items in a given player's inventory.
|
||||
* @param manaToGet How much mana is to be requested, if less mana exists than this amount,
|
||||
* false will be returned instead, and nothing will happen.
|
||||
* @param remove If true, the mana will be removed from the target item. Set to false to just check.
|
||||
* @return If the request was succesful.
|
||||
*/
|
||||
public static boolean requestManaExact(ItemStack stack, EntityPlayer player, int manaToGet, boolean remove) {
|
||||
if(stack == null)
|
||||
return false;
|
||||
|
||||
IInventory mainInv = player.inventory;
|
||||
IInventory baublesInv = BotaniaAPI.internalHandler.getBaublesInventory(player);
|
||||
|
||||
int invSize = mainInv.getSizeInventory();
|
||||
int size = invSize;
|
||||
if(baublesInv != null)
|
||||
size += baublesInv.getSizeInventory();
|
||||
|
||||
for(int i = 0; i < size; i++) {
|
||||
boolean useBaubles = i >= invSize;
|
||||
IInventory inv = useBaubles ? baublesInv : mainInv;
|
||||
ItemStack stackInSlot = inv.getStackInSlot(i - (useBaubles ? invSize : 0));
|
||||
if(stackInSlot == stack)
|
||||
continue;
|
||||
|
||||
if(stackInSlot != null && stackInSlot.getItem() instanceof IManaItem) {
|
||||
IManaItem manaItemSlot = (IManaItem) stackInSlot.getItem();
|
||||
if(manaItemSlot.canExportManaToItem(stackInSlot, stack) && manaItemSlot.getMana(stackInSlot) > manaToGet) {
|
||||
if(stack.getItem() instanceof IManaItem && !((IManaItem) stack.getItem()).canReceiveManaFromItem(stack, stackInSlot))
|
||||
continue;
|
||||
|
||||
if(remove)
|
||||
manaItemSlot.addMana(stackInSlot, -manaToGet);
|
||||
|
||||
return true;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
return false;
|
||||
}
|
||||
|
||||
/**
|
||||
* Dispatches mana to items in a given player's inventory. Note that this method
|
||||
* does not automatically remove mana from the item which is exporting.
|
||||
* @param manaToSend How much mana is to be sent.
|
||||
* @param remove If true, the mana will be added from the target item. Set to false to just check.
|
||||
* @return The amount of mana actually sent.
|
||||
*/
|
||||
public static int dispatchMana(ItemStack stack, EntityPlayer player, int manaToSend, boolean add) {
|
||||
if(stack == null)
|
||||
return 0;
|
||||
|
||||
IInventory mainInv = player.inventory;
|
||||
IInventory baublesInv = BotaniaAPI.internalHandler.getBaublesInventory(player);
|
||||
|
||||
int invSize = mainInv.getSizeInventory();
|
||||
int size = invSize;
|
||||
if(baublesInv != null)
|
||||
size += baublesInv.getSizeInventory();
|
||||
|
||||
for(int i = 0; i < size; i++) {
|
||||
boolean useBaubles = i >= invSize;
|
||||
IInventory inv = useBaubles ? baublesInv : mainInv;
|
||||
ItemStack stackInSlot = inv.getStackInSlot(i - (useBaubles ? invSize : 0));
|
||||
if(stackInSlot == stack)
|
||||
continue;
|
||||
|
||||
if(stackInSlot != null && stackInSlot.getItem() instanceof IManaItem) {
|
||||
IManaItem manaItemSlot = (IManaItem) stackInSlot.getItem();
|
||||
|
||||
if(manaItemSlot.canReceiveManaFromItem(stackInSlot, stack)) {
|
||||
if(stack.getItem() instanceof IManaItem && !((IManaItem) stack.getItem()).canExportManaToItem(stack, stackInSlot))
|
||||
continue;
|
||||
|
||||
int received = 0;
|
||||
if(manaItemSlot.getMana(stackInSlot) + manaToSend <= manaItemSlot.getMaxMana(stackInSlot))
|
||||
received = manaToSend;
|
||||
else received = manaToSend - (manaItemSlot.getMana(stackInSlot) + manaToSend - manaItemSlot.getMaxMana(stackInSlot));
|
||||
|
||||
|
||||
if(add)
|
||||
manaItemSlot.addMana(stackInSlot, manaToSend);
|
||||
|
||||
return received;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
/**
|
||||
* Dispatches an exact amount of mana to items in a given player's inventory. Note that this method
|
||||
* does not automatically remove mana from the item which is exporting.
|
||||
* @param manaToSend How much mana is to be sent.
|
||||
* @param remove If true, the mana will be added from the target item. Set to false to just check.
|
||||
* @return If an item received the mana sent.
|
||||
*/
|
||||
public static boolean dispatchManaExact(ItemStack stack, EntityPlayer player, int manaToSend, boolean add) {
|
||||
if(stack == null)
|
||||
return false;
|
||||
|
||||
IInventory mainInv = player.inventory;
|
||||
IInventory baublesInv = BotaniaAPI.internalHandler.getBaublesInventory(player);
|
||||
|
||||
int invSize = mainInv.getSizeInventory();
|
||||
int size = invSize;
|
||||
if(baublesInv != null)
|
||||
size += baublesInv.getSizeInventory();
|
||||
|
||||
for(int i = 0; i < size; i++) {
|
||||
boolean useBaubles = i >= invSize;
|
||||
IInventory inv = useBaubles ? baublesInv : mainInv;
|
||||
ItemStack stackInSlot = inv.getStackInSlot(i - (useBaubles ? invSize : 0));
|
||||
if(stackInSlot == stack)
|
||||
continue;
|
||||
|
||||
if(stackInSlot != null && stackInSlot.getItem() instanceof IManaItem) {
|
||||
IManaItem manaItemSlot = (IManaItem) stackInSlot.getItem();
|
||||
if(manaItemSlot.getMana(stackInSlot) + manaToSend <= manaItemSlot.getMaxMana(stackInSlot) && manaItemSlot.canReceiveManaFromItem(stackInSlot, stack)) {
|
||||
if(stack.getItem() instanceof IManaItem && !((IManaItem) stack.getItem()).canExportManaToItem(stack, stackInSlot))
|
||||
continue;
|
||||
|
||||
if(add)
|
||||
manaItemSlot.addMana(stackInSlot, manaToSend);
|
||||
|
||||
return true;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
return false;
|
||||
}
|
||||
}
|
57
src/api/java/vazkii/botania/api/mana/ManaNetworkEvent.java
Normal file
57
src/api/java/vazkii/botania/api/mana/ManaNetworkEvent.java
Normal file
|
@ -0,0 +1,57 @@
|
|||
/**
|
||||
* This class was created by <Vazkii>. It's distributed as
|
||||
* part of the Botania Mod. Get the Source Code in github:
|
||||
* https://github.com/Vazkii/Botania
|
||||
*
|
||||
* Botania is Open Source and distributed under a
|
||||
* Creative Commons Attribution-NonCommercial-ShareAlike 3.0 License
|
||||
* (http://creativecommons.org/licenses/by-nc-sa/3.0/deed.en_GB)
|
||||
*
|
||||
* File Created @ [Jan 22, 2014, 5:04:30 PM (GMT)]
|
||||
*/
|
||||
package vazkii.botania.api.mana;
|
||||
|
||||
import net.minecraft.tileentity.TileEntity;
|
||||
import net.minecraftforge.common.MinecraftForge;
|
||||
import cpw.mods.fml.common.eventhandler.Event;
|
||||
|
||||
public class ManaNetworkEvent extends Event {
|
||||
|
||||
public final TileEntity tile;
|
||||
public final ManaBlockType type;
|
||||
public final Action action;
|
||||
|
||||
public ManaNetworkEvent(TileEntity tile, ManaBlockType type, Action action) {
|
||||
this.tile = tile;
|
||||
this.type = type;
|
||||
this.action = action;
|
||||
}
|
||||
|
||||
public static void addCollector(TileEntity tile) {
|
||||
ManaNetworkEvent event = new ManaNetworkEvent(tile, ManaBlockType.COLLECTOR, Action.ADD);
|
||||
MinecraftForge.EVENT_BUS.post(event);
|
||||
}
|
||||
|
||||
public static void removeCollector(TileEntity tile) {
|
||||
ManaNetworkEvent event = new ManaNetworkEvent(tile, ManaBlockType.COLLECTOR, Action.REMOVE);
|
||||
MinecraftForge.EVENT_BUS.post(event);
|
||||
}
|
||||
|
||||
public static void addPool(TileEntity tile) {
|
||||
ManaNetworkEvent event = new ManaNetworkEvent(tile, ManaBlockType.POOL, Action.ADD);
|
||||
MinecraftForge.EVENT_BUS.post(event);
|
||||
}
|
||||
|
||||
public static void removePool(TileEntity tile) {
|
||||
ManaNetworkEvent event = new ManaNetworkEvent(tile, ManaBlockType.POOL, Action.REMOVE);
|
||||
MinecraftForge.EVENT_BUS.post(event);
|
||||
}
|
||||
|
||||
public enum ManaBlockType {
|
||||
POOL, COLLECTOR
|
||||
}
|
||||
|
||||
public enum Action {
|
||||
REMOVE, ADD
|
||||
}
|
||||
}
|
15
src/api/java/vazkii/botania/api/mana/TileSignature.java
Normal file
15
src/api/java/vazkii/botania/api/mana/TileSignature.java
Normal file
|
@ -0,0 +1,15 @@
|
|||
package vazkii.botania.api.mana;
|
||||
|
||||
import net.minecraft.tileentity.TileEntity;
|
||||
|
||||
public class TileSignature {
|
||||
|
||||
public final TileEntity tile;
|
||||
public final boolean remoteWorld;
|
||||
|
||||
public TileSignature(TileEntity tile, boolean remoteWorld) {
|
||||
this.tile = tile;
|
||||
this.remoteWorld = remoteWorld;
|
||||
}
|
||||
|
||||
}
|
|
@ -0,0 +1,54 @@
|
|||
/**
|
||||
* This class was created by <Vazkii>. It's distributed as
|
||||
* part of the Botania Mod. Get the Source Code in github:
|
||||
* https://github.com/Vazkii/Botania
|
||||
*
|
||||
* Botania is Open Source and distributed under a
|
||||
* Creative Commons Attribution-NonCommercial-ShareAlike 3.0 License
|
||||
* (http://creativecommons.org/licenses/by-nc-sa/3.0/deed.en_GB)
|
||||
*
|
||||
* File Created @ [Aug 21, 2014, 5:44:13 PM (GMT)]
|
||||
*/
|
||||
package vazkii.botania.api.mana.spark;
|
||||
|
||||
import net.minecraft.item.ItemStack;
|
||||
import vazkii.botania.api.mana.IManaReceiver;
|
||||
|
||||
/**
|
||||
* A TileEntity that implements this can have a Spark attached to it.
|
||||
* For the Spark to be allowed to have upgrades, it needs to be an IManaPool.
|
||||
*/
|
||||
public interface ISparkAttachable extends IManaReceiver {
|
||||
|
||||
/**
|
||||
* Can this block have a Spark attached to it. Note that this will not
|
||||
* unattach the Spark if it's changed later.
|
||||
*/
|
||||
public boolean canAttachSpark(ItemStack stack);
|
||||
|
||||
/**
|
||||
* Called when the Spark is attached.
|
||||
*/
|
||||
public void attachSpark(ISparkEntity entity);
|
||||
|
||||
/**
|
||||
* Gets the Spark that is attached to this block. A common implementation is
|
||||
* to check for Spark entities above:
|
||||
*
|
||||
List<ISparkEntity> sparks = worldObj.getEntitiesWithinAABB(ISparkEntity.class, AxisAlignedBB.getBoundingBox(xCoord, yCoord + 1, zCoord, xCoord + 1, yCoord + 2, zCoord + 1));
|
||||
if(sparks.size() == 1) {
|
||||
Entity e = (Entity) sparks.get(0);
|
||||
return (ISparkEntity) e;
|
||||
}
|
||||
|
||||
return null;
|
||||
*/
|
||||
public ISparkEntity getAttachedSpark();
|
||||
|
||||
/**
|
||||
* Return true if this Tile no longer requires mana and all Sparks
|
||||
* transferring mana to it should cancel their transfer.
|
||||
*/
|
||||
public boolean areIncomingTranfersDone();
|
||||
|
||||
}
|
65
src/api/java/vazkii/botania/api/mana/spark/ISparkEntity.java
Normal file
65
src/api/java/vazkii/botania/api/mana/spark/ISparkEntity.java
Normal file
|
@ -0,0 +1,65 @@
|
|||
/**
|
||||
* This class was created by <Vazkii>. It's distributed as
|
||||
* part of the Botania Mod. Get the Source Code in github:
|
||||
* https://github.com/Vazkii/Botania
|
||||
*
|
||||
* Botania is Open Source and distributed under a
|
||||
* Creative Commons Attribution-NonCommercial-ShareAlike 3.0 License
|
||||
* (http://creativecommons.org/licenses/by-nc-sa/3.0/deed.en_GB)
|
||||
*
|
||||
* File Created @ [Aug 21, 2014, 5:44:07 PM (GMT)]
|
||||
*/
|
||||
package vazkii.botania.api.mana.spark;
|
||||
|
||||
import java.util.Collection;
|
||||
|
||||
/**
|
||||
* An Entity that implements this is considered a Spark.
|
||||
*/
|
||||
public interface ISparkEntity {
|
||||
|
||||
/**
|
||||
* Which TileEntity is this Spark attached to? A common implementation is checking the block below.
|
||||
*
|
||||
int x = MathHelper.floor_double(posX);
|
||||
int y = MathHelper.floor_double(posY) - 1;
|
||||
int z = MathHelper.floor_double(posZ);
|
||||
TileEntity tile = worldObj.getTileEntity(x, y, z);
|
||||
if(tile != null && tile instanceof ISparkAttachable)
|
||||
return (ISparkAttachable) tile;
|
||||
|
||||
return null;
|
||||
*/
|
||||
public ISparkAttachable getAttachedTile();
|
||||
|
||||
/**
|
||||
* Gets a collection of all Sparks this is tranfering to.
|
||||
*/
|
||||
public Collection<ISparkEntity> getTransfers();
|
||||
|
||||
/**
|
||||
* Registers the Spark passed in as a Spark meant for mana to be transfered towards.
|
||||
*/
|
||||
public void registerTransfer(ISparkEntity entity);
|
||||
|
||||
/**
|
||||
* Gets which upgrade is in this Spark.<br>
|
||||
* 0: None<br>
|
||||
* 1: Dispersive<br>
|
||||
* 2: Dominant<br>
|
||||
* 3: Recessive<br>
|
||||
* 4: Isolated
|
||||
*/
|
||||
public int getUpgrade();
|
||||
|
||||
/**
|
||||
* Sets the upgrade on this Spark. See {@link ISparkEntity#getUpgrade}
|
||||
*/
|
||||
public void setUpgrade(int upgrade);
|
||||
|
||||
/**
|
||||
* See {@link ISparkAttachable#areIncomingTranfersDone()}
|
||||
*/
|
||||
public boolean areIncomingTransfersDone();
|
||||
|
||||
}
|
33
src/api/java/vazkii/botania/api/mana/spark/SparkHelper.java
Normal file
33
src/api/java/vazkii/botania/api/mana/spark/SparkHelper.java
Normal file
|
@ -0,0 +1,33 @@
|
|||
/**
|
||||
* This class was created by <Vazkii>. It's distributed as
|
||||
* part of the Botania Mod. Get the Source Code in github:
|
||||
* https://github.com/Vazkii/Botania
|
||||
*
|
||||
* Botania is Open Source and distributed under a
|
||||
* Creative Commons Attribution-NonCommercial-ShareAlike 3.0 License
|
||||
* (http://creativecommons.org/licenses/by-nc-sa/3.0/deed.en_GB)
|
||||
*
|
||||
* File Created @ [Aug 21, 2014, 7:16:11 PM (GMT)]
|
||||
*/
|
||||
package vazkii.botania.api.mana.spark;
|
||||
|
||||
import java.util.List;
|
||||
|
||||
import net.minecraft.util.AxisAlignedBB;
|
||||
import net.minecraft.world.World;
|
||||
|
||||
public final class SparkHelper {
|
||||
|
||||
public static final int SPARK_SCAN_RANGE = 12;
|
||||
|
||||
public static List<ISparkEntity> getSparksAround(World world, double x, double y, double z) {
|
||||
return SparkHelper.getEntitiesAround(ISparkEntity.class, world, x, y, z);
|
||||
}
|
||||
|
||||
public static <T> List<T> getEntitiesAround(Class<? extends T> clazz, World world, double x, double y, double z) {
|
||||
int r = SPARK_SCAN_RANGE;
|
||||
List<T> entities = world.getEntitiesWithinAABB(clazz, AxisAlignedBB.getBoundingBox(x - r, y - r, z - r, x + r, y + r, z + r));
|
||||
return entities;
|
||||
}
|
||||
|
||||
}
|
4
src/api/java/vazkii/botania/api/package-info.java
Normal file
4
src/api/java/vazkii/botania/api/package-info.java
Normal file
|
@ -0,0 +1,4 @@
|
|||
@API(owner = "Botania", apiVersion = "18", provides = "BotaniaAPI")
|
||||
package vazkii.botania.api;
|
||||
import cpw.mods.fml.common.API;
|
||||
|
14
src/api/java/vazkii/botania/api/recipe/IElvenItem.java
Normal file
14
src/api/java/vazkii/botania/api/recipe/IElvenItem.java
Normal file
|
@ -0,0 +1,14 @@
|
|||
package vazkii.botania.api.recipe;
|
||||
|
||||
import net.minecraft.item.ItemStack;
|
||||
|
||||
/**
|
||||
* Any Item that implements this is classified as an "Elven Item", by which,
|
||||
* it'll not go through the alfheim portal. Any item that comes out of it
|
||||
* must implement this or it'll just go back in.
|
||||
*/
|
||||
public interface IElvenItem {
|
||||
|
||||
public boolean isElvenItem(ItemStack stack);
|
||||
|
||||
}
|
26
src/api/java/vazkii/botania/api/recipe/IFlowerComponent.java
Normal file
26
src/api/java/vazkii/botania/api/recipe/IFlowerComponent.java
Normal file
|
@ -0,0 +1,26 @@
|
|||
/**
|
||||
* This class was created by <Vazkii>. It's distributed as
|
||||
* part of the Botania Mod. Get the Source Code in github:
|
||||
* https://github.com/Vazkii/Botania
|
||||
*
|
||||
* Botania is Open Source and distributed under a
|
||||
* Creative Commons Attribution-NonCommercial-ShareAlike 3.0 License
|
||||
* (http://creativecommons.org/licenses/by-nc-sa/3.0/deed.en_GB)
|
||||
*
|
||||
* File Created @ [Feb 15, 2014, 2:36:35 PM (GMT)]
|
||||
*/
|
||||
package vazkii.botania.api.recipe;
|
||||
|
||||
import net.minecraft.inventory.IInventory;
|
||||
import net.minecraft.item.ItemStack;
|
||||
|
||||
/**
|
||||
* Have an Item implement this to allow it to be used in the Petal Apothecary.
|
||||
*/
|
||||
public interface IFlowerComponent {
|
||||
|
||||
public boolean canFit(ItemStack stack, IInventory apothecary);
|
||||
|
||||
public int getParticleColor(ItemStack stack);
|
||||
|
||||
}
|
Some files were not shown because too many files have changed in this diff Show more
Loading…
Add table
Add a link
Reference in a new issue