1
0
Fork 0

The game is starting as it should

- Fully working Queue system
- Fully working game (for now with one color)
- TODO: Add check for yellow (Is player under a block)
- TODO: Check if there are still alive players, if not, end the game early
- TO FIX: Yellow - while check is used to check if players have adventure gamemode, it should be changed (server crashes after too many attempts)
This commit is contained in:
Andus 2024-08-12 02:09:21 +02:00
parent ed6c8fba77
commit b82cdb3a4b
14 changed files with 263 additions and 58 deletions

BIN
server/worlds/game.polar Normal file

Binary file not shown.

BIN
server/worlds/lobby.polar Normal file

Binary file not shown.

View file

@ -1,9 +1,12 @@
package dev.cfox.gamejam;
import dev.cfox.gamejam.game.commands.QueueCommand;
import dev.cfox.gamejam.utils.config.Checks;
import dev.cfox.gamejam.utils.config.Settings;
import dev.cfox.gamejam.utils.events.MiscEvents;
import dev.cfox.gamejam.utils.events.StartEvents;
import net.minestom.server.MinecraftServer;
import net.minestom.server.command.CommandManager;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
@ -25,9 +28,17 @@ public class Server {
logger.info("Startup Events (Chat, Spawn, etc.)");
StartEvents.registerChat();
StartEvents.handleSpawn();
logger.info("Miscellaneous Events (Game Listeners, Commands, etc.)");
MiscEvents.register();
registerCommands();
// Server Start
server.start(Settings.getIP(), Settings.getPort());
logger.info("Server Started at " + Settings.getIP() + ":" + Settings.getPort() + " (MC: " + MinecraftServer.VERSION_NAME + ")");
}
public static void registerCommands() {
CommandManager commandManager = MinecraftServer.getCommandManager();
commandManager.register(new QueueCommand());
}
}

View file

