Applied-Energistics-2-tiler.../src/main/java/appeng/parts/CableBusContainer.java

1036 lines
24 KiB
Java
Raw Normal View History

2014-11-14 12:02:52 +01:00
/*
* This file is part of Applied Energistics 2.
* Copyright (c) 2013 - 2014, AlgorithmX2, All rights reserved.
*
* Applied Energistics 2 is free software: you can redistribute it and/or modify
* it under the terms of the GNU Lesser General Public License as published by
* the Free Software Foundation, either version 3 of the License, or
* (at your option) any later version.
*
* Applied Energistics 2 is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU Lesser General Public License for more details.
*
* You should have received a copy of the GNU Lesser General Public License
* along with Applied Energistics 2. If not, see <http://www.gnu.org/licenses/lgpl>.
*/
2014-09-24 02:26:27 +02:00
package appeng.parts;
import java.io.IOException;
import java.util.EnumSet;
import java.util.LinkedList;
import java.util.List;
import java.util.Random;
import java.util.Set;
2014-12-29 21:59:05 +01:00
import io.netty.buffer.ByteBuf;
2014-09-24 02:26:27 +02:00
import net.minecraft.entity.Entity;
import net.minecraft.entity.EntityLivingBase;
import net.minecraft.entity.player.EntityPlayer;
import net.minecraft.item.Item;
import net.minecraft.item.ItemStack;
import net.minecraft.nbt.NBTTagCompound;
import net.minecraft.tileentity.TileEntity;
import net.minecraft.util.AxisAlignedBB;
import net.minecraft.util.Vec3;
import net.minecraft.world.World;
import net.minecraftforge.common.util.ForgeDirection;
2014-12-29 21:59:05 +01:00
import cpw.mods.fml.relauncher.Side;
import cpw.mods.fml.relauncher.SideOnly;
2014-09-24 02:26:27 +02:00
import appeng.api.AEApi;
import appeng.api.config.YesNo;
import appeng.api.exceptions.FailedConnection;
import appeng.api.implementations.parts.IPartCable;
import appeng.api.networking.IGridHost;
import appeng.api.networking.IGridNode;
import appeng.api.parts.IFacadeContainer;
import appeng.api.parts.IFacadePart;
import appeng.api.parts.IPart;
import appeng.api.parts.IPartCollisionHelper;
import appeng.api.parts.IPartHost;
import appeng.api.parts.IPartItem;
import appeng.api.parts.LayerFlags;
import appeng.api.parts.PartItemStack;
import appeng.api.parts.SelectedPart;
import appeng.api.util.AECableType;
import appeng.api.util.AEColor;
import appeng.api.util.DimensionalCoord;
import appeng.client.render.CableRenderHelper;
import appeng.core.AELog;
import appeng.core.AppEng;
import appeng.facade.FacadeContainer;
import appeng.helpers.AEMultiTile;
import appeng.integration.IntegrationType;
import appeng.integration.abstraction.ICLApi;
import appeng.me.GridConnection;
import appeng.util.Platform;
public class CableBusContainer extends CableBusStorage implements AEMultiTile, ICableBusContainer
{
private final EnumSet<LayerFlags> myLayerFlags = EnumSet.noneOf( LayerFlags.class );
2014-09-24 02:26:27 +02:00
public YesNo hasRedstone = YesNo.UNDECIDED;
public IPartHost tcb;
boolean inWorld = false;
public boolean requiresDynamicRender = false;
@Override
public boolean isInWorld()
{
2014-12-29 15:13:47 +01:00
return this.inWorld;
2014-09-24 02:26:27 +02:00
}
public void setHost(IPartHost host)
{
2014-12-29 15:13:47 +01:00
this.tcb.clearContainer();
this.tcb = host;
2014-09-24 02:26:27 +02:00
}
public CableBusContainer(IPartHost host) {
2014-12-29 15:13:47 +01:00
this.tcb = host;
2014-09-24 02:26:27 +02:00
}
@Override
public IPart getPart(ForgeDirection side)
{
if ( side == ForgeDirection.UNKNOWN )
2014-12-29 15:13:47 +01:00
return this.getCenter();
return this.getSide( side );
2014-09-24 02:26:27 +02:00
}
public void rotateLeft()
{
IPart newSides[] = new IPart[6];
2014-12-29 15:13:47 +01:00
newSides[ForgeDirection.UP.ordinal()] = this.getSide( ForgeDirection.UP );
newSides[ForgeDirection.DOWN.ordinal()] = this.getSide( ForgeDirection.DOWN );
2014-09-24 02:26:27 +02:00
2014-12-29 15:13:47 +01:00
newSides[ForgeDirection.EAST.ordinal()] = this.getSide( ForgeDirection.NORTH );
newSides[ForgeDirection.SOUTH.ordinal()] = this.getSide( ForgeDirection.EAST );
newSides[ForgeDirection.WEST.ordinal()] = this.getSide( ForgeDirection.SOUTH );
newSides[ForgeDirection.NORTH.ordinal()] = this.getSide( ForgeDirection.WEST );
2014-09-24 02:26:27 +02:00
for (ForgeDirection dir : ForgeDirection.VALID_DIRECTIONS)
2014-12-29 15:13:47 +01:00
this.setSide( dir, newSides[dir.ordinal()] );
2014-09-24 02:26:27 +02:00
2014-12-29 15:13:47 +01:00
this.getFacadeContainer().rotateLeft();
2014-09-24 02:26:27 +02:00
}
public void updateDynamicRender()
{
2014-12-29 15:13:47 +01:00
this.requiresDynamicRender = false;
2014-09-24 02:26:27 +02:00
for (ForgeDirection s : ForgeDirection.VALID_DIRECTIONS)
{
2014-12-29 15:13:47 +01:00
IPart p = this.getPart( s );
2014-09-24 02:26:27 +02:00
if ( p != null )
2014-12-29 15:13:47 +01:00
this.requiresDynamicRender = this.requiresDynamicRender || p.requireDynamicRender();
2014-09-24 02:26:27 +02:00
}
}
@Override
public void removePart(ForgeDirection side, boolean suppressUpdate)
{
if ( side == ForgeDirection.UNKNOWN )
{
2014-12-29 15:13:47 +01:00
if ( this.getCenter() != null )
this.getCenter().removeFromWorld();
this.setCenter( null );
2014-09-24 02:26:27 +02:00
}
else
{
2014-12-29 15:13:47 +01:00
if ( this.getSide( side ) != null )
this.getSide( side ).removeFromWorld();
this.setSide( side, null );
2014-09-24 02:26:27 +02:00
}
if ( !suppressUpdate )
{
2014-12-29 15:13:47 +01:00
this.updateDynamicRender();
this.updateConnections();
this.markForUpdate();
this.markForSave();
this.partChanged();
2014-09-24 02:26:27 +02:00
}
}
/**
* use for FMP
*/
public void updateConnections()
{
2014-12-29 15:13:47 +01:00
if ( this.getCenter() != null )
2014-09-24 02:26:27 +02:00
{
EnumSet<ForgeDirection> sides = EnumSet.allOf( ForgeDirection.class );
for (ForgeDirection s : ForgeDirection.VALID_DIRECTIONS)
{
2014-12-29 15:13:47 +01:00
if ( this.getPart( s ) != null || this.isBlocked( s ) )
2014-09-24 02:26:27 +02:00
sides.remove( s );
}
2014-12-29 15:13:47 +01:00
this.getCenter().setValidSides( sides );
IGridNode n = this.getCenter().getGridNode();
2014-09-24 02:26:27 +02:00
if ( n != null )
n.updateState();
}
}
@Override
public boolean canAddPart(ItemStack is, ForgeDirection side)
{
if ( PartPlacement.isFacade( is, side ) != null )
return true;
if ( is.getItem() instanceof IPartItem )
{
IPartItem bi = (IPartItem) is.getItem();
is = is.copy();
is.stackSize = 1;
IPart bp = bi.createPartFromItemStack( is );
if ( bp != null )
{
if ( bp instanceof IPartCable )
{
boolean canPlace = true;
for (ForgeDirection d : ForgeDirection.VALID_DIRECTIONS)
2014-12-29 15:13:47 +01:00
if ( this.getPart( d ) != null && !this.getPart( d ).canBePlacedOn( ((IPartCable) bp).supportsBuses() ) )
2014-09-24 02:26:27 +02:00
canPlace = false;
if ( !canPlace )
return false;
2014-12-29 15:13:47 +01:00
return this.getPart( ForgeDirection.UNKNOWN ) == null;
2014-09-24 02:26:27 +02:00
}
else if ( !(bp instanceof IPartCable) && side != ForgeDirection.UNKNOWN )
{
2014-12-29 15:13:47 +01:00
IPart cable = this.getPart( ForgeDirection.UNKNOWN );
2014-09-24 02:26:27 +02:00
if ( cable != null && !bp.canBePlacedOn( ((IPartCable) cable).supportsBuses() ) )
return false;
2014-12-29 15:13:47 +01:00
return this.getPart( side ) == null;
2014-09-24 02:26:27 +02:00
}
}
}
return false;
}
@Override
public ForgeDirection addPart(ItemStack is, ForgeDirection side, EntityPlayer player)
{
2014-12-29 15:13:47 +01:00
if ( this.canAddPart( is, side ) )
2014-09-24 02:26:27 +02:00
{
if ( is.getItem() instanceof IPartItem )
{
IPartItem bi = (IPartItem) is.getItem();
is = is.copy();
is.stackSize = 1;
IPart bp = bi.createPartFromItemStack( is );
if ( bp instanceof IPartCable )
{
boolean canPlace = true;
for (ForgeDirection d : ForgeDirection.VALID_DIRECTIONS)
2014-12-29 15:13:47 +01:00
if ( this.getPart( d ) != null && !this.getPart( d ).canBePlacedOn( ((IPartCable) bp).supportsBuses() ) )
2014-09-24 02:26:27 +02:00
canPlace = false;
if ( !canPlace )
return null;
2014-12-29 15:13:47 +01:00
if ( this.getPart( ForgeDirection.UNKNOWN ) != null )
2014-09-24 02:26:27 +02:00
return null;
2014-12-29 15:13:47 +01:00
this.setCenter( (IPartCable) bp );
bp.setPartHostInfo( ForgeDirection.UNKNOWN, this, this.tcb.getTile() );
2014-09-24 02:26:27 +02:00
if ( player != null )
bp.onPlacement( player, is, side );
2014-12-29 15:13:47 +01:00
if ( this.inWorld )
2014-09-24 02:26:27 +02:00
bp.addToWorld();
2014-12-29 15:13:47 +01:00
IGridNode cn = this.getCenter().getGridNode();
2014-09-24 02:26:27 +02:00
if ( cn != null )
{
for (ForgeDirection ins : ForgeDirection.VALID_DIRECTIONS)
{
2014-12-29 15:13:47 +01:00
IPart sbp = this.getPart( ins );
2014-09-24 02:26:27 +02:00
if ( sbp != null )
{
IGridNode sn = sbp.getGridNode();
2014-09-28 19:41:51 +02:00
if ( sn != null )
2014-09-24 02:26:27 +02:00
{
try
{
2014-09-28 20:56:16 +02:00
new GridConnection( cn, sn, ForgeDirection.UNKNOWN );
2014-09-24 02:26:27 +02:00
}
catch (FailedConnection e)
{
// ekk!
bp.removeFromWorld();
2014-12-29 15:13:47 +01:00
this.setCenter( null );
2014-09-24 02:26:27 +02:00
return null;
}
}
}
}
}
2014-12-29 15:13:47 +01:00
this.updateConnections();
this.markForUpdate();
this.markForSave();
this.partChanged();
2014-09-24 02:26:27 +02:00
return ForgeDirection.UNKNOWN;
}
else if ( bp != null && !(bp instanceof IPartCable) && side != ForgeDirection.UNKNOWN )
{
2014-12-29 15:13:47 +01:00
IPart cable = this.getPart( ForgeDirection.UNKNOWN );
2014-09-24 02:26:27 +02:00
if ( cable != null && !bp.canBePlacedOn( ((IPartCable) cable).supportsBuses() ) )
return null;
2014-12-29 15:13:47 +01:00
this.setSide( side, bp );
2014-09-24 02:26:27 +02:00
bp.setPartHostInfo( side, this, this.getTile() );
if ( player != null )
bp.onPlacement( player, is, side );
2014-12-29 15:13:47 +01:00
if ( this.inWorld )
2014-09-24 02:26:27 +02:00
bp.addToWorld();
2014-12-29 15:13:47 +01:00
if ( this.getCenter() != null )
2014-09-24 02:26:27 +02:00
{
2014-12-29 15:13:47 +01:00
IGridNode cn = this.getCenter().getGridNode();
2014-09-24 02:26:27 +02:00
IGridNode sn = bp.getGridNode();
if ( cn != null && sn != null )
{
try
{
2014-09-28 20:56:16 +02:00
new GridConnection( cn, sn, ForgeDirection.UNKNOWN );
2014-09-24 02:26:27 +02:00
}
catch (FailedConnection e)
{
// ekk!
bp.removeFromWorld();
2014-12-29 15:13:47 +01:00
this.setSide( side, null );
2014-09-24 02:26:27 +02:00
return null;
}
}
}
2014-12-29 15:13:47 +01:00
this.updateDynamicRender();
this.updateConnections();
this.markForUpdate();
this.markForSave();
this.partChanged();
2014-09-24 02:26:27 +02:00
return side;
}
}
}
return null;
}
2014-09-28 22:20:14 +02:00
private static final ThreadLocal<Boolean> isLoading = new ThreadLocal<Boolean>();
2014-09-24 02:26:27 +02:00
public static boolean isLoading()
{
Boolean is = isLoading.get();
return is != null && is;
2014-09-24 02:26:27 +02:00
}
public void addToWorld()
{
2014-12-29 15:13:47 +01:00
if ( this.inWorld )
2014-09-24 02:26:27 +02:00
return;
2014-12-29 15:13:47 +01:00
this.inWorld = true;
2014-09-24 02:26:27 +02:00
isLoading.set( true );
2014-12-29 15:13:47 +01:00
TileEntity te = this.getTile();
2014-09-24 02:26:27 +02:00
// start with the center, then install the side parts into the grid.
for (int x = 6; x >= 0; x--)
{
ForgeDirection s = ForgeDirection.getOrientation( x );
2014-12-29 15:13:47 +01:00
IPart part = this.getPart( s );
2014-09-24 02:26:27 +02:00
if ( part != null )
{
part.setPartHostInfo( s, this, te );
part.addToWorld();
if ( s != ForgeDirection.UNKNOWN )
{
IGridNode sn = part.getGridNode();
if ( sn != null )
{
// this is a really stupid if statement, why was this
// here?
// if ( !sn.getConnections().iterator().hasNext() )
2014-12-29 15:13:47 +01:00
IPart center = this.getPart( ForgeDirection.UNKNOWN );
2014-09-24 02:26:27 +02:00
if ( center != null )
{
IGridNode cn = center.getGridNode();
if ( cn != null )
{
try
{
AEApi.instance().createGridConnection( cn, sn );
}
catch (FailedConnection e)
{
// ekk
}
}
}
}
}
}
}
2014-12-29 15:13:47 +01:00
this.partChanged();
2014-09-24 02:26:27 +02:00
isLoading.set( false );
}
public void removeFromWorld()
{
2014-12-29 15:13:47 +01:00
if ( !this.inWorld )
2014-09-24 02:26:27 +02:00
return;
2014-12-29 15:13:47 +01:00
this.inWorld = false;
2014-09-24 02:26:27 +02:00
for (ForgeDirection s : ForgeDirection.values())
{
2014-12-29 15:13:47 +01:00
IPart part = this.getPart( s );
2014-09-24 02:26:27 +02:00
if ( part != null )
part.removeFromWorld();
}
2014-12-29 15:13:47 +01:00
this.partChanged();
2014-09-24 02:26:27 +02:00
}
@Override
2014-09-24 02:26:27 +02:00
public boolean canConnectRedstone(EnumSet<ForgeDirection> enumSet)
{
for (ForgeDirection dir : enumSet)
{
2014-12-29 15:13:47 +01:00
IPart part = this.getPart( dir );
2014-09-24 02:26:27 +02:00
if ( part != null && part.canConnectRedstone() )
return true;
}
return false;
}
@Override
public IGridNode getGridNode(ForgeDirection side)
{
2014-12-29 15:13:47 +01:00
IPart part = this.getPart( side );
2014-09-24 02:26:27 +02:00
if ( part != null )
{
IGridNode n = part.getExternalFacingNode();
if ( n != null )
return n;
}
2014-12-29 15:13:47 +01:00
if ( this.getCenter() != null )
return this.getCenter().getGridNode();
2014-09-24 02:26:27 +02:00
return null;
}
public Iterable<AxisAlignedBB> getSelectedBoundingBoxesFromPool(boolean ignoreCableConnections, boolean includeFacades, Entity e, boolean visual)
2014-09-24 02:26:27 +02:00
{
List<AxisAlignedBB> boxes = new LinkedList<AxisAlignedBB>();
2014-12-29 15:13:47 +01:00
IFacadeContainer fc = this.getFacadeContainer();
2014-09-24 02:26:27 +02:00
for (ForgeDirection s : ForgeDirection.values())
{
IPartCollisionHelper bch = new BusCollisionHelper( boxes, s, e, visual );
2014-12-29 15:13:47 +01:00
IPart part = this.getPart( s );
2014-09-24 02:26:27 +02:00
if ( part != null )
{
if ( ignoreCableConnections && part instanceof IPartCable )
bch.addBox( 6.0, 6.0, 6.0, 10.0, 10.0, 10.0 );
else
part.getBoxes( bch );
}
if ( AEApi.instance().partHelper().getCableRenderMode().opaqueFacades || !visual )
{
if ( includeFacades && s != null && s != ForgeDirection.UNKNOWN )
{
IFacadePart fp = fc.getFacade( s );
if ( fp != null )
fp.getBoxes( bch, e );
}
}
}
return boxes;
}
@Override
2014-09-24 02:26:27 +02:00
public void onEntityCollision(Entity entity)
{
for (ForgeDirection s : ForgeDirection.values())
{
2014-12-29 15:13:47 +01:00
IPart part = this.getPart( s );
2014-09-24 02:26:27 +02:00
if ( part != null )
part.onEntityCollision( entity );
}
}
@Override
2014-09-24 02:26:27 +02:00
public boolean isEmpty()
{
2014-12-29 15:13:47 +01:00
IFacadeContainer fc = this.getFacadeContainer();
2014-09-24 02:26:27 +02:00
for (ForgeDirection s : ForgeDirection.values())
{
2014-12-29 15:13:47 +01:00
IPart part = this.getPart( s );
2014-09-24 02:26:27 +02:00
if ( part != null )
return false;
if ( s != ForgeDirection.UNKNOWN )
{
IFacadePart fp = fc.getFacade( s );
if ( fp != null )
return false;
}
}
return true;
}
@Override
2014-09-24 02:26:27 +02:00
public void onNeighborChanged()
{
2014-12-29 15:13:47 +01:00
this.hasRedstone = YesNo.UNDECIDED;
2014-09-24 02:26:27 +02:00
for (ForgeDirection s : ForgeDirection.values())
{
2014-12-29 15:13:47 +01:00
IPart part = this.getPart( s );
2014-09-24 02:26:27 +02:00
if ( part != null )
part.onNeighborChanged();
}
}
private void updateRedstone()
{
2014-12-29 15:13:47 +01:00
TileEntity te = this.getTile();
this.hasRedstone = te.getWorldObj().isBlockIndirectlyGettingPowered( te.xCoord, te.yCoord, te.zCoord ) ? YesNo.YES : YesNo.NO;
2014-09-24 02:26:27 +02:00
}
@Override
2014-09-24 02:26:27 +02:00
public boolean isSolidOnSide(ForgeDirection side)
{
if ( side == null || side == ForgeDirection.UNKNOWN )
return false;
// facades are solid..
2014-12-29 15:13:47 +01:00
IFacadePart fp = this.getFacadeContainer().getFacade( side );
2014-09-24 02:26:27 +02:00
if ( fp != null )
return true;
// buses can be too.
2014-12-29 15:13:47 +01:00
IPart part = this.getPart( side );
2014-09-24 02:26:27 +02:00
return part != null && part.isSolid();
}
@Override
2014-09-24 02:26:27 +02:00
public int isProvidingWeakPower(ForgeDirection side)
{
2014-12-29 15:13:47 +01:00
IPart part = this.getPart( side );
2014-09-24 02:26:27 +02:00
return part != null ? part.isProvidingWeakPower() : 0;
}
@Override
2014-09-24 02:26:27 +02:00
public int isProvidingStrongPower(ForgeDirection side)
{
2014-12-29 15:13:47 +01:00
IPart part = this.getPart( side );
2014-09-24 02:26:27 +02:00
return part != null ? part.isProvidingStrongPower() : 0;
}
@SideOnly(Side.CLIENT)
public void renderStatic(double x, double y, double z)
{
2014-12-29 15:13:47 +01:00
CableRenderHelper.getInstance().renderStatic( this, this.getFacadeContainer() );
2014-09-24 02:26:27 +02:00
}
@SideOnly(Side.CLIENT)
public void renderDynamic(double x, double y, double z)
{
CableRenderHelper.getInstance().renderDynamic( this, x, y, z );
}
public void writeToStream(ByteBuf data) throws IOException
{
int sides = 0;
for (int x = 0; x < 7; x++)
{
2014-12-29 15:13:47 +01:00
IPart p = this.getPart( ForgeDirection.getOrientation( x ) );
2014-09-24 02:26:27 +02:00
if ( p != null )
{
sides = sides | (1 << x);
}
}
data.writeByte( (byte) sides );
for (int x = 0; x < 7; x++)
{
ItemStack is = null;
2014-12-29 15:13:47 +01:00
IPart p = this.getPart( ForgeDirection.getOrientation( x ) );
2014-09-24 02:26:27 +02:00
if ( p != null )
{
is = p.getItemStack( PartItemStack.Network );
data.writeShort( Item.getIdFromItem( is.getItem() ) );
data.writeShort( is.getItemDamage() );
2014-09-28 19:41:51 +02:00
p.writeToStream( data );
2014-09-24 02:26:27 +02:00
}
}
2014-12-29 15:13:47 +01:00
this.getFacadeContainer().writeToStream( data );
2014-09-24 02:26:27 +02:00
}
public boolean readFromStream(ByteBuf data) throws IOException
{
byte sides = data.readByte();
boolean updateBlock = false;
for (int x = 0; x < 7; x++)
{
ForgeDirection side = ForgeDirection.getOrientation( x );
if ( ((sides & (1 << x)) == (1 << x)) )
{
2014-12-29 15:13:47 +01:00
IPart p = this.getPart( side );
2014-09-24 02:26:27 +02:00
short itemID = data.readShort();
short dmgValue = data.readShort();
Item myItem = Item.getItemById( itemID );
ItemStack current = p != null ? p.getItemStack( PartItemStack.Network ) : null;
if ( current != null && current.getItem() == myItem && current.getItemDamage() == dmgValue )
{
if ( p.readFromStream( data ) )
updateBlock = true;
}
else
{
2014-12-29 15:13:47 +01:00
this.removePart( side, false );
side = this.addPart( new ItemStack( myItem, 1, dmgValue ), side, null );
2014-09-24 02:26:27 +02:00
if ( side != null )
{
2014-12-29 15:13:47 +01:00
p = this.getPart( side );
2014-09-24 02:26:27 +02:00
p.readFromStream( data );
}
else
throw new RuntimeException( "Invalid Stream For CableBus Container." );
}
}
2014-12-29 15:13:47 +01:00
else if ( this.getPart( side ) != null )
this.removePart( side, false );
2014-09-24 02:26:27 +02:00
}
2014-12-29 15:13:47 +01:00
if ( this.getFacadeContainer().readFromStream( data ) )
2014-09-24 02:26:27 +02:00
return true;
return updateBlock;
}
ForgeDirection getSide(IPart part)
{
2014-12-29 15:13:47 +01:00
if ( this.getCenter() == part )
2014-09-24 02:26:27 +02:00
return ForgeDirection.UNKNOWN;
else
{
for (ForgeDirection side : ForgeDirection.VALID_DIRECTIONS)
2014-12-29 15:13:47 +01:00
if ( this.getSide( side ) == part )
2014-09-24 02:26:27 +02:00
{
return side;
}
}
throw new RuntimeException( "Uhh Bad Part on Side." );
}
public void writeToNBT(NBTTagCompound data)
{
2014-12-29 15:13:47 +01:00
data.setInteger( "hasRedstone", this.hasRedstone.ordinal() );
2014-09-24 02:26:27 +02:00
2014-12-29 15:13:47 +01:00
IFacadeContainer fc = this.getFacadeContainer();
2014-09-24 02:26:27 +02:00
for (ForgeDirection s : ForgeDirection.values())
{
fc.writeToNBT( data );
2014-12-29 15:13:47 +01:00
IPart part = this.getPart( s );
2014-09-24 02:26:27 +02:00
if ( part != null )
{
NBTTagCompound def = new NBTTagCompound();
part.getItemStack( PartItemStack.World ).writeToNBT( def );
NBTTagCompound extra = new NBTTagCompound();
part.writeToNBT( extra );
2014-12-29 15:13:47 +01:00
data.setTag( "def:" + this.getSide( part ).ordinal(), def );
data.setTag( "extra:" + this.getSide( part ).ordinal(), extra );
2014-09-24 02:26:27 +02:00
}
}
}
public void readFromNBT(NBTTagCompound data)
{
if ( data.hasKey( "hasRedstone" ) )
2014-12-29 15:13:47 +01:00
this.hasRedstone = YesNo.values()[data.getInteger( "hasRedstone" )];
2014-09-24 02:26:27 +02:00
for (int x = 0; x < 7; x++)
{
ForgeDirection side = ForgeDirection.getOrientation( x );
NBTTagCompound def = data.getCompoundTag( "def:" + side.ordinal() );
NBTTagCompound extra = data.getCompoundTag( "extra:" + side.ordinal() );
if ( def != null && extra != null )
{
2014-12-29 15:13:47 +01:00
IPart p = this.getPart( side );
2014-09-24 02:26:27 +02:00
ItemStack iss = ItemStack.loadItemStackFromNBT( def );
if ( iss == null )
continue;
ItemStack current = p == null ? null : p.getItemStack( PartItemStack.World );
if ( Platform.isSameItemType( iss, current ) )
p.readFromNBT( extra );
else
{
2014-12-29 15:13:47 +01:00
this.removePart( side, true );
side = this.addPart( iss, side, null );
2014-09-24 02:26:27 +02:00
if ( side != null )
{
2014-12-29 15:13:47 +01:00
p = this.getPart( side );
2014-09-24 02:26:27 +02:00
p.readFromNBT( extra );
}
else
{
AELog.warning( "Invalid NBT For CableBus Container: " + iss.getItem().getClass().getName() + " is not a valid part; it was ignored." );
}
}
}
else
2014-12-29 15:13:47 +01:00
this.removePart( side, false );
2014-09-24 02:26:27 +02:00
}
2014-12-29 15:13:47 +01:00
this.getFacadeContainer().readFromNBT( data );
2014-09-24 02:26:27 +02:00
}
public List getDrops(List drops)
{
for (ForgeDirection s : ForgeDirection.values())
{
2014-12-29 15:13:47 +01:00
IPart part = this.getPart( s );
2014-09-24 02:26:27 +02:00
if ( part != null )
{
drops.add( part.getItemStack( PartItemStack.Break ) );
part.getDrops( drops, false );
}
if ( s != ForgeDirection.UNKNOWN )
{
2014-12-29 15:13:47 +01:00
IFacadePart fp = this.getFacadeContainer().getFacade( s );
2014-09-24 02:26:27 +02:00
if ( fp != null )
drops.add( fp.getItemStack() );
}
}
return drops;
}
public List getNoDrops(List drops)
{
for (ForgeDirection s : ForgeDirection.values())
{
2014-12-29 15:13:47 +01:00
IPart part = this.getPart( s );
2014-09-24 02:26:27 +02:00
if ( part != null )
{
part.getDrops( drops, false );
}
}
return drops;
}
@Override
public void markForUpdate()
{
2014-12-29 15:13:47 +01:00
this.tcb.markForUpdate();
2014-09-24 02:26:27 +02:00
}
@Override
public DimensionalCoord getLocation()
{
2014-12-29 15:13:47 +01:00
return this.tcb.getLocation();
2014-09-24 02:26:27 +02:00
}
@Override
public TileEntity getTile()
{
2014-12-29 15:13:47 +01:00
return this.tcb.getTile();
2014-09-24 02:26:27 +02:00
}
@Override
public AECableType getCableConnectionType(ForgeDirection dir)
{
2014-12-29 15:13:47 +01:00
IPart part = this.getPart( dir );
2014-09-24 02:26:27 +02:00
if ( part != null && part instanceof IGridHost )
{
AECableType t = ((IGridHost) part).getCableConnectionType( dir );
if ( t != null && t != AECableType.NONE )
return t;
}
2014-12-29 15:13:47 +01:00
if ( this.getCenter() != null )
2014-09-24 02:26:27 +02:00
{
2014-12-29 15:13:47 +01:00
IPartCable c = this.getCenter();
2014-09-24 02:26:27 +02:00
return c.getCableConnectionType();
}
return AECableType.NONE;
}
@Override
public AEColor getColor()
{
2014-12-29 15:13:47 +01:00
if ( this.getCenter() != null )
2014-09-24 02:26:27 +02:00
{
2014-12-29 15:13:47 +01:00
IPartCable c = this.getCenter();
2014-09-24 02:26:27 +02:00
return c.getCableColor();
}
return AEColor.Transparent;
}
@Override
public IFacadeContainer getFacadeContainer()
{
return new FacadeContainer( this );
}
@Override
public void clearContainer()
{
throw new RuntimeException( "Now that is silly!" );
}
@Override
public boolean isBlocked(ForgeDirection side)
{
2014-12-29 15:13:47 +01:00
return this.tcb.isBlocked( side );
2014-09-24 02:26:27 +02:00
}
@Override
2014-09-24 02:26:27 +02:00
public int getLightValue()
{
int light = 0;
for (ForgeDirection d : ForgeDirection.values())
{
2014-12-29 15:13:47 +01:00
IPart p = this.getPart( d );
2014-09-24 02:26:27 +02:00
if ( p != null )
light = Math.max( p.getLightLevel(), light );
}
if ( light > 0 && AppEng.instance.isIntegrationEnabled( IntegrationType.CLApi ) )
2014-12-29 15:13:47 +01:00
return ((ICLApi) AppEng.instance.getIntegration( IntegrationType.CLApi )).colorLight( this.getColor(), light );
2014-09-24 02:26:27 +02:00
return light;
}
@Override
public boolean recolourBlock(ForgeDirection side, AEColor colour, EntityPlayer who)
{
2014-12-29 15:13:47 +01:00
IPart cable = this.getPart( ForgeDirection.UNKNOWN );
2014-09-24 02:26:27 +02:00
if ( cable != null )
{
IPartCable pc = (IPartCable) cable;
return pc.changeColor( colour, who );
}
return false;
}
@Override
2014-09-24 02:26:27 +02:00
public boolean activate(EntityPlayer player, Vec3 pos)
{
2014-12-29 15:13:47 +01:00
SelectedPart p = this.selectPart( pos );
2014-09-24 02:26:27 +02:00
if ( p != null && p.part != null )
{
return p.part.onActivate( player, pos );
}
return false;
}
@Override
public SelectedPart selectPart(Vec3 pos)
{
for (ForgeDirection side : ForgeDirection.values())
{
2014-12-29 15:13:47 +01:00
IPart p = this.getPart( side );
2014-09-24 02:26:27 +02:00
if ( p != null )
{
List<AxisAlignedBB> boxes = new LinkedList<AxisAlignedBB>();
IPartCollisionHelper bch = new BusCollisionHelper( boxes, side, null, true );
p.getBoxes( bch );
for (AxisAlignedBB bb : boxes)
{
bb = bb.expand( 0.002, 0.002, 0.002 );
if ( bb.isVecInside( pos ) )
{
return new SelectedPart( p, side );
}
}
}
}
if ( AEApi.instance().partHelper().getCableRenderMode().opaqueFacades )
{
2014-12-29 15:13:47 +01:00
IFacadeContainer fc = this.getFacadeContainer();
2014-09-24 02:26:27 +02:00
for (ForgeDirection side : ForgeDirection.VALID_DIRECTIONS)
{
IFacadePart p = fc.getFacade( side );
if ( p != null )
{
List<AxisAlignedBB> boxes = new LinkedList<AxisAlignedBB>();
IPartCollisionHelper bch = new BusCollisionHelper( boxes, side, null, true );
p.getBoxes( bch, null );
for (AxisAlignedBB bb : boxes)
{
bb = bb.expand( 0.01, 0.01, 0.01 );
if ( bb.isVecInside( pos ) )
{
return new SelectedPart( p, side );
}
}
}
}
}
return new SelectedPart();
}
@Override
public void partChanged()
{
2014-12-29 15:13:47 +01:00
if ( this.getCenter() == null )
2014-09-24 02:26:27 +02:00
{
2014-09-28 22:20:14 +02:00
List<ItemStack> facades = new LinkedList<ItemStack>();
2014-09-24 02:26:27 +02:00
2014-12-29 15:13:47 +01:00
IFacadeContainer fc = this.getFacadeContainer();
2014-09-24 02:26:27 +02:00
for (ForgeDirection d : ForgeDirection.VALID_DIRECTIONS)
{
IFacadePart fp = fc.getFacade( d );
if ( fp != null )
{
facades.add( fp.getItemStack() );
2014-12-29 15:13:47 +01:00
fc.removeFacade( this.tcb, d );
2014-09-24 02:26:27 +02:00
}
}
2014-09-28 19:41:51 +02:00
if ( !facades.isEmpty() )
2014-09-24 02:26:27 +02:00
{
2014-12-29 15:13:47 +01:00
TileEntity te = this.tcb.getTile();
2014-09-24 02:26:27 +02:00
Platform.spawnDrops( te.getWorldObj(), te.xCoord, te.yCoord, te.zCoord, facades );
}
}
2014-12-29 15:13:47 +01:00
this.tcb.partChanged();
2014-09-24 02:26:27 +02:00
}
@Override
public void markForSave()
{
2014-12-29 15:13:47 +01:00
this.tcb.markForSave();
2014-09-24 02:26:27 +02:00
}
@Override
2014-09-24 02:26:27 +02:00
public void randomDisplayTick(World world, int x, int y, int z, Random r)
{
for (ForgeDirection side : ForgeDirection.values())
{
2014-12-29 15:13:47 +01:00
IPart p = this.getPart( side );
2014-09-24 02:26:27 +02:00
if ( p != null )
{
p.randomDisplayTick( world, x, y, z, r );
}
}
}
@Override
public boolean hasRedstone(ForgeDirection side)
{
2014-12-29 15:13:47 +01:00
if ( this.hasRedstone == YesNo.UNDECIDED )
this.updateRedstone();
2014-09-24 02:26:27 +02:00
2014-12-29 15:13:47 +01:00
return this.hasRedstone == YesNo.YES;
2014-09-24 02:26:27 +02:00
}
@Override
2014-09-24 02:26:27 +02:00
public boolean isLadder(EntityLivingBase entity)
{
for (ForgeDirection side : ForgeDirection.values())
{
2014-12-29 15:13:47 +01:00
IPart p = this.getPart( side );
2014-09-24 02:26:27 +02:00
if ( p != null )
{
if ( p.isLadder( entity ) )
return true;
}
}
return false;
}
@Override
public void securityBreak()
{
for (ForgeDirection d : ForgeDirection.values())
{
2014-12-29 15:13:47 +01:00
IPart p = this.getPart( d );
2014-09-24 02:26:27 +02:00
if ( p != null && p instanceof IGridHost )
((IGridHost) p).securityBreak();
}
}
@Override
public Set<LayerFlags> getLayerFlags()
{
2014-12-29 15:13:47 +01:00
return this.myLayerFlags;
2014-09-24 02:26:27 +02:00
}
@Override
public void cleanup()
{
2014-12-29 15:13:47 +01:00
this.tcb.cleanup();
2014-09-24 02:26:27 +02:00
}
@Override
public void notifyNeighbors()
{
2014-12-29 15:13:47 +01:00
this.tcb.notifyNeighbors();
2014-09-24 02:26:27 +02:00
}
}