diff --git a/src/main/java/club/devcord/gamejam/Nigulpyggub.java b/src/main/java/club/devcord/gamejam/Nigulpyggub.java index 07ee5fd..0265521 100644 --- a/src/main/java/club/devcord/gamejam/Nigulpyggub.java +++ b/src/main/java/club/devcord/gamejam/Nigulpyggub.java @@ -17,6 +17,7 @@ public class Nigulpyggub extends JavaPlugin { + private boolean inGame = false; private final Map teamPipelines = new HashMap<>(); @Override @@ -29,7 +30,14 @@ public void onEnable() { getServer().getPluginCommand("game").setExecutor(new GameCommand(this)); new TabList(this).start(); -// lagger.start(); + } + + public void setInGame(boolean inGame) { + this.inGame = inGame; + } + + public boolean inGame() { + return inGame; } public Optional teamForName(String name) { diff --git a/src/main/java/club/devcord/gamejam/Team.java b/src/main/java/club/devcord/gamejam/Team.java index fa220f9..a8e1d9b 100644 --- a/src/main/java/club/devcord/gamejam/Team.java +++ b/src/main/java/club/devcord/gamejam/Team.java @@ -5,16 +5,13 @@ import org.bukkit.World; import org.bukkit.entity.Player; -import java.util.ArrayList; -import java.util.List; -import java.util.Random; -import java.util.UUID; +import java.util.*; import java.util.stream.Stream; import java.util.stream.StreamSupport; public record Team( String name, - List playerUUIDS, + Set playerUUIDS, World world, TextColor color ) { @@ -27,8 +24,8 @@ private static TextColor randomColor() { return TextColor.color(red, yellow, blue); } - public Team(Player creator, World world) { - this(creator.getName(), new ArrayList<>(), world, randomColor()); + public Team(String name, Player creator, World world) { + this(name, new HashSet<>(), world, randomColor()); playerUUIDS.add(creator.getUniqueId()); } @@ -37,10 +34,15 @@ public List players() { return playerUUIDS .stream() .map(Bukkit::getPlayer) + .filter(Objects::nonNull) .toList(); } public void addPlayer(Player player) { playerUUIDS.add(player.getUniqueId()); } + + public void removePlayer(Player player) { + playerUUIDS.remove(player.getUniqueId()); + } } diff --git a/src/main/java/club/devcord/gamejam/commands/GameCommand.java b/src/main/java/club/devcord/gamejam/commands/GameCommand.java index 9784e0b..645f88d 100644 --- a/src/main/java/club/devcord/gamejam/commands/GameCommand.java +++ b/src/main/java/club/devcord/gamejam/commands/GameCommand.java @@ -48,6 +48,7 @@ public boolean onCommand(@NotNull CommandSender sender, @NotNull Command command switch (args[0].toLowerCase()) { case "start" -> { BukkitScheduler scheduler = plugin.getServer().getScheduler(); + plugin.setInGame(true); for (Team team : plugin.teams()) { team.players().forEach(teamPlayer -> { teamPlayer.setGameMode(GameMode.ADVENTURE); @@ -74,6 +75,7 @@ public boolean onCommand(@NotNull CommandSender sender, @NotNull Command command } } case "stop" -> { + plugin.setInGame(false); plugin.teams() .stream() .peek(team -> plugin.teamPipelines().get(team).stop()) @@ -82,6 +84,8 @@ public boolean onCommand(@NotNull CommandSender sender, @NotNull Command command .forEach(p -> { p.teleport(new Location(plugin.getServer().getWorld("world"), 90, 43, -475)); p.getInventory().clear(); + p.setFlying(false); + p.setAllowFlight(false); }); plugin.teamPipelines().clear(); diff --git a/src/main/java/club/devcord/gamejam/commands/TeamCommand.java b/src/main/java/club/devcord/gamejam/commands/TeamCommand.java index 9a86ca4..41f0b9f 100644 --- a/src/main/java/club/devcord/gamejam/commands/TeamCommand.java +++ b/src/main/java/club/devcord/gamejam/commands/TeamCommand.java @@ -36,19 +36,37 @@ public boolean onCommand(@NotNull CommandSender sender, @NotNull Command command if (!(sender instanceof Player player)) return true; if (args.length < 1) { - player.sendMessage(MiniMessage.miniMessage().deserialize("You have to use: /team create")); + player.sendMessage(MiniMessage.miniMessage().deserialize("Du musst: /team create , /team leave oder /team join nutzen")); return false; } switch (args[0].toLowerCase()) { + case "leave" -> { + if (plugin.inGame()) { + sendInGame(player); + return false; + } - case "delete" -> plugin.teamForName(player.getName()) - .ifPresentOrElse(team -> { - plugin.teams().remove(team); - player.sendMessage(MiniMessage.miniMessage().deserialize("Dein Team wurde gelöscht!")); - }, () -> player.sendMessage(MiniMessage.miniMessage().deserialize("Du bist in keinem Team!"))); + plugin.teamForPlayer(player) + .ifPresentOrElse(team -> { + if (team.players().size() == 1) { + plugin.teamPipelines().remove(team); + } + + team.removePlayer(player); + + player.sendMessage(MiniMessage.miniMessage().deserialize("Du hast das Team verlassen!")); + + player.playerListName(player.name()); + }, () -> player.sendMessage(MiniMessage.miniMessage().deserialize("Du bist in keinem Team!"))); + } case "create" -> { + if (plugin.inGame()) { + sendInGame(player); + return false; + } + boolean alreadyInTeam = plugin.teamForPlayer(player).isPresent(); if (alreadyInTeam) { @@ -56,12 +74,28 @@ public boolean onCommand(@NotNull CommandSender sender, @NotNull Command command return true; } - World teamWorld = duplicator.duplicate(player.getName()); - Team team = new Team(player, teamWorld); - plugin.teamPipelines().put(team, null); - player.sendMessage(MiniMessage.miniMessage().deserialize("Team %s erstellt.".formatted(player.getName()))); + if (args.length != 2) { + player.sendMessage(MiniMessage.miniMessage().deserialize("Du musst: /team create nutzen!")); + return false; + } + + String teamName = args[1]; + + plugin.teamForName(teamName) + .ifPresentOrElse(team -> player.sendMessage(MiniMessage.miniMessage().deserialize("Team mit Namen %s existiert bereits.".formatted(teamName))), + () -> { + World teamWorld = duplicator.duplicate(teamName); + Team team = new Team(teamName, player, teamWorld); + plugin.teamPipelines().put(team, null); + player.sendMessage(MiniMessage.miniMessage().deserialize("Team %s erstellt.".formatted(teamName))); + }); } case "join" -> { + if (plugin.inGame()) { + sendInGame(player); + return false; + } + if (args.length != 2) { player.sendMessage(MiniMessage.miniMessage().deserialize("Du musst: /team join nutzen!")); return false; @@ -125,7 +159,7 @@ public boolean onCommand(@NotNull CommandSender sender, @NotNull Command command @Override public @Nullable List onTabComplete(@NotNull CommandSender sender, @NotNull Command command, @NotNull String label, @NotNull String[] args) { if (args.length <= 1) { - return completions(sender, args[0], List.of("create", "join", "delete", "info"), List.of("tp", "world")); + return completions(sender, args[0], List.of("create", "join", "leave", "info"), List.of("tp", "world")); } if (args[0].equalsIgnoreCase("tp") && sender.isOp()) { @@ -157,4 +191,8 @@ private List completions(CommandSender player, String current, List s.startsWith(current)) .toList(); } + + private void sendInGame(CommandSender sender) { + sender.sendMessage(MiniMessage.miniMessage().deserialize("Du kannst dein Team nicht ändern, solange das Spiel läuft.")); + } }