This commit is contained in:
AlgorithmX2 2014-07-02 18:21:36 -05:00
commit 4a88f87e2a
30 changed files with 612 additions and 213 deletions

View file

@ -41,6 +41,9 @@ public class BlockCraftingUnit extends AEBaseBlock
@Override
public boolean onActivated(World w, int x, int y, int z, EntityPlayer p, int side, float hitX, float hitY, float hitZ)
{
if ( Platform.isClient() )
return true;
TileCraftingTile tg = getTileEntity( w, x, y, z );
if ( tg != null && !p.isSneaking() && tg.isFormed() && tg.isActive() )
{
@ -94,6 +97,16 @@ public class BlockCraftingUnit extends AEBaseBlock
return RenderBlockCrafting.class;
}
@Override
public void breakBlock(World w, int x, int y, int z, Block a, int b)
{
TileCraftingTile cp = getTileEntity( w, x, y, z );
if ( cp != null )
cp.breakCluster();
super.breakBlock( w, x, y, z, a, b );
}
@Override
public void onNeighborBlockChange(World w, int x, int y, int z, Block junk)
{

View file

@ -61,6 +61,16 @@ public class BlockQuantumLinkChamber extends AEBaseBlock implements ICustomColli
bridge.neighborUpdate();
}
@Override
public void breakBlock(World w, int x, int y, int z, Block a, int b)
{
TileQuantumBridge bridge = getTileEntity( w, x, y, z );
if ( bridge != null )
bridge.breakCluster();
super.breakBlock( w, x, y, z, a, b );
}
@Override
protected Class<? extends BaseBlockRender> getRenderer()
{

View file

@ -37,6 +37,16 @@ public class BlockQuantumRing extends AEBaseBlock implements ICustomCollision
bridge.neighborUpdate();
}
@Override
public void breakBlock(World w, int x, int y, int z, Block a, int b)
{
TileQuantumBridge bridge = getTileEntity( w, x, y, z );
if ( bridge != null )
bridge.breakCluster();
super.breakBlock( w, x, y, z, a, b );
}
@Override
protected Class<? extends BaseBlockRender> getRenderer()
{

View file

@ -144,8 +144,8 @@ public class GuiMEMonitorable extends AEBaseMEGui implements ISortSource, IConfi
boolean hasNEI = AppEng.instance.isIntegrationEnabled( "NEI" );
int NEI = hasNEI ? 4 : 0;
int top = hasNEI ? 22 : 4;
int NEI = hasNEI ? 0 : 0;
int top = hasNEI ? 22 : 0;
int magicNumber = 114 + 1;
int extraSpace = height - magicNumber - NEI - top - reservedSpace;
@ -183,7 +183,9 @@ public class GuiMEMonitorable extends AEBaseMEGui implements ISortSource, IConfi
// slot 18
this.ySize = magicNumber + rows * 18 + reservedSpace;
this.guiTop = top;
// this.guiTop = top;
int unusedSpace = height - ySize;
guiTop = (int) Math.floor( (float) unusedSpace / (unusedSpace < 0 ? 3.8f : 2.0f) );
int offset = guiTop + 8;
@ -235,9 +237,15 @@ public class GuiMEMonitorable extends AEBaseMEGui implements ISortSource, IConfi
if ( s instanceof AppEngSlot )
{
if ( ((AppEngSlot) s).xDisplayPosition < 197 )
((AppEngSlot) s).yDisplayPosition = ((AppEngSlot) s).defY + ySize - 78 - 5;
repositionSlot( (AppEngSlot) s );
}
}
}
protected void repositionSlot(AppEngSlot s)
{
s.yDisplayPosition = s.defY + ySize - 78 - 5;
}
@Override

View file

@ -12,6 +12,7 @@ import appeng.api.storage.ITerminalHost;
import appeng.client.gui.widgets.GuiImgButton;
import appeng.client.gui.widgets.GuiTabButton;
import appeng.container.implementations.ContainerPatternTerm;
import appeng.container.slot.AppEngSlot;
import appeng.core.localization.GuiText;
import appeng.core.sync.network.NetworkHandler;
import appeng.core.sync.packets.PacketValueConfig;
@ -42,7 +43,7 @@ public class GuiPatternTerm extends GuiMEMonitorable
buttonList.add( clearBtn = new GuiImgButton( this.guiLeft + 74, this.guiTop + this.ySize - 163, Settings.ACTIONS, ActionItems.CLOSE ) );
clearBtn.halfSize = true;
buttonList.add( encodeBtn = new GuiImgButton( this.guiLeft + 147, this.guiTop + this.ySize - 144, Settings.ACTIONS, ActionItems.ENCODE ) );
buttonList.add( encodeBtn = new GuiImgButton( this.guiLeft + 147, this.guiTop + this.ySize - 142, Settings.ACTIONS, ActionItems.ENCODE ) );
}
@Override
@ -81,10 +82,18 @@ public class GuiPatternTerm extends GuiMEMonitorable
}
}
protected void repositionSlot(AppEngSlot s)
{
if ( s.isPlayerSide() )
s.yDisplayPosition = s.defY + ySize - 78 - 5;
else
s.yDisplayPosition = s.defY + ySize - 78 - 3;
}
public GuiPatternTerm(InventoryPlayer inventoryPlayer, ITerminalHost te) {
super( inventoryPlayer, te, new ContainerPatternTerm( inventoryPlayer, te ) );
container = (ContainerPatternTerm) this.inventorySlots;
reservedSpace = 85;
reservedSpace = 81;
}
protected String getBackground()

View file

@ -34,9 +34,9 @@ public class BusRenderHelper implements IPartRenderHelper
AEBaseBlock blk = (AEBaseBlock) AEApi.instance().blocks().blockMultiPart.block();
BaseBlockRender bbr = new BaseBlockRender();
public ForgeDirection ax;
public ForgeDirection ay;
public ForgeDirection az;
private ForgeDirection ax = ForgeDirection.EAST;
private ForgeDirection ay = ForgeDirection.UP;
private ForgeDirection az = ForgeDirection.SOUTH;
int color = 0xffffff;
@ -457,4 +457,11 @@ public class BusRenderHelper implements IPartRenderHelper
return az;
}
public void setOrientation(ForgeDirection dx, ForgeDirection dy, ForgeDirection dz)
{
ax = dx == null ? ForgeDirection.EAST : dx;
ay = dy == null ? ForgeDirection.UP : dy;
az = dz == null ? ForgeDirection.SOUTH : dz;
}
}

View file

