diff --git a/common/src/main/java/net/onelitefeather/cygnus/common/map/MapEntry.java b/common/src/main/java/net/onelitefeather/cygnus/common/map/MapEntry.java deleted file mode 100644 index 833ba3e..0000000 --- a/common/src/main/java/net/onelitefeather/cygnus/common/map/MapEntry.java +++ /dev/null @@ -1,18 +0,0 @@ -package net.onelitefeather.cygnus.common.map; - -import net.onelitefeather.cygnus.common.config.GameConfig; - -import java.nio.file.Files; -import java.nio.file.Path; - -// Maps as path -public record MapEntry(Path path) { - - public boolean hasMapFile() { - return Files.exists(path.resolve(GameConfig.MAP_FILE_NAME)); - } - - public Path getMapFile() { - return path.resolve(GameConfig.MAP_FILE_NAME); - } -} diff --git a/common/src/main/java/net/onelitefeather/cygnus/common/map/MapPool.java b/common/src/main/java/net/onelitefeather/cygnus/common/map/MapPool.java deleted file mode 100644 index fcfec8a..0000000 --- a/common/src/main/java/net/onelitefeather/cygnus/common/map/MapPool.java +++ /dev/null @@ -1,120 +0,0 @@ -package net.onelitefeather.cygnus.common.map; - -import net.minestom.server.MinecraftServer; -import net.minestom.server.utils.validate.Check; -import org.jetbrains.annotations.Nullable; -import org.jetbrains.annotations.UnmodifiableView; -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; - -import java.io.IOException; -import java.nio.file.Files; -import java.nio.file.Path; -import java.util.ArrayList; -import java.util.Collections; -import java.util.List; -import java.util.concurrent.ThreadLocalRandom; -import java.util.stream.Collectors; -import java.util.stream.Stream; - -/** - * The map pool is responsible for managing the available maps. It will load all maps data from the given path and store them. - * It would not load the map itself over a {@link net.minestom.server.instance.anvil.AnvilLoader} instance. - * This behavior is handled by another class. - * - * @author theEvilReaper - * @version 1.0.0 - * @since 1.0.0 - **/ -public class MapPool { - - private static final String LOBBY_MAP_NAME = "lobby"; - private static final Logger LOGGER = LoggerFactory.getLogger(MapPool.class); - - private List referenceList; - private MapEntry selectedMap; - private MapEntry lobbyMap; - - /** - * Creates a new instance of the map pool. It will load all maps from the given path. - * - * @param path the path where the maps are stored - */ - public MapPool(Path path) { - referenceList = loadMapsEntries(path); - this.peekMap(); - } - - /** - * Loads all maps from the given path. It will filter all directories and create a new {@link MapEntry} instance. - * - * @param path the path where the maps are stored - * @return a list with all available maps - */ - private List loadMapsEntries(Path path) { - List mapEntries = new ArrayList<>(); - try (Stream stream = Files.list(path)) { - mapEntries = stream.filter(Files::isDirectory).map(MapEntry::new).filter(MapEntry::hasMapFile).collect(Collectors.toList()); - } catch (IOException exception) { - MinecraftServer.getExceptionManager().handleException(exception); - LOGGER.error("Unable to load maps from path {}", path, exception); - } - mapEntries.removeIf(mapEntry -> { - if (mapEntry.path().getFileName().toString().contains(LOBBY_MAP_NAME)) { - this.lobbyMap = mapEntry; - return true; - } - return false; - }); - - Check.argCondition(this.lobbyMap == null, "The lobby map can't be null"); - return mapEntries; - } - - /** - * Peeks a random map from the list. If the list is empty it will throw an exception. - */ - public void peekMap() { - Check.argCondition(this.referenceList.isEmpty(), "The map list is empty"); - if (this.referenceList.size() == 1) { - this.selectedMap = this.referenceList.getFirst(); - return; - } - this.selectedMap = this.referenceList.get(ThreadLocalRandom.current().nextInt(referenceList.size())); - } - - /** - * Removes the selected map from the list. If the list is empty it will throw an exception. - */ - public void clear() { - this.referenceList.clear(); - this.referenceList = null; - } - - /** - * Gets the selected map entry. - * - * @return the selected map entry - */ - public @Nullable MapEntry getMapEntry() { - return this.selectedMap; - } - - /** - * Gets the lobby map entry. - * - * @return the lobby map entry - */ - public MapEntry getLobbyEntry() { - return this.lobbyMap; - } - - /** - * Gets all available maps from the pool. - * - * @return an unmodifiable list with all available maps - */ - public @UnmodifiableView List getAvailableMaps() { - return Collections.unmodifiableList(this.referenceList); - } -} diff --git a/common/src/main/java/net/onelitefeather/cygnus/common/map/MapProvider.java b/common/src/main/java/net/onelitefeather/cygnus/common/map/MapProvider.java deleted file mode 100644 index 2fe7219..0000000 --- a/common/src/main/java/net/onelitefeather/cygnus/common/map/MapProvider.java +++ /dev/null @@ -1,134 +0,0 @@ -package net.onelitefeather.cygnus.common.map; - -import net.theevilreaper.aves.file.GsonFileHandler; -import net.theevilreaper.aves.map.BaseMap; -import net.minestom.server.MinecraftServer; -import net.minestom.server.coordinate.Point; -import net.minestom.server.instance.Instance; -import net.minestom.server.instance.InstanceContainer; -import net.minestom.server.instance.anvil.AnvilLoader; -import net.minestom.server.utils.chunk.ChunkUtils; -import net.onelitefeather.cygnus.common.config.GameConfig; -import net.onelitefeather.cygnus.common.page.PageProvider; -import net.onelitefeather.cygnus.common.util.Helper; -import org.jetbrains.annotations.UnmodifiableView; -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; - -import java.nio.file.Path; -import java.util.Collections; -import java.util.List; - -/** - * @author theEvilReaper - * @version 1.0.0 - * @since - **/ - -public final class MapProvider { - - private static final Logger LOGGER = LoggerFactory.getLogger(MapProvider.class); - private static final String MAP_PATH = "maps"; - private final GsonFileHandler fileHandler; - private final MapPool mapPool; - private InstanceContainer instance; - private BaseMap activeMap; - - private GameMap gameMap; - private InstanceContainer gameInstance; - - private final PageProvider pageProvider; - - public MapProvider(Path path, InstanceContainer instance, PageProvider pageProvider) { - this.mapPool = new MapPool(path.resolve(MAP_PATH)); - this.instance = instance; - this.pageProvider = pageProvider; - this.fileHandler = new GsonFileHandler(Helper.GSON); - this.loadLobbyMap(); - } - - private void loadLobbyMap() { - var lobbyData = this.fileHandler.load(this.mapPool.getLobbyEntry().path().resolve(GameConfig.MAP_FILE_NAME), BaseMap.class); - this.instance.setChunkLoader(new AnvilLoader(mapPool.getLobbyEntry().path())); - this.activeMap = lobbyData.get(); - - if (this.activeMap.getSpawn() != null) { - loadChunk(this.instance, this.activeMap.getSpawn()); - } - } - - public void loadGameMap() { - if (this.gameMap != null && this.gameInstance != null) return; - var mapEntry = this.mapPool.getMapEntry(); - var gameData = this.fileHandler.load(mapEntry.path().resolve(GameConfig.MAP_FILE_NAME), GameMap.class); - this.pageProvider.loadPageData(gameData.get().getPageFaces()); - InstanceContainer gameInstance = MinecraftServer.getInstanceManager().createInstanceContainer(); - prepareInstanceData(gameInstance); - gameInstance.setTime(Helper.NEW_MOON_TIME); - MinecraftServer.getInstanceManager().registerInstance(gameInstance); - gameInstance.setChunkLoader(new AnvilLoader(mapEntry.path())); - - this.gameMap = gameData.get(); - this.gameInstance = gameInstance; - this.pageProvider.collectStartPages(gameInstance); - } - - public void saveMap(Path path, BaseMap baseMap) { - this.fileHandler.save(path, baseMap instanceof GameMap gameMap ? gameMap : baseMap); - } - - private void loadChunk(InstanceContainer instance, T pos) { - if (!ChunkUtils.isLoaded(instance, pos)) { - instance.loadChunk(pos).whenComplete((chunk, throwable) -> { - if (throwable != null) { - LOGGER.error("Failed to load chunk at {}", pos, throwable); - } - if (chunk != null) { - LOGGER.info("Loaded chunk at {}", chunk.isLoaded()); - } - }); - } - } - - public void switchToGameMap() { - this.activeMap = null; - MinecraftServer.getInstanceManager().unregisterInstance(instance); - this.instance = null; - } - - public void prepareInstanceData(InstanceContainer instance) { - instance.setTimeRate(0); - instance.setTimeSynchronizationTicks(0); - instance.setTime(Helper.MIDNIGHT_TIME); - instance.enableAutoChunkLoad(true); - } - - public void setInstance(InstanceContainer instance) { - this.instance = instance; - } - - public void setMidnight() { - if (this.instance == null) return; - this.instance.setTime(Helper.MIDNIGHT_TIME); - } - - public Instance getInstance() { - return this.instance != null ? instance : gameInstance; - } - - public @UnmodifiableView List getAvailableMaps() { - return Collections.unmodifiableList(this.mapPool.getAvailableMaps()); - } - - public InstanceContainer getGameInstance() { - return gameInstance; - } - - public BaseMap getActiveMap() { - return this.activeMap; - } - - public GameMap getGameMap() { - return gameMap; - } -} diff --git a/common/src/main/java/net/onelitefeather/cygnus/common/util/GsonHelper.java b/common/src/main/java/net/onelitefeather/cygnus/common/util/GsonHelper.java new file mode 100644 index 0000000..092b5be --- /dev/null +++ b/common/src/main/java/net/onelitefeather/cygnus/common/util/GsonHelper.java @@ -0,0 +1,37 @@ +package net.onelitefeather.cygnus.common.util; + +import com.google.gson.Gson; +import net.minestom.server.coordinate.Pos; +import net.minestom.server.coordinate.Vec; +import net.onelitefeather.cygnus.common.page.PageResource; +import net.onelitefeather.cygnus.common.page.adapter.PageResourceAdapter; +import net.theevilreaper.aves.file.GsonFileHandler; +import net.theevilreaper.aves.file.gson.PositionGsonAdapter; + +/** + * Utility class to handle gson related code + * + * @author theEvilReaper + * @version 1.0.0 + * @since 2.1.0 + */ +public final class GsonHelper { + + public static final Gson GSON; + public static final GsonFileHandler FILE_HANDLER; + + static { + + var typeAdapter = new PositionGsonAdapter(); + GSON = new Gson().newBuilder() + .registerTypeAdapter(Pos.class, typeAdapter) + .registerTypeAdapter(Vec.class, typeAdapter) + .registerTypeAdapter(PageResource.class, new PageResourceAdapter()) + .create(); + FILE_HANDLER = new GsonFileHandler(GSON); + } + + private GsonHelper() { + // Nothing to do here + } +} diff --git a/common/src/test/java/net/onelitefeather/cygnus/common/map/MapEntryTest.java b/common/src/test/java/net/onelitefeather/cygnus/common/map/MapEntryTest.java deleted file mode 100644 index d3dd188..0000000 --- a/common/src/test/java/net/onelitefeather/cygnus/common/map/MapEntryTest.java +++ /dev/null @@ -1,27 +0,0 @@ -package net.onelitefeather.cygnus.common.map; - -import net.onelitefeather.cygnus.common.config.GameConfig; -import org.junit.jupiter.api.Test; -import org.junit.jupiter.api.io.CleanupMode; -import org.junit.jupiter.api.io.TempDir; - -import java.nio.file.Path; - -import static org.junit.jupiter.api.Assertions.*; - -class MapEntryTest { - - @TempDir(cleanup = CleanupMode.ALWAYS) - static Path tempPath; - - @Test - void testObjectCreation() { - MapEntry mapEntry = new MapEntry(tempPath); - assertNotNull(mapEntry); - assertFalse(mapEntry.hasMapFile()); - - Path mapFile = mapEntry.getMapFile(); - - assertTrue(mapFile.endsWith(GameConfig.MAP_FILE_NAME)); - } -} diff --git a/common/src/test/java/net/onelitefeather/cygnus/common/map/MapPoolTest.java b/common/src/test/java/net/onelitefeather/cygnus/common/map/MapPoolTest.java deleted file mode 100644 index 9bc6e1d..0000000 --- a/common/src/test/java/net/onelitefeather/cygnus/common/map/MapPoolTest.java +++ /dev/null @@ -1,58 +0,0 @@ -package net.onelitefeather.cygnus.common.map; - -import org.junit.jupiter.api.Disabled; -import org.junit.jupiter.api.Test; -import org.junit.jupiter.api.io.TempDir; - -import java.io.IOException; -import java.nio.file.Files; -import java.nio.file.Path; - -import static org.junit.jupiter.api.Assertions.*; - -class MapPoolTest { - - @TempDir - static Path tempPath; - - @Test - void testMapPoolUsageWithoutMapEntries() { - assertThrowsExactly( - IllegalArgumentException.class, - () -> new MapPool(tempPath), - "The lobby map can't be null" - ); - } - - @Disabled("Investigate why lobby is not found") - @Test - void testMapPoolWithDummyMaps() { - Path lobbyMap = null; - Path gameMap = null; - try { - lobbyMap = Files.createTempDirectory(tempPath, "lobby"); - gameMap = Files.createTempDirectory(tempPath, "game"); - } catch (IOException exception) { - exception.printStackTrace(); - } - - assertNotNull(lobbyMap); - MapPool mapPool = new MapPool(tempPath); - assertFalse(mapPool.getAvailableMaps().isEmpty()); - - Path lobbyMapPath = mapPool.getLobbyEntry().path(); - - assertEquals(lobbyMap, lobbyMapPath); - - assertNotNull(mapPool.getMapEntry()); - - assertEquals(gameMap, mapPool.getMapEntry().path()); - - try { - Files.deleteIfExists(lobbyMap); - Files.deleteIfExists(gameMap); - } catch (IOException e) { - throw new RuntimeException(e); - } - } -} \ No newline at end of file diff --git a/setup/src/main/java/net/onelitefeather/cygnus/setup/SetupExtension.java b/setup/src/main/java/net/onelitefeather/cygnus/setup/SetupExtension.java index c3c7654..0a3a19f 100644 --- a/setup/src/main/java/net/onelitefeather/cygnus/setup/SetupExtension.java +++ b/setup/src/main/java/net/onelitefeather/cygnus/setup/SetupExtension.java @@ -2,8 +2,6 @@ import net.minestom.server.MinecraftServer; import net.minestom.server.coordinate.Pos; -import net.minestom.server.coordinate.Vec; -import net.minestom.server.entity.Player; import net.minestom.server.event.GlobalEventHandler; import net.minestom.server.event.instance.AddEntityToInstanceEvent; import net.minestom.server.event.instance.RemoveEntityFromInstanceEvent; @@ -11,10 +9,8 @@ import net.minestom.server.event.player.PlayerBlockBreakEvent; import net.minestom.server.event.player.PlayerSpawnEvent; import net.minestom.server.event.player.PlayerUseItemEvent; -import net.minestom.server.instance.InstanceContainer; import net.onelitefeather.cygnus.common.ListenerHandling; -import net.onelitefeather.cygnus.common.map.MapProvider; -import net.onelitefeather.cygnus.common.page.PageProvider; +import net.minestom.server.instance.Instance; import net.onelitefeather.cygnus.setup.command.SetupCommand; import net.onelitefeather.cygnus.setup.event.MapSetupSaveEvent; import net.onelitefeather.cygnus.setup.event.MapSetupSelectEvent; @@ -26,30 +22,28 @@ import net.onelitefeather.cygnus.setup.listener.PlayerSpawnListener; import net.onelitefeather.cygnus.setup.listener.SetupItemListener; import net.onelitefeather.cygnus.setup.listener.map.MapSetupSaveListener; +import net.onelitefeather.cygnus.setup.map.SetupMapProvider; import net.onelitefeather.cygnus.setup.util.SetupData; +import net.theevilreaper.aves.map.provider.AbstractMapProvider; +import net.theevilreaper.aves.util.functional.PlayerConsumer; import net.onelitefeather.guira.SetupDataService; -import org.jetbrains.annotations.NotNull; import java.nio.file.Paths; +import java.util.UUID; +import java.util.function.Supplier; public class SetupExtension implements ListenerHandling { private final SetupDataService dataService; private final SetupData setupData; - private final InstanceContainer instanceContainer; - private final PageProvider pageProvider; private final MapSetupInventory mapSetupInventory; - private final MapProvider mapProvider; + private final AbstractMapProvider mapProvider; public SetupExtension() { this.setupData = new SetupData(); this.dataService = SetupDataService.create(); - this.instanceContainer = MinecraftServer.getInstanceManager().createInstanceContainer(); - MinecraftServer.getInstanceManager().registerInstance(instanceContainer); - this.pageProvider = new PageProvider(() -> { - }); - this.mapProvider = new MapProvider(Paths.get(""), this.instanceContainer, this.pageProvider); - this.mapSetupInventory = new MapSetupInventory(mapProvider.getAvailableMaps()); + this.mapProvider = new SetupMapProvider(Paths.get("")); + this.mapSetupInventory = new MapSetupInventory(mapProvider.getEntries()); registerSetupComponents(); this.registerMapListeners(); } @@ -60,15 +54,19 @@ private void registerSetupComponents() { var spawnPos = new Pos(0, 150, 0); commandManager.register(new SetupCommand(setupData)); + Supplier instanceSupplier = this.mapProvider.getActiveInstance(); + UUID instanceUUID = instanceSupplier.get().getUuid(); + manager.addListener(MapSetupSelectEvent.class, new MapSetupSelectListener(setupData)); manager.addListener(PlayerUseItemEvent.class, new SetupItemListener(setupData, mapSetupInventory)); - manager.addListener(AsyncPlayerConfigurationEvent.class, event -> event.setSpawningInstance(instanceContainer)); - manager.addListener(PlayerSpawnEvent.class, new PlayerSpawnListener(spawnPos, instance -> this.instanceContainer.getUuid().equals(instance.getUuid()))); + manager.addListener(AsyncPlayerConfigurationEvent.class, event -> event.setSpawningInstance(instanceSupplier.get())); + manager.addListener(PlayerSpawnEvent.class, new PlayerSpawnListener(spawnPos)); manager.addListener(PlayerBlockBreakEvent.class, new PageCreationListener(setupData)); - manager.addListener(AddEntityToInstanceEvent.class, new InstanceAddListener(instanceContainer.getUuid())); - manager.addListener(RemoveEntityFromInstanceEvent.class, new InstanceRemoveListener(instanceContainer.getUuid())); + + manager.addListener(AddEntityToInstanceEvent.class, new InstanceAddListener(instanceUUID)); + manager.addListener(RemoveEntityFromInstanceEvent.class, new InstanceRemoveListener(instanceUUID)); registerCancelListener(manager); } @@ -77,10 +75,7 @@ private void registerSetupComponents() { */ private void registerMapListeners() { GlobalEventHandler node = MinecraftServer.getGlobalEventHandler(); - node.addListener(MapSetupSaveEvent.class, new MapSetupSaveListener(this::setMainInstance)); - } - - private void setMainInstance(@NotNull Player player) { - player.setInstance(this.instanceContainer, Vec.ZERO); + PlayerConsumer teleport = player -> this.mapProvider.teleportToSpawn(player, true); + node.addListener(MapSetupSaveEvent.class, new MapSetupSaveListener(teleport)); } } diff --git a/setup/src/main/java/net/onelitefeather/cygnus/setup/event/MapSetupSelectEvent.java b/setup/src/main/java/net/onelitefeather/cygnus/setup/event/MapSetupSelectEvent.java index c54dfcd..8264a39 100644 --- a/setup/src/main/java/net/onelitefeather/cygnus/setup/event/MapSetupSelectEvent.java +++ b/setup/src/main/java/net/onelitefeather/cygnus/setup/event/MapSetupSelectEvent.java @@ -3,14 +3,14 @@ import net.minestom.server.entity.Player; import net.minestom.server.event.trait.CancellableEvent; import net.minestom.server.event.trait.PlayerEvent; -import net.onelitefeather.cygnus.common.map.MapEntry; import net.onelitefeather.cygnus.setup.util.SetupMode; +import net.theevilreaper.aves.map.MapEntry; /** * The {@link MapSetupSelectEvent} is called when a player selects a map for the setup process. * * @author theEvilReaper - * @version 1.0.0 + * @version 1.1.0 * @since 1.0.0 */ public final class MapSetupSelectEvent implements PlayerEvent, CancellableEvent { diff --git a/setup/src/main/java/net/onelitefeather/cygnus/setup/inventory/MapSetupInventory.java b/setup/src/main/java/net/onelitefeather/cygnus/setup/inventory/MapSetupInventory.java index ef6cced..36a8b94 100644 --- a/setup/src/main/java/net/onelitefeather/cygnus/setup/inventory/MapSetupInventory.java +++ b/setup/src/main/java/net/onelitefeather/cygnus/setup/inventory/MapSetupInventory.java @@ -12,9 +12,9 @@ import net.minestom.server.inventory.InventoryType; import net.minestom.server.item.ItemStack; import net.minestom.server.item.Material; -import net.onelitefeather.cygnus.common.map.MapEntry; import net.onelitefeather.cygnus.setup.event.MapSetupSelectEvent; import net.onelitefeather.cygnus.setup.util.SetupMode; +import net.theevilreaper.aves.map.MapEntry; import org.jetbrains.annotations.Contract; import java.nio.file.Path; @@ -52,18 +52,15 @@ public MapSetupInventory(List maps) { this.setLayout(layout); - if (maps.isEmpty()) { - return; - } + if (maps.isEmpty()) return; setDataLayoutFunction(dataLayoutFunction -> { - if (maps.isEmpty()) return null; var dataLayout = dataLayoutFunction == null ? InventoryLayout.fromType(getType()) : dataLayoutFunction; dataLayout.blank(MAP_SLOTS); for (int i = 0; i < maps.size(); i++) { var currentMap = maps.get(i); - dataLayout.setItem(MAP_SLOTS[i], getMapItem(currentMap.path()), (player, slot, clickType, stack, result) -> + dataLayout.setItem(MAP_SLOTS[i], getMapItem(currentMap.getDirectoryRoot()), (player, slot, clickType, stack, result) -> this.handleClick(currentMap, player, slot, clickType, stack, result)); } return dataLayout; diff --git a/setup/src/main/java/net/onelitefeather/cygnus/setup/listener/MapSetupSelectListener.java b/setup/src/main/java/net/onelitefeather/cygnus/setup/listener/MapSetupSelectListener.java index 8bcfc81..a1b2cfc 100644 --- a/setup/src/main/java/net/onelitefeather/cygnus/setup/listener/MapSetupSelectListener.java +++ b/setup/src/main/java/net/onelitefeather/cygnus/setup/listener/MapSetupSelectListener.java @@ -38,7 +38,7 @@ public void accept(MapSetupSelectEvent event) { setupData.setSelectedMap(event.getMapEntry()); player.setTag(SetupTags.SETUP_ID_TAG, event.getSetupMode().ordinal()); Component message = Messages.withPrefix(Component.text("You selected the map: ", NamedTextColor.GRAY)) - .append(Component.text(event.getMapEntry().path().getFileName().toString(), NamedTextColor.AQUA)); + .append(Component.text(event.getMapEntry().getDirectoryRoot().getFileName().toString(), NamedTextColor.AQUA)); player.sendMessage(message); player.sendMessage(this.loadingMessage); setupData.loadMap(); diff --git a/setup/src/main/java/net/onelitefeather/cygnus/setup/listener/PlayerSpawnListener.java b/setup/src/main/java/net/onelitefeather/cygnus/setup/listener/PlayerSpawnListener.java index 17e3cbb..0065b81 100644 --- a/setup/src/main/java/net/onelitefeather/cygnus/setup/listener/PlayerSpawnListener.java +++ b/setup/src/main/java/net/onelitefeather/cygnus/setup/listener/PlayerSpawnListener.java @@ -4,27 +4,23 @@ import net.minestom.server.entity.GameMode; import net.minestom.server.entity.Player; import net.minestom.server.event.player.PlayerSpawnEvent; -import net.minestom.server.instance.Instance; import net.onelitefeather.cygnus.setup.util.SetupItems; import java.util.function.Consumer; -import java.util.function.Predicate; public class PlayerSpawnListener implements Consumer { private final Pos spawnPos; - private final Predicate mainInstance; - public PlayerSpawnListener(Pos spawnPos, Predicate mainInstance) { + public PlayerSpawnListener(Pos spawnPos) { this.spawnPos = spawnPos; - this.mainInstance = mainInstance; } @Override public void accept(PlayerSpawnEvent event) { Player player = event.getPlayer(); - if (!this.mainInstance.test(player.getInstance())) return; + if (!event.isFirstSpawn()) return; player.teleport(this.spawnPos); player.setGameMode(GameMode.CREATIVE); diff --git a/setup/src/main/java/net/onelitefeather/cygnus/setup/map/SetupMapProvider.java b/setup/src/main/java/net/onelitefeather/cygnus/setup/map/SetupMapProvider.java new file mode 100644 index 0000000..e752a7d --- /dev/null +++ b/setup/src/main/java/net/onelitefeather/cygnus/setup/map/SetupMapProvider.java @@ -0,0 +1,49 @@ +package net.onelitefeather.cygnus.setup.map; + +import net.minestom.server.MinecraftServer; +import net.minestom.server.instance.InstanceContainer; +import net.onelitefeather.cygnus.common.map.filter.MapFilters; +import net.onelitefeather.cygnus.common.util.GsonHelper; +import net.theevilreaper.aves.map.BaseMap; +import net.theevilreaper.aves.map.MapEntry; +import net.theevilreaper.aves.map.provider.AbstractMapProvider; + +import java.nio.file.Path; +import java.util.Optional; + +public final class SetupMapProvider extends AbstractMapProvider { + + public SetupMapProvider(Path path) { + super(GsonHelper.FILE_HANDLER, MapFilters::filterMapsForSetup); + this.mapEntries = loadMapEntries(path.resolve("maps")); + + Optional lobbyOptional = this.mapEntries.stream().filter(MapEntry::hasMapFile) + .filter(mapEntry -> mapEntry.getDirectoryRoot().equals("lobby")) + .findAny(); + + if (lobbyOptional.isEmpty()) { + throw new IllegalStateException("Lobby map not found in the maps directory."); + } + + MapEntry lobbyEntry = lobbyOptional.get(); + this.mapEntries.remove(lobbyEntry); + + Optional loadedMap = this.fileHandler.load(lobbyEntry.getMapFile(), BaseMap.class); + + if (loadedMap.isEmpty()) { + throw new IllegalStateException("Unable to load lobby map"); + } + + this.activeMap = loadedMap.get(); + InstanceContainer instanceContainer = MinecraftServer.getInstanceManager().createInstanceContainer(); + this.registerInstance(instanceContainer, lobbyEntry); + } + + /** + * {@inheritDoc} + */ + @Override + public void saveMap(Path path, BaseMap baseMap) { + throw new UnsupportedOperationException("Not supported yet."); + } +} diff --git a/setup/src/main/java/net/onelitefeather/cygnus/setup/map/package-info.java b/setup/src/main/java/net/onelitefeather/cygnus/setup/map/package-info.java new file mode 100644 index 0000000..f43ddc8 --- /dev/null +++ b/setup/src/main/java/net/onelitefeather/cygnus/setup/map/package-info.java @@ -0,0 +1,4 @@ +@NotNullByDefault +package net.onelitefeather.cygnus.setup.map; + +import org.jetbrains.annotations.NotNullByDefault; \ No newline at end of file diff --git a/setup/src/main/java/net/onelitefeather/cygnus/setup/util/SetupData.java b/setup/src/main/java/net/onelitefeather/cygnus/setup/util/SetupData.java index 6f0bf4f..32ef971 100644 --- a/setup/src/main/java/net/onelitefeather/cygnus/setup/util/SetupData.java +++ b/setup/src/main/java/net/onelitefeather/cygnus/setup/util/SetupData.java @@ -11,9 +11,8 @@ import net.minestom.server.entity.Player; import net.minestom.server.instance.InstanceContainer; import net.minestom.server.instance.anvil.AnvilLoader; -import net.onelitefeather.cygnus.common.map.GameMap; -import net.onelitefeather.cygnus.common.map.MapEntry; import net.theevilreaper.aves.map.BaseMapBuilder; +import net.theevilreaper.aves.map.MapEntry; import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; import org.jetbrains.annotations.UnknownNullability; @@ -75,7 +74,7 @@ public void setSelectedMap(@NotNull MapEntry selectedMap) { TextComponent title = Component.text("Setup mode: ") .append(Component.text(setupMode.name(), NamedTextColor.LIGHT_PURPLE)) .append(Component.text(", Map: ")) - .append(Component.text(selectedMap.path().getFileName().toString(), NamedTextColor.LIGHT_PURPLE)); + .append(Component.text(selectedMap.getDirectoryRoot().getFileName().toString(), NamedTextColor.LIGHT_PURPLE)); this.bossBar.name(title); } @@ -104,7 +103,7 @@ public void removeBossBar(@NotNull Player player) { * Loads the given data from the map into the setup reference. */ public void loadMap() { - AnvilLoader anvilLoader = new AnvilLoader(this.selectedMap.path()); + AnvilLoader anvilLoader = new AnvilLoader(this.selectedMap.getDirectoryRoot()); this.instance = MinecraftServer.getInstanceManager().createInstanceContainer(); this.instance.setChunkLoader(anvilLoader); MinecraftServer.getInstanceManager().registerInstance(this.instance); diff --git a/setup/src/test/java/net/onelitefeather/cygnus/setup/event/MapSetupSelectEventTest.java b/setup/src/test/java/net/onelitefeather/cygnus/setup/event/MapSetupSelectEventTest.java index 758485a..618be07 100644 --- a/setup/src/test/java/net/onelitefeather/cygnus/setup/event/MapSetupSelectEventTest.java +++ b/setup/src/test/java/net/onelitefeather/cygnus/setup/event/MapSetupSelectEventTest.java @@ -4,8 +4,8 @@ import net.minestom.server.instance.Instance; import net.minestom.testing.Env; import net.minestom.testing.extension.MicrotusExtension; -import net.onelitefeather.cygnus.common.map.MapEntry; import net.onelitefeather.cygnus.setup.util.SetupMode; +import net.theevilreaper.aves.map.MapEntry; import org.jetbrains.annotations.NotNull; import org.junit.jupiter.api.Test; import org.junit.jupiter.api.extension.ExtendWith; @@ -21,7 +21,7 @@ class MapSetupSelectEventTest { void testMapSetupSelectEventCreation(@NotNull Env env) { Instance instance = env.createFlatInstance(); Player player = env.createPlayer(instance); - MapEntry mapEntry = new MapEntry(Paths.get("")); + MapEntry mapEntry = MapEntry.of(Paths.get("")); MapSetupSelectEvent event = new MapSetupSelectEvent(player, mapEntry, SetupMode.LOBBY);