From 040e948d8e5f3c95536b6d279bbbce541c2ac5af Mon Sep 17 00:00:00 2001 From: AlgorithmX2 Date: Wed, 5 Mar 2014 01:27:42 -0600 Subject: [PATCH] Removed Dropped Features. Implemented Spatial Storage. Fixed bug with ME Chest saying the cell was un-readable. --- block/misc/BlockInscriber.java | 20 +-- block/misc/BlockNetworkEmitter.java | 40 ----- block/misc/BlockQuartzCrystalizer.java | 40 ----- block/spatial/BlockSpatialIOPort.java | 20 +++ block/storage/BlockChest.java | 4 +- .../gui/implementations/GuiSpatialIOPort.java | 2 +- .../ContainerSpatialIOPort.java | 6 +- core/AEConfig.java | 15 ++ core/Registration.java | 73 ++++++++ core/WorldSettings.java | 46 ++++- core/localization/GuiText.java | 2 +- core/sync/AppEngPacketHandlerBase.java | 3 + core/sync/GuiBridge.java | 6 + core/sync/network/NetworkHandler.java | 25 ++- .../packets/PacketNewStorageDimension.java | 46 +++++ helpers/DualityInterface.java | 20 ++- items/storage/ItemSpatialStorageCell.java | 162 +++++++++++++++++- me/cache/SpatialPylonCache.java | 6 + .../implementations/IAssemblerCluster.java | 30 ---- spatial/CachedPlane.java | 59 +++++-- spatial/StorageChunkProvider.java | 17 +- spatial/StorageHelper.java | 24 ++- tile/mac/TileMolecularAssembler.java | 30 ---- tile/mac/TilePatternProvider.java | 30 ---- tile/misc/TileInscriber.java | 7 - tile/misc/TileInterface.java | 3 +- tile/misc/TileNetworkEmitter.java | 22 --- tile/misc/TileQuartzCrystalizer.java | 83 --------- tile/spatial/TileSpatialIOPort.java | 89 +++++++++- 29 files changed, 606 insertions(+), 324 deletions(-) delete mode 100644 block/misc/BlockNetworkEmitter.java delete mode 100644 block/misc/BlockQuartzCrystalizer.java create mode 100644 core/sync/packets/PacketNewStorageDimension.java delete mode 100644 me/cluster/implementations/IAssemblerCluster.java delete mode 100644 tile/mac/TileMolecularAssembler.java delete mode 100644 tile/mac/TilePatternProvider.java delete mode 100644 tile/misc/TileNetworkEmitter.java delete mode 100644 tile/misc/TileQuartzCrystalizer.java diff --git a/block/misc/BlockInscriber.java b/block/misc/BlockInscriber.java index 6bbe274c0..54758f416 100644 --- a/block/misc/BlockInscriber.java +++ b/block/misc/BlockInscriber.java @@ -8,7 +8,7 @@ import net.minecraft.world.World; import appeng.block.AEBaseBlock; import appeng.core.features.AEFeature; import appeng.tile.misc.TileInscriber; -import appeng.util.Platform; +import appeng.tile.misc.TileInterface; public class BlockInscriber extends AEBaseBlock { @@ -20,21 +20,19 @@ public class BlockInscriber extends AEBaseBlock } @Override - public boolean onActivated(World w, int x, int y, int z, EntityPlayer player, int side, float hitX, float hitY, float hitZ) + public boolean onActivated(World w, int x, int y, int z, EntityPlayer p, int side, float hitX, float hitY, float hitZ) { - if ( player.isSneaking() ) + if ( p.isSneaking() ) return false; - if ( Platform.isServer() ) + TileInterface tg = getTileEntity( w, x, y, z ); + if ( tg != null ) { - TileInscriber tc = getTileEntity( w, x, y, z ); - if ( tc != null ) - { - tc.activate( player ); - } + // if ( Platform.isServer() ) + // Platform.openGUI( p, tg, ForgeDirection.getOrientation( side ), GuiBridge.GUI_INSCRIBER ); + return true; } - - return true; + return false; } } diff --git a/block/misc/BlockNetworkEmitter.java b/block/misc/BlockNetworkEmitter.java deleted file mode 100644 index f0ee7f8c3..000000000 --- a/block/misc/BlockNetworkEmitter.java +++ /dev/null @@ -1,40 +0,0 @@ -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 appeng.block.AEBaseBlock; -import appeng.core.features.AEFeature; -import appeng.tile.misc.TileNetworkEmitter; -import appeng.util.Platform; - -public class BlockNetworkEmitter extends AEBaseBlock -{ - - public BlockNetworkEmitter() { - super( BlockNetworkEmitter.class, Material.iron ); - setfeature( EnumSet.of( AEFeature.Core ) ); - setTileEntiy( TileNetworkEmitter.class ); - } - - @Override - public boolean onActivated(World w, int x, int y, int z, EntityPlayer player, int side, float hitX, float hitY, float hitZ) - { - if ( player.isSneaking() ) - return false; - - if ( Platform.isServer() ) - { - TileNetworkEmitter tc = getTileEntity( w, x, y, z ); - if ( tc != null ) - { - tc.activate( player ); - } - } - - return true; - } - -} diff --git a/block/misc/BlockQuartzCrystalizer.java b/block/misc/BlockQuartzCrystalizer.java deleted file mode 100644 index e7946ed16..000000000 --- a/block/misc/BlockQuartzCrystalizer.java +++ /dev/null @@ -1,40 +0,0 @@ -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 appeng.block.AEBaseBlock; -import appeng.core.features.AEFeature; -import appeng.tile.misc.TileQuartzCrystalizer; -import appeng.util.Platform; - -public class BlockQuartzCrystalizer extends AEBaseBlock -{ - - public BlockQuartzCrystalizer() { - super( BlockQuartzCrystalizer.class, Material.iron ); - setfeature( EnumSet.of( AEFeature.Core ) ); - setTileEntiy( TileQuartzCrystalizer.class ); - } - - @Override - public boolean onActivated(World w, int x, int y, int z, EntityPlayer player, int side, float hitX, float hitY, float hitZ) - { - if ( player.isSneaking() ) - return false; - - if ( Platform.isServer() ) - { - TileQuartzCrystalizer tc = getTileEntity( w, x, y, z ); - if ( tc != null ) - { - tc.activate( player ); - } - } - - return true; - } - -} diff --git a/block/spatial/BlockSpatialIOPort.java b/block/spatial/BlockSpatialIOPort.java index e8567f44c..da26eadbc 100644 --- a/block/spatial/BlockSpatialIOPort.java +++ b/block/spatial/BlockSpatialIOPort.java @@ -4,10 +4,14 @@ import java.util.EnumSet; import net.minecraft.block.Block; import net.minecraft.block.material.Material; +import net.minecraft.entity.player.EntityPlayer; import net.minecraft.world.World; +import net.minecraftforge.common.util.ForgeDirection; import appeng.block.AEBaseBlock; import appeng.core.features.AEFeature; +import appeng.core.sync.GuiBridge; import appeng.tile.spatial.TileSpatialIOPort; +import appeng.util.Platform; public class BlockSpatialIOPort extends AEBaseBlock { @@ -26,4 +30,20 @@ public class BlockSpatialIOPort extends AEBaseBlock 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; + + TileSpatialIOPort tg = getTileEntity( w, x, y, z ); + if ( tg != null ) + { + if ( Platform.isServer() ) + Platform.openGUI( p, tg, ForgeDirection.getOrientation( side ), GuiBridge.GUI_SPATIALIOPORT ); + return true; + } + return false; + } + } diff --git a/block/storage/BlockChest.java b/block/storage/BlockChest.java index 713839607..37c2de43c 100644 --- a/block/storage/BlockChest.java +++ b/block/storage/BlockChest.java @@ -55,8 +55,8 @@ public class BlockChest extends AEBaseBlock tg.openGui( p, ch, cell, side ); } - - p.addChatMessage( PlayerMessages.ChestCannotReadStorageCell.get() ); + else + p.addChatMessage( PlayerMessages.ChestCannotReadStorageCell.get() ); } else p.addChatMessage( PlayerMessages.MachineNotPowered.get() ); diff --git a/client/gui/implementations/GuiSpatialIOPort.java b/client/gui/implementations/GuiSpatialIOPort.java index f5313b96b..ad71531c3 100644 --- a/client/gui/implementations/GuiSpatialIOPort.java +++ b/client/gui/implementations/GuiSpatialIOPort.java @@ -25,7 +25,7 @@ public class GuiSpatialIOPort extends AEBaseGui public void drawFG(int offsetX, int offsetY, int mouseX, int mouseY) { fontRendererObj.drawString( GuiText.SpatialIOPort.getLocal(), 8, 6, 4210752 ); - fontRendererObj.drawString( GuiText.inventory.getLocal(), 8, ySize - 96 + 3, 4210752 ); + fontRendererObj.drawString( GuiText.inventory.getLocal(), 8, ySize - 96, 4210752 ); } } diff --git a/container/implementations/ContainerSpatialIOPort.java b/container/implementations/ContainerSpatialIOPort.java index 5aaa0567e..41293cb80 100644 --- a/container/implementations/ContainerSpatialIOPort.java +++ b/container/implementations/ContainerSpatialIOPort.java @@ -17,10 +17,10 @@ public class ContainerSpatialIOPort extends AEBaseContainer super( ip, te, null ); myte = te; - addSlotToContainer( new SlotRestrictedInput( PlaceableItemType.SPATIAL_STORAGE_CELLS, te, 0, 71, 14 ) ); - addSlotToContainer( new SlotOutput( te, 1, 71, 14, PlaceableItemType.SPATIAL_STORAGE_CELLS.IIcon ) ); + addSlotToContainer( new SlotRestrictedInput( PlaceableItemType.SPATIAL_STORAGE_CELLS, te, 0, 52, 53 ) ); + addSlotToContainer( new SlotOutput( te, 1, 113, 53, PlaceableItemType.SPATIAL_STORAGE_CELLS.IIcon ) ); - bindPlayerInventory( ip, 0, 199 - /* height of playerinventory */82 ); + bindPlayerInventory( ip, 0, 197 - /* height of playerinventory */82 ); } @Override diff --git a/core/AEConfig.java b/core/AEConfig.java index 183e9e181..d103cfac9 100644 --- a/core/AEConfig.java +++ b/core/AEConfig.java @@ -35,6 +35,9 @@ public class AEConfig extends Configuration implements IConfigureableObject, ICo public IConfigManager settings = new ConfigManager( this ); public EnumSet featureFlags = EnumSet.noneOf( AEFeature.class ); + public int storageBiomeID = -1; + public int storageProviderID = -1; + public int oresPerCluster = 4; private double WirelessBaseCost = 8; @@ -149,6 +152,12 @@ public class AEConfig extends Configuration implements IConfigureableObject, ICo this.get( Category, e.name(), settings.getSetting( e ).name() ); } + if ( isFeatureEnabled( AEFeature.SpatialIO ) ) + { + storageBiomeID = get( "spatialio", "storageBiomeID", storageBiomeID ).getInt( storageBiomeID ); + storageProviderID = get( "spatialio", "storageProviderID", storageProviderID ).getInt( storageProviderID ); + } + if ( isFeatureEnabled( AEFeature.VersionChecker ) ) { try @@ -184,6 +193,12 @@ public class AEConfig extends Configuration implements IConfigureableObject, ICo get( "VersionChecker", "LatestTimeStamp", "" ).set( Long.toString( latestTimeStamp ) ); } + if ( isFeatureEnabled( AEFeature.SpatialIO ) ) + { + get( "spatialio", "storageBiomeID", storageBiomeID ).set( storageBiomeID ); + get( "spatialio", "storageProviderID", storageProviderID ).set( storageProviderID ); + } + if ( hasChanged() ) super.save(); } diff --git a/core/Registration.java b/core/Registration.java index 2c33b2370..67da09399 100644 --- a/core/Registration.java +++ b/core/Registration.java @@ -6,6 +6,7 @@ import java.lang.reflect.Field; import net.minecraft.util.WeightedRandomChestContent; import net.minecraft.world.biome.BiomeGenBase; import net.minecraftforge.common.ChestGenHooks; +import net.minecraftforge.common.DimensionManager; import net.minecraftforge.common.MinecraftForge; import net.minecraftforge.oredict.RecipeSorter; import net.minecraftforge.oredict.RecipeSorter.Category; @@ -17,6 +18,7 @@ import appeng.api.definitions.Materials; import appeng.api.definitions.Parts; import appeng.api.features.IRecipeHandlerRegistry; import appeng.api.features.IWirelessTermHandler; +import appeng.api.movable.IMovableRegistry; import appeng.api.networking.IGridCacheRegistry; import appeng.api.networking.energy.IEnergyGrid; import appeng.api.networking.pathing.IPathingGrid; @@ -133,6 +135,10 @@ import appeng.recipes.handlers.Smelt; import appeng.recipes.loader.ConfigLoader; import appeng.recipes.loader.JarLoader; import appeng.recipes.ores.OreDictionaryHandler; +import appeng.spatial.BiomeGenStorage; +import appeng.spatial.StorageWorldProvider; +import appeng.tile.AEBaseTile; +import appeng.util.Platform; import com.google.common.collect.ArrayListMultimap; import com.google.common.collect.Multimap; @@ -160,6 +166,8 @@ public class Registration public void PreInit(FMLPreInitializationEvent event) { + registerSpatial( false ); + IRecipeHandlerRegistry recipeRegistery = AEApi.instance().registries().recipes(); recipeRegistery.addNewSubItemResolver( new AEItemResolver() ); @@ -488,6 +496,8 @@ public class Registration public void PostInit(FMLPostInitializationEvent event) { + registerSpatial( true ); + // add to localizaiton.. PlayerMessages.values(); GuiText.values(); @@ -567,6 +577,69 @@ public class Registration if ( AEConfig.instance.isFeatureEnabled( AEFeature.MeteoriteWorldGen ) ) GameRegistry.registerWorldGenerator( new MeteoriteWorldGen(), 0 ); + IMovableRegistry mr = AEApi.instance().registries().moveable(); + + /* + * White List Vanilla... + */ + mr.whiteListTileEntity( net.minecraft.tileentity.TileEntityBeacon.class ); + mr.whiteListTileEntity( net.minecraft.tileentity.TileEntityBrewingStand.class ); + mr.whiteListTileEntity( net.minecraft.tileentity.TileEntityChest.class ); + mr.whiteListTileEntity( net.minecraft.tileentity.TileEntityCommandBlock.class ); + mr.whiteListTileEntity( net.minecraft.tileentity.TileEntityComparator.class ); + mr.whiteListTileEntity( net.minecraft.tileentity.TileEntityDaylightDetector.class ); + mr.whiteListTileEntity( net.minecraft.tileentity.TileEntityDispenser.class ); + mr.whiteListTileEntity( net.minecraft.tileentity.TileEntityDropper.class ); + mr.whiteListTileEntity( net.minecraft.tileentity.TileEntityEnchantmentTable.class ); + mr.whiteListTileEntity( net.minecraft.tileentity.TileEntityEnderChest.class ); + mr.whiteListTileEntity( net.minecraft.tileentity.TileEntityEndPortal.class ); + mr.whiteListTileEntity( net.minecraft.tileentity.TileEntitySkull.class ); + mr.whiteListTileEntity( net.minecraft.tileentity.TileEntityFurnace.class ); + mr.whiteListTileEntity( net.minecraft.tileentity.TileEntityMobSpawner.class ); + mr.whiteListTileEntity( net.minecraft.tileentity.TileEntitySign.class ); + mr.whiteListTileEntity( net.minecraft.tileentity.TileEntityPiston.class ); + mr.whiteListTileEntity( net.minecraft.tileentity.TileEntityFlowerPot.class ); + mr.whiteListTileEntity( net.minecraft.tileentity.TileEntityNote.class ); + mr.whiteListTileEntity( net.minecraft.tileentity.TileEntityHopper.class ); + + /** + * Whitelist AE + */ + mr.whiteListTileEntity( AEBaseTile.class ); + recipeHandler.registerHandlers(); } + + private void registerSpatial(boolean force) + { + AEConfig config = AEConfig.instance; + + if ( storageBiome == null ) + { + if ( force && config.storageBiomeID == -1 ) + { + storageBiome = new BiomeGenStorage( config.storageBiomeID = Platform.findEmpty( BiomeGenBase.getBiomeGenArray() ) ); + config.save(); + } + + if ( !force && config.storageBiomeID != -1 ) + storageBiome = new BiomeGenStorage( config.storageBiomeID ); + } + + if ( config.storageProviderID != -1 ) + { + DimensionManager.registerProviderType( config.storageProviderID, StorageWorldProvider.class, false ); + } + + if ( config.storageProviderID == -1 && force ) + { + config.storageProviderID = -11; + + while (!DimensionManager.registerProviderType( config.storageProviderID, StorageWorldProvider.class, false )) + config.storageProviderID--; + + config.save(); + } + } + } diff --git a/core/WorldSettings.java b/core/WorldSettings.java index 11912304b..08fc29a37 100644 --- a/core/WorldSettings.java +++ b/core/WorldSettings.java @@ -1,16 +1,21 @@ package appeng.core; import java.io.File; +import java.io.IOException; import java.lang.ref.WeakReference; +import java.util.ArrayList; +import java.util.List; import java.util.Map.Entry; import java.util.WeakHashMap; -import net.minecraft.entity.player.EntityPlayer; +import net.minecraft.entity.player.EntityPlayerMP; import net.minecraftforge.common.DimensionManager; import net.minecraftforge.common.config.ConfigCategory; import net.minecraftforge.common.config.Configuration; import net.minecraftforge.common.config.Property; import appeng.api.util.WorldCoord; +import appeng.core.sync.network.NetworkHandler; +import appeng.core.sync.packets.PacketNewStorageDimension; import appeng.me.GridStorage; import appeng.me.GridStorageSearch; import appeng.services.CompassService; @@ -46,6 +51,31 @@ public class WorldSettings extends Configuration } } + List storageCellDims = new ArrayList(); + + public void addStorageCellDim(int newDim) + { + storageCellDims.add( newDim ); + DimensionManager.registerDimension( newDim, AEConfig.instance.storageProviderID ); + + try + { + NetworkHandler.instance.sendToAll( new PacketNewStorageDimension( newDim ) ); + } + catch (IOException e) + { + e.printStackTrace(); + } + + String[] values = new String[storageCellDims.size()]; + + for (int x = 0; x < values.length; x++) + values[x] = "" + storageCellDims.get( x ); + + get( "DimensionManager", "StorageCells", new int[0] ).set( values ); + save(); + } + public CompassService getCompass() { return compass; @@ -68,9 +98,19 @@ public class WorldSettings extends Configuration return instance; } - public void sendToPlayer(EntityPlayer player) + public void sendToPlayer(EntityPlayerMP player) { - + for (int newDim : get( "DimensionManager", "StorageCells", new int[0] ).getIntList()) + { + try + { + NetworkHandler.instance.sendTo( new PacketNewStorageDimension( newDim ), player ); + } + catch (IOException e) + { + AELog.error( e ); + } + } } public void init() diff --git a/core/localization/GuiText.java b/core/localization/GuiText.java index 55948c1bd..e01dbccd5 100644 --- a/core/localization/GuiText.java +++ b/core/localization/GuiText.java @@ -24,7 +24,7 @@ public enum GuiText CraftingTerminal, FormationPlane, Inscriber, QuartzCuttingKnife, - METunnel, ItemTunnel, RedstoneTunnel, MJTunnel, EUTunnel, FluidTunnel; + METunnel, ItemTunnel, RedstoneTunnel, MJTunnel, EUTunnel, FluidTunnel, StoredSize; String root; diff --git a/core/sync/AppEngPacketHandlerBase.java b/core/sync/AppEngPacketHandlerBase.java index 3a13830d1..d34c4dbe6 100644 --- a/core/sync/AppEngPacketHandlerBase.java +++ b/core/sync/AppEngPacketHandlerBase.java @@ -17,6 +17,7 @@ import appeng.core.sync.packets.PacketMEInventoryUpdate; import appeng.core.sync.packets.PacketMatterCannon; import appeng.core.sync.packets.PacketMockExplosion; import appeng.core.sync.packets.PacketMultiPart; +import appeng.core.sync.packets.PacketNewStorageDimension; import appeng.core.sync.packets.PacketPartPlacement; import appeng.core.sync.packets.PacketProgressBar; import appeng.core.sync.packets.PacketSwitchGuis; @@ -58,6 +59,8 @@ public class AppEngPacketHandlerBase PACKET_CLICK(PacketClick.class), + PACKET_NEW_STORAGE_DIMENSION(PacketNewStorageDimension.class), + PACKET_SWITCH_GUIS(PacketSwitchGuis.class); final public Class pc; diff --git a/core/sync/GuiBridge.java b/core/sync/GuiBridge.java index 0cf683dde..46a7df180 100644 --- a/core/sync/GuiBridge.java +++ b/core/sync/GuiBridge.java @@ -46,6 +46,7 @@ import appeng.container.implementations.ContainerPriority; import appeng.container.implementations.ContainerQNB; import appeng.container.implementations.ContainerSecurity; import appeng.container.implementations.ContainerSkyChest; +import appeng.container.implementations.ContainerSpatialIOPort; import appeng.container.implementations.ContainerStorageBus; import appeng.container.implementations.ContainerUpgradeable; import appeng.container.implementations.ContainerVibrationChamber; @@ -66,6 +67,7 @@ import appeng.tile.misc.TileSecurity; import appeng.tile.misc.TileVibrationChamber; import appeng.tile.networking.TileWireless; import appeng.tile.qnb.TileQuantumBridge; +import appeng.tile.spatial.TileSpatialIOPort; import appeng.tile.storage.TileChest; import appeng.tile.storage.TileDrive; import appeng.tile.storage.TileIOPort; @@ -123,6 +125,10 @@ public enum GuiBridge implements IGuiHandler // extends (Container/Gui) + Bus GUI_LEVELEMITTER(ContainerLevelEmitter.class, PartLevelEmitter.class, false, SecurityPermissions.BUILD), + GUI_SPATIALIOPORT(ContainerSpatialIOPort.class, TileSpatialIOPort.class, false, SecurityPermissions.BUILD), + + // GUI_INSCRIBER + GUI_CELLWORKBENCH(ContainerCellWorkbench.class, TileCellWorkbench.class, false, null); private Class Tile; diff --git a/core/sync/network/NetworkHandler.java b/core/sync/network/NetworkHandler.java index f2543a25a..0aaf2a933 100644 --- a/core/sync/network/NetworkHandler.java +++ b/core/sync/network/NetworkHandler.java @@ -4,12 +4,16 @@ import net.minecraft.entity.player.EntityPlayerMP; import net.minecraft.network.NetHandlerPlayServer; import appeng.core.WorldSettings; import appeng.core.sync.AppEngPacket; +import cpw.mods.fml.common.FMLCommonHandler; import cpw.mods.fml.common.eventhandler.SubscribeEvent; import cpw.mods.fml.common.gameevent.PlayerEvent.PlayerLoggedInEvent; import cpw.mods.fml.common.network.FMLEventChannel; import cpw.mods.fml.common.network.FMLNetworkEvent.ClientCustomPacketEvent; +import cpw.mods.fml.common.network.FMLNetworkEvent.CustomNetworkEvent; import cpw.mods.fml.common.network.FMLNetworkEvent.ServerCustomPacketEvent; +import cpw.mods.fml.common.network.NetworkHandshakeEstablished; import cpw.mods.fml.common.network.NetworkRegistry; +import cpw.mods.fml.relauncher.Side; public class NetworkHandler { @@ -23,6 +27,7 @@ public class NetworkHandler final IPacketHandler serveHandler; public NetworkHandler(String channelName) { + FMLCommonHandler.instance().bus().register( this ); ec = NetworkRegistry.INSTANCE.newEventDrivenChannel( myChannelName = channelName ); ec.register( this ); @@ -55,9 +60,25 @@ public class NetworkHandler } @SubscribeEvent - public void newPlayer(PlayerLoggedInEvent ev) + public void newConection(CustomNetworkEvent cctse) { - WorldSettings.getInstance().sendToPlayer( ev.player ); + if ( cctse.wrappedEvent instanceof NetworkHandshakeEstablished ) + { + NetworkHandshakeEstablished nhe = (NetworkHandshakeEstablished) cctse.wrappedEvent; + if ( nhe.side == Side.SERVER && nhe.netHandler instanceof NetHandlerPlayServer ) + { + NetHandlerPlayServer srv = (NetHandlerPlayServer) nhe.netHandler; + // WorldSettings.getInstance().sendToPlayer( srv.playerEntity ); + + } + } + } + + @SubscribeEvent + public void newConection(PlayerLoggedInEvent loginEvent) + { + if ( loginEvent.player instanceof EntityPlayerMP ) + WorldSettings.getInstance().sendToPlayer( (EntityPlayerMP) loginEvent.player ); } @SubscribeEvent diff --git a/core/sync/packets/PacketNewStorageDimension.java b/core/sync/packets/PacketNewStorageDimension.java new file mode 100644 index 000000000..e504d3449 --- /dev/null +++ b/core/sync/packets/PacketNewStorageDimension.java @@ -0,0 +1,46 @@ +package appeng.core.sync.packets; + +import io.netty.buffer.ByteBuf; +import io.netty.buffer.Unpooled; + +import java.io.IOException; + +import net.minecraft.entity.player.EntityPlayer; +import net.minecraftforge.common.DimensionManager; +import appeng.core.AEConfig; +import appeng.core.sync.AppEngPacket; +import appeng.core.sync.network.INetworkInfo; +import cpw.mods.fml.relauncher.Side; +import cpw.mods.fml.relauncher.SideOnly; + +public class PacketNewStorageDimension extends AppEngPacket +{ + + final int newDim; + + // automatic. + public PacketNewStorageDimension(ByteBuf stream) throws IOException { + newDim = stream.readInt(); + } + + @Override + @SideOnly(Side.CLIENT) + public void clientPacketData(INetworkInfo network, AppEngPacket packet, EntityPlayer player) + { + DimensionManager.registerDimension( newDim, AEConfig.instance.storageProviderID ); + } + + // api + public PacketNewStorageDimension(int newDim) throws IOException { + + this.newDim = newDim; + + ByteBuf data = Unpooled.buffer(); + + data.writeInt( getPacketID() ); + data.writeInt( newDim ); + + configureWrite( data ); + } + +} diff --git a/helpers/DualityInterface.java b/helpers/DualityInterface.java index 81c6a0294..56952f900 100644 --- a/helpers/DualityInterface.java +++ b/helpers/DualityInterface.java @@ -24,6 +24,8 @@ import appeng.api.storage.data.IAEFluidStack; import appeng.api.storage.data.IAEItemStack; import appeng.api.util.AECableType; import appeng.api.util.DimensionalCoord; +import appeng.api.util.IConfigManager; +import appeng.api.util.IConfigureableObject; import appeng.me.GridAccessException; import appeng.me.helpers.AENetworkProxy; import appeng.me.storage.MEMonitorIInventory; @@ -33,13 +35,16 @@ import appeng.tile.inventory.AppEngInternalAEInventory; import appeng.tile.inventory.AppEngInternalInventory; import appeng.tile.inventory.IAEAppEngInventory; 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.AdaptorIInventory; import appeng.util.inv.IInventoryDestination; import appeng.util.inv.WrapperInvSlot; -public class DualityInterface implements IGridTickable, ISegmentedInventory, IStorageMonitorable, IInventoryDestination, IAEAppEngInventory +public class DualityInterface implements IGridTickable, ISegmentedInventory, IStorageMonitorable, IInventoryDestination, IAEAppEngInventory, + IConfigureableObject, IConfigManagerHost { final int sides[] = new int[] { 0, 1, 2, 3, 4, 5, 6, 7 }; @@ -49,6 +54,7 @@ public class DualityInterface implements IGridTickable, ISegmentedInventory, ISt AENetworkProxy gridProxy; IInterfaceHost iHost; BaseActionSource mySrc; + ConfigManager cm = new ConfigManager( this ); public DualityInterface(AENetworkProxy prox, IInterfaceHost ih) { gridProxy = prox; @@ -455,4 +461,16 @@ public class DualityInterface implements IGridTickable, ISegmentedInventory, ISt return (IPart) (iHost instanceof IPart ? iHost : null); } + public appeng.api.util.IConfigManager getConfigManager() + { + return cm; + } + + @Override + public void updateSetting(IConfigManager manager, Enum settingName, Enum newValue) + { + // TODO Auto-generated method stub + + }; + } diff --git a/items/storage/ItemSpatialStorageCell.java b/items/storage/ItemSpatialStorageCell.java index 012655f68..28f78b7b3 100644 --- a/items/storage/ItemSpatialStorageCell.java +++ b/items/storage/ItemSpatialStorageCell.java @@ -1,12 +1,26 @@ package appeng.items.storage; import java.util.EnumSet; +import java.util.List; +import net.minecraft.entity.player.EntityPlayer; +import net.minecraft.item.ItemStack; +import net.minecraft.nbt.NBTTagCompound; +import net.minecraft.world.World; +import net.minecraftforge.common.DimensionManager; +import appeng.api.implementations.TransitionResult; +import appeng.api.implementations.items.ISpatialStorageCell; +import appeng.api.util.WorldCoord; +import appeng.core.WorldSettings; import appeng.core.features.AEFeature; +import appeng.core.localization.GuiText; import appeng.items.AEBaseItem; import appeng.items.materials.MaterialType; +import appeng.spatial.StorageHelper; +import appeng.spatial.StorageWorldProvider; +import appeng.util.Platform; -public class ItemSpatialStorageCell extends AEBaseItem +public class ItemSpatialStorageCell extends AEBaseItem implements ISpatialStorageCell { final MaterialType component; @@ -20,4 +34,150 @@ public class ItemSpatialStorageCell extends AEBaseItem component = whichCell; } + @Override + public void addInformation(ItemStack is, EntityPlayer player, List list, boolean adv) + { + WorldCoord wc = getStoredSize( is ); + if ( wc.x > 0 ) + list.add( GuiText.StoredSize.getLocal() + ": " + wc.x + " x " + wc.y + " x " + wc.z ); + } + + @Override + public boolean isSpatialStorage(ItemStack is) + { + return true; + } + + @Override + public int getMaxStoredDim(ItemStack is) + { + return maxRegion; + } + + @Override + public World getWorld(ItemStack is) + { + if ( is.hasTagCompound() ) + { + NBTTagCompound c = is.getTagCompound(); + int dim = c.getInteger( "StorageDim" ); + World w = DimensionManager.getWorld( dim ); + if ( w == null ) + { + DimensionManager.initDimension( dim ); + w = DimensionManager.getWorld( dim ); + } + + if ( w != null ) + { + if ( w.provider instanceof StorageWorldProvider ) + { + return w; + } + } + } + return null; + } + + private void setStoredSize(ItemStack is, int targetX, int targetY, int targetZ) + { + if ( is.hasTagCompound() ) + { + NBTTagCompound c = is.getTagCompound(); + int dim = c.getInteger( "StorageDim" ); + c.setInteger( "sizeX", targetX ); + c.setInteger( "sizeY", targetY ); + c.setInteger( "sizeZ", targetZ ); + WorldSettings.getInstance().setStoredSize( dim, targetX, targetY, targetZ ); + } + } + + @Override + public WorldCoord getStoredSize(ItemStack is) + { + if ( is.hasTagCompound() ) + { + NBTTagCompound c = is.getTagCompound(); + if ( Platform.isServer() ) + { + int dim = c.getInteger( "StorageDim" ); + return WorldSettings.getInstance().getStoredSize( dim ); + } + else + return new WorldCoord( c.getInteger( "sizeX" ), c.getInteger( "sizeY" ), c.getInteger( "sizeZ" ) ); + } + return new WorldCoord( 0, 0, 0 ); + } + + @Override + public WorldCoord getMin(ItemStack is) + { + World w = getWorld( is ); + if ( w != null ) + { + NBTTagCompound info = (NBTTagCompound) w.getWorldInfo().getAdditionalProperty( "storageCell" ); + if ( info != null ) + { + return new WorldCoord( info.getInteger( "minX" ), info.getInteger( "minY" ), info.getInteger( "minZ" ) ); + } + } + return new WorldCoord( 0, 0, 0 ); + } + + @Override + public WorldCoord getMax(ItemStack is) + { + World w = getWorld( is ); + if ( w != null ) + { + NBTTagCompound info = (NBTTagCompound) w.getWorldInfo().getAdditionalProperty( "storageCell" ); + if ( info != null ) + { + return new WorldCoord( info.getInteger( "maxX" ), info.getInteger( "maxY" ), info.getInteger( "maxZ" ) ); + } + } + return new WorldCoord( 0, 0, 0 ); + } + + public World createNewWorld(ItemStack is) + { + NBTTagCompound c = Platform.openNbtData( is ); + int newDim = DimensionManager.getNextFreeDimId(); + c.setInteger( "StorageDim", newDim ); + WorldSettings.getInstance().addStorageCellDim( newDim ); + DimensionManager.initDimension( newDim ); + return DimensionManager.getWorld( newDim ); + } + + @Override + public TransitionResult doSpatialTransition(ItemStack is, World w, WorldCoord min, WorldCoord max, boolean doTransition) + { + WorldCoord scale = getStoredSize( is ); + + int targetX = max.x - min.x - 1; + int targetY = max.y - min.y - 1; + int targetZ = max.z - min.z - 1; + int maxSize = getMaxStoredDim( is ); + + int floorBuffer = 64; + World dest = getWorld( is ); + + if ( (scale.x == 0 && scale.y == 0 && scale.z == 0) || (scale.x == targetX && scale.y == targetY && scale.z == targetZ) ) + { + if ( targetX <= maxSize && targetY <= maxSize && targetZ <= maxSize ) + { + if ( dest == null ) + dest = createNewWorld( is ); + + StorageHelper.getInstance().swapRegions( w, dest, min.x + 1, min.y + 1, min.z + 1, 1, floorBuffer + 1, 1, targetX - 1, + floorBuffer + targetY - 1, targetZ - 1 ); + setStoredSize( is, targetX, targetY, targetZ ); + + return new TransitionResult( true, 0 ); + } + } + + return new TransitionResult( false, 0 ); + } + } diff --git a/me/cache/SpatialPylonCache.java b/me/cache/SpatialPylonCache.java index 023d87dfd..931330a77 100644 --- a/me/cache/SpatialPylonCache.java +++ b/me/cache/SpatialPylonCache.java @@ -39,6 +39,12 @@ public class SpatialPylonCache implements IGridCache, ISpatialCache myGrid = g; } + @Override + public long requiredPower() + { + return powerRequired; + } + @Override public boolean hasRegion() { diff --git a/me/cluster/implementations/IAssemblerCluster.java b/me/cluster/implementations/IAssemblerCluster.java deleted file mode 100644 index 1f9aadfdd..000000000 --- a/me/cluster/implementations/IAssemblerCluster.java +++ /dev/null @@ -1,30 +0,0 @@ -package appeng.me.cluster.implementations; - -import java.util.Iterator; - -import appeng.api.networking.IGridHost; -import appeng.me.cluster.IAECluster; - -public class IAssemblerCluster implements IAECluster -{ - - @Override - public void updateStatus(boolean updateGrid) - { - // TODO Auto-generated method stub - } - - @Override - public void destroy() - { - // TODO Auto-generated method stub - } - - @Override - public Iterator getTiles() - { - // TODO Auto-generated method stub - return null; - } - -} diff --git a/spatial/CachedPlane.java b/spatial/CachedPlane.java index bb0c9c2d2..7aa6984db 100644 --- a/spatial/CachedPlane.java +++ b/spatial/CachedPlane.java @@ -7,10 +7,14 @@ import java.util.List; import java.util.Map.Entry; import net.minecraft.block.Block; +import net.minecraft.network.Packet; +import net.minecraft.network.play.server.S21PacketChunkData; +import net.minecraft.server.management.PlayerManager; import net.minecraft.tileentity.TileEntity; import net.minecraft.world.ChunkPosition; import net.minecraft.world.NextTickListEntry; import net.minecraft.world.World; +import net.minecraft.world.WorldServer; import net.minecraft.world.chunk.Chunk; import net.minecraft.world.chunk.storage.ExtendedBlockStorage; import net.minecraftforge.common.util.ForgeDirection; @@ -20,6 +24,7 @@ import appeng.api.movable.IMovableRegistry; import appeng.api.util.WorldCoord; import appeng.core.AELog; import appeng.util.Platform; +import cpw.mods.fml.relauncher.ReflectionHelper; public class CachedPlane { @@ -53,6 +58,9 @@ public class CachedPlane public void setBlockIDWithMetadata(int y, Object[] blk) { + if ( blk[0] == matrixFrame ) + blk[0] = Platform.air; + ExtendedBlockStorage extendedblockstorage = storage[y >> 4]; extendedblockstorage.func_150818_a( x, y & 15, z, (Block) blk[0] ); // extendedblockstorage.setExtBlockID( x, y & 15, z, blk[0] ); @@ -104,6 +112,7 @@ public class CachedPlane LinkedList ticks = new LinkedList(); World wrld; + Block matrixFrame = AEApi.instance().blocks().blockMatrixFrame.block(); LinkedList updates = new LinkedList(); @@ -385,19 +394,49 @@ public class CachedPlane for (int z = 0; z < cz_size; z++) { - // TODO: Fix? + Chunk c = myChunks[x][z]; + + try + { + WorldServer ws = (WorldServer) c.worldObj; + PlayerManager pm = ws.getPlayerManager(); + + if ( getOrCreateChunkWatcher == null ) + { + getOrCreateChunkWatcher = ReflectionHelper.findMethod( PlayerManager.class, pm, new String[] { "getOrCreateChunkWatcher", + "func_72690_a" }, int.class, int.class, boolean.class ); + } + + if ( getOrCreateChunkWatcher != null ) + { + Object playerinstance = getOrCreateChunkWatcher.invoke( pm, c.xPosition, c.zPosition, false ); + if ( playerinstance != null ) + { + Playerinstance = playerinstance.getClass(); + + if ( sendToAllPlayersWatchingChunk == null ) + { + sendToAllPlayersWatchingChunk = ReflectionHelper.findMethod( Playerinstance, playerinstance, new String[] { + "sendToAllPlayersWatchingChunk", "func_151251_a" }, Packet.class ); + } + + if ( sendToAllPlayersWatchingChunk != null ) + sendToAllPlayersWatchingChunk.invoke( playerinstance, new S21PacketChunkData( c, false, verticalBits ) ); + } + } + + } + catch (Throwable t) + { + AELog.error( t ); + } - /* - * Chunk c = myChunks[x][z]; - * - * WorldServer ws = (WorldServer) c.worldObj; PlayerManager pm = ws.getPlayerManager(); PlayerInstance - * playerinstance = pm.getOrCreateChunkWatcher( c.xPosition, c.zPosition, false ); - * - * if ( playerinstance != null ) playerinstance.sendToAllPlayersWatchingChunk( new Packet51MapChunk( c, - * false, verticalBits ) ); - */ } } + Class Playerinstance; + Method getOrCreateChunkWatcher; + Method sendToAllPlayersWatchingChunk; + } diff --git a/spatial/StorageChunkProvider.java b/spatial/StorageChunkProvider.java index a1e84ec62..622fb24f0 100644 --- a/spatial/StorageChunkProvider.java +++ b/spatial/StorageChunkProvider.java @@ -3,20 +3,29 @@ package appeng.spatial; import java.util.ArrayList; import java.util.List; +import net.minecraft.block.Block; import net.minecraft.entity.EnumCreatureType; import net.minecraft.world.World; import net.minecraft.world.chunk.Chunk; import net.minecraft.world.chunk.IChunkProvider; import net.minecraft.world.gen.ChunkProviderGenerate; +import appeng.api.AEApi; +import appeng.core.AEConfig; public class StorageChunkProvider extends ChunkProviderGenerate implements IChunkProvider { + Block[] ablock = new Block[32768]; World w; public StorageChunkProvider(World wrd, long i) { super( wrd, i, false ); this.w = wrd; + + Block matrixFrame = AEApi.instance().blocks().blockMatrixFrame.block(); + + for (int x = 0; x < ablock.length; x++) + ablock[x] = matrixFrame; } @Override @@ -28,7 +37,13 @@ public class StorageChunkProvider extends ChunkProviderGenerate implements IChun @Override public Chunk provideChunk(int x, int z) { - Chunk chunk = new Chunk( w, x, z ); + Chunk chunk = new Chunk( w, ablock, x, z ); + + byte[] abyte = chunk.getBiomeArray(); + AEConfig config = AEConfig.instance; + + for (int k = 0; k < abyte.length; ++k) + abyte[k] = (byte) config.storageBiomeID; if ( !chunk.isTerrainPopulated ) { diff --git a/spatial/StorageHelper.java b/spatial/StorageHelper.java index c38f01690..fd33cc292 100644 --- a/spatial/StorageHelper.java +++ b/spatial/StorageHelper.java @@ -1,5 +1,6 @@ package appeng.spatial; +import java.lang.reflect.Method; import java.util.List; import net.minecraft.block.Block; @@ -15,7 +16,9 @@ import net.minecraft.world.WorldServer; import appeng.api.AEApi; import appeng.api.util.WorldCoord; import appeng.block.solids.BlockMatrixFrame; +import appeng.core.AELog; import appeng.util.Platform; +import cpw.mods.fml.relauncher.ReflectionHelper; public class StorageHelper { @@ -119,6 +122,8 @@ public class StorageHelper }; + Method onEntityRemoved; + /** * Mostly from dimentional doors.. which mostly got it form X-Comp. * @@ -179,8 +184,23 @@ public class StorageHelper oldWorld.getChunkFromChunkCoords( entX, entZ ).isModified = true; } - // TODO: Fix? - // oldWorld.onEntityRemoved( entity ); + if ( onEntityRemoved == null ) + { + onEntityRemoved = ReflectionHelper.findMethod( WorldServer.class, oldWorld, new String[] { "onEntityRemoved", "func_72847_b" }, + Entity.class ); + } + + if ( onEntityRemoved != null ) + { + try + { + onEntityRemoved.invoke( oldWorld, entity ); + } + catch (Throwable t) + { + AELog.error( t ); + } + } if ( player == null ) // Are we NOT working with a player? { diff --git a/tile/mac/TileMolecularAssembler.java b/tile/mac/TileMolecularAssembler.java deleted file mode 100644 index ca9869b2f..000000000 --- a/tile/mac/TileMolecularAssembler.java +++ /dev/null @@ -1,30 +0,0 @@ -package appeng.tile.mac; - -import appeng.me.cluster.IAECluster; -import appeng.me.cluster.IAEMultiBlock; -import appeng.tile.grid.AENetworkTile; - -public class TileMolecularAssembler extends AENetworkTile implements IAEMultiBlock -{ - - @Override - public void disconnect() - { - // TODO Auto-generated method stub - } - - @Override - public IAECluster getCluster() - { - // TODO Auto-generated method stub - return null; - } - - @Override - public boolean isValid() - { - // TODO Auto-generated method stub - return false; - } - -} diff --git a/tile/mac/TilePatternProvider.java b/tile/mac/TilePatternProvider.java deleted file mode 100644 index 4e2f60045..000000000 --- a/tile/mac/TilePatternProvider.java +++ /dev/null @@ -1,30 +0,0 @@ -package appeng.tile.mac; - -import appeng.me.cluster.IAECluster; -import appeng.me.cluster.IAEMultiBlock; -import appeng.tile.grid.AENetworkTile; - -public class TilePatternProvider extends AENetworkTile implements IAEMultiBlock -{ - - @Override - public void disconnect() - { - // TODO Auto-generated method stub - } - - @Override - public IAECluster getCluster() - { - // TODO Auto-generated method stub - return null; - } - - @Override - public boolean isValid() - { - // TODO Auto-generated method stub - return false; - } - -} diff --git a/tile/misc/TileInscriber.java b/tile/misc/TileInscriber.java index bcc7705ce..c047ce8dd 100644 --- a/tile/misc/TileInscriber.java +++ b/tile/misc/TileInscriber.java @@ -5,7 +5,6 @@ import io.netty.buffer.ByteBuf; import java.io.IOException; import java.util.EnumSet; -import net.minecraft.entity.player.EntityPlayer; import net.minecraft.inventory.IInventory; import net.minecraft.item.ItemStack; import net.minecraftforge.common.util.ForgeDirection; @@ -108,10 +107,4 @@ public class TileInscriber extends AENetworkPowerTile } - public void activate(EntityPlayer player) - { - // TODO Auto-generated method stub - - } - } diff --git a/tile/misc/TileInterface.java b/tile/misc/TileInterface.java index 3ce924b53..1d2e70b25 100644 --- a/tile/misc/TileInterface.java +++ b/tile/misc/TileInterface.java @@ -157,8 +157,7 @@ public class TileInterface extends AENetworkInvTile implements IGridTickable, IS @Override public IConfigManager getConfigManager() { - // TODO Auto-generated method stub - return null; + return duality.getConfigManager(); } } diff --git a/tile/misc/TileNetworkEmitter.java b/tile/misc/TileNetworkEmitter.java deleted file mode 100644 index bd3de372e..000000000 --- a/tile/misc/TileNetworkEmitter.java +++ /dev/null @@ -1,22 +0,0 @@ -package appeng.tile.misc; - -import java.util.EnumSet; - -import net.minecraft.entity.player.EntityPlayer; -import net.minecraftforge.common.util.ForgeDirection; -import appeng.tile.grid.AENetworkTile; - -public class TileNetworkEmitter extends AENetworkTile -{ - - public TileNetworkEmitter() { - gridProxy.setValidSides( EnumSet.noneOf( ForgeDirection.class ) ); - } - - public void activate(EntityPlayer player) - { - // TODO Auto-generated method stub - - } - -} diff --git a/tile/misc/TileQuartzCrystalizer.java b/tile/misc/TileQuartzCrystalizer.java deleted file mode 100644 index 0074cb139..000000000 --- a/tile/misc/TileQuartzCrystalizer.java +++ /dev/null @@ -1,83 +0,0 @@ -package appeng.tile.misc; - -import java.util.EnumSet; - -import net.minecraft.entity.player.EntityPlayer; -import net.minecraft.inventory.IInventory; -import net.minecraft.item.ItemStack; -import net.minecraftforge.common.util.ForgeDirection; -import appeng.api.util.AECableType; -import appeng.tile.grid.AENetworkPowerTile; -import appeng.tile.inventory.AppEngInternalInventory; -import appeng.tile.inventory.InvOperation; - -public class TileQuartzCrystalizer extends AENetworkPowerTile -{ - - final int sides[] = new int[] { 0, 1 }; - AppEngInternalInventory inv = new AppEngInternalInventory( this, 2 ); - int processingTime = 0; - - @Override - public AECableType getCableConnectionType(ForgeDirection dir) - { - return AECableType.COVERED; - } - - public TileQuartzCrystalizer() { - gridProxy.setValidSides( EnumSet.noneOf( ForgeDirection.class ) ); - internalMaxPower = 1500; - gridProxy.setIdlePowerUsage( 0 ); - } - - @Override - public void setOrientation(ForgeDirection inForward, ForgeDirection inUp) - { - super.setOrientation( inForward, inUp ); - gridProxy.setValidSides( EnumSet.of( getUp(), getUp().getOpposite() ) ); - setPowerSides( EnumSet.of( getUp(), getUp().getOpposite() ) ); - } - - @Override - public IInventory getInternalInventory() - { - return inv; - } - - @Override - public int[] getAccessibleSlotsFromSide(int side) - { - return sides; - } - - @Override - public int getInventoryStackLimit() - { - return 1; - } - - @Override - public boolean isItemValidForSlot(int i, ItemStack itemstack) - { - return i == 0; - } - - @Override - public boolean canExtractItem(int i, ItemStack itemstack, int j) - { - return i == 1; - } - - @Override - public void onChangeInventory(IInventory inv, int slot, InvOperation mc, ItemStack removed, ItemStack added) - { - - } - - public void activate(EntityPlayer player) - { - // TODO Auto-generated method stub - - } - -} diff --git a/tile/spatial/TileSpatialIOPort.java b/tile/spatial/TileSpatialIOPort.java index 3f4157a9f..9515b24a7 100644 --- a/tile/spatial/TileSpatialIOPort.java +++ b/tile/spatial/TileSpatialIOPort.java @@ -1,21 +1,39 @@ package appeng.tile.spatial; +import java.util.concurrent.Callable; + import net.minecraft.inventory.IInventory; import net.minecraft.item.ItemStack; import net.minecraftforge.common.util.ForgeDirection; +import appeng.api.config.Actionable; +import appeng.api.config.PowerMultiplier; +import appeng.api.implementations.TransitionResult; +import appeng.api.implementations.items.ISpatialStorageCell; +import appeng.api.networking.GridFlags; +import appeng.api.networking.IGrid; +import appeng.api.networking.energy.IEnergyGrid; +import appeng.api.networking.spatial.ISpatialCache; import appeng.api.util.AECableType; import appeng.api.util.DimensionalCoord; +import appeng.hooks.TickHandler; +import appeng.items.storage.ItemSpatialStorageCell; +import appeng.me.cache.SpatialPylonCache; import appeng.tile.grid.AENetworkInvTile; import appeng.tile.inventory.AppEngInternalInventory; import appeng.tile.inventory.InvOperation; +import appeng.util.Platform; -public class TileSpatialIOPort extends AENetworkInvTile +public class TileSpatialIOPort extends AENetworkInvTile implements Callable { final int sides[] = { 0, 1 }; AppEngInternalInventory inv = new AppEngInternalInventory( this, 2 ); boolean lastRedstoneState = false; + public TileSpatialIOPort() { + gridProxy.setFlags( GridFlags.REQUIRE_CHANNEL ); + } + public void updateRedstoneState() { boolean currentState = worldObj.isBlockIndirectlyGettingPowered( xCoord, yCoord, zCoord ); @@ -31,8 +49,47 @@ public class TileSpatialIOPort extends AENetworkInvTile private void triggerTransition() { - // TODO Auto-generated method stub + if ( Platform.isServer() ) + { + ItemStack cell = getStackInSlot( 0 ); + if ( isSpatialCell( cell ) ) + { + TickHandler.instance.addCallable( this ); + } + } + } + @Override + public Object call() throws Exception + { + + ItemStack cell = getStackInSlot( 0 ); + if ( isSpatialCell( cell ) && getStackInSlot( 1 ) == null ) + { + IGrid gi = gridProxy.getGrid(); + IEnergyGrid energy = gridProxy.getEnergy(); + + ItemSpatialStorageCell sc = (ItemSpatialStorageCell) cell.getItem(); + + SpatialPylonCache spc = (SpatialPylonCache) gi.getCache( ISpatialCache.class ); + if ( spc.hasRegion() && spc.isValidRegion() ) + { + double req = spc.requiredPower(); + double pr = energy.extractAEPower( req, Actionable.SIMULATE, PowerMultiplier.CONFIG ); + if ( Math.abs( pr - req ) < req * 0.001 ) + { + TransitionResult tr = sc.doSpatialTransition( cell, worldObj, spc.getMin(), spc.getMax(), true ); + if ( tr.success ) + { + energy.extractAEPower( req, Actionable.MODULATE, PowerMultiplier.CONFIG ); + setInventorySlotContents( 0, null ); + setInventorySlotContents( 1, cell ); + } + } + } + } + + return null; } @Override @@ -53,6 +110,34 @@ public class TileSpatialIOPort extends AENetworkInvTile return inv; } + @Override + public boolean isItemValidForSlot(int i, ItemStack itemstack) + { + return (i == 0 ? isSpatialCell( itemstack ) : false); + } + + private boolean isSpatialCell(ItemStack cell) + { + if ( cell != null && cell.getItem() instanceof ISpatialStorageCell ) + { + ISpatialStorageCell sc = (ISpatialStorageCell) cell.getItem(); + return sc != null && sc.isSpatialStorage( cell ); + } + return false; + } + + @Override + public boolean canInsertItem(int i, ItemStack itemstack, int j) + { + return isItemValidForSlot( i, itemstack ); + } + + @Override + public boolean canExtractItem(int i, ItemStack itemstack, int j) + { + return i == 1; + } + @Override public void onChangeInventory(IInventory inv, int slot, InvOperation mc, ItemStack removed, ItemStack added) {