diff --git a/block/misc/BlockQuartzGrowthAccelerator.java b/block/misc/BlockQuartzGrowthAccelerator.java index 66060a174..7396d36be 100644 --- a/block/misc/BlockQuartzGrowthAccelerator.java +++ b/block/misc/BlockQuartzGrowthAccelerator.java @@ -116,4 +116,10 @@ public class BlockQuartzGrowthAccelerator extends AEBaseBlock implements IOrient Minecraft.getMinecraft().effectRenderer.addEffect( (EntityFX) fx ); } } + + @Override + public boolean usesMetadata() + { + return true; + } } diff --git a/block/misc/BlockQuartzTorch.java b/block/misc/BlockQuartzTorch.java index f4b0c4a15..96212909f 100644 --- a/block/misc/BlockQuartzTorch.java +++ b/block/misc/BlockQuartzTorch.java @@ -20,8 +20,8 @@ import appeng.block.AEBaseBlock; import appeng.client.render.BaseBlockRender; import appeng.client.render.blocks.RenderQuartzTorch; import appeng.client.render.effects.LightningEffect; -import appeng.core.CommonHelper; import appeng.core.AEConfig; +import appeng.core.CommonHelper; import appeng.core.features.AEFeature; import appeng.helpers.ICustomCollision; import appeng.helpers.MetaRotation; @@ -131,4 +131,10 @@ public class BlockQuartzTorch extends AEBaseBlock implements IOrientableBlock, I } } + @Override + public boolean usesMetadata() + { + return true; + } + } diff --git a/block/solids/BlockQuartzPillar.java b/block/solids/BlockQuartzPillar.java index f6589f8e1..b42328b69 100644 --- a/block/solids/BlockQuartzPillar.java +++ b/block/solids/BlockQuartzPillar.java @@ -24,4 +24,10 @@ public class BlockQuartzPillar extends AEBaseBlock implements IOrientableBlock return new MetaRotation( w, x, y, z ); } + @Override + public boolean usesMetadata() + { + return true; + } + } diff --git a/block/solids/BlockSkyStone.java b/block/solids/BlockSkyStone.java index eb7a46571..eeee31065 100644 --- a/block/solids/BlockSkyStone.java +++ b/block/solids/BlockSkyStone.java @@ -168,4 +168,10 @@ public class BlockSkyStone extends AEBaseBlock implements IOrientableBlock return getRenderType(); } + @Override + public boolean usesMetadata() + { + return false; + } + } diff --git a/block/solids/OreQuartz.java b/block/solids/OreQuartz.java index 6ba2cb9a1..9c40a9f1e 100644 --- a/block/solids/OreQuartz.java +++ b/block/solids/OreQuartz.java @@ -11,15 +11,12 @@ import net.minecraft.world.IBlockAccess; import net.minecraft.world.World; import net.minecraftforge.oredict.OreDictionary; import appeng.api.AEApi; -import appeng.api.util.IOrientable; -import appeng.api.util.IOrientableBlock; import appeng.block.AEBaseBlock; import appeng.client.render.BaseBlockRender; import appeng.client.render.blocks.RenderQuartzOre; import appeng.core.features.AEFeature; -import appeng.helpers.LocationRotation; -public class OreQuartz extends AEBaseBlock implements IOrientableBlock +public class OreQuartz extends AEBaseBlock { public int boostBrightnessLow; @@ -77,12 +74,6 @@ public class OreQuartz extends AEBaseBlock implements IOrientableBlock return AEApi.instance().materials().materialCertusQuartzCrystal.stack( 1 ); } - @Override - public IOrientable getOrientable(final IBlockAccess w, final int x, final int y, final int z) - { - return new LocationRotation( w, x, y, z ); - } - @Override public Item getItemDropped(int id, Random rand, int meta) { diff --git a/client/gui/AEBaseGui.java b/client/gui/AEBaseGui.java index 62b9a59ba..d8eaf58ad 100644 --- a/client/gui/AEBaseGui.java +++ b/client/gui/AEBaseGui.java @@ -116,11 +116,41 @@ public abstract class AEBaseGui extends GuiContainer { super.handleMouseInput(); - if ( myScrollBar != null ) + int i = Mouse.getEventDWheel(); + if ( i != 0 && isShiftKeyDown() ) { - int i = Mouse.getEventDWheel(); - if ( i != 0 ) - myScrollBar.wheel( i ); + int x = Mouse.getEventX() * this.width / this.mc.displayWidth; + int y = this.height - Mouse.getEventY() * this.height / this.mc.displayHeight - 1; + mouseWheelEvent( x, y, i / Math.abs( i ) ); + } + else if ( i != 0 && myScrollBar != null ) + myScrollBar.wheel( i ); + } + + protected void mouseWheelEvent(int x, int y, int wheel) + { + Slot slot = getSlot( x, y ); + if ( slot instanceof SlotME ) + { + IAEItemStack item = ((SlotME) slot).getAEStack(); + if ( item != null ) + { + try + { + ((AEBaseContainer) inventorySlots).setTargetStack( item ); + InventoryAction direction = wheel > 0 ? InventoryAction.ROLLDOWN : InventoryAction.ROLLUP; + int times = Math.abs( wheel ); + for (int h = 0; h < times; h++) + { + PacketInventoryAction p = new PacketInventoryAction( direction, inventorySlots.inventorySlots.size(), null ); + NetworkHandler.instance.sendToServer( p ); + } + } + catch (IOException e) + { + AELog.error( e ); + } + } } } @@ -150,15 +180,13 @@ public abstract class AEBaseGui extends GuiContainer if ( slot instanceof SlotFake ) { InventoryAction action = null; - IAEItemStack stack = null; action = ctrlDown == 1 ? InventoryAction.SPLIT_OR_PLACESINGLE : InventoryAction.PICKUP_OR_SETDOWN; if ( action != null ) { - PacketInventoryAction p; try { - p = new PacketInventoryAction( action, slotIdx, stack ); + PacketInventoryAction p = new PacketInventoryAction( action, slotIdx, null ); NetworkHandler.instance.sendToServer( p ); } catch (IOException e) @@ -190,7 +218,6 @@ public abstract class AEBaseGui extends GuiContainer return; // prevent weird double clicks.. InventoryAction action = null; - IAEItemStack stack = null; if ( key == 1 ) action = InventoryAction.CRAFT_SHIFT; else @@ -198,10 +225,9 @@ public abstract class AEBaseGui extends GuiContainer if ( action != null ) { - PacketInventoryAction p; try { - p = new PacketInventoryAction( action, slotIdx, stack ); + PacketInventoryAction p = new PacketInventoryAction( action, slotIdx, null ); NetworkHandler.instance.sendToServer( p ); } catch (IOException e) @@ -219,7 +245,6 @@ public abstract class AEBaseGui extends GuiContainer if ( slot instanceof SlotME ) stack = ((SlotME) slot).getAEStack(); - PacketInventoryAction p; try { int slotNum = inventorySlots.inventorySlots.size(); @@ -227,7 +252,8 @@ public abstract class AEBaseGui extends GuiContainer if ( !(slot instanceof SlotME) && slot != null ) slotNum = slot.slotNumber; - p = new PacketInventoryAction( InventoryAction.MOVE_REGION, slotNum, stack ); + ((AEBaseContainer) inventorySlots).setTargetStack( stack ); + PacketInventoryAction p = new PacketInventoryAction( InventoryAction.MOVE_REGION, slotNum, null ); NetworkHandler.instance.sendToServer( p ); } catch (IOException e) @@ -272,10 +298,10 @@ public abstract class AEBaseGui extends GuiContainer if ( action != null ) { - PacketInventoryAction p; try { - p = new PacketInventoryAction( action, inventorySlots.inventorySlots.size(), stack ); + ((AEBaseContainer) inventorySlots).setTargetStack( stack ); + PacketInventoryAction p = new PacketInventoryAction( action, inventorySlots.inventorySlots.size(), null ); NetworkHandler.instance.sendToServer( p ); } catch (IOException e) diff --git a/container/AEBaseContainer.java b/container/AEBaseContainer.java index 664ffb48e..8a316a02c 100644 --- a/container/AEBaseContainer.java +++ b/container/AEBaseContainer.java @@ -1,5 +1,7 @@ package appeng.container; +import java.io.ByteArrayInputStream; +import java.io.ByteArrayOutputStream; import java.io.IOException; import java.lang.reflect.Field; import java.util.ArrayList; @@ -16,6 +18,8 @@ import net.minecraft.inventory.ICrafting; import net.minecraft.inventory.IInventory; import net.minecraft.inventory.Slot; import net.minecraft.item.ItemStack; +import net.minecraft.nbt.CompressedStreamTools; +import net.minecraft.nbt.NBTTagCompound; import net.minecraft.tileentity.TileEntity; import net.minecraftforge.common.util.ForgeDirection; import appeng.api.AEApi; @@ -47,6 +51,7 @@ import appeng.container.slot.SlotPlayerInv; import appeng.core.AELog; import appeng.core.sync.network.NetworkHandler; import appeng.core.sync.packets.PacketInventoryAction; +import appeng.core.sync.packets.PacketPartialItem; import appeng.core.sync.packets.PacketValueConfig; import appeng.helpers.ICustomNameObject; import appeng.helpers.InventoryAction; @@ -70,6 +75,101 @@ public abstract class AEBaseContainer extends Container int ticksSinceCheck = 900; + IAEItemStack clientRequestedTargetItem = null; + List dataChunks = new LinkedList(); + + public void postPartial(PacketPartialItem packetPartialItem) + { + dataChunks.add( packetPartialItem ); + if ( packetPartialItem.getPageCount() == dataChunks.size() ) + parsePartials(); + } + + private void parsePartials() + { + int total = 0; + for (PacketPartialItem ppi : dataChunks) + total += ppi.getSize(); + + byte[] buffer = new byte[total]; + int cursor = 0; + + for (PacketPartialItem ppi : dataChunks) + cursor = ppi.write( buffer, cursor ); + + try + { + NBTTagCompound data = CompressedStreamTools.readCompressed( new ByteArrayInputStream( buffer ) ); + if ( data != null ) + setTargetStack( AEApi.instance().storage().createItemStack( ItemStack.loadItemStackFromNBT( data ) ) ); + } + catch (IOException e) + { + AELog.error( e ); + } + + dataChunks.clear(); + } + + public void setTargetStack(IAEItemStack stack) + { + // client dosn't need to re-send, makes for lower overhead rapid packets. + if ( Platform.isClient() ) + { + ItemStack a = stack == null ? null : stack.getItemStack(); + ItemStack b = clientRequestedTargetItem == null ? null : clientRequestedTargetItem.getItemStack(); + + if ( Platform.isSameItemPrecise( a, b ) ) + return; + + ByteArrayOutputStream stream = new ByteArrayOutputStream(); + NBTTagCompound item = new NBTTagCompound(); + + if ( stack != null ) + stack.writeToNBT( item ); + + try + { + CompressedStreamTools.writeCompressed( item, stream ); + + int maxChunkSize = 30000; + List miniPackets = new LinkedList(); + + byte[] data = stream.toByteArray(); + + ByteArrayInputStream bis = new ByteArrayInputStream( data, 0, stream.size() ); + while (bis.available() > 0) + { + int nextBLock = bis.available() > maxChunkSize ? maxChunkSize : bis.available(); + byte[] nextSegment = new byte[nextBLock]; + bis.read( nextSegment ); + miniPackets.add( nextSegment ); + } + bis.close(); + stream.close(); + + int page = 0; + for (byte[] packet : miniPackets) + { + PacketPartialItem ppi = new PacketPartialItem( page++, miniPackets.size(), packet ); + NetworkHandler.instance.sendToServer( ppi ); + } + } + catch (IOException e) + { + AELog.error( e ); + return; + } + } + + clientRequestedTargetItem = stack == null ? null : stack.copy(); + } + + public IAEItemStack getTargetStack() + { + return clientRequestedTargetItem; + } + public BaseActionSource getSource() { return mySrc; @@ -548,7 +648,7 @@ public abstract class AEBaseContainer extends Container return ais.getItemStack(); } - public void doAction(EntityPlayerMP player, InventoryAction action, int slot, IAEItemStack slotItem) + public void doAction(EntityPlayerMP player, InventoryAction action, int slot) { if ( slot >= 0 && slot < inventorySlots.size() ) { @@ -632,6 +732,9 @@ public abstract class AEBaseContainer extends Container return; } + // get target item. + IAEItemStack slotItem = getTargetStack(); + switch (action) { case SHIFT_CLICK: @@ -657,6 +760,34 @@ public abstract class AEBaseContainer extends Container adp.addItems( ais.getItemStack() ); } break; + case ROLLDOWN: + if ( powerSrc == null || cellInv == null ) + return; + + int releaseQty = 1; + ItemStack isg = player.inventory.getItemStack(); + + if ( isg != null && releaseQty > 0 ) + { + IAEItemStack ais = AEApi.instance().storage().createItemStack( isg ); + ais.setStackSize( 1 ); + IAEItemStack extracted = ais.copy(); + + ais = Platform.poweredInsert( powerSrc, cellInv, ais, mySrc ); + if ( ais == null ) + { + InventoryAdaptor ia = new AdaptorPlayerHand( player ); + + ItemStack fail = ia.removeItems( 1, extracted.getItemStack(), null ); + if ( fail == null ) + cellInv.extractItems( extracted, Actionable.MODULATE, mySrc ); + + updateHeld( player ); + } + } + + break; + case ROLLUP: case PICKUP_SINGLE: if ( powerSrc == null || cellInv == null ) return; @@ -664,13 +795,13 @@ public abstract class AEBaseContainer extends Container if ( slotItem != null ) { int liftQty = 1; - ItemStack isg = player.inventory.getItemStack(); + ItemStack isgg = player.inventory.getItemStack(); - if ( isg != null ) + if ( isgg != null ) { - if ( isg.stackSize >= isg.getMaxStackSize() ) + if ( isgg.stackSize >= isgg.getMaxStackSize() ) liftQty = 0; - if ( !Platform.isSameItemPrecise( slotItem.getItemStack(), isg ) ) + if ( !Platform.isSameItemPrecise( slotItem.getItemStack(), isgg ) ) liftQty = 0; } @@ -679,14 +810,16 @@ public abstract class AEBaseContainer extends Container IAEItemStack ais = slotItem.copy(); ais.setStackSize( 1 ); ais = Platform.poweredExtraction( powerSrc, cellInv, ais, mySrc ); + if ( ais != null ) + { + InventoryAdaptor ia = new AdaptorPlayerHand( player ); - InventoryAdaptor ia = new AdaptorPlayerHand( player ); + ItemStack fail = ia.addItems( ais.getItemStack() ); + if ( fail != null ) + cellInv.injectItems( ais, Actionable.MODULATE, mySrc ); - ItemStack fail = ia.addItems( ais.getItemStack() ); - if ( fail != null ) - cellInv.injectItems( ais, Actionable.MODULATE, mySrc ); - - updateHeld( player ); + updateHeld( player ); + } } } break; @@ -802,13 +935,17 @@ public abstract class AEBaseContainer extends Container protected void updateHeld(EntityPlayerMP p) { - try + if ( Platform.isServer() ) { - NetworkHandler.instance.sendTo( new PacketInventoryAction( InventoryAction.UPDATE_HAND, 0, AEItemStack.create( p.inventory.getItemStack() ) ), p ); - } - catch (IOException e) - { - AELog.error( e ); + try + { + NetworkHandler.instance.sendTo( new PacketInventoryAction( InventoryAction.UPDATE_HAND, 0, AEItemStack.create( p.inventory.getItemStack() ) ), + p ); + } + catch (IOException e) + { + AELog.error( e ); + } } } diff --git a/container/slot/SlotCraftingTerm.java b/container/slot/SlotCraftingTerm.java index 7894d8b50..b82cdbd27 100644 --- a/container/slot/SlotCraftingTerm.java +++ b/container/slot/SlotCraftingTerm.java @@ -6,6 +6,7 @@ import java.util.List; import net.minecraft.entity.player.EntityPlayer; import net.minecraft.inventory.IInventory; import net.minecraft.inventory.InventoryCrafting; +import net.minecraft.item.Item; import net.minecraft.item.ItemStack; import net.minecraft.item.crafting.IRecipe; import appeng.api.config.Actionable; @@ -82,7 +83,27 @@ public class SlotCraftingTerm extends AppEngCraftingSlot IRecipe r = Platform.findMatchingRecipe( ic, p.worldObj ); if ( r == null ) + { + Item target = request.getItem(); + if ( target.isDamageable() && target.isRepairable() ) + { + boolean isBad = false; + for (int x = 0; x < ic.getSizeInventory(); x++) + { + ItemStack pis = ic.getStackInSlot( x ); + if ( pis == null ) + continue; + if ( pis.getItem() != target ) + isBad = true; + } + if ( !isBad ) + { + super.onPickupFromSlot( p, is ); + return request; + } + } return null; + } is = r.getCraftingResult( ic ); diff --git a/core/AppEng.java b/core/AppEng.java index a8c7df048..27348252a 100644 --- a/core/AppEng.java +++ b/core/AppEng.java @@ -80,8 +80,7 @@ public class AppEng IMCHandlers.put( "add-p2p-attunement-" + type.name().replace( '_', '-' ).toLowerCase(), new IMCP2PAttunement() ); } - for (CrashInfo ci : CrashInfo.values()) - FMLCommonHandler.instance().registerCrashCallable( new CrashEnhancement( ci ) ); + FMLCommonHandler.instance().registerCrashCallable( new CrashEnhancement( CrashInfo.MOD_VERSION ) ); } public boolean isIntegrationEnabled(String Name) @@ -157,6 +156,7 @@ public class AppEng Registration.instance.PostInit( event ); IntegrationRegistry.instance.postinit(); + FMLCommonHandler.instance().registerCrashCallable( new CrashEnhancement( CrashInfo.INTEGRATION ) ); CommonHelper.proxy.postinit(); AEConfig.instance.save(); diff --git a/core/Registration.java b/core/Registration.java index 2fb5ede89..5b2836fe8 100644 --- a/core/Registration.java +++ b/core/Registration.java @@ -486,16 +486,22 @@ public class Registration ph.registerNewLayer( "appeng.api.parts.layers.LayerIEnergySource", "ic2.api.energy.tile.IEnergySource" ); } - if ( AppEng.instance.isIntegrationEnabled( "MJ" ) ) + if ( AppEng.instance.isIntegrationEnabled( "MJ5" ) ) { ph.registerNewLayer( "appeng.api.parts.layers.LayerIPowerEmitter", "buildcraft.api.power.IPowerEmitter" ); ph.registerNewLayer( "appeng.api.parts.layers.LayerIPowerReceptor", "buildcraft.api.power.IPowerReceptor" ); } + if ( AppEng.instance.isIntegrationEnabled( "MJ6" ) ) + { + ph.registerNewLayer( "appeng.api.parts.layers.LayerIBatteryProvider", "buildcraft.api.mj.IBatteryProvider" ); + } + if ( AppEng.instance.isIntegrationEnabled( "RF" ) ) ph.registerNewLayer( "appeng.api.parts.layers.LayerIEnergyHandler", "cofh.api.energy.IEnergyHandler" ); FMLCommonHandler.instance().bus().register( TickHandler.instance ); + MinecraftForge.EVENT_BUS.register( TickHandler.instance ); MinecraftForge.EVENT_BUS.register( new PartPlacement() ); IGridCacheRegistry gcr = AEApi.instance().registries().gridCache(); diff --git a/core/crash/CrashEnhancement.java b/core/crash/CrashEnhancement.java index 13e41649b..864162d3a 100644 --- a/core/crash/CrashEnhancement.java +++ b/core/crash/CrashEnhancement.java @@ -9,8 +9,21 @@ public class CrashEnhancement implements ICrashCallable final CrashInfo Output; + final String ModVersion = AEConfig.CHANNEL + " " + AEConfig.VERSION + " for Forge " + // WHAT? + net.minecraftforge.common.ForgeVersion.majorVersion + "." // majorVersion + + net.minecraftforge.common.ForgeVersion.minorVersion + "." // minorVersion + + net.minecraftforge.common.ForgeVersion.revisionVersion + "." // revisionVersion + + net.minecraftforge.common.ForgeVersion.buildVersion; + + final String IntegrationInfo; + public CrashEnhancement(CrashInfo ci) { Output = ci; + + if ( IntegrationRegistry.instance != null ) + IntegrationInfo = IntegrationRegistry.instance.getStatus(); + else + IntegrationInfo = "N/A"; } @Override @@ -19,15 +32,9 @@ public class CrashEnhancement implements ICrashCallable switch (Output) { case MOD_VERSION: - return AEConfig.CHANNEL + " " + AEConfig.VERSION + " for Forge " - + net.minecraftforge.common.ForgeVersion.majorVersion + "." // majorVersion - + net.minecraftforge.common.ForgeVersion.minorVersion + "." // minorVersion - + net.minecraftforge.common.ForgeVersion.revisionVersion + "." // revisionVersion - + net.minecraftforge.common.ForgeVersion.buildVersion; + return ModVersion; case INTEGRATION: - if ( IntegrationRegistry.instance == null ) - return "N/A"; - return IntegrationRegistry.instance.getStatus(); + return IntegrationInfo; } return "UNKNOWN_VALUE"; diff --git a/core/sync/AppEngPacket.java b/core/sync/AppEngPacket.java index 9e4d6e955..68ce83b10 100644 --- a/core/sync/AppEngPacket.java +++ b/core/sync/AppEngPacket.java @@ -36,8 +36,8 @@ public abstract class AppEngPacket public FMLProxyPacket getProxy() { - if ( p.array().length > 30000 ) // 2k walking room :) - throw new IllegalArgumentException( "Sorry AE2 made a huge packet by accident!" ); + if ( p.array().length > 2 * 1024 * 1024 ) // 2k walking room :) + throw new IllegalArgumentException( "Sorry AE2 made a " + p.array().length + " byte packet by accident!" ); return new FMLProxyPacket( p, NetworkHandler.instance.getChannel() ); } diff --git a/core/sync/AppEngPacketHandlerBase.java b/core/sync/AppEngPacketHandlerBase.java index 984acf13a..ca4a7b0d8 100644 --- a/core/sync/AppEngPacketHandlerBase.java +++ b/core/sync/AppEngPacketHandlerBase.java @@ -20,6 +20,7 @@ import appeng.core.sync.packets.PacketMultiPart; import appeng.core.sync.packets.PacketNEIRecipe; import appeng.core.sync.packets.PacketNewStorageDimension; import appeng.core.sync.packets.PacketPartPlacement; +import appeng.core.sync.packets.PacketPartialItem; import appeng.core.sync.packets.PacketPatternSlot; import appeng.core.sync.packets.PacketProgressBar; import appeng.core.sync.packets.PacketSwapSlots; @@ -70,7 +71,9 @@ public class AppEngPacketHandlerBase PACKET_PATTERN_SLOT(PacketPatternSlot.class), - PACKET_RECIPE_NEI(PacketNEIRecipe.class); + PACKET_RECIPE_NEI(PacketNEIRecipe.class), + + PACKET_PARTIAL_ITEM(PacketPartialItem.class); final public Class pc; final public Constructor con; diff --git a/core/sync/packets/PacketInventoryAction.java b/core/sync/packets/PacketInventoryAction.java index 7cc42efc3..1588b015e 100644 --- a/core/sync/packets/PacketInventoryAction.java +++ b/core/sync/packets/PacketInventoryAction.java @@ -13,6 +13,7 @@ import appeng.container.AEBaseContainer; import appeng.core.sync.AppEngPacket; import appeng.core.sync.network.INetworkInfo; import appeng.helpers.InventoryAction; +import appeng.util.Platform; import appeng.util.item.AEItemStack; public class PacketInventoryAction extends AppEngPacket @@ -40,7 +41,7 @@ public class PacketInventoryAction extends AppEngPacket if ( sender.openContainer instanceof AEBaseContainer ) { AEBaseContainer aebc = (AEBaseContainer) sender.openContainer; - aebc.doAction( sender, action, slot, slotItem ); + aebc.doAction( sender, action, slot ); } } @@ -58,6 +59,10 @@ public class PacketInventoryAction extends AppEngPacket // api public PacketInventoryAction(InventoryAction action, int slot, IAEItemStack slotItem) throws IOException { + + if ( Platform.isClient() && slotItem != null ) + throw new RuntimeException( "invalid packet, client cannot post inv actions with stacks." ); + this.action = action; this.slot = slot; this.slotItem = slotItem; diff --git a/core/sync/packets/PacketMEInventoryUpdate.java b/core/sync/packets/PacketMEInventoryUpdate.java index 46b970e35..d4dda61cd 100644 --- a/core/sync/packets/PacketMEInventoryUpdate.java +++ b/core/sync/packets/PacketMEInventoryUpdate.java @@ -136,7 +136,7 @@ public class PacketMEInventoryUpdate extends AppEngPacket is.writeToPacket( tmp ); compressFrame.flush(); - if ( writtenBytes + tmp.readableBytes() > 30000 ) + if ( writtenBytes + tmp.readableBytes() > 2 * 1024 * 1024 ) // 2mb! throw new BufferOverflowException(); else { diff --git a/core/sync/packets/PacketPartialItem.java b/core/sync/packets/PacketPartialItem.java new file mode 100644 index 000000000..6c7b7536c --- /dev/null +++ b/core/sync/packets/PacketPartialItem.java @@ -0,0 +1,63 @@ +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 appeng.container.AEBaseContainer; +import appeng.core.sync.AppEngPacket; +import appeng.core.sync.network.INetworkInfo; + +public class PacketPartialItem extends AppEngPacket +{ + + short pageNum; + byte[] data; + + // automatic. + public PacketPartialItem(ByteBuf stream) throws IOException { + pageNum = stream.readShort(); + stream.readBytes( data = new byte[stream.readableBytes()] ); + } + + @Override + public void serverPacketData(INetworkInfo manager, AppEngPacket packet, EntityPlayer player) + { + if ( player.openContainer instanceof AEBaseContainer ) + { + ((AEBaseContainer) player.openContainer).postPartial( this ); + } + } + + // api + public PacketPartialItem(int page, int maxPages, byte[] buf) throws IOException { + + ByteBuf data = Unpooled.buffer(); + + pageNum = (short) (page | (maxPages << 8)); + this.data = buf; + data.writeInt( getPacketID() ); + data.writeShort( pageNum ); + data.writeBytes( buf ); + + configureWrite( data ); + } + + public int getPageCount() + { + return pageNum >> 8; + } + + public int getSize() + { + return data.length; + } + + public int write(byte[] buffer, int cursor) + { + System.arraycopy( data, 0, buffer, cursor, data.length ); + return cursor + data.length; + } +} diff --git a/facade/FacadeContainer.java b/facade/FacadeContainer.java index e088ff1f6..3be869e25 100644 --- a/facade/FacadeContainer.java +++ b/facade/FacadeContainer.java @@ -49,6 +49,8 @@ public class FacadeContainer implements IFacadeContainer { int facadeSides = out.readByte(); + boolean changed = false; + int ids[] = new int[2]; for (int x = 0; x < facades.length; x++) { @@ -64,6 +66,7 @@ public class FacadeContainer implements IFacadeContainer if ( isBC && AppEng.instance.isIntegrationEnabled( "BC" ) ) { IBC bc = (IBC) AppEng.instance.getIntegration( "BC" ); + changed = changed || facades[x] == null; facades[x] = bc.createFacadePart( (Block) Block.blockRegistry.getObjectById( ids[0] ), ids[1], side ); } else if ( !isBC ) @@ -71,13 +74,20 @@ public class FacadeContainer implements IFacadeContainer ItemFacade ifa = (ItemFacade) AEApi.instance().items().itemFacade.item(); ItemStack facade = ifa.createFromInts( ids ); if ( facade != null ) + { + changed = changed || facades[x] == null; facades[x] = ifa.createPartFromItemStack( facade, side ); + } } } else + { + changed = changed || facades[x] != null; facades[x] = null; + } } - return false; + + return changed; } public void readFromNBT(NBTTagCompound c) @@ -160,4 +170,20 @@ public class FacadeContainer implements IFacadeContainer return false; return true; } + + public void rotateLeft() + { + IFacadePart newfacades[] = new FacadePart[6]; + + newfacades[ForgeDirection.UP.ordinal()] = facades[ForgeDirection.UP.ordinal()]; + newfacades[ForgeDirection.DOWN.ordinal()] = facades[ForgeDirection.DOWN.ordinal()]; + + newfacades[ForgeDirection.EAST.ordinal()] = facades[ForgeDirection.NORTH.ordinal()]; + newfacades[ForgeDirection.SOUTH.ordinal()] = facades[ForgeDirection.EAST.ordinal()]; + newfacades[ForgeDirection.WEST.ordinal()] = facades[ForgeDirection.SOUTH.ordinal()]; + newfacades[ForgeDirection.NORTH.ordinal()] = facades[ForgeDirection.WEST.ordinal()]; + + for (int x = 0; x < facades.length; x++) + facades[x] = newfacades[x]; + } } diff --git a/helpers/InventoryAction.java b/helpers/InventoryAction.java index 8c958dc37..6dc6e6181 100644 --- a/helpers/InventoryAction.java +++ b/helpers/InventoryAction.java @@ -9,5 +9,5 @@ public enum InventoryAction CRAFT_STACK, CRAFT_ITEM, CRAFT_SHIFT, // extra... - MOVE_REGION, PICKUP_SINGLE, UPDATE_HAND + MOVE_REGION, PICKUP_SINGLE, UPDATE_HAND, ROLLUP, ROLLDOWN } diff --git a/helpers/PlayerSecuirtyWrapper.java b/helpers/PlayerSecuirtyWrapper.java new file mode 100644 index 000000000..da31fd794 --- /dev/null +++ b/helpers/PlayerSecuirtyWrapper.java @@ -0,0 +1,23 @@ +package appeng.helpers; + +import java.util.EnumSet; +import java.util.HashMap; + +import appeng.api.config.SecurityPermissions; +import appeng.api.networking.security.ISecurityRegister; + +public class PlayerSecuirtyWrapper implements ISecurityRegister +{ + + final HashMap> target; + + public PlayerSecuirtyWrapper(HashMap> playerPerms) { + target = playerPerms; + } + + @Override + public void addPlayer(int PlayerID, EnumSet permissions) + { + target.put( PlayerID, permissions ); + } +} diff --git a/hooks/TickHandler.java b/hooks/TickHandler.java index eeb433815..8d3bdfc49 100644 --- a/hooks/TickHandler.java +++ b/hooks/TickHandler.java @@ -5,6 +5,7 @@ import java.util.LinkedList; import java.util.Queue; import java.util.concurrent.Callable; +import net.minecraftforge.event.world.ChunkEvent; import net.minecraftforge.event.world.WorldEvent; import appeng.api.networking.IGridNode; import appeng.core.AELog; @@ -103,10 +104,23 @@ public class TickHandler } } + @SubscribeEvent + public void onChunkLoad(ChunkEvent.Load load) + { + for (Object te : load.getChunk().chunkTileEntityMap.values()) + { + if ( te instanceof AEBaseTile ) + { + ((AEBaseTile) te).onChunkLoad(); + } + } + } + @SubscribeEvent public void onTick(TickEvent ev) { - if ( ev.type == Type.SERVER && ev.phase == Phase.END ) // for no there is no reason to care about this on the client... + if ( ev.type == Type.SERVER && ev.phase == Phase.END ) // for no there is no reason to care about this on the + // client... { HandlerRep repo = getRepo(); while (!repo.tiles.isEmpty()) diff --git a/integration/abstraction/IMJ.java b/integration/abstraction/IMJ.java deleted file mode 100644 index 732ab9387..000000000 --- a/integration/abstraction/IMJ.java +++ /dev/null @@ -1,10 +0,0 @@ -package appeng.integration.abstraction; - -import appeng.tile.powersink.MinecraftJoules; - -public interface IMJ -{ - - Object createPerdition(MinecraftJoules buildCraft); - -} diff --git a/integration/abstraction/IMJ5.java b/integration/abstraction/IMJ5.java new file mode 100644 index 000000000..fff281a59 --- /dev/null +++ b/integration/abstraction/IMJ5.java @@ -0,0 +1,9 @@ +package appeng.integration.abstraction; + + +public interface IMJ5 +{ + + Object createPerdition(Object buildCraft); + +} diff --git a/integration/abstraction/IMJ6.java b/integration/abstraction/IMJ6.java new file mode 100644 index 000000000..4ed7cb132 --- /dev/null +++ b/integration/abstraction/IMJ6.java @@ -0,0 +1,7 @@ +package appeng.integration.abstraction; + + +public interface IMJ6 +{ + +} diff --git a/integration/abstraction/helpers/BaseMJperdition.java b/integration/abstraction/helpers/BaseMJperdition.java index 3d6d04bfc..d7199f7dd 100644 --- a/integration/abstraction/helpers/BaseMJperdition.java +++ b/integration/abstraction/helpers/BaseMJperdition.java @@ -12,10 +12,10 @@ public abstract class BaseMJperdition extends AETileEventHandler super( TileEventType.TICK, TileEventType.WORLD_NBT ); } - @Method(iname = "MJ") + @Method(iname = "MJ5") public abstract PowerReceiver getPowerReceiver(); - public abstract double useEnergy(float f, float requred, boolean b); + public abstract double useEnergy(double f, double requred, boolean b); public abstract void addEnergy(float failed); diff --git a/integration/modules/BC.java b/integration/modules/BC.java index 54c16083e..79ba13d55 100644 --- a/integration/modules/BC.java +++ b/integration/modules/BC.java @@ -1,5 +1,7 @@ package appeng.integration.modules; +import java.lang.reflect.Field; + import net.minecraft.block.Block; import net.minecraft.entity.player.EntityPlayer; import net.minecraft.item.Item; @@ -12,12 +14,19 @@ import appeng.api.config.TunnelType; import appeng.api.definitions.Blocks; import appeng.api.features.IP2PTunnelRegistry; import appeng.api.parts.IFacadePart; +import appeng.api.util.AEItemDefinition; +import appeng.api.util.IOrientableBlock; +import appeng.core.AppEng; import appeng.facade.FacadePart; import appeng.integration.BaseModule; import appeng.integration.abstraction.IBC; -import appeng.integration.modules.helpers.BCPipeHandler; +import appeng.integration.modules.BCHelpers.AECableSchematicTile; +import appeng.integration.modules.BCHelpers.AEGenericSchematicTile; +import appeng.integration.modules.BCHelpers.AERotateableBlockSchematic; +import appeng.integration.modules.BCHelpers.BCPipeHandler; import buildcraft.BuildCraftEnergy; import buildcraft.BuildCraftTransport; +import buildcraft.api.blueprints.SchematicRegistry; import buildcraft.api.tools.IToolWrench; import buildcraft.api.transport.IPipeConnection; import buildcraft.api.transport.IPipeTile; @@ -109,7 +118,15 @@ public class BC extends BaseModule implements IBC { if ( is == null ) return false; - return is.getItem() instanceof ItemFacade; + + try + { + return is.getItem() instanceof ItemFacade && ItemFacade.getType( is ) == ItemFacade.TYPE_BASIC; + } + catch (Throwable t) + { + return is.getItem() instanceof ItemFacade; + } } @Override @@ -189,7 +206,16 @@ public class BC extends BaseModule implements IBC addFacade( b.blockQuartz.stack( 1 ) ); addFacade( b.blockQuartzChiseled.stack( 1 ) ); addFacade( b.blockQuartzPiller.stack( 1 ) ); - + + try + { + initBuilderSupport(); + } + catch (Throwable builderSupport) + { + // not supported? + } + Block skyStone = b.blockSkyStone.block(); if ( skyStone != null ) { @@ -200,6 +226,42 @@ public class BC extends BaseModule implements IBC } } + private void initBuilderSupport() + { + SchematicRegistry.declareBlueprintSupport( AppEng.modid ); + + Blocks blks = AEApi.instance().blocks(); + Block cable = blks.blockMultiPart.block(); + for (Field f : blks.getClass().getFields()) + { + AEItemDefinition def; + try + { + def = (AEItemDefinition) f.get( blks ); + if ( def != null ) + { + Block myBlock = def.block(); + if ( myBlock instanceof IOrientableBlock && ((IOrientableBlock) myBlock).usesMetadata() && def.entity() == null ) + { + SchematicRegistry.registerSchematicBlock( myBlock, AERotateableBlockSchematic.class ); + } + else if ( myBlock == cable ) + { + SchematicRegistry.registerSchematicBlock( myBlock, AECableSchematicTile.class ); + } + else if ( def.entity() != null ) + { + SchematicRegistry.registerSchematicBlock( myBlock, AEGenericSchematicTile.class ); + } + } + } + catch (Throwable t) + { + // :P + } + } + } + @Override public void PostInit() { @@ -211,8 +273,27 @@ public class BC extends BaseModule implements IBC @Override public IFacadePart createFacadePart(Block blk, int meta, ForgeDirection side) { - ItemStack fs = ItemFacade.getStack( blk, meta ); - return new FacadePart( fs, side ); + try + { + ItemStack fs = ItemFacade.getFacade( blk, meta ); + return new FacadePart( fs, side ); + } + catch (Throwable t) + { + + } + + try + { + ItemStack fs = ItemFacade.getStack( blk, meta ); + return new FacadePart( fs, side ); + } + catch (Throwable t) + { + + } + + return null; } @Override @@ -224,8 +305,31 @@ public class BC extends BaseModule implements IBC @Override public ItemStack getTextureForFacade(ItemStack facade) { - Block blk = ItemFacade.getBlock( facade ); - return new ItemStack( blk, 1, ItemFacade.getMetaData( facade ) ); + try + { + Block blk[] = ItemFacade.getBlocks( facade ); + int meta[] = ItemFacade.getMetaValues( facade ); + if ( blk == null || blk.length < 1 ) + return null; + + return new ItemStack( blk[0], 1, meta[0] ); + } + catch (Throwable t) + { + + } + + try + { + Block blk = ItemFacade.getBlock( facade ); + return new ItemStack( blk, 1, ItemFacade.getMetaData( facade ) ); + } + catch (Throwable t) + { + + } + + return null; } @Override diff --git a/integration/modules/BCHelpers/AECableSchematicTile.java b/integration/modules/BCHelpers/AECableSchematicTile.java new file mode 100644 index 000000000..c369f1dc5 --- /dev/null +++ b/integration/modules/BCHelpers/AECableSchematicTile.java @@ -0,0 +1,143 @@ +package appeng.integration.modules.BCHelpers; + +import java.util.Set; + +import net.minecraft.entity.player.EntityPlayer; +import net.minecraft.item.ItemStack; +import net.minecraft.nbt.NBTTagCompound; +import net.minecraft.tileentity.TileEntity; +import net.minecraft.util.Vec3; +import net.minecraftforge.common.util.ForgeDirection; +import appeng.api.parts.IFacadeContainer; +import appeng.api.parts.IPart; +import appeng.api.parts.IPartHost; +import appeng.api.parts.LayerFlags; +import appeng.api.parts.SelectedPart; +import appeng.api.util.AEColor; +import appeng.api.util.DimensionalCoord; +import appeng.parts.CableBusContainer; +import buildcraft.api.blueprints.IBuilderContext; + +public class AECableSchematicTile extends AEGenericSchematicTile implements IPartHost +{ + + @Override + public void rotateLeft(IBuilderContext context) + { + CableBusContainer cbc = new CableBusContainer( this ); + cbc.readFromNBT( tileNBT ); + + cbc.rotateLeft(); + + tileNBT = new NBTTagCompound(); + cbc.writeToNBT( tileNBT ); + } + + @Override + public IFacadeContainer getFacadeContainer() + { + return null; + } + + @Override + public boolean canAddPart(ItemStack part, ForgeDirection side) + { + return false; + } + + @Override + public ForgeDirection addPart(ItemStack is, ForgeDirection side, EntityPlayer owner) + { + return null; + } + + @Override + public IPart getPart(ForgeDirection side) + { + return null; + } + + @Override + public void removePart(ForgeDirection side, boolean suppressUpdate) + { + + } + + @Override + public void markForUpdate() + { + + } + + @Override + public DimensionalCoord getLocation() + { + return null; + } + + @Override + public TileEntity getTile() + { + return null; + } + + @Override + public AEColor getColor() + { + return null; + } + + @Override + public void clearContainer() + { + + } + + @Override + public boolean isBlocked(ForgeDirection side) + { + return false; + } + + @Override + public SelectedPart selectPart(Vec3 pos) + { + return null; + } + + @Override + public void markForSave() + { + + } + + @Override + public void partChanged() + { + + } + + @Override + public boolean hasRedstone(ForgeDirection side) + { + return false; + } + + @Override + public boolean isEmpty() + { + return false; + } + + @Override + public Set getLayerFlags() + { + return null; + } + + @Override + public void cleanup() + { + + } +} diff --git a/integration/modules/BCHelpers/AEGenericSchematicTile.java b/integration/modules/BCHelpers/AEGenericSchematicTile.java new file mode 100644 index 000000000..e5cd279ba --- /dev/null +++ b/integration/modules/BCHelpers/AEGenericSchematicTile.java @@ -0,0 +1,59 @@ +package appeng.integration.modules.BCHelpers; + +import java.util.ArrayList; + +import net.minecraft.item.ItemStack; +import net.minecraft.tileentity.TileEntity; +import net.minecraftforge.common.util.ForgeDirection; +import appeng.tile.AEBaseTile; +import appeng.util.Platform; +import buildcraft.api.blueprints.IBuilderContext; +import buildcraft.api.blueprints.SchematicTile; + +public class AEGenericSchematicTile extends SchematicTile +{ + + @Override + public void writeRequirementsToBlueprint(IBuilderContext context, int x, int y, int z) + { + TileEntity tile = context.world().getTileEntity( x, y, z ); + ArrayList list = new ArrayList(); + if ( tile instanceof AEBaseTile ) + { + AEBaseTile tcb = (AEBaseTile) tile; + tcb.getDrops( tile.getWorldObj(), tile.xCoord, tile.yCoord, tile.zCoord, list ); + } + + storedRequirements = list.toArray( new ItemStack[list.size()] ); + } + + @Override + public void rotateLeft(IBuilderContext context) + { + if ( tileNBT.hasKey( "orientation_forward" ) && tileNBT.hasKey( "orientation_up" ) ) + { + String forward = tileNBT.getString( "orientation_forward" ); + String up = tileNBT.getString( "orientation_up" ); + + if ( forward != null && up != null ) + { + try + { + ForgeDirection fdForward = ForgeDirection.valueOf( forward ); + ForgeDirection fdUp = ForgeDirection.valueOf( up ); + + fdForward = Platform.rotateAround( fdForward, ForgeDirection.DOWN ); + fdUp = Platform.rotateAround( fdUp, ForgeDirection.DOWN ); + + tileNBT.setString( "orientation_forward", fdForward.name() ); + tileNBT.setString( "orientation_up", fdUp.name() ); + } + catch (Throwable t) + { + + } + } + } + } + +} diff --git a/integration/modules/BCHelpers/AERotateableBlockSchematic.java b/integration/modules/BCHelpers/AERotateableBlockSchematic.java new file mode 100644 index 000000000..76b79d64a --- /dev/null +++ b/integration/modules/BCHelpers/AERotateableBlockSchematic.java @@ -0,0 +1,21 @@ +package appeng.integration.modules.BCHelpers; + +import net.minecraftforge.common.util.ForgeDirection; +import appeng.util.Platform; +import buildcraft.api.blueprints.IBuilderContext; +import buildcraft.api.blueprints.SchematicBlock; + +public class AERotateableBlockSchematic extends SchematicBlock +{ + + @Override + public void rotateLeft(IBuilderContext context) + { + if ( meta < 6 ) + { + ForgeDirection d = Platform.rotateAround( ForgeDirection.values()[meta], ForgeDirection.DOWN ); + meta = d.ordinal(); + } + } + +} diff --git a/integration/modules/helpers/BCPipeHandler.java b/integration/modules/BCHelpers/BCPipeHandler.java similarity index 94% rename from integration/modules/helpers/BCPipeHandler.java rename to integration/modules/BCHelpers/BCPipeHandler.java index 07296841a..4d4a76e22 100644 --- a/integration/modules/helpers/BCPipeHandler.java +++ b/integration/modules/BCHelpers/BCPipeHandler.java @@ -1,4 +1,4 @@ -package appeng.integration.modules.helpers; +package appeng.integration.modules.BCHelpers; import net.minecraft.tileentity.TileEntity; import net.minecraftforge.common.util.ForgeDirection; diff --git a/integration/modules/helpers/BCPipeInventory.java b/integration/modules/BCHelpers/BCPipeInventory.java similarity index 96% rename from integration/modules/helpers/BCPipeInventory.java rename to integration/modules/BCHelpers/BCPipeInventory.java index b16af7165..a2bd0f9db 100644 --- a/integration/modules/helpers/BCPipeInventory.java +++ b/integration/modules/BCHelpers/BCPipeInventory.java @@ -1,4 +1,4 @@ -package appeng.integration.modules.helpers; +package appeng.integration.modules.BCHelpers; import net.minecraft.tileentity.TileEntity; import net.minecraftforge.common.util.ForgeDirection; diff --git a/integration/modules/MJ.java b/integration/modules/MJ5.java similarity index 59% rename from integration/modules/MJ.java rename to integration/modules/MJ5.java index f9d0b7ece..fa86e19b7 100644 --- a/integration/modules/MJ.java +++ b/integration/modules/MJ5.java @@ -1,36 +1,37 @@ package appeng.integration.modules; import appeng.integration.BaseModule; -import appeng.integration.abstraction.IMJ; +import appeng.integration.abstraction.IMJ5; import appeng.integration.modules.helpers.MJPerdition; -import appeng.tile.powersink.MinecraftJoules; import buildcraft.api.power.IPowerReceptor; -public class MJ extends BaseModule implements IMJ +public class MJ5 extends BaseModule implements IMJ5 { - public static MJ instance; + public static MJ5 instance; - public MJ() { + public MJ5() { TestClass( IPowerReceptor.class ); } @Override - public Object createPerdition(MinecraftJoules buildCraft) + public Object createPerdition(Object buildCraft) { if ( buildCraft instanceof IPowerReceptor ) - return new MJPerdition( buildCraft ); + return new MJPerdition( (IPowerReceptor) buildCraft ); return null; } @Override public void Init() throws Throwable { + } @Override public void PostInit() throws Throwable { + } } diff --git a/integration/modules/MJ6.java b/integration/modules/MJ6.java new file mode 100644 index 000000000..e47c38ee7 --- /dev/null +++ b/integration/modules/MJ6.java @@ -0,0 +1,31 @@ +package appeng.integration.modules; + +import appeng.integration.BaseModule; +import appeng.integration.abstraction.IMJ6; +import buildcraft.api.mj.IBatteryObject; +import buildcraft.api.mj.IBatteryProvider; +import buildcraft.api.mj.ISidedBatteryProvider; + +public class MJ6 extends BaseModule implements IMJ6 +{ + + public static MJ6 instance; + + public MJ6() { + TestClass( IBatteryObject.class ); + TestClass( IBatteryProvider.class ); + TestClass( ISidedBatteryProvider.class ); + throw new RuntimeException( "Disabled For Now!" ); + } + + @Override + public void Init() throws Throwable + { + } + + @Override + public void PostInit() throws Throwable + { + } + +} diff --git a/integration/modules/NEI.java b/integration/modules/NEI.java index 1d4413631..93d1e297b 100644 --- a/integration/modules/NEI.java +++ b/integration/modules/NEI.java @@ -12,12 +12,12 @@ import net.minecraft.item.ItemStack; import appeng.client.gui.implementations.GuiCraftingTerm; import appeng.integration.IIntegrationModule; import appeng.integration.abstraction.INEI; -import appeng.integration.modules.helpers.NEIAEShapedRecipeHandler; -import appeng.integration.modules.helpers.NEIAEShapelessRecipeHandler; -import appeng.integration.modules.helpers.NEICraftingHandler; -import appeng.integration.modules.helpers.NEIGrinderRecipeHandler; -import appeng.integration.modules.helpers.NEIInscriberRecipeHandler; -import appeng.integration.modules.helpers.NEIWorldCraftingHandler; +import appeng.integration.modules.NEIHelpers.NEIAEShapedRecipeHandler; +import appeng.integration.modules.NEIHelpers.NEIAEShapelessRecipeHandler; +import appeng.integration.modules.NEIHelpers.NEICraftingHandler; +import appeng.integration.modules.NEIHelpers.NEIGrinderRecipeHandler; +import appeng.integration.modules.NEIHelpers.NEIInscriberRecipeHandler; +import appeng.integration.modules.NEIHelpers.NEIWorldCraftingHandler; import codechicken.nei.guihook.GuiContainerManager; public class NEI implements IIntegrationModule, INEI diff --git a/integration/modules/helpers/NEIAEShapedRecipeHandler.java b/integration/modules/NEIHelpers/NEIAEShapedRecipeHandler.java similarity index 99% rename from integration/modules/helpers/NEIAEShapedRecipeHandler.java rename to integration/modules/NEIHelpers/NEIAEShapedRecipeHandler.java index ab3621074..6505f1bfa 100644 --- a/integration/modules/helpers/NEIAEShapedRecipeHandler.java +++ b/integration/modules/NEIHelpers/NEIAEShapedRecipeHandler.java @@ -1,4 +1,4 @@ -package appeng.integration.modules.helpers; +package appeng.integration.modules.NEIHelpers; import java.awt.Rectangle; import java.util.ArrayList; diff --git a/integration/modules/helpers/NEIAEShapelessRecipeHandler.java b/integration/modules/NEIHelpers/NEIAEShapelessRecipeHandler.java similarity index 99% rename from integration/modules/helpers/NEIAEShapelessRecipeHandler.java rename to integration/modules/NEIHelpers/NEIAEShapelessRecipeHandler.java index b8f81830d..4d36a41b2 100644 --- a/integration/modules/helpers/NEIAEShapelessRecipeHandler.java +++ b/integration/modules/NEIHelpers/NEIAEShapelessRecipeHandler.java @@ -1,4 +1,4 @@ -package appeng.integration.modules.helpers; +package appeng.integration.modules.NEIHelpers; import java.awt.Rectangle; import java.util.ArrayList; diff --git a/integration/modules/helpers/NEICraftingHandler.java b/integration/modules/NEIHelpers/NEICraftingHandler.java similarity index 97% rename from integration/modules/helpers/NEICraftingHandler.java rename to integration/modules/NEIHelpers/NEICraftingHandler.java index 58a712335..4c65669c2 100644 --- a/integration/modules/helpers/NEICraftingHandler.java +++ b/integration/modules/NEIHelpers/NEICraftingHandler.java @@ -1,4 +1,4 @@ -package appeng.integration.modules.helpers; +package appeng.integration.modules.NEIHelpers; import java.util.List; diff --git a/integration/modules/helpers/NEIGrinderRecipeHandler.java b/integration/modules/NEIHelpers/NEIGrinderRecipeHandler.java similarity index 99% rename from integration/modules/helpers/NEIGrinderRecipeHandler.java rename to integration/modules/NEIHelpers/NEIGrinderRecipeHandler.java index 79235d2b2..b5789d57e 100644 --- a/integration/modules/helpers/NEIGrinderRecipeHandler.java +++ b/integration/modules/NEIHelpers/NEIGrinderRecipeHandler.java @@ -1,4 +1,4 @@ -package appeng.integration.modules.helpers; +package appeng.integration.modules.NEIHelpers; import static codechicken.lib.gui.GuiDraw.changeTexture; import static codechicken.lib.gui.GuiDraw.drawTexturedModalRect; diff --git a/integration/modules/helpers/NEIInscriberRecipeHandler.java b/integration/modules/NEIHelpers/NEIInscriberRecipeHandler.java similarity index 98% rename from integration/modules/helpers/NEIInscriberRecipeHandler.java rename to integration/modules/NEIHelpers/NEIInscriberRecipeHandler.java index 497320670..586a19ee1 100644 --- a/integration/modules/helpers/NEIInscriberRecipeHandler.java +++ b/integration/modules/NEIHelpers/NEIInscriberRecipeHandler.java @@ -1,4 +1,4 @@ -package appeng.integration.modules.helpers; +package appeng.integration.modules.NEIHelpers; import static codechicken.lib.gui.GuiDraw.changeTexture; import static codechicken.lib.gui.GuiDraw.drawTexturedModalRect; diff --git a/integration/modules/helpers/NEIWorldCraftingHandler.java b/integration/modules/NEIHelpers/NEIWorldCraftingHandler.java similarity index 99% rename from integration/modules/helpers/NEIWorldCraftingHandler.java rename to integration/modules/NEIHelpers/NEIWorldCraftingHandler.java index ed9f71293..332f7634a 100644 --- a/integration/modules/helpers/NEIWorldCraftingHandler.java +++ b/integration/modules/NEIHelpers/NEIWorldCraftingHandler.java @@ -1,4 +1,4 @@ -package appeng.integration.modules.helpers; +package appeng.integration.modules.NEIHelpers; import java.util.ArrayList; import java.util.HashMap; diff --git a/integration/modules/helpers/MJBattery.java b/integration/modules/helpers/MJBattery.java new file mode 100644 index 000000000..62c72f7e6 --- /dev/null +++ b/integration/modules/helpers/MJBattery.java @@ -0,0 +1,7 @@ +package appeng.integration.modules.helpers; + + +public class MJBattery +{ + +} diff --git a/integration/modules/helpers/MJPerdition.java b/integration/modules/helpers/MJPerdition.java index 7102c31d6..a527bcb28 100644 --- a/integration/modules/helpers/MJPerdition.java +++ b/integration/modules/helpers/MJPerdition.java @@ -41,7 +41,7 @@ public class MJPerdition extends BaseMJperdition } @Override - public double useEnergy(float min, float max, boolean doUse) + public double useEnergy(double min, double max, boolean doUse) { return bcPowerHandler.useEnergy( min, max, doUse ); } diff --git a/items/parts/ItemFacade.java b/items/parts/ItemFacade.java index 7ce29ec09..2753c69eb 100644 --- a/items/parts/ItemFacade.java +++ b/items/parts/ItemFacade.java @@ -27,6 +27,8 @@ import appeng.facade.FacadePart; import appeng.facade.IFacadeItem; import appeng.items.AEBaseItem; import appeng.util.Platform; +import cpw.mods.fml.common.registry.GameRegistry; +import cpw.mods.fml.common.registry.GameRegistry.UniqueIdentifier; import cpw.mods.fml.relauncher.Side; import cpw.mods.fml.relauncher.SideOnly; @@ -158,6 +160,9 @@ public class ItemFacade extends AEBaseItem implements IFacadeItem, IAlphaPassIte ds[0] = Item.getIdFromItem( l.getItem() ); ds[1] = metadata; data.setIntArray( "x", ds ); + UniqueIdentifier ui = GameRegistry.findUniqueIdentifierFor( l.getItem() ); + data.setString( "modid", ui.modId ); + data.setString( "itemname", ui.name ); is.setTagCompound( data ); return is; } @@ -170,9 +175,16 @@ public class ItemFacade extends AEBaseItem implements IFacadeItem, IAlphaPassIte NBTTagCompound data = is.getTagCompound(); if ( data != null ) { - int[] blk = data.getIntArray( "x" ); - if ( blk != null && blk.length == 2 ) - return Block.getBlockById( blk[0] ); + if ( data.hasKey( "modid" ) && data.hasKey( "itemname" ) ) + { + return GameRegistry.findBlock( data.getString( "modid" ), data.getString( "itemname" ) ); + } + else + { + int[] blk = data.getIntArray( "x" ); + if ( blk != null && blk.length == 2 ) + return Block.getBlockById( blk[0] ); + } } return Blocks.glass; } @@ -213,9 +225,14 @@ public class ItemFacade extends AEBaseItem implements IFacadeItem, IAlphaPassIte public boolean useAlphaPass(ItemStack is) { ItemStack out = getTextureItem( is ); + + if ( out == null || out.getItem() == null ) + return false; + Block blk = Block.getBlockFromItem( out.getItem() ); if ( blk != null && blk.canRenderInPass( 1 ) ) return true; + return false; } diff --git a/items/tools/ToolBiometricCard.java b/items/tools/ToolBiometricCard.java index d34a74893..3690e71aa 100644 --- a/items/tools/ToolBiometricCard.java +++ b/items/tools/ToolBiometricCard.java @@ -10,7 +10,9 @@ import net.minecraft.nbt.NBTTagCompound; import net.minecraft.world.World; import net.minecraftforge.client.MinecraftForgeClient; import appeng.api.config.SecurityPermissions; +import appeng.api.features.IPlayerRegistry; import appeng.api.implementations.items.IBiometricCard; +import appeng.api.networking.security.ISecurityRegister; import appeng.client.render.items.ToolBiometricCardRender; import appeng.core.features.AEFeature; import appeng.core.localization.GuiText; @@ -148,4 +150,9 @@ public class ToolBiometricCard extends AEBaseItem implements IBiometricCard tag.setBoolean( permission.name(), true ); } + @Override + public void registerPermissions(ISecurityRegister register, IPlayerRegistry pr, ItemStack is) + { + register.addPlayer( pr.getID( getUsername( is ) ), getPermissions( is ) ); + } } diff --git a/me/cache/SecurityCache.java b/me/cache/SecurityCache.java index 6b61023a0..ffa3e079e 100644 --- a/me/cache/SecurityCache.java +++ b/me/cache/SecurityCache.java @@ -15,14 +15,14 @@ import appeng.api.networking.IGridStorage; import appeng.api.networking.events.MENetworkEventSubscribe; import appeng.api.networking.events.MENetworkSecurityChange; import appeng.api.networking.security.ISecurityGrid; +import appeng.api.networking.security.ISecurityProvider; import appeng.core.WorldSettings; import appeng.me.GridNode; -import appeng.tile.misc.TileSecurity; public class SecurityCache implements IGridCache, ISecurityGrid { - private List securityProvider = new ArrayList(); + private List securityProvider = new ArrayList(); private HashMap> playerPerms = new HashMap>(); public SecurityCache(IGrid g) { @@ -84,7 +84,7 @@ public class SecurityCache implements IGridCache, ISecurityGrid long lastCode = securityKey; if ( securityProvider.size() == 1 ) - securityKey = securityProvider.get( 0 ).securityKey; + securityKey = securityProvider.get( 0 ).getSecurityKey(); else securityKey = -1; @@ -99,9 +99,9 @@ public class SecurityCache implements IGridCache, ISecurityGrid @Override public void removeNode(IGridNode gridNode, IGridHost machine) { - if ( machine instanceof TileSecurity ) + if ( machine instanceof ISecurityProvider ) { - securityProvider.remove( (TileSecurity) machine ); + securityProvider.remove( (ISecurityProvider) machine ); updateSecurityKey(); } } @@ -109,9 +109,9 @@ public class SecurityCache implements IGridCache, ISecurityGrid @Override public void addNode(IGridNode gridNode, IGridHost machine) { - if ( machine instanceof TileSecurity ) + if ( machine instanceof ISecurityProvider ) { - securityProvider.add( (TileSecurity) machine ); + securityProvider.add( (ISecurityProvider) machine ); updateSecurityKey(); } else diff --git a/me/cache/TickManagerCache.java b/me/cache/TickManagerCache.java index 3103ecfda..314bc66a2 100644 --- a/me/cache/TickManagerCache.java +++ b/me/cache/TickManagerCache.java @@ -3,7 +3,6 @@ package appeng.me.cache; import java.util.HashMap; import java.util.PriorityQueue; -import net.minecraft.tileentity.TileEntity; import appeng.api.networking.IGrid; import appeng.api.networking.IGridHost; import appeng.api.networking.IGridNode; @@ -12,7 +11,6 @@ import appeng.api.networking.ticking.IGridTickable; import appeng.api.networking.ticking.ITickManager; import appeng.api.networking.ticking.TickRateModulation; import appeng.api.networking.ticking.TickingRequest; -import appeng.core.AELog; import appeng.me.cache.helpers.TickTracker; public class TickManagerCache implements ITickManager @@ -170,9 +168,6 @@ public class TickManagerCache implements ITickManager TickingRequest tr = ((IGridTickable) machine).getTickingRequest( gridNode ); if ( tr != null ) { - if ( machine instanceof TileEntity && ((TileEntity) machine).canUpdate() ) - AELog.warning( "Tile: " + machine.getClass().getName() + " - reports to use MC ticking, but also requests Network Based Ticking." ); - TickTracker tt = new TickTracker( tr, gridNode, (IGridTickable) machine, currentTick, this ); if ( tr.canBeAlerted ) diff --git a/parts/CableBusContainer.java b/parts/CableBusContainer.java index dcce990b0..e3d512f33 100644 --- a/parts/CableBusContainer.java +++ b/parts/CableBusContainer.java @@ -79,6 +79,23 @@ public class CableBusContainer implements AEMultiTile, ICableBusContainer return sides[side.ordinal()]; } + public void rotateLeft() + { + IPart newSides[] = new IPart[6]; + + newSides[ForgeDirection.UP.ordinal()] = sides[ForgeDirection.UP.ordinal()]; + newSides[ForgeDirection.DOWN.ordinal()] = sides[ForgeDirection.DOWN.ordinal()]; + + newSides[ForgeDirection.EAST.ordinal()] = sides[ForgeDirection.NORTH.ordinal()]; + newSides[ForgeDirection.SOUTH.ordinal()] = sides[ForgeDirection.EAST.ordinal()]; + newSides[ForgeDirection.WEST.ordinal()] = sides[ForgeDirection.SOUTH.ordinal()]; + newSides[ForgeDirection.NORTH.ordinal()] = sides[ForgeDirection.WEST.ordinal()]; + + sides = newSides; + + fc.rotateLeft(); + } + public void updateDynamicRender() { requiresDynamicRender = false; diff --git a/parts/p2p/PartP2PBCPower.java b/parts/p2p/PartP2PBCPower.java index fd5db110d..835f1b8b3 100644 --- a/parts/p2p/PartP2PBCPower.java +++ b/parts/p2p/PartP2PBCPower.java @@ -15,9 +15,16 @@ import appeng.api.networking.ticking.TickRateModulation; import appeng.api.networking.ticking.TickingRequest; import appeng.core.AppEng; import appeng.core.settings.TickRates; +import appeng.integration.abstraction.IMJ5; +import appeng.integration.abstraction.helpers.BaseMJperdition; import appeng.me.GridAccessException; import appeng.me.cache.helpers.TunnelCollection; import appeng.transformer.annotations.integration.Interface; +import appeng.transformer.annotations.integration.InterfaceList; +import appeng.transformer.annotations.integration.Method; +import buildcraft.api.mj.IBatteryObject; +import buildcraft.api.mj.ISidedBatteryProvider; +import buildcraft.api.mj.MjAPI; import buildcraft.api.power.IPowerReceptor; import buildcraft.api.power.PowerHandler; import buildcraft.api.power.PowerHandler.PowerReceiver; @@ -25,11 +32,13 @@ import buildcraft.api.power.PowerHandler.Type; import cpw.mods.fml.relauncher.Side; import cpw.mods.fml.relauncher.SideOnly; -@Interface(iface = "buildcraft.api.power.IPowerReceptor", iname = "BC") -public class PartP2PBCPower extends PartP2PTunnel implements IPowerReceptor, IGridTickable +@InterfaceList(value = { @Interface(iface = "buildcraft.api.mj.ISidedBatteryProvider", iname = "MJ6"), + @Interface(iface = "buildcraft.api.mj.IBatteryObject", iname = "MJ6"), @Interface(iface = "buildcraft.api.power.IPowerReceptor", iname = "MJ5"), + @Interface(iface = "appeng.api.networking.ticking.IGridTickable", iname = "MJ5") }) +public class PartP2PBCPower extends PartP2PTunnel implements IPowerReceptor, ISidedBatteryProvider, IBatteryObject, IGridTickable { - PowerHandler pp; + BaseMJperdition pp; public TunnelType getTunnelType() { @@ -39,20 +48,26 @@ public class PartP2PBCPower extends PartP2PTunnel implements IPo public PartP2PBCPower(ItemStack is) { super( is ); - if ( !AppEng.instance.isIntegrationEnabled( "MJ" ) ) + if ( !AppEng.instance.isIntegrationEnabled( "MJ5" ) && !AppEng.instance.isIntegrationEnabled( "MJ6" ) ) throw new RuntimeException( "MJ Not installed!" ); - pp = new PowerHandler( this, Type.MACHINE ); - pp.configure( 1f, 320f, 800f, 640f ); + if ( AppEng.instance.isIntegrationEnabled( "MJ5" ) ) + { + pp = (BaseMJperdition) ((IMJ5) AppEng.instance.getIntegration( "MJ5" )).createPerdition( this ); + if ( pp != null ) + pp.configure( 1, 380, 1.0f / 5.0f, 1000 ); + } } @Override + @Method(iname = "MJ5") public TickingRequest getTickingRequest(IGridNode node) { return new TickingRequest( TickRates.MJTunnel.min, TickRates.MJTunnel.max, false, false ); } @Override + @Method(iname = "MJ5") public TickRateModulation tickingRequest(IGridNode node, int TicksSinceLastCall) { if ( !output && proxy.isActive() ) @@ -93,7 +108,7 @@ public class PartP2PBCPower extends PartP2PTunnel implements IPo if ( totalRequiredPower < 0.1 ) return TickRateModulation.SLOWER; - double currentTotal = pp.getEnergyStored(); + double currentTotal = pp.getPowerReceiver().getEnergyStored(); if ( currentTotal < 0.01 ) return TickRateModulation.SLOWER; @@ -105,8 +120,8 @@ public class PartP2PBCPower extends PartP2PTunnel implements IPo PowerReceiver tp = target.getPowerReceiver( side.getOpposite() ); if ( tp != null ) { - double howmuch = tp.powerRequest(); // orientation.getOpposite() - // ); + double howmuch = tp.powerRequest(); + if ( howmuch > tp.getMaxEnergyReceived() ) howmuch = tp.getMaxEnergyReceived(); @@ -133,6 +148,16 @@ public class PartP2PBCPower extends PartP2PTunnel implements IPo return 0.5f; }; + @Method(iname = "MJ6") + private IBatteryObject getTargetBattery() + { + TileEntity te = getWorld().getTileEntity( tile.xCoord + side.offsetX, tile.yCoord + side.offsetY, tile.zCoord + side.offsetZ ); + if ( te != null ) + return MjAPI.getMjBattery( te ); + return null; + } + + @Method(iname = "MJ5") private IPowerReceptor getPowerTarget() { TileEntity te = getWorld().getTileEntity( tile.xCoord + side.offsetX, tile.yCoord + side.offsetY, tile.zCoord + side.offsetZ ); @@ -148,14 +173,16 @@ public class PartP2PBCPower extends PartP2PTunnel implements IPo public void writeToNBT(NBTTagCompound tag) { super.writeToNBT( tag ); - pp.writeToNBT( tag ); + if ( pp != null ) + pp.writeToNBT( tag ); } @Override public void readFromNBT(NBTTagCompound tag) { super.readFromNBT( tag ); - pp.readFromNBT( tag ); + if ( pp != null ) + pp.readFromNBT( tag ); } @SideOnly(Side.CLIENT) @@ -165,14 +192,16 @@ public class PartP2PBCPower extends PartP2PTunnel implements IPo } @Override + @Method(iname = "MJ5") public PowerReceiver getPowerReceiver(ForgeDirection side) { if ( side.equals( side ) ) - return pp.getPowerReceiver(); + return ((BaseMJperdition) pp).getPowerReceiver(); return null; } @Override + @Method(iname = "MJ5") public void doWork(PowerHandler workProvider) { @@ -184,4 +213,229 @@ public class PartP2PBCPower extends PartP2PTunnel implements IPo return tile.getWorldObj(); } + @Override + @Method(iname = "MJ6") + public IBatteryObject getMjBattery(String kind) + { + return this; + } + + @Override + @Method(iname = "MJ6") + public IBatteryObject getMjBattery(String kind, ForgeDirection direction) + { + return this; + } + + @Override + @Method(iname = "MJ6") + public double getEnergyRequested() + { + try + { + double totalRequiredPower = 0.0f; + + for (PartP2PBCPower g : getOutputs()) + { + IBatteryObject o = g.getTargetBattery(); + if ( o != null ) + totalRequiredPower += o.getEnergyRequested(); + } + + return totalRequiredPower; + } + catch (GridAccessException e) + { + return 0; + } + } + + @Override + @Method(iname = "MJ6") + public double addEnergy(double mj) + { + return addEnergyInternal( mj, false, false ); + } + + @Override + @Method(iname = "MJ6") + public double addEnergy(double mj, boolean ignoreCycleLimit) + { + return addEnergyInternal( mj, true, ignoreCycleLimit ); + } + + @Method(iname = "MJ6") + private double addEnergyInternal(double mj, boolean cycleLimitMode, boolean ignoreCycleLimit) + { + if ( !output && proxy.isActive() ) + return 0; + + double originaInput = mj; + + try + { + TunnelCollection outs = getOutputs(); + + double outputs = 0; + for (PartP2PBCPower g : outs) + { + IBatteryObject o = g.getTargetBattery(); + if ( o != null ) + { + outputs = outputs + 1.0; + } + } + + if ( outputs < 0.0000001 ) + return 0; + + for (PartP2PBCPower g : outs) + { + IBatteryObject o = g.getTargetBattery(); + if ( o != null ) + { + double fraction = originaInput / outputs; + if ( cycleLimitMode ) + fraction = o.addEnergy( fraction ); + else + fraction = o.addEnergy( fraction, ignoreCycleLimit ); + mj -= fraction; + } + } + + if ( mj > 0 ) + { + for (PartP2PBCPower g : outs) + { + IBatteryObject o = g.getTargetBattery(); + if ( o != null ) + { + if ( cycleLimitMode ) + mj = mj - o.addEnergy( mj ); + else + mj = mj - o.addEnergy( mj, ignoreCycleLimit ); + } + } + } + + return originaInput - mj; + } + catch (GridAccessException e) + { + return 0; + } + } + + @Override + @Method(iname = "MJ6") + public double getEnergyStored() + { + try + { + double totalRequiredPower = 0.0f; + + for (PartP2PBCPower g : getOutputs()) + { + IBatteryObject o = g.getTargetBattery(); + if ( o != null ) + totalRequiredPower += o.getEnergyStored(); + } + + return totalRequiredPower; + } + catch (GridAccessException e) + { + return 0; + } + } + + @Override + @Method(iname = "MJ6") + public void setEnergyStored(double mj) + { + // EHh?! + } + + @Override + public double maxCapacity() + { + try + { + double totalRequiredPower = 0.0f; + + for (PartP2PBCPower g : getOutputs()) + { + IBatteryObject o = g.getTargetBattery(); + if ( o != null ) + totalRequiredPower += o.maxCapacity(); + } + + return totalRequiredPower; + } + catch (GridAccessException e) + { + return 0; + } + } + + @Override + @Method(iname = "MJ6") + public double minimumConsumption() + { + try + { + double totalRequiredPower = 1000000000000.0; + + for (PartP2PBCPower g : getOutputs()) + { + IBatteryObject o = g.getTargetBattery(); + if ( o != null ) + totalRequiredPower = Math.min( totalRequiredPower, o.minimumConsumption() ); + } + + return totalRequiredPower; + } + catch (GridAccessException e) + { + return 0; + } + } + + @Override + @Method(iname = "MJ6") + public double maxReceivedPerCycle() + { + try + { + double totalRequiredPower = 1000000.0; + + for (PartP2PBCPower g : getOutputs()) + { + IBatteryObject o = g.getTargetBattery(); + if ( o != null ) + totalRequiredPower = Math.min( totalRequiredPower, o.maxReceivedPerCycle() ); + } + + return totalRequiredPower; + } + catch (GridAccessException e) + { + return 0; + } + } + + @Override + @Method(iname = "MJ6") + public IBatteryObject reconfigure(double maxCapacity, double maxReceivedPerCycle, double minimumConsumption) + { + return this; + } + + @Override + @Method(iname = "MJ6") + public String kind() + { + return "tunnel"; + } + } diff --git a/services/VersionChecker.java b/services/VersionChecker.java index 659d20683..d2922b388 100644 --- a/services/VersionChecker.java +++ b/services/VersionChecker.java @@ -8,8 +8,8 @@ import java.util.Date; import java.util.regex.Matcher; import java.util.regex.Pattern; -import appeng.core.AELog; import appeng.core.AEConfig; +import appeng.core.AELog; public class VersionChecker implements Runnable { diff --git a/tile/AEBaseTile.java b/tile/AEBaseTile.java index 9b527300b..88d5a30c6 100644 --- a/tile/AEBaseTile.java +++ b/tile/AEBaseTile.java @@ -111,6 +111,22 @@ public class AEBaseTile extends TileEntity implements IOrientable, ICommonTile, h.Tick(); } + @Override + public void onChunkUnload() + { + if ( !isInvalid() ) + invalidate(); + } + + /** + * for dormant chunk cache. + */ + public void onChunkLoad() + { + if ( isInvalid() ) + validate(); + } + @Override // NOTE: WAS FINAL, changed for Immibis public void writeToNBT(NBTTagCompound data) @@ -322,12 +338,8 @@ public class AEBaseTile extends TileEntity implements IOrientable, ICommonTile, for (int l = 0; l < inv.getSizeInventory(); l++) { ItemStack is = inv.getStackInSlot( l ); - if ( is != null ) - { drops.add( is ); - inv.setInventorySlotContents( l, (ItemStack) null ); - } } } diff --git a/tile/misc/TileCellWorkbench.java b/tile/misc/TileCellWorkbench.java index 7154646b1..b8bd51bdd 100644 --- a/tile/misc/TileCellWorkbench.java +++ b/tile/misc/TileCellWorkbench.java @@ -191,10 +191,7 @@ public class TileCellWorkbench extends AEBaseTile implements IUpgradeableHost, I super.getDrops( w, x, y, z, drops ); if ( cell.getStackInSlot( 0 ) != null ) - { drops.add( cell.getStackInSlot( 0 ) ); - cell.setInventorySlotContents( 0, null ); - } } public ICellWorkbenchItem getCell() diff --git a/tile/misc/TileSecurity.java b/tile/misc/TileSecurity.java index 8bb2c6f60..311504d9f 100644 --- a/tile/misc/TileSecurity.java +++ b/tile/misc/TileSecurity.java @@ -31,6 +31,7 @@ import appeng.api.networking.events.MENetworkChannelsChanged; import appeng.api.networking.events.MENetworkEventSubscribe; import appeng.api.networking.events.MENetworkPowerStatusChange; import appeng.api.networking.events.MENetworkSecurityChange; +import appeng.api.networking.security.ISecurityProvider; import appeng.api.storage.IMEInventoryHandler; import appeng.api.storage.IMEMonitor; import appeng.api.storage.ITerminalHost; @@ -40,6 +41,7 @@ import appeng.api.storage.data.IAEItemStack; import appeng.api.util.AECableType; import appeng.api.util.DimensionalCoord; import appeng.api.util.IConfigManager; +import appeng.helpers.PlayerSecuirtyWrapper; import appeng.me.GridAccessException; import appeng.me.storage.SecurityInventory; import appeng.tile.events.AETileEventHandler; @@ -53,7 +55,7 @@ import appeng.util.IConfigManagerHost; import appeng.util.Platform; import appeng.util.item.AEItemStack; -public class TileSecurity extends AENetworkTile implements ITerminalHost, IAEAppEngInventory, ILocatable, IConfigManagerHost +public class TileSecurity extends AENetworkTile implements ITerminalHost, IAEAppEngInventory, ILocatable, IConfigManagerHost, ISecurityProvider { private static int diffrence = 0; @@ -205,7 +207,7 @@ public class TileSecurity extends AENetworkTile implements ITerminalHost, IAEApp if ( i instanceof IBiometricCard ) { IBiometricCard bc = (IBiometricCard) i; - playerPerms.put( pr.getID( bc.getUsername( is ) ), bc.getPermissions( is ) ); + bc.registerPermissions( new PlayerSecuirtyWrapper( playerPerms ), pr, is ); } } @@ -306,4 +308,10 @@ public class TileSecurity extends AENetworkTile implements ITerminalHost, IAEApp } + @Override + public long getSecurityKey() + { + return securityKey; + } + } diff --git a/tile/powersink/IC2.java b/tile/powersink/IC2.java index 63dc98b8b..680caab4f 100644 --- a/tile/powersink/IC2.java +++ b/tile/powersink/IC2.java @@ -13,7 +13,7 @@ import appeng.transformer.annotations.integration.Interface; import appeng.util.Platform; @Interface(iname = "IC2", iface = "ic2.api.energy.tile.IEnergySink") -public abstract class IC2 extends MinecraftJoules implements IEnergySink +public abstract class IC2 extends MinecraftJoules6 implements IEnergySink { boolean isInIC2 = false; diff --git a/tile/powersink/MinecraftJoules.java b/tile/powersink/MinecraftJoules5.java similarity index 78% rename from tile/powersink/MinecraftJoules.java rename to tile/powersink/MinecraftJoules5.java index c1bd9538f..001c77aa0 100644 --- a/tile/powersink/MinecraftJoules.java +++ b/tile/powersink/MinecraftJoules5.java @@ -4,7 +4,7 @@ import net.minecraft.world.World; import net.minecraftforge.common.util.ForgeDirection; import appeng.api.config.PowerUnits; import appeng.core.AppEng; -import appeng.integration.abstraction.IMJ; +import appeng.integration.abstraction.IMJ5; import appeng.integration.abstraction.helpers.BaseMJperdition; import appeng.transformer.annotations.integration.Interface; import appeng.transformer.annotations.integration.Method; @@ -13,20 +13,20 @@ import buildcraft.api.power.IPowerReceptor; import buildcraft.api.power.PowerHandler; import buildcraft.api.power.PowerHandler.PowerReceiver; -@Interface(iname = "BC", iface = "buildcraft.api.power.IPowerReceptor") -public abstract class MinecraftJoules extends AERootPoweredTile implements IPowerReceptor +@Interface(iname = "MJ5", iface = "buildcraft.api.power.IPowerReceptor") +public abstract class MinecraftJoules5 extends AERootPoweredTile implements IPowerReceptor { BaseMJperdition bcPowerWrapper; - public MinecraftJoules() { + public MinecraftJoules5() { if ( Platform.isServer() ) { try { - if ( AppEng.instance.isIntegrationEnabled( "MJ" ) ) + if ( AppEng.instance.isIntegrationEnabled( "MJ5" ) ) { - IMJ mjIntegration = (IMJ) AppEng.instance.getIntegration( "MJ" ); + IMJ5 mjIntegration = (IMJ5) AppEng.instance.getIntegration( "MJ5" ); if ( mjIntegration != null ) { addNewHandler( bcPowerWrapper = (BaseMJperdition) mjIntegration.createPerdition( this ) ); @@ -43,7 +43,7 @@ public abstract class MinecraftJoules extends AERootPoweredTile implements IPowe } @Override - @Method(iname = "BC") + @Method(iname = "MJ5") final public PowerReceiver getPowerReceiver(ForgeDirection side) { if ( internalCanAcceptPower && getPowerSides().contains( side ) && bcPowerWrapper != null ) @@ -52,7 +52,7 @@ public abstract class MinecraftJoules extends AERootPoweredTile implements IPowe } @Override - @Method(iname = "BC") + @Method(iname = "MJ5") final public void doWork(PowerHandler workProvider) { float requred = (float) getExternalPowerDemand( PowerUnits.MJ ); @@ -62,7 +62,7 @@ public abstract class MinecraftJoules extends AERootPoweredTile implements IPowe } @Override - @Method(iname = "BC") + @Method(iname = "MJ5") final public World getWorld() { return worldObj; diff --git a/tile/powersink/MinecraftJoules6.java b/tile/powersink/MinecraftJoules6.java new file mode 100644 index 000000000..a4588668c --- /dev/null +++ b/tile/powersink/MinecraftJoules6.java @@ -0,0 +1,94 @@ +package appeng.tile.powersink; + +import appeng.api.config.PowerUnits; +import appeng.transformer.annotations.integration.Interface; +import appeng.transformer.annotations.integration.InterfaceList; +import appeng.transformer.annotations.integration.Method; +import buildcraft.api.mj.IBatteryObject; +import buildcraft.api.mj.IBatteryProvider; + +@InterfaceList(value = { @Interface(iname = "MJ6", iface = "buildcraft.api.mj.IBatteryProvider"), + @Interface(iname = "MJ6", iface = "buildcraft.api.mj.IBatteryObject") }) +public abstract class MinecraftJoules6 extends MinecraftJoules5 implements IBatteryProvider, IBatteryObject +{ + + @Override + @Method(iname = "MJ6") + public String kind() + { + return null; + } + + @Override + @Method(iname = "MJ6") + public double getEnergyRequested() + { + return getExternalPowerDemand( PowerUnits.MJ ); + } + + @Override + @Method(iname = "MJ6") + public double addEnergy(double amount) + { + double overflow = injectExternalPower( PowerUnits.MJ, amount ); + return amount - overflow; + } + + @Override + @Method(iname = "MJ6") + public double addEnergy(double amount, boolean ignoreCycleLimit) + { + double overflow = injectExternalPower( PowerUnits.MJ, amount ); + return amount - overflow; + } + + @Override + @Method(iname = "MJ6") + public double getEnergyStored() + { + return PowerUnits.AE.convertTo( PowerUnits.MJ, internalCurrentPower ); + } + + @Override + @Method(iname = "MJ6") + public void setEnergyStored(double mj) + { + internalCurrentPower = PowerUnits.MJ.convertTo( PowerUnits.AE, mj ); + } + + @Override + @Method(iname = "MJ6") + public double maxCapacity() + { + return PowerUnits.AE.convertTo( PowerUnits.MJ, internalMaxPower ); + } + + @Override + @Method(iname = "MJ6") + public double minimumConsumption() + { + return 0.1; + } + + @Override + @Method(iname = "MJ6") + public double maxReceivedPerCycle() + { + return 999999.0; + } + + @Override + @Method(iname = "MJ6") + public IBatteryObject reconfigure(double maxCapacity, double maxReceivedPerCycle, double minimumConsumption) + { + return getMjBattery( "" ); + } + + @Override + @Method(iname = "MJ6") + public IBatteryObject getMjBattery(String kind) + { + return this; + } + +} diff --git a/transformer/asm/ASMIntegration.java b/transformer/asm/ASMIntegration.java index 0ebfef173..7e84ed241 100644 --- a/transformer/asm/ASMIntegration.java +++ b/transformer/asm/ASMIntegration.java @@ -35,7 +35,8 @@ public class ASMIntegration implements IClassTransformer // integrationModules.add( IntegrationSide.BOTH, "Thermal Expansion", "ThermalExpansion", "TE" ); // integrationModules.add( IntegrationSide.BOTH, "Mystcraft", "Mystcraft", "Mystcraft" ); integrationModules.add( IntegrationSide.BOTH, "BuildCraft", "BuildCraft|Silicon", "BC" ); - integrationModules.add( IntegrationSide.BOTH, "BuildCraft Power", null, "MJ" ); + integrationModules.add( IntegrationSide.BOTH, "BuildCraft5 Power", null, "MJ5" ); + integrationModules.add( IntegrationSide.BOTH, "BuildCraft6 Power", null, "MJ6" ); integrationModules.add( IntegrationSide.BOTH, "RedstoneFlux Power", null, "RF" ); // integrationModules.add( IntegrationSide.BOTH, "Greg Tech", "gregtech_addon", "GT" ); // integrationModules.add( IntegrationSide.BOTH, "Universal Electricity", null, "UE" ); diff --git a/util/InventoryAdaptor.java b/util/InventoryAdaptor.java index 61aa2d6f5..8b3c496be 100644 --- a/util/InventoryAdaptor.java +++ b/util/InventoryAdaptor.java @@ -18,7 +18,6 @@ import appeng.util.inv.ItemSlot; import appeng.util.inv.WrapperMCISidedInventory; import buildcraft.api.inventory.ISpecialInventory; -@SuppressWarnings("deprecation") public abstract class InventoryAdaptor implements Iterable { diff --git a/util/inv/AdaptorISpecialInventory.java b/util/inv/AdaptorISpecialInventory.java index 26e920969..994b04857 100644 --- a/util/inv/AdaptorISpecialInventory.java +++ b/util/inv/AdaptorISpecialInventory.java @@ -9,7 +9,6 @@ import appeng.api.config.FuzzyMode; import appeng.util.InventoryAdaptor; import buildcraft.api.inventory.ISpecialInventory; -@SuppressWarnings("deprecation") public class AdaptorISpecialInventory extends InventoryAdaptor {