From 834e9c04c53ef3b69e40aaa99ee2432ccecce3ac Mon Sep 17 00:00:00 2001 From: AlgorithmX2 Date: Mon, 20 Jan 2014 10:41:37 -0600 Subject: [PATCH] Err too much. --- block/AEBaseBlock.java | 3 +- block/AEBaseItemBlockChargeable.java | 3 +- block/misc/BlockCellWorkbench.java | 40 + block/networking/BlockCableBus.java | 64 +- block/qnb/BlockQuantumLinkChamber.java | 57 ++ block/qnb/BlockQuantumRing.java | 9 + block/solids/BlockFluix.java | 27 + block/storage/BlockDrive.java | 3 +- block/storage/BlockIOPort.java | 28 + client/ClientHelper.java | 2 +- .../gui/implementations/GuiCellWorkbench.java | 167 ++++ client/gui/implementations/GuiIOPort.java | 95 ++ .../gui/implementations/GuiLevelEmitter.java | 8 +- .../gui/implementations/GuiMEMonitorable.java | 13 +- .../implementations/GuiMEPortableCell.java | 14 + .../gui/implementations/GuiNetworkStatus.java | 2 +- client/gui/implementations/GuiQNB.java | 31 + .../{GuiBus.java => GuiUpgradeable.java} | 55 +- client/gui/widgets/GuiProgressBar.java | 2 + client/render/BusRenderer.java | 8 +- client/render/blocks/RenderCable.java | 62 -- client/render/blocks/RenderQNB.java | 80 +- client/render/blocks/RenderQuartzGlass.java | 37 +- client/render/effects/EnergyFx.java | 88 ++ client/texture/CableBusTextures.java | 5 + client/texture/ExtraTextures.java | 4 + container/AEBaseContainer.java | 5 + .../ContainerCellWorkbench.java | 290 ++++++ .../implementations/ContainerCondenser.java | 4 +- .../implementations/ContainerIOPort.java | 115 +++ .../ContainerLevelEmitter.java | 28 +- .../ContainerMEMonitorable.java | 16 +- .../ContainerMEPortableCell.java | 50 + container/implementations/ContainerQNB.java | 23 + ...inerBus.java => ContainerUpgradeable.java} | 38 +- container/slot/AppEngSlot.java | 3 + container/slot/IOptionalSlotHost.java | 2 +- container/slot/OptionalSlotFake.java | 2 +- container/slot/OptionalSlotNormal.java | 26 + .../slot/OptionalSlotRestrictedInput.java | 26 + container/slot/SlotRestrictedInput.java | 5 +- core/Configuration.java | 2 + core/Registration.java | 69 +- core/api/ApiPart.java | 2 +- core/features/AEFeature.java | 9 +- core/features/AEFeatureHandler.java | 3 + core/features/DamagedItemDefinition.java | 4 +- .../registries/LocateableRegistry.java | 5 +- .../registries/MatterCannonAmmoRegistry.java | 126 +++ .../registries/RegistryContainer.java | 8 + .../registries/entries/BasicCellHandler.java | 8 +- core/localization/GuiText.java | 8 +- core/localization/PlayerMessages.java | 2 +- core/sync/GuiBridge.java | 108 ++- core/sync/packets/PacketValueConfig.java | 21 + debug/BlockChunkloader.java | 30 + debug/BlockItemGen.java | 18 + debug/TileChunkLoader.java | 83 ++ debug/TileItemGen.java | 124 +++ debug/ToolDebugCard.java | 14 +- debug/ToolReplicatorCard.java | 4 +- helpers/AEMultiTile.java | 5 +- helpers/CellItemViewer.java | 53 ++ helpers/DualityInterface.java | 894 +++++++++--------- helpers/ICellItemViewer.java | 14 + helpers/IGuiItem.java | 10 + helpers/IInterfaceHost.java | 24 +- helpers/PartPlacement.java | 115 ++- helpers/TickHandler.java | 2 +- integration/abstraction/IIC2.java | 11 - integration/abstraction/ITE.java | 4 + integration/modules/IC2.java | 36 +- integration/modules/TE.java | 20 +- .../modules/helpers/BCPipeInventory.java | 5 +- integration/modules/helpers/BSCrate.java | 5 +- .../modules/helpers/FactorizationBarrel.java | 5 +- .../modules/helpers/GregTechQuantumChest.java | 11 +- integration/modules/helpers/MFRDSU.java | 5 +- items/materials/ItemMaterial.java | 95 +- items/materials/MaterialType.java | 16 +- items/parts/ItemPart.java | 35 +- items/parts/PartType.java | 24 +- items/storage/CellConfig.java | 24 + items/storage/CellUpgrades.java | 24 + items/storage/ItemBasicStorageCell.java | 88 +- items/storage/ItemCreativeStorageCell.java | 37 +- items/storage/ItemSpatialStorageCell.java | 2 + items/tools/ToolMemoryCard.java | 5 +- items/tools/powered/ToolMassCannon.java | 326 ++++++- items/tools/powered/ToolNetworkTool.java | 26 + items/tools/powered/ToolPortableCell.java | 154 +++ .../powered/powersink/AEBasePoweredItem.java | 2 +- .../powered/powersink/AERootPoweredItem.java | 3 +- me/Grid.java | 6 - me/GridCacheWrapper.java | 45 +- me/GridNode.java | 6 + me/cache/EnergyGridCache.java | 154 +-- me/cache/NetworkMonitor.java | 15 +- me/cache/P2PCache.java | 96 +- me/cache/TickManagerCache.java | 13 - me/cache/helpers/TunnelCollection.java | 37 + me/cache/helpers/TunnelIterator.java | 52 + .../implementations/QuantumCalculator.java | 14 +- .../implementations/QuantumCluster.java | 119 +-- me/helpers/AENetworkProxy.java | 24 +- me/storage/CellInventory.java | 31 +- me/storage/CellInventoryHandler.java | 71 +- me/storage/CreativeCellInventory.java | 123 ++- me/storage/DriveWatcher.java | 63 ++ me/storage/ItemWatcher.java | 342 +++---- me/storage/MEIInventoryWrapper.java | 5 +- me/storage/MEInventoryHandler.java | 14 +- me/storage/MEMonitorIInventory.java | 4 +- me/storage/MEPassthru.java | 9 +- me/storage/NetworkInventoryHandler.java | 62 +- me/storage/NullInventory.java | 5 +- me/storage/VoidFluidInventory.java | 5 +- me/storage/VoidItemInventory.java | 5 +- parts/AEBasePart.java | 15 +- parts/CableBusContainer.java | 79 +- parts/ICableBusContainer.java | 43 + parts/NullCableBusContainer.java | 95 ++ parts/automation/PartExportBus.java | 10 +- parts/automation/PartImportBus.java | 2 +- parts/automation/PartSharedItemBus.java | 16 +- parts/automation/PartUpgradeable.java | 2 +- parts/automation/UpgradeInventory.java | 58 +- parts/misc/PartCableAnchor.java | 15 +- parts/misc/PartP2PTunnel.java | 88 -- parts/networking/PartCable.java | 21 +- parts/networking/PartDenseCable.java | 446 +++++++++ parts/p2p/PartP2PBCPower.java | 173 ++++ parts/p2p/PartP2PIC2Power.java | 151 +++ parts/p2p/PartP2PItems.java | 284 ++++++ parts/p2p/PartP2PLiquids.java | 205 ++++ parts/p2p/PartP2PRedstone.java | 182 ++++ parts/p2p/PartP2PTunnel.java | 243 +++++ parts/p2p/PartP2PTunnelME.java | 72 ++ parts/reporting/PartConversionMonitor.java | 109 +++ parts/reporting/PartStorageMonitor.java | 383 +++++++- tile/grindstone/TileGrinder.java | 2 +- tile/inventory/AppEngInternalInventory.java | 3 +- tile/inventory/AppEngNullInventory.java | 94 ++ tile/misc/TileCellWorkbench.java | 187 ++++ tile/misc/TileCondenser.java | 2 + tile/networking/TileCableBus.java | 39 + tile/networking/TileController.java | 7 + tile/qnb/TileQuantumBridge.java | 178 +++- tile/storage/TileChest.java | 51 +- tile/storage/TileDrive.java | 16 +- tile/storage/TileIOPort.java | 367 ++++++- util/Platform.java | 135 ++- util/inv/AdaptorIInventory.java | 14 +- util/inv/IMEInventoryDestination.java | 2 +- .../{WrapperPipe.java => WrapperBCPipe.java} | 4 +- util/inv/WrapperTEPipe.java | 99 ++ util/item/AEItemDef.java | 3 +- util/item/AEItemStack.java | 6 +- util/item/AESharedNBT.java | 5 + 159 files changed, 7953 insertions(+), 1541 deletions(-) create mode 100644 block/misc/BlockCellWorkbench.java create mode 100644 block/solids/BlockFluix.java create mode 100644 client/gui/implementations/GuiCellWorkbench.java create mode 100644 client/gui/implementations/GuiIOPort.java create mode 100644 client/gui/implementations/GuiMEPortableCell.java create mode 100644 client/gui/implementations/GuiQNB.java rename client/gui/implementations/{GuiBus.java => GuiUpgradeable.java} (65%) delete mode 100644 client/render/blocks/RenderCable.java create mode 100644 client/render/effects/EnergyFx.java create mode 100644 container/implementations/ContainerCellWorkbench.java create mode 100644 container/implementations/ContainerIOPort.java create mode 100644 container/implementations/ContainerMEPortableCell.java create mode 100644 container/implementations/ContainerQNB.java rename container/implementations/{ContainerBus.java => ContainerUpgradeable.java} (92%) create mode 100644 container/slot/OptionalSlotNormal.java create mode 100644 container/slot/OptionalSlotRestrictedInput.java create mode 100644 core/features/registries/MatterCannonAmmoRegistry.java create mode 100644 debug/BlockChunkloader.java create mode 100644 debug/BlockItemGen.java create mode 100644 debug/TileChunkLoader.java create mode 100644 debug/TileItemGen.java create mode 100644 helpers/CellItemViewer.java create mode 100644 helpers/ICellItemViewer.java create mode 100644 helpers/IGuiItem.java create mode 100644 items/storage/CellConfig.java create mode 100644 items/storage/CellUpgrades.java create mode 100644 items/tools/powered/ToolNetworkTool.java create mode 100644 items/tools/powered/ToolPortableCell.java create mode 100644 me/cache/helpers/TunnelCollection.java create mode 100644 me/cache/helpers/TunnelIterator.java create mode 100644 me/storage/DriveWatcher.java create mode 100644 parts/ICableBusContainer.java create mode 100644 parts/NullCableBusContainer.java delete mode 100644 parts/misc/PartP2PTunnel.java create mode 100644 parts/networking/PartDenseCable.java create mode 100644 parts/p2p/PartP2PBCPower.java create mode 100644 parts/p2p/PartP2PIC2Power.java create mode 100644 parts/p2p/PartP2PItems.java create mode 100644 parts/p2p/PartP2PLiquids.java create mode 100644 parts/p2p/PartP2PRedstone.java create mode 100644 parts/p2p/PartP2PTunnel.java create mode 100644 parts/p2p/PartP2PTunnelME.java create mode 100644 tile/inventory/AppEngNullInventory.java create mode 100644 tile/misc/TileCellWorkbench.java rename util/inv/{WrapperPipe.java => WrapperBCPipe.java} (92%) create mode 100644 util/inv/WrapperTEPipe.java diff --git a/block/AEBaseBlock.java b/block/AEBaseBlock.java index 0a59ce8b0..f7656c5a9 100644 --- a/block/AEBaseBlock.java +++ b/block/AEBaseBlock.java @@ -27,6 +27,7 @@ import appeng.api.implementations.IMemoryCard; import appeng.api.implementations.MemoryCardMessages; import appeng.api.util.IOrientable; import appeng.api.util.IOrientableBlock; +import appeng.block.networking.BlockCableBus; import appeng.client.render.BaseBlockRender; import appeng.client.render.BlockRenderInfo; import appeng.client.render.WorldRender; @@ -631,7 +632,7 @@ public class AEBaseBlock extends BlockContainer implements IAEFeature return false; } - if ( is.getItem() instanceof IMemoryCard ) + if ( is.getItem() instanceof IMemoryCard && !(this instanceof BlockCableBus) ) { IMemoryCard memc = (IMemoryCard) is.getItem(); if ( player.isSneaking() ) diff --git a/block/AEBaseItemBlockChargeable.java b/block/AEBaseItemBlockChargeable.java index 876d12229..7c0c800c0 100644 --- a/block/AEBaseItemBlockChargeable.java +++ b/block/AEBaseItemBlockChargeable.java @@ -11,6 +11,7 @@ import appeng.api.AEApi; import appeng.api.config.AccessRestriction; import appeng.api.config.PowerUnits; import appeng.api.implementations.IAEItemPowerStorage; +import appeng.core.localization.GuiText; import appeng.util.Platform; public class AEBaseItemBlockChargeable extends AEBaseItemBlock implements IAEItemPowerStorage @@ -34,7 +35,7 @@ public class AEBaseItemBlockChargeable extends AEBaseItemBlock implements IAEIte double percent = internalCurrentPower / internalMaxPower; - lines.add( Platform.gui_localize( "Stored Energy" ) + ":" + MessageFormat.format( " {0,number,#} ", internalCurrentPower ) + lines.add( GuiText.StoredEnergy.getLocal() + ":" + MessageFormat.format( " {0,number,#} ", internalCurrentPower ) + Platform.gui_localize( PowerUnits.AE.unlocalizedName ) + " - " + MessageFormat.format( " {0,number,#.##%} ", percent ) ); diff --git a/block/misc/BlockCellWorkbench.java b/block/misc/BlockCellWorkbench.java new file mode 100644 index 000000000..011f6ea15 --- /dev/null +++ b/block/misc/BlockCellWorkbench.java @@ -0,0 +1,40 @@ +package appeng.block.misc; + +import java.util.EnumSet; + +import net.minecraft.block.material.Material; +import net.minecraft.entity.player.EntityPlayer; +import net.minecraft.world.World; +import net.minecraftforge.common.ForgeDirection; +import appeng.block.AEBaseBlock; +import appeng.core.features.AEFeature; +import appeng.core.sync.GuiBridge; +import appeng.tile.misc.TileCellWorkbench; +import appeng.util.Platform; + +public class BlockCellWorkbench extends AEBaseBlock +{ + + public BlockCellWorkbench() { + super( BlockCellWorkbench.class, Material.iron ); + setfeature( EnumSet.of( AEFeature.StorageCells ) ); + setTileEntiy( TileCellWorkbench.class ); + } + + @Override + public boolean onActivated(World w, int x, int y, int z, EntityPlayer p, int side, float hitX, float hitY, float hitZ) + { + if ( p.isSneaking() ) + return false; + + TileCellWorkbench tg = getTileEntity( w, x, y, z ); + if ( tg != null ) + { + if ( Platform.isServer() ) + Platform.openGUI( p, tg, ForgeDirection.getOrientation( side ), GuiBridge.GUI_CELLWORKBENCH ); + return true; + } + return false; + } + +} diff --git a/block/networking/BlockCableBus.java b/block/networking/BlockCableBus.java index 505cc11ab..3b0594d2b 100644 --- a/block/networking/BlockCableBus.java +++ b/block/networking/BlockCableBus.java @@ -18,6 +18,7 @@ import net.minecraft.util.Vec3; import net.minecraft.world.IBlockAccess; import net.minecraft.world.World; import net.minecraftforge.common.ForgeDirection; +import appeng.api.parts.PartItemStack; import appeng.api.parts.SelectedPart; import appeng.block.AEBaseBlock; import appeng.client.render.BaseBlockRender; @@ -25,15 +26,19 @@ import appeng.client.render.blocks.RendererCableBus; import appeng.client.texture.CableBusTextures; import appeng.core.Api; import appeng.core.AppEng; +import appeng.core.CommonHelper; import appeng.core.features.AEFeature; import appeng.integration.abstraction.IFMP; -import appeng.parts.CableBusContainer; +import appeng.parts.ICableBusContainer; +import appeng.parts.NullCableBusContainer; import appeng.tile.AEBaseTile; import appeng.tile.networking.TileCableBus; public class BlockCableBus extends AEBaseBlock { + static private ICableBusContainer nullCB = new NullCableBusContainer(); + public BlockCableBus() { super( BlockCableBus.class, Material.glass ); setfeature( EnumSet.of( AEFeature.Core ) ); @@ -44,14 +49,7 @@ public class BlockCableBus extends AEBaseBlock @Override public boolean isLadder(World world, int x, int y, int z, EntityLivingBase entity) { - try - { - return cb( world, x, y, z ).isLadder( entity ); - } - catch (Throwable t) - { - } - return false; + return cb( world, x, y, z ).isLadder( entity ); } @Override @@ -70,18 +68,13 @@ public class BlockCableBus extends AEBaseBlock @Override public void randomDisplayTick(World world, int x, int y, int z, Random r) { - CableBusContainer cb = cb( world, x, y, z ); - if ( cb != null ) - cb.randomDisplayTick( world, x, y, z, r ); + cb( world, x, y, z ).randomDisplayTick( world, x, y, z, r ); } @Override public int getLightValue(IBlockAccess world, int x, int y, int z) { - CableBusContainer cb = cb( world, x, y, z ); - if ( cb != null ) - return cb.getLightValue(); - return 0; + return cb( world, x, y, z ).getLightValue(); } @Override @@ -89,13 +82,12 @@ public class BlockCableBus extends AEBaseBlock { Vec3 v3 = target.hitVec.addVector( -x, -y, -z ); SelectedPart sp = cb( world, x, y, z ).selectPart( v3 ); - if ( sp != null ) - { - if ( sp.part != null ) - return sp.part.getItemStack( false ); - if ( sp.facade != null ) - return sp.facade.getItemStack(); - } + + if ( sp.part != null ) + return sp.part.getItemStack( PartItemStack.Break ); + else if ( sp.facade != null ) + return sp.facade.getItemStack(); + return null; } @@ -130,21 +122,10 @@ public class BlockCableBus extends AEBaseBlock Icon i = super.getIcon( direction, metadata ); if ( i != null ) return i; + return CableBusTextures.getMissing(); } - private CableBusContainer cb(IBlockAccess w, int x, int y, int z) - { - TileEntity te = w.getBlockTileEntity( x, y, z ); - if ( te instanceof TileCableBus ) - return ((TileCableBus) te).cb; - - if ( AppEng.instance.isIntegrationEnabled( "FMP" ) ) - return ((IFMP) AppEng.instance.getIntegration( "FMP" )).getCableContainer( te ); - - return null; - } - @Override protected Class getRenderer() { @@ -234,6 +215,19 @@ public class BlockCableBus extends AEBaseBlock public void setupTile() { setTileEntiy( Api.instance.partHelper.getCombinedInstance( TileCableBus.class.getName() ) ); + CommonHelper.proxy.bindTileEntitySpecialRenderer( getTileEntityClass(), this ); + } + + private ICableBusContainer cb(IBlockAccess w, int x, int y, int z) + { + TileEntity te = w.getBlockTileEntity( x, y, z ); + if ( te instanceof TileCableBus ) + return ((TileCableBus) te).cb; + + if ( AppEng.instance.isIntegrationEnabled( "FMP" ) ) + return ((IFMP) AppEng.instance.getIntegration( "FMP" )).getCableContainer( te ); + + return nullCB; } } diff --git a/block/qnb/BlockQuantumLinkChamber.java b/block/qnb/BlockQuantumLinkChamber.java index d0f27918a..c1a5f03f8 100644 --- a/block/qnb/BlockQuantumLinkChamber.java +++ b/block/qnb/BlockQuantumLinkChamber.java @@ -1,13 +1,23 @@ package appeng.block.qnb; import java.util.EnumSet; +import java.util.Random; import net.minecraft.block.material.Material; +import net.minecraft.client.Minecraft; +import net.minecraft.client.particle.EntityFX; +import net.minecraft.entity.player.EntityPlayer; +import net.minecraft.item.Item; +import net.minecraft.world.World; +import net.minecraftforge.common.ForgeDirection; import appeng.block.AEBaseBlock; import appeng.client.render.BaseBlockRender; import appeng.client.render.blocks.RenderQNB; +import appeng.client.render.effects.EnergyFx; import appeng.core.features.AEFeature; +import appeng.core.sync.GuiBridge; import appeng.tile.qnb.TileQuantumBridge; +import appeng.util.Platform; public class BlockQuantumLinkChamber extends AEBaseBlock { @@ -22,10 +32,57 @@ public class BlockQuantumLinkChamber extends AEBaseBlock isFullSize = isOpaque = false; } + @Override + public void randomDisplayTick(World w, int bx, int by, int bz, Random r) + { + TileQuantumBridge bridge = getTileEntity( w, bx, by, bz ); + if ( bridge != null ) + { + if ( bridge.hasQES() ) + { + float x = (float) (((Platform.getRandomInt() % 100) * 0.01) - 0.5) * 0.7f; + float y = (float) (((Platform.getRandomInt() % 100) * 0.01) - 0.5) * 0.7f; + float z = (float) (((Platform.getRandomInt() % 100) * 0.01) - 0.5) * 0.7f; + + EnergyFx fx = new EnergyFx( w, bx + x + 0.5, by + y + 0.5, bz + z + 0.5, Item.diamond ); + + fx.motionX = -x * 0.1; + fx.motionY = -y * 0.1; + fx.motionZ = -z * 0.1; + + Minecraft.getMinecraft().effectRenderer.addEffect( (EntityFX) fx ); + } + } + } + + @Override + public void onNeighborBlockChange(World w, int x, int y, int z, int pointlessnumber) + { + TileQuantumBridge bridge = getTileEntity( w, x, y, z ); + if ( bridge != null ) + bridge.neighborUpdate(); + } + @Override protected Class getRenderer() { return RenderQNB.class; } + @Override + public boolean onActivated(World w, int x, int y, int z, EntityPlayer p, int side, float hitX, float hitY, float hitZ) + { + if ( p.isSneaking() ) + return false; + + TileQuantumBridge tg = getTileEntity( w, x, y, z ); + if ( tg != null ) + { + if ( Platform.isServer() ) + Platform.openGUI( p, tg, ForgeDirection.getOrientation( side ), GuiBridge.GUI_QNB ); + return true; + } + return false; + } + } diff --git a/block/qnb/BlockQuantumRing.java b/block/qnb/BlockQuantumRing.java index 370a84d7d..deb760506 100644 --- a/block/qnb/BlockQuantumRing.java +++ b/block/qnb/BlockQuantumRing.java @@ -3,6 +3,7 @@ package appeng.block.qnb; import java.util.EnumSet; import net.minecraft.block.material.Material; +import net.minecraft.world.World; import appeng.block.AEBaseBlock; import appeng.client.render.BaseBlockRender; import appeng.client.render.blocks.RenderQNB; @@ -22,6 +23,14 @@ public class BlockQuantumRing extends AEBaseBlock isFullSize = isOpaque = false; } + @Override + public void onNeighborBlockChange(World w, int x, int y, int z, int pointlessnumber) + { + TileQuantumBridge bridge = getTileEntity( w, x, y, z ); + if ( bridge != null ) + bridge.neighborUpdate(); + } + @Override protected Class getRenderer() { diff --git a/block/solids/BlockFluix.java b/block/solids/BlockFluix.java new file mode 100644 index 000000000..a30d8a4c9 --- /dev/null +++ b/block/solids/BlockFluix.java @@ -0,0 +1,27 @@ +package appeng.block.solids; + +import java.util.EnumSet; + +import net.minecraft.block.material.Material; +import net.minecraft.world.IBlockAccess; +import appeng.api.util.IOrientable; +import appeng.api.util.IOrientableBlock; +import appeng.block.AEBaseBlock; +import appeng.core.features.AEFeature; +import appeng.helpers.LocationRotation; + +public class BlockFluix extends AEBaseBlock implements IOrientableBlock +{ + + public BlockFluix() { + super( BlockFluix.class, Material.rock ); + setfeature( EnumSet.of( AEFeature.DecorativeQuartzBlocks ) ); + } + + @Override + public IOrientable getOrientable(final IBlockAccess w, final int x, final int y, final int z) + { + return new LocationRotation( w, x, y, z ); + } + +} diff --git a/block/storage/BlockDrive.java b/block/storage/BlockDrive.java index 01ed90d97..18ee7fccd 100644 --- a/block/storage/BlockDrive.java +++ b/block/storage/BlockDrive.java @@ -11,7 +11,6 @@ import appeng.client.render.BaseBlockRender; import appeng.client.render.blocks.RenderDrive; import appeng.core.features.AEFeature; import appeng.core.sync.GuiBridge; -import appeng.tile.misc.TileInterface; import appeng.tile.storage.TileDrive; import appeng.util.Platform; @@ -36,7 +35,7 @@ public class BlockDrive extends AEBaseBlock if ( p.isSneaking() ) return false; - TileInterface tg = getTileEntity( w, x, y, z ); + TileDrive tg = getTileEntity( w, x, y, z ); if ( tg != null ) { if ( Platform.isServer() ) diff --git a/block/storage/BlockIOPort.java b/block/storage/BlockIOPort.java index 41d8a3a6e..41506382b 100644 --- a/block/storage/BlockIOPort.java +++ b/block/storage/BlockIOPort.java @@ -3,9 +3,14 @@ package appeng.block.storage; import java.util.EnumSet; import net.minecraft.block.material.Material; +import net.minecraft.entity.player.EntityPlayer; +import net.minecraft.world.World; +import net.minecraftforge.common.ForgeDirection; import appeng.block.AEBaseBlock; import appeng.core.features.AEFeature; +import appeng.core.sync.GuiBridge; import appeng.tile.storage.TileIOPort; +import appeng.util.Platform; public class BlockIOPort extends AEBaseBlock { @@ -16,4 +21,27 @@ public class BlockIOPort extends AEBaseBlock setTileEntiy( TileIOPort.class ); } + @Override + public final void onNeighborBlockChange(World w, int x, int y, int z, int junk) + { + TileIOPort te = getTileEntity( w, x, y, z ); + if ( te != null ) + te.updateRedstoneState(); + } + + @Override + public boolean onActivated(World w, int x, int y, int z, EntityPlayer p, int side, float hitX, float hitY, float hitZ) + { + if ( p.isSneaking() ) + return false; + + TileIOPort tg = getTileEntity( w, x, y, z ); + if ( tg != null ) + { + if ( Platform.isServer() ) + Platform.openGUI( p, tg, ForgeDirection.getOrientation( side ), GuiBridge.GUI_IOPORT ); + return true; + } + return false; + } } diff --git a/client/ClientHelper.java b/client/ClientHelper.java index 9e8a0390e..9cd3d6e90 100644 --- a/client/ClientHelper.java +++ b/client/ClientHelper.java @@ -61,7 +61,7 @@ public class ClientHelper extends ServerHelper public void bindTileEntitySpecialRenderer(Class tile, AEBaseBlock blk) { BaseBlockRender bbr = blk.getRendererInstance().rendererInstance; - if ( bbr.hasTESR ) + if ( bbr.hasTESR && tile != null ) ClientRegistry.bindTileEntitySpecialRenderer( tile, new TESRWrapper( bbr ) ); } diff --git a/client/gui/implementations/GuiCellWorkbench.java b/client/gui/implementations/GuiCellWorkbench.java new file mode 100644 index 000000000..734e24e9c --- /dev/null +++ b/client/gui/implementations/GuiCellWorkbench.java @@ -0,0 +1,167 @@ +package appeng.client.gui.implementations; + +import java.io.IOException; + +import net.minecraft.client.gui.GuiButton; +import net.minecraft.entity.player.InventoryPlayer; +import net.minecraft.inventory.IInventory; +import net.minecraft.item.ItemStack; + +import org.lwjgl.input.Mouse; + +import appeng.api.config.ActionItems; +import appeng.api.config.FuzzyMode; +import appeng.api.config.Settings; +import appeng.api.config.Upgrades; +import appeng.api.implementations.IUpgradeModule; +import appeng.client.gui.widgets.GuiImgButton; +import appeng.container.implementations.ContainerCellWorkbench; +import appeng.core.localization.GuiText; +import appeng.core.sync.packets.PacketValueConfig; +import appeng.tile.misc.TileCellWorkbench; +import appeng.util.Platform; +import cpw.mods.fml.common.network.PacketDispatcher; + +public class GuiCellWorkbench extends GuiUpgradeable +{ + + ContainerCellWorkbench ccwb; + TileCellWorkbench tcw; + + GuiImgButton clear; + GuiImgButton partition; + + public GuiCellWorkbench(InventoryPlayer inventoryPlayer, TileCellWorkbench te) { + super( new ContainerCellWorkbench( inventoryPlayer, te ) ); + ccwb = (ContainerCellWorkbench) inventorySlots; + ySize = 251; + tcw = te; + } + + @Override + protected boolean drawUpgrades() + { + return ccwb.availableUpgrades() > 0; + } + + @Override + public void initGui() + { + super.initGui(); + } + + @Override + public void drawBG(int offsetX, int offsetY, int mouseX, int mouseY) + { + handleButtonVisiblity(); + + bindTexture( getBackground() ); + this.drawTexturedModalRect( offsetX, offsetY, 0, 0, 211 - 34, ySize ); + if ( drawUpgrades() ) + { + if ( ccwb.availableUpgrades() <= 8 ) + { + this.drawTexturedModalRect( offsetX + 177, offsetY, 177, 0, 35, 7 + ccwb.availableUpgrades() * 18 ); + this.drawTexturedModalRect( offsetX + 177, offsetY + (7 + (ccwb.availableUpgrades()) * 18), 177, 151, 35, 7 ); + } + else if ( ccwb.availableUpgrades() <= 16 ) + { + this.drawTexturedModalRect( offsetX + 177, offsetY, 177, 0, 35, 7 + 8 * 18 ); + this.drawTexturedModalRect( offsetX + 177, offsetY + (7 + (8) * 18), 177, 151, 35, 7 ); + + int dx = ccwb.availableUpgrades() - 8; + this.drawTexturedModalRect( offsetX + 177 + 27, offsetY, 186, 0, 35 - 8, 7 + dx * 18 ); + if ( dx == 8 ) + this.drawTexturedModalRect( offsetX + 177 + 27, offsetY + (7 + (dx) * 18), 186, 151, 35 - 8, 7 ); + else + this.drawTexturedModalRect( offsetX + 177 + 27 + 4, offsetY + (7 + (dx) * 18), 186 + 4, 151, 35 - 8, 7 ); + + } + else + { + this.drawTexturedModalRect( offsetX + 177, offsetY, 177, 0, 35, 7 + 8 * 18 ); + this.drawTexturedModalRect( offsetX + 177, offsetY + (7 + (8) * 18), 177, 151, 35, 7 ); + + this.drawTexturedModalRect( offsetX + 177 + 27, offsetY, 186, 0, 35 - 8, 7 + 8 * 18 ); + this.drawTexturedModalRect( offsetX + 177 + 27, offsetY + (7 + (8) * 18), 186, 151, 35 - 8, 7 ); + + int dx = ccwb.availableUpgrades() - 16; + this.drawTexturedModalRect( offsetX + 177 + 27 + 18, offsetY, 186, 0, 35 - 8, 7 + dx * 18 ); + if ( dx == 8 ) + this.drawTexturedModalRect( offsetX + 177 + 27 + 18, offsetY + (7 + (dx) * 18), 186, 151, 35 - 8, 7 ); + else + this.drawTexturedModalRect( offsetX + 177 + 27 + 18 + 4, offsetY + (7 + (dx) * 18), 186 + 4, 151, 35 - 8, 7 ); + } + } + if ( hasToolbox() ) + this.drawTexturedModalRect( offsetX + 178, offsetY + ySize - 90, 178, 161, 68, 68 ); + } + + @Override + protected void actionPerformed(GuiButton btn) + { + try + { + if ( btn == partition ) + { + PacketDispatcher.sendPacketToServer( (new PacketValueConfig( "CellWorkbench.Action", "Partition" )).getPacket() ); + } + else if ( btn == clear ) + { + PacketDispatcher.sendPacketToServer( (new PacketValueConfig( "CellWorkbench.Action", "Clear" )).getPacket() ); + } + else if ( btn == fuzzyMode ) + { + boolean backwards = Mouse.isButtonDown( 1 ); + + FuzzyMode fz = (FuzzyMode) fuzzyMode.getCurrentValue(); + fz = Platform.rotateEnum( fz, backwards, Settings.FUZZY_MODE.getPossibleValues() ); + + PacketDispatcher.sendPacketToServer( (new PacketValueConfig( "CellWorkbench.Fuzzy", fz.name() )).getPacket() ); + } + else + super.actionPerformed( btn ); + } + catch (IOException err) + { + } + } + + @Override + protected void addButtons() + { + clear = new GuiImgButton( this.guiLeft - 18, guiTop + 8, Settings.ACTIONS, ActionItems.CLOSE ); + partition = new GuiImgButton( this.guiLeft - 18, guiTop + 28, Settings.ACTIONS, ActionItems.WRENCH ); + fuzzyMode = new GuiImgButton( this.guiLeft - 18, guiTop + 48, Settings.FUZZY_MODE, FuzzyMode.IGNORE_ALL ); + + buttonList.add( fuzzyMode ); + buttonList.add( partition ); + buttonList.add( clear ); + } + + protected void handleButtonVisiblity() + { + boolean hasFuzzy = false; + IInventory inv = ccwb.getCellUpgradeInventory(); + for (int x = 0; x < inv.getSizeInventory(); x++) + { + ItemStack is = inv.getStackInSlot( x ); + if ( is != null && is.getItem() instanceof IUpgradeModule ) + { + if ( ((IUpgradeModule) is.getItem()).getType( is ) == Upgrades.FUZZY ) + hasFuzzy = true; + } + } + fuzzyMode.setVisibility( hasFuzzy ); + } + + protected String getBackground() + { + return "guis/cellworkbench.png"; + } + + protected GuiText getName() + { + return GuiText.CellWorkbench; + } +} diff --git a/client/gui/implementations/GuiIOPort.java b/client/gui/implementations/GuiIOPort.java new file mode 100644 index 000000000..eac3c52b5 --- /dev/null +++ b/client/gui/implementations/GuiIOPort.java @@ -0,0 +1,95 @@ +package appeng.client.gui.implementations; + +import java.io.IOException; + +import net.minecraft.client.gui.GuiButton; +import net.minecraft.entity.player.InventoryPlayer; + +import org.lwjgl.input.Mouse; + +import appeng.api.AEApi; +import appeng.api.config.FullnessMode; +import appeng.api.config.OperationMode; +import appeng.api.config.RedstoneMode; +import appeng.api.config.Settings; +import appeng.client.gui.widgets.GuiImgButton; +import appeng.container.implementations.ContainerIOPort; +import appeng.core.localization.GuiText; +import appeng.core.sync.packets.PacketConfigButton; +import appeng.tile.storage.TileIOPort; +import cpw.mods.fml.common.network.PacketDispatcher; + +public class GuiIOPort extends GuiUpgradeable +{ + + GuiImgButton fullMode; + GuiImgButton operationMode; + + public GuiIOPort(InventoryPlayer inventoryPlayer, TileIOPort te) { + super( new ContainerIOPort( inventoryPlayer, te ) ); + this.ySize = 166; + } + + @Override + public void drawBG(int offsetX, int offsetY, int mouseX, int mouseY) + { + super.drawBG( offsetX, offsetY, mouseX, mouseY ); + this.drawItem( offsetX + 66 - 8, offsetY + 17, AEApi.instance().items().itemCell1k.stack( 1 ) ); + this.drawItem( offsetX + 94 + 8, offsetY + 17, AEApi.instance().blocks().blockDrive.stack( 1 ) ); + } + + @Override + public void drawFG(int offsetX, int offsetY, int mouseX, int mouseY) + { + fontRenderer.drawString( GuiText.IOPort.getLocal(), 8, 6, 4210752 ); + fontRenderer.drawString( GuiText.inventory.getLocal(), 8, ySize - 96 + 3, 4210752 ); + + if ( redstoneMode != null ) + redstoneMode.set( cvb.rsMode ); + + if ( operationMode != null ) + operationMode.set( ((ContainerIOPort) cvb).opMode ); + + if ( fullMode != null ) + fullMode.set( ((ContainerIOPort) cvb).fMode ); + } + + @Override + protected void addButtons() + { + redstoneMode = new GuiImgButton( this.guiLeft - 18, guiTop + 28, Settings.REDSTONE_CONTROLLED, RedstoneMode.IGNORE ); + fullMode = new GuiImgButton( this.guiLeft - 18, guiTop + 8, Settings.FULLNESS_MODE, FullnessMode.EMPTY ); + operationMode = new GuiImgButton( this.guiLeft + 80, guiTop + 17, Settings.OPERATION_MODE, OperationMode.EMPTY ); + + buttonList.add( operationMode ); + buttonList.add( redstoneMode ); + buttonList.add( fullMode ); + } + + @Override + protected void actionPerformed(GuiButton btn) + { + super.actionPerformed( btn ); + + boolean backwards = Mouse.isButtonDown( 1 ); + + try + { + if ( btn == fullMode ) + PacketDispatcher.sendPacketToServer( (new PacketConfigButton( fullMode.getSetting(), backwards )).getPacket() ); + + if ( btn == operationMode ) + PacketDispatcher.sendPacketToServer( (new PacketConfigButton( operationMode.getSetting(), backwards )).getPacket() ); + } + catch (IOException e) + { + e.printStackTrace(); + } + } + + protected String getBackground() + { + return "guis/ioport.png"; + } + +} diff --git a/client/gui/implementations/GuiLevelEmitter.java b/client/gui/implementations/GuiLevelEmitter.java index daa5eb9d3..fdb210e96 100644 --- a/client/gui/implementations/GuiLevelEmitter.java +++ b/client/gui/implementations/GuiLevelEmitter.java @@ -15,7 +15,7 @@ import appeng.core.sync.packets.PacketValueConfig; import appeng.parts.automation.PartLevelEmitter; import cpw.mods.fml.common.network.PacketDispatcher; -public class GuiLevelEmitter extends GuiBus +public class GuiLevelEmitter extends GuiUpgradeable { GuiTextField level; @@ -28,7 +28,7 @@ public class GuiLevelEmitter extends GuiBus public void initGui() { super.initGui(); - level = new GuiTextField( this.fontRenderer, this.guiLeft + 10, this.guiTop + 43, 59, this.fontRenderer.FONT_HEIGHT ); + level = new GuiTextField( this.fontRenderer, this.guiLeft + 44, this.guiTop + 43, 59, this.fontRenderer.FONT_HEIGHT ); level.setEnableBackgroundDrawing( false ); level.setMaxStringLength( 16 ); level.setTextColor( 0xFFFFFF ); @@ -40,8 +40,8 @@ public class GuiLevelEmitter extends GuiBus @Override protected void addButtons() { - redstoneMode = new GuiImgButton( 122 + guiLeft, 31 + guiTop, Settings.REDSTONE_EMITTER, RedstoneMode.IGNORE ); - fuzzyMode = new GuiImgButton( 122 + guiLeft, 49 + guiTop, Settings.FUZZY_MODE, FuzzyMode.IGNORE_ALL ); + redstoneMode = new GuiImgButton( this.guiLeft - 18, guiTop + 8, Settings.REDSTONE_EMITTER, RedstoneMode.IGNORE ); + fuzzyMode = new GuiImgButton( this.guiLeft - 18, guiTop + 28, Settings.FUZZY_MODE, FuzzyMode.IGNORE_ALL ); buttonList.add( redstoneMode ); buttonList.add( fuzzyMode ); diff --git a/client/gui/implementations/GuiMEMonitorable.java b/client/gui/implementations/GuiMEMonitorable.java index be6b47a16..6d30e0c8c 100644 --- a/client/gui/implementations/GuiMEMonitorable.java +++ b/client/gui/implementations/GuiMEMonitorable.java @@ -18,6 +18,7 @@ import appeng.container.implementations.ContainerMEMonitorable; import appeng.container.slot.AppEngSlot; import appeng.core.Configuration; import appeng.core.localization.GuiText; +import appeng.helpers.ICellItemViewer; import appeng.parts.reporting.PartTerminal; import appeng.util.Platform; @@ -29,6 +30,7 @@ public class GuiMEMonitorable extends AEBaseMEGui GuiText myName; int rows = 0; + int maxRows = Integer.MAX_VALUE; public GuiMEMonitorable(InventoryPlayer inventoryPlayer, IStorageMonitorable te) { super( new ContainerMEMonitorable( inventoryPlayer, null ) ); @@ -37,6 +39,8 @@ public class GuiMEMonitorable extends AEBaseMEGui xSize = 195; ySize = 204; + if ( te instanceof ICellItemViewer ) + myName = GuiText.PortableCell; if ( te instanceof IMEChest ) myName = GuiText.Chest; else if ( te instanceof PartTerminal ) @@ -65,7 +69,14 @@ public class GuiMEMonitorable extends AEBaseMEGui int NEI = 0; int top = 4; int extraSpace = height - 114 - NEI - top; + int moveDown = 0; + rows = (int) Math.floor( extraSpace / 18 ); + if ( rows > maxRows ) + { + top += (rows - maxRows) * 18 / 2; + rows = maxRows; + } meSlots.clear(); for (int y = 0; y < rows; y++) @@ -101,7 +112,7 @@ public class GuiMEMonitorable extends AEBaseMEGui { if ( s instanceof AppEngSlot ) { - ((AppEngSlot) s).yDisplayPosition = ((AppEngSlot) s).defY + ySize - 78 - guiTop; + ((AppEngSlot) s).yDisplayPosition = ((AppEngSlot) s).defY + ySize - 78 - 4; } } } diff --git a/client/gui/implementations/GuiMEPortableCell.java b/client/gui/implementations/GuiMEPortableCell.java new file mode 100644 index 000000000..3da7bb3d4 --- /dev/null +++ b/client/gui/implementations/GuiMEPortableCell.java @@ -0,0 +1,14 @@ +package appeng.client.gui.implementations; + +import net.minecraft.entity.player.InventoryPlayer; +import appeng.helpers.ICellItemViewer; + +public class GuiMEPortableCell extends GuiMEMonitorable +{ + + public GuiMEPortableCell(InventoryPlayer inventoryPlayer, ICellItemViewer te) { + super( inventoryPlayer, te ); + maxRows = 3; + } + +} diff --git a/client/gui/implementations/GuiNetworkStatus.java b/client/gui/implementations/GuiNetworkStatus.java index 8f6ba77cf..0676f839a 100644 --- a/client/gui/implementations/GuiNetworkStatus.java +++ b/client/gui/implementations/GuiNetworkStatus.java @@ -24,7 +24,7 @@ public class GuiNetworkStatus extends AEBaseGui @Override public void drawFG(int offsetX, int offsetY, int mouseX, int mouseY) { - fontRenderer.drawString( GuiText.NetworkStatus.getLocal(), 8, 6, 4210752 ); + fontRenderer.drawString( GuiText.NetworkDetails.getLocal(), 8, 6, 4210752 ); fontRenderer.drawString( GuiText.inventory.getLocal(), 8, ySize - 96 + 3, 4210752 ); } diff --git a/client/gui/implementations/GuiQNB.java b/client/gui/implementations/GuiQNB.java new file mode 100644 index 000000000..f97d34074 --- /dev/null +++ b/client/gui/implementations/GuiQNB.java @@ -0,0 +1,31 @@ +package appeng.client.gui.implementations; + +import net.minecraft.entity.player.InventoryPlayer; +import appeng.client.gui.AEBaseGui; +import appeng.container.implementations.ContainerQNB; +import appeng.core.localization.GuiText; +import appeng.tile.qnb.TileQuantumBridge; + +public class GuiQNB extends AEBaseGui +{ + + public GuiQNB(InventoryPlayer inventoryPlayer, TileQuantumBridge te) { + super( new ContainerQNB( inventoryPlayer, te ) ); + this.ySize = 166; + } + + @Override + public void drawBG(int offsetX, int offsetY, int mouseX, int mouseY) + { + bindTexture( "guis/chest.png" ); + this.drawTexturedModalRect( offsetX, offsetY, 0, 0, xSize, ySize ); + } + + @Override + public void drawFG(int offsetX, int offsetY, int mouseX, int mouseY) + { + fontRenderer.drawString( GuiText.QuantumLinkChamber.getLocal(), 8, 6, 4210752 ); + fontRenderer.drawString( GuiText.inventory.getLocal(), 8, ySize - 96 + 3, 4210752 ); + } + +} diff --git a/client/gui/implementations/GuiBus.java b/client/gui/implementations/GuiUpgradeable.java similarity index 65% rename from client/gui/implementations/GuiBus.java rename to client/gui/implementations/GuiUpgradeable.java index 7e64498ee..147d9a410 100644 --- a/client/gui/implementations/GuiBus.java +++ b/client/gui/implementations/GuiUpgradeable.java @@ -14,28 +14,28 @@ import appeng.api.config.Upgrades; import appeng.api.implementations.IBusCommon; import appeng.client.gui.AEBaseGui; import appeng.client.gui.widgets.GuiImgButton; -import appeng.container.implementations.ContainerBus; +import appeng.container.implementations.ContainerUpgradeable; import appeng.core.localization.GuiText; import appeng.core.sync.packets.PacketConfigButton; import appeng.parts.automation.PartImportBus; import cpw.mods.fml.common.network.PacketDispatcher; -public class GuiBus extends AEBaseGui +public class GuiUpgradeable extends AEBaseGui { - ContainerBus cvb; + ContainerUpgradeable cvb; IBusCommon bc; GuiImgButton redstoneMode; GuiImgButton fuzzyMode; - public GuiBus(InventoryPlayer inventoryPlayer, IBusCommon te) { - this( new ContainerBus( inventoryPlayer, te ) ); + public GuiUpgradeable(InventoryPlayer inventoryPlayer, IBusCommon te) { + this( new ContainerUpgradeable( inventoryPlayer, te ) ); } - public GuiBus(ContainerBus te) { + public GuiUpgradeable(ContainerUpgradeable te) { super( te ); - cvb = (ContainerBus) te; + cvb = (ContainerUpgradeable) te; bc = (IBusCommon) te.getTarget(); this.xSize = hasToolbox() ? 246 : 211; @@ -58,12 +58,21 @@ public class GuiBus extends AEBaseGui buttonList.add( fuzzyMode ); } - protected void mouseClicked(int par1, int par2, int par3) + protected void mouseClicked(int xCoord, int yCoord, int btn) { - if ( par3 == 1 ) - super.mouseClicked( par1, par2, 0 ); - else - super.mouseClicked( par1, par2, par3 ); + if ( btn == 1 ) + { + for (Object o : this.buttonList) + { + GuiButton guibutton = (GuiButton) o; + if ( guibutton.mousePressed( this.mc, xCoord, yCoord ) ) + { + super.mouseClicked( xCoord, yCoord, 0 ); + return; + } + } + } + super.mouseClicked( xCoord, yCoord, btn ); } @Override @@ -88,9 +97,9 @@ public class GuiBus extends AEBaseGui } } - private boolean hasToolbox() + protected boolean hasToolbox() { - return ((ContainerBus) inventorySlots).hasToolbox(); + return ((ContainerUpgradeable) inventorySlots).hasToolbox(); } @Override @@ -99,10 +108,16 @@ public class GuiBus extends AEBaseGui handleButtonVisiblity(); bindTexture( getBackground() ); - this.drawTexturedModalRect( offsetX, offsetY, 0, 0, xSize - 34, ySize ); - this.drawTexturedModalRect( offsetX + 177, offsetY, 177, 0, 35, 86 ); + this.drawTexturedModalRect( offsetX, offsetY, 0, 0, 211 - 34, ySize ); + if ( drawUpgrades() ) + this.drawTexturedModalRect( offsetX + 177, offsetY, 177, 0, 35, 10 + cvb.availableUpgrades() * 18 ); if ( hasToolbox() ) - this.drawTexturedModalRect( offsetX + 178, offsetY + 94, 178, 94, 68, 68 ); + this.drawTexturedModalRect( offsetX + 178, offsetY + ySize - 90, 178, ySize - 90, 68, 68 ); + } + + protected boolean drawUpgrades() + { + return true; } protected String getBackground() @@ -112,8 +127,10 @@ public class GuiBus extends AEBaseGui protected void handleButtonVisiblity() { - redstoneMode.setVisibility( bc.getInstalledUpgrades( Upgrades.REDSTONE ) > 0 ); - fuzzyMode.setVisibility( bc.getInstalledUpgrades( Upgrades.FUZZY ) > 0 ); + if ( redstoneMode != null ) + redstoneMode.setVisibility( bc.getInstalledUpgrades( Upgrades.REDSTONE ) > 0 ); + if ( fuzzyMode != null ) + fuzzyMode.setVisibility( bc.getInstalledUpgrades( Upgrades.FUZZY ) > 0 ); } @Override diff --git a/client/gui/widgets/GuiProgressBar.java b/client/gui/widgets/GuiProgressBar.java index 75aee105b..8dcf9cee7 100644 --- a/client/gui/widgets/GuiProgressBar.java +++ b/client/gui/widgets/GuiProgressBar.java @@ -28,6 +28,8 @@ public class GuiProgressBar extends GuiButton implements ITooltip public GuiProgressBar(String string, int posX, int posY, int u, int y, int _width, int _height, Direction dir) { super( posX, posY, _width, "" ); + this.xPosition = posX; + this.yPosition = posY; texture = new ResourceLocation( "appliedenergistics2", "textures/" + string ); width = _width; height = _height; diff --git a/client/render/BusRenderer.java b/client/render/BusRenderer.java index f783ea1f7..9775a82f7 100644 --- a/client/render/BusRenderer.java +++ b/client/render/BusRenderer.java @@ -9,9 +9,9 @@ import net.minecraftforge.common.ForgeDirection; import org.lwjgl.opengl.GL11; -import appeng.api.parts.IPartItem; -import appeng.api.parts.IPart; import appeng.api.parts.IFacadePart; +import appeng.api.parts.IPart; +import appeng.api.parts.IPartItem; import appeng.client.ClientHelper; import appeng.facade.IFacadeItem; import appeng.util.Platform; @@ -69,6 +69,10 @@ public class BusRenderer implements IItemRenderer BusRenderHelper.instance.setInvColor( 0xffffff ); renderer.blockAccess = ClientHelper.proxy.getWorld(); + BusRenderHelper.instance.ax = ForgeDirection.EAST; + BusRenderHelper.instance.ay = ForgeDirection.UP; + BusRenderHelper.instance.az = ForgeDirection.SOUTH; + if ( item.getItem() instanceof IFacadeItem ) { IFacadeItem fi = (IFacadeItem) item.getItem(); diff --git a/client/render/blocks/RenderCable.java b/client/render/blocks/RenderCable.java deleted file mode 100644 index ed8ed6eba..000000000 --- a/client/render/blocks/RenderCable.java +++ /dev/null @@ -1,62 +0,0 @@ -package appeng.client.render.blocks; - -import java.util.EnumSet; - -import net.minecraft.client.renderer.RenderBlocks; -import net.minecraft.util.Icon; -import net.minecraft.world.IBlockAccess; -import net.minecraftforge.common.ForgeDirection; -import appeng.block.AEBaseBlock; -import appeng.client.render.BaseBlockRender; - -public class RenderCable extends BaseBlockRender -{ - - public void renderCableAt(double Thickness, IBlockAccess world, int x, int y, int z, AEBaseBlock block, RenderBlocks renderer, Icon texture, double pull, - EnumSet connections) - { - - if ( connections.contains( ForgeDirection.UNKNOWN ) ) - { - renderer.setRenderBounds( 0.5D - Thickness, 0.5D - Thickness, 0.5D - Thickness, 0.5D + Thickness, 0.5D + Thickness, 0.5D + Thickness ); - renderer.renderStandardBlock( block, x, y, z ); - } - - if ( connections.contains( ForgeDirection.WEST ) ) - { - renderer.setRenderBounds( 0.0D, 0.5D - Thickness, 0.5D - Thickness, 0.5D - Thickness - pull, 0.5D + Thickness, 0.5D + Thickness ); - renderer.renderStandardBlock( block, x, y, z ); - } - - if ( connections.contains( ForgeDirection.EAST ) ) - { - renderer.setRenderBounds( 0.5D + Thickness + pull, 0.5D - Thickness, 0.5D - Thickness, 1.0D, 0.5D + Thickness, 0.5D + Thickness ); - renderer.renderStandardBlock( block, x, y, z ); - } - - if ( connections.contains( ForgeDirection.NORTH ) ) - { - renderer.setRenderBounds( 0.5D - Thickness, 0.5D - Thickness, 0.0D, 0.5D + Thickness, 0.5D + Thickness, 0.5D - Thickness - pull ); - renderer.renderStandardBlock( block, x, y, z ); - } - - if ( connections.contains( ForgeDirection.SOUTH ) ) - { - renderer.setRenderBounds( 0.5D - Thickness, 0.5D - Thickness, 0.5D + Thickness + pull, 0.5D + Thickness, 0.5D + Thickness, 1.0D ); - renderer.renderStandardBlock( block, x, y, z ); - } - - if ( connections.contains( ForgeDirection.DOWN ) ) - { - renderer.setRenderBounds( 0.5D - Thickness, 0.0D, 0.5D - Thickness, 0.5D + Thickness, 0.5D - Thickness - pull, 0.5D + Thickness ); - renderer.renderStandardBlock( block, x, y, z ); - } - - if ( connections.contains( ForgeDirection.UP ) ) - { - renderer.setRenderBounds( 0.5D - Thickness, 0.5D + Thickness + pull, 0.5D - Thickness, 0.5D + Thickness, 1.0D, 0.5D + Thickness ); - renderer.renderStandardBlock( block, x, y, z ); - } - - } -} diff --git a/client/render/blocks/RenderQNB.java b/client/render/blocks/RenderQNB.java index 02c488219..99cff4ad8 100644 --- a/client/render/blocks/RenderQNB.java +++ b/client/render/blocks/RenderQNB.java @@ -4,17 +4,71 @@ import java.util.EnumSet; import net.minecraft.client.renderer.RenderBlocks; import net.minecraft.client.renderer.Tessellator; +import net.minecraft.item.Item; import net.minecraft.item.ItemStack; +import net.minecraft.util.Icon; import net.minecraft.world.IBlockAccess; import net.minecraftforge.common.ForgeDirection; import appeng.api.AEApi; +import appeng.api.util.AEItemDefinition; import appeng.block.AEBaseBlock; +import appeng.client.render.BaseBlockRender; import appeng.client.texture.ExtraTextures; import appeng.tile.qnb.TileQuantumBridge; -public class RenderQNB extends RenderCable +public class RenderQNB extends BaseBlockRender { + public void renderCableAt(double Thickness, IBlockAccess world, int x, int y, int z, AEBaseBlock block, RenderBlocks renderer, Icon texture, double pull, + EnumSet connections) + { + block.getRendererInstance().setTemporaryRenderIcon( texture ); + + if ( connections.contains( ForgeDirection.UNKNOWN ) ) + { + renderer.setRenderBounds( 0.5D - Thickness, 0.5D - Thickness, 0.5D - Thickness, 0.5D + Thickness, 0.5D + Thickness, 0.5D + Thickness ); + renderer.renderStandardBlock( block, x, y, z ); + } + + if ( connections.contains( ForgeDirection.WEST ) ) + { + renderer.setRenderBounds( 0.0D, 0.5D - Thickness, 0.5D - Thickness, 0.5D - Thickness - pull, 0.5D + Thickness, 0.5D + Thickness ); + renderer.renderStandardBlock( block, x, y, z ); + } + + if ( connections.contains( ForgeDirection.EAST ) ) + { + renderer.setRenderBounds( 0.5D + Thickness + pull, 0.5D - Thickness, 0.5D - Thickness, 1.0D, 0.5D + Thickness, 0.5D + Thickness ); + renderer.renderStandardBlock( block, x, y, z ); + } + + if ( connections.contains( ForgeDirection.NORTH ) ) + { + renderer.setRenderBounds( 0.5D - Thickness, 0.5D - Thickness, 0.0D, 0.5D + Thickness, 0.5D + Thickness, 0.5D - Thickness - pull ); + renderer.renderStandardBlock( block, x, y, z ); + } + + if ( connections.contains( ForgeDirection.SOUTH ) ) + { + renderer.setRenderBounds( 0.5D - Thickness, 0.5D - Thickness, 0.5D + Thickness + pull, 0.5D + Thickness, 0.5D + Thickness, 1.0D ); + renderer.renderStandardBlock( block, x, y, z ); + } + + if ( connections.contains( ForgeDirection.DOWN ) ) + { + renderer.setRenderBounds( 0.5D - Thickness, 0.0D, 0.5D - Thickness, 0.5D + Thickness, 0.5D - Thickness - pull, 0.5D + Thickness ); + renderer.renderStandardBlock( block, x, y, z ); + } + + if ( connections.contains( ForgeDirection.UP ) ) + { + renderer.setRenderBounds( 0.5D - Thickness, 0.5D + Thickness + pull, 0.5D - Thickness, 0.5D + Thickness, 1.0D, 0.5D + Thickness ); + renderer.renderStandardBlock( block, x, y, z ); + } + + block.getRendererInstance().setTemporaryRenderIcon( null ); + } + @Override public void renderInventory(AEBaseBlock block, ItemStack item, RenderBlocks renderer) { @@ -38,10 +92,15 @@ public class RenderQNB extends RenderCable { if ( tqb.isFormed() ) { - EnumSet sides = EnumSet.allOf( ForgeDirection.class ); - renderCableAt( 0.11D, world, x, y, z, block, renderer, block.getIcon( 0, 0 ), 0.141D, sides ); - renderCableAt( 0.188D, world, x, y, z, block, renderer, block.getIcon( 0, 0 ), 0.1875D, - EnumSet.complementOf( EnumSet.of( ForgeDirection.UNKNOWN ) ) ); + AEItemDefinition cabldef = AEApi.instance().parts().partCableGlass; + Item cable = cabldef.item(); + + AEItemDefinition ccabldef = AEApi.instance().parts().partCableCovered; + Item ccable = ccabldef.item(); + + EnumSet sides = tqb.getConnections(); + renderCableAt( 0.11D, world, x, y, z, block, renderer, cable.getIconIndex( cabldef.stack( 1 ) ), 0.141D, sides ); + renderCableAt( 0.188D, world, x, y, z, block, renderer, ccable.getIconIndex( ccabldef.stack( 1 ) ), 0.1875D, tqb.getConnections() ); } float px = 2.0f / 16.0f; @@ -63,8 +122,10 @@ public class RenderQNB extends RenderCable { // renderCableAt(0.11D, world, x, y, z, block, modelId, renderer, // AppEngTextureRegistry.Blocks.MECable.get(), true, 0.0D); - renderCableAt( 0.188D, world, x, y, z, block, renderer, ExtraTextures.BlockInterfaceAlternate.getIcon(), 0.05D, - EnumSet.complementOf( EnumSet.of( ForgeDirection.UNKNOWN ) ) ); + AEItemDefinition ccabldef = AEApi.instance().parts().partCableCovered; + Item ccable = ccabldef.item(); + + renderCableAt( 0.188D, world, x, y, z, block, renderer, ccable.getIconIndex( ccabldef.stack( 1 ) ), 0.05D, tqb.getConnections() ); float px = 4.0f / 16.0f; float maxpx = 12.0f / 16.0f; @@ -83,7 +144,7 @@ public class RenderQNB extends RenderCable Tessellator.instance.setColorOpaque_F( 1.0F, 1.0F, 1.0F ); Tessellator.instance.setBrightness( bn << 20 | bn << 4 ); for (ForgeDirection side : ForgeDirection.VALID_DIRECTIONS) - renderFace( x, y, z, block, block.getIcon( 0, 0 ), renderer, side ); + renderFace( x, y, z, block, ExtraTextures.BlockQRingCornerLight.getIcon(), renderer, side ); } } @@ -110,7 +171,7 @@ public class RenderQNB extends RenderCable Tessellator.instance.setColorOpaque_F( 1.0F, 1.0F, 1.0F ); Tessellator.instance.setBrightness( bn << 20 | bn << 4 ); for (ForgeDirection side : ForgeDirection.VALID_DIRECTIONS) - renderFace( x, y, z, block, block.getIcon( 0, 0 ), renderer, side ); + renderFace( x, y, z, block, ExtraTextures.BlockQRingEdgeLight.getIcon(), renderer, side ); } } } @@ -118,5 +179,4 @@ public class RenderQNB extends RenderCable renderer.renderAllFaces = false; return true; } - } diff --git a/client/render/blocks/RenderQuartzGlass.java b/client/render/blocks/RenderQuartzGlass.java index 6500eda7c..eaa64b665 100644 --- a/client/render/blocks/RenderQuartzGlass.java +++ b/client/render/blocks/RenderQuartzGlass.java @@ -1,5 +1,7 @@ package appeng.client.render.blocks; +import java.util.Random; + import net.minecraft.client.renderer.RenderBlocks; import net.minecraft.item.ItemStack; import net.minecraft.world.IBlockAccess; @@ -8,12 +10,23 @@ import appeng.api.AEApi; import appeng.block.AEBaseBlock; import appeng.client.render.BaseBlockRender; import appeng.client.texture.ExtraTextures; +import appeng.client.texture.OffsetIcon; public class RenderQuartzGlass extends BaseBlockRender { + static byte offsets[][][]; + public RenderQuartzGlass() { super( false, 0 ); + if ( offsets == null ) + { + Random r = new Random( 924 ); + offsets = new byte[10][10][10]; + for (int x = 0; x < 10; x++) + for (int y = 0; y < 10; y++) + r.nextBytes( offsets[x][y] ); + } } boolean isFlush(AEBaseBlock imb, IBlockAccess world, int x, int y, int z) @@ -113,7 +126,29 @@ public class RenderQuartzGlass extends BaseBlockRender { renderer.setRenderBounds( 0, 0, 0, 1, 1, 1 ); - renderer.overrideBlockTexture = imb.getIcon( 0, 0 ); + int cx = Math.abs( x % 10 ); + int cy = Math.abs( y % 10 ); + int cz = Math.abs( z % 10 ); + + int u = offsets[cx][cy][cz] % 4; + int v = offsets[9 - cx][9 - cy][9 - cz] % 4; + + switch (Math.abs( (offsets[cx][cy][cz] + (x + y + z)) % 4 )) + { + case 0: + renderer.overrideBlockTexture = new OffsetIcon( imb.getIcon( 0, 0 ), u / 2, v / 2 ); + break; + case 1: + renderer.overrideBlockTexture = new OffsetIcon( ExtraTextures.BlockQuartzGlassB.getIcon(), u / 2, v / 2 ); + break; + case 2: + renderer.overrideBlockTexture = new OffsetIcon( ExtraTextures.BlockQuartzGlassC.getIcon(), u, v ); + break; + case 3: + renderer.overrideBlockTexture = new OffsetIcon( ExtraTextures.BlockQuartzGlassD.getIcon(), u, v ); + break; + } + boolean result = renderer.renderStandardBlock( imb, x, y, z ); renderer.overrideBlockTexture = null; diff --git a/client/render/effects/EnergyFx.java b/client/render/effects/EnergyFx.java new file mode 100644 index 000000000..c0f5244a8 --- /dev/null +++ b/client/render/effects/EnergyFx.java @@ -0,0 +1,88 @@ +package appeng.client.render.effects; + +import net.minecraft.client.Minecraft; +import net.minecraft.client.particle.EntityBreakingFX; +import net.minecraft.client.renderer.Tessellator; +import net.minecraft.client.renderer.texture.TextureMap; +import net.minecraft.item.Item; +import net.minecraft.util.Icon; +import net.minecraft.world.World; +import net.minecraftforge.common.ForgeDirection; + +import org.lwjgl.opengl.GL11; + +import appeng.client.texture.ExtraTextures; +import cpw.mods.fml.relauncher.Side; +import cpw.mods.fml.relauncher.SideOnly; + +@SideOnly(Side.CLIENT) +public class EnergyFx extends EntityBreakingFX +{ + + private Icon particleTextureIndex; + + public EnergyFx(World par1World, double par2, double par4, double par6, Item par8Item) { + super( par1World, par2, par4, par6, par8Item ); + particleGravity = 0; + this.particleBlue = 255; + this.particleGreen = 255; + this.particleRed = 255; + this.particleAlpha = 1.4f; + this.particleScale = 3.5f; + this.particleTextureIndex = ExtraTextures.BlockEnergyParticle.getIcon(); + } + + public void fromItem(ForgeDirection d) + { + this.posX += 0.2 * d.offsetX; + this.posY += 0.2 * d.offsetY; + this.posZ += 0.2 * d.offsetZ; + this.particleScale *= 0.8f; + } + + public void onUpdate() + { + super.onUpdate(); + this.particleScale *= 0.89f; + this.particleAlpha *= 0.89f; + } + + public void renderParticle(Tessellator par1Tessellator, float par2, float par3, float par4, float par5, float par6, float par7) + { + + Minecraft.getMinecraft().getTextureManager().bindTexture( TextureMap.locationBlocksTexture ); + + GL11.glPushMatrix(); + GL11.glPushAttrib( GL11.GL_ALL_ATTRIB_BITS ); + GL11.glColor4f( 1.0F, 1.0F, 1.0F, 1.0F ); + + GL11.glDepthMask( false ); + GL11.glEnable( GL11.GL_BLEND ); + GL11.glBlendFunc( GL11.GL_SRC_ALPHA, GL11.GL_ONE_MINUS_SRC_ALPHA ); + GL11.glAlphaFunc( GL11.GL_GREATER, 0.003921569F ); + + float f6 = this.particleTextureIndex.getMinU(); + float f7 = this.particleTextureIndex.getMaxU(); + float f8 = this.particleTextureIndex.getMinV(); + float f9 = this.particleTextureIndex.getMaxV(); + float f10 = 0.1F * this.particleScale; + + float f11 = (float) (this.prevPosX + (this.posX - this.prevPosX) * (double) par2 - interpPosX); + float f12 = (float) (this.prevPosY + (this.posY - this.prevPosY) * (double) par2 - interpPosY); + float f13 = (float) (this.prevPosZ + (this.posZ - this.prevPosZ) * (double) par2 - interpPosZ); + float f14 = 1.0F; + + par1Tessellator.setColorRGBA_F( this.particleRed * f14, this.particleGreen * f14, this.particleBlue * f14, this.particleAlpha ); + par1Tessellator.addVertexWithUV( (double) (f11 - par3 * f10 - par6 * f10), (double) (f12 - par4 * f10), (double) (f13 - par5 * f10 - par7 * f10), + (double) f7, (double) f9 ); + par1Tessellator.addVertexWithUV( (double) (f11 - par3 * f10 + par6 * f10), (double) (f12 + par4 * f10), (double) (f13 - par5 * f10 + par7 * f10), + (double) f7, (double) f8 ); + par1Tessellator.addVertexWithUV( (double) (f11 + par3 * f10 + par6 * f10), (double) (f12 + par4 * f10), (double) (f13 + par5 * f10 + par7 * f10), + (double) f6, (double) f8 ); + par1Tessellator.addVertexWithUV( (double) (f11 + par3 * f10 - par6 * f10), (double) (f12 - par4 * f10), (double) (f13 + par5 * f10 - par7 * f10), + (double) f6, (double) f9 ); + GL11.glPopAttrib(); + GL11.glPopMatrix(); + } + +} diff --git a/client/texture/CableBusTextures.java b/client/texture/CableBusTextures.java index 2d247ebaf..590482eef 100644 --- a/client/texture/CableBusTextures.java +++ b/client/texture/CableBusTextures.java @@ -50,6 +50,11 @@ public enum CableBusTextures "MECable_Purple"), MECable_Red("MECable_Red"), MECable_White("MECable_White"), MECable_Yellow("MECable_Yellow"), MECable_Black("MECable_Black"), MECable_Blue( "MECable_Blue"), MECable_Brown("MECable_Brown"), MECable_Cyan("MECable_Cyan"), + MEDense_Black("MEDense_Black"), MEDense_Blue("MEDense_Blue"), MEDense_Brown("MEDense_Brown"), MEDense_Cyan("MEDense_Cyan"), MEDense_Gray("MEDense_Gray"), MEDense_Green( + "MEDense_Green"), MEDense_LightBlue("MEDense_LightBlue"), MEDense_LightGrey("MEDense_LightGrey"), MEDense_Lime("MEDense_Lime"), MEDense_Magenta( + "MEDense_Magenta"), MEDense_Orange("MEDense_Orange"), MEDense_Pink("MEDense_Pink"), MEDense_Purple("MEDense_Purple"), MEDense_Red("MEDense_Red"), MEDense_White( + "MEDense_White"), MEDense_Yellow("MEDense_Yellow"), + MESmart_Black("MESmart_Black"), MESmart_Blue("MESmart_Blue"), MESmart_Brown("MESmart_Brown"), MESmart_Cyan("MESmart_Cyan"), MESmart_Gray("MESmart_Gray"), MESmart_Green( "MESmart_Green"), MESmart_LightBlue("MESmart_LightBlue"), MESmart_LightGrey("MESmart_LightGrey"), MESmart_Lime("MESmart_Lime"), MESmart_Magenta( "MESmart_Magenta"), MESmart_Orange("MESmart_Orange"), MESmart_Pink("MESmart_Pink"), MESmart_Purple("MESmart_Purple"), MESmart_Red("MESmart_Red"), MESmart_White( diff --git a/client/texture/ExtraTextures.java b/client/texture/ExtraTextures.java index 99531e2f2..903dfd5b9 100644 --- a/client/texture/ExtraTextures.java +++ b/client/texture/ExtraTextures.java @@ -32,6 +32,8 @@ public enum ExtraTextures GlassFrame("BlockQuartzGlassFrame"), + BlockQRingCornerLight("BlockQRingCornerLight"), BlockQRingEdgeLight("BlockQRingEdgeLight"), + MEDenseEnergyCell0("BlockDenseEnergyCell0"), MEDenseEnergyCell1("BlockDenseEnergyCell1"), MEDenseEnergyCell2("BlockDenseEnergyCell2"), MEDenseEnergyCell3( "BlockDenseEnergyCell3"), MEDenseEnergyCell4("BlockDenseEnergyCell4"), MEDenseEnergyCell5("BlockDenseEnergyCell5"), MEDenseEnergyCell6( "BlockDenseEnergyCell6"), MEDenseEnergyCell7("BlockDenseEnergyCell7"), @@ -44,6 +46,8 @@ public enum ExtraTextures BlockSpatialPylonC("BlockSpatialPylon_spanned"), BlockSpatialPylonC_dim("BlockSpatialPylon_spanned_dim"), BlockSpatialPylonC_red( "BlockSpatialPylon_spanned_red"), + BlockQuartzGlassB("BlockQuartzGlassB"), BlockQuartzGlassC("BlockQuartzGlassC"), BlockQuartzGlassD("BlockQuartzGlassD"), + BlockSpatialPylonE("BlockSpatialPylon_end"), BlockSpatialPylonE_dim("BlockSpatialPylon_end_dim"), BlockSpatialPylonE_red("BlockSpatialPylon_end_red"); final private String name; diff --git a/container/AEBaseContainer.java b/container/AEBaseContainer.java index a37fa2da1..5bd784e30 100644 --- a/container/AEBaseContainer.java +++ b/container/AEBaseContainer.java @@ -66,6 +66,11 @@ public abstract class AEBaseContainer extends Container return ((AppEngSlot) s).isDraggable; } + public InventoryPlayer getPlayerInv() + { + return invPlayer; + } + public TileEntity getTileEntity() { return tileEntity; diff --git a/container/implementations/ContainerCellWorkbench.java b/container/implementations/ContainerCellWorkbench.java new file mode 100644 index 000000000..3717a8be9 --- /dev/null +++ b/container/implementations/ContainerCellWorkbench.java @@ -0,0 +1,290 @@ +package appeng.container.implementations; + +import java.util.Iterator; + +import net.minecraft.entity.player.EntityPlayer; +import net.minecraft.entity.player.EntityPlayerMP; +import net.minecraft.entity.player.InventoryPlayer; +import net.minecraft.inventory.ICrafting; +import net.minecraft.inventory.IInventory; +import net.minecraft.item.ItemStack; +import appeng.api.AEApi; +import appeng.api.config.FuzzyMode; +import appeng.api.storage.ICellWorkbenchItem; +import appeng.api.storage.IMEInventory; +import appeng.api.storage.StorageChannel; +import appeng.api.storage.data.IAEItemStack; +import appeng.api.storage.data.IItemList; +import appeng.container.slot.OptionalSlotRestrictedInput; +import appeng.container.slot.SlotFakeTypeOnly; +import appeng.container.slot.SlotRestrictedInput; +import appeng.container.slot.SlotRestrictedInput.PlaceableItemType; +import appeng.tile.inventory.AppEngNullInventory; +import appeng.tile.misc.TileCellWorkbench; +import appeng.util.Platform; +import appeng.util.item.ItemList; +import appeng.util.iterators.NullIterator; + +public class ContainerCellWorkbench extends ContainerUpgradeable +{ + + TileCellWorkbench workBench; + AppEngNullInventory ni = new AppEngNullInventory(); + + public IInventory getCellUpgradeInventory() + { + IInventory ri = workBench.getCellUpgradeInventory(); + return ri == null ? ni : ri; + } + + public void setFuzzy(FuzzyMode valueOf) + { + ICellWorkbenchItem cwi = workBench.getCell(); + if ( cwi != null ) + cwi.setFuzzyMode( workBench.getInventoryByName( "cell" ).getStackInSlot( 0 ), valueOf ); + } + + private FuzzyMode getFuzzyMode() + { + ICellWorkbenchItem cwi = workBench.getCell(); + if ( cwi != null ) + return cwi.getFuzzyMode( workBench.getInventoryByName( "cell" ).getStackInSlot( 0 ) ); + return FuzzyMode.IGNORE_ALL; + } + + class Upgrades implements IInventory + { + + @Override + public int getSizeInventory() + { + return getCellUpgradeInventory().getSizeInventory(); + } + + @Override + public ItemStack getStackInSlot(int i) + { + return getCellUpgradeInventory().getStackInSlot( i ); + } + + @Override + public ItemStack decrStackSize(int i, int j) + { + IInventory inv = getCellUpgradeInventory(); + ItemStack is = inv.decrStackSize( i, j ); + inv.onInventoryChanged(); + return is; + } + + @Override + public ItemStack getStackInSlotOnClosing(int i) + { + IInventory inv = getCellUpgradeInventory(); + ItemStack is = inv.getStackInSlotOnClosing( i ); + inv.onInventoryChanged(); + return is; + } + + @Override + public void setInventorySlotContents(int i, ItemStack itemstack) + { + IInventory inv = getCellUpgradeInventory(); + inv.setInventorySlotContents( i, itemstack ); + inv.onInventoryChanged(); + } + + @Override + public String getInvName() + { + return "Upgrades"; + } + + @Override + public boolean isInvNameLocalized() + { + return false; + } + + @Override + public int getInventoryStackLimit() + { + return 1; + } + + @Override + public void onInventoryChanged() + { + + } + + @Override + public boolean isUseableByPlayer(EntityPlayer entityplayer) + { + return false; + } + + @Override + public void openChest() + { + } + + @Override + public void closeChest() + { + } + + @Override + public boolean isItemValidForSlot(int i, ItemStack itemstack) + { + return getCellUpgradeInventory().isItemValidForSlot( i, itemstack ); + } + }; + + IInventory UpgradeInventoryWrapper; + + ItemStack prevStack = null; + int lastUpgrades = 0; + + public ContainerCellWorkbench(InventoryPlayer ip, TileCellWorkbench te) { + super( ip, te ); + workBench = te; + } + + @Override + protected int getHeight() + { + return 251; + } + + @Override + public int availableUpgrades() + { + ItemStack is = workBench.getInventoryByName( "cell" ).getStackInSlot( 0 ); + if ( prevStack != is ) + { + prevStack = is; + return lastUpgrades = getCellUpgradeInventory().getSizeInventory(); + } + return lastUpgrades; + } + + @Override + public boolean isSlotEnabled(int idx) + { + return idx < availableUpgrades(); + } + + @Override + protected void setupConfig() + { + int x = 8; + int y = 29; + int offset = 0; + + IInventory cell = myte.getInventoryByName( "cell" ); + addSlotToContainer( new SlotRestrictedInput( PlaceableItemType.WORKBENCH_CELL, cell, 0, 152, 8 ) ); + + IInventory inv = myte.getInventoryByName( "config" ); + UpgradeInventoryWrapper = new Upgrades();// Platform.isServer() ? new Upgrades() : new AppEngInternalInventory( + // null, 3 * 8 ); + + for (int w = 0; w < 7; w++) + for (int z = 0; z < 9; z++) + addSlotToContainer( new SlotFakeTypeOnly( inv, offset++, x + z * 18, y + w * 18 ) ); + + for (int zz = 0; zz < 3; zz++) + for (int z = 0; z < 8; z++) + { + int iSLot = zz * 8 + z; + addSlotToContainer( new OptionalSlotRestrictedInput( PlaceableItemType.UPGRADES, UpgradeInventoryWrapper, this, iSLot, 187 + zz * 18, + 8 + 18 * z, iSLot ) ); + } + /* + * if ( supportCapacity() ) { for (int w = 0; w < 2; w++) for (int z = 0; z < 9; z++) addSlotToContainer( new + * OptionalSlotFakeTypeOnly( inv, this, offset++, x, y, z, w, 1 ) ); + * + * for (int w = 0; w < 2; w++) for (int z = 0; z < 9; z++) addSlotToContainer( new OptionalSlotFakeTypeOnly( + * inv, this, offset++, x, y, z, w + 2, 2 ) ); + * + * for (int w = 0; w < 2; w++) for (int z = 0; z < 9; z++) addSlotToContainer( new OptionalSlotFakeTypeOnly( + * inv, this, offset++, x, y, z, w + 4, 3 ) ); } + */ + } + + ItemStack LastCell; + + @Override + public void detectAndSendChanges() + { + ItemStack is = workBench.getInventoryByName( "cell" ).getStackInSlot( 0 ); + if ( Platform.isServer() ) + { + for (int i = 0; i < this.crafters.size(); ++i) + { + ICrafting icrafting = (ICrafting) this.crafters.get( i ); + + if ( this.fzMode != getFuzzyMode() ) + { + icrafting.sendProgressBarUpdate( this, 1, (int) getFuzzyMode().ordinal() ); + } + + if ( prevStack != is ) + { + // if the bars changed an item was probably made, so just send shit! + for (Object s : inventorySlots) + { + if ( s instanceof OptionalSlotRestrictedInput ) + { + OptionalSlotRestrictedInput sri = (OptionalSlotRestrictedInput) s; + icrafting.sendSlotContents( this, sri.slotNumber, sri.getStack() ); + } + } + ((EntityPlayerMP) icrafting).playerInventoryBeingManipulated = false; + } + } + + this.fzMode = (FuzzyMode) getFuzzyMode(); + } + + prevStack = is; + standardDetectAndSendChanges(); + } + + public void clear() + { + IInventory inv = myte.getInventoryByName( "config" ); + for (int x = 0; x < inv.getSizeInventory(); x++) + inv.setInventorySlotContents( x, null ); + detectAndSendChanges(); + } + + public void partition() + { + IInventory inv = myte.getInventoryByName( "config" ); + + IMEInventory cellInv = AEApi.instance().registries().cell() + .getCellInventory( myte.getInventoryByName( "cell" ).getStackInSlot( 0 ), StorageChannel.ITEMS ); + + Iterator i = new NullIterator(); + if ( cellInv != null ) + { + IItemList list = cellInv.getAvailableItems( new ItemList() ); + i = list.iterator(); + } + + for (int x = 0; x < inv.getSizeInventory(); x++) + { + if ( i.hasNext() ) + { + ItemStack g = i.next().getItemStack(); + g.stackSize = 1; + inv.setInventorySlotContents( x, g ); + } + else + inv.setInventorySlotContents( x, null ); + } + + detectAndSendChanges(); + } + +} diff --git a/container/implementations/ContainerCondenser.java b/container/implementations/ContainerCondenser.java index 53c46f1b7..149e91a0c 100644 --- a/container/implementations/ContainerCondenser.java +++ b/container/implementations/ContainerCondenser.java @@ -6,11 +6,11 @@ import net.minecraft.inventory.ICrafting; import appeng.api.config.CondenserOuput; import appeng.api.config.Settings; import appeng.container.AEBaseContainer; +import appeng.container.slot.SlotOutput; import appeng.container.slot.SlotRestrictedInput; import appeng.container.slot.SlotRestrictedInput.PlaceableItemType; import appeng.tile.misc.TileCondenser; import appeng.util.Platform; -import buildcraft.core.gui.slots.SlotOutput; import cpw.mods.fml.relauncher.Side; import cpw.mods.fml.relauncher.SideOnly; @@ -24,7 +24,7 @@ public class ContainerCondenser extends AEBaseContainer myte = te; addSlotToContainer( new SlotRestrictedInput( PlaceableItemType.TRASH, te, 0, 51, 52 ) ); - addSlotToContainer( new SlotOutput( te, 1, 105, 52 ) ); + addSlotToContainer( new SlotOutput( te, 1, 105, 52, 15 + 16 * 8 ) ); addSlotToContainer( (new SlotRestrictedInput( PlaceableItemType.STORAGE_COMPONENT, te.getInternalInventory(), 2, 101, 26 )).setStackLimit( 1 ) ); bindPlayerInventory( ip, 0, 197 - /* height of playerinventory */82 ); diff --git a/container/implementations/ContainerIOPort.java b/container/implementations/ContainerIOPort.java new file mode 100644 index 000000000..20e1f1755 --- /dev/null +++ b/container/implementations/ContainerIOPort.java @@ -0,0 +1,115 @@ +package appeng.container.implementations; + +import net.minecraft.entity.player.InventoryPlayer; +import net.minecraft.inventory.ICrafting; +import net.minecraft.inventory.IInventory; +import appeng.api.config.FullnessMode; +import appeng.api.config.OperationMode; +import appeng.api.config.RedstoneMode; +import appeng.api.config.Settings; +import appeng.container.slot.SlotOutput; +import appeng.container.slot.SlotRestrictedInput; +import appeng.container.slot.SlotRestrictedInput.PlaceableItemType; +import appeng.tile.storage.TileIOPort; +import appeng.util.Platform; + +public class ContainerIOPort extends ContainerUpgradeable +{ + + TileIOPort ioPort; + public OperationMode opMode = OperationMode.EMPTY; + public FullnessMode fMode = FullnessMode.EMPTY; + + public ContainerIOPort(InventoryPlayer ip, TileIOPort te) { + super( ip, te ); + ioPort = te; + } + + @Override + protected int getHeight() + { + return 166; + } + + @Override + public int availableUpgrades() + { + return 3; + } + + @Override + protected boolean supportCapacity() + { + return false; + } + + @Override + protected void setupConfig() + { + int offx = 19; + int offy = 17; + + IInventory cells = myte.getInventoryByName( "cells" ); + + for (int y = 0; y < 3; y++) + for (int x = 0; x < 2; x++) + addSlotToContainer( new SlotRestrictedInput( PlaceableItemType.STORAGE_CELLS, cells, x + y * 2, offx + x * 18, offy + y * 18 ) ); + + offx = 122; + offy = 17; + for (int y = 0; y < 3; y++) + for (int x = 0; x < 2; x++) + addSlotToContainer( new SlotOutput( cells, 6 + x + y * 2, offx + x * 18, offy + y * 18, PlaceableItemType.STORAGE_CELLS.icon ) ); + + IInventory upgrades = myte.getInventoryByName( "upgrades" ); + addSlotToContainer( (new SlotRestrictedInput( PlaceableItemType.UPGRADES, upgrades, 0, 187, 8 + 18 * 0 )).setNotDraggable() ); + addSlotToContainer( (new SlotRestrictedInput( PlaceableItemType.UPGRADES, upgrades, 1, 187, 8 + 18 * 1 )).setNotDraggable() ); + addSlotToContainer( (new SlotRestrictedInput( PlaceableItemType.UPGRADES, upgrades, 2, 187, 8 + 18 * 2 )).setNotDraggable() ); + } + + @Override + public void detectAndSendChanges() + { + if ( Platform.isServer() ) + { + for (int i = 0; i < this.crafters.size(); ++i) + { + ICrafting icrafting = (ICrafting) this.crafters.get( i ); + + if ( this.rsMode != this.myte.getConfigManager().getSetting( Settings.REDSTONE_CONTROLLED ) ) + { + icrafting.sendProgressBarUpdate( this, 0, (int) this.myte.getConfigManager().getSetting( Settings.REDSTONE_CONTROLLED ).ordinal() ); + } + + if ( this.fMode != this.myte.getConfigManager().getSetting( Settings.FULLNESS_MODE ) ) + { + icrafting.sendProgressBarUpdate( this, 2, (int) this.myte.getConfigManager().getSetting( Settings.FULLNESS_MODE ).ordinal() ); + } + + if ( this.opMode != this.myte.getConfigManager().getSetting( Settings.OPERATION_MODE ) ) + { + icrafting.sendProgressBarUpdate( this, 3, (int) this.myte.getConfigManager().getSetting( Settings.OPERATION_MODE ).ordinal() ); + } + } + + this.opMode = (OperationMode) myte.getConfigManager().getSetting( Settings.OPERATION_MODE ); + this.fMode = (FullnessMode) this.myte.getConfigManager().getSetting( Settings.FULLNESS_MODE ); + this.rsMode = (RedstoneMode) this.myte.getConfigManager().getSetting( Settings.REDSTONE_CONTROLLED ); + } + + standardDetectAndSendChanges(); + } + + @Override + public void updateProgressBar(int idx, int value) + { + super.updateProgressBar( idx, value ); + + if ( idx == 2 ) + this.fMode = FullnessMode.values()[value]; + + if ( idx == 3 ) + this.opMode = OperationMode.values()[value]; + } + +} diff --git a/container/implementations/ContainerLevelEmitter.java b/container/implementations/ContainerLevelEmitter.java index 5bbf226c4..7856cf318 100644 --- a/container/implementations/ContainerLevelEmitter.java +++ b/container/implementations/ContainerLevelEmitter.java @@ -4,15 +4,19 @@ import net.minecraft.client.gui.GuiTextField; import net.minecraft.entity.player.EntityPlayer; import net.minecraft.entity.player.InventoryPlayer; import net.minecraft.inventory.ICrafting; +import net.minecraft.inventory.IInventory; import appeng.api.config.FuzzyMode; import appeng.api.config.RedstoneMode; import appeng.api.config.Settings; +import appeng.container.slot.SlotFakeTypeOnly; +import appeng.container.slot.SlotRestrictedInput; +import appeng.container.slot.SlotRestrictedInput.PlaceableItemType; import appeng.parts.automation.PartLevelEmitter; import appeng.util.Platform; import cpw.mods.fml.relauncher.Side; import cpw.mods.fml.relauncher.SideOnly; -public class ContainerLevelEmitter extends ContainerBus +public class ContainerLevelEmitter extends ContainerUpgradeable { PartLevelEmitter lvlEmitter; @@ -33,7 +37,7 @@ public class ContainerLevelEmitter extends ContainerBus } @Override - protected int availableUpgrades() + public int availableUpgrades() { return 1; @@ -53,6 +57,26 @@ public class ContainerLevelEmitter extends ContainerBus EmitterValue = newValue; } + @Override + protected void setupConfig() + { + int x = 80 + 34; + int y = 40; + + IInventory upgrades = myte.getInventoryByName( "upgrades" ); + if ( availableUpgrades() > 0 ) + addSlotToContainer( (new SlotRestrictedInput( PlaceableItemType.UPGRADES, upgrades, 0, 187, 8 + 18 * 0 )).setNotDraggable() ); + if ( availableUpgrades() > 1 ) + addSlotToContainer( (new SlotRestrictedInput( PlaceableItemType.UPGRADES, upgrades, 1, 187, 8 + 18 * 1 )).setNotDraggable() ); + if ( availableUpgrades() > 2 ) + addSlotToContainer( (new SlotRestrictedInput( PlaceableItemType.UPGRADES, upgrades, 2, 187, 8 + 18 * 2 )).setNotDraggable() ); + if ( availableUpgrades() > 3 ) + addSlotToContainer( (new SlotRestrictedInput( PlaceableItemType.UPGRADES, upgrades, 3, 187, 8 + 18 * 3 )).setNotDraggable() ); + + IInventory inv = myte.getInventoryByName( "config" ); + addSlotToContainer( new SlotFakeTypeOnly( inv, 0, x, y ) ); + } + @Override public void detectAndSendChanges() { diff --git a/container/implementations/ContainerMEMonitorable.java b/container/implementations/ContainerMEMonitorable.java index 991d06470..2eebb0003 100644 --- a/container/implementations/ContainerMEMonitorable.java +++ b/container/implementations/ContainerMEMonitorable.java @@ -22,6 +22,7 @@ import appeng.api.storage.data.IAEItemStack; import appeng.api.storage.data.IItemList; import appeng.container.AEBaseContainer; import appeng.core.sync.packets.PacketMEInventoryUpdate; +import appeng.helpers.ICellItemViewer; import appeng.util.Platform; import appeng.util.item.ItemList; import cpw.mods.fml.common.network.PacketDispatcher; @@ -42,7 +43,10 @@ public class ContainerMEMonitorable extends AEBaseContainer implements IMEMonito monitor.addListener( this, null ); cellInv = monitor; - if ( montiorable instanceof IMEChest ) + + if ( montiorable instanceof ICellItemViewer ) + powerSrc = (ICellItemViewer) montiorable; + else if ( montiorable instanceof IMEChest ) powerSrc = (IMEChest) montiorable; else if ( montiorable instanceof IGridHost ) { @@ -120,8 +124,18 @@ public class ContainerMEMonitorable extends AEBaseContainer implements IMEMonito PacketMEInventoryUpdate piu = new PacketMEInventoryUpdate(); IItemList monitorCache = monitor.getStorageList(); + int items = 0; for (IAEItemStack send : monitorCache) { + if ( items > 2000 ) + { + items = 0; + Packet p = piu.getPacket(); + PacketDispatcher.sendPacketToPlayer( p, (Player) c ); + piu = new PacketMEInventoryUpdate(); + } + + items++; piu.appendItem( send ); } diff --git a/container/implementations/ContainerMEPortableCell.java b/container/implementations/ContainerMEPortableCell.java new file mode 100644 index 000000000..02c46e338 --- /dev/null +++ b/container/implementations/ContainerMEPortableCell.java @@ -0,0 +1,50 @@ +package appeng.container.implementations; + +import net.minecraft.entity.player.InventoryPlayer; +import net.minecraft.item.ItemStack; +import appeng.api.config.Actionable; +import appeng.api.config.PowerMultiplier; +import appeng.api.storage.IStorageMonitorable; +import appeng.helpers.ICellItemViewer; +import appeng.util.Platform; + +public class ContainerMEPortableCell extends ContainerMEMonitorable +{ + + ICellItemViewer civ; + + public ContainerMEPortableCell(InventoryPlayer ip, ICellItemViewer montiorable) { + super( ip, (IStorageMonitorable) montiorable ); + civ = montiorable; + } + + int ticks = 0; + + @Override + public void detectAndSendChanges() + { + ItemStack currentItem = getPlayerInv().getCurrentItem(); + + if ( currentItem != civ.getItemStack() ) + { + if ( currentItem != null ) + { + if ( Platform.isSameItem( civ.getItemStack(), currentItem ) ) + getPlayerInv().setInventorySlotContents( getPlayerInv().currentItem, civ.getItemStack() ); + else + getPlayerInv().player.closeScreen(); + } + else + getPlayerInv().player.closeScreen(); + } + + // drain 1 ae t + ticks++; + if ( ticks > 10 ) + { + civ.extractAEPower( 0.5 * (double) ticks, Actionable.MODULATE, PowerMultiplier.CONFIG ); + ticks = 0; + } + super.detectAndSendChanges(); + } +} diff --git a/container/implementations/ContainerQNB.java b/container/implementations/ContainerQNB.java new file mode 100644 index 000000000..590b2f944 --- /dev/null +++ b/container/implementations/ContainerQNB.java @@ -0,0 +1,23 @@ +package appeng.container.implementations; + +import net.minecraft.entity.player.InventoryPlayer; +import appeng.container.AEBaseContainer; +import appeng.container.slot.SlotRestrictedInput; +import appeng.container.slot.SlotRestrictedInput.PlaceableItemType; +import appeng.tile.qnb.TileQuantumBridge; + +public class ContainerQNB extends AEBaseContainer +{ + + TileQuantumBridge myte; + + public ContainerQNB(InventoryPlayer ip, TileQuantumBridge te) { + super( ip, te, null ); + myte = te; + + addSlotToContainer( (new SlotRestrictedInput( PlaceableItemType.QE_SINGULARTIY, te, 0, 80, 37 )).setStackLimit( 1 ) ); + + bindPlayerInventory( ip, 0, 166 - /* height of playerinventory */82 ); + } + +} diff --git a/container/implementations/ContainerBus.java b/container/implementations/ContainerUpgradeable.java similarity index 92% rename from container/implementations/ContainerBus.java rename to container/implementations/ContainerUpgradeable.java index 56902316e..0c054cfce 100644 --- a/container/implementations/ContainerBus.java +++ b/container/implementations/ContainerUpgradeable.java @@ -22,16 +22,34 @@ import appeng.util.Platform; import cpw.mods.fml.relauncher.Side; import cpw.mods.fml.relauncher.SideOnly; -public class ContainerBus extends AEBaseContainer implements IOptionalSlotHost +public class ContainerUpgradeable extends AEBaseContainer implements IOptionalSlotHost { IBusCommon myte; IInventory toolbox = new AppEngInternalInventory( null, 9 ); - public ContainerBus(InventoryPlayer ip, IBusCommon te) { + public ContainerUpgradeable(InventoryPlayer ip, IBusCommon te) { super( ip, (TileEntity) (te instanceof TileEntity ? te : null), (IPart) (te instanceof IPart ? te : null) ); myte = te; + if ( hasToolbox() ) + { + for (int v = 0; v < 3; v++) + for (int u = 0; u < 3; u++) + addSlotToContainer( (new SlotRestrictedInput( PlaceableItemType.UPGRADES, toolbox, u + v * 3, 186 + u * 18, getHeight() - 82 + v * 18 )) + .setPlayerSide() ); + } + + setupConfig(); + + bindPlayerInventory( ip, 0, getHeight() - /* height of playerinventory */82 ); + } + + protected void setupConfig() + { + int x = 80; + int y = 40; + IInventory upgrades = myte.getInventoryByName( "upgrades" ); if ( availableUpgrades() > 0 ) addSlotToContainer( (new SlotRestrictedInput( PlaceableItemType.UPGRADES, upgrades, 0, 187, 8 + 18 * 0 )).setNotDraggable() ); @@ -42,16 +60,6 @@ public class ContainerBus extends AEBaseContainer implements IOptionalSlotHost if ( availableUpgrades() > 3 ) addSlotToContainer( (new SlotRestrictedInput( PlaceableItemType.UPGRADES, upgrades, 3, 187, 8 + 18 * 3 )).setNotDraggable() ); - if ( hasToolbox() ) - { - for (int v = 0; v < 3; v++) - for (int u = 0; u < 3; u++) - addSlotToContainer( (new SlotRestrictedInput( PlaceableItemType.UPGRADES, toolbox, u + v * 3, 186 + u * 18, 102 + v * 18 )).setPlayerSide() ); - } - - int x = 80; - int y = 40; - IInventory inv = myte.getInventoryByName( "config" ); addSlotToContainer( new SlotFakeTypeOnly( inv, 0, x, y ) ); @@ -67,8 +75,6 @@ public class ContainerBus extends AEBaseContainer implements IOptionalSlotHost addSlotToContainer( new OptionalSlotFakeTypeOnly( inv, this, 7, x, y, -1, 1, 2 ) ); addSlotToContainer( new OptionalSlotFakeTypeOnly( inv, this, 8, x, y, 1, 1, 2 ) ); } - - bindPlayerInventory( ip, 0, getHeight() - /* height of playerinventory */82 ); } protected int getHeight() @@ -76,7 +82,7 @@ public class ContainerBus extends AEBaseContainer implements IOptionalSlotHost return 184; } - protected int availableUpgrades() + public int availableUpgrades() { return 4; } @@ -151,7 +157,7 @@ public class ContainerBus extends AEBaseContainer implements IOptionalSlotHost } @Override - public boolean isSlotEnabled(int idx, OptionalSlotFake osf) + public boolean isSlotEnabled(int idx) { int upgrades = myte.getInstalledUpgrades( Upgrades.CAPACITY ); diff --git a/container/slot/AppEngSlot.java b/container/slot/AppEngSlot.java index 985682b75..62b796935 100644 --- a/container/slot/AppEngSlot.java +++ b/container/slot/AppEngSlot.java @@ -70,6 +70,9 @@ public class AppEngSlot extends Slot if ( !isEnabled() ) return null; + if ( inventory.getSizeInventory() <= getSlotIndex() ) + return null; + if ( isDisplay ) { isDisplay = false; diff --git a/container/slot/IOptionalSlotHost.java b/container/slot/IOptionalSlotHost.java index 40f78b9ff..75db04bb2 100644 --- a/container/slot/IOptionalSlotHost.java +++ b/container/slot/IOptionalSlotHost.java @@ -3,6 +3,6 @@ package appeng.container.slot; public interface IOptionalSlotHost { - boolean isSlotEnabled(int idx, OptionalSlotFake osf); + boolean isSlotEnabled(int idx); } diff --git a/container/slot/OptionalSlotFake.java b/container/slot/OptionalSlotFake.java index 26629b77f..f5b56cd03 100644 --- a/container/slot/OptionalSlotFake.java +++ b/container/slot/OptionalSlotFake.java @@ -40,7 +40,7 @@ public class OptionalSlotFake extends SlotFake if ( host == null ) return false; - return host.isSlotEnabled( groupNum, this ); + return host.isSlotEnabled( groupNum ); } } diff --git a/container/slot/OptionalSlotNormal.java b/container/slot/OptionalSlotNormal.java new file mode 100644 index 000000000..79bef55c5 --- /dev/null +++ b/container/slot/OptionalSlotNormal.java @@ -0,0 +1,26 @@ +package appeng.container.slot; + +import net.minecraft.inventory.IInventory; + +public class OptionalSlotNormal extends AppEngSlot +{ + + final int groupNum; + IOptionalSlotHost host; + + public OptionalSlotNormal(IInventory inv, IOptionalSlotHost containerBus, int slot, int xPos, int yPos, int groupNum) { + super( inv, slot, xPos, yPos ); + this.groupNum = groupNum; + host = containerBus; + } + + @Override + public boolean isEnabled() + { + if ( host == null ) + return false; + + return host.isSlotEnabled( groupNum ); + } + +} diff --git a/container/slot/OptionalSlotRestrictedInput.java b/container/slot/OptionalSlotRestrictedInput.java new file mode 100644 index 000000000..be730297e --- /dev/null +++ b/container/slot/OptionalSlotRestrictedInput.java @@ -0,0 +1,26 @@ +package appeng.container.slot; + +import net.minecraft.inventory.IInventory; + +public class OptionalSlotRestrictedInput extends SlotRestrictedInput +{ + + final int groupNum; + IOptionalSlotHost host; + + public OptionalSlotRestrictedInput(PlaceableItemType valid, IInventory i, IOptionalSlotHost host, int slotnum, int x, int y, int grpNum) { + super( valid, i, slotnum, x, y ); + this.groupNum = grpNum; + this.host = host; + } + + @Override + public boolean isEnabled() + { + if ( host == null ) + return false; + + return host.isSlotEnabled( groupNum ); + } + +} diff --git a/container/slot/SlotRestrictedInput.java b/container/slot/SlotRestrictedInput.java index 044b62f70..2ebdb55b5 100644 --- a/container/slot/SlotRestrictedInput.java +++ b/container/slot/SlotRestrictedInput.java @@ -12,6 +12,7 @@ import appeng.api.implementations.ICraftingPatternItem; import appeng.api.implementations.ISpatialStorageCell; import appeng.api.implementations.IStorageComponent; import appeng.api.implementations.IUpgradeModule; +import appeng.api.storage.ICellWorkbenchItem; import appeng.util.Platform; public class SlotRestrictedInput extends AppEngSlot @@ -21,7 +22,7 @@ public class SlotRestrictedInput extends AppEngSlot { STORAGE_CELLS(15), ORE(1 * 16 + 15), STORAGE_COMPONENT(3 * 16 + 15), WIRELESS_TERMINAL(4 * 16 + 15), TRASH(5 * 16 + 15), VALID_ENCODED_PATTERN_W_OUPUT( 7 * 16 + 15), ENCODED_PATTERN_W_OUTPUT(7 * 16 + 15), ENCODED_PATTERN(7 * 16 + 15), BLANK_PATTERN(8 * 16 + 15), POWERED_TOOL(9 * 16 + 15), RANGE_BOOSTER( - 6 * 16 + 15), QE_SINGULARTIY(10 * 16 + 15), SPATIAL_STORAGE_CELLS(11 * 16 + 15), FUEL(12 * 16 + 15), UPGRADES(13 * 16 + 15); + 6 * 16 + 15), QE_SINGULARTIY(10 * 16 + 15), SPATIAL_STORAGE_CELLS(11 * 16 + 15), FUEL(12 * 16 + 15), UPGRADES(13 * 16 + 15), WORKBENCH_CELL(15); public final int icon; @@ -126,6 +127,8 @@ public class SlotRestrictedInput extends AppEngSlot return i.getItem() instanceof ISpatialStorageCell && ((ISpatialStorageCell) i.getItem()).isSpatialStorage( i ); case STORAGE_CELLS: return AEApi.instance().registries().cell().isCellHandled( i ); + case WORKBENCH_CELL: + return i != null && i.getItem() instanceof ICellWorkbenchItem && ((ICellWorkbenchItem) i.getItem()).isEditable( i ); case STORAGE_COMPONENT: boolean isComp = i.getItem() instanceof IStorageComponent && ((IStorageComponent) i.getItem()).isStorageComponent( i ); return isComp; diff --git a/core/Configuration.java b/core/Configuration.java index 6b242ace9..71b0d1692 100644 --- a/core/Configuration.java +++ b/core/Configuration.java @@ -22,6 +22,8 @@ public class Configuration extends net.minecraftforge.common.Configuration imple public static Configuration instance; + public static float TunnelPowerLoss = 0.05f; + public String latestVersion = VERSION; public long latestTimeStamp = 0; diff --git a/core/Registration.java b/core/Registration.java index 126a0ec2b..532beb7f8 100644 --- a/core/Registration.java +++ b/core/Registration.java @@ -13,6 +13,7 @@ import net.minecraftforge.common.ChestGenHooks; import net.minecraftforge.common.MinecraftForge; import net.minecraftforge.fluids.IFluidHandler; import appeng.api.AEApi; +import appeng.api.config.Upgrades; import appeng.api.definitions.Blocks; import appeng.api.definitions.Items; import appeng.api.definitions.Materials; @@ -30,12 +31,12 @@ import appeng.block.mac.BlockContainmentWall; import appeng.block.mac.BlockCraftingAccelerator; import appeng.block.mac.BlockHeatVent; import appeng.block.mac.BlockPatternProvider; +import appeng.block.misc.BlockCellWorkbench; import appeng.block.misc.BlockCharger; import appeng.block.misc.BlockCondenser; import appeng.block.misc.BlockInscriber; import appeng.block.misc.BlockInterface; import appeng.block.misc.BlockNetworkEmitter; -import appeng.block.misc.BlockCellWorkbench; import appeng.block.misc.BlockQuartzCrystalizer; import appeng.block.misc.BlockQuartzTorch; import appeng.block.misc.BlockTinyTNT; @@ -49,6 +50,7 @@ import appeng.block.networking.BlockEnergyCell; import appeng.block.networking.BlockWireless; import appeng.block.qnb.BlockQuantumLinkChamber; import appeng.block.qnb.BlockQuantumRing; +import appeng.block.solids.BlockFluix; import appeng.block.solids.BlockMatrixFrame; import appeng.block.solids.BlockQuartz; import appeng.block.solids.BlockQuartzChiseled; @@ -71,6 +73,8 @@ import appeng.core.features.registries.entries.CreativeCellHandler; import appeng.core.localization.GuiText; import appeng.core.localization.PlayerMessages; import appeng.core.sync.GuiBridge; +import appeng.debug.BlockChunkloader; +import appeng.debug.BlockItemGen; import appeng.debug.ToolDebugCard; import appeng.debug.ToolReplicatorCard; import appeng.helpers.AETrading; @@ -90,6 +94,8 @@ import appeng.items.tools.ToolMemoryCard; import appeng.items.tools.powered.ToolChargedStaff; import appeng.items.tools.powered.ToolEntropyManipulator; import appeng.items.tools.powered.ToolMassCannon; +import appeng.items.tools.powered.ToolNetworkTool; +import appeng.items.tools.powered.ToolPortableCell; import appeng.items.tools.powered.ToolWirelessTerminal; import appeng.items.tools.quartz.ToolQuartzAxe; import appeng.items.tools.quartz.ToolQuartzCuttingKnife; @@ -137,10 +143,10 @@ public class Registration { MinecraftForge.EVENT_BUS.register( OreDictionaryHandler.instance ); - Items items = AEApi.instance().items(); - Materials materials = AEApi.instance().materials(); - Parts parts = AEApi.instance().parts(); - Blocks blocks = AEApi.instance().blocks(); + Items items = appeng.core.Api.instance.items(); + Materials materials = appeng.core.Api.instance.materials(); + Parts parts = appeng.core.Api.instance.parts(); + Blocks blocks = appeng.core.Api.instance.blocks(); AEItemDefinition materialItem = (AEFeatureHandler) addFeature( ItemMaterial.class ); @@ -197,6 +203,8 @@ public class Registration blocks.blockQuartzOreCharged = addFeature( OreQuartzCharged.class ); blocks.blockMatrixFrame = addFeature( BlockMatrixFrame.class ); blocks.blockQuartz = addFeature( BlockQuartz.class ); + blocks.blockFluix = addFeature( BlockFluix.class ); + blocks.blockQuartzGlass = addFeature( BlockQuartzGlass.class ); blocks.blockQuartzVibrantGlass = addFeature( BlockQuartzLamp.class ); blocks.blockQuartzPiller = addFeature( BlockQuartzPillar.class ); @@ -228,7 +236,7 @@ public class Registration blocks.blockDrive = addFeature( BlockDrive.class ); blocks.blockChest = addFeature( BlockChest.class ); blocks.blockInterface = addFeature( BlockInterface.class ); - blocks.blockPartitioner = addFeature( BlockCellWorkbench.class ); + blocks.blockCellWorkbench = addFeature( BlockCellWorkbench.class ); blocks.blockIOPort = addFeature( BlockIOPort.class ); blocks.blockCondenser = addFeature( BlockCondenser.class ); blocks.blockEnergyAcceptor = addFeature( BlockEnergyAcceptor.class ); @@ -272,11 +280,15 @@ public class Registration items.itemChargedStaff = addFeature( ToolChargedStaff.class ); items.itemEntropyManipulator = addFeature( ToolEntropyManipulator.class ); items.itemWirelessTerminal = addFeature( ToolWirelessTerminal.class ); + items.itemNetworkTool = addFeature( ToolNetworkTool.class ); + items.itemPortableCell = addFeature( ToolPortableCell.class ); items.itemFacade = addFeature( ItemFacade.class ); addFeature( ToolDebugCard.class ); addFeature( ToolReplicatorCard.class ); + addFeature( BlockItemGen.class ); + addFeature( BlockChunkloader.class ); } private AEItemDefinition addFeature(Class c, Object... Args) @@ -394,8 +406,9 @@ public class Registration AEApi.instance().registries().cell().addCellHandler( new BasicCellHandler() ); AEApi.instance().registries().cell().addCellHandler( new CreativeCellHandler() ); - NetworkRegistry.instance().registerGuiHandler( AppEng.instance, GuiBridge.GUI_Handler ); + AEApi.instance().registries().matterCannon().registerAmmo( AEApi.instance().materials().materialMatterBall.stack( 1 ), 32.0 ); + NetworkRegistry.instance().registerGuiHandler( AppEng.instance, GuiBridge.GUI_Handler ); } public void PostInit(FMLPostInitializationEvent event) @@ -407,6 +420,48 @@ public class Registration Api.instance.partHelper.initFMPSupport(); ((BlockCableBus) AEApi.instance().blocks().blockMultiPart.block()).setupTile(); + // IO PORT! + Upgrades.SPEED.registerItem( AEApi.instance().blocks().blockIOPort.stack( 1 ), 3 ); + Upgrades.REDSTONE.registerItem( AEApi.instance().blocks().blockIOPort.stack( 1 ), 1 ); + + // partLevelEmitter + Upgrades.FUZZY.registerItem( AEApi.instance().parts().partLevelEmitter.stack( 1 ), 1 ); + + // partImportBus + Upgrades.FUZZY.registerItem( AEApi.instance().parts().partImportBus.stack( 1 ), 1 ); + Upgrades.REDSTONE.registerItem( AEApi.instance().parts().partImportBus.stack( 1 ), 1 ); + Upgrades.CAPACITY.registerItem( AEApi.instance().parts().partImportBus.stack( 1 ), 2 ); + Upgrades.SPEED.registerItem( AEApi.instance().parts().partImportBus.stack( 1 ), 4 ); + + // partExportBus + Upgrades.FUZZY.registerItem( AEApi.instance().parts().partExportBus.stack( 1 ), 1 ); + Upgrades.REDSTONE.registerItem( AEApi.instance().parts().partExportBus.stack( 1 ), 1 ); + Upgrades.CAPACITY.registerItem( AEApi.instance().parts().partExportBus.stack( 1 ), 2 ); + Upgrades.SPEED.registerItem( AEApi.instance().parts().partExportBus.stack( 1 ), 4 ); + + // blockCellWorkbench + Upgrades.FUZZY.registerItem( AEApi.instance().items().itemCell1k.stack( 1 ), 1 ); + Upgrades.INVERTER.registerItem( AEApi.instance().items().itemCell1k.stack( 1 ), 1 ); + + Upgrades.FUZZY.registerItem( AEApi.instance().items().itemCell4k.stack( 1 ), 1 ); + Upgrades.INVERTER.registerItem( AEApi.instance().items().itemCell4k.stack( 1 ), 1 ); + + Upgrades.FUZZY.registerItem( AEApi.instance().items().itemCell16k.stack( 1 ), 1 ); + Upgrades.INVERTER.registerItem( AEApi.instance().items().itemCell16k.stack( 1 ), 1 ); + + Upgrades.FUZZY.registerItem( AEApi.instance().items().itemCell64k.stack( 1 ), 1 ); + Upgrades.INVERTER.registerItem( AEApi.instance().items().itemCell64k.stack( 1 ), 1 ); + + // partStorageBus + Upgrades.FUZZY.registerItem( AEApi.instance().parts().partStorageBus.stack( 1 ), 1 ); + Upgrades.INVERTER.registerItem( AEApi.instance().parts().partStorageBus.stack( 1 ), 1 ); + Upgrades.CAPACITY.registerItem( AEApi.instance().parts().partStorageBus.stack( 1 ), 3 ); + + // matter cannon + Upgrades.FUZZY.registerItem( AEApi.instance().items().itemMassCannon.stack( 1 ), 1 ); + Upgrades.INVERTER.registerItem( AEApi.instance().items().itemMassCannon.stack( 1 ), 1 ); + Upgrades.SPEED.registerItem( AEApi.instance().items().itemMassCannon.stack( 1 ), 4 ); + if ( Configuration.instance.isFeatureEnabled( AEFeature.ChestLoot ) ) { ChestGenHooks d = ChestGenHooks.getInfo( ChestGenHooks.MINESHAFT_CORRIDOR ); diff --git a/core/api/ApiPart.java b/core/api/ApiPart.java index 278951416..f0e25fb29 100644 --- a/core/api/ApiPart.java +++ b/core/api/ApiPart.java @@ -22,8 +22,8 @@ import org.objectweb.asm.tree.ClassNode; import org.objectweb.asm.tree.MethodInsnNode; import org.objectweb.asm.tree.MethodNode; -import appeng.api.parts.IPartItem; import appeng.api.parts.IPartHelper; +import appeng.api.parts.IPartItem; import appeng.api.parts.LayerBase; import appeng.client.render.BusRenderer; import appeng.core.AELog; diff --git a/core/features/AEFeature.java b/core/features/AEFeature.java index 1d4f0dff6..a60e92c08 100644 --- a/core/features/AEFeature.java +++ b/core/features/AEFeature.java @@ -33,15 +33,18 @@ public enum AEFeature LevelEmiter("NetworkBuses"), CraftingTerminal("NetworkBuses"), StorageMonitor("NetworkBuses"), P2PTunnel("NetworkBuses"), FormationPlane("NetworkBuses"), AnnihilationPlane( "NetworkBuses"), ImportBus("NetworkBuses"), ExportBus("NetworkBuses"), StorageBus("NetworkBuses"), PartConversionMonitor("NetworkBuses"), - StorageCells("Storage"), MEChest("Storage"), MEDrive("Storage"), IOPort("Storage"), + StorageCells("Storage"), PortableCell("PortableCell"), MEChest("Storage"), MEDrive("Storage"), IOPort("Storage"), + + NetworkTool("NetworkTool"), DenseEnergyCells("HigherCapacity"), DenseCables("HigherCapacity"), - P2PTunnelME("P2PTunnels"), P2PTunnelItems("P2PTunnels"), P2PTunnelRedstone("P2PTunnels"), P2PTunnelEU("P2PTunnels"), P2PTunnelMJ("P2PTunnels"), P2PTunnelLiquids("P2PTunnels"), + P2PTunnelME("P2PTunnels"), P2PTunnelItems("P2PTunnels"), P2PTunnelRedstone("P2PTunnels"), P2PTunnelEU("P2PTunnels"), P2PTunnelMJ("P2PTunnels"), P2PTunnelLiquids( + "P2PTunnels"), MassCannonBlockDamage("BlockFeatures"), TinyTNTBlockDamage("BlockFeatures"), Facades("Facades"), - DuplicateItems("Misc", false), Profiler("Services"), VersionChecker("Services"), Debug("Misc"), Creative("Misc"); + DuplicateItems("Misc", false), Profiler("Services"), VersionChecker("Services"), Debug("Misc", false), Creative("Misc"); String Category; boolean visible = true; diff --git a/core/features/AEFeatureHandler.java b/core/features/AEFeatureHandler.java index 1cfdc1c8d..9ada9235a 100644 --- a/core/features/AEFeatureHandler.java +++ b/core/features/AEFeatureHandler.java @@ -53,6 +53,9 @@ public class AEFeatureHandler implements AEItemDefinition { // simple hack to allow me to do get nice names for these without // mode code outside of AEBaseItem + if ( subname.startsWith( "P2PTunnel" ) ) + return "ItemPart.P2PTunnel"; + if ( subname.equals( "CertusQuartzTools" ) ) return name.replace( "Quartz", "CertusQuartz" ); if ( subname.equals( "NetherQuartzTools" ) ) diff --git a/core/features/DamagedItemDefinition.java b/core/features/DamagedItemDefinition.java index 8de7cd386..ad14a3456 100644 --- a/core/features/DamagedItemDefinition.java +++ b/core/features/DamagedItemDefinition.java @@ -5,6 +5,7 @@ import net.minecraft.item.Item; import net.minecraft.item.ItemStack; import net.minecraft.tileentity.TileEntity; import appeng.api.util.AEItemDefinition; +import appeng.core.AELog; public class DamagedItemDefinition implements AEItemDefinition { @@ -22,6 +23,7 @@ public class DamagedItemDefinition implements AEItemDefinition { baseItem = is.getItem(); damage = is.getItemDamage(); + AELog.localization( "item", is.getUnlocalizedName() ); } } @@ -49,7 +51,7 @@ public class DamagedItemDefinition implements AEItemDefinition if ( baseItem == null ) return null; - return new ItemStack( baseItem, 1, damage ); + return new ItemStack( baseItem, stackSize, damage ); } @Override diff --git a/core/features/registries/LocateableRegistry.java b/core/features/registries/LocateableRegistry.java index 8ddc473a5..3b50997fa 100644 --- a/core/features/registries/LocateableRegistry.java +++ b/core/features/registries/LocateableRegistry.java @@ -2,6 +2,7 @@ package appeng.core.features.registries; import java.util.HashMap; +import net.minecraftforge.common.MinecraftForge; import net.minecraftforge.event.ForgeSubscribe; import appeng.api.events.LocatableEventAnnounce; import appeng.api.events.LocatableEventAnnounce.LocatableEvent; @@ -23,7 +24,8 @@ public class LocateableRegistry implements ILocateableRegistry if ( e.change == LocatableEvent.Register ) { set.put( e.target.getLocatableSerial(), e.target ); - } else if ( e.change == LocatableEvent.Unregister ) + } + else if ( e.change == LocatableEvent.Unregister ) { set.remove( e.target.getLocatableSerial() ); } @@ -31,6 +33,7 @@ public class LocateableRegistry implements ILocateableRegistry public LocateableRegistry() { set = new HashMap(); + MinecraftForge.EVENT_BUS.register( this ); } /** diff --git a/core/features/registries/MatterCannonAmmoRegistry.java b/core/features/registries/MatterCannonAmmoRegistry.java new file mode 100644 index 000000000..43c9aa23b --- /dev/null +++ b/core/features/registries/MatterCannonAmmoRegistry.java @@ -0,0 +1,126 @@ +package appeng.core.features.registries; + +import java.util.HashMap; + +import net.minecraft.item.Item; +import net.minecraft.item.ItemStack; +import appeng.api.features.IMatterCannonAmmoRegistry; +import appeng.recipes.ores.IOreListener; +import appeng.recipes.ores.OreDictionaryHandler; +import appeng.util.Platform; + +public class MatterCannonAmmoRegistry implements IOreListener, IMatterCannonAmmoRegistry +{ + + private HashMap DamageModifiers = new HashMap(); + + @Override + public void registerAmmo(ItemStack ammo, double weight) + { + DamageModifiers.put( ammo, weight ); + } + + private void considerItem(String ore, ItemStack item, String Name, double weight) + { + if ( ore.equals( "berry" + Name ) || ore.equals( "nugget" + Name ) ) + { + registerAmmo( item, weight ); + } + } + + @Override + public void oreRegistered(String Name, ItemStack item) + { + if ( !(Name.startsWith( "berry" ) || Name.startsWith( "nugget" )) ) + return; + + // addNugget( "Cobble", 18 ); // ? + considerItem( Name, item, "MeatRaw", 32 ); + considerItem( Name, item, "MeatCooked", 32 ); + considerItem( Name, item, "Meat", 32 ); + considerItem( Name, item, "Chicken", 32 ); + considerItem( Name, item, "Beef", 32 ); + considerItem( Name, item, "Sheep", 32 ); + considerItem( Name, item, "Fish", 32 ); + + // real world... + considerItem( Name, item, "Lithium", 6.941 ); + considerItem( Name, item, "Beryllium", 9.0122 ); + considerItem( Name, item, "Boron", 10.811 ); + considerItem( Name, item, "Carbon", 12.0107 ); + considerItem( Name, item, "Coal", 12.0107 ); + considerItem( Name, item, "Charcoal", 12.0107 ); + considerItem( Name, item, "Sodium", 22.9897 ); + considerItem( Name, item, "Magnesium", 24.305 ); + considerItem( Name, item, "Aluminum", 26.9815 ); + considerItem( Name, item, "Silicon", 28.0855 ); + considerItem( Name, item, "Phosphorus", 30.9738 ); + considerItem( Name, item, "Sulfur", 32.065 ); + considerItem( Name, item, "Potassium", 39.0983 ); + considerItem( Name, item, "Calcium", 40.078 ); + considerItem( Name, item, "Scandium", 44.9559 ); + considerItem( Name, item, "Titanium", 47.867 ); + considerItem( Name, item, "Vanadium", 50.9415 ); + considerItem( Name, item, "Manganese", 54.938 ); + considerItem( Name, item, "Iron", 55.845 ); + considerItem( Name, item, "Nickel", 58.6934 ); + considerItem( Name, item, "Cobalt", 58.9332 ); + considerItem( Name, item, "Copper", 63.546 ); + considerItem( Name, item, "Zinc", 65.39 ); + considerItem( Name, item, "Gallium", 69.723 ); + considerItem( Name, item, "Germanium", 72.64 ); + considerItem( Name, item, "Bromine", 79.904 ); + considerItem( Name, item, "Krypton", 83.8 ); + considerItem( Name, item, "Rubidium", 85.4678 ); + considerItem( Name, item, "Strontium", 87.62 ); + considerItem( Name, item, "Yttrium", 88.9059 ); + considerItem( Name, item, "Zirconiumm", 91.224 ); + considerItem( Name, item, "Niobiumm", 92.9064 ); + considerItem( Name, item, "Technetium", 98 ); + considerItem( Name, item, "Ruthenium", 101.07 ); + considerItem( Name, item, "Rhodium", 102.9055 ); + considerItem( Name, item, "Palladium", 106.42 ); + considerItem( Name, item, "Silver", 107.8682 ); + considerItem( Name, item, "Cadmium", 112.411 ); + considerItem( Name, item, "Indium", 114.818 ); + considerItem( Name, item, "Tin", 118.71 ); + considerItem( Name, item, "Antimony", 121.76 ); + considerItem( Name, item, "Iodine", 126.9045 ); + considerItem( Name, item, "Tellurium", 127.6 ); + considerItem( Name, item, "Xenon", 131.293 ); + considerItem( Name, item, "Cesium", 132.9055 ); + considerItem( Name, item, "Barium", 137.327 ); + considerItem( Name, item, "Lanthanum", 138.9055 ); + considerItem( Name, item, "Cerium", 140.116 ); + considerItem( Name, item, "Tantalum", 180.9479 ); + considerItem( Name, item, "Tungsten", 183.84 ); + considerItem( Name, item, "Osmium", 190.23 ); + considerItem( Name, item, "Iridium", 192.217 ); + considerItem( Name, item, "Platinum", 195.078 ); + considerItem( Name, item, "Lead", 207.2 ); + considerItem( Name, item, "Bismuth", 208.9804 ); + considerItem( Name, item, "Uranium", 238.0289 ); + considerItem( Name, item, "Plutonium", 244 ); + + // TE stuff... + considerItem( Name, item, "Invar", (58.6934 + 55.845 + 55.845) / 3.0 ); + considerItem( Name, item, "Electrum", (107.8682 + 196.96655) / 2.0 ); + } + + public MatterCannonAmmoRegistry() { + OreDictionaryHandler.instance.observe( this ); + registerAmmo( new ItemStack( Item.goldNugget ), 196.96655 ); + } + + @Override + public float getPenetration(ItemStack is) + { + for (ItemStack o : DamageModifiers.keySet()) + { + if ( Platform.isSameItem( o, is ) ) + return DamageModifiers.get( o ).floatValue(); + } + return 0; + } + +} diff --git a/core/features/registries/RegistryContainer.java b/core/features/registries/RegistryContainer.java index 0ec850901..ef5c8f02f 100644 --- a/core/features/registries/RegistryContainer.java +++ b/core/features/registries/RegistryContainer.java @@ -2,6 +2,7 @@ package appeng.core.features.registries; import appeng.api.features.IGrinderRegistry; import appeng.api.features.ILocateableRegistry; +import appeng.api.features.IMatterCannonAmmoRegistry; import appeng.api.features.IP2PTunnelRegistry; import appeng.api.features.IRegistryContainer; import appeng.api.features.ISpecialComparisonRegistry; @@ -23,6 +24,7 @@ public class RegistryContainer implements IRegistryContainer private GridCacheRegistry GridCacheRegistry = new GridCacheRegistry(); private P2PTunnelRegistry P2PRegistry = new P2PTunnelRegistry(); private MovableTileRegistry MoveableReg = new MovableTileRegistry(); + private MatterCannonAmmoRegistry matterCannonReg = new MatterCannonAmmoRegistry(); @Override public IWirelessTermRegistery wireless() @@ -78,4 +80,10 @@ public class RegistryContainer implements IRegistryContainer return P2PRegistry; } + @Override + public IMatterCannonAmmoRegistry matterCannon() + { + return matterCannonReg; + } + } diff --git a/core/features/registries/entries/BasicCellHandler.java b/core/features/registries/entries/BasicCellHandler.java index 15f7c095b..90dc2b474 100644 --- a/core/features/registries/entries/BasicCellHandler.java +++ b/core/features/registries/entries/BasicCellHandler.java @@ -11,6 +11,7 @@ import appeng.api.storage.StorageChannel; import appeng.client.texture.ExtraTextures; import appeng.core.sync.GuiBridge; import appeng.me.storage.CellInventory; +import appeng.me.storage.CellInventoryHandler; import appeng.tile.AEBaseTile; import appeng.util.Platform; @@ -46,7 +47,12 @@ public class BasicCellHandler implements ICellHandler @Override public int getStatusForCell(ItemStack is, IMEInventory handler) { - return 1; + if ( handler instanceof CellInventoryHandler ) + { + CellInventoryHandler ci = (CellInventoryHandler) handler; + return ci.getCellInv().getStatusForCell(); + } + return 0; } @Override diff --git a/core/localization/GuiText.java b/core/localization/GuiText.java index 5e89de3a0..b84b84615 100644 --- a/core/localization/GuiText.java +++ b/core/localization/GuiText.java @@ -7,27 +7,27 @@ public enum GuiText { inventory("container"), // mc's default Inventory localization. - Chest, StoredEnergy, Of, Condenser, Drive, GrindStone, VibrationChamber, SpatialIOPort, NetworkStatus, LevelEmitter, Terminal, Interface, Config, StoredItems, Patterns, ImportBus, ExportBus, CellWorkbench; + Chest, StoredEnergy, Of, Condenser, Drive, GrindStone, VibrationChamber, SpatialIOPort, LevelEmitter, Terminal, Interface, Config, StoredItems, Patterns, ImportBus, ExportBus, CellWorkbench, NetworkDetails, StorageCells, IOBuses, IOPort, BytesUsed, Types, QuantumLinkChamber, PortableCell; String root; GuiText() { root = "gui.appliedenergistics2"; - AELog.localization( "gui", getName() ); + AELog.localization( "gui", getUnlocalized() ); } GuiText(String r) { root = r; } - private String getName() + public String getUnlocalized() { return root + "." + toString(); } public String getLocal() { - return StatCollector.translateToLocal( getName() ); + return StatCollector.translateToLocal( getUnlocalized() ); } } diff --git a/core/localization/PlayerMessages.java b/core/localization/PlayerMessages.java index 1e10137cf..ed054d184 100644 --- a/core/localization/PlayerMessages.java +++ b/core/localization/PlayerMessages.java @@ -5,7 +5,7 @@ import appeng.core.AELog; public enum PlayerMessages { - ChestCannotReadStorageCell, InvalidMachine, LoadedSettings, SavedSettings, MachineNotPowered; + ChestCannotReadStorageCell, InvalidMachine, LoadedSettings, SavedSettings, MachineNotPowered, isNowLocked, isNowUnlocked, AmmoDepleted; private PlayerMessages() { AELog.localization( "chat", getName() ); diff --git a/core/sync/GuiBridge.java b/core/sync/GuiBridge.java index 449dfcbd8..739bfff05 100644 --- a/core/sync/GuiBridge.java +++ b/core/sync/GuiBridge.java @@ -4,6 +4,7 @@ import java.lang.reflect.Constructor; import net.minecraft.entity.player.EntityPlayer; import net.minecraft.entity.player.InventoryPlayer; +import net.minecraft.item.ItemStack; import net.minecraft.tileentity.TileEntity; import net.minecraft.world.World; import net.minecraftforge.common.ForgeDirection; @@ -14,24 +15,31 @@ import appeng.api.parts.IPartHost; import appeng.api.storage.IStorageMonitorable; import appeng.client.gui.GuiNull; import appeng.container.ContainerNull; -import appeng.container.implementations.ContainerBus; -import appeng.container.implementations.ContainerCellWorkBench; +import appeng.container.implementations.ContainerCellWorkbench; import appeng.container.implementations.ContainerChest; import appeng.container.implementations.ContainerCondenser; import appeng.container.implementations.ContainerDrive; import appeng.container.implementations.ContainerGrinder; +import appeng.container.implementations.ContainerIOPort; import appeng.container.implementations.ContainerInterface; import appeng.container.implementations.ContainerLevelEmitter; import appeng.container.implementations.ContainerMEMonitorable; +import appeng.container.implementations.ContainerMEPortableCell; +import appeng.container.implementations.ContainerQNB; +import appeng.container.implementations.ContainerUpgradeable; import appeng.container.implementations.ContainerVibrationChamber; +import appeng.helpers.ICellItemViewer; +import appeng.helpers.IGuiItem; import appeng.helpers.IInterfaceHost; import appeng.parts.automation.PartLevelEmitter; import appeng.tile.grindstone.TileGrinder; import appeng.tile.misc.TileCellWorkbench; import appeng.tile.misc.TileCondenser; import appeng.tile.misc.TileVibrationChamber; +import appeng.tile.qnb.TileQuantumBridge; import appeng.tile.storage.TileChest; import appeng.tile.storage.TileDrive; +import appeng.tile.storage.TileIOPort; import appeng.util.Platform; import cpw.mods.fml.common.network.IGuiHandler; import cpw.mods.fml.relauncher.ReflectionHelper; @@ -40,30 +48,37 @@ public enum GuiBridge implements IGuiHandler { GUI_Handler(), - GUI_GRINDER(ContainerGrinder.class, TileGrinder.class), + GUI_GRINDER(ContainerGrinder.class, TileGrinder.class, false), - GUI_CHEST(ContainerChest.class, TileChest.class), + GUI_QNB(ContainerQNB.class, TileQuantumBridge.class, false), - GUI_ME(ContainerMEMonitorable.class, IStorageMonitorable.class), + GUI_CHEST(ContainerChest.class, TileChest.class, false), - GUI_DRIVE(ContainerDrive.class, TileDrive.class), + GUI_ME(ContainerMEMonitorable.class, IStorageMonitorable.class, false), - GUI_VIBRATIONCHAMBER(ContainerVibrationChamber.class, TileVibrationChamber.class), + GUI_PORTABLE_CELL(ContainerMEPortableCell.class, ICellItemViewer.class, true), - GUI_CONDENSER(ContainerCondenser.class, TileCondenser.class), + GUI_DRIVE(ContainerDrive.class, TileDrive.class, false), - GUI_INTERFACE(ContainerInterface.class, IInterfaceHost.class), + GUI_VIBRATIONCHAMBER(ContainerVibrationChamber.class, TileVibrationChamber.class, false), - GUI_BUS(ContainerBus.class, IBusCommon.class), + GUI_CONDENSER(ContainerCondenser.class, TileCondenser.class, false), + + GUI_INTERFACE(ContainerInterface.class, IInterfaceHost.class, false), + + GUI_BUS(ContainerUpgradeable.class, IBusCommon.class, false), + + GUI_IOPORT(ContainerIOPort.class, TileIOPort.class, false), // extends (Container/Gui) + Bus - GUI_LEVELEMITTER(ContainerLevelEmitter.class, PartLevelEmitter.class), + GUI_LEVELEMITTER(ContainerLevelEmitter.class, PartLevelEmitter.class, false), - GUI_CELLWORKBENCH(ContainerCellWorkBench.class, TileCellWorkbench.class); + GUI_CELLWORKBENCH(ContainerCellWorkbench.class, TileCellWorkbench.class, false); private Class Tile; private Class Gui; private Class Container; + private boolean isItem; private GuiBridge() { Tile = null; @@ -95,8 +110,9 @@ public enum GuiBridge implements IGuiHandler getGui(); } - private GuiBridge(Class _Container, Class _Tile) { + private GuiBridge(Class _Container, Class _Tile, boolean isItem) { Container = _Container; + this.isItem = isItem; Tile = _Tile; getGui(); } @@ -145,43 +161,73 @@ public enum GuiBridge implements IGuiHandler ForgeDirection side = ForgeDirection.getOrientation( ID_ORDINAL & 0x07 ); GuiBridge ID = values()[ID_ORDINAL >> 3]; - TileEntity TE = w.getBlockTileEntity( x, y, z ); - - if ( TE instanceof IPartHost ) + if ( ID.isItem() ) { - ((IPartHost) TE).getPart( side ); - IPart part = ((IPartHost) TE).getPart( side ); - if ( ID.CorrectTileOrPart( part ) ) - return ID.ConstructContainer( player.inventory, side, part ); + ItemStack it = player.inventory.getCurrentItem(); + if ( it != null && it.getItem() instanceof IGuiItem ) + { + Object myItem = ((IGuiItem) it.getItem()).getGuiObject( it ); + if ( ID.CorrectTileOrPart( myItem ) ) + return ID.ConstructContainer( player.inventory, side, myItem ); + } } else { - if ( ID.CorrectTileOrPart( TE ) ) - return ID.ConstructContainer( player.inventory, side, TE ); + TileEntity TE = w.getBlockTileEntity( x, y, z ); + if ( TE instanceof IPartHost ) + { + ((IPartHost) TE).getPart( side ); + IPart part = ((IPartHost) TE).getPart( side ); + if ( ID.CorrectTileOrPart( part ) ) + return ID.ConstructContainer( player.inventory, side, part ); + } + else + { + if ( ID.CorrectTileOrPart( TE ) ) + return ID.ConstructContainer( player.inventory, side, TE ); + } } return new ContainerNull(); } + private boolean isItem() + { + return isItem; + } + @Override public Object getClientGuiElement(int ID_ORDINAL, EntityPlayer player, World w, int x, int y, int z) { ForgeDirection side = ForgeDirection.getOrientation( ID_ORDINAL & 0x07 ); GuiBridge ID = values()[ID_ORDINAL >> 3]; - TileEntity TE = w.getBlockTileEntity( x, y, z ); - - if ( TE instanceof IPartHost ) + if ( ID.isItem() ) { - ((IPartHost) TE).getPart( side ); - IPart part = ((IPartHost) TE).getPart( side ); - if ( ID.CorrectTileOrPart( part ) ) - return ID.ConstructGui( player.inventory, side, part ); + ItemStack it = player.inventory.getCurrentItem(); + if ( it != null && it.getItem() instanceof IGuiItem ) + { + Object myItem = ((IGuiItem) it.getItem()).getGuiObject( it ); + if ( ID.CorrectTileOrPart( myItem ) ) + return ID.ConstructGui( player.inventory, side, myItem ); + } } else { - if ( ID.CorrectTileOrPart( TE ) ) - return ID.ConstructGui( player.inventory, side, TE ); + TileEntity TE = w.getBlockTileEntity( x, y, z ); + + if ( TE instanceof IPartHost ) + { + ((IPartHost) TE).getPart( side ); + IPart part = ((IPartHost) TE).getPart( side ); + if ( ID.CorrectTileOrPart( part ) ) + return ID.ConstructGui( player.inventory, side, part ); + } + else + { + if ( ID.CorrectTileOrPart( TE ) ) + return ID.ConstructGui( player.inventory, side, TE ); + } } return new GuiNull( new ContainerNull() ); diff --git a/core/sync/packets/PacketValueConfig.java b/core/sync/packets/PacketValueConfig.java index 0fb196037..a97efb344 100644 --- a/core/sync/packets/PacketValueConfig.java +++ b/core/sync/packets/PacketValueConfig.java @@ -8,6 +8,8 @@ import java.io.IOException; import net.minecraft.entity.player.EntityPlayer; import net.minecraft.inventory.Container; import net.minecraft.network.INetworkManager; +import appeng.api.config.FuzzyMode; +import appeng.container.implementations.ContainerCellWorkbench; import appeng.container.implementations.ContainerLevelEmitter; import appeng.core.sync.AppEngPacket; @@ -34,6 +36,25 @@ public class PacketValueConfig extends AppEngPacket lvc.setLevel( Integer.parseInt( Value ), player ); return; } + else if ( Name.startsWith( "CellWorkbench." ) && c instanceof ContainerCellWorkbench ) + { + ContainerCellWorkbench ccw = (ContainerCellWorkbench) c; + if ( Name.equals( "CellWorkbench.Action" ) ) + { + if ( Value.equals( "Partition" ) ) + { + ccw.partition(); + } + else if ( Value.equals( "Clear" ) ) + { + ccw.clear(); + } + } + else if ( Name.equals( "CellWorkbench.Fuzzy" ) ) + { + ccw.setFuzzy( FuzzyMode.valueOf( Value ) ); + } + } } diff --git a/debug/BlockChunkloader.java b/debug/BlockChunkloader.java new file mode 100644 index 000000000..0953b70fe --- /dev/null +++ b/debug/BlockChunkloader.java @@ -0,0 +1,30 @@ +package appeng.debug; + +import java.util.EnumSet; +import java.util.List; + +import net.minecraft.block.material.Material; +import net.minecraft.world.World; +import net.minecraftforge.common.ForgeChunkManager; +import net.minecraftforge.common.ForgeChunkManager.LoadingCallback; +import net.minecraftforge.common.ForgeChunkManager.Ticket; +import appeng.block.AEBaseBlock; +import appeng.core.AppEng; +import appeng.core.features.AEFeature; + +public class BlockChunkloader extends AEBaseBlock implements LoadingCallback +{ + + public BlockChunkloader() { + super( BlockChunkloader.class, Material.iron ); + setfeature( EnumSet.of( AEFeature.Debug, AEFeature.Creative ) ); + setTileEntiy( TileChunkLoader.class ); + ForgeChunkManager.setForcedChunkLoadingCallback( AppEng.instance, this ); + } + + @Override + public void ticketsLoaded(List tickets, World world) + { + + } +} diff --git a/debug/BlockItemGen.java b/debug/BlockItemGen.java new file mode 100644 index 000000000..e7e9d1fe4 --- /dev/null +++ b/debug/BlockItemGen.java @@ -0,0 +1,18 @@ +package appeng.debug; + +import java.util.EnumSet; + +import net.minecraft.block.material.Material; +import appeng.block.AEBaseBlock; +import appeng.core.features.AEFeature; + +public class BlockItemGen extends AEBaseBlock +{ + + public BlockItemGen() { + super( BlockItemGen.class, Material.iron ); + setfeature( EnumSet.of( AEFeature.Debug, AEFeature.Creative ) ); + setTileEntiy( TileItemGen.class ); + } + +} diff --git a/debug/TileChunkLoader.java b/debug/TileChunkLoader.java new file mode 100644 index 000000000..734fbdcad --- /dev/null +++ b/debug/TileChunkLoader.java @@ -0,0 +1,83 @@ +package appeng.debug; + +import java.util.EnumSet; +import java.util.List; + +import net.minecraft.entity.player.EntityPlayerMP; +import net.minecraft.server.MinecraftServer; +import net.minecraft.world.ChunkCoordIntPair; +import net.minecraftforge.common.ForgeChunkManager; +import net.minecraftforge.common.ForgeChunkManager.Ticket; +import net.minecraftforge.common.ForgeChunkManager.Type; +import appeng.core.AELog; +import appeng.core.AppEng; +import appeng.tile.AEBaseTile; +import appeng.tile.events.AETileEventHandler; +import appeng.tile.events.TileEventType; +import appeng.util.Platform; +import cpw.mods.fml.common.FMLCommonHandler; + +public class TileChunkLoader extends AEBaseTile +{ + + boolean requestTicket = true; + Ticket ct; + + class ChunkLoaderHandler extends AETileEventHandler + { + + public ChunkLoaderHandler() { + super( EnumSet.of( TileEventType.TICK ) ); + } + + @Override + public void Tick() + { + if ( requestTicket ) + { + requestTicket = false; + initTicket(); + } + } + + }; + + public TileChunkLoader() { + addNewHandler( new ChunkLoaderHandler() ); + } + + void initTicket() + { + if ( Platform.isClient() ) + return; + + ct = ForgeChunkManager.requestTicket( AppEng.instance, worldObj, Type.NORMAL ); + + if ( ct == null ) + { + MinecraftServer server = FMLCommonHandler.instance().getMinecraftServerInstance(); + if ( server != null ) + { + List pl = server.getConfigurationManager().playerEntityList; + for (EntityPlayerMP p : pl) + { + p.addChatMessage( "Can't chunk load.." ); + } + } + return; + } + + AELog.info( "New Ticket " + ct.toString() ); + ForgeChunkManager.forceChunk( ct, new ChunkCoordIntPair( xCoord >> 4, zCoord >> 4 ) ); + } + + @Override + public void invalidate() + { + if ( Platform.isClient() ) + return; + + AELog.info( "Released Ticket " + ct.toString() ); + ForgeChunkManager.releaseTicket( ct ); + } +} diff --git a/debug/TileItemGen.java b/debug/TileItemGen.java new file mode 100644 index 000000000..a77079bb7 --- /dev/null +++ b/debug/TileItemGen.java @@ -0,0 +1,124 @@ +package appeng.debug; + +import java.util.ArrayList; +import java.util.LinkedList; +import java.util.List; +import java.util.Queue; + +import net.minecraft.entity.player.EntityPlayer; +import net.minecraft.inventory.IInventory; +import net.minecraft.item.Item; +import net.minecraft.item.ItemStack; +import appeng.tile.AEBaseTile; + +public class TileItemGen extends AEBaseTile implements IInventory +{ + + public static Queue possibleItems = new LinkedList(); + + public TileItemGen() { + if ( possibleItems.isEmpty() ) + { + for (int x = 0; x < Item.itemsList.length; x++) + { + Item mi = Item.itemsList[x]; + if ( mi != null ) + { + if ( mi.isDamageable() ) + { + for (int dmg = 0; dmg < mi.getMaxDamage(); dmg++) + possibleItems.add( new ItemStack( mi, 1, dmg ) ); + } + else + { + List list = new ArrayList(); + mi.getSubItems( x, mi.getCreativeTab(), list ); + possibleItems.addAll( list ); + } + } + } + } + } + + @Override + public int getSizeInventory() + { + return 1; + } + + @Override + public ItemStack getStackInSlot(int i) + { + return getRandomItem(); + } + + private ItemStack getRandomItem() + { + return possibleItems.peek(); + } + + @Override + public ItemStack decrStackSize(int i, int j) + { + ItemStack a = possibleItems.poll(); + ItemStack out = a.copy(); + possibleItems.add( a ); + return out; + } + + @Override + public ItemStack getStackInSlotOnClosing(int i) + { + return null; + } + + @Override + public void setInventorySlotContents(int i, ItemStack itemstack) + { + ItemStack a = possibleItems.poll(); + possibleItems.add( a ); + } + + @Override + public String getInvName() + { + return null; + } + + @Override + public boolean isInvNameLocalized() + { + return false; + } + + @Override + public int getInventoryStackLimit() + { + return 1; + } + + @Override + public void openChest() + { + + } + + @Override + public void closeChest() + { + + } + + @Override + public boolean isItemValidForSlot(int i, ItemStack itemstack) + { + return false; + } + + @Override + public boolean isUseableByPlayer(EntityPlayer entityplayer) + { + return false; + } + +} diff --git a/debug/ToolDebugCard.java b/debug/ToolDebugCard.java index b179ce9d7..0de24cafa 100644 --- a/debug/ToolDebugCard.java +++ b/debug/ToolDebugCard.java @@ -20,7 +20,6 @@ import appeng.core.features.AEFeature; import appeng.helpers.TickHandler; import appeng.items.AEBaseItem; import appeng.me.Grid; -import appeng.me.GridCacheWrapper; import appeng.me.GridNode; import appeng.me.cache.TickManagerCache; import appeng.util.Platform; @@ -30,7 +29,7 @@ public class ToolDebugCard extends AEBaseItem public ToolDebugCard() { super( ToolDebugCard.class ); - setfeature( EnumSet.of( AEFeature.Creative ) ); + setfeature( EnumSet.of( AEFeature.Debug, AEFeature.Creative ) ); } public String timeMeasurement(long nanos) @@ -57,11 +56,6 @@ public class ToolDebugCard extends AEBaseItem { TickManagerCache tmc = (TickManagerCache) g.getCache( ITickManager.class ); - for (GridCacheWrapper w : g.getCacheWrappers()) - { - totalOver5Ticks += w.LastFiveTicksTime; - } - grids++; for (IGridNode n : g.getNodes()) { @@ -87,12 +81,6 @@ public class ToolDebugCard extends AEBaseItem outputMsg( player, "This Node: " + node.toString() ); outputMsg( player, "Center Node: " + center.toString() ); - for (GridCacheWrapper w : g.getCacheWrappers()) - { - outputMsg( player, w.getName() + "Tick: " + timeMeasurement( w.LastFiveTicksTime / 5 ) + ", Add: " - + timeMeasurement( w.LastFiveAddNode / 5 ) + ", Rmv: " + timeMeasurement( w.LastFiveRemoveTime / 5 ) ); - } - TickManagerCache tmc = (TickManagerCache) g.getCache( ITickManager.class ); for (Class c : g.getMachineClasses()) { diff --git a/debug/ToolReplicatorCard.java b/debug/ToolReplicatorCard.java index 7385c2259..6b0ba974f 100644 --- a/debug/ToolReplicatorCard.java +++ b/debug/ToolReplicatorCard.java @@ -25,7 +25,7 @@ public class ToolReplicatorCard extends AEBaseItem public ToolReplicatorCard() { super( ToolReplicatorCard.class ); - setfeature( EnumSet.of( AEFeature.Creative ) ); + setfeature( EnumSet.of( AEFeature.Debug, AEFeature.Creative ) ); } @Override @@ -110,7 +110,7 @@ public class ToolReplicatorCard extends AEBaseItem TileEntity nte = blk.createTileEntity( world, meta ); NBTTagCompound data = new NBTTagCompound(); ote.writeToNBT( data ); - nte.readFromNBT( data ); + nte.readFromNBT( (NBTTagCompound) data.copy() ); world.setBlockTileEntity( i + rel_x, j + rel_y, k + rel_z, nte ); } world.markBlockForUpdate( i + rel_x, j + rel_y, k + rel_z ); diff --git a/helpers/AEMultiTile.java b/helpers/AEMultiTile.java index bef994bd8..a980de44c 100644 --- a/helpers/AEMultiTile.java +++ b/helpers/AEMultiTile.java @@ -1,9 +1,12 @@ package appeng.helpers; +import powercrystals.minefactoryreloaded.api.rednet.IConnectableRedNet; import appeng.api.networking.IGridHost; import appeng.api.parts.IPartHost; +import cpw.mods.fml.common.Optional.Interface; -public interface AEMultiTile extends IGridHost, IPartHost +@Interface(iface = "powercrystals.minefactoryreloaded.api.rednet.IConnectableRedNet", modid = "MineFactoryReloaded") +public interface AEMultiTile extends IGridHost, IPartHost, IConnectableRedNet { } diff --git a/helpers/CellItemViewer.java b/helpers/CellItemViewer.java new file mode 100644 index 000000000..009b90ec7 --- /dev/null +++ b/helpers/CellItemViewer.java @@ -0,0 +1,53 @@ +package appeng.helpers; + +import net.minecraft.item.ItemStack; +import appeng.api.config.Actionable; +import appeng.api.config.PowerMultiplier; +import appeng.api.implementations.IAEItemPowerStorage; +import appeng.api.storage.IMEMonitor; +import appeng.api.storage.MEMonitorHandler; +import appeng.api.storage.data.IAEFluidStack; +import appeng.api.storage.data.IAEItemStack; +import appeng.me.storage.CellInventory; + +public class CellItemViewer extends MEMonitorHandler implements ICellItemViewer +{ + + private ItemStack target; + private IAEItemPowerStorage ips; + + public CellItemViewer(ItemStack is) { + super( CellInventory.getCell( is ) ); + ips = (IAEItemPowerStorage) is.getItem(); + target = is; + } + + public ItemStack getItemStack() + { + return target; + } + + @Override + public double extractAEPower(double amt, Actionable mode, PowerMultiplier usePowerMultiplier) + { + amt = usePowerMultiplier.multiply( amt ); + + if ( mode == Actionable.SIMULATE ) + return usePowerMultiplier.divide( Math.min( amt, ips.getAECurrentPower( getItemStack() ) ) ); + + return usePowerMultiplier.divide( ips.extractAEPower( getItemStack(), amt ) ); + } + + @Override + public IMEMonitor getItemInventory() + { + return this; + } + + @Override + public IMEMonitor getFluidInventory() + { + return null; + } + +} diff --git a/helpers/DualityInterface.java b/helpers/DualityInterface.java index 323596869..f99833926 100644 --- a/helpers/DualityInterface.java +++ b/helpers/DualityInterface.java @@ -1,447 +1,447 @@ -package appeng.helpers; - -import net.minecraft.inventory.IInventory; -import net.minecraft.item.ItemStack; -import net.minecraft.nbt.NBTTagCompound; -import net.minecraft.tileentity.TileEntity; -import net.minecraftforge.common.ForgeDirection; -import appeng.api.AEApi; -import appeng.api.config.Actionable; -import appeng.api.implementations.ISegmentedInventory; -import appeng.api.networking.IGridNode; -import appeng.api.networking.energy.IEnergySource; -import appeng.api.networking.security.BaseActionSource; -import appeng.api.networking.security.MachineSource; -import appeng.api.networking.ticking.IGridTickable; -import appeng.api.networking.ticking.TickRateModulation; -import appeng.api.networking.ticking.TickingRequest; -import appeng.api.parts.IPart; -import appeng.api.storage.IMEInventory; -import appeng.api.storage.IMEMonitor; -import appeng.api.storage.IStorageMonitorable; -import appeng.api.storage.data.IAEFluidStack; -import appeng.api.storage.data.IAEItemStack; -import appeng.api.util.AECableType; -import appeng.api.util.DimensionalCoord; -import appeng.me.GridAccessException; -import appeng.me.helpers.AENetworkProxy; -import appeng.me.storage.MEMonitorIInventory; -import appeng.me.storage.MEMonitorPassthu; -import appeng.me.storage.NullInventory; -import appeng.tile.inventory.AppEngInternalAEInventory; -import appeng.tile.inventory.AppEngInternalInventory; -import appeng.tile.inventory.IAEAppEngInventory; -import appeng.tile.inventory.InvOperation; -import appeng.util.InventoryAdaptor; -import appeng.util.Platform; -import appeng.util.inv.AdaptorIInventory; -import appeng.util.inv.IInventoryDestination; -import appeng.util.inv.WrapperInvSlot; - -public class DualityInterface implements IGridTickable, ISegmentedInventory, IStorageMonitorable, IInventoryDestination, IAEAppEngInventory -{ - - final int sides[] = new int[] { 0, 1, 2, 3, 4, 5, 6, 7 }; - final IAEItemStack requireWork[] = new IAEItemStack[] { null, null, null, null, null, null, null, null }; - - boolean hasConfig = false; - AENetworkProxy gridProxy; - IInterfaceHost iHost; - BaseActionSource mySrc; - - public DualityInterface(AENetworkProxy prox, IInterfaceHost ih) { - gridProxy = prox; - iHost = ih; - mySrc = fluids.changeSource = items.changeSource = new MachineSource( iHost ); - } - - private void readConfig() - { - boolean hadConfig = hasConfig; - - hasConfig = false; - - for (ItemStack p : config) - { - if ( p != null ) - { - hasConfig = true; - break; - } - } - - boolean had = hasWorkToDo(); - - for (int x = 0; x < 8; x++) - updatePlan( x ); - - boolean has = hasWorkToDo(); - - if ( had != has ) - { - try - { - if ( has ) - gridProxy.getTick().wakeDevice( gridProxy.getNode() ); - else - gridProxy.getTick().sleepDevice( gridProxy.getNode() ); - } - catch (GridAccessException e) - { - // :P - } - } - - TileEntity te = iHost.getTileEntity(); - if ( hadConfig != hasConfig && te != null && te.worldObj != null ) - { - te.worldObj.notifyBlocksOfNeighborChange( te.xCoord, te.yCoord, te.zCoord, 0 ); - } - } - - public void writeToNBT(NBTTagCompound data) - { - config.writeToNBT( data, "config" ); - patterns.writeToNBT( data, "patterns" ); - storage.writeToNBT( data, "storage" ); - } - - public void readFromNBT(NBTTagCompound data) - { - config.readFromNBT( data, "config" ); - patterns.readFromNBT( data, "patterns" ); - storage.readFromNBT( data, "storage" ); - readConfig(); - } - - AppEngInternalAEInventory config = new AppEngInternalAEInventory( this, 8 ); - AppEngInternalInventory storage = new AppEngInternalInventory( this, 8 ); - AppEngInternalInventory patterns = new AppEngInternalInventory( this, 9 ); - - WrapperInvSlot slotInv = new WrapperInvSlot( storage ); - InventoryAdaptor adaptor = new AdaptorIInventory( slotInv ); - - IMEInventory destination; - private boolean isWorking = false; - - @Override - public boolean canInsert(ItemStack stack) - { - IAEItemStack out = destination.injectItems( AEApi.instance().storage().createItemStack( stack ), Actionable.SIMULATE ); - if ( out == null ) - return true; - return out.getStackSize() != stack.stackSize; - // ItemStack after = adaptor.simulateAdd( stack ); - // if ( after == null ) - // return true; - // return after.stackSize != stack.stackSize; - } - - private void updatePlan(int slot) - { - IAEItemStack req = config.getAEStackInSlot( slot ); - ItemStack Stored = storage.getStackInSlot( slot ); - - if ( req == null && Stored != null ) - { - IAEItemStack work = AEApi.instance().storage().createItemStack( Stored ); - requireWork[slot] = work.setStackSize( -work.getStackSize() ); - return; - } - else if ( req != null ) - { - if ( Stored == null ) // need to add stuff! - { - requireWork[slot] = req.copy(); - return; - } - else if ( req.isSameType( Stored ) ) // same type ( qty diffrent? )! - { - if ( req.getStackSize() != Stored.stackSize ) - { - requireWork[slot] = req.copy(); - requireWork[slot].setStackSize( req.getStackSize() - Stored.stackSize ); - return; - } - } - else if ( Stored != null ) // dispose! - { - IAEItemStack work = AEApi.instance().storage().createItemStack( Stored ); - requireWork[slot] = work.setStackSize( -work.getStackSize() ); - return; - } - } - - // else - - requireWork[slot] = null; - } - - static private boolean interfaceRequest = false; - - class InterfaceInventory extends MEMonitorIInventory - { - - public InterfaceInventory(DualityInterface tileInterface) { - super( tileInterface.storage, ForgeDirection.UP ); - mySource = new MachineSource( iHost ); - } - - @Override - public IAEItemStack injectItems(IAEItemStack input, Actionable type) - { - if ( interfaceRequest ) - return input; - - return super.injectItems( input, type ); - } - - @Override - public IAEItemStack extractItems(IAEItemStack request, Actionable type) - { - if ( interfaceRequest ) - return null; - - return super.extractItems( request, type ); - } - - }; - - private boolean usePlan(int x, IAEItemStack itemStack) - { - boolean changed = false; - slotInv.setSlot( x ); - interfaceRequest = isWorking = true; - - try - { - destination = gridProxy.getStorage().getItemInventory(); - IEnergySource src = gridProxy.getEnergy(); - - if ( itemStack.getStackSize() > 0 ) - { - IAEItemStack aquired = Platform.poweredExtraction( src, destination, itemStack, mySrc ); - if ( aquired != null ) - { - changed = true; - ItemStack issue = adaptor.addItems( aquired.getItemStack() ); - if ( issue != null ) - throw new RuntimeException( "bad attempt at managining inventory. ( addItems )" ); - } - } - else if ( itemStack.getStackSize() < 0 ) - { - IAEItemStack toStore = itemStack.copy(); - toStore.setStackSize( -toStore.getStackSize() ); - - long diff = toStore.getStackSize(); - - toStore = Platform.poweredInsert( src, destination, toStore, mySrc ); - - if ( toStore != null ) - diff -= toStore.getStackSize(); - - if ( diff != 0 ) - { - // extract items! - changed = true; - ItemStack removed = adaptor.removeItems( (int) diff, null, null ); - if ( removed == null ) - throw new RuntimeException( "bad attempt at managining inventory. ( addItems )" ); - else if ( removed.stackSize != diff ) - throw new RuntimeException( "bad attempt at managining inventory. ( addItems )" ); - } - } - // else wtf? - } - catch (GridAccessException e) - { - // :P - } - - if ( changed ) - updatePlan( x ); - - interfaceRequest = isWorking = false; - return changed; - } - - public IInventory getConfig() - { - return config; - } - - public IInventory getPatterns() - { - return patterns; - } - - MEMonitorPassthu items = new MEMonitorPassthu( new NullInventory() ); - MEMonitorPassthu fluids = new MEMonitorPassthu( new NullInventory() ); - - public void gridChanged() - { - try - { - items.setInternal( gridProxy.getStorage().getItemInventory() ); - fluids.setInternal( gridProxy.getStorage().getFluidInventory() ); - } - catch (GridAccessException gae) - { - items.setInternal( new NullInventory() ); - fluids.setInternal( new NullInventory() ); - } - - TileEntity te = iHost.getTileEntity(); - te.worldObj.notifyBlocksOfNeighborChange( te.xCoord, te.yCoord, te.zCoord, 0 ); - } - - public AECableType getCableConnectionType(ForgeDirection dir) - { - return AECableType.SMART; - } - - public DimensionalCoord getLocation() - { - return new DimensionalCoord( iHost.getTileEntity() ); - } - - public IInventory getInternalInventory() - { - return storage; - } - - public void onInventoryChanged() - { - } - - @Override - public void onChangeInventory(IInventory inv, int slot, InvOperation mc, ItemStack removed, ItemStack added) - { - if ( isWorking ) - return; - - if ( inv == config ) - readConfig(); - else if ( inv == patterns ) - { - - } - else if ( inv == storage && slot >= 0 ) - { - boolean had = hasWorkToDo(); - - updatePlan( slot ); - - boolean now = hasWorkToDo(); - - if ( had != now ) - { - try - { - if ( now ) - gridProxy.getTick().wakeDevice( gridProxy.getNode() ); - else - gridProxy.getTick().sleepDevice( gridProxy.getNode() ); - } - catch (GridAccessException e) - { - // :P - } - } - } - } - - public boolean hasWorkToDo() - { - return requireWork[0] != null || requireWork[1] != null || requireWork[2] != null || requireWork[3] != null || requireWork[4] != null - || requireWork[5] != null || requireWork[6] != null || requireWork[7] != null; - } - - private boolean updateStorage() - { - boolean didSomething = false; - - for (int x = 0; x < 8; x++) - { - if ( requireWork[x] != null ) - { - didSomething = usePlan( x, requireWork[x] ) || didSomething; - } - } - - return didSomething; - } - - public boolean hasConfig() - { - return hasConfig; - } - - public int[] getAccessibleSlotsFromSide(int side) - { - return sides; - } - - @Override - public TickingRequest getTickingRequest(IGridNode node) - { - return new TickingRequest( 5, 120, !hasWorkToDo(), false ); - } - - @Override - public TickRateModulation tickingRequest(IGridNode node, int TicksSinceLastCall) - { - boolean couldDoWork = updateStorage(); - return hasWorkToDo() ? (couldDoWork ? TickRateModulation.URGENT : TickRateModulation.SLOWER) : TickRateModulation.SLEEP; - } - - @Override - public IMEMonitor getItemInventory() - { - if ( hasConfig() ) - return new InterfaceInventory( this ); - - return items; - } - - @Override - public IMEMonitor getFluidInventory() - { - if ( hasConfig() ) - return null; - - return fluids; - } - - @Override - public IInventory getInventoryByName(String name) - { - if ( name.equals( "storage" ) ) - return storage; - - if ( name.equals( "patterns" ) ) - return patterns; - - if ( name.equals( "config" ) ) - return config; - - return null; - } - - public IInventory getStorage() - { - return storage; - } - - public TileEntity getTile() - { - return (TileEntity) (iHost instanceof TileEntity ? iHost : null); - } - - public IPart getPart() - { - return (IPart) (iHost instanceof IPart ? iHost : null); - } - -} +package appeng.helpers; + +import net.minecraft.inventory.IInventory; +import net.minecraft.item.ItemStack; +import net.minecraft.nbt.NBTTagCompound; +import net.minecraft.tileentity.TileEntity; +import net.minecraftforge.common.ForgeDirection; +import appeng.api.AEApi; +import appeng.api.config.Actionable; +import appeng.api.implementations.ISegmentedInventory; +import appeng.api.networking.IGridNode; +import appeng.api.networking.energy.IEnergySource; +import appeng.api.networking.security.BaseActionSource; +import appeng.api.networking.security.MachineSource; +import appeng.api.networking.ticking.IGridTickable; +import appeng.api.networking.ticking.TickRateModulation; +import appeng.api.networking.ticking.TickingRequest; +import appeng.api.parts.IPart; +import appeng.api.storage.IMEInventory; +import appeng.api.storage.IMEMonitor; +import appeng.api.storage.IStorageMonitorable; +import appeng.api.storage.data.IAEFluidStack; +import appeng.api.storage.data.IAEItemStack; +import appeng.api.util.AECableType; +import appeng.api.util.DimensionalCoord; +import appeng.me.GridAccessException; +import appeng.me.helpers.AENetworkProxy; +import appeng.me.storage.MEMonitorIInventory; +import appeng.me.storage.MEMonitorPassthu; +import appeng.me.storage.NullInventory; +import appeng.tile.inventory.AppEngInternalAEInventory; +import appeng.tile.inventory.AppEngInternalInventory; +import appeng.tile.inventory.IAEAppEngInventory; +import appeng.tile.inventory.InvOperation; +import appeng.util.InventoryAdaptor; +import appeng.util.Platform; +import appeng.util.inv.AdaptorIInventory; +import appeng.util.inv.IInventoryDestination; +import appeng.util.inv.WrapperInvSlot; + +public class DualityInterface implements IGridTickable, ISegmentedInventory, IStorageMonitorable, IInventoryDestination, IAEAppEngInventory +{ + + final int sides[] = new int[] { 0, 1, 2, 3, 4, 5, 6, 7 }; + final IAEItemStack requireWork[] = new IAEItemStack[] { null, null, null, null, null, null, null, null }; + + boolean hasConfig = false; + AENetworkProxy gridProxy; + IInterfaceHost iHost; + BaseActionSource mySrc; + + public DualityInterface(AENetworkProxy prox, IInterfaceHost ih) { + gridProxy = prox; + iHost = ih; + mySrc = fluids.changeSource = items.changeSource = new MachineSource( iHost ); + } + + private void readConfig() + { + boolean hadConfig = hasConfig; + + hasConfig = false; + + for (ItemStack p : config) + { + if ( p != null ) + { + hasConfig = true; + break; + } + } + + boolean had = hasWorkToDo(); + + for (int x = 0; x < 8; x++) + updatePlan( x ); + + boolean has = hasWorkToDo(); + + if ( had != has ) + { + try + { + if ( has ) + gridProxy.getTick().wakeDevice( gridProxy.getNode() ); + else + gridProxy.getTick().sleepDevice( gridProxy.getNode() ); + } + catch (GridAccessException e) + { + // :P + } + } + + TileEntity te = iHost.getTileEntity(); + if ( hadConfig != hasConfig && te != null && te.worldObj != null ) + { + te.worldObj.notifyBlocksOfNeighborChange( te.xCoord, te.yCoord, te.zCoord, 0 ); + } + } + + public void writeToNBT(NBTTagCompound data) + { + config.writeToNBT( data, "config" ); + patterns.writeToNBT( data, "patterns" ); + storage.writeToNBT( data, "storage" ); + } + + public void readFromNBT(NBTTagCompound data) + { + config.readFromNBT( data, "config" ); + patterns.readFromNBT( data, "patterns" ); + storage.readFromNBT( data, "storage" ); + readConfig(); + } + + AppEngInternalAEInventory config = new AppEngInternalAEInventory( this, 8 ); + AppEngInternalInventory storage = new AppEngInternalInventory( this, 8 ); + AppEngInternalInventory patterns = new AppEngInternalInventory( this, 9 ); + + WrapperInvSlot slotInv = new WrapperInvSlot( storage ); + InventoryAdaptor adaptor = new AdaptorIInventory( slotInv ); + + IMEInventory destination; + private boolean isWorking = false; + + @Override + public boolean canInsert(ItemStack stack) + { + IAEItemStack out = destination.injectItems( AEApi.instance().storage().createItemStack( stack ), Actionable.SIMULATE, null ); + if ( out == null ) + return true; + return out.getStackSize() != stack.stackSize; + // ItemStack after = adaptor.simulateAdd( stack ); + // if ( after == null ) + // return true; + // return after.stackSize != stack.stackSize; + } + + private void updatePlan(int slot) + { + IAEItemStack req = config.getAEStackInSlot( slot ); + ItemStack Stored = storage.getStackInSlot( slot ); + + if ( req == null && Stored != null ) + { + IAEItemStack work = AEApi.instance().storage().createItemStack( Stored ); + requireWork[slot] = work.setStackSize( -work.getStackSize() ); + return; + } + else if ( req != null ) + { + if ( Stored == null ) // need to add stuff! + { + requireWork[slot] = req.copy(); + return; + } + else if ( req.isSameType( Stored ) ) // same type ( qty diffrent? )! + { + if ( req.getStackSize() != Stored.stackSize ) + { + requireWork[slot] = req.copy(); + requireWork[slot].setStackSize( req.getStackSize() - Stored.stackSize ); + return; + } + } + else if ( Stored != null ) // dispose! + { + IAEItemStack work = AEApi.instance().storage().createItemStack( Stored ); + requireWork[slot] = work.setStackSize( -work.getStackSize() ); + return; + } + } + + // else + + requireWork[slot] = null; + } + + static private boolean interfaceRequest = false; + + class InterfaceInventory extends MEMonitorIInventory + { + + public InterfaceInventory(DualityInterface tileInterface) { + super( tileInterface.storage, ForgeDirection.UP ); + mySource = new MachineSource( iHost ); + } + + @Override + public IAEItemStack injectItems(IAEItemStack input, Actionable type, BaseActionSource src) + { + if ( interfaceRequest ) + return input; + + return super.injectItems( input, type, src ); + } + + @Override + public IAEItemStack extractItems(IAEItemStack request, Actionable type, BaseActionSource src) + { + if ( interfaceRequest ) + return null; + + return super.extractItems( request, type, src ); + } + + }; + + private boolean usePlan(int x, IAEItemStack itemStack) + { + boolean changed = false; + slotInv.setSlot( x ); + interfaceRequest = isWorking = true; + + try + { + destination = gridProxy.getStorage().getItemInventory(); + IEnergySource src = gridProxy.getEnergy(); + + if ( itemStack.getStackSize() > 0 ) + { + IAEItemStack aquired = Platform.poweredExtraction( src, destination, itemStack, mySrc ); + if ( aquired != null ) + { + changed = true; + ItemStack issue = adaptor.addItems( aquired.getItemStack() ); + if ( issue != null ) + throw new RuntimeException( "bad attempt at managining inventory. ( addItems )" ); + } + } + else if ( itemStack.getStackSize() < 0 ) + { + IAEItemStack toStore = itemStack.copy(); + toStore.setStackSize( -toStore.getStackSize() ); + + long diff = toStore.getStackSize(); + + toStore = Platform.poweredInsert( src, destination, toStore, mySrc ); + + if ( toStore != null ) + diff -= toStore.getStackSize(); + + if ( diff != 0 ) + { + // extract items! + changed = true; + ItemStack removed = adaptor.removeItems( (int) diff, null, null ); + if ( removed == null ) + throw new RuntimeException( "bad attempt at managining inventory. ( addItems )" ); + else if ( removed.stackSize != diff ) + throw new RuntimeException( "bad attempt at managining inventory. ( addItems )" ); + } + } + // else wtf? + } + catch (GridAccessException e) + { + // :P + } + + if ( changed ) + updatePlan( x ); + + interfaceRequest = isWorking = false; + return changed; + } + + public IInventory getConfig() + { + return config; + } + + public IInventory getPatterns() + { + return patterns; + } + + MEMonitorPassthu items = new MEMonitorPassthu( new NullInventory() ); + MEMonitorPassthu fluids = new MEMonitorPassthu( new NullInventory() ); + + public void gridChanged() + { + try + { + items.setInternal( gridProxy.getStorage().getItemInventory() ); + fluids.setInternal( gridProxy.getStorage().getFluidInventory() ); + } + catch (GridAccessException gae) + { + items.setInternal( new NullInventory() ); + fluids.setInternal( new NullInventory() ); + } + + TileEntity te = iHost.getTileEntity(); + te.worldObj.notifyBlocksOfNeighborChange( te.xCoord, te.yCoord, te.zCoord, 0 ); + } + + public AECableType getCableConnectionType(ForgeDirection dir) + { + return AECableType.SMART; + } + + public DimensionalCoord getLocation() + { + return new DimensionalCoord( iHost.getTileEntity() ); + } + + public IInventory getInternalInventory() + { + return storage; + } + + public void onInventoryChanged() + { + } + + @Override + public void onChangeInventory(IInventory inv, int slot, InvOperation mc, ItemStack removed, ItemStack added) + { + if ( isWorking ) + return; + + if ( inv == config ) + readConfig(); + else if ( inv == patterns ) + { + + } + else if ( inv == storage && slot >= 0 ) + { + boolean had = hasWorkToDo(); + + updatePlan( slot ); + + boolean now = hasWorkToDo(); + + if ( had != now ) + { + try + { + if ( now ) + gridProxy.getTick().wakeDevice( gridProxy.getNode() ); + else + gridProxy.getTick().sleepDevice( gridProxy.getNode() ); + } + catch (GridAccessException e) + { + // :P + } + } + } + } + + public boolean hasWorkToDo() + { + return requireWork[0] != null || requireWork[1] != null || requireWork[2] != null || requireWork[3] != null || requireWork[4] != null + || requireWork[5] != null || requireWork[6] != null || requireWork[7] != null; + } + + private boolean updateStorage() + { + boolean didSomething = false; + + for (int x = 0; x < 8; x++) + { + if ( requireWork[x] != null ) + { + didSomething = usePlan( x, requireWork[x] ) || didSomething; + } + } + + return didSomething; + } + + public boolean hasConfig() + { + return hasConfig; + } + + public int[] getAccessibleSlotsFromSide(int side) + { + return sides; + } + + @Override + public TickingRequest getTickingRequest(IGridNode node) + { + return new TickingRequest( 5, 120, !hasWorkToDo(), false ); + } + + @Override + public TickRateModulation tickingRequest(IGridNode node, int TicksSinceLastCall) + { + boolean couldDoWork = updateStorage(); + return hasWorkToDo() ? (couldDoWork ? TickRateModulation.URGENT : TickRateModulation.SLOWER) : TickRateModulation.SLEEP; + } + + @Override + public IMEMonitor getItemInventory() + { + if ( hasConfig() ) + return new InterfaceInventory( this ); + + return items; + } + + @Override + public IMEMonitor getFluidInventory() + { + if ( hasConfig() ) + return null; + + return fluids; + } + + @Override + public IInventory getInventoryByName(String name) + { + if ( name.equals( "storage" ) ) + return storage; + + if ( name.equals( "patterns" ) ) + return patterns; + + if ( name.equals( "config" ) ) + return config; + + return null; + } + + public IInventory getStorage() + { + return storage; + } + + public TileEntity getTile() + { + return (TileEntity) (iHost instanceof TileEntity ? iHost : null); + } + + public IPart getPart() + { + return (IPart) (iHost instanceof IPart ? iHost : null); + } + +} diff --git a/helpers/ICellItemViewer.java b/helpers/ICellItemViewer.java new file mode 100644 index 000000000..e3c8e3df2 --- /dev/null +++ b/helpers/ICellItemViewer.java @@ -0,0 +1,14 @@ +package appeng.helpers; + +import net.minecraft.item.ItemStack; +import appeng.api.networking.energy.IEnergySource; +import appeng.api.storage.IMEMonitor; +import appeng.api.storage.IStorageMonitorable; +import appeng.api.storage.data.IAEItemStack; + +public interface ICellItemViewer extends IStorageMonitorable, IMEMonitor, IEnergySource +{ + + public ItemStack getItemStack(); + +} diff --git a/helpers/IGuiItem.java b/helpers/IGuiItem.java new file mode 100644 index 000000000..f99983c6c --- /dev/null +++ b/helpers/IGuiItem.java @@ -0,0 +1,10 @@ +package appeng.helpers; + +import net.minecraft.item.ItemStack; + +public interface IGuiItem +{ + + Object getGuiObject(ItemStack is); + +} diff --git a/helpers/IInterfaceHost.java b/helpers/IInterfaceHost.java index 78492f5f1..e5ce6f7a6 100644 --- a/helpers/IInterfaceHost.java +++ b/helpers/IInterfaceHost.java @@ -1,12 +1,12 @@ -package appeng.helpers; - -import net.minecraft.tileentity.TileEntity; -import appeng.api.networking.IGridHost; - -public interface IInterfaceHost extends IGridHost -{ - - DualityInterface getInterfaceDuality(); - - TileEntity getTileEntity(); -} +package appeng.helpers; + +import net.minecraft.tileentity.TileEntity; +import appeng.api.networking.IGridHost; + +public interface IInterfaceHost extends IGridHost +{ + + DualityInterface getInterfaceDuality(); + + TileEntity getTileEntity(); +} diff --git a/helpers/PartPlacement.java b/helpers/PartPlacement.java index e1a45f0a1..3bc071187 100644 --- a/helpers/PartPlacement.java +++ b/helpers/PartPlacement.java @@ -20,8 +20,10 @@ import net.minecraftforge.event.entity.player.PlayerInteractEvent; import net.minecraftforge.event.entity.player.PlayerInteractEvent.Action; import appeng.api.AEApi; import appeng.api.parts.IFacadePart; +import appeng.api.parts.IPart; import appeng.api.parts.IPartHost; import appeng.api.parts.IPartItem; +import appeng.api.parts.PartItemStack; import appeng.api.parts.SelectedPart; import appeng.core.AppEng; import appeng.core.sync.packets.PacketPartPlacement; @@ -67,10 +69,7 @@ public class PartPlacement ForgeDirection side = ForgeDirection.getOrientation( face ); - if ( held == null ) - return false; - - if ( Platform.isWrench( player, held, x, y, z ) ) + if ( held != null && Platform.isWrench( player, held, x, y, z ) && player.isSneaking() ) { int block = world.getBlockId( x, y, z ); TileEntity tile = world.getBlockTileEntity( x, y, z ); @@ -92,7 +91,7 @@ public class PartPlacement if ( sp.part != null ) { - is.add( sp.part.getItemStack( true ) ); + is.add( sp.part.getItemStack( PartItemStack.Wrench ) ); sp.part.getDrops( is, true ); host.removePart( sp.side ); } @@ -132,51 +131,86 @@ public class PartPlacement if ( tile instanceof IPartHost ) host = (IPartHost) tile; - IFacadePart fp = isFacade( held, side ); - if ( fp != null ) + if ( held != null ) { - if ( host != null ) + IFacadePart fp = isFacade( held, side ); + if ( fp != null ) { - if ( !world.isRemote ) + if ( host != null ) { - if ( host.getPart( ForgeDirection.UNKNOWN ) == null ) - return false; + if ( !world.isRemote ) + { + if ( host.getPart( ForgeDirection.UNKNOWN ) == null ) + return false; - if ( host.getFacadeContainer().addFacade( fp ) ) - { - host.markForUpdate(); - if ( !player.capabilities.isCreativeMode ) + if ( host.getFacadeContainer().addFacade( fp ) ) { - held.stackSize--; - if ( held.stackSize == 0 ) + host.markForUpdate(); + if ( !player.capabilities.isCreativeMode ) { - player.inventory.mainInventory[player.inventory.currentItem] = null; - MinecraftForge.EVENT_BUS.post( new PlayerDestroyItemEvent( player, held ) ); + held.stackSize--; + if ( held.stackSize == 0 ) + { + player.inventory.mainInventory[player.inventory.currentItem] = null; + MinecraftForge.EVENT_BUS.post( new PlayerDestroyItemEvent( player, held ) ); + } } + return true; + } + } + else + { + player.swingItem(); + try + { + PacketDispatcher.sendPacketToServer( (new PacketPartPlacement( x, y, z, face )).getPacket() ); + } + catch (IOException e) + { + e.printStackTrace(); } - return true; - } - } - else - { - player.swingItem(); - try - { - PacketDispatcher.sendPacketToServer( (new PacketPartPlacement( x, y, z, face )).getPacket() ); - } - catch (IOException e) - { - e.printStackTrace(); } } + return false; } - return false; } if ( host == null && tile != null && AppEng.instance.isIntegrationEnabled( "FMP" ) ) host = ((IFMP) AppEng.instance.getIntegration( "FMP" )).getOrCreateHost( tile ); - if ( !(held.getItem() instanceof IPartItem) ) + // if ( held == null ) + { + int block = world.getBlockId( x, y, z ); + if ( host != null && player.isSneaking() && Block.blocksList[block] != null ) + { + LookDirection dir = Platform.getPlayerRay( player ); + MovingObjectPosition mop = Block.blocksList[block].collisionRayTrace( world, x, y, z, dir.a, dir.b ); + if ( mop != null ) + { + mop.hitVec = mop.hitVec.addVector( -mop.blockX, -mop.blockY, -mop.blockZ ); + SelectedPart sPart = host.selectPart( mop.hitVec ); + if ( sPart != null && sPart.part != null ) + if ( sPart.part.onShiftActivate( player, mop.hitVec ) ) + { + if ( world.isRemote ) + { + try + { + PacketDispatcher.sendPacketToServer( (new PacketPartPlacement( x, y, z, face )).getPacket() ); + } + catch (IOException e) + { + e.printStackTrace(); + } + } + return true; + } + } + } + + } + + if ( held == null || !(held.getItem() instanceof IPartItem) ) return false; int te_x = x; @@ -234,6 +268,8 @@ public class PartPlacement return true; } } + else + return false; } if ( host == null ) @@ -256,16 +292,21 @@ public class PartPlacement host = ((IFMP) AppEng.instance.getIntegration( "FMP" )).getOrCreateHost( tile ); if ( (blkID == 0 || Block.blocksList[blkID].isBlockReplaceable( world, te_x, te_y, te_z ) || host != null) && offset != ForgeDirection.UNKNOWN ) - return place( held, te_x, te_y, te_z, side.getOpposite().ordinal(), player, world, pass == PlaceType.INTERACT_FIRST_PASS ? PlaceType.INTERACT_SECOND_PASS - : PlaceType.PLACE_ITEM, depth + 1 ); + return place( held, te_x, te_y, te_z, side.getOpposite().ordinal(), player, world, + pass == PlaceType.INTERACT_FIRST_PASS ? PlaceType.INTERACT_SECOND_PASS : PlaceType.PLACE_ITEM, depth + 1 ); } return false; } if ( !world.isRemote ) { - if ( host.addPart( held, side ) != null ) + ForgeDirection mySide = host.addPart( held, side ); + if ( mySide != null ) { + IPart newlyPlacedPart = host.getPart( mySide ); + if ( newlyPlacedPart != null ) + newlyPlacedPart.onPlacement( player, held, side ); + StepSound ss = AEApi.instance().blocks().blockMultiPart.block().stepSound; world.playSoundEffect( 0.5 + x, 0.5 + y, 0.5 + z, ss.getPlaceSound(), (ss.getVolume() + 1.0F) / 2.0F, ss.getPitch() * 0.8F ); diff --git a/helpers/TickHandler.java b/helpers/TickHandler.java index fad410100..61fe9446b 100644 --- a/helpers/TickHandler.java +++ b/helpers/TickHandler.java @@ -112,7 +112,7 @@ public class TickHandler implements ITickHandler @Override public EnumSet ticks() { - return EnumSet.of( TickType.WORLD ); + return EnumSet.of( TickType.SERVER ); } @Override diff --git a/integration/abstraction/IIC2.java b/integration/abstraction/IIC2.java index f20230091..ffdba934c 100644 --- a/integration/abstraction/IIC2.java +++ b/integration/abstraction/IIC2.java @@ -1,22 +1,11 @@ package appeng.integration.abstraction; -import net.minecraft.entity.player.EntityPlayer; import net.minecraft.item.ItemStack; import net.minecraft.tileentity.TileEntity; public interface IIC2 { - boolean canUse(ItemStack i, int powerusage); - - boolean use(ItemStack i, int powerusage, EntityPlayer p); - - int discharge(ItemStack i, int powerusage, int tier, boolean ignoreTransferLimit, boolean simulate); - - void addCompressorRecipe(ItemStack dustRecipe, ItemStack matQuartz); - - void addMaceratorRecipe(ItemStack itemStack, ItemStack matFlour); - void addToEnergyNet(TileEntity appEngTile); void removeFromEnergyNet(TileEntity appEngTile); diff --git a/integration/abstraction/ITE.java b/integration/abstraction/ITE.java index 379fcc1c7..845e8d6fa 100644 --- a/integration/abstraction/ITE.java +++ b/integration/abstraction/ITE.java @@ -1,6 +1,8 @@ package appeng.integration.abstraction; import net.minecraft.item.ItemStack; +import net.minecraft.tileentity.TileEntity; +import net.minecraftforge.common.ForgeDirection; public interface ITE { @@ -9,4 +11,6 @@ public interface ITE void addPulverizerRecipe(int i, ItemStack blkQuartzOre, ItemStack matQuartz, ItemStack matQuartzDust); + boolean isPipe(TileEntity te, ForgeDirection opposite); + } diff --git a/integration/modules/IC2.java b/integration/modules/IC2.java index 38cadf884..32a598a21 100644 --- a/integration/modules/IC2.java +++ b/integration/modules/IC2.java @@ -3,10 +3,12 @@ package appeng.integration.modules; import ic2.api.recipe.RecipeInputItemStack; import net.minecraft.item.Item; import net.minecraft.item.ItemStack; +import net.minecraft.tileentity.TileEntity; import appeng.api.AEApi; import appeng.integration.IIntegrationModule; +import appeng.integration.abstraction.IIC2; -public class IC2 implements IIntegrationModule +public class IC2 implements IIntegrationModule, IIC2 { public static IC2 instance; @@ -21,24 +23,48 @@ public class IC2 implements IIntegrationModule @Override public void PostInit() { + AEApi.instance().registries().matterCannon().registerAmmo( getItem( "uraniumDrop" ), 238.0289 ); + // certus quartz - maceratorRecipe( AEApi.instance().materials().materialCertusQuartzCrystal.stack( 1 ), - AEApi.instance().materials().materialCertusQuartzDust.stack( 1 ) ); + maceratorRecipe( AEApi.instance().materials().materialCertusQuartzCrystal.stack( 1 ), AEApi.instance().materials().materialCertusQuartzDust.stack( 1 ) ); maceratorRecipe( AEApi.instance().materials().materialCertusQuartzCrystalCharged.stack( 1 ), AEApi.instance().materials().materialCertusQuartzDust.stack( 1 ) ); // fluix - maceratorRecipe( AEApi.instance().materials().materialFluixCrystal.stack( 1 ), - AEApi.instance().materials().materialFluixDust.stack( 1 ) ); + maceratorRecipe( AEApi.instance().materials().materialFluixCrystal.stack( 1 ), AEApi.instance().materials().materialFluixDust.stack( 1 ) ); // nether quartz maceratorRecipe( new ItemStack( Item.netherQuartz ), AEApi.instance().materials().materialNetherQuartzDust.stack( 1 ) ); } + /* + * private void compressorRecipe(ItemStack in, ItemStack out) { ic2.api.recipe.Recipes.compressor.addRecipe( new + * RecipeInputItemStack( in, in.stackSize ), null, out ); } + */ private void maceratorRecipe(ItemStack in, ItemStack out) { ic2.api.recipe.Recipes.macerator.addRecipe( new RecipeInputItemStack( in, in.stackSize ), null, out ); } + @Override + public void addToEnergyNet(TileEntity appEngTile) + { + // TODO Auto-generated method stub + + } + + @Override + public void removeFromEnergyNet(TileEntity appEngTile) + { + // TODO Auto-generated method stub + + } + + @Override + public ItemStack getItem(String name) + { + return ic2.api.item.Items.getItem( name ); + } + } diff --git a/integration/modules/TE.java b/integration/modules/TE.java index 4b75e1b21..c6fbfee8d 100644 --- a/integration/modules/TE.java +++ b/integration/modules/TE.java @@ -2,6 +2,8 @@ package appeng.integration.modules; import net.minecraft.item.Item; import net.minecraft.item.ItemStack; +import net.minecraft.tileentity.TileEntity; +import net.minecraftforge.common.ForgeDirection; import appeng.api.AEApi; import appeng.integration.IIntegrationModule; @@ -21,11 +23,9 @@ public class TE implements IIntegrationModule public void PostInit() { // certus quartz - pulverizer( AEApi.instance().materials().materialCertusQuartzCrystal.stack( 1 ), - AEApi.instance().materials().materialCertusQuartzDust.stack( 1 ) ); + pulverizer( AEApi.instance().materials().materialCertusQuartzCrystal.stack( 1 ), AEApi.instance().materials().materialCertusQuartzDust.stack( 1 ) ); - pulverizer( AEApi.instance().materials().materialCertusQuartzCrystalCharged.stack( 1 ), - AEApi.instance().materials().materialCertusQuartzDust.stack( 1 ) ); + pulverizer( AEApi.instance().materials().materialCertusQuartzCrystalCharged.stack( 1 ), AEApi.instance().materials().materialCertusQuartzDust.stack( 1 ) ); // fluix pulverizer( AEApi.instance().materials().materialFluixCrystal.stack( 1 ), AEApi.instance().materials().materialFluixDust.stack( 1 ) ); @@ -39,4 +39,16 @@ public class TE implements IIntegrationModule thermalexpansion.api.crafting.CraftingManagers.pulverizerManager.addRecipe( 320, in, out ); } + public void addItemsToPipe(TileEntity ad, ItemStack itemstack, ForgeDirection dir) + { + // TODO Auto-generated method stub + + } + + public boolean canAddItemsToPipe(TileEntity ad, ItemStack itemstack, ForgeDirection dir) + { + // TODO Auto-generated method stub + return false; + } + } diff --git a/integration/modules/helpers/BCPipeInventory.java b/integration/modules/helpers/BCPipeInventory.java index ef90d6eb7..4f0c6d8c5 100644 --- a/integration/modules/helpers/BCPipeInventory.java +++ b/integration/modules/helpers/BCPipeInventory.java @@ -3,6 +3,7 @@ package appeng.integration.modules.helpers; import net.minecraft.tileentity.TileEntity; import net.minecraftforge.common.ForgeDirection; import appeng.api.config.Actionable; +import appeng.api.networking.security.BaseActionSource; import appeng.api.storage.IMEInventory; import appeng.api.storage.StorageChannel; import appeng.api.storage.data.IAEItemStack; @@ -27,7 +28,7 @@ public class BCPipeInventory implements IMEInventory } @Override - public IAEItemStack injectItems(IAEItemStack input, Actionable mode) + public IAEItemStack injectItems(IAEItemStack input, Actionable mode, BaseActionSource src) { if ( mode == Actionable.SIMULATE ) { @@ -42,7 +43,7 @@ public class BCPipeInventory implements IMEInventory } @Override - public IAEItemStack extractItems(IAEItemStack request, Actionable mode) + public IAEItemStack extractItems(IAEItemStack request, Actionable mode, BaseActionSource src) { return null; } diff --git a/integration/modules/helpers/BSCrate.java b/integration/modules/helpers/BSCrate.java index 78362605f..9a22dea32 100644 --- a/integration/modules/helpers/BSCrate.java +++ b/integration/modules/helpers/BSCrate.java @@ -4,6 +4,7 @@ import net.mcft.copy.betterstorage.api.ICrateStorage; import net.minecraft.item.ItemStack; import net.minecraftforge.common.ForgeDirection; import appeng.api.config.Actionable; +import appeng.api.networking.security.BaseActionSource; import appeng.api.storage.IMEInventory; import appeng.api.storage.StorageChannel; import appeng.api.storage.data.IAEItemStack; @@ -28,7 +29,7 @@ public class BSCrate implements IMEInventory } @Override - public IAEItemStack injectItems(IAEItemStack input, Actionable mode) + public IAEItemStack injectItems(IAEItemStack input, Actionable mode, BaseActionSource src) { if ( mode == Actionable.SIMULATE ) return null; @@ -41,7 +42,7 @@ public class BSCrate implements IMEInventory } @Override - public IAEItemStack extractItems(IAEItemStack request, Actionable mode) + public IAEItemStack extractItems(IAEItemStack request, Actionable mode, BaseActionSource src) { if ( mode == Actionable.SIMULATE ) { diff --git a/integration/modules/helpers/FactorizationBarrel.java b/integration/modules/helpers/FactorizationBarrel.java index 40d865e65..4fe2bbc14 100644 --- a/integration/modules/helpers/FactorizationBarrel.java +++ b/integration/modules/helpers/FactorizationBarrel.java @@ -3,6 +3,7 @@ package appeng.integration.modules.helpers; import net.minecraft.item.ItemStack; import net.minecraft.tileentity.TileEntity; import appeng.api.config.Actionable; +import appeng.api.networking.security.BaseActionSource; import appeng.api.storage.IMEInventory; import appeng.api.storage.StorageChannel; import appeng.api.storage.data.IAEItemStack; @@ -48,7 +49,7 @@ public class FactorizationBarrel implements IMEInventory } @Override - public IAEItemStack injectItems(IAEItemStack input, Actionable mode) + public IAEItemStack injectItems(IAEItemStack input, Actionable mode, BaseActionSource src) { if ( input == null ) return null; @@ -89,7 +90,7 @@ public class FactorizationBarrel implements IMEInventory } @Override - public IAEItemStack extractItems(IAEItemStack request, Actionable mode) + public IAEItemStack extractItems(IAEItemStack request, Actionable mode, BaseActionSource src) { if ( containsItemType( request ) ) { diff --git a/integration/modules/helpers/GregTechQuantumChest.java b/integration/modules/helpers/GregTechQuantumChest.java index f089f6c68..f617a54c2 100644 --- a/integration/modules/helpers/GregTechQuantumChest.java +++ b/integration/modules/helpers/GregTechQuantumChest.java @@ -4,6 +4,7 @@ import gregtechmod.api.interfaces.IDigitalChest; import net.minecraft.inventory.IInventory; import net.minecraft.item.ItemStack; import appeng.api.config.Actionable; +import appeng.api.networking.security.BaseActionSource; import appeng.api.storage.data.IAEItemStack; import appeng.api.storage.data.IItemList; import appeng.me.storage.MEIInventoryWrapper; @@ -29,7 +30,7 @@ public class GregTechQuantumChest extends MEIInventoryWrapper } @Override - public IAEItemStack injectItems(IAEItemStack input, Actionable mode) + public IAEItemStack injectItems(IAEItemStack input, Actionable mode, BaseActionSource src) { ItemStack type = getType(); if ( input.hasTagCompound() ) @@ -52,7 +53,7 @@ public class GregTechQuantumChest extends MEIInventoryWrapper if ( mode == Actionable.MODULATE ) qc.setItemCount( type.stackSize + room ); - return super.injectItems( is, mode ); + return super.injectItems( is, mode, src ); } if ( mode == Actionable.MODULATE ) @@ -61,14 +62,14 @@ public class GregTechQuantumChest extends MEIInventoryWrapper return null; } - return super.injectItems( input, mode ); + return super.injectItems( input, mode, src ); } return input; } @Override - public IAEItemStack extractItems(IAEItemStack i, Actionable mode) + public IAEItemStack extractItems(IAEItemStack i, Actionable mode, BaseActionSource src) { ItemStack type = getType(); if ( type != null ) @@ -85,7 +86,7 @@ public class GregTechQuantumChest extends MEIInventoryWrapper } } } - return super.extractItems( i, mode ); + return super.extractItems( i, mode, src ); } @Override diff --git a/integration/modules/helpers/MFRDSU.java b/integration/modules/helpers/MFRDSU.java index 580091413..a873b193e 100644 --- a/integration/modules/helpers/MFRDSU.java +++ b/integration/modules/helpers/MFRDSU.java @@ -4,6 +4,7 @@ import net.minecraft.item.ItemStack; import net.minecraft.tileentity.TileEntity; import powercrystals.minefactoryreloaded.api.IDeepStorageUnit; import appeng.api.config.Actionable; +import appeng.api.networking.security.BaseActionSource; import appeng.api.storage.IMEInventory; import appeng.api.storage.StorageChannel; import appeng.api.storage.data.IAEItemStack; @@ -28,7 +29,7 @@ public class MFRDSU implements IMEInventory } @Override - public IAEItemStack injectItems(IAEItemStack input, Actionable mode) + public IAEItemStack injectItems(IAEItemStack input, Actionable mode, BaseActionSource src) { ItemStack is = dsu.getStoredItemType(); if ( is != null ) @@ -66,7 +67,7 @@ public class MFRDSU implements IMEInventory } @Override - public IAEItemStack extractItems(IAEItemStack request, Actionable mode) + public IAEItemStack extractItems(IAEItemStack request, Actionable mode, BaseActionSource src) { ItemStack is = dsu.getStoredItemType(); if ( request.equals( is ) ) diff --git a/items/materials/ItemMaterial.java b/items/materials/ItemMaterial.java index 8ccd339fe..70c6b8a1c 100644 --- a/items/materials/ItemMaterial.java +++ b/items/materials/ItemMaterial.java @@ -1,24 +1,33 @@ package appeng.items.materials; +import java.util.Collections; +import java.util.Comparator; import java.util.EnumSet; import java.util.HashMap; +import java.util.LinkedList; import java.util.List; +import java.util.Map.Entry; +import java.util.regex.Matcher; +import java.util.regex.Pattern; import net.minecraft.client.renderer.texture.IconRegister; import net.minecraft.creativetab.CreativeTabs; import net.minecraft.entity.Entity; import net.minecraft.entity.item.EntityItem; +import net.minecraft.entity.player.EntityPlayer; import net.minecraft.item.ItemStack; import net.minecraft.util.Icon; import net.minecraft.world.World; import net.minecraftforge.oredict.OreDictionary; import appeng.api.config.Upgrades; +import appeng.api.implementations.IItemGroup; import appeng.api.implementations.IStorageComponent; import appeng.api.implementations.IUpgradeModule; import appeng.core.Configuration; import appeng.core.features.AEFeature; import appeng.core.features.AEFeatureHandler; import appeng.items.AEBaseItem; +import appeng.util.Platform; public class ItemMaterial extends AEBaseItem implements IStorageComponent, IUpgradeModule { @@ -28,6 +37,75 @@ public class ItemMaterial extends AEBaseItem implements IStorageComponent, IUpgr public ItemMaterial() { super( ItemMaterial.class ); setfeature( EnumSet.of( AEFeature.Core ) ); + setHasSubtypes( true ); + } + + class SlightlyBetterSort implements Comparator + { + + Pattern p; + + public SlightlyBetterSort(Pattern p) { + this.p = p; + } + + @Override + public int compare(String o1, String o2) + { + try + { + Matcher a = p.matcher( o1 ); + Matcher b = p.matcher( o2 ); + if ( a.find() && b.find() ) + { + int ia = Integer.parseInt( a.group( 1 ) ); + int ib = Integer.parseInt( b.group( 1 ) ); + return Integer.compare( ia, ib ); + } + } + catch (Throwable t) + { + // ek! + } + return o1.compareTo( o2 ); + } + } + + @Override + public void addInformation(ItemStack par1ItemStack, EntityPlayer par2EntityPlayer, List par3List, boolean par4) + { + super.addInformation( par1ItemStack, par2EntityPlayer, par3List, par4 ); + + Upgrades u = getType( par1ItemStack ); + if ( u != null ) + { + List textList = new LinkedList(); + for (Entry j : u.getSupported().entrySet()) + { + String name = null; + + int limit = j.getValue(); + + if ( j.getKey().getItem() instanceof IItemGroup ) + { + IItemGroup ig = (IItemGroup) j.getKey().getItem(); + String str = ig.getUnlocalizedGroupName( j.getKey() ); + if ( str != null ) + name = Platform.gui_localize( str ) + (limit > 1 ? " (" + limit + ")" : ""); + } + + if ( name == null ) + name = j.getKey().getDisplayName() + (limit > 1 ? " (" + limit + ")" : ""); + + if ( !textList.contains( name ) ) + textList.add( name ); + } + + Pattern p = Pattern.compile( "(\\d+)[^\\d]" ); + SlightlyBetterSort s = new SlightlyBetterSort( p ); + Collections.sort( textList, s ); + par3List.addAll( textList ); + } } public ItemStack createMaterial(MaterialType mat) @@ -72,21 +150,26 @@ public class ItemMaterial extends AEBaseItem implements IStorageComponent, IUpgr return dmgToMaterial.get( dmg ).icon; } - @Override - public String getUnlocalizedName(ItemStack is) + private String nameOf(ItemStack is) { return AEFeatureHandler.getName( ItemMaterial.class, getTypeByStack( is ).name() ); } @Override - public void registerIcons(IconRegister par1IconRegister) + public String getUnlocalizedName(ItemStack is) + { + return "item.appliedenergistics2." + nameOf( is ); + } + + @Override + public void registerIcons(IconRegister icoRegister) { for (MaterialType mat : MaterialType.values()) { if ( mat.damageValue != -1 ) { - String tex = "appliedenergistics2:" + getUnlocalizedName( new ItemStack( this, 1, mat.damageValue ) ); - mat.icon = par1IconRegister.registerIcon( tex ); + String tex = "appliedenergistics2:" + nameOf( new ItemStack( this, 1, mat.damageValue ) ); + mat.icon = icoRegister.registerIcon( tex ); } } } @@ -169,6 +252,8 @@ public class ItemMaterial extends AEBaseItem implements IStorageComponent, IUpgr return Upgrades.REDSTONE; case CardSpeed: return Upgrades.SPEED; + case CardInverter: + return Upgrades.INVERTER; default: return null; } diff --git a/items/materials/MaterialType.java b/items/materials/MaterialType.java index a02175f7f..0beae5b1d 100644 --- a/items/materials/MaterialType.java +++ b/items/materials/MaterialType.java @@ -35,7 +35,7 @@ public enum MaterialType BasicCard, CardRedstone, CardCapacity, // Adv Cards - AdvCard, CardFuzzy, CardSpeed, + AdvCard, CardFuzzy, CardSpeed, CardInverter, Cell2SpatialPart(AEFeature.SpatialIO), Cell16SpatialPart(AEFeature.SpatialIO), Cell128SpatialPart(AEFeature.SpatialIO), @@ -48,8 +48,8 @@ public enum MaterialType BlankPattern, FormationCore, AnnihilationCore, - EnderDust(AEFeature.QuantumNetworkBridge, "dustEnder"), Singularity(AEFeature.QuantumNetworkBridge), QESingularity(AEFeature.QuantumNetworkBridge, - EntitySingularity.class); + EnderDust(AEFeature.QuantumNetworkBridge, "dustEnder", EntitySingularity.class), Singularity(AEFeature.QuantumNetworkBridge, EntitySingularity.class), QESingularity( + AEFeature.QuantumNetworkBridge, EntitySingularity.class); private String oreName; private EnumSet features; @@ -75,6 +75,16 @@ public enum MaterialType EntityRegistry.registerModEntity( droppedEntity, droppedEntity.getSimpleName(), EntityIds.get( droppedEntity ), AppEng.instance, 16, 4, true ); } + MaterialType(AEFeature part, String oreDictionary, Class c) { + features = EnumSet.of( part ); + oreName = oreDictionary; + if ( OreDictionary.getOres( oreDictionary ).size() > 0 ) + features.add( AEFeature.DuplicateItems ); + + droppedEntity = c; + EntityRegistry.registerModEntity( droppedEntity, droppedEntity.getSimpleName(), EntityIds.get( droppedEntity ), AppEng.instance, 16, 4, true ); + } + MaterialType(AEFeature part, String oreDictionary) { features = EnumSet.of( part ); oreName = oreDictionary; diff --git a/items/parts/ItemPart.java b/items/parts/ItemPart.java index 56f29f092..3f39e06a9 100644 --- a/items/parts/ItemPart.java +++ b/items/parts/ItemPart.java @@ -12,16 +12,18 @@ import net.minecraft.item.ItemStack; import net.minecraft.util.Icon; import net.minecraft.world.World; import appeng.api.AEApi; +import appeng.api.implementations.IItemGroup; import appeng.api.parts.IPart; import appeng.api.parts.IPartItem; import appeng.core.Configuration; import appeng.core.features.AEFeature; import appeng.core.features.AEFeatureHandler; +import appeng.core.localization.GuiText; import appeng.items.AEBaseItem; import cpw.mods.fml.relauncher.Side; import cpw.mods.fml.relauncher.SideOnly; -public class ItemPart extends AEBaseItem implements IPartItem +public class ItemPart extends AEBaseItem implements IPartItem, IItemGroup { class PartTypeIst @@ -98,16 +100,32 @@ public class ItemPart extends AEBaseItem implements IPartItem @Override public String getUnlocalizedName(ItemStack is) + { + return "item.appliedenergistics2." + getname( is ); + } + + public String getname(ItemStack is) { return AEFeatureHandler.getName( ItemPart.class, getTypeByStack( is ).name() ); } + @Override + public String getItemDisplayName(ItemStack is) + { + Enum[] varients = getTypeByStack( is ).getVarients(); + + if ( varients != null ) + return super.getItemDisplayName( is ) + " - " + varients[dmgToPart.get( is.getItemDamage() ).varient].toString(); + + return super.getItemDisplayName( is ); + } + @Override public void registerIcons(IconRegister par1IconRegister) { for (Entry part : dmgToPart.entrySet()) { - String tex = "appliedenergistics2:" + getUnlocalizedName( new ItemStack( this, 1, part.getKey() ) ); + String tex = "appliedenergistics2:" + getname( new ItemStack( this, 1, part.getKey() ) ); part.getValue().ico = par1IconRegister.registerIcon( tex ); } } @@ -145,4 +163,17 @@ public class ItemPart extends AEBaseItem implements IPartItem return dmgToPart.get( itemDamage ).varient; } + @Override + public String getUnlocalizedGroupName(ItemStack is) + { + switch (getTypeByStack( is )) + { + case ImportBus: + case ExportBus: + return GuiText.IOBuses.getUnlocalized(); + default: + } + return null; + } + } diff --git a/items/parts/PartType.java b/items/parts/PartType.java index ee54f7a2d..b6e9a8b79 100644 --- a/items/parts/PartType.java +++ b/items/parts/PartType.java @@ -13,13 +13,19 @@ import appeng.parts.automation.PartLevelEmitter; import appeng.parts.misc.PartCableAnchor; import appeng.parts.misc.PartInterface; import appeng.parts.misc.PartInvertedToggleBus; -import appeng.parts.misc.PartP2PTunnel; import appeng.parts.misc.PartStorageBus; import appeng.parts.misc.PartToggleBus; import appeng.parts.networking.PartCableCovered; import appeng.parts.networking.PartCableGlass; import appeng.parts.networking.PartCableSmart; +import appeng.parts.networking.PartDenseCable; import appeng.parts.networking.PartQuartzFiber; +import appeng.parts.p2p.PartP2PBCPower; +import appeng.parts.p2p.PartP2PIC2Power; +import appeng.parts.p2p.PartP2PItems; +import appeng.parts.p2p.PartP2PLiquids; +import appeng.parts.p2p.PartP2PRedstone; +import appeng.parts.p2p.PartP2PTunnelME; import appeng.parts.reporting.PartConversionMonitor; import appeng.parts.reporting.PartCraftingMonitor; import appeng.parts.reporting.PartCraftingTerminal; @@ -38,6 +44,8 @@ public enum PartType CableSmart(AEFeature.Core, PartCableSmart.class), CableCovered(AEFeature.Core, PartCableCovered.class), CableGlass(AEFeature.Core, PartCableGlass.class), + CableDense(AEFeature.DenseCables, PartDenseCable.class), + CableAnchor(AEFeature.Core, PartCableAnchor.class), QuartzFiber(AEFeature.Core, PartQuartzFiber.class), @@ -60,7 +68,17 @@ public enum PartType FormationPlane(AEFeature.FormationPlane, PartFormationPlane.class), - P2PTunnel(AEFeature.P2PTunnel, PartP2PTunnel.class), + P2PTunnelME(AEFeature.P2PTunnelME, PartP2PTunnelME.class), + + P2PTunnelRedstone(AEFeature.P2PTunnelRedstone, PartP2PRedstone.class), + + P2PTunnelItems(AEFeature.P2PTunnelItems, PartP2PItems.class), + + P2PTunnelLiquids(AEFeature.P2PTunnelLiquids, PartP2PLiquids.class), + + P2PTunnelMJ(AEFeature.P2PTunnelMJ, PartP2PBCPower.class), + + P2PTunnelEU(AEFeature.P2PTunnelEU, PartP2PIC2Power.class), CraftingMonitor(AEFeature.Crafting, PartCraftingMonitor.class), @@ -86,7 +104,7 @@ public enum PartType public Enum[] getVarients() { - return (this == CableSmart || this == CableCovered || this == CableGlass) ? AEColor.values() : null; + return (this == CableSmart || this == CableCovered || this == CableGlass || this == CableDense) ? AEColor.values() : null; } public EnumSet getFeature() diff --git a/items/storage/CellConfig.java b/items/storage/CellConfig.java new file mode 100644 index 000000000..4d0263666 --- /dev/null +++ b/items/storage/CellConfig.java @@ -0,0 +1,24 @@ +package appeng.items.storage; + +import net.minecraft.item.ItemStack; +import appeng.tile.inventory.AppEngInternalInventory; +import appeng.util.Platform; + +public class CellConfig extends AppEngInternalInventory +{ + + final ItemStack is; + + public CellConfig(ItemStack is) { + super( null, 63 ); + this.is = is; + readFromNBT( Platform.openNbtData( is ), "list" ); + } + + @Override + public void onInventoryChanged() + { + writeToNBT( Platform.openNbtData( is ), "list" ); + } + +} \ No newline at end of file diff --git a/items/storage/CellUpgrades.java b/items/storage/CellUpgrades.java new file mode 100644 index 000000000..3f2f148d6 --- /dev/null +++ b/items/storage/CellUpgrades.java @@ -0,0 +1,24 @@ +package appeng.items.storage; + +import net.minecraft.item.ItemStack; +import appeng.parts.automation.UpgradeInventory; +import appeng.util.Platform; + +public class CellUpgrades extends UpgradeInventory +{ + + final ItemStack is; + + public CellUpgrades(ItemStack is, int upgrades) { + super( is.getItem(), null, upgrades ); + this.is = is; + readFromNBT( Platform.openNbtData( is ), "upgrades" ); + } + + @Override + public void onInventoryChanged() + { + writeToNBT( Platform.openNbtData( is ), "upgrades" ); + } + +} \ No newline at end of file diff --git a/items/storage/ItemBasicStorageCell.java b/items/storage/ItemBasicStorageCell.java index 2d42d4c06..35bc86022 100644 --- a/items/storage/ItemBasicStorageCell.java +++ b/items/storage/ItemBasicStorageCell.java @@ -4,18 +4,25 @@ import java.util.EnumSet; import java.util.List; import net.minecraft.entity.player.EntityPlayer; +import net.minecraft.inventory.IInventory; import net.minecraft.item.Item; import net.minecraft.item.ItemStack; -import net.minecraft.util.StatCollector; +import appeng.api.AEApi; +import appeng.api.config.FuzzyMode; +import appeng.api.implementations.IItemGroup; import appeng.api.implementations.IStorageCell; +import appeng.api.storage.IMEInventory; +import appeng.api.storage.StorageChannel; import appeng.api.storage.data.IAEItemStack; import appeng.core.features.AEFeature; +import appeng.core.localization.GuiText; import appeng.items.AEBaseItem; import appeng.items.materials.MaterialType; import appeng.me.storage.CellInventory; import appeng.me.storage.CellInventoryHandler; +import appeng.util.Platform; -public class ItemBasicStorageCell extends AEBaseItem implements IStorageCell +public class ItemBasicStorageCell extends AEBaseItem implements IStorageCell, IItemGroup { final MaterialType component; @@ -25,7 +32,7 @@ public class ItemBasicStorageCell extends AEBaseItem implements IStorageCell public ItemBasicStorageCell(MaterialType whichCell, int Kilobytes) { super( ItemBasicStorageCell.class, Kilobytes + "k" ); setfeature( EnumSet.of( AEFeature.StorageCells ) ); - maxStackSize = 1; + setMaxStackSize( 1 ); totalBytes = Kilobytes * 1024; component = whichCell; @@ -51,22 +58,24 @@ public class ItemBasicStorageCell extends AEBaseItem implements IStorageCell @Override public void addInformation(ItemStack i, EntityPlayer p, List l, boolean b) { - CellInventory cd = ((CellInventoryHandler) CellInventory.getCell( i )).getCellInv(); + IMEInventory cdi = AEApi.instance().registries().cell().getCellInventory( i, StorageChannel.ITEMS ); - if ( cd != null ) + if ( cdi instanceof CellInventoryHandler ) { - l.add( cd.usedBytes() + " " + StatCollector.translateToLocal( "Appeng.GuiITooltip.Of" ) + " " + cd.totalBytes() + " " - + StatCollector.translateToLocal( "Appeng.GuiITooltip.BytesUsed" ) ); - l.add( cd.storedItemTypes() + " " + StatCollector.translateToLocal( "Appeng.GuiITooltip.Of" ) + " " + cd.getTotalItemTypes() + " " - + StatCollector.translateToLocal( "Appeng.GuiITooltip.Types" ) ); - /* - * if ( cd.isPreformatted() ) { String List = StatCollector.translateToLocal( cd.getListMode() == - * ListMode.WHITELIST ? "AppEng.Gui.Whitelisted" : "AppEng.Gui.Blacklisted" ); if ( cd.isFuzzyPreformatted() - * ) l.add( StatCollector.translateToLocal( "Appeng.GuiITooltip.Partitioned" ) + " - " + List + " " + - * StatCollector.translateToLocal( "Appeng.GuiITooltip.Fuzzy" ) ); else l.add( - * StatCollector.translateToLocal( "Appeng.GuiITooltip.Partitioned" ) + " - " + List + " " + - * StatCollector.translateToLocal( "Appeng.GuiITooltip.Precise" ) ); } - */ + CellInventory cd = ((CellInventoryHandler) cdi).getCellInv(); + if ( cd != null ) + { + l.add( cd.usedBytes() + " " + GuiText.Of.getLocal() + " " + cd.totalBytes() + " " + GuiText.BytesUsed.getLocal() ); + l.add( cd.storedItemTypes() + " " + GuiText.Of.getLocal() + " " + cd.getTotalItemTypes() + " " + GuiText.Types.getLocal() ); + /* + * if ( cd.isPreformatted() ) { String List = StatCollector.translateToLocal( cd.getListMode() == + * ListMode.WHITELIST ? "AppEng.Gui.Whitelisted" : "AppEng.Gui.Blacklisted" ); if ( + * cd.isFuzzyPreformatted() ) l.add( StatCollector.translateToLocal( "Appeng.GuiITooltip.Partitioned" ) + * + " - " + List + " " + StatCollector.translateToLocal( "Appeng.GuiITooltip.Fuzzy" ) ); else l.add( + * StatCollector.translateToLocal( "Appeng.GuiITooltip.Partitioned" ) + " - " + List + " " + + * StatCollector.translateToLocal( "Appeng.GuiITooltip.Precise" ) ); } + */ + } } } @@ -116,4 +125,49 @@ public class ItemBasicStorageCell extends AEBaseItem implements IStorageCell { return idleDrain; } + + @Override + public IInventory getUpgradesInventory(ItemStack is) + { + return new CellUpgrades( is, 2 ); + } + + @Override + public IInventory getConfigInventory(ItemStack is) + { + return new CellConfig( is ); + } + + @Override + public FuzzyMode getFuzzyMode(ItemStack is) + { + String fz = Platform.openNbtData( is ).getString( "FuzzyMode" ); + try + { + return FuzzyMode.valueOf( fz ); + } + catch (Throwable t) + { + return FuzzyMode.IGNORE_ALL; + } + } + + @Override + public void setFuzzyMode(ItemStack is, FuzzyMode fzMode) + { + Platform.openNbtData( is ).setString( "FuzzyMode", fzMode.name() ); + } + + @Override + public String getUnlocalizedGroupName(ItemStack is) + { + return GuiText.StorageCells.getUnlocalized(); + } + + @Override + public boolean isEditable(ItemStack is) + { + return true; + } + } diff --git a/items/storage/ItemCreativeStorageCell.java b/items/storage/ItemCreativeStorageCell.java index 0851c24b3..697d245e0 100644 --- a/items/storage/ItemCreativeStorageCell.java +++ b/items/storage/ItemCreativeStorageCell.java @@ -2,16 +2,49 @@ package appeng.items.storage; import java.util.EnumSet; +import net.minecraft.inventory.IInventory; +import net.minecraft.item.ItemStack; +import appeng.api.config.FuzzyMode; +import appeng.api.storage.ICellWorkbenchItem; import appeng.core.features.AEFeature; import appeng.items.AEBaseItem; -public class ItemCreativeStorageCell extends AEBaseItem +public class ItemCreativeStorageCell extends AEBaseItem implements ICellWorkbenchItem { public ItemCreativeStorageCell() { super( ItemCreativeStorageCell.class ); setfeature( EnumSet.of( AEFeature.StorageCells, AEFeature.Creative ) ); - maxStackSize = 1; + setMaxStackSize( 1 ); } + @Override + public boolean isEditable(ItemStack is) + { + return true; + } + + @Override + public IInventory getUpgradesInventory(ItemStack is) + { + return null; + } + + @Override + public IInventory getConfigInventory(ItemStack is) + { + return new CellConfig( is ); + } + + @Override + public FuzzyMode getFuzzyMode(ItemStack is) + { + return FuzzyMode.IGNORE_ALL; + } + + @Override + public void setFuzzyMode(ItemStack is, FuzzyMode fzMode) + { + + } } diff --git a/items/storage/ItemSpatialStorageCell.java b/items/storage/ItemSpatialStorageCell.java index ce60f96ee..012655f68 100644 --- a/items/storage/ItemSpatialStorageCell.java +++ b/items/storage/ItemSpatialStorageCell.java @@ -8,12 +8,14 @@ import appeng.items.materials.MaterialType; public class ItemSpatialStorageCell extends AEBaseItem { + final MaterialType component; final int maxRegion; public ItemSpatialStorageCell(MaterialType whichCell, int spatialScale) { super( ItemSpatialStorageCell.class, spatialScale + "Cubed" ); setfeature( EnumSet.of( AEFeature.SpatialIO ) ); + setMaxStackSize( 1 ); maxRegion = spatialScale; component = whichCell; } diff --git a/items/tools/ToolMemoryCard.java b/items/tools/ToolMemoryCard.java index 965ad630b..4f8319d8c 100644 --- a/items/tools/ToolMemoryCard.java +++ b/items/tools/ToolMemoryCard.java @@ -21,6 +21,7 @@ public class ToolMemoryCard extends AEBaseItem implements IMemoryCard public ToolMemoryCard() { super( ToolMemoryCard.class ); setfeature( EnumSet.of( AEFeature.Core ) ); + setMaxStackSize( 1 ); } @Override @@ -39,7 +40,6 @@ public class ToolMemoryCard extends AEBaseItem implements IMemoryCard { NBTTagCompound c = Platform.openNbtData( is ); c.setString( "Config", SettingsName ); - ; c.setCompoundTag( "Data", data ); } @@ -64,6 +64,9 @@ public class ToolMemoryCard extends AEBaseItem implements IMemoryCard @Override public void notifyUser(Block blk, EntityPlayer player, MemoryCardMessages msg) { + if ( Platform.isClient() ) + return; + switch (msg) { case INVALID_MACHINE: diff --git a/items/tools/powered/ToolMassCannon.java b/items/tools/powered/ToolMassCannon.java index 0da6709ec..490ce7f30 100644 --- a/items/tools/powered/ToolMassCannon.java +++ b/items/tools/powered/ToolMassCannon.java @@ -1,11 +1,48 @@ package appeng.items.tools.powered; import java.util.EnumSet; +import java.util.List; +import net.minecraft.block.Block; +import net.minecraft.entity.Entity; +import net.minecraft.entity.EntityLivingBase; +import net.minecraft.entity.item.EntityItem; +import net.minecraft.entity.player.EntityPlayer; +import net.minecraft.inventory.IInventory; +import net.minecraft.item.ItemStack; +import net.minecraft.util.AxisAlignedBB; +import net.minecraft.util.DamageSource; +import net.minecraft.util.EnumMovingObjectType; +import net.minecraft.util.MathHelper; +import net.minecraft.util.MovingObjectPosition; +import net.minecraft.util.Vec3; +import net.minecraft.world.World; +import appeng.api.AEApi; +import appeng.api.config.Actionable; +import appeng.api.config.FuzzyMode; +import appeng.api.config.Upgrades; +import appeng.api.implementations.IStorageCell; +import appeng.api.networking.security.PlayerSource; +import appeng.api.storage.IMEInventory; +import appeng.api.storage.StorageChannel; +import appeng.api.storage.data.IAEItemStack; +import appeng.api.storage.data.IAEStack; +import appeng.api.storage.data.IItemList; +import appeng.core.CommonHelper; +import appeng.core.Configuration; import appeng.core.features.AEFeature; +import appeng.core.localization.GuiText; +import appeng.core.localization.PlayerMessages; +import appeng.core.sync.packets.PacketMatterCannon; +import appeng.items.storage.CellConfig; +import appeng.items.storage.CellUpgrades; import appeng.items.tools.powered.powersink.AEBasePoweredItem; +import appeng.me.storage.CellInventory; +import appeng.me.storage.CellInventoryHandler; +import appeng.util.Platform; +import appeng.util.item.ItemList; -public class ToolMassCannon extends AEBasePoweredItem +public class ToolMassCannon extends AEBasePoweredItem implements IStorageCell { public ToolMassCannon() { @@ -13,4 +50,291 @@ public class ToolMassCannon extends AEBasePoweredItem setfeature( EnumSet.of( AEFeature.MatterCannon, AEFeature.PoweredTools ) ); } + @Override + public void addInformation(ItemStack is, EntityPlayer player, List lines, boolean advancedItemTooltips) + { + super.addInformation( is, player, lines, advancedItemTooltips ); + + IMEInventory cdi = AEApi.instance().registries().cell().getCellInventory( is, StorageChannel.ITEMS ); + + if ( cdi instanceof CellInventoryHandler ) + { + CellInventory cd = ((CellInventoryHandler) cdi).getCellInv(); + if ( cd != null ) + { + lines.add( cd.usedBytes() + " " + GuiText.Of.getLocal() + " " + cd.totalBytes() + " " + GuiText.BytesUsed.getLocal() ); + lines.add( cd.storedItemTypes() + " " + GuiText.Of.getLocal() + " " + cd.getTotalItemTypes() + " " + GuiText.Types.getLocal() ); + } + } + } + + @Override + public ItemStack onItemRightClick(ItemStack item, World w, EntityPlayer p) + { + if ( this.getAECurrentPower( item ) > 1600 ) + { + int shots = 1; + + CellUpgrades cu = (CellUpgrades) getUpgradesInventory( item ); + if ( cu != null ) + shots += cu.getInstalledUpgrades( Upgrades.SPEED ); + + for (int sh = 0; sh < shots; sh++) + { + extractAEPower( item, 1600 ); + + if ( Platform.isClient() ) + return item; + + IMEInventory inv = AEApi.instance().registries().cell().getCellInventory( item, StorageChannel.ITEMS ); + if ( inv != null ) + { + IItemList itemList = inv.getAvailableItems( new ItemList() ); + IAEStack aeammo = itemList.getFirstItem(); + if ( aeammo instanceof IAEItemStack ) + { + aeammo.setStackSize( 1 ); + ItemStack ammo = ((IAEItemStack) aeammo).getItemStack(); + if ( ammo == null ) + return item; + + ammo.stackSize = 1; + aeammo = inv.extractItems( aeammo, Actionable.MODULATE, new PlayerSource( p, null ) ); + if ( aeammo == null ) + return item; + + float f = 1.0F; + float f1 = p.prevRotationPitch + (p.rotationPitch - p.prevRotationPitch) * f; + float f2 = p.prevRotationYaw + (p.rotationYaw - p.prevRotationYaw) * f; + double d0 = p.prevPosX + (p.posX - p.prevPosX) * (double) f; + double d1 = p.prevPosY + (p.posY - p.prevPosY) * (double) f + 1.62D - (double) p.yOffset; + double d2 = p.prevPosZ + (p.posZ - p.prevPosZ) * (double) f; + Vec3 vec3 = w.getWorldVec3Pool().getVecFromPool( d0, d1, d2 ); + float f3 = MathHelper.cos( -f2 * 0.017453292F - (float) Math.PI ); + float f4 = MathHelper.sin( -f2 * 0.017453292F - (float) Math.PI ); + float f5 = -MathHelper.cos( -f1 * 0.017453292F ); + float f6 = MathHelper.sin( -f1 * 0.017453292F ); + float f7 = f4 * f5; + float f8 = f3 * f5; + double d3 = 32.0D; + + float penitration = AEApi.instance().registries().matterCannon().getPenetration( ammo ); // 196.96655f; + boolean hasDestroyedSomething = true; + while (penitration > 0 && hasDestroyedSomething) + { + hasDestroyedSomething = false; + + Vec3 vec31 = vec3.addVector( (double) f7 * d3, (double) f6 * d3, (double) f8 * d3 ); + + AxisAlignedBB bb = AxisAlignedBB + .getAABBPool() + .getAABB( Math.min( vec3.xCoord, vec31.xCoord ), Math.min( vec3.yCoord, vec31.yCoord ), + Math.min( vec3.zCoord, vec31.zCoord ), Math.max( vec3.xCoord, vec31.xCoord ), + Math.max( vec3.yCoord, vec31.yCoord ), Math.max( vec3.zCoord, vec31.zCoord ) ).expand( 16, 16, 16 ); + + Entity entity = null; + List list = w.getEntitiesWithinAABBExcludingEntity( p, bb ); + double Closeest = 9999999.0D; + int l; + + for (l = 0; l < list.size(); ++l) + { + Entity entity1 = (Entity) list.get( l ); + + if ( entity1.isDead == false && entity1 != p && !(entity1 instanceof EntityItem) ) + { + if ( entity1.isEntityAlive() ) + { + // prevent killing / flying of mounts. + if ( entity1.riddenByEntity == p ) + continue; + + f1 = 0.3F; + AxisAlignedBB axisalignedbb1 = entity1.boundingBox.expand( (double) f1, (double) f1, (double) f1 ); + MovingObjectPosition movingobjectposition1 = axisalignedbb1.calculateIntercept( vec3, vec31 ); + + if ( movingobjectposition1 != null ) + { + double nd = vec3.squareDistanceTo( movingobjectposition1.hitVec ); + + if ( nd < Closeest ) + { + entity = entity1; + Closeest = nd; + } + } + } + } + } + + Vec3 Srec = w.getWorldVec3Pool().getVecFromPool( d0, d1, d2 ); + MovingObjectPosition pos = w.rayTraceBlocks_do_do( vec3, vec31, true, false ); + if ( entity != null && pos != null && pos.hitVec.squareDistanceTo( Srec ) > Closeest ) + { + pos = new MovingObjectPosition( entity ); + } + else if ( entity != null && pos == null ) + { + pos = new MovingObjectPosition( entity ); + } + + try + { + CommonHelper.proxy.sendToAllNearExcept( null, d0, d1, d2, 128, w, (new PacketMatterCannon( d0, d1, d2, (float) (f7 * d3), + (float) (f6 * d3), (float) (f8 * d3), (byte) (pos == null ? 32 : pos.hitVec.squareDistanceTo( Srec ) + 1) )) + .getPacket() ); + + } + catch (Exception err) + { + err.printStackTrace(); + } + + if ( pos != null ) + { + DamageSource dmgSrc = DamageSource.causePlayerDamage( p ); + dmgSrc.damageType = "masscannon"; + + if ( pos.typeOfHit == EnumMovingObjectType.ENTITY ) + { + int dmg = (int) Math.ceil( penitration / 20.0f ); + if ( pos.entityHit instanceof EntityLivingBase ) + { + EntityLivingBase el = (EntityLivingBase) pos.entityHit; + penitration -= dmg; + el.knockBack( p, 0, (double) f7 * d3, (double) f8 * d3 ); + // el.knockBack( p, 0, vec3.xCoord, vec3.zCoord ); + el.attackEntityFrom( dmgSrc, dmg ); + if ( !el.isEntityAlive() ) + hasDestroyedSomething = true; + } + else if ( pos.entityHit instanceof EntityItem ) + { + hasDestroyedSomething = true; + pos.entityHit.setDead(); + } + else if ( pos.entityHit.attackEntityFrom( dmgSrc, dmg ) ) + { + hasDestroyedSomething = true; + } + } + else if ( pos.typeOfHit == EnumMovingObjectType.TILE ) + { + if ( !Configuration.instance.isFeatureEnabled( AEFeature.MassCannonBlockDamage ) ) + penitration = 0; + else + { + int bid = w.getBlockId( pos.blockX, pos.blockY, pos.blockZ ); + // int meta = w.getBlockMetadata( pos.blockX, pos.blockY, pos.blockZ ); + + if ( bid > 0 ) + { + Block b = Block.blocksList[bid]; + float hardness = b.getBlockHardness( w, pos.blockX, pos.blockY, pos.blockZ ) * 9.0f; + if ( hardness >= 0.0 ) + { + if ( penitration > hardness ) + { + hasDestroyedSomething = true; + penitration -= hardness; + penitration *= 0.60; + w.destroyBlock( pos.blockX, pos.blockY, pos.blockZ, true ); + } + } + } + } + } + } + } + } + } + else + { + p.sendChatToPlayer( PlayerMessages.AmmoDepleted.get() ); + return item; + } + } + } + return item; + } + + @Override + public boolean storableInStorageCell() + { + return true; + } + + @Override + public boolean isStorageCell(ItemStack i) + { + return true; + } + + @Override + public double getIdleDrain() + { + return 0.5; + } + + @Override + public IInventory getUpgradesInventory(ItemStack is) + { + return new CellUpgrades( is, 4 ); + } + + @Override + public IInventory getConfigInventory(ItemStack is) + { + return new CellConfig( is ); + } + + @Override + public FuzzyMode getFuzzyMode(ItemStack is) + { + String fz = Platform.openNbtData( is ).getString( "FuzzyMode" ); + try + { + return FuzzyMode.valueOf( fz ); + } + catch (Throwable t) + { + return FuzzyMode.IGNORE_ALL; + } + } + + @Override + public void setFuzzyMode(ItemStack is, FuzzyMode fzMode) + { + Platform.openNbtData( is ).setString( "FuzzyMode", fzMode.name() ); + } + + @Override + public boolean isEditable(ItemStack is) + { + return true; + } + + @Override + public int getBytes(ItemStack cellItem) + { + return 512; + } + + @Override + public int BytePerType(ItemStack iscellItem) + { + return 8; + } + + @Override + public int getTotalTypes(ItemStack cellItem) + { + return 1; + } + + @Override + public boolean isBlackListed(ItemStack cellItem, IAEItemStack requsetedAddition) + { + return AEApi.instance().registries().matterCannon().getPenetration( requsetedAddition.getItemStack() ) == 0; + } } diff --git a/items/tools/powered/ToolNetworkTool.java b/items/tools/powered/ToolNetworkTool.java new file mode 100644 index 000000000..b4bcae9f1 --- /dev/null +++ b/items/tools/powered/ToolNetworkTool.java @@ -0,0 +1,26 @@ +package appeng.items.tools.powered; + +import java.util.EnumSet; + +import net.minecraft.item.ItemStack; +import appeng.core.features.AEFeature; +import appeng.helpers.IGuiItem; +import appeng.items.tools.powered.powersink.AEBasePoweredItem; + +public class ToolNetworkTool extends AEBasePoweredItem implements IGuiItem +{ + + public ToolNetworkTool() { + super( ToolNetworkTool.class, null ); + setfeature( EnumSet.of( AEFeature.NetworkTool, AEFeature.PoweredTools ) ); + maxStoredPower = 100000; + } + + @Override + public Object getGuiObject(ItemStack is) + { + // TODO Auto-generated method stub + return null; + } + +} diff --git a/items/tools/powered/ToolPortableCell.java b/items/tools/powered/ToolPortableCell.java new file mode 100644 index 000000000..73fdbd0c1 --- /dev/null +++ b/items/tools/powered/ToolPortableCell.java @@ -0,0 +1,154 @@ +package appeng.items.tools.powered; + +import java.util.EnumSet; +import java.util.List; + +import net.minecraft.entity.player.EntityPlayer; +import net.minecraft.inventory.IInventory; +import net.minecraft.item.Item; +import net.minecraft.item.ItemStack; +import net.minecraft.world.World; +import net.minecraftforge.common.ForgeDirection; +import appeng.api.AEApi; +import appeng.api.config.FuzzyMode; +import appeng.api.implementations.IStorageCell; +import appeng.api.storage.IMEInventory; +import appeng.api.storage.StorageChannel; +import appeng.api.storage.data.IAEItemStack; +import appeng.core.features.AEFeature; +import appeng.core.localization.GuiText; +import appeng.core.sync.GuiBridge; +import appeng.helpers.CellItemViewer; +import appeng.helpers.IGuiItem; +import appeng.items.storage.CellConfig; +import appeng.items.storage.CellUpgrades; +import appeng.items.tools.powered.powersink.AEBasePoweredItem; +import appeng.me.storage.CellInventory; +import appeng.me.storage.CellInventoryHandler; +import appeng.util.Platform; + +public class ToolPortableCell extends AEBasePoweredItem implements IStorageCell, IGuiItem +{ + + public ToolPortableCell() { + super( ToolPortableCell.class, null ); + setfeature( EnumSet.of( AEFeature.PortableCell, AEFeature.StorageCells, AEFeature.PoweredTools ) ); + maxStoredPower = 20000; + } + + @Override + public ItemStack onItemRightClick(ItemStack item, World w, EntityPlayer player) + { + Platform.openGUI( player, null, ForgeDirection.UNKNOWN, GuiBridge.GUI_PORTABLE_CELL ); + return item; + } + + @Override + public void addInformation(ItemStack is, EntityPlayer player, List lines, boolean advancedItemTooltips) + { + super.addInformation( is, player, lines, advancedItemTooltips ); + + IMEInventory cdi = AEApi.instance().registries().cell().getCellInventory( is, StorageChannel.ITEMS ); + + if ( cdi instanceof CellInventoryHandler ) + { + CellInventory cd = ((CellInventoryHandler) cdi).getCellInv(); + if ( cd != null ) + { + lines.add( cd.usedBytes() + " " + GuiText.Of.getLocal() + " " + cd.totalBytes() + " " + GuiText.BytesUsed.getLocal() ); + lines.add( cd.storedItemTypes() + " " + GuiText.Of.getLocal() + " " + cd.getTotalItemTypes() + " " + GuiText.Types.getLocal() ); + } + } + } + + @Override + public int getBytes(ItemStack cellItem) + { + return 512; + } + + @Override + public int BytePerType(ItemStack iscellItem) + { + return 8; + } + + @Override + public int getTotalTypes(ItemStack cellItem) + { + return 27; + } + + @Override + public boolean isBlackListed(ItemStack cellItem, IAEItemStack requsetedAddition) + { + Item i = requsetedAddition.getItem(); + + if ( i instanceof IStorageCell ) + return !((IStorageCell) i).storableInStorageCell(); + + return false; + } + + @Override + public boolean storableInStorageCell() + { + return false; + } + + @Override + public boolean isStorageCell(ItemStack i) + { + return true; + } + + @Override + public double getIdleDrain() + { + return 0.5; + } + + @Override + public IInventory getUpgradesInventory(ItemStack is) + { + return new CellUpgrades( is, 2 ); + } + + @Override + public IInventory getConfigInventory(ItemStack is) + { + return new CellConfig( is ); + } + + @Override + public FuzzyMode getFuzzyMode(ItemStack is) + { + String fz = Platform.openNbtData( is ).getString( "FuzzyMode" ); + try + { + return FuzzyMode.valueOf( fz ); + } + catch (Throwable t) + { + return FuzzyMode.IGNORE_ALL; + } + } + + @Override + public void setFuzzyMode(ItemStack is, FuzzyMode fzMode) + { + Platform.openNbtData( is ).setString( "FuzzyMode", fzMode.name() ); + } + + @Override + public boolean isEditable(ItemStack is) + { + return true; + } + + @Override + public Object getGuiObject(ItemStack is) + { + return new CellItemViewer( is ); + } +} diff --git a/items/tools/powered/powersink/AEBasePoweredItem.java b/items/tools/powered/powersink/AEBasePoweredItem.java index 885e23d70..ba5feb970 100644 --- a/items/tools/powered/powersink/AEBasePoweredItem.java +++ b/items/tools/powered/powersink/AEBasePoweredItem.java @@ -5,6 +5,6 @@ public class AEBasePoweredItem extends UniversalElectricity public AEBasePoweredItem(Class c, String subname) { super( c, subname ); + setMaxStackSize( 1 ); } - } diff --git a/items/tools/powered/powersink/AERootPoweredItem.java b/items/tools/powered/powersink/AERootPoweredItem.java index f476ecf45..0ea631f8f 100644 --- a/items/tools/powered/powersink/AERootPoweredItem.java +++ b/items/tools/powered/powersink/AERootPoweredItem.java @@ -10,6 +10,7 @@ import net.minecraft.nbt.NBTTagCompound; import appeng.api.config.AccessRestriction; import appeng.api.config.PowerUnits; import appeng.api.implementations.IAEItemPowerStorage; +import appeng.core.localization.GuiText; import appeng.items.AEBaseItem; import appeng.util.Platform; @@ -43,7 +44,7 @@ public class AERootPoweredItem extends AEBaseItem implements IAEItemPowerStorage double percent = internalCurrentPower / internalMaxPower; - lines.add( Platform.gui_localize( "Stored Energy" ) + ":" + MessageFormat.format( " {0,number,#} ", internalCurrentPower ) + lines.add( GuiText.StoredEnergy.getLocal() + ":" + MessageFormat.format( " {0,number,#} ", internalCurrentPower ) + Platform.gui_localize( PowerUnits.AE.unlocalizedName ) + " - " + MessageFormat.format( " {0,number,#.##%} ", percent ) ); } diff --git a/me/Grid.java b/me/Grid.java index 63e7e528c..46cb4c243 100644 --- a/me/Grid.java +++ b/me/Grid.java @@ -151,12 +151,6 @@ public class Grid implements IGrid // postEventTo( gridNode, networkChanged ); } - @Override - public boolean isReady() - { - return true; - } - @Override public IReadOnlyCollection getNodes() { diff --git a/me/GridCacheWrapper.java b/me/GridCacheWrapper.java index eeff302c6..bb8d5af79 100644 --- a/me/GridCacheWrapper.java +++ b/me/GridCacheWrapper.java @@ -6,80 +6,57 @@ import appeng.api.networking.IGridHost; import appeng.api.networking.IGridNode; import appeng.api.networking.IGridStorage; import appeng.me.cache.TickManagerCache; -import appeng.util.Platform; public class GridCacheWrapper implements IGridCache { - final IGridCache myCache; final public boolean isTickHandler; + final IGridCache myCache; + final String name; - public long LastFiveTicksTime = 0; - public long LastFiveRemoveTime = 0; - public long LastFiveAddNode = 0; - - public GridCacheWrapper(IGridCache gc) { + public GridCacheWrapper(final IGridCache gc) { myCache = gc; + name = myCache.getClass().getName(); isTickHandler = myCache instanceof TickManagerCache; } @Override - public void onUpdateTick(IGrid grid) + public void onUpdateTick(final IGrid grid) { - long startTime = Platform.nanoTime(); - myCache.onUpdateTick( grid ); - - long estimatedTime = Platform.nanoTime() - startTime; - - if ( isTickHandler ) // remove the ticking of tickables from the - // equation. - estimatedTime -= ((TickManagerCache) myCache).getInnerTime(); - - LastFiveTicksTime = ((LastFiveTicksTime * 4) / 5) + estimatedTime; } @Override - public void removeNode(IGrid grid, IGridNode gridNode, IGridHost machine) + public void removeNode(final IGrid grid, final IGridNode gridNode, final IGridHost machine) { - long startTime = Platform.nanoTime(); - myCache.removeNode( grid, gridNode, machine ); - - long estimatedTime = Platform.nanoTime() - startTime; - LastFiveRemoveTime = ((LastFiveRemoveTime * 4) / 5) + estimatedTime; } @Override - public void addNode(IGrid grid, IGridNode gridNode, IGridHost machine) + public void addNode(final IGrid grid, final IGridNode gridNode, final IGridHost machine) { - long startTime = Platform.nanoTime(); - myCache.addNode( grid, gridNode, machine ); - - long estimatedTime = Platform.nanoTime() - startTime; - LastFiveAddNode = ((LastFiveAddNode * 4) / 5) + estimatedTime; } public String getName() { - return myCache.getClass().getName(); + return name; } @Override - public void onSplit(IGridStorage storageB) + public void onSplit(final IGridStorage storageB) { myCache.onSplit( storageB ); } @Override - public void onJoin(IGridStorage storageB) + public void onJoin(final IGridStorage storageB) { myCache.onJoin( storageB ); } @Override - public void populateGridStorage(IGridStorage storage) + public void populateGridStorage(final IGridStorage storage) { myCache.populateGridStorage( storage ); } diff --git a/me/GridNode.java b/me/GridNode.java index f435d8ca9..7228d5fc3 100644 --- a/me/GridNode.java +++ b/me/GridNode.java @@ -485,4 +485,10 @@ public class GridNode implements IGridNode, IPathItem } } + @Override + public boolean hasFlag(GridFlags flag) + { + return getGridBlock().getFlags().contains( flag ); + } + } diff --git a/me/cache/EnergyGridCache.java b/me/cache/EnergyGridCache.java index 1e918fb33..b642be707 100644 --- a/me/cache/EnergyGridCache.java +++ b/me/cache/EnergyGridCache.java @@ -51,9 +51,34 @@ public class EnergyGridCache implements IEnergyGrid double prev_extra = 0; double extra = 0; + IAEPowerStorage lastProvider; Set providers = new LinkedHashSet(); + + IAEPowerStorage lastRequestor; Set requesters = new LinkedHashSet(); + private IAEPowerStorage getFirstRequestor() + { + if ( lastRequestor == null ) + { + Iterator i = requesters.iterator(); + lastRequestor = i.hasNext() ? i.next() : null; + } + + return lastRequestor; + } + + private IAEPowerStorage getFirstProvider() + { + if ( lastProvider == null ) + { + Iterator i = providers.iterator(); + lastProvider = i.hasNext() ? i.next() : null; + } + + return lastProvider; + } + Set gproviders = new LinkedHashSet(); final IGrid myGrid; @@ -131,11 +156,14 @@ public class EnergyGridCache implements IEnergyGrid { while (i > 0 && !requesters.isEmpty()) { - IAEPowerStorage node = requesters.iterator().next(); + IAEPowerStorage node = getFirstRequestor(); i = node.injectAEPower( i, Actionable.MODULATE ); if ( i > 0 ) + { requesters.remove( node ); + lastRequestor = null; + } } extra = i; @@ -145,10 +173,13 @@ public class EnergyGridCache implements IEnergyGrid return i; } + Set seen = new HashSet(); + @Override public double extractAEPower(double amt, Actionable mode, PowerMultiplier pm) { - return pm.divide( extractAEPower( pm.multiply( amt ), mode, new HashSet() ) ); + seen.clear(); + return pm.divide( extractAEPower( pm.multiply( amt ), mode, seen ) ); } @Override @@ -203,45 +234,17 @@ public class EnergyGridCache implements IEnergyGrid if ( ps.getPowerFlow() != AccessRestriction.WRITE ) globalAvailablePower -= ps.getAECurrentPower(); + if ( lastProvider == machine ) + lastProvider = null; + + if ( lastRequestor == machine ) + lastRequestor = null; + providers.remove( machine ); requesters.remove( machine ); } } - // recalculate the whole thing? - public void reset(IGrid grid) - { - providers = new LinkedHashSet(); - requesters = new LinkedHashSet(); - - // re-calculate power info - for (Class c : grid.getMachinesClasses()) - { - if ( IAEPowerStorage.class.isAssignableFrom( c ) ) - { - for (Object obj : grid.getMachines( c )) - { - IAEPowerStorage ps = (IAEPowerStorage) obj; - if ( ps.isAEPublicPowerStorage() ) - { - double max = ps.getAEMaxPower(); - double current = ps.getAECurrentPower(); - - if ( current > 0 && ps.getPowerFlow() != AccessRestriction.WRITE ) - { - providers.add( ps ); - globalAvailablePower += ps.getAECurrentPower(); - } - - if ( current < max && ps.getPowerFlow() != AccessRestriction.READ ) - requesters.add( ps ); - - } - } - } - } - } - @Override public void onUpdateTick(IGrid grid) { @@ -280,7 +283,6 @@ public class EnergyGridCache implements IEnergyGrid private void publicPowerState(boolean newState, IGrid grid) { - if ( publicHasPower == newState ) return; @@ -311,44 +313,18 @@ public class EnergyGridCache implements IEnergyGrid @Override public double extractAEPower(double amt, Actionable mode, Set seen) { - if ( seen.contains( this ) ) + if ( !seen.add( this ) ) return 0; - seen.add( this ); - double extractedPower = extra; if ( mode == Actionable.SIMULATE ) { - Iterator it = providers.iterator(); - while (extractedPower < amt && it.hasNext()) - { - IAEPowerStorage node = it.next(); - - double req = amt - extractedPower; - double newPower = node.extractAEPower( req, Actionable.SIMULATE, PowerMultiplier.ONE ); - extractedPower += newPower; - } + extractedPower += simulateExtract( extractedPower, amt ); + return extractedPower; } else - { - extra = 0; - - while (extractedPower < amt && !providers.isEmpty()) - { - IAEPowerStorage node = providers.iterator().next(); - - double req = amt - extractedPower; - double newPower = node.extractAEPower( req, Actionable.MODULATE, PowerMultiplier.ONE ); - extractedPower += newPower; - - if ( newPower < req ) - providers.remove( node ); - } - - // add power used to the current tick. - totalDrainPastTicks[0] += extractedPower; - } + extractedPower += doExtract( extractedPower, amt ); // got more then we wanted? if ( extractedPower > amt ) @@ -361,8 +337,9 @@ public class EnergyGridCache implements IEnergyGrid if ( extractedPower < amt ) { - for (IEnergyGridProvider egp : gproviders) - extractedPower += egp.extractAEPower( amt - extractedPower, mode, seen ); + Iterator i = gproviders.iterator(); + while (extractedPower < amt && i.hasNext()) + extractedPower += i.next().extractAEPower( amt - extractedPower, mode, seen ); } // go less or the correct amount? @@ -370,6 +347,45 @@ public class EnergyGridCache implements IEnergyGrid return extractedPower; } + private double doExtract(double extractedPower, double amt) + { + extra = 0; + + while (extractedPower < amt && !providers.isEmpty()) + { + IAEPowerStorage node = getFirstProvider(); + + double req = amt - extractedPower; + double newPower = node.extractAEPower( req, Actionable.MODULATE, PowerMultiplier.ONE ); + extractedPower += newPower; + + if ( newPower < req ) + { + providers.remove( node ); + lastProvider = null; + } + } + + totalDrainPastTicks[0] += extractedPower; + return extractedPower; + } + + private double simulateExtract(double extractedPower, double amt) + { + Iterator it = providers.iterator(); + + while (extractedPower < amt && it.hasNext()) + { + IAEPowerStorage node = it.next(); + + double req = amt - extractedPower; + double newPower = node.extractAEPower( req, Actionable.SIMULATE, PowerMultiplier.ONE ); + extractedPower += newPower; + } + + return extractedPower; + } + @Override public boolean isNetworkPowered() { diff --git a/me/cache/NetworkMonitor.java b/me/cache/NetworkMonitor.java index 0b93e4a00..a95d7b8e6 100644 --- a/me/cache/NetworkMonitor.java +++ b/me/cache/NetworkMonitor.java @@ -33,19 +33,6 @@ public class NetworkMonitor> extends MEMonitorHandler final static public LinkedList depth = new LinkedList(); - private BaseActionSource src; - - public void setSource(BaseActionSource src) - { - this.src = src; - } - - @Override - protected BaseActionSource getSource() - { - return src; - } - @Override protected void postChange(T diff, BaseActionSource src) { @@ -86,7 +73,7 @@ public class NetworkMonitor> extends MEMonitorHandler if ( sendEvent ) { sendEvent = false; - myGridCache.myGrid.postEvent( new MENetworkStorageEvent( getStorageList(), myChannel ) ); + myGridCache.myGrid.postEvent( new MENetworkStorageEvent( this, myChannel ) ); } } diff --git a/me/cache/P2PCache.java b/me/cache/P2PCache.java index 081143412..d562226a8 100644 --- a/me/cache/P2PCache.java +++ b/me/cache/P2PCache.java @@ -1,6 +1,5 @@ package appeng.me.cache; -import java.util.Collection; import java.util.HashMap; import appeng.api.networking.IGrid; @@ -8,7 +7,9 @@ import appeng.api.networking.IGridCache; import appeng.api.networking.IGridHost; import appeng.api.networking.IGridNode; import appeng.api.networking.IGridStorage; -import appeng.parts.misc.PartP2PTunnel; +import appeng.core.AELog; +import appeng.me.cache.helpers.TunnelCollection; +import appeng.parts.p2p.PartP2PTunnel; import com.google.common.collect.LinkedHashMultimap; import com.google.common.collect.Multimap; @@ -16,8 +17,9 @@ import com.google.common.collect.Multimap; public class P2PCache implements IGridCache { - private HashMap inputs = new HashMap(); - private Multimap Tunnels = LinkedHashMultimap.create(); + final private HashMap inputs = new HashMap(); + final private Multimap outputs = LinkedHashMultimap.create(); + final private TunnelCollection NullColl = new TunnelCollection( null, null ); final IGrid myGrid; @@ -25,50 +27,78 @@ public class P2PCache implements IGridCache myGrid = g; } + public void updateFreq(PartP2PTunnel t, long NewFreq) + { + outputs.remove( t.freq, t ); + inputs.remove( t.freq ); + + t.freq = NewFreq; + + if ( t.output ) + outputs.put( t.freq, t ); + else + inputs.put( t.freq, t ); + + AELog.info( "update-" + (t.output ? "output: " : "input: ") + t.freq ); + updateTunnel( t.freq, t.output ); + updateTunnel( t.freq, !t.output ); + } + @Override public void addNode(IGrid grid, IGridNode node, IGridHost machine) { if ( machine instanceof PartP2PTunnel ) - reset( grid ); + { + PartP2PTunnel t = (PartP2PTunnel) machine; + AELog.info( "add-" + (t.output ? "output: " : "input: ") + t.freq ); + + if ( t.output ) + outputs.put( t.freq, t ); + else + inputs.put( t.freq, t ); + + updateTunnel( t.freq, !t.output ); + } } @Override public void removeNode(IGrid grid, IGridNode node, IGridHost machine) { if ( machine instanceof PartP2PTunnel ) - reset( grid ); - } - - public void reset(IGrid grid) - { - - Tunnels.clear(); - inputs.clear(); - - for (IGridNode n : grid.getMachines( PartP2PTunnel.class )) { - PartP2PTunnel p = (PartP2PTunnel) n.getMachine(); - if ( p.freq > 0 ) - { - if ( p.output ) - Tunnels.put( p.freq, p ); - else if ( inputs.containsKey( p.freq ) ) - p.output = true; - else - inputs.put( p.freq, p ); - } + PartP2PTunnel t = (PartP2PTunnel) machine; + AELog.info( "rmv-" + (t.output ? "output: " : "input: ") + t.freq ); + + if ( t.output ) + outputs.remove( t.freq, t ); + else + inputs.remove( t.freq ); + + updateTunnel( t.freq, !t.output ); } - - for (PartP2PTunnel p : inputs.values()) - p.onChange(); - - for (PartP2PTunnel p : Tunnels.values()) - p.onChange(); } - public Collection getOutputs(long freq) + private void updateTunnel(long freq, boolean updateOutputs) { - return Tunnels.get( freq ); + if ( updateOutputs ) + { + for (PartP2PTunnel p : outputs.values()) + p.onChange(); + } + else + { + for (PartP2PTunnel p : inputs.values()) + p.onChange(); + } + } + + public TunnelCollection getOutputs(long freq, Class c) + { + PartP2PTunnel in = inputs.get( freq ); + if ( in == null ) + return NullColl; + + return inputs.get( freq ).getCollection( outputs.get( freq ) ); } public PartP2PTunnel getInput(long freq) diff --git a/me/cache/TickManagerCache.java b/me/cache/TickManagerCache.java index d1cad0f36..70731aa8e 100644 --- a/me/cache/TickManagerCache.java +++ b/me/cache/TickManagerCache.java @@ -14,13 +14,11 @@ import appeng.api.networking.ticking.TickRateModulation; import appeng.api.networking.ticking.TickingRequest; import appeng.core.AELog; import appeng.me.cache.helpers.TickTracker; -import appeng.util.Platform; public class TickManagerCache implements ITickManager { private long currentTick = 0; - private long lastInnerTime = 0; final IGrid myGrid; @@ -40,11 +38,6 @@ public class TickManagerCache implements ITickManager return currentTick; } - public long getInnerTime() - { - return lastInnerTime; - } - public long getAvgNanoTime(IGridNode node) { TickTracker tt = awake.get( node ); @@ -70,13 +63,7 @@ public class TickManagerCache implements ITickManager { // remove tt.. upcomingTicks.poll(); - - long startTime = Platform.nanoTime(); TickRateModulation mod = tt.gt.tickingRequest( tt.node, diff ); - long estimatedTime = Platform.nanoTime() - startTime; - lastInnerTime += estimatedTime; - - tt.LastFiveTicksTime = ((tt.LastFiveTicksTime * 4) / 5) + estimatedTime; switch (mod) { diff --git a/me/cache/helpers/TunnelCollection.java b/me/cache/helpers/TunnelCollection.java new file mode 100644 index 000000000..e1e125fcf --- /dev/null +++ b/me/cache/helpers/TunnelCollection.java @@ -0,0 +1,37 @@ +package appeng.me.cache.helpers; + +import java.util.Collection; +import java.util.Iterator; + +import appeng.parts.p2p.PartP2PTunnel; +import appeng.util.iterators.NullIterator; + +public class TunnelCollection implements Iterable +{ + + final Class clz; + Collection tunnelsource; + + public TunnelCollection(Collection src, Class c) { + tunnelsource = src; + clz = c; + } + + @Override + public Iterator iterator() + { + if ( tunnelsource == null ) + return new NullIterator(); + return new TunnelIterator( tunnelsource, clz ); + } + + public void setSource(Collection c) + { + tunnelsource = c; + } + + public boolean isEmpty() + { + return iterator().hasNext(); + } +} diff --git a/me/cache/helpers/TunnelIterator.java b/me/cache/helpers/TunnelIterator.java new file mode 100644 index 000000000..5375f6070 --- /dev/null +++ b/me/cache/helpers/TunnelIterator.java @@ -0,0 +1,52 @@ +package appeng.me.cache.helpers; + +import java.util.Collection; +import java.util.Iterator; + +import appeng.parts.p2p.PartP2PTunnel; + +public class TunnelIterator implements Iterator +{ + + Iterator wrapped; + Class targetType; + T Next; + + private void findNext() + { + while (Next == null && wrapped.hasNext()) + { + Next = wrapped.next(); + if ( !targetType.isInstance( Next ) ) + Next = null; + } + } + + public TunnelIterator(Collection tunnelsource, Class clz) { + wrapped = tunnelsource.iterator(); + targetType = clz; + findNext(); + } + + @Override + public boolean hasNext() + { + findNext(); + return Next != null; + } + + @Override + public T next() + { + T tmp = Next; + Next = null; + return tmp; + } + + @Override + public void remove() + { + // no. + } + +} diff --git a/me/cluster/implementations/QuantumCalculator.java b/me/cluster/implementations/QuantumCalculator.java index cea24989f..52bfe6f4a 100644 --- a/me/cluster/implementations/QuantumCalculator.java +++ b/me/cluster/implementations/QuantumCalculator.java @@ -56,24 +56,24 @@ public class QuantumCalculator extends MBCalculator { TileQuantumBridge te = (TileQuantumBridge) w.getBlockTileEntity( x, y, z ); - byte Fish = 0; + byte flags = 0; num++; if ( num == 5 ) { - Fish = (byte) (num); + flags = (byte) (num); c.setCenter( te ); } else { if ( num == 1 || num == 3 || num == 7 || num == 9 ) - Fish = (byte) (tqb.corner | num); + flags = (byte) (tqb.corner | num); else - Fish = (byte) (num); + flags = (byte) (num); c.Ring[ringNum++] = te; } - te.updateStatus( c, Fish ); + te.updateStatus( c, flags ); } } } @@ -112,12 +112,12 @@ public class QuantumCalculator extends MBCalculator num++; if ( num == 5 ) { - if ( Platform.blockAtLocationIs( w, x, y, z, AEApi.instance().blocks().blockQuantumLink ) ) + if ( !Platform.blockAtLocationIs( w, x, y, z, AEApi.instance().blocks().blockQuantumLink ) ) return false; } else { - if ( Platform.blockAtLocationIs( w, x, y, z, AEApi.instance().blocks().blockQuantumRing ) ) + if ( !Platform.blockAtLocationIs( w, x, y, z, AEApi.instance().blocks().blockQuantumRing ) ) return false; } diff --git a/me/cluster/implementations/QuantumCluster.java b/me/cluster/implementations/QuantumCluster.java index 8229cdbcf..2dd35f18b 100644 --- a/me/cluster/implementations/QuantumCluster.java +++ b/me/cluster/implementations/QuantumCluster.java @@ -3,6 +3,7 @@ package appeng.me.cluster.implementations; import java.util.Iterator; import net.minecraft.world.chunk.Chunk; +import net.minecraftforge.common.ForgeDirection; import net.minecraftforge.common.MinecraftForge; import net.minecraftforge.event.ForgeSubscribe; import net.minecraftforge.event.world.WorldEvent; @@ -10,8 +11,9 @@ import appeng.api.AEApi; import appeng.api.events.LocatableEventAnnounce; import appeng.api.events.LocatableEventAnnounce.LocatableEvent; import appeng.api.features.ILocatable; +import appeng.api.networking.IGridConnection; import appeng.api.networking.IGridHost; -import appeng.api.util.DimensionalCoord; +import appeng.api.networking.IGridNode; import appeng.api.util.WorldCoord; import appeng.me.cluster.IAECluster; import appeng.tile.qnb.TileQuantumBridge; @@ -20,6 +22,13 @@ import appeng.util.iterators.ChainedIterator; public class QuantumCluster implements ILocatable, IAECluster { + class QuantumLeap + { + + IGridConnection connection; + + }; + public WorldCoord min; public WorldCoord max; public boolean isDestroyed = false; @@ -28,6 +37,8 @@ public class QuantumCluster implements ILocatable, IAECluster private long thisSide; private long otherSide; + QuantumLeap connection; + public TileQuantumBridge Ring[]; private TileQuantumBridge center; @@ -53,7 +64,7 @@ public class QuantumCluster implements ILocatable, IAECluster public boolean canUseNode(long qe) { QuantumCluster qc = (QuantumCluster) AEApi.instance().registries().locateable().findLocateableBySerial( qe ); - if ( qc.center instanceof TileQuantumBridge ) + if ( qc != null && qc.center instanceof TileQuantumBridge ) { if ( !qc.isDestroyed ) { @@ -77,7 +88,6 @@ public class QuantumCluster implements ILocatable, IAECluster @Override public void updateStatus(boolean updateGrid) { - long oldOtherSide = otherSide; long qe; qe = center.getQEDest(); @@ -111,31 +121,47 @@ public class QuantumCluster implements ILocatable, IAECluster } } - if ( updateGrid ) + Object myOtherSide = otherSide == 0 ? null : AEApi.instance().registries().locateable().findLocateableBySerial( otherSide ); + + boolean shutdown = false; + + if ( myOtherSide instanceof QuantumCluster ) { - updateGrid( this ); - Object myOtherSide = otherSide == 0 ? null : AEApi.instance().registries().locateable().findLocateableBySerial( otherSide ); - Object oldMyOtherSide = oldOtherSide == 0 ? null : AEApi.instance().registries().locateable().findLocateableBySerial( oldOtherSide ); - if ( myOtherSide instanceof QuantumCluster ) - updateGrid( (QuantumCluster) myOtherSide ); - if ( oldMyOtherSide instanceof QuantumCluster ) - updateGrid( (QuantumCluster) oldMyOtherSide ); - } - } + QuantumCluster sideA = (QuantumCluster) this; + QuantumCluster sideB = (QuantumCluster) myOtherSide; - public void updateRender() - { - for (int x = 0; x < Ring.length; x++) + if ( sideA.isActive() && sideB.isActive() ) + { + if ( connection != null && connection.connection != null ) + { + IGridNode a = connection.connection.a(); + IGridNode b = connection.connection.b(); + IGridNode sa = sideA.getNode(); + IGridNode sb = sideB.getNode(); + if ( (a == sa || b == sa) && (a == sb || b == sb) ) + return; + } + + QuantumLeap ql = sideA.connection = sideB.connection = new QuantumLeap(); + ql.connection = AEApi.instance().createGridConnection( sideA.getNode(), sideB.getNode() ); + } + else + shutdown = true; + } + else + shutdown = true; + + if ( shutdown && connection != null ) { - + if ( connection.connection != null ) + { + connection.connection.destroy(); + connection.connection = null; + connection = new QuantumLeap(); + } } } - private void updateGrid(QuantumCluster c) - { - - } - @Override public void destroy() { @@ -151,16 +177,10 @@ public class QuantumCluster implements ILocatable, IAECluster if ( getLocatableSerial() != 0 ) { - updateGrid( this ); - Object myOtherSide = otherSide == 0 ? null : AEApi.instance().registries().locateable().findLocateableBySerial( otherSide ); - if ( myOtherSide instanceof QuantumCluster ) - updateGrid( (QuantumCluster) myOtherSide ); - + updateStatus( true ); MinecraftForge.EVENT_BUS.post( new LocatableEventAnnounce( this, LocatableEvent.Unregister ) ); } - // updateStatus( true ); - center.updateStatus( null, (byte) -1 ); for (TileQuantumBridge r : Ring) @@ -175,29 +195,6 @@ public class QuantumCluster implements ILocatable, IAECluster public boolean isCorner(TileQuantumBridge tileQuantumBridge) { return Ring[0] == tileQuantumBridge || Ring[2] == tileQuantumBridge || Ring[4] == tileQuantumBridge || Ring[6] == tileQuantumBridge; - - } - - public DimensionalCoord[] getOtherSide() - { - Object myOtherSide = AEApi.instance().registries().locateable().findLocateableBySerial( otherSide ); - if ( myOtherSide != null ) - { - try - { - QuantumCluster qc = (QuantumCluster) myOtherSide; - DimensionalCoord[] out = new DimensionalCoord[4]; - out[0] = new DimensionalCoord( qc.Ring[1] ); - out[1] = new DimensionalCoord( qc.Ring[3] ); - out[2] = new DimensionalCoord( qc.Ring[4] ); - out[3] = new DimensionalCoord( qc.Ring[6] ); - return out; - } - catch (Throwable t) - { - } - } - return new DimensionalCoord[0]; } @Override @@ -206,11 +203,6 @@ public class QuantumCluster implements ILocatable, IAECluster return thisSide; } - public boolean hasPower() - { - return center.bridgePowered; - } - public TileQuantumBridge getCenter() { return center; @@ -221,4 +213,17 @@ public class QuantumCluster implements ILocatable, IAECluster return getLocatableSerial() != 0; } + private IGridNode getNode() + { + return center.getGridNode( ForgeDirection.UNKNOWN ); + } + + private boolean isActive() + { + if ( isDestroyed || !registered ) + return false; + + return center.isPowered() && hasQES(); + } + } diff --git a/me/helpers/AENetworkProxy.java b/me/helpers/AENetworkProxy.java index f3560f1c7..f1852184a 100644 --- a/me/helpers/AENetworkProxy.java +++ b/me/helpers/AENetworkProxy.java @@ -21,6 +21,7 @@ import appeng.api.util.DimensionalCoord; import appeng.api.util.IOrientable; import appeng.helpers.TickHandler; import appeng.me.GridAccessException; +import appeng.me.cache.P2PCache; import appeng.parts.networking.PartCable; import appeng.tile.AEBaseTile; import appeng.util.Platform; @@ -97,15 +98,6 @@ public class AENetworkProxy implements IGridBlock return validSides; } - @Override - public boolean isNetworkMachineActive() - { - if ( node == null ) - return false; - - return node.getGrid().isReady(); - } - public void setValidSides(EnumSet validSides) { this.validSides = validSides; @@ -231,6 +223,20 @@ public class AENetworkProxy implements IGridBlock return pg; } + public P2PCache getP2P() throws GridAccessException + { + IGrid grid = getGrid(); + if ( grid == null ) + throw new GridAccessException(); + + P2PCache pg = grid.getCache( P2PCache.class ); + + if ( pg == null ) + throw new GridAccessException(); + + return pg; + } + @Override public boolean isWorldAccessable() { diff --git a/me/storage/CellInventory.java b/me/storage/CellInventory.java index 0ee324eaa..e612418ba 100644 --- a/me/storage/CellInventory.java +++ b/me/storage/CellInventory.java @@ -3,6 +3,7 @@ package appeng.me.storage; import java.util.HashSet; import java.util.Iterator; +import net.minecraft.inventory.IInventory; import net.minecraft.item.Item; import net.minecraft.item.ItemStack; import net.minecraft.nbt.NBTBase; @@ -11,8 +12,10 @@ import net.minecraft.nbt.NBTTagInt; import net.minecraft.nbt.NBTTagShort; import net.minecraftforge.oredict.OreDictionary; import appeng.api.config.Actionable; +import appeng.api.config.FuzzyMode; import appeng.api.exceptions.AppEngException; import appeng.api.implementations.IStorageCell; +import appeng.api.networking.security.BaseActionSource; import appeng.api.storage.IMEInventory; import appeng.api.storage.IMEInventoryHandler; import appeng.api.storage.StorageChannel; @@ -335,7 +338,7 @@ public class CellInventory implements IMEInventory } @Override - public IAEItemStack injectItems(IAEItemStack input, Actionable mode) + public IAEItemStack injectItems(IAEItemStack input, Actionable mode, BaseActionSource src) { if ( input == null ) return null; @@ -422,7 +425,7 @@ public class CellInventory implements IMEInventory } @Override - public IAEItemStack extractItems(IAEItemStack request, Actionable mode) + public IAEItemStack extractItems(IAEItemStack request, Actionable mode, BaseActionSource src) { if ( request == null ) return null; @@ -482,4 +485,28 @@ public class CellInventory implements IMEInventory return CellType.getIdleDrain(); } + public FuzzyMode getFuzzyMode() + { + return CellType.getFuzzyMode( this.i ); + } + + public IInventory getConfigInventory() + { + return CellType.getConfigInventory( this.i ); + } + + public IInventory getUpgradesInventory() + { + return CellType.getUpgradesInventory( this.i ); + } + + public int getStatusForCell() + { + if ( canHoldNewItem() ) + return 1; + if ( remainingItemCount() > 0 ) + return 2; + return 3; + } + } diff --git a/me/storage/CellInventoryHandler.java b/me/storage/CellInventoryHandler.java index 0479b20fb..13839bf08 100644 --- a/me/storage/CellInventoryHandler.java +++ b/me/storage/CellInventoryHandler.java @@ -1,9 +1,20 @@ package appeng.me.storage; +import net.minecraft.inventory.IInventory; +import net.minecraft.item.ItemStack; import net.minecraft.nbt.NBTTagCompound; +import appeng.api.config.FuzzyMode; +import appeng.api.config.IncludeExclude; +import appeng.api.config.Upgrades; +import appeng.api.implementations.IUpgradeModule; import appeng.api.storage.IMEInventory; import appeng.api.storage.data.IAEItemStack; +import appeng.api.storage.data.IItemList; import appeng.util.Platform; +import appeng.util.item.AEItemStack; +import appeng.util.item.ItemList; +import appeng.util.prioitylist.FuzzyPriorityList; +import appeng.util.prioitylist.PrecisePriorityList; public class CellInventoryHandler extends MEInventoryHandler { @@ -15,11 +26,67 @@ public class CellInventoryHandler extends MEInventoryHandler public CellInventory getCellInv() { - return (CellInventory) (this.internal instanceof CellInventory ? this.internal : null); + Object o = this.internal; + + if ( o instanceof MEPassthru ) + o = ((MEPassthru) o).getInternal(); + + return (CellInventory) (o instanceof CellInventory ? o : null); } CellInventoryHandler(IMEInventory c) { super( c ); - } + CellInventory ci = getCellInv(); + if ( ci != null ) + { + IItemList priorityList = new ItemList(); + + IInventory upgrades = ci.getUpgradesInventory(); + IInventory config = ci.getConfigInventory(); + FuzzyMode fzMode = ci.getFuzzyMode(); + + boolean hasInverter = false; + boolean hasFuzzy = false; + + for (int x = 0; x < upgrades.getSizeInventory(); x++) + { + ItemStack is = upgrades.getStackInSlot( x ); + if ( is != null && is.getItem() instanceof IUpgradeModule ) + { + Upgrades u = ((IUpgradeModule) is.getItem()).getType( is ); + if ( u != null ) + { + switch (u) + { + case FUZZY: + hasFuzzy = true; + break; + case INVERTER: + hasInverter = true; + break; + default: + } + } + } + } + + for (int x = 0; x < config.getSizeInventory(); x++) + { + ItemStack is = config.getStackInSlot( x ); + if ( is != null ) + priorityList.add( AEItemStack.create( is ) ); + } + + myWhitelist = hasInverter ? IncludeExclude.BLACKLIST : IncludeExclude.WHITELIST; + + if ( !priorityList.isEmpty() ) + { + if ( hasFuzzy ) + myPartitionList = new FuzzyPriorityList( priorityList, fzMode ); + else + myPartitionList = new PrecisePriorityList( priorityList ); + } + } + } } diff --git a/me/storage/CreativeCellInventory.java b/me/storage/CreativeCellInventory.java index d9555db0d..3d11dacf9 100644 --- a/me/storage/CreativeCellInventory.java +++ b/me/storage/CreativeCellInventory.java @@ -1,18 +1,22 @@ package appeng.me.storage; import net.minecraft.item.ItemStack; +import appeng.api.config.AccessRestriction; import appeng.api.config.Actionable; import appeng.api.exceptions.AppEngException; -import appeng.api.implementations.IStorageCell; +import appeng.api.networking.security.BaseActionSource; import appeng.api.storage.IMEInventoryHandler; +import appeng.api.storage.StorageChannel; import appeng.api.storage.data.IAEItemStack; -import appeng.util.Platform; +import appeng.api.storage.data.IItemList; +import appeng.items.storage.CellConfig; +import appeng.util.item.AEItemStack; import appeng.util.item.ItemList; -public class CreativeCellInventory extends CellInventory implements IStorageCell +public class CreativeCellInventory implements IMEInventoryHandler { - ItemList itemListCache; + ItemList itemListCache = new ItemList(); public static IMEInventoryHandler getCell(ItemStack o) { @@ -28,58 +32,20 @@ public class CreativeCellInventory extends CellInventory implements IStorageCell } protected CreativeCellInventory(ItemStack o) throws AppEngException { - super( Platform.openNbtData( o ) ); - - if ( MAX_ITEM_TYPES > 63 ) - MAX_ITEM_TYPES = 63; - if ( MAX_ITEM_TYPES < 1 ) - MAX_ITEM_TYPES = 1; - - storedItems = tagCompound.getShort( ITEM_TYPE_TAG ); - storedItemCount = tagCompound.getInteger( ITEM_COUNT_TAG ); - cellItems = null; + CellConfig cc = new CellConfig( o ); + for (ItemStack is : cc) + if ( is != null ) + { + IAEItemStack i = AEItemStack.create( is ); + i.setStackSize( Integer.MAX_VALUE ); + itemListCache.add( i ); + } } @Override - public boolean isStorageCell(ItemStack i) + public IAEItemStack injectItems(IAEItemStack input, Actionable mode, BaseActionSource src) { - return true; - } - - @Override - public int getBytes(ItemStack cellItem) - { - return 0; - } - - @Override - public int BytePerType(ItemStack iscellItem) - { - return 8; - } - - @Override - public int getTotalTypes(ItemStack cellItem) - { - return 63; - } - - @Override - public boolean isBlackListed(ItemStack cellItem, IAEItemStack requsetedAddition) - { - return false; - } - - @Override - public boolean storableInStorageCell() - { - return false; - } - - @Override - public IAEItemStack injectItems(IAEItemStack input, Actionable mode) - { - IAEItemStack local = getCellItems().findPrecise( input ); + IAEItemStack local = itemListCache.findPrecise( input ); if ( local == null ) return input; @@ -87,9 +53,9 @@ public class CreativeCellInventory extends CellInventory implements IStorageCell } @Override - public IAEItemStack extractItems(IAEItemStack request, Actionable mode) + public IAEItemStack extractItems(IAEItemStack request, Actionable mode, BaseActionSource src) { - IAEItemStack local = getCellItems().findPrecise( request ); + IAEItemStack local = itemListCache.findPrecise( request ); if ( local == null ) return null; @@ -97,22 +63,47 @@ public class CreativeCellInventory extends CellInventory implements IStorageCell } @Override - ItemList getCellItems() + public IItemList getAvailableItems(IItemList out) { - if ( itemListCache != null ) - return itemListCache; + for (IAEItemStack ais : itemListCache) + out.add( ais ); + return out; + } - ItemList list = new ItemList(); - CellInventoryHandler handler = new CellInventoryHandler( this ); + @Override + public StorageChannel getChannel() + { + return StorageChannel.ITEMS; + } - for (IAEItemStack is : handler.myPartitionList.getItems()) - { - IAEItemStack b = is.copy(); - b.setStackSize( Integer.MAX_VALUE ); - list.add( b ); - } + @Override + public AccessRestriction getAccess() + { + return AccessRestriction.READ_WRITE; + } - return itemListCache = list; + @Override + public boolean isPrioritized(IAEItemStack input) + { + return itemListCache.findPrecise( input ) != null; + } + + @Override + public boolean canAccept(IAEItemStack input) + { + return itemListCache.findPrecise( input ) != null; + } + + @Override + public int getPriority() + { + return 0; + } + + @Override + public int getSlot() + { + return 0; } } diff --git a/me/storage/DriveWatcher.java b/me/storage/DriveWatcher.java new file mode 100644 index 000000000..e6dbf77b1 --- /dev/null +++ b/me/storage/DriveWatcher.java @@ -0,0 +1,63 @@ +package appeng.me.storage; + +import net.minecraft.item.ItemStack; +import appeng.api.config.Actionable; +import appeng.api.implementations.IChestOrDrive; +import appeng.api.networking.security.BaseActionSource; +import appeng.api.storage.ICellHandler; +import appeng.api.storage.IMEInventory; +import appeng.api.storage.data.IAEStack; + +public class DriveWatcher> extends MEInventoryHandler +{ + + int oldStatus = 0; + final ItemStack is; + final ICellHandler handler; + final IChestOrDrive cord; + + public DriveWatcher(IMEInventory i, ItemStack is, ICellHandler han, IChestOrDrive cod) { + super( i ); + this.is = is; + handler = han; + cord = cod; + } + + @Override + public T injectItems(T input, Actionable type, BaseActionSource src) + { + long size = input.getStackSize(); + + T a = super.injectItems( input, type, src ); + + if ( a == null || a.getStackSize() != size ) + { + int newStatus = handler.getStatusForCell( is, getInternal() ); + + if ( newStatus != oldStatus ) + { + cord.blinkCell( getSlot() ); + } + } + + return a; + } + + @Override + public T extractItems(T request, Actionable type, BaseActionSource src) + { + T a = super.extractItems( request, type, src ); + + if ( a != null ) + { + int newStatus = handler.getStatusForCell( is, getInternal() ); + + if ( newStatus != oldStatus ) + { + cord.blinkCell( getSlot() ); + } + } + + return a; + } +} diff --git a/me/storage/ItemWatcher.java b/me/storage/ItemWatcher.java index e4c14623e..a97539ebe 100644 --- a/me/storage/ItemWatcher.java +++ b/me/storage/ItemWatcher.java @@ -1,171 +1,171 @@ -package appeng.me.storage; - -import java.util.Collection; -import java.util.HashSet; -import java.util.Iterator; - -import appeng.api.networking.storage.IStackWatcher; -import appeng.api.networking.storage.IStackWatcherHost; -import appeng.api.storage.data.IAEStack; -import appeng.me.cache.GridStorageCache; - -/** - * Maintain my interests, and a global watch list, they should always be fully synchronized. - */ -public class ItemWatcher implements IStackWatcher -{ - - class ItemWatcherIterator implements Iterator - { - - final ItemWatcher watcher; - final Iterator interestIterator; - IAEStack myLast; - - public ItemWatcherIterator(ItemWatcher parent, Iterator i) { - watcher = parent; - interestIterator = i; - } - - @Override - public boolean hasNext() - { - return interestIterator.hasNext(); - } - - @Override - public IAEStack next() - { - return myLast = interestIterator.next(); - } - - @Override - public void remove() - { - gsc.interests.remove( myLast, watcher ); - interestIterator.remove(); - } - - }; - - GridStorageCache gsc; - IStackWatcherHost myObject; - HashSet myInterests = new HashSet(); - - public ItemWatcher(GridStorageCache cache, IStackWatcherHost host) { - gsc = cache; - myObject = host; - } - - public IStackWatcherHost getHost() - { - return myObject; - } - - @Override - public boolean add(IAEStack e) - { - if ( myInterests.contains( e ) ) - return false; - - return myInterests.add( e.copy() ) && gsc.interests.put( e, this ); - } - - @Override - public boolean addAll(Collection c) - { - boolean didChange = false; - - for (IAEStack o : c) - didChange = add( o ) || didChange; - - return didChange; - } - - @Override - public void clear() - { - Iterator i = myInterests.iterator(); - while (i.hasNext()) - { - gsc.interests.remove( i.next(), this ); - i.remove(); - } - } - - @Override - public boolean contains(Object o) - { - return myInterests.contains( o ); - } - - @Override - public boolean containsAll(Collection c) - { - return myInterests.containsAll( c ); - } - - @Override - public boolean isEmpty() - { - return myInterests.isEmpty(); - } - - @Override - public Iterator iterator() - { - return new ItemWatcherIterator( this, myInterests.iterator() ); - } - - @Override - public boolean remove(Object o) - { - return myInterests.remove( o ) && gsc.interests.remove( o, this ); - } - - @Override - public boolean removeAll(Collection c) - { - boolean didSomething = false; - for (Object o : c) - didSomething = remove( o ) || didSomething; - return didSomething; - } - - @Override - public boolean retainAll(Collection c) - { - boolean changed = false; - Iterator i = iterator(); - - while (i.hasNext()) - { - if ( !c.contains( i.next() ) ) - { - i.remove(); - changed = true; - } - } - - return changed; - } - - @Override - public int size() - { - return myInterests.size(); - } - - @Override - public Object[] toArray() - { - return myInterests.toArray(); - } - - @Override - public T[] toArray(T[] a) - { - return myInterests.toArray( a ); - } - -} +package appeng.me.storage; + +import java.util.Collection; +import java.util.HashSet; +import java.util.Iterator; + +import appeng.api.networking.storage.IStackWatcher; +import appeng.api.networking.storage.IStackWatcherHost; +import appeng.api.storage.data.IAEStack; +import appeng.me.cache.GridStorageCache; + +/** + * Maintain my interests, and a global watch list, they should always be fully synchronized. + */ +public class ItemWatcher implements IStackWatcher +{ + + class ItemWatcherIterator implements Iterator + { + + final ItemWatcher watcher; + final Iterator interestIterator; + IAEStack myLast; + + public ItemWatcherIterator(ItemWatcher parent, Iterator i) { + watcher = parent; + interestIterator = i; + } + + @Override + public boolean hasNext() + { + return interestIterator.hasNext(); + } + + @Override + public IAEStack next() + { + return myLast = interestIterator.next(); + } + + @Override + public void remove() + { + gsc.interests.remove( myLast, watcher ); + interestIterator.remove(); + } + + }; + + GridStorageCache gsc; + IStackWatcherHost myObject; + HashSet myInterests = new HashSet(); + + public ItemWatcher(GridStorageCache cache, IStackWatcherHost host) { + gsc = cache; + myObject = host; + } + + public IStackWatcherHost getHost() + { + return myObject; + } + + @Override + public boolean add(IAEStack e) + { + if ( myInterests.contains( e ) ) + return false; + + return myInterests.add( e.copy() ) && gsc.interests.put( e, this ); + } + + @Override + public boolean addAll(Collection c) + { + boolean didChange = false; + + for (IAEStack o : c) + didChange = add( o ) || didChange; + + return didChange; + } + + @Override + public void clear() + { + Iterator i = myInterests.iterator(); + while (i.hasNext()) + { + gsc.interests.remove( i.next(), this ); + i.remove(); + } + } + + @Override + public boolean contains(Object o) + { + return myInterests.contains( o ); + } + + @Override + public boolean containsAll(Collection c) + { + return myInterests.containsAll( c ); + } + + @Override + public boolean isEmpty() + { + return myInterests.isEmpty(); + } + + @Override + public Iterator iterator() + { + return new ItemWatcherIterator( this, myInterests.iterator() ); + } + + @Override + public boolean remove(Object o) + { + return myInterests.remove( o ) && gsc.interests.remove( o, this ); + } + + @Override + public boolean removeAll(Collection c) + { + boolean didSomething = false; + for (Object o : c) + didSomething = remove( o ) || didSomething; + return didSomething; + } + + @Override + public boolean retainAll(Collection c) + { + boolean changed = false; + Iterator i = iterator(); + + while (i.hasNext()) + { + if ( !c.contains( i.next() ) ) + { + i.remove(); + changed = true; + } + } + + return changed; + } + + @Override + public int size() + { + return myInterests.size(); + } + + @Override + public Object[] toArray() + { + return myInterests.toArray(); + } + + @Override + public T[] toArray(T[] a) + { + return myInterests.toArray( a ); + } + +} diff --git a/me/storage/MEIInventoryWrapper.java b/me/storage/MEIInventoryWrapper.java index fca65b939..194e90941 100644 --- a/me/storage/MEIInventoryWrapper.java +++ b/me/storage/MEIInventoryWrapper.java @@ -3,6 +3,7 @@ package appeng.me.storage; import net.minecraft.inventory.IInventory; import net.minecraft.item.ItemStack; import appeng.api.config.Actionable; +import appeng.api.networking.security.BaseActionSource; import appeng.api.storage.IMEInventory; import appeng.api.storage.StorageChannel; import appeng.api.storage.data.IAEItemStack; @@ -29,7 +30,7 @@ public class MEIInventoryWrapper implements IMEInventory } @Override - public IAEItemStack injectItems(IAEItemStack iox, Actionable mode) + public IAEItemStack injectItems(IAEItemStack iox, Actionable mode, BaseActionSource src) { ItemStack input = iox.getItemStack(); @@ -105,7 +106,7 @@ public class MEIInventoryWrapper implements IMEInventory } @Override - public IAEItemStack extractItems(IAEItemStack request, Actionable mode) + public IAEItemStack extractItems(IAEItemStack request, Actionable mode, BaseActionSource src) { ItemStack Gathered = null; ItemStack Req = request.getItemStack(); diff --git a/me/storage/MEInventoryHandler.java b/me/storage/MEInventoryHandler.java index 14ca4ee3a..1020c6fe3 100644 --- a/me/storage/MEInventoryHandler.java +++ b/me/storage/MEInventoryHandler.java @@ -3,6 +3,7 @@ package appeng.me.storage; import appeng.api.config.AccessRestriction; import appeng.api.config.Actionable; import appeng.api.config.IncludeExclude; +import appeng.api.networking.security.BaseActionSource; import appeng.api.storage.IMEInventory; import appeng.api.storage.IMEInventoryHandler; import appeng.api.storage.IMEMonitor; @@ -33,18 +34,18 @@ public class MEInventoryHandler> implements IMEInventoryHa } @Override - public T injectItems(T input, Actionable type) + public T injectItems(T input, Actionable type, BaseActionSource src) { if ( !this.canAccept( input ) ) return input; - return internal.injectItems( input, type ); + return internal.injectItems( input, type, src ); } @Override - public T extractItems(T request, Actionable type) + public T extractItems(T request, Actionable type, BaseActionSource src) { - return internal.extractItems( request, type ); + return internal.extractItems( request, type, src ); } @Override @@ -99,4 +100,9 @@ public class MEInventoryHandler> implements IMEInventoryHa return internal.getSlot(); } + public IMEInventory getInternal() + { + return internal; + } + } diff --git a/me/storage/MEMonitorIInventory.java b/me/storage/MEMonitorIInventory.java index 9f579aa6e..0bb75cbd8 100644 --- a/me/storage/MEMonitorIInventory.java +++ b/me/storage/MEMonitorIInventory.java @@ -78,7 +78,7 @@ public class MEMonitorIInventory implements IMEInventory, IMEMonit } @Override - public IAEItemStack injectItems(IAEItemStack input, Actionable type) + public IAEItemStack injectItems(IAEItemStack input, Actionable type, BaseActionSource src) { ItemStack out = null; @@ -142,7 +142,7 @@ public class MEMonitorIInventory implements IMEInventory, IMEMonit } @Override - public IAEItemStack extractItems(IAEItemStack request, Actionable type) + public IAEItemStack extractItems(IAEItemStack request, Actionable type, BaseActionSource src) { ItemStack out = null; diff --git a/me/storage/MEPassthru.java b/me/storage/MEPassthru.java index 25a6dd029..9c49fd972 100644 --- a/me/storage/MEPassthru.java +++ b/me/storage/MEPassthru.java @@ -2,6 +2,7 @@ package appeng.me.storage; import appeng.api.config.AccessRestriction; import appeng.api.config.Actionable; +import appeng.api.networking.security.BaseActionSource; import appeng.api.storage.IMEInventory; import appeng.api.storage.IMEInventoryHandler; import appeng.api.storage.StorageChannel; @@ -28,15 +29,15 @@ public class MEPassthru> implements IMEInventoryHandler } @Override - public T injectItems(T input, Actionable type) + public T injectItems(T input, Actionable type, BaseActionSource src) { - return internal.injectItems( input, type ); + return internal.injectItems( input, type, src ); } @Override - public T extractItems(T request, Actionable type) + public T extractItems(T request, Actionable type, BaseActionSource src) { - return internal.extractItems( request, type ); + return internal.extractItems( request, type, src ); } @Override diff --git a/me/storage/NetworkInventoryHandler.java b/me/storage/NetworkInventoryHandler.java index 6d9a7aeb5..236ede8ca 100644 --- a/me/storage/NetworkInventoryHandler.java +++ b/me/storage/NetworkInventoryHandler.java @@ -1,20 +1,20 @@ package appeng.me.storage; -import java.util.Collection; +import java.util.ArrayList; import java.util.Comparator; import java.util.Iterator; import java.util.LinkedList; -import java.util.Map.Entry; +import java.util.List; +import java.util.TreeMap; import appeng.api.config.AccessRestriction; import appeng.api.config.Actionable; +import appeng.api.networking.security.BaseActionSource; import appeng.api.storage.IMEInventoryHandler; import appeng.api.storage.StorageChannel; import appeng.api.storage.data.IAEStack; import appeng.api.storage.data.IItemList; -import com.google.common.collect.TreeMultimap; - public class NetworkInventoryHandler> implements IMEInventoryHandler { @@ -28,27 +28,23 @@ public class NetworkInventoryHandler> implements IMEInvent }; - private final static Comparator hashSorter = new Comparator() { - - @Override - public int compare(IMEInventoryHandler o1, IMEInventoryHandler o2) - { - return o1.hashCode() - o2.hashCode(); - } - - }; - final StorageChannel myChannel; - final TreeMultimap> prorityInventory; + // final TreeMultimap> prorityInventory; + final TreeMap>> prorityInventory; public NetworkInventoryHandler(StorageChannel chan) { myChannel = chan; - prorityInventory = TreeMultimap.create( prioritySorter, hashSorter ); + prorityInventory = new TreeMap( prioritySorter ); // TreeMultimap.create( prioritySorter, hashSorter ); } public void addNewStorage(IMEInventoryHandler h) { - prorityInventory.put( h.getPriority(), h ); + int priority = h.getPriority(); + List> list = prorityInventory.get( priority ); + if ( list == null ) + prorityInventory.put( priority, list = new ArrayList() ); + + list.add( h ); } static int currentPass = 0; @@ -91,32 +87,32 @@ public class NetworkInventoryHandler> implements IMEInvent } @Override - public T injectItems(T input, Actionable type) + public T injectItems(T input, Actionable type, BaseActionSource src) { if ( diveList( this ) ) return input; - Iterator>>> i = prorityInventory.asMap().entrySet().iterator(); + Iterator>> i = prorityInventory.values().iterator();// asMap().entrySet().iterator(); while (i.hasNext()) { - Entry>> invList = i.next(); + List> invList = i.next(); - Iterator> ii = invList.getValue().iterator(); + Iterator> ii = invList.iterator(); while (ii.hasNext() && input != null) { IMEInventoryHandler inv = ii.next(); - if ( inv.canAccept( input ) && (inv.extractItems( input, Actionable.SIMULATE ) != null || inv.isPrioritized( input )) ) - input = inv.injectItems( input, type ); + if ( inv.canAccept( input ) && (inv.extractItems( input, Actionable.SIMULATE, src ) != null || inv.isPrioritized( input )) ) + input = inv.injectItems( input, type, src ); } - ii = invList.getValue().iterator(); + ii = invList.iterator(); while (ii.hasNext() && input != null) { IMEInventoryHandler inv = ii.next(); if ( inv.canAccept( input ) ) - input = inv.injectItems( input, type ); + input = inv.injectItems( input, type, src ); } } @@ -126,12 +122,12 @@ public class NetworkInventoryHandler> implements IMEInvent } @Override - public T extractItems(T request, Actionable mode) + public T extractItems(T request, Actionable mode, BaseActionSource src) { if ( diveList( this ) ) return null; - Iterator>>> i = prorityInventory.asMap().descendingMap().entrySet().iterator(); + Iterator>> i = prorityInventory.descendingMap().values().iterator();// prorityInventory.asMap().descendingMap().entrySet().iterator(); T output = request.copy(); request = request.copy(); @@ -140,15 +136,15 @@ public class NetworkInventoryHandler> implements IMEInvent while (i.hasNext()) { - Entry>> invList = i.next(); + List> invList = i.next(); - Iterator> ii = invList.getValue().iterator(); + Iterator> ii = invList.iterator(); while (ii.hasNext() && output.getStackSize() < req) { IMEInventoryHandler inv = ii.next(); request.setStackSize( req - output.getStackSize() ); - output.add( inv.extractItems( request, mode ) ); + output.add( inv.extractItems( request, mode, src ) ); } } @@ -166,8 +162,10 @@ public class NetworkInventoryHandler> implements IMEInvent if ( diveIteration( this ) ) return out; - for (Entry> h : prorityInventory.entries()) - out = h.getValue().getAvailableItems( out ); + // for (Entry> h : prorityInventory.entries()) + for (List> i : prorityInventory.values()) + for (IMEInventoryHandler j : i) + out = j.getAvailableItems( out ); surface( this ); diff --git a/me/storage/NullInventory.java b/me/storage/NullInventory.java index 46c6b9651..877c87f44 100644 --- a/me/storage/NullInventory.java +++ b/me/storage/NullInventory.java @@ -2,6 +2,7 @@ package appeng.me.storage; import appeng.api.config.AccessRestriction; import appeng.api.config.Actionable; +import appeng.api.networking.security.BaseActionSource; import appeng.api.storage.IMEInventoryHandler; import appeng.api.storage.StorageChannel; import appeng.api.storage.data.IAEStack; @@ -17,13 +18,13 @@ public class NullInventory> implements IMEInventoryHandler } @Override - public T injectItems(T input, Actionable mode) + public T injectItems(T input, Actionable mode, BaseActionSource src) { return input; } @Override - public T extractItems(T request, Actionable mode) + public T extractItems(T request, Actionable mode, BaseActionSource src) { return null; } diff --git a/me/storage/VoidFluidInventory.java b/me/storage/VoidFluidInventory.java index b42f61684..71c98cf0e 100644 --- a/me/storage/VoidFluidInventory.java +++ b/me/storage/VoidFluidInventory.java @@ -2,6 +2,7 @@ package appeng.me.storage; import appeng.api.config.AccessRestriction; import appeng.api.config.Actionable; +import appeng.api.networking.security.BaseActionSource; import appeng.api.storage.IMEInventoryHandler; import appeng.api.storage.StorageChannel; import appeng.api.storage.data.IAEFluidStack; @@ -18,7 +19,7 @@ public class VoidFluidInventory implements IMEInventoryHandler } @Override - public IAEFluidStack injectItems(IAEFluidStack input, Actionable mode) + public IAEFluidStack injectItems(IAEFluidStack input, Actionable mode, BaseActionSource src) { if ( input != null ) target.addPower( (double) input.getStackSize() / 1000.0 ); @@ -32,7 +33,7 @@ public class VoidFluidInventory implements IMEInventoryHandler } @Override - public IAEFluidStack extractItems(IAEFluidStack request, Actionable mode) + public IAEFluidStack extractItems(IAEFluidStack request, Actionable mode, BaseActionSource src) { return null; } diff --git a/me/storage/VoidItemInventory.java b/me/storage/VoidItemInventory.java index 8ea739e88..7bfd14816 100644 --- a/me/storage/VoidItemInventory.java +++ b/me/storage/VoidItemInventory.java @@ -2,6 +2,7 @@ package appeng.me.storage; import appeng.api.config.AccessRestriction; import appeng.api.config.Actionable; +import appeng.api.networking.security.BaseActionSource; import appeng.api.storage.IMEInventoryHandler; import appeng.api.storage.StorageChannel; import appeng.api.storage.data.IAEItemStack; @@ -18,7 +19,7 @@ public class VoidItemInventory implements IMEInventoryHandler } @Override - public IAEItemStack injectItems(IAEItemStack input, Actionable mode) + public IAEItemStack injectItems(IAEItemStack input, Actionable mode, BaseActionSource src) { if ( input != null ) target.addPower( input.getStackSize() ); @@ -32,7 +33,7 @@ public class VoidItemInventory implements IMEInventoryHandler } @Override - public IAEItemStack extractItems(IAEItemStack request, Actionable mode) + public IAEItemStack extractItems(IAEItemStack request, Actionable mode, BaseActionSource src) { return null; } diff --git a/parts/AEBasePart.java b/parts/AEBasePart.java index fb8f66741..41607528f 100644 --- a/parts/AEBasePart.java +++ b/parts/AEBasePart.java @@ -26,6 +26,7 @@ import appeng.api.parts.IPart; import appeng.api.parts.IPartCollsionHelper; import appeng.api.parts.IPartHost; import appeng.api.parts.IPartRenderHelper; +import appeng.api.parts.PartItemStack; import appeng.api.util.AECableType; import appeng.api.util.AEColor; import appeng.api.util.DimensionalCoord; @@ -73,7 +74,7 @@ public class AEBasePart implements IPart, IGridProxyable, IGridHost, IBusCommon } @Override - public ItemStack getItemStack(boolean wrenched) + public ItemStack getItemStack(PartItemStack type) { return is; } @@ -266,4 +267,16 @@ public class AEBasePart implements IPart, IGridProxyable, IGridHost, IBusCommon return 0; } + @Override + public boolean onShiftActivate(EntityPlayer player, Vec3 pos) + { + return false; + } + + @Override + public void onPlacement(EntityPlayer player, ItemStack held, ForgeDirection side) + { + + } + } \ No newline at end of file diff --git a/parts/CableBusContainer.java b/parts/CableBusContainer.java index 5e9a1b4b5..93938bbec 100644 --- a/parts/CableBusContainer.java +++ b/parts/CableBusContainer.java @@ -21,8 +21,10 @@ import net.minecraft.util.AxisAlignedBB; import net.minecraft.util.Vec3; import net.minecraft.world.World; import net.minecraftforge.common.ForgeDirection; +import powercrystals.minefactoryreloaded.api.rednet.RedNetConnectionType; import appeng.api.AEApi; import appeng.api.implementations.IPartCable; +import appeng.api.networking.IGridHost; import appeng.api.networking.IGridNode; import appeng.api.parts.IFacadeContainer; import appeng.api.parts.IFacadePart; @@ -30,6 +32,7 @@ import appeng.api.parts.IPart; import appeng.api.parts.IPartCollsionHelper; import appeng.api.parts.IPartHost; import appeng.api.parts.IPartItem; +import appeng.api.parts.PartItemStack; import appeng.api.parts.SelectedPart; import appeng.api.util.AECableType; import appeng.api.util.AEColor; @@ -42,7 +45,7 @@ import appeng.helpers.AEMultiTile; import appeng.me.GridConnection; import appeng.util.Platform; -public class CableBusContainer implements AEMultiTile +public class CableBusContainer implements AEMultiTile, ICableBusContainer { private IPartCable center; @@ -128,10 +131,22 @@ public class CableBusContainer implements AEMultiTile IPart bp = bi.createPartFromItemStack( is ); if ( bp instanceof IPartCable ) { + boolean hasParts = false; + for (ForgeDirection d : ForgeDirection.VALID_DIRECTIONS) + if ( getPart( d ) != null ) + hasParts = true; + + if ( hasParts && !((IPartCable) bp).supportsBuses() ) + return false; + return getPart( ForgeDirection.UNKNOWN ) == null; } else if ( !(bp instanceof IPartCable) && side != ForgeDirection.UNKNOWN ) { + IPart cable = getPart( ForgeDirection.UNKNOWN ); + if ( cable != null && !((IPartCable) cable).supportsBuses() ) + return false; + return getPart( side ) == null; } } @@ -153,6 +168,14 @@ public class CableBusContainer implements AEMultiTile IPart bp = bi.createPartFromItemStack( is ); if ( bp instanceof IPartCable ) { + boolean hasParts = false; + for (ForgeDirection d : ForgeDirection.VALID_DIRECTIONS) + if ( getPart( d ) != null ) + hasParts = true; + + if ( hasParts && !((IPartCable) bp).supportsBuses() ) + return null; + if ( getPart( ForgeDirection.UNKNOWN ) != null ) return null; @@ -184,6 +207,10 @@ public class CableBusContainer implements AEMultiTile } else if ( !(bp instanceof IPartCable) && side != ForgeDirection.UNKNOWN ) { + IPart cable = getPart( ForgeDirection.UNKNOWN ); + if ( cable != null && !((IPartCable) cable).supportsBuses() ) + return null; + sides[side.ordinal()] = bp; bp.setPartHostInfo( side, this, this.getTile() ); @@ -585,7 +612,7 @@ public class CableBusContainer implements AEMultiTile IPart p = getPart( ForgeDirection.getOrientation( x ) ); if ( p != null ) { - is = p.getItemStack( false ); + is = p.getItemStack( PartItemStack.Network ); is.setTagCompound( null ); data.writeShort( is.getItem().itemID ); @@ -613,7 +640,7 @@ public class CableBusContainer implements AEMultiTile short itemID = data.readShort(); short dmgValue = data.readShort(); - ItemStack current = p != null ? p.getItemStack( false ) : null; + ItemStack current = p != null ? p.getItemStack( PartItemStack.Network ) : null; if ( current != null && current.getItem().itemID == itemID && current.getItemDamage() == dmgValue ) p.readFromStream( data ); else @@ -661,7 +688,7 @@ public class CableBusContainer implements AEMultiTile if ( part != null ) { NBTTagCompound def = new NBTTagCompound(); - part.getItemStack( false ).writeToNBT( def ); + part.getItemStack( PartItemStack.World ).writeToNBT( def ); NBTTagCompound extra = new NBTTagCompound(); part.writeToNBT( extra ); @@ -689,7 +716,7 @@ public class CableBusContainer implements AEMultiTile if ( iss == null ) continue; - ItemStack current = p == null ? null : p.getItemStack( false ); + ItemStack current = p == null ? null : p.getItemStack( PartItemStack.World ); if ( Platform.isSameItemType( iss, current ) ) p.readFromNBT( extra ); @@ -718,7 +745,7 @@ public class CableBusContainer implements AEMultiTile IPart part = getPart( s ); if ( part != null ) { - drops.add( part.getItemStack( false ) ); + drops.add( part.getItemStack( PartItemStack.Break ) ); part.getDrops( drops, false ); } @@ -754,6 +781,14 @@ public class CableBusContainer implements AEMultiTile @Override public AECableType getCableConnectionType(ForgeDirection dir) { + IPart part = getPart( dir ); + if ( part != null && part instanceof IGridHost ) + { + AECableType t = ((IGridHost) part).getCableConnectionType( dir ); + if ( t != null && t != AECableType.NONE ) + return t; + } + if ( center != null ) { IPartCable c = center; @@ -918,4 +953,36 @@ public class CableBusContainer implements AEMultiTile return false; } + @Override + public RedNetConnectionType getConnectionType(World world, int x, int y, int z, ForgeDirection side) + { + return getPart( side ).canConnectRedstone() ? RedNetConnectionType.CableSingle : RedNetConnectionType.None; + } + + @Override + public int[] getOutputValues(World world, int x, int y, int z, ForgeDirection side) + { + // never called + return null; + } + + @Override + public int getOutputValue(World world, int x, int y, int z, ForgeDirection side, int subnet) + { + // never called + return 0; + } + + @Override + public void onInputsChanged(World world, int x, int y, int z, ForgeDirection side, int[] inputValues) + { + // never called + } + + @Override + public void onInputChanged(World world, int x, int y, int z, ForgeDirection side, int inputValue) + { + // never called + } + } diff --git a/parts/ICableBusContainer.java b/parts/ICableBusContainer.java new file mode 100644 index 000000000..0b580c637 --- /dev/null +++ b/parts/ICableBusContainer.java @@ -0,0 +1,43 @@ +package appeng.parts; + +import java.util.EnumSet; +import java.util.Random; + +import net.minecraft.entity.Entity; +import net.minecraft.entity.EntityLivingBase; +import net.minecraft.entity.player.EntityPlayer; +import net.minecraft.util.Vec3; +import net.minecraft.world.World; +import net.minecraftforge.common.ForgeDirection; +import appeng.api.parts.SelectedPart; + +public interface ICableBusContainer +{ + + int isProvidingStrongPower(ForgeDirection opposite); + + int isProvidingWeakPower(ForgeDirection opposite); + + boolean canConnectRedstone(EnumSet of); + + void onEntityCollision(Entity e); + + boolean activate(EntityPlayer player, Vec3 vecFromPool); + + void onNeighborChanged(); + + boolean isSolidOnSide(ForgeDirection side); + + boolean isEmpty(); + + SelectedPart selectPart(Vec3 v3); + + boolean recolourBlock(ForgeDirection side, int colour); + + boolean isLadder(EntityLivingBase entity); + + void randomDisplayTick(World world, int x, int y, int z, Random r); + + int getLightValue(); + +} diff --git a/parts/NullCableBusContainer.java b/parts/NullCableBusContainer.java new file mode 100644 index 000000000..014387f81 --- /dev/null +++ b/parts/NullCableBusContainer.java @@ -0,0 +1,95 @@ +package appeng.parts; + +import java.util.EnumSet; +import java.util.Random; + +import net.minecraft.entity.Entity; +import net.minecraft.entity.EntityLivingBase; +import net.minecraft.entity.player.EntityPlayer; +import net.minecraft.util.Vec3; +import net.minecraft.world.World; +import net.minecraftforge.common.ForgeDirection; +import appeng.api.parts.SelectedPart; + +public class NullCableBusContainer implements ICableBusContainer +{ + + @Override + public int isProvidingStrongPower(ForgeDirection opposite) + { + return 0; + } + + @Override + public int isProvidingWeakPower(ForgeDirection opposite) + { + return 0; + } + + @Override + public boolean canConnectRedstone(EnumSet of) + { + return false; + } + + @Override + public void onEntityCollision(Entity e) + { + + } + + @Override + public boolean activate(EntityPlayer player, Vec3 vecFromPool) + { + return false; + } + + @Override + public void onNeighborChanged() + { + + } + + @Override + public boolean isSolidOnSide(ForgeDirection side) + { + return false; + } + + @Override + public boolean isEmpty() + { + return true; + } + + @Override + public SelectedPart selectPart(Vec3 v3) + { + return new SelectedPart(); + } + + @Override + public boolean recolourBlock(ForgeDirection side, int colour) + { + return false; + } + + @Override + public boolean isLadder(EntityLivingBase entity) + { + return false; + } + + @Override + public void randomDisplayTick(World world, int x, int y, int z, Random r) + { + + } + + @Override + public int getLightValue() + { + return 0; + } + +} diff --git a/parts/automation/PartExportBus.java b/parts/automation/PartExportBus.java index 5f5356976..e224fa0a7 100644 --- a/parts/automation/PartExportBus.java +++ b/parts/automation/PartExportBus.java @@ -111,7 +111,7 @@ public class PartExportBus extends PartSharedItemBus implements IGridTickable bch.addBox( 6, 6, 11, 10, 10, 12 ); } - int itemToSend = 1; + long itemToSend = 1; boolean didSomething = false; @Override @@ -140,8 +140,6 @@ public class PartExportBus extends PartSharedItemBus implements IGridTickable break; } - boolean didSomething = false; - try { InventoryAdaptor d = getHandler(); @@ -183,10 +181,10 @@ public class PartExportBus extends PartSharedItemBus implements IGridTickable private void pushItemIntoTarget(InventoryAdaptor d, IEnergyGrid energy, FuzzyMode fzMode, IMEInventory inv, IAEItemStack ais) { ItemStack is = ais.getItemStack(); - is.stackSize = itemToSend; + is.stackSize = (int) itemToSend; ItemStack o = d.simulateAdd( is ); - int canFit = o == null ? itemToSend : itemToSend - o.stackSize; + long canFit = o == null ? itemToSend : itemToSend - o.stackSize; if ( canFit > 0 ) { @@ -202,7 +200,7 @@ public class PartExportBus extends PartSharedItemBus implements IGridTickable if ( failed != null ) { ais.setStackSize( failed.stackSize ); - inv.injectItems( ais, Actionable.MODULATE ); + inv.injectItems( ais, Actionable.MODULATE, mySrc ); } else didSomething = true; diff --git a/parts/automation/PartImportBus.java b/parts/automation/PartImportBus.java index a2b9c2744..c1c639579 100644 --- a/parts/automation/PartImportBus.java +++ b/parts/automation/PartImportBus.java @@ -63,7 +63,7 @@ public class PartImportBus extends PartSharedItemBus implements IGridTickable, I @Override public boolean canInsert(ItemStack stack) { - IAEItemStack out = destination.injectItems( lastItemChecked = AEApi.instance().storage().createItemStack( stack ), Actionable.SIMULATE ); + IAEItemStack out = destination.injectItems( lastItemChecked = AEApi.instance().storage().createItemStack( stack ), Actionable.SIMULATE, mySrc ); if ( out == null ) return true; return out.getStackSize() != stack.stackSize; diff --git a/parts/automation/PartSharedItemBus.java b/parts/automation/PartSharedItemBus.java index db52270de..b933ba272 100644 --- a/parts/automation/PartSharedItemBus.java +++ b/parts/automation/PartSharedItemBus.java @@ -3,6 +3,7 @@ package appeng.parts.automation; import net.minecraft.inventory.IInventory; import net.minecraft.item.ItemStack; import net.minecraft.tileentity.TileEntity; +import net.minecraft.world.World; import appeng.api.config.RedstoneMode; import appeng.api.config.Upgrades; import appeng.api.networking.IGridNode; @@ -17,6 +18,19 @@ import appeng.util.Platform; public abstract class PartSharedItemBus extends PartUpgradeable implements IGridTickable { + private TileEntity getBlockTileEntity(TileEntity self, int x, int y, int z) + { + World w = self.worldObj; + + if ( w.getChunkProvider().chunkExists( x >> 4, z >> 4 ) ) + { + TileEntity te = w.getBlockTileEntity( x, y, z ); + return te; + } + + return null; + } + public PartSharedItemBus(Class c, ItemStack is) { super( c, is ); } @@ -57,7 +71,7 @@ public abstract class PartSharedItemBus extends PartUpgradeable implements IGrid cached = true; TileEntity self = getHost().getTile(); - TileEntity target = self.worldObj.getBlockTileEntity( self.xCoord + side.offsetX, self.yCoord + side.offsetY, self.zCoord + side.offsetZ ); + TileEntity target = getBlockTileEntity( self, self.xCoord + side.offsetX, self.yCoord + side.offsetY, self.zCoord + side.offsetZ ); int newAdaptorHash = Platform.generateTileHash( target ); diff --git a/parts/automation/PartUpgradeable.java b/parts/automation/PartUpgradeable.java index 92c1fbaed..90186d605 100644 --- a/parts/automation/PartUpgradeable.java +++ b/parts/automation/PartUpgradeable.java @@ -16,7 +16,7 @@ public class PartUpgradeable extends PartBasicState implements ISegmentedInvento { IConfigManager settings = new ConfigManager( this ); - private UpgradeInventory upgrades = new UpgradeInventory( this, 4 ); + private UpgradeInventory upgrades = new UpgradeInventory( is.getItem(), this, 4 ); @Override public int getInstalledUpgrades(Upgrades u) diff --git a/parts/automation/UpgradeInventory.java b/parts/automation/UpgradeInventory.java index bd2d29172..ee0beef92 100644 --- a/parts/automation/UpgradeInventory.java +++ b/parts/automation/UpgradeInventory.java @@ -1,7 +1,9 @@ package appeng.parts.automation; +import net.minecraft.block.Block; import net.minecraft.inventory.IInventory; import net.minecraft.item.Item; +import net.minecraft.item.ItemBlock; import net.minecraft.item.ItemStack; import net.minecraft.nbt.NBTTagCompound; import appeng.api.config.Upgrades; @@ -14,18 +16,21 @@ import appeng.util.Platform; public class UpgradeInventory extends AppEngInternalInventory implements IAEAppEngInventory { + private final Object itemorblock; + private final IAEAppEngInventory parent; + private boolean cached = false; private int FuzzyUpgrades = 0; private int SpeedUpgrades = 0; private int RedstoneUpgrades = 0; private int CapacityUpgrades = 0; + private int InverterUpgrades = 0; - IAEAppEngInventory parent; - - public UpgradeInventory(IAEAppEngInventory _te, int s) { + public UpgradeInventory(Object itemOrBlock, IAEAppEngInventory _te, int s) { super( null, s ); te = this; parent = _te; + itemorblock = itemOrBlock; } @Override @@ -51,16 +56,45 @@ public class UpgradeInventory extends AppEngInternalInventory implements IAEAppE Upgrades u = ((IUpgradeModule) it).getType( itemstack ); if ( u != null ) { - return getInstalledUpgrades( u ) < u.maxInstalled; + return getInstalledUpgrades( u ) < getMaxInstalled( u ); } } return false; } + private int getMaxInstalled(Upgrades u) + { + Integer max = null; + + for (ItemStack is : u.getSupported().keySet()) + { + if ( is.getItem() == itemorblock ) + { + max = u.getSupported().get( is ); + break; + } + else if ( is.getItem() instanceof ItemBlock && Block.blocksList[((ItemBlock) is.getItem()).getBlockID()] == itemorblock ) + { + max = u.getSupported().get( is ); + break; + } + } + + if ( max == null ) + return 0; + return max; + } + + @Override + public int getInventoryStackLimit() + { + return 1; + } + private void updateUpgradeInfo() { cached = true; - CapacityUpgrades = RedstoneUpgrades = SpeedUpgrades = FuzzyUpgrades = 0; + InverterUpgrades = CapacityUpgrades = RedstoneUpgrades = SpeedUpgrades = FuzzyUpgrades = 0; for (ItemStack is : this) { @@ -82,15 +116,19 @@ public class UpgradeInventory extends AppEngInternalInventory implements IAEAppE case SPEED: SpeedUpgrades++; break; + case INVERTER: + InverterUpgrades++; + break; default: break; } } - CapacityUpgrades = Math.min( CapacityUpgrades, Upgrades.CAPACITY.maxInstalled ); - FuzzyUpgrades = Math.min( FuzzyUpgrades, Upgrades.FUZZY.maxInstalled ); - RedstoneUpgrades = Math.min( RedstoneUpgrades, Upgrades.REDSTONE.maxInstalled ); - SpeedUpgrades = Math.min( SpeedUpgrades, Upgrades.SPEED.maxInstalled ); + CapacityUpgrades = Math.min( CapacityUpgrades, getMaxInstalled( Upgrades.CAPACITY ) ); + FuzzyUpgrades = Math.min( FuzzyUpgrades, getMaxInstalled( Upgrades.FUZZY ) ); + RedstoneUpgrades = Math.min( RedstoneUpgrades, getMaxInstalled( Upgrades.REDSTONE ) ); + SpeedUpgrades = Math.min( SpeedUpgrades, getMaxInstalled( Upgrades.SPEED ) ); + InverterUpgrades = Math.min( InverterUpgrades, getMaxInstalled( Upgrades.INVERTER ) ); } public int getInstalledUpgrades(Upgrades u) @@ -108,6 +146,8 @@ public class UpgradeInventory extends AppEngInternalInventory implements IAEAppE return RedstoneUpgrades; case SPEED: return SpeedUpgrades; + case INVERTER: + return InverterUpgrades; default: return 0; } diff --git a/parts/misc/PartCableAnchor.java b/parts/misc/PartCableAnchor.java index 0f0fc22ff..8f07721f1 100644 --- a/parts/misc/PartCableAnchor.java +++ b/parts/misc/PartCableAnchor.java @@ -22,6 +22,7 @@ import appeng.api.parts.IPart; import appeng.api.parts.IPartCollsionHelper; import appeng.api.parts.IPartHost; import appeng.api.parts.IPartRenderHelper; +import appeng.api.parts.PartItemStack; public class PartCableAnchor implements IPart { @@ -65,7 +66,7 @@ public class PartCableAnchor implements IPart } @Override - public ItemStack getItemStack(boolean wrenched) + public ItemStack getItemStack(PartItemStack wrenched) { return is; } @@ -195,4 +196,16 @@ public class PartCableAnchor implements IPart { return mySide.offsetY == 0; } + + @Override + public boolean onShiftActivate(EntityPlayer player, Vec3 pos) + { + return false; + } + + @Override + public void onPlacement(EntityPlayer player, ItemStack held, ForgeDirection side) + { + + } } diff --git a/parts/misc/PartP2PTunnel.java b/parts/misc/PartP2PTunnel.java deleted file mode 100644 index 020c1e65b..000000000 --- a/parts/misc/PartP2PTunnel.java +++ /dev/null @@ -1,88 +0,0 @@ -package appeng.parts.misc; - -import net.minecraft.client.renderer.RenderBlocks; -import net.minecraft.item.ItemStack; -import appeng.api.AEApi; -import appeng.api.parts.IPartCollsionHelper; -import appeng.api.parts.IPartRenderHelper; -import appeng.client.texture.CableBusTextures; -import appeng.parts.PartBasicState; - -public class PartP2PTunnel extends PartBasicState -{ - - public boolean output; - public long freq; - - public PartP2PTunnel(ItemStack is) { - super( PartP2PTunnel.class, is ); - } - - public void onChange() - { - - } - - @Override - public void renderInventory(IPartRenderHelper rh, RenderBlocks renderer) - { - rh.setTexture( AEApi.instance().blocks().blockQuartz.block().getIcon( 0, 0 ) ); - - rh.setBounds( 2, 2, 14, 14, 14, 16 ); - rh.renderInventoryBox( renderer ); - - rh.setTexture( CableBusTextures.PartMonitorSides.getIcon(), CableBusTextures.PartMonitorSides.getIcon(), CableBusTextures.BlockP2PTunnel2.getIcon(), - is.getIconIndex(), CableBusTextures.PartMonitorSides.getIcon(), CableBusTextures.PartMonitorSides.getIcon() ); - - rh.setBounds( 2, 2, 14, 14, 14, 16 ); - rh.renderInventoryBox( renderer ); - } - - @Override - public void renderStatic(int x, int y, int z, IPartRenderHelper rh, RenderBlocks renderer) - { - rh.useSimpliedRendering( x, y, z, this ); - rh.setTexture( AEApi.instance().blocks().blockQuartz.block().getIcon( 0, 0 ) ); - - rh.setBounds( 2, 2, 14, 14, 14, 16 ); - rh.renderBlock( x, y, z, renderer ); - - rh.setTexture( CableBusTextures.PartMonitorSides.getIcon(), CableBusTextures.PartMonitorSides.getIcon(), CableBusTextures.BlockP2PTunnel2.getIcon(), - is.getIconIndex(), CableBusTextures.PartMonitorSides.getIcon(), CableBusTextures.PartMonitorSides.getIcon() ); - - rh.setBounds( 2, 2, 14, 14, 14, 16 ); - rh.renderBlock( x, y, z, renderer ); - - rh.setBounds( 3, 3, 13, 13, 13, 14 ); - rh.renderBlock( x, y, z, renderer ); - - rh.setTexture( CableBusTextures.BlockP2PTunnel3.getIcon() ); - - rh.setBounds( 6, 5, 12, 10, 11, 13 ); - rh.renderBlock( x, y, z, renderer ); - - rh.setBounds( 5, 6, 12, 11, 10, 13 ); - rh.renderBlock( x, y, z, renderer ); - - renderLights( x, y, z, rh, renderer ); - } - - @Override - public void setColors(boolean hasChan, boolean hasPower) - { - super.setColors( hasChan, hasPower ); - } - - @Override - public void getBoxes(IPartCollsionHelper bch) - { - bch.addBox( 2, 2, 14, 14, 14, 16 ); - } - - @Override - public int cableConnectionRenderTo() - { - return 1; - } - -} diff --git a/parts/networking/PartCable.java b/parts/networking/PartCable.java index 0ff1611ca..e240cb766 100644 --- a/parts/networking/PartCable.java +++ b/parts/networking/PartCable.java @@ -16,6 +16,7 @@ import org.lwjgl.opengl.GL11; import appeng.api.AEApi; import appeng.api.implementations.IPartCable; +import appeng.api.networking.GridFlags; import appeng.api.networking.IGridConnection; import appeng.api.networking.IGridHost; import appeng.api.networking.IGridNode; @@ -50,6 +51,12 @@ public class PartCable extends AEBasePart implements IPartCable proxy.myColor = AEColor.values()[((ItemPart) is.getItem()).varientOf( is.getItemDamage() )]; } + @Override + public boolean supportsBuses() + { + return true; + } + public Icon getGlassTexture(AEColor c) { switch (c) @@ -220,7 +227,10 @@ public class PartCable extends AEBasePart implements IPartCable IReadOnlyCollection set = part.getGridNode().getConnections(); for (IGridConnection gc : set) { - sideOut |= gc.getUsedChannels() << (4 * thisSide.ordinal()); + if ( proxy.getNode().hasFlag( GridFlags.TIER_2_CAPACITY ) && gc.getOtherSide( proxy.getNode() ).hasFlag( GridFlags.TIER_2_CAPACITY ) ) + sideOut |= (gc.getUsedChannels() / 4) << (4 * thisSide.ordinal()); + else + sideOut |= (gc.getUsedChannels()) << (4 * thisSide.ordinal()); } } } @@ -231,7 +241,10 @@ public class PartCable extends AEBasePart implements IPartCable ForgeDirection side = gc.getDirection( n ); if ( side != ForgeDirection.UNKNOWN ) { - sideOut |= gc.getUsedChannels() << (4 * side.ordinal()); + if ( proxy.getNode().hasFlag( GridFlags.TIER_2_CAPACITY ) && gc.getOtherSide( proxy.getNode() ).hasFlag( GridFlags.TIER_2_CAPACITY ) ) + sideOut |= (gc.getUsedChannels() / 4) << (4 * side.ordinal()); + else + sideOut |= gc.getUsedChannels() << (4 * side.ordinal()); cs |= (1 << side.ordinal()); } } @@ -562,12 +575,12 @@ public class PartCable extends AEBasePart implements IPartCable boolean isGlass = false; AEColor myColor = getCableColor(); - if ( ghh != null && ccph != null && ghh.getCableConnectionType( of ) == AECableType.GLASS && ccph.getPart( of.getOpposite() ) == null ) + if ( ghh != null && ccph != null && ghh.getCableConnectionType( of.getOpposite() ) == AECableType.GLASS && ccph.getPart( of.getOpposite() ) == null ) { isGlass = true; rh.setTexture( getGlassTexture( myColor = ccph.getColor() ) ); } - else if ( ccph == null && ghh != null && ghh.getCableConnectionType( of ) != AECableType.GLASS ) + else if ( ccph == null && ghh != null && ghh.getCableConnectionType( of.getOpposite() ) != AECableType.GLASS ) { rh.setTexture( getSmartTexture( myColor ) ); switch (of) diff --git a/parts/networking/PartDenseCable.java b/parts/networking/PartDenseCable.java new file mode 100644 index 000000000..0c5499466 --- /dev/null +++ b/parts/networking/PartDenseCable.java @@ -0,0 +1,446 @@ +package appeng.parts.networking; + +import java.util.EnumSet; + +import net.minecraft.client.renderer.RenderBlocks; +import net.minecraft.client.renderer.Tessellator; +import net.minecraft.item.ItemStack; +import net.minecraft.tileentity.TileEntity; +import net.minecraft.util.Icon; +import net.minecraftforge.common.ForgeDirection; + +import org.lwjgl.opengl.GL11; + +import appeng.api.AEApi; +import appeng.api.networking.GridFlags; +import appeng.api.networking.IGridHost; +import appeng.api.networking.IGridNode; +import appeng.api.networking.events.MENetworkChannelsChanged; +import appeng.api.networking.events.MENetworkEventSubscribe; +import appeng.api.networking.events.MENetworkPowerStatusChange; +import appeng.api.parts.IPartCollsionHelper; +import appeng.api.parts.IPartHost; +import appeng.api.parts.IPartRenderHelper; +import appeng.api.util.AECableType; +import appeng.api.util.AEColor; +import appeng.block.AEBaseBlock; +import appeng.client.texture.CableBusTextures; +import appeng.client.texture.FlipableIcon; +import appeng.client.texture.OffsetIcon; +import appeng.client.texture.TaughtIcon; +import appeng.util.Platform; + +public class PartDenseCable extends PartCable +{ + + @Override + public boolean supportsBuses() + { + return false; + } + + @MENetworkEventSubscribe + public void channelUpdated(MENetworkChannelsChanged c) + { + getHost().markForUpdate(); + } + + @MENetworkEventSubscribe + public void powerRender(MENetworkPowerStatusChange c) + { + getHost().markForUpdate(); + } + + public PartDenseCable(ItemStack is) { + super( PartDenseCable.class, is ); + proxy.setFlags( GridFlags.TIER_2_CAPACITY ); + } + + @Override + public AECableType getCableConnectionType() + { + return AECableType.DENSE; + } + + @Override + public Icon getTexture(AEColor c) + { + if ( c == AEColor.Transparent ) + return AEApi.instance().parts().partCableSmart.stack( 1 ).getIconIndex(); + + return getSmartTexture( c ); + } + + @Override + public void renderInventory(IPartRenderHelper rh, RenderBlocks renderer) + { + GL11.glTranslated( -0.2, -0.3, 0.0 ); + + rh.setTexture( getTexture( getCableColor() ) ); + rh.setBounds( 2.0f, 2.0f, 2.0f, 13.0f, 13.0f, 14.0f ); + rh.renderInventoryBox( renderer ); + + rh.setTexture( getChannelTex( 4, false ).getIcon() ); + rh.setBounds( 2.0f, 2.0f, 2.0f, 13.0f, 13.0f, 14.0f ); + rh.renderInventoryBox( renderer ); + + rh.setTexture( getChannelTex( 4, true ).getIcon() ); + rh.setBounds( 2.0f, 2.0f, 2.0f, 13.0f, 13.0f, 14.0f ); + rh.renderInventoryBox( renderer ); + + rh.setTexture( null ); + } + + @Override + public void getBoxes(IPartCollsionHelper bch) + { + bch.addBox( 3.0, 3.0, 3.0, 13.0, 13.0, 13.0 ); + + if ( Platform.isServer() ) + { + IGridNode n = getGridNode(); + if ( n != null ) + connections = n.getConnectedSides(); + else + connections.clear(); + } + + for (ForgeDirection of : connections) + { + if ( isDense( of ) ) + { + switch (of) + { + case DOWN: + bch.addBox( 3.0, 0.0, 3.0, 13.0, 3.0, 13.0 ); + break; + case EAST: + bch.addBox( 13.0, 3.0, 3.0, 16.0, 13.0, 13.0 ); + break; + case NORTH: + bch.addBox( 3.0, 3.0, 0.0, 13.0, 13.0, 3.0 ); + break; + case SOUTH: + bch.addBox( 3.0, 3.0, 13.0, 13.0, 13.0, 16.0 ); + break; + case UP: + bch.addBox( 3.0, 13.0, 3.0, 13.0, 16.0, 13.0 ); + break; + case WEST: + bch.addBox( 0.0, 3.0, 3.0, 3.0, 13.0, 13.0 ); + break; + default: + continue; + } + } + else + { + switch (of) + { + case DOWN: + bch.addBox( 5.0, 0.0, 5.0, 11.0, 5.0, 11.0 ); + break; + case EAST: + bch.addBox( 11.0, 5.0, 5.0, 16.0, 11.0, 11.0 ); + break; + case NORTH: + bch.addBox( 5.0, 5.0, 0.0, 11.0, 11.0, 5.0 ); + break; + case SOUTH: + bch.addBox( 5.0, 5.0, 11.0, 11.0, 11.0, 16.0 ); + break; + case UP: + bch.addBox( 5.0, 11.0, 5.0, 11.0, 16.0, 11.0 ); + break; + case WEST: + bch.addBox( 0.0, 5.0, 5.0, 5.0, 11.0, 11.0 ); + break; + default: + continue; + } + } + } + } + + private boolean isDense(ForgeDirection of) + { + TileEntity te = tile.worldObj.getBlockTileEntity( tile.xCoord + of.offsetX, tile.yCoord + of.offsetY, tile.zCoord + of.offsetZ ); + if ( te instanceof IGridHost ) + { + AECableType t = ((IGridHost) te).getCableConnectionType( of.getOpposite() ); + return t == AECableType.DENSE; + } + return false; + } + + private boolean isSmart(ForgeDirection of) + { + TileEntity te = tile.worldObj.getBlockTileEntity( tile.xCoord + of.offsetX, tile.yCoord + of.offsetY, tile.zCoord + of.offsetZ ); + if ( te instanceof IGridHost ) + { + AECableType t = ((IGridHost) te).getCableConnectionType( of.getOpposite() ); + return t == AECableType.SMART; + } + return false; + } + + public void renderDenseConection(int x, int y, int z, IPartRenderHelper rh, RenderBlocks renderer, int channels, ForgeDirection of) + { + TileEntity te = this.tile.worldObj.getBlockTileEntity( x + of.offsetX, y + of.offsetY, z + of.offsetZ ); + IPartHost ccph = te instanceof IPartHost ? (IPartHost) te : null; + IGridHost ghh = te instanceof IGridHost ? (IGridHost) te : null; + boolean isGlass = false; + AEColor myColor = getCableColor(); + /* + * ( ghh != null && ccph != null && ghh.getCableConnectionType( of ) == AECableType.GLASS && ccph.getPart( + * of.getOpposite() ) == null ) { isGlass = true; rh.setTexture( getGlassTexture( myColor = ccph.getColor() ) ); + * } else if ( ccph == null && ghh != null && ghh.getCableConnectionType( of ) != AECableType.GLASS ) { + * rh.setTexture( getSmartTexture( myColor ) ); switch (of) { case DOWN: rh.setBounds( 3, 0, 3, 13, 4, 13 ); + * break; case EAST: rh.setBounds( 12, 3, 3, 16, 13, 13 ); break; case NORTH: rh.setBounds( 3, 3, 0, 13, 13, 4 + * ); break; case SOUTH: rh.setBounds( 3, 3, 12, 13, 13, 16 ); break; case UP: rh.setBounds( 3, 12, 3, 13, 16, + * 13 ); break; case WEST: rh.setBounds( 0, 3, 3, 4, 13, 13 ); break; default: return; } rh.renderBlock( x, y, + * z, renderer ); + * + * if ( true ) { setSmartConnectionRotations( of, renderer ); Icon defa = new TaughtIcon( getChannelTex( + * channels, false ).getIcon(), -0.2f ); Icon defb = new TaughtIcon( getChannelTex( channels, true ).getIcon(), + * -0.2f ); + * + * if ( of == ForgeDirection.EAST || of == ForgeDirection.WEST ) { AEBaseBlock blk = (AEBaseBlock) + * rh.getBlock(); FlipableIcon ico = blk.getRendererInstance().getTexture( ForgeDirection.EAST ); ico.setFlip( + * false, true ); } + * + * Tessellator.instance.setBrightness( 15 << 20 | 15 << 5 ); Tessellator.instance.setColorOpaque_I( + * myColor.mediumVariant ); rh.setTexture( defa, defa, defa, defa, defa, defa ); renderAllFaces( (AEBaseBlock) + * rh.getBlock(), x, y, z, renderer ); + * + * Tessellator.instance.setColorOpaque_I( myColor.whiteVariant ); rh.setTexture( defb, defb, defb, defb, defb, + * defb ); renderAllFaces( (AEBaseBlock) rh.getBlock(), x, y, z, renderer ); + * + * renderer.uvRotateBottom = renderer.uvRotateEast = renderer.uvRotateNorth = renderer.uvRotateSouth = + * renderer.uvRotateTop = renderer.uvRotateWest = 0; } + * + * rh.setTexture( getTexture( getCableColor() ) ); } + */ + + if ( ghh != null && ccph != null && ghh.getCableConnectionType( of ) != AECableType.GLASS && ccph.getColor() != AEColor.Transparent ) + rh.setTexture( getTexture( myColor = ccph.getColor() ) ); + else + rh.setTexture( getTexture( getCableColor() ) ); + + switch (of) + { + case DOWN: + rh.setBounds( 4, 0, 4, 12, 5, 12 ); + break; + case EAST: + rh.setBounds( 11, 4, 4, 16, 12, 12 ); + break; + case NORTH: + rh.setBounds( 4, 4, 0, 12, 12, 5 ); + break; + case SOUTH: + rh.setBounds( 4, 4, 11, 12, 12, 16 ); + break; + case UP: + rh.setBounds( 4, 11, 4, 12, 16, 12 ); + break; + case WEST: + rh.setBounds( 0, 4, 4, 5, 12, 12 ); + break; + default: + return; + } + + rh.renderBlock( x, y, z, renderer ); + + if ( !isGlass ) + { + setSmartConnectionRotations( of, renderer ); + + Icon defa = new TaughtIcon( getChannelTex( channels, false ).getIcon(), -0.2f ); + Icon defb = new TaughtIcon( getChannelTex( channels, true ).getIcon(), -0.2f ); + + Tessellator.instance.setBrightness( 15 << 20 | 15 << 5 ); + Tessellator.instance.setColorOpaque_I( myColor.mediumVariant ); + rh.setTexture( defa, defa, defa, defa, defa, defa ); + renderAllFaces( (AEBaseBlock) rh.getBlock(), x, y, z, renderer ); + + Tessellator.instance.setColorOpaque_I( myColor.whiteVariant ); + rh.setTexture( defb, defb, defb, defb, defb, defb ); + renderAllFaces( (AEBaseBlock) rh.getBlock(), x, y, z, renderer ); + + renderer.uvRotateBottom = renderer.uvRotateEast = renderer.uvRotateNorth = renderer.uvRotateSouth = renderer.uvRotateTop = renderer.uvRotateWest = 0; + } + } + + @Override + public void renderStatic(int x, int y, int z, IPartRenderHelper rh, RenderBlocks renderer) + { + rh.setTexture( getTexture( getCableColor() ) ); + + EnumSet sides = connections.clone(); + + boolean hasBuses = false; + for (ForgeDirection of : connections) + { + if ( !isDense( of ) ) + hasBuses = true; + } + + if ( sides.size() != 2 || !nonLinear( sides ) || hasBuses ) + { + for (ForgeDirection of : connections) + { + if ( isDense( of ) ) + renderDenseConection( x, y, z, rh, renderer, channelsOnSide[of.ordinal()], of ); + else if ( isSmart( of ) ) + renderSmartConection( x, y, z, rh, renderer, channelsOnSide[of.ordinal()], of ); + else + renderCoveredConection( x, y, z, rh, renderer, channelsOnSide[of.ordinal()], of ); + } + + rh.setTexture( getDenseTexture( getCableColor() ) ); + rh.setBounds( 3, 3, 3, 13, 13, 13 ); + rh.renderBlock( x, y, z, renderer ); + } + else + { + ForgeDirection selectedSide = ForgeDirection.UNKNOWN; + + for (ForgeDirection of : connections) + { + selectedSide = of; + break; + } + + int channels = channelsOnSide[selectedSide.ordinal()]; + Icon def = getTexture( getCableColor() ); + Icon off = new OffsetIcon( def, 0, -12 ); + + Icon defa = new TaughtIcon( getChannelTex( channels, false ).getIcon(), -0.2f ); + Icon offa = new OffsetIcon( defa, 0, -12 ); + + Icon defb = new TaughtIcon( getChannelTex( channels, true ).getIcon(), -0.2f ); + Icon offb = new OffsetIcon( defb, 0, -12 ); + + switch (selectedSide) + { + case DOWN: + case UP: + renderer.setRenderBounds( 3 / 16.0, 0, 3 / 16.0, 13 / 16.0, 16 / 16.0, 13 / 16.0 ); + rh.setTexture( def, def, off, off, off, off ); + renderer.renderStandardBlock( rh.getBlock(), x, y, z ); + renderer.uvRotateTop = 0; + renderer.uvRotateBottom = 0; + renderer.uvRotateSouth = 3; + renderer.uvRotateEast = 3; + + Tessellator.instance.setBrightness( 15 << 20 | 15 << 5 ); + + Tessellator.instance.setColorOpaque_I( getCableColor().mediumVariant ); + rh.setTexture( defa, defa, offa, offa, offa, offa ); + renderAllFaces( (AEBaseBlock) rh.getBlock(), x, y, z, renderer ); + + Tessellator.instance.setColorOpaque_I( getCableColor().whiteVariant ); + rh.setTexture( defb, defb, offb, offb, offb, offb ); + renderAllFaces( (AEBaseBlock) rh.getBlock(), x, y, z, renderer ); + break; + case EAST: + case WEST: + rh.setTexture( off, off, off, off, def, def ); + renderer.uvRotateEast = 2; + renderer.uvRotateWest = 1; + renderer.uvRotateBottom = 2; + renderer.uvRotateTop = 1; + renderer.uvRotateSouth = 3; + renderer.uvRotateNorth = 0; + + AEBaseBlock blk = (AEBaseBlock) rh.getBlock(); + FlipableIcon ico = blk.getRendererInstance().getTexture( ForgeDirection.EAST ); + ico.setFlip( false, true ); + + renderer.setRenderBounds( 0, 3 / 16.0, 3 / 16.0, 16 / 16.0, 13 / 16.0, 13 / 16.0 ); + renderer.renderStandardBlock( rh.getBlock(), x, y, z ); + + Tessellator.instance.setBrightness( 15 << 20 | 15 << 5 ); + + Tessellator.instance.setColorOpaque_I( getCableColor().mediumVariant ); + rh.setTexture( offa, offa, offa, offa, defa, defa ); + renderAllFaces( (AEBaseBlock) rh.getBlock(), x, y, z, renderer ); + + Tessellator.instance.setColorOpaque_I( getCableColor().whiteVariant ); + rh.setTexture( offb, offb, offb, offb, defb, defb ); + renderAllFaces( (AEBaseBlock) rh.getBlock(), x, y, z, renderer ); + break; + case NORTH: + case SOUTH: + rh.setTexture( off, off, def, def, off, off ); + renderer.uvRotateTop = 3; + renderer.uvRotateBottom = 3; + renderer.uvRotateNorth = 1; + renderer.uvRotateSouth = 2; + renderer.uvRotateWest = 1; + renderer.setRenderBounds( 3 / 16.0, 3 / 16.0, 0, 13 / 16.0, 13 / 16.0, 16 / 16.0 ); + renderer.renderStandardBlock( rh.getBlock(), x, y, z ); + + Tessellator.instance.setBrightness( 15 << 20 | 15 << 5 ); + + Tessellator.instance.setColorOpaque_I( getCableColor().mediumVariant ); + rh.setTexture( offa, offa, defa, defa, offa, offa ); + renderAllFaces( (AEBaseBlock) rh.getBlock(), x, y, z, renderer ); + + Tessellator.instance.setColorOpaque_I( getCableColor().whiteVariant ); + rh.setTexture( offb, offb, defb, defb, offb, offb ); + renderAllFaces( (AEBaseBlock) rh.getBlock(), x, y, z, renderer ); + break; + default: + break; + } + } + + renderer.uvRotateBottom = renderer.uvRotateEast = renderer.uvRotateNorth = renderer.uvRotateSouth = renderer.uvRotateTop = renderer.uvRotateWest = 0; + rh.setTexture( null ); + } + + private Icon getDenseTexture(AEColor c) + { + switch (c) + { + case Black: + return CableBusTextures.MEDense_Black.getIcon(); + case Blue: + return CableBusTextures.MEDense_Blue.getIcon(); + case Brown: + return CableBusTextures.MEDense_Brown.getIcon(); + case Cyan: + return CableBusTextures.MEDense_Cyan.getIcon(); + case Gray: + return CableBusTextures.MEDense_Gray.getIcon(); + case Green: + return CableBusTextures.MEDense_Green.getIcon(); + case LightBlue: + return CableBusTextures.MEDense_LightBlue.getIcon(); + case LightGray: + return CableBusTextures.MEDense_LightGrey.getIcon(); + case Lime: + return CableBusTextures.MEDense_Lime.getIcon(); + case Magenta: + return CableBusTextures.MEDense_Magenta.getIcon(); + case Orange: + return CableBusTextures.MEDense_Orange.getIcon(); + case Pink: + return CableBusTextures.MEDense_Pink.getIcon(); + case Purple: + return CableBusTextures.MEDense_Purple.getIcon(); + case Red: + return CableBusTextures.MEDense_Red.getIcon(); + case White: + return CableBusTextures.MEDense_White.getIcon(); + case Yellow: + return CableBusTextures.MEDense_Yellow.getIcon(); + default: + } + + return is.getIconIndex(); + } +} diff --git a/parts/p2p/PartP2PBCPower.java b/parts/p2p/PartP2PBCPower.java new file mode 100644 index 000000000..445dc2ac3 --- /dev/null +++ b/parts/p2p/PartP2PBCPower.java @@ -0,0 +1,173 @@ +package appeng.parts.p2p; + +import net.minecraft.block.Block; +import net.minecraft.item.ItemStack; +import net.minecraft.nbt.NBTTagCompound; +import net.minecraft.tileentity.TileEntity; +import net.minecraft.util.Icon; +import net.minecraft.world.World; +import net.minecraftforge.common.ForgeDirection; +import appeng.api.config.PowerUnits; +import appeng.api.networking.IGridNode; +import appeng.api.networking.ticking.IGridTickable; +import appeng.api.networking.ticking.TickRateModulation; +import appeng.api.networking.ticking.TickingRequest; +import appeng.core.Configuration; +import appeng.me.GridAccessException; +import appeng.me.cache.helpers.TunnelCollection; +import buildcraft.api.power.IPowerReceptor; +import buildcraft.api.power.PowerHandler; +import buildcraft.api.power.PowerHandler.PowerReceiver; +import buildcraft.api.power.PowerHandler.Type; +import cpw.mods.fml.relauncher.Side; +import cpw.mods.fml.relauncher.SideOnly; + +public class PartP2PBCPower extends PartP2PTunnel implements IPowerReceptor, IGridTickable +{ + + PowerHandler pp; + + public PartP2PBCPower(ItemStack is) { + super( is ); + pp = new PowerHandler( this, Type.MACHINE ); + pp.configure( 1f, 320f, 800f, 640f ); + } + + @Override + public TickingRequest getTickingRequest(IGridNode node) + { + return new TickingRequest( 1, 20, false, false ); + } + + @Override + public TickRateModulation tickingRequest(IGridNode node, int TicksSinceLastCall) + { + if ( !output && proxy.isActive() ) + { + float totalRequiredPower = 0.0f; + TunnelCollection tunnelset; + + try + { + tunnelset = getOutputs(); + } + catch (GridAccessException e) + { + return TickRateModulation.IDLE; + } + + for (PartP2PBCPower o : tunnelset) + { + IPowerReceptor target = o.getPowerTarget(); + if ( target != null ) + { + PowerReceiver tp = target.getPowerReceiver( side.getOpposite() ); + if ( tp != null ) + { + float howmuch = tp.powerRequest(); + + if ( howmuch > tp.getMaxEnergyReceived() ) + howmuch = tp.getMaxEnergyReceived(); + + if ( howmuch > 0.01 && howmuch > tp.getMinEnergyReceived() ) + { + totalRequiredPower += howmuch; + } + } + } + } + + if ( totalRequiredPower < 0.1 ) + return TickRateModulation.SLOWER; + + float currentTotal = pp.getEnergyStored(); + if ( currentTotal < 0.01 ) + return TickRateModulation.SLOWER; + + for (PartP2PBCPower o : tunnelset) + { + IPowerReceptor target = o.getPowerTarget(); + if ( target != null ) + { + PowerReceiver tp = target.getPowerReceiver( side.getOpposite() ); + if ( tp != null ) + { + float howmuch = tp.powerRequest(); // orientation.getOpposite() ); + if ( howmuch > tp.getMaxEnergyReceived() ) + howmuch = tp.getMaxEnergyReceived(); + + if ( howmuch > 0.01 && howmuch > tp.getMinEnergyReceived() ) + { + float toPull = currentTotal * (howmuch / totalRequiredPower); + float pulled = pp.useEnergy( 0, toPull, true ); + QueueTunnelDrain( PowerUnits.MJ, pulled * Configuration.TunnelPowerLoss ); + + tp.receiveEnergy( Type.PIPE, pulled, o.side.getOpposite() ); + } + } + } + } + + return TickRateModulation.FASTER; + } + + return TickRateModulation.SLOWER; + } + + public float getPowerDrainPerTick() + { + return 0.5f; + }; + + private IPowerReceptor getPowerTarget() + { + TileEntity te = getWorld().getBlockTileEntity( tile.xCoord + side.offsetX, tile.yCoord + side.offsetY, tile.zCoord + side.offsetZ ); + if ( te != null ) + { + if ( te instanceof IPowerReceptor ) + return (IPowerReceptor) te; + } + return null; + } + + @Override + public void writeToNBT(NBTTagCompound tag) + { + super.writeToNBT( tag ); + pp.writeToNBT( tag ); + } + + @Override + public void readFromNBT(NBTTagCompound tag) + { + super.readFromNBT( tag ); + pp.readFromNBT( tag ); + } + + @SideOnly(Side.CLIENT) + public Icon getTypeTexture() + { + return Block.blockEmerald.getBlockTextureFromSide( 0 ); + } + + @Override + public PowerReceiver getPowerReceiver(ForgeDirection side) + { + if ( side.equals( side ) ) + return pp.getPowerReceiver(); + return null; + } + + @Override + public void doWork(PowerHandler workProvider) + { + + } + + @Override + public World getWorld() + { + return tile.worldObj; + } + +} diff --git a/parts/p2p/PartP2PIC2Power.java b/parts/p2p/PartP2PIC2Power.java new file mode 100644 index 000000000..1d87867cf --- /dev/null +++ b/parts/p2p/PartP2PIC2Power.java @@ -0,0 +1,151 @@ +package appeng.parts.p2p; + +import java.util.LinkedList; + +import net.minecraft.block.Block; +import net.minecraft.item.ItemStack; +import net.minecraft.nbt.NBTTagCompound; +import net.minecraft.tileentity.TileEntity; +import net.minecraft.util.Icon; +import net.minecraftforge.common.ForgeDirection; +import appeng.me.GridAccessException; +import appeng.me.cache.helpers.TunnelCollection; +import appeng.util.Platform; +import cpw.mods.fml.relauncher.Side; +import cpw.mods.fml.relauncher.SideOnly; + +public class PartP2PIC2Power extends PartP2PTunnel implements ic2.api.energy.tile.IEnergySink, ic2.api.energy.tile.IEnergySource +{ + + public PartP2PIC2Power(ItemStack is) { + super( is ); + } + + double OutputPacket; + + @Override + public void writeToNBT(NBTTagCompound tag) + { + super.writeToNBT( tag ); + tag.setDouble( "OutputPacket", OutputPacket ); + } + + @Override + public void readFromNBT(NBTTagCompound tag) + { + super.readFromNBT( tag ); + OutputPacket = tag.getDouble( "OutputPacket" ); + } + + @SideOnly(Side.CLIENT) + public Icon getTypeTexture() + { + return Block.blockDiamond.getBlockTextureFromSide( 0 ); + } + + @Override + public boolean acceptsEnergyFrom(TileEntity emitter, ForgeDirection direction) + { + if ( !output ) + return direction.equals( side ); + return false; + } + + @Override + public boolean emitsEnergyTo(TileEntity receiver, ForgeDirection direction) + { + if ( output ) + return direction.equals( side ); + return false; + } + + @Override + public double demandedEnergyUnits() + { + if ( output ) + return 0; + + try + { + for (PartP2PIC2Power t : getOutputs()) + { + if ( t.OutputPacket <= 0.0001 ) + { + return 2048; + } + } + } + catch (GridAccessException e) + { + return 0; + } + + return 0; + } + + @Override + public void onChange() + { + getHost().PartChanged(); + } + + public float getPowerDrainPerTick() + { + return 0.5f; + }; + + @Override + public double injectEnergyUnits(ForgeDirection directionFrom, double amount) + { + + TunnelCollection outs; + try + { + outs = getOutputs(); + } + catch (GridAccessException e) + { + return amount; + } + + if ( outs.isEmpty() ) + return amount; + + LinkedList Options = new LinkedList(); + for (PartP2PIC2Power o : outs) + { + if ( o.OutputPacket <= 0.01 ) + Options.add( o ); + } + + PartP2PIC2Power x = (PartP2PIC2Power) Platform.pickRandom( Options ); + if ( x != null && x.OutputPacket <= 0.001 ) + { + x.OutputPacket = amount; + return 0; + } + + return amount; + } + + @Override + public int getMaxSafeInput() + { + return Integer.MAX_VALUE; + } + + @Override + public double getOfferedEnergy() + { + if ( output ) + return OutputPacket; + return 0; + } + + @Override + public void drawEnergy(double amount) + { + OutputPacket -= amount; + } + +} diff --git a/parts/p2p/PartP2PItems.java b/parts/p2p/PartP2PItems.java new file mode 100644 index 000000000..cd844861f --- /dev/null +++ b/parts/p2p/PartP2PItems.java @@ -0,0 +1,284 @@ +package appeng.parts.p2p; + +import java.util.LinkedList; +import java.util.List; + +import net.minecraft.block.Block; +import net.minecraft.entity.player.EntityPlayer; +import net.minecraft.inventory.IInventory; +import net.minecraft.inventory.ISidedInventory; +import net.minecraft.item.ItemStack; +import net.minecraft.tileentity.TileEntity; +import net.minecraft.tileentity.TileEntityChest; +import net.minecraft.util.Icon; +import net.minecraftforge.common.ForgeDirection; +import appeng.core.AppEng; +import appeng.integration.abstraction.IBC; +import appeng.integration.abstraction.ITE; +import appeng.me.GridAccessException; +import appeng.me.cache.helpers.TunnelCollection; +import appeng.tile.inventory.AppEngNullInventory; +import appeng.util.Platform; +import appeng.util.inv.WrapperBCPipe; +import appeng.util.inv.WrapperChainedInventory; +import appeng.util.inv.WrapperMCISidedInventory; +import appeng.util.inv.WrapperTEPipe; +import buildcraft.api.transport.IPipeConnection; +import buildcraft.api.transport.IPipeTile.PipeType; +import cpw.mods.fml.relauncher.Side; +import cpw.mods.fml.relauncher.SideOnly; + +public class PartP2PItems extends PartP2PTunnel implements IPipeConnection, IInventory, ISidedInventory +{ + + public PartP2PItems(ItemStack is) { + super( is ); + } + + int oldSize = 0; + IInventory cachedInv; + + LinkedList which = new LinkedList(); + + IInventory getOutputInv() + { + IInventory output = null; + + if ( proxy.isActive() ) + { + TileEntity te = tile.worldObj.getBlockTileEntity( tile.xCoord + side.offsetX, tile.yCoord + side.offsetY, tile.zCoord + side.offsetZ ); + + if ( which.contains( this ) ) + return null; + + which.add( this ); + + if ( AppEng.instance.isIntegrationEnabled( "BC" ) ) + { + IBC buildcraft = (IBC) AppEng.instance.getIntegration( "BC" ); + if ( buildcraft != null ) + { + if ( buildcraft.isPipe( te, side.getOpposite() ) ) + { + try + { + output = new WrapperBCPipe( te, side.getOpposite() ); + } + catch (Throwable _) + { + } + } + } + } + + if ( AppEng.instance.isIntegrationEnabled( "TE" ) ) + { + ITE thermal = (ITE) AppEng.instance.getIntegration( "TE" ); + if ( thermal != null ) + { + if ( thermal.isPipe( te, side.getOpposite() ) ) + { + try + { + output = new WrapperTEPipe( te, side.getOpposite() ); + } + catch (Throwable _) + { + } + } + } + } + + if ( output == null ) + { + if ( te instanceof TileEntityChest ) + { + output = Platform.GetChestInv( te ); + } + else if ( te instanceof ISidedInventory ) + { + output = new WrapperMCISidedInventory( (ISidedInventory) te, side.getOpposite() ); + } + else if ( te instanceof IInventory ) + { + output = (IInventory) te; + } + } + + which.pop(); + } + + return output; + } + + @Override + public void onNeighborChanged() + { + cachedInv = null; + PartP2PItems input = getInput(); + if ( input != null ) + input.onChange(); + } + + IInventory getDest() + { + if ( cachedInv != null ) + return cachedInv; + + List outs = new LinkedList(); + TunnelCollection itemTunnels; + + try + { + itemTunnels = getOutputs(); + } + catch (GridAccessException e) + { + return new AppEngNullInventory(); + } + + for (PartP2PItems t : itemTunnels) + { + IInventory inv = t.getOutputInv(); + if ( inv != null ) + { + if ( Platform.getRandomInt() % 2 == 0 ) + outs.add( inv ); + else + outs.add( 0, inv ); + } + } + + return cachedInv = new WrapperChainedInventory( outs ); + } + + @Override + public void onChange() + { + cachedInv = null; + int olderSize = oldSize; + oldSize = getDest().getSizeInventory(); + if ( olderSize != oldSize ) + { + getHost().PartChanged(); + tile.worldObj.notifyBlocksOfNeighborChange( tile.xCoord, tile.yCoord, tile.zCoord, 0 ); + } + } + + @SideOnly(Side.CLIENT) + public Icon getTypeTexture() + { + return Block.hopperBlock.getBlockTextureFromSide( 0 ); + } + + @Override + public int getSizeInventory() + { + return getDest().getSizeInventory(); + } + + @Override + public ItemStack getStackInSlot(int i) + { + return getDest().getStackInSlot( i ); + } + + @Override + public ItemStack decrStackSize(int i, int j) + { + return getDest().decrStackSize( i, j ); + } + + @Override + public ItemStack getStackInSlotOnClosing(int i) + { + return null; + } + + @Override + public void setInventorySlotContents(int i, ItemStack itemstack) + { + getDest().setInventorySlotContents( i, itemstack ); + } + + @Override + public String getInvName() + { + return null; + } + + @Override + public boolean isInvNameLocalized() + { + return false; + } + + @Override + public int getInventoryStackLimit() + { + return getDest().getInventoryStackLimit(); + } + + @Override + public void openChest() + { + + } + + @Override + public void closeChest() + { + + } + + @Override + public boolean isItemValidForSlot(int i, net.minecraft.item.ItemStack itemstack) + { + return getDest().isItemValidForSlot( i, itemstack ); + } + + @Override + public int[] getAccessibleSlotsFromSide(int var1) + { + int[] slots = new int[getSizeInventory()]; + for (int x = 0; x < getSizeInventory(); x++) + slots[x] = x; + return slots; + } + + public float getPowerDrainPerTick() + { + return 2.0f; + }; + + @Override + public boolean canInsertItem(int i, ItemStack itemstack, int j) + { + return getDest().isItemValidForSlot( i, itemstack ); + } + + @Override + public boolean canExtractItem(int i, ItemStack itemstack, int j) + { + return false; + } + + @Override + public boolean isUseableByPlayer(EntityPlayer entityplayer) + { + return false; + } + + @Override + public ConnectOverride overridePipeConnection(PipeType type, ForgeDirection with) + { + return side.equals( with ) && type == PipeType.ITEM ? ConnectOverride.CONNECT : ConnectOverride.DEFAULT; + } + + @Override + public void onInventoryChanged() + { + // eh? + } + +} diff --git a/parts/p2p/PartP2PLiquids.java b/parts/p2p/PartP2PLiquids.java new file mode 100644 index 000000000..7b9fa0c6e --- /dev/null +++ b/parts/p2p/PartP2PLiquids.java @@ -0,0 +1,205 @@ +package appeng.parts.p2p; + +import java.util.Iterator; +import java.util.LinkedList; +import java.util.List; + +import net.minecraft.block.Block; +import net.minecraft.item.ItemStack; +import net.minecraft.nbt.NBTTagCompound; +import net.minecraft.tileentity.TileEntity; +import net.minecraft.util.Icon; +import net.minecraftforge.common.ForgeDirection; +import net.minecraftforge.fluids.Fluid; +import net.minecraftforge.fluids.FluidStack; +import net.minecraftforge.fluids.FluidTankInfo; +import net.minecraftforge.fluids.IFluidHandler; +import appeng.me.GridAccessException; +import cpw.mods.fml.relauncher.Side; +import cpw.mods.fml.relauncher.SideOnly; + +public class PartP2PLiquids extends PartP2PTunnel implements IFluidHandler +{ + + public PartP2PLiquids(ItemStack is) { + super( is ); + } + + private FluidTankInfo[] getTank() + { + if ( output ) + { + PartP2PLiquids tun = getInput(); + if ( tun != null ) + return new FluidTankInfo[] { new FluidTankInfo( null, 10000 ) }; + } + else + { + try + { + if ( !getOutputs().isEmpty() ) + return new FluidTankInfo[] { new FluidTankInfo( null, 10000 ) }; + } + catch (GridAccessException e) + { + // :( + } + } + return new FluidTankInfo[] { new FluidTankInfo( null, 0 ) }; + } + + IFluidHandler cachedTank; + + public float getPowerDrainPerTick() + { + return 2.0f; + }; + + private int tmpUsed; + + @Override + public void writeToNBT(NBTTagCompound tag) + { + super.writeToNBT( tag ); + } + + @Override + public void readFromNBT(NBTTagCompound tag) + { + super.readFromNBT( tag ); + } + + @SideOnly(Side.CLIENT) + public Icon getTypeTexture() + { + return Block.blockLapis.getBlockTextureFromSide( 0 ); + } + + List getOutputs(Fluid input) + { + List outs = new LinkedList(); + + try + { + for (PartP2PLiquids l : getOutputs()) + { + IFluidHandler targ = getTarget(); + if ( targ != null ) + { + if ( targ.canFill( side.getOpposite(), input ) ) + outs.add( l ); + } + } + } + catch (GridAccessException e) + { + // :P + } + + return outs; + } + + public void onNeighborBlockChange() + { + cachedTank = null; + }; + + IFluidHandler getTarget() + { + if ( cachedTank != null ) + return cachedTank; + + TileEntity te = tile.worldObj.getBlockTileEntity( tile.xCoord + side.offsetX, tile.yCoord + side.offsetY, tile.zCoord + side.offsetZ ); + if ( te instanceof IFluidHandler ) + return cachedTank = (IFluidHandler) te; + + return null; + } + + @Override + public int fill(ForgeDirection from, FluidStack resource, boolean doFill) + { + List list = getOutputs( resource.getFluid() ); + int requestTotal = 0; + + Iterator i = list.iterator(); + while (i.hasNext()) + { + PartP2PLiquids l = i.next(); + IFluidHandler tank = l.getTarget(); + if ( tank != null ) + l.tmpUsed = tank.fill( l.side.getOpposite(), resource.copy(), false ); + else + l.tmpUsed = 0; + + if ( l.tmpUsed <= 0 ) + i.remove(); + else + requestTotal += l.tmpUsed; + } + + if ( requestTotal <= 0 ) + return 0; + + if ( !doFill ) + return Math.min( resource.amount, requestTotal ); + + int avilable = resource.amount; + int used = 0; + + i = list.iterator(); + while (i.hasNext()) + { + PartP2PLiquids l = i.next(); + + FluidStack insert = resource.copy(); + insert.amount = (int) Math.ceil( insert.amount * ((double) l.tmpUsed / (double) requestTotal) ); + if ( insert.amount > avilable ) + insert.amount = avilable; + + IFluidHandler tank = l.getTarget(); + if ( tank != null ) + l.tmpUsed = tank.fill( l.side.getOpposite(), insert.copy(), true ); + else + l.tmpUsed = 0; + + avilable -= insert.amount; + used += insert.amount; + } + + return used; + } + + @Override + public boolean canFill(ForgeDirection from, Fluid fluid) + { + return !output && from.equals( side ) && !getOutputs( fluid ).isEmpty(); + } + + @Override + public FluidStack drain(ForgeDirection from, FluidStack resource, boolean doDrain) + { + return null; + } + + @Override + public FluidStack drain(ForgeDirection from, int maxDrain, boolean doDrain) + { + return null; + } + + @Override + public boolean canDrain(ForgeDirection from, Fluid fluid) + { + return false; + } + + @Override + public FluidTankInfo[] getTankInfo(ForgeDirection from) + { + if ( from.equals( side ) ) + return getTank(); + return new FluidTankInfo[0]; + } + +} diff --git a/parts/p2p/PartP2PRedstone.java b/parts/p2p/PartP2PRedstone.java new file mode 100644 index 000000000..19c0da110 --- /dev/null +++ b/parts/p2p/PartP2PRedstone.java @@ -0,0 +1,182 @@ +package appeng.parts.p2p; + +import net.minecraft.block.Block; +import net.minecraft.block.BlockRedstoneWire; +import net.minecraft.item.ItemStack; +import net.minecraft.nbt.NBTTagCompound; +import net.minecraft.util.Icon; +import net.minecraft.world.World; +import appeng.api.networking.events.MENetworkBootingStatusChange; +import appeng.api.networking.events.MENetworkChannelsChanged; +import appeng.api.networking.events.MENetworkEventSubscribe; +import appeng.api.networking.events.MENetworkPowerStatusChange; +import appeng.me.GridAccessException; +import cpw.mods.fml.relauncher.Side; +import cpw.mods.fml.relauncher.SideOnly; + +public class PartP2PRedstone extends PartP2PTunnel +{ + + public PartP2PRedstone(ItemStack is) { + super( is ); + } + + int power; + + @Override + public boolean canConnectRedstone() + { + return true; + } + + @Override + public int isProvidingStrongPower() + { + return output ? power : 0; + } + + @Override + public int isProvidingWeakPower() + { + return output ? power : 0; + } + + @Override + public void onChange() + { + setNetworkReady(); + } + + @MENetworkEventSubscribe + public void changeStateA(MENetworkBootingStatusChange bs) + { + setNetworkReady(); + } + + @MENetworkEventSubscribe + public void changeStateB(MENetworkChannelsChanged bs) + { + setNetworkReady(); + } + + @MENetworkEventSubscribe + public void changeStateC(MENetworkPowerStatusChange bs) + { + setNetworkReady(); + } + + public void setNetworkReady() + { + if ( output ) + { + PartP2PRedstone in = getInput(); + if ( in != null ) + putInput( ((PartP2PRedstone) in).power ); + } + } + + boolean recursive = false; + + protected void putInput(Object o) + { + if ( recursive ) + return; + + recursive = true; + if ( output && proxy.isActive() ) + { + int newPower = (Integer) o; + if ( power != newPower ) + { + power = newPower; + notifyNeightbors(); + } + } + recursive = false; + + } + + public void notifyNeightbors() + { + World worldObj = tile.worldObj; + + int xCoord = tile.xCoord; + int yCoord = tile.yCoord; + int zCoord = tile.zCoord; + + worldObj.notifyBlocksOfNeighborChange( xCoord, yCoord, zCoord, worldObj.getBlockId( xCoord, yCoord, zCoord ) ); + + // and this cause somtimes it can go thought walls. + worldObj.notifyBlocksOfNeighborChange( xCoord - 1, yCoord, zCoord, worldObj.getBlockId( xCoord, yCoord, zCoord ) ); + worldObj.notifyBlocksOfNeighborChange( xCoord, yCoord - 1, zCoord, worldObj.getBlockId( xCoord, yCoord, zCoord ) ); + worldObj.notifyBlocksOfNeighborChange( xCoord, yCoord, zCoord - 1, worldObj.getBlockId( xCoord, yCoord, zCoord ) ); + worldObj.notifyBlocksOfNeighborChange( xCoord, yCoord, zCoord + 1, worldObj.getBlockId( xCoord, yCoord, zCoord ) ); + worldObj.notifyBlocksOfNeighborChange( xCoord, yCoord + 1, zCoord, worldObj.getBlockId( xCoord, yCoord, zCoord ) ); + worldObj.notifyBlocksOfNeighborChange( xCoord + 1, yCoord, zCoord, worldObj.getBlockId( xCoord, yCoord, zCoord ) ); + } + + @Override + public void writeToNBT(NBTTagCompound tag) + { + super.writeToNBT( tag ); + tag.setInteger( "power", power ); + } + + @Override + public void readFromNBT(NBTTagCompound tag) + { + super.readFromNBT( tag ); + power = tag.getInteger( "power" ); + } + + @SideOnly(Side.CLIENT) + public Icon getTypeTexture() + { + return Block.blockRedstone.getBlockTextureFromSide( 0 ); + } + + public float getPowerDrainPerTick() + { + return 0.5f; + }; + + @Override + public void onNeighborChanged() + { + if ( !output ) + { + int x = tile.xCoord + side.offsetX; + int y = tile.yCoord + side.offsetY; + int z = tile.zCoord + side.offsetZ; + + Block b = Block.blocksList[tile.worldObj.getBlockId( x, y, z )]; + if ( b != null && !output ) + { + int srcSide = side.ordinal(); + if ( b instanceof BlockRedstoneWire ) + srcSide = 1; + power = b.isProvidingStrongPower( tile.worldObj, x, y, z, srcSide ); + power = Math.max( power, b.isProvidingWeakPower( tile.worldObj, x, y, z, srcSide ) ); + sendToOutput( power ); + } + else + sendToOutput( 0 ); + } + } + + private void sendToOutput(int power) + { + try + { + for (PartP2PRedstone rs : getOutputs()) + { + rs.putInput( power ); + } + } + catch (GridAccessException e) + { + // :P + } + } + +} diff --git a/parts/p2p/PartP2PTunnel.java b/parts/p2p/PartP2PTunnel.java new file mode 100644 index 000000000..2654ad185 --- /dev/null +++ b/parts/p2p/PartP2PTunnel.java @@ -0,0 +1,243 @@ +package appeng.parts.p2p; + +import java.util.Collection; + +import net.minecraft.client.renderer.RenderBlocks; +import net.minecraft.entity.player.EntityPlayer; +import net.minecraft.item.ItemStack; +import net.minecraft.nbt.NBTTagCompound; +import net.minecraft.util.Icon; +import net.minecraft.util.Vec3; +import net.minecraftforge.common.ForgeDirection; +import appeng.api.AEApi; +import appeng.api.config.PowerUnits; +import appeng.api.implementations.IMemoryCard; +import appeng.api.parts.IPart; +import appeng.api.parts.IPartCollsionHelper; +import appeng.api.parts.IPartRenderHelper; +import appeng.api.parts.PartItemStack; +import appeng.client.texture.CableBusTextures; +import appeng.me.GridAccessException; +import appeng.me.cache.P2PCache; +import appeng.me.cache.helpers.TunnelCollection; +import appeng.parts.PartBasicState; + +public class PartP2PTunnel extends PartBasicState +{ + + public boolean output; + public long freq; + TunnelCollection type = new TunnelCollection( null, getClass() ); + + public PartP2PTunnel(ItemStack is) { + super( PartP2PTunnel.class, is ); + if ( getClass() == PartP2PTunnel.class ) + throw new RuntimeException( "Don't construct the root tunnel!" ); + } + + @Override + public void writeToNBT(NBTTagCompound data) + { + data.setBoolean( "output", output ); + data.setLong( "freq", freq ); + } + + @Override + public void readFromNBT(NBTTagCompound data) + { + output = data.getBoolean( "output" ); + freq = data.getLong( "freq" ); + } + + @Override + public boolean onActivate(EntityPlayer player, Vec3 pos) + { + ItemStack is = player.inventory.getCurrentItem(); + + if ( is != null && is.getItem() instanceof IMemoryCard ) + { + IMemoryCard mc = (IMemoryCard) is.getItem(); + NBTTagCompound data = mc.getData( is ); + + ItemStack newType = ItemStack.loadItemStackFromNBT( data ); + long freq = data.getLong( "freq" ); + + getHost().removePart( side ); + ForgeDirection dir = getHost().addPart( newType, side ); + IPart newBus = getHost().getPart( dir ); + + if ( newBus instanceof PartP2PTunnel ) + { + PartP2PTunnel newTunnel = (PartP2PTunnel) newBus; + newTunnel.output = true; + newTunnel.onChange(); + + try + { + P2PCache p2p = newTunnel.proxy.getP2P(); + p2p.updateFreq( newTunnel, freq ); + } + catch (GridAccessException e) + { + // :P + } + } + + } + + return false; + } + + @Override + public boolean onShiftActivate(EntityPlayer player, Vec3 pos) + { + ItemStack is = player.inventory.getCurrentItem(); + if ( is != null && is.getItem() instanceof IMemoryCard ) + { + IMemoryCard mc = (IMemoryCard) is.getItem(); + NBTTagCompound data = new NBTTagCompound(); + + long newFreq = freq; + output = false; + + if ( output || freq == 0 ) + { + newFreq = System.currentTimeMillis(); + try + { + proxy.getP2P().updateFreq( this, newFreq ); + } + catch (GridAccessException e) + { + // :P + } + } + + onChange(); + + ItemStack p2pItem = getItemStack( PartItemStack.Wrench ); + String type = p2pItem.getUnlocalizedName(); + + p2pItem.writeToNBT( data ); + data.setLong( "freq", freq ); + + mc.setMemoryCardContents( is, type + ".name", data ); + return true; + } + return false; + } + + public ItemStack getItemStack(PartItemStack type) + { + if ( type == PartItemStack.World || type == PartItemStack.Network || type == PartItemStack.Wrench ) + return super.getItemStack( type ); + + return AEApi.instance().parts().partP2PTunnelME.stack( 1 ); + } + + public TunnelCollection getCollection(Collection collection) + { + type.setSource( collection ); + return type; + } + + public T getInput() + { + PartP2PTunnel tunn; + try + { + tunn = proxy.getP2P().getInput( freq ); + if ( getClass().isInstance( tunn ) ) + return (T) tunn; + } + catch (GridAccessException e) + { + // :P + } + return null; + } + + public TunnelCollection getOutputs() throws GridAccessException + { + return (TunnelCollection) proxy.getP2P().getOutputs( freq, getClass() ); + } + + public void onChange() + { + + } + + @Override + public void renderInventory(IPartRenderHelper rh, RenderBlocks renderer) + { + rh.setTexture( getTypeTexture() ); + + rh.setBounds( 2, 2, 14, 14, 14, 16 ); + rh.renderInventoryBox( renderer ); + + rh.setTexture( CableBusTextures.PartMonitorSides.getIcon(), CableBusTextures.PartMonitorSides.getIcon(), CableBusTextures.BlockP2PTunnel2.getIcon(), + is.getIconIndex(), CableBusTextures.PartMonitorSides.getIcon(), CableBusTextures.PartMonitorSides.getIcon() ); + + rh.setBounds( 2, 2, 14, 14, 14, 16 ); + rh.renderInventoryBox( renderer ); + } + + protected Icon getTypeTexture() + { + return AEApi.instance().blocks().blockQuartz.block().getIcon( 0, 0 ); + } + + @Override + public void renderStatic(int x, int y, int z, IPartRenderHelper rh, RenderBlocks renderer) + { + rh.useSimpliedRendering( x, y, z, this ); + rh.setTexture( getTypeTexture() ); + + rh.setBounds( 2, 2, 14, 14, 14, 16 ); + rh.renderBlock( x, y, z, renderer ); + + rh.setTexture( CableBusTextures.PartMonitorSides.getIcon(), CableBusTextures.PartMonitorSides.getIcon(), CableBusTextures.BlockP2PTunnel2.getIcon(), + is.getIconIndex(), CableBusTextures.PartMonitorSides.getIcon(), CableBusTextures.PartMonitorSides.getIcon() ); + + rh.setBounds( 2, 2, 14, 14, 14, 16 ); + rh.renderBlock( x, y, z, renderer ); + + rh.setBounds( 3, 3, 13, 13, 13, 14 ); + rh.renderBlock( x, y, z, renderer ); + + rh.setTexture( CableBusTextures.BlockP2PTunnel3.getIcon() ); + + rh.setBounds( 6, 5, 12, 10, 11, 13 ); + rh.renderBlock( x, y, z, renderer ); + + rh.setBounds( 5, 6, 12, 11, 10, 13 ); + rh.renderBlock( x, y, z, renderer ); + + renderLights( x, y, z, rh, renderer ); + } + + protected void QueueTunnelDrain(PowerUnits mj, float f) + { + // TODO Auto-generated method stub + + } + + @Override + public void setColors(boolean hasChan, boolean hasPower) + { + super.setColors( hasChan, hasPower ); + } + + @Override + public void getBoxes(IPartCollsionHelper bch) + { + bch.addBox( 2, 2, 14, 14, 14, 16 ); + } + + @Override + public int cableConnectionRenderTo() + { + return 1; + } + +} diff --git a/parts/p2p/PartP2PTunnelME.java b/parts/p2p/PartP2PTunnelME.java new file mode 100644 index 000000000..ed7f4bc25 --- /dev/null +++ b/parts/p2p/PartP2PTunnelME.java @@ -0,0 +1,72 @@ +package appeng.parts.p2p; + +import java.util.EnumSet; + +import net.minecraft.item.ItemStack; +import net.minecraft.nbt.NBTTagCompound; +import net.minecraft.tileentity.TileEntity; +import net.minecraftforge.common.ForgeDirection; +import appeng.api.networking.GridFlags; +import appeng.api.networking.IGridNode; +import appeng.api.parts.IPartHost; +import appeng.api.util.AECableType; +import appeng.me.helpers.AENetworkProxy; + +public class PartP2PTunnelME extends PartP2PTunnel +{ + + AENetworkProxy outerProxy = new AENetworkProxy( this, "outer", true ); + + public PartP2PTunnelME(ItemStack is) { + super( is ); + proxy.setFlags( GridFlags.TIER_2_CAPACITY, GridFlags.REQURE_CHANNEL, GridFlags.DENSE_CHANNEL, GridFlags.CANNOT_CARRY_DENSE ); + } + + @Override + public void setPartHostInfo(ForgeDirection side, IPartHost host, TileEntity tile) + { + super.setPartHostInfo( side, host, tile ); + outerProxy.setValidSides( EnumSet.of( side ) ); + } + + @Override + public void readFromNBT(NBTTagCompound extra) + { + super.readFromNBT( extra ); + outerProxy.readFromNBT( extra ); + } + + @Override + public void writeToNBT(NBTTagCompound extra) + { + super.writeToNBT( extra ); + outerProxy.writeToNBT( extra ); + } + + @Override + public void addToWorld() + { + super.addToWorld(); + outerProxy.onReady(); + } + + @Override + public void removeFromWorld() + { + super.removeFromWorld(); + outerProxy.invalidate(); + } + + @Override + public IGridNode getExternalFacingNode() + { + return outerProxy.getNode(); + } + + @Override + public AECableType getCableConnectionType(ForgeDirection dir) + { + return AECableType.DENSE; + } + +} diff --git a/parts/reporting/PartConversionMonitor.java b/parts/reporting/PartConversionMonitor.java index b2e367188..27cfee404 100644 --- a/parts/reporting/PartConversionMonitor.java +++ b/parts/reporting/PartConversionMonitor.java @@ -1,7 +1,22 @@ package appeng.parts.reporting; +import java.util.Arrays; +import java.util.List; + +import net.minecraft.entity.player.EntityPlayer; import net.minecraft.item.ItemStack; +import net.minecraft.tileentity.TileEntity; +import net.minecraft.util.Vec3; +import net.minecraftforge.common.ForgeDirection; +import appeng.api.networking.energy.IEnergySource; +import appeng.api.networking.security.PlayerSource; +import appeng.api.storage.IMEMonitor; +import appeng.api.storage.data.IAEItemStack; import appeng.client.texture.CableBusTextures; +import appeng.me.GridAccessException; +import appeng.util.InventoryAdaptor; +import appeng.util.Platform; +import appeng.util.item.AEItemStack; public class PartConversionMonitor extends PartStorageMonitor { @@ -14,4 +29,98 @@ public class PartConversionMonitor extends PartStorageMonitor frontSolid = CableBusTextures.PartConvMonitor_Solid; } + @Override + public boolean onShiftActivate(EntityPlayer player, Vec3 pos) + { + if ( Platform.isClient() ) + return true; + + boolean ModeB = false; + + ItemStack item = player.getCurrentEquippedItem(); + if ( item == null && getDisplayed() != null ) + { + ModeB = true; + item = ((IAEItemStack) getDisplayed()).getItemStack(); + } + + if ( item != null ) + { + try + { + if ( !proxy.isActive() ) + return false; + + IEnergySource energy = proxy.getEnergy(); + IMEMonitor cell = proxy.getStorage().getItemInventory(); + IAEItemStack input = AEItemStack.create( item ); + + if ( ModeB ) + { + for (int x = 0; x < player.inventory.getSizeInventory(); x++) + { + ItemStack targetStack = player.inventory.getStackInSlot( x ); + if ( input.equals( targetStack ) ) + { + IAEItemStack insertItem = input.copy(); + insertItem.setStackSize( targetStack.stackSize ); + IAEItemStack failedToInsert = Platform.poweredInsert( energy, cell, insertItem, new PlayerSource( player, this ) ); + player.inventory.setInventorySlotContents( x, failedToInsert == null ? null : failedToInsert.getItemStack() ); + } + } + } + else + { + IAEItemStack failedToInsert = Platform.poweredInsert( energy, cell, input, new PlayerSource( player, this ) ); + player.inventory.setInventorySlotContents( player.inventory.currentItem, failedToInsert == null ? null : failedToInsert.getItemStack() ); + } + } + catch (GridAccessException e) + { + // :P + } + } + return true; + } + + protected void extractItem(EntityPlayer player) + { + IAEItemStack input = (IAEItemStack) getDisplayed(); + if ( input != null ) + { + try + { + if ( !proxy.isActive() ) + return; + + IEnergySource energy = proxy.getEnergy(); + IMEMonitor cell = proxy.getStorage().getItemInventory(); + + ItemStack is = input.getItemStack(); + input.setStackSize( is.getMaxStackSize() ); + + IAEItemStack retrieved = Platform.poweredExtraction( energy, cell, input, new PlayerSource( player, this ) ); + if ( retrieved != null ) + { + ItemStack newItems = retrieved.getItemStack(); + InventoryAdaptor adaptor = InventoryAdaptor.getAdaptor( player, ForgeDirection.UNKNOWN ); + newItems = adaptor.addItems( newItems ); + if ( newItems != null ) + { + TileEntity te = tile; + List list = Arrays.asList( new ItemStack[] { newItems } ); + Platform.spawnDrops( player.worldObj, te.xCoord + side.offsetX, te.yCoord + side.offsetY, te.zCoord + side.offsetZ, list ); + } + + if ( player.openContainer != null ) + player.openContainer.detectAndSendChanges(); + } + } + catch (GridAccessException e) + { + // :P + } + } + } + } diff --git a/parts/reporting/PartStorageMonitor.java b/parts/reporting/PartStorageMonitor.java index 84f446d31..e3aa9f068 100644 --- a/parts/reporting/PartStorageMonitor.java +++ b/parts/reporting/PartStorageMonitor.java @@ -1,13 +1,152 @@ package appeng.parts.reporting; -import net.minecraft.item.ItemStack; -import appeng.api.implementations.IPartStorageMonitor; -import appeng.api.storage.data.IAEStack; -import appeng.client.texture.CableBusTextures; +import static net.minecraftforge.client.IItemRenderer.ItemRenderType.ENTITY; +import static net.minecraftforge.client.IItemRenderer.ItemRendererHelper.BLOCK_3D; -public class PartStorageMonitor extends PartMonitor implements IPartStorageMonitor +import java.io.DataInputStream; +import java.io.DataOutputStream; +import java.io.IOException; + +import net.minecraft.block.Block; +import net.minecraft.client.Minecraft; +import net.minecraft.client.gui.FontRenderer; +import net.minecraft.client.renderer.OpenGlHelper; +import net.minecraft.client.renderer.RenderBlocks; +import net.minecraft.client.renderer.Tessellator; +import net.minecraft.client.renderer.entity.RenderItem; +import net.minecraft.client.renderer.entity.RenderManager; +import net.minecraft.entity.item.EntityItem; +import net.minecraft.entity.player.EntityPlayer; +import net.minecraft.item.ItemBlock; +import net.minecraft.item.ItemStack; +import net.minecraft.nbt.NBTTagCompound; +import net.minecraft.tileentity.TileEntity; +import net.minecraft.util.MathHelper; +import net.minecraft.util.Vec3; +import net.minecraftforge.client.IItemRenderer; +import net.minecraftforge.client.MinecraftForgeClient; +import net.minecraftforge.common.ForgeDirection; + +import org.lwjgl.opengl.GL11; +import org.lwjgl.opengl.GL12; + +import appeng.api.implementations.IPartStorageMonitor; +import appeng.api.networking.security.BaseActionSource; +import appeng.api.networking.storage.IStackWatcher; +import appeng.api.networking.storage.IStackWatcherHost; +import appeng.api.parts.IPartRenderHelper; +import appeng.api.storage.IMEMonitor; +import appeng.api.storage.StorageChannel; +import appeng.api.storage.data.IAEItemStack; +import appeng.api.storage.data.IAEStack; +import appeng.api.storage.data.IItemList; +import appeng.client.texture.CableBusTextures; +import appeng.core.localization.PlayerMessages; +import appeng.me.GridAccessException; +import appeng.util.Platform; +import appeng.util.item.AEItemStack; + +public class PartStorageMonitor extends PartMonitor implements IPartStorageMonitor, IStackWatcherHost { + byte spin; + + IAEItemStack configuredItem; + boolean isLocked; + + @Override + public void onPlacement(EntityPlayer player, ItemStack held, ForgeDirection side) + { + byte rotation = (byte) (MathHelper.floor_double( (double) ((player.rotationYaw * 4F) / 360F) + 2.5D ) & 3); + if ( side == ForgeDirection.UP ) + spin = rotation; + else if ( side == ForgeDirection.DOWN ) + spin = rotation; + } + + @Override + public void writeToNBT(NBTTagCompound data) + { + super.writeToNBT( data ); + + data.setByte( "spin", spin ); + data.setBoolean( "isLocked", isLocked ); + + NBTTagCompound myItem = new NBTTagCompound(); + if ( configuredItem != null ) + configuredItem.writeToNBT( myItem ); + + data.setCompoundTag( "configuredItem", myItem ); + } + + @Override + public void readFromNBT(NBTTagCompound data) + { + super.readFromNBT( data ); + + spin = data.getByte( "spin" ); + isLocked = data.getBoolean( "isLocked" ); + + NBTTagCompound myItem = data.getCompoundTag( "configuredItem" ); + configuredItem = AEItemStack.loadItemStackFromNBT( myItem ); + } + + @Override + public void writeToStream(DataOutputStream data) throws IOException + { + super.writeToStream( data ); + + data.writeByte( spin ); + data.writeBoolean( configuredItem != null ? true : false ); + if ( configuredItem != null ) + configuredItem.writeToPacket( data ); + } + + @Override + public boolean readFromStream(DataInputStream data) throws IOException + { + boolean stuff = super.readFromStream( data ); + + spin = data.readByte(); + boolean val = data.readBoolean(); + if ( val ) + configuredItem = AEItemStack.loadItemStackFromPacket( data ); + else + configuredItem = null; + + return stuff; + } + + @Override + public boolean onActivate(EntityPlayer player, Vec3 pos) + { + if ( Platform.isClient() ) + return true; + + TileEntity te = this.tile; + ItemStack eq = player.getCurrentEquippedItem(); + if ( Platform.isWrench( player, eq, te.xCoord, te.yCoord, te.zCoord ) ) + { + isLocked = !isLocked; + player.sendChatToPlayer( (isLocked ? PlayerMessages.isNowLocked : PlayerMessages.isNowUnlocked).get() ); + } + else if ( !isLocked ) + { + configuredItem = AEItemStack.create( eq ); + confgiureWatchers(); + this.getHost().markForUpdate(); + } + else + extractItem( player ); + + return true; + } + + protected void extractItem(EntityPlayer player) + { + + } + protected PartStorageMonitor(Class myClass, ItemStack is) { super( myClass, is ); } @@ -20,18 +159,244 @@ public class PartStorageMonitor extends PartMonitor implements IPartStorageMonit frontSolid = CableBusTextures.PartStorageMonitor_Solid; } + @Override + public void renderDynamic(double x, double y, double z, IPartRenderHelper rh, RenderBlocks renderer) + { + Tessellator tess = Tessellator.instance; + if ( tess.isDrawing ) + return; + + if ( (clientFlags & (POWERED_FLAG | CHANNEL_FLAG)) != (POWERED_FLAG | CHANNEL_FLAG) ) + return; + + IAEItemStack ais = (IAEItemStack) getDisplayed(); + if ( ais != null ) + { + GL11.glPushMatrix(); + GL11.glPushAttrib( GL11.GL_ALL_ATTRIB_BITS ); + ForgeDirection d = side; + GL11.glTranslated( x + 0.5, y + 0.5, z + 0.5 ); + GL11.glTranslated( d.offsetX * 0.76, d.offsetY * 0.76, d.offsetZ * 0.76 ); + + if ( d == ForgeDirection.UP ) + { + GL11.glScalef( 1.0f, -1.0f, 1.0f ); + GL11.glRotatef( 90.0f, 1.0f, 0.0f, 0.0f ); + GL11.glRotatef( (float) spin * 90.0F, 0, 0, 1 ); + } + + if ( d == ForgeDirection.DOWN ) + { + GL11.glScalef( 1.0f, -1.0f, 1.0f ); + GL11.glRotatef( -90.0f, 1.0f, 0.0f, 0.0f ); + GL11.glRotatef( (float) spin * -90.0F, 0, 0, 1 ); + } + + if ( d == ForgeDirection.EAST ) + { + GL11.glScalef( -1.0f, -1.0f, -1.0f ); + GL11.glRotatef( -90.0f, 0.0f, 1.0f, 0.0f ); + } + + if ( d == ForgeDirection.WEST ) + { + GL11.glScalef( -1.0f, -1.0f, -1.0f ); + GL11.glRotatef( 90.0f, 0.0f, 1.0f, 0.0f ); + } + + if ( d == ForgeDirection.NORTH ) + { + GL11.glScalef( -1.0f, -1.0f, -1.0f ); + } + + if ( d == ForgeDirection.SOUTH ) + { + GL11.glScalef( -1.0f, -1.0f, -1.0f ); + GL11.glRotatef( 180.0f, 0.0f, 1.0f, 0.0f ); + } + + GL11.glPushMatrix(); + try + { + ItemStack sis = ais.getItemStack(); + sis.stackSize = 1; + + GL11.glTranslatef( 0.0f, -0.05f, -0.25f ); + GL11.glScalef( 1.0f / 1.5f, 1.0f / 1.5f, 1.0f / 1.5f ); + // GL11.glTranslated( -8.0, -12.2, -10.6 ); + GL11.glScalef( 1.0f, -1.0f, 0.005f ); + // GL11.glScalef( 1.0f , -1.0f, 1.0f ); + + int k = sis.itemID; + Block block = (k < Block.blocksList.length ? Block.blocksList[k] : null); + if ( (sis.getItemSpriteNumber() == 0 && block != null && RenderBlocks.renderItemIn3d( Block.blocksList[k].getRenderType() )) ) + { + GL11.glRotatef( 25.0f, 1.0f, 0.0f, 0.0f ); + GL11.glRotatef( 15.0f, 0.0f, 1.0f, 0.0f ); + GL11.glRotatef( 30.0f, 0.0f, 1.0f, 0.0f ); + } + + int br = 16 << 20 | 16 << 4; + int var11 = br % 65536; + int var12 = br / 65536; + OpenGlHelper.setLightmapTextureCoords( OpenGlHelper.lightmapTexUnit, var11 * 0.8F, var12 * 0.8F ); + + GL11.glColor4f( 1.0F, 1.0F, 1.0F, 1.0F ); + + GL11.glDisable( GL11.GL_LIGHTING ); + GL11.glDisable( GL12.GL_RESCALE_NORMAL ); + // RenderHelper.enableGUIStandardItemLighting(); + tess.setColorOpaque_F( 1.0f, 1.0f, 1.0f ); + + doRenderItem( sis, this.tile ); + + } + catch (Exception err) + { + err.printStackTrace(); + } + GL11.glPopMatrix(); + + GL11.glTranslatef( 0.0f, 0.14f, -0.24f ); + GL11.glScalef( 1.0f / 62.0f, 1.0f / 62.0f, 1.0f / 62.0f ); + + long qty = ais.getStackSize(); + if ( qty > 999999999999L ) + qty = 999999999999L; + + String msg = Long.toString( qty ); + if ( qty > 1000000000 ) + msg = Long.toString( qty / 1000000000 ) + "B"; + else if ( qty > 1000000 ) + msg = Long.toString( qty / 1000000 ) + "M"; + else if ( qty > 9999 ) + msg = Long.toString( qty / 1000 ) + "K"; + + FontRenderer fr = Minecraft.getMinecraft().fontRenderer; + int width = fr.getStringWidth( msg ); + GL11.glTranslatef( -0.5f * width, 0.0f, -1.0f ); + fr.drawString( msg, 0, 0, 0 ); + + GL11.glPopAttrib(); + GL11.glPopMatrix(); + } + } + + private void doRenderItem(ItemStack itemstack, TileEntity par1EntityItemFrame) + { + if ( itemstack != null ) + { + EntityItem entityitem = new EntityItem( par1EntityItemFrame.worldObj, 0.0D, 0.0D, 0.0D, itemstack ); + entityitem.getEntityItem().stackSize = 1; + + // set all this stuff and then do shit? meh? + entityitem.hoverStart = 0; + entityitem.age = 0; + entityitem.rotationYaw = 0; + + GL11.glPushMatrix(); + GL11.glTranslatef( 0, -0.04F, 0 ); + // GL11.glDisable( GL11.GL_CULL_FACE ); + + IItemRenderer customRenderer = MinecraftForgeClient.getItemRenderer( itemstack, ENTITY ); + if ( customRenderer != null && !(itemstack.getItem() instanceof ItemBlock) ) + { + if ( customRenderer.shouldUseRenderHelper( ENTITY, itemstack, BLOCK_3D ) ) + { + GL11.glTranslatef( 0, -0.04F, 0 ); + GL11.glScalef( 0.7f, 0.7f, 0.7f ); + GL11.glRotatef( 35, 1, 0, 0 ); + GL11.glRotatef( 45, 0, 1, 0 ); + GL11.glRotatef( -90, 0, 1, 0 ); + } + } + else if ( itemstack.getItem() instanceof ItemBlock ) + { + GL11.glTranslatef( 0, -0.04F, 0 ); + GL11.glScalef( 1.1f, 1.1f, 1.1f ); + GL11.glRotatef( -90, 0, 1, 0 ); + } + else + { + GL11.glTranslatef( 0, -0.14F, 0 ); + GL11.glScalef( 0.8f, 0.8f, 0.8f ); + } + + RenderItem.renderInFrame = false; + RenderManager.instance.renderEntityWithPosYaw( entityitem, 0.0D, 0.0D, 0.0D, 0.0F, 0.0F ); + RenderItem.renderInFrame = false; + + GL11.glPopMatrix(); + } + } + @Override public IAEStack getDisplayed() { - // TODO Auto-generated method stub - return null; + return configuredItem; } @Override public boolean isLocked() { - // TODO Auto-generated method stub - return false; + return isLocked; + } + + IStackWatcher myWatcher; + + @Override + public void updateWatcher(IStackWatcher newWatcher) + { + myWatcher = newWatcher; + confgiureWatchers(); + } + + // update the system... + public void confgiureWatchers() + { + if ( myWatcher != null ) + myWatcher.clear(); + + try + { + if ( configuredItem != null ) + { + if ( myWatcher != null ) + myWatcher.add( configuredItem ); + + updateReportingValue( proxy.getStorage().getItemInventory() ); + } + } + catch (GridAccessException e) + { + // >.> + } + } + + private void updateReportingValue(IMEMonitor itemInventory) + { + if ( configuredItem != null ) + { + IAEItemStack result = itemInventory.getStorageList().findPrecise( configuredItem ); + if ( result == null ) + configuredItem.setStackSize( 0 ); + else + configuredItem.setStackSize( result.getStackSize() ); + } + } + + @Override + public void onStackChange(IItemList o, IAEStack fullStack, IAEStack diffStack, BaseActionSource src, StorageChannel chan) + { + if ( configuredItem != null ) + { + if ( fullStack == null ) + configuredItem.setStackSize( 0 ); + else + configuredItem.setStackSize( fullStack.getStackSize() ); + + getHost().markForUpdate(); + } } } diff --git a/tile/grindstone/TileGrinder.java b/tile/grindstone/TileGrinder.java index c4eda8ee6..0dabf92ba 100644 --- a/tile/grindstone/TileGrinder.java +++ b/tile/grindstone/TileGrinder.java @@ -105,7 +105,7 @@ public class TileGrinder extends AEBaseInvTile implements ICrankable { i = i.copy(); i.setStackSize( r.getInput().stackSize ); - IAEItemStack ais = input.extractItems( (IAEItemStack) i, Actionable.MODULATE ); + IAEItemStack ais = input.extractItems( (IAEItemStack) i, Actionable.MODULATE, null ); if ( ais != null ) this.setInventorySlotContents( 6, ais.getItemStack() ); return true; diff --git a/tile/inventory/AppEngInternalInventory.java b/tile/inventory/AppEngInternalInventory.java index 3daf5d5db..83d121d10 100644 --- a/tile/inventory/AppEngInternalInventory.java +++ b/tile/inventory/AppEngInternalInventory.java @@ -18,6 +18,7 @@ public class AppEngInternalInventory implements IInventory, Iterable protected int size; protected int maxStack; + public boolean enableClientEvents = false; protected ItemStack inv[]; public IMEInventory getIMEI() @@ -42,7 +43,7 @@ public class AppEngInternalInventory implements IInventory, Iterable protected boolean eventsEnabled() { - return Platform.isServer(); + return Platform.isServer() || enableClientEvents; } public void setMaxStackSize(int s) diff --git a/tile/inventory/AppEngNullInventory.java b/tile/inventory/AppEngNullInventory.java new file mode 100644 index 000000000..1606cbcb3 --- /dev/null +++ b/tile/inventory/AppEngNullInventory.java @@ -0,0 +1,94 @@ +package appeng.tile.inventory; + +import net.minecraft.entity.player.EntityPlayer; +import net.minecraft.inventory.IInventory; +import net.minecraft.item.ItemStack; +import net.minecraft.nbt.NBTTagCompound; + +public class AppEngNullInventory implements IInventory +{ + + public AppEngNullInventory() { + } + + @Override + public ItemStack getStackInSlot(int var1) + { + return null; + } + + @Override + public ItemStack decrStackSize(int slot, int qty) + { + return null; + } + + @Override + public ItemStack getStackInSlotOnClosing(int var1) + { + return null; + } + + @Override + public void setInventorySlotContents(int slot, ItemStack newItemStack) + { + + } + + @Override + public void onInventoryChanged() + { + + } + + @Override + public int getInventoryStackLimit() + { + return 0; + } + + @Override + public boolean isUseableByPlayer(EntityPlayer var1) + { + return false; + } + + @Override + public void openChest() + { + } + + @Override + public void closeChest() + { + } + + public void writeToNBT(NBTTagCompound target) + { + } + + @Override + public int getSizeInventory() + { + return 0; + } + + @Override + public String getInvName() + { + return "appeng-internal"; + } + + @Override + public boolean isInvNameLocalized() + { + return false; + } + + @Override + public boolean isItemValidForSlot(int i, ItemStack itemstack) + { + return false; + } + +} diff --git a/tile/misc/TileCellWorkbench.java b/tile/misc/TileCellWorkbench.java new file mode 100644 index 000000000..5af61af88 --- /dev/null +++ b/tile/misc/TileCellWorkbench.java @@ -0,0 +1,187 @@ +package appeng.tile.misc; + +import java.util.EnumSet; + +import net.minecraft.inventory.IInventory; +import net.minecraft.item.ItemStack; +import net.minecraft.nbt.NBTTagCompound; +import appeng.api.config.Upgrades; +import appeng.api.implementations.IBusCommon; +import appeng.api.storage.ICellWorkbenchItem; +import appeng.api.util.IConfigManager; +import appeng.tile.AEBaseTile; +import appeng.tile.events.AETileEventHandler; +import appeng.tile.events.TileEventType; +import appeng.tile.inventory.AppEngInternalAEInventory; +import appeng.tile.inventory.AppEngInternalInventory; +import appeng.tile.inventory.IAEAppEngInventory; +import appeng.tile.inventory.InvOperation; + +public class TileCellWorkbench extends AEBaseTile implements IBusCommon, IAEAppEngInventory +{ + + AppEngInternalInventory cell = new AppEngInternalInventory( this, 1 ); + AppEngInternalAEInventory config = new AppEngInternalAEInventory( this, 63 ); + + IInventory cacheUpgrades = null; + IInventory cacheConfig = null; + + public IInventory getCellUpgradeInventory() + { + if ( cacheUpgrades == null ) + { + ICellWorkbenchItem cwbi = getCell(); + if ( cwbi == null ) + return null; + + ItemStack is = cell.getStackInSlot( 0 ); + if ( is == null ) + return null; + + IInventory inv = cwbi.getUpgradesInventory( is ); + if ( inv == null ) + return null; + + return cacheUpgrades = inv; + } + return cacheUpgrades; + } + + public IInventory getCellConfigInventory() + { + if ( cacheConfig == null ) + { + ICellWorkbenchItem cwbi = getCell(); + if ( cwbi == null ) + return null; + + ItemStack is = cell.getStackInSlot( 0 ); + if ( is == null ) + return null; + + IInventory inv = cwbi.getConfigInventory( is ); + if ( inv == null ) + return null; + + return cacheConfig = inv; + } + return cacheConfig; + } + + class TileCellWorkbenchHandler extends AETileEventHandler + { + + public TileCellWorkbenchHandler() { + super( EnumSet.of( TileEventType.WORLD_NBT ) ); + } + + @Override + public void writeToNBT(NBTTagCompound data) + { + cell.writeToNBT( data, "cell" ); + config.writeToNBT( data, "config" ); + } + + @Override + public void readFromNBT(NBTTagCompound data) + { + cell.readFromNBT( data, "cell" ); + config.readFromNBT( data, "config" ); + } + + } + + public TileCellWorkbench() { + addNewHandler( new TileCellWorkbenchHandler() ); + cell.enableClientEvents = true; + } + + @Override + public IInventory getInventoryByName(String name) + { + if ( name.equals( "config" ) ) + return config; + + if ( name.equals( "cell" ) ) + return cell; + + return null; + } + + @Override + public int getInstalledUpgrades(Upgrades u) + { + return 0; + } + + private boolean locked = false; + + @Override + public void onChangeInventory(IInventory inv, int slot, InvOperation mc, ItemStack removedStack, ItemStack newStack) + { + if ( inv == cell && locked == false ) + { + locked = true; + + cacheUpgrades = null; + cacheConfig = null; + + IInventory c = getCellConfigInventory(); + if ( c != null ) + { + boolean cellHasConfig = false; + for (int x = 0; x < c.getSizeInventory(); x++) + { + if ( c.getStackInSlot( x ) != null ) + { + cellHasConfig = true; + break; + } + } + + if ( cellHasConfig ) + { + for (int x = 0; x < config.getSizeInventory(); x++) + config.setInventorySlotContents( x, c.getStackInSlot( x ) ); + } + else + { + for (int x = 0; x < config.getSizeInventory(); x++) + c.setInventorySlotContents( x, config.getStackInSlot( x ) ); + c.onInventoryChanged(); + } + + } + + locked = false; + } + else if ( inv == config && locked == false ) + { + IInventory c = getCellConfigInventory(); + if ( c != null ) + { + for (int x = 0; x < config.getSizeInventory(); x++) + c.setInventorySlotContents( x, config.getStackInSlot( x ) ); + c.onInventoryChanged(); + } + } + } + + public ICellWorkbenchItem getCell() + { + if ( cell.getStackInSlot( 0 ) == null ) + return null; + + if ( cell.getStackInSlot( 0 ).getItem() instanceof ICellWorkbenchItem ) + return ((ICellWorkbenchItem) cell.getStackInSlot( 0 ).getItem()); + + return null; + } + + @Override + public IConfigManager getConfigManager() + { + return null; + } + +} diff --git a/tile/misc/TileCondenser.java b/tile/misc/TileCondenser.java index 7104c469c..13121a1a2 100644 --- a/tile/misc/TileCondenser.java +++ b/tile/misc/TileCondenser.java @@ -46,12 +46,14 @@ public class TileCondenser extends AEBaseInvTile implements IAEAppEngInventory, @Override public void writeToNBT(NBTTagCompound data) { + cm.writeToNBT( data ); data.setDouble( "storedPower", storedPower ); } @Override public void readFromNBT(NBTTagCompound data) { + cm.readFromNBT( data ); storedPower = data.getDouble( "storedPower" ); } diff --git a/tile/networking/TileCableBus.java b/tile/networking/TileCableBus.java index c01efc35a..4ec436734 100644 --- a/tile/networking/TileCableBus.java +++ b/tile/networking/TileCableBus.java @@ -15,6 +15,7 @@ import net.minecraft.util.AxisAlignedBB; import net.minecraft.util.Vec3; import net.minecraft.world.World; import net.minecraftforge.common.ForgeDirection; +import powercrystals.minefactoryreloaded.api.rednet.RedNetConnectionType; import appeng.api.networking.IGridNode; import appeng.api.parts.IFacadeContainer; import appeng.api.parts.IPart; @@ -29,6 +30,7 @@ import appeng.parts.CableBusContainer; import appeng.tile.AEBaseTile; import appeng.tile.events.AETileEventHandler; import appeng.tile.events.TileEventType; +import cpw.mods.fml.common.Optional.Method; public class TileCableBus extends AEBaseTile implements AEMultiTile, ICustomCollision { @@ -252,4 +254,41 @@ public class TileCableBus extends AEBaseTile implements AEMultiTile, ICustomColl { return cb.hasRedstone( side ); } + + @Override + @Method(modid = "MineFactoryReloaded") + public RedNetConnectionType getConnectionType(World world, int x, int y, int z, ForgeDirection side) + { + return cb.canConnectRedstone( EnumSet.of( side ) ) ? RedNetConnectionType.CableSingle : RedNetConnectionType.None; + } + + @Override + @Method(modid = "MineFactoryReloaded") + public int[] getOutputValues(World world, int x, int y, int z, ForgeDirection side) + { + // never called! + return null; + } + + @Override + @Method(modid = "MineFactoryReloaded") + public int getOutputValue(World world, int x, int y, int z, ForgeDirection side, int subnet) + { + // never called! + return 0; + } + + @Override + @Method(modid = "MineFactoryReloaded") + public void onInputsChanged(World world, int x, int y, int z, ForgeDirection side, int[] inputValues) + { + // never called! + } + + @Override + @Method(modid = "MineFactoryReloaded") + public void onInputChanged(World world, int x, int y, int z, ForgeDirection side, int inputValue) + { + // never called! + } } diff --git a/tile/networking/TileController.java b/tile/networking/TileController.java index 09a11707a..724cb0bff 100644 --- a/tile/networking/TileController.java +++ b/tile/networking/TileController.java @@ -14,6 +14,7 @@ import appeng.api.networking.events.MENetworkPowerStatusChange; import appeng.api.networking.events.MENetworkPowerStorage; import appeng.api.networking.events.MENetworkPowerStorage.PowerEventType; import appeng.api.networking.pathing.ControllerState; +import appeng.api.util.AECableType; import appeng.me.GridAccessException; import appeng.tile.grid.AENetworkPowerTile; import appeng.tile.inventory.AppEngInternalInventory; @@ -31,6 +32,12 @@ public class TileController extends AENetworkPowerTile implements IAEPowerStorag gridProxy.setFlags( GridFlags.CANNOT_CARRY ); } + @Override + public AECableType getCableConnectionType(ForgeDirection dir) + { + return AECableType.DENSE; + } + @Override protected double getFunnelPowerDemand() { diff --git a/tile/qnb/TileQuantumBridge.java b/tile/qnb/TileQuantumBridge.java index 8655682ed..b55492e6d 100644 --- a/tile/qnb/TileQuantumBridge.java +++ b/tile/qnb/TileQuantumBridge.java @@ -1,17 +1,34 @@ package appeng.tile.qnb; +import java.io.DataInputStream; +import java.io.DataOutputStream; +import java.io.IOException; +import java.util.EnumSet; + import net.minecraft.inventory.IInventory; import net.minecraft.item.ItemStack; +import net.minecraft.nbt.NBTTagCompound; +import net.minecraft.tileentity.TileEntity; +import net.minecraftforge.common.ForgeDirection; import appeng.api.AEApi; +import appeng.api.networking.GridFlags; +import appeng.api.networking.events.MENetworkEventSubscribe; +import appeng.api.networking.events.MENetworkPowerStatusChange; +import appeng.api.util.AECableType; +import appeng.api.util.DimensionalCoord; +import appeng.me.GridAccessException; import appeng.me.cluster.IAECluster; import appeng.me.cluster.IAEMultiBlock; +import appeng.me.cluster.implementations.QuantumCalculator; import appeng.me.cluster.implementations.QuantumCluster; -import appeng.tile.grid.AENetworkPowerTile; +import appeng.tile.events.AETileEventHandler; +import appeng.tile.events.TileEventType; +import appeng.tile.grid.AENetworkInvTile; import appeng.tile.inventory.AppEngInternalInventory; import appeng.tile.inventory.InvOperation; import appeng.util.Platform; -public class TileQuantumBridge extends AENetworkPowerTile implements IAEMultiBlock +public class TileQuantumBridge extends AENetworkInvTile implements IAEMultiBlock { final int sidesRing[] = new int[] {}; @@ -19,28 +36,87 @@ public class TileQuantumBridge extends AENetworkPowerTile implements IAEMultiBlo AppEngInternalInventory inv = new AppEngInternalInventory( this, 1 ); - final byte start = 8 + 7; public final byte corner = 16; final byte hasSingularity = 32; final byte powered = 64; - // private QuantumCalculator calc = new QuantumCalculator( this ); - int oldxdex = -1; + private QuantumCalculator calc = new QuantumCalculator( this ); byte xdex = -1; QuantumCluster clust; public boolean bridgePowered; - @Override + private boolean updateStatus = false; + + class QBridgeHandler extends AETileEventHandler + { + + public QBridgeHandler() { + super( EnumSet.of( TileEventType.NETWORK, TileEventType.TICK ) ); + gridProxy.setValidSides( EnumSet.noneOf( ForgeDirection.class ) ); + gridProxy.setFlags( GridFlags.TIER_2_CAPACITY ); + gridProxy.setIdlePowerUsage( 22 ); + inv.setMaxStackSize( 1 ); + } + + @Override + public void Tick() + { + if ( updateStatus ) + { + updateStatus = false; + if ( clust != null ) + clust.updateStatus( true ); + markForUpdate(); + } + } + + @Override + public void writeToStream(DataOutputStream data) throws IOException + { + int out = xdex; + + if ( getStackInSlot( 0 ) != null && xdex != -1 ) + out = out | hasSingularity; + + if ( gridProxy.isActive() && xdex != -1 ) + out = out | powered; + + data.writeByte( (byte) out ); + } + + @Override + public boolean readFromStream(DataInputStream data) throws IOException + { + int oldValue = xdex; + xdex = data.readByte(); + bridgePowered = (xdex | powered) == powered; + return xdex != oldValue; + } + + }; + + public TileQuantumBridge() { + addNewHandler( new QBridgeHandler() ); + gridProxy.setFlags( GridFlags.TIER_2_CAPACITY ); + } + public IInventory getInternalInventory() { return inv; } + @MENetworkEventSubscribe + public void PowerSwitch(MENetworkPowerStatusChange c) + { + updateStatus = true; + } + @Override public void onChangeInventory(IInventory inv, int slot, InvOperation mc, ItemStack removed, ItemStack added) { - + if ( clust != null ) + clust.updateStatus( true ); } @Override @@ -54,33 +130,51 @@ public class TileQuantumBridge extends AENetworkPowerTile implements IAEMultiBlo @Override public void disconnect() { - // TODO Auto-generated method stub - + if ( clust != null ) + clust.destroy(); + clust = null; + gridProxy.setValidSides( EnumSet.noneOf( ForgeDirection.class ) ); } @Override public IAECluster getCluster() { - // TODO Auto-generated method stub - return null; + return clust; } @Override public boolean isValid() { - // TODO Auto-generated method stub - return false; + return !isInvalid(); } - public void updateStatus(QuantumCluster c, byte fish) + public void updateStatus(QuantumCluster c, byte flags) { - // TODO Auto-generated method stub + clust = c; + if ( xdex != flags ) + { + xdex = flags; + markForUpdate(); + } + + if ( isCorner() || isCenter() ) + { + gridProxy.setValidSides( getConnections() ); + } + else + gridProxy.setValidSides( EnumSet.allOf( ForgeDirection.class ) ); } public long getQEDest() { - // TODO Auto-generated method stub + ItemStack is = inv.getStackInSlot( 0 ); + if ( is != null ) + { + NBTTagCompound c = is.getTagCompound(); + if ( c != null ) + return c.getLong( "freq" ); + } return 0; } @@ -91,14 +185,22 @@ public class TileQuantumBridge extends AENetworkPowerTile implements IAEMultiBlo public boolean isCorner() { - // TODO Auto-generated method stub - return false; + return (xdex & corner) == corner && xdex != -1; } public boolean isPowered() { if ( Platform.isClient() ) - return (xdex & powered) == powered; + return (xdex & powered) == powered && xdex != -1; + + try + { + return gridProxy.getEnergy().isNetworkPowered(); + } + catch (GridAccessException e) + { + // :P + } return false; } @@ -108,4 +210,42 @@ public class TileQuantumBridge extends AENetworkPowerTile implements IAEMultiBlo return xdex != -1; } + @Override + public AECableType getCableConnectionType(ForgeDirection dir) + { + return AECableType.DENSE; + } + + @Override + public DimensionalCoord getLocation() + { + return new DimensionalCoord( this ); + } + + public void neighborUpdate() + { + calc.calculateMultiblock( worldObj, getLocation() ); + } + + public EnumSet getConnections() + { + EnumSet set = EnumSet.noneOf( ForgeDirection.class ); + + for (ForgeDirection d : ForgeDirection.VALID_DIRECTIONS) + { + TileEntity te = worldObj.getBlockTileEntity( xCoord + d.offsetX, yCoord + d.offsetY, zCoord + d.offsetZ ); + if ( te instanceof TileQuantumBridge ) + set.add( d ); + } + + return set; + } + + public boolean hasQES() + { + if ( xdex == -1 ) + return false; + return (xdex & hasSingularity) == hasSingularity; + } + } diff --git a/tile/storage/TileChest.java b/tile/storage/TileChest.java index 21eb288bb..2d2f75396 100644 --- a/tile/storage/TileChest.java +++ b/tile/storage/TileChest.java @@ -31,6 +31,7 @@ import appeng.api.networking.events.MENetworkPowerStorage; import appeng.api.networking.events.MENetworkPowerStorage.PowerEventType; import appeng.api.networking.security.BaseActionSource; import appeng.api.networking.security.MachineSource; +import appeng.api.networking.security.PlayerSource; import appeng.api.networking.storage.IStorageGrid; import appeng.api.storage.ICellHandler; import appeng.api.storage.IMEInventory; @@ -253,14 +254,19 @@ public class TileChest extends AENetworkPowerTile implements IMEChest, IFluidHan @Override public void postChange(IMEMonitor monitor, T change, BaseActionSource source) { - try + if ( source == mySrc || (source instanceof PlayerSource && ((PlayerSource) source).via == TileChest.this) ) { - gridProxy.getStorage().postAlterationOfStoredItems( chan, change, mySrc ); - } - catch (GridAccessException e) - { - // :( + try + { + gridProxy.getStorage().postAlterationOfStoredItems( chan, change, mySrc ); + } + catch (GridAccessException e) + { + // :( + } } + + blinkCell( 0 ); } @Override @@ -275,6 +281,23 @@ public class TileChest extends AENetworkPowerTile implements IMEChest, IFluidHan }; + class ChestMonitorHandler extends MEMonitorHandler + { + + public ChestMonitorHandler(IMEInventoryHandler t) { + super( t ); + } + + public IMEInventoryHandler getInternalHandler() + { + IMEInventoryHandler h = getHandler(); + if ( h instanceof MEInventoryHandler ) + return (IMEInventoryHandler) ((MEInventoryHandler) h).getInternal(); + return this.getHandler(); + } + + }; + private MEMonitorHandler wrap(IMEInventoryHandler h) { if ( h == null ) @@ -283,7 +306,7 @@ public class TileChest extends AENetworkPowerTile implements IMEChest, IFluidHan MEInventoryHandler ih = new MEInventoryHandler( h ); ih.myPriority = priority; - MEMonitorHandler g = new MEMonitorHandler( ih ); + MEMonitorHandler g = new ChestMonitorHandler( ih ); g.addListener( new ChestNetNotifier( h.getChannel() ), g ); return g; @@ -395,7 +418,7 @@ public class TileChest extends AENetworkPowerTile implements IMEChest, IFluidHan try { IMEInventory cell = getHandler( StorageChannel.ITEMS ); - IAEItemStack returns = cell.injectItems( AEApi.instance().storage().createItemStack( inv.getStackInSlot( 0 ) ), Actionable.SIMULATE ); + IAEItemStack returns = cell.injectItems( AEApi.instance().storage().createItemStack( inv.getStackInSlot( 0 ) ), Actionable.SIMULATE, mySrc ); return returns == null || returns.getStackSize() != itemstack.stackSize; } catch (AENoHandler t) @@ -447,6 +470,8 @@ public class TileChest extends AENetworkPowerTile implements IMEChest, IFluidHan lastStateChange = now; state |= 1 << (slot * 3 + 2); + + recalculateDisplay(); } @Override @@ -473,8 +498,8 @@ public class TileChest extends AENetworkPowerTile implements IMEChest, IFluidHan try { IMEInventoryHandler handler = getHandler( StorageChannel.ITEMS ); - if ( ch != null ) - return ch.getStatusForCell( cell, handler ); + if ( ch != null && handler instanceof ChestMonitorHandler ) + return ch.getStatusForCell( cell, ((ChestMonitorHandler) handler).getInternalHandler() ); } catch (AENoHandler e) { @@ -483,8 +508,8 @@ public class TileChest extends AENetworkPowerTile implements IMEChest, IFluidHan try { IMEInventoryHandler handler = getHandler( StorageChannel.FLUIDS ); - if ( ch != null ) - return ch.getStatusForCell( cell, handler ); + if ( ch != null && handler instanceof ChestMonitorHandler ) + return ch.getStatusForCell( cell, ((ChestMonitorHandler) handler).getInternalHandler() ); } catch (AENoHandler e) { @@ -506,7 +531,7 @@ public class TileChest extends AENetworkPowerTile implements IMEChest, IFluidHan IMEInventoryHandler h = getHandler( StorageChannel.FLUIDS ); extractAEPower( req, Actionable.MODULATE, PowerMultiplier.CONFIG ); - IAEStack results = h.injectItems( AEFluidStack.create( resource ), doFill ? Actionable.MODULATE : Actionable.SIMULATE ); + IAEStack results = h.injectItems( AEFluidStack.create( resource ), doFill ? Actionable.MODULATE : Actionable.SIMULATE, mySrc ); if ( results == null ) return resource.amount; diff --git a/tile/storage/TileDrive.java b/tile/storage/TileDrive.java index ddf25e6d1..f21a66eb7 100644 --- a/tile/storage/TileDrive.java +++ b/tile/storage/TileDrive.java @@ -24,9 +24,11 @@ import appeng.api.networking.storage.IStorageGrid; import appeng.api.storage.ICellHandler; import appeng.api.storage.IMEInventoryHandler; import appeng.api.storage.StorageChannel; +import appeng.api.storage.data.IAEItemStack; import appeng.api.util.AECableType; import appeng.api.util.DimensionalCoord; import appeng.me.GridAccessException; +import appeng.me.storage.DriveWatcher; import appeng.me.storage.MEInventoryHandler; import appeng.tile.events.AETileEventHandler; import appeng.tile.events.TileEventType; @@ -43,7 +45,7 @@ public class TileDrive extends AENetworkInvTile implements IChestOrDrive boolean isCached = false; ICellHandler handlersBySlot[] = new ICellHandler[10]; - IMEInventoryHandler invBySlot[] = new IMEInventoryHandler[10]; + DriveWatcher invBySlot[] = new DriveWatcher[10]; List items = new LinkedList(); List fluids = new LinkedList(); @@ -202,7 +204,7 @@ public class TileDrive extends AENetworkInvTile implements IChestOrDrive if ( cell != null ) { - MEInventoryHandler ih = new MEInventoryHandler( cell ); + DriveWatcher ih = new DriveWatcher( cell, is, handlersBySlot[x], this ); ih.myPriority = priority; invBySlot[x] = ih; items.add( ih ); @@ -213,7 +215,7 @@ public class TileDrive extends AENetworkInvTile implements IChestOrDrive if ( cell != null ) { - MEInventoryHandler ih = new MEInventoryHandler( cell ); + DriveWatcher ih = new DriveWatcher( cell, is, handlersBySlot[x], this ); ih.myPriority = priority; invBySlot[x] = ih; fluids.add( ih ); @@ -255,6 +257,8 @@ public class TileDrive extends AENetworkInvTile implements IChestOrDrive lastStateChange = now; state |= 1 << (slot * 3 + 2); + + recalculateDisplay(); } @Override @@ -276,20 +280,20 @@ public class TileDrive extends AENetworkInvTile implements IChestOrDrive ItemStack cell = inv.getStackInSlot( 2 ); ICellHandler ch = handlersBySlot[slot]; - IMEInventoryHandler handler = invBySlot[slot]; + MEInventoryHandler handler = invBySlot[slot]; if ( handler == null ) return 0; if ( handler.getChannel() == StorageChannel.ITEMS ) { if ( ch != null ) - return ch.getStatusForCell( cell, handler ); + return ch.getStatusForCell( cell, handler.getInternal() ); } if ( handler.getChannel() == StorageChannel.FLUIDS ) { if ( ch != null ) - return ch.getStatusForCell( cell, handler ); + return ch.getStatusForCell( cell, handler.getInternal() ); } return 0; diff --git a/tile/storage/TileIOPort.java b/tile/storage/TileIOPort.java index 1b504b742..22753c511 100644 --- a/tile/storage/TileIOPort.java +++ b/tile/storage/TileIOPort.java @@ -1,19 +1,95 @@ package appeng.tile.storage; +import java.util.EnumSet; + import net.minecraft.inventory.IInventory; import net.minecraft.item.ItemStack; +import net.minecraft.nbt.NBTTagCompound; import net.minecraftforge.common.ForgeDirection; +import appeng.api.AEApi; +import appeng.api.config.Actionable; +import appeng.api.config.FullnessMode; +import appeng.api.config.OperationMode; +import appeng.api.config.RedstoneMode; +import appeng.api.config.Settings; +import appeng.api.config.Upgrades; +import appeng.api.implementations.IBusCommon; +import appeng.api.networking.IGridNode; +import appeng.api.networking.energy.IEnergySource; +import appeng.api.networking.security.BaseActionSource; +import appeng.api.networking.security.MachineSource; +import appeng.api.networking.ticking.IGridTickable; +import appeng.api.networking.ticking.TickRateModulation; +import appeng.api.networking.ticking.TickingRequest; +import appeng.api.storage.IMEInventory; +import appeng.api.storage.IMEMonitor; +import appeng.api.storage.StorageChannel; +import appeng.api.storage.data.IAEFluidStack; +import appeng.api.storage.data.IAEItemStack; +import appeng.api.storage.data.IAEStack; +import appeng.api.storage.data.IItemList; import appeng.api.util.AECableType; import appeng.api.util.DimensionalCoord; +import appeng.api.util.IConfigManager; +import appeng.me.GridAccessException; +import appeng.parts.automation.UpgradeInventory; +import appeng.tile.events.AETileEventHandler; +import appeng.tile.events.TileEventType; import appeng.tile.grid.AENetworkInvTile; import appeng.tile.inventory.AppEngInternalInventory; import appeng.tile.inventory.InvOperation; +import appeng.util.ConfigManager; +import appeng.util.IConfigManagerHost; +import appeng.util.InventoryAdaptor; +import appeng.util.Platform; +import appeng.util.inv.WrapperInventoryRange; +import appeng.util.item.ItemList; -public class TileIOPort extends AENetworkInvTile +public class TileIOPort extends AENetworkInvTile implements IBusCommon, IConfigManagerHost, IGridTickable { + ConfigManager cm = new ConfigManager( this ); + final int sides[] = { 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11 }; - AppEngInternalInventory inv = new AppEngInternalInventory( this, 12 ); + final int outputSlots[] = { 6, 7, 8, 9, 10, 11 }; + + AppEngInternalInventory cells = new AppEngInternalInventory( this, 12 ); + UpgradeInventory upgrades = new UpgradeInventory( AEApi.instance().blocks().blockIOPort.block(), this, 3 ); + + BaseActionSource mySrc = new MachineSource( this ); + + boolean lastRedstoneState = false; + + class TileIOPortHandler extends AETileEventHandler + { + + public TileIOPortHandler() { + super( EnumSet.of( TileEventType.WORLD_NBT ) ); + } + + @Override + public void writeToNBT(NBTTagCompound data) + { + cm.writeToNBT( data ); + cells.writeToNBT( data, "cells" ); + upgrades.writeToNBT( data, "upgrades" ); + } + + @Override + public void readFromNBT(NBTTagCompound data) + { + cm.readFromNBT( data ); + cells.readFromNBT( data, "cells" ); + upgrades.readFromNBT( data, "upgrades" ); + } + }; + + public TileIOPort() { + addNewHandler( new TileIOPortHandler() ); + cm.registerSetting( Settings.REDSTONE_CONTROLLED, RedstoneMode.IGNORE ); + cm.registerSetting( Settings.FULLNESS_MODE, FullnessMode.EMPTY ); + cm.registerSetting( Settings.OPERATION_MODE, OperationMode.EMPTY ); + } @Override public AECableType getCableConnectionType(ForgeDirection dir) @@ -30,13 +106,52 @@ public class TileIOPort extends AENetworkInvTile @Override public IInventory getInternalInventory() { - return inv; + return cells; } @Override public void onChangeInventory(IInventory inv, int slot, InvOperation mc, ItemStack removed, ItemStack added) { - // TODO Auto-generated method stub + if ( cells == inv ) + { + updateTask(); + } + } + + private void updateTask() + { + try + { + if ( hasWork() ) + gridProxy.getTick().wakeDevice( gridProxy.getNode() ); + else + gridProxy.getTick().sleepDevice( gridProxy.getNode() ); + } + catch (GridAccessException e) + { + // :P + } + } + + public void updateRedstoneState() + { + boolean currentState = worldObj.isBlockIndirectlyGettingPowered( xCoord, yCoord, zCoord ); + if ( lastRedstoneState != currentState ) + { + lastRedstoneState = currentState; + updateTask(); + } + } + + private boolean isEnabled() + { + if ( getInstalledUpgrades( Upgrades.REDSTONE ) == 0 ) + return true; + + RedstoneMode rs = (RedstoneMode) cm.getSetting( Settings.REDSTONE_CONTROLLED ); + if ( rs == RedstoneMode.HIGH_SIGNAL ) + return lastRedstoneState; + return !lastRedstoneState; } @Override @@ -45,4 +160,248 @@ public class TileIOPort extends AENetworkInvTile return sides; } + @Override + public IConfigManager getConfigManager() + { + return cm; + } + + @Override + public IInventory getInventoryByName(String name) + { + if ( name.equals( "upgrades" ) ) + return upgrades; + + if ( name.equals( "cells" ) ) + return cells; + + return null; + } + + @Override + public int getInstalledUpgrades(Upgrades u) + { + return upgrades.getInstalledUpgrades( u ); + } + + @Override + public void updateSetting(Enum settingName, Enum newValue) + { + updateTask(); + } + + boolean hasWork() + { + if ( isEnabled() ) + { + for (int x = 0; x < 6; x++) + if ( cells.getStackInSlot( x ) != null ) + return true; + } + + return false; + } + + @Override + public TickingRequest getTickingRequest(IGridNode node) + { + return new TickingRequest( 1, 5, hasWork(), false ); + } + + @Override + public TickRateModulation tickingRequest(IGridNode node, int TicksSinceLastCall) + { + if ( !gridProxy.isActive() ) + return TickRateModulation.IDLE; + + long ItemsToMove = 256; + + switch (getInstalledUpgrades( Upgrades.SPEED )) + { + case 1: + ItemsToMove *= 2; + break; + case 2: + ItemsToMove *= 4; + break; + case 3: + ItemsToMove *= 8; + break; + } + + try + { + IMEInventory itemNet = gridProxy.getStorage().getItemInventory(); + IMEInventory fluidNet = gridProxy.getStorage().getFluidInventory(); + IEnergySource energy = gridProxy.getEnergy(); + for (int x = 0; x < 6; x++) + { + ItemStack is = cells.getStackInSlot( x ); + if ( is != null ) + { + if ( ItemsToMove > 0 ) + { + IMEInventory itemInv = getInv( is, StorageChannel.ITEMS ); + IMEInventory fluidInv = getInv( is, StorageChannel.FLUIDS ); + + if ( cm.getSetting( Settings.OPERATION_MODE ) == OperationMode.EMPTY ) + { + if ( itemInv != null ) + ItemsToMove = transferContents( energy, itemInv, itemNet, ItemsToMove, StorageChannel.ITEMS ); + if ( fluidInv != null ) + ItemsToMove = transferContents( energy, fluidInv, fluidNet, ItemsToMove, StorageChannel.FLUIDS ); + } + else + { + if ( itemInv != null ) + ItemsToMove = transferContents( energy, itemNet, itemInv, ItemsToMove, StorageChannel.ITEMS ); + if ( fluidInv != null ) + ItemsToMove = transferContents( energy, fluidNet, fluidInv, ItemsToMove, StorageChannel.FLUIDS ); + } + + if ( ItemsToMove > 0 && shouldMove( itemInv, fluidInv ) && !moveSlot( x ) ) + return TickRateModulation.IDLE; + + return TickRateModulation.URGENT; + } + else + return TickRateModulation.URGENT; + } + } + + } + catch (GridAccessException e) + { + return TickRateModulation.IDLE; + } + + // nothing left to do... + return TickRateModulation.SLEEP; + } + + private boolean shouldMove(IMEInventory itemInv, IMEInventory fluidInv) + { + FullnessMode fm = (FullnessMode) cm.getSetting( Settings.FULLNESS_MODE ); + + if ( itemInv != null && fluidInv != null ) + return matches( fm, itemInv ) && matches( fm, fluidInv ); + else if ( itemInv != null ) + return matches( fm, itemInv ); + else if ( fluidInv != null ) + return matches( fm, fluidInv ); + + return true; + } + + private boolean matches(FullnessMode fm, IMEInventory src) + { + if ( fm == FullnessMode.HALF ) + return true; + + IItemList myList; + + if ( src instanceof IMEMonitor ) + myList = ((IMEMonitor) src).getStorageList(); + else + myList = src.getAvailableItems( new ItemList() ); + + if ( fm == FullnessMode.EMPTY ) + return myList.isEmpty(); + + IAEStack test = myList.getFirstItem(); + if ( test != null ) + { + test.setStackSize( 1 ); + return src.injectItems( test, Actionable.SIMULATE, mySrc ) != null; + } + return false; + } + + ItemStack currentCell; + IMEInventory cachedFluid; + IMEInventory cachedItem; + + private IMEInventory getInv(ItemStack is, StorageChannel chan) + { + if ( currentCell != is ) + { + currentCell = is; + cachedFluid = AEApi.instance().registries().cell().getCellInventory( is, StorageChannel.FLUIDS ); + cachedItem = AEApi.instance().registries().cell().getCellInventory( is, StorageChannel.ITEMS ); + } + + if ( StorageChannel.ITEMS == chan ) + return cachedItem; + + return cachedFluid; + } + + private long transferContents(IEnergySource energy, IMEInventory src, IMEInventory dest, long itemsToMove, StorageChannel chan) + { + IItemList myList; + if ( src instanceof IMEMonitor ) + myList = ((IMEMonitor) src).getStorageList(); + else + myList = src.getAvailableItems( new ItemList() ); + + boolean didStuff; + + do + { + didStuff = false; + + for (IAEStack s : myList) + { + long totalStackSize = s.getStackSize(); + if ( totalStackSize > 0 ) + { + IAEStack stack = dest.injectItems( s, Actionable.SIMULATE, mySrc ); + + long possible = 0; + if ( stack == null ) + possible = totalStackSize; + else + possible = totalStackSize - stack.getStackSize(); + + if ( possible > 0 ) + { + possible = Math.min( possible, itemsToMove ); + s.setStackSize( possible ); + + IAEStack extracted = src.extractItems( s, Actionable.MODULATE, mySrc ); + if ( extracted != null ) + { + possible = extracted.getStackSize(); + IAEStack failed = Platform.poweredInsert( energy, dest, extracted, mySrc ); + + if ( failed != null ) + { + possible -= failed.getStackSize(); + src.injectItems( failed, Actionable.MODULATE, mySrc ); + } + + itemsToMove -= possible; + } + } + } + } + } + while (itemsToMove > 0 && didStuff); + + return itemsToMove; + } + + private boolean moveSlot(int x) + { + WrapperInventoryRange wir = new WrapperInventoryRange( this, outputSlots, true ); + ItemStack result = InventoryAdaptor.getAdaptor( wir, ForgeDirection.UNKNOWN ).addItems( getStackInSlot( x ) ); + + if ( result == null ) + { + setInventorySlotContents( x, null ); + return true; + } + + return false; + } } diff --git a/util/Platform.java b/util/Platform.java index c0292c37b..315ac85b3 100644 --- a/util/Platform.java +++ b/util/Platform.java @@ -13,6 +13,7 @@ import java.util.WeakHashMap; import net.minecraft.block.Block; import net.minecraft.client.Minecraft; +import net.minecraft.entity.Entity; import net.minecraft.entity.item.EntityItem; import net.minecraft.entity.player.EntityPlayer; import net.minecraft.entity.player.EntityPlayerMP; @@ -35,7 +36,9 @@ import net.minecraft.nbt.NBTTagLong; import net.minecraft.nbt.NBTTagString; import net.minecraft.tileentity.TileEntity; import net.minecraft.tileentity.TileEntityChest; +import net.minecraft.util.AxisAlignedBB; import net.minecraft.util.MathHelper; +import net.minecraft.util.MovingObjectPosition; import net.minecraft.util.StatCollector; import net.minecraft.util.Vec3; import net.minecraft.world.IBlockAccess; @@ -64,9 +67,7 @@ import appeng.api.storage.data.IItemList; import appeng.api.util.AEItemDefinition; import appeng.core.AELog; import appeng.core.AppEng; -import appeng.core.Configuration; import appeng.core.sync.GuiBridge; -import appeng.me.cache.NetworkMonitor; import appeng.server.AccessType; import appeng.server.Security; import appeng.util.item.AEItemStack; @@ -278,8 +279,15 @@ public class Platform if ( isClient() ) return; - if ( Security.hasPermissions( tile, p, AccessType.BLOCK_ACCESS ) ) - p.openGui( AppEng.instance, type.ordinal() << 3 | (side.ordinal()), tile.worldObj, tile.xCoord, tile.yCoord, tile.zCoord ); + if ( tile == null ) + { + p.openGui( AppEng.instance, type.ordinal() << 3, p.getEntityWorld(), (int) p.posX, (int) p.posY, (int) p.posZ ); + } + else + { + if ( Security.hasPermissions( tile, p, AccessType.BLOCK_ACCESS ) ) + p.openGui( AppEng.instance, type.ordinal() << 3 | (side.ordinal()), tile.worldObj, tile.xCoord, tile.yCoord, tile.zCoord ); + } } /* @@ -1137,19 +1145,103 @@ public class Platform return new LookDirection( vec3, vec31 ); } + public static MovingObjectPosition rayTrace(EntityPlayer p, boolean hitBlocks, boolean hitEntities) + { + World w = p.getEntityWorld(); + + float f = 1.0F; + float f1 = p.prevRotationPitch + (p.rotationPitch - p.prevRotationPitch) * f; + float f2 = p.prevRotationYaw + (p.rotationYaw - p.prevRotationYaw) * f; + double d0 = p.prevPosX + (p.posX - p.prevPosX) * (double) f; + double d1 = p.prevPosY + (p.posY - p.prevPosY) * (double) f + 1.62D - (double) p.yOffset; + double d2 = p.prevPosZ + (p.posZ - p.prevPosZ) * (double) f; + Vec3 vec3 = w.getWorldVec3Pool().getVecFromPool( d0, d1, d2 ); + float f3 = MathHelper.cos( -f2 * 0.017453292F - (float) Math.PI ); + float f4 = MathHelper.sin( -f2 * 0.017453292F - (float) Math.PI ); + float f5 = -MathHelper.cos( -f1 * 0.017453292F ); + float f6 = MathHelper.sin( -f1 * 0.017453292F ); + float f7 = f4 * f5; + float f8 = f3 * f5; + double d3 = 32.0D; + + Vec3 vec31 = vec3.addVector( (double) f7 * d3, (double) f6 * d3, (double) f8 * d3 ); + + AxisAlignedBB bb = AxisAlignedBB + .getAABBPool() + .getAABB( Math.min( vec3.xCoord, vec31.xCoord ), Math.min( vec3.yCoord, vec31.yCoord ), Math.min( vec3.zCoord, vec31.zCoord ), + Math.max( vec3.xCoord, vec31.xCoord ), Math.max( vec3.yCoord, vec31.yCoord ), Math.max( vec3.zCoord, vec31.zCoord ) ) + .expand( 16, 16, 16 ); + + Entity entity = null; + double Closeest = 9999999.0D; + if ( hitEntities ) + { + List list = w.getEntitiesWithinAABBExcludingEntity( p, bb ); + int l; + + for (l = 0; l < list.size(); ++l) + { + Entity entity1 = (Entity) list.get( l ); + + if ( entity1.isDead == false && entity1 != p && !(entity1 instanceof EntityItem) ) + { + if ( entity1.isEntityAlive() ) + { + // prevent killing / flying of mounts. + if ( entity1.riddenByEntity == p ) + continue; + + f1 = 0.3F; + AxisAlignedBB axisalignedbb1 = entity1.boundingBox.expand( (double) f1, (double) f1, (double) f1 ); + MovingObjectPosition movingobjectposition1 = axisalignedbb1.calculateIntercept( vec3, vec31 ); + + if ( movingobjectposition1 != null ) + { + double nd = vec3.squareDistanceTo( movingobjectposition1.hitVec ); + + if ( nd < Closeest ) + { + entity = entity1; + Closeest = nd; + } + } + } + } + } + } + + MovingObjectPosition pos = null; + Vec3 Srec = null; + + if ( hitBlocks ) + { + Srec = w.getWorldVec3Pool().getVecFromPool( d0, d1, d2 ); + pos = w.rayTraceBlocks_do_do( vec3, vec31, true, false ); + } + + if ( entity != null && pos != null && pos.hitVec.squareDistanceTo( Srec ) > Closeest ) + { + pos = new MovingObjectPosition( entity ); + } + else if ( entity != null && pos == null ) + { + pos = new MovingObjectPosition( entity ); + } + + return pos; + } + public static long nanoTime() { - if ( Configuration.instance.enableNetworkProfiler ) - return System.nanoTime(); + // if ( Configuration.instance.enableNetworkProfiler ) + // return System.nanoTime(); return 0; } - public static IAEItemStack poweredExtraction(IEnergySource energy, IMEInventory cell, IAEItemStack request, BaseActionSource src) + public static StackType poweredExtraction(IEnergySource energy, IMEInventory cell, StackType request, + BaseActionSource src) { - if ( cell instanceof NetworkMonitor ) - ((NetworkMonitor) cell).setSource( src ); - - IAEItemStack possible = cell.extractItems( request.copy(), Actionable.SIMULATE ); + StackType possible = cell.extractItems( (StackType) request.copy(), Actionable.SIMULATE, src ); long retrieved = 0; if ( possible != null ) @@ -1164,10 +1256,7 @@ public class Platform energy.extractAEPower( retrieved, Actionable.MODULATE, PowerMultiplier.CONFIG ); possible.setStackSize( itemToExtract ); - IAEItemStack ret = cell.extractItems( possible, Actionable.MODULATE ); - - if ( cell instanceof NetworkMonitor ) - ((NetworkMonitor) cell).setSource( null ); + StackType ret = cell.extractItems( possible, Actionable.MODULATE, src ); return ret; } @@ -1175,12 +1264,9 @@ public class Platform return null; } - public static IAEItemStack poweredInsert(IEnergySource energy, IMEInventory cell, IAEItemStack input, BaseActionSource src) + public static StackType poweredInsert(IEnergySource energy, IMEInventory cell, StackType input, BaseActionSource src) { - if ( cell instanceof NetworkMonitor ) - ((NetworkMonitor) cell).setSource( src ); - - IAEItemStack possible = cell.injectItems( input.copy(), Actionable.SIMULATE ); + StackType possible = cell.injectItems( (StackType) input.copy(), Actionable.SIMULATE, src ); long stored = input.getStackSize(); if ( possible != null ) @@ -1196,17 +1282,14 @@ public class Platform if ( itemToAdd < input.getStackSize() ) { - IAEItemStack split = input.copy(); + StackType split = (StackType) input.copy(); split.decStackSize( itemToAdd ); input.setStackSize( itemToAdd ); - split.add( cell.injectItems( input, Actionable.MODULATE ) ); + split.add( cell.injectItems( input, Actionable.MODULATE, src ) ); return split; } - IAEItemStack ret = cell.injectItems( input, Actionable.MODULATE ); - - if ( cell instanceof NetworkMonitor ) - ((NetworkMonitor) cell).setSource( null ); + StackType ret = cell.injectItems( input, Actionable.MODULATE, src ); return ret; } diff --git a/util/inv/AdaptorIInventory.java b/util/inv/AdaptorIInventory.java index 927cfc6ac..2b3d38248 100644 --- a/util/inv/AdaptorIInventory.java +++ b/util/inv/AdaptorIInventory.java @@ -71,7 +71,7 @@ public class AdaptorIInventory extends InventoryAdaptor if ( rv != null ) { - i.onInventoryChanged(); + // i.onInventoryChanged(); return rv; } } @@ -150,8 +150,8 @@ public class AdaptorIInventory extends InventoryAdaptor } } - if ( rv != null ) - i.onInventoryChanged(); + // if ( rv != null ) + // i.onInventoryChanged(); return rv; } @@ -226,7 +226,7 @@ public class AdaptorIInventory extends InventoryAdaptor if ( left.stackSize <= 0 ) { - i.onInventoryChanged(); + // i.onInventoryChanged(); return null; } } @@ -247,7 +247,7 @@ public class AdaptorIInventory extends InventoryAdaptor left.stackSize -= used; if ( left.stackSize <= 0 ) { - i.onInventoryChanged(); + // i.onInventoryChanged(); return null; } } @@ -257,8 +257,8 @@ public class AdaptorIInventory extends InventoryAdaptor } } - if ( left.stackSize != A.stackSize ) - i.onInventoryChanged(); + // if ( left.stackSize != A.stackSize ) + // i.onInventoryChanged(); return left; } diff --git a/util/inv/IMEInventoryDestination.java b/util/inv/IMEInventoryDestination.java index 1753e158a..c28cc8488 100644 --- a/util/inv/IMEInventoryDestination.java +++ b/util/inv/IMEInventoryDestination.java @@ -22,7 +22,7 @@ public class IMEInventoryDestination implements IInventoryDestination if ( stack == null ) return false; - IAEItemStack failed = me.injectItems( AEItemStack.create( stack ), Actionable.SIMULATE ); + IAEItemStack failed = me.injectItems( AEItemStack.create( stack ), Actionable.SIMULATE, null ); if ( failed == null ) return true; diff --git a/util/inv/WrapperPipe.java b/util/inv/WrapperBCPipe.java similarity index 92% rename from util/inv/WrapperPipe.java rename to util/inv/WrapperBCPipe.java index ca5541a63..4815c3523 100644 --- a/util/inv/WrapperPipe.java +++ b/util/inv/WrapperBCPipe.java @@ -7,13 +7,13 @@ import net.minecraft.tileentity.TileEntity; import net.minecraftforge.common.ForgeDirection; import appeng.integration.modules.BC; -public class WrapperPipe implements IInventory +public class WrapperBCPipe implements IInventory { TileEntity ad; ForgeDirection dir; - public WrapperPipe(TileEntity te, ForgeDirection d) { + public WrapperBCPipe(TileEntity te, ForgeDirection d) { ad = te; dir = d; } diff --git a/util/inv/WrapperTEPipe.java b/util/inv/WrapperTEPipe.java new file mode 100644 index 000000000..f03fbf656 --- /dev/null +++ b/util/inv/WrapperTEPipe.java @@ -0,0 +1,99 @@ +package appeng.util.inv; + +import net.minecraft.entity.player.EntityPlayer; +import net.minecraft.inventory.IInventory; +import net.minecraft.item.ItemStack; +import net.minecraft.tileentity.TileEntity; +import net.minecraftforge.common.ForgeDirection; +import appeng.integration.modules.TE; + +public class WrapperTEPipe implements IInventory +{ + + TileEntity ad; + ForgeDirection dir; + + public WrapperTEPipe(TileEntity te, ForgeDirection d) { + ad = te; + dir = d; + } + + @Override + public int getSizeInventory() + { + return 1; + } + + @Override + public ItemStack getStackInSlot(int i) + { + return null; + } + + @Override + public ItemStack decrStackSize(int i, int j) + { + return null; + } + + @Override + public ItemStack getStackInSlotOnClosing(int i) + { + return null; + } + + @Override + public void setInventorySlotContents(int i, ItemStack itemstack) + { + TE.instance.addItemsToPipe( ad, itemstack, dir ); + } + + @Override + public String getInvName() + { + return null; + } + + @Override + public boolean isInvNameLocalized() + { + return false; + } + + @Override + public int getInventoryStackLimit() + { + return 64; + } + + @Override + public void onInventoryChanged() + { + + } + + @Override + public boolean isUseableByPlayer(EntityPlayer entityplayer) + { + return false; + } + + @Override + public void openChest() + { + + } + + @Override + public void closeChest() + { + + } + + @Override + public boolean isItemValidForSlot(int i, ItemStack itemstack) + { + return TE.instance.canAddItemsToPipe( ad, itemstack, dir ); + } + +} diff --git a/util/item/AEItemDef.java b/util/item/AEItemDef.java index aa8aad9a2..b51458f52 100644 --- a/util/item/AEItemDef.java +++ b/util/item/AEItemDef.java @@ -5,7 +5,6 @@ import java.util.List; import net.minecraft.item.Item; import net.minecraft.item.ItemStack; import net.minecraft.nbt.NBTBase; -import appeng.api.storage.data.IAETagCompound; import appeng.util.Platform; import cpw.mods.fml.relauncher.Side; import cpw.mods.fml.relauncher.SideOnly; @@ -23,7 +22,7 @@ public class AEItemDef public int dspDamage; public int maxDamage; - public IAETagCompound tagCompound; + public AESharedNBT tagCompound; @SideOnly(Side.CLIENT) public String displayName; diff --git a/util/item/AEItemStack.java b/util/item/AEItemStack.java index 1bc3bac03..ee88eaaa6 100644 --- a/util/item/AEItemStack.java +++ b/util/item/AEItemStack.java @@ -78,7 +78,7 @@ public final class AEItemStack extends AEStack implements IAEItemS NBTTagCompound tagCompound = is.getTagCompound(); if ( tagCompound != null ) - def.tagCompound = (IAETagCompound) AESharedNBT.getSharedTagCompound( tagCompound, is ); + def.tagCompound = (AESharedNBT) AESharedNBT.getSharedTagCompound( tagCompound, is ); stackSize = is.stackSize; setCraftable( false ); @@ -241,8 +241,8 @@ public final class AEItemStack extends AEStack implements IAEItemS int dv = def.damageValue - b.def.damageValue; int dspv = def.dspDamage - b.def.dspDamage; - return id == 0 ? (dv == 0 ? (dspv == 0 ? ((def.tagCompound == null ? 0 : def.tagCompound.hashCode()) - (b.def.tagCompound == null ? 0 - : b.def.tagCompound.hashCode())) : dspv) : dv) : id; + return id == 0 ? (dv == 0 ? (dspv == 0 ? ((def.tagCompound == null ? 0 : def.tagCompound.getHash()) - (b.def.tagCompound == null ? 0 + : b.def.tagCompound.getHash())) : dspv) : dv) : id; } @SideOnly(Side.CLIENT) diff --git a/util/item/AESharedNBT.java b/util/item/AESharedNBT.java index a19e626a4..e9c7a87d7 100644 --- a/util/item/AESharedNBT.java +++ b/util/item/AESharedNBT.java @@ -22,6 +22,11 @@ public class AESharedNBT extends NBTTagCompound implements IAETagCompound public SharedSearchObject sso; private IItemComparison comp; + public int getHash() + { + return hash; + } + @Override public IItemComparison getSpecialComparison() {