2014-11-14 12:02:52 +01:00
/ *
* This file is part of Applied Energistics 2 .
* Copyright ( c ) 2013 - 2014 , AlgorithmX2 , All rights reserved .
*
* Applied Energistics 2 is free software : you can redistribute it and / or modify
* it under the terms of the GNU Lesser General Public License as published by
* the Free Software Foundation , either version 3 of the License , or
* ( at your option ) any later version .
*
* Applied Energistics 2 is distributed in the hope that it will be useful ,
* but WITHOUT ANY WARRANTY ; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE . See the
* GNU Lesser General Public License for more details .
*
* You should have received a copy of the GNU Lesser General Public License
* along with Applied Energistics 2 . If not , see < http : //www.gnu.org/licenses/lgpl>.
* /
2014-03-24 08:55:46 +01:00
package appeng.integration.modules ;
2015-04-03 08:54:31 +02:00
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 ;
2014-12-29 21:59:05 +01:00
import cpw.mods.fml.relauncher.ReflectionHelper ;
2014-03-24 08:55:46 +01:00
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-12-29 21:59:05 +01:00
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 ;
2015-04-03 08:54:31 +02:00
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 ;
2015-04-03 08:54:31 +02: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 ) , } ;
2014-03-24 08:55:46 +01:00
2015-04-03 08:54:31 +02:00
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 ( ) , } ;
2014-03-24 08:55:46 +01:00
2015-04-03 08:54:31 +02:00
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 ( ) , } ;
2014-03-24 08:55:46 +01:00
2015-04-03 08:54:31 +02:00
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 ) , } ;
2014-03-24 08:55:46 +01:00
2015-04-03 08:54:31 +02:00
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 ) , } ;
2014-03-24 08:55:46 +01:00
2015-04-03 08:54:31 +02:00
private final Slot [ ] furnaceSlots = new ItemSlot [ ] { new ItemSlot ( 13 , 21 , 16 , 16 ) , new ItemSlot ( 50 , 21 , 16 , 16 , true ) . setSlotType ( SlotType . OUTPUT_SLOT ) , } ;
RecipeGenerator parent ;
2014-03-24 08:55:46 +01:00
@Override
2015-04-03 08:54:31 +02:00
public String getInfo ( ItemStack itemStack )
2014-03-24 08:55:46 +01:00
{
// :P
return null ;
}
@Override
2015-04-03 08:54:31 +02:00
public void generateRecipes ( RecipeGenerator generator )
2014-03-24 08:55:46 +01:00
{
2014-12-29 15:13:47 +01:00
this . parent = generator ;
2014-03-24 08:55:46 +01:00
RecipeTemplate craftingTemplate ;
RecipeTemplate smallCraftingTemplate ;
2015-04-03 08:54:31 +02:00
if ( uristqwerty . CraftGuide . CraftGuide . newerBackgroundStyle )
2014-03-24 08:55:46 +01:00
{
2014-12-29 15:13:47 +01:00
craftingTemplate = generator . createRecipeTemplate ( this . craftingSlotsOwnBackground , null ) ;
smallCraftingTemplate = generator . createRecipeTemplate ( this . smallCraftingSlotsOwnBackground , null ) ;
2014-03-24 08:55:46 +01:00
}
else
{
2015-04-03 08:54:31 +02:00
craftingTemplate = new DefaultRecipeTemplate ( this . craftingSlots , RecipeGeneratorImplementation . workbench , new TextureClip ( DynamicTexture . instance ( " recipe_backgrounds " ) , 1 , 1 , 79 , 58 ) , new TextureClip ( DynamicTexture . instance ( " recipe_backgrounds " ) , 82 , 1 , 79 , 58 ) ) ;
2014-03-24 08:55:46 +01:00
2015-04-03 08:54:31 +02:00
smallCraftingTemplate = new DefaultRecipeTemplate ( this . smallCraftingSlots , RecipeGeneratorImplementation . workbench , new TextureClip ( DynamicTexture . instance ( " recipe_backgrounds " ) , 1 , 61 , 79 , 58 ) , new TextureClip ( DynamicTexture . instance ( " recipe_backgrounds " ) , 82 , 61 , 79 , 58 ) ) ;
2014-03-24 08:55:46 +01:00
}
2015-04-03 08:54:31 +02:00
RecipeTemplate shapelessTemplate = new DefaultRecipeTemplate ( this . shapelessCraftingSlots , RecipeGeneratorImplementation . workbench , new TextureClip ( DynamicTexture . instance ( " recipe_backgrounds " ) , 1 , 121 , 79 , 58 ) , new TextureClip ( DynamicTexture . instance ( " recipe_backgrounds " ) , 82 , 121 , 79 , 58 ) ) ;
2014-03-24 08:55:46 +01:00
2015-04-03 08:54:31 +02:00
RecipeTemplate furnaceTemplate = new DefaultRecipeTemplate ( this . 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 ) ) ;
2014-03-24 08:55:46 +01:00
2014-12-29 15:13:47 +01:00
this . addCraftingRecipes ( craftingTemplate , smallCraftingTemplate , shapelessTemplate , this ) ;
this . addGrinderRecipes ( furnaceTemplate , this ) ;
this . addInscriberRecipes ( furnaceTemplate , this ) ;
2014-03-24 08:55:46 +01:00
}
2015-04-03 08:54:31 +02:00
private void addCraftingRecipes ( RecipeTemplate template , RecipeTemplate templateSmall , RecipeTemplate templateShapeless , RecipeGenerator generator )
2014-03-24 08:55:46 +01:00
{
List recipes = CraftingManager . getInstance ( ) . getRecipeList ( ) ;
int errCount = 0 ;
2015-04-03 08:54:31 +02:00
for ( Object o : recipes )
2014-03-24 08:55:46 +01:00
{
try
{
IRecipe recipe = ( IRecipe ) o ;
Object [ ] items = generator . getCraftingRecipe ( recipe , true ) ;
2015-04-03 08:54:31 +02:00
if ( items . length = = 5 )
2014-03-24 08:55:46 +01:00
{
generator . addRecipe ( templateSmall , items ) ;
}
2015-04-03 08:54:31 +02:00
else if ( recipe instanceof ShapelessRecipe )
2014-03-24 08:55:46 +01:00
{
generator . addRecipe ( templateShapeless , items ) ;
}
else
{
generator . addRecipe ( template , items ) ;
}
}
2015-04-03 08:54:31 +02:00
catch ( Exception e )
2014-03-24 08:55:46 +01:00
{
2015-04-03 08:54:31 +02:00
if ( errCount > = 5 )
2014-03-24 08:55:46 +01:00
{
2015-04-03 08:54:31 +02: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 ) ;
2014-03-24 08:55:46 +01:00
errCount = - 1 ;
}
else
{
e . printStackTrace ( ) ;
}
2015-03-26 11:07:26 +01:00
errCount + + ;
2014-03-24 08:55:46 +01:00
CraftGuideLog . log ( e ) ;
}
}
}
2015-04-03 08:54:31 +02:00
private void addGrinderRecipes ( RecipeTemplate template , RecipeGenerator generator )
2014-03-24 08:55:46 +01:00
{
}
2015-04-03 08:54:31 +02:00
private void addInscriberRecipes ( RecipeTemplate template , RecipeGenerator generator )
2014-03-24 08:55:46 +01:00
{
}
@Override
2015-04-03 08:54:31 +02:00
public RecipeTemplate createRecipeTemplate ( Slot [ ] slots , ItemStack craftingType )
2014-03-24 08:55:46 +01:00
{
2014-12-29 15:13:47 +01:00
return this . parent . createRecipeTemplate ( slots , craftingType ) ;
2014-03-24 08:55:46 +01:00
}
@Override
2015-04-03 08:54:31 +02:00
public RecipeTemplate createRecipeTemplate ( Slot [ ] slots , ItemStack craftingType , String backgroundTexture , int backgroundX , int backgroundY , int backgroundSelectedX , int backgroundSelectedY )
2014-03-24 08:55:46 +01:00
{
2014-12-29 15:13:47 +01:00
return this . parent . createRecipeTemplate ( slots , craftingType , backgroundTexture , backgroundX , backgroundY , backgroundSelectedX , backgroundSelectedY ) ;
2014-03-24 08:55:46 +01:00
}
@Override
2015-04-03 08:54:31 +02:00
public RecipeTemplate createRecipeTemplate ( Slot [ ] slots , ItemStack craftingType , String backgroundTexture , int backgroundX , int backgroundY , String backgroundSelectedTexture , int backgroundSelectedX , int backgroundSelectedY )
2014-03-24 08:55:46 +01:00
{
2015-04-03 08:54:31 +02:00
return this . parent . createRecipeTemplate ( slots , craftingType , backgroundTexture , backgroundX , backgroundY , backgroundSelectedTexture , backgroundSelectedX , backgroundSelectedY ) ;
2014-03-24 08:55:46 +01:00
}
@Override
2015-04-03 08:54:31 +02:00
public void addRecipe ( RecipeTemplate template , Object [ ] crafting )
2014-03-24 08:55:46 +01:00
{
2014-12-29 15:13:47 +01:00
this . parent . addRecipe ( template , crafting ) ;
2014-03-24 08:55:46 +01:00
}
@Override
2015-04-03 08:54:31 +02:00
public void addRecipe ( CraftGuideRecipe recipe , ItemStack craftingType )
2014-03-24 08:55:46 +01:00
{
2014-12-29 15:13:47 +01:00
this . parent . addRecipe ( recipe , craftingType ) ;
2014-03-24 08:55:46 +01:00
}
@Override
2015-04-03 08:54:31 +02:00
public void setDefaultTypeVisibility ( ItemStack type , boolean visible )
2014-03-24 08:55:46 +01:00
{
2014-12-29 15:13:47 +01:00
this . parent . setDefaultTypeVisibility ( type , visible ) ;
2014-03-24 08:55:46 +01:00
}
@Override
2015-04-03 08:54:31 +02:00
public Object [ ] getCraftingRecipe ( IRecipe recipe )
2014-03-24 08:55:46 +01:00
{
2014-12-29 15:13:47 +01:00
return this . getCraftingRecipe ( recipe , true ) ;
2014-03-24 08:55:46 +01:00
}
2015-04-03 08:54:31 +02:00
Object [ ] getCraftingShapelessRecipe ( List items , ItemStack recipeOutput )
2014-03-24 08:55:46 +01:00
{
Object [ ] output = new Object [ 10 ] ;
2015-04-03 08:54:31 +02:00
for ( int i = 0 ; i < items . size ( ) ; i + + )
2014-03-24 08:55:46 +01:00
{
output [ i ] = items . get ( i ) ;
2015-04-03 08:54:31 +02:00
if ( output [ i ] instanceof ItemStack [ ] )
2015-04-29 02:30:53 +02:00
{
2014-03-24 09:38:52 +01:00
output [ i ] = Arrays . asList ( ( ItemStack [ ] ) output [ i ] ) ;
2015-04-29 02:30:53 +02:00
}
2014-03-24 08:55:46 +01:00
2015-04-03 08:54:31 +02:00
if ( output [ i ] instanceof IIngredient )
2014-09-12 06:06:46 +02:00
{
try
{
2015-04-03 08:54:31 +02:00
output [ i ] = this . toCG ( ( ( IIngredient ) output [ i ] ) . getItemStackSet ( ) ) ;
2014-09-12 06:06:46 +02:00
}
2015-04-03 08:54:31 +02:00
catch ( RegistrationError ignored )
2014-09-12 06:06:46 +02:00
{
}
2015-04-03 08:54:31 +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 ;
}
2015-04-03 08:54:31 +02:00
Object [ ] getSmallShapedRecipe ( int width , int height , Object [ ] items , ItemStack recipeOutput )
2014-03-24 08:55:46 +01:00
{
2015-04-03 08:54:31 +02:00
Object [ ] output = new Object [ 5 ] ;
2014-03-24 08:55:46 +01:00
2015-04-03 08:54:31 +02:00
for ( int y = 0 ; y < height ; y + + )
2014-03-24 08:55:46 +01:00
{
2015-04-03 08:54:31 +02:00
for ( int x = 0 ; x < width ; x + + )
2014-03-24 08:55:46 +01:00
{
2015-04-03 08:54:31 +02:00
int i = y * 2 + x ;
2014-03-24 08:55:46 +01:00
output [ i ] = items [ y * width + x ] ;
2015-04-03 08:54:31 +02:00
if ( output [ i ] instanceof ItemStack [ ] )
2015-04-29 02:30:53 +02:00
{
2014-03-24 09:38:52 +01:00
output [ i ] = Arrays . asList ( ( ItemStack [ ] ) output [ i ] ) ;
2015-04-29 02:30:53 +02:00
}
2014-03-24 08:55:46 +01:00
2015-04-03 08:54:31 +02:00
if ( output [ i ] instanceof IIngredient )
2014-09-12 06:06:46 +02:00
{
try
{
2015-04-03 08:54:31 +02:00
output [ i ] = this . toCG ( ( ( IIngredient ) output [ i ] ) . getItemStackSet ( ) ) ;
2014-09-12 06:06:46 +02:00
}
2015-04-03 08:54:31 +02:00
catch ( RegistrationError ignored )
2014-09-12 06:06:46 +02:00
{
}
2015-04-03 08:54:31 +02:00
catch ( MissingIngredientError ignored )
2014-09-12 06:06:46 +02:00
{
}
}
2014-03-24 08:55:46 +01:00
}
}
2015-04-03 08:54:31 +02:00
output [ 4 ] = recipeOutput ;
2014-03-24 08:55:46 +01:00
return output ;
}
2015-04-03 08:54:31 +02:00
Object [ ] getCraftingShapedRecipe ( int width , int height , Object [ ] items , ItemStack recipeOutput )
2014-03-24 08:55:46 +01:00
{
2015-04-03 08:54:31 +02:00
Object [ ] output = new Object [ 10 ] ;
2014-03-24 08:55:46 +01:00
2015-04-03 08:54:31 +02:00
for ( int y = 0 ; y < height ; y + + )
2014-03-24 08:55:46 +01:00
{
2015-04-03 08:54:31 +02:00
for ( int x = 0 ; x < width ; x + + )
2014-03-24 08:55:46 +01:00
{
2015-04-03 08:54:31 +02:00
int i = y * 3 + x ;
2014-03-24 08:55:46 +01:00
output [ i ] = items [ y * width + x ] ;
2015-04-03 08:54:31 +02:00
if ( output [ i ] instanceof ItemStack [ ] )
2015-04-29 02:30:53 +02:00
{
2014-03-24 09:38:52 +01:00
output [ i ] = Arrays . asList ( ( ItemStack [ ] ) output [ i ] ) ;
2015-04-29 02:30:53 +02:00
}
2014-03-24 08:55:46 +01:00
2015-04-03 08:54:31 +02:00
if ( output [ i ] instanceof IIngredient )
2014-09-12 06:06:46 +02:00
{
try
{
2015-04-03 08:54:31 +02:00
output [ i ] = this . toCG ( ( ( IIngredient ) output [ i ] ) . getItemStackSet ( ) ) ;
2014-09-12 06:06:46 +02:00
}
2015-04-03 08:54:31 +02:00
catch ( RegistrationError ignored )
2014-09-12 06:06:46 +02:00
{
}
2015-04-03 08:54:31 +02:00
catch ( MissingIngredientError ignored )
2014-09-12 06:06:46 +02:00
{
}
}
2014-03-24 08:55:46 +01:00
}
}
2015-04-03 08:54:31 +02:00
output [ 9 ] = recipeOutput ;
2014-03-24 08:55:46 +01:00
return output ;
}
2015-04-03 08:54:31 +02:00
private Object toCG ( ItemStack [ ] itemStackSet )
2014-09-12 06:06:46 +02:00
{
List < ItemStack > list = Arrays . asList ( itemStackSet ) ;
2015-04-03 08:54:31 +02:00
for ( int x = 0 ; x < list . size ( ) ; x + + )
2014-09-12 06:06:46 +02:00
{
list . set ( x , list . get ( x ) . copy ( ) ) ;
2015-04-03 08:54:31 +02:00
if ( list . get ( x ) . stackSize = = 0 )
2015-04-29 02:30:53 +02:00
{
2014-09-12 06:06:46 +02:00
list . get ( x ) . stackSize = 1 ;
2015-04-29 02:30:53 +02:00
}
2014-09-12 06:06:46 +02:00
}
return list ;
}
2014-03-24 08:55:46 +01:00
@Override
2015-04-03 08:54:31 +02:00
public Object [ ] getCraftingRecipe ( IRecipe recipe , boolean allowSmallGrid )
2014-03-24 08:55:46 +01:00
{
2015-04-03 08:54:31 +02:00
if ( recipe instanceof ShapelessRecipe )
2014-03-24 08:55:46 +01:00
{
2014-09-29 09:42:50 +02:00
List items = ReflectionHelper . getPrivateValue ( ShapelessRecipe . class , ( ShapelessRecipe ) recipe , " input " ) ;
2014-12-29 15:13:47 +01:00
return this . getCraftingShapelessRecipe ( items , recipe . getRecipeOutput ( ) ) ;
2014-03-24 08:55:46 +01:00
}
2015-04-03 08:54:31 +02:00
else if ( recipe instanceof ShapedRecipe )
2014-03-24 08:55:46 +01:00
{
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
2015-04-03 08:54:31 +02:00
if ( allowSmallGrid & & width < 3 & & height < 3 )
2014-03-24 08:55:46 +01:00
{
2014-12-29 15:13:47 +01:00
return this . getSmallShapedRecipe ( width , height , items , recipe . getRecipeOutput ( ) ) ;
2014-03-24 08:55:46 +01:00
}
else
{
2014-12-29 15:13:47 +01:00
return this . 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
2014-12-19 19:01:51 +01:00
public void init ( ) throws Throwable
2014-03-24 09:29:23 +01:00
{
StackInfo . addSource ( this ) ;
}
@Override
2014-12-19 19:01:51 +01:00
public void postInit ( )
2014-03-24 09:29:23 +01:00
{
2014-03-24 08:55:46 +01:00
}
}