2013-07-26 21:18:53 -07:00
package tconstruct.library ;
import java.lang.reflect.Method ;
2014-09-09 18:30:15 +10:00
import java.util.* ;
import net.minecraft.item.* ;
import org.apache.logging.log4j.* ;
import tconstruct.library.crafting.* ;
2014-06-30 22:26:00 -08:00
import tconstruct.library.modifier.ActiveArmorMod ;
2014-09-09 18:30:15 +10:00
import tconstruct.library.tools.* ;
2013-07-26 21:18:53 -07:00
2014-02-16 14:23:50 -05:00
/**
* A registry to store any relevant API work
2013-07-26 21:18:53 -07:00
*
* @author mDiyo
*/
public class TConstructRegistry
{
public static TConstructRegistry instance = new TConstructRegistry ();
2014-02-20 14:20:02 -05:00
public static Logger logger = LogManager . getLogger ( "TCon-API" );
2013-10-12 23:46:35 +01:00
2013-07-26 21:18:53 -07:00
/* Creative tabs */
2014-07-05 22:06:38 -08:00
public static TConstructCreativeTab toolTab ;
public static TConstructCreativeTab partTab ;
public static TConstructCreativeTab materialTab ;
public static TConstructCreativeTab blockTab ;
public static TConstructCreativeTab equipableTab ;
2013-07-26 21:18:53 -07:00
/* Items */
2014-02-16 14:23:50 -05:00
/**
* A directory of crafting items and tools used by the mod.
2013-07-26 21:18:53 -07:00
*
2014-02-16 14:23:50 -05:00
* Tools: pickaxe, shovel, hatchet, broadsword, longsword, rapier, dagger,
* cutlass frypan, battlesign, mattock, chisel lumberaxe, cleaver, scythe,
* excavator, hammer, battleaxe
2013-07-26 21:18:53 -07:00
*
2014-02-16 14:23:50 -05:00
* Patterns: blankPattern, woodPattern, metalPattern
2013-07-26 21:18:53 -07:00
*
2014-02-16 14:23:50 -05:00
* Tool crafting parts: toolRod, toolShard, binding, toughBinding, toughRod,
* heavyPlate pickaxeHead, shovelhead, hatchetHead, swordBlade, wideguard,
* handGuard, crossbar, knifeBlade, fullGuard, frypanHead, signHead,
* chiselHead scytheBlade, broadAxeHead, excavatorHead, largeSwordBlade,
* hammerHead bowstring, fletching, arrowhead
2013-07-26 21:18:53 -07:00
*/
public static HashMap < String , Item > itemDirectory = new HashMap < String , Item > ();
2014-02-16 14:23:50 -05:00
/**
* Adds an item to the directory
2013-07-26 21:18:53 -07:00
*
2014-02-16 14:23:50 -05:00
* @param name
* Associates the name with the stack
* @param itemstack
* The stack to add to the directory
2013-07-26 21:18:53 -07:00
*/
public static void addItemToDirectory ( String name , Item itemstack )
{
Item add = itemDirectory . get ( name );
if ( add != null )
2014-02-20 14:20:02 -05:00
logger . warn ( name + " is already present in the Item directory" );
2013-07-26 21:18:53 -07:00
itemDirectory . put ( name , itemstack );
}
2014-02-16 14:23:50 -05:00
/**
* Retrieves an itemstack from the directory
2013-07-26 21:18:53 -07:00
*
2014-02-16 14:23:50 -05:00
* @param name
* The name of the item to get
2013-07-26 21:18:53 -07:00
* @return Item associated with the name, or null if not present.
*/
public static Item getItem ( String name )
{
Item ret = itemDirectory . get ( name );
if ( ret == null )
2014-02-20 14:20:02 -05:00
logger . warn ( "Could not find " + name + " in the Item directory" );
2013-07-26 21:18:53 -07:00
return ret ;
}
2014-02-16 14:23:50 -05:00
/**
* A directory of ItemStacks. Contains mostly crafting items
2013-07-26 21:18:53 -07:00
*
2014-02-16 14:23:50 -05:00
* Materials: paperStack, greenSlimeCrystal, blueSlimeCrystal, searedBrick,
* mossBall, lavaCrystal, necroticBone, silkyCloth, silkyJewel ingotCobalt,
* ingotArdite, ingotManyullyn, ingotCopper, ingotTin, ingotAluminum,
* rawAluminum, ingotBronze, ingotAluminumBrass, ingotAlumite, ingotSteel,
* ingotObsidian nuggetIron, nuggetCopper, nuggetTin, nuggetAluminum,
* nuggetSilver, nuggetAluminumBrass oreberryIron, oreberryGold,
* oreberryCopper, oreberryTin, oreberryTin, oreberrySilver, diamondApple,
* blueSlimeFood, canisterEmpty, miniRedHeart, canisterRedHeart
2013-07-26 21:18:53 -07:00
*
* Patterns - These have a suffix of Pattern or Cast. ex: hatchetHeadPattern
2014-02-16 14:23:50 -05:00
* ingot, toolRod, pickaxeHead, shovelHead, hatchetHead, swordBlade,
* wideGuard, handGuard, crossbar, binding, frypanHead, signHead,
* knifeBlade, chiselHead, toughRod, toughBinding, largePlate, broadAxeHead,
* scytheHead, excavatorHead, largeBlade, hammerHead, fullGuard, bowstring
2013-07-26 21:18:53 -07:00
*/
static HashMap < String , ItemStack > itemstackDirectory = new HashMap < String , ItemStack > ();
2014-02-16 14:23:50 -05:00
/**
* Adds an itemstack to the directory
2013-07-26 21:18:53 -07:00
*
2014-02-16 14:23:50 -05:00
* @param name
* Associates the name with the stack
* @param itemstack
* The stack to add to the directory
2013-07-26 21:18:53 -07:00
*/
public static void addItemStackToDirectory ( String name , ItemStack itemstack )
{
ItemStack add = itemstackDirectory . get ( name );
if ( add != null )
2014-02-20 14:20:02 -05:00
logger . warn ( name + " is already present in the ItemStack directory" );
2013-07-26 21:18:53 -07:00
itemstackDirectory . put ( name , itemstack );
}
2014-02-16 14:23:50 -05:00
/**
* Retrieves an itemstack from the directory
2013-07-26 21:18:53 -07:00
*
2014-02-16 14:23:50 -05:00
* @param name
* The name of the item to get
2013-07-26 21:18:53 -07:00
* @return Item associated with the name, or null if not present.
*/
public static ItemStack getItemStack ( String name )
{
ItemStack ret = itemstackDirectory . get ( name );
if ( ret == null )
2014-02-20 14:20:02 -05:00
logger . warn ( "Could not find " + name + " in the ItemStack directory" );
2013-07-26 21:18:53 -07:00
return ret ;
}
public static ArrayList < ToolCore > tools = new ArrayList < ToolCore > ( 20 );
2014-02-16 14:23:50 -05:00
// Parts
2013-07-26 21:18:53 -07:00
2014-02-16 14:23:50 -05:00
/**
* List: Item ID, metadata, material ID ItemStack: Output. Ex: Cactus
* Binding
2013-07-26 21:18:53 -07:00
*/
public static HashMap < List , ItemStack > patternPartMapping = new HashMap < List , ItemStack > ();
2014-02-16 14:23:50 -05:00
/**
* Maps an item and a material ID to an output part
2013-07-26 21:18:53 -07:00
*
2014-02-16 14:23:50 -05:00
* @param woodPattern
* ID to check against
* @param patternMeta
* Metadata to check against
* @param materialID
* Material that goes with the item
* @param output
* The resulting part
2013-07-26 21:18:53 -07:00
*/
2013-12-31 14:11:05 -05:00
public static void addPartMapping ( Item woodPattern , int patternMeta , int materialID , ItemStack output )
2013-07-26 21:18:53 -07:00
{
2013-12-31 14:11:05 -05:00
patternPartMapping . put ( Arrays . asList ( woodPattern , patternMeta , materialID ), output );
2013-07-26 21:18:53 -07:00
}
2013-12-31 15:30:34 -05:00
public static ItemStack getPartMapping ( Item item , int metadata , int materialID )
2013-07-26 21:18:53 -07:00
{
2013-12-31 15:30:34 -05:00
ItemStack stack = patternPartMapping . get ( Arrays . asList ( item , metadata , materialID ));
2013-07-26 21:18:53 -07:00
if ( stack != null )
return stack . copy ();
return null ;
}
2014-02-16 14:23:50 -05:00
// Tools
2013-07-26 21:18:53 -07:00
2014-02-16 14:23:50 -05:00
/**
* Internal tool mapping, used for adding textures
2013-07-26 21:18:53 -07:00
*
* @param tool
*/
public static void addToolMapping ( ToolCore tool )
{
tools . add ( tool );
}
2014-02-16 14:23:50 -05:00
/**
* Internal tool mapping, used for adding textures
2013-07-26 21:18:53 -07:00
*
* @return List of tools
*/
public static ArrayList < ToolCore > getToolMapping ()
{
return tools ;
}
2014-02-16 14:23:50 -05:00
/**
* Registers a tool to its crafting parts. If an output is registered
* multiple times the parts are added to the recipe's input list Valid part
* amounts are 2, 3, and 4.
2013-07-26 21:18:53 -07:00
*
2014-08-23 11:28:56 +02:00
* @see ToolBuilder
2014-02-16 14:23:50 -05:00
* @param output
* The ToolCore to craft
* @param parts
* Pieces to make the tool with
2013-07-26 21:18:53 -07:00
*/
public static void addToolRecipe ( ToolCore output , Item ... parts )
{
ToolBuilder tb = ToolBuilder . instance ;
2013-11-05 19:56:30 +03:00
if ( parts . length < 2 || parts . length > 4 )
2014-02-20 14:20:02 -05:00
logger . warn ( "Wrong amount of items to craft into a tool" );
2013-07-26 21:18:53 -07:00
tb . addToolRecipe ( output , parts );
}
2014-02-16 14:23:50 -05:00
// Materials
2014-06-30 22:26:00 -08:00
public static HashMap < Integer , ToolMaterial > toolMaterials = new HashMap < Integer , ToolMaterial > ( 40 );
public static HashMap < String , ToolMaterial > toolMaterialStrings = new HashMap < String , ToolMaterial > ( 40 );
2013-07-26 21:18:53 -07:00
2014-02-16 14:23:50 -05:00
/**
* Adds a tool material to the registry
2013-07-26 21:18:53 -07:00
*
2014-02-16 14:23:50 -05:00
* @param materialID
* Unique ID, stored for each part
* @param materialName
* Unique name for data lookup purposes
* @param harvestLevel
* The materials which the tool can harvest. Pickaxe levels - 0:
* Wood, 1: Stone, 2: Redstone/Diamond, 3: Obsidian, 4:
* Cobalt/Ardite, 5: Manyullyn
* @param durability
* Base durability of the tool, affects tool heads.
* @param miningspeed
* Base mining speed, divided by 100 in use
* @param attack
* Base attack
* @param handleModifier
* Durability multiplier on the tool
* @param reinforced
* Reinforced level
* @param stonebound
* Amount of Stonebound to put on the tool. Negative numbers are
* Spiny.
2013-07-26 21:18:53 -07:00
*/
2014-09-03 11:50:57 +02:00
public static void addToolMaterial ( int materialID , String materialName , int harvestLevel , int durability , int miningspeed , int attack , float handleModifier , int reinforced , float stonebound , String style )
2013-07-26 21:18:53 -07:00
{
2014-06-30 22:26:00 -08:00
ToolMaterial mat = toolMaterials . get ( materialID );
2013-07-26 21:18:53 -07:00
if ( mat == null )
{
2014-09-03 11:50:57 +02:00
mat = new ToolMaterial ( materialName , harvestLevel , durability , miningspeed , attack , handleModifier , reinforced , stonebound , style );
2013-07-26 21:18:53 -07:00
toolMaterials . put ( materialID , mat );
toolMaterialStrings . put ( materialName , mat );
}
else
throw new IllegalArgumentException ( "[TCon API] Material ID " + materialID + " is already occupied by " + mat . materialName );
}
2014-09-03 14:58:05 +02:00
@Deprecated
public static void addToolMaterial ( int materialID , String materialName , int harvestLevel , int durability , int miningspeed , int attack , float handleModifier , int reinforced , float stonebound , String style , String ability )
{
logger . warn ( "[TCon API] Using deprecated addToolMaterial with ability name. ability will be ignored, use languages files for that." );
addToolMaterial ( materialID , materialName , harvestLevel , durability , miningspeed , attack , handleModifier , reinforced , stonebound , style );
}
2013-07-26 21:18:53 -07:00
2014-09-01 22:40:00 +02:00
@Deprecated
2014-09-09 18:30:15 +10:00
public static void addToolMaterial ( int materialID , String materialName , String displayName , int harvestLevel , int durability , int miningspeed , int attack , float handleModifier , int reinforced , float stonebound , String style , String ability )
2013-07-26 21:18:53 -07:00
{
2014-09-03 14:58:05 +02:00
logger . warn ( "[TCon API] Using deprecated addToolMaterial with display and ability name. displayName and ability will be ignored, use languages files for that." );
2014-09-03 11:50:57 +02:00
addToolMaterial ( materialID , materialName , harvestLevel , durability , miningspeed , attack , handleModifier , reinforced , stonebound , style );
2013-07-26 21:18:53 -07:00
}
2014-02-16 14:23:50 -05:00
/**
* Adds a tool material to the registry
2013-07-26 21:18:53 -07:00
*
2014-02-16 14:23:50 -05:00
* @param materialID
* Unique ID, stored for each part
* @param material
* Complete tool material to add. Uses the name in the material
* for lookup purposes.
2013-07-26 21:18:53 -07:00
*/
2014-06-30 22:26:00 -08:00
public static void addtoolMaterial ( int materialID , ToolMaterial material )
2013-07-26 21:18:53 -07:00
{
2014-06-30 22:26:00 -08:00
ToolMaterial mat = toolMaterials . get ( materialID );
2013-07-26 21:18:53 -07:00
if ( mat == null )
{
2014-07-27 19:58:07 +02:00
toolMaterials . put ( materialID , material );
toolMaterialStrings . put ( material . name (), material );
2013-07-26 21:18:53 -07:00
}
else
throw new IllegalArgumentException ( "[TCon API] Material ID " + materialID + " is already occupied by " + mat . materialName );
}
2014-02-16 14:23:50 -05:00
/**
* Looks up a tool material by ID
2013-07-26 21:18:53 -07:00
*
2014-02-16 14:23:50 -05:00
* @param key
* The ID to look up
2013-07-26 21:18:53 -07:00
* @return Tool Material
*/
2014-06-30 22:26:00 -08:00
public static ToolMaterial getMaterial ( int key )
2013-07-26 21:18:53 -07:00
{
return ( toolMaterials . get ( key ));
}
2014-02-16 14:23:50 -05:00
/**
* Looks up a tool material by name
2013-07-26 21:18:53 -07:00
*
2014-02-16 14:23:50 -05:00
* @param key
* the name to look up
2013-07-26 21:18:53 -07:00
* @return Tool Material
*/
2014-06-30 22:26:00 -08:00
public static ToolMaterial getMaterial ( String key )
2013-07-26 21:18:53 -07:00
{
return ( toolMaterialStrings . get ( key ));
}
2014-02-16 14:23:50 -05:00
// Bow materials
2013-07-26 21:18:53 -07:00
public static HashMap < Integer , BowMaterial > bowMaterials = new HashMap < Integer , BowMaterial > ( 40 );
public static void addBowMaterial ( int materialID , int durability , int drawSpeed , float speedMax )
{
BowMaterial mat = bowMaterials . get ( materialID );
if ( mat == null )
{
mat = new BowMaterial ( durability , drawSpeed , speedMax );
bowMaterials . put ( materialID , mat );
}
else
throw new IllegalArgumentException ( "[TCon API] Bow Material ID " + materialID + " is already occupied" );
}
public static boolean validBowMaterial ( int materialID )
{
return bowMaterials . containsKey ( materialID );
}
public static BowMaterial getBowMaterial ( int materialID )
{
return bowMaterials . get ( materialID );
}
public static HashMap < Integer , ArrowMaterial > arrowMaterials = new HashMap < Integer , ArrowMaterial > ( 40 );
public static void addArrowMaterial ( int materialID , float mass , float breakChance , float accuracy )
{
ArrowMaterial mat = arrowMaterials . get ( materialID );
if ( mat == null )
{
mat = new ArrowMaterial ( mass , breakChance , accuracy );
arrowMaterials . put ( materialID , mat );
}
else
throw new IllegalArgumentException ( "[TCon API] Arrow Material ID " + materialID + " is already occupied" );
}
public static boolean validArrowMaterial ( int materialID )
{
return arrowMaterials . containsKey ( materialID );
}
public static ArrowMaterial getArrowMaterial ( int materialID )
{
return arrowMaterials . get ( materialID );
}
2014-02-16 14:23:50 -05:00
// Custom materials - bowstrings, fletching, etc
2013-07-26 21:18:53 -07:00
public static ArrayList < CustomMaterial > customMaterials = new ArrayList < CustomMaterial > ();
public static void addCustomMaterial ( CustomMaterial mat )
{
if ( mat != null )
customMaterials . add ( mat );
}
public static void addBowstringMaterial ( int materialID , int value , ItemStack input , ItemStack craftingMaterial , float durability , float drawSpeed , float flightSpeed )
{
BowstringMaterial mat = new BowstringMaterial ( materialID , value , input , craftingMaterial , durability , drawSpeed , flightSpeed );
customMaterials . add ( mat );
}
public static void addFletchingMaterial ( int materialID , int value , ItemStack input , ItemStack craftingMaterial , float accuracy , float breakChance , float mass )
{
FletchingMaterial mat = new FletchingMaterial ( materialID , value , input , craftingMaterial , accuracy , breakChance , mass );
customMaterials . add ( mat );
}
public static CustomMaterial getCustomMaterial ( int materialID , Class <? extends CustomMaterial > clazz )
{
for ( CustomMaterial mat : customMaterials )
{
if ( mat . getClass (). equals ( clazz ) && mat . materialID == materialID )
return mat ;
}
return null ;
}
public static CustomMaterial getCustomMaterial ( ItemStack input , Class <? extends CustomMaterial > clazz )
{
for ( CustomMaterial mat : customMaterials )
{
2014-08-23 11:28:56 +02:00
if ( mat . getClass (). equals ( clazz ) && mat . matches ( input ))
2013-07-26 21:18:53 -07:00
return mat ;
}
return null ;
}
2014-02-16 14:23:50 -05:00
/*
* public static CustomMaterial getCustomMaterial(ItemStack input, ItemStack
* pattern) { for (CustomMaterial mat : customMaterials) { if
* (mat.matches(input, pattern)) return mat; } return null; }
*/
2013-07-26 21:18:53 -07:00
2014-02-16 14:23:50 -05:00
/*
* public static ItemStack craftBowString(ItemStack stack) { if
* (stack.stackSize < 3) return null;
*
* for (BowstringMaterial mat : bowstringMaterials) { if
* (stack.isItemEqual(mat.input)) return mat.craftingItem.copy(); } return
* null; }
*
* public static BowstringMaterial getBowstringMaterial(ItemStack stack) {
* if (stack.stackSize < 3) return null;
*
* for (BowstringMaterial mat : bowstringMaterials) { if
* (stack.isItemEqual(mat.input)) return mat; } return null; }
*/
2013-07-26 21:18:53 -07:00
public static LiquidCasting getTableCasting ()
{
return instance . tableCasting ();
}
LiquidCasting tableCasting ()
{
try
{
Class clazz = Class . forName ( "tconstruct.TConstruct" );
Method method = clazz . getMethod ( "getTableCasting" );
LiquidCasting lc = ( LiquidCasting ) method . invoke ( this );
return lc ;
}
catch ( Exception e )
{
2014-02-20 14:20:02 -05:00
logger . warn ( "Could not find casting table recipes." );
2013-07-26 21:18:53 -07:00
return null ;
}
}
public static LiquidCasting getBasinCasting ()
{
return instance . basinCasting ();
}
LiquidCasting basinCasting ()
{
try
{
Class clazz = Class . forName ( "tconstruct.TConstruct" );
Method method = clazz . getMethod ( "getBasinCasting" );
LiquidCasting lc = ( LiquidCasting ) method . invoke ( this );
return lc ;
}
catch ( Exception e )
{
2014-02-20 14:20:02 -05:00
logger . warn ( "Could not find casting basin recipes." );
2013-07-26 21:18:53 -07:00
return null ;
}
}
public static Detailing getChiselDetailing ()
{
return instance . chiselDetailing ();
}
Detailing chiselDetailing ()
{
try
{
Class clazz = Class . forName ( "tconstruct.TConstruct" );
Method method = clazz . getMethod ( "getChiselDetailing" );
Detailing lc = ( Detailing ) method . invoke ( this );
return lc ;
}
catch ( Exception e )
{
2014-02-20 14:20:02 -05:00
logger . warn ( "Could not find chisel detailing recipes." );
2013-07-26 21:18:53 -07:00
return null ;
}
}
public static ArrayList < ActiveToolMod > activeModifiers = new ArrayList < ActiveToolMod > ();
2014-06-30 22:26:00 -08:00
public static LinkedList < ActiveArmorMod > activeArmorModifiers = new LinkedList < ActiveArmorMod > ();
2013-07-26 21:18:53 -07:00
public static void registerActiveToolMod ( ActiveToolMod mod )
{
activeModifiers . add ( mod );
}
2014-06-30 22:26:00 -08:00
public static void registerActiveArmorMod ( ActiveArmorMod mod )
{
activeArmorModifiers . add ( mod );
}
2014-02-16 14:23:50 -05:00
/**
* Default Material Index 0: Wood 1: Stone 2: Iron 3: Flint 4: Cactus 5:
* Bone 6: Obsidian 7: Netherrack 8: Green Slime 9: Paper 10: Cobalt 11:
* Ardite 12: Manyullyn 13: Copper 14: Bronze 15: Alumite 16: Steel 17: Blue
* Slime
2013-07-26 21:18:53 -07:00
*/
}