633ea48d42
Introduced an easier Facade class to access mod integration abstractions (called Integrations). Removed the link between IntegrationType and integration abstraction. Integrations are now explicitly instantiated inside of IntegrationNode.
219 lines
5.7 KiB
Java
219 lines
5.7 KiB
Java
/*
|
|
* This file is part of Applied Energistics 2.
|
|
* Copyright (c) 2013 - 2015, 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.facade;
|
|
|
|
|
|
import java.io.IOException;
|
|
import java.util.Optional;
|
|
|
|
import io.netty.buffer.ByteBuf;
|
|
|
|
import net.minecraft.item.Item;
|
|
import net.minecraft.item.ItemStack;
|
|
import net.minecraft.nbt.NBTTagCompound;
|
|
|
|
import appeng.api.AEApi;
|
|
import appeng.api.parts.IFacadeContainer;
|
|
import appeng.api.parts.IFacadePart;
|
|
import appeng.api.parts.IPartHost;
|
|
import appeng.api.util.AEPartLocation;
|
|
import appeng.items.parts.ItemFacade;
|
|
import appeng.parts.CableBusStorage;
|
|
|
|
|
|
public class FacadeContainer implements IFacadeContainer
|
|
{
|
|
|
|
private final int facades = 6;
|
|
private final CableBusStorage storage;
|
|
|
|
public FacadeContainer( final CableBusStorage cbs )
|
|
{
|
|
this.storage = cbs;
|
|
}
|
|
|
|
@Override
|
|
public boolean addFacade( final IFacadePart a )
|
|
{
|
|
if( this.getFacade( a.getSide() ) == null )
|
|
{
|
|
this.storage.setFacade( a.getSide().ordinal(), a );
|
|
return true;
|
|
}
|
|
return false;
|
|
}
|
|
|
|
@Override
|
|
public void removeFacade( final IPartHost host, final AEPartLocation side )
|
|
{
|
|
if( side != null && side != AEPartLocation.INTERNAL )
|
|
{
|
|
if( this.storage.getFacade( side.ordinal() ) != null )
|
|
{
|
|
this.storage.setFacade( side.ordinal(), null );
|
|
if( host != null )
|
|
{
|
|
host.markForUpdate();
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
@Override
|
|
public IFacadePart getFacade( final AEPartLocation s )
|
|
{
|
|
return this.storage.getFacade( s.ordinal() );
|
|
}
|
|
|
|
@Override
|
|
public void rotateLeft()
|
|
{
|
|
final IFacadePart[] newFacades = new FacadePart[6];
|
|
|
|
newFacades[AEPartLocation.UP.ordinal()] = this.storage.getFacade( AEPartLocation.UP.ordinal() );
|
|
newFacades[AEPartLocation.DOWN.ordinal()] = this.storage.getFacade( AEPartLocation.DOWN.ordinal() );
|
|
|
|
newFacades[AEPartLocation.EAST.ordinal()] = this.storage.getFacade( AEPartLocation.NORTH.ordinal() );
|
|
newFacades[AEPartLocation.SOUTH.ordinal()] = this.storage.getFacade( AEPartLocation.EAST.ordinal() );
|
|
|
|
newFacades[AEPartLocation.WEST.ordinal()] = this.storage.getFacade( AEPartLocation.SOUTH.ordinal() );
|
|
newFacades[AEPartLocation.NORTH.ordinal()] = this.storage.getFacade( AEPartLocation.WEST.ordinal() );
|
|
|
|
for( int x = 0; x < this.facades; x++ )
|
|
{
|
|
this.storage.setFacade( x, newFacades[x] );
|
|
}
|
|
}
|
|
|
|
@Override
|
|
public void writeToNBT( final NBTTagCompound c )
|
|
{
|
|
for( int x = 0; x < this.facades; x++ )
|
|
{
|
|
if( this.storage.getFacade( x ) != null )
|
|
{
|
|
final NBTTagCompound data = new NBTTagCompound();
|
|
this.storage.getFacade( x ).getItemStack().writeToNBT( data );
|
|
c.setTag( "facade:" + x, data );
|
|
}
|
|
}
|
|
}
|
|
|
|
@Override
|
|
public boolean readFromStream( final ByteBuf out ) throws IOException
|
|
{
|
|
final int facadeSides = out.readByte();
|
|
|
|
boolean changed = false;
|
|
|
|
final int[] ids = new int[2];
|
|
for( int x = 0; x < this.facades; x++ )
|
|
{
|
|
final AEPartLocation side = AEPartLocation.fromOrdinal( x );
|
|
final int ix = ( 1 << x );
|
|
if( ( facadeSides & ix ) == ix )
|
|
{
|
|
ids[0] = out.readInt();
|
|
ids[1] = out.readInt();
|
|
ids[0] = Math.abs( ids[0] );
|
|
|
|
Optional<Item> maybeFacadeItem = AEApi.instance().definitions().items().facade().maybeItem();
|
|
if (maybeFacadeItem.isPresent()) {
|
|
final ItemFacade ifa = (ItemFacade) maybeFacadeItem.get();
|
|
final ItemStack facade = ifa.createFromIDs( ids );
|
|
if( facade != null )
|
|
{
|
|
changed = changed || this.storage.getFacade( x ) == null;
|
|
this.storage.setFacade( x, ifa.createPartFromItemStack( facade, side ) );
|
|
}
|
|
}
|
|
}
|
|
else
|
|
{
|
|
changed = changed || this.storage.getFacade( x ) != null;
|
|
this.storage.setFacade( x, null );
|
|
}
|
|
}
|
|
|
|
return changed;
|
|
}
|
|
|
|
@Override
|
|
public void readFromNBT( final NBTTagCompound c )
|
|
{
|
|
for( int x = 0; x < this.facades; x++ )
|
|
{
|
|
this.storage.setFacade( x, null );
|
|
|
|
final NBTTagCompound t = c.getCompoundTag( "facade:" + x );
|
|
if( t != null )
|
|
{
|
|
final ItemStack is = ItemStack.loadItemStackFromNBT( t );
|
|
if( is != null )
|
|
{
|
|
final Item i = is.getItem();
|
|
if( i instanceof IFacadeItem )
|
|
{
|
|
this.storage.setFacade( x, ( (IFacadeItem) i ).createPartFromItemStack( is, AEPartLocation.fromOrdinal( x ) ) );
|
|
}
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
@Override
|
|
public void writeToStream( final ByteBuf out ) throws IOException
|
|
{
|
|
int facadeSides = 0;
|
|
for( int x = 0; x < this.facades; x++ )
|
|
{
|
|
if( this.getFacade( AEPartLocation.fromOrdinal( x ) ) != null )
|
|
{
|
|
facadeSides |= ( 1 << x );
|
|
}
|
|
}
|
|
out.writeByte( (byte) facadeSides );
|
|
|
|
for( int x = 0; x < this.facades; x++ )
|
|
{
|
|
final IFacadePart part = this.getFacade( AEPartLocation.fromOrdinal( x ) );
|
|
if( part != null )
|
|
{
|
|
final int itemID = Item.getIdFromItem( part.getItem() );
|
|
final int dmgValue = part.getItemDamage();
|
|
out.writeInt( itemID * ( part.notAEFacade() ? -1 : 1 ) );
|
|
out.writeInt( dmgValue );
|
|
}
|
|
}
|
|
}
|
|
|
|
@Override
|
|
public boolean isEmpty()
|
|
{
|
|
for( int x = 0; x < this.facades; x++ )
|
|
{
|
|
if( this.storage.getFacade( x ) != null )
|
|
{
|
|
return false;
|
|
}
|
|
}
|
|
return true;
|
|
}
|
|
}
|