From c978bf90f875db163a9f2c0e84aa6d3582ef7163 Mon Sep 17 00:00:00 2001 From: yueh Date: Fri, 10 Jul 2015 00:07:45 +0200 Subject: [PATCH] Ensure that disabled parts are actually disabled and removed. --- .../java/appeng/block/AEBaseTileBlock.java | 3 +- .../features/AETileBlockFeatureHandler.java | 4 +- .../appeng/core/features/BlockDefinition.java | 66 +++++++++++------ .../appeng/core/features/BlockStackSrc.java | 74 +++++++++++++++++++ .../core/features/DamagedItemDefinition.java | 64 +++++++++++----- .../appeng/core/features/ItemDefinition.java | 57 +++++++++----- .../appeng/core/features/ItemStackSrc.java | 23 +----- .../appeng/core/features/TileDefinition.java | 26 ++++++- .../appeng/items/parts/ItemMultiPart.java | 21 +++--- src/main/java/appeng/tile/AEBaseTile.java | 8 +- .../appliedenergistics2/lang/en_US.lang | 1 + 11 files changed, 243 insertions(+), 104 deletions(-) create mode 100644 src/main/java/appeng/core/features/BlockStackSrc.java diff --git a/src/main/java/appeng/block/AEBaseTileBlock.java b/src/main/java/appeng/block/AEBaseTileBlock.java index 73ec0260..e944432f 100644 --- a/src/main/java/appeng/block/AEBaseTileBlock.java +++ b/src/main/java/appeng/block/AEBaseTileBlock.java @@ -51,6 +51,7 @@ import appeng.api.util.IOrientable; import appeng.block.networking.BlockCableBus; 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; @@ -90,8 +91,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 0de978fb..d4ceef1b 100644 --- a/src/main/java/appeng/core/features/AETileBlockFeatureHandler.java +++ b/src/main/java/appeng/core/features/AETileBlockFeatureHandler.java @@ -31,6 +31,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; @@ -83,7 +84,8 @@ public final class AETileBlockFeatureHandler implements IFeatureHandler // Bypass the forge magic with null to register our own itemblock later. GameRegistry.registerBlock( this.featured, null, registryName ); GameRegistry.registerItem( this.definition.maybeItem().get(), registryName ); - + AEBaseTile.registerTileItem( this.featured.getTileEntityClass(), new BlockStackSrc( this.featured, 0, ActivityState.from( this.isFeatureAvailable() ) ) ); + // register the block/item conversion... if( this.definition.maybeItem().isPresent() ) { diff --git a/src/main/java/appeng/core/features/BlockDefinition.java b/src/main/java/appeng/core/features/BlockDefinition.java index e20c992b..4556a052 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; @@ -38,8 +39,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( final String identifier, Block block, ActivityState state ) { @@ -48,8 +49,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(); + } } /** @@ -93,7 +100,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} @@ -122,38 +129,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, BlockPos pos ) { - return this.enabled && world.getBlockState( pos ).getBlock() == this.block; + return this.isEnabled() && world.getBlockState( pos ).getBlock() == 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 430d538d..8e30e369 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; @@ -34,15 +35,22 @@ import appeng.api.definitions.IItemDefinition; public final class DamagedItemDefinition implements IItemDefinition { private final String identifier; - private final IStackSrc source; - private final boolean enabled; + private static final ItemTransformer ITEM_TRANSFORMER = new ItemTransformer(); + private final Optional source; public DamagedItemDefinition( @Nonnull String identifier, @Nonnull IStackSrc source ) { this.identifier = Preconditions.checkNotNull( identifier ); - Preconditions.checkArgument( !identifier.isEmpty() ); - 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(); + } } @Nonnull @@ -55,30 +63,19 @@ public final class DamagedItemDefinition implements IItemDefinition @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 @@ -89,7 +86,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 @@ -97,4 +94,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 9f65dc85..c1228ae7 100644 --- a/src/main/java/appeng/core/features/ItemDefinition.java +++ b/src/main/java/appeng/core/features/ItemDefinition.java @@ -21,11 +21,13 @@ 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; import net.minecraft.item.Item; import net.minecraft.item.ItemStack; +import net.minecraft.world.IBlockAccess; import appeng.api.definitions.IItemDefinition; import appeng.util.Platform; @@ -34,19 +36,23 @@ import appeng.util.Platform; public class ItemDefinition implements IItemDefinition { private final String identifier; - private final Item item; - private final boolean enabled; + private final Optional item; public ItemDefinition( String identifier, Item item, ActivityState state ) { - Preconditions.checkNotNull( identifier ); + this.identifier = Preconditions.checkNotNull( identifier ); Preconditions.checkArgument( !identifier.isEmpty() ); Preconditions.checkNotNull( item ); Preconditions.checkNotNull( state ); - this.identifier = identifier; - this.item = item; - this.enabled = state == ActivityState.Enabled; + if( state == ActivityState.Enabled ) + { + this.item = Optional.of( item ); + } + else + { + this.item = Optional.absent(); + } } @Nonnull @@ -59,31 +65,48 @@ public class ItemDefinition implements IItemDefinition @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 + public boolean isSameAs( IBlockAccess world, int x, int y, int z ) + { + 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 84527a33..edf47a5e 100644 --- a/src/main/java/appeng/core/features/TileDefinition.java +++ b/src/main/java/appeng/core/features/TileDefinition.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; @@ -32,7 +33,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( @Nonnull final String identifier, AEBaseTileBlock block, ActivityState state ) { @@ -40,14 +42,30 @@ public final class TileDefinition extends BlockDefinition implements ITileDefini Preconditions.checkNotNull( block ); - 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/items/parts/ItemMultiPart.java b/src/main/java/appeng/items/parts/ItemMultiPart.java index 20f6d656..f1283051 100644 --- a/src/main/java/appeng/items/parts/ItemMultiPart.java +++ b/src/main/java/appeng/items/parts/ItemMultiPart.java @@ -157,7 +157,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 ) @@ -175,16 +178,13 @@ public final class ItemMultiPart extends AEBaseItem implements IPartItem, IItemG } @Override - public boolean onItemUse( - ItemStack is, - EntityPlayer player, - World w, - BlockPos pos, - EnumFacing side, - float hitX, - float hitY, - float hitZ ) + public boolean onItemUse( ItemStack is, EntityPlayer player, World w, BlockPos pos, EnumFacing side, float hitX, float hitY, float hitZ ) { + if( this.getTypeByStack( is ) == PartType.InvalidType ) + { + return false; + } + return AEApi.instance().partHelper().placeBus( is, pos, side, player, w ); } @@ -411,7 +411,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/tile/AEBaseTile.java b/src/main/java/appeng/tile/AEBaseTile.java index 144a0754..279a6e30 100644 --- a/src/main/java/appeng/tile/AEBaseTile.java +++ b/src/main/java/appeng/tile/AEBaseTile.java @@ -52,7 +52,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; @@ -67,7 +67,7 @@ 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; @@ -84,7 +84,7 @@ public class AEBaseTile extends TileEntity implements IOrientable, ICommonTile, return newSate.getBlock() != oldState.getBlock(); // state dosn't change tile entities in AE2. } - public static void registerTileItem( Class c, ItemStackSrc wat ) + public static void registerTileItem( Class c, IStackSrc wat ) { ITEM_STACKS.put( c, wat ); } @@ -109,7 +109,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 cc8247e0..750156da 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