/* * 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>. */ package appeng.tile.spatial; import java.util.EnumSet; import io.netty.buffer.ByteBuf; import net.minecraft.util.EnumFacing; import appeng.api.networking.GridFlags; import appeng.api.networking.events.MENetworkChannelsChanged; import appeng.api.networking.events.MENetworkEventSubscribe; import appeng.api.networking.events.MENetworkPowerStatusChange; import appeng.me.GridAccessException; import appeng.me.cluster.IAEMultiBlock; import appeng.me.cluster.implementations.SpatialPylonCalculator; import appeng.me.cluster.implementations.SpatialPylonCluster; import appeng.me.helpers.AENetworkProxy; import appeng.me.helpers.AENetworkProxyMultiblock; import appeng.tile.TileEvent; import appeng.tile.events.TileEventType; import appeng.tile.grid.AENetworkTile; public class TileSpatialPylon extends AENetworkTile implements IAEMultiBlock { public static final int DISPLAY_END_MIN = 0x01; public static final int DISPLAY_END_MAX = 0x02; public static final int DISPLAY_MIDDLE = 0x01 + 0x02; public static final int DISPLAY_X = 0x04; public static final int DISPLAY_Y = 0x08; public static final int DISPLAY_Z = 0x04 + 0x08; public static final int MB_STATUS = 0x01 + 0x02 + 0x04 + 0x08; public static final int DISPLAY_ENABLED = 0x10; public static final int DISPLAY_POWERED_ENABLED = 0x20; public static final int NET_STATUS = 0x10 + 0x20; private final SpatialPylonCalculator calc = new SpatialPylonCalculator( this ); private int displayBits = 0; private SpatialPylonCluster cluster; private boolean didHaveLight = false; public TileSpatialPylon() { this.getProxy().setFlags( GridFlags.REQUIRE_CHANNEL, GridFlags.MULTIBLOCK ); this.getProxy().setIdlePowerUsage( 0.5 ); this.getProxy().setValidSides( EnumSet.noneOf( EnumFacing.class ) ); } @Override protected AENetworkProxy createProxy() { return new AENetworkProxyMultiblock( this, "proxy", this.getItemFromTile( this ), true ); } @Override public void onChunkUnload() { this.disconnect( false ); super.onChunkUnload(); } @Override public void onReady() { super.onReady(); this.neighborChanged(); } @Override public void invalidate() { this.disconnect( false ); super.invalidate(); } public void neighborChanged() { this.calc.calculateMultiblock( this.worldObj, this.getLocation() ); } @Override public void disconnect( final boolean b ) { if( this.cluster != null ) { this.cluster.destroy(); this.updateStatus( null ); } } @Override public SpatialPylonCluster getCluster() { return this.cluster; } @Override public boolean isValid() { return true; } public void updateStatus( final SpatialPylonCluster c ) { this.cluster = c; this.getProxy().setValidSides( c == null ? EnumSet.noneOf( EnumFacing.class ) : EnumSet.allOf( EnumFacing.class ) ); this.recalculateDisplay(); } public void recalculateDisplay() { final int oldBits = this.displayBits; this.displayBits = 0; if( this.cluster != null ) { if( this.cluster.getMin().equals( this.getLocation() ) ) { this.displayBits = DISPLAY_END_MIN; } else if( this.cluster.getMax().equals( this.getLocation() ) ) { this.displayBits = DISPLAY_END_MAX; } else { this.displayBits = DISPLAY_MIDDLE; } switch( this.cluster.getCurrentAxis() ) { case X: this.displayBits |= DISPLAY_X; break; case Y: this.displayBits |= DISPLAY_Y; break; case Z: this.displayBits |= DISPLAY_Z; break; default: this.displayBits = 0; break; } try { if( this.getProxy().getEnergy().isNetworkPowered() ) { this.displayBits |= DISPLAY_POWERED_ENABLED; } if( this.cluster.isValid() && this.getProxy().isActive() ) { this.displayBits |= DISPLAY_ENABLED; } } catch( final GridAccessException e ) { // nothing? } } if( oldBits != this.displayBits ) { this.markForUpdate(); } } @Override public void markForUpdate() { super.markForUpdate(); final boolean hasLight = this.getLightValue() > 0; if( hasLight != this.didHaveLight ) { this.didHaveLight = hasLight; this.worldObj.checkLight( this.pos ); // worldObj.updateAllLightTypes( xCoord, yCoord, zCoord ); } } @Override public boolean canBeRotated() { return false; } public int getLightValue() { if( ( this.displayBits & DISPLAY_POWERED_ENABLED ) == DISPLAY_POWERED_ENABLED ) { return 8; } return 0; } @TileEvent( TileEventType.NETWORK_READ ) public boolean readFromStream_TileSpatialPylon( final ByteBuf data ) { final int old = this.displayBits; this.displayBits = data.readByte(); return old != this.displayBits; } @TileEvent( TileEventType.NETWORK_WRITE ) public void writeToStream_TileSpatialPylon( final ByteBuf data ) { data.writeByte( this.displayBits ); } @MENetworkEventSubscribe public void powerRender( final MENetworkPowerStatusChange c ) { this.recalculateDisplay(); } @MENetworkEventSubscribe public void activeRender( final MENetworkChannelsChanged c ) { this.recalculateDisplay(); } public int getDisplayBits() { return this.displayBits; } }