@ -112,9 +112,7 @@ public class BusRenderer implements IItemRenderer
BusRenderHelper.instance.setInvColor( 0xffffff );
renderer.blockAccess = ClientHelper.proxy.getWorld();
BusRenderHelper.instance.ax = ForgeDirection.EAST;
BusRenderHelper.instance.ay = ForgeDirection.UP;
BusRenderHelper.instance.az = ForgeDirection.SOUTH;
BusRenderHelper.instance.setOrientation( ForgeDirection.EAST, ForgeDirection.UP, ForgeDirection.SOUTH );
renderer.uvRotateBottom = renderer.uvRotateEast = renderer.uvRotateNorth = renderer.uvRotateSouth = renderer.uvRotateTop = renderer.uvRotateWest = 0;
renderer.useInventoryTint = false;

View file

@ -63,8 +63,8 @@ public class CableRenderHelper
if ( part != null )
{
cableBusContainer.setSide( s );
BusCollisionHelper bch = new BusCollisionHelper( boxes, BusRenderHelper.instance.ax, BusRenderHelper.instance.ay,
BusRenderHelper.instance.az, null, true );
BusRenderHelper brh = BusRenderHelper.instance;
BusCollisionHelper bch = new BusCollisionHelper( boxes, brh.getWorldX(), brh.getWorldY(), brh.getWorldZ(), null, true );
part.getBoxes( bch );
}
}
@ -132,46 +132,49 @@ public class CableRenderHelper
IPart part = cableBusContainer.getPart( s );
if ( part != null )
{
ForgeDirection ax, ay, az;
switch (s)
{
case DOWN:
BusRenderHelper.instance.ax = ForgeDirection.EAST;
BusRenderHelper.instance.ay = ForgeDirection.NORTH;
BusRenderHelper.instance.az = ForgeDirection.DOWN;
ax = ForgeDirection.EAST;
ay = ForgeDirection.NORTH;
az = ForgeDirection.DOWN;
break;
case UP:
BusRenderHelper.instance.ax = ForgeDirection.EAST;
BusRenderHelper.instance.ay = ForgeDirection.SOUTH;
BusRenderHelper.instance.az = ForgeDirection.UP;
ax = ForgeDirection.EAST;
ay = ForgeDirection.SOUTH;
az = ForgeDirection.UP;
break;
case EAST:
BusRenderHelper.instance.ax = ForgeDirection.SOUTH;
BusRenderHelper.instance.ay = ForgeDirection.UP;
BusRenderHelper.instance.az = ForgeDirection.EAST;
ax = ForgeDirection.SOUTH;
ay = ForgeDirection.UP;
az = ForgeDirection.EAST;
break;
case WEST:
BusRenderHelper.instance.ax = ForgeDirection.NORTH;
BusRenderHelper.instance.ay = ForgeDirection.UP;
BusRenderHelper.instance.az = ForgeDirection.WEST;
ax = ForgeDirection.NORTH;
ay = ForgeDirection.UP;
az = ForgeDirection.WEST;
break;
case NORTH:
BusRenderHelper.instance.ax = ForgeDirection.WEST;
BusRenderHelper.instance.ay = ForgeDirection.UP;
BusRenderHelper.instance.az = ForgeDirection.NORTH;
ax = ForgeDirection.WEST;
ay = ForgeDirection.UP;
az = ForgeDirection.NORTH;
break;
case SOUTH:
BusRenderHelper.instance.ax = ForgeDirection.EAST;
BusRenderHelper.instance.ay = ForgeDirection.UP;
BusRenderHelper.instance.az = ForgeDirection.SOUTH;
ax = ForgeDirection.EAST;
ay = ForgeDirection.UP;
az = ForgeDirection.SOUTH;
break;
case UNKNOWN:
default:
BusRenderHelper.instance.ax = ForgeDirection.EAST;
BusRenderHelper.instance.ay = ForgeDirection.UP;
BusRenderHelper.instance.az = ForgeDirection.SOUTH;
ax = ForgeDirection.EAST;
ay = ForgeDirection.UP;
az = ForgeDirection.SOUTH;
break;
}
BusRenderHelper.instance.setOrientation( ax, ay, az );
part.renderDynamic( x, y, z, BusRenderHelper.instance, BusRenderer.instance.renderer );
}
}

View file

@ -61,9 +61,8 @@ public class RenderBlockCrafting extends BaseBlockRender
BusRenderHelper i = BusRenderHelper.instance;
renderer.blockAccess = w;
i.setPass( 0 );
i.ax = ForgeDirection.EAST;
i.ay = ForgeDirection.UP;
i.az = ForgeDirection.SOUTH;
i.setOrientation( ForgeDirection.EAST, ForgeDirection.UP, ForgeDirection.SOUTH );
try
{

View file

@ -141,9 +141,9 @@ public class ContainerPatternTerm extends ContainerMEMonitorable implements IAEA
super.detectAndSendChanges();
if ( Platform.isServer() )
{
if ( craftingMode != ct.craftingMode )
if ( craftingMode != ct.isCraftingRecipe() )
{
craftingMode = ct.craftingMode;
craftingMode = ct.isCraftingRecipe();
updateOrderOfOutputSlots();
}
}
@ -285,9 +285,9 @@ public class ContainerPatternTerm extends ContainerMEMonitorable implements IAEA
public boolean isSlotEnabled(int idx)
{
if ( idx == 1 )
return Platform.isServer() ? ct.craftingMode == false : craftingMode == false;
return Platform.isServer() ? ct.isCraftingRecipe() == false : craftingMode == false;
if ( idx == 2 )
return Platform.isServer() ? ct.craftingMode == true : craftingMode == true;
return Platform.isServer() ? ct.isCraftingRecipe() == true : craftingMode == true;
return false;
}
@ -386,6 +386,26 @@ public class ContainerPatternTerm extends ContainerMEMonitorable implements IAEA
}
}
@Override
public ItemStack slotClick(int slotNum, int p_75144_2_, int p_75144_3_, EntityPlayer p_75144_4_)
{
Slot s = null;
for (Object g : inventorySlots)
{
if ( g instanceof Slot )
{
Slot gg = (Slot) g;
if ( gg.slotNumber == slotNum )
s = gg;
}
}
ItemStack is = super.slotClick( slotNum, p_75144_2_, p_75144_3_, p_75144_4_ );
if ( s == patternSlotOUT )
detectAndSendChanges();
return is;
}
public void clear()
{
for (Slot s : craftingSlots)

View file

@ -96,7 +96,7 @@ public class PacketValueConfig extends AppEngPacket
ContainerPatternTerm cpt = (ContainerPatternTerm) c;
if ( Name.equals( "PatternTerminal.CraftMode" ) )
{
cpt.ct.craftingMode = Value.equals( "1" );
cpt.ct.setCraftingRecipe( Value.equals( "1" ) );
}
else if ( Name.equals( "PatternTerminal.Encode" ) )
{

View file

@ -1,5 +1,6 @@
package appeng.items.materials;
import java.util.Arrays;
import java.util.Collections;
import java.util.Comparator;
import java.util.EnumSet;
@ -288,6 +289,8 @@ public class ItemMultiMaterial extends AEBaseItem implements IStorageComponent,
return Upgrades.SPEED;
case CardInverter:
return Upgrades.INVERTER;
case CardCrafting:
return Upgrades.CRAFTING;
default:
return null;
}
@ -296,11 +299,21 @@ public class ItemMultiMaterial extends AEBaseItem implements IStorageComponent,
@Override
public void getSubItems(Item par1, CreativeTabs par2CreativeTabs, List cList)
{
for (MaterialType mat : MaterialType.values())
List<MaterialType> types = Arrays.asList( MaterialType.values() );
Collections.sort( types, new Comparator<MaterialType>() {
@Override
public int compare(MaterialType o1, MaterialType o2)
{
return o1.name().compareTo( o2.name() );
}
} );
for (MaterialType mat : types)
{
if ( mat.damageValue >= 0 && mat.isRegistered() )
cList.add( new ItemStack( this, 1, mat.damageValue ) );
}
}
}

