package common.world;

import java.util.List;

import common.block.Block;
import common.dimension.Dimension;
import common.entity.Entity;
import common.entity.npc.EntityNPC;
import common.entity.types.EntityLiving;
import common.model.ParticleType;
import common.network.IPlayer;
import common.network.Packet;
import common.util.BlockPos;
import common.util.BoundingBox;
import common.util.PortalType;
import common.village.Village;

public abstract class AWorldServer extends World {
	protected AWorldServer(Dimension dim, boolean debug) {
		super(dim, false, debug);
	}

	public abstract List<IPlayer> getAllPlayers();
	public abstract AWorldServer getOtherWorld(int dimension);
	public abstract void placeInDimension(Entity entity, AWorldServer oldWorld, AWorldServer world, BlockPos pos, PortalType portal);
	public abstract boolean addLoader(BlockPos pos);
	public abstract boolean removeLoader(BlockPos pos);
	public abstract boolean isBlockTickPending(BlockPos pos, Block blockType);
	public abstract void updateBlockTick(BlockPos pos, Block blockIn, int delay, int priority);
	public abstract void resetUpdateEntityTick();
	public abstract void strikeLightning(double x, double y, double z, int color, int damage, boolean fire, EntityLiving summoner);
	public abstract void resetWeather();
	public abstract void spawnParticle(ParticleType particleType, double xCoord, double yCoord, double zCoord, int numberOfParticles, double xOffset, double yOffset,
			double zOffset, double particleSpeed, int... particleArguments);
	public abstract long getSeed();
	public abstract boolean isExterminated();
	public abstract boolean exterminate();
	public abstract Village getNearestVillage(BlockPos doorBlock, int radius);
	public abstract void addToVillagerPositionList(BlockPos blockpos);
	public abstract boolean isPlayerWatchingChunk(EntityNPC player, int chunkX, int chunkZ);
	public abstract void sendToAllTrackingEntity(Entity entityIn, Packet packet);
	public abstract boolean isDaytime();
	public abstract int getSkylightSubtracted();
	public abstract boolean isBlockinHighHumidity(BlockPos pos);
	public abstract <T extends Entity> T findNearestEntityWithinAABB(Class<? extends T> entityType, BoundingBox aabb, T closestTo);
	public abstract long getTime();
}
