package com.amadornes.framez.world;
import java.io.File;
import java.util.ArrayList;
import java.util.List;
import net.minecraft.block.Block;
import net.minecraft.client.Minecraft;
import net.minecraft.entity.Entity;
import net.minecraft.entity.EnumCreatureType;
import net.minecraft.entity.player.EntityPlayer;
import net.minecraft.init.Blocks;
import net.minecraft.nbt.NBTTagCompound;
import net.minecraft.server.MinecraftServer;
import net.minecraft.tileentity.TileEntity;
import net.minecraft.util.IProgressUpdate;
import net.minecraft.world.ChunkCoordIntPair;
import net.minecraft.world.ChunkPosition;
import net.minecraft.world.EnumSkyBlock;
import net.minecraft.world.MinecraftException;
import net.minecraft.world.World;
import net.minecraft.world.WorldProvider;
import net.minecraft.world.WorldServer;
import net.minecraft.world.WorldSettings;
import net.minecraft.world.chunk.Chunk;
import net.minecraft.world.chunk.IChunkProvider;
import net.minecraft.world.chunk.storage.AnvilChunkLoader;
import net.minecraft.world.chunk.storage.IChunkLoader;
import net.minecraft.world.storage.IPlayerFileData;
import net.minecraft.world.storage.ISaveHandler;
import net.minecraft.world.storage.WorldInfo;
import net.minecraftforge.common.DimensionManager;
import net.minecraftforge.common.util.ForgeDirection;
import uk.co.qmunity.lib.vec.Vec3d;
import com.amadornes.framez.movement.MovingBlock;
import com.amadornes.framez.movement.MovingStructure;
public class FakeWorldServer extends WorldServer {
private static FakeWorldServer instance = null;
public static FakeWorldServer instance(MovingStructure structure) {
if (instance == null)
instance = new FakeWorldServer(structure.getWorld());
instance.setStructure(structure);
return instance;
}
private MovingStructure structure;
private FakeWorldServer(World world) {
super(MinecraftServer.getServer(), new NonSavingHandler(), world.getWorldInfo().getWorldName(), world.provider.dimensionId,
new WorldSettings(world.getWorldInfo()), world.theProfiler);
DimensionManager.setWorld(world.provider.dimensionId, (WorldServer) world);
chunkProvider = world.getChunkProvider();
}
private void setStructure(MovingStructure structure) {
this.structure = structure;
}
@Override
protected void initialize(WorldSettings p_72963_1_) {
}
@Override
protected IChunkProvider createChunkProvider() {
return new EmptyChunkProvider();
}
@Override
protected int func_152379_p() {
return Minecraft.getMinecraft().gameSettings.renderDistanceChunks;
}
private MovingBlock get(int x, int y, int z) {
if (structure.getProgress() >= 1)
return null;
return structure.getBlock(x, y, z);
}
@Override
public Block getBlock(int x, int y, int z) {
MovingBlock b = get(x, y, z);
if (b != null)
return b.getBlock();
return Blocks.air;
}
@Override
public TileEntity getTileEntity(int x, int y, int z) {
MovingBlock b = get(x, y, z);
if (b != null)
return b.getTileEntity();
return null;
}
@Override
public int getLightBrightnessForSkyBlocks(int x, int y, int z, int unknown) {
return structure.getWorld().getLightBrightnessForSkyBlocks(x, y, z, unknown);
}
@Override
public int getBlockMetadata(int x, int y, int z) {
MovingBlock b = get(x, y, z);
if (b != null)
return b.getMetadata();
return 0;
}
@Override
public int isBlockProvidingPowerTo(int x, int y, int z, int face) {
MovingBlock b = get(x, y, z);
if (b != null)
return b.getBlock().isProvidingStrongPower(this, x, y, z, face);
return 0;
}
@Override
public boolean isAirBlock(int x, int y, int z) {
MovingBlock b = get(x, y, z);
if (b != null)
return false;
return true;
}
@Override
public Entity getEntityByID(int id) {
return structure.getWorld().getEntityByID(id);
}
@Override
public boolean spawnEntityInWorld(Entity entity) {
Vec3d pos = structure.getMovement().transform(new Vec3d(entity.posX, entity.posY, entity.posZ), structure.getProgress());
entity.posX = pos.getX();
entity.posY = pos.getY();
entity.posZ = pos.getZ();
return structure.getWorld().spawnEntityInWorld(entity);
}
@Override
public void spawnParticle(String type, double x, double y, double z, double r, double g, double b) {
Vec3d pos = structure.getMovement().transform(new Vec3d(x, y, z), structure.getProgress());
structure.getWorld().spawnParticle(type, pos.getX(), pos.getY(), pos.getZ(), r, g, b);
}
@Override
public boolean setBlock(int x, int y, int z, Block block) {
MovingBlock b = get(x, y, z);
if (b == null)
return false;
b.setBlock(block);
// if (b.getPlaceholder() != null)
// b.getPlaceholder().sendUpdatePacket(UpdateType.BLOCK);
return true;
}
@Override
public boolean setBlock(int x, int y, int z, Block block, int meta, int notify) {
MovingBlock b = get(x, y, z);
if (b == null)
return false;
b.setBlock(block);
b.setMetadata(meta);
// if (b.getPlaceholder() != null)
// b.getPlaceholder().sendUpdatePacket(UpdateType.BLOCK);
return true;
}
@Override
public boolean setBlockMetadataWithNotify(int x, int y, int z, int meta, int notify) {
MovingBlock b = get(x, y, z);
if (b == null)
return false;
b.setMetadata(meta);
// if (b.getPlaceholder() != null)
// b.getPlaceholder().sendUpdatePacket(UpdateType.BLOCK);
return true;
}
@Override
public boolean setBlockToAir(int x, int y, int z) {
MovingBlock b = get(x, y, z);
if (b == null)
return false;
b.setBlock(Blocks.air);
// if (b.getPlaceholder() != null)
// b.getPlaceholder().sendUpdatePacket(UpdateType.BLOCK);
return true;
}
@Override
public void setTileEntity(int x, int y, int z, TileEntity te) {
MovingBlock b = get(x, y, z);
if (b != null)
b.setTileEntity(te);
}
@Override
public void removeTileEntity(int x, int y, int z) {
MovingBlock b = get(x, y, z);
if (b != null)
b.setTileEntity(null);
}
@Override
public void tick() {
}
@Override
public void updateEntities() {
}
@Override
public void playSound(double x, double y, double z, String sound, float volume, float pitch, boolean unknown) {
structure.getWorld().playSound(x, y, z, sound, volume, pitch, unknown);
}
@Override
public void playSoundAtEntity(Entity entity, String sound, float volume, float pitch) {
structure.getWorld().playSoundAtEntity(entity, sound, volume, pitch);
}
@Override
public void playSoundEffect(double x, double y, double z, String sound, float volume, float pitch) {
structure.getWorld().playSoundEffect(x, y, z, sound, volume, pitch);
}
@Override
public void playAuxSFX(int x, int y, int z, int a, int b) {
structure.getWorld().playAuxSFX(x, y, z, a, b);
}
@Override
public void playAuxSFXAtEntity(EntityPlayer player, int x, int y, int z, int a, int b) {
structure.getWorld().playAuxSFXAtEntity(player, x, y, z, a, b);
}
@Override
public void playSoundToNearExcept(EntityPlayer player, String sound, float volume, float pitch) {
structure.getWorld().playSoundToNearExcept(player, sound, volume, pitch);
}
@Override
public void playBroadcastSound(int x, int y, int z, int p_82739_4_, int p_82739_5_) {
structure.getWorld().playBroadcastSound(x, y, z, p_82739_4_, p_82739_5_);
}
@Override
public boolean updateLightByType(EnumSkyBlock p_147463_1_, int p_147463_2_, int p_147463_3_, int p_147463_4_) {
return false;
}
@Override
public Chunk getChunkFromBlockCoords(int x, int z) {
return structure.getWorld().getChunkFromBlockCoords(x, z);
}
@Override
public Chunk getChunkFromChunkCoords(int x, int z) {
return structure.getWorld().getChunkFromChunkCoords(x, z);
}
@Override
public IChunkProvider getChunkProvider() {
return structure.getWorld().getChunkProvider();
}
@Override
protected boolean chunkExists(int p_72916_1_, int p_72916_2_) {
return getChunkProvider().chunkExists(p_72916_1_, p_72916_2_);
}
@Override
public boolean isSideSolid(int x, int y, int z, ForgeDirection side) {
MovingBlock b = get(x, y, z);
if (b != null)
return b.getBlock().isSideSolid(this, x, y, z, side);
return false;
}
@Override
public boolean isSideSolid(int x, int y, int z, ForgeDirection side, boolean _default) {
MovingBlock b = get(x, y, z);
if (b != null)
return b.getBlock().isSideSolid(this, x, y, z, side);
return _default;
}
@Override
public void notifyBlockChange(int p_147444_1_, int p_147444_2_, int p_147444_3_, Block p_147444_4_) {
}
@Override
public void notifyBlockOfNeighborChange(int p_147460_1_, int p_147460_2_, int p_147460_3_, Block p_147460_4_) {
}
@Override
public void notifyBlocksOfNeighborChange(int p_147441_1_, int p_147441_2_, int p_147441_3_, Block p_147441_4_, int p_147441_5_) {
}
@Override
public void notifyBlocksOfNeighborChange(int p_147459_1_, int p_147459_2_, int p_147459_3_, Block p_147459_4_) {
}
@Override
public void saveAllChunks(boolean p_73044_1_, IProgressUpdate p_73044_2_) throws MinecraftException {
}
@Override
public void saveChunkData() {
}
@Override
protected void saveLevel() throws MinecraftException {
}
@Override
public void joinEntityInSurroundings(Entity entity) {
structure.getWorld().joinEntityInSurroundings(entity);
}
@Override
public void removeEntity(Entity p_72900_1_) {
structure.getWorld().removeEntity(p_72900_1_);
}
@Override
public File getChunkSaveLocation() {
return null;
}
@Override
public void markBlockForUpdate(int x, int y, int z) {
}
@Override
public long getWorldTime() {
return structure.getWorld().getWorldTime();
}
@Override
public long getTotalWorldTime() {
return structure.getWorld().getTotalWorldTime();
}
private static class NonSavingHandler implements ISaveHandler {
@Override
public void saveWorldInfoWithPlayer(WorldInfo p_75755_1_, NBTTagCompound p_75755_2_) {
}
@Override
public void saveWorldInfo(WorldInfo p_75761_1_) {
}
@Override
public WorldInfo loadWorldInfo() {
return null;
}
@Override
public String getWorldDirectoryName() {
return null;
}
@Override
public File getWorldDirectory() {
return null;
}
@Override
public IPlayerFileData getSaveHandler() {
return null;
}
@Override
public File getMapFileFromName(String p_75758_1_) {
return null;
}
@Override
public IChunkLoader getChunkLoader(WorldProvider p_75763_1_) {
return null;
}
@Override
public void flush() {
}
@Override
public void checkSessionLock() {
}
}
private static class EmptyChunkProvider extends AnvilChunkLoader implements IChunkProvider {
public EmptyChunkProvider() {
super(null);
}
@Override
public boolean chunkExists(World world, int i, int j) {
return true;
}
@Override
public void chunkTick() {
}
@Override
public Chunk loadChunk(World p_75815_1_, int p_75815_2_, int p_75815_3_) {
return null;
}
@Override
public Object[] loadChunk__Async(World p_75815_1_, int p_75815_2_, int p_75815_3_) {
return null;
}
@Override
public void loadEntities(World p_75823_1_, NBTTagCompound p_75823_2_, Chunk chunk) {
}
@Override
public void saveChunk(World p_75816_1_, Chunk p_75816_2_) {
}
@Override
public void saveExtraChunkData(World p_75819_1_, Chunk p_75819_2_) {
}
@Override
public void saveExtraData() {
}
@Override
protected void addChunkToPending(ChunkCoordIntPair p_75824_1_, NBTTagCompound p_75824_2_) {
}
@Override
protected Chunk checkedReadChunkFromNBT(World p_75822_1_, int p_75822_2_, int p_75822_3_, NBTTagCompound p_75822_4_) {
return null;
}
@Override
protected Object[] checkedReadChunkFromNBT__Async(World p_75822_1_, int p_75822_2_, int p_75822_3_, NBTTagCompound p_75822_4_) {
return null;
}
@Override
public boolean writeNextIO() {
return true;
}
@Override
public boolean chunkExists(int p_73149_1_, int p_73149_2_) {
return false;
}
@Override
public Chunk provideChunk(int p_73154_1_, int p_73154_2_) {
return null;
}
@Override
public Chunk loadChunk(int p_73158_1_, int p_73158_2_) {
return null;
}
@Override
public void populate(IChunkProvider p_73153_1_, int p_73153_2_, int p_73153_3_) {
}
@Override
public boolean saveChunks(boolean p_73151_1_, IProgressUpdate p_73151_2_) {
return true;
}
@Override
public boolean unloadQueuedChunks() {
return true;
}
@Override
public boolean canSave() {
return true;
}
@Override
public String makeString() {
return "";
}
@SuppressWarnings("rawtypes")
@Override
public List getPossibleCreatures(EnumCreatureType p_73155_1_, int p_73155_2_, int p_73155_3_, int p_73155_4_) {
return new ArrayList();
}
@Override
public ChunkPosition func_147416_a(World p_147416_1_, String p_147416_2_, int p_147416_3_, int p_147416_4_, int p_147416_5_) {
return null;
}
@Override
public int getLoadedChunkCount() {
return 0;
}
@Override
public void recreateStructures(int p_82695_1_, int p_82695_2_) {
}
}
}