View file

@ -62,7 +62,7 @@ public enum MaterialType
EnderDust(46, AEFeature.QuantumNetworkBridge, "dustEnder", EntitySingularity.class), Singularity(47, AEFeature.QuantumNetworkBridge,
EntitySingularity.class), QESingularity(48, AEFeature.QuantumNetworkBridge, EntitySingularity.class),
BlankPattern(52);
BlankPattern(52), CardCrafting(53);
private String oreName;
private EnumSet<AEFeature> features;

View file

@ -61,7 +61,7 @@ public class ItemCrystalSeed extends AEBaseItem implements IGrowableCrystal
{
NBTTagCompound comp = Platform.openNbtData( is );
comp.setInteger( "progress", newDamage );
is.setItemDamage( (is.getItemDamage() / SINGLE_OFFSET) * SINGLE_OFFSET );
is.setItemDamage( (int) (is.getItemDamage() / LEVEL_OFFSET) * LEVEL_OFFSET );
}
public ItemCrystalSeed() {

View file

@ -4,11 +4,13 @@ import java.util.EnumSet;
import java.util.List;
import net.minecraft.entity.player.EntityPlayer;
import net.minecraft.entity.player.InventoryPlayer;
import net.minecraft.item.ItemStack;
import net.minecraft.nbt.NBTTagCompound;
import net.minecraft.nbt.NBTTagList;
import net.minecraft.world.World;
import net.minecraftforge.client.MinecraftForgeClient;
import appeng.api.AEApi;
import appeng.api.implementations.ICraftingPatternItem;
import appeng.api.networking.crafting.ICraftingPatternDetails;
import appeng.client.render.items.ItemEncodedPatternRenderer;
@ -29,6 +31,29 @@ public class ItemEncodedPattern extends AEBaseItem implements ICraftingPatternIt
MinecraftForgeClient.registerItemRenderer( this, new ItemEncodedPatternRenderer() );
}
@Override
public boolean onItemUseFirst(ItemStack stack, EntityPlayer player, World world, int x, int y, int z, int side, float hitX, float hitY, float hitZ)
{
InventoryPlayer inv = player.inventory;
for (int s = 0; s < player.inventory.getSizeInventory(); s++)
{
if ( inv.getStackInSlot( s ) == stack )
{
inv.setInventorySlotContents( s, AEApi.instance().materials().materialBlankPattern.stack( stack.stackSize ) );
return true;
}
}
return false;
}
@Override
public ItemStack onItemRightClick(ItemStack stack, World w, EntityPlayer p)
{
return AEApi.instance().materials().materialBlankPattern.stack( stack.stackSize );
}
@Override
public void addInformation(ItemStack is, EntityPlayer p, List l, boolean more)
{
@ -132,7 +157,9 @@ public class ItemEncodedPattern extends AEBaseItem implements ICraftingPatternIt
@Override
public ICraftingPatternDetails getPatternForItem(ItemStack is, World w)
{
return new PatternHelper( is, w );
if ( is.hasTagCompound() )
return new PatternHelper( is, w );
return null;
}
}

View file

@ -1,5 +1,8 @@
package appeng.items.parts;
import java.util.ArrayList;
import java.util.Collections;
import java.util.Comparator;
import java.util.EnumSet;
import java.util.HashMap;
import java.util.List;
@ -61,7 +64,7 @@ public class ItemMultiPart extends AEBaseItem implements IPartItem, IItemGroup
}
catch (Throwable e)
{
AELog.integration(e);
AELog.integration( e );
return null; // part not supported..
}
@ -200,7 +203,18 @@ public class ItemMultiPart extends AEBaseItem implements IPartItem, IItemGroup
@Override
public void getSubItems(Item number, CreativeTabs tab, List cList)
{
for (Entry<Integer, PartTypeIst> part : dmgToPart.entrySet())
List<Entry<Integer, PartTypeIst>> types = new ArrayList( dmgToPart.entrySet() );
Collections.sort( types, new Comparator<Entry<Integer, PartTypeIst>>() {
@Override
public int compare(Entry<Integer, PartTypeIst> o1, Entry<Integer, PartTypeIst> o2)
{
return o1.getValue().part.name().compareTo( o2.getValue().part.name() );
}
} );
for (Entry<Integer, PartTypeIst> part : types)
cList.add( new ItemStack( this, 1, part.getKey() ) );
}

View file

@ -20,10 +20,6 @@ import appeng.parts.networking.PartCableCovered;
import appeng.parts.networking.PartCableGlass;
import appeng.parts.networking.PartCableSmart;
import appeng.parts.networking.PartDenseCable;
import appeng.parts.networking.PartLumenCableCovered;
import appeng.parts.networking.PartLumenCableGlass;
import appeng.parts.networking.PartLumenCableSmart;
import appeng.parts.networking.PartLumenDenseCable;
import appeng.parts.networking.PartQuartzFiber;
import appeng.parts.p2p.PartP2PBCPower;
import appeng.parts.p2p.PartP2PIC2Power;
@ -105,15 +101,7 @@ public enum PartType
P2PTunnelEU(465, AEFeature.P2PTunnelEU, PartP2PIC2Power.class, GuiText.EUTunnel),
P2PTunnelRF(466, AEFeature.P2PTunnelRF, PartP2PRFPower.class, GuiText.RFTunnel),
LumenCableGlass(480, AEFeature.Core, PartLumenCableGlass.class),
LumenCableCovered(500, AEFeature.Core, PartLumenCableCovered.class),
LumenCableSmart(520, AEFeature.Core, PartLumenCableSmart.class),
LumenCableDense(540, AEFeature.DenseCables, PartLumenDenseCable.class);
P2PTunnelRF(466, AEFeature.P2PTunnelRF, PartP2PRFPower.class, GuiText.RFTunnel);
private final EnumSet<AEFeature> features;
private final Class<? extends IPart> myPart;
@ -136,9 +124,6 @@ public enum PartType
if ( this == CableSmart || this == CableCovered || this == CableGlass || this == CableDense )
return AEColor.values();
if ( this == LumenCableSmart || this == LumenCableCovered || this == LumenCableGlass || this == LumenCableDense )
return AEColor.values();
return null;
}

