mirror of https://github.com/webbukkit/dynmap.git
230 lines
6.4 KiB
Java
230 lines
6.4 KiB
Java
package org.dynmap.fabric_1_18;
|
|
|
|
import net.minecraft.util.math.BlockPos;
|
|
import net.minecraft.util.registry.RegistryKey;
|
|
import net.minecraft.world.Heightmap;
|
|
import net.minecraft.world.LightType;
|
|
import net.minecraft.world.World;
|
|
import net.minecraft.world.border.WorldBorder;
|
|
import org.dynmap.DynmapChunk;
|
|
import org.dynmap.DynmapLocation;
|
|
import org.dynmap.DynmapWorld;
|
|
import org.dynmap.utils.MapChunkCache;
|
|
import org.dynmap.utils.Polygon;
|
|
|
|
import java.util.List;
|
|
|
|
public class FabricWorld extends DynmapWorld {
|
|
// TODO: Store this relative to World saves for integrated server
|
|
public static final String SAVED_WORLDS_FILE = "fabricworlds.yml";
|
|
|
|
private final DynmapPlugin plugin;
|
|
private World world;
|
|
private final boolean skylight;
|
|
private final boolean isnether;
|
|
private final boolean istheend;
|
|
private final String env;
|
|
private DynmapLocation spawnloc = new DynmapLocation();
|
|
private static int maxWorldHeight = 320; // Maximum allows world height
|
|
|
|
public static int getMaxWorldHeight() {
|
|
return maxWorldHeight;
|
|
}
|
|
|
|
public static void setMaxWorldHeight(int h) {
|
|
maxWorldHeight = h;
|
|
}
|
|
|
|
public static String getWorldName(DynmapPlugin plugin, World w) {
|
|
RegistryKey<World> rk = w.getRegistryKey();
|
|
if (rk == World.OVERWORLD) { // Overworld?
|
|
return w.getServer().getSaveProperties().getLevelName();
|
|
} else if (rk == World.END) {
|
|
return "DIM1";
|
|
} else if (rk == World.NETHER) {
|
|
return "DIM-1";
|
|
} else {
|
|
return rk.getValue().getNamespace() + "_" + rk.getValue().getPath();
|
|
}
|
|
}
|
|
|
|
public void updateWorld(World w) {
|
|
this.updateWorldHeights(w.getHeight(), w.getDimension().getMinimumY(), w.getSeaLevel());
|
|
}
|
|
|
|
public FabricWorld(DynmapPlugin plugin, World w) {
|
|
this(plugin, getWorldName(plugin, w), w.getHeight(),
|
|
w.getSeaLevel(),
|
|
w.getRegistryKey() == World.NETHER,
|
|
w.getRegistryKey() == World.END,
|
|
w.getRegistryKey().getValue().getPath(),
|
|
w.getDimension().getMinimumY());
|
|
setWorldLoaded(w);
|
|
}
|
|
|
|
public FabricWorld(DynmapPlugin plugin, String name, int height, int sealevel, boolean nether, boolean the_end, String deftitle, int miny) {
|
|
super(name, (height > maxWorldHeight) ? maxWorldHeight : height, sealevel, miny);
|
|
this.plugin = plugin;
|
|
world = null;
|
|
setTitle(deftitle);
|
|
isnether = nether;
|
|
istheend = the_end;
|
|
skylight = !(isnether || istheend);
|
|
|
|
if (isnether) {
|
|
env = "nether";
|
|
} else if (istheend) {
|
|
env = "the_end";
|
|
} else {
|
|
env = "normal";
|
|
}
|
|
|
|
}
|
|
|
|
/* Test if world is nether */
|
|
@Override
|
|
public boolean isNether() {
|
|
return isnether;
|
|
}
|
|
|
|
public boolean isTheEnd() {
|
|
return istheend;
|
|
}
|
|
|
|
/* Get world spawn location */
|
|
@Override
|
|
public DynmapLocation getSpawnLocation() {
|
|
if (world != null) {
|
|
spawnloc.x = world.getLevelProperties().getSpawnX();
|
|
spawnloc.y = world.getLevelProperties().getSpawnY();
|
|
spawnloc.z = world.getLevelProperties().getSpawnZ();
|
|
spawnloc.world = this.getName();
|
|
}
|
|
return spawnloc;
|
|
}
|
|
|
|
/* Get world time */
|
|
@Override
|
|
public long getTime() {
|
|
if (world != null)
|
|
return world.getTimeOfDay();
|
|
else
|
|
return -1;
|
|
}
|
|
|
|
/* World is storming */
|
|
@Override
|
|
public boolean hasStorm() {
|
|
if (world != null)
|
|
return world.isRaining();
|
|
else
|
|
return false;
|
|
}
|
|
|
|
/* World is thundering */
|
|
@Override
|
|
public boolean isThundering() {
|
|
if (world != null)
|
|
return world.isThundering();
|
|
else
|
|
return false;
|
|
}
|
|
|
|
/* World is loaded */
|
|
@Override
|
|
public boolean isLoaded() {
|
|
return (world != null);
|
|
}
|
|
|
|
/* Set world to unloaded */
|
|
@Override
|
|
public void setWorldUnloaded() {
|
|
getSpawnLocation();
|
|
world = null;
|
|
}
|
|
|
|
/* Set world to loaded */
|
|
public void setWorldLoaded(World w) {
|
|
world = w;
|
|
this.sealevel = w.getSeaLevel(); // Read actual current sealevel from world
|
|
// Update lighting table
|
|
for (int i = 0; i < 16; i++) {
|
|
this.setBrightnessTableEntry(i, w.getDimension().getBrightness(i));
|
|
}
|
|
}
|
|
|
|
/* Get light level of block */
|
|
@Override
|
|
public int getLightLevel(int x, int y, int z) {
|
|
if (world != null)
|
|
return world.getLightLevel(new BlockPos(x, y, z));
|
|
else
|
|
return -1;
|
|
}
|
|
|
|
/* Get highest Y coord of given location */
|
|
@Override
|
|
public int getHighestBlockYAt(int x, int z) {
|
|
if (world != null) {
|
|
return world.getChunk(x >> 4, z >> 4).getHeightmap(Heightmap.Type.MOTION_BLOCKING).get(x & 15, z & 15);
|
|
} else
|
|
return -1;
|
|
}
|
|
|
|
/* Test if sky light level is requestable */
|
|
@Override
|
|
public boolean canGetSkyLightLevel() {
|
|
return skylight;
|
|
}
|
|
|
|
/* Return sky light level */
|
|
@Override
|
|
public int getSkyLightLevel(int x, int y, int z) {
|
|
if (world != null) {
|
|
return world.getLightLevel(LightType.SKY, new BlockPos(x, y, z));
|
|
} else
|
|
return -1;
|
|
}
|
|
|
|
/**
|
|
* Get world environment ID (lower case - normal, the_end, nether)
|
|
*/
|
|
@Override
|
|
public String getEnvironment() {
|
|
return env;
|
|
}
|
|
|
|
/**
|
|
* Get map chunk cache for world
|
|
*/
|
|
@Override
|
|
public MapChunkCache getChunkCache(List<DynmapChunk> chunks) {
|
|
if (world != null) {
|
|
FabricMapChunkCache c = new FabricMapChunkCache(plugin);
|
|
c.setChunks(this, chunks);
|
|
return c;
|
|
}
|
|
return null;
|
|
}
|
|
|
|
public World getWorld() {
|
|
return world;
|
|
}
|
|
|
|
@Override
|
|
public Polygon getWorldBorder() {
|
|
if (world != null) {
|
|
WorldBorder wb = world.getWorldBorder();
|
|
if ((wb != null) && (wb.getSize() < 5.9E7)) {
|
|
Polygon p = new Polygon();
|
|
p.addVertex(wb.getBoundWest(), wb.getBoundNorth());
|
|
p.addVertex(wb.getBoundWest(), wb.getBoundSouth());
|
|
p.addVertex(wb.getBoundEast(), wb.getBoundSouth());
|
|
p.addVertex(wb.getBoundEast(), wb.getBoundNorth());
|
|
return p;
|
|
}
|
|
}
|
|
return null;
|
|
}
|
|
}
|