Implement BlueMapAPI v2

This commit is contained in:
Lukas Rieger (Blue) 2022-07-24 12:10:00 +02:00
parent c4e7349c54
commit 4da988d31c
No known key found for this signature in database
GPG Key ID: 2D09EC5ED2687FF2
81 changed files with 926 additions and 384 deletions

@ -1 +1 @@
Subproject commit 938621deb030f386c357a8dbee6d648095e7bb18
Subproject commit b466fb4ed8655d0b6212c7343594886753a0c21a

View File

@ -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")

View File

@ -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;

View File

@ -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());
}
}
}

View File

@ -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.");
}
}

View File

@ -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.");
}
}

View File

@ -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;
}
}

View File

@ -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;
}
}

View File

@ -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;

View File

@ -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;

View File

@ -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;

View File

@ -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;

View File

@ -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;

View File

@ -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;

View File

@ -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;

View File

@ -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;

View File

@ -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

View File

@ -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);
}
}

View File

@ -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();

View File

@ -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;

View File

@ -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("<", "&lt;")
.replace(">", "&gt;"); //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;
}
}

View File

@ -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;
}
}

View File

@ -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;

View File

@ -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;

View 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;

View 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 de.bluecolored.bluemap.core.map.BmMap;
import de.bluecolored.bluemap.core.storage.Storage;
import de.bluecolored.bluemap.core.storage.file.FileStorage;

View File

@ -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;

View 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 de.bluecolored.bluemap.core.logger.Logger;
import java.util.*;

View File

@ -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;

View File

@ -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();

View File

@ -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;

View File

@ -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();
}
}
}
}

View File

@ -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)
));
}
}

View File

@ -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;

View File

@ -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")

View File

@ -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;

View File

@ -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 "";
}

View File

@ -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;

View File

@ -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;
}

View File

@ -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;

View File

@ -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;

View File

@ -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;

View File

@ -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;

View File

@ -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;

View File

@ -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;

View File

@ -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;

View File

@ -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;

View File

@ -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;

View File

@ -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;

View File

@ -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;

View File

@ -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;

View File

@ -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;

View File

@ -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;

View File

@ -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;

View File

@ -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;

View File

@ -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;

View File

@ -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;

View File

@ -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;

View File

@ -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;

View File

@ -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;

View File

@ -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;

View File

@ -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

View File

@ -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;

View File

@ -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 {

View File

@ -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;

View File

@ -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

View File

@ -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;

View File

@ -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);
}

View File

@ -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);
}

View File

@ -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);
}

View File

@ -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);
}

View File

@ -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);
}

View File

@ -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);
}

View File

@ -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);
}

View File

@ -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);
}

View File

@ -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);
}

View File

@ -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);
}

View File

@ -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);
}

View File

@ -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);
}

View File

@ -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);
}

View File

@ -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);
}