View file

@ -64,6 +64,8 @@ public class CraftingCPUCalculator extends MBCalculator
}
}
c.done();
Iterator<IGridHost> i = c.getTiles();
while (i.hasNext())
{

View file

@ -8,12 +8,15 @@ import java.util.Map.Entry;
import net.minecraft.inventory.InventoryCrafting;
import net.minecraft.item.ItemStack;
import net.minecraft.nbt.NBTTagCompound;
import net.minecraft.nbt.NBTTagList;
import net.minecraft.world.World;
import net.minecraft.world.WorldServer;
import appeng.api.AEApi;
import appeng.api.config.Actionable;
import appeng.api.config.FuzzyMode;
import appeng.api.config.PowerMultiplier;
import appeng.api.implementations.ICraftingPatternItem;
import appeng.api.networking.IGrid;
import appeng.api.networking.IGridHost;
import appeng.api.networking.IGridNode;
@ -23,6 +26,7 @@ import appeng.api.networking.crafting.ICraftingPatternDetails;
import appeng.api.networking.energy.IEnergyGrid;
import appeng.api.networking.events.MENetworkCraftingCpuChange;
import appeng.api.networking.security.BaseActionSource;
import appeng.api.networking.security.MachineSource;
import appeng.api.networking.storage.IBaseMonitor;
import appeng.api.networking.storage.IStorageGrid;
import appeng.api.storage.IMEInventory;
@ -46,6 +50,36 @@ import cpw.mods.fml.common.FMLCommonHandler;
public class CraftingCPUCluster implements IAECluster, IBaseMonitor<IAEItemStack>
{
class TaskProgress
{
long value;
};
/**
* crafting job info
*/
MECraftingInventory inventory = new MECraftingInventory();
IAEItemStack finalOutput;
boolean waiting = false;
private boolean isComplete = true;
Map<ICraftingPatternDetails, TaskProgress> tasks = new HashMap<ICraftingPatternDetails, TaskProgress>();
IItemList<IAEItemStack> waitingFor = AEApi.instance().storage().createItemList();
// instance sate
private LinkedList<TileCraftingTile> tiles = new LinkedList();
private LinkedList<TileCraftingTile> storage = new LinkedList<TileCraftingTile>();
private LinkedList<TileCraftingTile> status = new LinkedList<TileCraftingTile>();
MachineSource machineSrc = null;
int accelerator = 0;
public WorldCoord min;
public WorldCoord max;
public boolean isDestroyed = false;
private final HashMap<IMEMonitorHandlerReceiver<IAEItemStack>, Object> listeners = new HashMap<IMEMonitorHandlerReceiver<IAEItemStack>, Object>();
protected Iterator<Entry<IMEMonitorHandlerReceiver<IAEItemStack>, Object>> getListeners()
@ -85,23 +119,6 @@ public class CraftingCPUCluster implements IAECluster, IBaseMonitor<IAEItemStack
listeners.remove( l );
}
public WorldCoord min;
public WorldCoord max;
public boolean isDestroyed = false;
private boolean isComplete = true;
class TaskProgress
{
int value;
};
private LinkedList<TileCraftingTile> tiles = new LinkedList();
int accelerator = 0;
private LinkedList<TileCraftingTile> storage = new LinkedList<TileCraftingTile>();
private LinkedList<TileCraftingTile> status = new LinkedList<TileCraftingTile>();
public void getListOfItem(IItemList<IAEItemStack> list, CraftingItemList whichList)
{
switch (whichList)
@ -145,24 +162,17 @@ public class CraftingCPUCluster implements IAECluster, IBaseMonitor<IAEItemStack
}
}
/**
* crafting job info
*/
MECraftingInventory inventory = new MECraftingInventory();
IAEItemStack finalOutput;
BaseActionSource mySrc;
boolean waiting = false;
Map<ICraftingPatternDetails, TaskProgress> tasks = new HashMap<ICraftingPatternDetails, TaskProgress>();
IItemList<IAEItemStack> waitingFor = AEApi.instance().storage().createItemList();
@Override
public Iterator<IGridHost> getTiles()
{
return (Iterator) tiles.iterator();
}
public IMEInventory<IAEItemStack> getInventory()
{
return inventory;
}
public CraftingCPUCluster(WorldCoord _min, WorldCoord _max) {
min = _min;
max = _max;
@ -205,6 +215,11 @@ public class CraftingCPUCluster implements IAECluster, IBaseMonitor<IAEItemStack
public void addTile(TileCraftingTile te)
{
if ( machineSrc == null || te.isCoreBlock )
machineSrc = new MachineSource( te );
te.isCoreBlock = false;
te.markDirty();
tiles.add( te );
if ( te.isStorage() )
@ -240,6 +255,7 @@ public class CraftingCPUCluster implements IAECluster, IBaseMonitor<IAEItemStack
if ( is.getStackSize() >= input.getStackSize() )
{
is.decStackSize( input.getStackSize() );
markDirty();
// AELog.info( "Task: " + is.getStackSize() + " remaining : " + getRemainingTasks() +
// " remaining : "
@ -279,6 +295,7 @@ public class CraftingCPUCluster implements IAECluster, IBaseMonitor<IAEItemStack
}
inventory.injectItems( insert, type, src );
markDirty();
return what;
}
@ -290,9 +307,17 @@ public class CraftingCPUCluster implements IAECluster, IBaseMonitor<IAEItemStack
public IGrid getGrid()
{
for (TileCraftingTile r : tiles)
return r.getActionableNode().getGrid();
{
IGridNode gn = r.getActionableNode();
if ( gn != null )
{
IGrid g = gn.getGrid();
if ( g != null )
return r.getActionableNode().getGrid();
}
}
throw new RuntimeException( "No tiles inside a cpu cluster." );
return null;
}
private void completeJob()
@ -314,7 +339,7 @@ public class CraftingCPUCluster implements IAECluster, IBaseMonitor<IAEItemStack
{
fuzz = fuzz.copy();
fuzz.setStackSize( g.getStackSize() );
IAEItemStack ais = inventory.extractItems( fuzz, Actionable.SIMULATE, null );
IAEItemStack ais = inventory.extractItems( fuzz, Actionable.SIMULATE, machineSrc );
ItemStack is = ais == null ? null : ais.getItemStack();
if ( is != null && is.stackSize == g.getStackSize() )
@ -329,7 +354,7 @@ public class CraftingCPUCluster implements IAECluster, IBaseMonitor<IAEItemStack
}
else
{
IAEItemStack ais = inventory.extractItems( g.copy(), Actionable.SIMULATE, null );
IAEItemStack ais = inventory.extractItems( g.copy(), Actionable.SIMULATE, machineSrc );
ItemStack is = ais == null ? null : ais.getItemStack();
if ( is == null || is.stackSize < g.getStackSize() )
@ -345,6 +370,7 @@ public class CraftingCPUCluster implements IAECluster, IBaseMonitor<IAEItemStack
isComplete = true;
tasks.clear();
waitingFor.resetStatus();
storeItems(); // marks dirty
}
public void updateCraftingLogic(IGrid grid, IEnergyGrid eg, CraftingCache cc)
@ -354,23 +380,7 @@ public class CraftingCPUCluster implements IAECluster, IBaseMonitor<IAEItemStack
if ( inventory.getItemList().isEmpty() )
return;
IStorageGrid sg = grid.getCache( IStorageGrid.class );
IMEInventory<IAEItemStack> ii = sg.getItemInventory();
for (IAEItemStack is : inventory.getItemList())
{
is = inventory.extractItems( is.copy(), Actionable.MODULATE, mySrc );
if ( is != null )
is = ii.injectItems( is, Actionable.MODULATE, mySrc );
if ( is != null )
inventory.injectItems( is, Actionable.MODULATE, mySrc );
}
if ( inventory.getItemList().isEmpty() )
inventory = new MECraftingInventory();
storeItems();
return;
}
@ -428,7 +438,7 @@ public class CraftingCPUCluster implements IAECluster, IBaseMonitor<IAEItemStack
{
fuzz = fuzz.copy();
fuzz.setStackSize( input[x].getStackSize() );
IAEItemStack ais = inventory.extractItems( fuzz, Actionable.MODULATE, mySrc );
IAEItemStack ais = inventory.extractItems( fuzz, Actionable.MODULATE, machineSrc );
ItemStack is = ais == null ? null : ais.getItemStack();
if ( is != null && details.isValidItemForSlot( x, is, getWorld() ) )
@ -441,7 +451,7 @@ public class CraftingCPUCluster implements IAECluster, IBaseMonitor<IAEItemStack
}
else
{
IAEItemStack ais = inventory.extractItems( input[x].copy(), Actionable.MODULATE, mySrc );
IAEItemStack ais = inventory.extractItems( input[x].copy(), Actionable.MODULATE, machineSrc );
ItemStack is = ais == null ? null : ais.getItemStack();
if ( is != null )
@ -465,7 +475,7 @@ public class CraftingCPUCluster implements IAECluster, IBaseMonitor<IAEItemStack
{
ItemStack is = ic.getStackInSlot( x );
if ( is != null )
inventory.injectItems( AEItemStack.create( is ), Actionable.MODULATE, mySrc );
inventory.injectItems( AEItemStack.create( is ), Actionable.MODULATE, machineSrc );
}
ic = null;
break;
@ -494,6 +504,7 @@ public class CraftingCPUCluster implements IAECluster, IBaseMonitor<IAEItemStack
}
ic = null; // hand off complete!
markDirty();
e.getValue().value--;
if ( e.getValue().value <= 0 )
@ -512,7 +523,9 @@ public class CraftingCPUCluster implements IAECluster, IBaseMonitor<IAEItemStack
{
ItemStack is = ic.getStackInSlot( x );
if ( is != null )
inventory.injectItems( AEItemStack.create( is ), Actionable.MODULATE, mySrc );
{
inventory.injectItems( AEItemStack.create( is ), Actionable.MODULATE, machineSrc );
}
}
}
}
@ -522,6 +535,32 @@ public class CraftingCPUCluster implements IAECluster, IBaseMonitor<IAEItemStack
waiting = true;
}
private void storeItems()
{
IGrid g = getGrid();
if ( g == null )
return;
IStorageGrid sg = g.getCache( IStorageGrid.class );
IMEInventory<IAEItemStack> ii = sg.getItemInventory();
for (IAEItemStack is : inventory.getItemList())
{
is = inventory.extractItems( is.copy(), Actionable.MODULATE, machineSrc );
if ( is != null )
is = ii.injectItems( is, Actionable.MODULATE, machineSrc );
if ( is != null )
inventory.injectItems( is, Actionable.MODULATE, machineSrc );
}
if ( inventory.getItemList().isEmpty() )
inventory = new MECraftingInventory();
markDirty();
}
private World getWorld()
{
return null;
@ -544,7 +583,7 @@ public class CraftingCPUCluster implements IAECluster, IBaseMonitor<IAEItemStack
finalOutput = job.getOutput();
waiting = false;
isComplete = false;
mySrc = src;
markDirty();
return true;
}
catch (CraftBranchFailure e)
@ -557,6 +596,16 @@ public class CraftingCPUCluster implements IAECluster, IBaseMonitor<IAEItemStack
return false;
}
private void markDirty()
{
getCore().markDirty();
}
private TileCraftingTile getCore()
{
return (TileCraftingTile) machineSrc.via;
}
public void addStorage(IAEItemStack extractItems)
{
inventory.injectItems( extractItems, Actionable.MODULATE, null );
@ -623,4 +672,105 @@ public class CraftingCPUCluster implements IAECluster, IBaseMonitor<IAEItemStack
return is;
}
public void readFromNBT(NBTTagCompound data)
{
finalOutput = AEItemStack.loadItemStackFromNBT( (NBTTagCompound) data.getTag( "finalOutput" ) );
for (IAEItemStack ais : readList( (NBTTagList) data.getTag( "inventory" ) ))
inventory.injectItems( ais, Actionable.MODULATE, machineSrc );
waiting = data.getBoolean( "waiting" );
isComplete = data.getBoolean( "isComplete" );
NBTTagList list = data.getTagList( "tasks", 10 );
for (int x = 0; x < list.tagCount(); x++)
{
NBTTagCompound item = list.getCompoundTagAt( x );
IAEItemStack pattern = AEItemStack.loadItemStackFromNBT( item );
if ( pattern != null && pattern.getItem() instanceof ICraftingPatternItem )
{
ICraftingPatternItem cpi = (ICraftingPatternItem) pattern.getItem();
ICraftingPatternDetails details = cpi.getPatternForItem( pattern.getItemStack(), getWorld() );
if ( details != null )
{
TaskProgress tp = new TaskProgress();
tp.value = item.getLong( "craftingProgress" );
tasks.put( details, tp );
}
}
}
waitingFor = readList( (NBTTagList) data.getTag( "waitingFor" ) );
}
public void writeToNBT(NBTTagCompound data)
{
data.setTag( "finalOutput", writeItem( finalOutput ) );
data.setTag( "inventory", writeList( inventory.getItemList() ) );
data.setBoolean( "waiting", waiting );
data.setBoolean( "isComplete", isComplete );
NBTTagList list = new NBTTagList();
for (Entry<ICraftingPatternDetails, TaskProgress> e : tasks.entrySet())
{
NBTTagCompound item = writeItem( AEItemStack.create( e.getKey().getPattern() ) );
item.setLong( "craftingProgress", e.getValue().value );
list.appendTag( item );
}
data.setTag( "tasks", list );
data.setTag( "waitingFor", writeList( waitingFor ) );
}
private IItemList<IAEItemStack> readList(NBTTagList tag)
{
IItemList<IAEItemStack> out = AEApi.instance().storage().createItemList();
for (int x = 0; x < tag.tagCount(); x++)
{
IAEItemStack ais = AEItemStack.loadItemStackFromNBT( tag.getCompoundTagAt( x ) );
if ( ais != null )
out.add( ais );
}
return out;
}
private NBTTagList writeList(IItemList<IAEItemStack> myList)
{
NBTTagList out = new NBTTagList();
for (IAEItemStack ais : myList)
out.appendTag( writeItem( ais ) );
return out;
}
private NBTTagCompound writeItem(IAEItemStack finalOutput2)
{
NBTTagCompound out = new NBTTagCompound();
if ( finalOutput2 != null )
finalOutput2.writeToNBT( out );
return out;
}
public void done()
{
TileCraftingTile core = getCore();
core.isCoreBlock = true;
if ( core.previousState != null )
{
readFromNBT( core.previousState );
core.previousState = null;
}
}
public BaseActionSource getActionSource()
{
return machineSrc;
}
}