@ -1,9 +1,11 @@
package dev.cfox.gamejam.game.classes;
import dev.cfox.gamejam.game.managers.GameManager;
import dev.cfox.gamejam.game.managers.QueueManager;
import dev.cfox.gamejam.game.phases.Phase;
import dev.cfox.gamejam.utils.Misc;
import dev.cfox.gamejam.utils.classes.Randomized;
import net.kyori.adventure.sound.Sound;
import net.kyori.adventure.text.Component;
import net.kyori.adventure.text.format.NamedTextColor;
import net.kyori.adventure.text.format.TextDecoration;
@ -14,6 +16,9 @@ import net.minestom.server.entity.Player;
import net.minestom.server.instance.Instance;
import net.minestom.server.network.packet.server.play.TeamsPacket;
import net.minestom.server.scoreboard.Team;
import net.minestom.server.timer.Task;
import net.minestom.server.timer.TaskSchedule;
import net.minestom.server.utils.NamespaceID;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
@ -26,6 +31,7 @@ public class GameLobby {
Team team = MinecraftServer.getTeamManager().createTeam("team_" + getName());
private final ArrayList<UUID> eliminated = new ArrayList<>();
private Phase phase;
private Task latestTask;
private Instance instance;
private String name = "";
@ -43,18 +49,19 @@ public class GameLobby {
logger.debug("Player " + player.getUsername() + " got eliminated (GameLobby: " + name + ")");
sendMessage(Randomized.elimination(player));
player.sendMessage(Component.text("You've got eliminated!", NamedTextColor.RED, TextDecoration.BOLD));
player.playSound(Sound.sound(NamespaceID.from("minecraft:entity.ender_dragon.growl"), Sound.Source.PLAYER, 0.5f, 1.0f));
MinecraftServer.getSchedulerManager().buildTask(() -> {
player.playSound(Sound.sound(NamespaceID.from("minecraft:entity.wither.spawn"), Sound.Source.PLAYER, 0.5f, 1.0f));
}).delay(TaskSchedule.millis(10)).schedule();
MinecraftServer.getSchedulerManager().buildTask(() -> {
player.playSound(Sound.sound(NamespaceID.from("minecraft:item.totem.use"), Sound.Source.PLAYER, 0.5f, 1.0f));
}).delay(TaskSchedule.millis(20)).schedule();
player.setGameMode(GameMode.SPECTATOR);
}
}
public ArrayList<UUID> getAllPlayers() {
return players;
}
public ArrayList<UUID> getPlayers() {
ArrayList<UUID> playersInGame = new ArrayList<>(players);
playersInGame.removeIf(uuid -> getEliminated().contains(uuid));
return playersInGame;
return players;
}
public ArrayList<UUID> getEliminated() {
@ -64,19 +71,13 @@ public class GameLobby {
public void setPhase(Phase newPhase) {
phase = newPhase;
}
public Phase getPhase() {
return phase;
}
public void setName(String name) {
this.name = name;
}
public String getName() {
return name;
}
public void genName() {
UUID uuid = UUID.randomUUID();
if (!GameManager.gameLobbies.containsKey(uuid.toString())) {
@ -91,11 +92,9 @@ public class GameLobby {
players.forEach(uuid ->
Misc.getPlayer(uuid).setInstance(instance).thenRun(() -> Misc.getPlayer(uuid).teleport(pos)));
}
public Instance getInstance() {
return instance;
}
public void teleport(Pos pos) {
players.forEach(uuid -> Misc.getPlayer(uuid).teleport(pos));
}
@ -103,4 +102,11 @@ public class GameLobby {
public void sendMessage(Component component) {
players.forEach(uuid -> Misc.getPlayer(uuid).sendMessage(component));
}
public void setTask(Task task) {
latestTask = task;
}
public Task getTask() {
return latestTask;
}
}

View file

@ -1,9 +1,19 @@
package dev.cfox.gamejam.game.commands;
import dev.cfox.gamejam.game.managers.GameManager;
import dev.cfox.gamejam.game.managers.QueueManager;
import net.kyori.adventure.sound.Sound;
import net.minestom.server.MinecraftServer;
import net.minestom.server.command.builder.Command;
import net.minestom.server.command.builder.arguments.ArgumentType;
import net.minestom.server.entity.Entity;
import net.minestom.server.entity.EntityType;
import net.minestom.server.entity.Player;
import net.minestom.server.sound.SoundEvent;
import net.minestom.server.timer.TaskSchedule;
import net.minestom.server.utils.NamespaceID;
import java.util.concurrent.TimeUnit;
public class QueueCommand extends Command {
public QueueCommand() {
@ -15,6 +25,8 @@ public class QueueCommand extends Command {
QueueManager.joinPlayer(player);
} else if (arg1.equals("leave")) {
QueueManager.removePlayer(player);
} else if (arg1.equals("force")) {
GameManager.startGame(QueueManager.getPlayerQueue(player));
}
}
}), ArgumentType.String("arg1"));

View file

@ -0,0 +1,33 @@
package dev.cfox.gamejam.game.managers;
import dev.cfox.gamejam.game.classes.GameLobby;
import dev.cfox.gamejam.game.classes.GameQueue;
import net.kyori.adventure.text.Component;
import net.kyori.adventure.text.format.NamedTextColor;
import net.minestom.server.coordinate.Pos;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
public class ConversionManager {
private static final Logger logger = LoggerFactory.getLogger(ConversionManager.class);
public static GameLobby toGame(GameQueue queue) {
GameLobby game = new GameLobby();
game.setPlayers(queue.getPlayers());
game.genName();
GameManager.gameLobbies.put(game.getName(), game);
logger.debug("New GameLobby created: " + game.getName());
return game;
}
public static void fromGame(GameLobby game) {
if (!GameManager.gameLobbies.containsKey(game.getName())) {
return;
}
logger.debug("GameLobby removed: " + game.getName());
game.sendMessage(Component.text("Game ended!", NamedTextColor.RED));
game.setInstance(QueueManager.lobbyInstance, new Pos(0, 60, 0, 180, 0));
GameManager.gameLobbies.remove(game.getName());
}
}

View file

@ -2,21 +2,35 @@ package dev.cfox.gamejam.game.managers;
import dev.cfox.gamejam.game.classes.GameLobby;
import dev.cfox.gamejam.game.classes.GameQueue;
import dev.cfox.gamejam.game.phases.PhaseLogic;
import dev.cfox.gamejam.utils.Misc;
import dev.cfox.gamejam.utils.events.StartEvents;
import net.hollowcube.polar.PolarLoader;
import net.kyori.adventure.text.Component;
import net.kyori.adventure.text.format.NamedTextColor;
import net.kyori.adventure.text.format.TextDecoration;
import net.kyori.adventure.title.Title;
import net.minestom.server.MinecraftServer;
import net.minestom.server.coordinate.Pos;
import net.minestom.server.entity.GameMode;
import net.minestom.server.entity.Player;
import net.minestom.server.instance.Instance;
import net.minestom.server.instance.InstanceContainer;
import net.minestom.server.instance.InstanceManager;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import java.io.IOException;
import java.nio.file.Path;
import java.util.*;
public class GameManager {
public static Map<String, GameLobby> gameLobbies = new HashMap<>();
private static final Logger logger = LoggerFactory.getLogger(GameManager.class);
public static boolean isPlayerInGame(Player player) {
for (GameLobby lobby : gameLobbies.values()) {
if (lobby.getAllPlayers().contains(player.getUuid())) {
if (lobby.getPlayers().contains(player.getUuid())) {
return true;
}
}
@ -25,14 +39,15 @@ public class GameManager {
public static void startGame(GameQueue queue) {
queue.sendMessage(Component.text("The game is starting!", NamedTextColor.GREEN, TextDecoration.BOLD));
// String game = LobbyConverter.toGame(queue);
GameLobby game = ConversionManager.toGame(queue);
startGame(game);
QueueManager.removeQueue(queue);
}
public static GameLobby getPlayerGame(Player player) {
if (!gameLobbies.isEmpty()) {
for (GameLobby gameLobby : gameLobbies.values()) {
if (gameLobby.getAllPlayers().contains(player.getUuid())) {
if (gameLobby.getPlayers().contains(player.getUuid())) {
return gameLobby;
}
}
@ -44,12 +59,21 @@ public class GameManager {
return gameLobbies.get(lobby);
}
public static int getPlayersInGame() {
int totalPlayers = 0;
for (GameLobby gameLobby : gameLobbies.values()) {
totalPlayers += gameLobby.getAllPlayers().size();
public static void startGame(GameLobby game) {
logger.debug("Creating Lobby Instance");
InstanceManager instanceManager = MinecraftServer.getInstanceManager();
InstanceContainer instanceContainer = instanceManager.createInstanceContainer();
try {
instanceContainer.setChunkLoader(new PolarLoader(Path.of("worlds/game.polar")));
} catch (IOException e) {
logger.error(e.getMessage());
}
return totalPlayers;
game.setInstance(instanceContainer, new Pos(0, 66, 0));
for (UUID uuid : game.getPlayers()) {
Misc.getPlayer(uuid).setGameMode(GameMode.ADVENTURE);
}
PhaseLogic.random(game);
}
public static void sendEndTitles(GameLobby game) {

View file

@ -7,6 +7,7 @@ import net.kyori.adventure.text.format.NamedTextColor;
import net.kyori.adventure.title.Title;
import net.minestom.server.MinecraftServer;
import net.minestom.server.entity.Player;
import net.minestom.server.instance.Instance;
import net.minestom.server.timer.Task;
import net.minestom.server.timer.TaskSchedule;
@ -17,16 +18,19 @@ import java.util.List;
public class QueueManager {
public static List<GameQueue> queues = new ArrayList<>();
private static final HashMap<GameQueue, Task> countdownTasks = new HashMap<>();
private static int minPlayers = 6;
private static int maxPlayers = 10;
public static Instance lobbyInstance;
public static void joinPlayer(Player player) {
boolean queueFound = false;
if (!queues.isEmpty()) {
for (GameQueue queue : queues) {
if (queue.getPlayers().size() < 10) {
if (queue.getPlayers().size() < maxPlayers) {
queue.addPlayer(player.getUuid());
queueFound = true;
if (queue.getPlayers().size() >= 6) {
if (queue.getPlayers().size() >= minPlayers) {
startCountdown(queue);
}
break;
@ -36,15 +40,18 @@ public class QueueManager {
if (!queueFound) {
createQueue(player);
player.sendMessage(Component.text("No queues were found! A new queue has been created just for you.", NamedTextColor.GREEN));
}
player.sendMessage(Component.text("The queue starts the countdown from §e6 players.", NamedTextColor.GRAY));
player.sendMessage(Component.text("One queue can hold up to §e10 players.", NamedTextColor.GRAY));
player.sendMessage(Component.text("§e§lWaiting for too long? §rUse §a/queue force §rto start now.", NamedTextColor.GRAY));
}
public static void removePlayer(Player player) {
GameQueue queue = getPlayerQueue(player);
if (queue != null) {
queue.removePlayer(player.getUuid());
if (queue.getPlayers().size() < 2) {
if (queue.getPlayers().size() < minPlayers) {
stopCountdown(queue);
}
}

View file

@ -1,42 +1,108 @@
package dev.cfox.gamejam.game.phases;
import dev.cfox.gamejam.game.classes.GameLobby;
import dev.cfox.gamejam.game.managers.ConversionManager;
import dev.cfox.gamejam.utils.Misc;
import net.kyori.adventure.text.Component;
import net.kyori.adventure.text.format.NamedTextColor;
import net.minestom.server.MinecraftServer;
import net.minestom.server.entity.Entity;
import net.minestom.server.entity.EntityType;
import net.minestom.server.entity.GameMode;
import net.minestom.server.entity.Player;
import net.minestom.server.timer.SchedulerManager;
import net.minestom.server.timer.Task;
import net.minestom.server.timer.TaskSchedule;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import java.time.Duration;
import java.util.List;
import java.util.Random;
import java.util.UUID;
public class PhaseLogic {
private static final Logger logger = LoggerFactory.getLogger(PhaseLogic.class);
private static final SchedulerManager scheduler = MinecraftServer.getSchedulerManager();
private static int phaseDuration = 30; // in seconds
private static int gameTime = 300; // 5 minutes in seconds
public static void random(GameLobby game) {
Phase[] phases = Phase.values();
int randomIndex = new Random().nextInt(phases.length);
Phase selectedPhase = phases[randomIndex];
logger.info("Picking random color phase for GameLobby: " + game.getName());
switch (selectedPhase) {
case RED -> red(game);
case BLUE -> blue(game);
case GREEN -> green(game);
case YELLOW -> yellow(game);
case PURPLE -> purple(game);
}
Task task = scheduler.buildTask(() -> {
Phase[] phases = Phase.values();
int randomIndex = new Random().nextInt(phases.length);
Phase selectedPhase = phases[randomIndex];
if (game.getTask() != null) {
game.getTask().cancel();
}
switch (selectedPhase) {
case RED -> red(game);
case BLUE -> blue(game);
case GREEN -> green(game);
case YELLOW -> yellow(game);
case PURPLE -> purple(game);
}
}).repeat(TaskSchedule.seconds(phaseDuration)).schedule();
scheduler.buildTask(() -> {
ConversionManager.fromGame(game);
task.cancel();
}).delay(TaskSchedule.seconds(gameTime)).schedule();
}
public static void red(GameLobby game) {
logger.debug("Picked red phase for GameLobby: " + game.getName());
game.setPhase(Phase.RED);
game.sendMessage(Component.text("New color picked! §cRED", NamedTextColor.GRAY));
game.sendMessage(Component.text("BLAH BLAH BLAH BLAH", NamedTextColor.RED));
Misc.showTitle(game.getInstance(), Component.text("", NamedTextColor.RED), Component.text("Red", NamedTextColor.RED));
// Handle red phase logic
}
public static void blue(GameLobby game) {
logger.debug("Picked blue phase for GameLobby: " + game.getName());
game.setPhase(Phase.BLUE);
game.sendMessage(Component.text("New color picked! §9BLUE", NamedTextColor.GRAY));
game.sendMessage(Component.text("BLAH BLAH BLAH BLAH", NamedTextColor.BLUE));
Misc.showTitle(game.getInstance(), Component.text("", NamedTextColor.BLUE), Component.text("Blue", NamedTextColor.BLUE));
// Handle blue phase logic
}
public static void green(GameLobby game) {
logger.debug("Picked green phase for GameLobby: " + game.getName());
game.setPhase(Phase.GREEN);
game.sendMessage(Component.text("New color picked! §aGREEN", NamedTextColor.GRAY));
game.sendMessage(Component.text("BLAH BLAH BLAH BLAH", NamedTextColor.GREEN));
Misc.showTitle(game.getInstance(), Component.text("", NamedTextColor.GREEN), Component.text("Green", NamedTextColor.GREEN));
// Handle green phase logic
}
public static void yellow(GameLobby game) {
// Handle yellow phase logic
logger.debug("Picked yellow phase for GameLobby: " + game.getName());
game.setPhase(Phase.YELLOW);
game.sendMessage(Component.text("New color picked! §eYELLOW", NamedTextColor.GRAY));
game.sendMessage(Component.text("Thunder is coming! Find a place to hide!", NamedTextColor.YELLOW));
Misc.showTitle(game.getInstance(), Component.text("", NamedTextColor.YELLOW), Component.text("Yellow", NamedTextColor.YELLOW));
scheduler.buildTask(() -> {
Task task = scheduler.buildTask(() -> {
List<UUID> uuids = game.getPlayers();
Random random = new Random();
Player randomPlayer = null;
while (randomPlayer == null || randomPlayer.getGameMode() != GameMode.ADVENTURE) {
randomPlayer = Misc.getPlayer(uuids.get(random.nextInt(uuids.size())));
}
Entity lightning = new Entity(EntityType.LIGHTNING_BOLT);
lightning.setInstance(randomPlayer.getInstance(), randomPlayer.getPosition());
lightning.spawn();
game.eliminate(randomPlayer);
}).repeat(Duration.ofSeconds(5)).schedule();
game.setTask(task);
}).delay(Duration.ofSeconds(5)).schedule();
}
public static void purple(GameLobby game) {
logger.debug("Picked purple phase for GameLobby: " + game.getName());
game.setPhase(Phase.PURPLE);
game.sendMessage(Component.text("New color picked! §dPURPLE", NamedTextColor.GRAY));
game.sendMessage(Component.text("BLAH BLAH BLAH BLAH", NamedTextColor.LIGHT_PURPLE));
Misc.showTitle(game.getInstance(), Component.text("", NamedTextColor.LIGHT_PURPLE), Component.text("Purple", NamedTextColor.LIGHT_PURPLE));
// Handle purple phase logic
}
}

View file

@ -3,8 +3,10 @@ package dev.cfox.gamejam.utils;
import net.kyori.adventure.text.Component;
import net.kyori.adventure.title.Title;
import net.minestom.server.MinecraftServer;
import net.minestom.server.coordinate.Pos;
import net.minestom.server.entity.Player;
import net.minestom.server.instance.Instance;
import net.minestom.server.instance.block.Block;
import java.util.UUID;
@ -18,4 +20,25 @@ public class Misc {
player.showTitle(Title.title(title, subtitle)); // Send the title to each player
}
}
public void replaceAirInRegion(Instance instance, Pos start, Pos end, Block newBlockType) {
int startX = (int) Math.min(start.x(), end.x());
int startY = (int) Math.min(start.y(), end.y());
int startZ = (int) Math.min(start.z(), end.z());
int endX = (int) Math.max(start.x(), end.x());
int endY = (int) Math.max(start.y(), end.y());
int endZ = (int) Math.max(start.z(), end.z());
for (int x = startX; x <= endX; x++) {
for (int y = startY; y <= endY; y++) {
for (int z = startZ; z <= endZ; z++) {
Pos pos = new Pos(x, y, z);
if (instance.getBlock(pos).compare(Block.AIR)) {
instance.setBlock(pos, newBlockType);
}
}
}
}
}
}

View file

@ -1,5 +1,6 @@
package dev.cfox.gamejam.utils.classes;
import net.kyori.adventure.text.Component;
import net.minestom.server.entity.*;
import net.minestom.server.entity.metadata.PlayerMeta;
import net.minestom.server.network.packet.server.play.EntityMetaDataPacket;
@ -21,6 +22,7 @@ public class NPC extends Entity {
public NPC(@NotNull String username, @Nullable String skinTexture, @Nullable String skinSignature) {
super(EntityType.PLAYER);
this.username = username;
setCustomName(Component.text(username));
this.skinTexture = skinTexture;
this.skinSignature = skinSignature;

View file

@ -1,7 +0,0 @@
package dev.cfox.gamejam.utils.conversion;
public class Polar {
public static void convertFolder(String folder) {
}
}

View file

@ -1,8 +1,15 @@
package dev.cfox.gamejam.utils.events;
import dev.cfox.gamejam.game.managers.GameManager;
import dev.cfox.gamejam.game.managers.QueueManager;
import dev.cfox.gamejam.game.phases.Phase;
import dev.cfox.gamejam.utils.classes.NPC;
import net.kyori.adventure.text.Component;
import net.minestom.server.MinecraftServer;
import net.minestom.server.entity.Entity;
import net.minestom.server.entity.Player;
import net.minestom.server.event.GlobalEventHandler;
import net.minestom.server.event.entity.EntityAttackEvent;
import net.minestom.server.event.player.PlayerMoveEvent;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
@ -15,6 +22,24 @@ public class MiscEvents {
logger.debug("Registering Misc Listeners");
globalEventHandler.addListener(PlayerMoveEvent.class, event -> {
Player player = event.getPlayer();
if (GameManager.isPlayerInGame(player)) {
Phase phase = GameManager.getPlayerGame(player).getPhase();
if (phase == Phase.YELLOW) {
}
}
});
globalEventHandler.addListener(EntityAttackEvent.class, event -> {
Entity targeter = event.getEntity();
Entity targeted = event.getTarget();
if (targeter instanceof Player player) {
if (targeted instanceof NPC npc && npc.getCustomName().equals(Component.text("Join the Queue"))) {
QueueManager.joinPlayer(player);
}
}
});
}
}

View file

@ -3,11 +3,13 @@ package dev.cfox.gamejam.utils.events;
import dev.cfox.gamejam.utils.Misc;
import dev.cfox.gamejam.utils.classes.NPC;
import dev.cfox.gamejam.utils.classes.Randomized;
import net.hollowcube.polar.PolarLoader;
import net.kyori.adventure.text.Component;
import net.kyori.adventure.text.format.NamedTextColor;
import net.kyori.adventure.text.minimessage.MiniMessage;
import net.minestom.server.MinecraftServer;
import net.minestom.server.coordinate.Pos;
import net.minestom.server.entity.GameMode;
import net.minestom.server.entity.Player;
import net.minestom.server.event.GlobalEventHandler;
import net.minestom.server.event.player.AsyncPlayerConfigurationEvent;
@ -18,6 +20,8 @@ import net.minestom.server.instance.block.Block;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import java.io.IOException;
import java.nio.file.Path;
import java.time.Duration;
public class StartEvents {
@ -44,35 +48,34 @@ public class StartEvents {
InstanceContainer instanceContainer = createLobbyInstance();
globalEventHandler.addListener(AsyncPlayerConfigurationEvent.class, event -> {
final Player player = event.getPlayer();
player.setGameMode(GameMode.ADVENTURE);
event.setSpawningInstance(instanceContainer);
player.setRespawnPoint(new Pos(0, 42, 0));
player.setRespawnPoint(new Pos(0.5, 66, 0.5, 180, 0));
});
globalEventHandler.addListener(PlayerSpawnEvent.class, event -> {
Player player = event.getPlayer();
if (event.isFirstSpawn()) {
player.sendMessage(Component.text(
"§eClick on §ror §erun into §rthe Minestom NPC to §ajoin the queue!", NamedTextColor.GRAY));
Misc.showTitle(player.getInstance(), Component.text("", NamedTextColor.RED), Component.text("Red", NamedTextColor.RED));
"§ePunch §rthe Minestom NPC to §ajoin the queue!", NamedTextColor.GRAY));
}
});
}
public static InstanceContainer createLobbyInstance() {
logger.debug("Creating Lobby Instance");
InstanceManager instanceManager = MinecraftServer.getInstanceManager();
InstanceContainer instanceContainer = instanceManager.createInstanceContainer();
// try {
// instanceContainer.setChunkLoader(new PolarLoader(Path.of("worlds/lobby.polar")));
// } catch (IOException e) {
// logger.error(e.getMessage());
// }
instanceContainer.setGenerator(unit -> unit.modifier().fillHeight(0, 40, Block.GRASS_BLOCK));
instanceContainer.setChunkSupplier(LightingChunk::new);
try {
instanceContainer.setChunkLoader(new PolarLoader(Path.of("worlds/lobby.polar")));
} catch (IOException e) {
logger.error(e.getMessage());
}
NPC joinNPC = new NPC("Join the Queue",
"ewogICJ0aW1lc3RhbXAiIDogMTY3MjE3MTU1MjU1OCwKICAicHJvZmlsZUlkIiA6ICJiNTAwOGEyMGJkY2U0YjJlOTU5NWZlNzY2MDlmYjUzNiIsCiAgInByb2ZpbGVOYW1lIiA6ICJNT1JJU3hTVE9QQkFOIiwKICAic2lnbmF0dXJlUmVxdWlyZWQiIDogdHJ1ZSwKICAidGV4dHVyZXMiIDogewogICAgIlNLSU4iIDogewogICAgICAidXJsIiA6ICJodHRwOi8vdGV4dHVyZXMubWluZWNyYWZ0Lm5ldC90ZXh0dXJlL2RmZDIwOWU5ZTk2MGY4MDQ5ZDdlYWY0NTJmYzg1YmYwYmVjZjliMTUwYjQ2MzIwMTY2Mjg1YzdhYjEzMjMxN2UiCiAgICB9CiAgfQp9",
"yWIH6gVDRhgd/HwVYpRT87NBHf+q9EgYs/CYqIwnz5xXR22k29c7MTnaYFvWukbwF1FhWNilAyYzagSn/7ScvOpYn0RtyTWk656cwjzFSbTsSFzRwUl5f4mu1EeunYh8v5cZH27KTfAI7a9Q7ylXz7NoAbvaw056thXa7jHhLhFdPECnziRTnv9jDRwpoN/4jblmdOz5NCLtynubf8hwIwm9od18tXy4+gsV3aXS5+1MirpWDizqdozb9mtwzML9NYwVNpO2bRB9KYJ91VUWqxjfTy/q0xFQ1paolq4pp3tgvLXw0y+rdwCsCgh39JA4MKvIIJShww5xbqo4oFBRDj+/BI3+Y154Ess1004vE+iTRdt+az0v4y+evnOQLgryEr/36QzZOndpSFqYfKPl1MeUeZe1u4VDQJcgyJImg2TZJbG2WOmmTySWSEPrHcYC6c3Y9rVnQ6Zi4NxTe4e6/ZuDQVm14fuSUPd4Ll7/aIDyumHupBMMbBEa9qCmuZJPT5iWVlIGfzA2Dg/kea4Jw9WudUmiCYngB56HZEivDPniIxeGSTRFHMR2FfTKnLkxb2LDOvD+CgDWyr8cGy4xnB2hwdY2n28cCAYI5axj0qzCpHMl8Y90e2rKfX7NsUvyivbAVRwAsd/bWkkJoZ4/QStFEjV//81iNbuUz/4lFQA=");
joinNPC.setInstance(instanceContainer, new Pos(0, 40, 0));
joinNPC.setInstance(instanceContainer, new Pos(0.5, 66.5, -16.5));
return instanceContainer;
}