From ada69b9a953cbff43c15f06d39ca998fe9037584 Mon Sep 17 00:00:00 2001 From: thatsIch Date: Tue, 30 Dec 2014 22:42:25 +0100 Subject: [PATCH] Fixes #663 NPE on disabled Facades --- .../java/appeng/facade/FacadeContainer.java | 6 +-- .../appeng/recipes/game/FacadeRecipe.java | 46 +++++++++++++------ 2 files changed, 34 insertions(+), 18 deletions(-) diff --git a/src/main/java/appeng/facade/FacadeContainer.java b/src/main/java/appeng/facade/FacadeContainer.java index d2432158a2d..5209196b330 100644 --- a/src/main/java/appeng/facade/FacadeContainer.java +++ b/src/main/java/appeng/facade/FacadeContainer.java @@ -55,7 +55,7 @@ public void writeToStream(ByteBuf out) throws IOException for (int x = 0; x < this.facades; x++) { if ( this.getFacade( ForgeDirection.getOrientation( x ) ) != null ) - facadeSides = facadeSides | (1 << x); + facadeSides |= ( 1 << x ); } out.writeByte( (byte) facadeSides ); @@ -79,7 +79,7 @@ public boolean readFromStream(ByteBuf out) throws IOException boolean changed = false; - int ids[] = new int[2]; + int[] ids = new int[2]; for (int x = 0; x < this.facades; x++) { ForgeDirection side = ForgeDirection.getOrientation( x ); @@ -205,7 +205,7 @@ public boolean isEmpty() @Override public void rotateLeft() { - IFacadePart newFacades[] = new FacadePart[6]; + IFacadePart[] newFacades = new FacadePart[6]; newFacades[ForgeDirection.UP.ordinal()] = this.storage.getFacade( ForgeDirection.UP.ordinal() ); newFacades[ForgeDirection.DOWN.ordinal()] = this.storage.getFacade( ForgeDirection.DOWN.ordinal() ); diff --git a/src/main/java/appeng/recipes/game/FacadeRecipe.java b/src/main/java/appeng/recipes/game/FacadeRecipe.java index a51a00447ae..b25419216d0 100644 --- a/src/main/java/appeng/recipes/game/FacadeRecipe.java +++ b/src/main/java/appeng/recipes/game/FacadeRecipe.java @@ -18,29 +18,52 @@ package appeng.recipes.game; + +import net.minecraft.inventory.IInventory; import net.minecraft.inventory.InventoryCrafting; +import net.minecraft.item.Item; import net.minecraft.item.ItemStack; import net.minecraft.item.crafting.IRecipe; import net.minecraft.world.World; +import com.google.common.base.Optional; + import appeng.api.AEApi; import appeng.api.util.AEItemDefinition; import appeng.items.parts.ItemFacade; + public class FacadeRecipe implements IRecipe { - private final AEItemDefinition anchor = AEApi.instance().parts().partCableAnchor; - private final ItemFacade facade = (ItemFacade) AEApi.instance().items().itemFacade.item(); + private final Optional maybeAnchor; + private final Optional maybeFacade; + + public FacadeRecipe() + { + this.maybeFacade = Optional.fromNullable( AEApi.instance().items().itemFacade ); + this.maybeAnchor = Optional.fromNullable( AEApi.instance().parts().partCableAnchor ); + } - private ItemStack getOutput(InventoryCrafting inv, boolean createFacade) + @Override + public boolean matches( InventoryCrafting inv, World w ) { - if ( inv.getStackInSlot( 0 ) == null && inv.getStackInSlot( 2 ) == null && inv.getStackInSlot( 6 ) == null && inv.getStackInSlot( 8 ) == null ) + return this.getOutput( inv, false ) != null; + } + + private ItemStack getOutput( IInventory inv, boolean createFacade ) + { + if ( this.maybeAnchor.isPresent() && this.maybeFacade.isPresent() && inv.getStackInSlot( 0 ) == null && inv.getStackInSlot( 2 ) == null && inv.getStackInSlot( 6 ) == null && inv.getStackInSlot( 8 ) == null ) { - if ( this.anchor.sameAsStack( inv.getStackInSlot( 1 ) ) && this.anchor.sameAsStack( inv.getStackInSlot( 3 ) ) && this.anchor.sameAsStack( inv.getStackInSlot( 5 ) ) - && this.anchor.sameAsStack( inv.getStackInSlot( 7 ) ) ) + final AEItemDefinition anchorDefinition = this.maybeAnchor.get(); + final AEItemDefinition facadeDefinition = this.maybeFacade.get(); + + if ( anchorDefinition.sameAsStack( inv.getStackInSlot( 1 ) ) && anchorDefinition.sameAsStack( inv.getStackInSlot( 3 ) ) && anchorDefinition.sameAsStack( inv.getStackInSlot( 5 ) ) && anchorDefinition.sameAsStack( inv.getStackInSlot( 7 ) ) ) { - ItemStack facades = this.facade.createFacadeForItem( inv.getStackInSlot( 4 ), !createFacade ); + final Item itemDefinition = facadeDefinition.item(); + final ItemFacade facade = (ItemFacade) itemDefinition; + + ItemStack facades = facade.createFacadeForItem( inv.getStackInSlot( 4 ), !createFacade ); if ( facades != null && createFacade ) facades.stackSize = 4; return facades; @@ -50,13 +73,7 @@ private ItemStack getOutput(InventoryCrafting inv, boolean createFacade) } @Override - public boolean matches(InventoryCrafting inv, World w) - { - return this.getOutput( inv, false ) != null; - } - - @Override - public ItemStack getCraftingResult(InventoryCrafting inv) + public ItemStack getCraftingResult( InventoryCrafting inv ) { return this.getOutput( inv, true ); } @@ -72,5 +89,4 @@ public ItemStack getRecipeOutput() // no default output.. { return null; } - } \ No newline at end of file