View file

@ -528,46 +528,49 @@ public class CableBusContainer implements AEMultiTile, ICableBusContainer
public void setSide(ForgeDirection s)
{
ForgeDirection ax, ay, az;
switch (s)
{
case DOWN:
BusRenderHelper.instance.ax = ForgeDirection.EAST;
BusRenderHelper.instance.ay = ForgeDirection.NORTH;
BusRenderHelper.instance.az = ForgeDirection.DOWN;
ax = ForgeDirection.EAST;
ay = ForgeDirection.NORTH;
az = ForgeDirection.DOWN;
break;
case UP:
BusRenderHelper.instance.ax = ForgeDirection.EAST;
BusRenderHelper.instance.ay = ForgeDirection.SOUTH;
BusRenderHelper.instance.az = ForgeDirection.UP;
ax = ForgeDirection.EAST;
ay = ForgeDirection.SOUTH;
az = ForgeDirection.UP;
break;
case EAST:
BusRenderHelper.instance.ax = ForgeDirection.SOUTH;
BusRenderHelper.instance.ay = ForgeDirection.UP;
BusRenderHelper.instance.az = ForgeDirection.EAST;
ax = ForgeDirection.SOUTH;
ay = ForgeDirection.UP;
az = ForgeDirection.EAST;
break;
case WEST:
BusRenderHelper.instance.ax = ForgeDirection.NORTH;
BusRenderHelper.instance.ay = ForgeDirection.UP;
BusRenderHelper.instance.az = ForgeDirection.WEST;
ax = ForgeDirection.NORTH;
ay = ForgeDirection.UP;
az = ForgeDirection.WEST;
break;
case NORTH:
BusRenderHelper.instance.ax = ForgeDirection.WEST;
BusRenderHelper.instance.ay = ForgeDirection.UP;
BusRenderHelper.instance.az = ForgeDirection.NORTH;
ax = ForgeDirection.WEST;
ay = ForgeDirection.UP;
az = ForgeDirection.NORTH;
break;
case SOUTH:
BusRenderHelper.instance.ax = ForgeDirection.EAST;
BusRenderHelper.instance.ay = ForgeDirection.UP;
BusRenderHelper.instance.az = ForgeDirection.SOUTH;
ax = ForgeDirection.EAST;
ay = ForgeDirection.UP;
az = ForgeDirection.SOUTH;
break;
case UNKNOWN:
default:
BusRenderHelper.instance.ax = ForgeDirection.EAST;
BusRenderHelper.instance.ay = ForgeDirection.UP;
BusRenderHelper.instance.az = ForgeDirection.SOUTH;
ax = ForgeDirection.EAST;
ay = ForgeDirection.UP;
az = ForgeDirection.SOUTH;
break;
}
BusRenderHelper.instance.setOrientation( ax, ay, az );
}
@SideOnly(Side.CLIENT)

