Merge branch 'rv1' of https://bitbucket.org/AlgorithmX2/appliedenergistics2 into rv1
This commit is contained in:
commit
4a88f87e2a
30 changed files with 612 additions and 213 deletions
|
@ -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)
|
||||
{
|
||||
|
|
|
@ -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()
|
||||
{
|
||||
|
|
|
@ -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()
|
||||
{
|
||||
|
|
|
@ -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
|
||||
|
|
|
@ -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()
|
||||
|
|
|
@ -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;
|
||||
}
|
||||
|
||||
}
|
||||
|
|
|
@ -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;
|
||||
|
|
|
@ -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 );
|
||||
}
|
||||
}
|
||||
|
|
|
@ -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
|
||||
{
|
||||
|
|
|
@ -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)
|
||||
|
|
|
@ -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" ) )
|
||||
{
|
||||
|
|
|
@ -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 ) );
|
||||
}
|
||||
}
|
||||
|
||||
}
|
||||
|
|
|
@ -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;
|
||||
|
|
|
@ -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() {
|
||||
|
|
|
@ -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;
|
||||
}
|
||||
|
||||
}
|
||||
|
|
|
@ -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() ) );
|
||||
}
|
||||
|
||||
|
|
|
@ -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;
|
||||
}
|
||||
|
||||
|
|
|
@ -64,6 +64,8 @@ public class CraftingCPUCalculator extends MBCalculator
|
|||
}
|
||||
}
|
||||
|
||||
c.done();
|
||||
|
||||
Iterator<IGridHost> i = c.getTiles();
|
||||
while (i.hasNext())
|
||||
{
|
||||
|
|
|
@ -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;
|
||||
}
|
||||
|
||||
}
|
||||
|
|
|
@ -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)
|
||||
|
|
|
@ -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;
|
||||
}
|
||||
|
|
|
@ -1,12 +0,0 @@
|
|||
package appeng.parts.networking;
|
||||
|
||||
import net.minecraft.item.ItemStack;
|
||||
|
||||
public class PartLumenCableCovered extends PartCableCovered
|
||||
{
|
||||
|
||||
public PartLumenCableCovered(ItemStack is) {
|
||||
super( is );
|
||||
}
|
||||
|
||||
}
|
|
@ -1,12 +0,0 @@
|
|||
package appeng.parts.networking;
|
||||
|
||||
import net.minecraft.item.ItemStack;
|
||||
|
||||
public class PartLumenCableGlass extends PartCableGlass
|
||||
{
|
||||
|
||||
public PartLumenCableGlass(ItemStack is) {
|
||||
super( is );
|
||||
}
|
||||
|
||||
}
|
|
@ -1,12 +0,0 @@
|
|||
package appeng.parts.networking;
|
||||
|
||||
import net.minecraft.item.ItemStack;
|
||||
|
||||
public class PartLumenCableSmart extends PartCableSmart
|
||||
{
|
||||
|
||||
public PartLumenCableSmart(ItemStack is) {
|
||||
super( is );
|
||||
}
|
||||
|
||||
}
|
|
@ -1,12 +0,0 @@
|
|||
package appeng.parts.networking;
|
||||
|
||||
import net.minecraft.item.ItemStack;
|
||||
|
||||
public class PartLumenDenseCable extends PartDenseCable
|
||||
{
|
||||
|
||||
public PartLumenDenseCable(ItemStack is) {
|
||||
super( is );
|
||||
}
|
||||
|
||||
}
|
|
@ -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;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
|
@ -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();
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
|
@ -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();
|
||||
}
|
||||
|
||||
}
|
||||
|
|
|
@ -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;
|
||||
}
|
||||
|
||||
|
|
|
@ -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." );
|
||||
|
|
Loading…
Reference in a new issue