/*
* 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.core.features.registries;
import java.util.HashMap;
import java.util.HashSet;
import java.util.LinkedList;
import net.minecraft.block.Block;
import net.minecraft.tileentity.TileEntity;
import appeng.api.exceptions.AppEngException;
import appeng.api.movable.IMovableHandler;
import appeng.api.movable.IMovableRegistry;
import appeng.api.movable.IMovableTile;
import appeng.spatial.DefaultSpatialHandler;
public class MovableTileRegistry implements IMovableRegistry
{
private final HashSet<Block> blacklisted = new HashSet<Block>();
private final HashMap<Class<? extends TileEntity>, IMovableHandler> Valid = new HashMap<Class<? extends TileEntity>, IMovableHandler>();
private final LinkedList<Class<? extends TileEntity>> test = new LinkedList<Class<? extends TileEntity>>();
private final LinkedList<IMovableHandler> handlers = new LinkedList<IMovableHandler>();
private final DefaultSpatialHandler dsh = new DefaultSpatialHandler();
private final IMovableHandler nullHandler = new DefaultSpatialHandler();
@Override
public void blacklistBlock( final Block blk )
{
this.blacklisted.add( blk );
}
@Override
public void whiteListTileEntity( final Class<? extends TileEntity> c )
{
if( c.getName().equals( TileEntity.class.getName() ) )
{
throw new IllegalArgumentException( new AppEngException( "Someone tried to make all tiles movable with " + c + ", this is a clear violation of the purpose of the white list." ) );
}
this.test.add( c );
}
@Override
public boolean askToMove( final TileEntity te )
{
final Class myClass = te.getClass();
IMovableHandler canMove = this.Valid.get( myClass );
if( canMove == null )
{
canMove = this.testClass( myClass, te );
}
if( canMove != this.nullHandler )
{
if( te instanceof IMovableTile )
{
( (IMovableTile) te ).prepareToMove();
}
te.invalidate();
return true;
}
return false;
}
private IMovableHandler testClass( final Class myClass, final TileEntity te )
{
IMovableHandler handler = null;
// ask handlers...
for( final IMovableHandler han : this.handlers )
{
if( han.canHandle( myClass, te ) )
{
handler = han;
break;
}
}
// if you have a handler your opted in
if( handler != null )
{
this.Valid.put( myClass, handler );
return handler;
}
// if your movable our opted in
if( te instanceof IMovableTile )
{
this.Valid.put( myClass, this.dsh );
return this.dsh;
}
// if you are on the white list your opted in.
for( final Class<? extends TileEntity> testClass : this.test )
{
if( testClass.isAssignableFrom( myClass ) )
{
this.Valid.put( myClass, this.dsh );
return this.dsh;
}
}
this.Valid.put( myClass, this.nullHandler );
return this.nullHandler;
}
@Override
public void doneMoving( final TileEntity te )
{
if( te instanceof IMovableTile )
{
final IMovableTile mt = (IMovableTile) te;
mt.doneMoving();
}
}
@Override
public void addHandler( final IMovableHandler han )
{
this.handlers.add( han );
}
@Override
public IMovableHandler getHandler( final TileEntity te )
{
final Class myClass = te.getClass();
final IMovableHandler h = this.Valid.get( myClass );
return h == null ? this.dsh : h;
}
@Override
public IMovableHandler getDefaultHandler()
{
return this.dsh;
}
@Override
public boolean isBlacklisted( final Block blk )
{
return this.blacklisted.contains( blk );
}
}