View file

@ -25,6 +25,7 @@ public class UpgradeInventory extends AppEngInternalInventory implements IAEAppE
private int RedstoneUpgrades = 0;
private int CapacityUpgrades = 0;
private int InverterUpgrades = 0;
private int CraftingUpgrades = 0;
public UpgradeInventory(Object itemOrBlock, IAEAppEngInventory _te, int s) {
super( null, s );
@ -98,7 +99,7 @@ public class UpgradeInventory extends AppEngInternalInventory implements IAEAppE
private void updateUpgradeInfo()
{
cached = true;
InverterUpgrades = CapacityUpgrades = RedstoneUpgrades = SpeedUpgrades = FuzzyUpgrades = 0;
InverterUpgrades = CapacityUpgrades = RedstoneUpgrades = SpeedUpgrades = FuzzyUpgrades = CraftingUpgrades = 0;
for (ItemStack is : this)
{
@ -123,6 +124,9 @@ public class UpgradeInventory extends AppEngInternalInventory implements IAEAppE
case INVERTER:
InverterUpgrades++;
break;
case CRAFTING:
CraftingUpgrades++;
break;
default:
break;
}
@ -133,6 +137,7 @@ public class UpgradeInventory extends AppEngInternalInventory implements IAEAppE
RedstoneUpgrades = Math.min( RedstoneUpgrades, getMaxInstalled( Upgrades.REDSTONE ) );
SpeedUpgrades = Math.min( SpeedUpgrades, getMaxInstalled( Upgrades.SPEED ) );
InverterUpgrades = Math.min( InverterUpgrades, getMaxInstalled( Upgrades.INVERTER ) );
CraftingUpgrades = Math.min( CraftingUpgrades, getMaxInstalled( Upgrades.CRAFTING ) );
}
public int getInstalledUpgrades(Upgrades u)
@ -152,6 +157,8 @@ public class UpgradeInventory extends AppEngInternalInventory implements IAEAppE
return SpeedUpgrades;
case INVERTER:
return InverterUpgrades;
case CRAFTING:
return CraftingUpgrades;
default:
return 0;
}

