diff --git a/src/main/java/appeng/bootstrap/IItemBuilder.java b/src/main/java/appeng/bootstrap/IItemBuilder.java index 7dfb730d..d61d005b 100644 --- a/src/main/java/appeng/bootstrap/IItemBuilder.java +++ b/src/main/java/appeng/bootstrap/IItemBuilder.java @@ -2,8 +2,10 @@ package appeng.bootstrap; import java.util.function.Consumer; +import java.util.function.Supplier; import net.minecraft.creativetab.CreativeTabs; +import net.minecraft.dispenser.IBehaviorDispenseItem; import net.minecraft.item.Item; import appeng.core.features.AEFeature; @@ -31,5 +33,10 @@ public interface IItemBuilder IItemBuilder rendering( ItemRenderingCustomizer callback ); + /** + * Registers a custom dispenser behavior for this item. + */ + IItemBuilder dispenserBehavior( Supplier behavior ); + ItemDefinition build(); } diff --git a/src/main/java/appeng/bootstrap/ItemDefinitionBuilder.java b/src/main/java/appeng/bootstrap/ItemDefinitionBuilder.java index ca36d473..a685a229 100644 --- a/src/main/java/appeng/bootstrap/ItemDefinitionBuilder.java +++ b/src/main/java/appeng/bootstrap/ItemDefinitionBuilder.java @@ -8,7 +8,9 @@ import java.util.List; import java.util.function.Consumer; import java.util.function.Supplier; +import net.minecraft.block.BlockDispenser; import net.minecraft.creativetab.CreativeTabs; +import net.minecraft.dispenser.IBehaviorDispenseItem; import net.minecraft.item.Item; import net.minecraftforge.fml.common.registry.GameRegistry; import net.minecraftforge.fml.relauncher.Side; @@ -39,6 +41,8 @@ class ItemDefinitionBuilder implements IItemBuilder private final List> postInitCallbacks = new ArrayList<>(); + private Supplier dispenserBehaviorSupplier; + @SideOnly( Side.CLIENT ) private ItemRendering itemRendering; @@ -109,6 +113,13 @@ class ItemDefinitionBuilder implements IItemBuilder return this; } + @Override + public IItemBuilder dispenserBehavior( Supplier behavior ) + { + this.dispenserBehaviorSupplier = behavior; + return this; + } + @SideOnly( Side.CLIENT ) private void customizeForClient( ItemRenderingCustomizer callback ) { @@ -135,6 +146,16 @@ class ItemDefinitionBuilder implements IItemBuilder initCallbacks.forEach( consumer -> factory.addInit( side -> consumer.accept( item ) ) ); postInitCallbacks.forEach( consumer -> factory.addPostInit( side -> consumer.accept( item ) ) ); + // Register custom dispenser behavior if requested + if( dispenserBehaviorSupplier != null ) + { + factory.addPostInit( side -> + { + IBehaviorDispenseItem behavior = dispenserBehaviorSupplier.get(); + BlockDispenser.DISPENSE_BEHAVIOR_REGISTRY.putObject( item, behavior ); + } ); + } + factory.addPreInit( side -> GameRegistry.register( item ) ); if( Platform.isClient() ) diff --git a/src/main/java/appeng/core/api/definitions/ApiItems.java b/src/main/java/appeng/core/api/definitions/ApiItems.java index 92568bf0..b6cc87d7 100644 --- a/src/main/java/appeng/core/api/definitions/ApiItems.java +++ b/src/main/java/appeng/core/api/definitions/ApiItems.java @@ -29,6 +29,8 @@ import appeng.debug.ToolDebugCard; import appeng.debug.ToolEraser; import appeng.debug.ToolMeteoritePlacer; import appeng.debug.ToolReplicatorCard; +import appeng.hooks.DispenserBlockTool; +import appeng.hooks.DispenserMatterCannon; import appeng.items.materials.MaterialType; import appeng.items.misc.ItemCrystalSeed; import appeng.items.misc.ItemCrystalSeedRendering; @@ -138,12 +140,21 @@ public final class ApiItems implements IItems this.netherQuartzKnife = netherTools.item( "nether_quartz_cutting_knife", () -> new ToolQuartzCuttingKnife( AEFeature.NetherQuartzTools ) ).addFeatures( AEFeature.QuartzKnife ).build(); FeatureFactory powerTools = registry.features( AEFeature.PoweredTools ); - this.entropyManipulator = powerTools.item( "entropy_manipulator", ToolEntropyManipulator::new ).addFeatures( AEFeature.EntropyManipulator ).build(); + this.entropyManipulator = powerTools.item( "entropy_manipulator", ToolEntropyManipulator::new ) + .addFeatures( AEFeature.EntropyManipulator ) + .dispenserBehavior( DispenserBlockTool::new ) + .build(); this.wirelessTerminal = powerTools.item( "wireless_terminal", ToolWirelessTerminal::new ).addFeatures( AEFeature.WirelessAccessTerminal ).build(); this.chargedStaff = powerTools.item( "charged_staff", ToolChargedStaff::new ).addFeatures( AEFeature.ChargedStaff ).build(); - this.massCannon = powerTools.item( "mass_cannon", ToolMassCannon::new ).addFeatures( AEFeature.MatterCannon ).build(); + this.massCannon = powerTools.item( "mass_cannon", ToolMassCannon::new ) + .addFeatures( AEFeature.MatterCannon ) + .dispenserBehavior( DispenserMatterCannon::new ) + .build(); this.portableCell = powerTools.item( "portable_cell", ToolPortableCell::new ).addFeatures( AEFeature.PortableCell, AEFeature.StorageCells ).build(); - this.colorApplicator = powerTools.item( "color_applicator", ToolColorApplicator::new ).addFeatures( AEFeature.ColorApplicator ).build(); + this.colorApplicator = powerTools.item( "color_applicator", ToolColorApplicator::new ) + .addFeatures( AEFeature.ColorApplicator ) + .dispenserBehavior( DispenserBlockTool::new ) + .build(); this.biometricCard = registry.item( "biometric_card", ToolBiometricCard::new ).features( AEFeature.Security ).build(); this.memoryCard = registry.item( "memory_card", ToolMemoryCard::new ).build(); diff --git a/src/main/java/appeng/items/tools/powered/ToolColorApplicator.java b/src/main/java/appeng/items/tools/powered/ToolColorApplicator.java index 3a55c353..407edffe 100644 --- a/src/main/java/appeng/items/tools/powered/ToolColorApplicator.java +++ b/src/main/java/appeng/items/tools/powered/ToolColorApplicator.java @@ -29,7 +29,6 @@ import java.util.Set; import net.minecraft.block.Block; import net.minecraft.block.BlockColored; -import net.minecraft.block.BlockDispenser; import net.minecraft.block.BlockStainedGlass; import net.minecraft.block.BlockStainedGlassPane; import net.minecraft.block.state.IBlockState; @@ -66,7 +65,6 @@ import appeng.block.networking.BlockCableBus; import appeng.core.AEConfig; import appeng.core.localization.GuiText; import appeng.helpers.IMouseWheelItem; -import appeng.hooks.DispenserBlockTool; import appeng.hooks.IBlockTool; import appeng.items.contents.CellConfig; import appeng.items.contents.CellUpgrades; @@ -108,12 +106,6 @@ public class ToolColorApplicator extends AEBasePoweredItem implements IStorageCe } } - public void postInit() - { - // TODO BOOTSTRAP - BlockDispenser.DISPENSE_BEHAVIOR_REGISTRY.putObject( this, new DispenserBlockTool() ); - } - @Override public boolean onItemUse( final ItemStack is, final EntityPlayer p, final World w, final BlockPos pos, final EnumFacing side, final float hitX, final float hitY, final float hitZ ) { diff --git a/src/main/java/appeng/items/tools/powered/ToolEntropyManipulator.java b/src/main/java/appeng/items/tools/powered/ToolEntropyManipulator.java index 1c396467..c32fed30 100644 --- a/src/main/java/appeng/items/tools/powered/ToolEntropyManipulator.java +++ b/src/main/java/appeng/items/tools/powered/ToolEntropyManipulator.java @@ -25,7 +25,6 @@ import java.util.List; import java.util.Map; import net.minecraft.block.Block; -import net.minecraft.block.BlockDispenser; import net.minecraft.block.BlockTNT; import net.minecraft.block.material.Material; import net.minecraft.block.state.IBlockState; @@ -49,7 +48,6 @@ import net.minecraft.world.World; import appeng.api.util.DimensionalCoord; import appeng.block.misc.BlockTinyTNT; import appeng.core.AEConfig; -import appeng.hooks.DispenserBlockTool; import appeng.hooks.IBlockTool; import appeng.items.tools.powered.powersink.AEBasePoweredItem; import appeng.util.InWorldToolOperationResult; @@ -85,12 +83,6 @@ public class ToolEntropyManipulator extends AEBasePoweredItem implements IBlockT this.heatUp.put( new InWorldToolOperationIngredient( Blocks.SNOW, true ), new InWorldToolOperationResult( new ItemStack( Blocks.FLOWING_WATER ) ) ); } - public void postInit() - { - // TODO BOOTSTRAP - BlockDispenser.DISPENSE_BEHAVIOR_REGISTRY.putObject( this, new DispenserBlockTool() ); - } - private static class InWorldToolOperationIngredient { private final IBlockState state; diff --git a/src/main/java/appeng/items/tools/powered/ToolMassCannon.java b/src/main/java/appeng/items/tools/powered/ToolMassCannon.java index 0e2fa7e3..2890a22c 100644 --- a/src/main/java/appeng/items/tools/powered/ToolMassCannon.java +++ b/src/main/java/appeng/items/tools/powered/ToolMassCannon.java @@ -23,7 +23,6 @@ import java.util.List; import javax.annotation.Nullable; import net.minecraft.block.Block; -import net.minecraft.block.BlockDispenser; import net.minecraft.block.state.IBlockState; import net.minecraft.entity.Entity; import net.minecraft.entity.EntityLivingBase; @@ -67,7 +66,6 @@ import appeng.core.localization.GuiText; import appeng.core.localization.PlayerMessages; import appeng.core.sync.network.NetworkHandler; import appeng.core.sync.packets.PacketMatterCannon; -import appeng.hooks.DispenserMatterCannon; import appeng.hooks.TickHandler; import appeng.hooks.TickHandler.PlayerColor; import appeng.items.contents.CellConfig; @@ -88,12 +86,6 @@ public class ToolMassCannon extends AEBasePoweredItem implements IStorageCell super( AEConfig.instance.matterCannonBattery ); } - public void postInit() - { - // TODO BOOTSTRAP - BlockDispenser.DISPENSE_BEHAVIOR_REGISTRY.putObject( this, new DispenserMatterCannon() ); - } - @Override public void addCheckedInformation( final ItemStack stack, final EntityPlayer player, final List lines, final boolean displayMoreInfo ) {