The game is starting as it should
- Fully working Queue system - Fully working game (for now with one color) - TODO: Add check for yellow (Is player under a block) - TODO: Check if there are still alive players, if not, end the game early - TO FIX: Yellow - while check is used to check if players have adventure gamemode, it should be changed (server crashes after too many attempts)
This commit is contained in:
parent
ed6c8fba77
commit
b82cdb3a4b
14 changed files with 263 additions and 58 deletions
BIN
server/worlds/game.polar
Normal file
BIN
server/worlds/game.polar
Normal file
Binary file not shown.
BIN
server/worlds/lobby.polar
Normal file
BIN
server/worlds/lobby.polar
Normal file
Binary file not shown.
|
@ -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());
|
||||
}
|
||||
}
|
|
@ -1,9 +1,11 @@
|
|||
package dev.cfox.gamejam.game.classes;
|
||||
|
||||
import dev.cfox.gamejam.game.managers.GameManager;
|
||||
import dev.cfox.gamejam.game.managers.QueueManager;
|
||||
import dev.cfox.gamejam.game.phases.Phase;
|
||||
import dev.cfox.gamejam.utils.Misc;
|
||||
import dev.cfox.gamejam.utils.classes.Randomized;
|
||||
import net.kyori.adventure.sound.Sound;
|
||||
import net.kyori.adventure.text.Component;
|
||||
import net.kyori.adventure.text.format.NamedTextColor;
|
||||
import net.kyori.adventure.text.format.TextDecoration;
|
||||
|
@ -14,6 +16,9 @@ import net.minestom.server.entity.Player;
|
|||
import net.minestom.server.instance.Instance;
|
||||
import net.minestom.server.network.packet.server.play.TeamsPacket;
|
||||
import net.minestom.server.scoreboard.Team;
|
||||
import net.minestom.server.timer.Task;
|
||||
import net.minestom.server.timer.TaskSchedule;
|
||||
import net.minestom.server.utils.NamespaceID;
|
||||
import org.slf4j.Logger;
|
||||
import org.slf4j.LoggerFactory;
|
||||
|
||||
|
@ -26,6 +31,7 @@ public class GameLobby {
|
|||
Team team = MinecraftServer.getTeamManager().createTeam("team_" + getName());
|
||||
private final ArrayList<UUID> eliminated = new ArrayList<>();
|
||||
private Phase phase;
|
||||
private Task latestTask;
|
||||
private Instance instance;
|
||||
private String name = "";
|
||||
|
||||
|
@ -43,18 +49,19 @@ public class GameLobby {
|
|||
logger.debug("Player " + player.getUsername() + " got eliminated (GameLobby: " + name + ")");
|
||||
sendMessage(Randomized.elimination(player));
|
||||
player.sendMessage(Component.text("You've got eliminated!", NamedTextColor.RED, TextDecoration.BOLD));
|
||||
player.playSound(Sound.sound(NamespaceID.from("minecraft:entity.ender_dragon.growl"), Sound.Source.PLAYER, 0.5f, 1.0f));
|
||||
MinecraftServer.getSchedulerManager().buildTask(() -> {
|
||||
player.playSound(Sound.sound(NamespaceID.from("minecraft:entity.wither.spawn"), Sound.Source.PLAYER, 0.5f, 1.0f));
|
||||
}).delay(TaskSchedule.millis(10)).schedule();
|
||||
MinecraftServer.getSchedulerManager().buildTask(() -> {
|
||||
player.playSound(Sound.sound(NamespaceID.from("minecraft:item.totem.use"), Sound.Source.PLAYER, 0.5f, 1.0f));
|
||||
}).delay(TaskSchedule.millis(20)).schedule();
|
||||
player.setGameMode(GameMode.SPECTATOR);
|
||||
}
|
||||
}
|
||||
|
||||
public ArrayList<UUID> getAllPlayers() {
|
||||
return players;
|
||||
}
|
||||
|
||||
public ArrayList<UUID> getPlayers() {
|
||||
ArrayList<UUID> playersInGame = new ArrayList<>(players);
|
||||
playersInGame.removeIf(uuid -> getEliminated().contains(uuid));
|
||||
return playersInGame;
|
||||
return players;
|
||||
}
|
||||
|
||||
public ArrayList<UUID> getEliminated() {
|
||||
|
@ -64,19 +71,13 @@ public class GameLobby {
|
|||
public void setPhase(Phase newPhase) {
|
||||
phase = newPhase;
|
||||
}
|
||||
|
||||
public Phase getPhase() {
|
||||
return phase;
|
||||
}
|
||||
|
||||
public void setName(String name) {
|
||||
this.name = name;
|
||||
}
|
||||
|
||||
public String getName() {
|
||||
return name;
|
||||
}
|
||||
|
||||
public void genName() {
|
||||
UUID uuid = UUID.randomUUID();
|
||||
if (!GameManager.gameLobbies.containsKey(uuid.toString())) {
|
||||
|
@ -91,11 +92,9 @@ public class GameLobby {
|
|||
players.forEach(uuid ->
|
||||
Misc.getPlayer(uuid).setInstance(instance).thenRun(() -> Misc.getPlayer(uuid).teleport(pos)));
|
||||
}
|
||||
|
||||
public Instance getInstance() {
|
||||
return instance;
|
||||
}
|
||||
|
||||
public void teleport(Pos pos) {
|
||||
players.forEach(uuid -> Misc.getPlayer(uuid).teleport(pos));
|
||||
}
|
||||
|
@ -103,4 +102,11 @@ public class GameLobby {
|
|||
public void sendMessage(Component component) {
|
||||
players.forEach(uuid -> Misc.getPlayer(uuid).sendMessage(component));
|
||||
}
|
||||
|
||||
public void setTask(Task task) {
|
||||
latestTask = task;
|
||||
}
|
||||
public Task getTask() {
|
||||
return latestTask;
|
||||
}
|
||||
}
|
||||
|
|
|
@ -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"));
|
||||
|
|
|
@ -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());
|
||||
}
|
||||
}
|
|
@ -2,21 +2,35 @@ package dev.cfox.gamejam.game.managers;
|
|||
|
||||
import dev.cfox.gamejam.game.classes.GameLobby;
|
||||
import dev.cfox.gamejam.game.classes.GameQueue;
|
||||
import dev.cfox.gamejam.game.phases.PhaseLogic;
|
||||
import dev.cfox.gamejam.utils.Misc;
|
||||
import dev.cfox.gamejam.utils.events.StartEvents;
|
||||
import net.hollowcube.polar.PolarLoader;
|
||||
import net.kyori.adventure.text.Component;
|
||||
import net.kyori.adventure.text.format.NamedTextColor;
|
||||
import net.kyori.adventure.text.format.TextDecoration;
|
||||
import net.kyori.adventure.title.Title;
|
||||
import net.minestom.server.MinecraftServer;
|
||||
import net.minestom.server.coordinate.Pos;
|
||||
import net.minestom.server.entity.GameMode;
|
||||
import net.minestom.server.entity.Player;
|
||||
import net.minestom.server.instance.Instance;
|
||||
import net.minestom.server.instance.InstanceContainer;
|
||||
import net.minestom.server.instance.InstanceManager;
|
||||
import org.slf4j.Logger;
|
||||
import org.slf4j.LoggerFactory;
|
||||
|
||||
import java.io.IOException;
|
||||
import java.nio.file.Path;
|
||||
import java.util.*;
|
||||
|
||||
public class GameManager {
|
||||
public static Map<String, GameLobby> gameLobbies = new HashMap<>();
|
||||
private static final Logger logger = LoggerFactory.getLogger(GameManager.class);
|
||||
|
||||
public static boolean isPlayerInGame(Player player) {
|
||||
for (GameLobby lobby : gameLobbies.values()) {
|
||||
if (lobby.getAllPlayers().contains(player.getUuid())) {
|
||||
if (lobby.getPlayers().contains(player.getUuid())) {
|
||||
return true;
|
||||
}
|
||||
}
|
||||
|
@ -25,14 +39,15 @@ public class GameManager {
|
|||
|
||||
public static void startGame(GameQueue queue) {
|
||||
queue.sendMessage(Component.text("The game is starting!", NamedTextColor.GREEN, TextDecoration.BOLD));
|
||||
// String game = LobbyConverter.toGame(queue);
|
||||
GameLobby game = ConversionManager.toGame(queue);
|
||||
startGame(game);
|
||||
QueueManager.removeQueue(queue);
|
||||
}
|
||||
|
||||
public static GameLobby getPlayerGame(Player player) {
|
||||
if (!gameLobbies.isEmpty()) {
|
||||
for (GameLobby gameLobby : gameLobbies.values()) {
|
||||
if (gameLobby.getAllPlayers().contains(player.getUuid())) {
|
||||
if (gameLobby.getPlayers().contains(player.getUuid())) {
|
||||
return gameLobby;
|
||||
}
|
||||
}
|
||||
|
@ -44,12 +59,21 @@ public class GameManager {
|
|||
return gameLobbies.get(lobby);
|
||||
}
|
||||
|
||||
public static int getPlayersInGame() {
|
||||
int totalPlayers = 0;
|
||||
for (GameLobby gameLobby : gameLobbies.values()) {
|
||||
totalPlayers += gameLobby.getAllPlayers().size();
|
||||
public static void startGame(GameLobby game) {
|
||||
logger.debug("Creating Lobby Instance");
|
||||
InstanceManager instanceManager = MinecraftServer.getInstanceManager();
|
||||
InstanceContainer instanceContainer = instanceManager.createInstanceContainer();
|
||||
try {
|
||||
instanceContainer.setChunkLoader(new PolarLoader(Path.of("worlds/game.polar")));
|
||||
} catch (IOException e) {
|
||||
logger.error(e.getMessage());
|
||||
}
|
||||
return totalPlayers;
|
||||
|
||||
game.setInstance(instanceContainer, new Pos(0, 66, 0));
|
||||
for (UUID uuid : game.getPlayers()) {
|
||||
Misc.getPlayer(uuid).setGameMode(GameMode.ADVENTURE);
|
||||
}
|
||||
PhaseLogic.random(game);
|
||||
}
|
||||
|
||||
public static void sendEndTitles(GameLobby game) {
|
||||
|
|
|
@ -7,6 +7,7 @@ import net.kyori.adventure.text.format.NamedTextColor;
|
|||
import net.kyori.adventure.title.Title;
|
||||
import net.minestom.server.MinecraftServer;
|
||||
import net.minestom.server.entity.Player;
|
||||
import net.minestom.server.instance.Instance;
|
||||
import net.minestom.server.timer.Task;
|
||||
import net.minestom.server.timer.TaskSchedule;
|
||||
|
||||
|
@ -17,16 +18,19 @@ import java.util.List;
|
|||
public class QueueManager {
|
||||
public static List<GameQueue> queues = new ArrayList<>();
|
||||
private static final HashMap<GameQueue, Task> countdownTasks = new HashMap<>();
|
||||
private static int minPlayers = 6;
|
||||
private static int maxPlayers = 10;
|
||||
public static Instance lobbyInstance;
|
||||
|
||||
public static void joinPlayer(Player player) {
|
||||
boolean queueFound = false;
|
||||
|
||||
if (!queues.isEmpty()) {
|
||||
for (GameQueue queue : queues) {
|
||||
if (queue.getPlayers().size() < 10) {
|
||||
if (queue.getPlayers().size() < maxPlayers) {
|
||||
queue.addPlayer(player.getUuid());
|
||||
queueFound = true;
|
||||
if (queue.getPlayers().size() >= 6) {
|
||||
if (queue.getPlayers().size() >= minPlayers) {
|
||||
startCountdown(queue);
|
||||
}
|
||||
break;
|
||||
|
@ -36,15 +40,18 @@ public class QueueManager {
|
|||
|
||||
if (!queueFound) {
|
||||
createQueue(player);
|
||||
player.sendMessage(Component.text("No queues were found! A new queue has been created just for you.", NamedTextColor.GREEN));
|
||||
}
|
||||
|
||||
player.sendMessage(Component.text("The queue starts the countdown from §e6 players.", NamedTextColor.GRAY));
|
||||
player.sendMessage(Component.text("One queue can hold up to §e10 players.", NamedTextColor.GRAY));
|
||||
player.sendMessage(Component.text("§e§lWaiting for too long? §rUse §a/queue force §rto start now.", NamedTextColor.GRAY));
|
||||
}
|
||||
|
||||
public static void removePlayer(Player player) {
|
||||
GameQueue queue = getPlayerQueue(player);
|
||||
if (queue != null) {
|
||||
queue.removePlayer(player.getUuid());
|
||||
if (queue.getPlayers().size() < 2) {
|
||||
if (queue.getPlayers().size() < minPlayers) {
|
||||
stopCountdown(queue);
|
||||
}
|
||||
}
|
||||
|
|
|
@ -1,42 +1,108 @@
|
|||
package dev.cfox.gamejam.game.phases;
|
||||
|
||||
import dev.cfox.gamejam.game.classes.GameLobby;
|
||||
import dev.cfox.gamejam.game.managers.ConversionManager;
|
||||
import dev.cfox.gamejam.utils.Misc;
|
||||
import net.kyori.adventure.text.Component;
|
||||
import net.kyori.adventure.text.format.NamedTextColor;
|
||||
import net.minestom.server.MinecraftServer;
|
||||
import net.minestom.server.entity.Entity;
|
||||
import net.minestom.server.entity.EntityType;
|
||||
import net.minestom.server.entity.GameMode;
|
||||
import net.minestom.server.entity.Player;
|
||||
import net.minestom.server.timer.SchedulerManager;
|
||||
import net.minestom.server.timer.Task;
|
||||
import net.minestom.server.timer.TaskSchedule;
|
||||
import org.slf4j.Logger;
|
||||
import org.slf4j.LoggerFactory;
|
||||
|
||||
import java.time.Duration;
|
||||
import java.util.List;
|
||||
import java.util.Random;
|
||||
import java.util.UUID;
|
||||
|
||||
public class PhaseLogic {
|
||||
private static final Logger logger = LoggerFactory.getLogger(PhaseLogic.class);
|
||||
private static final SchedulerManager scheduler = MinecraftServer.getSchedulerManager();
|
||||
private static int phaseDuration = 30; // in seconds
|
||||
private static int gameTime = 300; // 5 minutes in seconds
|
||||
|
||||
public static void random(GameLobby game) {
|
||||
Phase[] phases = Phase.values();
|
||||
int randomIndex = new Random().nextInt(phases.length);
|
||||
Phase selectedPhase = phases[randomIndex];
|
||||
logger.info("Picking random color phase for GameLobby: " + game.getName());
|
||||
|
||||
switch (selectedPhase) {
|
||||
case RED -> red(game);
|
||||
case BLUE -> blue(game);
|
||||
case GREEN -> green(game);
|
||||
case YELLOW -> yellow(game);
|
||||
case PURPLE -> purple(game);
|
||||
}
|
||||
Task task = scheduler.buildTask(() -> {
|
||||
Phase[] phases = Phase.values();
|
||||
int randomIndex = new Random().nextInt(phases.length);
|
||||
Phase selectedPhase = phases[randomIndex];
|
||||
if (game.getTask() != null) {
|
||||
game.getTask().cancel();
|
||||
}
|
||||
switch (selectedPhase) {
|
||||
case RED -> red(game);
|
||||
case BLUE -> blue(game);
|
||||
case GREEN -> green(game);
|
||||
case YELLOW -> yellow(game);
|
||||
case PURPLE -> purple(game);
|
||||
}
|
||||
}).repeat(TaskSchedule.seconds(phaseDuration)).schedule();
|
||||
scheduler.buildTask(() -> {
|
||||
ConversionManager.fromGame(game);
|
||||
task.cancel();
|
||||
}).delay(TaskSchedule.seconds(gameTime)).schedule();
|
||||
}
|
||||
|
||||
public static void red(GameLobby game) {
|
||||
logger.debug("Picked red phase for GameLobby: " + game.getName());
|
||||
game.setPhase(Phase.RED);
|
||||
game.sendMessage(Component.text("New color picked! §cRED", NamedTextColor.GRAY));
|
||||
game.sendMessage(Component.text("BLAH BLAH BLAH BLAH", NamedTextColor.RED));
|
||||
Misc.showTitle(game.getInstance(), Component.text("■", NamedTextColor.RED), Component.text("Red", NamedTextColor.RED));
|
||||
// Handle red phase logic
|
||||
}
|
||||
public static void blue(GameLobby game) {
|
||||
logger.debug("Picked blue phase for GameLobby: " + game.getName());
|
||||
game.setPhase(Phase.BLUE);
|
||||
game.sendMessage(Component.text("New color picked! §9BLUE", NamedTextColor.GRAY));
|
||||
game.sendMessage(Component.text("BLAH BLAH BLAH BLAH", NamedTextColor.BLUE));
|
||||
Misc.showTitle(game.getInstance(), Component.text("■", NamedTextColor.BLUE), Component.text("Blue", NamedTextColor.BLUE));
|
||||
// Handle blue phase logic
|
||||
}
|
||||
public static void green(GameLobby game) {
|
||||
logger.debug("Picked green phase for GameLobby: " + game.getName());
|
||||
game.setPhase(Phase.GREEN);
|
||||
game.sendMessage(Component.text("New color picked! §aGREEN", NamedTextColor.GRAY));
|
||||
game.sendMessage(Component.text("BLAH BLAH BLAH BLAH", NamedTextColor.GREEN));
|
||||
Misc.showTitle(game.getInstance(), Component.text("■", NamedTextColor.GREEN), Component.text("Green", NamedTextColor.GREEN));
|
||||
// Handle green phase logic
|
||||
}
|
||||
public static void yellow(GameLobby game) {
|
||||
// Handle yellow phase logic
|
||||
logger.debug("Picked yellow phase for GameLobby: " + game.getName());
|
||||
game.setPhase(Phase.YELLOW);
|
||||
game.sendMessage(Component.text("New color picked! §eYELLOW", NamedTextColor.GRAY));
|
||||
game.sendMessage(Component.text("Thunder is coming! Find a place to hide!", NamedTextColor.YELLOW));
|
||||
Misc.showTitle(game.getInstance(), Component.text("■", NamedTextColor.YELLOW), Component.text("Yellow", NamedTextColor.YELLOW));
|
||||
scheduler.buildTask(() -> {
|
||||
Task task = scheduler.buildTask(() -> {
|
||||
List<UUID> uuids = game.getPlayers();
|
||||
Random random = new Random();
|
||||
Player randomPlayer = null;
|
||||
|
||||
while (randomPlayer == null || randomPlayer.getGameMode() != GameMode.ADVENTURE) {
|
||||
randomPlayer = Misc.getPlayer(uuids.get(random.nextInt(uuids.size())));
|
||||
}
|
||||
|
||||
Entity lightning = new Entity(EntityType.LIGHTNING_BOLT);
|
||||
lightning.setInstance(randomPlayer.getInstance(), randomPlayer.getPosition());
|
||||
lightning.spawn();
|
||||
game.eliminate(randomPlayer);
|
||||
}).repeat(Duration.ofSeconds(5)).schedule();
|
||||
game.setTask(task);
|
||||
}).delay(Duration.ofSeconds(5)).schedule();
|
||||
}
|
||||
public static void purple(GameLobby game) {
|
||||
logger.debug("Picked purple phase for GameLobby: " + game.getName());
|
||||
game.setPhase(Phase.PURPLE);
|
||||
game.sendMessage(Component.text("New color picked! §dPURPLE", NamedTextColor.GRAY));
|
||||
game.sendMessage(Component.text("BLAH BLAH BLAH BLAH", NamedTextColor.LIGHT_PURPLE));
|
||||
Misc.showTitle(game.getInstance(), Component.text("■", NamedTextColor.LIGHT_PURPLE), Component.text("Purple", NamedTextColor.LIGHT_PURPLE));
|
||||
// Handle purple phase logic
|
||||
}
|
||||
}
|
||||
|
|
|
@ -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);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
|
@ -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;
|
||||
|
|
|
@ -1,7 +0,0 @@
|
|||
package dev.cfox.gamejam.utils.conversion;
|
||||
|
||||
public class Polar {
|
||||
public static void convertFolder(String folder) {
|
||||
|
||||
}
|
||||
}
|
|
@ -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);
|
||||
}
|
||||
}
|
||||
});
|
||||
}
|
||||
}
|
||||
|
|
|
@ -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;
|
||||
}
|
||||
|
|
Loading…
Add table
Reference in a new issue