View file

@ -1,12 +0,0 @@
package appeng.parts.networking;
import net.minecraft.item.ItemStack;
public class PartLumenCableCovered extends PartCableCovered
{
public PartLumenCableCovered(ItemStack is) {
super( is );
}
}

View file

@ -1,12 +0,0 @@
package appeng.parts.networking;
import net.minecraft.item.ItemStack;
public class PartLumenCableGlass extends PartCableGlass
{
public PartLumenCableGlass(ItemStack is) {
super( is );
}
}

View file

@ -1,12 +0,0 @@
package appeng.parts.networking;
import net.minecraft.item.ItemStack;
public class PartLumenCableSmart extends PartCableSmart
{
public PartLumenCableSmart(ItemStack is) {
super( is );
}
}

View file

@ -1,12 +0,0 @@
package appeng.parts.networking;
import net.minecraft.item.ItemStack;
public class PartLumenDenseCable extends PartDenseCable
{
public PartLumenDenseCable(ItemStack is) {
super( is );
}
}

View file

@ -5,6 +5,9 @@ import java.util.List;
import net.minecraft.inventory.IInventory;
import net.minecraft.item.ItemStack;
import net.minecraft.nbt.NBTTagCompound;
import appeng.api.implementations.ICraftingPatternItem;
import appeng.api.networking.crafting.ICraftingPatternDetails;
import appeng.api.storage.data.IAEItemStack;
import appeng.client.texture.CableBusTextures;
import appeng.core.sync.GuiBridge;
import appeng.tile.inventory.AppEngInternalInventory;
@ -18,13 +21,13 @@ public class PartPatternTerminal extends PartTerminal implements IAEAppEngInvent
AppEngInternalInventory output = new AppEngInternalInventory( this, 3 );
AppEngInternalInventory pattern = new AppEngInternalInventory( this, 2 );
public boolean craftingMode = true;
private boolean craftingMode = true;
@Override
public void writeToNBT(NBTTagCompound data)
{
super.writeToNBT( data );
data.setBoolean( "craftingMode", craftingMode );
data.setBoolean( "craftingMode", isCraftingRecipe() );
pattern.writeToNBT( data, "pattern" );
output.writeToNBT( data, "outputList" );
crafting.writeToNBT( data, "craftingGrid" );
@ -34,7 +37,7 @@ public class PartPatternTerminal extends PartTerminal implements IAEAppEngInvent
public void readFromNBT(NBTTagCompound data)
{
super.readFromNBT( data );
craftingMode = data.getBoolean( "craftingMode" );
setCraftingRecipe( data.getBoolean( "craftingMode" ) );
pattern.readFromNBT( data, "pattern" );
output.readFromNBT( data, "outputList" );
crafting.readFromNBT( data, "craftingGrid" );
@ -78,6 +81,60 @@ public class PartPatternTerminal extends PartTerminal implements IAEAppEngInvent
@Override
public void onChangeInventory(IInventory inv, int slot, InvOperation mc, ItemStack removedStack, ItemStack newStack)
{
if ( inv == pattern && slot == 1 )
{
ItemStack is = pattern.getStackInSlot( 1 );
if ( is != null && is.getItem() instanceof ICraftingPatternItem )
{
ICraftingPatternItem pattern = (ICraftingPatternItem) is.getItem();
ICraftingPatternDetails details = pattern.getPatternForItem( is, this.getHost().getTile().getWorldObj() );
if ( details != null )
{
setCraftingRecipe( details.isCraftable() );
for (int x = 0; x < crafting.getSizeInventory() && x < details.getInputs().length; x++)
{
IAEItemStack aeis = details.getInputs()[x];
crafting.setInventorySlotContents( x, aeis == null ? null : aeis.getItemStack() );
}
for (int x = 0; x < output.getSizeInventory() && x < details.getOutputs().length; x++)
{
IAEItemStack aeis = details.getOutputs()[x];
output.setInventorySlotContents( x, aeis == null ? null : aeis.getItemStack() );
}
}
}
}
else if ( inv == crafting )
{
fixCraftingRecipes();
}
host.markForSave();
}
public boolean isCraftingRecipe()
{
return craftingMode;
}
public void setCraftingRecipe(boolean craftingMode)
{
this.craftingMode = craftingMode;
fixCraftingRecipes();
}
private void fixCraftingRecipes()
{
if ( isCraftingRecipe() )
{
for (int x = 0; x < crafting.getSizeInventory(); x++)
{
ItemStack is = crafting.getStackInSlot( x );
if ( is != null )
is.stackSize = 1;
}
}
}
}

View file

@ -1,22 +1,36 @@
package appeng.tile.crafting;
import java.util.Arrays;
import java.util.Collections;
import java.util.EnumSet;
import java.util.Iterator;
import java.util.LinkedList;
import net.minecraft.nbt.NBTTagCompound;
import net.minecraft.tileentity.TileEntity;
import net.minecraftforge.common.util.ForgeDirection;
import appeng.api.config.Actionable;
import appeng.api.implementations.IPowerChannelState;
import appeng.api.networking.GridFlags;
import appeng.api.networking.IGridHost;
import appeng.api.networking.events.MENetworkChannelsChanged;
import appeng.api.networking.events.MENetworkEventSubscribe;
import appeng.api.networking.events.MENetworkPowerStatusChange;
import appeng.api.parts.ISimplifiedBundle;
import appeng.api.storage.IMEInventory;
import appeng.api.storage.data.IAEItemStack;
import appeng.api.util.WorldCoord;
import appeng.me.cluster.IAECluster;
import appeng.me.cluster.IAEMultiBlock;
import appeng.me.cluster.implementations.CraftingCPUCalculator;
import appeng.me.cluster.implementations.CraftingCPUCluster;
import appeng.me.helpers.AENetworkProxy;
import appeng.me.helpers.AENetworkProxyMultiblock;
import appeng.tile.events.AETileEventHandler;
import appeng.tile.events.TileEventType;
import appeng.tile.grid.AENetworkTile;
import appeng.util.Platform;
import appeng.util.item.ItemList;
public class TileCraftingTile extends AENetworkTile implements IAEMultiBlock, IPowerChannelState
{
@ -25,6 +39,9 @@ public class TileCraftingTile extends AENetworkTile implements IAEMultiBlock, IP
final CraftingCPUCalculator calc = new CraftingCPUCalculator( this );
public ISimplifiedBundle lightCache;
public NBTTagCompound previousState = null;
public boolean isCoreBlock = false;
@Override
protected AENetworkProxy createProxy()
{
@ -42,7 +59,38 @@ public class TileCraftingTile extends AENetworkTile implements IAEMultiBlock, IP
calc.calculateMultiblock( worldObj, getLocation() );
}
private class CraftingHandler extends AETileEventHandler
{
public CraftingHandler() {
super( TileEventType.WORLD_NBT );
}
@Override
public void writeToNBT(NBTTagCompound data)
{
data.setBoolean( "core", isCoreBlock );
if ( isCoreBlock && clust != null )
clust.writeToNBT( data );
}
@Override
public void readFromNBT(NBTTagCompound data)
{
isCoreBlock = data.getBoolean( "core" );
if ( isCoreBlock )
{
if ( clust != null )
clust.readFromNBT( data );
else
previousState = (NBTTagCompound) data.copy();
}
}
};
public TileCraftingTile() {
addNewHandler( new CraftingHandler() );
gridProxy.setFlags( GridFlags.MULTIBLOCK, GridFlags.REQUIRE_CHANNEL );
gridProxy.setValidSides( EnumSet.noneOf( ForgeDirection.class ) );
}
@ -164,4 +212,60 @@ public class TileCraftingTile extends AENetworkTile implements IAEMultiBlock, IP
return isPowered() && isFormed();
}
public void breakCluster()
{
if ( clust != null )
{
clust.cancel();
IMEInventory<IAEItemStack> inv = clust.getInventory();
LinkedList<WorldCoord> places = new LinkedList<WorldCoord>();
Iterator<IGridHost> i = clust.getTiles();
while (i.hasNext())
{
IGridHost h = i.next();
if ( h == this )
places.add( new WorldCoord( this ) );
else
{
TileEntity te = (TileEntity) h;
for (ForgeDirection d : ForgeDirection.VALID_DIRECTIONS)
{
WorldCoord wc = new WorldCoord( te );
wc.add( d, 1 );
if ( worldObj.isAirBlock( wc.x, wc.y, wc.z ) )
places.add( wc );
}
}
}
Collections.shuffle( places );
if ( places.isEmpty() )
throw new RuntimeException( "No air or even the tile hat was destroyed?!?!" );
for (IAEItemStack ais : inv.getAvailableItems( new ItemList<IAEItemStack>( IAEItemStack.class ) ))
{
ais = ais.copy();
ais.setStackSize( ais.getItemStack().getMaxStackSize() );
while (true)
{
IAEItemStack g = inv.extractItems( ais.copy(), Actionable.MODULATE, clust.getActionSource() );
if ( g == null )
break;
WorldCoord wc = places.poll();
places.add( wc );
Platform.spawnDrops( worldObj, wc.x, wc.y, wc.z, Arrays.asList( g.getItemStack() ) );
}
}
clust.destroy();
}
}
}

