mirror of
https://github.com/BlueMap-Minecraft/BlueMap.git
synced 2024-06-25 05:54:57 +02:00
Implement BlueMapAPI v2
This commit is contained in:
parent
c4e7349c54
commit
4da988d31c
|
@ -1 +1 @@
|
|||
Subproject commit 938621deb030f386c357a8dbee6d648095e7bb18
|
||||
Subproject commit b466fb4ed8655d0b6212c7343594886753a0c21a
|
|
@ -37,9 +37,7 @@ repositories {
|
|||
|
||||
dependencies {
|
||||
api ("com.mojang:brigadier:1.0.17")
|
||||
|
||||
api ("de.bluecolored.bluemap.core:BlueMapCore")
|
||||
api ("de.bluecolored.bluemap.api:BlueMapAPI")
|
||||
|
||||
compileOnly ("org.jetbrains:annotations:16.0.2")
|
||||
|
||||
|
|
|
@ -31,7 +31,7 @@
|
|||
import de.bluecolored.bluemap.common.serverinterface.ServerInterface;
|
||||
import de.bluecolored.bluemap.common.serverinterface.ServerWorld;
|
||||
import de.bluecolored.bluemap.core.MinecraftVersion;
|
||||
import de.bluecolored.bluemap.core.debug.DebugDump;
|
||||
import de.bluecolored.bluemap.api.debug.DebugDump;
|
||||
import de.bluecolored.bluemap.core.debug.StateDumper;
|
||||
import de.bluecolored.bluemap.core.logger.Logger;
|
||||
import de.bluecolored.bluemap.core.map.BmMap;
|
||||
|
|
|
@ -0,0 +1,149 @@
|
|||
package de.bluecolored.bluemap.common.api;
|
||||
|
||||
import com.github.benmanes.caffeine.cache.Caffeine;
|
||||
import com.github.benmanes.caffeine.cache.LoadingCache;
|
||||
import de.bluecolored.bluemap.api.BlueMapAPI;
|
||||
import de.bluecolored.bluemap.api.BlueMapMap;
|
||||
import de.bluecolored.bluemap.api.BlueMapWorld;
|
||||
import de.bluecolored.bluemap.common.plugin.Plugin;
|
||||
import de.bluecolored.bluemap.core.BlueMap;
|
||||
import de.bluecolored.bluemap.core.logger.Logger;
|
||||
import de.bluecolored.bluemap.core.world.World;
|
||||
|
||||
import java.io.IOException;
|
||||
import java.util.Collection;
|
||||
import java.util.Objects;
|
||||
import java.util.Optional;
|
||||
import java.util.UUID;
|
||||
import java.util.concurrent.ExecutionException;
|
||||
import java.util.stream.Collectors;
|
||||
|
||||
public class BlueMapAPIImpl extends BlueMapAPI {
|
||||
|
||||
private final Plugin plugin;
|
||||
private final LoadingCache<Object, Optional<BlueMapWorld>> worldCache;
|
||||
private final LoadingCache<String, Optional<BlueMapMap>> mapCache;
|
||||
|
||||
public BlueMapAPIImpl(Plugin plugin) {
|
||||
this.plugin = plugin;
|
||||
this.worldCache = Caffeine.newBuilder()
|
||||
.weakKeys()
|
||||
.build(this::getWorldUncached);
|
||||
this.mapCache = Caffeine.newBuilder()
|
||||
.weakKeys()
|
||||
.build(this::getMapUncached);
|
||||
}
|
||||
|
||||
@Override
|
||||
public RenderManagerImpl getRenderManager() {
|
||||
return new RenderManagerImpl(this, plugin);
|
||||
}
|
||||
|
||||
@Override
|
||||
public WebAppImpl getWebApp() {
|
||||
return new WebAppImpl(plugin);
|
||||
}
|
||||
|
||||
@Override
|
||||
public Collection<BlueMapMap> getMaps() {
|
||||
return plugin.getMaps().values().stream()
|
||||
.map(map -> {
|
||||
try {
|
||||
return new BlueMapMapImpl(plugin, map);
|
||||
} catch (IOException e) {
|
||||
Logger.global.logError("[API] Failed to create BlueMapMap for map " + map.getId(), e);
|
||||
return null;
|
||||
}
|
||||
})
|
||||
.filter(Objects::nonNull)
|
||||
.collect(Collectors.toUnmodifiableSet());
|
||||
}
|
||||
|
||||
@Override
|
||||
public Collection<BlueMapWorld> getWorlds() {
|
||||
return plugin.getWorlds().values().stream()
|
||||
.map(world -> getWorld(world).orElse(null))
|
||||
.filter(Objects::nonNull)
|
||||
.collect(Collectors.toUnmodifiableSet());
|
||||
}
|
||||
|
||||
@Override
|
||||
public Optional<BlueMapWorld> getWorld(Object world) {
|
||||
return worldCache.get(world);
|
||||
}
|
||||
|
||||
public Optional<BlueMapWorld> getWorldUncached(Object world) {
|
||||
|
||||
if (world instanceof UUID) {
|
||||
var coreWorld = plugin.getWorlds().get(world.toString());
|
||||
if (coreWorld != null) world = coreWorld;
|
||||
}
|
||||
|
||||
if (world instanceof String) {
|
||||
var coreWorld = plugin.getWorlds().get(world);
|
||||
if (coreWorld != null) world = coreWorld;
|
||||
}
|
||||
|
||||
if (world instanceof World) {
|
||||
var coreWorld = (World) world;
|
||||
try {
|
||||
return Optional.of(new BlueMapWorldImpl(plugin, coreWorld));
|
||||
} catch (IOException e) {
|
||||
Logger.global.logError("[API] Failed to create BlueMapWorld for world " + coreWorld.getSaveFolder(), e);
|
||||
}
|
||||
return Optional.empty();
|
||||
}
|
||||
|
||||
var serverWorld = plugin.getServerInterface().getWorld(world).orElse(null);
|
||||
if (serverWorld == null) return Optional.empty();
|
||||
|
||||
try {
|
||||
String id = plugin.getBlueMap().getWorldId(serverWorld.getSaveFolder());
|
||||
var coreWorld = plugin.getWorlds().get(id);
|
||||
if (coreWorld == null) return Optional.empty();
|
||||
|
||||
return Optional.of(new BlueMapWorldImpl(plugin, coreWorld));
|
||||
} catch (IOException e) {
|
||||
Logger.global.logError("[API] Failed to create BlueMapWorld for world " + serverWorld.getSaveFolder(), e);
|
||||
return Optional.empty();
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
@Override
|
||||
public Optional<BlueMapMap> getMap(String id) {
|
||||
return mapCache.get(id);
|
||||
}
|
||||
|
||||
public Optional<BlueMapMap> getMapUncached(String id) {
|
||||
var map = plugin.getMaps().get(id);
|
||||
if (map == null) return Optional.empty();
|
||||
|
||||
var world = getWorld(map.getWorld()).orElse(null);
|
||||
if (world == null) return Optional.empty();
|
||||
|
||||
return Optional.of(new BlueMapMapImpl(plugin, map, (BlueMapWorldImpl) world));
|
||||
}
|
||||
|
||||
@Override
|
||||
public String getBlueMapVersion() {
|
||||
return BlueMap.VERSION;
|
||||
}
|
||||
|
||||
public void register() {
|
||||
try {
|
||||
BlueMapAPI.registerInstance(this);
|
||||
} catch (ExecutionException ex) {
|
||||
Logger.global.logError("BlueMapAPI: A BlueMapAPI listener threw an exception (onEnable)!", ex.getCause());
|
||||
}
|
||||
}
|
||||
|
||||
public void unregister() {
|
||||
try {
|
||||
BlueMapAPI.unregisterInstance(this);
|
||||
} catch (ExecutionException ex) {
|
||||
Logger.global.logError("BlueMapAPI: A BlueMapAPI listener threw an exception (onDisable)!", ex.getCause());
|
||||
}
|
||||
}
|
||||
|
||||
}
|
|
@ -0,0 +1,119 @@
|
|||
package de.bluecolored.bluemap.common.api;
|
||||
|
||||
import com.flowpowered.math.vector.Vector2i;
|
||||
import de.bluecolored.bluemap.api.BlueMapMap;
|
||||
import de.bluecolored.bluemap.api.BlueMapWorld;
|
||||
import de.bluecolored.bluemap.api.marker.MarkerSet;
|
||||
import de.bluecolored.bluemap.common.plugin.Plugin;
|
||||
import de.bluecolored.bluemap.common.rendermanager.MapUpdateTask;
|
||||
import de.bluecolored.bluemap.common.rendermanager.WorldRegionRenderTask;
|
||||
import de.bluecolored.bluemap.core.map.BmMap;
|
||||
|
||||
import java.io.IOException;
|
||||
import java.lang.ref.WeakReference;
|
||||
import java.util.Map;
|
||||
import java.util.Objects;
|
||||
import java.util.function.Predicate;
|
||||
|
||||
public class BlueMapMapImpl implements BlueMapMap {
|
||||
|
||||
private final WeakReference<Plugin> plugin;
|
||||
private final WeakReference<BmMap> map;
|
||||
private final BlueMapWorldImpl world;
|
||||
|
||||
public BlueMapMapImpl(Plugin plugin, BmMap map) throws IOException {
|
||||
this.plugin = new WeakReference<>(plugin);
|
||||
this.map = new WeakReference<>(map);
|
||||
this.world = new BlueMapWorldImpl(plugin, map.getWorld());
|
||||
}
|
||||
|
||||
public BlueMapMapImpl(Plugin plugin, BmMap map, BlueMapWorldImpl world) {
|
||||
this.plugin = new WeakReference<>(plugin);
|
||||
this.map = new WeakReference<>(map);
|
||||
this.world = world;
|
||||
}
|
||||
|
||||
public BmMap getBmMap() {
|
||||
return unpack(map);
|
||||
}
|
||||
|
||||
@Override
|
||||
public String getId() {
|
||||
return unpack(map).getId();
|
||||
}
|
||||
|
||||
@Override
|
||||
public String getName() {
|
||||
return unpack(map).getName();
|
||||
}
|
||||
|
||||
@Override
|
||||
public BlueMapWorld getWorld() {
|
||||
return world;
|
||||
}
|
||||
|
||||
@Override
|
||||
public Map<String, MarkerSet> getMarkerSets() {
|
||||
return unpack(map).getMarkerSets();
|
||||
}
|
||||
|
||||
@Override
|
||||
public Vector2i getTileSize() {
|
||||
return unpack(map).getHiresModelManager().getTileGrid().getGridSize();
|
||||
}
|
||||
|
||||
@Override
|
||||
public Vector2i getTileOffset() {
|
||||
return unpack(map).getHiresModelManager().getTileGrid().getOffset();
|
||||
}
|
||||
|
||||
@Override
|
||||
public void setTileFilter(Predicate<Vector2i> filter) {
|
||||
unpack(map).setTileFilter(filter);
|
||||
}
|
||||
|
||||
@Override
|
||||
public Predicate<Vector2i> getTileFilter() {
|
||||
return unpack(map).getTileFilter();
|
||||
}
|
||||
|
||||
@Override
|
||||
public synchronized void setFrozen(boolean frozen) {
|
||||
if (isFrozen()) unfreeze();
|
||||
else freeze();
|
||||
}
|
||||
|
||||
private synchronized void unfreeze() {
|
||||
Plugin plugin = unpack(this.plugin);
|
||||
BmMap map = unpack(this.map);
|
||||
plugin.startWatchingMap(map);
|
||||
plugin.getPluginState().getMapState(map).setUpdateEnabled(true);
|
||||
plugin.getRenderManager().scheduleRenderTask(new MapUpdateTask(map));
|
||||
}
|
||||
|
||||
private synchronized void freeze() {
|
||||
Plugin plugin = unpack(this.plugin);
|
||||
BmMap map = unpack(this.map);
|
||||
plugin.stopWatchingMap(map);
|
||||
plugin.getPluginState().getMapState(map).setUpdateEnabled(false);
|
||||
plugin.getRenderManager().removeRenderTasksIf(task -> {
|
||||
if (task instanceof MapUpdateTask)
|
||||
return ((MapUpdateTask) task).getMap().equals(map);
|
||||
|
||||
if (task instanceof WorldRegionRenderTask)
|
||||
return ((WorldRegionRenderTask) task).getMap().equals(map);
|
||||
|
||||
return false;
|
||||
});
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean isFrozen() {
|
||||
return !unpack(plugin).getPluginState().getMapState(unpack(map)).isUpdateEnabled();
|
||||
}
|
||||
|
||||
private <T> T unpack(WeakReference<T> ref) {
|
||||
return Objects.requireNonNull(ref.get(), "Reference lost to delegate object. Most likely BlueMap got reloaded and this instance is no longer valid.");
|
||||
}
|
||||
|
||||
}
|
|
@ -0,0 +1,53 @@
|
|||
package de.bluecolored.bluemap.common.api;
|
||||
|
||||
import de.bluecolored.bluemap.api.BlueMapMap;
|
||||
import de.bluecolored.bluemap.api.BlueMapWorld;
|
||||
import de.bluecolored.bluemap.common.plugin.Plugin;
|
||||
import de.bluecolored.bluemap.core.world.World;
|
||||
|
||||
import java.io.IOException;
|
||||
import java.lang.ref.WeakReference;
|
||||
import java.nio.file.Path;
|
||||
import java.util.Collection;
|
||||
import java.util.Objects;
|
||||
import java.util.stream.Collectors;
|
||||
|
||||
public class BlueMapWorldImpl implements BlueMapWorld {
|
||||
|
||||
private final WeakReference<Plugin> plugin;
|
||||
private final String id;
|
||||
private final WeakReference<World> world;
|
||||
|
||||
public BlueMapWorldImpl(Plugin plugin, World world) throws IOException {
|
||||
this.plugin = new WeakReference<>(plugin);
|
||||
this.id = plugin.getBlueMap().getWorldId(world.getSaveFolder());
|
||||
this.world = new WeakReference<>(world);
|
||||
}
|
||||
|
||||
public World getWorld() {
|
||||
return unpack(world);
|
||||
}
|
||||
|
||||
@Override
|
||||
public String getId() {
|
||||
return id;
|
||||
}
|
||||
|
||||
@Override
|
||||
public Path getSaveFolder() {
|
||||
return unpack(world).getSaveFolder();
|
||||
}
|
||||
|
||||
@Override
|
||||
public Collection<BlueMapMap> getMaps() {
|
||||
return unpack(plugin).getMaps().values().stream()
|
||||
.filter(map -> map.getWorld().equals(unpack(world)))
|
||||
.map(map -> new BlueMapMapImpl(unpack(plugin), map, this))
|
||||
.collect(Collectors.toUnmodifiableSet());
|
||||
}
|
||||
|
||||
private <T> T unpack(WeakReference<T> ref) {
|
||||
return Objects.requireNonNull(ref.get(), "Reference lost to delegate object. Most likely BlueMap got reloaded and this instance is no longer valid.");
|
||||
}
|
||||
|
||||
}
|
|
@ -0,0 +1,91 @@
|
|||
package de.bluecolored.bluemap.common.api;
|
||||
|
||||
import com.flowpowered.math.vector.Vector2i;
|
||||
import de.bluecolored.bluemap.api.BlueMapMap;
|
||||
import de.bluecolored.bluemap.api.RenderManager;
|
||||
import de.bluecolored.bluemap.common.plugin.Plugin;
|
||||
import de.bluecolored.bluemap.common.rendermanager.MapPurgeTask;
|
||||
import de.bluecolored.bluemap.common.rendermanager.MapUpdateTask;
|
||||
|
||||
import java.io.IOException;
|
||||
import java.util.Collection;
|
||||
|
||||
public class RenderManagerImpl implements RenderManager {
|
||||
|
||||
private final BlueMapAPIImpl api;
|
||||
private final Plugin plugin;
|
||||
private final de.bluecolored.bluemap.common.rendermanager.RenderManager renderManager;
|
||||
|
||||
public RenderManagerImpl(BlueMapAPIImpl api, Plugin plugin) {
|
||||
this.api = api;
|
||||
this.plugin = plugin;
|
||||
this.renderManager = plugin.getRenderManager();
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean scheduleMapUpdateTask(BlueMapMap map, boolean force) {
|
||||
BlueMapMapImpl cmap = castMap(map);
|
||||
return renderManager.scheduleRenderTask(new MapUpdateTask(cmap.getBmMap(), force));
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean scheduleMapUpdateTask(BlueMapMap map, Collection<Vector2i> regions, boolean force) {
|
||||
BlueMapMapImpl cmap = castMap(map);
|
||||
return renderManager.scheduleRenderTask(new MapUpdateTask(cmap.getBmMap(), regions, force));
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean scheduleMapPurgeTask(BlueMapMap map) throws IOException {
|
||||
BlueMapMapImpl cmap = castMap(map);
|
||||
return renderManager.scheduleRenderTask(MapPurgeTask.create(cmap.getBmMap()));
|
||||
}
|
||||
|
||||
@Override
|
||||
public int renderQueueSize() {
|
||||
return renderManager.getScheduledRenderTaskCount();
|
||||
}
|
||||
|
||||
@Override
|
||||
public int renderThreadCount() {
|
||||
return renderManager.getWorkerThreadCount();
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean isRunning() {
|
||||
return renderManager.isRunning();
|
||||
}
|
||||
|
||||
@Override
|
||||
public void start() {
|
||||
if (!isRunning()){
|
||||
renderManager.start(plugin.getConfigs().getCoreConfig().getRenderThreadCount());
|
||||
}
|
||||
plugin.getPluginState().setRenderThreadsEnabled(true);
|
||||
}
|
||||
|
||||
@Override
|
||||
public void start(int threadCount) {
|
||||
if (!isRunning()){
|
||||
renderManager.start(threadCount);
|
||||
}
|
||||
plugin.getPluginState().setRenderThreadsEnabled(true);
|
||||
}
|
||||
|
||||
@Override
|
||||
public void stop() {
|
||||
renderManager.stop();
|
||||
plugin.getPluginState().setRenderThreadsEnabled(false);
|
||||
}
|
||||
|
||||
private BlueMapMapImpl castMap(BlueMapMap map) {
|
||||
BlueMapMapImpl cmap;
|
||||
if (map instanceof BlueMapMapImpl) {
|
||||
cmap = (BlueMapMapImpl) map;
|
||||
} else {
|
||||
cmap = (BlueMapMapImpl) api.getMap(map.getId())
|
||||
.orElseThrow(() -> new IllegalStateException("Failed to get BlueMapMapImpl for map " + map.getId()));
|
||||
}
|
||||
return cmap;
|
||||
}
|
||||
|
||||
}
|
|
@ -0,0 +1,90 @@
|
|||
package de.bluecolored.bluemap.common.api;
|
||||
|
||||
import de.bluecolored.bluemap.api.WebApp;
|
||||
import de.bluecolored.bluemap.common.plugin.Plugin;
|
||||
|
||||
import javax.imageio.ImageIO;
|
||||
import java.awt.image.BufferedImage;
|
||||
import java.io.IOException;
|
||||
import java.nio.file.Files;
|
||||
import java.nio.file.Path;
|
||||
import java.util.HashMap;
|
||||
import java.util.Map;
|
||||
import java.util.UUID;
|
||||
import java.util.stream.Stream;
|
||||
|
||||
public class WebAppImpl implements WebApp {
|
||||
private static final String IMAGE_ROOT_PATH = "images";
|
||||
|
||||
private final Plugin plugin;
|
||||
|
||||
public WebAppImpl(Plugin plugin) {
|
||||
this.plugin = plugin;
|
||||
}
|
||||
|
||||
@Override
|
||||
public Path getWebRoot() {
|
||||
return plugin.getConfigs().getWebappConfig().getWebroot();
|
||||
}
|
||||
|
||||
@Override
|
||||
public void setPlayerVisibility(UUID player, boolean visible) {
|
||||
if (visible) {
|
||||
plugin.getPluginState().removeHiddenPlayer(player);
|
||||
} else {
|
||||
plugin.getPluginState().addHiddenPlayer(player);
|
||||
}
|
||||
}
|
||||
|
||||
@Override
|
||||
public String createImage(BufferedImage image, String path) throws IOException {
|
||||
path = path.replaceAll("[^a-zA-Z0-9_.\\-/]", "_");
|
||||
|
||||
Path webRoot = getWebRoot().toAbsolutePath();
|
||||
String separator = webRoot.getFileSystem().getSeparator();
|
||||
|
||||
Path webDataRoot = webRoot.resolve("data");
|
||||
Path imagePath = webDataRoot.resolve(Path.of(IMAGE_ROOT_PATH, path.replace("/", separator) + ".png")).toAbsolutePath();
|
||||
|
||||
Files.deleteIfExists(imagePath);
|
||||
Files.createFile(imagePath);
|
||||
|
||||
if (!ImageIO.write(image, "png", imagePath.toFile()))
|
||||
throw new IOException("The format 'png' is not supported!");
|
||||
|
||||
return webRoot.relativize(imagePath).toString().replace(separator, "/");
|
||||
}
|
||||
|
||||
@Override
|
||||
public Map<String, String> availableImages() throws IOException {
|
||||
Path webRoot = getWebRoot().toAbsolutePath();
|
||||
String separator = webRoot.getFileSystem().getSeparator();
|
||||
|
||||
Path imageRootPath = webRoot.resolve("data").resolve(IMAGE_ROOT_PATH).toAbsolutePath();
|
||||
|
||||
Map<String, String> availableImagesMap = new HashMap<>();
|
||||
|
||||
try (Stream<Path> fileStream = Files.walk(imageRootPath)){
|
||||
fileStream
|
||||
.filter(p -> !Files.isDirectory(p))
|
||||
.filter(p -> p.getFileName().toString().endsWith(".png"))
|
||||
.map(Path::toAbsolutePath)
|
||||
.forEach(p -> {
|
||||
try {
|
||||
String key = imageRootPath.relativize(p).toString();
|
||||
key = key
|
||||
.substring(0, key.length() - 4) //remove .png
|
||||
.replace(separator, "/");
|
||||
|
||||
String value = webRoot.relativize(p).toString()
|
||||
.replace(separator, "/");
|
||||
|
||||
availableImagesMap.put(key, value);
|
||||
} catch (IllegalArgumentException ignore) {}
|
||||
});
|
||||
}
|
||||
|
||||
return availableImagesMap;
|
||||
}
|
||||
|
||||
}
|
|
@ -4,7 +4,7 @@
|
|||
import de.bluecolored.bluemap.common.config.storage.StorageConfig;
|
||||
import de.bluecolored.bluemap.common.serverinterface.ServerInterface;
|
||||
import de.bluecolored.bluemap.core.BlueMap;
|
||||
import de.bluecolored.bluemap.core.debug.DebugDump;
|
||||
import de.bluecolored.bluemap.api.debug.DebugDump;
|
||||
import de.bluecolored.bluemap.core.logger.Logger;
|
||||
import de.bluecolored.bluemap.core.util.Tristate;
|
||||
|
||||
|
|
|
@ -1,6 +1,6 @@
|
|||
package de.bluecolored.bluemap.common.config;
|
||||
|
||||
import de.bluecolored.bluemap.core.debug.DebugDump;
|
||||
import de.bluecolored.bluemap.api.debug.DebugDump;
|
||||
import org.spongepowered.configurate.objectmapping.ConfigSerializable;
|
||||
|
||||
import java.nio.file.Path;
|
||||
|
|
|
@ -2,7 +2,7 @@
|
|||
|
||||
import com.flowpowered.math.vector.Vector2i;
|
||||
import com.flowpowered.math.vector.Vector3i;
|
||||
import de.bluecolored.bluemap.core.debug.DebugDump;
|
||||
import de.bluecolored.bluemap.api.debug.DebugDump;
|
||||
import de.bluecolored.bluemap.core.map.MapSettings;
|
||||
import org.spongepowered.configurate.objectmapping.ConfigSerializable;
|
||||
import org.spongepowered.configurate.objectmapping.meta.Required;
|
||||
|
|
|
@ -1,6 +1,6 @@
|
|||
package de.bluecolored.bluemap.common.config;
|
||||
|
||||
import de.bluecolored.bluemap.core.debug.DebugDump;
|
||||
import de.bluecolored.bluemap.api.debug.DebugDump;
|
||||
import org.spongepowered.configurate.objectmapping.ConfigSerializable;
|
||||
|
||||
import java.util.ArrayList;
|
||||
|
|
|
@ -1,6 +1,6 @@
|
|||
package de.bluecolored.bluemap.common.config;
|
||||
|
||||
import de.bluecolored.bluemap.core.debug.DebugDump;
|
||||
import de.bluecolored.bluemap.api.debug.DebugDump;
|
||||
import org.spongepowered.configurate.objectmapping.ConfigSerializable;
|
||||
|
||||
import java.nio.file.Path;
|
||||
|
|
|
@ -1,6 +1,6 @@
|
|||
package de.bluecolored.bluemap.common.config;
|
||||
|
||||
import de.bluecolored.bluemap.core.debug.DebugDump;
|
||||
import de.bluecolored.bluemap.api.debug.DebugDump;
|
||||
import org.spongepowered.configurate.objectmapping.ConfigSerializable;
|
||||
|
||||
import java.net.InetAddress;
|
||||
|
|
|
@ -24,7 +24,7 @@
|
|||
*/
|
||||
package de.bluecolored.bluemap.common.config.storage;
|
||||
|
||||
import de.bluecolored.bluemap.core.debug.DebugDump;
|
||||
import de.bluecolored.bluemap.api.debug.DebugDump;
|
||||
import de.bluecolored.bluemap.core.storage.Compression;
|
||||
import de.bluecolored.bluemap.core.storage.file.FileStorageSettings;
|
||||
import org.spongepowered.configurate.objectmapping.ConfigSerializable;
|
||||
|
|
|
@ -24,7 +24,7 @@
|
|||
*/
|
||||
package de.bluecolored.bluemap.common.config.storage;
|
||||
|
||||
import de.bluecolored.bluemap.core.debug.DebugDump;
|
||||
import de.bluecolored.bluemap.api.debug.DebugDump;
|
||||
import de.bluecolored.bluemap.core.storage.Compression;
|
||||
import de.bluecolored.bluemap.core.storage.sql.SQLStorageSettings;
|
||||
import org.spongepowered.configurate.objectmapping.ConfigSerializable;
|
||||
|
|
|
@ -24,12 +24,10 @@
|
|||
*/
|
||||
package de.bluecolored.bluemap.common.config.storage;
|
||||
|
||||
import de.bluecolored.bluemap.core.debug.DebugDump;
|
||||
import de.bluecolored.bluemap.api.debug.DebugDump;
|
||||
import de.bluecolored.bluemap.core.storage.Storage;
|
||||
import org.spongepowered.configurate.objectmapping.ConfigSerializable;
|
||||
|
||||
import java.io.IOException;
|
||||
|
||||
@SuppressWarnings("FieldMayBeFinal")
|
||||
@DebugDump
|
||||
@ConfigSerializable
|
||||
|
|
|
@ -0,0 +1,22 @@
|
|||
package de.bluecolored.bluemap.common.live;
|
||||
|
||||
import de.bluecolored.bluemap.api.marker.MarkerGson;
|
||||
import de.bluecolored.bluemap.api.marker.MarkerSet;
|
||||
|
||||
import java.util.Map;
|
||||
import java.util.function.Supplier;
|
||||
|
||||
public class LiveMarkersDataSupplier implements Supplier<String> {
|
||||
|
||||
private final Map<String, MarkerSet> markerSets;
|
||||
|
||||
public LiveMarkersDataSupplier(Map<String, MarkerSet> markerSets) {
|
||||
this.markerSets = markerSets;
|
||||
}
|
||||
|
||||
@Override
|
||||
public String get() {
|
||||
return MarkerGson.INSTANCE.toJson(markerSets);
|
||||
}
|
||||
|
||||
}
|
|
@ -28,6 +28,7 @@
|
|||
import de.bluecolored.bluemap.common.BlueMapService;
|
||||
import de.bluecolored.bluemap.common.InterruptableReentrantLock;
|
||||
import de.bluecolored.bluemap.common.MissingResourcesException;
|
||||
import de.bluecolored.bluemap.common.api.BlueMapAPIImpl;
|
||||
import de.bluecolored.bluemap.common.config.*;
|
||||
import de.bluecolored.bluemap.common.plugin.skins.PlayerSkinUpdater;
|
||||
import de.bluecolored.bluemap.common.rendermanager.MapUpdateTask;
|
||||
|
@ -38,7 +39,7 @@
|
|||
import de.bluecolored.bluemap.common.web.MapRequestHandler;
|
||||
import de.bluecolored.bluemap.common.web.RoutingRequestHandler;
|
||||
import de.bluecolored.bluemap.common.webserver.WebServer;
|
||||
import de.bluecolored.bluemap.core.debug.DebugDump;
|
||||
import de.bluecolored.bluemap.api.debug.DebugDump;
|
||||
import de.bluecolored.bluemap.core.debug.StateDumper;
|
||||
import de.bluecolored.bluemap.core.logger.Logger;
|
||||
import de.bluecolored.bluemap.core.map.BmMap;
|
||||
|
@ -77,6 +78,8 @@ public class Plugin implements ServerEventListener {
|
|||
private RenderManager renderManager;
|
||||
private WebServer webServer;
|
||||
|
||||
private BlueMapAPIImpl api;
|
||||
|
||||
private Timer daemonTimer;
|
||||
|
||||
private Map<String, RegionFileWatchService> regionFileWatchServices;
|
||||
|
@ -267,9 +270,9 @@ public void run() {
|
|||
//register listener
|
||||
serverInterface.registerListener(this);
|
||||
|
||||
//enable api TODO
|
||||
//this.api = new BlueMapAPIImpl(this);
|
||||
//this.api.register();
|
||||
//enable api
|
||||
this.api = new BlueMapAPIImpl(this);
|
||||
this.api.register();
|
||||
|
||||
//done
|
||||
loaded = true;
|
||||
|
@ -292,9 +295,9 @@ public void unload() {
|
|||
//save
|
||||
save();
|
||||
|
||||
//disable api TODO
|
||||
//if (api != null) api.unregister();
|
||||
//api = null;
|
||||
//disable api
|
||||
if (api != null) api.unregister();
|
||||
api = null;
|
||||
|
||||
//unregister listeners
|
||||
serverInterface.unregisterAllListeners();
|
||||
|
|
|
@ -27,7 +27,7 @@
|
|||
import com.flowpowered.math.vector.Vector2i;
|
||||
import de.bluecolored.bluemap.common.rendermanager.RenderManager;
|
||||
import de.bluecolored.bluemap.common.rendermanager.WorldRegionRenderTask;
|
||||
import de.bluecolored.bluemap.core.debug.DebugDump;
|
||||
import de.bluecolored.bluemap.api.debug.DebugDump;
|
||||
import de.bluecolored.bluemap.core.logger.Logger;
|
||||
import de.bluecolored.bluemap.core.map.BmMap;
|
||||
|
||||
|
|
|
@ -38,14 +38,8 @@
|
|||
import com.mojang.brigadier.builder.RequiredArgumentBuilder;
|
||||
import com.mojang.brigadier.context.CommandContext;
|
||||
import com.mojang.brigadier.tree.LiteralCommandNode;
|
||||
import de.bluecolored.bluemap.api.BlueMapAPI;
|
||||
import de.bluecolored.bluemap.api.BlueMapMap;
|
||||
import de.bluecolored.bluemap.api.marker.MarkerAPI;
|
||||
import de.bluecolored.bluemap.api.marker.MarkerSet;
|
||||
import de.bluecolored.bluemap.api.marker.POIMarker;
|
||||
import de.bluecolored.bluemap.common.plugin.Plugin;
|
||||
import de.bluecolored.bluemap.common.plugin.PluginState;
|
||||
import de.bluecolored.bluemap.common.serverinterface.CommandSource;
|
||||
import de.bluecolored.bluemap.common.plugin.text.Text;
|
||||
import de.bluecolored.bluemap.common.plugin.text.TextColor;
|
||||
import de.bluecolored.bluemap.common.plugin.text.TextFormat;
|
||||
|
@ -53,6 +47,7 @@
|
|||
import de.bluecolored.bluemap.common.rendermanager.MapUpdateTask;
|
||||
import de.bluecolored.bluemap.common.rendermanager.RenderTask;
|
||||
import de.bluecolored.bluemap.common.rendermanager.WorldRegionRenderTask;
|
||||
import de.bluecolored.bluemap.common.serverinterface.CommandSource;
|
||||
import de.bluecolored.bluemap.core.BlueMap;
|
||||
import de.bluecolored.bluemap.core.MinecraftVersion;
|
||||
import de.bluecolored.bluemap.core.debug.StateDumper;
|
||||
|
@ -64,7 +59,10 @@
|
|||
|
||||
import java.io.IOException;
|
||||
import java.nio.file.Path;
|
||||
import java.util.*;
|
||||
import java.util.ArrayList;
|
||||
import java.util.Arrays;
|
||||
import java.util.List;
|
||||
import java.util.Optional;
|
||||
import java.util.function.Function;
|
||||
import java.util.function.Predicate;
|
||||
|
||||
|
@ -209,40 +207,6 @@ public void init() {
|
|||
.executes(this::mapsCommand)
|
||||
.build();
|
||||
|
||||
LiteralCommandNode<S> markerCommand =
|
||||
literal("marker")
|
||||
.requires(requirements("bluemap.marker"))
|
||||
.build();
|
||||
|
||||
LiteralCommandNode<S> createMarkerCommand =
|
||||
literal("create")
|
||||
.requires(requirements("bluemap.marker"))
|
||||
.then(argument("id", StringArgumentType.word())
|
||||
.then(argument("map", StringArgumentType.string()).suggests(new MapSuggestionProvider<>(plugin))
|
||||
|
||||
.then(argument("label", StringArgumentType.string())
|
||||
.executes(this::createMarkerCommand))
|
||||
|
||||
.then(argument("x", DoubleArgumentType.doubleArg())
|
||||
.then(argument("y", DoubleArgumentType.doubleArg())
|
||||
.then(argument("z", DoubleArgumentType.doubleArg())
|
||||
.then(argument("label", StringArgumentType.string())
|
||||
.executes(this::createMarkerCommand)))))))
|
||||
.build();
|
||||
|
||||
LiteralCommandNode<S> removeMarkerCommand =
|
||||
literal("remove")
|
||||
.requires(requirements("bluemap.marker"))
|
||||
.then(argument("id", StringArgumentType.word()).suggests(MarkerIdSuggestionProvider.getInstance())
|
||||
.executes(this::removeMarkerCommand))
|
||||
.build();
|
||||
|
||||
LiteralCommandNode<S> listMarkersCommand =
|
||||
literal("list")
|
||||
.requires(requirements("bluemap.marker"))
|
||||
.executes(this::listMarkersCommand)
|
||||
.build();
|
||||
|
||||
// command tree
|
||||
dispatcher.getRoot().addChild(baseCommand);
|
||||
baseCommand.addChild(versionCommand);
|
||||
|
@ -259,10 +223,6 @@ public void init() {
|
|||
baseCommand.addChild(purgeCommand);
|
||||
baseCommand.addChild(worldsCommand);
|
||||
baseCommand.addChild(mapsCommand);
|
||||
baseCommand.addChild(markerCommand);
|
||||
markerCommand.addChild(createMarkerCommand);
|
||||
markerCommand.addChild(removeMarkerCommand);
|
||||
markerCommand.addChild(listMarkersCommand);
|
||||
}
|
||||
|
||||
private <B extends ArgumentBuilder<S, B>> B addRenderArguments(B builder, Command<S> command) {
|
||||
|
@ -883,137 +843,4 @@ public int mapsCommand(CommandContext<S> context) {
|
|||
return 1;
|
||||
}
|
||||
|
||||
public int createMarkerCommand(CommandContext<S> context) {
|
||||
CommandSource source = commandSourceInterface.apply(context.getSource());
|
||||
|
||||
String markerId = context.getArgument("id", String.class);
|
||||
String markerLabel = context.getArgument("label", String.class)
|
||||
.replace("<", "<")
|
||||
.replace(">", ">"); //no html via commands
|
||||
|
||||
// parse map argument
|
||||
String mapString = context.getArgument("map", String.class);
|
||||
BmMap map = parseMap(mapString).orElse(null);
|
||||
|
||||
if (map == null) {
|
||||
source.sendMessage(Text.of(TextColor.RED, "There is no ", helper.mapHelperHover(), " with this name: ", TextColor.WHITE, mapString));
|
||||
return 0;
|
||||
}
|
||||
|
||||
// parse position
|
||||
Optional<Double> x = getOptionalArgument(context, "x", Double.class);
|
||||
Optional<Double> y = getOptionalArgument(context, "y", Double.class);
|
||||
Optional<Double> z = getOptionalArgument(context, "z", Double.class);
|
||||
|
||||
Vector3d position;
|
||||
|
||||
if (x.isPresent() && y.isPresent() && z.isPresent()) {
|
||||
position = new Vector3d(x.get(), y.get(), z.get());
|
||||
} else {
|
||||
position = source.getPosition().orElse(null);
|
||||
|
||||
if (position == null) {
|
||||
source.sendMessage(Text.of(TextColor.RED, "Can't detect a position from this command-source, you'll have to define the x,y,z coordinates for the marker!").setHoverText(Text.of(TextColor.GRAY, "/bluemap marker create " + markerId + " " + "[world|map] <x> <y> <z> <label>")));
|
||||
return 0;
|
||||
}
|
||||
}
|
||||
|
||||
// get api
|
||||
BlueMapAPI api = BlueMapAPI.getInstance().orElse(null);
|
||||
if (api == null) {
|
||||
source.sendMessage(Text.of(TextColor.RED, "MarkerAPI is not available, try ", TextColor.GRAY, "/bluemap reload"));
|
||||
return 0;
|
||||
}
|
||||
|
||||
// resolve api-map
|
||||
Optional<BlueMapMap> apiMap = api.getMap(map.getId());
|
||||
if (apiMap.isEmpty()) {
|
||||
source.sendMessage(Text.of(TextColor.RED, "Failed to get map from API, try ", TextColor.GRAY, "/bluemap reload"));
|
||||
return 0;
|
||||
}
|
||||
|
||||
// add marker
|
||||
try {
|
||||
MarkerAPI markerApi = api.getMarkerAPI();
|
||||
|
||||
MarkerSet set = markerApi.getMarkerSet(DEFAULT_MARKER_SET_ID).orElse(null);
|
||||
if (set == null) {
|
||||
set = markerApi.createMarkerSet(DEFAULT_MARKER_SET_ID);
|
||||
set.setLabel("Markers");
|
||||
}
|
||||
|
||||
if (set.getMarker(markerId).isPresent()) {
|
||||
source.sendMessage(Text.of(TextColor.RED, "There already is a marker with this id: ", TextColor.WHITE, markerId));
|
||||
return 0;
|
||||
}
|
||||
|
||||
POIMarker marker = set.createPOIMarker(markerId, apiMap.get(), position);
|
||||
marker.setLabel(markerLabel);
|
||||
|
||||
markerApi.save();
|
||||
MarkerIdSuggestionProvider.getInstance().forceUpdate();
|
||||
} catch (IOException e) {
|
||||
source.sendMessage(Text.of(TextColor.RED, "There was an error trying to add the marker, please check the console for details!"));
|
||||
Logger.global.logError("Exception trying to add a marker!", e);
|
||||
}
|
||||
|
||||
source.sendMessage(Text.of(TextColor.GREEN, "Marker added!"));
|
||||
return 1;
|
||||
}
|
||||
|
||||
public int removeMarkerCommand(CommandContext<S> context) {
|
||||
CommandSource source = commandSourceInterface.apply(context.getSource());
|
||||
|
||||
String markerId = context.getArgument("id", String.class);
|
||||
|
||||
BlueMapAPI api = BlueMapAPI.getInstance().orElse(null);
|
||||
if (api == null) {
|
||||
source.sendMessage(Text.of(TextColor.RED, "MarkerAPI is not available, try ", TextColor.GRAY, "/bluemap reload"));
|
||||
return 0;
|
||||
}
|
||||
|
||||
try {
|
||||
MarkerAPI markerApi = api.getMarkerAPI();
|
||||
|
||||
MarkerSet set = markerApi.createMarkerSet("markers");
|
||||
if (!set.removeMarker(markerId)) {
|
||||
source.sendMessage(Text.of(TextColor.RED, "There is no marker with this id: ", TextColor.WHITE, markerId));
|
||||
}
|
||||
|
||||
markerApi.save();
|
||||
MarkerIdSuggestionProvider.getInstance().forceUpdate();
|
||||
} catch (IOException e) {
|
||||
source.sendMessage(Text.of(TextColor.RED, "There was an error trying to remove the marker, please check the console for details!"));
|
||||
Logger.global.logError("Exception trying to remove a marker!", e);
|
||||
}
|
||||
|
||||
source.sendMessage(Text.of(TextColor.GREEN, "Marker removed!"));
|
||||
return 1;
|
||||
}
|
||||
|
||||
public int listMarkersCommand(CommandContext<S> context) {
|
||||
CommandSource source = commandSourceInterface.apply(context.getSource());
|
||||
|
||||
BlueMapAPI api = BlueMapAPI.getInstance().orElse(null);
|
||||
if (api == null) {
|
||||
source.sendMessage(Text.of(TextColor.RED, "MarkerAPI is not available, try ", TextColor.GRAY, "/bluemap reload"));
|
||||
return 0;
|
||||
}
|
||||
|
||||
source.sendMessage(Text.of(TextColor.BLUE, "All Markers:"));
|
||||
|
||||
int i = 0;
|
||||
Collection<String> markerIds = MarkerIdSuggestionProvider.getInstance().getPossibleValues();
|
||||
for (String markerId : markerIds) {
|
||||
if (i++ >= 40) {
|
||||
source.sendMessage(Text.of(TextColor.GRAY, "[" + (markerIds.size() - 40) + " more ...]"));
|
||||
break;
|
||||
}
|
||||
|
||||
source.sendMessage(Text.of(TextColor.GRAY, " - ", TextColor.WHITE, markerId));
|
||||
}
|
||||
|
||||
return 1;
|
||||
}
|
||||
|
||||
}
|
||||
|
|
|
@ -1,91 +0,0 @@
|
|||
/*
|
||||
* This file is part of BlueMap, licensed under the MIT License (MIT).
|
||||
*
|
||||
* Copyright (c) Blue (Lukas Rieger) <https://bluecolored.de>
|
||||
* Copyright (c) contributors
|
||||
*
|
||||
* Permission is hereby granted, free of charge, to any person obtaining a copy
|
||||
* of this software and associated documentation files (the "Software"), to deal
|
||||
* in the Software without restriction, including without limitation the rights
|
||||
* to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
||||
* copies of the Software, and to permit persons to whom the Software is
|
||||
* furnished to do so, subject to the following conditions:
|
||||
*
|
||||
* The above copyright notice and this permission notice shall be included in
|
||||
* all copies or substantial portions of the Software.
|
||||
*
|
||||
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
||||
* IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
||||
* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
||||
* AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
||||
* LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
||||
* OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
|
||||
* THE SOFTWARE.
|
||||
*/
|
||||
package de.bluecolored.bluemap.common.plugin.commands;
|
||||
|
||||
import java.io.IOException;
|
||||
import java.util.Collection;
|
||||
import java.util.HashSet;
|
||||
import java.util.Optional;
|
||||
|
||||
import de.bluecolored.bluemap.api.BlueMapAPI;
|
||||
import de.bluecolored.bluemap.api.marker.Marker;
|
||||
import de.bluecolored.bluemap.api.marker.MarkerAPI;
|
||||
import de.bluecolored.bluemap.api.marker.MarkerSet;
|
||||
import de.bluecolored.bluemap.api.marker.POIMarker;
|
||||
import de.bluecolored.bluemap.core.logger.Logger;
|
||||
|
||||
public class MarkerIdSuggestionProvider<S> extends AbstractSuggestionProvider<S> {
|
||||
|
||||
private static MarkerIdSuggestionProvider<?> instance;
|
||||
|
||||
private MarkerAPI markerApi;
|
||||
private long lastUpdate = -1;
|
||||
|
||||
private MarkerIdSuggestionProvider() {}
|
||||
|
||||
@Override
|
||||
public Collection<String> getPossibleValues() {
|
||||
Collection<String> values = new HashSet<>();
|
||||
|
||||
if (markerApi == null || lastUpdate + 1000 * 60 < System.currentTimeMillis()) { // only (re)load marker-values max every minute
|
||||
lastUpdate = System.currentTimeMillis();
|
||||
|
||||
Optional<BlueMapAPI> api = BlueMapAPI.getInstance();
|
||||
if (!api.isPresent()) return values;
|
||||
|
||||
try {
|
||||
markerApi = api.get().getMarkerAPI();
|
||||
} catch (IOException e) {
|
||||
Logger.global.noFloodError("0FEz5tm345rf", "Failed to load MarkerAPI!", e);
|
||||
return values;
|
||||
}
|
||||
}
|
||||
|
||||
MarkerSet set = markerApi.getMarkerSet(Commands.DEFAULT_MARKER_SET_ID).orElse(null);
|
||||
if (set != null) {
|
||||
for (Marker marker : set.getMarkers()) {
|
||||
if (marker instanceof POIMarker) {
|
||||
values.add(marker.getId());
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
return values;
|
||||
}
|
||||
|
||||
public void forceUpdate() {
|
||||
lastUpdate = -1;
|
||||
}
|
||||
|
||||
@SuppressWarnings("unchecked")
|
||||
public static <S> MarkerIdSuggestionProvider<S> getInstance(){
|
||||
if (instance == null) {
|
||||
instance = new MarkerIdSuggestionProvider<>();
|
||||
}
|
||||
|
||||
return (MarkerIdSuggestionProvider<S>) instance;
|
||||
}
|
||||
|
||||
}
|
|
@ -27,7 +27,7 @@
|
|||
import com.google.gson.JsonArray;
|
||||
import com.google.gson.JsonElement;
|
||||
import com.google.gson.JsonParser;
|
||||
import de.bluecolored.bluemap.core.debug.DebugDump;
|
||||
import de.bluecolored.bluemap.api.debug.DebugDump;
|
||||
import de.bluecolored.bluemap.core.logger.Logger;
|
||||
|
||||
import javax.imageio.ImageIO;
|
||||
|
|
|
@ -25,7 +25,7 @@
|
|||
package de.bluecolored.bluemap.common.plugin.skins;
|
||||
|
||||
import de.bluecolored.bluemap.common.serverinterface.ServerEventListener;
|
||||
import de.bluecolored.bluemap.core.debug.DebugDump;
|
||||
import de.bluecolored.bluemap.api.debug.DebugDump;
|
||||
import org.apache.commons.io.FileUtils;
|
||||
|
||||
import java.io.File;
|
||||
|
|
|
@ -24,7 +24,7 @@
|
|||
*/
|
||||
package de.bluecolored.bluemap.common.rendermanager;
|
||||
|
||||
import de.bluecolored.bluemap.core.debug.DebugDump;
|
||||
import de.bluecolored.bluemap.api.debug.DebugDump;
|
||||
|
||||
import java.util.ArrayList;
|
||||
import java.util.Collection;
|
||||
|
|
|
@ -24,7 +24,7 @@
|
|||
*/
|
||||
package de.bluecolored.bluemap.common.rendermanager;
|
||||
|
||||
import de.bluecolored.bluemap.core.debug.DebugDump;
|
||||
import de.bluecolored.bluemap.api.debug.DebugDump;
|
||||
import de.bluecolored.bluemap.core.map.BmMap;
|
||||
import de.bluecolored.bluemap.core.storage.Storage;
|
||||
import de.bluecolored.bluemap.core.storage.file.FileStorage;
|
||||
|
|
|
@ -25,7 +25,7 @@
|
|||
package de.bluecolored.bluemap.common.rendermanager;
|
||||
|
||||
import com.flowpowered.math.vector.Vector2i;
|
||||
import de.bluecolored.bluemap.core.debug.DebugDump;
|
||||
import de.bluecolored.bluemap.api.debug.DebugDump;
|
||||
import de.bluecolored.bluemap.core.map.BmMap;
|
||||
import de.bluecolored.bluemap.core.world.Grid;
|
||||
import de.bluecolored.bluemap.core.world.World;
|
||||
|
|
|
@ -24,7 +24,7 @@
|
|||
*/
|
||||
package de.bluecolored.bluemap.common.rendermanager;
|
||||
|
||||
import de.bluecolored.bluemap.core.debug.DebugDump;
|
||||
import de.bluecolored.bluemap.api.debug.DebugDump;
|
||||
import de.bluecolored.bluemap.core.logger.Logger;
|
||||
|
||||
import java.util.*;
|
||||
|
|
|
@ -26,7 +26,7 @@
|
|||
|
||||
import com.flowpowered.math.vector.Vector2i;
|
||||
import com.flowpowered.math.vector.Vector2l;
|
||||
import de.bluecolored.bluemap.core.debug.DebugDump;
|
||||
import de.bluecolored.bluemap.api.debug.DebugDump;
|
||||
import de.bluecolored.bluemap.core.map.BmMap;
|
||||
import de.bluecolored.bluemap.core.world.Grid;
|
||||
import de.bluecolored.bluemap.core.world.Region;
|
||||
|
|
|
@ -25,7 +25,7 @@
|
|||
package de.bluecolored.bluemap.common.serverinterface;
|
||||
|
||||
import de.bluecolored.bluemap.core.MinecraftVersion;
|
||||
import de.bluecolored.bluemap.core.debug.DebugDump;
|
||||
import de.bluecolored.bluemap.api.debug.DebugDump;
|
||||
import de.bluecolored.bluemap.core.util.Tristate;
|
||||
|
||||
import java.nio.file.Path;
|
||||
|
@ -55,6 +55,10 @@ default Optional<ServerWorld> getWorld(Path worldFolder) {
|
|||
.findAny();
|
||||
}
|
||||
|
||||
default Optional<ServerWorld> getWorld(Object world) {
|
||||
return Optional.empty();
|
||||
}
|
||||
|
||||
@DebugDump
|
||||
Collection<ServerWorld> getLoadedWorlds();
|
||||
|
||||
|
|
|
@ -1,6 +1,6 @@
|
|||
package de.bluecolored.bluemap.common.serverinterface;
|
||||
|
||||
import de.bluecolored.bluemap.core.debug.DebugDump;
|
||||
import de.bluecolored.bluemap.api.debug.DebugDump;
|
||||
|
||||
import java.io.IOException;
|
||||
import java.nio.file.Path;
|
||||
|
|
|
@ -1,9 +1,12 @@
|
|||
package de.bluecolored.bluemap.common.web;
|
||||
|
||||
import java.util.concurrent.locks.ReentrantLock;
|
||||
import java.util.function.Supplier;
|
||||
|
||||
public class CachedRateLimitDataSupplier implements Supplier<String> {
|
||||
|
||||
private final ReentrantLock lock = new ReentrantLock();
|
||||
|
||||
private final Supplier<String> delegate;
|
||||
private final long rateLimitMillis;
|
||||
|
||||
|
@ -22,10 +25,16 @@ public String get() {
|
|||
}
|
||||
|
||||
protected void update() {
|
||||
long now = System.currentTimeMillis();
|
||||
if (data != null && now < updateTime + this.rateLimitMillis) return;
|
||||
this.updateTime = now;
|
||||
this.data = delegate.get();
|
||||
if (lock.tryLock()) {
|
||||
try {
|
||||
long now = System.currentTimeMillis();
|
||||
if (data != null && now < updateTime + this.rateLimitMillis) return;
|
||||
this.data = delegate.get();
|
||||
this.updateTime = now;
|
||||
} finally {
|
||||
lock.unlock();
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
}
|
||||
|
|
|
@ -1,21 +1,27 @@
|
|||
package de.bluecolored.bluemap.common.web;
|
||||
|
||||
import de.bluecolored.bluemap.api.marker.MarkerSet;
|
||||
import de.bluecolored.bluemap.common.config.PluginConfig;
|
||||
import de.bluecolored.bluemap.common.live.LiveMarkersDataSupplier;
|
||||
import de.bluecolored.bluemap.common.live.LivePlayersDataSupplier;
|
||||
import de.bluecolored.bluemap.common.serverinterface.ServerInterface;
|
||||
import de.bluecolored.bluemap.core.map.BmMap;
|
||||
import de.bluecolored.bluemap.core.storage.Storage;
|
||||
|
||||
import java.util.Map;
|
||||
import java.util.UUID;
|
||||
import java.util.function.Predicate;
|
||||
|
||||
public class MapRequestHandler extends RoutingRequestHandler {
|
||||
|
||||
public MapRequestHandler(BmMap map, ServerInterface serverInterface, PluginConfig pluginConfig, Predicate<UUID> playerFilter) {
|
||||
this(map.getId(), map.getWorldId(), map.getStorage(), serverInterface, pluginConfig, playerFilter);
|
||||
public MapRequestHandler(BmMap map, ServerInterface serverInterface, PluginConfig pluginConfig,
|
||||
Predicate<UUID> playerFilter) {
|
||||
this(map.getId(), map.getWorldId(), map.getStorage(), map.getMarkerSets(),
|
||||
serverInterface, pluginConfig, playerFilter);
|
||||
}
|
||||
|
||||
public MapRequestHandler(String mapId, String worldId, Storage mapStorage, ServerInterface serverInterface, PluginConfig pluginConfig, Predicate<UUID> playerFilter) {
|
||||
public MapRequestHandler(String mapId, String worldId, Storage mapStorage, Map<String, MarkerSet> markerSets,
|
||||
ServerInterface serverInterface, PluginConfig pluginConfig, Predicate<UUID> playerFilter) {
|
||||
register(".*", new MapStorageRequestHandler(mapId, mapStorage));
|
||||
|
||||
register("live/players", "", new JsonDataRequestHandler(
|
||||
|
@ -23,6 +29,11 @@ public MapRequestHandler(String mapId, String worldId, Storage mapStorage, Serve
|
|||
new LivePlayersDataSupplier(serverInterface, pluginConfig, worldId, playerFilter),
|
||||
1000)
|
||||
));
|
||||
register("live/markers", "", new JsonDataRequestHandler(
|
||||
new CachedRateLimitDataSupplier(
|
||||
new LiveMarkersDataSupplier(markerSets),
|
||||
10000)
|
||||
));
|
||||
}
|
||||
|
||||
}
|
||||
|
|
|
@ -24,7 +24,7 @@
|
|||
*/
|
||||
package de.bluecolored.bluemap.common.webserver;
|
||||
|
||||
import de.bluecolored.bluemap.core.debug.DebugDump;
|
||||
import de.bluecolored.bluemap.api.debug.DebugDump;
|
||||
import de.bluecolored.bluemap.core.logger.Logger;
|
||||
|
||||
import java.io.IOException;
|
||||
|
|
|
@ -32,16 +32,16 @@ repositories {
|
|||
@Suppress("GradlePackageUpdate")
|
||||
dependencies {
|
||||
api ("com.github.ben-manes.caffeine:caffeine:2.8.5")
|
||||
api ("com.google.code.gson:gson:2.8.0")
|
||||
api ("org.apache.commons:commons-lang3:3.6")
|
||||
api ("commons-io:commons-io:2.5")
|
||||
api ("com.flowpowered:flow-math:1.0.3")
|
||||
api ("org.spongepowered:configurate-hocon:4.1.1")
|
||||
api ("org.spongepowered:configurate-gson:4.1.1")
|
||||
api ("com.github.Querz:NBT:4.0")
|
||||
api ("org.apache.commons:commons-dbcp2:2.9.0")
|
||||
|
||||
compileOnly ("org.jetbrains:annotations:16.0.2")
|
||||
api ("de.bluecolored.bluemap.api:BlueMapAPI")
|
||||
|
||||
compileOnly ("org.jetbrains:annotations:23.0.0")
|
||||
|
||||
testImplementation ("org.junit.jupiter:junit-jupiter:5.8.2")
|
||||
testRuntimeOnly ("org.junit.jupiter:junit-jupiter-engine:5.8.2")
|
||||
|
|
|
@ -24,7 +24,7 @@
|
|||
*/
|
||||
package de.bluecolored.bluemap.core;
|
||||
|
||||
import de.bluecolored.bluemap.core.debug.DebugDump;
|
||||
import de.bluecolored.bluemap.api.debug.DebugDump;
|
||||
import de.bluecolored.bluemap.core.util.Lazy;
|
||||
|
||||
import java.util.Arrays;
|
||||
|
|
|
@ -1,42 +0,0 @@
|
|||
/*
|
||||
* This file is part of BlueMap, licensed under the MIT License (MIT).
|
||||
*
|
||||
* Copyright (c) Blue (Lukas Rieger) <https://bluecolored.de>
|
||||
* Copyright (c) contributors
|
||||
*
|
||||
* Permission is hereby granted, free of charge, to any person obtaining a copy
|
||||
* of this software and associated documentation files (the "Software"), to deal
|
||||
* in the Software without restriction, including without limitation the rights
|
||||
* to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
||||
* copies of the Software, and to permit persons to whom the Software is
|
||||
* furnished to do so, subject to the following conditions:
|
||||
*
|
||||
* The above copyright notice and this permission notice shall be included in
|
||||
* all copies or substantial portions of the Software.
|
||||
*
|
||||
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
||||
* IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
||||
* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
||||
* AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
||||
* LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
||||
* OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
|
||||
* THE SOFTWARE.
|
||||
*/
|
||||
package de.bluecolored.bluemap.core.debug;
|
||||
|
||||
import java.lang.annotation.ElementType;
|
||||
import java.lang.annotation.Retention;
|
||||
import java.lang.annotation.RetentionPolicy;
|
||||
import java.lang.annotation.Target;
|
||||
|
||||
@Retention(RetentionPolicy.RUNTIME)
|
||||
@Target({
|
||||
ElementType.METHOD,
|
||||
ElementType.FIELD,
|
||||
ElementType.TYPE
|
||||
})
|
||||
public @interface DebugDump {
|
||||
|
||||
String value() default "";
|
||||
|
||||
}
|
|
@ -24,6 +24,7 @@
|
|||
*/
|
||||
package de.bluecolored.bluemap.core.debug;
|
||||
|
||||
import de.bluecolored.bluemap.api.debug.DebugDump;
|
||||
import de.bluecolored.bluemap.core.BlueMap;
|
||||
import org.spongepowered.configurate.ConfigurationNode;
|
||||
import org.spongepowered.configurate.ConfigurationOptions;
|
||||
|
|
|
@ -25,7 +25,8 @@
|
|||
package de.bluecolored.bluemap.core.map;
|
||||
|
||||
import com.flowpowered.math.vector.Vector2i;
|
||||
import de.bluecolored.bluemap.core.debug.DebugDump;
|
||||
import de.bluecolored.bluemap.api.marker.MarkerSet;
|
||||
import de.bluecolored.bluemap.api.debug.DebugDump;
|
||||
import de.bluecolored.bluemap.core.logger.Logger;
|
||||
import de.bluecolored.bluemap.core.map.hires.HiresModelManager;
|
||||
import de.bluecolored.bluemap.core.map.hires.HiresTileMeta;
|
||||
|
@ -40,8 +41,10 @@
|
|||
import de.bluecolored.bluemap.core.world.World;
|
||||
|
||||
import java.io.*;
|
||||
import java.util.Map;
|
||||
import java.util.Objects;
|
||||
import java.util.Optional;
|
||||
import java.util.concurrent.ConcurrentHashMap;
|
||||
import java.util.function.Predicate;
|
||||
|
||||
@DebugDump
|
||||
|
@ -61,6 +64,8 @@ public class BmMap {
|
|||
private final HiresModelManager hiresModelManager;
|
||||
private final LowresModelManager lowresModelManager;
|
||||
|
||||
private final Map<String, MarkerSet> markerSets;
|
||||
|
||||
private Predicate<Vector2i> tileFilter;
|
||||
|
||||
private long renderTimeSumNanos;
|
||||
|
@ -98,6 +103,8 @@ public BmMap(String id, String name, String worldId, World world, Storage storag
|
|||
|
||||
this.tileFilter = t -> true;
|
||||
|
||||
this.markerSets = new ConcurrentHashMap<>();
|
||||
|
||||
this.renderTimeSumNanos = 0;
|
||||
this.tilesRendered = 0;
|
||||
|
||||
|
@ -211,6 +218,10 @@ public LowresModelManager getLowresModelManager() {
|
|||
return lowresModelManager;
|
||||
}
|
||||
|
||||
public Map<String, MarkerSet> getMarkerSets() {
|
||||
return markerSets;
|
||||
}
|
||||
|
||||
public Predicate<Vector2i> getTileFilter() {
|
||||
return tileFilter;
|
||||
}
|
||||
|
|
|
@ -25,7 +25,7 @@
|
|||
package de.bluecolored.bluemap.core.map;
|
||||
|
||||
import com.flowpowered.math.vector.Vector2i;
|
||||
import de.bluecolored.bluemap.core.debug.DebugDump;
|
||||
import de.bluecolored.bluemap.api.debug.DebugDump;
|
||||
|
||||
import java.io.*;
|
||||
import java.util.HashMap;
|
||||
|
|
|
@ -1,7 +1,7 @@
|
|||
package de.bluecolored.bluemap.core.map;
|
||||
|
||||
import com.google.gson.JsonIOException;
|
||||
import de.bluecolored.bluemap.core.debug.DebugDump;
|
||||
import de.bluecolored.bluemap.api.debug.DebugDump;
|
||||
import de.bluecolored.bluemap.core.resources.ResourcePath;
|
||||
import de.bluecolored.bluemap.core.resources.adapter.ResourcesGson;
|
||||
import de.bluecolored.bluemap.core.resources.resourcepack.ResourcePack;
|
||||
|
|
|
@ -29,7 +29,7 @@
|
|||
import com.github.benmanes.caffeine.cache.Caffeine;
|
||||
import com.github.benmanes.caffeine.cache.LoadingCache;
|
||||
import de.bluecolored.bluemap.core.BlueMap;
|
||||
import de.bluecolored.bluemap.core.debug.DebugDump;
|
||||
import de.bluecolored.bluemap.api.debug.DebugDump;
|
||||
import de.bluecolored.bluemap.core.logger.Logger;
|
||||
import de.bluecolored.bluemap.core.world.Grid;
|
||||
import de.bluecolored.bluemap.core.world.World;
|
||||
|
|
|
@ -26,7 +26,7 @@
|
|||
|
||||
import com.flowpowered.math.GenericMath;
|
||||
import com.google.gson.stream.JsonReader;
|
||||
import de.bluecolored.bluemap.core.debug.DebugDump;
|
||||
import de.bluecolored.bluemap.api.debug.DebugDump;
|
||||
import de.bluecolored.bluemap.core.util.ConfigUtils;
|
||||
import de.bluecolored.bluemap.core.util.math.Color;
|
||||
import de.bluecolored.bluemap.core.world.Biome;
|
||||
|
|
|
@ -25,7 +25,7 @@
|
|||
package de.bluecolored.bluemap.core.resources;
|
||||
|
||||
import com.google.gson.stream.JsonReader;
|
||||
import de.bluecolored.bluemap.core.debug.DebugDump;
|
||||
import de.bluecolored.bluemap.api.debug.DebugDump;
|
||||
import de.bluecolored.bluemap.core.world.BlockProperties;
|
||||
import de.bluecolored.bluemap.core.world.BlockState;
|
||||
|
||||
|
|
|
@ -24,7 +24,7 @@
|
|||
*/
|
||||
package de.bluecolored.bluemap.core.resources;
|
||||
|
||||
import de.bluecolored.bluemap.core.debug.DebugDump;
|
||||
import de.bluecolored.bluemap.api.debug.DebugDump;
|
||||
import de.bluecolored.bluemap.core.world.BlockState;
|
||||
|
||||
import java.util.Map.Entry;
|
||||
|
|
|
@ -7,7 +7,7 @@
|
|||
import com.google.gson.reflect.TypeToken;
|
||||
import com.google.gson.stream.JsonReader;
|
||||
import com.google.gson.stream.JsonWriter;
|
||||
import de.bluecolored.bluemap.core.debug.DebugDump;
|
||||
import de.bluecolored.bluemap.api.debug.DebugDump;
|
||||
import de.bluecolored.bluemap.core.util.Key;
|
||||
import org.jetbrains.annotations.Nullable;
|
||||
|
||||
|
|
|
@ -25,7 +25,7 @@
|
|||
package de.bluecolored.bluemap.core.resources.biome;
|
||||
|
||||
import com.google.gson.stream.JsonReader;
|
||||
import de.bluecolored.bluemap.core.debug.DebugDump;
|
||||
import de.bluecolored.bluemap.api.debug.DebugDump;
|
||||
import de.bluecolored.bluemap.core.resources.adapter.ResourcesGson;
|
||||
import de.bluecolored.bluemap.core.resources.biome.datapack.DpBiome;
|
||||
import de.bluecolored.bluemap.core.world.Biome;
|
||||
|
|
|
@ -5,7 +5,7 @@
|
|||
import com.google.gson.JsonElement;
|
||||
import com.google.gson.JsonObject;
|
||||
import de.bluecolored.bluemap.core.BlueMap;
|
||||
import de.bluecolored.bluemap.core.debug.DebugDump;
|
||||
import de.bluecolored.bluemap.api.debug.DebugDump;
|
||||
import de.bluecolored.bluemap.core.logger.Logger;
|
||||
import de.bluecolored.bluemap.core.resources.BlockColorCalculatorFactory;
|
||||
import de.bluecolored.bluemap.core.resources.BlockPropertiesConfig;
|
||||
|
|
|
@ -1,6 +1,6 @@
|
|||
package de.bluecolored.bluemap.core.resources.resourcepack.blockmodel;
|
||||
|
||||
import de.bluecolored.bluemap.core.debug.DebugDump;
|
||||
import de.bluecolored.bluemap.api.debug.DebugDump;
|
||||
import de.bluecolored.bluemap.core.resources.ResourcePath;
|
||||
import de.bluecolored.bluemap.core.resources.resourcepack.ResourcePack;
|
||||
import de.bluecolored.bluemap.core.resources.resourcepack.texture.Texture;
|
||||
|
|
|
@ -6,7 +6,7 @@
|
|||
import com.google.gson.annotations.JsonAdapter;
|
||||
import com.google.gson.reflect.TypeToken;
|
||||
import com.google.gson.stream.JsonReader;
|
||||
import de.bluecolored.bluemap.core.debug.DebugDump;
|
||||
import de.bluecolored.bluemap.api.debug.DebugDump;
|
||||
import de.bluecolored.bluemap.core.resources.AbstractTypeAdapterFactory;
|
||||
import de.bluecolored.bluemap.core.resources.resourcepack.ResourcePack;
|
||||
import de.bluecolored.bluemap.core.util.Direction;
|
||||
|
|
|
@ -1,7 +1,7 @@
|
|||
package de.bluecolored.bluemap.core.resources.resourcepack.blockmodel;
|
||||
|
||||
import com.flowpowered.math.vector.Vector4f;
|
||||
import de.bluecolored.bluemap.core.debug.DebugDump;
|
||||
import de.bluecolored.bluemap.api.debug.DebugDump;
|
||||
import de.bluecolored.bluemap.core.resources.resourcepack.ResourcePack;
|
||||
import de.bluecolored.bluemap.core.util.Direction;
|
||||
|
||||
|
|
|
@ -7,7 +7,7 @@
|
|||
import com.google.gson.annotations.JsonAdapter;
|
||||
import com.google.gson.reflect.TypeToken;
|
||||
import com.google.gson.stream.JsonReader;
|
||||
import de.bluecolored.bluemap.core.debug.DebugDump;
|
||||
import de.bluecolored.bluemap.api.debug.DebugDump;
|
||||
import de.bluecolored.bluemap.core.resources.AbstractTypeAdapterFactory;
|
||||
import de.bluecolored.bluemap.core.util.math.Axis;
|
||||
import de.bluecolored.bluemap.core.util.math.MatrixM4f;
|
||||
|
|
|
@ -4,7 +4,7 @@
|
|||
import com.google.gson.annotations.JsonAdapter;
|
||||
import com.google.gson.stream.JsonReader;
|
||||
import com.google.gson.stream.JsonWriter;
|
||||
import de.bluecolored.bluemap.core.debug.DebugDump;
|
||||
import de.bluecolored.bluemap.api.debug.DebugDump;
|
||||
import de.bluecolored.bluemap.core.resources.ResourcePath;
|
||||
import de.bluecolored.bluemap.core.resources.resourcepack.ResourcePack;
|
||||
import de.bluecolored.bluemap.core.resources.resourcepack.texture.Texture;
|
||||
|
|
|
@ -1,6 +1,6 @@
|
|||
package de.bluecolored.bluemap.core.resources.resourcepack.blockstate;
|
||||
|
||||
import de.bluecolored.bluemap.core.debug.DebugDump;
|
||||
import de.bluecolored.bluemap.api.debug.DebugDump;
|
||||
import org.jetbrains.annotations.Nullable;
|
||||
|
||||
import java.util.function.Consumer;
|
||||
|
|
|
@ -25,7 +25,7 @@
|
|||
package de.bluecolored.bluemap.core.resources.resourcepack.blockstate;
|
||||
|
||||
|
||||
import de.bluecolored.bluemap.core.debug.DebugDump;
|
||||
import de.bluecolored.bluemap.api.debug.DebugDump;
|
||||
import de.bluecolored.bluemap.core.util.Preconditions;
|
||||
import de.bluecolored.bluemap.core.world.BlockState;
|
||||
|
||||
|
|
|
@ -3,7 +3,7 @@
|
|||
import com.google.gson.Gson;
|
||||
import com.google.gson.annotations.JsonAdapter;
|
||||
import com.google.gson.stream.JsonReader;
|
||||
import de.bluecolored.bluemap.core.debug.DebugDump;
|
||||
import de.bluecolored.bluemap.api.debug.DebugDump;
|
||||
import de.bluecolored.bluemap.core.resources.AbstractTypeAdapterFactory;
|
||||
import de.bluecolored.bluemap.core.resources.adapter.ResourcesGson;
|
||||
import de.bluecolored.bluemap.core.world.BlockState;
|
||||
|
|
|
@ -4,7 +4,7 @@
|
|||
import com.google.gson.annotations.JsonAdapter;
|
||||
import com.google.gson.reflect.TypeToken;
|
||||
import com.google.gson.stream.JsonReader;
|
||||
import de.bluecolored.bluemap.core.debug.DebugDump;
|
||||
import de.bluecolored.bluemap.api.debug.DebugDump;
|
||||
import de.bluecolored.bluemap.core.resources.AbstractTypeAdapterFactory;
|
||||
import de.bluecolored.bluemap.core.resources.ResourcePath;
|
||||
import de.bluecolored.bluemap.core.resources.resourcepack.ResourcePack;
|
||||
|
|
|
@ -5,7 +5,7 @@
|
|||
import com.google.gson.reflect.TypeToken;
|
||||
import com.google.gson.stream.JsonReader;
|
||||
import com.google.gson.stream.JsonToken;
|
||||
import de.bluecolored.bluemap.core.debug.DebugDump;
|
||||
import de.bluecolored.bluemap.api.debug.DebugDump;
|
||||
import de.bluecolored.bluemap.core.resources.AbstractTypeAdapterFactory;
|
||||
|
||||
import java.io.IOException;
|
||||
|
|
|
@ -3,7 +3,7 @@
|
|||
import com.google.gson.Gson;
|
||||
import com.google.gson.annotations.JsonAdapter;
|
||||
import com.google.gson.stream.JsonReader;
|
||||
import de.bluecolored.bluemap.core.debug.DebugDump;
|
||||
import de.bluecolored.bluemap.api.debug.DebugDump;
|
||||
import de.bluecolored.bluemap.core.logger.Logger;
|
||||
import de.bluecolored.bluemap.core.resources.AbstractTypeAdapterFactory;
|
||||
import de.bluecolored.bluemap.core.world.BlockState;
|
||||
|
|
|
@ -1,6 +1,6 @@
|
|||
package de.bluecolored.bluemap.core.resources.resourcepack.texture;
|
||||
|
||||
import de.bluecolored.bluemap.core.debug.DebugDump;
|
||||
import de.bluecolored.bluemap.api.debug.DebugDump;
|
||||
import de.bluecolored.bluemap.core.resources.ResourcePath;
|
||||
import de.bluecolored.bluemap.core.util.math.Color;
|
||||
|
||||
|
|
|
@ -25,7 +25,7 @@
|
|||
package de.bluecolored.bluemap.core.storage.file;
|
||||
|
||||
import com.flowpowered.math.vector.Vector2i;
|
||||
import de.bluecolored.bluemap.core.debug.DebugDump;
|
||||
import de.bluecolored.bluemap.api.debug.DebugDump;
|
||||
import de.bluecolored.bluemap.core.storage.*;
|
||||
import de.bluecolored.bluemap.core.util.AtomicFileHelper;
|
||||
import de.bluecolored.bluemap.core.util.DeletingPathVisitor;
|
||||
|
|
|
@ -1,6 +1,6 @@
|
|||
package de.bluecolored.bluemap.core.util;
|
||||
|
||||
import de.bluecolored.bluemap.core.debug.DebugDump;
|
||||
import de.bluecolored.bluemap.api.debug.DebugDump;
|
||||
import de.bluecolored.bluemap.core.resources.ResourcePath;
|
||||
|
||||
@DebugDump
|
||||
|
|
|
@ -24,7 +24,7 @@
|
|||
*/
|
||||
package de.bluecolored.bluemap.core.util;
|
||||
|
||||
import de.bluecolored.bluemap.core.debug.DebugDump;
|
||||
import de.bluecolored.bluemap.api.debug.DebugDump;
|
||||
|
||||
import java.util.Objects;
|
||||
import java.util.function.Supplier;
|
||||
|
|
|
@ -24,7 +24,7 @@
|
|||
*/
|
||||
package de.bluecolored.bluemap.core.util.math;
|
||||
|
||||
import de.bluecolored.bluemap.core.debug.DebugDump;
|
||||
import de.bluecolored.bluemap.api.debug.DebugDump;
|
||||
|
||||
@DebugDump
|
||||
public class Color {
|
||||
|
|
|
@ -24,7 +24,7 @@
|
|||
*/
|
||||
package de.bluecolored.bluemap.core.world;
|
||||
|
||||
import de.bluecolored.bluemap.core.debug.DebugDump;
|
||||
import de.bluecolored.bluemap.api.debug.DebugDump;
|
||||
import de.bluecolored.bluemap.core.util.Key;
|
||||
import de.bluecolored.bluemap.core.util.math.Color;
|
||||
|
||||
|
|
|
@ -24,7 +24,7 @@
|
|||
*/
|
||||
package de.bluecolored.bluemap.core.world;
|
||||
|
||||
import de.bluecolored.bluemap.core.debug.DebugDump;
|
||||
import de.bluecolored.bluemap.api.debug.DebugDump;
|
||||
import de.bluecolored.bluemap.core.util.Tristate;
|
||||
|
||||
@DebugDump
|
||||
|
|
|
@ -24,7 +24,7 @@
|
|||
*/
|
||||
package de.bluecolored.bluemap.core.world;
|
||||
|
||||
import de.bluecolored.bluemap.core.debug.DebugDump;
|
||||
import de.bluecolored.bluemap.api.debug.DebugDump;
|
||||
import de.bluecolored.bluemap.core.util.Key;
|
||||
import org.jetbrains.annotations.NotNull;
|
||||
|
||||
|
|
|
@ -43,6 +43,8 @@
|
|||
import net.fabricmc.fabric.api.event.lifecycle.v1.ServerTickEvents;
|
||||
import net.minecraft.server.MinecraftServer;
|
||||
import net.minecraft.server.network.ServerPlayerEntity;
|
||||
import net.minecraft.util.Identifier;
|
||||
import net.minecraft.world.dimension.DimensionType;
|
||||
import org.apache.logging.log4j.LogManager;
|
||||
|
||||
import java.io.IOException;
|
||||
|
@ -142,6 +144,27 @@ public Collection<ServerWorld> getLoadedWorlds() {
|
|||
return loadedWorlds;
|
||||
}
|
||||
|
||||
@Override
|
||||
public Optional<ServerWorld> getWorld(Object world) {
|
||||
if (world instanceof Path)
|
||||
return getWorld((Path) world);
|
||||
|
||||
if (world instanceof Identifier) {
|
||||
DimensionType dimensionType = DimensionType.byId((Identifier) world);
|
||||
if (dimensionType != null) world = dimensionType;
|
||||
}
|
||||
|
||||
if (world instanceof DimensionType) {
|
||||
var serverWorld = serverInstance.getWorld((DimensionType) world);
|
||||
if (serverWorld != null) world = serverWorld;
|
||||
}
|
||||
|
||||
if (world instanceof net.minecraft.server.world.ServerWorld)
|
||||
return Optional.of(getWorld((net.minecraft.server.world.ServerWorld) world));
|
||||
|
||||
return Optional.empty();
|
||||
}
|
||||
|
||||
public ServerWorld getWorld(net.minecraft.server.world.ServerWorld serverWorld) {
|
||||
return worlds.get(serverWorld);
|
||||
}
|
||||
|
|
|
@ -43,6 +43,8 @@
|
|||
import net.fabricmc.fabric.api.event.lifecycle.v1.ServerTickEvents;
|
||||
import net.minecraft.server.MinecraftServer;
|
||||
import net.minecraft.server.network.ServerPlayerEntity;
|
||||
import net.minecraft.util.registry.RegistryKey;
|
||||
import net.minecraft.world.World;
|
||||
import org.apache.logging.log4j.LogManager;
|
||||
|
||||
import java.io.IOException;
|
||||
|
@ -142,6 +144,24 @@ public Collection<ServerWorld> getLoadedWorlds() {
|
|||
return loadedWorlds;
|
||||
}
|
||||
|
||||
@SuppressWarnings("unchecked")
|
||||
@Override
|
||||
public Optional<ServerWorld> getWorld(Object world) {
|
||||
if (world instanceof Path)
|
||||
return getWorld((Path) world);
|
||||
|
||||
if (world instanceof RegistryKey) {
|
||||
try {
|
||||
world = serverInstance.getWorld((RegistryKey<World>) world);
|
||||
} catch (ClassCastException ignored) {}
|
||||
}
|
||||
|
||||
if (world instanceof net.minecraft.server.world.ServerWorld)
|
||||
return Optional.of(getWorld((net.minecraft.server.world.ServerWorld) world));
|
||||
|
||||
return Optional.empty();
|
||||
}
|
||||
|
||||
public ServerWorld getWorld(net.minecraft.server.world.ServerWorld serverWorld) {
|
||||
return worlds.get(serverWorld);
|
||||
}
|
||||
|
|
|
@ -43,6 +43,8 @@
|
|||
import net.fabricmc.fabric.api.event.lifecycle.v1.ServerTickEvents;
|
||||
import net.minecraft.server.MinecraftServer;
|
||||
import net.minecraft.server.network.ServerPlayerEntity;
|
||||
import net.minecraft.util.registry.RegistryKey;
|
||||
import net.minecraft.world.World;
|
||||
import org.apache.logging.log4j.LogManager;
|
||||
|
||||
import java.io.IOException;
|
||||
|
@ -142,6 +144,24 @@ public Collection<ServerWorld> getLoadedWorlds() {
|
|||
return loadedWorlds;
|
||||
}
|
||||
|
||||
@SuppressWarnings("unchecked")
|
||||
@Override
|
||||
public Optional<ServerWorld> getWorld(Object world) {
|
||||
if (world instanceof Path)
|
||||
return getWorld((Path) world);
|
||||
|
||||
if (world instanceof RegistryKey) {
|
||||
try {
|
||||
world = serverInstance.getWorld((RegistryKey<World>) world);
|
||||
} catch (ClassCastException ignored) {}
|
||||
}
|
||||
|
||||
if (world instanceof net.minecraft.server.world.ServerWorld)
|
||||
return Optional.of(getWorld((net.minecraft.server.world.ServerWorld) world));
|
||||
|
||||
return Optional.empty();
|
||||
}
|
||||
|
||||
public ServerWorld getWorld(net.minecraft.server.world.ServerWorld serverWorld) {
|
||||
return worlds.get(serverWorld);
|
||||
}
|
||||
|
|
|
@ -43,6 +43,8 @@
|
|||
import net.fabricmc.fabric.api.event.lifecycle.v1.ServerTickEvents;
|
||||
import net.minecraft.server.MinecraftServer;
|
||||
import net.minecraft.server.network.ServerPlayerEntity;
|
||||
import net.minecraft.util.registry.RegistryKey;
|
||||
import net.minecraft.world.World;
|
||||
import org.apache.logging.log4j.LogManager;
|
||||
|
||||
import java.io.IOException;
|
||||
|
@ -142,6 +144,24 @@ public Collection<ServerWorld> getLoadedWorlds() {
|
|||
return loadedWorlds;
|
||||
}
|
||||
|
||||
@SuppressWarnings("unchecked")
|
||||
@Override
|
||||
public Optional<ServerWorld> getWorld(Object world) {
|
||||
if (world instanceof Path)
|
||||
return getWorld((Path) world);
|
||||
|
||||
if (world instanceof RegistryKey) {
|
||||
try {
|
||||
world = serverInstance.getWorld((RegistryKey<World>) world);
|
||||
} catch (ClassCastException ignored) {}
|
||||
}
|
||||
|
||||
if (world instanceof net.minecraft.server.world.ServerWorld)
|
||||
return Optional.of(getWorld((net.minecraft.server.world.ServerWorld) world));
|
||||
|
||||
return Optional.empty();
|
||||
}
|
||||
|
||||
public ServerWorld getWorld(net.minecraft.server.world.ServerWorld serverWorld) {
|
||||
return worlds.get(serverWorld);
|
||||
}
|
||||
|
|
|
@ -43,6 +43,8 @@
|
|||
import net.fabricmc.fabric.api.event.lifecycle.v1.ServerTickEvents;
|
||||
import net.minecraft.server.MinecraftServer;
|
||||
import net.minecraft.server.network.ServerPlayerEntity;
|
||||
import net.minecraft.util.registry.RegistryKey;
|
||||
import net.minecraft.world.World;
|
||||
import org.apache.logging.log4j.LogManager;
|
||||
|
||||
import java.io.IOException;
|
||||
|
@ -142,6 +144,24 @@ public Collection<ServerWorld> getLoadedWorlds() {
|
|||
return loadedWorlds;
|
||||
}
|
||||
|
||||
@SuppressWarnings("unchecked")
|
||||
@Override
|
||||
public Optional<ServerWorld> getWorld(Object world) {
|
||||
if (world instanceof Path)
|
||||
return getWorld((Path) world);
|
||||
|
||||
if (world instanceof RegistryKey) {
|
||||
try {
|
||||
world = serverInstance.getWorld((RegistryKey<World>) world);
|
||||
} catch (ClassCastException ignored) {}
|
||||
}
|
||||
|
||||
if (world instanceof net.minecraft.server.world.ServerWorld)
|
||||
return Optional.of(getWorld((net.minecraft.server.world.ServerWorld) world));
|
||||
|
||||
return Optional.empty();
|
||||
}
|
||||
|
||||
public ServerWorld getWorld(net.minecraft.server.world.ServerWorld serverWorld) {
|
||||
return worlds.get(serverWorld);
|
||||
}
|
||||
|
|
|
@ -43,6 +43,8 @@
|
|||
import net.fabricmc.fabric.api.event.lifecycle.v1.ServerTickEvents;
|
||||
import net.minecraft.server.MinecraftServer;
|
||||
import net.minecraft.server.network.ServerPlayerEntity;
|
||||
import net.minecraft.util.registry.RegistryKey;
|
||||
import net.minecraft.world.World;
|
||||
import org.apache.logging.log4j.LogManager;
|
||||
|
||||
import java.io.IOException;
|
||||
|
@ -142,6 +144,24 @@ public Collection<ServerWorld> getLoadedWorlds() {
|
|||
return loadedWorlds;
|
||||
}
|
||||
|
||||
@SuppressWarnings("unchecked")
|
||||
@Override
|
||||
public Optional<ServerWorld> getWorld(Object world) {
|
||||
if (world instanceof Path)
|
||||
return getWorld((Path) world);
|
||||
|
||||
if (world instanceof RegistryKey) {
|
||||
try {
|
||||
world = serverInstance.getWorld((RegistryKey<World>) world);
|
||||
} catch (ClassCastException ignored) {}
|
||||
}
|
||||
|
||||
if (world instanceof net.minecraft.server.world.ServerWorld)
|
||||
return Optional.of(getWorld((net.minecraft.server.world.ServerWorld) world));
|
||||
|
||||
return Optional.empty();
|
||||
}
|
||||
|
||||
public ServerWorld getWorld(net.minecraft.server.world.ServerWorld serverWorld) {
|
||||
return worlds.get(serverWorld);
|
||||
}
|
||||
|
|
|
@ -38,6 +38,8 @@
|
|||
import net.minecraft.entity.player.PlayerEntity;
|
||||
import net.minecraft.entity.player.ServerPlayerEntity;
|
||||
import net.minecraft.server.MinecraftServer;
|
||||
import net.minecraft.util.ResourceLocation;
|
||||
import net.minecraft.world.dimension.DimensionType;
|
||||
import net.minecraftforge.common.MinecraftForge;
|
||||
import net.minecraftforge.event.TickEvent.ServerTickEvent;
|
||||
import net.minecraftforge.event.entity.player.PlayerEvent.PlayerLoggedInEvent;
|
||||
|
@ -155,6 +157,28 @@ public Collection<ServerWorld> getLoadedWorlds() {
|
|||
return loadedWorlds;
|
||||
}
|
||||
|
||||
@Override
|
||||
public Optional<ServerWorld> getWorld(Object world) {
|
||||
if (world instanceof Path)
|
||||
return getWorld((Path) world);
|
||||
|
||||
if (world instanceof ResourceLocation) {
|
||||
DimensionType dimensionType = DimensionType.byName((ResourceLocation) world);
|
||||
if (dimensionType != null) world = dimensionType;
|
||||
}
|
||||
|
||||
if (world instanceof DimensionType) {
|
||||
var serverWorld = serverInstance.getWorld((DimensionType) world);
|
||||
//noinspection ConstantConditions
|
||||
if (serverWorld != null) world = serverWorld;
|
||||
}
|
||||
|
||||
if (world instanceof net.minecraft.world.server.ServerWorld)
|
||||
return Optional.of(getWorld((net.minecraft.world.server.ServerWorld) world));
|
||||
|
||||
return Optional.empty();
|
||||
}
|
||||
|
||||
public ServerWorld getWorld(net.minecraft.world.server.ServerWorld world) {
|
||||
return worlds.get(world);
|
||||
}
|
||||
|
|
|
@ -38,6 +38,8 @@
|
|||
import net.minecraft.entity.player.PlayerEntity;
|
||||
import net.minecraft.entity.player.ServerPlayerEntity;
|
||||
import net.minecraft.server.MinecraftServer;
|
||||
import net.minecraft.util.ResourceLocation;
|
||||
import net.minecraft.world.dimension.DimensionType;
|
||||
import net.minecraftforge.common.MinecraftForge;
|
||||
import net.minecraftforge.event.TickEvent.ServerTickEvent;
|
||||
import net.minecraftforge.event.entity.player.PlayerEvent.PlayerLoggedInEvent;
|
||||
|
@ -155,6 +157,28 @@ public Collection<ServerWorld> getLoadedWorlds() {
|
|||
return loadedWorlds;
|
||||
}
|
||||
|
||||
@Override
|
||||
public Optional<ServerWorld> getWorld(Object world) {
|
||||
if (world instanceof Path)
|
||||
return getWorld((Path) world);
|
||||
|
||||
if (world instanceof ResourceLocation) {
|
||||
DimensionType dimensionType = DimensionType.byName((ResourceLocation) world);
|
||||
if (dimensionType != null) world = dimensionType;
|
||||
}
|
||||
|
||||
if (world instanceof DimensionType) {
|
||||
var serverWorld = serverInstance.getWorld((DimensionType) world);
|
||||
//noinspection ConstantConditions
|
||||
if (serverWorld != null) world = serverWorld;
|
||||
}
|
||||
|
||||
if (world instanceof net.minecraft.world.server.ServerWorld)
|
||||
return Optional.of(getWorld((net.minecraft.world.server.ServerWorld) world));
|
||||
|
||||
return Optional.empty();
|
||||
}
|
||||
|
||||
public ServerWorld getWorld(net.minecraft.world.server.ServerWorld world) {
|
||||
return worlds.get(world);
|
||||
}
|
||||
|
|
|
@ -38,6 +38,8 @@
|
|||
import net.minecraft.entity.player.PlayerEntity;
|
||||
import net.minecraft.entity.player.ServerPlayerEntity;
|
||||
import net.minecraft.server.MinecraftServer;
|
||||
import net.minecraft.util.RegistryKey;
|
||||
import net.minecraft.world.World;
|
||||
import net.minecraftforge.common.MinecraftForge;
|
||||
import net.minecraftforge.event.TickEvent.ServerTickEvent;
|
||||
import net.minecraftforge.event.entity.player.PlayerEvent.PlayerLoggedInEvent;
|
||||
|
@ -155,6 +157,24 @@ public Collection<ServerWorld> getLoadedWorlds() {
|
|||
return loadedWorlds;
|
||||
}
|
||||
|
||||
@SuppressWarnings("unchecked")
|
||||
@Override
|
||||
public Optional<ServerWorld> getWorld(Object world) {
|
||||
if (world instanceof Path)
|
||||
return getWorld((Path) world);
|
||||
|
||||
if (world instanceof RegistryKey) {
|
||||
try {
|
||||
world = serverInstance.getWorld((RegistryKey<World>) world);
|
||||
} catch (ClassCastException ignored) {}
|
||||
}
|
||||
|
||||
if (world instanceof net.minecraft.world.server.ServerWorld)
|
||||
return Optional.of(getWorld((net.minecraft.world.server.ServerWorld) world));
|
||||
|
||||
return Optional.empty();
|
||||
}
|
||||
|
||||
public ServerWorld getWorld(net.minecraft.world.server.ServerWorld world) {
|
||||
return worlds.get(world);
|
||||
}
|
||||
|
|
|
@ -35,9 +35,11 @@
|
|||
import de.bluecolored.bluemap.core.BlueMap;
|
||||
import de.bluecolored.bluemap.core.MinecraftVersion;
|
||||
import de.bluecolored.bluemap.core.logger.Logger;
|
||||
import net.minecraft.resources.ResourceKey;
|
||||
import net.minecraft.server.MinecraftServer;
|
||||
import net.minecraft.server.level.ServerLevel;
|
||||
import net.minecraft.server.level.ServerPlayer;
|
||||
import net.minecraft.world.level.Level;
|
||||
import net.minecraftforge.common.MinecraftForge;
|
||||
import net.minecraftforge.event.TickEvent.ServerTickEvent;
|
||||
import net.minecraftforge.event.entity.player.PlayerEvent.PlayerLoggedInEvent;
|
||||
|
@ -154,6 +156,24 @@ public Collection<ServerWorld> getLoadedWorlds() {
|
|||
return loadedWorlds;
|
||||
}
|
||||
|
||||
@SuppressWarnings("unchecked")
|
||||
@Override
|
||||
public Optional<ServerWorld> getWorld(Object world) {
|
||||
if (world instanceof Path)
|
||||
return getWorld((Path) world);
|
||||
|
||||
if (world instanceof ResourceKey) {
|
||||
try {
|
||||
world = serverInstance.getLevel((ResourceKey<Level>) world);
|
||||
} catch (ClassCastException ignored) {}
|
||||
}
|
||||
|
||||
if (world instanceof ServerLevel)
|
||||
return Optional.of(getWorld((ServerLevel) world));
|
||||
|
||||
return Optional.empty();
|
||||
}
|
||||
|
||||
public ServerWorld getWorld(ServerLevel world) {
|
||||
return worlds.get(world);
|
||||
}
|
||||
|
|
|
@ -35,9 +35,11 @@
|
|||
import de.bluecolored.bluemap.core.BlueMap;
|
||||
import de.bluecolored.bluemap.core.MinecraftVersion;
|
||||
import de.bluecolored.bluemap.core.logger.Logger;
|
||||
import net.minecraft.resources.ResourceKey;
|
||||
import net.minecraft.server.MinecraftServer;
|
||||
import net.minecraft.server.level.ServerLevel;
|
||||
import net.minecraft.server.level.ServerPlayer;
|
||||
import net.minecraft.world.level.Level;
|
||||
import net.minecraftforge.common.MinecraftForge;
|
||||
import net.minecraftforge.event.TickEvent.ServerTickEvent;
|
||||
import net.minecraftforge.event.entity.player.PlayerEvent.PlayerLoggedInEvent;
|
||||
|
@ -154,6 +156,24 @@ public Collection<ServerWorld> getLoadedWorlds() {
|
|||
return loadedWorlds;
|
||||
}
|
||||
|
||||
@SuppressWarnings("unchecked")
|
||||
@Override
|
||||
public Optional<ServerWorld> getWorld(Object world) {
|
||||
if (world instanceof Path)
|
||||
return getWorld((Path) world);
|
||||
|
||||
if (world instanceof ResourceKey) {
|
||||
try {
|
||||
world = serverInstance.getLevel((ResourceKey<Level>) world);
|
||||
} catch (ClassCastException ignored) {}
|
||||
}
|
||||
|
||||
if (world instanceof ServerLevel)
|
||||
return Optional.of(getWorld((ServerLevel) world));
|
||||
|
||||
return Optional.empty();
|
||||
}
|
||||
|
||||
public ServerWorld getWorld(ServerLevel world) {
|
||||
return worlds.get(world);
|
||||
}
|
||||
|
|
|
@ -35,9 +35,11 @@
|
|||
import de.bluecolored.bluemap.core.BlueMap;
|
||||
import de.bluecolored.bluemap.core.MinecraftVersion;
|
||||
import de.bluecolored.bluemap.core.logger.Logger;
|
||||
import net.minecraft.resources.ResourceKey;
|
||||
import net.minecraft.server.MinecraftServer;
|
||||
import net.minecraft.server.level.ServerLevel;
|
||||
import net.minecraft.server.level.ServerPlayer;
|
||||
import net.minecraft.world.level.Level;
|
||||
import net.minecraftforge.common.MinecraftForge;
|
||||
import net.minecraftforge.event.TickEvent.ServerTickEvent;
|
||||
import net.minecraftforge.event.entity.player.PlayerEvent.PlayerLoggedInEvent;
|
||||
|
@ -154,6 +156,24 @@ public Collection<ServerWorld> getLoadedWorlds() {
|
|||
return loadedWorlds;
|
||||
}
|
||||
|
||||
@SuppressWarnings("unchecked")
|
||||
@Override
|
||||
public Optional<ServerWorld> getWorld(Object world) {
|
||||
if (world instanceof Path)
|
||||
return getWorld((Path) world);
|
||||
|
||||
if (world instanceof ResourceKey) {
|
||||
try {
|
||||
world = serverInstance.getLevel((ResourceKey<Level>) world);
|
||||
} catch (ClassCastException ignored) {}
|
||||
}
|
||||
|
||||
if (world instanceof ServerLevel)
|
||||
return Optional.of(getWorld((ServerLevel) world));
|
||||
|
||||
return Optional.empty();
|
||||
}
|
||||
|
||||
public ServerWorld getWorld(ServerLevel world) {
|
||||
return worlds.get(world);
|
||||
}
|
||||
|
|
|
@ -190,6 +190,27 @@ public Collection<ServerWorld> getLoadedWorlds() {
|
|||
return loadedWorlds;
|
||||
}
|
||||
|
||||
@Override
|
||||
public Optional<ServerWorld> getWorld(Object world) {
|
||||
if (world instanceof Path)
|
||||
return getWorld((Path) world);
|
||||
|
||||
if (world instanceof String) {
|
||||
var serverWorld = Bukkit.getWorld((String) world);
|
||||
if (serverWorld != null) world = serverWorld;
|
||||
}
|
||||
|
||||
if (world instanceof UUID) {
|
||||
var serverWorld = Bukkit.getWorld((UUID) world);
|
||||
if (serverWorld != null) world = serverWorld;
|
||||
}
|
||||
|
||||
if (world instanceof World)
|
||||
return Optional.of(getWorld((World) world));
|
||||
|
||||
return Optional.empty();
|
||||
}
|
||||
|
||||
public ServerWorld getWorld(World world) {
|
||||
return worlds.get(world);
|
||||
}
|
||||
|
|
|
@ -41,6 +41,7 @@
|
|||
import de.bluecolored.bluemap.sponge.SpongeCommands.SpongeCommandProxy;
|
||||
import org.apache.maven.artifact.versioning.ArtifactVersion;
|
||||
import org.spongepowered.api.Platform;
|
||||
import org.spongepowered.api.ResourceKey;
|
||||
import org.spongepowered.api.Server;
|
||||
import org.spongepowered.api.Sponge;
|
||||
import org.spongepowered.api.command.Command;
|
||||
|
@ -226,6 +227,22 @@ public Collection<ServerWorld> getLoadedWorlds() {
|
|||
return loadedWorlds;
|
||||
}
|
||||
|
||||
@Override
|
||||
public Optional<ServerWorld> getWorld(Object world) {
|
||||
if (world instanceof Path)
|
||||
return getWorld((Path) world);
|
||||
|
||||
if (world instanceof ResourceKey) {
|
||||
var serverWorld = Sponge.server().worldManager().world((ResourceKey) world).orElse(null);
|
||||
if (serverWorld != null) world = serverWorld;
|
||||
}
|
||||
|
||||
if (world instanceof org.spongepowered.api.world.server.ServerWorld)
|
||||
return Optional.of(getWorld((org.spongepowered.api.world.server.ServerWorld) world));
|
||||
|
||||
return Optional.empty();
|
||||
}
|
||||
|
||||
public ServerWorld getWorld(org.spongepowered.api.world.server.ServerWorld world) {
|
||||
return worlds.get(world);
|
||||
}
|
||||
|
|
Loading…
Reference in New Issue
Block a user