diff --git a/block/AEBaseBlock.java b/block/AEBaseBlock.java index 4401f4d33..7f748db76 100644 --- a/block/AEBaseBlock.java +++ b/block/AEBaseBlock.java @@ -42,6 +42,7 @@ import appeng.core.features.AEFeature; import appeng.core.features.AEFeatureHandler; import appeng.core.features.IAEFeature; import appeng.core.features.ItemStackSrc; +import appeng.helpers.AEGlassMaterial; import appeng.helpers.ICustomCollision; import appeng.tile.AEBaseTile; import appeng.tile.networking.TileCableBus; @@ -203,7 +204,9 @@ public class AEBaseBlock extends BlockContainer implements IAEFeature protected AEBaseBlock(Class c, Material mat, String subname) { super( mat ); - if ( mat == Material.glass ) + if ( mat == AEGlassMaterial.instance ) + setStepSound( Block.soundTypeGlass ); + else if ( mat == Material.glass ) setStepSound( Block.soundTypeGlass ); else if ( mat == Material.rock ) setStepSound( Block.soundTypeStone ); diff --git a/block/networking/BlockCableBus.java b/block/networking/BlockCableBus.java index 97b5e1b8e..3e8a86b24 100644 --- a/block/networking/BlockCableBus.java +++ b/block/networking/BlockCableBus.java @@ -5,7 +5,6 @@ import java.util.List; import java.util.Random; import net.minecraft.block.Block; -import net.minecraft.block.material.Material; import net.minecraft.client.particle.EffectRenderer; import net.minecraft.client.particle.EntityDiggingFX; import net.minecraft.client.renderer.texture.IIconRegister; @@ -39,6 +38,7 @@ import appeng.core.Api; import appeng.core.AppEng; import appeng.core.CommonHelper; import appeng.core.features.AEFeature; +import appeng.helpers.AEGlassMaterial; import appeng.integration.IntegrationType; import appeng.integration.abstraction.IFMP; import appeng.parts.ICableBusContainer; @@ -75,7 +75,7 @@ public class BlockCableBus extends AEBaseBlock implements IRedNetConnection } public BlockCableBus() { - super( BlockCableBus.class, Material.glass ); + super( BlockCableBus.class, AEGlassMaterial.instance ); setfeature( EnumSet.of( AEFeature.Core ) ); setLightOpacity( 0 ); isFullSize = isOpaque = false; diff --git a/block/networking/BlockCreativeEnergyCell.java b/block/networking/BlockCreativeEnergyCell.java index c98244453..d0334664a 100644 --- a/block/networking/BlockCreativeEnergyCell.java +++ b/block/networking/BlockCreativeEnergyCell.java @@ -2,16 +2,16 @@ package appeng.block.networking; import java.util.EnumSet; -import net.minecraft.block.material.Material; import appeng.block.AEBaseBlock; import appeng.core.features.AEFeature; +import appeng.helpers.AEGlassMaterial; import appeng.tile.networking.TileCreativeEnergyCell; public class BlockCreativeEnergyCell extends AEBaseBlock { public BlockCreativeEnergyCell() { - super( BlockCreativeEnergyCell.class, Material.glass ); + super( BlockCreativeEnergyCell.class, AEGlassMaterial.instance ); setfeature( EnumSet.of( AEFeature.Creative ) ); setTileEntiy( TileCreativeEnergyCell.class ); } diff --git a/block/networking/BlockEnergyCell.java b/block/networking/BlockEnergyCell.java index 768fb718b..590770d9a 100644 --- a/block/networking/BlockEnergyCell.java +++ b/block/networking/BlockEnergyCell.java @@ -3,7 +3,6 @@ package appeng.block.networking; import java.util.EnumSet; import java.util.List; -import net.minecraft.block.material.Material; import net.minecraft.creativetab.CreativeTabs; import net.minecraft.item.Item; import net.minecraft.item.ItemStack; @@ -15,6 +14,7 @@ import appeng.client.render.BaseBlockRender; import appeng.client.render.blocks.RenderBlockEnergyCube; import appeng.client.texture.ExtraBlockTextures; import appeng.core.features.AEFeature; +import appeng.helpers.AEGlassMaterial; import appeng.tile.networking.TileEnergyCell; import appeng.util.Platform; @@ -27,7 +27,7 @@ public class BlockEnergyCell extends AEBaseBlock } public BlockEnergyCell(Class c) { - super( c, Material.glass ); + super( c, AEGlassMaterial.instance ); } public BlockEnergyCell() { diff --git a/block/networking/BlockWireless.java b/block/networking/BlockWireless.java index 16abd7df6..aebba6095 100644 --- a/block/networking/BlockWireless.java +++ b/block/networking/BlockWireless.java @@ -4,7 +4,6 @@ import java.util.Arrays; import java.util.EnumSet; import java.util.List; -import net.minecraft.block.material.Material; import net.minecraft.entity.Entity; import net.minecraft.entity.player.EntityPlayer; import net.minecraft.util.AxisAlignedBB; @@ -16,6 +15,7 @@ import appeng.client.render.BaseBlockRender; import appeng.client.render.blocks.RenderBlockWireless; import appeng.core.features.AEFeature; import appeng.core.sync.GuiBridge; +import appeng.helpers.AEGlassMaterial; import appeng.helpers.ICustomCollision; import appeng.tile.networking.TileWireless; import appeng.util.Platform; @@ -24,7 +24,7 @@ public class BlockWireless extends AEBaseBlock implements ICustomCollision { public BlockWireless() { - super( BlockWireless.class, Material.glass ); + super( BlockWireless.class, AEGlassMaterial.instance ); setfeature( EnumSet.of( AEFeature.Core, AEFeature.WirelessAccessTerminal ) ); setTileEntiy( TileWireless.class ); setLightOpacity( 0 ); diff --git a/block/qnb/BlockQuantumLinkChamber.java b/block/qnb/BlockQuantumLinkChamber.java index 09bbdefdb..69e7331cc 100644 --- a/block/qnb/BlockQuantumLinkChamber.java +++ b/block/qnb/BlockQuantumLinkChamber.java @@ -6,7 +6,6 @@ import java.util.List; import java.util.Random; import net.minecraft.block.Block; -import net.minecraft.block.material.Material; import net.minecraft.entity.Entity; import net.minecraft.entity.player.EntityPlayer; import net.minecraft.util.AxisAlignedBB; @@ -19,6 +18,7 @@ import appeng.client.render.blocks.RenderQNB; import appeng.core.CommonHelper; import appeng.core.features.AEFeature; import appeng.core.sync.GuiBridge; +import appeng.helpers.AEGlassMaterial; import appeng.helpers.ICustomCollision; import appeng.tile.qnb.TileQuantumBridge; import appeng.util.Platform; @@ -29,7 +29,7 @@ public class BlockQuantumLinkChamber extends AEBaseBlock implements ICustomColli { public BlockQuantumLinkChamber() { - super( BlockQuantumLinkChamber.class, Material.glass ); + super( BlockQuantumLinkChamber.class, AEGlassMaterial.instance ); setfeature( EnumSet.of( AEFeature.QuantumNetworkBridge ) ); setTileEntiy( TileQuantumBridge.class ); float shave = 2.0f / 16.0f; diff --git a/block/solids/BlockQuartzGlass.java b/block/solids/BlockQuartzGlass.java index 3fc64b5b1..4d902dace 100644 --- a/block/solids/BlockQuartzGlass.java +++ b/block/solids/BlockQuartzGlass.java @@ -8,6 +8,7 @@ import appeng.block.AEBaseBlock; import appeng.client.render.BaseBlockRender; import appeng.client.render.blocks.RenderQuartzGlass; import appeng.core.features.AEFeature; +import appeng.helpers.AEGlassMaterial; import cpw.mods.fml.relauncher.Side; import cpw.mods.fml.relauncher.SideOnly; @@ -28,7 +29,8 @@ public class BlockQuartzGlass extends AEBaseBlock @Override public boolean shouldSideBeRendered(IBlockAccess w, int x, int y, int z, int side) { - if ( w.getBlock( x, y, z ).getMaterial() == Material.glass ) + Material mat = w.getBlock( x, y, z ).getMaterial(); + if ( mat == Material.glass || mat == AEGlassMaterial.instance ) { if ( w.getBlock( x, y, z ).getRenderType() == this.getRenderType() ) return false; diff --git a/block/spatial/BlockSpatialPylon.java b/block/spatial/BlockSpatialPylon.java index 6e5d56d2a..50ae3ecf8 100644 --- a/block/spatial/BlockSpatialPylon.java +++ b/block/spatial/BlockSpatialPylon.java @@ -3,20 +3,20 @@ package appeng.block.spatial; import java.util.EnumSet; import net.minecraft.block.Block; -import net.minecraft.block.material.Material; import net.minecraft.world.IBlockAccess; import net.minecraft.world.World; import appeng.block.AEBaseBlock; import appeng.client.render.BaseBlockRender; import appeng.client.render.blocks.RenderSpatialPylon; import appeng.core.features.AEFeature; +import appeng.helpers.AEGlassMaterial; import appeng.tile.spatial.TileSpatialPylon; public class BlockSpatialPylon extends AEBaseBlock { public BlockSpatialPylon() { - super( BlockSpatialPylon.class, Material.glass ); + super( BlockSpatialPylon.class, AEGlassMaterial.instance ); setfeature( EnumSet.of( AEFeature.SpatialIO ) ); setTileEntiy( TileSpatialPylon.class ); } diff --git a/client/gui/AEBaseGui.java b/client/gui/AEBaseGui.java index 9a24442de..2464fc270 100644 --- a/client/gui/AEBaseGui.java +++ b/client/gui/AEBaseGui.java @@ -7,6 +7,7 @@ import java.util.Collection; import java.util.Iterator; import java.util.LinkedList; import java.util.List; +import java.util.concurrent.TimeUnit; import net.minecraft.client.Minecraft; import net.minecraft.client.gui.GuiButton; @@ -53,6 +54,9 @@ import appeng.helpers.InventoryAction; import appeng.integration.IntegrationType; import appeng.integration.abstraction.INEI; import appeng.util.Platform; + +import com.google.common.base.Stopwatch; + import cpw.mods.fml.common.ObfuscationReflectionHelper; public abstract class AEBaseGui extends GuiContainer @@ -169,6 +173,11 @@ public abstract class AEBaseGui extends GuiContainer super.mouseClicked( xCoord, yCoord, btn ); } + boolean disableShiftClick = false; + Stopwatch dbl_clickTimer = Stopwatch.createStarted(); + ItemStack dbl_whichItem; + Slot bl_clicked; + @Override protected void handleMouseClick(Slot slot, int slotIdx, int ctrlDown, int key) { @@ -364,6 +373,40 @@ public abstract class AEBaseGui extends GuiContainer return; } + if ( disableShiftClick == false && isShiftKeyDown() ) + { + disableShiftClick = true; + + if ( dbl_whichItem == null || bl_clicked != slot || dbl_clickTimer.elapsed( TimeUnit.MILLISECONDS ) > 150 ) + { + // some simple double click logic. + bl_clicked = slot; + dbl_clickTimer = Stopwatch.createStarted(); + if ( slot != null ) + dbl_whichItem = slot.getHasStack() ? slot.getStack().copy() : null; + else + dbl_whichItem = null; + } + else if ( dbl_whichItem != null ) + { + // a replica of the weird broken vanilla feature. + Iterator iterator = this.inventorySlots.inventorySlots.iterator(); + + while (iterator.hasNext()) + { + Slot targetSlot = (Slot) iterator.next(); + + if ( targetSlot != null && targetSlot.canTakeStack( this.mc.thePlayer ) && targetSlot.getHasStack() + && targetSlot.inventory == slot.inventory && Container.func_94527_a( targetSlot, dbl_whichItem, true ) ) + { + this.handleMouseClick( targetSlot, targetSlot.slotNumber, ctrlDown, 1 ); + } + } + } + + disableShiftClick = false; + } + super.handleMouseClick( slot, slotIdx, ctrlDown, key ); } diff --git a/client/gui/implementations/GuiCraftConfirm.java b/client/gui/implementations/GuiCraftConfirm.java index 0852565ff..cbf92ed48 100644 --- a/client/gui/implementations/GuiCraftConfirm.java +++ b/client/gui/implementations/GuiCraftConfirm.java @@ -108,7 +108,7 @@ public class GuiCraftConfirm extends AEBaseGui private void updateCPUButtonText() { - String btnTextText = GuiText.CraftingCPU.getLocal() + ": " + GuiText.Automatic; + String btnTextText = GuiText.CraftingCPU.getLocal() + ": " + GuiText.Automatic.getLocal(); if ( ccc.selectedCpu >= 0 )// && ccc.selectedCpu < ccc.cpus.size() ) { if ( ccc.myName.length() > 0 ) diff --git a/container/implementations/ContainerCraftingCPU.java b/container/implementations/ContainerCraftingCPU.java index 21b4efe01..3db93e63d 100644 --- a/container/implementations/ContainerCraftingCPU.java +++ b/container/implementations/ContainerCraftingCPU.java @@ -57,9 +57,9 @@ public class ContainerCraftingCPU extends AEBaseContainer implements IMEMonitorH protected void setCPU(ICraftingCPU c) { - if ( c== monitor) + if ( c == monitor ) return; - + if ( monitor != null ) monitor.removeListener( this ); @@ -185,11 +185,14 @@ public class ContainerCraftingCPU extends AEBaseContainer implements IMEMonitorH } @Override - public void postChange(IBaseMonitor monitor, IAEItemStack change, BaseActionSource actionSource) + public void postChange(IBaseMonitor monitor, Iterable change, BaseActionSource actionSource) { - change = change.copy(); - change.setStackSize( 1 ); - list.add( change ); + for (IAEItemStack is : change) + { + is = is.copy(); + is.setStackSize( 1 ); + list.add( is ); + } } @Override diff --git a/container/implementations/ContainerMEMonitorable.java b/container/implementations/ContainerMEMonitorable.java index 397f82dd9..bb3e2fc96 100644 --- a/container/implementations/ContainerMEMonitorable.java +++ b/container/implementations/ContainerMEMonitorable.java @@ -317,9 +317,10 @@ public class ContainerMEMonitorable extends AEBaseContainer implements IConfigMa } @Override - public void postChange(IBaseMonitor monitor, IAEItemStack change, BaseActionSource source) + public void postChange(IBaseMonitor monitor, Iterable change, BaseActionSource source) { - items.add( change ); + for (IAEItemStack is : change) + items.add( is ); } @Override diff --git a/core/AEConfig.java b/core/AEConfig.java index 2bdd78c0c..1993ae431 100644 --- a/core/AEConfig.java +++ b/core/AEConfig.java @@ -49,6 +49,8 @@ public class AEConfig extends Configuration implements IConfigureableObject, ICo public int storageBiomeID = -1; public int storageProviderID = -1; + public int formationPlaneEntityLimit = 128; + public float spawnChargedChance = 0.92f; public int quartzOresPerCluster = 4; public int quartzOresClusterAmount = 15; @@ -253,6 +255,8 @@ public class AEConfig extends Configuration implements IConfigureableObject, ICo WirelessTerminalDrainMultiplier = get( "wireless", "WirelessTerminalDrainMultiplier", WirelessTerminalDrainMultiplier ).getDouble( WirelessTerminalDrainMultiplier ); + formationPlaneEntityLimit = get( "automation", "formationPlaneEntityLimit", formationPlaneEntityLimit ).getInt( formationPlaneEntityLimit ); + wireless_battery = get( "battery", "wireless", wireless_battery ).getInt( wireless_battery ); staff_battery = get( "battery", "staff", staff_battery ).getInt( staff_battery ); manipulator_battery = get( "battery", "manipulator", manipulator_battery ).getInt( manipulator_battery ); diff --git a/core/Registration.java b/core/Registration.java index f2f84f918..22137d4b4 100644 --- a/core/Registration.java +++ b/core/Registration.java @@ -92,6 +92,7 @@ import appeng.core.localization.GuiText; import appeng.core.localization.PlayerMessages; import appeng.core.stats.PlayerStatsRegistration; import appeng.debug.BlockChunkloader; +import appeng.debug.BlockCubeGenerator; import appeng.debug.BlockItemGen; import appeng.debug.BlockPhantomNode; import appeng.debug.ToolDebugCard; @@ -421,6 +422,7 @@ public class Registration addFeature( BlockItemGen.class ); addFeature( BlockChunkloader.class ); addFeature( BlockPhantomNode.class ); + addFeature( BlockCubeGenerator.class ); } private AEItemDefinition addFeature(Class c, Object... Args) diff --git a/core/WorldSettings.java b/core/WorldSettings.java index c0bfc2c54..67976c250 100644 --- a/core/WorldSettings.java +++ b/core/WorldSettings.java @@ -258,21 +258,21 @@ public class WorldSettings extends Configuration File aeBaseFolder = new File( world.getPath() + File.separatorChar + "AE2" ); if ( !aeBaseFolder.exists() || !aeBaseFolder.isDirectory() ) - if ( !aeBaseFolder.mkdir() ) + if ( !aeBaseFolder.mkdir() || !aeBaseFolder.exists() ) { throw new RuntimeException( "Failed to create " + aeBaseFolder.getAbsolutePath() ); } File compass = new File( aeBaseFolder, "compass" ); if ( !compass.exists() || !compass.isDirectory() ) - if ( !compass.mkdir() ) + if ( !compass.mkdir() || !compass.exists() ) { throw new RuntimeException( "Failed to create " + compass.getAbsolutePath() ); } File spawnData = new File( aeBaseFolder, "spawndata" ); if ( !spawnData.exists() || !spawnData.isDirectory() ) - if ( !spawnData.mkdir() ) + if ( !spawnData.mkdir() || !spawnData.exists() ) { throw new RuntimeException( "Failed to create " + spawnData.getAbsolutePath() ); } diff --git a/core/features/AEFeature.java b/core/features/AEFeature.java index c251b38c0..bdbefc873 100644 --- a/core/features/AEFeature.java +++ b/core/features/AEFeature.java @@ -54,7 +54,7 @@ public enum AEFeature enableDisassemblyCrafting("Crafting"), MolecularAssembler("CraftingFeatures"), MeteoriteCompass("Tools"), Patterns("CraftingFeatures"), - ChunkLoggerTrace("Commands", false), Achievements("Misc"); + ChunkLoggerTrace("Commands", false), LogSecurityAudits("Misc", false), Achievements("Misc"); String Category; boolean visible = true; diff --git a/core/features/registries/entries/BasicCellHandler.java b/core/features/registries/entries/BasicCellHandler.java index 2ff656fbc..a8bb8df3a 100644 --- a/core/features/registries/entries/BasicCellHandler.java +++ b/core/features/registries/entries/BasicCellHandler.java @@ -65,7 +65,7 @@ public class BasicCellHandler implements ICellHandler if ( handler instanceof CellInventoryHandler ) { CellInventoryHandler ci = (CellInventoryHandler) handler; - return ci.getCellInv().getStatusForCell(); + return ci.getStatusForCell(); } return 0; } diff --git a/core/localization/GuiText.java b/core/localization/GuiText.java index e41afcea3..51879ecad 100644 --- a/core/localization/GuiText.java +++ b/core/localization/GuiText.java @@ -48,7 +48,9 @@ public enum GuiText InterfaceTerminalHint, Range, TransparentFacades, TransparentFacadesHint, - NoCraftingJobs, CPUs, FacadeCrafting, inWorldCraftingPresses, ChargedQuartzFind; + NoCraftingJobs, CPUs, FacadeCrafting, inWorldCraftingPresses, ChargedQuartzFind, + + Included, Excluded, Partitioned, Precise, Fuzzy; String root; diff --git a/crafting/CraftingTreeProcess.java b/crafting/CraftingTreeProcess.java index 9b15414ac..1ae2c7e89 100644 --- a/crafting/CraftingTreeProcess.java +++ b/crafting/CraftingTreeProcess.java @@ -29,7 +29,8 @@ public class CraftingTreeProcess CraftingJob job; long crafts = 0; - boolean damageable; + boolean containerItems; + boolean limitQty; boolean fullsimulation; private long bytes = 0; @@ -70,14 +71,24 @@ public class CraftingTreeProcess { ItemStack g = part.getItemStack(); + boolean isAnInput = false; + for (IAEItemStack a : is) + { + if ( g != null && a != null && a.equals( g ) ) + isAnInput = true; + } + + if ( isAnInput ) + limitQty = true; + if ( g.getItem().hasContainerItem( g ) ) - damageable = true; + limitQty = containerItems = true; } } boolean complicated = false; - if ( damageable || complicated ) + if ( containerItems || complicated ) { for (int x = 0; x < list.length; x++) { @@ -106,6 +117,28 @@ public class CraftingTreeProcess } else { + IAEItemStack list[] = details.getInputs(); + IAEItemStack[] is = details.getInputs(); + + for (int x = 0; x < list.length; x++) + { + IAEItemStack part = list[x]; + if ( part != null ) + { + ItemStack g = part.getItemStack(); + + boolean isAnInput = false; + for (IAEItemStack a : is) + { + if ( g != null && a != null && a.equals( g ) ) + isAnInput = true; + } + + if ( isAnInput ) + limitQty = true; + } + } + for (IAEItemStack part : details.getCondencedInputs()) { nodes.put( new CraftingTreeNode( cc, job, part.copy(), this, -1, depth + 1 ), part.getStackSize() ); @@ -120,7 +153,7 @@ public class CraftingTreeProcess long getTimes(long remaining, long stackSize) { - if ( damageable || fullsimulation ) + if ( limitQty || fullsimulation ) return 1; return (remaining / stackSize) + (remaining % stackSize != 0 ? 1 : 0); } @@ -190,7 +223,7 @@ public class CraftingTreeProcess IAEItemStack item = entry.getKey().getStack( entry.getValue() ); IAEItemStack stack = entry.getKey().request( inv, item.getStackSize() * i, src ); - if ( damageable ) + if ( containerItems ) { ItemStack is = Platform.getContainerItem( stack.getItemStack() ); IAEItemStack o = AEApi.instance().storage().createItemStack( is ); diff --git a/debug/BlockCubeGenerator.java b/debug/BlockCubeGenerator.java new file mode 100644 index 000000000..06532e859 --- /dev/null +++ b/debug/BlockCubeGenerator.java @@ -0,0 +1,38 @@ +package appeng.debug; + +import java.util.EnumSet; + +import net.minecraft.block.material.Material; +import net.minecraft.client.renderer.texture.IIconRegister; +import net.minecraft.entity.player.EntityPlayer; +import net.minecraft.world.World; +import appeng.block.AEBaseBlock; +import appeng.core.features.AEFeature; + +public class BlockCubeGenerator extends AEBaseBlock +{ + + public BlockCubeGenerator() { + super( BlockCubeGenerator.class, Material.iron ); + setfeature( EnumSet.of( AEFeature.UnsupportedDeveloperTools, AEFeature.Creative ) ); + setTileEntiy( TileCubeGenerator.class ); + } + + @Override + public boolean onActivated(World w, int x, int y, int z, + EntityPlayer player, int side, float hitX, float hitY, float hitZ) { + + TileCubeGenerator tcg = getTileEntity(w, x, y, z); + if ( tcg != null ) + tcg.click( player ); + + return true; + } + + @Override + public void registerBlockIcons(IIconRegister iconRegistry) + { + registerNoIcons(); + } + +} diff --git a/debug/TileCubeGenerator.java b/debug/TileCubeGenerator.java new file mode 100644 index 000000000..4d56b169d --- /dev/null +++ b/debug/TileCubeGenerator.java @@ -0,0 +1,107 @@ +package appeng.debug; + + +import net.minecraft.entity.player.EntityPlayer; +import net.minecraft.item.Item; +import net.minecraft.item.ItemStack; +import net.minecraft.util.ChatComponentText; +import net.minecraftforge.common.util.ForgeDirection; +import appeng.core.CommonHelper; +import appeng.tile.AEBaseTile; +import appeng.tile.events.AETileEventHandler; +import appeng.tile.events.TileEventType; +import appeng.util.Platform; + +public class TileCubeGenerator extends AEBaseTile +{ + + int size = 3; + ItemStack is = null; + int countdown = 20 * 10; + EntityPlayer who; + + class TCG extends AETileEventHandler { + + public TCG() { + super(TileEventType.TICK); + } + + @Override + public void Tick() + { + if ( is != null && Platform.isServer() ) + { + countdown--; + + if (countdown % 20 == 0 ) + { + for ( EntityPlayer e : CommonHelper.proxy.getPlayers() ) + { + e.addChatMessage(new ChatComponentText("Spawning in... "+( countdown / 20 ))); + } + } + + if ( countdown <= 0 ) + spawn(); + } + } + + }; + + void spawn() + { + worldObj.setBlock( xCoord, yCoord, zCoord, Platform.air, 0, 3 ); + + Item i = is.getItem(); + int side = ForgeDirection.UP.ordinal(); + + int half = (int) Math.floor( size / 2 ); + + for ( int y = 0; y < size; y++ ) + { + for ( int x = -half; x < half; x++ ) + { + for ( int z = -half; z < half; z++ ) + { + i.onItemUse( is.copy(), who, worldObj, x+xCoord, y+yCoord-1, z+zCoord, side, 0.5f, 0.0f, 0.5f ); + } + } + } + } + + public TileCubeGenerator() { + addNewHandler( new TCG() ); + } + + public void click(EntityPlayer player) + { + if ( Platform.isServer() ) + { + ItemStack hand = player.inventory.getCurrentItem(); + who = player; + + if ( hand == null ) + { + is = null; + + if ( player.isSneaking() ) + size --; + else + size++; + + if ( size < 3 ) + size = 3; + if ( size > 64 ) + size = 64; + + player.addChatMessage( new ChatComponentText("Size: "+size) ); + } + else + { + countdown = 20 * 10; + is = hand; + } + } + } + +} diff --git a/entity/EntityGrowingCrystal.java b/entity/EntityGrowingCrystal.java index 5272f7cba..e80c65a61 100644 --- a/entity/EntityGrowingCrystal.java +++ b/entity/EntityGrowingCrystal.java @@ -9,11 +9,11 @@ import net.minecraft.tileentity.TileEntity; import net.minecraft.util.MathHelper; import net.minecraft.world.World; import appeng.api.implementations.items.IGrowableCrystal; +import appeng.api.implementations.tiles.ICrystalGrowthAccelerator; import appeng.client.EffectType; import appeng.core.AEConfig; import appeng.core.CommonHelper; import appeng.core.features.AEFeature; -import appeng.tile.misc.TileQuartzGrowthAccelerator; import appeng.util.Platform; final public class EntityGrowingCrystal extends EntityItem @@ -145,8 +145,8 @@ final public class EntityGrowingCrystal extends EntityItem private boolean isAccel(int x, int y, int z) { TileEntity te = worldObj.getTileEntity( x, y, z ); - if ( te instanceof TileQuartzGrowthAccelerator ) - return ((TileQuartzGrowthAccelerator) te).isPowered(); + if ( te instanceof ICrystalGrowthAccelerator ) + return ((ICrystalGrowthAccelerator) te).isPowered(); return false; } diff --git a/fmp/CableBusPart.java b/fmp/CableBusPart.java index 162eb3e10..a59cc7857 100644 --- a/fmp/CableBusPart.java +++ b/fmp/CableBusPart.java @@ -532,7 +532,7 @@ public class CableBusPart extends JCuboidPart implements JNormalOcclusion, IReds ((TIInventoryTile) tile()).rebuildSlotMap(); if ( world() != null && world().blockExists( x(), y(), z() ) && !CableBusContainer.isLoading() ) - world().notifyBlocksOfNeighborChange( x(), y(), z(), Platform.air ); + Platform.notifyBlocksOfNeighbors(world(), x(), y(), z() ); } // @Override diff --git a/helpers/AEGlassMaterial.java b/helpers/AEGlassMaterial.java new file mode 100644 index 000000000..8129f6986 --- /dev/null +++ b/helpers/AEGlassMaterial.java @@ -0,0 +1,20 @@ +package appeng.helpers; + +import net.minecraft.block.material.MapColor; +import net.minecraft.block.material.Material; + +public class AEGlassMaterial extends Material +{ + + public AEGlassMaterial(MapColor p_i2116_1_) { + super( p_i2116_1_ ); + } + + public boolean isOpaque() + { + return false; + } + + public static AEGlassMaterial instance = (new AEGlassMaterial( MapColor.airColor )); + +} diff --git a/integration/modules/CraftGuide.java b/integration/modules/CraftGuide.java index 7e8375791..4eb78b6cb 100644 --- a/integration/modules/CraftGuide.java +++ b/integration/modules/CraftGuide.java @@ -22,6 +22,9 @@ import uristqwerty.CraftGuide.api.StackInfo; import uristqwerty.CraftGuide.api.StackInfoSource; import uristqwerty.gui_craftguide.texture.DynamicTexture; import uristqwerty.gui_craftguide.texture.TextureClip; +import appeng.api.exceptions.MissingIngredientError; +import appeng.api.exceptions.RegistrationError; +import appeng.api.recipes.IIngredient; import appeng.integration.IIntegrationModule; import appeng.recipes.game.ShapedRecipe; import appeng.recipes.game.ShapelessRecipe; @@ -222,8 +225,21 @@ public class CraftGuide extends CraftGuideAPIObject implements IIntegrationModul if ( output[i] instanceof ItemStack[] ) output[i] = Arrays.asList( (ItemStack[]) output[i] ); - // if ( output[i] instanceof List ) - // output[i] = ((List) output[i]).get( 0 ); + if ( output[i] instanceof IIngredient ) + { + try + { + output[i] = toCG( ((IIngredient) output[i]).getItemStackSet() ); + } + catch (RegistrationError e) + { + + } + catch (MissingIngredientError e) + { + + } + } } output[9] = recipeOutput; @@ -244,8 +260,21 @@ public class CraftGuide extends CraftGuideAPIObject implements IIntegrationModul if ( output[i] instanceof ItemStack[] ) output[i] = Arrays.asList( (ItemStack[]) output[i] ); - // if ( output[i] instanceof List ) - // output[i] = ((List) output[i]).get( 0 ); + if ( output[i] instanceof IIngredient ) + { + try + { + output[i] = toCG( ((IIngredient) output[i]).getItemStackSet() ); + } + catch (RegistrationError e) + { + + } + catch (MissingIngredientError e) + { + + } + } } } @@ -267,8 +296,21 @@ public class CraftGuide extends CraftGuideAPIObject implements IIntegrationModul if ( output[i] instanceof ItemStack[] ) output[i] = Arrays.asList( (ItemStack[]) output[i] ); - // if ( output[i] instanceof List ) - // output[i] = ((List) output[i]).get( 0 ); + if ( output[i] instanceof IIngredient ) + { + try + { + output[i] = toCG( ((IIngredient) output[i]).getItemStackSet() ); + } + catch (RegistrationError e) + { + + } + catch (MissingIngredientError e) + { + + } + } } } @@ -276,6 +318,20 @@ public class CraftGuide extends CraftGuideAPIObject implements IIntegrationModul return output; } + private Object toCG(ItemStack[] itemStackSet) + { + List list = Arrays.asList( itemStackSet ); + + for (int x = 0; x < list.size(); x++) + { + list.set( x, list.get( x ).copy() ); + if ( list.get( x ).stackSize == 0 ) + list.get( x ).stackSize = 1; + } + + return list; + } + @Override public Object[] getCraftingRecipe(IRecipe recipe, boolean allowSmallGrid) { diff --git a/items/misc/ItemCrystalSeed.java b/items/misc/ItemCrystalSeed.java index 611350465..8b9ed0c8d 100644 --- a/items/misc/ItemCrystalSeed.java +++ b/items/misc/ItemCrystalSeed.java @@ -69,7 +69,6 @@ public class ItemCrystalSeed extends AEBaseItem implements IGrowableCrystal public ItemCrystalSeed() { super( ItemCrystalSeed.class ); setHasSubtypes( true ); - setMaxStackSize( 8 ); setfeature( EnumSet.of( AEFeature.Core ) ); EntityRegistry.registerModEntity( EntityGrowingCrystal.class, EntityGrowingCrystal.class.getSimpleName(), EntityIds.get( EntityGrowingCrystal.class ), diff --git a/items/misc/ItemPaintBall.java b/items/misc/ItemPaintBall.java index b7123f07b..6f631aa5b 100644 --- a/items/misc/ItemPaintBall.java +++ b/items/misc/ItemPaintBall.java @@ -33,7 +33,7 @@ public class ItemPaintBall extends AEBaseItem public String getExtraName(ItemStack is) { - return (is.getItemDamage() >= 20 ? GuiText.Lumen + " " : "") + getColor( is ); + return (is.getItemDamage() >= 20 ? GuiText.Lumen.getLocal() + " " : "") + getColor( is ); } public AEColor getColor(ItemStack is) diff --git a/items/storage/ItemBasicStorageCell.java b/items/storage/ItemBasicStorageCell.java index 3ec5cfdac..75483212e 100644 --- a/items/storage/ItemBasicStorageCell.java +++ b/items/storage/ItemBasicStorageCell.java @@ -12,6 +12,7 @@ import net.minecraft.world.World; import net.minecraftforge.common.util.ForgeDirection; import appeng.api.AEApi; import appeng.api.config.FuzzyMode; +import appeng.api.config.IncludeExclude; import appeng.api.implementations.items.IItemGroup; import appeng.api.implementations.items.IStorageCell; import appeng.api.storage.ICellInventory; @@ -75,28 +76,38 @@ public class ItemBasicStorageCell extends AEBaseItem implements IStorageCell, II { IMEInventory cdi = AEApi.instance().registries().cell().getCellInventory( i, null, StorageChannel.ITEMS ); - if ( cdi instanceof CellInventoryHandler ) + if ( cdi instanceof ICellInventoryHandler ) { + ICellInventoryHandler CI = (ICellInventoryHandler) cdi; + ICellInventory cd = ((ICellInventoryHandler) cdi).getCellInv(); - if ( cd != null ) + if (cd != null) { - l.add( cd.getUsedBytes() + " " + GuiText.Of.getLocal() + " " + cd.getTotalBytes() + " " + GuiText.BytesUsed.getLocal() ); - l.add( cd.getStoredItemTypes() + " " + GuiText.Of.getLocal() + " " + cd.getTotalItemTypes() + " " + GuiText.Types.getLocal() ); - /* - * if ( cd.isPreformatted() ) { String List = StatCollector.translateToLocal( cd.getListMode() == - * ListMode.WHITELIST ? "AppEng.Gui.Whitelisted" : "AppEng.Gui.Blacklisted" ); if ( - * cd.isFuzzyPreformatted() ) l.add( StatCollector.translateToLocal( "Appeng.GuiITooltip.Partitioned" ) - * + " - " + List + " " + StatCollector.translateToLocal( "Appeng.GuiITooltip.Fuzzy" ) ); else l.add( - * StatCollector.translateToLocal( "Appeng.GuiITooltip.Partitioned" ) + " - " + List + " " + - * StatCollector.translateToLocal( "Appeng.GuiITooltip.Precise" ) ); } - */ + l.add(cd.getUsedBytes() + " " + GuiText.Of.getLocal() + " " + + cd.getTotalBytes() + " " + + GuiText.BytesUsed.getLocal()); + + l.add(cd.getStoredItemTypes() + " " + GuiText.Of.getLocal() + + " " + cd.getTotalItemTypes() + " " + + GuiText.Types.getLocal()); + + if ( CI.isPreformatted() ) + { + String List = (CI.getIncludeExcludeMode() == IncludeExclude.WHITELIST ? GuiText.Included + : GuiText.Excluded ).getLocal(); + + if ( CI.isFuzzy() ) + l.add( GuiText.Partitioned.getLocal() + " - " + List + " " + GuiText.Fuzzy.getLocal() ); + else + l.add( GuiText.Partitioned.getLocal() + " - " + List + " " + GuiText.Precise.getLocal() ); + + } } } } @Override - public int getBytes(ItemStack cellItem) - { + public int getBytes(ItemStack cellItem) { return totalBytes; } diff --git a/items/tools/quartz/ToolQuartzWrench.java b/items/tools/quartz/ToolQuartzWrench.java index f29b15b5f..551789618 100644 --- a/items/tools/quartz/ToolQuartzWrench.java +++ b/items/tools/quartz/ToolQuartzWrench.java @@ -32,7 +32,7 @@ public class ToolQuartzWrench extends AEBaseItem implements IAEWrench, IToolWren if ( b != null && !player.isSneaking() && Platform.hasPermissions( new DimensionalCoord( world, x, y, z ), player ) ) { if ( Platform.isClient() ) - return true; + return !world.isRemote; ForgeDirection mySide = ForgeDirection.getOrientation( side ); if ( b.rotateBlock( world, x, y, z, mySide ) ) diff --git a/me/GridConnection.java b/me/GridConnection.java index b3f0474c2..8e6a11be7 100644 --- a/me/GridConnection.java +++ b/me/GridConnection.java @@ -11,6 +11,9 @@ import appeng.api.networking.IGridNode; import appeng.api.networking.events.MENetworkChannelsChanged; import appeng.api.networking.pathing.IPathingGrid; import appeng.api.util.IReadOnlyCollection; +import appeng.core.AEConfig; +import appeng.core.AELog; +import appeng.core.features.AEFeature; import appeng.me.pathfinding.IPathItem; import appeng.util.Platform; import appeng.util.ReadOnlyCollection; @@ -34,7 +37,15 @@ public class GridConnection implements IGridConnection, IPathItem GridNode b = (GridNode) bNode; if ( Platform.securityCheck( a, b ) ) + { + if ( AEConfig.instance.isFeatureEnabled( AEFeature.LogSecurityAudits ) ) + { + AELog.info( "Audit Failed 1: " + a.getGridBlock().getLocation() ); + AELog.info( "Audit Failed 2: " + b.getGridBlock().getLocation() ); + } + throw new FailedConnection(); + } if ( a == null || b == null ) throw new GridException( "Connection Forged Between null enties." ); diff --git a/me/cache/CraftingGridCache.java b/me/cache/CraftingGridCache.java index a6459cb57..075bf13bb 100644 --- a/me/cache/CraftingGridCache.java +++ b/me/cache/CraftingGridCache.java @@ -295,8 +295,7 @@ public class CraftingGridCache implements ICraftingGrid, ICraftingProviderHelper emitableItems.clear(); // update the stuff that was in the list... - for (IAEItemStack out : oldItems.keySet()) - sg.postAlterationOfStoredItems( StorageChannel.ITEMS, out, new BaseActionSource() ); + sg.postAlterationOfStoredItems( StorageChannel.ITEMS, oldItems.keySet(), new BaseActionSource() ); // re-create list.. for (ICraftingProvider cp : providers) @@ -324,10 +323,9 @@ public class CraftingGridCache implements ICraftingGrid, ICraftingProviderHelper // make them immutable for (Entry> e : tmpCraft.entrySet()) - { craftableItems.put( e.getKey(), ImmutableSortedSet.copyOf( e.getValue() ) ); - sg.postAlterationOfStoredItems( StorageChannel.ITEMS, e.getKey(), new BaseActionSource() ); - } + + sg.postAlterationOfStoredItems( StorageChannel.ITEMS, craftableItems.keySet(), new BaseActionSource() ); } @Override @@ -438,7 +436,6 @@ public class CraftingGridCache implements ICraftingGrid, ICraftingProviderHelper if ( cpu.isActive() && !cpu.isBusy() && cpu.getAvailableStorage() >= job.getByteTotal() ) { validCpusClusters.add( cpu ); - break; } } diff --git a/me/cache/EnergyGridCache.java b/me/cache/EnergyGridCache.java index d235ddffd..15125a760 100644 --- a/me/cache/EnergyGridCache.java +++ b/me/cache/EnergyGridCache.java @@ -384,8 +384,17 @@ public class EnergyGridCache implements IEnergyGrid tickInjectionPerTick = 0; // power information. - double drained = extractAEPower( getIdlePowerUsage(), Actionable.MODULATE, PowerMultiplier.CONFIG ); - boolean currentlyHasPower = drained >= drainPerTick - 0.001; + boolean currentlyHasPower = false; + + if ( drainPerTick > 0.0001 ) + { + double drained = extractAEPower( getIdlePowerUsage(), Actionable.MODULATE, PowerMultiplier.CONFIG ); + currentlyHasPower = drained >= drainPerTick - 0.001; + } + else + { + currentlyHasPower = extractAEPower( 0.1, Actionable.SIMULATE, PowerMultiplier.CONFIG ) > 0; + } // ticks since change.. if ( currentlyHasPower == hasPower ) diff --git a/me/cache/GridStorageCache.java b/me/cache/GridStorageCache.java index 7da2bd5e4..8024b4f8e 100644 --- a/me/cache/GridStorageCache.java +++ b/me/cache/GridStorageCache.java @@ -3,6 +3,7 @@ package appeng.me.cache; import java.util.HashMap; import java.util.HashSet; import java.util.LinkedList; +import java.util.List; import appeng.api.AEApi; import appeng.api.networking.IGrid; @@ -63,21 +64,66 @@ public class GridStorageCache implements IStorageGrid fluidMonitor.onTick(); } + private class CellChangeTrackerRecord + { + + final StorageChannel channel; + final int up_or_down; + final IItemList list; + final BaseActionSource src; + + public CellChangeTrackerRecord(StorageChannel channel, int i, IMEInventoryHandler h, BaseActionSource actionSrc) { + this.channel = channel; + this.up_or_down = i; + this.src = actionSrc; + + if ( channel == StorageChannel.ITEMS ) + this.list = ((IMEInventoryHandler) h).getAvailableItems( AEApi.instance().storage().createItemList() ); + else if ( channel == StorageChannel.FLUIDS ) + this.list = ((IMEInventoryHandler) h).getAvailableItems( AEApi.instance().storage().createFluidList() ); + else + this.list = null; + } + + public void applyChanges() + { + postChangesToNetwork( channel, up_or_down, list, src ); + } + + }; + + private class CellChangeTracker + { + + List data = new LinkedList(); + + public void postChanges(StorageChannel channel, int i, IMEInventoryHandler h, BaseActionSource actionSrc) + { + data.add( new CellChangeTrackerRecord( channel, i, h, actionSrc ) ); + } + + public void applyChanges() + { + for (CellChangeTrackerRecord rec : data) + rec.applyChanges(); + } + }; + @Override public void registerCellProvider(ICellProvider provider) { inactiveCellProviders.add( provider ); - addCellProvider( provider ); + addCellProvider( provider, new CellChangeTracker() ).applyChanges(); } @Override public void unregisterCellProvider(ICellProvider provider) { - removeCellProvider( provider ); + removeCellProvider( provider, new CellChangeTracker() ).applyChanges(); inactiveCellProviders.remove( provider ); } - public void addCellProvider(ICellProvider cc) + public CellChangeTracker addCellProvider(ICellProvider cc, CellChangeTracker tracker) { if ( inactiveCellProviders.contains( cc ) ) { @@ -90,17 +136,19 @@ public class GridStorageCache implements IStorageGrid for (IMEInventoryHandler h : cc.getCellArray( StorageChannel.ITEMS )) { - postChanges( StorageChannel.ITEMS, 1, h.getAvailableItems( AEApi.instance().storage().createItemList() ), actionSrc ); + tracker.postChanges( StorageChannel.ITEMS, 1, h, actionSrc ); } for (IMEInventoryHandler h : cc.getCellArray( StorageChannel.FLUIDS )) { - postChanges( StorageChannel.FLUIDS, 1, h.getAvailableItems( AEApi.instance().storage().createFluidList() ), actionSrc ); + tracker.postChanges( StorageChannel.FLUIDS, 1, h, actionSrc ); } } + + return tracker; } - public void removeCellProvider(ICellProvider cc) + public CellChangeTracker removeCellProvider(ICellProvider cc, CellChangeTracker tracker) { if ( activeCellProviders.contains( cc ) ) { @@ -113,14 +161,16 @@ public class GridStorageCache implements IStorageGrid for (IMEInventoryHandler h : cc.getCellArray( StorageChannel.ITEMS )) { - postChanges( StorageChannel.ITEMS, -1, h.getAvailableItems( AEApi.instance().storage().createItemList() ), actionSrc ); + tracker.postChanges( StorageChannel.ITEMS, -1, h, actionSrc ); } for (IMEInventoryHandler h : cc.getCellArray( StorageChannel.FLUIDS )) { - postChanges( StorageChannel.FLUIDS, -1, h.getAvailableItems( AEApi.instance().storage().createFluidList() ), actionSrc ); + tracker.postChanges( StorageChannel.FLUIDS, -1, h, actionSrc ); } } + + return tracker; } @MENetworkEventSubscribe @@ -133,6 +183,8 @@ public class GridStorageCache implements IStorageGrid ll.addAll( inactiveCellProviders ); ll.addAll( activeCellProviders ); + CellChangeTracker tracker = new CellChangeTracker(); + for (ICellProvider cc : ll) { boolean Active = true; @@ -147,13 +199,15 @@ public class GridStorageCache implements IStorageGrid } if ( Active ) - addCellProvider( cc ); + addCellProvider( cc, tracker ); else - removeCellProvider( cc ); + removeCellProvider( cc, tracker ); } itemMonitor.forceUpdate(); fluidMonitor.forceUpdate(); + + tracker.applyChanges(); } @Override @@ -164,7 +218,7 @@ public class GridStorageCache implements IStorageGrid ICellContainer cc = (ICellContainer) machine; myGrid.postEvent( new MENetworkCellArrayUpdate() ); - removeCellProvider( cc ); + removeCellProvider( cc, new CellChangeTracker() ).applyChanges(); inactiveCellProviders.remove( cc ); } @@ -189,7 +243,7 @@ public class GridStorageCache implements IStorageGrid myGrid.postEvent( new MENetworkCellArrayUpdate() ); if ( node.isActive() ) - addCellProvider( cc ); + addCellProvider( cc, new CellChangeTracker() ).applyChanges(); } if ( machine instanceof IStackWatcherHost ) @@ -227,33 +281,15 @@ public class GridStorageCache implements IStorageGrid } } - private void postChanges(StorageChannel chan, int up_or_down, IItemList availableItems, BaseActionSource src) + private void postChangesToNetwork(StorageChannel chan, int up_or_down, IItemList availableItems, BaseActionSource src) { switch (chan) { case FLUIDS: - for (IAEFluidStack fs : ((IItemList) availableItems)) - { - if ( up_or_down > 0 ) - fluidMonitor.postChange( fs, src ); - else - { - fs.setStackSize( -fs.getStackSize() ); - fluidMonitor.postChange( fs, src ); - } - } + fluidMonitor.postChange( up_or_down > 0, (IItemList) availableItems, src ); break; case ITEMS: - for (IAEItemStack fs : ((IItemList) availableItems)) - { - if ( up_or_down > 0 ) - itemMonitor.postChange( fs, src ); - else - { - fs.setStackSize( -fs.getStackSize() ); - itemMonitor.postChange( fs, src ); - } - } + itemMonitor.postChange( up_or_down > 0, (IItemList) availableItems, src ); break; default: } @@ -274,12 +310,12 @@ public class GridStorageCache implements IStorageGrid } @Override - public void postAlterationOfStoredItems(StorageChannel chan, IAEStack input, BaseActionSource src) + public void postAlterationOfStoredItems(StorageChannel chan, Iterable input, BaseActionSource src) { if ( chan == StorageChannel.ITEMS ) - itemMonitor.postChange( (IAEItemStack) input, src ); + itemMonitor.postChange( true, (Iterable) input, src ); else if ( chan == StorageChannel.FLUIDS ) - fluidMonitor.postChange( (IAEFluidStack) input, src ); + fluidMonitor.postChange( true, (Iterable) input, src ); } @Override diff --git a/me/cache/NetworkMonitor.java b/me/cache/NetworkMonitor.java index dfccffc91..a074fa427 100644 --- a/me/cache/NetworkMonitor.java +++ b/me/cache/NetworkMonitor.java @@ -47,9 +47,14 @@ public class NetworkMonitor> extends MEMonitorHandler } final static public LinkedList depth = new LinkedList(); - + @Override - protected void postChange(T diff, BaseActionSource src) + protected void postChangesToListeners(Iterable changes, BaseActionSource src) + { + postChange( true, changes, src ); + } + + protected void postChange(boolean Add, Iterable changes, BaseActionSource src) { if ( depth.contains( this ) ) return; @@ -57,28 +62,36 @@ public class NetworkMonitor> extends MEMonitorHandler depth.push( this ); sendEvent = true; - super.postChange( diff, src ); + notifyListenersOfChange( changes, src ); - if ( myGridCache.interestManager.containsKey( diff ) ) + IItemList myStorageList = getStorageList(); + + for (T changedItem : changes) { - Set list = myGridCache.interestManager.get( diff ); - if ( !list.isEmpty() ) - { - IItemList myStorageList = getStorageList(); + T diffrence = changedItem; - IAEStack fullStack = myStorageList.findPrecise( diff ); - if ( fullStack == null ) + if ( !Add && changedItem != null ) + (diffrence = changedItem.copy()).setStackSize( -changedItem.getStackSize() ); + + if ( myGridCache.interestManager.containsKey( changedItem ) ) + { + Set list = myGridCache.interestManager.get( changedItem ); + if ( !list.isEmpty() ) { - fullStack = diff.copy(); - fullStack.setStackSize( 0 ); + IAEStack fullStack = myStorageList.findPrecise( changedItem ); + if ( fullStack == null ) + { + fullStack = changedItem.copy(); + fullStack.setStackSize( 0 ); + } + + myGridCache.interestManager.enableTransactions(); + + for (ItemWatcher iw : list) + iw.getHost().onStackChange( myStorageList, fullStack, diffrence, src, getChannel() ); + + myGridCache.interestManager.disableTransactions(); } - - myGridCache.interestManager.enableTransactions(); - - for (ItemWatcher iw : list) - iw.getHost().onStackChange( myStorageList, fullStack, diff, src, getChannel() ); - - myGridCache.interestManager.disableTransactions(); } } diff --git a/me/cache/TickManagerCache.java b/me/cache/TickManagerCache.java index 2f54d49fa..95c4e5ebe 100644 --- a/me/cache/TickManagerCache.java +++ b/me/cache/TickManagerCache.java @@ -3,6 +3,9 @@ package appeng.me.cache; import java.util.HashMap; import java.util.PriorityQueue; +import net.minecraft.crash.CrashReport; +import net.minecraft.crash.CrashReportCategory; +import net.minecraft.util.ReportedException; import appeng.api.networking.IGrid; import appeng.api.networking.IGridHost; import appeng.api.networking.IGridNode; @@ -52,45 +55,56 @@ public class TickManagerCache implements ITickManager @Override public void onUpdateTick() { - currentTick++; - while (!upcomingTicks.isEmpty()) + TickTracker tt = null; + try { - TickTracker tt = upcomingTicks.peek(); - int diff = (int) (currentTick - tt.lastTick); - if ( diff >= tt.current_rate ) + currentTick++; + while (!upcomingTicks.isEmpty()) { - // remove tt.. - upcomingTicks.poll(); - TickRateModulation mod = tt.gt.tickingRequest( tt.node, diff ); - - switch (mod) + tt = upcomingTicks.peek(); + int diff = (int) (currentTick - tt.lastTick); + if ( diff >= tt.current_rate ) { - case FASTER: - tt.setRate( tt.current_rate - 2 ); - break; - case IDLE: - tt.setRate( tt.request.maxTickRate ); - break; - case SAME: - break; - case SLEEP: - sleepDevice( tt.node ); - break; - case SLOWER: - tt.setRate( tt.current_rate + 1 ); - break; - case URGENT: - tt.setRate( 0 ); - break; - default: - break; + // remove tt.. + upcomingTicks.poll(); + TickRateModulation mod = tt.gt.tickingRequest( tt.node, diff ); + + switch (mod) + { + case FASTER: + tt.setRate( tt.current_rate - 2 ); + break; + case IDLE: + tt.setRate( tt.request.maxTickRate ); + break; + case SAME: + break; + case SLEEP: + sleepDevice( tt.node ); + break; + case SLOWER: + tt.setRate( tt.current_rate + 1 ); + break; + case URGENT: + tt.setRate( 0 ); + break; + default: + break; + } + + if ( awake.containsKey( tt.node ) ) + addToQueue( tt ); } - - if ( awake.containsKey( tt.node ) ) - addToQueue( tt ); + else + return; // done! } - else - return; // done! + } + catch( Throwable t ) + { + CrashReport crashreport = CrashReport.makeCrashReport(t, "Ticking GridNode"); + CrashReportCategory crashreportcategory = crashreport.makeCategory( tt.gt.getClass().getSimpleName() + " being ticked." ); + tt.addEntityCrashInfo(crashreportcategory); + throw new ReportedException(crashreport); } } diff --git a/me/cache/helpers/TickTracker.java b/me/cache/helpers/TickTracker.java index e86caa014..d726e4357 100644 --- a/me/cache/helpers/TickTracker.java +++ b/me/cache/helpers/TickTracker.java @@ -1,9 +1,12 @@ package appeng.me.cache.helpers; +import net.minecraft.crash.CrashReportCategory; import appeng.api.networking.IGridNode; import appeng.api.networking.ticking.IGridTickable; import appeng.api.networking.ticking.TickingRequest; +import appeng.api.util.DimensionalCoord; import appeng.me.cache.TickManagerCache; +import appeng.parts.AEBasePart; public class TickTracker implements Comparable { @@ -50,4 +53,24 @@ public class TickTracker implements Comparable int ts_nextTick = (int) ((t.lastTick - host.getCurrentTick()) + t.current_rate); return nextTick - ts_nextTick; } + + public void addEntityCrashInfo(CrashReportCategory crashreportcategory) + { + if ( gt instanceof AEBasePart ) + { + AEBasePart part = (AEBasePart)gt; + part.addEntityCrashInfo( crashreportcategory ); + } + + crashreportcategory.addCrashSection( "CurrentTickRate", current_rate ); + crashreportcategory.addCrashSection( "MinTickRate", request.minTickRate ); + crashreportcategory.addCrashSection( "MaxTickRate", request.maxTickRate ); + crashreportcategory.addCrashSection( "MachineType", gt.getClass().getName() ); + crashreportcategory.addCrashSection( "GridBlockType", node.getGridBlock().getClass().getName() ); + crashreportcategory.addCrashSection( "ConnectedSides", node.getConnectedSides() ); + + DimensionalCoord dc = node.getGridBlock().getLocation(); + if ( dc != null ) + crashreportcategory.addCrashSection( "Location", dc ); + } }; diff --git a/me/cluster/implementations/CraftingCPUCluster.java b/me/cluster/implementations/CraftingCPUCluster.java index 1488a3c20..8eaa87d3b 100644 --- a/me/cluster/implementations/CraftingCPUCluster.java +++ b/me/cluster/implementations/CraftingCPUCluster.java @@ -54,6 +54,7 @@ import appeng.tile.crafting.TileCraftingTile; import appeng.util.Platform; import appeng.util.item.AEItemStack; +import com.google.common.collect.ImmutableList; import com.google.common.collect.ImmutableSet; import cpw.mods.fml.common.FMLCommonHandler; @@ -76,6 +77,8 @@ public class CraftingCPUCluster implements IAECluster, ICraftingCPU boolean waiting = false; private boolean isComplete = true; + int usedOps[] = new int[3]; + Map tasks = new HashMap(); IItemList waitingFor = AEApi.instance().storage().createItemList(); @@ -106,16 +109,18 @@ public class CraftingCPUCluster implements IAECluster, ICraftingCPU { Iterator, Object>> i = getListeners(); + ImmutableList single = null; + // protect integrity if ( i.hasNext() ) - diff = diff.copy(); + single = ImmutableList.of( diff.copy() ); while (i.hasNext()) { Entry, Object> o = i.next(); IMEMonitorHandlerReceiver recv = o.getKey(); if ( recv.isValid( o.getValue() ) ) - recv.postChange( null, diff, src ); + recv.postChange( null, single, src ); else i.remove(); } @@ -492,8 +497,8 @@ public class CraftingCPUCluster implements IAECluster, ICraftingCPU IItemList list; getListOfItem( list = AEApi.instance().storage().createItemList(), CraftingItemList.ALL ); - for (IAEItemStack g : list) - postChange( g, machineSrc ); + for (IAEItemStack is : list) + postChange( is, machineSrc ); isComplete = true; myLastLink = null; @@ -539,14 +544,21 @@ public class CraftingCPUCluster implements IAECluster, ICraftingCPU if ( waiting || tasks.isEmpty() ) // nothing to do here... return; - remainingOperations = accelerator + 1; + remainingOperations = accelerator + 1 - (usedOps[0] + usedOps[1] + usedOps[2]); + int started = remainingOperations; - do + if ( remainingOperations > 0 ) { - didsomething = false; - executeCrafting( eg, cc ); + do + { + didsomething = false; + executeCrafting( eg, cc ); + } + while (didsomething && remainingOperations > 0); } - while (didsomething && remainingOperations > 0); + usedOps[2] = usedOps[1]; + usedOps[1] = usedOps[0]; + usedOps[0] = started - remainingOperations; if ( remainingOperations > 0 && didsomething == false ) waiting = true; @@ -1091,4 +1103,11 @@ public class CraftingCPUCluster implements IAECluster, ICraftingCPU return wat != null && wat.getStackSize() > 0; } + public void breakCluster() + { + TileCraftingTile t = getCore(); + if ( t != null ) + t.breakCluster(); + } + } diff --git a/me/storage/CellInventoryHandler.java b/me/storage/CellInventoryHandler.java index aa0604a0f..e5f35a098 100644 --- a/me/storage/CellInventoryHandler.java +++ b/me/storage/CellInventoryHandler.java @@ -93,4 +93,31 @@ public class CellInventoryHandler extends MEInventoryHandler imple } } } + + public boolean isPreformatted() + { + return ! myPartitionList.isEmpty(); + } + + public boolean isFuzzy() + { + return myPartitionList instanceof FuzzyPriorityList; + } + + @Override + public IncludeExclude getIncludeExcludeMode() + { + return myWhitelist; + } + + public int getStatusForCell() + { + int val = getCellInv().getStatusForCell(); + + if ( val == 1 && isPreformatted() ) + val = 2; + + return val; + } + } diff --git a/me/storage/MEMonitorIInventory.java b/me/storage/MEMonitorIInventory.java index a7dce719e..93144f154 100644 --- a/me/storage/MEMonitorIInventory.java +++ b/me/storage/MEMonitorIInventory.java @@ -2,6 +2,7 @@ package appeng.me.storage; import java.util.HashMap; import java.util.Iterator; +import java.util.LinkedList; import java.util.Map.Entry; import java.util.TreeMap; @@ -163,6 +164,8 @@ public class MEMonitorIInventory implements IMEInventory, IMEMonit { boolean changed = false; + LinkedList changes = new LinkedList(); + list.resetStatus(); for (ItemSlot is : adaptor) { @@ -178,12 +181,12 @@ public class MEMonitorIInventory implements IMEInventory, IMEMonit if ( old != null && old.aeStack != null ) { old.aeStack.setStackSize( -old.aeStack.getStackSize() ); - postDiffrence( old.aeStack ); + changes.add( old.aeStack ); } if ( cis != null && cis.aeStack != null ) { - postDiffrence( cis.aeStack ); + changes.add( cis.aeStack ); list.add( cis.aeStack ); } @@ -208,12 +211,15 @@ public class MEMonitorIInventory implements IMEInventory, IMEMonit IAEItemStack a = stack.copy(); a.setStackSize( diff ); - postDiffrence( a ); + changes.add( a ); changed = true; } } } + if ( !changes.isEmpty() ) + postDiffrence( changes ); + return changed ? TickRateModulation.URGENT : TickRateModulation.SLOWER; } @@ -228,7 +234,7 @@ public class MEMonitorIInventory implements IMEInventory, IMEMonit return !Platform.isSameItemPrecise( a, b ); } - private void postDiffrence(IAEItemStack a) + private void postDiffrence(Iterable a) { // AELog.info( a.getItemStack().getUnlocalizedName() + " @ " + a.getStackSize() ); if ( a != null ) diff --git a/me/storage/MEMonitorPassthu.java b/me/storage/MEMonitorPassthu.java index 6e8cf6d81..3587e30a1 100644 --- a/me/storage/MEMonitorPassthu.java +++ b/me/storage/MEMonitorPassthu.java @@ -90,7 +90,7 @@ public class MEMonitorPassthu> extends MEPassthru imple } @Override - public void postChange(IBaseMonitor monitor, T change, BaseActionSource source) + public void postChange(IBaseMonitor monitor, Iterable change, BaseActionSource source) { Iterator, Object>> i = listeners.entrySet().iterator(); while (i.hasNext()) diff --git a/parts/AEBasePart.java b/parts/AEBasePart.java index 0ba1f2a29..b7ac2f799 100644 --- a/parts/AEBasePart.java +++ b/parts/AEBasePart.java @@ -9,6 +9,7 @@ import java.util.List; import java.util.Random; import net.minecraft.client.renderer.RenderBlocks; +import net.minecraft.crash.CrashReportCategory; import net.minecraft.entity.Entity; import net.minecraft.entity.EntityLivingBase; import net.minecraft.entity.player.EntityPlayer; @@ -507,4 +508,9 @@ public class AEBasePart implements IPart, IGridProxyable, IActionHost, IUpgradea { return null; } + + public void addEntityCrashInfo(CrashReportCategory crashreportcategory) + { + crashreportcategory.addCrashSection( "Part Side", side ); + } } \ No newline at end of file diff --git a/parts/CableBusContainer.java b/parts/CableBusContainer.java index 0ad38c3de..6fdc6acb4 100644 --- a/parts/CableBusContainer.java +++ b/parts/CableBusContainer.java @@ -135,6 +135,7 @@ public class CableBusContainer extends CableBusStorage implements AEMultiTile, I updateDynamicRender(); updateConnections(); markForUpdate(); + markForSave(); partChanged(); } } @@ -267,6 +268,7 @@ public class CableBusContainer extends CableBusStorage implements AEMultiTile, I updateConnections(); markForUpdate(); + markForSave(); partChanged(); return ForgeDirection.UNKNOWN; } @@ -310,6 +312,7 @@ public class CableBusContainer extends CableBusStorage implements AEMultiTile, I updateDynamicRender(); updateConnections(); markForUpdate(); + markForSave(); partChanged(); return side; } diff --git a/parts/automation/PartFormationPlane.java b/parts/automation/PartFormationPlane.java index dae636bc1..c2de9e345 100644 --- a/parts/automation/PartFormationPlane.java +++ b/parts/automation/PartFormationPlane.java @@ -47,6 +47,7 @@ import appeng.api.storage.data.IAEItemStack; import appeng.api.storage.data.IItemList; import appeng.api.util.IConfigManager; import appeng.client.texture.CableBusTextures; +import appeng.core.AEConfig; import appeng.core.sync.GuiBridge; import appeng.helpers.IPriorityHost; import appeng.me.GridAccessException; @@ -111,6 +112,7 @@ public class PartFormationPlane extends PartUpgradeable implements ICellContaine { wasActive = currentActive; updateHandler();// proxy.getGrid().postEvent( new MENetworkCellArrayUpdate() ); + getHost().markForUpdate(); } } @@ -122,6 +124,7 @@ public class PartFormationPlane extends PartUpgradeable implements ICellContaine { wasActive = currentActive; updateHandler();// proxy.getGrid().postEvent( new MENetworkCellArrayUpdate() ); + getHost().markForUpdate(); } } @@ -242,7 +245,7 @@ public class PartFormationPlane extends PartUpgradeable implements ICellContaine @Override public List getCellArray(StorageChannel channel) { - if ( proxy.isActive() ) + if ( proxy.isActive() && channel == StorageChannel.ITEMS ) { List Handler = new ArrayList( 1 ); Handler.add( myHandler ); @@ -449,7 +452,7 @@ public class PartFormationPlane extends PartUpgradeable implements ICellContaine for (List Z : c.entityLists) sum += Z.size(); - if ( sum < 32 ) + if ( sum < AEConfig.instance.formationPlaneEntityLimit ) { if ( type == Actionable.MODULATE ) { diff --git a/parts/automation/PartImportBus.java b/parts/automation/PartImportBus.java index 3774e8ac8..41805bf04 100644 --- a/parts/automation/PartImportBus.java +++ b/parts/automation/PartImportBus.java @@ -66,6 +66,9 @@ public class PartImportBus extends PartSharedItemBus implements IGridTickable, I @Override public boolean canInsert(ItemStack stack) { + if ( stack == null || stack.getItem() == null ) + return false; + IAEItemStack out = destination.injectItems( lastItemChecked = AEApi.instance().storage().createItemStack( stack ), Actionable.SIMULATE, mySrc ); if ( out == null ) return true; diff --git a/parts/automation/PartLevelEmitter.java b/parts/automation/PartLevelEmitter.java index 67d1397e0..8ffe4be61 100644 --- a/parts/automation/PartLevelEmitter.java +++ b/parts/automation/PartLevelEmitter.java @@ -257,7 +257,7 @@ public class PartLevelEmitter extends PartUpgradeable implements IEnergyWatcherH } @Override - public void postChange(IBaseMonitor monitor, IAEItemStack change, BaseActionSource actionSource) + public void postChange(IBaseMonitor monitor, Iterable change, BaseActionSource actionSource) { updateReportingValue( (IMEMonitor) monitor ); } diff --git a/parts/misc/PartCableAnchor.java b/parts/misc/PartCableAnchor.java index 8a5d2ce11..c8acf2eb6 100644 --- a/parts/misc/PartCableAnchor.java +++ b/parts/misc/PartCableAnchor.java @@ -218,7 +218,7 @@ public class PartCableAnchor implements IPart @Override public boolean isLadder(EntityLivingBase entity) { - return mySide.offsetY == 0 && entity.isCollidedHorizontally; + return mySide.offsetY == 0 && ( entity.isCollidedHorizontally || ! entity.onGround ); } @Override diff --git a/parts/misc/PartInvertedToggleBus.java b/parts/misc/PartInvertedToggleBus.java index 5652994dd..d21c2b67c 100644 --- a/parts/misc/PartInvertedToggleBus.java +++ b/parts/misc/PartInvertedToggleBus.java @@ -7,6 +7,8 @@ public class PartInvertedToggleBus extends PartToggleBus public PartInvertedToggleBus(ItemStack is) { super( PartInvertedToggleBus.class, is ); + proxy.setIdlePowerUsage( 0.0 ); + outerProxy.setIdlePowerUsage( 0.0 ); proxy.setFlags(); outerProxy.setFlags(); } diff --git a/parts/misc/PartStorageBus.java b/parts/misc/PartStorageBus.java index 6e7293c2e..5f0546aed 100644 --- a/parts/misc/PartStorageBus.java +++ b/parts/misc/PartStorageBus.java @@ -450,7 +450,7 @@ public class PartStorageBus extends PartUpgradeable implements IGridTickable, IC } @Override - public void postChange(IBaseMonitor monitor, IAEItemStack change, BaseActionSource source) + public void postChange(IBaseMonitor monitor, Iterable change, BaseActionSource source) { try { diff --git a/parts/networking/PartCable.java b/parts/networking/PartCable.java index cf7e38588..4dcb7c3c6 100644 --- a/parts/networking/PartCable.java +++ b/parts/networking/PartCable.java @@ -601,9 +601,10 @@ public class PartCable extends AEBasePart implements IPartCable rh.setTexture( getTexture( getCableColor() ) ); } - else if ( ghh != null && ccph != null && ghh.getCableConnectionType( of ) == AECableType.COVERED && ccph.getColor() != AEColor.Transparent ) + else if ( ghh != null && ccph != null && ghh.getCableConnectionType( of ) == AECableType.COVERED && ccph.getColor() != AEColor.Transparent + && ccph.getPart( of.getOpposite() ) == null ) rh.setTexture( getCoveredTexture( ccph.getColor() ) ); - else if ( ghh != null && ccph != null && ghh.getCableConnectionType( of ) == AECableType.SMART ) + else if ( ghh != null && ccph != null && ghh.getCableConnectionType( of ) == AECableType.SMART && ccph.getPart( of.getOpposite() ) == null ) { isSmart = true; rh.setTexture( getSmartTexture( getCableColor() ) ); diff --git a/parts/networking/PartDenseCable.java b/parts/networking/PartDenseCable.java index e7887e746..a83a93a11 100644 --- a/parts/networking/PartDenseCable.java +++ b/parts/networking/PartDenseCable.java @@ -320,6 +320,7 @@ public class PartDenseCable extends PartCable @SideOnly(Side.CLIENT) public void renderStatic(int x, int y, int z, IPartRenderHelper rh, RenderBlocks renderer) { + renderCache = rh.useSimpliedRendering( x, y, z, this, renderCache ); rh.setTexture( getTexture( getCableColor() ) ); EnumSet sides = connections.clone(); diff --git a/services/VersionChecker.java b/services/VersionChecker.java index a72d5a9ba..af64a29cc 100644 --- a/services/VersionChecker.java +++ b/services/VersionChecker.java @@ -26,7 +26,8 @@ public class VersionChecker implements Runnable private long delay = 0; private boolean VersionChecker = true; - public VersionChecker() { + public VersionChecker() + { long now = (new Date()).getTime(); delay = (1000 * 3600 * 5) - (now - AEConfig.instance.latestTimeStamp); if ( delay < 1 ) @@ -38,19 +39,21 @@ public class VersionChecker implements Runnable { try { - Thread.sleep( delay ); + sleep( delay ); } catch (InterruptedException e) { + // :( } while (true) { Thread.yield(); + try { String MCVersion = cpw.mods.fml.common.Loader.instance().getMCVersionString().replace( "Minecraft ", "" ); - URL url = new URL( "http://ae2.ae-mod.info/builds/latest.json?VersionMC=" + MCVersion + "&Channel=" + AEConfig.CHANNEL + "&CurrentVersion=" + URL url = new URL( "http://feeds.ae-mod.info/latest.json?VersionMC=" + MCVersion + "&Channel=" + AEConfig.CHANNEL + "&CurrentVersion=" + AEConfig.VERSION ); URLConnection yc = url.openConnection(); @@ -105,13 +108,13 @@ public class VersionChecker implements Runnable } } - Thread.sleep( 1000 * 3600 * 4 ); + sleep( 1000 * 3600 * 4 ); } catch (Exception e) { try { - Thread.sleep( 1000 * 3600 * 4 ); + sleep( 1000 * 3600 * 4 ); } catch (InterruptedException e1) { @@ -120,4 +123,9 @@ public class VersionChecker implements Runnable } } } + + private void sleep(long i) throws InterruptedException + { + Thread.sleep( i ); + } } diff --git a/tile/AEBaseTile.java b/tile/AEBaseTile.java index db4a7126d..5ae96bebf 100644 --- a/tile/AEBaseTile.java +++ b/tile/AEBaseTile.java @@ -322,6 +322,7 @@ public class AEBaseTile extends TileEntity implements IOrientable, ICommonTile, AELog.error( t ); } + stream.capacity( stream.readableBytes() ); data.setByteArray( "X", stream.array() ); return new S35PacketUpdateTileEntity( xCoord, yCoord, zCoord, 64, data ); } diff --git a/tile/crafting/TileCraftingTile.java b/tile/crafting/TileCraftingTile.java index 6c3ca7432..731be277a 100644 --- a/tile/crafting/TileCraftingTile.java +++ b/tile/crafting/TileCraftingTile.java @@ -62,6 +62,9 @@ public class TileCraftingTile extends AENetworkTile implements IAEMultiBlock, IP public void updateStatus(CraftingCPUCluster c) { + if ( clust != null && clust != c ) + clust.breakCluster(); + clust = c; updateMeta( true ); } diff --git a/tile/crafting/TileMolecularAssembler.java b/tile/crafting/TileMolecularAssembler.java index 40a29eb01..838649351 100644 --- a/tile/crafting/TileMolecularAssembler.java +++ b/tile/crafting/TileMolecularAssembler.java @@ -375,6 +375,11 @@ public class TileMolecularAssembler extends AENetworkInvTile implements IAEAppEn if ( inv.getStackInSlot( 9 ) != null ) { pushOut( inv.getStackInSlot( 9 ) ); + + // did it eject? + if ( inv.getStackInSlot( 9 ) == null ) + markDirty(); + ejectHeldItems(); updateSleepyness(); progress = 0; @@ -453,6 +458,7 @@ public class TileMolecularAssembler extends AENetworkInvTile implements IAEAppEn // ;P } + markDirty(); updateSleepyness(); return isAwake ? TickRateModulation.IDLE : TickRateModulation.SLEEP; } @@ -543,7 +549,22 @@ public class TileMolecularAssembler extends AENetworkInvTile implements IAEAppEn @MENetworkEventSubscribe public void onPowerEvent(MENetworkPowerStatusChange p) { - boolean newState = gridProxy.isActive(); + updatePowerState(); + } + + private void updatePowerState() + { + boolean newState = false; + + try + { + newState = gridProxy.isActive() && gridProxy.getEnergy().extractAEPower( 1, Actionable.SIMULATE, PowerMultiplier.CONFIG ) > 0.0001; + } + catch (GridAccessException e) + { + + } + if ( newState != isPowered ) { isPowered = newState; diff --git a/tile/misc/TileQuartzGrowthAccelerator.java b/tile/misc/TileQuartzGrowthAccelerator.java index b387bf453..2aaf80140 100644 --- a/tile/misc/TileQuartzGrowthAccelerator.java +++ b/tile/misc/TileQuartzGrowthAccelerator.java @@ -7,6 +7,7 @@ import java.util.EnumSet; import net.minecraftforge.common.util.ForgeDirection; import appeng.api.implementations.IPowerChannelState; +import appeng.api.implementations.tiles.ICrystalGrowthAccelerator; import appeng.api.networking.events.MENetworkEventSubscribe; import appeng.api.networking.events.MENetworkPowerStatusChange; import appeng.api.util.AECableType; @@ -16,7 +17,7 @@ import appeng.tile.events.TileEventType; import appeng.tile.grid.AENetworkTile; import appeng.util.Platform; -public class TileQuartzGrowthAccelerator extends AENetworkTile implements IPowerChannelState +public class TileQuartzGrowthAccelerator extends AENetworkTile implements IPowerChannelState, ICrystalGrowthAccelerator { public boolean hasPower = false; diff --git a/tile/storage/TileChest.java b/tile/storage/TileChest.java index 036a9a846..5db758613 100644 --- a/tile/storage/TileChest.java +++ b/tile/storage/TileChest.java @@ -294,7 +294,7 @@ public class TileChest extends AENetworkPowerTile implements IMEChest, IFluidHan } @Override - public void postChange(IBaseMonitor monitor, T change, BaseActionSource source) + public void postChange(IBaseMonitor monitor, Iterable change, BaseActionSource source) { if ( source == mySrc || (source instanceof PlayerSource && ((PlayerSource) source).via == TileChest.this) ) { diff --git a/tile/storage/TileDrive.java b/tile/storage/TileDrive.java index 86adbaefd..549bc5c47 100644 --- a/tile/storage/TileDrive.java +++ b/tile/storage/TileDrive.java @@ -163,6 +163,13 @@ public class TileDrive extends AENetworkInvTile implements IChestOrDrive, IPrior return inv; } + @Override + public void onReady() + { + super.onReady(); + updateState(); + } + @Override public void onChangeInventory(IInventory inv, int slot, InvOperation mc, ItemStack removed, ItemStack added) { diff --git a/util/Platform.java b/util/Platform.java index f5876445c..c4901078e 100644 --- a/util/Platform.java +++ b/util/Platform.java @@ -7,6 +7,7 @@ import java.util.ArrayList; import java.util.Collection; import java.util.EnumSet; import java.util.Iterator; +import java.util.LinkedList; import java.util.List; import java.util.Random; import java.util.Set; @@ -54,6 +55,7 @@ import net.minecraft.world.WorldServer; import net.minecraft.world.chunk.Chunk; import net.minecraftforge.common.util.FakePlayerFactory; import net.minecraftforge.common.util.ForgeDirection; +import net.minecraftforge.oredict.OreDictionary; import appeng.api.AEApi; import appeng.api.config.AccessRestriction; import appeng.api.config.Actionable; @@ -1398,28 +1400,25 @@ public class Platform public static void postChanges(IStorageGrid gs, ItemStack removed, ItemStack added, BaseActionSource src) { + IItemList itemChanges = AEApi.instance().storage().createItemList(); + IItemList fluidChanges = AEApi.instance().storage().createFluidList(); + if ( removed != null ) { IMEInventory myItems = AEApi.instance().registries().cell().getCellInventory( removed, null, StorageChannel.ITEMS ); if ( myItems != null ) { - for (IAEItemStack is : myItems.getAvailableItems( AEApi.instance().storage().createItemList() )) - { + for (IAEItemStack is : myItems.getAvailableItems( itemChanges )) is.setStackSize( -is.getStackSize() ); - gs.postAlterationOfStoredItems( StorageChannel.ITEMS, is, src ); - } } IMEInventory myFluids = AEApi.instance().registries().cell().getCellInventory( removed, null, StorageChannel.FLUIDS ); if ( myFluids != null ) { - for (IAEFluidStack is : myFluids.getAvailableItems( AEApi.instance().storage().createFluidList() )) - { + for (IAEFluidStack is : myFluids.getAvailableItems( fluidChanges )) is.setStackSize( -is.getStackSize() ); - gs.postAlterationOfStoredItems( StorageChannel.FLUIDS, is, src ); - } } } @@ -1428,28 +1427,22 @@ public class Platform IMEInventory myItems = AEApi.instance().registries().cell().getCellInventory( added, null, StorageChannel.ITEMS ); if ( myItems != null ) - { - for (IAEItemStack is : myItems.getAvailableItems( AEApi.instance().storage().createItemList() )) - { - gs.postAlterationOfStoredItems( StorageChannel.ITEMS, is, src ); - } - } + myItems.getAvailableItems( itemChanges ); IMEInventory myFluids = AEApi.instance().registries().cell().getCellInventory( added, null, StorageChannel.FLUIDS ); if ( myFluids != null ) - { - for (IAEFluidStack is : myFluids.getAvailableItems( AEApi.instance().storage().createFluidList() )) - { - gs.postAlterationOfStoredItems( StorageChannel.FLUIDS, is, src ); - } - } + myFluids.getAvailableItems( fluidChanges ); } + + gs.postAlterationOfStoredItems( StorageChannel.ITEMS, itemChanges, src ); } static public > void postListChanges(IItemList before, IItemList after, IMEMonitorHandlerReceiver meMonitorPassthu, BaseActionSource source) { + LinkedList changes = new LinkedList(); + for (T is : before) is.setStackSize( -is.getStackSize() ); @@ -1460,9 +1453,12 @@ public class Platform { if ( is.getStackSize() != 0 ) { - meMonitorPassthu.postChange( null, is, source ); + changes.add( is ); } } + + if ( !changes.isEmpty() ) + meMonitorPassthu.postChange( null, changes, source ); } public static int generateTileHash(TileEntity target) @@ -1524,6 +1520,12 @@ public class Platform boolean a_isSecure = isPowered( a.getGrid() ) && a.lastSecurityKey != -1; boolean b_isSecure = isPowered( b.getGrid() ) && b.lastSecurityKey != -1; + if ( AEConfig.instance.isFeatureEnabled( AEFeature.LogSecurityAudits ) ) + { + AELog.info( "Audit: " + a_isSecure + " : " + b_isSecure + " @ " + a.lastSecurityKey + " vs " + b.lastSecurityKey + " & " + a.playerID + " vs " + + b.playerID ); + } + // can't do that son... if ( a_isSecure && b_isSecure ) return true; @@ -1654,7 +1656,10 @@ public class Platform } } - if ( aitems != null && (ae_req.isOre() || providedTemplate.hasTagCompound() || providedTemplate.isItemStackDamageable()) ) + boolean checkFuzzy = ae_req.isOre() || providedTemplate.getItemDamage() == OreDictionary.WILDCARD_VALUE || providedTemplate.hasTagCompound() + || providedTemplate.isItemStackDamageable(); + + if ( aitems != null && checkFuzzy ) { for (IAEItemStack x : aitems) { @@ -1701,7 +1706,7 @@ public class Platform } ItemStack ci = i.getContainerItem( stackInSlot.copy() ); - if ( ci.isItemStackDamageable() && ci.getItemDamage() == ci.getMaxDamage() ) + if ( ci != null && ci.isItemStackDamageable() && ci.getItemDamage() == ci.getMaxDamage() ) ci = null; return ci;