View file

@ -31,8 +31,8 @@ import appeng.util.Platform;
public class TileQuantumBridge extends AENetworkInvTile implements IAEMultiBlock
{
final private static ItemStack ring = AEApi.instance().blocks().blockQuantumRing.stack(1);
final private static ItemStack ring = AEApi.instance().blocks().blockQuantumRing.stack( 1 );
final int sidesRing[] = new int[] {};
final int sidesLink[] = new int[] { 0 };
@ -134,14 +134,14 @@ public class TileQuantumBridge extends AENetworkInvTile implements IAEMultiBlock
{
if ( clust != null )
{
if ( ! affectWorld )
if ( !affectWorld )
clust.updateStatus = false;
clust.destroy();
}
clust = null;
if ( affectWorld )
gridProxy.setValidSides( EnumSet.noneOf( ForgeDirection.class ) );
}
@ -157,26 +157,26 @@ public class TileQuantumBridge extends AENetworkInvTile implements IAEMultiBlock
{
return !isInvalid();
}
@Override
public void onReady()
{
super.onReady();
if ( worldObj.getBlock( xCoord, yCoord, zCoord) == AEApi.instance().blocks().blockQuantumRing.block() )
if ( worldObj.getBlock( xCoord, yCoord, zCoord ) == AEApi.instance().blocks().blockQuantumRing.block() )
gridProxy.setVisualRepresentation( ring );
}
@Override
public void invalidate()
{
disconnect(false);
disconnect( false );
super.invalidate();
}
@Override
public void onChunkUnload()
{
disconnect(false);
disconnect( false );
super.onChunkUnload();
}
@ -189,9 +189,9 @@ public class TileQuantumBridge extends AENetworkInvTile implements IAEMultiBlock
if ( xdex != flags )
{
xdex = flags;
markForUpdate();
markForUpdate();
}
if ( isCorner() || isCenter() )
{
gridProxy.setValidSides( getConnections() );
@ -283,4 +283,10 @@ public class TileQuantumBridge extends AENetworkInvTile implements IAEMultiBlock
return (xdex & hasSingularity) == hasSingularity;
}
public void breakCluster()
{
if ( clust != null )
clust.destroy();
}
}

View file

@ -37,17 +37,20 @@ public class AEItemDef
static AESharedNBT lowTag = new AESharedNBT( Integer.MIN_VALUE );
static AESharedNBT highTag = new AESharedNBT( Integer.MAX_VALUE );
public AEItemDef(Item it) {
item = it;
itemID = System.identityHashCode( item );
}
public AEItemDef copy()
{
AEItemDef t = new AEItemDef();
AEItemDef t = new AEItemDef( item );
t.def = def;
t.item = item;
t.damageValue = damageValue;
t.dspDamage = dspDamage;
t.maxDamage = maxDamage;
t.tagCompound = tagCompound;
t.isOre = isOre;
t.itemID = itemID;
return t;
}

View file

@ -57,8 +57,7 @@ public final class AEItemStack extends AEStack<IAEItemStack> implements IAEItemS
if ( is == null )
throw new RuntimeException( "Invalid Itemstack." );
def = new AEItemDef();
def.item = is.getItem();
def = new AEItemDef( is.getItem() );
if ( def.item == null )
throw new RuntimeException( "This ItemStack is bad, it has a null item." );