diff --git a/BlueMapCommon/src/main/java/de/bluecolored/bluemap/common/BlueMapConfiguration.java b/BlueMapCommon/src/main/java/de/bluecolored/bluemap/common/BlueMapConfiguration.java index b21684c9..51406385 100644 --- a/BlueMapCommon/src/main/java/de/bluecolored/bluemap/common/BlueMapConfiguration.java +++ b/BlueMapCommon/src/main/java/de/bluecolored/bluemap/common/BlueMapConfiguration.java @@ -26,10 +26,16 @@ package de.bluecolored.bluemap.common; import de.bluecolored.bluemap.common.config.*; import de.bluecolored.bluemap.common.config.storage.StorageConfig; +import de.bluecolored.bluemap.core.MinecraftVersion; +import org.jetbrains.annotations.Nullable; +import java.nio.file.Path; import java.util.Map; public interface BlueMapConfiguration { + + MinecraftVersion getMinecraftVersion(); + CoreConfig getCoreConfig(); WebappConfig getWebappConfig(); @@ -42,4 +48,8 @@ public interface BlueMapConfiguration { Map getStorageConfigs(); + @Nullable Path getResourcePacksFolder(); + + @Nullable Path getModsFolder(); + } diff --git a/BlueMapCommon/src/main/java/de/bluecolored/bluemap/common/BlueMapService.java b/BlueMapCommon/src/main/java/de/bluecolored/bluemap/common/BlueMapService.java index 9caba6c9..836f4c02 100644 --- a/BlueMapCommon/src/main/java/de/bluecolored/bluemap/common/BlueMapService.java +++ b/BlueMapCommon/src/main/java/de/bluecolored/bluemap/common/BlueMapService.java @@ -46,7 +46,6 @@ import de.bluecolored.bluemap.core.util.FileHelper; import de.bluecolored.bluemap.core.util.Key; import de.bluecolored.bluemap.core.world.World; import de.bluecolored.bluemap.core.world.mca.MCAWorld; -import lombok.EqualsAndHashCode; import org.apache.commons.io.FileUtils; import org.jetbrains.annotations.Nullable; import org.spongepowered.configurate.ConfigurateException; @@ -74,10 +73,17 @@ public class BlueMapService implements Closeable { private final BlueMapConfiguration config; private final WebFilesManager webFilesManager; - private final Map worlds; + private ResourcePack resourcePack; + private final Map worlds; private final Map maps; private final Map storages; + + public BlueMapService(BlueMapConfiguration configuration, @Nullable ResourcePack preloadedResourcePack) { + this(configuration); + this.resourcePack = preloadedResourcePack; + } + public BlueMapService(BlueMapConfiguration configuration) { this.config = configuration; this.webFilesManager = new WebFilesManager(config.getWebappConfig().getWebroot()); @@ -119,29 +125,45 @@ public class BlueMapService implements Closeable { } } - public @Nullable Collection getWorlds() { - return worlds.values(); + /** + * Gets all loaded maps. + * @return A map of loaded maps + */ + public Map getMaps() { + return Collections.unmodifiableMap(maps); } - public @Nullable Map getMaps() { - return maps; + /** + * Gets all loaded worlds. + * @return A map of loaded worlds + */ + public Map getWorlds() { + return Collections.unmodifiableMap(worlds); } - public Map loadMaps() throws InterruptedException { - loadWorldsAndMaps(mapId -> true); - return maps; + /** + * Gets or loads configured maps. + * @return A map of loaded maps + */ + public Map getOrLoadMaps() throws InterruptedException { + return getOrLoadMaps(mapId -> true); } - public Map loadMaps(Predicate mapFilter) throws InterruptedException { - loadWorldsAndMaps(mapFilter); - return maps; - } - - private synchronized void loadWorldsAndMaps(Predicate mapFilter) throws InterruptedException { + /** + * Gets or loads configured maps. + * @param filter A predicate filtering map-ids that should be loaded + * (if maps are already loaded, they will be returned as well) + * @return A map of all loaded maps + */ + public synchronized Map getOrLoadMaps(Predicate filter) throws InterruptedException { for (var entry : config.getMapConfigs().entrySet()) { - if (!mapFilter.test(entry.getKey())) continue; + if (Thread.interrupted()) throw new InterruptedException(); + + if (!filter.test(entry.getKey())) continue; + if (maps.containsKey(entry.getKey())) continue; + try { - loadMapConfig(entry.getKey(), entry.getValue()); + loadMap(entry.getKey(), entry.getValue()); } catch (ConfigurationException ex) { Logger.global.logWarning(ex.getFormattedExplanation()); Throwable cause = ex.getRootCause(); @@ -150,9 +172,10 @@ public class BlueMapService implements Closeable { } } } + return Collections.unmodifiableMap(maps); } - private synchronized void loadMapConfig(String id, MapConfig mapConfig) throws ConfigurationException, InterruptedException { + private synchronized void loadMap(String id, MapConfig mapConfig) throws ConfigurationException, InterruptedException { String name = mapConfig.getName(); if (name == null) name = id; @@ -171,22 +194,22 @@ public class BlueMapService implements Closeable { "Check if the 'world' setting in the config-file for that map is correct, or remove the entire config-file if you don't want that map."); } - WorldKey worldKey = new WorldKey(worldFolder, dimension); - World world = worlds.get(worldKey); + String worldId = MCAWorld.id(worldFolder, dimension); + World world = worlds.get(worldId); if (world == null) { try { - Logger.global.logInfo("Loading world " + worldKey + " ..."); + Logger.global.logDebug("Loading world " + worldId + " ..."); world = MCAWorld.load(worldFolder, dimension); - worlds.put(worldKey, world); + worlds.put(worldId, world); } catch (IOException ex) { throw new ConfigurationException( - "Failed to load world " + worldKey + "!\n" + + "Failed to load world " + worldId + "!\n" + "Is the level.dat of that world present and not corrupted?", ex); } } - Storage storage = getStorage(mapConfig.getStorage()); + Storage storage = getOrLoadStorage(mapConfig.getStorage()); try { @@ -196,7 +219,7 @@ public class BlueMapService implements Closeable { name, world, storage, - loadResourcePack(), + getOrLoadResourcePack(), mapConfig ); maps.put(id, map); @@ -227,7 +250,7 @@ public class BlueMapService implements Closeable { } } - public synchronized Storage getStorage(String storageId) throws ConfigurationException { + public synchronized Storage getOrLoadStorage(String storageId) throws ConfigurationException, InterruptedException { Storage storage = storages.get(storageId); if (storage == null) { @@ -265,24 +288,30 @@ public class BlueMapService implements Closeable { return storage; } - public synchronized ResourcePack loadResourcePack() throws ConfigurationException, InterruptedException { + public @Nullable ResourcePack getResourcePack() { + return resourcePack; + } + + public synchronized ResourcePack getOrLoadResourcePack() throws ConfigurationException, InterruptedException { if (resourcePack == null) { - MinecraftVersion minecraftVersion = serverInterface.getMinecraftVersion(); + MinecraftVersion minecraftVersion = config.getMinecraftVersion(); + @Nullable Path resourcePackFolder = config.getResourcePacksFolder(); + @Nullable Path modsFolder = config.getModsFolder(); Path defaultResourceFile = config.getCoreConfig().getData().resolve("minecraft-client-" + minecraftVersion.getResource().getVersion().getVersionString() + ".jar"); Path resourceExtensionsFile = config.getCoreConfig().getData().resolve("resourceExtensions.zip"); - Path resourcePackFolder = serverInterface.getConfigFolder().resolve("resourcepacks"); + try { + FileHelper.createDirectories(resourcePackFolder); + } catch (IOException ex) { + throw new ConfigurationException( + "BlueMap failed to create this folder:\n" + + resourcePackFolder + "\n" + + "Does BlueMap have sufficient permissions?", + ex); + } - try { - FileHelper.createDirectories(resourcePackFolder); - } catch (IOException ex) { - throw new ConfigurationException( - "BlueMap failed to create this folder:\n" + - resourcePackFolder + "\n" + - "Does BlueMap have sufficient permissions?", - ex); - } + if (Thread.interrupted()) throw new InterruptedException(); if (!Files.exists(defaultResourceFile)) { if (config.getCoreConfig().isAcceptDownload()) { @@ -304,37 +333,43 @@ public class BlueMapService implements Closeable { } } + if (Thread.interrupted()) throw new InterruptedException(); + try { Files.deleteIfExists(resourceExtensionsFile); FileHelper.createDirectories(resourceExtensionsFile.getParent()); URL resourceExtensionsUrl = Objects.requireNonNull( Plugin.class.getResource( "/de/bluecolored/bluemap/" + minecraftVersion.getResource().getResourcePrefix() + - "/resourceExtensions.zip") + "/resourceExtensions.zip") ); FileUtils.copyURLToFile(resourceExtensionsUrl, resourceExtensionsFile.toFile(), 10000, 10000); } catch (IOException ex) { throw new ConfigurationException( "Failed to create resourceExtensions.zip!\n" + - "Does BlueMap has sufficient write permissions?", + "Does BlueMap has sufficient write permissions?", ex); } + if (Thread.interrupted()) throw new InterruptedException(); + try { - resourcePack = new ResourcePack(); + ResourcePack resourcePack = new ResourcePack(); List resourcePackRoots = new ArrayList<>(); - // load from resourcepack folder - try (Stream resourcepackFiles = Files.list(resourcePackFolder)) { - resourcepackFiles - .sorted(Comparator.reverseOrder()) - .forEach(resourcePackRoots::add); + + if (resourcePackFolder != null) { + // load from resourcepack folder + try (Stream resourcepackFiles = Files.list(resourcePackFolder)) { + resourcepackFiles + .sorted(Comparator.reverseOrder()) + .forEach(resourcePackRoots::add); + } } if (config.getCoreConfig().isScanForModResources()) { // load from mods folder - Path modsFolder = serverInterface.getModsFolder().orElse(null); if (modsFolder != null && Files.isDirectory(modsFolder)) { try (Stream resourcepackFiles = Files.list(modsFolder)) { resourcepackFiles @@ -360,18 +395,15 @@ public class BlueMapService implements Closeable { resourcePackRoots.add(defaultResourceFile); resourcePack.loadResources(resourcePackRoots); + + this.resourcePack = resourcePack; } catch (IOException | RuntimeException e) { throw new ConfigurationException("Failed to parse resources!\n" + "Is one of your resource-packs corrupted?", e); } - } - return resourcePack; - } - - public Optional getResourcePackIfLoaded() { - return Optional.ofNullable(this.resourcePack); + return this.resourcePack; } private Collection getWorldFolders() { @@ -410,21 +442,4 @@ public class BlueMapService implements Closeable { throw exception; } - @EqualsAndHashCode - private static class WorldKey { - - private final Path worldFolder; - private final Key dimension; - - public WorldKey(Path worldFolder, Key dimension) { - this.worldFolder = worldFolder; - this.dimension = dimension; - } - - @Override - public String toString() { - return worldFolder + "[" + dimension + "]"; - } - } - } diff --git a/BlueMapCommon/src/main/java/de/bluecolored/bluemap/common/api/BlueMapAPIImpl.java b/BlueMapCommon/src/main/java/de/bluecolored/bluemap/common/api/BlueMapAPIImpl.java index 31ebbb7d..0c58cd87 100644 --- a/BlueMapCommon/src/main/java/de/bluecolored/bluemap/common/api/BlueMapAPIImpl.java +++ b/BlueMapCommon/src/main/java/de/bluecolored/bluemap/common/api/BlueMapAPIImpl.java @@ -30,6 +30,7 @@ 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.common.serverinterface.ServerWorld; import de.bluecolored.bluemap.core.BlueMap; import de.bluecolored.bluemap.core.logger.Logger; import de.bluecolored.bluemap.core.map.BmMap; @@ -76,9 +77,7 @@ public class BlueMapAPIImpl extends BlueMapAPI { @Override public Collection getMaps() { - Map maps = plugin.getMaps(); - if (maps == null) return Collections.emptyList(); - + Map maps = plugin.getBlueMap().getMaps(); return maps.values().stream() .map(map -> { try { @@ -94,9 +93,7 @@ public class BlueMapAPIImpl extends BlueMapAPI { @Override public Collection getWorlds() { - Map worlds = plugin.getWorlds(); - if (worlds == null) return Collections.emptyList(); - + Map worlds = plugin.getBlueMap().getWorlds(); return worlds.values().stream() .map(world -> getWorld(world).orElse(null)) .filter(Objects::nonNull) @@ -109,36 +106,19 @@ public class BlueMapAPIImpl extends BlueMapAPI { } public Optional getWorldUncached(Object world) { - var worlds = plugin.getWorlds(); - if (worlds == null) return Optional.empty(); - - if (world instanceof UUID) { - var coreWorld = worlds.get(world.toString()); - if (coreWorld != null) world = coreWorld; - } - - if (world instanceof String) { - var coreWorld = worlds.get(world); - if (coreWorld != null) world = coreWorld; - } if (world instanceof MCAWorld) { var coreWorld = (MCAWorld) world; return Optional.of(new BlueMapWorldImpl(plugin, coreWorld)); } - var serverWorld = plugin.getServerInterface().getWorld(world).orElse(null); + ServerWorld serverWorld = plugin.getServerInterface().getServerWorld(world).orElse(null); if (serverWorld == null) return Optional.empty(); - String id = plugin.getBlueMap().getWorldId(serverWorld.getSaveFolder()); - World coreWorld = worlds.get(id); + World coreWorld = plugin.getWorld(serverWorld); if (coreWorld == null) return Optional.empty(); - if (coreWorld instanceof MCAWorld) - return Optional.of(new BlueMapWorldImpl(plugin, (MCAWorld) coreWorld)); - - return Optional.empty(); - + return Optional.of(new BlueMapWorldImpl(plugin, coreWorld)); } @Override @@ -147,8 +127,7 @@ public class BlueMapAPIImpl extends BlueMapAPI { } public Optional getMapUncached(String id) { - var maps = plugin.getMaps(); - if (maps == null) return Optional.empty(); + var maps = plugin.getBlueMap().getMaps(); var map = maps.get(id); if (map == null) return Optional.empty(); diff --git a/BlueMapCommon/src/main/java/de/bluecolored/bluemap/common/api/BlueMapWorldImpl.java b/BlueMapCommon/src/main/java/de/bluecolored/bluemap/common/api/BlueMapWorldImpl.java index 64e1cb2d..5c2135a9 100644 --- a/BlueMapCommon/src/main/java/de/bluecolored/bluemap/common/api/BlueMapWorldImpl.java +++ b/BlueMapCommon/src/main/java/de/bluecolored/bluemap/common/api/BlueMapWorldImpl.java @@ -30,7 +30,6 @@ import de.bluecolored.bluemap.common.plugin.Plugin; import de.bluecolored.bluemap.core.world.World; import de.bluecolored.bluemap.core.world.mca.MCAWorld; -import java.io.IOException; import java.lang.ref.WeakReference; import java.nio.file.Path; import java.util.Collection; @@ -39,13 +38,13 @@ import java.util.stream.Collectors; public class BlueMapWorldImpl implements BlueMapWorld { - private final WeakReference plugin; private final String id; - private final WeakReference world; + private final WeakReference plugin; + private final WeakReference world; - public BlueMapWorldImpl(Plugin plugin, MCAWorld world) throws IOException { + public BlueMapWorldImpl(Plugin plugin, World world) { + this.id = world.getId(); this.plugin = new WeakReference<>(plugin); - this.id = plugin.getBlueMap().getWorldId(world.getDimensionFolder()); this.world = new WeakReference<>(world); } @@ -59,13 +58,19 @@ public class BlueMapWorldImpl implements BlueMapWorld { } @Override + @Deprecated public Path getSaveFolder() { - return unpack(world).getDimensionFolder(); + World world = unpack(this.world); + if (world instanceof MCAWorld) { + return ((MCAWorld) world).getDimensionFolder(); + } else { + throw new UnsupportedOperationException("This world-type has no save-folder."); + } } @Override public Collection getMaps() { - return unpack(plugin).getMaps().values().stream() + return unpack(plugin).getBlueMap().getMaps().values().stream() .filter(map -> map.getWorld().equals(unpack(world))) .map(map -> new BlueMapMapImpl(unpack(plugin), map, this)) .collect(Collectors.toUnmodifiableSet()); diff --git a/BlueMapCommon/src/main/java/de/bluecolored/bluemap/common/api/RenderManagerImpl.java b/BlueMapCommon/src/main/java/de/bluecolored/bluemap/common/api/RenderManagerImpl.java index 69a15334..e56d53f2 100644 --- a/BlueMapCommon/src/main/java/de/bluecolored/bluemap/common/api/RenderManagerImpl.java +++ b/BlueMapCommon/src/main/java/de/bluecolored/bluemap/common/api/RenderManagerImpl.java @@ -82,7 +82,7 @@ public class RenderManagerImpl implements RenderManager { @Override public void start() { if (!isRunning()){ - renderManager.start(plugin.getConfigs().getCoreConfig().getRenderThreadCount()); + renderManager.start(plugin.getBlueMap().getConfig().getCoreConfig().getRenderThreadCount()); } plugin.getPluginState().setRenderThreadsEnabled(true); } diff --git a/BlueMapCommon/src/main/java/de/bluecolored/bluemap/common/api/WebAppImpl.java b/BlueMapCommon/src/main/java/de/bluecolored/bluemap/common/api/WebAppImpl.java index 18f373df..88fb11ea 100644 --- a/BlueMapCommon/src/main/java/de/bluecolored/bluemap/common/api/WebAppImpl.java +++ b/BlueMapCommon/src/main/java/de/bluecolored/bluemap/common/api/WebAppImpl.java @@ -49,7 +49,7 @@ public class WebAppImpl implements WebApp { @Override public Path getWebRoot() { - return plugin.getConfigs().getWebappConfig().getWebroot(); + return plugin.getBlueMap().getConfig().getWebappConfig().getWebroot(); } @Override @@ -98,6 +98,7 @@ public class WebAppImpl implements WebApp { } @Override + @Deprecated(forRemoval = true) public Map availableImages() throws IOException { Path webRoot = getWebRoot().toAbsolutePath(); String separator = webRoot.getFileSystem().getSeparator(); diff --git a/BlueMapCommon/src/main/java/de/bluecolored/bluemap/common/config/BlueMapConfigManager.java b/BlueMapCommon/src/main/java/de/bluecolored/bluemap/common/config/BlueMapConfigManager.java index edb53c6c..74e92b18 100644 --- a/BlueMapCommon/src/main/java/de/bluecolored/bluemap/common/config/BlueMapConfigManager.java +++ b/BlueMapCommon/src/main/java/de/bluecolored/bluemap/common/config/BlueMapConfigManager.java @@ -29,6 +29,7 @@ import de.bluecolored.bluemap.common.BlueMapConfiguration; import de.bluecolored.bluemap.common.config.storage.StorageConfig; import de.bluecolored.bluemap.common.serverinterface.ServerWorld; import de.bluecolored.bluemap.core.BlueMap; +import de.bluecolored.bluemap.core.MinecraftVersion; import de.bluecolored.bluemap.core.logger.Logger; import de.bluecolored.bluemap.core.util.FileHelper; import de.bluecolored.bluemap.core.util.Key; @@ -49,21 +50,27 @@ public class BlueMapConfigManager implements BlueMapConfiguration { private final ConfigManager configManager; + private final MinecraftVersion minecraftVersion; private final CoreConfig coreConfig; private final WebserverConfig webserverConfig; private final WebappConfig webappConfig; private final PluginConfig pluginConfig; private final Map mapConfigs; private final Map storageConfigs; + private final Path resourcePacksFolder; + private final @Nullable Path modsFolder; - @Builder(buildMethodName = "") + @Builder private BlueMapConfigManager( + @NonNull MinecraftVersion minecraftVersion, @NonNull Path configRoot, @Nullable Path defaultDataFolder, @Nullable Path defaultWebroot, @Nullable Collection autoConfigWorlds, @Nullable Boolean usePluginConfig, - @Nullable Boolean useMetricsConfig + @Nullable Boolean useMetricsConfig, + @Nullable Path resourcePacksFolder, + @Nullable Path modsFolder ) throws ConfigurationException { // set defaults if (defaultDataFolder == null) defaultDataFolder = Path.of("bluemap"); @@ -71,8 +78,10 @@ public class BlueMapConfigManager implements BlueMapConfiguration { if (autoConfigWorlds == null) autoConfigWorlds = Collections.emptyList(); if (usePluginConfig == null) usePluginConfig = true; if (useMetricsConfig == null) useMetricsConfig = true; + if (resourcePacksFolder == null) resourcePacksFolder = configRoot.resolve("resourcepacks"); // load + this.minecraftVersion = minecraftVersion; this.configManager = new ConfigManager(configRoot); this.coreConfig = loadCoreConfig(defaultDataFolder, useMetricsConfig); this.webappConfig = loadWebappConfig(defaultWebroot); @@ -80,9 +89,11 @@ public class BlueMapConfigManager implements BlueMapConfiguration { this.pluginConfig = usePluginConfig ? loadPluginConfig() : new PluginConfig(); this.storageConfigs = Collections.unmodifiableMap(loadStorageConfigs(webappConfig.getWebroot())); this.mapConfigs = Collections.unmodifiableMap(loadMapConfigs(autoConfigWorlds)); + this.resourcePacksFolder = resourcePacksFolder; + this.modsFolder = modsFolder; } - private synchronized CoreConfig loadCoreConfig(Path defaultDataFolder, boolean useMetricsConfig) throws ConfigurationException { + private CoreConfig loadCoreConfig(Path defaultDataFolder, boolean useMetricsConfig) throws ConfigurationException { Path configFileRaw = Path.of("core"); Path configFile = configManager.findConfigPath(configFileRaw); Path configFolder = configFile.getParent(); @@ -127,7 +138,7 @@ public class BlueMapConfigManager implements BlueMapConfiguration { return presetRenderThreadCount; } - private synchronized WebserverConfig loadWebserverConfig(Path defaultWebroot, Path dataRoot) throws ConfigurationException { + private WebserverConfig loadWebserverConfig(Path defaultWebroot, Path dataRoot) throws ConfigurationException { Path configFileRaw = Path.of("webserver"); Path configFile = configManager.findConfigPath(configFileRaw); Path configFolder = configFile.getParent(); @@ -152,7 +163,7 @@ public class BlueMapConfigManager implements BlueMapConfiguration { return configManager.loadConfig(configFileRaw, WebserverConfig.class); } - private synchronized WebappConfig loadWebappConfig(Path defaultWebroot) throws ConfigurationException { + private WebappConfig loadWebappConfig(Path defaultWebroot) throws ConfigurationException { Path configFileRaw = Path.of("webapp"); Path configFile = configManager.findConfigPath(configFileRaw); Path configFolder = configFile.getParent(); @@ -175,7 +186,7 @@ public class BlueMapConfigManager implements BlueMapConfiguration { return configManager.loadConfig(configFileRaw, WebappConfig.class); } - private synchronized PluginConfig loadPluginConfig() throws ConfigurationException { + private PluginConfig loadPluginConfig() throws ConfigurationException { Path configFileRaw = Path.of("plugin"); Path configFile = configManager.findConfigPath(configFileRaw); Path configFolder = configFile.getParent(); @@ -197,7 +208,7 @@ public class BlueMapConfigManager implements BlueMapConfiguration { return configManager.loadConfig(configFileRaw, PluginConfig.class); } - private synchronized Map loadMapConfigs(Collection autoConfigWorlds) throws ConfigurationException { + private Map loadMapConfigs(Collection autoConfigWorlds) throws ConfigurationException { Map mapConfigs = new HashMap<>(); Path mapFolder = Paths.get("maps"); @@ -207,22 +218,23 @@ public class BlueMapConfigManager implements BlueMapConfiguration { try { FileHelper.createDirectories(mapConfigFolder); if (autoConfigWorlds.isEmpty()) { + Path worldFolder = Path.of("world"); Files.writeString( mapConfigFolder.resolve("overworld.conf"), - createOverworldMapTemplate("Overworld", Path.of("world"), + createOverworldMapTemplate("Overworld", worldFolder, new Key("minecraft", "overworld"), 0).build(), StandardOpenOption.CREATE, StandardOpenOption.TRUNCATE_EXISTING ); Files.writeString( mapConfigFolder.resolve("nether.conf"), - createNetherMapTemplate("Nether", Path.of("world", "DIM-1"), - new Key("minecraft", "overworld"), 0).build(), + createNetherMapTemplate("Nether", worldFolder, + new Key("minecraft", "the_nether"), 0).build(), StandardOpenOption.CREATE, StandardOpenOption.TRUNCATE_EXISTING ); Files.writeString( mapConfigFolder.resolve("end.conf"), - createEndMapTemplate("End", Path.of("world", "DIM1"), - new Key("minecraft", "overworld"), 0).build(), + createEndMapTemplate("End", worldFolder, + new Key("minecraft", "the_end"), 0).build(), StandardOpenOption.CREATE, StandardOpenOption.TRUNCATE_EXISTING ); } else { @@ -296,7 +308,7 @@ public class BlueMapConfigManager implements BlueMapConfiguration { return mapConfigs; } - private synchronized Map loadStorageConfigs(Path defaultWebroot) throws ConfigurationException { + private Map loadStorageConfigs(Path defaultWebroot) throws ConfigurationException { Map storageConfigs = new HashMap<>(); Path storageFolder = Paths.get("storages"); diff --git a/BlueMapCommon/src/main/java/de/bluecolored/bluemap/common/config/ConfigManager.java b/BlueMapCommon/src/main/java/de/bluecolored/bluemap/common/config/ConfigManager.java index ec8f2d60..b9620e86 100644 --- a/BlueMapCommon/src/main/java/de/bluecolored/bluemap/common/config/ConfigManager.java +++ b/BlueMapCommon/src/main/java/de/bluecolored/bluemap/common/config/ConfigManager.java @@ -25,8 +25,10 @@ package de.bluecolored.bluemap.common.config; import com.flowpowered.math.vector.Vector2i; +import de.bluecolored.bluemap.common.config.typeserializer.KeyTypeSerializer; import de.bluecolored.bluemap.common.config.typeserializer.Vector2iTypeSerializer; import de.bluecolored.bluemap.core.BlueMap; +import de.bluecolored.bluemap.core.util.Key; import org.apache.commons.io.IOUtils; import org.spongepowered.configurate.ConfigurateException; import org.spongepowered.configurate.ConfigurationNode; @@ -165,6 +167,7 @@ public class ConfigManager { .path(path) .defaultOptions(o -> o.serializers(b -> { b.register(Vector2i.class, new Vector2iTypeSerializer()); + b.register(Key.class, new KeyTypeSerializer()); })) .build(); } diff --git a/BlueMapCommon/src/main/java/de/bluecolored/bluemap/common/config/typeserializer/KeyTypeSerializer.java b/BlueMapCommon/src/main/java/de/bluecolored/bluemap/common/config/typeserializer/KeyTypeSerializer.java index a153fc2a..96eaa4c5 100644 --- a/BlueMapCommon/src/main/java/de/bluecolored/bluemap/common/config/typeserializer/KeyTypeSerializer.java +++ b/BlueMapCommon/src/main/java/de/bluecolored/bluemap/common/config/typeserializer/KeyTypeSerializer.java @@ -35,7 +35,7 @@ import java.lang.reflect.Type; public class KeyTypeSerializer implements TypeSerializer { @Override - public Key deserialize(Type type, ConfigurationNode node) throws SerializationException { + public Key deserialize(Type type, ConfigurationNode node) { String formatted = node.getString(); return formatted != null ? new Key(node.getString()) : null; } diff --git a/BlueMapCommon/src/main/java/de/bluecolored/bluemap/common/plugin/Plugin.java b/BlueMapCommon/src/main/java/de/bluecolored/bluemap/common/plugin/Plugin.java index ac1d8fb6..d867d275 100644 --- a/BlueMapCommon/src/main/java/de/bluecolored/bluemap/common/plugin/Plugin.java +++ b/BlueMapCommon/src/main/java/de/bluecolored/bluemap/common/plugin/Plugin.java @@ -37,6 +37,7 @@ import de.bluecolored.bluemap.common.rendermanager.MapUpdateTask; import de.bluecolored.bluemap.common.rendermanager.RenderManager; import de.bluecolored.bluemap.common.serverinterface.ServerEventListener; import de.bluecolored.bluemap.common.serverinterface.Server; +import de.bluecolored.bluemap.common.serverinterface.ServerWorld; import de.bluecolored.bluemap.common.web.*; import de.bluecolored.bluemap.common.web.http.HttpServer; import de.bluecolored.bluemap.core.debug.StateDumper; @@ -46,7 +47,9 @@ import de.bluecolored.bluemap.core.metrics.Metrics; import de.bluecolored.bluemap.core.resources.resourcepack.ResourcePack; import de.bluecolored.bluemap.core.storage.Storage; import de.bluecolored.bluemap.core.util.FileHelper; +import de.bluecolored.bluemap.core.util.Tristate; import de.bluecolored.bluemap.core.world.World; +import de.bluecolored.bluemap.core.world.mca.MCAWorld; import org.jetbrains.annotations.Nullable; import org.spongepowered.configurate.gson.GsonConfigurationLoader; import org.spongepowered.configurate.serialize.SerializationException; @@ -118,11 +121,18 @@ public class Plugin implements ServerEventListener { unload(); //ensure nothing is left running (from a failed load or something) //load configs - blueMap = new BlueMapService(serverInterface, new BlueMapConfigManager(serverInterface), preloadedResourcePack); - CoreConfig coreConfig = getConfigs().getCoreConfig(); - WebserverConfig webserverConfig = getConfigs().getWebserverConfig(); - WebappConfig webappConfig = getConfigs().getWebappConfig(); - PluginConfig pluginConfig = getConfigs().getPluginConfig(); + BlueMapConfigManager configManager = BlueMapConfigManager.builder() + .minecraftVersion(serverInterface.getMinecraftVersion()) + .configRoot(serverInterface.getConfigFolder()) + .resourcePacksFolder(serverInterface.getConfigFolder().resolve("resourcepacks")) + .modsFolder(serverInterface.getModsFolder().orElse(null)) + .useMetricsConfig(serverInterface.isMetricsEnabled() == Tristate.UNDEFINED) + .autoConfigWorlds(serverInterface.getLoadedServerWorlds()) + .build(); + CoreConfig coreConfig = configManager.getCoreConfig(); + WebserverConfig webserverConfig = configManager.getWebserverConfig(); + WebappConfig webappConfig = configManager.getWebappConfig(); + PluginConfig pluginConfig = configManager.getPluginConfig(); //apply new file-logger config if (coreConfig.getLog().getFile() != null) { @@ -146,9 +156,12 @@ public class Plugin implements ServerEventListener { pluginState = new PluginState(); } + //create bluemap-service + blueMap = new BlueMapService(configManager, preloadedResourcePack); + //try load resources try { - blueMap.loadResourcePack(); + blueMap.getOrLoadResourcePack(); } catch (MissingResourcesException ex) { Logger.global.logWarning("BlueMap is missing important resources!"); Logger.global.logWarning("You must accept the required file download in order for BlueMap to work!"); @@ -165,7 +178,7 @@ public class Plugin implements ServerEventListener { } //load maps - Map maps = blueMap.loadMaps(); + Map maps = blueMap.getOrLoadMaps(); //create and start webserver if (webserverConfig.isEnabled()) { @@ -178,7 +191,7 @@ public class Plugin implements ServerEventListener { routingRequestHandler.register(".*", new FileRequestHandler(webroot)); // map route - for (var mapConfigEntry : getConfigs().getMapConfigs().entrySet()) { + for (var mapConfigEntry : configManager.getMapConfigs().entrySet()) { String id = mapConfigEntry.getKey(); MapConfig mapConfig = mapConfigEntry.getValue(); @@ -187,7 +200,7 @@ public class Plugin implements ServerEventListener { if (map != null) { mapRequestHandler = new MapRequestHandler(map, serverInterface, pluginConfig, Predicate.not(pluginState::isPlayerHidden)); } else { - Storage storage = blueMap.getStorage(mapConfig.getStorage()); + Storage storage = blueMap.getOrLoadStorage(mapConfig.getStorage()); mapRequestHandler = new MapRequestHandler(id, storage); } @@ -472,7 +485,7 @@ public class Plugin implements ServerEventListener { } // hold and reuse loaded resourcepack - ResourcePack preloadedResourcePack = this.blueMap.getResourcePackIfLoaded().orElse(null); + ResourcePack preloadedResourcePack = this.blueMap.getResourcePack(); unload(); load(preloadedResourcePack); @@ -484,6 +497,8 @@ public class Plugin implements ServerEventListener { } public synchronized void save() { + if (blueMap == null) return; + if (pluginState != null) { try { GsonConfigurationLoader loader = GsonConfigurationLoader.builder() @@ -496,40 +511,40 @@ public class Plugin implements ServerEventListener { } var maps = blueMap.getMaps(); - if (maps != null) { - for (BmMap map : maps.values()) { - map.save(); - } + for (BmMap map : maps.values()) { + map.save(); } } public void saveMarkerStates() { + if (blueMap == null) return; + var maps = blueMap.getMaps(); - if (maps != null) { - for (BmMap map : maps.values()) { - map.saveMarkerState(); - } + for (BmMap map : maps.values()) { + map.saveMarkerState(); } } public void savePlayerStates() { + if (blueMap == null) return; + var maps = blueMap.getMaps(); - if (maps != null) { - for (BmMap map : maps.values()) { - var dataSupplier = new LivePlayersDataSupplier( - serverInterface, - getConfigs().getPluginConfig(), - map.getWorldId(), - Predicate.not(pluginState::isPlayerHidden) - ); - try ( - OutputStream out = map.getStorage().writeMeta(map.getId(), BmMap.META_FILE_PLAYERS); - Writer writer = new OutputStreamWriter(out) - ) { - writer.write(dataSupplier.get()); - } catch (Exception ex) { - Logger.global.logError("Failed to save players for map '" + map.getId() + "'!", ex); - } + for (BmMap map : maps.values()) { + var serverWorld = serverInterface.getServerWorld(map.getWorld()).orElse(null); + if (serverWorld == null) continue; + var dataSupplier = new LivePlayersDataSupplier( + serverInterface, + getBlueMap().getConfig().getPluginConfig(), + serverWorld, + Predicate.not(pluginState::isPlayerHidden) + ); + try ( + OutputStream out = map.getStorage().writeMeta(map.getId(), BmMap.META_FILE_PLAYERS); + Writer writer = new OutputStreamWriter(out) + ) { + writer.write(dataSupplier.get()); + } catch (Exception ex) { + Logger.global.logError("Failed to save players for map '" + map.getId() + "'!", ex); } } } @@ -554,7 +569,7 @@ public class Plugin implements ServerEventListener { } public boolean flushWorldUpdates(World world) throws IOException { - var implWorld = serverInterface.getWorld(world.getSaveFolder()).orElse(null); + var implWorld = serverInterface.getServerWorld(world).orElse(null); if (implWorld != null) return implWorld.persistWorldChanges(); return false; } @@ -584,8 +599,8 @@ public class Plugin implements ServerEventListener { } public boolean checkPausedByPlayerCount() { - CoreConfig coreConfig = getConfigs().getCoreConfig(); - PluginConfig pluginConfig = getConfigs().getPluginConfig(); + CoreConfig coreConfig = getBlueMap().getConfig().getCoreConfig(); + PluginConfig pluginConfig = getBlueMap().getConfig().getPluginConfig(); if ( pluginConfig.getPlayerRenderLimit() > 0 && @@ -600,6 +615,11 @@ public class Plugin implements ServerEventListener { } } + public @Nullable World getWorld(ServerWorld serverWorld) { + String id = MCAWorld.id(serverWorld.getWorldFolder(), serverWorld.getDimension()); + return getBlueMap().getWorlds().get(id); + } + public Server getServerInterface() { return serverInterface; } @@ -608,10 +628,6 @@ public class Plugin implements ServerEventListener { return blueMap; } - public BlueMapConfigManager getConfigs() { - return blueMap.getConfig(); - } - public PluginState getPluginState() { return pluginState; } diff --git a/BlueMapCommon/src/main/java/de/bluecolored/bluemap/common/plugin/RegionFileWatchService.java b/BlueMapCommon/src/main/java/de/bluecolored/bluemap/common/plugin/RegionFileWatchService.java index f849b921..291574ae 100644 --- a/BlueMapCommon/src/main/java/de/bluecolored/bluemap/common/plugin/RegionFileWatchService.java +++ b/BlueMapCommon/src/main/java/de/bluecolored/bluemap/common/plugin/RegionFileWatchService.java @@ -25,12 +25,14 @@ package de.bluecolored.bluemap.common.plugin; import com.flowpowered.math.vector.Vector2i; +import de.bluecolored.bluemap.api.debug.DebugDump; import de.bluecolored.bluemap.common.rendermanager.RenderManager; import de.bluecolored.bluemap.common.rendermanager.WorldRegionRenderTask; -import de.bluecolored.bluemap.api.debug.DebugDump; import de.bluecolored.bluemap.core.logger.Logger; import de.bluecolored.bluemap.core.map.BmMap; import de.bluecolored.bluemap.core.util.FileHelper; +import de.bluecolored.bluemap.core.world.World; +import de.bluecolored.bluemap.core.world.mca.MCAWorld; import java.io.IOException; import java.nio.file.*; @@ -45,7 +47,7 @@ public class RegionFileWatchService extends Thread { private final RenderManager renderManager; private final WatchService watchService; - private boolean verbose; + private final boolean verbose; private volatile boolean closed; private Timer delayTimer; @@ -60,7 +62,9 @@ public class RegionFileWatchService extends Thread { this.closed = false; this.scheduledUpdates = new HashMap<>(); - Path folder = map.getWorld().getSaveFolder().resolve("region"); + World world = map.getWorld(); + if (!(world instanceof MCAWorld)) throw new UnsupportedOperationException("world-type is not supported"); + Path folder = ((MCAWorld) world).getRegionFolder(); FileHelper.createDirectories(folder); this.watchService = folder.getFileSystem().newWatchService(); diff --git a/BlueMapCommon/src/main/java/de/bluecolored/bluemap/common/plugin/commands/CommandHelper.java b/BlueMapCommon/src/main/java/de/bluecolored/bluemap/common/plugin/commands/CommandHelper.java index a3f8a3d8..27f4e50a 100644 --- a/BlueMapCommon/src/main/java/de/bluecolored/bluemap/common/plugin/commands/CommandHelper.java +++ b/BlueMapCommon/src/main/java/de/bluecolored/bluemap/common/plugin/commands/CommandHelper.java @@ -30,7 +30,6 @@ import de.bluecolored.bluemap.common.plugin.text.TextColor; import de.bluecolored.bluemap.common.plugin.text.TextFormat; import de.bluecolored.bluemap.common.rendermanager.RenderManager; import de.bluecolored.bluemap.common.rendermanager.RenderTask; -import de.bluecolored.bluemap.core.world.World; import org.apache.commons.lang3.time.DurationFormatUtils; import java.lang.ref.WeakReference; @@ -106,7 +105,7 @@ public class CommandHelper { if (plugin.checkPausedByPlayerCount()) { lines.add(Text.of(TextColor.WHITE, " Render-Threads are ", Text.of(TextColor.GOLD, "paused"))); - lines.add(Text.of(TextColor.GRAY, TextFormat.ITALIC, "\u00A0\u00A0\u00A0(there are " + plugin.getConfigs().getPluginConfig().getPlayerRenderLimit() + " or more players online)")); + lines.add(Text.of(TextColor.GRAY, TextFormat.ITALIC, "\u00A0\u00A0\u00A0(there are " + plugin.getBlueMap().getConfig().getPluginConfig().getPlayerRenderLimit() + " or more players online)")); } else { lines.add(Text.of(TextColor.WHITE, " Render-Threads are ", Text.of(TextColor.RED, "stopped") @@ -134,20 +133,22 @@ public class CommandHelper { public Text worldHelperHover() { StringJoiner joiner = new StringJoiner("\n"); - for (World world : plugin.getWorlds().values()) { - joiner.add(world.getName()); + for (String worldId : plugin.getBlueMap().getWorlds().keySet()) { + joiner.add(worldId); } - return Text.of("world").setHoverText(Text.of(TextColor.WHITE, "Available worlds: \n", TextColor.GRAY, joiner.toString())); + return Text.of(TextFormat.UNDERLINED, "world") + .setHoverText(Text.of(TextColor.WHITE, "Available worlds: \n", TextColor.GRAY, joiner.toString())); } public Text mapHelperHover() { StringJoiner joiner = new StringJoiner("\n"); - for (String mapId : plugin.getMaps().keySet()) { + for (String mapId : plugin.getBlueMap().getMaps().keySet()) { joiner.add(mapId); } - return Text.of("map").setHoverText(Text.of(TextColor.WHITE, "Available maps: \n", TextColor.GRAY, joiner.toString())); + return Text.of(TextFormat.UNDERLINED, "map") + .setHoverText(Text.of(TextColor.WHITE, "Available maps: \n", TextColor.GRAY, joiner.toString())); } public synchronized Optional getTaskForRef(String ref) { diff --git a/BlueMapCommon/src/main/java/de/bluecolored/bluemap/common/plugin/commands/Commands.java b/BlueMapCommon/src/main/java/de/bluecolored/bluemap/common/plugin/commands/Commands.java index b1c9bbc5..c413e141 100644 --- a/BlueMapCommon/src/main/java/de/bluecolored/bluemap/common/plugin/commands/Commands.java +++ b/BlueMapCommon/src/main/java/de/bluecolored/bluemap/common/plugin/commands/Commands.java @@ -281,10 +281,10 @@ public class Commands { } } - private Optional parseWorld(String worldName) { - for (World world : plugin.getWorlds().values()) { - if (world.getName().equalsIgnoreCase(worldName)) { - return Optional.of(world); + private Optional parseWorld(String worldId) { + for (var entry : plugin.getBlueMap().getWorlds().entrySet()) { + if (entry.getKey().equals(worldId)) { + return Optional.of(entry.getValue()); } } @@ -292,8 +292,8 @@ public class Commands { } private Optional parseMap(String mapId) { - for (BmMap map : plugin.getMaps().values()) { - if (map.getId().equalsIgnoreCase(mapId)) { + for (BmMap map : plugin.getBlueMap().getMaps().values()) { + if (map.getId().equals(mapId)) { return Optional.of(map); } } @@ -416,7 +416,7 @@ public class Commands { public int debugClearCacheCommand(CommandContext context) { CommandSource source = commandSourceInterface.apply(context.getSource()); - for (World world : plugin.getWorlds().values()) { + for (World world : plugin.getBlueMap().getWorlds().values()) { world.invalidateChunkCache(); } @@ -436,7 +436,7 @@ public class Commands { world = parseWorld(worldName.get()).orElse(null); if (world == null) { - source.sendMessage(Text.of(TextColor.RED, "There is no ", helper.worldHelperHover(), " with this name: ", TextColor.WHITE, worldName.get())); + source.sendMessage(Text.of(TextColor.RED, "There is no ", helper.worldHelperHover(), " with this id: ", TextColor.WHITE, worldName.get())); return 0; } } else { @@ -482,7 +482,7 @@ public class Commands { position = new Vector3d(x.get(), y.get(), z.get()); if (world == null) { - source.sendMessage(Text.of(TextColor.RED, "There is no ", helper.worldHelperHover(), " with this name: ", TextColor.WHITE, worldName.get())); + source.sendMessage(Text.of(TextColor.RED, "There is no ", helper.worldHelperHover(), " with this id: ", TextColor.WHITE, worldName.get())); return 0; } } else { @@ -499,7 +499,7 @@ public class Commands { // collect and output debug info Vector3i blockPos = position.floor().toInt(); Block block = new Block<>(world, blockPos.getX(), blockPos.getY(), blockPos.getZ()); - Block blockBelow = new Block<>(null, 0, 0, 0).copy(block, 0, -1, 0); + Block blockBelow = new Block<>(world, blockPos.getX(), blockPos.getY() - 1, blockPos.getZ()); // populate lazy-loaded values block.getBlockState(); @@ -523,7 +523,7 @@ public class Commands { final CommandSource source = commandSourceInterface.apply(context.getSource()); try { - Path file = plugin.getConfigs().getCoreConfig().getData().resolve("dump.json"); + Path file = plugin.getBlueMap().getConfig().getCoreConfig().getData().resolve("dump.json"); StateDumper.global().dump(file); source.sendMessage(Text.of(TextColor.GREEN, "Dump created at: " + file)); @@ -562,7 +562,7 @@ public class Commands { new Thread(() -> { plugin.getPluginState().setRenderThreadsEnabled(true); - plugin.getRenderManager().start(plugin.getConfigs().getCoreConfig().resolveRenderThreadCount()); + plugin.getRenderManager().start(plugin.getBlueMap().getConfig().getCoreConfig().resolveRenderThreadCount()); source.sendMessage(Text.of(TextColor.GREEN, "Render-Threads started!")); plugin.save(); @@ -583,7 +583,7 @@ public class Commands { 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)); + source.sendMessage(Text.of(TextColor.RED, "There is no ", helper.mapHelperHover(), " with this id: ", TextColor.WHITE, mapString)); return 0; } @@ -624,7 +624,7 @@ public class Commands { 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)); + source.sendMessage(Text.of(TextColor.RED, "There is no ", helper.mapHelperHover(), " with this id: ", TextColor.WHITE, mapString)); return 0; } @@ -671,7 +671,8 @@ public class Commands { mapToRender = parseMap(worldOrMap.get()).orElse(null); if (mapToRender == null) { - source.sendMessage(Text.of(TextColor.RED, "There is no ", helper.worldHelperHover(), " or ", helper.mapHelperHover(), " with this name: ", TextColor.WHITE, worldOrMap.get())); + source.sendMessage(Text.of(TextColor.RED, "There is no ", helper.worldHelperHover(), " or ", + helper.mapHelperHover(), " with this id: ", TextColor.WHITE, worldOrMap.get())); return 0; } } else { @@ -682,7 +683,8 @@ public class Commands { mapToRender = null; if (worldToRender == null) { - source.sendMessage(Text.of(TextColor.RED, "Can't detect a world from this command-source, you'll have to define a world or a map to update!").setHoverText(Text.of(TextColor.GRAY, "/bluemap " + (force ? "force-update" : "update") + " "))); + source.sendMessage(Text.of(TextColor.RED, "Can't detect a world from this command-source, you'll have to define a world or a map to update!") + .setHoverText(Text.of(TextColor.GRAY, "/bluemap " + (force ? "force-update" : "update") + " "))); return 0; } } @@ -699,7 +701,8 @@ public class Commands { } else { Vector3d 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 x,z coordinates to update with a radius!").setHoverText(Text.of(TextColor.GRAY, "/bluemap " + (force ? "force-update" : "update") + " " + radius))); + source.sendMessage(Text.of(TextColor.RED, "Can't detect a position from this command-source, you'll have to define x,z coordinates to update with a radius!") + .setHoverText(Text.of(TextColor.GRAY, "/bluemap " + (force ? "force-update" : "update") + " " + radius))); return 0; } @@ -714,16 +717,12 @@ public class Commands { try { List maps = new ArrayList<>(); if (worldToRender != null) { - var world = plugin.getServerInterface().getWorld(worldToRender.getWorldFolder()).orElse(null); - if (world != null) world.persistWorldChanges(); - - for (BmMap map : plugin.getMaps().values()) { - if (map.getWorld().getWorldFolder().equals(worldToRender.getWorldFolder())) maps.add(map); + plugin.flushWorldUpdates(worldToRender); + for (BmMap map : plugin.getBlueMap().getMaps().values()) { + if (map.getWorld().equals(worldToRender)) maps.add(map); } } else { - var world = plugin.getServerInterface().getWorld(mapToRender.getWorld().getWorldFolder()).orElse(null); - if (world != null) world.persistWorldChanges(); - + plugin.flushWorldUpdates(mapToRender.getWorld()); maps.add(mapToRender); } @@ -741,7 +740,8 @@ public class Commands { updateTask.getRegions().forEach(region -> state.setRenderTime(region, -1)); } - source.sendMessage(Text.of(TextColor.GREEN, "Created new Update-Task for map '" + map.getId() + "' ", TextColor.GRAY, "(" + updateTask.getRegions().size() + " regions, ~" + updateTask.getRegions().size() * 1024L + " chunks)")); + source.sendMessage(Text.of(TextColor.GREEN, "Created new Update-Task for map '" + map.getId() + "' ", + TextColor.GRAY, "(" + updateTask.getRegions().size() + " regions, ~" + updateTask.getRegions().size() * 1024L + " chunks)")); } source.sendMessage(Text.of(TextColor.GREEN, "Use ", TextColor.GRAY, "/bluemap", TextColor.GREEN, " to see the progress.")); @@ -790,7 +790,7 @@ public class Commands { 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)); + source.sendMessage(Text.of(TextColor.RED, "There is no ", helper.mapHelperHover(), " with this id: ", TextColor.WHITE, mapString)); return 0; } @@ -831,8 +831,8 @@ public class Commands { CommandSource source = commandSourceInterface.apply(context.getSource()); source.sendMessage(Text.of(TextColor.BLUE, "Worlds loaded by BlueMap:")); - for (var entry : plugin.getWorlds().entrySet()) { - source.sendMessage(Text.of(TextColor.GRAY, " - ", TextColor.WHITE, entry.getValue().getName()).setHoverText(Text.of(entry.getValue().getWorldFolder(), TextColor.GRAY, " (" + entry.getKey() + ")"))); + for (var entry : plugin.getBlueMap().getWorlds().entrySet()) { + source.sendMessage(Text.of(TextColor.GRAY, " - ", TextColor.WHITE, entry.getKey())); } return 1; @@ -842,7 +842,7 @@ public class Commands { List lines = new ArrayList<>(); lines.add(Text.of(TextColor.BLUE, "Maps loaded by BlueMap:")); - for (BmMap map : plugin.getMaps().values()) { + for (BmMap map : plugin.getBlueMap().getMaps().values()) { boolean frozen = !plugin.getPluginState().getMapState(map).isUpdateEnabled(); lines.add(Text.of(TextColor.GRAY, " - ", @@ -850,7 +850,7 @@ public class Commands { TextColor.GRAY, " (" + map.getName() + ")")); lines.add(Text.of(TextColor.GRAY, "\u00A0\u00A0\u00A0World: ", - TextColor.DARK_GRAY, map.getWorld().getName())); + TextColor.DARK_GRAY, map.getWorld().getId())); lines.add(Text.of(TextColor.GRAY, "\u00A0\u00A0\u00A0Last Update: ", TextColor.DARK_GRAY, helper.formatTime(map.getRenderState().getLatestRenderTime()))); @@ -884,9 +884,10 @@ public class Commands { Storage storage; try { - storage = plugin.getBlueMap().getStorage(storageId); - } catch (ConfigurationException ex) { - source.sendMessage(Text.of(TextColor.RED, ex.getMessage())); + storage = plugin.getBlueMap().getOrLoadStorage(storageId); + } catch (ConfigurationException | InterruptedException ex) { + Logger.global.logError("Unexpected exception trying to load storage '" + storageId + "'!", ex); + source.sendMessage(Text.of(TextColor.RED, "There was an unexpected exception trying to load this storage. Please check the console for more details...")); return 0; } @@ -894,8 +895,8 @@ public class Commands { try { mapIds = storage.collectMapIds(); } catch (IOException ex) { - source.sendMessage(Text.of(TextColor.RED, "There was an unexpected exception trying to access this storage. Please check the console for more details...")); Logger.global.logError("Unexpected exception trying to load mapIds from storage '" + storageId + "'!", ex); + source.sendMessage(Text.of(TextColor.RED, "There was an unexpected exception trying to access this storage. Please check the console for more details...")); return 0; } @@ -904,7 +905,7 @@ public class Commands { source.sendMessage(Text.of(TextColor.GRAY, " ")); } else { for (String mapId : mapIds) { - BmMap map = plugin.getMaps().get(mapId); + BmMap map = plugin.getBlueMap().getMaps().get(mapId); boolean isLoaded = map != null && map.getStorage().equals(storage); if (isLoaded) { @@ -925,13 +926,14 @@ public class Commands { Storage storage; try { - storage = plugin.getBlueMap().getStorage(storageId); - } catch (ConfigurationException ex) { - source.sendMessage(Text.of(TextColor.RED, ex.getMessage())); + storage = plugin.getBlueMap().getOrLoadStorage(storageId); + } catch (ConfigurationException | InterruptedException ex) { + Logger.global.logError("Unexpected exception trying to load storage '" + storageId + "'!", ex); + source.sendMessage(Text.of(TextColor.RED, "There was an unexpected exception trying to load this storage. Please check the console for more details...")); return 0; } - BmMap map = plugin.getMaps().get(mapId); + BmMap map = plugin.getBlueMap().getMaps().get(mapId); boolean isLoaded = map != null && map.getStorage().equals(storage); if (isLoaded) { Text purgeCommand = Text.of(TextColor.WHITE, "/bluemap purge " + mapId) diff --git a/BlueMapCommon/src/main/java/de/bluecolored/bluemap/common/plugin/commands/MapSuggestionProvider.java b/BlueMapCommon/src/main/java/de/bluecolored/bluemap/common/plugin/commands/MapSuggestionProvider.java index bca6e84a..42906ec8 100644 --- a/BlueMapCommon/src/main/java/de/bluecolored/bluemap/common/plugin/commands/MapSuggestionProvider.java +++ b/BlueMapCommon/src/main/java/de/bluecolored/bluemap/common/plugin/commands/MapSuggestionProvider.java @@ -25,7 +25,6 @@ package de.bluecolored.bluemap.common.plugin.commands; import de.bluecolored.bluemap.common.plugin.Plugin; -import de.bluecolored.bluemap.core.map.BmMap; import java.util.Collection; import java.util.HashSet; @@ -40,7 +39,7 @@ public class MapSuggestionProvider extends AbstractSuggestionProvider { @Override public Collection getPossibleValues() { - return new HashSet<>(plugin.getMaps().keySet()); + return new HashSet<>(plugin.getBlueMap().getMaps().keySet()); } } diff --git a/BlueMapCommon/src/main/java/de/bluecolored/bluemap/common/plugin/commands/WorldOrMapSuggestionProvider.java b/BlueMapCommon/src/main/java/de/bluecolored/bluemap/common/plugin/commands/WorldOrMapSuggestionProvider.java index 4035c560..cc198d54 100644 --- a/BlueMapCommon/src/main/java/de/bluecolored/bluemap/common/plugin/commands/WorldOrMapSuggestionProvider.java +++ b/BlueMapCommon/src/main/java/de/bluecolored/bluemap/common/plugin/commands/WorldOrMapSuggestionProvider.java @@ -25,7 +25,6 @@ package de.bluecolored.bluemap.common.plugin.commands; import de.bluecolored.bluemap.common.plugin.Plugin; -import de.bluecolored.bluemap.core.world.World; import java.util.Collection; import java.util.HashSet; @@ -41,13 +40,8 @@ public class WorldOrMapSuggestionProvider extends AbstractSuggestionProvider< @Override public Collection getPossibleValues() { Collection values = new HashSet<>(); - - for (World world : plugin.getWorlds().values()) { - values.add(world.getName()); - } - - values.addAll(plugin.getMaps().keySet()); - + values.addAll(plugin.getBlueMap().getWorlds().keySet()); + values.addAll(plugin.getBlueMap().getMaps().keySet()); return values; } diff --git a/BlueMapCommon/src/main/java/de/bluecolored/bluemap/common/plugin/commands/WorldSuggestionProvider.java b/BlueMapCommon/src/main/java/de/bluecolored/bluemap/common/plugin/commands/WorldSuggestionProvider.java index a55cac9f..42a05cbf 100644 --- a/BlueMapCommon/src/main/java/de/bluecolored/bluemap/common/plugin/commands/WorldSuggestionProvider.java +++ b/BlueMapCommon/src/main/java/de/bluecolored/bluemap/common/plugin/commands/WorldSuggestionProvider.java @@ -25,7 +25,6 @@ package de.bluecolored.bluemap.common.plugin.commands; import de.bluecolored.bluemap.common.plugin.Plugin; -import de.bluecolored.bluemap.core.world.World; import java.util.Collection; import java.util.HashSet; @@ -40,13 +39,7 @@ public class WorldSuggestionProvider extends AbstractSuggestionProvider { @Override public Collection getPossibleValues() { - Collection values = new HashSet<>(); - - for (World world : plugin.getWorlds().values()) { - values.add(world.getName()); - } - - return values; + return new HashSet<>(plugin.getBlueMap().getWorlds().keySet()); } } diff --git a/BlueMapCommon/src/main/java/de/bluecolored/bluemap/common/plugin/skins/PlayerSkinUpdater.java b/BlueMapCommon/src/main/java/de/bluecolored/bluemap/common/plugin/skins/PlayerSkinUpdater.java index 3df5e797..8774fd7a 100644 --- a/BlueMapCommon/src/main/java/de/bluecolored/bluemap/common/plugin/skins/PlayerSkinUpdater.java +++ b/BlueMapCommon/src/main/java/de/bluecolored/bluemap/common/plugin/skins/PlayerSkinUpdater.java @@ -83,7 +83,7 @@ public class PlayerSkinUpdater implements ServerEventListener { return; } - Map maps = plugin.getMaps(); + Map maps = plugin.getBlueMap().getMaps(); if (maps == null) { Logger.global.logDebug("Could not update skin, since the plugin seems not to be ready."); return; diff --git a/BlueMapCommon/src/main/java/de/bluecolored/bluemap/common/serverinterface/Dimension.java b/BlueMapCommon/src/main/java/de/bluecolored/bluemap/common/serverinterface/Dimension.java deleted file mode 100644 index 7c557b7c..00000000 --- a/BlueMapCommon/src/main/java/de/bluecolored/bluemap/common/serverinterface/Dimension.java +++ /dev/null @@ -1,51 +0,0 @@ -/* - * This file is part of BlueMap, licensed under the MIT License (MIT). - * - * Copyright (c) Blue (Lukas Rieger) - * 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.serverinterface; - -import java.nio.file.Path; - -public enum Dimension { - - OVERWORLD ("Overworld", Path.of("")), - NETHER ("Nether", Path.of("DIM-1")), - END ("End", Path.of("DIM1")); - - private final String name; - private final Path dimensionSubPath; - - Dimension(String name, Path dimensionSubPath) { - this.name = name; - this.dimensionSubPath = dimensionSubPath; - } - - public String getName() { - return name; - } - - public Path getDimensionSubPath() { - return dimensionSubPath; - } - -} diff --git a/BlueMapCommon/src/main/java/de/bluecolored/bluemap/common/serverinterface/Server.java b/BlueMapCommon/src/main/java/de/bluecolored/bluemap/common/serverinterface/Server.java index dd110ed9..1a853a13 100644 --- a/BlueMapCommon/src/main/java/de/bluecolored/bluemap/common/serverinterface/Server.java +++ b/BlueMapCommon/src/main/java/de/bluecolored/bluemap/common/serverinterface/Server.java @@ -28,6 +28,7 @@ import de.bluecolored.bluemap.api.debug.DebugDump; import de.bluecolored.bluemap.core.MinecraftVersion; import de.bluecolored.bluemap.core.util.Tristate; import de.bluecolored.bluemap.core.world.World; +import de.bluecolored.bluemap.core.world.mca.MCAWorld; import java.nio.file.Path; import java.util.Collection; @@ -61,16 +62,28 @@ public interface Server { /** * Returns the correct {@link ServerWorld} for a {@link World} if there is any. */ - Optional getWorld(World world); + default Optional getServerWorld(World world) { + if (world instanceof MCAWorld) { + MCAWorld mcaWorld = (MCAWorld) world; + return getLoadedServerWorlds().stream() + .filter(serverWorld -> + serverWorld.getWorldFolder().toAbsolutePath().normalize() + .equals(mcaWorld.getWorldFolder().toAbsolutePath().normalize()) && + serverWorld.getDimension().equals(mcaWorld.getDimension()) + ) + .findAny(); + } + return Optional.empty(); + } /** * Returns the correct {@link ServerWorld} for any Object if there is any, this should return the correct ServerWorld * for any implementation-specific object that represent or identify a world in any way.
* Used for the API implementation. */ - default Optional getWorld(Object world) { + default Optional getServerWorld(Object world) { if (world instanceof World) - return getWorld((World) world); + return getServerWorld((World) world); return Optional.empty(); } @@ -78,7 +91,7 @@ public interface Server { * Returns all loaded worlds of this server. */ @DebugDump - Collection getLoadedWorlds(); + Collection getLoadedServerWorlds(); /** * Returns a collection of the states of players that are currently online diff --git a/BlueMapCommon/src/main/java/de/bluecolored/bluemap/common/serverinterface/ServerWorld.java b/BlueMapCommon/src/main/java/de/bluecolored/bluemap/common/serverinterface/ServerWorld.java index 9066fae5..69216b8d 100644 --- a/BlueMapCommon/src/main/java/de/bluecolored/bluemap/common/serverinterface/ServerWorld.java +++ b/BlueMapCommon/src/main/java/de/bluecolored/bluemap/common/serverinterface/ServerWorld.java @@ -24,6 +24,7 @@ */ package de.bluecolored.bluemap.common.serverinterface; +import de.bluecolored.bluemap.api.debug.DebugDump; import de.bluecolored.bluemap.core.util.Key; import java.io.IOException; @@ -31,8 +32,10 @@ import java.nio.file.Path; public interface ServerWorld { + @DebugDump Path getWorldFolder(); + @DebugDump Key getDimension(); /** diff --git a/BlueMapCommon/src/main/java/de/bluecolored/bluemap/common/web/BlueMapResponseModifier.java b/BlueMapCommon/src/main/java/de/bluecolored/bluemap/common/web/BlueMapResponseModifier.java index c11d07f5..ce0c362a 100644 --- a/BlueMapCommon/src/main/java/de/bluecolored/bluemap/common/web/BlueMapResponseModifier.java +++ b/BlueMapCommon/src/main/java/de/bluecolored/bluemap/common/web/BlueMapResponseModifier.java @@ -24,12 +24,14 @@ */ package de.bluecolored.bluemap.common.web; +import de.bluecolored.bluemap.api.debug.DebugDump; import de.bluecolored.bluemap.common.web.http.HttpRequest; import de.bluecolored.bluemap.common.web.http.HttpRequestHandler; import de.bluecolored.bluemap.common.web.http.HttpResponse; import de.bluecolored.bluemap.common.web.http.HttpStatusCode; import de.bluecolored.bluemap.core.BlueMap; +@DebugDump public class BlueMapResponseModifier implements HttpRequestHandler { private final HttpRequestHandler delegate; diff --git a/BlueMapCommon/src/main/java/de/bluecolored/bluemap/common/web/FileRequestHandler.java b/BlueMapCommon/src/main/java/de/bluecolored/bluemap/common/web/FileRequestHandler.java index 0373ed5a..4d0a9589 100644 --- a/BlueMapCommon/src/main/java/de/bluecolored/bluemap/common/web/FileRequestHandler.java +++ b/BlueMapCommon/src/main/java/de/bluecolored/bluemap/common/web/FileRequestHandler.java @@ -24,6 +24,7 @@ */ package de.bluecolored.bluemap.common.web; +import de.bluecolored.bluemap.api.debug.DebugDump; import de.bluecolored.bluemap.common.web.http.*; import org.apache.commons.lang3.time.DateFormatUtils; @@ -38,6 +39,7 @@ import java.util.Locale; import java.util.TimeZone; import java.util.concurrent.TimeUnit; +@DebugDump public class FileRequestHandler implements HttpRequestHandler { private final Path webRoot; diff --git a/BlueMapCommon/src/main/java/de/bluecolored/bluemap/common/web/LoggingRequestHandler.java b/BlueMapCommon/src/main/java/de/bluecolored/bluemap/common/web/LoggingRequestHandler.java index 06692347..e71ad860 100644 --- a/BlueMapCommon/src/main/java/de/bluecolored/bluemap/common/web/LoggingRequestHandler.java +++ b/BlueMapCommon/src/main/java/de/bluecolored/bluemap/common/web/LoggingRequestHandler.java @@ -24,9 +24,11 @@ */ package de.bluecolored.bluemap.common.web; +import de.bluecolored.bluemap.api.debug.DebugDump; import de.bluecolored.bluemap.common.web.http.*; import de.bluecolored.bluemap.core.logger.Logger; +@DebugDump public class LoggingRequestHandler implements HttpRequestHandler { private final HttpRequestHandler delegate; diff --git a/BlueMapCommon/src/main/java/de/bluecolored/bluemap/common/web/MapRequestHandler.java b/BlueMapCommon/src/main/java/de/bluecolored/bluemap/common/web/MapRequestHandler.java index 40d12d5f..c7efbab6 100644 --- a/BlueMapCommon/src/main/java/de/bluecolored/bluemap/common/web/MapRequestHandler.java +++ b/BlueMapCommon/src/main/java/de/bluecolored/bluemap/common/web/MapRequestHandler.java @@ -28,6 +28,7 @@ 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.Server; +import de.bluecolored.bluemap.common.serverinterface.ServerWorld; import de.bluecolored.bluemap.core.map.BmMap; import de.bluecolored.bluemap.core.storage.Storage; import org.jetbrains.annotations.Nullable; @@ -40,7 +41,7 @@ public class MapRequestHandler extends RoutingRequestHandler { public MapRequestHandler(BmMap map, Server serverInterface, PluginConfig pluginConfig, Predicate playerFilter) { this(map.getId(), map.getStorage(), - new LivePlayersDataSupplier(serverInterface, pluginConfig, map.getWorldId(), playerFilter), + createPlayersDataSupplier(map, serverInterface, pluginConfig, playerFilter), new LiveMarkersDataSupplier(map.getMarkerSets())); } @@ -67,4 +68,10 @@ public class MapRequestHandler extends RoutingRequestHandler { } } + private static @Nullable LivePlayersDataSupplier createPlayersDataSupplier(BmMap map, Server serverInterface, PluginConfig pluginConfig, Predicate playerFilter) { + ServerWorld world = serverInterface.getServerWorld(map.getWorld()).orElse(null); + if (world == null) return null; + return new LivePlayersDataSupplier(serverInterface, pluginConfig, world, playerFilter); + } + } diff --git a/BlueMapCommon/src/main/java/de/bluecolored/bluemap/common/web/MapStorageRequestHandler.java b/BlueMapCommon/src/main/java/de/bluecolored/bluemap/common/web/MapStorageRequestHandler.java index 586f343b..c0b726c5 100644 --- a/BlueMapCommon/src/main/java/de/bluecolored/bluemap/common/web/MapStorageRequestHandler.java +++ b/BlueMapCommon/src/main/java/de/bluecolored/bluemap/common/web/MapStorageRequestHandler.java @@ -26,6 +26,7 @@ package de.bluecolored.bluemap.common.web; import com.flowpowered.math.vector.Vector2i; import de.bluecolored.bluemap.api.ContentTypeRegistry; +import de.bluecolored.bluemap.api.debug.DebugDump; import de.bluecolored.bluemap.common.web.http.*; import de.bluecolored.bluemap.core.logger.Logger; import de.bluecolored.bluemap.core.map.BmMap; @@ -41,6 +42,7 @@ import java.util.*; import java.util.regex.Matcher; import java.util.regex.Pattern; +@DebugDump public class MapStorageRequestHandler implements HttpRequestHandler { private static final Pattern TILE_PATTERN = Pattern.compile("tiles/([\\d/]+)/x(-?[\\d/]+)z(-?[\\d/]+).*"); diff --git a/BlueMapCommon/src/main/java/de/bluecolored/bluemap/common/web/RoutingRequestHandler.java b/BlueMapCommon/src/main/java/de/bluecolored/bluemap/common/web/RoutingRequestHandler.java index 30eeadb5..b21f6e31 100644 --- a/BlueMapCommon/src/main/java/de/bluecolored/bluemap/common/web/RoutingRequestHandler.java +++ b/BlueMapCommon/src/main/java/de/bluecolored/bluemap/common/web/RoutingRequestHandler.java @@ -24,6 +24,7 @@ */ package de.bluecolored.bluemap.common.web; +import de.bluecolored.bluemap.api.debug.DebugDump; import de.bluecolored.bluemap.common.web.http.HttpRequest; import de.bluecolored.bluemap.common.web.http.HttpRequestHandler; import de.bluecolored.bluemap.common.web.http.HttpResponse; @@ -34,6 +35,7 @@ import java.util.LinkedList; import java.util.regex.Matcher; import java.util.regex.Pattern; +@DebugDump public class RoutingRequestHandler implements HttpRequestHandler { public LinkedList routes; @@ -77,6 +79,7 @@ public class RoutingRequestHandler implements HttpRequestHandler { return new HttpResponse(HttpStatusCode.BAD_REQUEST); } + @DebugDump private static class Route { private final Pattern routePattern; diff --git a/BlueMapCommon/src/main/java/de/bluecolored/bluemap/common/web/http/HttpServer.java b/BlueMapCommon/src/main/java/de/bluecolored/bluemap/common/web/http/HttpServer.java index ca93d31f..562d15f9 100644 --- a/BlueMapCommon/src/main/java/de/bluecolored/bluemap/common/web/http/HttpServer.java +++ b/BlueMapCommon/src/main/java/de/bluecolored/bluemap/common/web/http/HttpServer.java @@ -24,8 +24,11 @@ */ package de.bluecolored.bluemap.common.web.http; +import de.bluecolored.bluemap.api.debug.DebugDump; + import java.io.IOException; +@DebugDump public class HttpServer extends Server { private final HttpRequestHandler requestHandler; diff --git a/BlueMapCore/build.gradle.kts b/BlueMapCore/build.gradle.kts index 4589db39..da0d6399 100644 --- a/BlueMapCore/build.gradle.kts +++ b/BlueMapCore/build.gradle.kts @@ -69,6 +69,7 @@ dependencies { api ("com.github.BlueMap-Minecraft:BlueNBT:v1.3.0") api ("org.apache.commons:commons-dbcp2:2.9.0") api ("io.airlift:aircompressor:0.24") + api ("org.lz4:lz4-java:1.8.0") api ("de.bluecolored.bluemap.api:BlueMapAPI") diff --git a/BlueMapCore/src/main/java/de/bluecolored/bluemap/core/resources/datapack/DataPack.java b/BlueMapCore/src/main/java/de/bluecolored/bluemap/core/resources/datapack/DataPack.java index 8c98f5a6..6ad207e4 100644 --- a/BlueMapCore/src/main/java/de/bluecolored/bluemap/core/resources/datapack/DataPack.java +++ b/BlueMapCore/src/main/java/de/bluecolored/bluemap/core/resources/datapack/DataPack.java @@ -32,12 +32,13 @@ public class DataPack { return dimensionTypes.get(key); } - public void load(Path root) { + public void load(Path root) throws InterruptedException { Logger.global.logDebug("Loading datapack from: " + root + " ..."); loadPath(root); } - private void loadPath(Path root) { + private void loadPath(Path root) throws InterruptedException { + if (Thread.interrupted()) throw new InterruptedException(); if (!Files.isDirectory(root)) { try (FileSystem fileSystem = FileSystems.newFileSystem(root, (ClassLoader) null)) { for (Path fsRoot : fileSystem.getRootDirectories()) { diff --git a/BlueMapCore/src/main/java/de/bluecolored/bluemap/core/resources/resourcepack/ResourcePack.java b/BlueMapCore/src/main/java/de/bluecolored/bluemap/core/resources/resourcepack/ResourcePack.java index e6a5f911..e992ff5a 100644 --- a/BlueMapCore/src/main/java/de/bluecolored/bluemap/core/resources/resourcepack/ResourcePack.java +++ b/BlueMapCore/src/main/java/de/bluecolored/bluemap/core/resources/resourcepack/ResourcePack.java @@ -183,20 +183,26 @@ public class ResourcePack { return props.build(); } - public synchronized void loadResources(Iterable roots) throws IOException { + public synchronized void loadResources(Iterable roots) throws IOException, InterruptedException { Logger.global.logInfo("Loading resources..."); for (Path root : roots) { + if (Thread.interrupted()) throw new InterruptedException(); + Logger.global.logDebug("Loading resources from: " + root + " ..."); loadResourcePath(root, this::loadResources); } Logger.global.logInfo("Loading textures..."); for (Path root : roots) { + if (Thread.interrupted()) throw new InterruptedException(); + Logger.global.logDebug("Loading textures from: " + root + " ..."); loadResourcePath(root, this::loadTextures); } + if (Thread.interrupted()) throw new InterruptedException(); + Logger.global.logInfo("Baking resources..."); bake(); @@ -204,7 +210,8 @@ public class ResourcePack { Logger.global.logInfo("Resources loaded."); } - private void loadResourcePath(Path root, PathLoader resourceLoader) throws IOException { + private void loadResourcePath(Path root, PathLoader resourceLoader) throws IOException, InterruptedException { + if (Thread.interrupted()) throw new InterruptedException(); if (!Files.isDirectory(root)) { try (FileSystem fileSystem = FileSystems.newFileSystem(root, (ClassLoader) null)) { for (Path fsRoot : fileSystem.getRootDirectories()) { @@ -387,7 +394,7 @@ public class ResourcePack { } } - private void bake() throws IOException { + private void bake() throws IOException, InterruptedException { // fill path maps blockStates.keySet().forEach(path -> blockStatePaths.put(path.getFormatted(), path)); @@ -399,11 +406,15 @@ public class ResourcePack { model.optimize(this); } + if (Thread.interrupted()) throw new InterruptedException(); + // apply model parents for (BlockModel model : blockModels.values()) { model.applyParent(this); } + if (Thread.interrupted()) throw new InterruptedException(); + // calculate model properties for (BlockModel model : blockModels.values()) { model.calculateProperties(this); diff --git a/BlueMapCore/src/main/java/de/bluecolored/bluemap/core/storage/Compression.java b/BlueMapCore/src/main/java/de/bluecolored/bluemap/core/storage/Compression.java index 6028e524..6803b547 100644 --- a/BlueMapCore/src/main/java/de/bluecolored/bluemap/core/storage/Compression.java +++ b/BlueMapCore/src/main/java/de/bluecolored/bluemap/core/storage/Compression.java @@ -26,19 +26,25 @@ package de.bluecolored.bluemap.core.storage; import io.airlift.compress.zstd.ZstdInputStream; import io.airlift.compress.zstd.ZstdOutputStream; +import net.jpountz.lz4.LZ4FrameInputStream; +import net.jpountz.lz4.LZ4FrameOutputStream; import java.io.IOException; import java.io.InputStream; import java.io.OutputStream; import java.util.NoSuchElementException; -import java.util.zip.*; +import java.util.zip.DeflaterOutputStream; +import java.util.zip.GZIPInputStream; +import java.util.zip.GZIPOutputStream; +import java.util.zip.InflaterInputStream; public enum Compression { NONE("none", "", out -> out, in -> in), GZIP("gzip", ".gz", GZIPOutputStream::new, GZIPInputStream::new), DEFLATE("deflate", ".deflate", DeflaterOutputStream::new, InflaterInputStream::new), - ZSTD("zstd", ".zst", ZstdOutputStream::new, ZstdInputStream::new); + ZSTD("zstd", ".zst", ZstdOutputStream::new, ZstdInputStream::new), + LZ4("lz4", ".lz4", LZ4FrameOutputStream::new, LZ4FrameInputStream::new); private final String typeId; private final String fileSuffix; diff --git a/BlueMapCore/src/main/java/de/bluecolored/bluemap/core/util/Key.java b/BlueMapCore/src/main/java/de/bluecolored/bluemap/core/util/Key.java index 3f255cfe..180436b5 100644 --- a/BlueMapCore/src/main/java/de/bluecolored/bluemap/core/util/Key.java +++ b/BlueMapCore/src/main/java/de/bluecolored/bluemap/core/util/Key.java @@ -26,10 +26,15 @@ package de.bluecolored.bluemap.core.util; import de.bluecolored.bluemap.api.debug.DebugDump; -@DebugDump -public class Key { +import java.util.concurrent.ConcurrentHashMap; - private static final String MINECRAFT_NAMESPACE = "minecraft"; +@DebugDump +public class Key implements Keyed { + + private static final ConcurrentHashMap STRING_INTERN_POOL = new ConcurrentHashMap<>(); + + public static final String MINECRAFT_NAMESPACE = "minecraft"; + public static final String BLUEMAP_NAMESPACE = "bluemap"; private final String namespace; private final String value; @@ -44,15 +49,15 @@ public class Key { value = formatted.substring(namespaceSeparator + 1); } - this.namespace = namespace.intern(); - this.value = value.intern(); - this.formatted = (this.namespace + ":" + this.value).intern(); + this.namespace = intern(namespace); + this.value = intern(value); + this.formatted = intern(this.namespace + ":" + this.value); } public Key(String namespace, String value) { - this.namespace = namespace.intern(); - this.value = value.intern(); - this.formatted = (this.namespace + ":" + this.value).intern(); + this.namespace = intern(namespace); + this.value = intern(value); + this.formatted = intern(this.namespace + ":" + this.value); } public String getNamespace() { @@ -67,6 +72,11 @@ public class Key { return formatted; } + @Override + public Key getKey() { + return this; + } + @SuppressWarnings("StringEquality") @Override public boolean equals(Object o) { @@ -78,11 +88,36 @@ public class Key { @Override public int hashCode() { - return getFormatted().hashCode(); + return formatted.hashCode(); } @Override public String toString() { return formatted; } + + public static Key parse(String formatted) { + return new Key(formatted); + } + + public static Key parse(String formatted, String defaultNamespace) { + String namespace = defaultNamespace; + String value = formatted; + int namespaceSeparator = formatted.indexOf(':'); + if (namespaceSeparator > 0) { + namespace = formatted.substring(0, namespaceSeparator); + value = formatted.substring(namespaceSeparator + 1); + } + + return new Key(namespace, value); + } + + /** + * Using our own function instead of {@link String#intern()} since the ConcurrentHashMap is much faster. + */ + private static String intern(String string) { + String interned = STRING_INTERN_POOL.putIfAbsent(string, string); + return interned != null ? interned : string; + } + } diff --git a/BlueMapCore/src/main/java/de/bluecolored/bluemap/core/util/Keyed.java b/BlueMapCore/src/main/java/de/bluecolored/bluemap/core/util/Keyed.java new file mode 100644 index 00000000..f51082bf --- /dev/null +++ b/BlueMapCore/src/main/java/de/bluecolored/bluemap/core/util/Keyed.java @@ -0,0 +1,7 @@ +package de.bluecolored.bluemap.core.util; + +public interface Keyed { + + Key getKey(); + +} diff --git a/BlueMapCore/src/main/java/de/bluecolored/bluemap/core/util/Registry.java b/BlueMapCore/src/main/java/de/bluecolored/bluemap/core/util/Registry.java new file mode 100644 index 00000000..d1805592 --- /dev/null +++ b/BlueMapCore/src/main/java/de/bluecolored/bluemap/core/util/Registry.java @@ -0,0 +1,53 @@ +package de.bluecolored.bluemap.core.util; + +import org.jetbrains.annotations.Nullable; + +import java.util.Collection; +import java.util.Collections; +import java.util.Objects; +import java.util.Set; +import java.util.concurrent.ConcurrentHashMap; + +public class Registry { + + private final ConcurrentHashMap entries; + + public Registry() { + this.entries = new ConcurrentHashMap<>(); + } + + /** + * Registers a new entry, only if there is no entry with the same key registered already. + * Does nothing otherwise. + * @param entry The new entry to be added to this registry + * @return true if the entry has been added, false if there is already an entry with the same key registered + */ + public boolean register(T entry) { + Objects.requireNonNull(entry, "registry entry can not be null"); + return entries.putIfAbsent(entry.getKey(), entry) != null; + } + + /** + * Gets an entry from this registry for a key. + * @param key The key to search for + * @return The entry with the key, or null if there is no entry for this key + */ + public @Nullable T get(Key key) { + return entries.get(key); + } + + /** + * Returns an unmodifiable set of all keys this registry contains entries for + */ + public Set keys() { + return Collections.unmodifiableSet(entries.keySet()); + } + + /** + * Returns an unmodifiable collection of entries in this registry + */ + public Collection values() { + return Collections.unmodifiableCollection(entries.values()); + } + +} diff --git a/BlueMapCore/src/main/java/de/bluecolored/bluemap/core/world/World.java b/BlueMapCore/src/main/java/de/bluecolored/bluemap/core/world/World.java index fbd2498e..66ba83c7 100644 --- a/BlueMapCore/src/main/java/de/bluecolored/bluemap/core/world/World.java +++ b/BlueMapCore/src/main/java/de/bluecolored/bluemap/core/world/World.java @@ -38,6 +38,8 @@ import java.util.Collection; */ public interface World { + String getId(); + String getName(); Vector3i getSpawnPoint(); diff --git a/BlueMapCore/src/main/java/de/bluecolored/bluemap/core/world/block/Block.java b/BlueMapCore/src/main/java/de/bluecolored/bluemap/core/world/block/Block.java index cb59ba68..476061f9 100644 --- a/BlueMapCore/src/main/java/de/bluecolored/bluemap/core/world/block/Block.java +++ b/BlueMapCore/src/main/java/de/bluecolored/bluemap/core/world/block/Block.java @@ -103,22 +103,6 @@ public class Block> { return self(); } - /** - * copy with offset - */ - public T copy(Block source, int dx, int dy, int dz) { - this.world = source.world; - this.x = source.x + dx; - this.y = source.y + dy; - this.z = source.z + dz; - - this.chunk = null; - - reset(); - - return self(); - } - public World getWorld() { return world; } diff --git a/BlueMapCore/src/main/java/de/bluecolored/bluemap/core/world/block/BlockNeighborhood.java b/BlueMapCore/src/main/java/de/bluecolored/bluemap/core/world/block/BlockNeighborhood.java index ec9fc793..24e08e42 100644 --- a/BlueMapCore/src/main/java/de/bluecolored/bluemap/core/world/block/BlockNeighborhood.java +++ b/BlueMapCore/src/main/java/de/bluecolored/bluemap/core/world/block/BlockNeighborhood.java @@ -53,6 +53,19 @@ public class BlockNeighborhood> extends ExtendedB init(); } + @Override + public T set(int x, int y, int z) { + return copy(getBlock(x, y, z)); + } + + @Override + public T set(World world, int x, int y, int z) { + if (getWorld() == world) + return copy(getBlock(x, y, z)); + else + return super.set(world, x, y, z); + } + @Override protected void reset() { super.reset(); @@ -68,25 +81,28 @@ public class BlockNeighborhood> extends ExtendedB } public ExtendedBlock getNeighborBlock(int dx, int dy, int dz) { - int i = neighborIndex(dx, dy, dz); - if (i == thisIndex()) return this; - return neighborhood[i].set( - getWorld(), + return getBlock( getX() + dx, getY() + dy, getZ() + dz ); } + private ExtendedBlock getBlock(int x, int y, int z) { + int i = index(x, y, z); + if (i == thisIndex()) return this; + return neighborhood[i].set(getWorld(), x, y, z); + } + private int thisIndex() { - if (thisIndex == -1) thisIndex = neighborIndex(0, 0, 0); + if (thisIndex == -1) thisIndex = index(getX(), getY(), getZ()); return thisIndex; } - private int neighborIndex(int dx, int dy, int dz) { - return ((getX() + dx) & DIAMETER_MASK) * DIAMETER_SQUARED + - ((getY() + dy) & DIAMETER_MASK) * DIAMETER + - ((getZ() + dz) & DIAMETER_MASK); + private int index(int x, int y, int z) { + return (x & DIAMETER_MASK) * DIAMETER_SQUARED + + (y & DIAMETER_MASK) * DIAMETER + + (z & DIAMETER_MASK); } } diff --git a/BlueMapCore/src/main/java/de/bluecolored/bluemap/core/world/block/ExtendedBlock.java b/BlueMapCore/src/main/java/de/bluecolored/bluemap/core/world/block/ExtendedBlock.java index a021ac39..8870d50d 100644 --- a/BlueMapCore/src/main/java/de/bluecolored/bluemap/core/world/block/ExtendedBlock.java +++ b/BlueMapCore/src/main/java/de/bluecolored/bluemap/core/world/block/ExtendedBlock.java @@ -33,6 +33,7 @@ import java.util.Objects; public class ExtendedBlock> extends Block { private final ResourcePack resourcePack; private final RenderSettings renderSettings; + private BlockProperties properties; private Biome biome; @@ -56,6 +57,21 @@ public class ExtendedBlock> extends Block { this.isCaveCalculated = false; } + public T copy(ExtendedBlock source) { + super.copy(source); + + this.properties = source.properties; + this.biome = source.biome; + + this.insideRenderBoundsCalculated = source.insideRenderBoundsCalculated; + this.insideRenderBounds = source.insideRenderBounds; + + this.isCaveCalculated = source.isCaveCalculated; + this.isCave = source.isCave; + + return self(); + } + @Override public BlockState getBlockState() { if (renderSettings.isRenderEdges() && !isInsideRenderBounds()) return BlockState.AIR; diff --git a/BlueMapCore/src/main/java/de/bluecolored/bluemap/core/world/mca/MCAWorld.java b/BlueMapCore/src/main/java/de/bluecolored/bluemap/core/world/mca/MCAWorld.java index 8f719fb9..9d35dfba 100644 --- a/BlueMapCore/src/main/java/de/bluecolored/bluemap/core/world/mca/MCAWorld.java +++ b/BlueMapCore/src/main/java/de/bluecolored/bluemap/core/world/mca/MCAWorld.java @@ -4,13 +4,17 @@ import com.flowpowered.math.vector.Vector2i; import com.flowpowered.math.vector.Vector3i; import com.github.benmanes.caffeine.cache.Caffeine; import com.github.benmanes.caffeine.cache.LoadingCache; +import de.bluecolored.bluemap.api.debug.DebugDump; import de.bluecolored.bluemap.core.BlueMap; import de.bluecolored.bluemap.core.logger.Logger; import de.bluecolored.bluemap.core.resources.datapack.DataPack; import de.bluecolored.bluemap.core.util.Grid; import de.bluecolored.bluemap.core.util.Key; import de.bluecolored.bluemap.core.util.Vector2iCache; -import de.bluecolored.bluemap.core.world.*; +import de.bluecolored.bluemap.core.world.Chunk; +import de.bluecolored.bluemap.core.world.DimensionType; +import de.bluecolored.bluemap.core.world.Region; +import de.bluecolored.bluemap.core.world.World; import de.bluecolored.bluemap.core.world.mca.chunk.ChunkLoader; import de.bluecolored.bluemap.core.world.mca.data.LevelData; import de.bluecolored.bluemap.core.world.mca.region.RegionType; @@ -23,7 +27,6 @@ import java.io.IOException; import java.io.InputStream; import java.nio.file.Files; import java.nio.file.Path; -import java.nio.file.StandardOpenOption; import java.util.*; import java.util.concurrent.TimeUnit; import java.util.stream.Collectors; @@ -31,6 +34,7 @@ import java.util.zip.GZIPInputStream; @Getter @ToString +@DebugDump public class MCAWorld implements World { private static final Grid CHUNK_GRID = new Grid(16); @@ -61,8 +65,8 @@ public class MCAWorld implements World { .expireAfterWrite(10, TimeUnit.MINUTES) .build(this::loadChunk); - public MCAWorld(String id, Path worldFolder, Key dimension, LevelData levelData, DataPack dataPack) { - this.id = id; + private MCAWorld(Path worldFolder, Key dimension, LevelData levelData, DataPack dataPack) { + this.id = id(worldFolder, dimension); this.worldFolder = worldFolder; this.dimension = dimension; this.levelData = levelData; @@ -88,7 +92,7 @@ public class MCAWorld implements World { levelData.getData().getSpawnZ() ); this.dimensionFolder = resolveDimensionFolder(worldFolder, dimension); - this.regionFolder = getWorldFolder().resolve("region"); + this.regionFolder = dimensionFolder.resolve("region"); } @Override @@ -219,18 +223,7 @@ public class MCAWorld implements World { return Chunk.EMPTY_CHUNK; } - public static MCAWorld load(Path worldFolder, Key dimension) throws IOException { - // load or create bluemap.id - Path idFile = worldFolder.resolve("bluemap.id"); - String id; - if (!Files.exists(idFile)) { - id = UUID.randomUUID().toString(); - Files.writeString(idFile, id, StandardOpenOption.CREATE, StandardOpenOption.TRUNCATE_EXISTING); - } else { - id = Files.readString(idFile); - } - id += "-" + dimension.getFormatted(); - + public static MCAWorld load(Path worldFolder, Key dimension) throws IOException, InterruptedException { // load level.dat Path levelFile = worldFolder.resolve("level.dat"); InputStream levelFileIn = new GZIPInputStream(new BufferedInputStream(Files.newInputStream(levelFile))); @@ -253,10 +246,20 @@ public class MCAWorld implements World { dataPack.bake(); // create world - return new MCAWorld(id, worldFolder, dimension, levelData, dataPack); + return new MCAWorld(worldFolder, dimension, levelData, dataPack); } - private static Path resolveDimensionFolder(Path worldFolder, Key dimension) { + public static String id(Path worldFolder, Key dimension) { + worldFolder = worldFolder.toAbsolutePath().normalize(); + + Path workingDir = Path.of("").toAbsolutePath().normalize(); + if (worldFolder.startsWith(workingDir)) + worldFolder = workingDir.relativize(worldFolder); + + return "MCA#" + worldFolder + "#" + dimension.getFormatted(); + } + + public static Path resolveDimensionFolder(Path worldFolder, Key dimension) { if (DataPack.DIMENSION_OVERWORLD.equals(dimension)) return worldFolder; if (DataPack.DIMENSION_THE_NETHER.equals(dimension)) return worldFolder.resolve("DIM-1"); if (DataPack.DIMENSION_THE_END.equals(dimension)) return worldFolder.resolve("DIM1"); diff --git a/BlueMapCore/src/main/java/de/bluecolored/bluemap/core/world/mca/chunk/ChunkLoader.java b/BlueMapCore/src/main/java/de/bluecolored/bluemap/core/world/mca/chunk/ChunkLoader.java index 27ab17c9..f581e178 100644 --- a/BlueMapCore/src/main/java/de/bluecolored/bluemap/core/world/mca/chunk/ChunkLoader.java +++ b/BlueMapCore/src/main/java/de/bluecolored/bluemap/core/world/mca/chunk/ChunkLoader.java @@ -7,6 +7,7 @@ import lombok.Getter; import lombok.RequiredArgsConstructor; import org.jetbrains.annotations.Nullable; +import java.io.BufferedInputStream; import java.io.ByteArrayInputStream; import java.io.IOException; import java.io.InputStream; @@ -28,13 +29,18 @@ public class ChunkLoader { // try last used version ChunkVersionLoader usedLoader = lastUsedLoader; - MCAChunk chunk = usedLoader.load(region, compression.decompress(in)); + MCAChunk chunk; + try (InputStream decompressedIn = new BufferedInputStream(compression.decompress(in))) { + chunk = usedLoader.load(region, decompressedIn); + } // check version and reload chunk if the wrong loader has been used and a better one has been found ChunkVersionLoader actualLoader = findBestLoaderForVersion(chunk.getDataVersion()); if (actualLoader != null && usedLoader != actualLoader) { in.reset(); // reset read position - chunk = actualLoader.load(region, compression.decompress(in)); + try (InputStream decompressedIn = new BufferedInputStream(compression.decompress(in))) { + chunk = actualLoader.load(region, decompressedIn); + } lastUsedLoader = actualLoader; } diff --git a/BlueMapCore/src/main/java/de/bluecolored/bluemap/core/world/mca/data/LevelData.java b/BlueMapCore/src/main/java/de/bluecolored/bluemap/core/world/mca/data/LevelData.java index 7da02e17..83bb4006 100644 --- a/BlueMapCore/src/main/java/de/bluecolored/bluemap/core/world/mca/data/LevelData.java +++ b/BlueMapCore/src/main/java/de/bluecolored/bluemap/core/world/mca/data/LevelData.java @@ -1,5 +1,6 @@ package de.bluecolored.bluemap.core.world.mca.data; +import de.bluecolored.bluemap.api.debug.DebugDump; import lombok.Getter; import java.util.HashMap; @@ -7,11 +8,13 @@ import java.util.Map; @Getter @SuppressWarnings("FieldMayBeFinal") +@DebugDump public class LevelData { private Data data = new Data(); @Getter + @DebugDump public static class Data { private String levelName = "world"; private int spawnX = 0, spawnY = 0, spawnZ = 0; @@ -19,11 +22,13 @@ public class LevelData { } @Getter + @DebugDump public static class WGSettings { private Map dimensions = new HashMap<>(); } @Getter + @DebugDump public static class Dimension { private String type = "minecraft:overworld"; } diff --git a/BlueMapCore/src/main/java/de/bluecolored/bluemap/core/world/mca/region/MCARegion.java b/BlueMapCore/src/main/java/de/bluecolored/bluemap/core/world/mca/region/MCARegion.java index 0eaf7dcd..70afac78 100644 --- a/BlueMapCore/src/main/java/de/bluecolored/bluemap/core/world/mca/region/MCARegion.java +++ b/BlueMapCore/src/main/java/de/bluecolored/bluemap/core/world/mca/region/MCARegion.java @@ -91,7 +91,13 @@ public class MCARegion implements Region { int size = header[3] * 4096; if (size == 0) return Chunk.EMPTY_CHUNK; - return loadChunk(channel, offset, size, new byte[size]); + + byte[] chunkDataBuffer = new byte[size]; + + channel.position(offset); + readFully(channel, chunkDataBuffer, 0, size); + + return loadChunk(chunkDataBuffer, size); } } @@ -140,7 +146,10 @@ public class MCARegion implements Region { if (chunkDataBuffer == null || chunkDataBuffer.length < size) chunkDataBuffer = new byte[size]; - MCAChunk chunk = loadChunk(channel, offset, size, chunkDataBuffer); + channel.position(offset); + readFully(channel, chunkDataBuffer, 0, size); + + MCAChunk chunk = loadChunk(chunkDataBuffer, size); consumer.accept(chunkX, chunkZ, chunk); } } @@ -148,21 +157,19 @@ public class MCARegion implements Region { } } - private MCAChunk loadChunk(FileChannel channel, int offset, int size, byte[] dataBuffer) throws IOException { - channel.position(offset); - readFully(channel, dataBuffer, 0, size); - - int compressionTypeId = dataBuffer[4]; + private MCAChunk loadChunk(byte[] data, int size) throws IOException { + int compressionTypeId = data[4]; Compression compression; switch (compressionTypeId) { case 0 : case 3 : compression = Compression.NONE; break; case 1 : compression = Compression.GZIP; break; case 2 : compression = Compression.DEFLATE; break; + case 4 : compression = Compression.LZ4; break; default: throw new IOException("Unknown chunk compression-id: " + compressionTypeId); } - return world.getChunkLoader().load(this, dataBuffer, 5, size - 5, compression); + return world.getChunkLoader().load(this, data, 5, size - 5, compression); } public static String getRegionFileName(int regionX, int regionZ) { @@ -175,14 +182,16 @@ public class MCARegion implements Region { } private static void readFully(ReadableByteChannel src, ByteBuffer bb, int off, int len) throws IOException { - int n = 0; - while (n < len) { - bb.limit(Math.min(off + len, bb.capacity())); - bb.position(off); - int count = src.read(bb); - if (count < 0) throw new EOFException(); - n += count; - } + int limit = off + len; + if (limit > bb.capacity()) throw new IllegalArgumentException("buffer too small"); + + bb.limit(limit); + bb.position(off); + + do { + int read = src.read(bb); + if (read < 0) throw new EOFException(); + } while (bb.remaining() > 0); } } diff --git a/implementations/cli/src/main/java/de/bluecolored/bluemap/cli/BlueMapCLI.java b/implementations/cli/src/main/java/de/bluecolored/bluemap/cli/BlueMapCLI.java index e317b748..0599b17f 100644 --- a/implementations/cli/src/main/java/de/bluecolored/bluemap/cli/BlueMapCLI.java +++ b/implementations/cli/src/main/java/de/bluecolored/bluemap/cli/BlueMapCLI.java @@ -35,10 +35,6 @@ import de.bluecolored.bluemap.common.plugin.RegionFileWatchService; import de.bluecolored.bluemap.common.rendermanager.MapUpdateTask; import de.bluecolored.bluemap.common.rendermanager.RenderManager; import de.bluecolored.bluemap.common.rendermanager.RenderTask; -import de.bluecolored.bluemap.common.serverinterface.Player; -import de.bluecolored.bluemap.common.serverinterface.ServerEventListener; -import de.bluecolored.bluemap.common.serverinterface.Server; -import de.bluecolored.bluemap.common.serverinterface.ServerWorld; import de.bluecolored.bluemap.common.web.*; import de.bluecolored.bluemap.common.web.http.HttpRequestHandler; import de.bluecolored.bluemap.common.web.http.HttpServer; @@ -67,10 +63,10 @@ import java.util.concurrent.TimeUnit; import java.util.function.Predicate; import java.util.regex.Pattern; -public class BlueMapCLI implements Server { +public class BlueMapCLI { private MinecraftVersion minecraftVersion = MinecraftVersion.LATEST_SUPPORTED; - private Path configFolder; + private Path configFolder = Path.of("config"); public void renderMaps(BlueMapService blueMap, boolean watch, boolean forceRender, boolean forceGenerateWebapp, @Nullable String mapsToRender) throws ConfigurationException, IOException, InterruptedException { @@ -82,7 +78,7 @@ public class BlueMapCLI implements Server { blueMap.createOrUpdateWebApp(forceGenerateWebapp); //try load resources - blueMap.loadResourcePack(); + blueMap.getOrLoadResourcePack(); //create renderManager RenderManager renderManager = new RenderManager(); @@ -93,7 +89,7 @@ public class BlueMapCLI implements Server { Set mapsToRenderSet = Set.of(mapsToRender.split(",")); mapFilter = mapsToRenderSet::contains; } - Map maps = blueMap.getMaps(mapFilter); + Map maps = blueMap.getOrLoadMaps(mapFilter); //watcher List regionFileWatchServices = new ArrayList<>(); @@ -205,7 +201,7 @@ public class BlueMapCLI implements Server { // map route for (var mapConfigEntry : blueMap.getConfig().getMapConfigs().entrySet()) { - Storage storage = blueMap.getStorage(mapConfigEntry.getValue().getStorage()); + Storage storage = blueMap.getOrLoadStorage(mapConfigEntry.getValue().getStorage()); routingRequestHandler.register( "maps/" + Pattern.quote(mapConfigEntry.getKey()) + "/(.*)", @@ -252,47 +248,6 @@ public class BlueMapCLI implements Server { } } - @Override - public MinecraftVersion getMinecraftVersion() { - return minecraftVersion; - } - - @Override - public void registerListener(ServerEventListener listener) {} - - @Override - public void unregisterAllListeners() {} - - @Override - public Optional getWorld(Path worldFolder) { - return Optional.empty(); - } - - @Override - public Collection getLoadedWorlds() { - return Collections.emptyList(); - } - - @Override - public Path getConfigFolder() { - return configFolder; - } - - @Override - public Optional getModsFolder() { - return Optional.empty(); - } - - @Override - public Collection getOnlinePlayers() { - return Collections.emptyList(); - } - - @Override - public Optional getPlayer(UUID uuid) { - return Optional.empty(); - } - public static void main(String[] args) { CommandLineParser parser = new DefaultParser(); @@ -324,7 +279,6 @@ public class BlueMapCLI implements Server { } //config folder - cli.configFolder = Path.of("config"); if (cmd.hasOption("c")) { cli.configFolder = Path.of(cmd.getOptionValue("c")); FileHelper.createDirectories(cli.configFolder); @@ -342,7 +296,13 @@ public class BlueMapCLI implements Server { } } - BlueMapConfigManager configs = new BlueMapConfigManager(cli, Path.of("data"), Path.of("web"), false); + BlueMapConfigManager configs = BlueMapConfigManager.builder() + .minecraftVersion(cli.minecraftVersion) + .configRoot(cli.configFolder) + .usePluginConfig(false) + .defaultDataFolder(Path.of("data")) + .defaultWebroot(Path.of("web")) + .build(); //apply new file-logger config CoreConfig coreConfig = configs.getCoreConfig(); @@ -354,7 +314,7 @@ public class BlueMapCLI implements Server { )); } - blueMap = new BlueMapService(cli, configs); + blueMap = new BlueMapService(configs); boolean noActions = true; if (cmd.hasOption("w")) { @@ -479,23 +439,7 @@ public class BlueMapCLI implements Server { private static void printHelp() { HelpFormatter formatter = new HelpFormatter(); - String filename = "bluemap-cli.jar"; - try { - File file = new File(BlueMapCLI.class.getProtectionDomain() - .getCodeSource() - .getLocation() - .getPath()); - - if (file.isFile()) { - try { - filename = "." + File.separator + new File("").getCanonicalFile().toPath().relativize(file.toPath()); - } catch (IllegalArgumentException ex) { - filename = file.getAbsolutePath(); - } - } - } catch (IOException ignore) {} - - String command = "java -jar " + filename; + String command = getCliCommand(); @SuppressWarnings("StringBufferReplaceableByString") StringBuilder footer = new StringBuilder(); @@ -512,6 +456,25 @@ public class BlueMapCLI implements Server { formatter.printHelp(command + " [options]", "\nOptions:", createOptions(), "\n" + footer); } + private static String getCliCommand() { + String filename = "bluemap-cli.jar"; + try { + File file = new File(BlueMapCLI.class.getProtectionDomain() + .getCodeSource() + .getLocation() + .getPath()); + + if (file.isFile()) { + try { + filename = "." + File.separator + new File("").getCanonicalFile().toPath().relativize(file.toPath()); + } catch (IllegalArgumentException ex) { + filename = file.getAbsolutePath(); + } + } + } catch (IOException ignore) {} + return "java -jar " + filename; + } + private static void printVersion() { System.out.printf("%s\n%s\n", BlueMap.VERSION, BlueMap.GIT_HASH); } diff --git a/implementations/fabric-1.15.2/src/main/java/de/bluecolored/bluemap/fabric/FabricCommandSource.java b/implementations/fabric-1.15.2/src/main/java/de/bluecolored/bluemap/fabric/FabricCommandSource.java index 96497a24..be2e1ae9 100644 --- a/implementations/fabric-1.15.2/src/main/java/de/bluecolored/bluemap/fabric/FabricCommandSource.java +++ b/implementations/fabric-1.15.2/src/main/java/de/bluecolored/bluemap/fabric/FabricCommandSource.java @@ -26,14 +26,14 @@ package de.bluecolored.bluemap.fabric; import com.flowpowered.math.vector.Vector3d; import de.bluecolored.bluemap.common.plugin.Plugin; -import de.bluecolored.bluemap.common.serverinterface.CommandSource; import de.bluecolored.bluemap.common.plugin.text.Text; +import de.bluecolored.bluemap.common.serverinterface.CommandSource; +import de.bluecolored.bluemap.common.serverinterface.ServerWorld; import de.bluecolored.bluemap.core.world.World; import me.lucko.fabric.api.permissions.v0.Permissions; import net.minecraft.server.command.ServerCommandSource; import net.minecraft.util.math.Vec3d; -import java.io.IOException; import java.util.Optional; public class FabricCommandSource implements CommandSource { @@ -75,13 +75,8 @@ public class FabricCommandSource implements CommandSource { @Override public Optional getWorld() { - try { - var serverWorld = mod.getWorld(delegate.getWorld()); - String worldId = plugin.getBlueMap().getWorldId(serverWorld.getSaveFolder()); - return Optional.ofNullable(plugin.getWorlds().get(worldId)); - } catch (IOException ignore) {} - - return Optional.empty(); + ServerWorld serverWorld = mod.getServerWorld(delegate.getWorld()); + return Optional.ofNullable(plugin.getWorld(serverWorld)); } } diff --git a/implementations/fabric-1.15.2/src/main/java/de/bluecolored/bluemap/fabric/FabricMod.java b/implementations/fabric-1.15.2/src/main/java/de/bluecolored/bluemap/fabric/FabricMod.java index 871424f2..98ad8c55 100644 --- a/implementations/fabric-1.15.2/src/main/java/de/bluecolored/bluemap/fabric/FabricMod.java +++ b/implementations/fabric-1.15.2/src/main/java/de/bluecolored/bluemap/fabric/FabricMod.java @@ -29,17 +29,17 @@ import com.github.benmanes.caffeine.cache.LoadingCache; import de.bluecolored.bluemap.common.plugin.Plugin; import de.bluecolored.bluemap.common.plugin.commands.Commands; import de.bluecolored.bluemap.common.serverinterface.Player; -import de.bluecolored.bluemap.common.serverinterface.ServerEventListener; import de.bluecolored.bluemap.common.serverinterface.Server; +import de.bluecolored.bluemap.common.serverinterface.ServerEventListener; import de.bluecolored.bluemap.common.serverinterface.ServerWorld; import de.bluecolored.bluemap.core.BlueMap; import de.bluecolored.bluemap.core.MinecraftVersion; import de.bluecolored.bluemap.core.logger.Logger; -import net.fabricmc.fabric.api.networking.v1.ServerPlayConnectionEvents; import net.fabricmc.api.ModInitializer; import net.fabricmc.fabric.api.command.v1.CommandRegistrationCallback; import net.fabricmc.fabric.api.event.lifecycle.v1.ServerLifecycleEvents; import net.fabricmc.fabric.api.event.lifecycle.v1.ServerTickEvents; +import net.fabricmc.fabric.api.networking.v1.ServerPlayConnectionEvents; import net.minecraft.server.MinecraftServer; import net.minecraft.server.network.ServerPlayerEntity; import net.minecraft.util.Identifier; @@ -141,7 +141,7 @@ public class FabricMod implements ModInitializer, Server { } @Override - public Collection getLoadedWorlds() { + public Collection getLoadedServerWorlds() { Collection loadedWorlds = new ArrayList<>(3); for (net.minecraft.server.world.ServerWorld serverWorld : serverInstance.getWorlds()) { loadedWorlds.add(worlds.get(serverWorld)); @@ -150,9 +150,7 @@ public class FabricMod implements ModInitializer, Server { } @Override - public Optional getWorld(Object world) { - if (world instanceof Path) - return getWorld((Path) world); + public Optional getServerWorld(Object world) { if (world instanceof String) { Identifier identifier = Identifier.tryParse((String) world); @@ -170,12 +168,12 @@ public class FabricMod implements ModInitializer, Server { } if (world instanceof net.minecraft.server.world.ServerWorld) - return Optional.of(getWorld((net.minecraft.server.world.ServerWorld) world)); + return Optional.of(getServerWorld((net.minecraft.server.world.ServerWorld) world)); return Optional.empty(); } - public ServerWorld getWorld(net.minecraft.server.world.ServerWorld serverWorld) { + public ServerWorld getServerWorld(net.minecraft.server.world.ServerWorld serverWorld) { return worlds.get(serverWorld); } @@ -220,11 +218,6 @@ public class FabricMod implements ModInitializer, Server { return onlinePlayerMap.values(); } - @Override - public Optional getPlayer(UUID uuid) { - return Optional.ofNullable(onlinePlayerMap.get(uuid)); - } - /** * Only update some of the online players each tick to minimize performance impact on the server-thread. * Only call this method on the server-thread. diff --git a/implementations/fabric-1.15.2/src/main/java/de/bluecolored/bluemap/fabric/FabricPlayer.java b/implementations/fabric-1.15.2/src/main/java/de/bluecolored/bluemap/fabric/FabricPlayer.java index d94be1e8..36737389 100644 --- a/implementations/fabric-1.15.2/src/main/java/de/bluecolored/bluemap/fabric/FabricPlayer.java +++ b/implementations/fabric-1.15.2/src/main/java/de/bluecolored/bluemap/fabric/FabricPlayer.java @@ -28,6 +28,7 @@ import com.flowpowered.math.vector.Vector3d; import de.bluecolored.bluemap.common.plugin.text.Text; import de.bluecolored.bluemap.common.serverinterface.Gamemode; import de.bluecolored.bluemap.common.serverinterface.Player; +import de.bluecolored.bluemap.common.serverinterface.ServerWorld; import net.minecraft.entity.effect.StatusEffectInstance; import net.minecraft.entity.effect.StatusEffects; import net.minecraft.server.MinecraftServer; @@ -36,7 +37,6 @@ import net.minecraft.util.math.Vec3d; import net.minecraft.world.GameMode; import net.minecraft.world.LightType; -import java.io.IOException; import java.util.EnumMap; import java.util.Map; import java.util.UUID; @@ -54,12 +54,11 @@ public class FabricPlayer implements Player { private final UUID uuid; private Text name; - private String world; + private ServerWorld world; private Vector3d position; private Vector3d rotation; private int skyLight; private int blockLight; - private boolean online; private boolean sneaking; private boolean invisible; private Gamemode gamemode; @@ -84,7 +83,7 @@ public class FabricPlayer implements Player { } @Override - public String getWorld() { + public ServerWorld getWorld() { return this.world; } @@ -108,11 +107,6 @@ public class FabricPlayer implements Player { return blockLight; } - @Override - public boolean isOnline() { - return this.online; - } - @Override public boolean isSneaking() { return this.sneaking; @@ -133,16 +127,10 @@ public class FabricPlayer implements Player { */ public void update() { MinecraftServer server = mod.getServer(); - if (server == null) { - this.online = false; - return; - } + if (server == null) return; ServerPlayerEntity player = server.getPlayerManager().getPlayer(uuid); - if (player == null) { - this.online = false; - return; - } + if (player == null) return; this.gamemode = GAMEMODE_MAP.get(player.interactionManager.getGameMode()); if (this.gamemode == null) this.gamemode = Gamemode.SURVIVAL; @@ -151,7 +139,6 @@ public class FabricPlayer implements Player { this.invisible = invis != null && invis.getDuration() > 0; this.name = Text.of(player.getName().getString()); - this.online = true; Vec3d pos = player.getPos(); this.position = new Vector3d(pos.getX(), pos.getY(), pos.getZ()); @@ -161,12 +148,7 @@ public class FabricPlayer implements Player { this.skyLight = player.getServerWorld().getLightingProvider().get(LightType.SKY).getLightLevel(player.getBlockPos()); this.blockLight = player.getServerWorld().getLightingProvider().get(LightType.BLOCK).getLightLevel(player.getBlockPos()); - try { - var world = mod.getWorld(player.getServerWorld()); - this.world = mod.getPluginInstance().getBlueMap().getWorldId(world.getSaveFolder()); - } catch (IOException | NullPointerException e) { // NullPointerException -> the plugin isn't fully loaded - this.world = "unknown"; - } + this.world = mod.getServerWorld(player.getServerWorld()); } } diff --git a/implementations/fabric-1.15.2/src/main/java/de/bluecolored/bluemap/fabric/FabricWorld.java b/implementations/fabric-1.15.2/src/main/java/de/bluecolored/bluemap/fabric/FabricWorld.java index 9335ff05..a8f3aab1 100644 --- a/implementations/fabric-1.15.2/src/main/java/de/bluecolored/bluemap/fabric/FabricWorld.java +++ b/implementations/fabric-1.15.2/src/main/java/de/bluecolored/bluemap/fabric/FabricWorld.java @@ -24,9 +24,11 @@ */ package de.bluecolored.bluemap.fabric; -import de.bluecolored.bluemap.common.serverinterface.Dimension; import de.bluecolored.bluemap.common.serverinterface.ServerWorld; -import net.minecraft.world.dimension.DimensionType; +import de.bluecolored.bluemap.core.resources.datapack.DataPack; +import de.bluecolored.bluemap.core.util.Key; +import net.minecraft.util.Identifier; +import net.minecraft.util.registry.Registry; import java.io.IOException; import java.lang.ref.WeakReference; @@ -38,25 +40,18 @@ import java.util.concurrent.ExecutionException; public class FabricWorld implements ServerWorld { private final WeakReference delegate; - private final Path saveFolder; + private final Path worldFolder; + private final Key dimension; public FabricWorld(net.minecraft.server.world.ServerWorld delegate) { this.delegate = new WeakReference<>(delegate); - this.saveFolder = delegate.getDimension().getType() - .getSaveDirectory(delegate.getSaveHandler().getWorldDir()).toPath() - .toAbsolutePath().normalize(); - } + this.worldFolder = delegate.getSaveHandler().getWorldDir().toPath(); - @Override - public Dimension getDimension() { - net.minecraft.server.world.ServerWorld world = delegate.get(); - if (world != null) { - if (world.getDimension().getType().equals(DimensionType.THE_NETHER)) return Dimension.NETHER; - if (world.getDimension().getType().equals(DimensionType.THE_END)) return Dimension.END; - if (world.getDimension().getType().equals(DimensionType.OVERWORLD)) return Dimension.OVERWORLD; - } - return ServerWorld.super.getDimension(); + Identifier id = Registry.DIMENSION_TYPE.getId(delegate.getDimension().getType()); + this.dimension = id != null ? + new Key(id.getNamespace(), id.getPath()) : + DataPack.DIMENSION_OVERWORLD; } @Override @@ -87,8 +82,13 @@ public class FabricWorld implements ServerWorld { } @Override - public Path getSaveFolder() { - return this.saveFolder; + public Path getWorldFolder() { + return worldFolder; + } + + @Override + public Key getDimension() { + return dimension; } } diff --git a/implementations/fabric-1.15.2/src/main/java/de/bluecolored/bluemap/fabric/Log4jLogger.java b/implementations/fabric-1.15.2/src/main/java/de/bluecolored/bluemap/fabric/Log4jLogger.java index 3b868cae..9e60f395 100644 --- a/implementations/fabric-1.15.2/src/main/java/de/bluecolored/bluemap/fabric/Log4jLogger.java +++ b/implementations/fabric-1.15.2/src/main/java/de/bluecolored/bluemap/fabric/Log4jLogger.java @@ -30,7 +30,7 @@ import de.bluecolored.bluemap.core.logger.AbstractLogger; public class Log4jLogger extends AbstractLogger { - private Logger out; + private final Logger out; public Log4jLogger(Logger out) { this.out = out; diff --git a/implementations/fabric-1.16.2/src/main/java/de/bluecolored/bluemap/fabric/FabricCommandSource.java b/implementations/fabric-1.16.2/src/main/java/de/bluecolored/bluemap/fabric/FabricCommandSource.java index 96497a24..be2e1ae9 100644 --- a/implementations/fabric-1.16.2/src/main/java/de/bluecolored/bluemap/fabric/FabricCommandSource.java +++ b/implementations/fabric-1.16.2/src/main/java/de/bluecolored/bluemap/fabric/FabricCommandSource.java @@ -26,14 +26,14 @@ package de.bluecolored.bluemap.fabric; import com.flowpowered.math.vector.Vector3d; import de.bluecolored.bluemap.common.plugin.Plugin; -import de.bluecolored.bluemap.common.serverinterface.CommandSource; import de.bluecolored.bluemap.common.plugin.text.Text; +import de.bluecolored.bluemap.common.serverinterface.CommandSource; +import de.bluecolored.bluemap.common.serverinterface.ServerWorld; import de.bluecolored.bluemap.core.world.World; import me.lucko.fabric.api.permissions.v0.Permissions; import net.minecraft.server.command.ServerCommandSource; import net.minecraft.util.math.Vec3d; -import java.io.IOException; import java.util.Optional; public class FabricCommandSource implements CommandSource { @@ -75,13 +75,8 @@ public class FabricCommandSource implements CommandSource { @Override public Optional getWorld() { - try { - var serverWorld = mod.getWorld(delegate.getWorld()); - String worldId = plugin.getBlueMap().getWorldId(serverWorld.getSaveFolder()); - return Optional.ofNullable(plugin.getWorlds().get(worldId)); - } catch (IOException ignore) {} - - return Optional.empty(); + ServerWorld serverWorld = mod.getServerWorld(delegate.getWorld()); + return Optional.ofNullable(plugin.getWorld(serverWorld)); } } diff --git a/implementations/fabric-1.16.2/src/main/java/de/bluecolored/bluemap/fabric/FabricEventForwarder.java b/implementations/fabric-1.16.2/src/main/java/de/bluecolored/bluemap/fabric/FabricEventForwarder.java index 5ade2a8a..94fc9b67 100644 --- a/implementations/fabric-1.16.2/src/main/java/de/bluecolored/bluemap/fabric/FabricEventForwarder.java +++ b/implementations/fabric-1.16.2/src/main/java/de/bluecolored/bluemap/fabric/FabricEventForwarder.java @@ -35,8 +35,8 @@ import java.util.UUID; public class FabricEventForwarder { - private FabricMod mod; - private Collection eventListeners; + private final FabricMod mod; + private final Collection eventListeners; public FabricEventForwarder(FabricMod mod) { this.mod = mod; diff --git a/implementations/fabric-1.16.2/src/main/java/de/bluecolored/bluemap/fabric/FabricMod.java b/implementations/fabric-1.16.2/src/main/java/de/bluecolored/bluemap/fabric/FabricMod.java index f4b4aecb..0a6a2628 100644 --- a/implementations/fabric-1.16.2/src/main/java/de/bluecolored/bluemap/fabric/FabricMod.java +++ b/implementations/fabric-1.16.2/src/main/java/de/bluecolored/bluemap/fabric/FabricMod.java @@ -29,17 +29,17 @@ import com.github.benmanes.caffeine.cache.LoadingCache; import de.bluecolored.bluemap.common.plugin.Plugin; import de.bluecolored.bluemap.common.plugin.commands.Commands; import de.bluecolored.bluemap.common.serverinterface.Player; -import de.bluecolored.bluemap.common.serverinterface.ServerEventListener; import de.bluecolored.bluemap.common.serverinterface.Server; +import de.bluecolored.bluemap.common.serverinterface.ServerEventListener; import de.bluecolored.bluemap.common.serverinterface.ServerWorld; import de.bluecolored.bluemap.core.BlueMap; import de.bluecolored.bluemap.core.MinecraftVersion; import de.bluecolored.bluemap.core.logger.Logger; -import net.fabricmc.fabric.api.networking.v1.ServerPlayConnectionEvents; import net.fabricmc.api.ModInitializer; import net.fabricmc.fabric.api.command.v1.CommandRegistrationCallback; import net.fabricmc.fabric.api.event.lifecycle.v1.ServerLifecycleEvents; import net.fabricmc.fabric.api.event.lifecycle.v1.ServerTickEvents; +import net.fabricmc.fabric.api.networking.v1.ServerPlayConnectionEvents; import net.minecraft.server.MinecraftServer; import net.minecraft.server.network.ServerPlayerEntity; import net.minecraft.util.Identifier; @@ -143,7 +143,7 @@ public class FabricMod implements ModInitializer, Server { } @Override - public Collection getLoadedWorlds() { + public Collection getLoadedServerWorlds() { Collection loadedWorlds = new ArrayList<>(3); for (net.minecraft.server.world.ServerWorld serverWorld : serverInstance.getWorlds()) { loadedWorlds.add(worlds.get(serverWorld)); @@ -153,9 +153,7 @@ public class FabricMod implements ModInitializer, Server { @SuppressWarnings("unchecked") @Override - public Optional getWorld(Object world) { - if (world instanceof Path) - return getWorld((Path) world); + public Optional getServerWorld(Object world) { if (world instanceof String) { Identifier identifier = Identifier.tryParse((String) world); @@ -169,12 +167,12 @@ public class FabricMod implements ModInitializer, Server { } if (world instanceof net.minecraft.server.world.ServerWorld) - return Optional.of(getWorld((net.minecraft.server.world.ServerWorld) world)); + return Optional.of(getServerWorld((net.minecraft.server.world.ServerWorld) world)); return Optional.empty(); } - public ServerWorld getWorld(net.minecraft.server.world.ServerWorld serverWorld) { + public ServerWorld getServerWorld(net.minecraft.server.world.ServerWorld serverWorld) { return worlds.get(serverWorld); } @@ -219,11 +217,6 @@ public class FabricMod implements ModInitializer, Server { return onlinePlayerMap.values(); } - @Override - public Optional getPlayer(UUID uuid) { - return Optional.ofNullable(onlinePlayerMap.get(uuid)); - } - /** * Only update some of the online players each tick to minimize performance impact on the server-thread. * Only call this method on the server-thread. diff --git a/implementations/fabric-1.16.2/src/main/java/de/bluecolored/bluemap/fabric/FabricPlayer.java b/implementations/fabric-1.16.2/src/main/java/de/bluecolored/bluemap/fabric/FabricPlayer.java index d94be1e8..36737389 100644 --- a/implementations/fabric-1.16.2/src/main/java/de/bluecolored/bluemap/fabric/FabricPlayer.java +++ b/implementations/fabric-1.16.2/src/main/java/de/bluecolored/bluemap/fabric/FabricPlayer.java @@ -28,6 +28,7 @@ import com.flowpowered.math.vector.Vector3d; import de.bluecolored.bluemap.common.plugin.text.Text; import de.bluecolored.bluemap.common.serverinterface.Gamemode; import de.bluecolored.bluemap.common.serverinterface.Player; +import de.bluecolored.bluemap.common.serverinterface.ServerWorld; import net.minecraft.entity.effect.StatusEffectInstance; import net.minecraft.entity.effect.StatusEffects; import net.minecraft.server.MinecraftServer; @@ -36,7 +37,6 @@ import net.minecraft.util.math.Vec3d; import net.minecraft.world.GameMode; import net.minecraft.world.LightType; -import java.io.IOException; import java.util.EnumMap; import java.util.Map; import java.util.UUID; @@ -54,12 +54,11 @@ public class FabricPlayer implements Player { private final UUID uuid; private Text name; - private String world; + private ServerWorld world; private Vector3d position; private Vector3d rotation; private int skyLight; private int blockLight; - private boolean online; private boolean sneaking; private boolean invisible; private Gamemode gamemode; @@ -84,7 +83,7 @@ public class FabricPlayer implements Player { } @Override - public String getWorld() { + public ServerWorld getWorld() { return this.world; } @@ -108,11 +107,6 @@ public class FabricPlayer implements Player { return blockLight; } - @Override - public boolean isOnline() { - return this.online; - } - @Override public boolean isSneaking() { return this.sneaking; @@ -133,16 +127,10 @@ public class FabricPlayer implements Player { */ public void update() { MinecraftServer server = mod.getServer(); - if (server == null) { - this.online = false; - return; - } + if (server == null) return; ServerPlayerEntity player = server.getPlayerManager().getPlayer(uuid); - if (player == null) { - this.online = false; - return; - } + if (player == null) return; this.gamemode = GAMEMODE_MAP.get(player.interactionManager.getGameMode()); if (this.gamemode == null) this.gamemode = Gamemode.SURVIVAL; @@ -151,7 +139,6 @@ public class FabricPlayer implements Player { this.invisible = invis != null && invis.getDuration() > 0; this.name = Text.of(player.getName().getString()); - this.online = true; Vec3d pos = player.getPos(); this.position = new Vector3d(pos.getX(), pos.getY(), pos.getZ()); @@ -161,12 +148,7 @@ public class FabricPlayer implements Player { this.skyLight = player.getServerWorld().getLightingProvider().get(LightType.SKY).getLightLevel(player.getBlockPos()); this.blockLight = player.getServerWorld().getLightingProvider().get(LightType.BLOCK).getLightLevel(player.getBlockPos()); - try { - var world = mod.getWorld(player.getServerWorld()); - this.world = mod.getPluginInstance().getBlueMap().getWorldId(world.getSaveFolder()); - } catch (IOException | NullPointerException e) { // NullPointerException -> the plugin isn't fully loaded - this.world = "unknown"; - } + this.world = mod.getServerWorld(player.getServerWorld()); } } diff --git a/implementations/fabric-1.16.2/src/main/java/de/bluecolored/bluemap/fabric/FabricWorld.java b/implementations/fabric-1.16.2/src/main/java/de/bluecolored/bluemap/fabric/FabricWorld.java index e248fe97..31ec0381 100644 --- a/implementations/fabric-1.16.2/src/main/java/de/bluecolored/bluemap/fabric/FabricWorld.java +++ b/implementations/fabric-1.16.2/src/main/java/de/bluecolored/bluemap/fabric/FabricWorld.java @@ -24,12 +24,11 @@ */ package de.bluecolored.bluemap.fabric; -import de.bluecolored.bluemap.common.serverinterface.Dimension; import de.bluecolored.bluemap.common.serverinterface.ServerWorld; +import de.bluecolored.bluemap.core.util.Key; import net.minecraft.server.MinecraftServer; +import net.minecraft.util.Identifier; import net.minecraft.util.WorldSavePath; -import net.minecraft.world.World; -import net.minecraft.world.dimension.DimensionType; import java.io.IOException; import java.lang.ref.WeakReference; @@ -41,27 +40,18 @@ import java.util.concurrent.ExecutionException; public class FabricWorld implements ServerWorld { private final WeakReference delegate; - private final Path saveFolder; + private final Path worldFolder; + private final Key dimension; public FabricWorld(net.minecraft.server.world.ServerWorld delegate) { this.delegate = new WeakReference<>(delegate); MinecraftServer server = delegate.getServer(); - Path worldFolder = delegate.getServer().getRunDirectory().toPath().resolve(server.getSavePath(WorldSavePath.ROOT)); - this.saveFolder = DimensionType.getSaveDirectory(delegate.getRegistryKey(), worldFolder.toFile()).toPath() - .toAbsolutePath().normalize(); - } + this.worldFolder = delegate.getServer().getRunDirectory().toPath() + .resolve(server.getSavePath(WorldSavePath.ROOT)); - @Override - public Dimension getDimension() { - net.minecraft.server.world.ServerWorld world = delegate.get(); - if (world != null) { - if (world.getRegistryKey().equals(World.NETHER)) return Dimension.NETHER; - if (world.getRegistryKey().equals(World.END)) return Dimension.END; - if (world.getRegistryKey().equals(World.OVERWORLD)) return Dimension.OVERWORLD; - } - - return ServerWorld.super.getDimension(); + Identifier id = delegate.getRegistryKey().getValue(); + this.dimension = new Key(id.getNamespace(), id.getPath()); } @Override @@ -92,8 +82,13 @@ public class FabricWorld implements ServerWorld { } @Override - public Path getSaveFolder() { - return this.saveFolder; + public Path getWorldFolder() { + return worldFolder; + } + + @Override + public Key getDimension() { + return dimension; } } diff --git a/implementations/fabric-1.16.2/src/main/java/de/bluecolored/bluemap/fabric/Log4jLogger.java b/implementations/fabric-1.16.2/src/main/java/de/bluecolored/bluemap/fabric/Log4jLogger.java index 3b868cae..9e60f395 100644 --- a/implementations/fabric-1.16.2/src/main/java/de/bluecolored/bluemap/fabric/Log4jLogger.java +++ b/implementations/fabric-1.16.2/src/main/java/de/bluecolored/bluemap/fabric/Log4jLogger.java @@ -30,7 +30,7 @@ import de.bluecolored.bluemap.core.logger.AbstractLogger; public class Log4jLogger extends AbstractLogger { - private Logger out; + private final Logger out; public Log4jLogger(Logger out) { this.out = out; diff --git a/implementations/fabric-1.17/src/main/java/de/bluecolored/bluemap/fabric/FabricCommandSource.java b/implementations/fabric-1.17/src/main/java/de/bluecolored/bluemap/fabric/FabricCommandSource.java index 96497a24..be2e1ae9 100644 --- a/implementations/fabric-1.17/src/main/java/de/bluecolored/bluemap/fabric/FabricCommandSource.java +++ b/implementations/fabric-1.17/src/main/java/de/bluecolored/bluemap/fabric/FabricCommandSource.java @@ -26,14 +26,14 @@ package de.bluecolored.bluemap.fabric; import com.flowpowered.math.vector.Vector3d; import de.bluecolored.bluemap.common.plugin.Plugin; -import de.bluecolored.bluemap.common.serverinterface.CommandSource; import de.bluecolored.bluemap.common.plugin.text.Text; +import de.bluecolored.bluemap.common.serverinterface.CommandSource; +import de.bluecolored.bluemap.common.serverinterface.ServerWorld; import de.bluecolored.bluemap.core.world.World; import me.lucko.fabric.api.permissions.v0.Permissions; import net.minecraft.server.command.ServerCommandSource; import net.minecraft.util.math.Vec3d; -import java.io.IOException; import java.util.Optional; public class FabricCommandSource implements CommandSource { @@ -75,13 +75,8 @@ public class FabricCommandSource implements CommandSource { @Override public Optional getWorld() { - try { - var serverWorld = mod.getWorld(delegate.getWorld()); - String worldId = plugin.getBlueMap().getWorldId(serverWorld.getSaveFolder()); - return Optional.ofNullable(plugin.getWorlds().get(worldId)); - } catch (IOException ignore) {} - - return Optional.empty(); + ServerWorld serverWorld = mod.getServerWorld(delegate.getWorld()); + return Optional.ofNullable(plugin.getWorld(serverWorld)); } } diff --git a/implementations/fabric-1.17/src/main/java/de/bluecolored/bluemap/fabric/FabricEventForwarder.java b/implementations/fabric-1.17/src/main/java/de/bluecolored/bluemap/fabric/FabricEventForwarder.java index b3de24cf..411e1c34 100644 --- a/implementations/fabric-1.17/src/main/java/de/bluecolored/bluemap/fabric/FabricEventForwarder.java +++ b/implementations/fabric-1.17/src/main/java/de/bluecolored/bluemap/fabric/FabricEventForwarder.java @@ -35,8 +35,8 @@ import java.util.UUID; public class FabricEventForwarder { - private FabricMod mod; - private Collection eventListeners; + private final FabricMod mod; + private final Collection eventListeners; public FabricEventForwarder(FabricMod mod) { this.mod = mod; diff --git a/implementations/fabric-1.17/src/main/java/de/bluecolored/bluemap/fabric/FabricMod.java b/implementations/fabric-1.17/src/main/java/de/bluecolored/bluemap/fabric/FabricMod.java index 393620b5..09ab1ba6 100644 --- a/implementations/fabric-1.17/src/main/java/de/bluecolored/bluemap/fabric/FabricMod.java +++ b/implementations/fabric-1.17/src/main/java/de/bluecolored/bluemap/fabric/FabricMod.java @@ -143,7 +143,7 @@ public class FabricMod implements ModInitializer, Server { } @Override - public Collection getLoadedWorlds() { + public Collection getLoadedServerWorlds() { Collection loadedWorlds = new ArrayList<>(3); for (net.minecraft.server.world.ServerWorld serverWorld : serverInstance.getWorlds()) { loadedWorlds.add(worlds.get(serverWorld)); @@ -153,9 +153,7 @@ public class FabricMod implements ModInitializer, Server { @SuppressWarnings("unchecked") @Override - public Optional getWorld(Object world) { - if (world instanceof Path) - return getWorld((Path) world); + public Optional getServerWorld(Object world) { if (world instanceof String) { Identifier identifier = Identifier.tryParse((String) world); @@ -169,12 +167,12 @@ public class FabricMod implements ModInitializer, Server { } if (world instanceof net.minecraft.server.world.ServerWorld) - return Optional.of(getWorld((net.minecraft.server.world.ServerWorld) world)); + return Optional.of(getServerWorld((net.minecraft.server.world.ServerWorld) world)); return Optional.empty(); } - public ServerWorld getWorld(net.minecraft.server.world.ServerWorld serverWorld) { + public ServerWorld getServerWorld(net.minecraft.server.world.ServerWorld serverWorld) { return worlds.get(serverWorld); } @@ -219,11 +217,6 @@ public class FabricMod implements ModInitializer, Server { return onlinePlayerMap.values(); } - @Override - public Optional getPlayer(UUID uuid) { - return Optional.ofNullable(onlinePlayerMap.get(uuid)); - } - /** * Only update some of the online players each tick to minimize performance impact on the server-thread. * Only call this method on the server-thread. diff --git a/implementations/fabric-1.17/src/main/java/de/bluecolored/bluemap/fabric/FabricPlayer.java b/implementations/fabric-1.17/src/main/java/de/bluecolored/bluemap/fabric/FabricPlayer.java index 1775124f..7025ccda 100644 --- a/implementations/fabric-1.17/src/main/java/de/bluecolored/bluemap/fabric/FabricPlayer.java +++ b/implementations/fabric-1.17/src/main/java/de/bluecolored/bluemap/fabric/FabricPlayer.java @@ -28,6 +28,7 @@ import com.flowpowered.math.vector.Vector3d; import de.bluecolored.bluemap.common.plugin.text.Text; import de.bluecolored.bluemap.common.serverinterface.Gamemode; import de.bluecolored.bluemap.common.serverinterface.Player; +import de.bluecolored.bluemap.common.serverinterface.ServerWorld; import net.minecraft.entity.effect.StatusEffectInstance; import net.minecraft.entity.effect.StatusEffects; import net.minecraft.server.MinecraftServer; @@ -36,7 +37,6 @@ import net.minecraft.util.math.Vec3d; import net.minecraft.world.GameMode; import net.minecraft.world.LightType; -import java.io.IOException; import java.util.EnumMap; import java.util.Map; import java.util.UUID; @@ -53,12 +53,11 @@ public class FabricPlayer implements Player { private final UUID uuid; private Text name; - private String world; + private ServerWorld world; private Vector3d position; private Vector3d rotation; private int skyLight; private int blockLight; - private boolean online; private boolean sneaking; private boolean invisible; private Gamemode gamemode; @@ -83,7 +82,7 @@ public class FabricPlayer implements Player { } @Override - public String getWorld() { + public ServerWorld getWorld() { return this.world; } @@ -107,11 +106,6 @@ public class FabricPlayer implements Player { return blockLight; } - @Override - public boolean isOnline() { - return this.online; - } - @Override public boolean isSneaking() { return this.sneaking; @@ -132,16 +126,10 @@ public class FabricPlayer implements Player { */ public void update() { MinecraftServer server = mod.getServer(); - if (server == null) { - this.online = false; - return; - } + if (server == null) return; ServerPlayerEntity player = server.getPlayerManager().getPlayer(uuid); - if (player == null) { - this.online = false; - return; - } + if (player == null) return; this.gamemode = GAMEMODE_MAP.get(player.interactionManager.getGameMode()); if (this.gamemode == null) this.gamemode = Gamemode.SURVIVAL; @@ -150,7 +138,6 @@ public class FabricPlayer implements Player { this.invisible = invis != null && invis.getDuration() > 0; this.name = Text.of(player.getName().getString()); - this.online = true; Vec3d pos = player.getPos(); this.position = new Vector3d(pos.getX(), pos.getY(), pos.getZ()); @@ -160,12 +147,7 @@ public class FabricPlayer implements Player { this.skyLight = player.getServerWorld().getLightingProvider().get(LightType.SKY).getLightLevel(player.getBlockPos()); this.blockLight = player.getServerWorld().getLightingProvider().get(LightType.BLOCK).getLightLevel(player.getBlockPos()); - try { - var world = mod.getWorld(player.getServerWorld()); - this.world = mod.getPluginInstance().getBlueMap().getWorldId(world.getSaveFolder()); - } catch (IOException | NullPointerException e) { // NullPointerException -> the plugin isn't fully loaded - this.world = "unknown"; - } + this.world = mod.getServerWorld(player.getServerWorld()); } } diff --git a/implementations/fabric-1.17/src/main/java/de/bluecolored/bluemap/fabric/FabricWorld.java b/implementations/fabric-1.17/src/main/java/de/bluecolored/bluemap/fabric/FabricWorld.java index e248fe97..31ec0381 100644 --- a/implementations/fabric-1.17/src/main/java/de/bluecolored/bluemap/fabric/FabricWorld.java +++ b/implementations/fabric-1.17/src/main/java/de/bluecolored/bluemap/fabric/FabricWorld.java @@ -24,12 +24,11 @@ */ package de.bluecolored.bluemap.fabric; -import de.bluecolored.bluemap.common.serverinterface.Dimension; import de.bluecolored.bluemap.common.serverinterface.ServerWorld; +import de.bluecolored.bluemap.core.util.Key; import net.minecraft.server.MinecraftServer; +import net.minecraft.util.Identifier; import net.minecraft.util.WorldSavePath; -import net.minecraft.world.World; -import net.minecraft.world.dimension.DimensionType; import java.io.IOException; import java.lang.ref.WeakReference; @@ -41,27 +40,18 @@ import java.util.concurrent.ExecutionException; public class FabricWorld implements ServerWorld { private final WeakReference delegate; - private final Path saveFolder; + private final Path worldFolder; + private final Key dimension; public FabricWorld(net.minecraft.server.world.ServerWorld delegate) { this.delegate = new WeakReference<>(delegate); MinecraftServer server = delegate.getServer(); - Path worldFolder = delegate.getServer().getRunDirectory().toPath().resolve(server.getSavePath(WorldSavePath.ROOT)); - this.saveFolder = DimensionType.getSaveDirectory(delegate.getRegistryKey(), worldFolder.toFile()).toPath() - .toAbsolutePath().normalize(); - } + this.worldFolder = delegate.getServer().getRunDirectory().toPath() + .resolve(server.getSavePath(WorldSavePath.ROOT)); - @Override - public Dimension getDimension() { - net.minecraft.server.world.ServerWorld world = delegate.get(); - if (world != null) { - if (world.getRegistryKey().equals(World.NETHER)) return Dimension.NETHER; - if (world.getRegistryKey().equals(World.END)) return Dimension.END; - if (world.getRegistryKey().equals(World.OVERWORLD)) return Dimension.OVERWORLD; - } - - return ServerWorld.super.getDimension(); + Identifier id = delegate.getRegistryKey().getValue(); + this.dimension = new Key(id.getNamespace(), id.getPath()); } @Override @@ -92,8 +82,13 @@ public class FabricWorld implements ServerWorld { } @Override - public Path getSaveFolder() { - return this.saveFolder; + public Path getWorldFolder() { + return worldFolder; + } + + @Override + public Key getDimension() { + return dimension; } } diff --git a/implementations/fabric-1.17/src/main/java/de/bluecolored/bluemap/fabric/Log4jLogger.java b/implementations/fabric-1.17/src/main/java/de/bluecolored/bluemap/fabric/Log4jLogger.java index 3b868cae..9e60f395 100644 --- a/implementations/fabric-1.17/src/main/java/de/bluecolored/bluemap/fabric/Log4jLogger.java +++ b/implementations/fabric-1.17/src/main/java/de/bluecolored/bluemap/fabric/Log4jLogger.java @@ -30,7 +30,7 @@ import de.bluecolored.bluemap.core.logger.AbstractLogger; public class Log4jLogger extends AbstractLogger { - private Logger out; + private final Logger out; public Log4jLogger(Logger out) { this.out = out; diff --git a/implementations/fabric-1.18/src/main/java/de/bluecolored/bluemap/fabric/FabricCommandSource.java b/implementations/fabric-1.18/src/main/java/de/bluecolored/bluemap/fabric/FabricCommandSource.java index 96497a24..be2e1ae9 100644 --- a/implementations/fabric-1.18/src/main/java/de/bluecolored/bluemap/fabric/FabricCommandSource.java +++ b/implementations/fabric-1.18/src/main/java/de/bluecolored/bluemap/fabric/FabricCommandSource.java @@ -26,14 +26,14 @@ package de.bluecolored.bluemap.fabric; import com.flowpowered.math.vector.Vector3d; import de.bluecolored.bluemap.common.plugin.Plugin; -import de.bluecolored.bluemap.common.serverinterface.CommandSource; import de.bluecolored.bluemap.common.plugin.text.Text; +import de.bluecolored.bluemap.common.serverinterface.CommandSource; +import de.bluecolored.bluemap.common.serverinterface.ServerWorld; import de.bluecolored.bluemap.core.world.World; import me.lucko.fabric.api.permissions.v0.Permissions; import net.minecraft.server.command.ServerCommandSource; import net.minecraft.util.math.Vec3d; -import java.io.IOException; import java.util.Optional; public class FabricCommandSource implements CommandSource { @@ -75,13 +75,8 @@ public class FabricCommandSource implements CommandSource { @Override public Optional getWorld() { - try { - var serverWorld = mod.getWorld(delegate.getWorld()); - String worldId = plugin.getBlueMap().getWorldId(serverWorld.getSaveFolder()); - return Optional.ofNullable(plugin.getWorlds().get(worldId)); - } catch (IOException ignore) {} - - return Optional.empty(); + ServerWorld serverWorld = mod.getServerWorld(delegate.getWorld()); + return Optional.ofNullable(plugin.getWorld(serverWorld)); } } diff --git a/implementations/fabric-1.18/src/main/java/de/bluecolored/bluemap/fabric/FabricEventForwarder.java b/implementations/fabric-1.18/src/main/java/de/bluecolored/bluemap/fabric/FabricEventForwarder.java index b3de24cf..411e1c34 100644 --- a/implementations/fabric-1.18/src/main/java/de/bluecolored/bluemap/fabric/FabricEventForwarder.java +++ b/implementations/fabric-1.18/src/main/java/de/bluecolored/bluemap/fabric/FabricEventForwarder.java @@ -35,8 +35,8 @@ import java.util.UUID; public class FabricEventForwarder { - private FabricMod mod; - private Collection eventListeners; + private final FabricMod mod; + private final Collection eventListeners; public FabricEventForwarder(FabricMod mod) { this.mod = mod; diff --git a/implementations/fabric-1.18/src/main/java/de/bluecolored/bluemap/fabric/FabricMod.java b/implementations/fabric-1.18/src/main/java/de/bluecolored/bluemap/fabric/FabricMod.java index fa48186f..bea3506b 100644 --- a/implementations/fabric-1.18/src/main/java/de/bluecolored/bluemap/fabric/FabricMod.java +++ b/implementations/fabric-1.18/src/main/java/de/bluecolored/bluemap/fabric/FabricMod.java @@ -143,7 +143,7 @@ public class FabricMod implements ModInitializer, Server { } @Override - public Collection getLoadedWorlds() { + public Collection getLoadedServerWorlds() { Collection loadedWorlds = new ArrayList<>(3); for (net.minecraft.server.world.ServerWorld serverWorld : serverInstance.getWorlds()) { loadedWorlds.add(worlds.get(serverWorld)); @@ -153,9 +153,7 @@ public class FabricMod implements ModInitializer, Server { @SuppressWarnings("unchecked") @Override - public Optional getWorld(Object world) { - if (world instanceof Path) - return getWorld((Path) world); + public Optional getServerWorld(Object world) { if (world instanceof String) { Identifier identifier = Identifier.tryParse((String) world); @@ -169,12 +167,12 @@ public class FabricMod implements ModInitializer, Server { } if (world instanceof net.minecraft.server.world.ServerWorld) - return Optional.of(getWorld((net.minecraft.server.world.ServerWorld) world)); + return Optional.of(getServerWorld((net.minecraft.server.world.ServerWorld) world)); return Optional.empty(); } - public ServerWorld getWorld(net.minecraft.server.world.ServerWorld serverWorld) { + public ServerWorld getServerWorld(net.minecraft.server.world.ServerWorld serverWorld) { return worlds.get(serverWorld); } @@ -219,11 +217,6 @@ public class FabricMod implements ModInitializer, Server { return onlinePlayerMap.values(); } - @Override - public Optional getPlayer(UUID uuid) { - return Optional.ofNullable(onlinePlayerMap.get(uuid)); - } - /** * Only update some of the online players each tick to minimize performance impact on the server-thread. * Only call this method on the server-thread. diff --git a/implementations/fabric-1.18/src/main/java/de/bluecolored/bluemap/fabric/FabricPlayer.java b/implementations/fabric-1.18/src/main/java/de/bluecolored/bluemap/fabric/FabricPlayer.java index addba0fd..5ddf3259 100644 --- a/implementations/fabric-1.18/src/main/java/de/bluecolored/bluemap/fabric/FabricPlayer.java +++ b/implementations/fabric-1.18/src/main/java/de/bluecolored/bluemap/fabric/FabricPlayer.java @@ -28,6 +28,7 @@ import com.flowpowered.math.vector.Vector3d; import de.bluecolored.bluemap.common.plugin.text.Text; import de.bluecolored.bluemap.common.serverinterface.Gamemode; import de.bluecolored.bluemap.common.serverinterface.Player; +import de.bluecolored.bluemap.common.serverinterface.ServerWorld; import net.minecraft.entity.effect.StatusEffectInstance; import net.minecraft.entity.effect.StatusEffects; import net.minecraft.server.MinecraftServer; @@ -36,7 +37,6 @@ import net.minecraft.util.math.Vec3d; import net.minecraft.world.GameMode; import net.minecraft.world.LightType; -import java.io.IOException; import java.util.EnumMap; import java.util.Map; import java.util.UUID; @@ -53,12 +53,11 @@ public class FabricPlayer implements Player { private final UUID uuid; private Text name; - private String world; + private ServerWorld world; private Vector3d position; private Vector3d rotation; private int skyLight; private int blockLight; - private boolean online; private boolean sneaking; private boolean invisible; private Gamemode gamemode; @@ -83,7 +82,7 @@ public class FabricPlayer implements Player { } @Override - public String getWorld() { + public ServerWorld getWorld() { return this.world; } @@ -107,11 +106,6 @@ public class FabricPlayer implements Player { return blockLight; } - @Override - public boolean isOnline() { - return this.online; - } - @Override public boolean isSneaking() { return this.sneaking; @@ -132,16 +126,10 @@ public class FabricPlayer implements Player { */ public void update() { MinecraftServer server = mod.getServer(); - if (server == null) { - this.online = false; - return; - } + if (server == null) return; ServerPlayerEntity player = server.getPlayerManager().getPlayer(uuid); - if (player == null) { - this.online = false; - return; - } + if (player == null) return; this.gamemode = GAMEMODE_MAP.get(player.interactionManager.getGameMode()); if (this.gamemode == null) this.gamemode = Gamemode.SURVIVAL; @@ -150,7 +138,6 @@ public class FabricPlayer implements Player { this.invisible = invis != null && invis.getDuration() > 0; this.name = Text.of(player.getName().getString()); - this.online = true; Vec3d pos = player.getPos(); this.position = new Vector3d(pos.getX(), pos.getY(), pos.getZ()); @@ -160,12 +147,7 @@ public class FabricPlayer implements Player { this.skyLight = player.getWorld().getLightingProvider().get(LightType.SKY).getLightLevel(player.getBlockPos()); this.blockLight = player.getWorld().getLightingProvider().get(LightType.BLOCK).getLightLevel(player.getBlockPos()); - try { - var world = mod.getWorld(player.getWorld()); - this.world = mod.getPluginInstance().getBlueMap().getWorldId(world.getSaveFolder()); - } catch (IOException | NullPointerException e) { // NullPointerException -> the plugin isn't fully loaded - this.world = "unknown"; - } + this.world = mod.getServerWorld(player.getWorld()); } } diff --git a/implementations/fabric-1.18/src/main/java/de/bluecolored/bluemap/fabric/FabricWorld.java b/implementations/fabric-1.18/src/main/java/de/bluecolored/bluemap/fabric/FabricWorld.java index 6647b152..31ec0381 100644 --- a/implementations/fabric-1.18/src/main/java/de/bluecolored/bluemap/fabric/FabricWorld.java +++ b/implementations/fabric-1.18/src/main/java/de/bluecolored/bluemap/fabric/FabricWorld.java @@ -24,12 +24,11 @@ */ package de.bluecolored.bluemap.fabric; -import de.bluecolored.bluemap.common.serverinterface.Dimension; import de.bluecolored.bluemap.common.serverinterface.ServerWorld; +import de.bluecolored.bluemap.core.util.Key; import net.minecraft.server.MinecraftServer; +import net.minecraft.util.Identifier; import net.minecraft.util.WorldSavePath; -import net.minecraft.world.World; -import net.minecraft.world.dimension.DimensionType; import java.io.IOException; import java.lang.ref.WeakReference; @@ -41,27 +40,18 @@ import java.util.concurrent.ExecutionException; public class FabricWorld implements ServerWorld { private final WeakReference delegate; - private final Path saveFolder; + private final Path worldFolder; + private final Key dimension; public FabricWorld(net.minecraft.server.world.ServerWorld delegate) { this.delegate = new WeakReference<>(delegate); MinecraftServer server = delegate.getServer(); - Path worldFolder = delegate.getServer().getRunDirectory().toPath().resolve(server.getSavePath(WorldSavePath.ROOT)); - this.saveFolder = DimensionType.getSaveDirectory(delegate.getRegistryKey(), worldFolder) - .toAbsolutePath().normalize(); - } + this.worldFolder = delegate.getServer().getRunDirectory().toPath() + .resolve(server.getSavePath(WorldSavePath.ROOT)); - @Override - public Dimension getDimension() { - net.minecraft.server.world.ServerWorld world = delegate.get(); - if (world != null) { - if (world.getRegistryKey().equals(World.NETHER)) return Dimension.NETHER; - if (world.getRegistryKey().equals(World.END)) return Dimension.END; - if (world.getRegistryKey().equals(World.OVERWORLD)) return Dimension.OVERWORLD; - } - - return ServerWorld.super.getDimension(); + Identifier id = delegate.getRegistryKey().getValue(); + this.dimension = new Key(id.getNamespace(), id.getPath()); } @Override @@ -92,8 +82,13 @@ public class FabricWorld implements ServerWorld { } @Override - public Path getSaveFolder() { - return this.saveFolder; + public Path getWorldFolder() { + return worldFolder; + } + + @Override + public Key getDimension() { + return dimension; } } diff --git a/implementations/fabric-1.18/src/main/java/de/bluecolored/bluemap/fabric/Log4jLogger.java b/implementations/fabric-1.18/src/main/java/de/bluecolored/bluemap/fabric/Log4jLogger.java index 3b868cae..9e60f395 100644 --- a/implementations/fabric-1.18/src/main/java/de/bluecolored/bluemap/fabric/Log4jLogger.java +++ b/implementations/fabric-1.18/src/main/java/de/bluecolored/bluemap/fabric/Log4jLogger.java @@ -30,7 +30,7 @@ import de.bluecolored.bluemap.core.logger.AbstractLogger; public class Log4jLogger extends AbstractLogger { - private Logger out; + private final Logger out; public Log4jLogger(Logger out) { this.out = out; diff --git a/implementations/fabric-1.19.4/src/main/java/de/bluecolored/bluemap/fabric/FabricCommandSource.java b/implementations/fabric-1.19.4/src/main/java/de/bluecolored/bluemap/fabric/FabricCommandSource.java index 96497a24..be2e1ae9 100644 --- a/implementations/fabric-1.19.4/src/main/java/de/bluecolored/bluemap/fabric/FabricCommandSource.java +++ b/implementations/fabric-1.19.4/src/main/java/de/bluecolored/bluemap/fabric/FabricCommandSource.java @@ -26,14 +26,14 @@ package de.bluecolored.bluemap.fabric; import com.flowpowered.math.vector.Vector3d; import de.bluecolored.bluemap.common.plugin.Plugin; -import de.bluecolored.bluemap.common.serverinterface.CommandSource; import de.bluecolored.bluemap.common.plugin.text.Text; +import de.bluecolored.bluemap.common.serverinterface.CommandSource; +import de.bluecolored.bluemap.common.serverinterface.ServerWorld; import de.bluecolored.bluemap.core.world.World; import me.lucko.fabric.api.permissions.v0.Permissions; import net.minecraft.server.command.ServerCommandSource; import net.minecraft.util.math.Vec3d; -import java.io.IOException; import java.util.Optional; public class FabricCommandSource implements CommandSource { @@ -75,13 +75,8 @@ public class FabricCommandSource implements CommandSource { @Override public Optional getWorld() { - try { - var serverWorld = mod.getWorld(delegate.getWorld()); - String worldId = plugin.getBlueMap().getWorldId(serverWorld.getSaveFolder()); - return Optional.ofNullable(plugin.getWorlds().get(worldId)); - } catch (IOException ignore) {} - - return Optional.empty(); + ServerWorld serverWorld = mod.getServerWorld(delegate.getWorld()); + return Optional.ofNullable(plugin.getWorld(serverWorld)); } } diff --git a/implementations/fabric-1.19.4/src/main/java/de/bluecolored/bluemap/fabric/FabricEventForwarder.java b/implementations/fabric-1.19.4/src/main/java/de/bluecolored/bluemap/fabric/FabricEventForwarder.java index b3de24cf..411e1c34 100644 --- a/implementations/fabric-1.19.4/src/main/java/de/bluecolored/bluemap/fabric/FabricEventForwarder.java +++ b/implementations/fabric-1.19.4/src/main/java/de/bluecolored/bluemap/fabric/FabricEventForwarder.java @@ -35,8 +35,8 @@ import java.util.UUID; public class FabricEventForwarder { - private FabricMod mod; - private Collection eventListeners; + private final FabricMod mod; + private final Collection eventListeners; public FabricEventForwarder(FabricMod mod) { this.mod = mod; diff --git a/implementations/fabric-1.19.4/src/main/java/de/bluecolored/bluemap/fabric/FabricMod.java b/implementations/fabric-1.19.4/src/main/java/de/bluecolored/bluemap/fabric/FabricMod.java index d2b6499c..c0e9eeb8 100644 --- a/implementations/fabric-1.19.4/src/main/java/de/bluecolored/bluemap/fabric/FabricMod.java +++ b/implementations/fabric-1.19.4/src/main/java/de/bluecolored/bluemap/fabric/FabricMod.java @@ -148,7 +148,7 @@ public class FabricMod implements ModInitializer, Server { } @Override - public Collection getLoadedWorlds() { + public Collection getLoadedServerWorlds() { Collection loadedWorlds = new ArrayList<>(3); for (net.minecraft.server.world.ServerWorld serverWorld : serverInstance.getWorlds()) { loadedWorlds.add(worlds.get(serverWorld)); @@ -158,9 +158,7 @@ public class FabricMod implements ModInitializer, Server { @SuppressWarnings("unchecked") @Override - public Optional getWorld(Object world) { - if (world instanceof Path) - return getWorld((Path) world); + public Optional getServerWorld(Object world) { if (world instanceof String) { Identifier identifier = Identifier.tryParse((String) world); @@ -174,12 +172,12 @@ public class FabricMod implements ModInitializer, Server { } if (world instanceof net.minecraft.server.world.ServerWorld) - return Optional.of(getWorld((net.minecraft.server.world.ServerWorld) world)); + return Optional.of(getServerWorld((net.minecraft.server.world.ServerWorld) world)); return Optional.empty(); } - public ServerWorld getWorld(net.minecraft.server.world.ServerWorld serverWorld) { + public ServerWorld getServerWorld(net.minecraft.server.world.ServerWorld serverWorld) { return worlds.get(serverWorld); } @@ -224,11 +222,6 @@ public class FabricMod implements ModInitializer, Server { return onlinePlayerMap.values(); } - @Override - public Optional getPlayer(UUID uuid) { - return Optional.ofNullable(onlinePlayerMap.get(uuid)); - } - /** * Only update some of the online players each tick to minimize performance impact on the server-thread. * Only call this method on the server-thread. diff --git a/implementations/fabric-1.19.4/src/main/java/de/bluecolored/bluemap/fabric/FabricPlayer.java b/implementations/fabric-1.19.4/src/main/java/de/bluecolored/bluemap/fabric/FabricPlayer.java index 69aecb43..708a87fa 100644 --- a/implementations/fabric-1.19.4/src/main/java/de/bluecolored/bluemap/fabric/FabricPlayer.java +++ b/implementations/fabric-1.19.4/src/main/java/de/bluecolored/bluemap/fabric/FabricPlayer.java @@ -28,6 +28,7 @@ import com.flowpowered.math.vector.Vector3d; import de.bluecolored.bluemap.common.plugin.text.Text; import de.bluecolored.bluemap.common.serverinterface.Gamemode; import de.bluecolored.bluemap.common.serverinterface.Player; +import de.bluecolored.bluemap.common.serverinterface.ServerWorld; import net.minecraft.entity.effect.StatusEffectInstance; import net.minecraft.entity.effect.StatusEffects; import net.minecraft.server.MinecraftServer; @@ -36,7 +37,6 @@ import net.minecraft.util.math.Vec3d; import net.minecraft.world.GameMode; import net.minecraft.world.LightType; -import java.io.IOException; import java.util.EnumMap; import java.util.Map; import java.util.UUID; @@ -53,12 +53,11 @@ public class FabricPlayer implements Player { private final UUID uuid; private Text name; - private String world; + private ServerWorld world; private Vector3d position; private Vector3d rotation; private int skyLight; private int blockLight; - private boolean online; private boolean sneaking; private boolean invisible; private Gamemode gamemode; @@ -83,7 +82,7 @@ public class FabricPlayer implements Player { } @Override - public String getWorld() { + public ServerWorld getWorld() { return this.world; } @@ -107,11 +106,6 @@ public class FabricPlayer implements Player { return blockLight; } - @Override - public boolean isOnline() { - return this.online; - } - @Override public boolean isSneaking() { return this.sneaking; @@ -132,16 +126,10 @@ public class FabricPlayer implements Player { */ public void update() { MinecraftServer server = mod.getServer(); - if (server == null) { - this.online = false; - return; - } + if (server == null) return; ServerPlayerEntity player = server.getPlayerManager().getPlayer(uuid); - if (player == null) { - this.online = false; - return; - } + if (player == null) return; this.gamemode = GAMEMODE_MAP.get(player.interactionManager.getGameMode()); if (this.gamemode == null) this.gamemode = Gamemode.SURVIVAL; @@ -150,7 +138,6 @@ public class FabricPlayer implements Player { this.invisible = invis != null && invis.getDuration() > 0; this.name = Text.of(player.getName().getString()); - this.online = true; Vec3d pos = player.getPos(); this.position = new Vector3d(pos.getX(), pos.getY(), pos.getZ()); @@ -160,12 +147,7 @@ public class FabricPlayer implements Player { this.skyLight = player.getWorld().getLightingProvider().get(LightType.SKY).getLightLevel(player.getBlockPos()); this.blockLight = player.getWorld().getLightingProvider().get(LightType.BLOCK).getLightLevel(player.getBlockPos()); - try { - var world = mod.getWorld(player.getWorld()); - this.world = mod.getPluginInstance().getBlueMap().getWorldId(world.getSaveFolder()); - } catch (IOException | NullPointerException e) { // NullPointerException -> the plugin isn't fully loaded - this.world = "unknown"; - } + this.world = mod.getServerWorld(player.getWorld()); } } diff --git a/implementations/fabric-1.19.4/src/main/java/de/bluecolored/bluemap/fabric/FabricWorld.java b/implementations/fabric-1.19.4/src/main/java/de/bluecolored/bluemap/fabric/FabricWorld.java index 6647b152..31ec0381 100644 --- a/implementations/fabric-1.19.4/src/main/java/de/bluecolored/bluemap/fabric/FabricWorld.java +++ b/implementations/fabric-1.19.4/src/main/java/de/bluecolored/bluemap/fabric/FabricWorld.java @@ -24,12 +24,11 @@ */ package de.bluecolored.bluemap.fabric; -import de.bluecolored.bluemap.common.serverinterface.Dimension; import de.bluecolored.bluemap.common.serverinterface.ServerWorld; +import de.bluecolored.bluemap.core.util.Key; import net.minecraft.server.MinecraftServer; +import net.minecraft.util.Identifier; import net.minecraft.util.WorldSavePath; -import net.minecraft.world.World; -import net.minecraft.world.dimension.DimensionType; import java.io.IOException; import java.lang.ref.WeakReference; @@ -41,27 +40,18 @@ import java.util.concurrent.ExecutionException; public class FabricWorld implements ServerWorld { private final WeakReference delegate; - private final Path saveFolder; + private final Path worldFolder; + private final Key dimension; public FabricWorld(net.minecraft.server.world.ServerWorld delegate) { this.delegate = new WeakReference<>(delegate); MinecraftServer server = delegate.getServer(); - Path worldFolder = delegate.getServer().getRunDirectory().toPath().resolve(server.getSavePath(WorldSavePath.ROOT)); - this.saveFolder = DimensionType.getSaveDirectory(delegate.getRegistryKey(), worldFolder) - .toAbsolutePath().normalize(); - } + this.worldFolder = delegate.getServer().getRunDirectory().toPath() + .resolve(server.getSavePath(WorldSavePath.ROOT)); - @Override - public Dimension getDimension() { - net.minecraft.server.world.ServerWorld world = delegate.get(); - if (world != null) { - if (world.getRegistryKey().equals(World.NETHER)) return Dimension.NETHER; - if (world.getRegistryKey().equals(World.END)) return Dimension.END; - if (world.getRegistryKey().equals(World.OVERWORLD)) return Dimension.OVERWORLD; - } - - return ServerWorld.super.getDimension(); + Identifier id = delegate.getRegistryKey().getValue(); + this.dimension = new Key(id.getNamespace(), id.getPath()); } @Override @@ -92,8 +82,13 @@ public class FabricWorld implements ServerWorld { } @Override - public Path getSaveFolder() { - return this.saveFolder; + public Path getWorldFolder() { + return worldFolder; + } + + @Override + public Key getDimension() { + return dimension; } } diff --git a/implementations/fabric-1.19.4/src/main/java/de/bluecolored/bluemap/fabric/Log4jLogger.java b/implementations/fabric-1.19.4/src/main/java/de/bluecolored/bluemap/fabric/Log4jLogger.java index 3b868cae..9e60f395 100644 --- a/implementations/fabric-1.19.4/src/main/java/de/bluecolored/bluemap/fabric/Log4jLogger.java +++ b/implementations/fabric-1.19.4/src/main/java/de/bluecolored/bluemap/fabric/Log4jLogger.java @@ -30,7 +30,7 @@ import de.bluecolored.bluemap.core.logger.AbstractLogger; public class Log4jLogger extends AbstractLogger { - private Logger out; + private final Logger out; public Log4jLogger(Logger out) { this.out = out; diff --git a/implementations/fabric-1.20/src/main/java/de/bluecolored/bluemap/fabric/FabricCommandSource.java b/implementations/fabric-1.20/src/main/java/de/bluecolored/bluemap/fabric/FabricCommandSource.java index c2483efa..5c641c7c 100644 --- a/implementations/fabric-1.20/src/main/java/de/bluecolored/bluemap/fabric/FabricCommandSource.java +++ b/implementations/fabric-1.20/src/main/java/de/bluecolored/bluemap/fabric/FabricCommandSource.java @@ -26,14 +26,14 @@ package de.bluecolored.bluemap.fabric; import com.flowpowered.math.vector.Vector3d; import de.bluecolored.bluemap.common.plugin.Plugin; -import de.bluecolored.bluemap.common.serverinterface.CommandSource; import de.bluecolored.bluemap.common.plugin.text.Text; +import de.bluecolored.bluemap.common.serverinterface.CommandSource; +import de.bluecolored.bluemap.common.serverinterface.ServerWorld; import de.bluecolored.bluemap.core.world.World; import me.lucko.fabric.api.permissions.v0.Permissions; import net.minecraft.server.command.ServerCommandSource; import net.minecraft.util.math.Vec3d; -import java.io.IOException; import java.util.Optional; public class FabricCommandSource implements CommandSource { @@ -75,13 +75,8 @@ public class FabricCommandSource implements CommandSource { @Override public Optional getWorld() { - try { - var serverWorld = mod.getWorld(delegate.getWorld()); - String worldId = plugin.getBlueMap().getWorldId(serverWorld.getSaveFolder()); - return Optional.ofNullable(plugin.getWorlds().get(worldId)); - } catch (IOException ignore) {} - - return Optional.empty(); + ServerWorld serverWorld = mod.getServerWorld(delegate.getWorld()); + return Optional.ofNullable(plugin.getWorld(serverWorld)); } } diff --git a/implementations/fabric-1.20/src/main/java/de/bluecolored/bluemap/fabric/FabricEventForwarder.java b/implementations/fabric-1.20/src/main/java/de/bluecolored/bluemap/fabric/FabricEventForwarder.java index b3de24cf..411e1c34 100644 --- a/implementations/fabric-1.20/src/main/java/de/bluecolored/bluemap/fabric/FabricEventForwarder.java +++ b/implementations/fabric-1.20/src/main/java/de/bluecolored/bluemap/fabric/FabricEventForwarder.java @@ -35,8 +35,8 @@ import java.util.UUID; public class FabricEventForwarder { - private FabricMod mod; - private Collection eventListeners; + private final FabricMod mod; + private final Collection eventListeners; public FabricEventForwarder(FabricMod mod) { this.mod = mod; diff --git a/implementations/fabric-1.20/src/main/java/de/bluecolored/bluemap/fabric/FabricMod.java b/implementations/fabric-1.20/src/main/java/de/bluecolored/bluemap/fabric/FabricMod.java index 2ef1faf1..f964fe3c 100644 --- a/implementations/fabric-1.20/src/main/java/de/bluecolored/bluemap/fabric/FabricMod.java +++ b/implementations/fabric-1.20/src/main/java/de/bluecolored/bluemap/fabric/FabricMod.java @@ -148,7 +148,7 @@ public class FabricMod implements ModInitializer, Server { } @Override - public Collection getLoadedWorlds() { + public Collection getLoadedServerWorlds() { Collection loadedWorlds = new ArrayList<>(3); for (net.minecraft.server.world.ServerWorld serverWorld : serverInstance.getWorlds()) { loadedWorlds.add(worlds.get(serverWorld)); @@ -158,9 +158,7 @@ public class FabricMod implements ModInitializer, Server { @SuppressWarnings("unchecked") @Override - public Optional getWorld(Object world) { - if (world instanceof Path) - return getWorld((Path) world); + public Optional getServerWorld(Object world) { if (world instanceof String) { Identifier identifier = Identifier.tryParse((String) world); @@ -174,12 +172,12 @@ public class FabricMod implements ModInitializer, Server { } if (world instanceof net.minecraft.server.world.ServerWorld) - return Optional.of(getWorld((net.minecraft.server.world.ServerWorld) world)); + return Optional.of(getServerWorld((net.minecraft.server.world.ServerWorld) world)); return Optional.empty(); } - public ServerWorld getWorld(net.minecraft.server.world.ServerWorld serverWorld) { + public ServerWorld getServerWorld(net.minecraft.server.world.ServerWorld serverWorld) { return worlds.get(serverWorld); } @@ -224,11 +222,6 @@ public class FabricMod implements ModInitializer, Server { return onlinePlayerMap.values(); } - @Override - public Optional getPlayer(UUID uuid) { - return Optional.ofNullable(onlinePlayerMap.get(uuid)); - } - /** * Only update some of the online players each tick to minimize performance impact on the server-thread. * Only call this method on the server-thread. diff --git a/implementations/fabric-1.20/src/main/java/de/bluecolored/bluemap/fabric/FabricPlayer.java b/implementations/fabric-1.20/src/main/java/de/bluecolored/bluemap/fabric/FabricPlayer.java index 39b5ee53..6dcf2428 100644 --- a/implementations/fabric-1.20/src/main/java/de/bluecolored/bluemap/fabric/FabricPlayer.java +++ b/implementations/fabric-1.20/src/main/java/de/bluecolored/bluemap/fabric/FabricPlayer.java @@ -28,6 +28,7 @@ import com.flowpowered.math.vector.Vector3d; import de.bluecolored.bluemap.common.plugin.text.Text; import de.bluecolored.bluemap.common.serverinterface.Gamemode; import de.bluecolored.bluemap.common.serverinterface.Player; +import de.bluecolored.bluemap.common.serverinterface.ServerWorld; import net.minecraft.entity.effect.StatusEffectInstance; import net.minecraft.entity.effect.StatusEffects; import net.minecraft.server.MinecraftServer; @@ -36,7 +37,6 @@ import net.minecraft.util.math.Vec3d; import net.minecraft.world.GameMode; import net.minecraft.world.LightType; -import java.io.IOException; import java.util.EnumMap; import java.util.Map; import java.util.UUID; @@ -53,12 +53,11 @@ public class FabricPlayer implements Player { private final UUID uuid; private Text name; - private String world; + private ServerWorld world; private Vector3d position; private Vector3d rotation; private int skyLight; private int blockLight; - private boolean online; private boolean sneaking; private boolean invisible; private Gamemode gamemode; @@ -83,7 +82,7 @@ public class FabricPlayer implements Player { } @Override - public String getWorld() { + public ServerWorld getWorld() { return this.world; } @@ -107,11 +106,6 @@ public class FabricPlayer implements Player { return blockLight; } - @Override - public boolean isOnline() { - return this.online; - } - @Override public boolean isSneaking() { return this.sneaking; @@ -132,16 +126,10 @@ public class FabricPlayer implements Player { */ public void update() { MinecraftServer server = mod.getServer(); - if (server == null) { - this.online = false; - return; - } + if (server == null) return; ServerPlayerEntity player = server.getPlayerManager().getPlayer(uuid); - if (player == null) { - this.online = false; - return; - } + if (player == null) return; this.gamemode = GAMEMODE_MAP.get(player.interactionManager.getGameMode()); if (this.gamemode == null) this.gamemode = Gamemode.SURVIVAL; @@ -150,7 +138,6 @@ public class FabricPlayer implements Player { this.invisible = invis != null && invis.getDuration() > 0; this.name = Text.of(player.getName().getString()); - this.online = true; Vec3d pos = player.getPos(); this.position = new Vector3d(pos.getX(), pos.getY(), pos.getZ()); @@ -160,12 +147,7 @@ public class FabricPlayer implements Player { this.skyLight = player.getWorld().getLightingProvider().get(LightType.SKY).getLightLevel(player.getBlockPos()); this.blockLight = player.getWorld().getLightingProvider().get(LightType.BLOCK).getLightLevel(player.getBlockPos()); - try { - var world = mod.getWorld(player.getWorld()).orElse(null); - this.world = world != null ? mod.getPluginInstance().getBlueMap().getWorldId(world.getSaveFolder()) : "unknown"; - } catch (IOException | NullPointerException e) { // NullPointerException -> the plugin isn't fully loaded - this.world = "unknown"; - } + this.world = mod.getServerWorld(player.getServerWorld()); } } diff --git a/implementations/fabric-1.20/src/main/java/de/bluecolored/bluemap/fabric/FabricWorld.java b/implementations/fabric-1.20/src/main/java/de/bluecolored/bluemap/fabric/FabricWorld.java index 6647b152..31ec0381 100644 --- a/implementations/fabric-1.20/src/main/java/de/bluecolored/bluemap/fabric/FabricWorld.java +++ b/implementations/fabric-1.20/src/main/java/de/bluecolored/bluemap/fabric/FabricWorld.java @@ -24,12 +24,11 @@ */ package de.bluecolored.bluemap.fabric; -import de.bluecolored.bluemap.common.serverinterface.Dimension; import de.bluecolored.bluemap.common.serverinterface.ServerWorld; +import de.bluecolored.bluemap.core.util.Key; import net.minecraft.server.MinecraftServer; +import net.minecraft.util.Identifier; import net.minecraft.util.WorldSavePath; -import net.minecraft.world.World; -import net.minecraft.world.dimension.DimensionType; import java.io.IOException; import java.lang.ref.WeakReference; @@ -41,27 +40,18 @@ import java.util.concurrent.ExecutionException; public class FabricWorld implements ServerWorld { private final WeakReference delegate; - private final Path saveFolder; + private final Path worldFolder; + private final Key dimension; public FabricWorld(net.minecraft.server.world.ServerWorld delegate) { this.delegate = new WeakReference<>(delegate); MinecraftServer server = delegate.getServer(); - Path worldFolder = delegate.getServer().getRunDirectory().toPath().resolve(server.getSavePath(WorldSavePath.ROOT)); - this.saveFolder = DimensionType.getSaveDirectory(delegate.getRegistryKey(), worldFolder) - .toAbsolutePath().normalize(); - } + this.worldFolder = delegate.getServer().getRunDirectory().toPath() + .resolve(server.getSavePath(WorldSavePath.ROOT)); - @Override - public Dimension getDimension() { - net.minecraft.server.world.ServerWorld world = delegate.get(); - if (world != null) { - if (world.getRegistryKey().equals(World.NETHER)) return Dimension.NETHER; - if (world.getRegistryKey().equals(World.END)) return Dimension.END; - if (world.getRegistryKey().equals(World.OVERWORLD)) return Dimension.OVERWORLD; - } - - return ServerWorld.super.getDimension(); + Identifier id = delegate.getRegistryKey().getValue(); + this.dimension = new Key(id.getNamespace(), id.getPath()); } @Override @@ -92,8 +82,13 @@ public class FabricWorld implements ServerWorld { } @Override - public Path getSaveFolder() { - return this.saveFolder; + public Path getWorldFolder() { + return worldFolder; + } + + @Override + public Key getDimension() { + return dimension; } } diff --git a/implementations/forge-1.17.1/src/main/java/de/bluecolored/bluemap/forge/ForgeCommandSource.java b/implementations/forge-1.17.1/src/main/java/de/bluecolored/bluemap/forge/ForgeCommandSource.java index eadcd607..b19ca3af 100644 --- a/implementations/forge-1.17.1/src/main/java/de/bluecolored/bluemap/forge/ForgeCommandSource.java +++ b/implementations/forge-1.17.1/src/main/java/de/bluecolored/bluemap/forge/ForgeCommandSource.java @@ -26,13 +26,13 @@ package de.bluecolored.bluemap.forge; import com.flowpowered.math.vector.Vector3d; import de.bluecolored.bluemap.common.plugin.Plugin; -import de.bluecolored.bluemap.common.serverinterface.CommandSource; import de.bluecolored.bluemap.common.plugin.text.Text; +import de.bluecolored.bluemap.common.serverinterface.CommandSource; +import de.bluecolored.bluemap.common.serverinterface.ServerWorld; import de.bluecolored.bluemap.core.world.World; import net.minecraft.commands.CommandSourceStack; import net.minecraft.network.chat.TextComponent; -import java.io.IOException; import java.util.Optional; public class ForgeCommandSource implements CommandSource { @@ -67,13 +67,8 @@ public class ForgeCommandSource implements CommandSource { @Override public Optional getWorld() { - try { - var serverWorld = mod.getWorld(delegate.getLevel()); - String worldId = plugin.getBlueMap().getWorldId(serverWorld.getSaveFolder()); - return Optional.ofNullable(plugin.getWorlds().get(worldId)); - } catch (IOException ignore) {} - - return Optional.empty(); + ServerWorld serverWorld = mod.getServerWorld(delegate.getLevel()); + return Optional.ofNullable(plugin.getWorld(serverWorld)); } } diff --git a/implementations/forge-1.17.1/src/main/java/de/bluecolored/bluemap/forge/ForgeMod.java b/implementations/forge-1.17.1/src/main/java/de/bluecolored/bluemap/forge/ForgeMod.java index 1c69f30a..5fc046e9 100644 --- a/implementations/forge-1.17.1/src/main/java/de/bluecolored/bluemap/forge/ForgeMod.java +++ b/implementations/forge-1.17.1/src/main/java/de/bluecolored/bluemap/forge/ForgeMod.java @@ -155,7 +155,7 @@ public class ForgeMod implements Server { } @Override - public Collection getLoadedWorlds() { + public Collection getLoadedServerWorlds() { Collection loadedWorlds = new ArrayList<>(3); for (ServerLevel serverWorld : serverInstance.getAllLevels()) { loadedWorlds.add(worlds.get(serverWorld)); @@ -165,9 +165,7 @@ public class ForgeMod implements Server { @SuppressWarnings("unchecked") @Override - public Optional getWorld(Object world) { - if (world instanceof Path) - return getWorld((Path) world); + public Optional getServerWorld(Object world) { if (world instanceof String) { ResourceLocation resourceLocation = ResourceLocation.tryParse((String) world); @@ -181,12 +179,12 @@ public class ForgeMod implements Server { } if (world instanceof ServerLevel) - return Optional.of(getWorld((ServerLevel) world)); + return Optional.of(getServerWorld((ServerLevel) world)); return Optional.empty(); } - public ServerWorld getWorld(ServerLevel world) { + public ServerWorld getServerWorld(ServerLevel world) { return worlds.get(world); } @@ -235,11 +233,6 @@ public class ForgeMod implements Server { return onlinePlayerMap.values(); } - @Override - public Optional getPlayer(UUID uuid) { - return Optional.ofNullable(onlinePlayerMap.get(uuid)); - } - /** * Only update some of the online players each tick to minimize performance impact on the server-thread. * Only call this method on the server-thread. diff --git a/implementations/forge-1.17.1/src/main/java/de/bluecolored/bluemap/forge/ForgePlayer.java b/implementations/forge-1.17.1/src/main/java/de/bluecolored/bluemap/forge/ForgePlayer.java index a739b0da..07d9fdcd 100644 --- a/implementations/forge-1.17.1/src/main/java/de/bluecolored/bluemap/forge/ForgePlayer.java +++ b/implementations/forge-1.17.1/src/main/java/de/bluecolored/bluemap/forge/ForgePlayer.java @@ -28,6 +28,7 @@ import com.flowpowered.math.vector.Vector3d; import de.bluecolored.bluemap.common.plugin.text.Text; import de.bluecolored.bluemap.common.serverinterface.Gamemode; import de.bluecolored.bluemap.common.serverinterface.Player; +import de.bluecolored.bluemap.common.serverinterface.ServerWorld; import net.minecraft.core.BlockPos; import net.minecraft.server.MinecraftServer; import net.minecraft.server.level.ServerPlayer; @@ -37,7 +38,6 @@ import net.minecraft.world.level.GameType; import net.minecraft.world.level.LightLayer; import net.minecraft.world.phys.Vec3; -import java.io.IOException; import java.util.EnumMap; import java.util.Map; import java.util.UUID; @@ -54,12 +54,11 @@ public class ForgePlayer implements Player { private final UUID uuid; private Text name; - private String world; + private ServerWorld world; private Vector3d position; private Vector3d rotation; private int skyLight; private int blockLight; - private boolean online; private boolean sneaking; private boolean invisible; private Gamemode gamemode; @@ -84,7 +83,7 @@ public class ForgePlayer implements Player { } @Override - public String getWorld() { + public ServerWorld getWorld() { return this.world; } @@ -108,11 +107,6 @@ public class ForgePlayer implements Player { return blockLight; } - @Override - public boolean isOnline() { - return this.online; - } - @Override public boolean isSneaking() { return this.sneaking; @@ -133,16 +127,10 @@ public class ForgePlayer implements Player { */ public void update() { MinecraftServer server = mod.getServer(); - if (server == null) { - this.online = false; - return; - } + if (server == null) return; ServerPlayer player = server.getPlayerList().getPlayer(uuid); - if (player == null) { - this.online = false; - return; - } + if (player == null) return; this.gamemode = GAMEMODE_MAP.getOrDefault(player.gameMode.getGameModeForPlayer(), Gamemode.SURVIVAL); if (this.gamemode == null) this.gamemode = Gamemode.SURVIVAL; @@ -151,7 +139,6 @@ public class ForgePlayer implements Player { this.invisible = invis != null && invis.getDuration() > 0; this.name = Text.of(player.getName().getString()); - this.online = true; Vec3 pos = player.getPosition(1f); this.position = new Vector3d(pos.x(), pos.y(), pos.z()); @@ -161,12 +148,7 @@ public class ForgePlayer implements Player { this.skyLight = player.getLevel().getChunkSource().getLightEngine().getLayerListener(LightLayer.SKY).getLightValue(new BlockPos(player.getX(), player.getY(), player.getZ())); this.blockLight = player.getLevel().getChunkSource().getLightEngine().getLayerListener(LightLayer.BLOCK).getLightValue(new BlockPos(player.getX(), player.getY(), player.getZ())); - try { - var world = mod.getWorld(player.getLevel()); - this.world = mod.getPlugin().getBlueMap().getWorldId(world.getSaveFolder()); - } catch (IOException | NullPointerException e) { // NullPointerException -> the plugin isn't fully loaded - this.world = "unknown"; - } + this.world = mod.getServerWorld(player.getLevel()); } } diff --git a/implementations/forge-1.17.1/src/main/java/de/bluecolored/bluemap/forge/ForgeWorld.java b/implementations/forge-1.17.1/src/main/java/de/bluecolored/bluemap/forge/ForgeWorld.java index bdbba84c..da750184 100644 --- a/implementations/forge-1.17.1/src/main/java/de/bluecolored/bluemap/forge/ForgeWorld.java +++ b/implementations/forge-1.17.1/src/main/java/de/bluecolored/bluemap/forge/ForgeWorld.java @@ -24,12 +24,11 @@ */ package de.bluecolored.bluemap.forge; -import de.bluecolored.bluemap.common.serverinterface.Dimension; import de.bluecolored.bluemap.common.serverinterface.ServerWorld; +import de.bluecolored.bluemap.core.util.Key; +import net.minecraft.resources.ResourceLocation; import net.minecraft.server.MinecraftServer; import net.minecraft.server.level.ServerLevel; -import net.minecraft.world.level.Level; -import net.minecraft.world.level.dimension.DimensionType; import net.minecraft.world.level.storage.LevelResource; import java.io.IOException; @@ -42,27 +41,18 @@ import java.util.concurrent.ExecutionException; public class ForgeWorld implements ServerWorld { private final WeakReference delegate; - private final Path saveFolder; + private final Path worldFolder; + private final Key dimension; public ForgeWorld(ServerLevel delegate) { this.delegate = new WeakReference<>(delegate); MinecraftServer server = delegate.getServer(); - Path worldFolder = delegate.getServer().getServerDirectory().toPath().resolve(server.getWorldPath(LevelResource.ROOT)); - this.saveFolder = DimensionType.getStorageFolder(delegate.dimension(), worldFolder.toFile()).toPath() - .toAbsolutePath().normalize(); - } + this.worldFolder = delegate.getServer().getServerDirectory().toPath() + .resolve(server.getWorldPath(LevelResource.ROOT)); - @Override - public Dimension getDimension() { - ServerLevel world = delegate.get(); - if (world != null) { - if (world.dimension().equals(Level.NETHER)) return Dimension.NETHER; - if (world.dimension().equals(Level.END)) return Dimension.END; - if (world.dimension().equals(Level.OVERWORLD)) return Dimension.OVERWORLD; - } - - return ServerWorld.super.getDimension(); + ResourceLocation id = delegate.dimension().location(); + this.dimension = new Key(id.getNamespace(), id.getPath()); } @Override @@ -93,8 +83,13 @@ public class ForgeWorld implements ServerWorld { } @Override - public Path getSaveFolder() { - return this.saveFolder; + public Path getWorldFolder() { + return worldFolder; + } + + @Override + public Key getDimension() { + return dimension; } } diff --git a/implementations/forge-1.17.1/src/main/java/de/bluecolored/bluemap/forge/Log4jLogger.java b/implementations/forge-1.17.1/src/main/java/de/bluecolored/bluemap/forge/Log4jLogger.java index fa6664ec..740b75b2 100644 --- a/implementations/forge-1.17.1/src/main/java/de/bluecolored/bluemap/forge/Log4jLogger.java +++ b/implementations/forge-1.17.1/src/main/java/de/bluecolored/bluemap/forge/Log4jLogger.java @@ -24,13 +24,12 @@ */ package de.bluecolored.bluemap.forge; -import org.apache.logging.log4j.Logger; - import de.bluecolored.bluemap.core.logger.AbstractLogger; +import org.apache.logging.log4j.Logger; public class Log4jLogger extends AbstractLogger { - private Logger out; + private final Logger out; public Log4jLogger(Logger out) { this.out = out; diff --git a/implementations/forge-1.18.1/src/main/java/de/bluecolored/bluemap/forge/ForgeCommandSource.java b/implementations/forge-1.18.1/src/main/java/de/bluecolored/bluemap/forge/ForgeCommandSource.java index eadcd607..b19ca3af 100644 --- a/implementations/forge-1.18.1/src/main/java/de/bluecolored/bluemap/forge/ForgeCommandSource.java +++ b/implementations/forge-1.18.1/src/main/java/de/bluecolored/bluemap/forge/ForgeCommandSource.java @@ -26,13 +26,13 @@ package de.bluecolored.bluemap.forge; import com.flowpowered.math.vector.Vector3d; import de.bluecolored.bluemap.common.plugin.Plugin; -import de.bluecolored.bluemap.common.serverinterface.CommandSource; import de.bluecolored.bluemap.common.plugin.text.Text; +import de.bluecolored.bluemap.common.serverinterface.CommandSource; +import de.bluecolored.bluemap.common.serverinterface.ServerWorld; import de.bluecolored.bluemap.core.world.World; import net.minecraft.commands.CommandSourceStack; import net.minecraft.network.chat.TextComponent; -import java.io.IOException; import java.util.Optional; public class ForgeCommandSource implements CommandSource { @@ -67,13 +67,8 @@ public class ForgeCommandSource implements CommandSource { @Override public Optional getWorld() { - try { - var serverWorld = mod.getWorld(delegate.getLevel()); - String worldId = plugin.getBlueMap().getWorldId(serverWorld.getSaveFolder()); - return Optional.ofNullable(plugin.getWorlds().get(worldId)); - } catch (IOException ignore) {} - - return Optional.empty(); + ServerWorld serverWorld = mod.getServerWorld(delegate.getLevel()); + return Optional.ofNullable(plugin.getWorld(serverWorld)); } } diff --git a/implementations/forge-1.18.1/src/main/java/de/bluecolored/bluemap/forge/ForgeMod.java b/implementations/forge-1.18.1/src/main/java/de/bluecolored/bluemap/forge/ForgeMod.java index 2d457866..e899f182 100644 --- a/implementations/forge-1.18.1/src/main/java/de/bluecolored/bluemap/forge/ForgeMod.java +++ b/implementations/forge-1.18.1/src/main/java/de/bluecolored/bluemap/forge/ForgeMod.java @@ -155,7 +155,7 @@ public class ForgeMod implements Server { } @Override - public Collection getLoadedWorlds() { + public Collection getLoadedServerWorlds() { Collection loadedWorlds = new ArrayList<>(3); for (ServerLevel serverWorld : serverInstance.getAllLevels()) { loadedWorlds.add(worlds.get(serverWorld)); @@ -165,9 +165,7 @@ public class ForgeMod implements Server { @SuppressWarnings("unchecked") @Override - public Optional getWorld(Object world) { - if (world instanceof Path) - return getWorld((Path) world); + public Optional getServerWorld(Object world) { if (world instanceof String) { ResourceLocation resourceLocation = ResourceLocation.tryParse((String) world); @@ -181,12 +179,12 @@ public class ForgeMod implements Server { } if (world instanceof ServerLevel) - return Optional.of(getWorld((ServerLevel) world)); + return Optional.of(getServerWorld((ServerLevel) world)); return Optional.empty(); } - public ServerWorld getWorld(ServerLevel world) { + public ServerWorld getServerWorld(ServerLevel world) { return worlds.get(world); } @@ -235,11 +233,6 @@ public class ForgeMod implements Server { return onlinePlayerMap.values(); } - @Override - public Optional getPlayer(UUID uuid) { - return Optional.ofNullable(onlinePlayerMap.get(uuid)); - } - /** * Only update some of the online players each tick to minimize performance impact on the server-thread. * Only call this method on the server-thread. diff --git a/implementations/forge-1.18.1/src/main/java/de/bluecolored/bluemap/forge/ForgePlayer.java b/implementations/forge-1.18.1/src/main/java/de/bluecolored/bluemap/forge/ForgePlayer.java index a739b0da..07d9fdcd 100644 --- a/implementations/forge-1.18.1/src/main/java/de/bluecolored/bluemap/forge/ForgePlayer.java +++ b/implementations/forge-1.18.1/src/main/java/de/bluecolored/bluemap/forge/ForgePlayer.java @@ -28,6 +28,7 @@ import com.flowpowered.math.vector.Vector3d; import de.bluecolored.bluemap.common.plugin.text.Text; import de.bluecolored.bluemap.common.serverinterface.Gamemode; import de.bluecolored.bluemap.common.serverinterface.Player; +import de.bluecolored.bluemap.common.serverinterface.ServerWorld; import net.minecraft.core.BlockPos; import net.minecraft.server.MinecraftServer; import net.minecraft.server.level.ServerPlayer; @@ -37,7 +38,6 @@ import net.minecraft.world.level.GameType; import net.minecraft.world.level.LightLayer; import net.minecraft.world.phys.Vec3; -import java.io.IOException; import java.util.EnumMap; import java.util.Map; import java.util.UUID; @@ -54,12 +54,11 @@ public class ForgePlayer implements Player { private final UUID uuid; private Text name; - private String world; + private ServerWorld world; private Vector3d position; private Vector3d rotation; private int skyLight; private int blockLight; - private boolean online; private boolean sneaking; private boolean invisible; private Gamemode gamemode; @@ -84,7 +83,7 @@ public class ForgePlayer implements Player { } @Override - public String getWorld() { + public ServerWorld getWorld() { return this.world; } @@ -108,11 +107,6 @@ public class ForgePlayer implements Player { return blockLight; } - @Override - public boolean isOnline() { - return this.online; - } - @Override public boolean isSneaking() { return this.sneaking; @@ -133,16 +127,10 @@ public class ForgePlayer implements Player { */ public void update() { MinecraftServer server = mod.getServer(); - if (server == null) { - this.online = false; - return; - } + if (server == null) return; ServerPlayer player = server.getPlayerList().getPlayer(uuid); - if (player == null) { - this.online = false; - return; - } + if (player == null) return; this.gamemode = GAMEMODE_MAP.getOrDefault(player.gameMode.getGameModeForPlayer(), Gamemode.SURVIVAL); if (this.gamemode == null) this.gamemode = Gamemode.SURVIVAL; @@ -151,7 +139,6 @@ public class ForgePlayer implements Player { this.invisible = invis != null && invis.getDuration() > 0; this.name = Text.of(player.getName().getString()); - this.online = true; Vec3 pos = player.getPosition(1f); this.position = new Vector3d(pos.x(), pos.y(), pos.z()); @@ -161,12 +148,7 @@ public class ForgePlayer implements Player { this.skyLight = player.getLevel().getChunkSource().getLightEngine().getLayerListener(LightLayer.SKY).getLightValue(new BlockPos(player.getX(), player.getY(), player.getZ())); this.blockLight = player.getLevel().getChunkSource().getLightEngine().getLayerListener(LightLayer.BLOCK).getLightValue(new BlockPos(player.getX(), player.getY(), player.getZ())); - try { - var world = mod.getWorld(player.getLevel()); - this.world = mod.getPlugin().getBlueMap().getWorldId(world.getSaveFolder()); - } catch (IOException | NullPointerException e) { // NullPointerException -> the plugin isn't fully loaded - this.world = "unknown"; - } + this.world = mod.getServerWorld(player.getLevel()); } } diff --git a/implementations/forge-1.18.1/src/main/java/de/bluecolored/bluemap/forge/ForgeWorld.java b/implementations/forge-1.18.1/src/main/java/de/bluecolored/bluemap/forge/ForgeWorld.java index ce92b260..da750184 100644 --- a/implementations/forge-1.18.1/src/main/java/de/bluecolored/bluemap/forge/ForgeWorld.java +++ b/implementations/forge-1.18.1/src/main/java/de/bluecolored/bluemap/forge/ForgeWorld.java @@ -24,12 +24,11 @@ */ package de.bluecolored.bluemap.forge; -import de.bluecolored.bluemap.common.serverinterface.Dimension; import de.bluecolored.bluemap.common.serverinterface.ServerWorld; +import de.bluecolored.bluemap.core.util.Key; +import net.minecraft.resources.ResourceLocation; import net.minecraft.server.MinecraftServer; import net.minecraft.server.level.ServerLevel; -import net.minecraft.world.level.Level; -import net.minecraft.world.level.dimension.DimensionType; import net.minecraft.world.level.storage.LevelResource; import java.io.IOException; @@ -42,27 +41,18 @@ import java.util.concurrent.ExecutionException; public class ForgeWorld implements ServerWorld { private final WeakReference delegate; - private final Path saveFolder; + private final Path worldFolder; + private final Key dimension; public ForgeWorld(ServerLevel delegate) { this.delegate = new WeakReference<>(delegate); MinecraftServer server = delegate.getServer(); - Path worldFolder = delegate.getServer().getServerDirectory().toPath().resolve(server.getWorldPath(LevelResource.ROOT)); - this.saveFolder = DimensionType.getStorageFolder(delegate.dimension(), worldFolder) - .toAbsolutePath().normalize(); - } + this.worldFolder = delegate.getServer().getServerDirectory().toPath() + .resolve(server.getWorldPath(LevelResource.ROOT)); - @Override - public Dimension getDimension() { - ServerLevel world = delegate.get(); - if (world != null) { - if (world.dimension().equals(Level.NETHER)) return Dimension.NETHER; - if (world.dimension().equals(Level.END)) return Dimension.END; - if (world.dimension().equals(Level.OVERWORLD)) return Dimension.OVERWORLD; - } - - return ServerWorld.super.getDimension(); + ResourceLocation id = delegate.dimension().location(); + this.dimension = new Key(id.getNamespace(), id.getPath()); } @Override @@ -93,8 +83,13 @@ public class ForgeWorld implements ServerWorld { } @Override - public Path getSaveFolder() { - return this.saveFolder; + public Path getWorldFolder() { + return worldFolder; + } + + @Override + public Key getDimension() { + return dimension; } } diff --git a/implementations/forge-1.18.1/src/main/java/de/bluecolored/bluemap/forge/Log4jLogger.java b/implementations/forge-1.18.1/src/main/java/de/bluecolored/bluemap/forge/Log4jLogger.java index fa6664ec..a77265e0 100644 --- a/implementations/forge-1.18.1/src/main/java/de/bluecolored/bluemap/forge/Log4jLogger.java +++ b/implementations/forge-1.18.1/src/main/java/de/bluecolored/bluemap/forge/Log4jLogger.java @@ -30,7 +30,7 @@ import de.bluecolored.bluemap.core.logger.AbstractLogger; public class Log4jLogger extends AbstractLogger { - private Logger out; + private final Logger out; public Log4jLogger(Logger out) { this.out = out; diff --git a/implementations/forge-1.19.4/src/main/java/de/bluecolored/bluemap/forge/ForgeCommandSource.java b/implementations/forge-1.19.4/src/main/java/de/bluecolored/bluemap/forge/ForgeCommandSource.java index 5bc17ce9..9487201e 100644 --- a/implementations/forge-1.19.4/src/main/java/de/bluecolored/bluemap/forge/ForgeCommandSource.java +++ b/implementations/forge-1.19.4/src/main/java/de/bluecolored/bluemap/forge/ForgeCommandSource.java @@ -28,11 +28,11 @@ import com.flowpowered.math.vector.Vector3d; import de.bluecolored.bluemap.common.plugin.Plugin; import de.bluecolored.bluemap.common.plugin.text.Text; import de.bluecolored.bluemap.common.serverinterface.CommandSource; +import de.bluecolored.bluemap.common.serverinterface.ServerWorld; import de.bluecolored.bluemap.core.world.World; import net.minecraft.commands.CommandSourceStack; import net.minecraft.network.chat.Component; -import java.io.IOException; import java.util.Optional; public class ForgeCommandSource implements CommandSource { @@ -67,13 +67,8 @@ public class ForgeCommandSource implements CommandSource { @Override public Optional getWorld() { - try { - var serverWorld = mod.getWorld(delegate.getLevel()); - String worldId = plugin.getBlueMap().getWorldId(serverWorld.getSaveFolder()); - return Optional.ofNullable(plugin.getWorlds().get(worldId)); - } catch (IOException ignore) {} - - return Optional.empty(); + ServerWorld serverWorld = mod.getServerWorld(delegate.getLevel()); + return Optional.ofNullable(plugin.getWorld(serverWorld)); } } diff --git a/implementations/forge-1.19.4/src/main/java/de/bluecolored/bluemap/forge/ForgeMod.java b/implementations/forge-1.19.4/src/main/java/de/bluecolored/bluemap/forge/ForgeMod.java index cd32021f..2a997211 100644 --- a/implementations/forge-1.19.4/src/main/java/de/bluecolored/bluemap/forge/ForgeMod.java +++ b/implementations/forge-1.19.4/src/main/java/de/bluecolored/bluemap/forge/ForgeMod.java @@ -29,8 +29,8 @@ import com.github.benmanes.caffeine.cache.LoadingCache; import de.bluecolored.bluemap.common.plugin.Plugin; import de.bluecolored.bluemap.common.plugin.commands.Commands; import de.bluecolored.bluemap.common.serverinterface.Player; -import de.bluecolored.bluemap.common.serverinterface.ServerEventListener; import de.bluecolored.bluemap.common.serverinterface.Server; +import de.bluecolored.bluemap.common.serverinterface.ServerEventListener; import de.bluecolored.bluemap.common.serverinterface.ServerWorld; import de.bluecolored.bluemap.core.BlueMap; import de.bluecolored.bluemap.core.MinecraftVersion; @@ -160,7 +160,7 @@ public class ForgeMod implements Server { } @Override - public Collection getLoadedWorlds() { + public Collection getLoadedServerWorlds() { Collection loadedWorlds = new ArrayList<>(3); for (ServerLevel serverWorld : serverInstance.getAllLevels()) { loadedWorlds.add(worlds.get(serverWorld)); @@ -170,9 +170,7 @@ public class ForgeMod implements Server { @SuppressWarnings("unchecked") @Override - public Optional getWorld(Object world) { - if (world instanceof Path) - return getWorld((Path) world); + public Optional getServerWorld(Object world) { if (world instanceof String) { ResourceLocation resourceLocation = ResourceLocation.tryParse((String) world); @@ -186,12 +184,12 @@ public class ForgeMod implements Server { } if (world instanceof ServerLevel) - return Optional.of(getWorld((ServerLevel) world)); + return Optional.of(getServerWorld((ServerLevel) world)); return Optional.empty(); } - public ServerWorld getWorld(ServerLevel world) { + public ServerWorld getServerWorld(ServerLevel world) { return worlds.get(world); } @@ -240,11 +238,6 @@ public class ForgeMod implements Server { return onlinePlayerMap.values(); } - @Override - public Optional getPlayer(UUID uuid) { - return Optional.ofNullable(onlinePlayerMap.get(uuid)); - } - /** * Only update some of the online players each tick to minimize performance impact on the server-thread. * Only call this method on the server-thread. diff --git a/implementations/forge-1.19.4/src/main/java/de/bluecolored/bluemap/forge/ForgePlayer.java b/implementations/forge-1.19.4/src/main/java/de/bluecolored/bluemap/forge/ForgePlayer.java index f24dba9e..64853c62 100644 --- a/implementations/forge-1.19.4/src/main/java/de/bluecolored/bluemap/forge/ForgePlayer.java +++ b/implementations/forge-1.19.4/src/main/java/de/bluecolored/bluemap/forge/ForgePlayer.java @@ -28,6 +28,7 @@ import com.flowpowered.math.vector.Vector3d; import de.bluecolored.bluemap.common.plugin.text.Text; import de.bluecolored.bluemap.common.serverinterface.Gamemode; import de.bluecolored.bluemap.common.serverinterface.Player; +import de.bluecolored.bluemap.common.serverinterface.ServerWorld; import net.minecraft.core.BlockPos; import net.minecraft.server.MinecraftServer; import net.minecraft.server.level.ServerPlayer; @@ -37,7 +38,6 @@ import net.minecraft.world.level.GameType; import net.minecraft.world.level.LightLayer; import net.minecraft.world.phys.Vec3; -import java.io.IOException; import java.util.EnumMap; import java.util.Map; import java.util.UUID; @@ -54,12 +54,11 @@ public class ForgePlayer implements Player { private final UUID uuid; private Text name; - private String world; + private ServerWorld world; private Vector3d position; private Vector3d rotation; private int skyLight; private int blockLight; - private boolean online; private boolean sneaking; private boolean invisible; private Gamemode gamemode; @@ -84,7 +83,7 @@ public class ForgePlayer implements Player { } @Override - public String getWorld() { + public ServerWorld getWorld() { return this.world; } @@ -108,11 +107,6 @@ public class ForgePlayer implements Player { return blockLight; } - @Override - public boolean isOnline() { - return this.online; - } - @Override public boolean isSneaking() { return this.sneaking; @@ -133,16 +127,10 @@ public class ForgePlayer implements Player { */ public void update() { MinecraftServer server = mod.getServer(); - if (server == null) { - this.online = false; - return; - } + if (server == null) return; ServerPlayer player = server.getPlayerList().getPlayer(uuid); - if (player == null) { - this.online = false; - return; - } + if (player == null) return; this.gamemode = GAMEMODE_MAP.getOrDefault(player.gameMode.getGameModeForPlayer(), Gamemode.SURVIVAL); if (this.gamemode == null) this.gamemode = Gamemode.SURVIVAL; @@ -151,7 +139,6 @@ public class ForgePlayer implements Player { this.invisible = invis != null && invis.getDuration() > 0; this.name = Text.of(player.getName().getString()); - this.online = true; Vec3 pos = player.getPosition(1f); this.position = new Vector3d(pos.x(), pos.y(), pos.z()); @@ -161,12 +148,7 @@ public class ForgePlayer implements Player { this.skyLight = player.getLevel().getChunkSource().getLightEngine().getLayerListener(LightLayer.SKY).getLightValue(new BlockPos(player.getBlockX(), player.getBlockY(), player.getBlockZ())); this.blockLight = player.getLevel().getChunkSource().getLightEngine().getLayerListener(LightLayer.BLOCK).getLightValue(new BlockPos(player.getBlockX(), player.getBlockY(), player.getBlockZ())); - try { - var world = mod.getWorld(player.getLevel()); - this.world = mod.getPlugin().getBlueMap().getWorldId(world.getSaveFolder()); - } catch (IOException | NullPointerException e) { // NullPointerException -> the plugin isn't fully loaded - this.world = "unknown"; - } + this.world = mod.getServerWorld(player.getLevel()); } } diff --git a/implementations/forge-1.19.4/src/main/java/de/bluecolored/bluemap/forge/ForgeWorld.java b/implementations/forge-1.19.4/src/main/java/de/bluecolored/bluemap/forge/ForgeWorld.java index ce92b260..da750184 100644 --- a/implementations/forge-1.19.4/src/main/java/de/bluecolored/bluemap/forge/ForgeWorld.java +++ b/implementations/forge-1.19.4/src/main/java/de/bluecolored/bluemap/forge/ForgeWorld.java @@ -24,12 +24,11 @@ */ package de.bluecolored.bluemap.forge; -import de.bluecolored.bluemap.common.serverinterface.Dimension; import de.bluecolored.bluemap.common.serverinterface.ServerWorld; +import de.bluecolored.bluemap.core.util.Key; +import net.minecraft.resources.ResourceLocation; import net.minecraft.server.MinecraftServer; import net.minecraft.server.level.ServerLevel; -import net.minecraft.world.level.Level; -import net.minecraft.world.level.dimension.DimensionType; import net.minecraft.world.level.storage.LevelResource; import java.io.IOException; @@ -42,27 +41,18 @@ import java.util.concurrent.ExecutionException; public class ForgeWorld implements ServerWorld { private final WeakReference delegate; - private final Path saveFolder; + private final Path worldFolder; + private final Key dimension; public ForgeWorld(ServerLevel delegate) { this.delegate = new WeakReference<>(delegate); MinecraftServer server = delegate.getServer(); - Path worldFolder = delegate.getServer().getServerDirectory().toPath().resolve(server.getWorldPath(LevelResource.ROOT)); - this.saveFolder = DimensionType.getStorageFolder(delegate.dimension(), worldFolder) - .toAbsolutePath().normalize(); - } + this.worldFolder = delegate.getServer().getServerDirectory().toPath() + .resolve(server.getWorldPath(LevelResource.ROOT)); - @Override - public Dimension getDimension() { - ServerLevel world = delegate.get(); - if (world != null) { - if (world.dimension().equals(Level.NETHER)) return Dimension.NETHER; - if (world.dimension().equals(Level.END)) return Dimension.END; - if (world.dimension().equals(Level.OVERWORLD)) return Dimension.OVERWORLD; - } - - return ServerWorld.super.getDimension(); + ResourceLocation id = delegate.dimension().location(); + this.dimension = new Key(id.getNamespace(), id.getPath()); } @Override @@ -93,8 +83,13 @@ public class ForgeWorld implements ServerWorld { } @Override - public Path getSaveFolder() { - return this.saveFolder; + public Path getWorldFolder() { + return worldFolder; + } + + @Override + public Key getDimension() { + return dimension; } } diff --git a/implementations/forge-1.19.4/src/main/java/de/bluecolored/bluemap/forge/Log4jLogger.java b/implementations/forge-1.19.4/src/main/java/de/bluecolored/bluemap/forge/Log4jLogger.java index fa6664ec..a77265e0 100644 --- a/implementations/forge-1.19.4/src/main/java/de/bluecolored/bluemap/forge/Log4jLogger.java +++ b/implementations/forge-1.19.4/src/main/java/de/bluecolored/bluemap/forge/Log4jLogger.java @@ -30,7 +30,7 @@ import de.bluecolored.bluemap.core.logger.AbstractLogger; public class Log4jLogger extends AbstractLogger { - private Logger out; + private final Logger out; public Log4jLogger(Logger out) { this.out = out; diff --git a/implementations/forge-1.20/src/main/java/de/bluecolored/bluemap/forge/ForgeCommandSource.java b/implementations/forge-1.20/src/main/java/de/bluecolored/bluemap/forge/ForgeCommandSource.java index 4a8f9233..64428e6f 100644 --- a/implementations/forge-1.20/src/main/java/de/bluecolored/bluemap/forge/ForgeCommandSource.java +++ b/implementations/forge-1.20/src/main/java/de/bluecolored/bluemap/forge/ForgeCommandSource.java @@ -28,11 +28,11 @@ import com.flowpowered.math.vector.Vector3d; import de.bluecolored.bluemap.common.plugin.Plugin; import de.bluecolored.bluemap.common.plugin.text.Text; import de.bluecolored.bluemap.common.serverinterface.CommandSource; +import de.bluecolored.bluemap.common.serverinterface.ServerWorld; import de.bluecolored.bluemap.core.world.World; import net.minecraft.commands.CommandSourceStack; import net.minecraft.network.chat.Component; -import java.io.IOException; import java.util.Optional; public class ForgeCommandSource implements CommandSource { @@ -67,13 +67,8 @@ public class ForgeCommandSource implements CommandSource { @Override public Optional getWorld() { - try { - var serverWorld = mod.getWorld(delegate.getLevel()); - String worldId = plugin.getBlueMap().getWorldId(serverWorld.getSaveFolder()); - return Optional.ofNullable(plugin.getWorlds().get(worldId)); - } catch (IOException ignore) {} - - return Optional.empty(); + ServerWorld serverWorld = mod.getServerWorld(delegate.getLevel()); + return Optional.ofNullable(plugin.getWorld(serverWorld)); } } diff --git a/implementations/forge-1.20/src/main/java/de/bluecolored/bluemap/forge/ForgeMod.java b/implementations/forge-1.20/src/main/java/de/bluecolored/bluemap/forge/ForgeMod.java index 6af6a1b4..50ccc1a1 100644 --- a/implementations/forge-1.20/src/main/java/de/bluecolored/bluemap/forge/ForgeMod.java +++ b/implementations/forge-1.20/src/main/java/de/bluecolored/bluemap/forge/ForgeMod.java @@ -160,7 +160,7 @@ public class ForgeMod implements Server { } @Override - public Collection getLoadedWorlds() { + public Collection getLoadedServerWorlds() { Collection loadedWorlds = new ArrayList<>(3); for (ServerLevel serverWorld : serverInstance.getAllLevels()) { loadedWorlds.add(worlds.get(serverWorld)); @@ -170,9 +170,7 @@ public class ForgeMod implements Server { @SuppressWarnings("unchecked") @Override - public Optional getWorld(Object world) { - if (world instanceof Path) - return getWorld((Path) world); + public Optional getServerWorld(Object world) { if (world instanceof String) { ResourceLocation resourceLocation = ResourceLocation.tryParse((String) world); @@ -186,12 +184,12 @@ public class ForgeMod implements Server { } if (world instanceof ServerLevel) - return Optional.of(getWorld((ServerLevel) world)); + return Optional.of(getServerWorld((ServerLevel) world)); return Optional.empty(); } - public ServerWorld getWorld(ServerLevel world) { + public ServerWorld getServerWorld(ServerLevel world) { return worlds.get(world); } @@ -240,11 +238,6 @@ public class ForgeMod implements Server { return onlinePlayerMap.values(); } - @Override - public Optional getPlayer(UUID uuid) { - return Optional.ofNullable(onlinePlayerMap.get(uuid)); - } - /** * Only update some of the online players each tick to minimize performance impact on the server-thread. * Only call this method on the server-thread. diff --git a/implementations/forge-1.20/src/main/java/de/bluecolored/bluemap/forge/ForgePlayer.java b/implementations/forge-1.20/src/main/java/de/bluecolored/bluemap/forge/ForgePlayer.java index 45bb8cf9..e90501b3 100644 --- a/implementations/forge-1.20/src/main/java/de/bluecolored/bluemap/forge/ForgePlayer.java +++ b/implementations/forge-1.20/src/main/java/de/bluecolored/bluemap/forge/ForgePlayer.java @@ -28,6 +28,7 @@ import com.flowpowered.math.vector.Vector3d; import de.bluecolored.bluemap.common.plugin.text.Text; import de.bluecolored.bluemap.common.serverinterface.Gamemode; import de.bluecolored.bluemap.common.serverinterface.Player; +import de.bluecolored.bluemap.common.serverinterface.ServerWorld; import net.minecraft.core.BlockPos; import net.minecraft.server.MinecraftServer; import net.minecraft.server.level.ServerPlayer; @@ -37,7 +38,6 @@ import net.minecraft.world.level.GameType; import net.minecraft.world.level.LightLayer; import net.minecraft.world.phys.Vec3; -import java.io.IOException; import java.util.EnumMap; import java.util.Map; import java.util.UUID; @@ -54,12 +54,11 @@ public class ForgePlayer implements Player { private final UUID uuid; private Text name; - private String world; + private ServerWorld world; private Vector3d position; private Vector3d rotation; private int skyLight; private int blockLight; - private boolean online; private boolean sneaking; private boolean invisible; private Gamemode gamemode; @@ -84,7 +83,7 @@ public class ForgePlayer implements Player { } @Override - public String getWorld() { + public ServerWorld getWorld() { return this.world; } @@ -108,11 +107,6 @@ public class ForgePlayer implements Player { return blockLight; } - @Override - public boolean isOnline() { - return this.online; - } - @Override public boolean isSneaking() { return this.sneaking; @@ -133,16 +127,10 @@ public class ForgePlayer implements Player { */ public void update() { MinecraftServer server = mod.getServer(); - if (server == null) { - this.online = false; - return; - } + if (server == null) return; ServerPlayer player = server.getPlayerList().getPlayer(uuid); - if (player == null) { - this.online = false; - return; - } + if (player == null) return; this.gamemode = GAMEMODE_MAP.getOrDefault(player.gameMode.getGameModeForPlayer(), Gamemode.SURVIVAL); if (this.gamemode == null) this.gamemode = Gamemode.SURVIVAL; @@ -151,7 +139,6 @@ public class ForgePlayer implements Player { this.invisible = invis != null && invis.getDuration() > 0; this.name = Text.of(player.getName().getString()); - this.online = true; Vec3 pos = player.getPosition(1f); this.position = new Vector3d(pos.x(), pos.y(), pos.z()); @@ -161,12 +148,7 @@ public class ForgePlayer implements Player { this.skyLight = player.level().getChunkSource().getLightEngine().getLayerListener(LightLayer.SKY).getLightValue(new BlockPos(player.getBlockX(), player.getBlockY(), player.getBlockZ())); this.blockLight = player.level().getChunkSource().getLightEngine().getLayerListener(LightLayer.BLOCK).getLightValue(new BlockPos(player.getBlockX(), player.getBlockY(), player.getBlockZ())); - try { - var world = mod.getWorld(player.level()).orElse(null); - this.world = world != null ? mod.getPlugin().getBlueMap().getWorldId(world.getSaveFolder()) : "unknown"; - } catch (IOException | NullPointerException e) { // NullPointerException -> the plugin isn't fully loaded - this.world = "unknown"; - } + this.world = mod.getServerWorld(player.serverLevel()); } } diff --git a/implementations/forge-1.20/src/main/java/de/bluecolored/bluemap/forge/ForgeWorld.java b/implementations/forge-1.20/src/main/java/de/bluecolored/bluemap/forge/ForgeWorld.java index ce92b260..da750184 100644 --- a/implementations/forge-1.20/src/main/java/de/bluecolored/bluemap/forge/ForgeWorld.java +++ b/implementations/forge-1.20/src/main/java/de/bluecolored/bluemap/forge/ForgeWorld.java @@ -24,12 +24,11 @@ */ package de.bluecolored.bluemap.forge; -import de.bluecolored.bluemap.common.serverinterface.Dimension; import de.bluecolored.bluemap.common.serverinterface.ServerWorld; +import de.bluecolored.bluemap.core.util.Key; +import net.minecraft.resources.ResourceLocation; import net.minecraft.server.MinecraftServer; import net.minecraft.server.level.ServerLevel; -import net.minecraft.world.level.Level; -import net.minecraft.world.level.dimension.DimensionType; import net.minecraft.world.level.storage.LevelResource; import java.io.IOException; @@ -42,27 +41,18 @@ import java.util.concurrent.ExecutionException; public class ForgeWorld implements ServerWorld { private final WeakReference delegate; - private final Path saveFolder; + private final Path worldFolder; + private final Key dimension; public ForgeWorld(ServerLevel delegate) { this.delegate = new WeakReference<>(delegate); MinecraftServer server = delegate.getServer(); - Path worldFolder = delegate.getServer().getServerDirectory().toPath().resolve(server.getWorldPath(LevelResource.ROOT)); - this.saveFolder = DimensionType.getStorageFolder(delegate.dimension(), worldFolder) - .toAbsolutePath().normalize(); - } + this.worldFolder = delegate.getServer().getServerDirectory().toPath() + .resolve(server.getWorldPath(LevelResource.ROOT)); - @Override - public Dimension getDimension() { - ServerLevel world = delegate.get(); - if (world != null) { - if (world.dimension().equals(Level.NETHER)) return Dimension.NETHER; - if (world.dimension().equals(Level.END)) return Dimension.END; - if (world.dimension().equals(Level.OVERWORLD)) return Dimension.OVERWORLD; - } - - return ServerWorld.super.getDimension(); + ResourceLocation id = delegate.dimension().location(); + this.dimension = new Key(id.getNamespace(), id.getPath()); } @Override @@ -93,8 +83,13 @@ public class ForgeWorld implements ServerWorld { } @Override - public Path getSaveFolder() { - return this.saveFolder; + public Path getWorldFolder() { + return worldFolder; + } + + @Override + public Key getDimension() { + return dimension; } } diff --git a/implementations/neoforge-1.20.2/src/main/java/de/bluecolored/bluemap/forge/ForgeCommandSource.java b/implementations/neoforge-1.20.2/src/main/java/de/bluecolored/bluemap/forge/ForgeCommandSource.java index 4a8f9233..64428e6f 100644 --- a/implementations/neoforge-1.20.2/src/main/java/de/bluecolored/bluemap/forge/ForgeCommandSource.java +++ b/implementations/neoforge-1.20.2/src/main/java/de/bluecolored/bluemap/forge/ForgeCommandSource.java @@ -28,11 +28,11 @@ import com.flowpowered.math.vector.Vector3d; import de.bluecolored.bluemap.common.plugin.Plugin; import de.bluecolored.bluemap.common.plugin.text.Text; import de.bluecolored.bluemap.common.serverinterface.CommandSource; +import de.bluecolored.bluemap.common.serverinterface.ServerWorld; import de.bluecolored.bluemap.core.world.World; import net.minecraft.commands.CommandSourceStack; import net.minecraft.network.chat.Component; -import java.io.IOException; import java.util.Optional; public class ForgeCommandSource implements CommandSource { @@ -67,13 +67,8 @@ public class ForgeCommandSource implements CommandSource { @Override public Optional getWorld() { - try { - var serverWorld = mod.getWorld(delegate.getLevel()); - String worldId = plugin.getBlueMap().getWorldId(serverWorld.getSaveFolder()); - return Optional.ofNullable(plugin.getWorlds().get(worldId)); - } catch (IOException ignore) {} - - return Optional.empty(); + ServerWorld serverWorld = mod.getServerWorld(delegate.getLevel()); + return Optional.ofNullable(plugin.getWorld(serverWorld)); } } diff --git a/implementations/neoforge-1.20.2/src/main/java/de/bluecolored/bluemap/forge/ForgeMod.java b/implementations/neoforge-1.20.2/src/main/java/de/bluecolored/bluemap/forge/ForgeMod.java index 917e4348..94d4f607 100644 --- a/implementations/neoforge-1.20.2/src/main/java/de/bluecolored/bluemap/forge/ForgeMod.java +++ b/implementations/neoforge-1.20.2/src/main/java/de/bluecolored/bluemap/forge/ForgeMod.java @@ -29,8 +29,8 @@ import com.github.benmanes.caffeine.cache.LoadingCache; import de.bluecolored.bluemap.common.plugin.Plugin; import de.bluecolored.bluemap.common.plugin.commands.Commands; import de.bluecolored.bluemap.common.serverinterface.Player; +import de.bluecolored.bluemap.common.serverinterface.Server; import de.bluecolored.bluemap.common.serverinterface.ServerEventListener; -import de.bluecolored.bluemap.common.serverinterface.ServerInterface; import de.bluecolored.bluemap.common.serverinterface.ServerWorld; import de.bluecolored.bluemap.core.BlueMap; import de.bluecolored.bluemap.core.MinecraftVersion; @@ -63,7 +63,7 @@ import java.util.*; import java.util.concurrent.ConcurrentHashMap; @Mod(Plugin.PLUGIN_ID) -public class ForgeMod implements ServerInterface { +public class ForgeMod implements Server { private final Plugin pluginInstance; private MinecraftServer serverInstance = null; @@ -159,7 +159,7 @@ public class ForgeMod implements ServerInterface { } @Override - public Collection getLoadedWorlds() { + public Collection getLoadedServerWorlds() { Collection loadedWorlds = new ArrayList<>(3); for (ServerLevel serverWorld : serverInstance.getAllLevels()) { loadedWorlds.add(worlds.get(serverWorld)); @@ -169,9 +169,7 @@ public class ForgeMod implements ServerInterface { @SuppressWarnings("unchecked") @Override - public Optional getWorld(Object world) { - if (world instanceof Path) - return getWorld((Path) world); + public Optional getServerWorld(Object world) { if (world instanceof String) { ResourceLocation resourceLocation = ResourceLocation.tryParse((String) world); @@ -185,12 +183,12 @@ public class ForgeMod implements ServerInterface { } if (world instanceof ServerLevel) - return Optional.of(getWorld((ServerLevel) world)); + return Optional.of(getServerWorld((ServerLevel) world)); return Optional.empty(); } - public ServerWorld getWorld(ServerLevel world) { + public ServerWorld getServerWorld(ServerLevel world) { return worlds.get(world); } @@ -239,11 +237,6 @@ public class ForgeMod implements ServerInterface { return onlinePlayerMap.values(); } - @Override - public Optional getPlayer(UUID uuid) { - return Optional.ofNullable(onlinePlayerMap.get(uuid)); - } - /** * Only update some of the online players each tick to minimize performance impact on the server-thread. * Only call this method on the server-thread. diff --git a/implementations/neoforge-1.20.2/src/main/java/de/bluecolored/bluemap/forge/ForgePlayer.java b/implementations/neoforge-1.20.2/src/main/java/de/bluecolored/bluemap/forge/ForgePlayer.java index 45bb8cf9..e90501b3 100644 --- a/implementations/neoforge-1.20.2/src/main/java/de/bluecolored/bluemap/forge/ForgePlayer.java +++ b/implementations/neoforge-1.20.2/src/main/java/de/bluecolored/bluemap/forge/ForgePlayer.java @@ -28,6 +28,7 @@ import com.flowpowered.math.vector.Vector3d; import de.bluecolored.bluemap.common.plugin.text.Text; import de.bluecolored.bluemap.common.serverinterface.Gamemode; import de.bluecolored.bluemap.common.serverinterface.Player; +import de.bluecolored.bluemap.common.serverinterface.ServerWorld; import net.minecraft.core.BlockPos; import net.minecraft.server.MinecraftServer; import net.minecraft.server.level.ServerPlayer; @@ -37,7 +38,6 @@ import net.minecraft.world.level.GameType; import net.minecraft.world.level.LightLayer; import net.minecraft.world.phys.Vec3; -import java.io.IOException; import java.util.EnumMap; import java.util.Map; import java.util.UUID; @@ -54,12 +54,11 @@ public class ForgePlayer implements Player { private final UUID uuid; private Text name; - private String world; + private ServerWorld world; private Vector3d position; private Vector3d rotation; private int skyLight; private int blockLight; - private boolean online; private boolean sneaking; private boolean invisible; private Gamemode gamemode; @@ -84,7 +83,7 @@ public class ForgePlayer implements Player { } @Override - public String getWorld() { + public ServerWorld getWorld() { return this.world; } @@ -108,11 +107,6 @@ public class ForgePlayer implements Player { return blockLight; } - @Override - public boolean isOnline() { - return this.online; - } - @Override public boolean isSneaking() { return this.sneaking; @@ -133,16 +127,10 @@ public class ForgePlayer implements Player { */ public void update() { MinecraftServer server = mod.getServer(); - if (server == null) { - this.online = false; - return; - } + if (server == null) return; ServerPlayer player = server.getPlayerList().getPlayer(uuid); - if (player == null) { - this.online = false; - return; - } + if (player == null) return; this.gamemode = GAMEMODE_MAP.getOrDefault(player.gameMode.getGameModeForPlayer(), Gamemode.SURVIVAL); if (this.gamemode == null) this.gamemode = Gamemode.SURVIVAL; @@ -151,7 +139,6 @@ public class ForgePlayer implements Player { this.invisible = invis != null && invis.getDuration() > 0; this.name = Text.of(player.getName().getString()); - this.online = true; Vec3 pos = player.getPosition(1f); this.position = new Vector3d(pos.x(), pos.y(), pos.z()); @@ -161,12 +148,7 @@ public class ForgePlayer implements Player { this.skyLight = player.level().getChunkSource().getLightEngine().getLayerListener(LightLayer.SKY).getLightValue(new BlockPos(player.getBlockX(), player.getBlockY(), player.getBlockZ())); this.blockLight = player.level().getChunkSource().getLightEngine().getLayerListener(LightLayer.BLOCK).getLightValue(new BlockPos(player.getBlockX(), player.getBlockY(), player.getBlockZ())); - try { - var world = mod.getWorld(player.level()).orElse(null); - this.world = world != null ? mod.getPlugin().getBlueMap().getWorldId(world.getSaveFolder()) : "unknown"; - } catch (IOException | NullPointerException e) { // NullPointerException -> the plugin isn't fully loaded - this.world = "unknown"; - } + this.world = mod.getServerWorld(player.serverLevel()); } } diff --git a/implementations/neoforge-1.20.2/src/main/java/de/bluecolored/bluemap/forge/ForgeWorld.java b/implementations/neoforge-1.20.2/src/main/java/de/bluecolored/bluemap/forge/ForgeWorld.java index ce92b260..da750184 100644 --- a/implementations/neoforge-1.20.2/src/main/java/de/bluecolored/bluemap/forge/ForgeWorld.java +++ b/implementations/neoforge-1.20.2/src/main/java/de/bluecolored/bluemap/forge/ForgeWorld.java @@ -24,12 +24,11 @@ */ package de.bluecolored.bluemap.forge; -import de.bluecolored.bluemap.common.serverinterface.Dimension; import de.bluecolored.bluemap.common.serverinterface.ServerWorld; +import de.bluecolored.bluemap.core.util.Key; +import net.minecraft.resources.ResourceLocation; import net.minecraft.server.MinecraftServer; import net.minecraft.server.level.ServerLevel; -import net.minecraft.world.level.Level; -import net.minecraft.world.level.dimension.DimensionType; import net.minecraft.world.level.storage.LevelResource; import java.io.IOException; @@ -42,27 +41,18 @@ import java.util.concurrent.ExecutionException; public class ForgeWorld implements ServerWorld { private final WeakReference delegate; - private final Path saveFolder; + private final Path worldFolder; + private final Key dimension; public ForgeWorld(ServerLevel delegate) { this.delegate = new WeakReference<>(delegate); MinecraftServer server = delegate.getServer(); - Path worldFolder = delegate.getServer().getServerDirectory().toPath().resolve(server.getWorldPath(LevelResource.ROOT)); - this.saveFolder = DimensionType.getStorageFolder(delegate.dimension(), worldFolder) - .toAbsolutePath().normalize(); - } + this.worldFolder = delegate.getServer().getServerDirectory().toPath() + .resolve(server.getWorldPath(LevelResource.ROOT)); - @Override - public Dimension getDimension() { - ServerLevel world = delegate.get(); - if (world != null) { - if (world.dimension().equals(Level.NETHER)) return Dimension.NETHER; - if (world.dimension().equals(Level.END)) return Dimension.END; - if (world.dimension().equals(Level.OVERWORLD)) return Dimension.OVERWORLD; - } - - return ServerWorld.super.getDimension(); + ResourceLocation id = delegate.dimension().location(); + this.dimension = new Key(id.getNamespace(), id.getPath()); } @Override @@ -93,8 +83,13 @@ public class ForgeWorld implements ServerWorld { } @Override - public Path getSaveFolder() { - return this.saveFolder; + public Path getWorldFolder() { + return worldFolder; + } + + @Override + public Key getDimension() { + return dimension; } } diff --git a/implementations/paper/src/main/java/de/bluecolored/bluemap/bukkit/BukkitCommandSource.java b/implementations/paper/src/main/java/de/bluecolored/bluemap/bukkit/BukkitCommandSource.java index 6e6d6728..8a36a4dc 100644 --- a/implementations/paper/src/main/java/de/bluecolored/bluemap/bukkit/BukkitCommandSource.java +++ b/implementations/paper/src/main/java/de/bluecolored/bluemap/bukkit/BukkitCommandSource.java @@ -28,6 +28,7 @@ import com.flowpowered.math.vector.Vector3d; import de.bluecolored.bluemap.common.plugin.Plugin; import de.bluecolored.bluemap.common.plugin.text.Text; import de.bluecolored.bluemap.common.serverinterface.CommandSource; +import de.bluecolored.bluemap.common.serverinterface.ServerWorld; import de.bluecolored.bluemap.core.world.World; import net.kyori.adventure.text.serializer.gson.GsonComponentSerializer; import org.bukkit.Location; @@ -35,7 +36,6 @@ import org.bukkit.command.BlockCommandSender; import org.bukkit.command.CommandSender; import org.bukkit.entity.Entity; -import java.io.IOException; import java.util.Optional; public class BukkitCommandSource implements CommandSource { @@ -74,11 +74,8 @@ public class BukkitCommandSource implements CommandSource { Location location = getLocation(); if (location != null) { - try { - var serverWorld = BukkitPlugin.getInstance().getWorld(location.getWorld()); - String worldId = plugin.getBlueMap().getWorldId(serverWorld.getSaveFolder()); - return Optional.ofNullable(plugin.getWorlds().get(worldId)); - } catch (IOException ignore) {} + ServerWorld serverWorld = BukkitPlugin.getInstance().getServerWorld(location.getWorld()); + return Optional.ofNullable(plugin.getWorld(serverWorld)); } return Optional.empty(); diff --git a/implementations/paper/src/main/java/de/bluecolored/bluemap/bukkit/BukkitCommands.java b/implementations/paper/src/main/java/de/bluecolored/bluemap/bukkit/BukkitCommands.java index 4306b792..d3ef7560 100644 --- a/implementations/paper/src/main/java/de/bluecolored/bluemap/bukkit/BukkitCommands.java +++ b/implementations/paper/src/main/java/de/bluecolored/bluemap/bukkit/BukkitCommands.java @@ -82,7 +82,7 @@ public class BukkitCommands implements Listener { public void onTabComplete(TabCompleteEvent evt) { try { String input = evt.getBuffer(); - if (input.length() > 0 && input.charAt(0) == '/') { + if (!input.isEmpty() && input.charAt(0) == '/') { input = input.substring(1); } diff --git a/implementations/paper/src/main/java/de/bluecolored/bluemap/bukkit/BukkitPlayer.java b/implementations/paper/src/main/java/de/bluecolored/bluemap/bukkit/BukkitPlayer.java index dbe7806e..26de00f7 100644 --- a/implementations/paper/src/main/java/de/bluecolored/bluemap/bukkit/BukkitPlayer.java +++ b/implementations/paper/src/main/java/de/bluecolored/bluemap/bukkit/BukkitPlayer.java @@ -25,16 +25,16 @@ package de.bluecolored.bluemap.bukkit; import com.flowpowered.math.vector.Vector3d; +import de.bluecolored.bluemap.common.plugin.text.Text; import de.bluecolored.bluemap.common.serverinterface.Gamemode; import de.bluecolored.bluemap.common.serverinterface.Player; -import de.bluecolored.bluemap.common.plugin.text.Text; +import de.bluecolored.bluemap.common.serverinterface.ServerWorld; import org.bukkit.Bukkit; import org.bukkit.GameMode; import org.bukkit.Location; import org.bukkit.metadata.MetadataValue; import org.bukkit.potion.PotionEffectType; -import java.io.IOException; import java.util.EnumMap; import java.util.Map; import java.util.UUID; @@ -51,12 +51,11 @@ public class BukkitPlayer implements Player { private final UUID uuid; private Text name; - private String world; + private ServerWorld world; private Vector3d position; private Vector3d rotation; private int skyLight; private int blockLight; - private boolean online; private boolean sneaking; private boolean invisible; private boolean vanished; @@ -78,7 +77,7 @@ public class BukkitPlayer implements Player { } @Override - public String getWorld() { + public ServerWorld getWorld() { return this.world; } @@ -102,11 +101,6 @@ public class BukkitPlayer implements Player { return blockLight; } - @Override - public boolean isOnline() { - return this.online; - } - @Override public boolean isSneaking() { return this.sneaking; @@ -132,10 +126,7 @@ public class BukkitPlayer implements Player { */ public void update() { org.bukkit.entity.Player player = Bukkit.getPlayer(uuid); - if (player == null) { - this.online = false; - return; - } + if (player == null) return; this.gamemode = GAMEMODE_MAP.get(player.getGameMode()); if (this.gamemode == null) this.gamemode = Gamemode.SURVIVAL; @@ -150,7 +141,6 @@ public class BukkitPlayer implements Player { this.vanished = vanished; this.name = Text.of(player.getName()); - this.online = player.isOnline(); Location location = player.getLocation(); this.position = new Vector3d(location.getX(), location.getY(), location.getZ()); @@ -160,12 +150,7 @@ public class BukkitPlayer implements Player { this.skyLight = player.getLocation().getBlock().getLightFromSky(); this.blockLight = player.getLocation().getBlock().getLightFromBlocks(); - try { - var world = BukkitPlugin.getInstance().getWorld(player.getWorld()); - this.world = BukkitPlugin.getInstance().getPlugin().getBlueMap().getWorldId(world.getSaveFolder()); - } catch (IOException | NullPointerException e) { // NullPointerException -> the plugin isn't fully loaded - this.world = "unknown"; - } + this.world = BukkitPlugin.getInstance().getServerWorld(player.getWorld()); } } diff --git a/implementations/paper/src/main/java/de/bluecolored/bluemap/bukkit/BukkitPlugin.java b/implementations/paper/src/main/java/de/bluecolored/bluemap/bukkit/BukkitPlugin.java index e8521a40..132ffa9f 100644 --- a/implementations/paper/src/main/java/de/bluecolored/bluemap/bukkit/BukkitPlugin.java +++ b/implementations/paper/src/main/java/de/bluecolored/bluemap/bukkit/BukkitPlugin.java @@ -180,7 +180,7 @@ public class BukkitPlugin extends JavaPlugin implements Server, Listener { } @Override - public Collection getLoadedWorlds() { + public Collection getLoadedServerWorlds() { Collection loadedWorlds = new ArrayList<>(3); for (World world : Bukkit.getWorlds()) { loadedWorlds.add(worlds.get(world)); @@ -189,9 +189,7 @@ public class BukkitPlugin extends JavaPlugin implements Server, Listener { } @Override - public Optional getWorld(Object world) { - if (world instanceof Path) - return getWorld((Path) world); + public Optional getServerWorld(Object world) { if (world instanceof String) { var serverWorld = Bukkit.getWorld((String) world); @@ -209,12 +207,12 @@ public class BukkitPlugin extends JavaPlugin implements Server, Listener { } if (world instanceof World) - return Optional.of(getWorld((World) world)); + return Optional.of(getServerWorld((World) world)); return Optional.empty(); } - public ServerWorld getWorld(World world) { + public ServerWorld getServerWorld(World world) { return worlds.get(world); } @@ -255,11 +253,6 @@ public class BukkitPlugin extends JavaPlugin implements Server, Listener { return onlinePlayerMap.values(); } - @Override - public Optional getPlayer(UUID uuid) { - return Optional.ofNullable(onlinePlayerMap.get(uuid)); - } - private void initPlayer(org.bukkit.entity.Player bukkitPlayer) { BukkitPlayer player = new BukkitPlayer(bukkitPlayer.getUniqueId()); onlinePlayerMap.put(bukkitPlayer.getUniqueId(), player); diff --git a/implementations/paper/src/main/java/de/bluecolored/bluemap/bukkit/BukkitWorld.java b/implementations/paper/src/main/java/de/bluecolored/bluemap/bukkit/BukkitWorld.java index 1d218ccd..e155d9eb 100644 --- a/implementations/paper/src/main/java/de/bluecolored/bluemap/bukkit/BukkitWorld.java +++ b/implementations/paper/src/main/java/de/bluecolored/bluemap/bukkit/BukkitWorld.java @@ -24,80 +24,59 @@ */ package de.bluecolored.bluemap.bukkit; -import de.bluecolored.bluemap.common.serverinterface.Dimension; import de.bluecolored.bluemap.common.serverinterface.ServerWorld; +import de.bluecolored.bluemap.core.util.Key; +import de.bluecolored.bluemap.core.world.mca.MCAWorld; import org.bukkit.World; -import java.lang.ref.WeakReference; import java.nio.file.Files; import java.nio.file.Path; -import java.util.Optional; public class BukkitWorld implements ServerWorld { - private final WeakReference delegate; - private final Path saveFolder; + //private final WeakReference delegate; + private final Path worldFolder; + private final Key dimension; public BukkitWorld(World delegate) { - this.delegate = new WeakReference<>(delegate); - Dimension dimension = getDimension(); - Path saveFolder = delegate.getWorldFolder().toPath() - .resolve(dimension.getDimensionSubPath()) - .toAbsolutePath().normalize(); + //this.delegate = new WeakReference<>(delegate); + Path worldFolder = delegate.getWorldFolder().toPath(); + + var id = delegate.key(); + this.dimension = new Key(id.namespace(), id.value()); // fix for hybrids - if (!Files.exists(saveFolder)) { - Path direct = delegate.getWorldFolder().toPath(); - if (Files.exists(direct) && direct.endsWith(dimension.getDimensionSubPath())) - saveFolder = direct; + Path dimensionFolder = MCAWorld.resolveDimensionFolder(worldFolder, dimension); + if (!Files.exists(dimensionFolder)) { + Path dimensionSubPath = worldFolder.relativize(dimensionFolder); + + if (Files.exists(worldFolder) && worldFolder.endsWith(dimensionSubPath)) + worldFolder = worldFolder.subpath(0, worldFolder.getNameCount() - dimensionSubPath.getNameCount()); } - this.saveFolder = saveFolder; - } - - @Override - public Dimension getDimension() { - World world = delegate.get(); - if (world != null) { - if (world.getEnvironment().equals(World.Environment.NETHER)) return Dimension.NETHER; - if (world.getEnvironment().equals(World.Environment.THE_END)) return Dimension.END; - } - return Dimension.OVERWORLD; - } - - @Override - public Optional getId() { - World world = delegate.get(); - if (world != null) { - return Optional.of(world.getUID().toString()); - } - return Optional.empty(); - } - - @Override - public Optional getName() { - World world = delegate.get(); - if (world != null) { - return Optional.of(world.getName()); - } - return Optional.empty(); + this.worldFolder = worldFolder; } + /* Not supported by folia @Override public boolean persistWorldChanges() { - /* Not supported by folia World world = delegate.get(); if (world != null) { world.save(); return true; } - */ return false; } + */ + + @Override + public Path getWorldFolder() { + return worldFolder; + } @Override - public Path getSaveFolder() { - return this.saveFolder; + public Key getDimension() { + return dimension; } } diff --git a/implementations/spigot/src/main/java/de/bluecolored/bluemap/bukkit/BukkitCommandSource.java b/implementations/spigot/src/main/java/de/bluecolored/bluemap/bukkit/BukkitCommandSource.java index e37f29a2..8559035f 100644 --- a/implementations/spigot/src/main/java/de/bluecolored/bluemap/bukkit/BukkitCommandSource.java +++ b/implementations/spigot/src/main/java/de/bluecolored/bluemap/bukkit/BukkitCommandSource.java @@ -28,6 +28,7 @@ import com.flowpowered.math.vector.Vector3d; import de.bluecolored.bluemap.common.plugin.Plugin; import de.bluecolored.bluemap.common.plugin.text.Text; import de.bluecolored.bluemap.common.serverinterface.CommandSource; +import de.bluecolored.bluemap.common.serverinterface.ServerWorld; import de.bluecolored.bluemap.core.world.World; import org.bukkit.Bukkit; import org.bukkit.Location; @@ -36,7 +37,6 @@ import org.bukkit.command.CommandSender; import org.bukkit.entity.Entity; import org.bukkit.entity.Player; -import java.io.IOException; import java.util.Optional; public class BukkitCommandSource implements CommandSource { @@ -85,11 +85,8 @@ public class BukkitCommandSource implements CommandSource { Location location = getLocation(); if (location != null) { - try { - var serverWorld = BukkitPlugin.getInstance().getWorld(location.getWorld()); - String worldId = plugin.getBlueMap().getWorldId(serverWorld.getSaveFolder()); - return Optional.ofNullable(plugin.getWorlds().get(worldId)); - } catch (IOException ignore) {} + ServerWorld serverWorld = BukkitPlugin.getInstance().getServerWorld(location.getWorld()); + return Optional.ofNullable(plugin.getWorld(serverWorld)); } return Optional.empty(); diff --git a/implementations/spigot/src/main/java/de/bluecolored/bluemap/bukkit/BukkitCommands.java b/implementations/spigot/src/main/java/de/bluecolored/bluemap/bukkit/BukkitCommands.java index 8f927eee..2ff4450a 100644 --- a/implementations/spigot/src/main/java/de/bluecolored/bluemap/bukkit/BukkitCommands.java +++ b/implementations/spigot/src/main/java/de/bluecolored/bluemap/bukkit/BukkitCommands.java @@ -80,7 +80,7 @@ public class BukkitCommands implements Listener { public void onTabComplete(TabCompleteEvent evt) { try { String input = evt.getBuffer(); - if (input.length() > 0 && input.charAt(0) == '/') { + if (!input.isEmpty() && input.charAt(0) == '/') { input = input.substring(1); } diff --git a/implementations/spigot/src/main/java/de/bluecolored/bluemap/bukkit/BukkitPlayer.java b/implementations/spigot/src/main/java/de/bluecolored/bluemap/bukkit/BukkitPlayer.java index dbe7806e..26de00f7 100644 --- a/implementations/spigot/src/main/java/de/bluecolored/bluemap/bukkit/BukkitPlayer.java +++ b/implementations/spigot/src/main/java/de/bluecolored/bluemap/bukkit/BukkitPlayer.java @@ -25,16 +25,16 @@ package de.bluecolored.bluemap.bukkit; import com.flowpowered.math.vector.Vector3d; +import de.bluecolored.bluemap.common.plugin.text.Text; import de.bluecolored.bluemap.common.serverinterface.Gamemode; import de.bluecolored.bluemap.common.serverinterface.Player; -import de.bluecolored.bluemap.common.plugin.text.Text; +import de.bluecolored.bluemap.common.serverinterface.ServerWorld; import org.bukkit.Bukkit; import org.bukkit.GameMode; import org.bukkit.Location; import org.bukkit.metadata.MetadataValue; import org.bukkit.potion.PotionEffectType; -import java.io.IOException; import java.util.EnumMap; import java.util.Map; import java.util.UUID; @@ -51,12 +51,11 @@ public class BukkitPlayer implements Player { private final UUID uuid; private Text name; - private String world; + private ServerWorld world; private Vector3d position; private Vector3d rotation; private int skyLight; private int blockLight; - private boolean online; private boolean sneaking; private boolean invisible; private boolean vanished; @@ -78,7 +77,7 @@ public class BukkitPlayer implements Player { } @Override - public String getWorld() { + public ServerWorld getWorld() { return this.world; } @@ -102,11 +101,6 @@ public class BukkitPlayer implements Player { return blockLight; } - @Override - public boolean isOnline() { - return this.online; - } - @Override public boolean isSneaking() { return this.sneaking; @@ -132,10 +126,7 @@ public class BukkitPlayer implements Player { */ public void update() { org.bukkit.entity.Player player = Bukkit.getPlayer(uuid); - if (player == null) { - this.online = false; - return; - } + if (player == null) return; this.gamemode = GAMEMODE_MAP.get(player.getGameMode()); if (this.gamemode == null) this.gamemode = Gamemode.SURVIVAL; @@ -150,7 +141,6 @@ public class BukkitPlayer implements Player { this.vanished = vanished; this.name = Text.of(player.getName()); - this.online = player.isOnline(); Location location = player.getLocation(); this.position = new Vector3d(location.getX(), location.getY(), location.getZ()); @@ -160,12 +150,7 @@ public class BukkitPlayer implements Player { this.skyLight = player.getLocation().getBlock().getLightFromSky(); this.blockLight = player.getLocation().getBlock().getLightFromBlocks(); - try { - var world = BukkitPlugin.getInstance().getWorld(player.getWorld()); - this.world = BukkitPlugin.getInstance().getPlugin().getBlueMap().getWorldId(world.getSaveFolder()); - } catch (IOException | NullPointerException e) { // NullPointerException -> the plugin isn't fully loaded - this.world = "unknown"; - } + this.world = BukkitPlugin.getInstance().getServerWorld(player.getWorld()); } } diff --git a/implementations/spigot/src/main/java/de/bluecolored/bluemap/bukkit/BukkitPlugin.java b/implementations/spigot/src/main/java/de/bluecolored/bluemap/bukkit/BukkitPlugin.java index 6a492a8e..829c2d86 100644 --- a/implementations/spigot/src/main/java/de/bluecolored/bluemap/bukkit/BukkitPlugin.java +++ b/implementations/spigot/src/main/java/de/bluecolored/bluemap/bukkit/BukkitPlugin.java @@ -184,7 +184,7 @@ public class BukkitPlugin extends JavaPlugin implements Server, Listener { } @Override - public Collection getLoadedWorlds() { + public Collection getLoadedServerWorlds() { Collection loadedWorlds = new ArrayList<>(3); for (World world : Bukkit.getWorlds()) { loadedWorlds.add(worlds.get(world)); @@ -193,9 +193,7 @@ public class BukkitPlugin extends JavaPlugin implements Server, Listener { } @Override - public Optional getWorld(Object world) { - if (world instanceof Path) - return getWorld((Path) world); + public Optional getServerWorld(Object world) { if (world instanceof String) { var serverWorld = Bukkit.getWorld((String) world); @@ -213,12 +211,12 @@ public class BukkitPlugin extends JavaPlugin implements Server, Listener { } if (world instanceof World) - return Optional.of(getWorld((World) world)); + return Optional.of(getServerWorld((World) world)); return Optional.empty(); } - public ServerWorld getWorld(World world) { + public ServerWorld getServerWorld(World world) { return worlds.get(world); } @@ -261,11 +259,6 @@ public class BukkitPlugin extends JavaPlugin implements Server, Listener { return onlinePlayerMap.values(); } - @Override - public Optional getPlayer(UUID uuid) { - return Optional.ofNullable(onlinePlayerMap.get(uuid)); - } - /** * Only update some of the online players each tick to minimize performance impact on the server-thread. * Only call this method on the server-thread. diff --git a/implementations/spigot/src/main/java/de/bluecolored/bluemap/bukkit/BukkitWorld.java b/implementations/spigot/src/main/java/de/bluecolored/bluemap/bukkit/BukkitWorld.java index 1a4fadf5..1a2e52cb 100644 --- a/implementations/spigot/src/main/java/de/bluecolored/bluemap/bukkit/BukkitWorld.java +++ b/implementations/spigot/src/main/java/de/bluecolored/bluemap/bukkit/BukkitWorld.java @@ -24,8 +24,10 @@ */ package de.bluecolored.bluemap.bukkit; -import de.bluecolored.bluemap.common.serverinterface.Dimension; import de.bluecolored.bluemap.common.serverinterface.ServerWorld; +import de.bluecolored.bluemap.core.resources.datapack.DataPack; +import de.bluecolored.bluemap.core.util.Key; +import de.bluecolored.bluemap.core.world.mca.MCAWorld; import org.bukkit.Bukkit; import org.bukkit.World; @@ -33,57 +35,35 @@ import java.io.IOException; import java.lang.ref.WeakReference; import java.nio.file.Files; import java.nio.file.Path; -import java.util.Optional; import java.util.concurrent.ExecutionException; public class BukkitWorld implements ServerWorld { private final WeakReference delegate; - private final Path saveFolder; + private final Path worldFolder; + private final Key dimension; public BukkitWorld(World delegate) { this.delegate = new WeakReference<>(delegate); - Dimension dimension = getDimension(); - Path saveFolder = delegate.getWorldFolder().toPath() - .resolve(dimension.getDimensionSubPath()) - .toAbsolutePath().normalize(); + this.dimension = resolveDimension(delegate); + Path worldFolder = delegate.getWorldFolder().toPath(); // fix for hybrids - if (!Files.exists(saveFolder)) { - Path direct = delegate.getWorldFolder().toPath(); - if (Files.exists(direct) && direct.endsWith(dimension.getDimensionSubPath())) - saveFolder = direct; + Path dimensionFolder = MCAWorld.resolveDimensionFolder(worldFolder, dimension); + if (!Files.exists(worldFolder)) { + Path dimensionSubPath = worldFolder.relativize(dimensionFolder); + + if (Files.exists(worldFolder) && worldFolder.endsWith(dimensionSubPath)) + worldFolder = worldFolder.subpath(0, worldFolder.getNameCount() - dimensionSubPath.getNameCount()); } - this.saveFolder = saveFolder; + this.worldFolder = worldFolder; } - @Override - public Dimension getDimension() { - World world = delegate.get(); - if (world != null) { - if (world.getEnvironment().equals(World.Environment.NETHER)) return Dimension.NETHER; - if (world.getEnvironment().equals(World.Environment.THE_END)) return Dimension.END; - } - return Dimension.OVERWORLD; - } - - @Override - public Optional getId() { - World world = delegate.get(); - if (world != null) { - return Optional.of(world.getUID().toString()); - } - return Optional.empty(); - } - - @Override - public Optional getName() { - World world = delegate.get(); - if (world != null) { - return Optional.of(world.getName()); - } - return Optional.empty(); + private Key resolveDimension(World world) { + if (world.getEnvironment().equals(World.Environment.NETHER)) return DataPack.DIMENSION_THE_NETHER; + if (world.getEnvironment().equals(World.Environment.THE_END)) return DataPack.DIMENSION_THE_END; + return DataPack.DIMENSION_OVERWORLD; } @Override @@ -108,8 +88,13 @@ public class BukkitWorld implements ServerWorld { } @Override - public Path getSaveFolder() { - return this.saveFolder; + public Path getWorldFolder() { + return worldFolder; + } + + @Override + public Key getDimension() { + return dimension; } } diff --git a/implementations/spigot/src/main/java/de/bluecolored/bluemap/bukkit/JavaLogger.java b/implementations/spigot/src/main/java/de/bluecolored/bluemap/bukkit/JavaLogger.java index b941bf29..3afeb6b3 100644 --- a/implementations/spigot/src/main/java/de/bluecolored/bluemap/bukkit/JavaLogger.java +++ b/implementations/spigot/src/main/java/de/bluecolored/bluemap/bukkit/JavaLogger.java @@ -24,14 +24,14 @@ */ package de.bluecolored.bluemap.bukkit; +import de.bluecolored.bluemap.core.logger.AbstractLogger; + import java.util.logging.Level; import java.util.logging.Logger; -import de.bluecolored.bluemap.core.logger.AbstractLogger; - public class JavaLogger extends AbstractLogger { - private Logger out; + private final Logger out; public JavaLogger(Logger out) { this.out = out; diff --git a/implementations/sponge/src/main/java/de/bluecolored/bluemap/sponge/EventForwarder.java b/implementations/sponge/src/main/java/de/bluecolored/bluemap/sponge/EventForwarder.java index 7cdf99c1..e2ce04d7 100644 --- a/implementations/sponge/src/main/java/de/bluecolored/bluemap/sponge/EventForwarder.java +++ b/implementations/sponge/src/main/java/de/bluecolored/bluemap/sponge/EventForwarder.java @@ -24,9 +24,9 @@ */ package de.bluecolored.bluemap.sponge; -import de.bluecolored.bluemap.common.serverinterface.ServerEventListener; import de.bluecolored.bluemap.common.plugin.text.Text; -import net.kyori.adventure.text.serializer.plain.PlainComponentSerializer; +import de.bluecolored.bluemap.common.serverinterface.ServerEventListener; +import net.kyori.adventure.text.serializer.plain.PlainTextComponentSerializer; import org.spongepowered.api.event.Listener; import org.spongepowered.api.event.Order; import org.spongepowered.api.event.message.PlayerChatEvent; @@ -34,7 +34,7 @@ import org.spongepowered.api.event.network.ServerSideConnectionEvent; public class EventForwarder { - private ServerEventListener listener; + private final ServerEventListener listener; public EventForwarder(ServerEventListener listener) { this.listener = listener; @@ -52,7 +52,7 @@ public class EventForwarder { @Listener(order = Order.POST) public void onPlayerChat(PlayerChatEvent evt) { - listener.onChatMessage(Text.of(PlainComponentSerializer.plain().serialize(evt.message()))); + listener.onChatMessage(Text.of(PlainTextComponentSerializer.plainText().serialize(evt.message()))); } } diff --git a/implementations/sponge/src/main/java/de/bluecolored/bluemap/sponge/SpongeCommandSource.java b/implementations/sponge/src/main/java/de/bluecolored/bluemap/sponge/SpongeCommandSource.java index ccf78012..1c8e3948 100644 --- a/implementations/sponge/src/main/java/de/bluecolored/bluemap/sponge/SpongeCommandSource.java +++ b/implementations/sponge/src/main/java/de/bluecolored/bluemap/sponge/SpongeCommandSource.java @@ -26,15 +26,15 @@ package de.bluecolored.bluemap.sponge; import com.flowpowered.math.vector.Vector3d; import de.bluecolored.bluemap.common.plugin.Plugin; -import de.bluecolored.bluemap.common.serverinterface.CommandSource; import de.bluecolored.bluemap.common.plugin.text.Text; +import de.bluecolored.bluemap.common.serverinterface.CommandSource; +import de.bluecolored.bluemap.common.serverinterface.ServerWorld; import de.bluecolored.bluemap.core.world.World; import net.kyori.adventure.audience.Audience; import net.kyori.adventure.text.serializer.gson.GsonComponentSerializer; import org.spongepowered.api.service.permission.Subject; import org.spongepowered.api.world.Locatable; -import java.io.IOException; import java.util.Optional; public class SpongeCommandSource implements CommandSource { @@ -71,11 +71,8 @@ public class SpongeCommandSource implements CommandSource { @Override public Optional getWorld() { if (audience instanceof Locatable locatable) { - try { - var serverWorld = SpongePlugin.getInstance().getWorld(locatable.serverLocation().world()); - String worldId = plugin.getBlueMap().getWorldId(serverWorld.getSaveFolder()); - return Optional.ofNullable(plugin.getWorlds().get(worldId)); - } catch (IOException ignore) {} + ServerWorld serverWorld = SpongePlugin.getInstance().getServerWorld(locatable.serverLocation().world()); + return Optional.ofNullable(plugin.getWorld(serverWorld)); } return Optional.empty(); diff --git a/implementations/sponge/src/main/java/de/bluecolored/bluemap/sponge/SpongePlayer.java b/implementations/sponge/src/main/java/de/bluecolored/bluemap/sponge/SpongePlayer.java index 2624acc5..39ef1534 100644 --- a/implementations/sponge/src/main/java/de/bluecolored/bluemap/sponge/SpongePlayer.java +++ b/implementations/sponge/src/main/java/de/bluecolored/bluemap/sponge/SpongePlayer.java @@ -28,6 +28,7 @@ import com.flowpowered.math.vector.Vector3d; import de.bluecolored.bluemap.common.plugin.text.Text; import de.bluecolored.bluemap.common.serverinterface.Gamemode; import de.bluecolored.bluemap.common.serverinterface.Player; +import de.bluecolored.bluemap.common.serverinterface.ServerWorld; import org.spongepowered.api.Sponge; import org.spongepowered.api.data.Keys; import org.spongepowered.api.effect.VanishState; @@ -37,7 +38,6 @@ import org.spongepowered.api.entity.living.player.gamemode.GameMode; import org.spongepowered.api.entity.living.player.gamemode.GameModes; import org.spongepowered.api.entity.living.player.server.ServerPlayer; -import java.io.IOException; import java.util.*; public class SpongePlayer implements Player { @@ -53,12 +53,11 @@ public class SpongePlayer implements Player { private final UUID uuid; private Text name; - private String world; + private ServerWorld world; private Vector3d position; private Vector3d rotation; private int skyLight; private int blockLight; - private boolean online; private boolean sneaking; private boolean invisible; private boolean vanished; @@ -80,7 +79,7 @@ public class SpongePlayer implements Player { } @Override - public String getWorld() { + public ServerWorld getWorld() { return this.world; } @@ -104,11 +103,6 @@ public class SpongePlayer implements Player { return blockLight; } - @Override - public boolean isOnline() { - return this.online; - } - @Override public boolean isSneaking() { return this.sneaking; @@ -134,10 +128,7 @@ public class SpongePlayer implements Player { */ public void update() { ServerPlayer player = Sponge.server().player(uuid).orElse(null); - if (player == null) { - this.online = false; - return; - } + if (player == null) return; this.gamemode = GAMEMODE_MAP.get(player.get(Keys.GAME_MODE).orElse(GameModes.NOT_SET.get())); if (this.gamemode == null) this.gamemode = Gamemode.SURVIVAL; @@ -154,7 +145,6 @@ public class SpongePlayer implements Player { this.vanished = player.get(Keys.VANISH_STATE).orElse(VanishState.unvanished()).invisible(); this.name = Text.of(player.name()); - this.online = player.isOnline(); this.position = SpongePlugin.fromSpongePoweredVector(player.position()); this.rotation = SpongePlugin.fromSpongePoweredVector(player.rotation()); this.sneaking = player.get(Keys.IS_SNEAKING).orElse(false); @@ -163,12 +153,7 @@ public class SpongePlayer implements Player { this.skyLight = 15; //player.world().light(LightTypes.SKY, player.blockPosition()); this.blockLight = 0; //player.world().light(LightTypes.BLOCK, player.blockPosition()); - try { - var world = SpongePlugin.getInstance().getWorld(player.world()); - this.world = SpongePlugin.getInstance().getPlugin().getBlueMap().getWorldId(world.getSaveFolder()); - } catch (IOException | NullPointerException e) { // NullPointerException -> the plugin isn't fully loaded - this.world = "unknown"; - } + this.world = SpongePlugin.getInstance().getServerWorld(player.world()); } } diff --git a/implementations/sponge/src/main/java/de/bluecolored/bluemap/sponge/SpongePlugin.java b/implementations/sponge/src/main/java/de/bluecolored/bluemap/sponge/SpongePlugin.java index 7f52a3f0..ef46c02b 100644 --- a/implementations/sponge/src/main/java/de/bluecolored/bluemap/sponge/SpongePlugin.java +++ b/implementations/sponge/src/main/java/de/bluecolored/bluemap/sponge/SpongePlugin.java @@ -32,8 +32,8 @@ import com.github.benmanes.caffeine.cache.LoadingCache; import com.google.inject.Inject; import de.bluecolored.bluemap.common.plugin.Plugin; import de.bluecolored.bluemap.common.serverinterface.Player; -import de.bluecolored.bluemap.common.serverinterface.ServerEventListener; import de.bluecolored.bluemap.common.serverinterface.Server; +import de.bluecolored.bluemap.common.serverinterface.ServerEventListener; import de.bluecolored.bluemap.common.serverinterface.ServerWorld; import de.bluecolored.bluemap.core.BlueMap; import de.bluecolored.bluemap.core.MinecraftVersion; @@ -220,7 +220,7 @@ public class SpongePlugin implements Server { } @Override - public Collection getLoadedWorlds() { + public Collection getLoadedServerWorlds() { Collection loadedWorlds = new ArrayList<>(3); for (var world : Sponge.server().worldManager().worlds()) { loadedWorlds.add(worlds.get(world)); @@ -229,9 +229,7 @@ public class SpongePlugin implements Server { } @Override - public Optional getWorld(Object world) { - if (world instanceof Path) - return getWorld((Path) world); + public Optional getServerWorld(Object world) { if (world instanceof String) { ResourceKey resourceKey = ResourceKey.resolve((String) world); @@ -245,12 +243,12 @@ public class SpongePlugin implements Server { } if (world instanceof org.spongepowered.api.world.server.ServerWorld) - return Optional.of(getWorld((org.spongepowered.api.world.server.ServerWorld) world)); + return Optional.of(getServerWorld((org.spongepowered.api.world.server.ServerWorld) world)); return Optional.empty(); } - public ServerWorld getWorld(org.spongepowered.api.world.server.ServerWorld world) { + public ServerWorld getServerWorld(org.spongepowered.api.world.server.ServerWorld world) { return worlds.get(world); } @@ -269,11 +267,6 @@ public class SpongePlugin implements Server { return onlinePlayerMap.values(); } - @Override - public Optional getPlayer(UUID uuid) { - return Optional.ofNullable(onlinePlayerMap.get(uuid)); - } - @Override public de.bluecolored.bluemap.core.util.Tristate isMetricsEnabled() { if (pluginContainer != null) { diff --git a/implementations/sponge/src/main/java/de/bluecolored/bluemap/sponge/SpongeWorld.java b/implementations/sponge/src/main/java/de/bluecolored/bluemap/sponge/SpongeWorld.java index 85c6e260..bf5138c5 100644 --- a/implementations/sponge/src/main/java/de/bluecolored/bluemap/sponge/SpongeWorld.java +++ b/implementations/sponge/src/main/java/de/bluecolored/bluemap/sponge/SpongeWorld.java @@ -24,15 +24,14 @@ */ package de.bluecolored.bluemap.sponge; -import de.bluecolored.bluemap.common.serverinterface.Dimension; import de.bluecolored.bluemap.common.serverinterface.ServerWorld; -import net.kyori.adventure.text.serializer.plain.PlainTextComponentSerializer; +import de.bluecolored.bluemap.core.resources.datapack.DataPack; +import de.bluecolored.bluemap.core.util.Key; import org.spongepowered.api.world.WorldTypes; import java.io.IOException; import java.lang.ref.WeakReference; import java.nio.file.Path; -import java.util.Optional; import java.util.concurrent.CompletableFuture; import java.util.concurrent.CompletionException; import java.util.concurrent.ExecutionException; @@ -40,41 +39,15 @@ import java.util.concurrent.ExecutionException; public class SpongeWorld implements ServerWorld { private final WeakReference delegate; - private final Path saveFolder; + private final Path worldFolder; + private final Key dimension; public SpongeWorld(org.spongepowered.api.world.server.ServerWorld delegate) { this.delegate = new WeakReference<>(delegate); - this.saveFolder = delegate.directory() - .toAbsolutePath().normalize(); - } - - @Override - public Dimension getDimension() { - var world = delegate.get(); - if (world != null) { - if (world.worldType().equals(WorldTypes.THE_NETHER.get())) return Dimension.NETHER; - if (world.worldType().equals(WorldTypes.THE_END.get())) return Dimension.END; - } - return Dimension.OVERWORLD; - } - - @Override - public Optional getId() { - var world = delegate.get(); - if (world != null) { - return Optional.of(world.uniqueId().toString()); - } - return Optional.empty(); - } - - @Override - public Optional getName() { - var world = delegate.get(); - if (world != null) { - return world.properties().displayName() - .map(PlainTextComponentSerializer.plainText()::serialize); - } - return Optional.empty(); + this.worldFolder = delegate.directory(); + this.dimension = WorldTypes.registry().findValueKey(delegate.worldType()) + .map(k -> new Key(k.namespace(), k.value())) + .orElse(DataPack.DIMENSION_OVERWORLD); } @Override @@ -102,8 +75,13 @@ public class SpongeWorld implements ServerWorld { } @Override - public Path getSaveFolder() { - return this.saveFolder; + public Path getWorldFolder() { + return worldFolder; + } + + @Override + public Key getDimension() { + return dimension; } }