diff --git a/src/main/java/appeng/block/AEBaseTileBlock.java b/src/main/java/appeng/block/AEBaseTileBlock.java index c37e590d..e4396b82 100644 --- a/src/main/java/appeng/block/AEBaseTileBlock.java +++ b/src/main/java/appeng/block/AEBaseTileBlock.java @@ -52,6 +52,7 @@ import appeng.api.util.AEColor; import appeng.api.util.IOrientable; import appeng.core.features.AEFeature; import appeng.core.features.AETileBlockFeatureHandler; +import appeng.core.features.ActivityState; import appeng.core.features.IAEFeature; import appeng.core.features.ItemStackSrc; import appeng.helpers.ICustomCollision; @@ -88,8 +89,6 @@ public abstract class AEBaseTileBlock extends AEBaseBlock implements IAEFeature, protected void setTileEntity( Class c ) { this.tileEntityType = c; - - AEBaseTile.registerTileItem( c, new ItemStackSrc( this, 0 ) ); this.isInventory = IInventory.class.isAssignableFrom( c ); this.setTileProvider( this.hasBlockTileEntity() ); } diff --git a/src/main/java/appeng/core/features/AETileBlockFeatureHandler.java b/src/main/java/appeng/core/features/AETileBlockFeatureHandler.java index 3aadf68a..80009cd7 100644 --- a/src/main/java/appeng/core/features/AETileBlockFeatureHandler.java +++ b/src/main/java/appeng/core/features/AETileBlockFeatureHandler.java @@ -29,6 +29,7 @@ import appeng.api.definitions.ITileDefinition; import appeng.block.AEBaseTileBlock; import appeng.core.CommonHelper; import appeng.core.CreativeTab; +import appeng.tile.AEBaseTile; import appeng.util.Platform; @@ -82,6 +83,7 @@ public final class AETileBlockFeatureHandler implements IFeatureHandler GameRegistry.registerBlock( this.featured, null, registryName ); GameRegistry.registerItem( this.definition.maybeItem().get(), registryName ); GameRegistry.registerTileEntity( this.featured.getTileEntityClass(), this.featured.toString() ); + AEBaseTile.registerTileItem( this.featured.getTileEntityClass(), new BlockStackSrc( this.featured, 0, ActivityState.from( this.isFeatureAvailable() ) ) ); } } } diff --git a/src/main/java/appeng/core/features/BlockDefinition.java b/src/main/java/appeng/core/features/BlockDefinition.java index 83e14a2f..c0ec83df 100644 --- a/src/main/java/appeng/core/features/BlockDefinition.java +++ b/src/main/java/appeng/core/features/BlockDefinition.java @@ -21,6 +21,7 @@ package appeng.core.features; import java.lang.reflect.Constructor; +import com.google.common.base.Function; import com.google.common.base.Optional; import com.google.common.base.Preconditions; import com.google.common.collect.ObjectArrays; @@ -37,8 +38,8 @@ import appeng.block.AEBaseBlock; public class BlockDefinition extends ItemDefinition implements IBlockDefinition { - private final Block block; - private final boolean enabled; + private static final ItemBlockTransformer ITEMBLOCK_TRANSFORMER = new ItemBlockTransformer(); + private final Optional block; public BlockDefinition( Block block, ActivityState state ) { @@ -47,8 +48,14 @@ public class BlockDefinition extends ItemDefinition implements IBlockDefinition Preconditions.checkNotNull( block ); Preconditions.checkNotNull( state ); - this.block = block; - this.enabled = state == ActivityState.Enabled; + if( state == ActivityState.Enabled ) + { + this.block = Optional.of( block ); + } + else + { + this.block = Optional.absent(); + } } /** @@ -92,7 +99,7 @@ public class BlockDefinition extends ItemDefinition implements IBlockDefinition * * TODO: throw an exception instead of returning null? As this could cause issue later on. * - * @param block the block to create the {@link ItemBlock} from + * @param block the block to create the {@link ItemBlock} from * @param itemclass the class used to construct it. * * @return an {@link Item} for the block. Actually always a sub type of {@link ItemBlock} @@ -121,38 +128,51 @@ public class BlockDefinition extends ItemDefinition implements IBlockDefinition @Override public final Optional maybeBlock() { - return Optional.of( this.block ); + return this.block; } @Override public final Optional maybeItemBlock() { - if( this.enabled ) - { - return Optional.of( new ItemBlock( this.block ) ); - } - else - { - return Optional.absent(); - } + return this.block.transform( ITEMBLOCK_TRANSFORMER ); } @Override public final Optional maybeStack( int stackSize ) { - if( this.enabled ) - { - return Optional.of( new ItemStack( this.block ) ); - } - else - { - return Optional.absent(); - } + return this.block.transform( new ItemStackTransformer( stackSize ) ); } @Override public final boolean isSameAs( IBlockAccess world, int x, int y, int z ) { - return this.enabled && world.getBlock( x, y, z ) == this.block; + return this.isEnabled() && world.getBlock( x, y, z ) == this.block.get(); + } + + private static class ItemBlockTransformer implements Function + { + @Override + public ItemBlock apply( Block input ) + { + return new ItemBlock( input ); + } + } + + private static class ItemStackTransformer implements Function + { + private final int stackSize; + + public ItemStackTransformer( int stackSize ) + { + Preconditions.checkArgument( stackSize > 0 ); + + this.stackSize = stackSize; + } + + @Override + public ItemStack apply( Block input ) + { + return new ItemStack( input, this.stackSize ); + } } } diff --git a/src/main/java/appeng/core/features/BlockStackSrc.java b/src/main/java/appeng/core/features/BlockStackSrc.java new file mode 100644 index 00000000..8030107d --- /dev/null +++ b/src/main/java/appeng/core/features/BlockStackSrc.java @@ -0,0 +1,74 @@ +/* + * This file is part of Applied Energistics 2. + * Copyright (c) 2013 - 2015, 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 . + */ + +package appeng.core.features; + + +import javax.annotation.Nullable; + +import com.google.common.base.Preconditions; + +import net.minecraft.block.Block; +import net.minecraft.item.Item; +import net.minecraft.item.ItemStack; + + +public class BlockStackSrc implements IStackSrc +{ + + public final Block block; + public final int damage; + private final boolean enabled; + + public BlockStackSrc( Block block, int damage, ActivityState state ) + { + Preconditions.checkNotNull( block ); + Preconditions.checkArgument( damage >= 0 ); + Preconditions.checkNotNull( state ); + Preconditions.checkArgument( state == ActivityState.Enabled || state == ActivityState.Disabled ); + + this.block = block; + this.damage = damage; + this.enabled = state == ActivityState.Enabled; + } + + @Nullable + @Override + public ItemStack stack( int i ) + { + return new ItemStack( this.block, i, this.damage ); + } + + @Override + public Item getItem() + { + return null; + } + + @Override + public int getDamage() + { + return this.damage; + } + + @Override + public boolean isEnabled() + { + return this.enabled; + } +} diff --git a/src/main/java/appeng/core/features/DamagedItemDefinition.java b/src/main/java/appeng/core/features/DamagedItemDefinition.java index e4ae3113..54c6dec5 100644 --- a/src/main/java/appeng/core/features/DamagedItemDefinition.java +++ b/src/main/java/appeng/core/features/DamagedItemDefinition.java @@ -21,6 +21,7 @@ package appeng.core.features; import javax.annotation.Nonnull; +import com.google.common.base.Function; import com.google.common.base.Optional; import com.google.common.base.Preconditions; @@ -33,42 +34,39 @@ import appeng.api.definitions.IItemDefinition; public final class DamagedItemDefinition implements IItemDefinition { - private final IStackSrc source; - private final boolean enabled; + private static final ItemTransformer ITEM_TRANSFORMER = new ItemTransformer(); + private final Optional source; public DamagedItemDefinition( @Nonnull IStackSrc source ) { - this.source = Preconditions.checkNotNull( source ); - this.enabled = source.isEnabled(); + Preconditions.checkNotNull( source ); + + if( source.isEnabled() ) + { + this.source = Optional.of( source ); + } + else + { + this.source = Optional.absent(); + } } @Override public Optional maybeItem() { - final Item item = this.source.getItem(); - - return Optional.fromNullable( item ); + return this.source.transform( ITEM_TRANSFORMER ); } @Override public Optional maybeStack( int stackSize ) { - if ( this.enabled ) - { - final ItemStack stack = this.source.stack( stackSize ); - - return Optional.fromNullable( stack ); - } - else - { - return Optional.absent(); - } + return this.source.transform( new ItemStackTransformer( stackSize ) ); } @Override public boolean isEnabled() { - return this.enabled; + return this.source.isPresent(); } @Override @@ -79,7 +77,7 @@ public final class DamagedItemDefinition implements IItemDefinition return false; } - return this.enabled && comparableStack.getItem() == this.source.getItem() && comparableStack.getItemDamage() == this.source.getDamage(); + return this.isEnabled() && comparableStack.getItem() == this.source.get().getItem() && comparableStack.getItemDamage() == this.source.get().getDamage(); } @Override @@ -87,4 +85,31 @@ public final class DamagedItemDefinition implements IItemDefinition { return false; } + + private static class ItemTransformer implements Function + { + @Override + public Item apply( IStackSrc input ) + { + return input.getItem(); + } + } + + private static class ItemStackTransformer implements Function + { + private final int stackSize; + + public ItemStackTransformer( int stackSize ) + { + Preconditions.checkArgument( stackSize > 0 ); + + this.stackSize = stackSize; + } + + @Override + public ItemStack apply( IStackSrc input ) + { + return input.stack( this.stackSize ); + } + } } diff --git a/src/main/java/appeng/core/features/ItemDefinition.java b/src/main/java/appeng/core/features/ItemDefinition.java index f62b07e2..399b56c7 100644 --- a/src/main/java/appeng/core/features/ItemDefinition.java +++ b/src/main/java/appeng/core/features/ItemDefinition.java @@ -19,6 +19,7 @@ package appeng.core.features; +import com.google.common.base.Function; import com.google.common.base.Optional; import com.google.common.base.Preconditions; @@ -32,47 +33,45 @@ import appeng.util.Platform; public class ItemDefinition implements IItemDefinition { - private final Item item; - private final boolean enabled; + private final Optional item; public ItemDefinition( Item item, ActivityState state ) { Preconditions.checkNotNull( item ); Preconditions.checkNotNull( state ); - this.item = item; - this.enabled = state == ActivityState.Enabled; + if( state == ActivityState.Enabled ) + { + this.item = Optional.of( item ); + } + else + { + this.item = Optional.absent(); + } } @Override public final Optional maybeItem() { - return Optional.of( this.item ); + return this.item; } @Override public Optional maybeStack( int stackSize ) { - if( this.enabled ) - { - return Optional.of( new ItemStack( this.item ) ); - } - else - { - return Optional.absent(); - } + return this.item.transform( new ItemStackTransformer( stackSize ) ); } @Override public boolean isEnabled() { - return this.enabled; + return this.item.isPresent(); } @Override public final boolean isSameAs( ItemStack comparableStack ) { - return this.enabled && Platform.isSameItemType( comparableStack, this.maybeStack( 1 ).get() ); + return this.isEnabled() && Platform.isSameItemType( comparableStack, this.maybeStack( 1 ).get() ); } @Override @@ -80,4 +79,22 @@ public class ItemDefinition implements IItemDefinition { return false; } + + private static class ItemStackTransformer implements Function + { + private final int stackSize; + + public ItemStackTransformer( int stackSize ) + { + Preconditions.checkArgument( stackSize > 0 ); + + this.stackSize = stackSize; + } + + @Override + public ItemStack apply( Item input ) + { + return new ItemStack( input, this.stackSize ); + } + } } diff --git a/src/main/java/appeng/core/features/ItemStackSrc.java b/src/main/java/appeng/core/features/ItemStackSrc.java index a6824bcc..fc4b6f0e 100644 --- a/src/main/java/appeng/core/features/ItemStackSrc.java +++ b/src/main/java/appeng/core/features/ItemStackSrc.java @@ -23,7 +23,6 @@ import javax.annotation.Nullable; import com.google.common.base.Preconditions; -import net.minecraft.block.Block; import net.minecraft.item.Item; import net.minecraft.item.ItemStack; @@ -32,7 +31,6 @@ public class ItemStackSrc implements IStackSrc { private final Item item; - public final Block block; public final int damage; private final boolean enabled; @@ -43,35 +41,16 @@ public class ItemStackSrc implements IStackSrc Preconditions.checkNotNull( state ); Preconditions.checkArgument( state == ActivityState.Enabled || state == ActivityState.Disabled ); - this.block = null; this.item = item; this.damage = damage; this.enabled = state == ActivityState.Enabled; } - public ItemStackSrc( Block b, int dmg, ActivityState state ) - { - this.item = null; - this.block = b; - this.damage = dmg; - this.enabled = state == ActivityState.Enabled; - } - @Nullable @Override public ItemStack stack( int i ) { - if( this.block != null ) - { - return new ItemStack( this.block, i, this.damage ); - } - - if( this.item != null ) - { - return new ItemStack( this.item, i, this.damage ); - } - - return null; + return new ItemStack( this.item, i, this.damage ); } @Override diff --git a/src/main/java/appeng/core/features/TileDefinition.java b/src/main/java/appeng/core/features/TileDefinition.java index 22a40145..bacac0ab 100644 --- a/src/main/java/appeng/core/features/TileDefinition.java +++ b/src/main/java/appeng/core/features/TileDefinition.java @@ -19,6 +19,7 @@ package appeng.core.features; +import com.google.common.base.Function; import com.google.common.base.Optional; import com.google.common.base.Preconditions; @@ -30,7 +31,8 @@ import appeng.block.AEBaseTileBlock; public final class TileDefinition extends BlockDefinition implements ITileDefinition { - private final AEBaseTileBlock block; + private static final TileEntityTransformer TILEENTITY_TRANSFORMER = new TileEntityTransformer(); + private final Optional block; public TileDefinition( AEBaseTileBlock block, ActivityState state ) { @@ -40,14 +42,30 @@ public final class TileDefinition extends BlockDefinition implements ITileDefini Preconditions.checkNotNull( state ); Preconditions.checkNotNull( block.getTileEntityClass() ); - this.block = block; + if( state == ActivityState.Enabled ) + { + this.block = Optional.of( block ); + } + else + { + this.block = Optional.absent(); + } } @Override public Optional> maybeEntity() { - final Class entity = this.block.getTileEntityClass(); + return this.block.transform( TILEENTITY_TRANSFORMER ); + } - return Optional.of( entity ); + private static class TileEntityTransformer implements Function> + { + @Override + public Class apply( AEBaseTileBlock input ) + { + final Class entity = input.getTileEntityClass(); + + return entity; + } } } diff --git a/src/main/java/appeng/core/features/WrappedDamageItemDefinition.java b/src/main/java/appeng/core/features/WrappedDamageItemDefinition.java index 6aa2278f..087136a3 100644 --- a/src/main/java/appeng/core/features/WrappedDamageItemDefinition.java +++ b/src/main/java/appeng/core/features/WrappedDamageItemDefinition.java @@ -37,7 +37,6 @@ public final class WrappedDamageItemDefinition implements ITileDefinition { private final ITileDefinition definition; private final int damage; - private final boolean enabled; public WrappedDamageItemDefinition( ITileDefinition definition, int damage ) { @@ -46,7 +45,6 @@ public final class WrappedDamageItemDefinition implements ITileDefinition this.definition = definition; this.damage = damage; - this.enabled = definition.isEnabled(); } @Override @@ -82,7 +80,7 @@ public final class WrappedDamageItemDefinition implements ITileDefinition @Override public boolean isEnabled() { - return this.enabled; + return this.definition.isEnabled(); } @Override diff --git a/src/main/java/appeng/items/parts/ItemMultiPart.java b/src/main/java/appeng/items/parts/ItemMultiPart.java index a89f12e4..b8eae36e 100644 --- a/src/main/java/appeng/items/parts/ItemMultiPart.java +++ b/src/main/java/appeng/items/parts/ItemMultiPart.java @@ -155,7 +155,10 @@ public final class ItemMultiPart extends AEBaseItem implements IPartItem, IItemG throw new IllegalStateException( "Meta Overlap detected with type " + mat + " and damage " + partDamage + ". Found " + registeredPartType + " there already." ); } - this.registered.put( partDamage, pti ); + if( enabled ) + { + this.registered.put( partDamage, pti ); + } } public int getDamageByType( PartType t ) @@ -195,6 +198,11 @@ public final class ItemMultiPart extends AEBaseItem implements IPartItem, IItemG @Override public boolean onItemUse( ItemStack is, EntityPlayer player, World w, int x, int y, int z, int side, float hitX, float hitY, float hitZ ) { + if( this.getTypeByStack( is ) == PartType.InvalidType ) + { + return false; + } + return AEApi.instance().partHelper().placeBus( is, x, y, z, side, player, w ); } @@ -396,7 +404,6 @@ public final class ItemMultiPart extends AEBaseItem implements IPartItem, IItemG } } - private static final class RegisteredComparator implements Comparator> { @Override diff --git a/src/main/java/appeng/items/parts/PartType.java b/src/main/java/appeng/items/parts/PartType.java index a6cd1968..0551e868 100644 --- a/src/main/java/appeng/items/parts/PartType.java +++ b/src/main/java/appeng/items/parts/PartType.java @@ -31,9 +31,9 @@ import appeng.integration.IntegrationType; import appeng.parts.automation.PartAnnihilationPlane; import appeng.parts.automation.PartExportBus; import appeng.parts.automation.PartFormationPlane; +import appeng.parts.automation.PartIdentityAnnihilationPlane; import appeng.parts.automation.PartImportBus; import appeng.parts.automation.PartLevelEmitter; -import appeng.parts.automation.PartIdentityAnnihilationPlane; import appeng.parts.misc.PartCableAnchor; import appeng.parts.misc.PartInterface; import appeng.parts.misc.PartInvertedToggleBus; diff --git a/src/main/java/appeng/tile/AEBaseTile.java b/src/main/java/appeng/tile/AEBaseTile.java index 7ed7fddf..0e96b1bd 100644 --- a/src/main/java/appeng/tile/AEBaseTile.java +++ b/src/main/java/appeng/tile/AEBaseTile.java @@ -51,7 +51,7 @@ import appeng.api.util.IConfigManager; import appeng.api.util.IConfigurableObject; import appeng.api.util.IOrientable; import appeng.core.AELog; -import appeng.core.features.ItemStackSrc; +import appeng.core.features.IStackSrc; import appeng.helpers.ICustomNameObject; import appeng.helpers.IPriorityHost; import appeng.tile.events.AETileEventHandler; @@ -66,14 +66,14 @@ public class AEBaseTile extends TileEntity implements IOrientable, ICommonTile, public static final ThreadLocal> DROP_NO_ITEMS = new ThreadLocal>(); private static final Map, Map>> HANDLERS = new HashMap, Map>>(); - private static final Map, ItemStackSrc> ITEM_STACKS = new HashMap, ItemStackSrc>(); + private static final Map, IStackSrc> ITEM_STACKS = new HashMap, IStackSrc>(); private int renderFragment = 0; @Nullable public String customName; private ForgeDirection forward = ForgeDirection.UNKNOWN; private ForgeDirection up = ForgeDirection.UNKNOWN; - public static void registerTileItem( Class c, ItemStackSrc wat ) + public static void registerTileItem( Class c, IStackSrc wat ) { ITEM_STACKS.put( c, wat ); } @@ -98,7 +98,7 @@ public class AEBaseTile extends TileEntity implements IOrientable, ICommonTile, @Nullable protected ItemStack getItemFromTile( Object obj ) { - ItemStackSrc src = ITEM_STACKS.get( obj.getClass() ); + IStackSrc src = ITEM_STACKS.get( obj.getClass() ); if( src == null ) { return null; diff --git a/src/main/resources/assets/appliedenergistics2/lang/en_US.lang b/src/main/resources/assets/appliedenergistics2/lang/en_US.lang index 007c050f..cc68cd06 100644 --- a/src/main/resources/assets/appliedenergistics2/lang/en_US.lang +++ b/src/main/resources/assets/appliedenergistics2/lang/en_US.lang @@ -450,6 +450,7 @@ item.appliedenergistics2.ItemPart.InvertedToggleBus.name=ME Inverted Toggle Bus item.appliedenergistics2.ItemPart.ToggleBus.name=ME Toggle Bus item.appliedenergistics2.ItemPart.CraftingMonitor.name=ME Crafting Monitor item.appliedenergistics2.ItemPart.InterfaceTerminal.name=ME Interface Terminal +item.appliedenergistics2.ItemPart.InvalidType.name=Disabled Item item.appliedenergistics2.ItemSpatialStorageCell.128Cubed.name=128³ Spatial Storage Cell item.appliedenergistics2.ItemSpatialStorageCell.16Cubed.name=16³ Spatial Storage Cell