2014-03-24 08:55:46 +01:00
package appeng.integration.modules ;
2014-03-24 09:38:52 +01:00
import java.util.Arrays ;
2014-03-24 08:55:46 +01:00
import java.util.List ;
import net.minecraft.init.Blocks ;
import net.minecraft.item.ItemStack ;
import net.minecraft.item.crafting.CraftingManager ;
import net.minecraft.item.crafting.IRecipe ;
import uristqwerty.CraftGuide.CraftGuideLog ;
import uristqwerty.CraftGuide.DefaultRecipeTemplate ;
import uristqwerty.CraftGuide.RecipeGeneratorImplementation ;
import uristqwerty.CraftGuide.api.CraftGuideAPIObject ;
import uristqwerty.CraftGuide.api.CraftGuideRecipe ;
import uristqwerty.CraftGuide.api.ItemSlot ;
import uristqwerty.CraftGuide.api.RecipeGenerator ;
import uristqwerty.CraftGuide.api.RecipeProvider ;
import uristqwerty.CraftGuide.api.RecipeTemplate ;
import uristqwerty.CraftGuide.api.Slot ;
import uristqwerty.CraftGuide.api.SlotType ;
import uristqwerty.CraftGuide.api.StackInfo ;
import uristqwerty.CraftGuide.api.StackInfoSource ;
import uristqwerty.gui_craftguide.texture.DynamicTexture ;
import uristqwerty.gui_craftguide.texture.TextureClip ;
2014-09-12 06:06:46 +02:00
import appeng.api.exceptions.MissingIngredientError ;
import appeng.api.exceptions.RegistrationError ;
import appeng.api.recipes.IIngredient ;
2014-03-24 09:29:23 +01:00
import appeng.integration.IIntegrationModule ;
2014-03-24 08:55:46 +01:00
import appeng.recipes.game.ShapedRecipe ;
import appeng.recipes.game.ShapelessRecipe ;
import cpw.mods.fml.relauncher.ReflectionHelper ;
2014-03-24 09:29:23 +01:00
public class CraftGuide extends CraftGuideAPIObject implements IIntegrationModule , RecipeProvider , StackInfoSource , RecipeGenerator
2014-03-24 08:55:46 +01:00
{
2014-03-24 09:29:23 +01:00
public static CraftGuide instance ;
2014-03-24 08:55:46 +01:00
private final Slot [ ] shapelessCraftingSlots = new ItemSlot [ ] { new ItemSlot ( 3 , 3 , 16 , 16 ) , new ItemSlot ( 21 , 3 , 16 , 16 ) , new ItemSlot ( 39 , 3 , 16 , 16 ) ,
new ItemSlot ( 3 , 21 , 16 , 16 ) , new ItemSlot ( 21 , 21 , 16 , 16 ) , new ItemSlot ( 39 , 21 , 16 , 16 ) , new ItemSlot ( 3 , 39 , 16 , 16 ) ,
new ItemSlot ( 21 , 39 , 16 , 16 ) , new ItemSlot ( 39 , 39 , 16 , 16 ) , new ItemSlot ( 59 , 21 , 16 , 16 , true ) . setSlotType ( SlotType . OUTPUT_SLOT ) , } ;
private final Slot [ ] craftingSlotsOwnBackground = new ItemSlot [ ] { new ItemSlot ( 3 , 3 , 16 , 16 ) . drawOwnBackground ( ) ,
new ItemSlot ( 21 , 3 , 16 , 16 ) . drawOwnBackground ( ) , new ItemSlot ( 39 , 3 , 16 , 16 ) . drawOwnBackground ( ) ,
new ItemSlot ( 3 , 21 , 16 , 16 ) . drawOwnBackground ( ) , new ItemSlot ( 21 , 21 , 16 , 16 ) . drawOwnBackground ( ) ,
new ItemSlot ( 39 , 21 , 16 , 16 ) . drawOwnBackground ( ) , new ItemSlot ( 3 , 39 , 16 , 16 ) . drawOwnBackground ( ) ,
new ItemSlot ( 21 , 39 , 16 , 16 ) . drawOwnBackground ( ) , new ItemSlot ( 39 , 39 , 16 , 16 ) . drawOwnBackground ( ) ,
new ItemSlot ( 59 , 21 , 16 , 16 , true ) . setSlotType ( SlotType . OUTPUT_SLOT ) . drawOwnBackground ( ) , } ;
private final Slot [ ] smallCraftingSlotsOwnBackground = new ItemSlot [ ] { new ItemSlot ( 12 , 12 , 16 , 16 ) . drawOwnBackground ( ) ,
new ItemSlot ( 30 , 12 , 16 , 16 ) . drawOwnBackground ( ) , new ItemSlot ( 12 , 30 , 16 , 16 ) . drawOwnBackground ( ) ,
new ItemSlot ( 30 , 30 , 16 , 16 ) . drawOwnBackground ( ) , new ItemSlot ( 59 , 21 , 16 , 16 , true ) . setSlotType ( SlotType . OUTPUT_SLOT ) . drawOwnBackground ( ) , } ;
private final Slot [ ] craftingSlots = new ItemSlot [ ] { new ItemSlot ( 3 , 3 , 16 , 16 ) , new ItemSlot ( 21 , 3 , 16 , 16 ) , new ItemSlot ( 39 , 3 , 16 , 16 ) ,
new ItemSlot ( 3 , 21 , 16 , 16 ) , new ItemSlot ( 21 , 21 , 16 , 16 ) , new ItemSlot ( 39 , 21 , 16 , 16 ) , new ItemSlot ( 3 , 39 , 16 , 16 ) ,
new ItemSlot ( 21 , 39 , 16 , 16 ) , new ItemSlot ( 39 , 39 , 16 , 16 ) , new ItemSlot ( 59 , 21 , 16 , 16 , true ) . setSlotType ( SlotType . OUTPUT_SLOT ) , } ;
private final Slot [ ] smallCraftingSlots = new ItemSlot [ ] { new ItemSlot ( 12 , 12 , 16 , 16 ) , new ItemSlot ( 30 , 12 , 16 , 16 ) , new ItemSlot ( 12 , 30 , 16 , 16 ) ,
new ItemSlot ( 30 , 30 , 16 , 16 ) , new ItemSlot ( 59 , 21 , 16 , 16 , true ) . setSlotType ( SlotType . OUTPUT_SLOT ) , } ;
private final Slot [ ] furnaceSlots = new ItemSlot [ ] { new ItemSlot ( 13 , 21 , 16 , 16 ) ,
new ItemSlot ( 50 , 21 , 16 , 16 , true ) . setSlotType ( SlotType . OUTPUT_SLOT ) , } ;
@Override
public String getInfo ( ItemStack itemStack )
{
// :P
return null ;
}
RecipeGenerator parent ;
@Override
public void generateRecipes ( RecipeGenerator generator )
{
parent = generator ;
RecipeTemplate craftingTemplate ;
RecipeTemplate smallCraftingTemplate ;
if ( uristqwerty . CraftGuide . CraftGuide . newerBackgroundStyle )
{
craftingTemplate = generator . createRecipeTemplate ( craftingSlotsOwnBackground , null ) ;
smallCraftingTemplate = generator . createRecipeTemplate ( smallCraftingSlotsOwnBackground , null ) ;
}
else
{
craftingTemplate = new DefaultRecipeTemplate ( craftingSlots , RecipeGeneratorImplementation . workbench , new TextureClip (
DynamicTexture . instance ( " recipe_backgrounds " ) , 1 , 1 , 79 , 58 ) , new TextureClip ( DynamicTexture . instance ( " recipe_backgrounds " ) , 82 , 1 ,
79 , 58 ) ) ;
smallCraftingTemplate = new DefaultRecipeTemplate ( smallCraftingSlots , RecipeGeneratorImplementation . workbench , new TextureClip (
DynamicTexture . instance ( " recipe_backgrounds " ) , 1 , 61 , 79 , 58 ) , new TextureClip ( DynamicTexture . instance ( " recipe_backgrounds " ) , 82 , 61 ,
79 , 58 ) ) ;
}
RecipeTemplate shapelessTemplate = new DefaultRecipeTemplate ( shapelessCraftingSlots , RecipeGeneratorImplementation . workbench , new TextureClip (
DynamicTexture . instance ( " recipe_backgrounds " ) , 1 , 121 , 79 , 58 ) , new TextureClip ( DynamicTexture . instance ( " recipe_backgrounds " ) , 82 , 121 ,
79 , 58 ) ) ;
RecipeTemplate furnaceTemplate = new DefaultRecipeTemplate ( furnaceSlots , new ItemStack ( Blocks . furnace ) , new TextureClip (
DynamicTexture . instance ( " recipe_backgrounds " ) , 1 , 181 , 79 , 58 ) , new TextureClip ( DynamicTexture . instance ( " recipe_backgrounds " ) , 82 , 181 ,
79 , 58 ) ) ;
addCraftingRecipes ( craftingTemplate , smallCraftingTemplate , shapelessTemplate , this ) ;
addGrinderRecipes ( furnaceTemplate , this ) ;
addInscriberRecipes ( furnaceTemplate , this ) ;
}
private void addCraftingRecipes ( RecipeTemplate template , RecipeTemplate templateSmall , RecipeTemplate templateShapeless , RecipeGenerator generator )
{
List recipes = CraftingManager . getInstance ( ) . getRecipeList ( ) ;
int errCount = 0 ;
for ( Object o : recipes )
{
try
{
IRecipe recipe = ( IRecipe ) o ;
Object [ ] items = generator . getCraftingRecipe ( recipe , true ) ;
2014-10-09 21:33:31 +02:00
if ( items . length = = 5 )
2014-03-24 08:55:46 +01:00
{
generator . addRecipe ( templateSmall , items ) ;
}
else if ( recipe instanceof ShapelessRecipe )
{
generator . addRecipe ( templateShapeless , items ) ;
}
else
{
generator . addRecipe ( template , items ) ;
}
}
catch ( Exception e )
{
2014-10-04 11:10:08 +02:00
if ( errCount + + > = 5 )
2014-03-24 08:55:46 +01:00
{
CraftGuideLog
. log ( " CraftGuide DefaultRecipeProvider: Stack trace limit reached, further stack traces from this invocation will not be logged to the console. They will still be logged to (.minecraft)/config/CraftGuide/CraftGuide.log " ,
true ) ;
errCount = - 1 ;
}
else
{
e . printStackTrace ( ) ;
}
CraftGuideLog . log ( e ) ;
}
}
}
private void addGrinderRecipes ( RecipeTemplate template , RecipeGenerator generator )
{
}
private void addInscriberRecipes ( RecipeTemplate template , RecipeGenerator generator )
{
}
@Override
public RecipeTemplate createRecipeTemplate ( Slot [ ] slots , ItemStack craftingType )
{
return parent . createRecipeTemplate ( slots , craftingType ) ;
}
@Override
public RecipeTemplate createRecipeTemplate ( Slot [ ] slots , ItemStack craftingType , String backgroundTexture , int backgroundX , int backgroundY ,
int backgroundSelectedX , int backgroundSelectedY )
{
return parent . createRecipeTemplate ( slots , craftingType , backgroundTexture , backgroundX , backgroundY , backgroundSelectedX , backgroundSelectedY ) ;
}
@Override
public RecipeTemplate createRecipeTemplate ( Slot [ ] slots , ItemStack craftingType , String backgroundTexture , int backgroundX , int backgroundY ,
String backgroundSelectedTexture , int backgroundSelectedX , int backgroundSelectedY )
{
return parent . createRecipeTemplate ( slots , craftingType , backgroundTexture , backgroundX , backgroundY , backgroundSelectedTexture , backgroundSelectedX ,
backgroundSelectedY ) ;
}
@Override
public void addRecipe ( RecipeTemplate template , Object [ ] crafting )
{
parent . addRecipe ( template , crafting ) ;
}
@Override
public void addRecipe ( CraftGuideRecipe recipe , ItemStack craftingType )
{
parent . addRecipe ( recipe , craftingType ) ;
}
@Override
public void setDefaultTypeVisibility ( ItemStack type , boolean visible )
{
parent . setDefaultTypeVisibility ( type , visible ) ;
}
@Override
public Object [ ] getCraftingRecipe ( IRecipe recipe )
{
return getCraftingRecipe ( recipe , true ) ;
}
Object [ ] getCraftingShapelessRecipe ( List items , ItemStack recipeOutput )
{
Object [ ] output = new Object [ 10 ] ;
for ( int i = 0 ; i < items . size ( ) ; i + + )
{
output [ i ] = items . get ( i ) ;
if ( output [ i ] instanceof ItemStack [ ] )
2014-03-24 09:38:52 +01:00
output [ i ] = Arrays . asList ( ( ItemStack [ ] ) output [ i ] ) ;
2014-03-24 08:55:46 +01:00
2014-09-12 06:06:46 +02:00
if ( output [ i ] instanceof IIngredient )
{
try
{
output [ i ] = toCG ( ( ( IIngredient ) output [ i ] ) . getItemStackSet ( ) ) ;
}
2014-10-01 15:20:42 +02:00
catch ( RegistrationError ignored )
2014-09-12 06:06:46 +02:00
{
}
2014-10-01 15:20:42 +02:00
catch ( MissingIngredientError ignored )
2014-09-12 06:06:46 +02:00
{
}
}
2014-03-24 08:55:46 +01:00
}
output [ 9 ] = recipeOutput ;
return output ;
}
Object [ ] getCraftingShapedRecipe ( int width , int height , Object [ ] items , ItemStack recipeOutput )
{
Object [ ] output = new Object [ 10 ] ;
for ( int y = 0 ; y < height ; y + + )
{
for ( int x = 0 ; x < width ; x + + )
{
int i = y * 3 + x ;
output [ i ] = items [ y * width + x ] ;
if ( output [ i ] instanceof ItemStack [ ] )
2014-03-24 09:38:52 +01:00
output [ i ] = Arrays . asList ( ( ItemStack [ ] ) output [ i ] ) ;
2014-03-24 08:55:46 +01:00
2014-09-12 06:06:46 +02:00
if ( output [ i ] instanceof IIngredient )
{
try
{
output [ i ] = toCG ( ( ( IIngredient ) output [ i ] ) . getItemStackSet ( ) ) ;
}
2014-10-01 15:20:42 +02:00
catch ( RegistrationError ignored )
2014-09-12 06:06:46 +02:00
{
}
2014-10-01 15:20:42 +02:00
catch ( MissingIngredientError ignored )
2014-09-12 06:06:46 +02:00
{
}
}
2014-03-24 08:55:46 +01:00
}
}
output [ 9 ] = recipeOutput ;
return output ;
}
Object [ ] getSmallShapedRecipe ( int width , int height , Object [ ] items , ItemStack recipeOutput )
{
Object [ ] output = new Object [ 5 ] ;
for ( int y = 0 ; y < height ; y + + )
{
for ( int x = 0 ; x < width ; x + + )
{
int i = y * 2 + x ;
output [ i ] = items [ y * width + x ] ;
if ( output [ i ] instanceof ItemStack [ ] )
2014-03-24 09:38:52 +01:00
output [ i ] = Arrays . asList ( ( ItemStack [ ] ) output [ i ] ) ;
2014-03-24 08:55:46 +01:00
2014-09-12 06:06:46 +02:00
if ( output [ i ] instanceof IIngredient )
{
try
{
output [ i ] = toCG ( ( ( IIngredient ) output [ i ] ) . getItemStackSet ( ) ) ;
}
2014-10-01 15:20:42 +02:00
catch ( RegistrationError ignored )
2014-09-12 06:06:46 +02:00
{
}
2014-10-01 15:20:42 +02:00
catch ( MissingIngredientError ignored )
2014-09-12 06:06:46 +02:00
{
}
}
2014-03-24 08:55:46 +01:00
}
}
output [ 4 ] = recipeOutput ;
return output ;
}
2014-09-12 06:06:46 +02:00
private Object toCG ( ItemStack [ ] itemStackSet )
{
List < ItemStack > list = Arrays . asList ( itemStackSet ) ;
for ( int x = 0 ; x < list . size ( ) ; x + + )
{
list . set ( x , list . get ( x ) . copy ( ) ) ;
if ( list . get ( x ) . stackSize = = 0 )
list . get ( x ) . stackSize = 1 ;
}
return list ;
}
2014-03-24 08:55:46 +01:00
@Override
public Object [ ] getCraftingRecipe ( IRecipe recipe , boolean allowSmallGrid )
{
if ( recipe instanceof ShapelessRecipe )
{
2014-09-29 09:42:50 +02:00
List items = ReflectionHelper . getPrivateValue ( ShapelessRecipe . class , ( ShapelessRecipe ) recipe , " input " ) ;
return getCraftingShapelessRecipe ( items , recipe . getRecipeOutput ( ) ) ;
2014-03-24 08:55:46 +01:00
}
else if ( recipe instanceof ShapedRecipe )
{
2014-09-29 09:42:50 +02:00
int width = ReflectionHelper . getPrivateValue ( ShapedRecipe . class , ( ShapedRecipe ) recipe , " width " ) ;
int height = ReflectionHelper . getPrivateValue ( ShapedRecipe . class , ( ShapedRecipe ) recipe , " height " ) ;
Object [ ] items = ReflectionHelper . getPrivateValue ( ShapedRecipe . class , ( ShapedRecipe ) recipe , " input " ) ;
2014-03-24 08:55:46 +01:00
if ( allowSmallGrid & & width < 3 & & height < 3 )
{
2014-09-29 09:42:50 +02:00
return getSmallShapedRecipe ( width , height , items , recipe . getRecipeOutput ( ) ) ;
2014-03-24 08:55:46 +01:00
}
else
{
2014-09-29 09:42:50 +02:00
return getCraftingShapedRecipe ( width , height , items , recipe . getRecipeOutput ( ) ) ;
2014-03-24 08:55:46 +01:00
}
}
return null ;
2014-03-24 09:29:23 +01:00
}
@Override
public void Init ( ) throws Throwable
{
StackInfo . addSource ( this ) ;
}
@Override
public void PostInit ( ) throws Throwable
{
2014-03-24 08:55:46 +01:00
}
}