package mhfc.net.common.world.types;
import com.sk89q.worldedit.function.operation.Operation;
import com.sk89q.worldedit.function.operation.RunContext;
import mhfc.net.common.core.registry.MHFCBlockRegistry;
import mhfc.net.common.quests.world.IQuestAreaSpawnController;
import mhfc.net.common.quests.world.SpawnControllerAdapter;
import mhfc.net.common.util.lib.MHFCReference;
import mhfc.net.common.world.area.AreaAdapter;
import mhfc.net.common.world.area.AreaConfiguration;
import mhfc.net.common.world.area.IArea;
import mhfc.net.common.world.area.IAreaType;
import mhfc.net.common.world.area.IExtendedConfiguration;
import mhfc.net.common.world.controller.CornerPosition;
import net.minecraft.entity.player.EntityPlayer;
import net.minecraft.init.Blocks;
import net.minecraft.world.World;
public class AreaTypePlayfield implements IAreaType {
private static class AreaPlayfield extends AreaAdapter {
private class PlayfieldSpawnController extends SpawnControllerAdapter {
public PlayfieldSpawnController() {
super(AreaPlayfield.this.worldView);
}
@Override
protected void enqueDefaultSpawns() {
return;
}
@Override
protected SpawnInformation constructDefaultSpawnInformation(Spawnable entity) {
int spawnX = config.getChunkSizeX() * 8;
int spawnZ = config.getChunkSizeZ() * 8;
int height = world
.getChunkFromChunkCoords(
getChunkPosition().posX + spawnX / 16,
getChunkPosition().posY + spawnZ / 16)
.getHeightValue(spawnX % 16, spawnZ % 16);
return new SpawnInformation(entity, 6, height, 6);
}
}
public AreaPlayfield(World world, AreaConfiguration config) {
super(world, config);
}
@Override
public void teleportToSpawn(EntityPlayer player) {
CornerPosition chunkPos = getChunkPosition();
double posX = 8;
double posZ = 8;
double posY = world.getChunkFromChunkCoords(chunkPos.posX, chunkPos.posY).getHeightValue(8, 8);
worldView.moveEntityTo(player, posX, posY, posZ);
}
@Override
protected IQuestAreaSpawnController initializeSpawnController() {
PlayfieldSpawnController playfieldSpawnController = new PlayfieldSpawnController();
playfieldSpawnController.setAreaInstance(this);
return playfieldSpawnController;
}
}
public static final AreaTypePlayfield PLAYFIELD_TYPE = new AreaTypePlayfield();
public static final AreaTypePlayfield PLAYFIELD_MEDIUM = new AreaTypePlayfield(4, 4);
public static final AreaTypePlayfield PLAYFIELD_BIG = new AreaTypePlayfield(8, 8);
private AreaTypePlayfield() {
this(1, 1);
}
@Override
public String getUnlocalizedName() {
return MHFCReference.area_playfield_name;
}
public AreaTypePlayfield(int chunkSizeX, int chunkSizeY) {
this.chunkSizeX = chunkSizeX;
this.chunkSizeY = chunkSizeY;
}
private int chunkSizeX, chunkSizeY;
@Override
public Operation populate(World world, AreaConfiguration configuration) {
int chunksX = configuration.getChunkSizeX();
int chunksZ = configuration.getChunkSizeZ();
return new Operation() {
@Override
public Operation resume(RunContext run) {
for (int i = 0; i < 16 * chunksX; i++) {
for (int j = 0; j < 16 * chunksZ; j++) {
int x = configuration.getPosition().posX * 16 + i;
int z = configuration.getPosition().posY * 16 + j;
world.setBlock(x, 64, z, Blocks.dirt);
}
}
return null;
}
@Override
public void cancel() {}
};
}
@Override
public IArea provideForLoading(World world, AreaConfiguration configuration) {
return new AreaPlayfield(world, configuration);
}
@Override
public AreaConfiguration configForNewArea() {
return new AreaConfiguration(chunkSizeX, chunkSizeY, IExtendedConfiguration.EMPTY);
}
@Override
public IExtendedConfiguration configForLoading() {
return IExtendedConfiguration.EMPTY;
}
@Override
public int hashCode() {
final int prime = 31;
int result = 1;
result = prime * result + chunkSizeX;
result = prime * result + chunkSizeY;
return result;
}
@Override
public boolean equals(Object obj) {
if (this == obj) {
return true;
}
if (obj == null) {
return false;
}
if (getClass() != obj.getClass()) {
return false;
}
AreaTypePlayfield other = (AreaTypePlayfield) obj;
if (chunkSizeX != other.chunkSizeX) {
return false;
}
if (chunkSizeY != other.chunkSizeY) {
return false;
}
return true;
}
}