diff --git a/server/worlds/game.polar b/server/worlds/game.polar new file mode 100644 index 0000000..309bf8a Binary files /dev/null and b/server/worlds/game.polar differ diff --git a/server/worlds/lobby.polar b/server/worlds/lobby.polar new file mode 100644 index 0000000..819f7a4 Binary files /dev/null and b/server/worlds/lobby.polar differ diff --git a/src/main/java/dev/cfox/gamejam/Server.java b/src/main/java/dev/cfox/gamejam/Server.java index 12b3bc7..9502cfa 100644 --- a/src/main/java/dev/cfox/gamejam/Server.java +++ b/src/main/java/dev/cfox/gamejam/Server.java @@ -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()); + } } \ No newline at end of file diff --git a/src/main/java/dev/cfox/gamejam/game/classes/GameLobby.java b/src/main/java/dev/cfox/gamejam/game/classes/GameLobby.java index 3de5a18..72c8413 100644 --- a/src/main/java/dev/cfox/gamejam/game/classes/GameLobby.java +++ b/src/main/java/dev/cfox/gamejam/game/classes/GameLobby.java @@ -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 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 getAllPlayers() { - return players; - } - public ArrayList getPlayers() { - ArrayList playersInGame = new ArrayList<>(players); - playersInGame.removeIf(uuid -> getEliminated().contains(uuid)); - return playersInGame; + return players; } public ArrayList 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; + } } diff --git a/src/main/java/dev/cfox/gamejam/game/commands/QueueCommand.java b/src/main/java/dev/cfox/gamejam/game/commands/QueueCommand.java index 936207b..0555632 100644 --- a/src/main/java/dev/cfox/gamejam/game/commands/QueueCommand.java +++ b/src/main/java/dev/cfox/gamejam/game/commands/QueueCommand.java @@ -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")); diff --git a/src/main/java/dev/cfox/gamejam/game/managers/ConversionManager.java b/src/main/java/dev/cfox/gamejam/game/managers/ConversionManager.java new file mode 100644 index 0000000..497182e --- /dev/null +++ b/src/main/java/dev/cfox/gamejam/game/managers/ConversionManager.java @@ -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()); + } +} diff --git a/src/main/java/dev/cfox/gamejam/game/managers/GameManager.java b/src/main/java/dev/cfox/gamejam/game/managers/GameManager.java index ee6436a..12eacba 100644 --- a/src/main/java/dev/cfox/gamejam/game/managers/GameManager.java +++ b/src/main/java/dev/cfox/gamejam/game/managers/GameManager.java @@ -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 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) { diff --git a/src/main/java/dev/cfox/gamejam/game/managers/QueueManager.java b/src/main/java/dev/cfox/gamejam/game/managers/QueueManager.java index f026332..a25e1b6 100644 --- a/src/main/java/dev/cfox/gamejam/game/managers/QueueManager.java +++ b/src/main/java/dev/cfox/gamejam/game/managers/QueueManager.java @@ -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 queues = new ArrayList<>(); private static final HashMap 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); } } diff --git a/src/main/java/dev/cfox/gamejam/game/phases/PhaseLogic.java b/src/main/java/dev/cfox/gamejam/game/phases/PhaseLogic.java index 8e79a49..ae10140 100644 --- a/src/main/java/dev/cfox/gamejam/game/phases/PhaseLogic.java +++ b/src/main/java/dev/cfox/gamejam/game/phases/PhaseLogic.java @@ -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 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 } } diff --git a/src/main/java/dev/cfox/gamejam/utils/Misc.java b/src/main/java/dev/cfox/gamejam/utils/Misc.java index d0aee0e..c471a05 100644 --- a/src/main/java/dev/cfox/gamejam/utils/Misc.java +++ b/src/main/java/dev/cfox/gamejam/utils/Misc.java @@ -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); + } + } + } + } + } } diff --git a/src/main/java/dev/cfox/gamejam/utils/classes/NPC.java b/src/main/java/dev/cfox/gamejam/utils/classes/NPC.java index 2549dd2..9dde142 100644 --- a/src/main/java/dev/cfox/gamejam/utils/classes/NPC.java +++ b/src/main/java/dev/cfox/gamejam/utils/classes/NPC.java @@ -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; diff --git a/src/main/java/dev/cfox/gamejam/utils/conversion/Polar.java b/src/main/java/dev/cfox/gamejam/utils/conversion/Polar.java deleted file mode 100644 index 82f60de..0000000 --- a/src/main/java/dev/cfox/gamejam/utils/conversion/Polar.java +++ /dev/null @@ -1,7 +0,0 @@ -package dev.cfox.gamejam.utils.conversion; - -public class Polar { - public static void convertFolder(String folder) { - - } -} diff --git a/src/main/java/dev/cfox/gamejam/utils/events/MiscEvents.java b/src/main/java/dev/cfox/gamejam/utils/events/MiscEvents.java index cc21ec0..1881471 100644 --- a/src/main/java/dev/cfox/gamejam/utils/events/MiscEvents.java +++ b/src/main/java/dev/cfox/gamejam/utils/events/MiscEvents.java @@ -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); + } + } }); } } diff --git a/src/main/java/dev/cfox/gamejam/utils/events/StartEvents.java b/src/main/java/dev/cfox/gamejam/utils/events/StartEvents.java index 5674062..0124f1a 100644 --- a/src/main/java/dev/cfox/gamejam/utils/events/StartEvents.java +++ b/src/main/java/dev/cfox/gamejam/utils/events/StartEvents.java @@ -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; }