2014-11-14 12:02:52 +01:00
|
|
|
/*
|
|
|
|
* This file is part of Applied Energistics 2.
|
2015-05-18 00:02:28 +02:00
|
|
|
* Copyright (c) 2013 - 2015, AlgorithmX2, All rights reserved.
|
2014-11-14 12:02:52 +01:00
|
|
|
*
|
|
|
|
* 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>.
|
|
|
|
*/
|
|
|
|
|
2013-12-27 23:59:59 +01:00
|
|
|
package appeng.spatial;
|
|
|
|
|
2015-04-03 08:54:31 +02:00
|
|
|
|
2014-03-05 08:27:42 +01:00
|
|
|
import java.lang.reflect.Method;
|
2013-12-27 23:59:59 +01:00
|
|
|
import java.util.List;
|
|
|
|
|
|
|
|
import net.minecraft.block.Block;
|
|
|
|
import net.minecraft.entity.Entity;
|
2014-07-26 04:35:48 +02:00
|
|
|
import net.minecraft.entity.EntityHanging;
|
2013-12-27 23:59:59 +01:00
|
|
|
import net.minecraft.entity.EntityList;
|
|
|
|
import net.minecraft.entity.player.EntityPlayerMP;
|
|
|
|
import net.minecraft.util.AxisAlignedBB;
|
|
|
|
import net.minecraft.util.MathHelper;
|
|
|
|
import net.minecraft.world.Teleporter;
|
|
|
|
import net.minecraft.world.World;
|
|
|
|
import net.minecraft.world.WorldServer;
|
2014-12-29 21:59:05 +01:00
|
|
|
|
2013-12-27 23:59:59 +01:00
|
|
|
import appeng.api.AEApi;
|
|
|
|
import appeng.api.util.WorldCoord;
|
2014-08-31 10:06:06 +02:00
|
|
|
import appeng.core.stats.Achievements;
|
2014-02-09 02:34:52 +01:00
|
|
|
import appeng.util.Platform;
|
2013-12-27 23:59:59 +01:00
|
|
|
|
2015-04-03 08:54:31 +02:00
|
|
|
|
2013-12-27 23:59:59 +01:00
|
|
|
public class StorageHelper
|
|
|
|
{
|
|
|
|
|
|
|
|
private static StorageHelper instance;
|
2015-04-03 08:54:31 +02:00
|
|
|
Method onEntityRemoved;
|
2013-12-27 23:59:59 +01:00
|
|
|
|
|
|
|
public static StorageHelper getInstance()
|
|
|
|
{
|
2015-04-03 08:54:31 +02:00
|
|
|
if( instance == null )
|
2015-04-29 02:30:53 +02:00
|
|
|
{
|
2013-12-27 23:59:59 +01:00
|
|
|
instance = new StorageHelper();
|
2015-04-29 02:30:53 +02:00
|
|
|
}
|
2013-12-27 23:59:59 +01:00
|
|
|
return instance;
|
|
|
|
}
|
|
|
|
|
|
|
|
/**
|
2014-09-21 01:37:12 +02:00
|
|
|
* Mostly from dimensional doors.. which mostly got it form X-Comp.
|
2015-02-03 12:04:13 +01:00
|
|
|
*
|
2014-09-27 23:17:47 +02:00
|
|
|
* @param entity to be teleported entity
|
2015-04-03 08:54:31 +02:00
|
|
|
* @param link destination
|
|
|
|
*
|
2014-09-27 23:17:47 +02:00
|
|
|
* @return teleported entity
|
2013-12-27 23:59:59 +01:00
|
|
|
*/
|
2015-04-03 08:54:31 +02:00
|
|
|
public Entity teleportEntity( Entity entity, TelDestination link )
|
2013-12-27 23:59:59 +01:00
|
|
|
{
|
2015-03-26 12:13:34 +01:00
|
|
|
WorldServer oldWorld;
|
|
|
|
WorldServer newWorld;
|
2013-12-27 23:59:59 +01:00
|
|
|
EntityPlayerMP player;
|
|
|
|
|
|
|
|
try
|
|
|
|
{
|
|
|
|
oldWorld = (WorldServer) entity.worldObj;
|
|
|
|
newWorld = (WorldServer) link.dim;
|
2015-04-03 08:54:31 +02:00
|
|
|
player = ( entity instanceof EntityPlayerMP ) ? (EntityPlayerMP) entity : null;
|
2013-12-27 23:59:59 +01:00
|
|
|
}
|
2015-04-03 08:54:31 +02:00
|
|
|
catch( Throwable e )
|
2013-12-27 23:59:59 +01:00
|
|
|
{
|
|
|
|
return entity;
|
|
|
|
}
|
|
|
|
|
2015-04-03 08:54:31 +02:00
|
|
|
if( oldWorld == null )
|
2015-04-29 02:30:53 +02:00
|
|
|
{
|
2013-12-27 23:59:59 +01:00
|
|
|
return entity;
|
2015-04-29 02:30:53 +02:00
|
|
|
}
|
2015-04-03 08:54:31 +02:00
|
|
|
if( newWorld == null )
|
2015-04-29 02:30:53 +02:00
|
|
|
{
|
2013-12-27 23:59:59 +01:00
|
|
|
return entity;
|
2015-04-29 02:30:53 +02:00
|
|
|
}
|
2013-12-27 23:59:59 +01:00
|
|
|
|
|
|
|
// Is something riding? Handle it first.
|
2015-04-03 08:54:31 +02:00
|
|
|
if( entity.riddenByEntity != null )
|
2013-12-27 23:59:59 +01:00
|
|
|
{
|
2014-12-29 15:13:47 +01:00
|
|
|
return this.teleportEntity( entity.riddenByEntity, link );
|
2013-12-27 23:59:59 +01:00
|
|
|
}
|
|
|
|
// Are we riding something? Dismount and tell the mount to go first.
|
|
|
|
Entity cart = entity.ridingEntity;
|
2015-04-03 08:54:31 +02:00
|
|
|
if( cart != null )
|
2013-12-27 23:59:59 +01:00
|
|
|
{
|
|
|
|
entity.mountEntity( null );
|
2014-12-29 15:13:47 +01:00
|
|
|
cart = this.teleportEntity( cart, link );
|
2013-12-27 23:59:59 +01:00
|
|
|
// We keep track of both so we can remount them on the other side.
|
|
|
|
}
|
|
|
|
|
2014-07-26 04:35:48 +02:00
|
|
|
// load the chunk!
|
2014-08-03 07:06:19 +02:00
|
|
|
WorldServer.class.cast( newWorld ).getChunkProvider().loadChunk( MathHelper.floor_double( link.x ) >> 4, MathHelper.floor_double( link.z ) >> 4 );
|
2014-07-26 04:35:48 +02:00
|
|
|
|
2014-11-04 12:32:33 +01:00
|
|
|
boolean diffDestination = newWorld != oldWorld;
|
2015-04-03 08:54:31 +02:00
|
|
|
if( diffDestination )
|
2013-12-27 23:59:59 +01:00
|
|
|
{
|
2015-04-03 08:54:31 +02:00
|
|
|
if( player != null )
|
2013-12-27 23:59:59 +01:00
|
|
|
{
|
2015-04-03 08:54:31 +02:00
|
|
|
if( link.dim.provider instanceof StorageWorldProvider )
|
2015-04-29 02:30:53 +02:00
|
|
|
{
|
2014-09-20 23:20:43 +02:00
|
|
|
Achievements.SpatialIOExplorer.addToPlayer( player );
|
2015-04-29 02:30:53 +02:00
|
|
|
}
|
2014-08-31 10:06:06 +02:00
|
|
|
|
2013-12-27 23:59:59 +01:00
|
|
|
player.mcServer.getConfigurationManager().transferPlayerToDimension( player, link.dim.provider.dimensionId, new METeleporter( newWorld, link ) );
|
|
|
|
}
|
|
|
|
else
|
|
|
|
{
|
|
|
|
int entX = entity.chunkCoordX;
|
|
|
|
int entZ = entity.chunkCoordZ;
|
2014-07-26 04:35:48 +02:00
|
|
|
|
2015-04-03 08:54:31 +02:00
|
|
|
if( ( entity.addedToChunk ) && ( oldWorld.getChunkProvider().chunkExists( entX, entZ ) ) )
|
2013-12-27 23:59:59 +01:00
|
|
|
{
|
|
|
|
oldWorld.getChunkFromChunkCoords( entX, entZ ).removeEntity( entity );
|
|
|
|
oldWorld.getChunkFromChunkCoords( entX, entZ ).isModified = true;
|
|
|
|
}
|
|
|
|
|
2014-07-26 04:35:48 +02:00
|
|
|
Entity newEntity = EntityList.createEntityByName( EntityList.getEntityString( entity ), newWorld );
|
2015-04-03 08:54:31 +02:00
|
|
|
if( newEntity != null )
|
2014-03-05 08:27:42 +01:00
|
|
|
{
|
2014-07-26 04:35:48 +02:00
|
|
|
entity.lastTickPosX = entity.prevPosX = entity.posX = link.x;
|
|
|
|
entity.lastTickPosY = entity.prevPosY = entity.posY = link.y;
|
|
|
|
entity.lastTickPosZ = entity.prevPosZ = entity.posZ = link.z;
|
2014-03-05 08:27:42 +01:00
|
|
|
|
2015-04-03 08:54:31 +02:00
|
|
|
if( entity instanceof EntityHanging )
|
2014-03-05 08:27:42 +01:00
|
|
|
{
|
2014-07-26 04:35:48 +02:00
|
|
|
EntityHanging h = (EntityHanging) entity;
|
|
|
|
h.field_146063_b += link.xOff;
|
|
|
|
h.field_146064_c += link.yOff;
|
|
|
|
h.field_146062_d += link.zOff;
|
2014-03-05 08:27:42 +01:00
|
|
|
}
|
2013-12-27 23:59:59 +01:00
|
|
|
|
2014-07-26 04:35:48 +02:00
|
|
|
newEntity.copyDataFrom( entity, true );
|
|
|
|
newEntity.dimension = newWorld.provider.dimensionId;
|
|
|
|
newEntity.forceSpawn = true;
|
|
|
|
|
2013-12-27 23:59:59 +01:00
|
|
|
entity.isDead = true;
|
2014-07-26 04:35:48 +02:00
|
|
|
entity = newEntity;
|
2013-12-27 23:59:59 +01:00
|
|
|
}
|
2014-07-26 04:35:48 +02:00
|
|
|
else
|
2015-04-29 02:30:53 +02:00
|
|
|
{
|
2014-07-26 04:35:48 +02:00
|
|
|
return null;
|
2015-04-29 02:30:53 +02:00
|
|
|
}
|
2013-12-27 23:59:59 +01:00
|
|
|
|
2014-07-26 04:35:48 +02:00
|
|
|
// myChunk.addEntity( entity );
|
|
|
|
// newWorld.loadedEntityList.add( entity );
|
|
|
|
// newWorld.onEntityAdded( entity );
|
2013-12-27 23:59:59 +01:00
|
|
|
newWorld.spawnEntityInWorld( entity );
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
entity.worldObj.updateEntityWithOptionalForce( entity, false );
|
|
|
|
|
2015-04-03 08:54:31 +02:00
|
|
|
if( cart != null )
|
2013-12-27 23:59:59 +01:00
|
|
|
{
|
2015-04-03 08:54:31 +02:00
|
|
|
if( player != null )
|
2015-04-29 02:30:53 +02:00
|
|
|
{
|
2013-12-27 23:59:59 +01:00
|
|
|
entity.worldObj.updateEntityWithOptionalForce( entity, true );
|
2015-04-29 02:30:53 +02:00
|
|
|
}
|
2013-12-27 23:59:59 +01:00
|
|
|
|
|
|
|
entity.mountEntity( cart );
|
|
|
|
}
|
|
|
|
|
|
|
|
return entity;
|
|
|
|
}
|
|
|
|
|
2015-04-03 08:54:31 +02:00
|
|
|
public void transverseEdges( int minX, int minY, int minZ, int maxX, int maxY, int maxZ, ISpatialVisitor visitor )
|
2013-12-27 23:59:59 +01:00
|
|
|
{
|
2015-04-03 08:54:31 +02:00
|
|
|
for( int y = minY; y < maxY; y++ )
|
2015-04-29 02:30:53 +02:00
|
|
|
{
|
2015-04-03 08:54:31 +02:00
|
|
|
for( int z = minZ; z < maxZ; z++ )
|
2013-12-27 23:59:59 +01:00
|
|
|
{
|
2014-09-28 11:47:17 +02:00
|
|
|
visitor.visit( minX, y, z );
|
|
|
|
visitor.visit( maxX, y, z );
|
2013-12-27 23:59:59 +01:00
|
|
|
}
|
2015-04-29 02:30:53 +02:00
|
|
|
}
|
2013-12-27 23:59:59 +01:00
|
|
|
|
2015-04-03 08:54:31 +02:00
|
|
|
for( int x = minX; x < maxX; x++ )
|
2015-04-29 02:30:53 +02:00
|
|
|
{
|
2015-04-03 08:54:31 +02:00
|
|
|
for( int z = minZ; z < maxZ; z++ )
|
2013-12-27 23:59:59 +01:00
|
|
|
{
|
2014-09-28 11:47:17 +02:00
|
|
|
visitor.visit( x, minY, z );
|
|
|
|
visitor.visit( x, maxY, z );
|
2013-12-27 23:59:59 +01:00
|
|
|
}
|
2015-04-29 02:30:53 +02:00
|
|
|
}
|
2013-12-27 23:59:59 +01:00
|
|
|
|
2015-04-03 08:54:31 +02:00
|
|
|
for( int x = minX; x < maxX; x++ )
|
2015-04-29 02:30:53 +02:00
|
|
|
{
|
2015-04-03 08:54:31 +02:00
|
|
|
for( int y = minY; y < maxY; y++ )
|
2013-12-27 23:59:59 +01:00
|
|
|
{
|
2014-09-28 11:47:17 +02:00
|
|
|
visitor.visit( x, y, minZ );
|
|
|
|
visitor.visit( x, y, maxZ );
|
2013-12-27 23:59:59 +01:00
|
|
|
}
|
2015-04-29 02:30:53 +02:00
|
|
|
}
|
2013-12-27 23:59:59 +01:00
|
|
|
}
|
|
|
|
|
2015-04-03 08:54:31 +02:00
|
|
|
public void swapRegions( World src /** over world **/, World dst /** storage cell **/, int x, int y, int z, int i, int j, int k, int scaleX, int scaleY, int scaleZ )
|
2013-12-27 23:59:59 +01:00
|
|
|
{
|
2015-04-03 08:54:31 +02:00
|
|
|
for( Block matrixFrameBlock : AEApi.instance().definitions().blocks().matrixFrame().maybeBlock().asSet() )
|
2015-01-03 02:53:14 +01:00
|
|
|
{
|
|
|
|
this.transverseEdges( i - 1, j - 1, k - 1, i + scaleX + 1, j + scaleY + 1, k + scaleZ + 1, new WrapInMatrixFrame( matrixFrameBlock, 0, dst ) );
|
|
|
|
}
|
2013-12-27 23:59:59 +01:00
|
|
|
|
|
|
|
AxisAlignedBB srcBox = AxisAlignedBB.getBoundingBox( x, y, z, x + scaleX + 1, y + scaleY + 1, z + scaleZ + 1 );
|
|
|
|
|
|
|
|
AxisAlignedBB dstBox = AxisAlignedBB.getBoundingBox( i, j, k, i + scaleX + 1, j + scaleY + 1, k + scaleZ + 1 );
|
|
|
|
|
|
|
|
CachedPlane cDst = new CachedPlane( dst, i, j, k, i + scaleX, j + scaleY, k + scaleZ );
|
|
|
|
CachedPlane cSrc = new CachedPlane( src, x, y, z, x + scaleX, y + scaleY, z + scaleZ );
|
|
|
|
|
|
|
|
// do nearly all the work... swaps blocks, tiles, and block ticks
|
2015-05-18 00:02:28 +02:00
|
|
|
cSrc.swap( cDst );
|
2013-12-27 23:59:59 +01:00
|
|
|
|
|
|
|
List<Entity> srcE = src.getEntitiesWithinAABB( Entity.class, srcBox );
|
|
|
|
List<Entity> dstE = dst.getEntitiesWithinAABB( Entity.class, dstBox );
|
|
|
|
|
2015-04-03 08:54:31 +02:00
|
|
|
for( Entity e : dstE )
|
2013-12-27 23:59:59 +01:00
|
|
|
{
|
2014-12-29 15:13:47 +01:00
|
|
|
this.teleportEntity( e, new TelDestination( src, srcBox, e.posX, e.posY, e.posZ, -i + x, -j + y, -k + z ) );
|
2013-12-27 23:59:59 +01:00
|
|
|
}
|
|
|
|
|
2015-04-03 08:54:31 +02:00
|
|
|
for( Entity e : srcE )
|
2013-12-27 23:59:59 +01:00
|
|
|
{
|
2014-12-29 15:13:47 +01:00
|
|
|
this.teleportEntity( e, new TelDestination( dst, dstBox, e.posX, e.posY, e.posZ, -x + i, -y + j, -z + k ) );
|
2013-12-27 23:59:59 +01:00
|
|
|
}
|
|
|
|
|
2015-04-03 08:54:31 +02:00
|
|
|
for( WorldCoord wc : cDst.updates )
|
2015-04-29 02:30:53 +02:00
|
|
|
{
|
2015-05-08 23:37:09 +02:00
|
|
|
cDst.world.notifyBlockOfNeighborChange( wc.x, wc.y, wc.z, Platform.AIR_BLOCK );
|
2015-04-29 02:30:53 +02:00
|
|
|
}
|
2013-12-27 23:59:59 +01:00
|
|
|
|
2015-04-03 08:54:31 +02:00
|
|
|
for( WorldCoord wc : cSrc.updates )
|
2015-04-29 02:30:53 +02:00
|
|
|
{
|
2015-05-08 23:37:09 +02:00
|
|
|
cSrc.world.notifyBlockOfNeighborChange( wc.x, wc.y, wc.z, Platform.AIR_BLOCK );
|
2015-04-29 02:30:53 +02:00
|
|
|
}
|
2013-12-27 23:59:59 +01:00
|
|
|
|
2014-12-29 15:13:47 +01:00
|
|
|
this.transverseEdges( x - 1, y - 1, z - 1, x + scaleX + 1, y + scaleY + 1, z + scaleZ + 1, new TriggerUpdates( src ) );
|
|
|
|
this.transverseEdges( i - 1, j - 1, k - 1, i + scaleX + 1, j + scaleY + 1, k + scaleZ + 1, new TriggerUpdates( dst ) );
|
2013-12-27 23:59:59 +01:00
|
|
|
|
2014-12-29 15:13:47 +01:00
|
|
|
this.transverseEdges( x, y, z, x + scaleX, y + scaleY, z + scaleZ, new TriggerUpdates( src ) );
|
|
|
|
this.transverseEdges( i, j, k, i + scaleX, j + scaleY, k + scaleZ, new TriggerUpdates( dst ) );
|
2013-12-27 23:59:59 +01:00
|
|
|
|
|
|
|
/*
|
2014-11-04 12:32:33 +01:00
|
|
|
* IChunkProvider cp = destination.getChunkProvider(); if ( cp instanceof ChunkProviderServer ) { ChunkProviderServer
|
2014-02-09 02:34:52 +01:00
|
|
|
* srv = (ChunkProviderServer) cp; srv.unloadAllChunks(); }
|
2015-02-03 12:04:13 +01:00
|
|
|
*
|
2013-12-27 23:59:59 +01:00
|
|
|
* cp.unloadQueuedChunks();
|
|
|
|
*/
|
|
|
|
|
|
|
|
}
|
|
|
|
|
2015-04-03 08:54:31 +02:00
|
|
|
static class TriggerUpdates implements ISpatialVisitor
|
|
|
|
{
|
|
|
|
|
|
|
|
final World dst;
|
|
|
|
|
|
|
|
public TriggerUpdates( World dst2 )
|
|
|
|
{
|
|
|
|
this.dst = dst2;
|
|
|
|
}
|
|
|
|
|
|
|
|
@Override
|
|
|
|
public void visit( int x, int y, int z )
|
|
|
|
{
|
|
|
|
Block blk = this.dst.getBlock( x, y, z );
|
2015-05-08 23:37:09 +02:00
|
|
|
blk.onNeighborBlockChange( this.dst, x, y, z, Platform.AIR_BLOCK );
|
2015-04-03 08:54:31 +02:00
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
static class WrapInMatrixFrame implements ISpatialVisitor
|
|
|
|
{
|
|
|
|
|
|
|
|
final World dst;
|
|
|
|
final Block blkID;
|
|
|
|
final int Meta;
|
|
|
|
|
|
|
|
public WrapInMatrixFrame( Block blockID, int metaData, World dst2 )
|
|
|
|
{
|
|
|
|
this.dst = dst2;
|
|
|
|
this.blkID = blockID;
|
|
|
|
this.Meta = metaData;
|
|
|
|
}
|
|
|
|
|
|
|
|
@Override
|
|
|
|
public void visit( int x, int y, int z )
|
|
|
|
{
|
|
|
|
this.dst.setBlock( x, y, z, this.blkID, this.Meta, 3 );
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
static class TelDestination
|
|
|
|
{
|
|
|
|
|
|
|
|
final World dim;
|
|
|
|
final double x;
|
|
|
|
final double y;
|
|
|
|
final double z;
|
|
|
|
final int xOff;
|
|
|
|
final int yOff;
|
|
|
|
final int zOff;
|
|
|
|
|
2015-05-08 23:25:19 +02:00
|
|
|
TelDestination( World dimension, AxisAlignedBB srcBox, double x, double y, double z, int tileX, int tileY, int tileZ )
|
2015-04-03 08:54:31 +02:00
|
|
|
{
|
2015-05-08 23:25:19 +02:00
|
|
|
this.dim = dimension;
|
|
|
|
this.x = Math.min( srcBox.maxX - 0.5, Math.max( srcBox.minX + 0.5, x + tileX ) );
|
|
|
|
this.y = Math.min( srcBox.maxY - 0.5, Math.max( srcBox.minY + 0.5, y + tileY ) );
|
|
|
|
this.z = Math.min( srcBox.maxZ - 0.5, Math.max( srcBox.minZ + 0.5, z + tileZ ) );
|
2015-04-03 08:54:31 +02:00
|
|
|
this.xOff = tileX;
|
|
|
|
this.yOff = tileY;
|
|
|
|
this.zOff = tileZ;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
static class METeleporter extends Teleporter
|
|
|
|
{
|
|
|
|
|
|
|
|
final TelDestination destination;
|
|
|
|
|
|
|
|
public METeleporter( WorldServer par1WorldServer, TelDestination d )
|
|
|
|
{
|
|
|
|
super( par1WorldServer );
|
|
|
|
this.destination = d;
|
|
|
|
}
|
|
|
|
|
|
|
|
@Override
|
|
|
|
public void placeInPortal( Entity par1Entity, double par2, double par4, double par6, float par8 )
|
|
|
|
{
|
|
|
|
par1Entity.setLocationAndAngles( this.destination.x, this.destination.y, this.destination.z, par1Entity.rotationYaw, 0.0F );
|
|
|
|
par1Entity.motionX = par1Entity.motionY = par1Entity.motionZ = 0.0D;
|
|
|
|
}
|
|
|
|
|
|
|
|
@Override
|
|
|
|
public boolean placeInExistingPortal( Entity par1Entity, double par2, double par4, double par6, float par8 )
|
|
|
|
{
|
|
|
|
return false;
|
|
|
|
}
|
|
|
|
|
|
|
|
@Override
|
|
|
|
public boolean makePortal( Entity par1Entity )
|
|
|
|
{
|
|
|
|
return false;
|
|
|
|
}
|
|
|
|
|
|
|
|
@Override
|
|
|
|
public void removeStalePortalLocations( long par1 )
|
|
|
|
{
|
|
|
|
|
|
|
|
}
|
|
|
|
}
|
2013-12-27 23:59:59 +01:00
|
|
|
}
|