From 90ddb82640866800235e0c634b76e86d39c2091a Mon Sep 17 00:00:00 2001 From: Andus Date: Tue, 13 Aug 2024 17:51:38 +0200 Subject: [PATCH] Added: - SnowballProjectile - ZombieCreature - About (us/game) command - Credits command - Stop command - Terminal All Color phases are now working --- .idea/inspectionProfiles/Project_Default.xml | 10 + build.gradle.kts | 10 +- .../spectrumsurvival}/Server.java | 17 +- .../game/classes/GameLobby.java | 19 +- .../game/classes/GameQueue.java | 10 +- .../game/classes/SnowballProjectile.java | 11 + .../game/classes/ZombieCreature.java | 31 ++ .../game/commands/AboutCommand.java | 43 ++ .../game/commands/CreditsCommand.java | 39 ++ .../game/commands/QueueCommand.java | 38 ++ .../game/commands/StopCommand.java | 18 + .../game/commands/Terminal.java | 84 ++++ .../game/managers/ConversionManager.java | 15 +- .../game/managers/GameManager.java | 17 +- .../game/managers/QueueManager.java | 40 +- .../spectrumsurvival}/game/phases/Phase.java | 4 +- .../game/phases/PhaseLogic.java | 400 ++++++++++++++++++ .../spectrumsurvival/utils/Misc.java | 81 ++++ .../spectrumsurvival}/utils/classes/NPC.java | 2 +- .../utils/classes/Randomized.java | 2 +- .../utils/config/Checks.java | 2 +- .../utils/config/Configuration.java | 2 +- .../utils/config/Settings.java | 2 +- .../utils/events/MiscEvents.java | 177 ++++++++ .../utils/events/StartEvents.java | 19 +- .../gamejam/game/commands/QueueCommand.java | 34 -- .../cfox/gamejam/game/phases/PhaseLogic.java | 108 ----- .../java/dev/cfox/gamejam/utils/Misc.java | 44 -- .../cfox/gamejam/utils/events/MiscEvents.java | 45 -- 29 files changed, 1024 insertions(+), 300 deletions(-) create mode 100644 .idea/inspectionProfiles/Project_Default.xml rename src/main/java/dev/{cfox/gamejam => celestialfox/spectrumsurvival}/Server.java (69%) rename src/main/java/dev/{cfox/gamejam => celestialfox/spectrumsurvival}/game/classes/GameLobby.java (87%) rename src/main/java/dev/{cfox/gamejam => celestialfox/spectrumsurvival}/game/classes/GameQueue.java (82%) create mode 100644 src/main/java/dev/celestialfox/spectrumsurvival/game/classes/SnowballProjectile.java create mode 100644 src/main/java/dev/celestialfox/spectrumsurvival/game/classes/ZombieCreature.java create mode 100644 src/main/java/dev/celestialfox/spectrumsurvival/game/commands/AboutCommand.java create mode 100644 src/main/java/dev/celestialfox/spectrumsurvival/game/commands/CreditsCommand.java create mode 100644 src/main/java/dev/celestialfox/spectrumsurvival/game/commands/QueueCommand.java create mode 100644 src/main/java/dev/celestialfox/spectrumsurvival/game/commands/StopCommand.java create mode 100644 src/main/java/dev/celestialfox/spectrumsurvival/game/commands/Terminal.java rename src/main/java/dev/{cfox/gamejam => celestialfox/spectrumsurvival}/game/managers/ConversionManager.java (67%) rename src/main/java/dev/{cfox/gamejam => celestialfox/spectrumsurvival}/game/managers/GameManager.java (83%) rename src/main/java/dev/{cfox/gamejam => celestialfox/spectrumsurvival}/game/managers/QueueManager.java (72%) rename src/main/java/dev/{cfox/gamejam => celestialfox/spectrumsurvival}/game/phases/Phase.java (50%) create mode 100644 src/main/java/dev/celestialfox/spectrumsurvival/game/phases/PhaseLogic.java create mode 100644 src/main/java/dev/celestialfox/spectrumsurvival/utils/Misc.java rename src/main/java/dev/{cfox/gamejam => celestialfox/spectrumsurvival}/utils/classes/NPC.java (97%) rename src/main/java/dev/{cfox/gamejam => celestialfox/spectrumsurvival}/utils/classes/Randomized.java (93%) rename src/main/java/dev/{cfox/gamejam => celestialfox/spectrumsurvival}/utils/config/Checks.java (91%) rename src/main/java/dev/{cfox/gamejam => celestialfox/spectrumsurvival}/utils/config/Configuration.java (96%) rename src/main/java/dev/{cfox/gamejam => celestialfox/spectrumsurvival}/utils/config/Settings.java (78%) create mode 100644 src/main/java/dev/celestialfox/spectrumsurvival/utils/events/MiscEvents.java rename src/main/java/dev/{cfox/gamejam => celestialfox/spectrumsurvival}/utils/events/StartEvents.java (87%) delete mode 100644 src/main/java/dev/cfox/gamejam/game/commands/QueueCommand.java delete mode 100644 src/main/java/dev/cfox/gamejam/game/phases/PhaseLogic.java delete mode 100644 src/main/java/dev/cfox/gamejam/utils/Misc.java delete mode 100644 src/main/java/dev/cfox/gamejam/utils/events/MiscEvents.java diff --git a/.idea/inspectionProfiles/Project_Default.xml b/.idea/inspectionProfiles/Project_Default.xml new file mode 100644 index 0000000..6f67cf7 --- /dev/null +++ b/.idea/inspectionProfiles/Project_Default.xml @@ -0,0 +1,10 @@ + + + + \ No newline at end of file diff --git a/build.gradle.kts b/build.gradle.kts index 7a2464f..837ffa1 100644 --- a/build.gradle.kts +++ b/build.gradle.kts @@ -3,7 +3,13 @@ plugins { alias(libs.plugins.shadowJar) } -group = "dev.celestialfox" +tasks.withType { + manifest { + attributes["Main-Class"] = "dev.celestialfox.spectrumsurvival.Server" + } +} + +group = "dev.celestialfox.spectrumsurvival" version = "1.0" repositories { @@ -15,6 +21,8 @@ dependencies { implementation("dev.hollowcube:polar:1.11.1") implementation("net.kyori:adventure-text-minimessage:4.17.0") implementation("org.slf4j:slf4j-api:2.0.13") + implementation("org.jline:jline-terminal:3.26.3") + implementation("org.jline:jline-reader:3.26.3") implementation("ch.qos.logback:logback-classic:1.5.6") testImplementation(platform("org.junit:junit-bom:5.9.1")) testImplementation("org.junit.jupiter:junit-jupiter") diff --git a/src/main/java/dev/cfox/gamejam/Server.java b/src/main/java/dev/celestialfox/spectrumsurvival/Server.java similarity index 69% rename from src/main/java/dev/cfox/gamejam/Server.java rename to src/main/java/dev/celestialfox/spectrumsurvival/Server.java index 9502cfa..65ff659 100644 --- a/src/main/java/dev/cfox/gamejam/Server.java +++ b/src/main/java/dev/celestialfox/spectrumsurvival/Server.java @@ -1,10 +1,10 @@ -package dev.cfox.gamejam; +package dev.celestialfox.spectrumsurvival; -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 dev.celestialfox.spectrumsurvival.game.commands.*; +import dev.celestialfox.spectrumsurvival.utils.config.Checks; +import dev.celestialfox.spectrumsurvival.utils.config.Settings; +import dev.celestialfox.spectrumsurvival.utils.events.MiscEvents; +import dev.celestialfox.spectrumsurvival.utils.events.StartEvents; import net.minestom.server.MinecraftServer; import net.minestom.server.command.CommandManager; import org.slf4j.Logger; @@ -32,6 +32,8 @@ public class Server { MiscEvents.register(); registerCommands(); + Terminal.start(); + // Server Start server.start(Settings.getIP(), Settings.getPort()); logger.info("Server Started at " + Settings.getIP() + ":" + Settings.getPort() + " (MC: " + MinecraftServer.VERSION_NAME + ")"); @@ -40,5 +42,8 @@ public class Server { public static void registerCommands() { CommandManager commandManager = MinecraftServer.getCommandManager(); commandManager.register(new QueueCommand()); + commandManager.register(new AboutCommand()); + commandManager.register(new CreditsCommand()); + commandManager.register(new StopCommand()); } } \ No newline at end of file diff --git a/src/main/java/dev/cfox/gamejam/game/classes/GameLobby.java b/src/main/java/dev/celestialfox/spectrumsurvival/game/classes/GameLobby.java similarity index 87% rename from src/main/java/dev/cfox/gamejam/game/classes/GameLobby.java rename to src/main/java/dev/celestialfox/spectrumsurvival/game/classes/GameLobby.java index 72c8413..3d149da 100644 --- a/src/main/java/dev/cfox/gamejam/game/classes/GameLobby.java +++ b/src/main/java/dev/celestialfox/spectrumsurvival/game/classes/GameLobby.java @@ -1,10 +1,9 @@ -package dev.cfox.gamejam.game.classes; +package dev.celestialfox.spectrumsurvival.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 dev.celestialfox.spectrumsurvival.game.managers.GameManager; +import dev.celestialfox.spectrumsurvival.game.phases.Phase; +import dev.celestialfox.spectrumsurvival.utils.Misc; +import dev.celestialfox.spectrumsurvival.utils.classes.Randomized; import net.kyori.adventure.sound.Sound; import net.kyori.adventure.text.Component; import net.kyori.adventure.text.format.NamedTextColor; @@ -87,10 +86,16 @@ public class GameLobby { } } + public void setInstance(Instance instance) { + this.instance = instance; + players.forEach(uuid -> + Misc.getPlayer(uuid).setInstance(instance)); + } + public void setInstance(Instance instance, Pos pos) { this.instance = instance; players.forEach(uuid -> - Misc.getPlayer(uuid).setInstance(instance).thenRun(() -> Misc.getPlayer(uuid).teleport(pos))); + Misc.getPlayer(uuid).setInstance(instance, pos)); } public Instance getInstance() { return instance; diff --git a/src/main/java/dev/cfox/gamejam/game/classes/GameQueue.java b/src/main/java/dev/celestialfox/spectrumsurvival/game/classes/GameQueue.java similarity index 82% rename from src/main/java/dev/cfox/gamejam/game/classes/GameQueue.java rename to src/main/java/dev/celestialfox/spectrumsurvival/game/classes/GameQueue.java index 862faa2..683abfa 100644 --- a/src/main/java/dev/cfox/gamejam/game/classes/GameQueue.java +++ b/src/main/java/dev/celestialfox/spectrumsurvival/game/classes/GameQueue.java @@ -1,14 +1,12 @@ -package dev.cfox.gamejam.game.classes; +package dev.celestialfox.spectrumsurvival.game.classes; -import dev.cfox.gamejam.game.managers.QueueManager; -import dev.cfox.gamejam.utils.Misc; +import dev.celestialfox.spectrumsurvival.game.managers.QueueManager; +import dev.celestialfox.spectrumsurvival.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.GameMode; import java.util.ArrayList; -import java.util.Objects; import java.util.UUID; public class GameQueue { @@ -27,7 +25,7 @@ public class GameQueue { public void removePlayer(UUID uuid) { if (players.contains(uuid)) { players.remove(uuid); - Misc.getPlayer(uuid).setGameMode(GameMode.SURVIVAL); + Misc.getPlayer(uuid).setGameMode(GameMode.ADVENTURE); Misc.getPlayer(uuid).sendMessage(Component.text("You have left the queue", NamedTextColor.RED)); } } diff --git a/src/main/java/dev/celestialfox/spectrumsurvival/game/classes/SnowballProjectile.java b/src/main/java/dev/celestialfox/spectrumsurvival/game/classes/SnowballProjectile.java new file mode 100644 index 0000000..3b23940 --- /dev/null +++ b/src/main/java/dev/celestialfox/spectrumsurvival/game/classes/SnowballProjectile.java @@ -0,0 +1,11 @@ +package dev.celestialfox.spectrumsurvival.game.classes; + +import net.minestom.server.entity.Entity; +import net.minestom.server.entity.EntityType; +import net.minestom.server.entity.PlayerProjectile; + +public class SnowballProjectile extends PlayerProjectile { + public SnowballProjectile(Entity shooter) { + super(shooter, EntityType.SNOWBALL); + } +} diff --git a/src/main/java/dev/celestialfox/spectrumsurvival/game/classes/ZombieCreature.java b/src/main/java/dev/celestialfox/spectrumsurvival/game/classes/ZombieCreature.java new file mode 100644 index 0000000..fc89bb7 --- /dev/null +++ b/src/main/java/dev/celestialfox/spectrumsurvival/game/classes/ZombieCreature.java @@ -0,0 +1,31 @@ +package dev.celestialfox.spectrumsurvival.game.classes; + +import net.minestom.server.entity.EntityCreature; +import net.minestom.server.entity.EntityType; +import net.minestom.server.entity.GameMode; +import net.minestom.server.entity.Player; +import net.minestom.server.entity.ai.goal.MeleeAttackGoal; +import net.minestom.server.entity.ai.target.ClosestEntityTarget; +import net.minestom.server.entity.attribute.Attribute; +import net.minestom.server.utils.time.TimeUnit; + +import java.util.List; + +public class ZombieCreature extends EntityCreature { + + public ZombieCreature() { + super(EntityType.ZOMBIE); + + getAttribute(Attribute.GENERIC_MOVEMENT_SPEED).setBaseValue(0.15); + + addAIGroup( + List.of( + new MeleeAttackGoal(this, 1.6, 20, TimeUnit.SERVER_TICK) // Attack the target + ), + List.of( + new ClosestEntityTarget(this, 50, + entity -> entity instanceof Player && ((Player) entity).getGameMode() != GameMode.SPECTATOR) // Target the nearest player + ) + ); + } +} \ No newline at end of file diff --git a/src/main/java/dev/celestialfox/spectrumsurvival/game/commands/AboutCommand.java b/src/main/java/dev/celestialfox/spectrumsurvival/game/commands/AboutCommand.java new file mode 100644 index 0000000..a58454b --- /dev/null +++ b/src/main/java/dev/celestialfox/spectrumsurvival/game/commands/AboutCommand.java @@ -0,0 +1,43 @@ +package dev.celestialfox.spectrumsurvival.game.commands; + +import dev.celestialfox.spectrumsurvival.game.managers.GameManager; +import dev.celestialfox.spectrumsurvival.game.managers.QueueManager; +import net.kyori.adventure.text.Component; +import net.kyori.adventure.text.event.ClickEvent; +import net.kyori.adventure.text.format.NamedTextColor; +import net.kyori.adventure.text.format.TextDecoration; +import net.minestom.server.command.builder.Command; +import net.minestom.server.command.builder.arguments.ArgumentType; +import net.minestom.server.entity.Player; + +public class AboutCommand extends Command { + public AboutCommand() { + super("about"); + addSyntax(((sender, context) -> { + final String arg1 = context.get("arg1"); + if (sender instanceof Player player) { + if (arg1.equals("us")) { + player.sendMessage( + Component.text("\n§lAbout CelestialFox Studio\n", NamedTextColor.GOLD) + .append(Component.text("We are a passionate indie game studio creating unique experiences.\n", NamedTextColor.YELLOW)) + .append(Component.text("Want to know more? Check our website: ", NamedTextColor.YELLOW)) + .append(Component.text("https://celestial-fox.com/", NamedTextColor.LIGHT_PURPLE, TextDecoration.UNDERLINED) + .clickEvent(ClickEvent.openUrl("https://celestial-fox.com/"))) + ); + } else if (arg1.equals("game")) { + player.sendMessage( + Component.text("\n§lAbout Spectrum Survival\n", NamedTextColor.DARK_AQUA) + .append(Component.text("Dive into Spectrum Survival, where each color phase brings a new challenge! Every 30 seconds, the color changes, creating a chaotic 3-minute survival test.\n\n", NamedTextColor.AQUA)) + .append(Component.text("§lColor Phases:\n", NamedTextColor.LIGHT_PURPLE)) + .append(Component.text("- §lRed: §cFlames spread across the map. Avoid getting burned!\n", NamedTextColor.RED)) + .append(Component.text("- §lBlue: §9Snowball fight frenzy! Knock back your foes.\n", NamedTextColor.BLUE)) + .append(Component.text("- §lGreen: §aWatch out for wither roses and zombies. Roses hurt, zombies eliminate instantly.\n", NamedTextColor.GREEN)) + .append(Component.text("- §lYellow: §eDodge lightning or be struck! §8§o(You can punch players into the lightning)\n", NamedTextColor.YELLOW)) + .append(Component.text("- §lGray: §7Darkness falls, pvp enabled. Fight to survive!\n", NamedTextColor.GRAY)) + .append(Component.text("\nSurvive all phases and adapt to win! Good luck!", NamedTextColor.AQUA)) + ); + } + } + }), ArgumentType.String("arg1")); + } +} diff --git a/src/main/java/dev/celestialfox/spectrumsurvival/game/commands/CreditsCommand.java b/src/main/java/dev/celestialfox/spectrumsurvival/game/commands/CreditsCommand.java new file mode 100644 index 0000000..5a8772d --- /dev/null +++ b/src/main/java/dev/celestialfox/spectrumsurvival/game/commands/CreditsCommand.java @@ -0,0 +1,39 @@ +package dev.celestialfox.spectrumsurvival.game.commands; + +import net.kyori.adventure.text.Component; +import net.kyori.adventure.text.ComponentBuilder; +import net.kyori.adventure.text.TextComponent; +import net.kyori.adventure.text.format.NamedTextColor; +import net.minestom.server.command.builder.Command; +import net.minestom.server.entity.Player; + +import java.util.ArrayList; +import java.util.Collections; +import java.util.List; + +public class CreditsCommand extends Command { + public CreditsCommand() { + super("credits"); + addSyntax(((sender, context) -> { + if (sender instanceof Player player) { + player.sendMessage(generateCredits()); + } + })); + } + + private static Component generateCredits() { + ComponentBuilder messageBuilder = Component.text().content("\n§lCredits\n").color(NamedTextColor.GOLD); + + messageBuilder.append(Component.text("- §lDeveloper: §eAndus\n", NamedTextColor.YELLOW)); + messageBuilder.append(Component.text("- §lIdeas: §7" + randomizeNames(List.of("Andus", "LucePric", "xnlx0000")) + "\n", NamedTextColor.GRAY)); + messageBuilder.append(Component.text("- §lMaps: §e" + randomizeNames(List.of("LucePric", "Bali__0", "GummyW0rm", "xnlx0000")) + "\n", NamedTextColor.YELLOW)); + + return messageBuilder.build(); + } + + private static String randomizeNames(List names) { + List shuffledNames = new ArrayList<>(names); + Collections.shuffle(shuffledNames); + return String.join(", ", shuffledNames); + } +} diff --git a/src/main/java/dev/celestialfox/spectrumsurvival/game/commands/QueueCommand.java b/src/main/java/dev/celestialfox/spectrumsurvival/game/commands/QueueCommand.java new file mode 100644 index 0000000..81904ab --- /dev/null +++ b/src/main/java/dev/celestialfox/spectrumsurvival/game/commands/QueueCommand.java @@ -0,0 +1,38 @@ +package dev.celestialfox.spectrumsurvival.game.commands; + +import dev.celestialfox.spectrumsurvival.game.managers.GameManager; +import dev.celestialfox.spectrumsurvival.game.managers.QueueManager; +import net.kyori.adventure.text.Component; +import net.kyori.adventure.text.format.NamedTextColor; +import net.minestom.server.command.builder.Command; +import net.minestom.server.command.builder.arguments.ArgumentType; +import net.minestom.server.entity.GameMode; +import net.minestom.server.entity.Player; +import net.minestom.server.item.ItemStack; +import net.minestom.server.item.Material; +import net.minestom.server.potion.Potion; +import net.minestom.server.potion.PotionEffect; + +public class QueueCommand extends Command { + public QueueCommand() { + super("queue", "q"); + addSyntax(((sender, context) -> { + final String arg1 = context.get("arg1"); + if (sender instanceof Player player) { + if (arg1.equals("join")) { + QueueManager.joinPlayer(player); + } else if (arg1.equals("leave")) { + QueueManager.removePlayer(player); + } else if (arg1.equals("force")) { + if (QueueManager.getPlayerQueue(player) != null) { + GameManager.startGame(QueueManager.getPlayerQueue(player)); + } else { + player.sendMessage(Component.text("You're not in a queue!", NamedTextColor.RED)); + } + } else if (arg1.equals("a")) { + player.getInventory().addItemStack(ItemStack.of(Material.SNOWBALL, 16)); + } + } + }), ArgumentType.String("arg1")); + } +} diff --git a/src/main/java/dev/celestialfox/spectrumsurvival/game/commands/StopCommand.java b/src/main/java/dev/celestialfox/spectrumsurvival/game/commands/StopCommand.java new file mode 100644 index 0000000..0c0411b --- /dev/null +++ b/src/main/java/dev/celestialfox/spectrumsurvival/game/commands/StopCommand.java @@ -0,0 +1,18 @@ +package dev.celestialfox.spectrumsurvival.game.commands; + +import net.minestom.server.MinecraftServer; +import net.minestom.server.command.builder.Command; +import net.minestom.server.entity.Player; + +public class StopCommand extends Command { + public StopCommand() { + super("stop"); + addSyntax(((sender, context) -> { + if (sender instanceof Player player) { + player.sendMessage("No."); + } else { + MinecraftServer.stopCleanly(); + } + })); + } +} diff --git a/src/main/java/dev/celestialfox/spectrumsurvival/game/commands/Terminal.java b/src/main/java/dev/celestialfox/spectrumsurvival/game/commands/Terminal.java new file mode 100644 index 0000000..e260b10 --- /dev/null +++ b/src/main/java/dev/celestialfox/spectrumsurvival/game/commands/Terminal.java @@ -0,0 +1,84 @@ +package dev.celestialfox.spectrumsurvival.game.commands; + +import dev.celestialfox.spectrumsurvival.Server; +import net.minestom.server.MinecraftServer; +import net.minestom.server.command.builder.Command; +import net.minestom.server.command.builder.suggestion.Suggestion; +import net.minestom.server.command.builder.suggestion.SuggestionEntry; +import net.minestom.server.listener.TabCompleteListener; +import org.jetbrains.annotations.ApiStatus; +import org.jline.reader.*; +import org.jline.terminal.TerminalBuilder; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +import java.io.IOException; +import java.util.List; + +public class Terminal { + private static final String PROMPT = "> "; + private static volatile org.jline.terminal.Terminal terminal; + static volatile LineReader reader; + private static volatile boolean running = false; + private static final Logger logger = LoggerFactory.getLogger(Terminal.class); + + @ApiStatus.Internal + public static void start() { + final Thread thread = new Thread(null, () -> { + try { + terminal = TerminalBuilder.terminal(); + } catch (IOException e) { + logger.error(e.getMessage()); + } + reader = LineReaderBuilder.builder() + .completer(new MinestomCompleter()) + .terminal(terminal) + .build(); + running = true; + + while (running) { + String command; + try { + command = reader.readLine(PROMPT); + var commandManager = MinecraftServer.getCommandManager(); + commandManager.execute(commandManager.getConsoleSender(), command); + } catch (UserInterruptException e) { + // Handle Ctrl + C + System.exit(0); + return; + } catch (EndOfFileException e) { + return; + } + } + }, "Jline"); + thread.setDaemon(true); + thread.start(); + } + + private static final class MinestomCompleter implements Completer { + @Override + public void complete(LineReader reader, ParsedLine line, List candidates) { + final var commandManager = MinecraftServer.getCommandManager(); + final var consoleSender = commandManager.getConsoleSender(); + if (line.wordIndex() == 0) { + final String commandString = line.word().toLowerCase(); + candidates.addAll( + commandManager.getDispatcher().getCommands().stream() + .map(Command::getName) + .filter(name -> commandString.isBlank() || name.toLowerCase().startsWith(commandString)) + .map(Candidate::new) + .toList() + ); + } else { + final String text = line.line(); + final Suggestion suggestion = TabCompleteListener.getSuggestion(consoleSender, text); + if (suggestion != null) { + suggestion.getEntries().stream() + .map(SuggestionEntry::getEntry) + .map(Candidate::new) + .forEach(candidates::add); + } + } + } + } +} \ No newline at end of file diff --git a/src/main/java/dev/cfox/gamejam/game/managers/ConversionManager.java b/src/main/java/dev/celestialfox/spectrumsurvival/game/managers/ConversionManager.java similarity index 67% rename from src/main/java/dev/cfox/gamejam/game/managers/ConversionManager.java rename to src/main/java/dev/celestialfox/spectrumsurvival/game/managers/ConversionManager.java index 497182e..5f2756b 100644 --- a/src/main/java/dev/cfox/gamejam/game/managers/ConversionManager.java +++ b/src/main/java/dev/celestialfox/spectrumsurvival/game/managers/ConversionManager.java @@ -1,10 +1,12 @@ -package dev.cfox.gamejam.game.managers; +package dev.celestialfox.spectrumsurvival.game.managers; -import dev.cfox.gamejam.game.classes.GameLobby; -import dev.cfox.gamejam.game.classes.GameQueue; +import dev.celestialfox.spectrumsurvival.game.classes.GameLobby; +import dev.celestialfox.spectrumsurvival.game.classes.GameQueue; +import dev.celestialfox.spectrumsurvival.utils.Misc; import net.kyori.adventure.text.Component; import net.kyori.adventure.text.format.NamedTextColor; import net.minestom.server.coordinate.Pos; +import net.minestom.server.entity.GameMode; import org.slf4j.Logger; import org.slf4j.LoggerFactory; @@ -27,7 +29,12 @@ public class ConversionManager { 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)); + game.setInstance(QueueManager.lobbyInstance, new Pos(0, 66, 0, 180, 0)); + game.getPlayers().forEach(uuid -> { + Misc.getPlayer(uuid).setGameMode(GameMode.ADVENTURE); + Misc.getPlayer(uuid).setHealth(20); + }); + GameManager.sendEndTitles(game); GameManager.gameLobbies.remove(game.getName()); } } diff --git a/src/main/java/dev/cfox/gamejam/game/managers/GameManager.java b/src/main/java/dev/celestialfox/spectrumsurvival/game/managers/GameManager.java similarity index 83% rename from src/main/java/dev/cfox/gamejam/game/managers/GameManager.java rename to src/main/java/dev/celestialfox/spectrumsurvival/game/managers/GameManager.java index 12eacba..8dd5304 100644 --- a/src/main/java/dev/cfox/gamejam/game/managers/GameManager.java +++ b/src/main/java/dev/celestialfox/spectrumsurvival/game/managers/GameManager.java @@ -1,10 +1,9 @@ -package dev.cfox.gamejam.game.managers; +package dev.celestialfox.spectrumsurvival.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 dev.celestialfox.spectrumsurvival.game.phases.PhaseLogic; +import dev.celestialfox.spectrumsurvival.utils.Misc; +import dev.celestialfox.spectrumsurvival.game.classes.GameLobby; +import dev.celestialfox.spectrumsurvival.game.classes.GameQueue; import net.hollowcube.polar.PolarLoader; import net.kyori.adventure.text.Component; import net.kyori.adventure.text.format.NamedTextColor; @@ -60,7 +59,7 @@ public class GameManager { } public static void startGame(GameLobby game) { - logger.debug("Creating Lobby Instance"); + logger.debug("Creating Game Instance"); InstanceManager instanceManager = MinecraftServer.getInstanceManager(); InstanceContainer instanceContainer = instanceManager.createInstanceContainer(); try { @@ -83,10 +82,10 @@ public class GameManager { for (Player player : instance.getPlayers()) { if (eliminated.contains(player.getUuid())) { - player.showTitle(Title.title(Component.text("Eliminated!", NamedTextColor.RED, TextDecoration.BOLD), Component.text(""))); + player.showTitle(Title.title(Component.text("You Lost.", NamedTextColor.RED, TextDecoration.BOLD), Component.text(""))); } else { // Player is a winner if they were not eliminated - player.showTitle(Title.title(Component.text("Qualified!", NamedTextColor.GREEN, TextDecoration.BOLD), Component.text(""))); + player.showTitle(Title.title(Component.text("You Win!", NamedTextColor.GREEN, TextDecoration.BOLD), Component.text(""))); winners.add(player.getUsername()); } } diff --git a/src/main/java/dev/cfox/gamejam/game/managers/QueueManager.java b/src/main/java/dev/celestialfox/spectrumsurvival/game/managers/QueueManager.java similarity index 72% rename from src/main/java/dev/cfox/gamejam/game/managers/QueueManager.java rename to src/main/java/dev/celestialfox/spectrumsurvival/game/managers/QueueManager.java index a25e1b6..11c1559 100644 --- a/src/main/java/dev/cfox/gamejam/game/managers/QueueManager.java +++ b/src/main/java/dev/celestialfox/spectrumsurvival/game/managers/QueueManager.java @@ -1,7 +1,7 @@ -package dev.cfox.gamejam.game.managers; +package dev.celestialfox.spectrumsurvival.game.managers; -import dev.cfox.gamejam.game.classes.GameQueue; -import dev.cfox.gamejam.utils.Misc; +import dev.celestialfox.spectrumsurvival.utils.Misc; +import dev.celestialfox.spectrumsurvival.game.classes.GameQueue; import net.kyori.adventure.text.Component; import net.kyori.adventure.text.format.NamedTextColor; import net.kyori.adventure.title.Title; @@ -23,28 +23,30 @@ public class QueueManager { public static Instance lobbyInstance; public static void joinPlayer(Player player) { - boolean queueFound = false; + if (!GameManager.isPlayerInGame(player)) { + boolean queueFound = false; - if (!queues.isEmpty()) { - for (GameQueue queue : queues) { - if (queue.getPlayers().size() < maxPlayers) { - queue.addPlayer(player.getUuid()); - queueFound = true; - if (queue.getPlayers().size() >= minPlayers) { - startCountdown(queue); + if (!queues.isEmpty()) { + for (GameQueue queue : queues) { + if (queue.getPlayers().size() < maxPlayers) { + queue.addPlayer(player.getUuid()); + queueFound = true; + if (queue.getPlayers().size() >= minPlayers) { + startCountdown(queue); + } + break; } - break; } } - } - if (!queueFound) { - createQueue(player); - } + if (!queueFound) { + createQueue(player); + } - 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)); + 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) { diff --git a/src/main/java/dev/cfox/gamejam/game/phases/Phase.java b/src/main/java/dev/celestialfox/spectrumsurvival/game/phases/Phase.java similarity index 50% rename from src/main/java/dev/cfox/gamejam/game/phases/Phase.java rename to src/main/java/dev/celestialfox/spectrumsurvival/game/phases/Phase.java index cb451b0..e43b1ec 100644 --- a/src/main/java/dev/cfox/gamejam/game/phases/Phase.java +++ b/src/main/java/dev/celestialfox/spectrumsurvival/game/phases/Phase.java @@ -1,9 +1,9 @@ -package dev.cfox.gamejam.game.phases; +package dev.celestialfox.spectrumsurvival.game.phases; public enum Phase { RED, BLUE, GREEN, YELLOW, - PURPLE; + GRAY; } diff --git a/src/main/java/dev/celestialfox/spectrumsurvival/game/phases/PhaseLogic.java b/src/main/java/dev/celestialfox/spectrumsurvival/game/phases/PhaseLogic.java new file mode 100644 index 0000000..dd9f110 --- /dev/null +++ b/src/main/java/dev/celestialfox/spectrumsurvival/game/phases/PhaseLogic.java @@ -0,0 +1,400 @@ +package dev.celestialfox.spectrumsurvival.game.phases; + +import dev.celestialfox.spectrumsurvival.game.classes.ZombieCreature; +import dev.celestialfox.spectrumsurvival.utils.Misc; +import dev.celestialfox.spectrumsurvival.game.classes.GameLobby; +import dev.celestialfox.spectrumsurvival.game.managers.ConversionManager; +import net.hollowcube.polar.PolarLoader; +import net.kyori.adventure.text.Component; +import net.kyori.adventure.text.format.NamedTextColor; +import net.minestom.server.MinecraftServer; +import net.minestom.server.coordinate.Pos; +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.instance.InstanceContainer; +import net.minestom.server.instance.InstanceManager; +import net.minestom.server.instance.Weather; +import net.minestom.server.instance.block.Block; +import net.minestom.server.item.ItemStack; +import net.minestom.server.item.Material; +import net.minestom.server.potion.Potion; +import net.minestom.server.potion.PotionEffect; +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.io.IOException; +import java.nio.file.Path; +import java.time.Duration; +import java.util.*; + +public class PhaseLogic { + private static final Logger logger = LoggerFactory.getLogger(PhaseLogic.class); + private static final SchedulerManager scheduler = MinecraftServer.getSchedulerManager(); + private static final int phaseDuration = 20; // in seconds + private static final int gameTime = 180; // 3 minutes in seconds + private static Task repeatTask; + private static Task endTask; + + private static final int zombiesSpawn = 5; + + public static void random(GameLobby game) { + if (repeatTask != null) { + repeatTask.cancel(); + } + + repeatTask = scheduler.buildTask(() -> { + // Check if all players are eliminated + if (game.getEliminated().size() == game.getPlayers().size()) { + ConversionManager.fromGame(game); + repeatTask.cancel(); + endTask.cancel(); + } else { + logger.debug("Starting random phase selection for GameLobby: {}", game.getName()); + try { + Phase[] phases = Phase.values(); + Phase selectedPhase; + do { + int randomIndex = new Random().nextInt(phases.length); + selectedPhase = phases[randomIndex]; + } while ( + (selectedPhase == game.getPhase()) + || ((selectedPhase == Phase.GRAY) && (game.getPlayers().size() == game.getEliminated().size()+1))); + game.setPhase(selectedPhase); + + logger.debug("Selected phase: {} for GameLobby: {}", selectedPhase.name(), game.getName()); + 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 GRAY -> gray(game); + } + } catch (Exception e) { + logger.error("Exception occurred during phase execution: {}", e.getMessage()); + } + } + }).repeat(TaskSchedule.seconds(phaseDuration)).schedule(); + + endTask = scheduler.buildTask(() -> { + try { + logger.debug("Ending game for GameLobby: {}", game.getName()); + ConversionManager.fromGame(game); + repeatTask.cancel(); + } catch (Exception e) { + logger.error("Exception occurred during game ending: {}", e.getMessage()); + } + }).delay(TaskSchedule.seconds(gameTime)).schedule(); + } + + public static void red(GameLobby game) { + setupPhase(game, Phase.RED, "New color picked! §cRED", + "Dodge the fire! It does damage to you.", + "Red", NamedTextColor.RED, 13000, Weather.CLEAR); + + // Logic + List positions = new ArrayList<>(); + int minX = -10; + int maxX = 10; + int minZ = -10; + int maxZ = 10; + for (int x = minX; x <= maxX; x++) { + for (int z = minZ; z <= maxZ; z++) { + for (int y = 55; y < 75; y++) { + Pos pos = new Pos(x, y, z); + if (new Random().nextInt(10) < 2) { + if (isFlamableBlock(game.getInstance().getBlock(pos))) { + positions.add(pos); + } + } + } + } + } + + Iterator iterator = positions.iterator(); + Task task; + task = scheduler.buildTask(() -> { + if (iterator.hasNext()) { + Pos pos = iterator.next(); + game.getInstance().setBlock(pos, Block.FIRE); + } + }).repeat(Duration.ofMillis(250)).schedule(); + + scheduler.buildTask(() -> { + task.cancel(); + resetInstance(game); + }).delay(TaskSchedule.seconds(phaseDuration-1)).schedule(); + } + public static void blue(GameLobby game) { + setupPhase(game, Phase.BLUE, "New color picked! §9BLUE", + "Battle it out with snowballs! Knock back and disorient your opponents.", + "Blue", NamedTextColor.BLUE, 1000, Weather.CLEAR); + + // Logic + int minX = -20; + int maxX = 20; + int minZ = -20; + int maxZ = 20; + for (int x = minX; x <= maxX; x++) { + for (int z = minZ; z <= maxZ; z++) { + for (int y = 55; y < 75; y++) { + Pos pos = new Pos(x, y, z); + Block block = game.getInstance().getBlock(pos); + if (block.compare(Block.GRASS_BLOCK) || block.compare(Block.SAND) || block.compare(Block.MOSS_BLOCK)) { + game.getInstance().setBlock(pos, Block.SNOW_BLOCK); + } + if (block.compare(Block.MOSS_CARPET) || block.compare(Block.SHORT_GRASS) || block.compare(Block.TALL_GRASS)) { + game.getInstance().setBlock(pos, Block.AIR); + } + } + } + } + + // Snowball Supply + game.getPlayers().forEach(uuid -> { + Player player = Misc.getPlayer(uuid); + player.getInventory().addItemStack(ItemStack.of(Material.SNOWBALL, 64)); + }); + + // Phase end + scheduler.buildTask(() -> { + game.getPlayers().forEach(uuid -> { + Player player = Misc.getPlayer(uuid); + player.getInventory().clear(); + }); + resetInstance(game); + }).delay(TaskSchedule.seconds(phaseDuration-1)).schedule(); + } + public static void green(GameLobby game) { + setupPhase(game, Phase.GREEN, "New color picked! §aGREEN", + "Avoid wither roses and zombies! Wither roses deal damage, while zombies eliminate players instantly.", + "Green", NamedTextColor.GREEN, 18000, Weather.CLEAR); + + // Logic + scheduler.buildTask(() -> spawnZombies(game)).delay(TaskSchedule.seconds(zombiesSpawn)).schedule(); + + int minX = -20; + int maxX = 20; + int minZ = -20; + int maxZ = 20; + for (int x = minX; x <= maxX; x++) { + for (int z = minZ; z <= maxZ; z++) { + for (int y = 55; y < 75; y++) { + Pos pos = new Pos(x, y, z); + Block block = game.getInstance().getBlock(pos); + if (block.compare(Block.SHORT_GRASS)) { + game.getInstance().setBlock(pos, Block.WITHER_ROSE); + } + } + } + } + } + public static void yellow(GameLobby game) { + setupPhase(game, Phase.YELLOW, "New color picked! §eYELLOW", + "Thunder is coming! Find a place to hide!", + "Yellow", NamedTextColor.YELLOW, 18000, Weather.RAIN); + + // Logic + scheduler.buildTask(() -> { + Task task = scheduler.buildTask(() -> { + List uuids = game.getPlayers(); + List eligiblePlayers = new ArrayList<>(); + + for (UUID uuid : uuids) { + Player player = Misc.getPlayer(uuid); + if (player.getGameMode() == GameMode.ADVENTURE && !isUnderBlock(player)) { + eligiblePlayers.add(player); + } + } + + if (!eligiblePlayers.isEmpty()) { + Random random = new Random(); + Player randomPlayer = eligiblePlayers.get(random.nextInt(eligiblePlayers.size())); + Entity lightning = new Entity(EntityType.LIGHTNING_BOLT); + lightning.setInstance(randomPlayer.getInstance(), randomPlayer.getPosition()); + lightning.spawn(); + game.eliminate(randomPlayer); + } else { + Random random = new Random(); + Player randomPlayer = Misc.getPlayer(uuids.get(random.nextInt(uuids.size()))); + Pos playerPos = randomPlayer.getPosition(); + Pos lightningPos = playerPos.add(random.nextInt(11) - 5, 0, random.nextInt(11) - 5 + ); + + Entity lightning = new Entity(EntityType.LIGHTNING_BOLT); + lightning.setInstance(randomPlayer.getInstance(), lightningPos); + lightning.spawn(); + } + }).repeat(Duration.ofSeconds(5)).schedule(); + game.setTask(task); + }).delay(Duration.ofSeconds(5)).schedule(); + } + public static void gray(GameLobby game) { + setupPhase(game, Phase.GRAY, "New color picked! §8GRAY", + "Darkness everywhere, PvP active. Fight everyone to survive.", + "Gray", NamedTextColor.DARK_GRAY, 18000, Weather.CLEAR); + + // Logic + game.getPlayers().forEach(uuid -> { + if (Misc.getPlayer(uuid).getGameMode() == GameMode.ADVENTURE) { + Misc.getPlayer(uuid).addEffect(new Potion(PotionEffect.DARKNESS, (byte) 1, phaseDuration*20)); + Misc.getPlayer(uuid).addEffect(new Potion(PotionEffect.BLINDNESS, (byte) 1, phaseDuration*20)); + } + }); + scheduler.buildTask(() -> { + startHealthRegeneration(game); + }).delay(TaskSchedule.seconds(phaseDuration)).schedule(); + } + + + public static void setupPhase(GameLobby game, Phase phase, String colorPicked, String desc, + String colorText, NamedTextColor color, int time, Weather weather) { + game.setPhase(phase); + game.sendMessage(Component.text(colorPicked, NamedTextColor.GRAY)); + game.sendMessage(Component.text(desc, color)); + Misc.showTitle(game.getInstance(), Component.text("■", color), Component.text(colorText, color)); + + long currentGameTime = game.getInstance().getTime(); + if (time != currentGameTime) { + Misc.transitionToTime(game, Duration.ofSeconds(2), currentGameTime, time); + } + + game.getInstance().setWeather(weather); + } + + private static boolean isUnderBlock(Player player) { + Pos playerPosition = player.getPosition(); + for (int i = 1; i <= 5; i++) { + Pos posAbove = playerPosition.add(0, i, 0); + Block blockAbove = player.getInstance().getBlock(posAbove); + if (blockAbove.isSolid()) { + return true; + } + } + + return false; + } + + private static void spawnZombies(GameLobby game) { + List spawnLocations = Arrays.asList( + new Pos(8, 65, 15), + new Pos(-15, 67, 7), + new Pos(11, 66, -12), + new Pos(18, 64, 3) + ); + Collections.shuffle(spawnLocations); + + int numZombiesToSpawn = Math.min(3, spawnLocations.size()); + for (int i = 0; i < numZombiesToSpawn; i++) { + Pos pos = spawnLocations.get(i); + Entity zombie = new ZombieCreature(); + zombie.setInstance(game.getInstance(), pos); + zombie.spawn(); + } + + scheduler.buildTask(() -> endGreen(game)) + .delay(TaskSchedule.seconds(phaseDuration - zombiesSpawn)) + .schedule(); + } + + private static void endGreen(GameLobby game) { + for (Entity entity : game.getInstance().getEntities()) { + if (entity.getEntityType() == EntityType.ZOMBIE) { + entity.remove(); + } + } + + int minX = -100; + int maxX = 100; + int minZ = -100; + int maxZ = 100; + + for (int x = minX; x <= maxX; x++) { + for (int z = minZ; z <= maxZ; z++) { + for (int y = 55; y < 75; y++) { + Pos pos = new Pos(x, y, z); + Block block = game.getInstance().getBlock(pos); + if (block.compare(Block.WITHER_ROSE)) { + game.getInstance().setBlock(pos, Block.SHORT_GRASS); + } + } + } + } + + startHealthRegeneration(game); + } + + private static boolean isFlamableBlock(Block block) { + return !block.compare(Block.AIR) + && !block.compare(Block.GRASS_BLOCK) + && !block.compare(Block.FARMLAND) + && !block.compare(Block.STONE) + && !block.compare(Block.ANDESITE) + && !block.compare(Block.ANDESITE_STAIRS) + && !block.compare(Block.ANDESITE_SLAB) + && !block.compare(Block.GRAVEL) + && !block.compare(Block.DIRT_PATH) + && !block.compare(Block.OAK_FENCE) + && !block.compare(Block.OAK_FENCE_GATE) + && !block.compare(Block.STONE_BRICKS) + && !block.compare(Block.MOSSY_STONE_BRICK_WALL) + && !block.compare(Block.MOSSY_STONE_BRICKS) + && !block.compare(Block.MOSSY_STONE_BRICK_STAIRS) + && !block.compare(Block.STONE_BRICK_STAIRS) + && !block.compare(Block.MOSSY_STONE_BRICK_SLAB) + && !block.compare(Block.STONE_BRICK_WALL) + && !block.compare(Block.BRICK_SLAB) + && !block.compare(Block.BRICK_STAIRS) + && !block.compare(Block.CHAIN) + && !block.compare(Block.WATER_CAULDRON) + && !block.compare(Block.OAK_TRAPDOOR) + && !block.compare(Block.SPRUCE_FENCE) + && !block.compare(Block.SPRUCE_FENCE_GATE) + && !block.compare(Block.SPRUCE_TRAPDOOR) + && !block.compare(Block.SPRUCE_WALL_SIGN) + && !block.compare(Block.SPRUCE_STAIRS) + && !block.compare(Block.BARRIER) + && !block.compare(Block.SAND) + && !block.compare(Block.MOSS_BLOCK) + && !block.compare(Block.WATER) + && !block.compare(Block.SEA_LANTERN) + && !block.compare(Block.RED_CARPET) + && !block.compare(Block.WHITE_CARPET) + && !block.compare(Block.TRIPWIRE); + } + + public static void resetInstance(GameLobby game) { + 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()); + } + + game.setInstance(instanceContainer); + } + + public static void startHealthRegeneration(GameLobby game) { + int regenerationInterval = 20; // in seconds + + Task healthRegenTask = scheduler.buildTask(() -> { + for (UUID playerId : game.getPlayers()) { + Player player = Misc.getPlayer(playerId); + if (player != null && player.getGameMode() == GameMode.ADVENTURE) { + player.addEffect(new Potion(PotionEffect.REGENERATION, (byte) 1, 100)); + } + } + }).repeat(TaskSchedule.seconds(regenerationInterval)).schedule(); + + scheduler.buildTask(healthRegenTask::cancel).delay(TaskSchedule.seconds(phaseDuration)).schedule(); + } +} diff --git a/src/main/java/dev/celestialfox/spectrumsurvival/utils/Misc.java b/src/main/java/dev/celestialfox/spectrumsurvival/utils/Misc.java new file mode 100644 index 0000000..05ec625 --- /dev/null +++ b/src/main/java/dev/celestialfox/spectrumsurvival/utils/Misc.java @@ -0,0 +1,81 @@ +package dev.celestialfox.spectrumsurvival.utils; + +import dev.celestialfox.spectrumsurvival.game.classes.GameLobby; +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 net.minestom.server.timer.Task; + +import java.time.Duration; +import java.util.UUID; + +public class Misc { + static Task timeTask; + + public static Player getPlayer(UUID uuid) { + return MinecraftServer.getConnectionManager().getOnlinePlayerByUuid(uuid); + } + + public static void showTitle(Instance instance, Component title, Component subtitle) { + for (Player player : instance.getPlayers()) { // Get all players in the instance + player.showTitle(Title.title(title, subtitle)); // Send the title to each player + } + } + + public static void replaceInRegion(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.getBlock(pos).compare(Block.MOSS_CARPET) + || instance.getBlock(pos).compare(Block.SHORT_GRASS) + || instance.getBlock(pos).compare(Block.TALL_GRASS) + || instance.getBlock(pos).compare(Block.WHEAT) + || instance.getBlock(pos).compare(Block.CREEPER_HEAD) + || instance.getBlock(pos).compare(Block.RED_CARPET) + || instance.getBlock(pos).compare(Block.WHITE_CARPET)) { + instance.setBlock(pos, newBlockType); + } + } + } + } + } + + public static void transitionToTime(GameLobby game, Duration duration, long startTime, long endTime) { + long transitionDuration = duration.toMillis(); + long startMillis = System.currentTimeMillis(); + + timeTask = MinecraftServer.getSchedulerManager().buildTask(() -> { + long currentMillis = System.currentTimeMillis(); + long elapsedMillis = currentMillis - startMillis; + double progress = Math.min(1.0, (double) elapsedMillis / transitionDuration); + + long newTime = startTime + (long) (progress * (endTime - startTime)); + game.getInstance().setTime(newTime); + + if (progress >= 1.0) { + game.getInstance().setTime(endTime); + timeTask.cancel(); + } + }).repeat(Duration.ofMillis(50)).schedule(); + } + + public static Block getBlockAtPlayerPosition(Player player) { + Pos playerPosition = player.getPosition(); + Instance instance = player.getInstance(); + return instance.getBlock(playerPosition); + } +} diff --git a/src/main/java/dev/cfox/gamejam/utils/classes/NPC.java b/src/main/java/dev/celestialfox/spectrumsurvival/utils/classes/NPC.java similarity index 97% rename from src/main/java/dev/cfox/gamejam/utils/classes/NPC.java rename to src/main/java/dev/celestialfox/spectrumsurvival/utils/classes/NPC.java index 9dde142..a433c86 100644 --- a/src/main/java/dev/cfox/gamejam/utils/classes/NPC.java +++ b/src/main/java/dev/celestialfox/spectrumsurvival/utils/classes/NPC.java @@ -1,4 +1,4 @@ -package dev.cfox.gamejam.utils.classes; +package dev.celestialfox.spectrumsurvival.utils.classes; import net.kyori.adventure.text.Component; import net.minestom.server.entity.*; diff --git a/src/main/java/dev/cfox/gamejam/utils/classes/Randomized.java b/src/main/java/dev/celestialfox/spectrumsurvival/utils/classes/Randomized.java similarity index 93% rename from src/main/java/dev/cfox/gamejam/utils/classes/Randomized.java rename to src/main/java/dev/celestialfox/spectrumsurvival/utils/classes/Randomized.java index e38e744..e6788ee 100644 --- a/src/main/java/dev/cfox/gamejam/utils/classes/Randomized.java +++ b/src/main/java/dev/celestialfox/spectrumsurvival/utils/classes/Randomized.java @@ -1,4 +1,4 @@ -package dev.cfox.gamejam.utils.classes; +package dev.celestialfox.spectrumsurvival.utils.classes; import net.kyori.adventure.text.Component; import net.minestom.server.entity.Player; diff --git a/src/main/java/dev/cfox/gamejam/utils/config/Checks.java b/src/main/java/dev/celestialfox/spectrumsurvival/utils/config/Checks.java similarity index 91% rename from src/main/java/dev/cfox/gamejam/utils/config/Checks.java rename to src/main/java/dev/celestialfox/spectrumsurvival/utils/config/Checks.java index 08243b5..1f487f0 100644 --- a/src/main/java/dev/cfox/gamejam/utils/config/Checks.java +++ b/src/main/java/dev/celestialfox/spectrumsurvival/utils/config/Checks.java @@ -1,4 +1,4 @@ -package dev.cfox.gamejam.utils.config; +package dev.celestialfox.spectrumsurvival.utils.config; import org.slf4j.Logger; import org.slf4j.LoggerFactory; diff --git a/src/main/java/dev/cfox/gamejam/utils/config/Configuration.java b/src/main/java/dev/celestialfox/spectrumsurvival/utils/config/Configuration.java similarity index 96% rename from src/main/java/dev/cfox/gamejam/utils/config/Configuration.java rename to src/main/java/dev/celestialfox/spectrumsurvival/utils/config/Configuration.java index 94798d8..1acb471 100644 --- a/src/main/java/dev/cfox/gamejam/utils/config/Configuration.java +++ b/src/main/java/dev/celestialfox/spectrumsurvival/utils/config/Configuration.java @@ -1,4 +1,4 @@ -package dev.cfox.gamejam.utils.config; +package dev.celestialfox.spectrumsurvival.utils.config; import org.slf4j.Logger; import org.slf4j.LoggerFactory; diff --git a/src/main/java/dev/cfox/gamejam/utils/config/Settings.java b/src/main/java/dev/celestialfox/spectrumsurvival/utils/config/Settings.java similarity index 78% rename from src/main/java/dev/cfox/gamejam/utils/config/Settings.java rename to src/main/java/dev/celestialfox/spectrumsurvival/utils/config/Settings.java index f90e9ae..111e3d1 100644 --- a/src/main/java/dev/cfox/gamejam/utils/config/Settings.java +++ b/src/main/java/dev/celestialfox/spectrumsurvival/utils/config/Settings.java @@ -1,4 +1,4 @@ -package dev.cfox.gamejam.utils.config; +package dev.celestialfox.spectrumsurvival.utils.config; public class Settings { public static String getIP() { diff --git a/src/main/java/dev/celestialfox/spectrumsurvival/utils/events/MiscEvents.java b/src/main/java/dev/celestialfox/spectrumsurvival/utils/events/MiscEvents.java new file mode 100644 index 0000000..98fecbb --- /dev/null +++ b/src/main/java/dev/celestialfox/spectrumsurvival/utils/events/MiscEvents.java @@ -0,0 +1,177 @@ +package dev.celestialfox.spectrumsurvival.utils.events; + +import dev.celestialfox.spectrumsurvival.game.classes.GameLobby; +import dev.celestialfox.spectrumsurvival.game.classes.SnowballProjectile; +import dev.celestialfox.spectrumsurvival.game.classes.ZombieCreature; +import dev.celestialfox.spectrumsurvival.game.managers.GameManager; +import dev.celestialfox.spectrumsurvival.game.managers.QueueManager; +import dev.celestialfox.spectrumsurvival.game.phases.Phase; +import dev.celestialfox.spectrumsurvival.utils.Misc; +import dev.celestialfox.spectrumsurvival.utils.classes.NPC; +import net.kyori.adventure.text.Component; +import net.minestom.server.MinecraftServer; +import net.minestom.server.coordinate.Pos; +import net.minestom.server.coordinate.Vec; +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.entity.damage.Damage; +import net.minestom.server.entity.damage.DamageType; +import net.minestom.server.event.GlobalEventHandler; +import net.minestom.server.event.entity.EntityAttackEvent; +import net.minestom.server.event.entity.EntityDamageEvent; +import net.minestom.server.event.entity.projectile.ProjectileCollideWithBlockEvent; +import net.minestom.server.event.entity.projectile.ProjectileCollideWithEntityEvent; +import net.minestom.server.event.player.PlayerDeathEvent; +import net.minestom.server.event.player.PlayerDisconnectEvent; +import net.minestom.server.event.player.PlayerMoveEvent; +import net.minestom.server.event.player.PlayerUseItemEvent; +import net.minestom.server.instance.block.Block; +import net.minestom.server.item.ItemStack; +import net.minestom.server.item.Material; +import net.minestom.server.timer.TaskSchedule; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +import javax.swing.text.Position; +import java.util.UUID; + +public class MiscEvents { + private static final double KNOCKBACK_STRENGTH = 15.0; + static GlobalEventHandler globalEventHandler = MinecraftServer.getGlobalEventHandler(); + private static final Logger logger = LoggerFactory.getLogger(MiscEvents.class); + + public static void register() { + logger.debug("Registering Misc Listeners"); + globalEventHandler.addListener(PlayerMoveEvent.class, event -> { + Player player = event.getPlayer(); + if (GameManager.isPlayerInGame(player)) { + if (GameManager.getPlayerGame(player).getPhase() == Phase.GREEN) { + if (Misc.getBlockAtPlayerPosition(player) == Block.WITHER_ROSE && player.getGameMode() == GameMode.ADVENTURE) { + player.damage(Damage.fromPlayer(player, 1)); + } + } else if (GameManager.getPlayerGame(player).getPhase() == Phase.RED) { + if (Misc.getBlockAtPlayerPosition(player) == Block.FIRE && player.getGameMode() == GameMode.ADVENTURE) { + player.damage(Damage.fromPosition(DamageType.IN_FIRE, player.getPosition(), 1)); + } + } + } + }); + + 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); + } + + if (targeted instanceof Player player2) { + if (player.getGameMode() == GameMode.ADVENTURE) { + applyKnockback(player, player2); + if (GameManager.isPlayerInGame(player)) { + if (GameManager.getPlayerGame(player).getPhase() == Phase.GRAY) { + player2.damage(Damage.fromPlayer(player, 1)); + } + } + } + } + } + + if (targeted instanceof Player player) { + if (GameManager.isPlayerInGame(player)) { + if (GameManager.getPlayerGame(player).getPhase() == Phase.GREEN) { + if (targeter instanceof ZombieCreature) { + ZombieCreature zombie = new ZombieCreature(); + zombie.setInstance(player.getInstance(), player.getPosition()); + GameManager.getPlayerGame(player).eliminate(player); + } + } + } + } + }); + + globalEventHandler.addListener(EntityDamageEvent.class, event -> { + Entity damaged = event.getEntity(); + if (damaged instanceof Player player) { + if (player.getHealth() == 1 && GameManager.isPlayerInGame(player)) { + GameManager.getPlayerGame(player).eliminate(player); + } + } + }); + + globalEventHandler.addListener(PlayerDisconnectEvent.class, event -> { + Player player = event.getPlayer(); + GameLobby playerGame = GameManager.getPlayerGame(player); + UUID uuid = player.getUuid(); + if (GameManager.isPlayerInGame(player)) { + playerGame.getPlayers().remove(uuid); + playerGame.getEliminated().remove(uuid); + } + }); + + globalEventHandler.addListener(PlayerUseItemEvent.class, event -> { + Player player = event.getPlayer(); + ItemStack item = event.getItemStack(); + + if (item.material() == Material.SNOWBALL) { + Pos playerPosition = player.getPosition().add(0, 1.5, 0); + Vec direction = player.getPosition().direction().normalize().mul(20); + SnowballProjectile snowball = new SnowballProjectile(player); + + snowball.setInstance(player.getInstance(), playerPosition); + snowball.setVelocity(direction); + snowball.setNoGravity(false); + snowball.spawn(); + + MinecraftServer.getSchedulerManager().buildTask(() -> { + if (snowball.isActive()) { + snowball.remove(); + } + }).delay(TaskSchedule.seconds(10)).schedule(); + event.setCancelled(true); + } + }); + + globalEventHandler.addListener(ProjectileCollideWithBlockEvent.class, event -> { + if (event.getEntity() instanceof SnowballProjectile snowball) { + if (snowball.isActive()) { + snowball.remove(); + } + } + }); + + globalEventHandler.addListener(ProjectileCollideWithEntityEvent.class, event -> { + if (event.getEntity() instanceof SnowballProjectile snowball) { + if (event.getTarget() instanceof Player target) { + if (snowball.isActive()) { + snowball.remove(); + } + target.damage(Damage.fromProjectile(snowball, snowball, 0.75F)); + } + } + }); + + globalEventHandler.addListener(PlayerDeathEvent.class, event -> { + // Cancel the default death message + event.setDeathText(Component.text("You were eliminated!")); + event.setChatMessage(null); + }); + } + + private static void applyKnockback(Player attacker, Player target) { + Pos targetPos = target.getPosition(); + Pos attackerPos = attacker.getPosition(); + double dx = targetPos.x() - attackerPos.x(); + double dz = targetPos.z() - attackerPos.z(); + double length = Math.sqrt(dx * dx + dz * dz); + + if (length > 0) { + dx /= length; + dz /= length; + target.setVelocity(target.getVelocity().add(dx * KNOCKBACK_STRENGTH, 0, dz * KNOCKBACK_STRENGTH)); + } + } +} diff --git a/src/main/java/dev/cfox/gamejam/utils/events/StartEvents.java b/src/main/java/dev/celestialfox/spectrumsurvival/utils/events/StartEvents.java similarity index 87% rename from src/main/java/dev/cfox/gamejam/utils/events/StartEvents.java rename to src/main/java/dev/celestialfox/spectrumsurvival/utils/events/StartEvents.java index 0124f1a..c8e2e40 100644 --- a/src/main/java/dev/cfox/gamejam/utils/events/StartEvents.java +++ b/src/main/java/dev/celestialfox/spectrumsurvival/utils/events/StartEvents.java @@ -1,12 +1,10 @@ -package dev.cfox.gamejam.utils.events; +package dev.celestialfox.spectrumsurvival.utils.events; -import dev.cfox.gamejam.utils.Misc; -import dev.cfox.gamejam.utils.classes.NPC; -import dev.cfox.gamejam.utils.classes.Randomized; +import dev.celestialfox.spectrumsurvival.game.managers.QueueManager; +import dev.celestialfox.spectrumsurvival.utils.classes.NPC; 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; @@ -16,13 +14,11 @@ import net.minestom.server.event.player.AsyncPlayerConfigurationEvent; import net.minestom.server.event.player.PlayerChatEvent; import net.minestom.server.event.player.PlayerSpawnEvent; import net.minestom.server.instance.*; -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 { static GlobalEventHandler globalEventHandler = MinecraftServer.getGlobalEventHandler(); @@ -50,14 +46,15 @@ public class StartEvents { final Player player = event.getPlayer(); player.setGameMode(GameMode.ADVENTURE); event.setSpawningInstance(instanceContainer); - player.setRespawnPoint(new Pos(0.5, 66, 0.5, 180, 0)); + player.setRespawnPoint(new Pos(0, 66, 0, 180, 0)); }); globalEventHandler.addListener(PlayerSpawnEvent.class, event -> { Player player = event.getPlayer(); if (event.isFirstSpawn()) { - player.sendMessage(Component.text( - "§ePunch §rthe Minestom NPC to §ajoin the queue!", NamedTextColor.GRAY)); + player.sendMessage( + Component.text("Use §e/about game §rto read the rules.", NamedTextColor.GRAY) + .append(Component.text("§ePunch §rthe Minestom NPC to §ajoin the queue!", NamedTextColor.GRAY))); } }); } @@ -77,6 +74,8 @@ public class StartEvents { "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.5, 66.5, -16.5)); + QueueManager.lobbyInstance = instanceContainer; + return instanceContainer; } } diff --git a/src/main/java/dev/cfox/gamejam/game/commands/QueueCommand.java b/src/main/java/dev/cfox/gamejam/game/commands/QueueCommand.java deleted file mode 100644 index 0555632..0000000 --- a/src/main/java/dev/cfox/gamejam/game/commands/QueueCommand.java +++ /dev/null @@ -1,34 +0,0 @@ -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() { - super("queue", "q"); - addSyntax(((sender, context) -> { - final String arg1 = context.get("arg1"); - if (sender instanceof Player player) { - if (arg1.equals("join")) { - 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/phases/PhaseLogic.java b/src/main/java/dev/cfox/gamejam/game/phases/PhaseLogic.java deleted file mode 100644 index ae10140..0000000 --- a/src/main/java/dev/cfox/gamejam/game/phases/PhaseLogic.java +++ /dev/null @@ -1,108 +0,0 @@ -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) { - 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) { - 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 deleted file mode 100644 index c471a05..0000000 --- a/src/main/java/dev/cfox/gamejam/utils/Misc.java +++ /dev/null @@ -1,44 +0,0 @@ -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; - -public class Misc { - public static Player getPlayer(UUID uuid) { - return MinecraftServer.getConnectionManager().getOnlinePlayerByUuid(uuid); - } - - public static void showTitle(Instance instance, Component title, Component subtitle) { - for (Player player : instance.getPlayers()) { // Get all players in the instance - 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/events/MiscEvents.java b/src/main/java/dev/cfox/gamejam/utils/events/MiscEvents.java deleted file mode 100644 index 1881471..0000000 --- a/src/main/java/dev/cfox/gamejam/utils/events/MiscEvents.java +++ /dev/null @@ -1,45 +0,0 @@ -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; - -public class MiscEvents { - static GlobalEventHandler globalEventHandler = MinecraftServer.getGlobalEventHandler(); - private static final Logger logger = LoggerFactory.getLogger(MiscEvents.class); - - public static void register() { - 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); - } - } - }); - } -}