Compare commits
5 Commits
56455b4c50
...
400032a94c
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
400032a94c | ||
|
|
6893e07619 | ||
|
|
f27038f91d | ||
|
|
07b700bc32 | ||
|
|
7ae91bcf06 |
|
|
@ -58,7 +58,7 @@ public class ChangeTeam extends SubCommand {
|
||||||
}
|
}
|
||||||
|
|
||||||
private void changeTeam(CommandSender commandSender, Player player, Team team) {
|
private void changeTeam(CommandSender commandSender, Player player, Team team) {
|
||||||
Optional<Team> optionalOldTeam = gameManager.getTeam(player.getUniqueId());
|
Optional<Team> optionalOldTeam = gameManager.getTeam(player);
|
||||||
if (optionalOldTeam.isPresent()) {
|
if (optionalOldTeam.isPresent()) {
|
||||||
moveBetweenTeams(commandSender, player, team, optionalOldTeam.get());
|
moveBetweenTeams(commandSender, player, team, optionalOldTeam.get());
|
||||||
return;
|
return;
|
||||||
|
|
|
||||||
|
|
@ -12,6 +12,7 @@ import lombok.AllArgsConstructor;
|
||||||
import lombok.extern.slf4j.Slf4j;
|
import lombok.extern.slf4j.Slf4j;
|
||||||
import net.kyori.adventure.text.minimessage.MiniMessage;
|
import net.kyori.adventure.text.minimessage.MiniMessage;
|
||||||
import net.kyori.adventure.text.minimessage.tag.resolver.Placeholder;
|
import net.kyori.adventure.text.minimessage.tag.resolver.Placeholder;
|
||||||
|
import org.bukkit.Material;
|
||||||
import org.bukkit.command.CommandSender;
|
import org.bukkit.command.CommandSender;
|
||||||
import org.bukkit.entity.Player;
|
import org.bukkit.entity.Player;
|
||||||
|
|
||||||
|
|
@ -75,7 +76,8 @@ public class CreateTeam extends SubCommand {
|
||||||
|
|
||||||
int highestId = gameManager.getMaxTeamId();
|
int highestId = gameManager.getMaxTeamId();
|
||||||
Team team = new Team(MiniMessage.miniMessage().deserialize(String.format("<color:%s>%s</color>", color, name)),
|
Team team = new Team(MiniMessage.miniMessage().deserialize(String.format("<color:%s>%s</color>", color, name)),
|
||||||
highestId + 1, player.getLocation(), player.getLocation(), player.getLocation(), teamColor);
|
highestId + 1, player.getLocation(), player.getLocation(), player.getLocation(), teamColor,
|
||||||
|
Material.RED_BANNER, "§c");
|
||||||
|
|
||||||
return consumer.apply(team);
|
return consumer.apply(team);
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -40,7 +40,7 @@ public class SelectClass extends SubCommand {
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
GamePhase gamePhase = optionalGamePhase.get();
|
GamePhase gamePhase = optionalGamePhase.get();
|
||||||
Optional<TeamPlayer> optionalTeamPlayer = gameManager.getTeamPlayer(player.getUniqueId());
|
Optional<TeamPlayer> optionalTeamPlayer = gameManager.getTeamPlayer(player);
|
||||||
if (optionalTeamPlayer.isEmpty()) {
|
if (optionalTeamPlayer.isEmpty()) {
|
||||||
commandSender.sendRichMessage("<red>You have to be in a CTF team to select a class.</red>");
|
commandSender.sendRichMessage("<red>You have to be in a CTF team to select a class.</red>");
|
||||||
return 0;
|
return 0;
|
||||||
|
|
|
||||||
|
|
@ -3,6 +3,9 @@ package com.alttd.ctf.config;
|
||||||
import com.alttd.ctf.Main;
|
import com.alttd.ctf.Main;
|
||||||
import com.alttd.ctf.game.GamePhase;
|
import com.alttd.ctf.game.GamePhase;
|
||||||
import lombok.extern.slf4j.Slf4j;
|
import lombok.extern.slf4j.Slf4j;
|
||||||
|
import org.bukkit.Material;
|
||||||
|
import org.bukkit.inventory.ItemStack;
|
||||||
|
import org.jetbrains.annotations.NotNull;
|
||||||
|
|
||||||
import java.time.Duration;
|
import java.time.Duration;
|
||||||
import java.util.HashMap;
|
import java.util.HashMap;
|
||||||
|
|
@ -88,6 +91,7 @@ public class GameConfig extends AbstractConfig {
|
||||||
public static double CAPTURE_RADIUS = 5;
|
public static double CAPTURE_RADIUS = 5;
|
||||||
public static int CAPTURE_SCORE = 50;
|
public static int CAPTURE_SCORE = 50;
|
||||||
public static double TURN_IN_RADIUS = 3;
|
public static double TURN_IN_RADIUS = 3;
|
||||||
|
public static @NotNull Material MATERIAL = Material.RED_BANNER;
|
||||||
|
|
||||||
@SuppressWarnings("unused")
|
@SuppressWarnings("unused")
|
||||||
private static void load() {
|
private static void load() {
|
||||||
|
|
@ -98,6 +102,7 @@ public class GameConfig extends AbstractConfig {
|
||||||
CAPTURE_RADIUS = config.getDouble(prefix, "capture-radius", CAPTURE_RADIUS);
|
CAPTURE_RADIUS = config.getDouble(prefix, "capture-radius", CAPTURE_RADIUS);
|
||||||
CAPTURE_SCORE = config.getInt(prefix, "capture-score", CAPTURE_SCORE);
|
CAPTURE_SCORE = config.getInt(prefix, "capture-score", CAPTURE_SCORE);
|
||||||
TURN_IN_RADIUS = config.getDouble(prefix, "turn-in-radius", TURN_IN_RADIUS);
|
TURN_IN_RADIUS = config.getDouble(prefix, "turn-in-radius", TURN_IN_RADIUS);
|
||||||
|
MATERIAL = Material.valueOf(config.getString(prefix, "material", MATERIAL.toString()));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -3,6 +3,9 @@ package com.alttd.ctf.events;
|
||||||
import org.bukkit.Material;
|
import org.bukkit.Material;
|
||||||
import org.bukkit.event.EventHandler;
|
import org.bukkit.event.EventHandler;
|
||||||
import org.bukkit.event.Listener;
|
import org.bukkit.event.Listener;
|
||||||
|
import org.bukkit.event.inventory.InventoryClickEvent;
|
||||||
|
import org.bukkit.event.inventory.InventoryDragEvent;
|
||||||
|
import org.bukkit.event.inventory.InventoryType;
|
||||||
import org.bukkit.event.player.PlayerAttemptPickupItemEvent;
|
import org.bukkit.event.player.PlayerAttemptPickupItemEvent;
|
||||||
import org.bukkit.event.player.PlayerDropItemEvent;
|
import org.bukkit.event.player.PlayerDropItemEvent;
|
||||||
|
|
||||||
|
|
@ -26,4 +29,20 @@ public class InventoryItemInteractionEvent implements Listener {
|
||||||
event.setCancelled(true);
|
event.setCancelled(true);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@EventHandler
|
||||||
|
public void onInventoryClick(InventoryClickEvent event) {
|
||||||
|
if (event.getSlotType() != InventoryType.SlotType.ARMOR) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
event.setCancelled(true);
|
||||||
|
}
|
||||||
|
|
||||||
|
@EventHandler
|
||||||
|
public void onInventoryDrag(InventoryDragEvent event) {
|
||||||
|
if (event.getRawSlots().stream().noneMatch(slot -> slot >= 5 && slot <= 8)) { // Slot numbers 5-8 for armor
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
event.setCancelled(true);
|
||||||
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -55,7 +55,7 @@ public class OnPlayerDeath implements Listener {
|
||||||
log.warn("Player {} died while the game wasn't running", player.getName());
|
log.warn("Player {} died while the game wasn't running", player.getName());
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
Optional<TeamPlayer> optionalTeamPlayer = gameManager.getTeamPlayer(player.getUniqueId());
|
Optional<TeamPlayer> optionalTeamPlayer = gameManager.getTeamPlayer(player);
|
||||||
if (optionalTeamPlayer.isEmpty()) {
|
if (optionalTeamPlayer.isEmpty()) {
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -51,7 +51,7 @@ public class OnPlayerOnlineStatus implements Listener {
|
||||||
if (gamePhase.equals(GamePhase.ENDED)) {
|
if (gamePhase.equals(GamePhase.ENDED)) {
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
Optional<TeamPlayer> optionalTeamPlayer = gameManager.getTeamPlayer(player.getUniqueId());
|
Optional<TeamPlayer> optionalTeamPlayer = gameManager.getTeamPlayer(player);
|
||||||
TeamPlayer teamPlayer;
|
TeamPlayer teamPlayer;
|
||||||
if (optionalTeamPlayer.isEmpty()) {
|
if (optionalTeamPlayer.isEmpty()) {
|
||||||
Optional<Team> min = gameManager.getTeams().stream().min(Comparator.comparingInt(team -> team.getPlayers().size()));
|
Optional<Team> min = gameManager.getTeams().stream().min(Comparator.comparingInt(team -> team.getPlayers().size()));
|
||||||
|
|
@ -59,7 +59,7 @@ public class OnPlayerOnlineStatus implements Listener {
|
||||||
log.error("No team found when attempting to add freshly joined player to a team");
|
log.error("No team found when attempting to add freshly joined player to a team");
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
teamPlayer = min.get().addPlayer(player.getUniqueId());
|
teamPlayer = min.get().addPlayer(player);
|
||||||
} else {
|
} else {
|
||||||
teamPlayer = optionalTeamPlayer.get();
|
teamPlayer = optionalTeamPlayer.get();
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -89,7 +89,7 @@ public class SnowballEvent implements Listener {
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
Optional<TeamPlayer> teamPlayer = gameManager.getTeamPlayer(shooter.getUniqueId());
|
Optional<TeamPlayer> teamPlayer = gameManager.getTeamPlayer(shooter);
|
||||||
if (teamPlayer.isEmpty()) {
|
if (teamPlayer.isEmpty()) {
|
||||||
log.debug("The shooter that threw a snowball was not a team player");
|
log.debug("The shooter that threw a snowball was not a team player");
|
||||||
return;
|
return;
|
||||||
|
|
@ -100,13 +100,14 @@ public class SnowballEvent implements Listener {
|
||||||
private void handleSnowballHit(EntityDamageByEntityEvent event, SnowballHitConsumer consumer) {
|
private void handleSnowballHit(EntityDamageByEntityEvent event, SnowballHitConsumer consumer) {
|
||||||
Optional<GamePhase> optionalGamePhase = gameManager.getGamePhase();
|
Optional<GamePhase> optionalGamePhase = gameManager.getGamePhase();
|
||||||
if (optionalGamePhase.isEmpty()) {
|
if (optionalGamePhase.isEmpty()) {
|
||||||
log.debug("No game is running but player was hit by snowball");
|
log.debug("No game is running but player was hit");
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
GamePhase gamePhase = optionalGamePhase.get();
|
GamePhase gamePhase = optionalGamePhase.get();
|
||||||
|
|
||||||
if (!gamePhase.equals(GamePhase.COMBAT)) {
|
if (!gamePhase.equals(GamePhase.COMBAT)) {
|
||||||
log.debug("Not in combat phase but player was hit by snowball");
|
log.debug("Not in combat phase but player was hit, cancelling event");
|
||||||
|
event.setCancelled(true);
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
@ -116,7 +117,8 @@ public class SnowballEvent implements Listener {
|
||||||
}
|
}
|
||||||
|
|
||||||
if (!(event.getDamager() instanceof org.bukkit.entity.Snowball snowball)) {
|
if (!(event.getDamager() instanceof org.bukkit.entity.Snowball snowball)) {
|
||||||
log.debug("The player was hit by something other than a snowball");
|
log.debug("The player was hit by something other than a snowball, canceling event");
|
||||||
|
event.setCancelled(true);
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
@ -125,13 +127,13 @@ public class SnowballEvent implements Listener {
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
Optional<TeamPlayer> teamPlayerShooter = gameManager.getTeamPlayer(shooter.getUniqueId());
|
Optional<TeamPlayer> teamPlayerShooter = gameManager.getTeamPlayer(shooter);
|
||||||
if (teamPlayerShooter.isEmpty()) {
|
if (teamPlayerShooter.isEmpty()) {
|
||||||
log.debug("The shooter that hit a player with a snowball was not a team player");
|
log.debug("The shooter that hit a player with a snowball was not a team player");
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
Optional<TeamPlayer> teamPlayerHit = gameManager.getTeamPlayer(hitPlayer.getUniqueId());
|
Optional<TeamPlayer> teamPlayerHit = gameManager.getTeamPlayer(hitPlayer);
|
||||||
if (teamPlayerHit.isEmpty()) {
|
if (teamPlayerHit.isEmpty()) {
|
||||||
log.debug("The shooter that hit a player with a snowball was not a team player");
|
log.debug("The shooter that hit a player with a snowball was not a team player");
|
||||||
return;
|
return;
|
||||||
|
|
|
||||||
|
|
@ -33,7 +33,6 @@ public class Flag implements Runnable {
|
||||||
private static final MiniMessage miniMessage = MiniMessage.miniMessage();
|
private static final MiniMessage miniMessage = MiniMessage.miniMessage();
|
||||||
|
|
||||||
private final HashMap<Integer, Integer> teamFlagPointCount = new HashMap<>();
|
private final HashMap<Integer, Integer> teamFlagPointCount = new HashMap<>();
|
||||||
private final ItemStack flagItem = new ItemStack(Material.BLACK_BANNER);
|
|
||||||
private final BossBar bossBar = createBossBar();
|
private final BossBar bossBar = createBossBar();
|
||||||
private final HashMap<Integer, Integer> wins = new HashMap<>();
|
private final HashMap<Integer, Integer> wins = new HashMap<>();
|
||||||
private int lastWinningTeamId = -1;
|
private int lastWinningTeamId = -1;
|
||||||
|
|
@ -53,6 +52,7 @@ public class Flag implements Runnable {
|
||||||
throw new IllegalStateException(String.format("Tried to spawn flag in world [%s] that doesn't exist", GameConfig.FLAG.world));
|
throw new IllegalStateException(String.format("Tried to spawn flag in world [%s] that doesn't exist", GameConfig.FLAG.world));
|
||||||
}
|
}
|
||||||
this.flagLocation = new Location(world, GameConfig.FLAG.x, GameConfig.FLAG.y, GameConfig.FLAG.z);
|
this.flagLocation = new Location(world, GameConfig.FLAG.x, GameConfig.FLAG.y, GameConfig.FLAG.z);
|
||||||
|
gameManager.getTeams().forEach(team -> team.setScore(0));
|
||||||
}
|
}
|
||||||
|
|
||||||
private BossBar createBossBar() {
|
private BossBar createBossBar() {
|
||||||
|
|
@ -80,15 +80,15 @@ public class Flag implements Runnable {
|
||||||
}
|
}
|
||||||
//TODO knockback enemies from flag location to create space for person who captured mayb short speed boost and heal?
|
//TODO knockback enemies from flag location to create space for person who captured mayb short speed boost and heal?
|
||||||
//TODO add de-buffs and enable buffs for others?
|
//TODO add de-buffs and enable buffs for others?
|
||||||
player.getInventory().setItem(EquipmentSlot.HEAD, flagItem);
|
player.getInventory().setItem(EquipmentSlot.HEAD, new ItemStack(teamPlayer.getTeam().getFlagMaterial()));
|
||||||
Bukkit.getScheduler().runTask(main, () -> flagLocation.getBlock().setType(Material.AIR));
|
Bukkit.getScheduler().runTask(main, () -> flagLocation.getBlock().setType(Material.AIR));
|
||||||
flagCarrier = player;
|
flagCarrier = player;
|
||||||
notifyAboutCapture();
|
notifyAboutCapture();
|
||||||
resetFlag();
|
resetFlag();
|
||||||
}
|
}
|
||||||
|
|
||||||
public void spawnFlag() {
|
public void spawnFlag(Material material) {
|
||||||
Bukkit.getScheduler().runTask(main, () -> flagLocation.getBlock().setType(flagItem.getType()));
|
Bukkit.getScheduler().runTask(main, () -> flagLocation.getBlock().setType(material));
|
||||||
}
|
}
|
||||||
|
|
||||||
private void spawnFlagParticleRing() {
|
private void spawnFlagParticleRing() {
|
||||||
|
|
@ -141,7 +141,7 @@ public class Flag implements Runnable {
|
||||||
updateDisplay();
|
updateDisplay();
|
||||||
} else {
|
} else {
|
||||||
winningTeam = optionalTeam.get();
|
winningTeam = optionalTeam.get();
|
||||||
resetFlag();
|
spawnFlag(winningTeam.getFlagMaterial());
|
||||||
//TODO stop capture and let ppl know they can now capture the flag
|
//TODO stop capture and let ppl know they can now capture the flag
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
@ -159,7 +159,7 @@ public class Flag implements Runnable {
|
||||||
miniMessage.deserialize("<red>kill <player> before they bring it to their base.</red>",
|
miniMessage.deserialize("<red>kill <player> before they bring it to their base.</red>",
|
||||||
Placeholder.component("player", flagCarrier.displayName())));
|
Placeholder.component("player", flagCarrier.displayName())));
|
||||||
Bukkit.getOnlinePlayers().forEach(player ->
|
Bukkit.getOnlinePlayers().forEach(player ->
|
||||||
gameManager.getTeam(player.getUniqueId()).ifPresent(team ->
|
gameManager.getTeam(player).ifPresent(team ->
|
||||||
player.showTitle(team.getId() == winningTeam.getId() ? capturingTeamTitle : huntingTeamTitle)));
|
player.showTitle(team.getId() == winningTeam.getId() ? capturingTeamTitle : huntingTeamTitle)));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
@ -194,9 +194,10 @@ public class Flag implements Runnable {
|
||||||
private void checkFlagCarrier() {
|
private void checkFlagCarrier() {
|
||||||
if (flagCarrier.isDead() || !flagCarrier.isOnline()) {
|
if (flagCarrier.isDead() || !flagCarrier.isOnline()) {
|
||||||
resetFlagCarrier();
|
resetFlagCarrier();
|
||||||
spawnFlag();
|
spawnFlag(GameConfig.FLAG.MATERIAL);
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
double distance = winningTeam.getFlagTurnInLocation().distance(flagCarrier.getLocation());
|
double distance = winningTeam.getFlagTurnInLocation().distance(flagCarrier.getLocation());
|
||||||
if (distance > GameConfig.FLAG.TURN_IN_RADIUS) {
|
if (distance > GameConfig.FLAG.TURN_IN_RADIUS) {
|
||||||
Location location = flagCarrier.getLocation();
|
Location location = flagCarrier.getLocation();
|
||||||
|
|
@ -206,18 +207,17 @@ public class Flag implements Runnable {
|
||||||
spawnParticlesOnSquareBorder(winningTeam.getFlagTurnInLocation(), GameConfig.FLAG.TURN_IN_RADIUS);
|
spawnParticlesOnSquareBorder(winningTeam.getFlagTurnInLocation(), GameConfig.FLAG.TURN_IN_RADIUS);
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
notifyAboutTurnIn();
|
notifyAboutTurnIn();
|
||||||
spawnFlag();
|
spawnFlag(GameConfig.FLAG.MATERIAL);
|
||||||
|
|
||||||
wins.merge(winningTeam.getId(), 1, Integer::sum);
|
wins.merge(winningTeam.getId(), 1, Integer::sum);
|
||||||
winningTeam = null;
|
wins.forEach((id, score) -> gameManager.getTeam(id).ifPresent(team -> team.setScore(score)));
|
||||||
Optional<TeamPlayer> optionalTeamPlayer = gameManager.getTeamPlayer(flagCarrier.getUniqueId());
|
|
||||||
if (optionalTeamPlayer.isEmpty()) {
|
flagCarrier.getInventory().setItem(EquipmentSlot.HEAD, null);
|
||||||
flagCarrier.getInventory().setItem(EquipmentSlot.HEAD, null);
|
gameManager.getTeamPlayer(flagCarrier)
|
||||||
} else {
|
.ifPresent(teamPlayer -> teamPlayer.getGameClass().setArmor(flagCarrier, teamPlayer));
|
||||||
TeamPlayer teamPlayer = optionalTeamPlayer.get();
|
|
||||||
teamPlayer.getGameClass().setArmor(flagCarrier, teamPlayer);
|
|
||||||
flagCarrier.getInventory().setItem(EquipmentSlot.HEAD, null);
|
|
||||||
}
|
|
||||||
resetFlagCarrier();
|
resetFlagCarrier();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
@ -276,7 +276,7 @@ public class Flag implements Runnable {
|
||||||
*/
|
*/
|
||||||
private boolean updateScoreBasedOnNearbyPlayers(Collection<Player> players) {
|
private boolean updateScoreBasedOnNearbyPlayers(Collection<Player> players) {
|
||||||
List<TeamPlayer> nearbyPlayers = players.stream()
|
List<TeamPlayer> nearbyPlayers = players.stream()
|
||||||
.map(player -> gameManager.getTeamPlayer(player.getUniqueId()))
|
.map(gameManager::getTeamPlayer)
|
||||||
.filter(Optional::isPresent)
|
.filter(Optional::isPresent)
|
||||||
.map(Optional::get)
|
.map(Optional::get)
|
||||||
.toList();
|
.toList();
|
||||||
|
|
@ -377,8 +377,8 @@ public class Flag implements Runnable {
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
resetFlagCarrier();
|
resetFlagCarrier();
|
||||||
spawnFlag();
|
spawnFlag(GameConfig.FLAG.MATERIAL);
|
||||||
gameManager.getTeam(player.getUniqueId())
|
gameManager.getTeam(player)
|
||||||
.ifPresentOrElse(team -> Bukkit.broadcast(MiniMessage.miniMessage()
|
.ifPresentOrElse(team -> Bukkit.broadcast(MiniMessage.miniMessage()
|
||||||
.deserialize("<red><team>'s flag carrier died! The flag has respawned",
|
.deserialize("<red><team>'s flag carrier died! The flag has respawned",
|
||||||
Placeholder.component("team", team.getName()))),
|
Placeholder.component("team", team.getName()))),
|
||||||
|
|
|
||||||
|
|
@ -37,7 +37,7 @@ public class FlagTryCaptureEvent implements Listener {
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
Player player = event.getPlayer();
|
Player player = event.getPlayer();
|
||||||
Optional<TeamPlayer> teamPlayer = winningTeam.getPlayer(player.getUniqueId());
|
Optional<TeamPlayer> teamPlayer = winningTeam.getPlayer(player);
|
||||||
if (teamPlayer.isEmpty()) {
|
if (teamPlayer.isEmpty()) {
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -39,11 +39,11 @@ public class GameManager {
|
||||||
|
|
||||||
public void registerPlayer(Team team, Player player) {
|
public void registerPlayer(Team team, Player player) {
|
||||||
unregisterPlayer(player);
|
unregisterPlayer(player);
|
||||||
teams.get(team.getId()).addPlayer(player.getUniqueId());
|
teams.get(team.getId()).addPlayer(player);
|
||||||
}
|
}
|
||||||
|
|
||||||
public void unregisterPlayer(Player player) {
|
public void unregisterPlayer(Player player) {
|
||||||
teams.values().forEach(team -> team.removePlayer(player.getUniqueId()));
|
teams.values().forEach(team -> team.removePlayer(player));
|
||||||
}
|
}
|
||||||
|
|
||||||
public void registerTeam(Team team) {
|
public void registerTeam(Team team) {
|
||||||
|
|
@ -54,17 +54,17 @@ public class GameManager {
|
||||||
return teams.values();
|
return teams.values();
|
||||||
}
|
}
|
||||||
|
|
||||||
public Optional<Team> getTeam(@NotNull UUID uuid) {
|
public Optional<Team> getTeam(@NotNull Player player) {
|
||||||
return getTeams().stream().filter(filterTeam -> filterTeam.getPlayer(uuid).isPresent()).findAny();
|
return getTeams().stream().filter(filterTeam -> filterTeam.getPlayer(player).isPresent()).findAny();
|
||||||
}
|
}
|
||||||
|
|
||||||
public Optional<Team> getTeam(int teamId) {
|
public Optional<Team> getTeam(int teamId) {
|
||||||
return getTeams().stream().filter(filterTeam -> filterTeam.getId() == teamId).findAny();
|
return getTeams().stream().filter(filterTeam -> filterTeam.getId() == teamId).findAny();
|
||||||
}
|
}
|
||||||
|
|
||||||
public Optional<TeamPlayer> getTeamPlayer(@NotNull UUID uuid) {
|
public Optional<TeamPlayer> getTeamPlayer(@NotNull Player player) {
|
||||||
return getTeams().stream()
|
return getTeams().stream()
|
||||||
.map(team -> team.getPlayer(uuid))
|
.map(team -> team.getPlayer(player))
|
||||||
.filter(Optional::isPresent)
|
.filter(Optional::isPresent)
|
||||||
.findFirst()
|
.findFirst()
|
||||||
.orElseGet(Optional::empty);
|
.orElseGet(Optional::empty);
|
||||||
|
|
|
||||||
|
|
@ -21,6 +21,9 @@ import org.bukkit.Location;
|
||||||
import org.bukkit.entity.Player;
|
import org.bukkit.entity.Player;
|
||||||
import org.jetbrains.annotations.NotNull;
|
import org.jetbrains.annotations.NotNull;
|
||||||
|
|
||||||
|
import java.util.ArrayList;
|
||||||
|
import java.util.Collections;
|
||||||
|
import java.util.List;
|
||||||
import java.util.Optional;
|
import java.util.Optional;
|
||||||
|
|
||||||
@Slf4j
|
@Slf4j
|
||||||
|
|
@ -52,12 +55,14 @@ public class ClassSelectionPhase implements GamePhaseExecutor {
|
||||||
Bukkit.broadcast(MiniMessage.miniMessage().deserialize("<green>Select your class with <gold>/ctf selectclass</gold></green>"));
|
Bukkit.broadcast(MiniMessage.miniMessage().deserialize("<green>Select your class with <gold>/ctf selectclass</gold></green>"));
|
||||||
CircularIterator<Team> teamCircularIterator = new CircularIterator<>(gameManager.getTeams());
|
CircularIterator<Team> teamCircularIterator = new CircularIterator<>(gameManager.getTeams());
|
||||||
if (teamCircularIterator.hasNext()) {
|
if (teamCircularIterator.hasNext()) {
|
||||||
Bukkit.getOnlinePlayers().stream()
|
ArrayList<? extends Player> players = new ArrayList<>(Bukkit.getOnlinePlayers());
|
||||||
|
Collections.shuffle(players);
|
||||||
|
players.stream()
|
||||||
.filter(player -> !player.hasPermission("ctf.bypass"))
|
.filter(player -> !player.hasPermission("ctf.bypass"))
|
||||||
.filter(player -> gameManager.getTeamPlayer(player.getUniqueId()).isEmpty())
|
.filter(player -> gameManager.getTeamPlayer(player).isEmpty())
|
||||||
.forEach(player -> {
|
.forEach(player -> {
|
||||||
Team team = teamCircularIterator.next();
|
Team team = teamCircularIterator.next();
|
||||||
team.addPlayer(player.getUniqueId());
|
team.addPlayer(player);
|
||||||
player.sendRichMessage("You joined <team>!", Placeholder.component("team", team.getName()));
|
player.sendRichMessage("You joined <team>!", Placeholder.component("team", team.getName()));
|
||||||
});
|
});
|
||||||
} else {
|
} else {
|
||||||
|
|
@ -68,7 +73,7 @@ public class ClassSelectionPhase implements GamePhaseExecutor {
|
||||||
|
|
||||||
private void teleportPlayersToStartingZone() {
|
private void teleportPlayersToStartingZone() {
|
||||||
Bukkit.getOnlinePlayers().forEach(player -> {
|
Bukkit.getOnlinePlayers().forEach(player -> {
|
||||||
Optional<TeamPlayer> teamPlayer = gameManager.getTeamPlayer(player.getUniqueId());
|
Optional<TeamPlayer> teamPlayer = gameManager.getTeamPlayer(player);
|
||||||
if (teamPlayer.isEmpty()) {
|
if (teamPlayer.isEmpty()) {
|
||||||
log.warn("{} is not a team player when teleporting to starting zone", player.getName());
|
log.warn("{} is not a team player when teleporting to starting zone", player.getName());
|
||||||
return;
|
return;
|
||||||
|
|
|
||||||
|
|
@ -1,5 +1,6 @@
|
||||||
package com.alttd.ctf.game.phases;
|
package com.alttd.ctf.game.phases;
|
||||||
|
|
||||||
|
import com.alttd.ctf.config.GameConfig;
|
||||||
import com.alttd.ctf.flag.Flag;
|
import com.alttd.ctf.flag.Flag;
|
||||||
import com.alttd.ctf.game.GamePhase;
|
import com.alttd.ctf.game.GamePhase;
|
||||||
import com.alttd.ctf.game.GamePhaseExecutor;
|
import com.alttd.ctf.game.GamePhaseExecutor;
|
||||||
|
|
@ -17,7 +18,7 @@ public class CombatPhase implements GamePhaseExecutor {
|
||||||
@Override
|
@Override
|
||||||
public synchronized void start(Flag flag) {
|
public synchronized void start(Flag flag) {
|
||||||
Bukkit.broadcast(MiniMessage.miniMessage().deserialize("<green>CAPTURE THE FLAG</green>"));
|
Bukkit.broadcast(MiniMessage.miniMessage().deserialize("<green>CAPTURE THE FLAG</green>"));
|
||||||
flag.spawnFlag();
|
flag.spawnFlag(GameConfig.FLAG.MATERIAL);
|
||||||
if (executorService == null) {
|
if (executorService == null) {
|
||||||
executorService = Executors.newSingleThreadScheduledExecutor();
|
executorService = Executors.newSingleThreadScheduledExecutor();
|
||||||
} else if (executorService.isTerminated() || executorService.isShutdown()) {
|
} else if (executorService.isTerminated() || executorService.isShutdown()) {
|
||||||
|
|
|
||||||
|
|
@ -7,7 +7,16 @@ import lombok.Getter;
|
||||||
import lombok.NoArgsConstructor;
|
import lombok.NoArgsConstructor;
|
||||||
import lombok.extern.slf4j.Slf4j;
|
import lombok.extern.slf4j.Slf4j;
|
||||||
import net.kyori.adventure.text.Component;
|
import net.kyori.adventure.text.Component;
|
||||||
|
import net.kyori.adventure.text.format.NamedTextColor;
|
||||||
|
import net.kyori.adventure.text.format.TextColor;
|
||||||
|
import net.kyori.adventure.text.minimessage.MiniMessage;
|
||||||
|
import net.kyori.adventure.text.serializer.legacy.LegacyComponentSerializer;
|
||||||
|
import net.kyori.adventure.text.serializer.plain.PlainTextComponentSerializer;
|
||||||
|
import org.bukkit.Bukkit;
|
||||||
import org.bukkit.Location;
|
import org.bukkit.Location;
|
||||||
|
import org.bukkit.Material;
|
||||||
|
import org.bukkit.entity.Player;
|
||||||
|
import org.bukkit.scoreboard.*;
|
||||||
import org.jetbrains.annotations.NotNull;
|
import org.jetbrains.annotations.NotNull;
|
||||||
|
|
||||||
import java.util.*;
|
import java.util.*;
|
||||||
|
|
@ -17,6 +26,8 @@ import java.util.*;
|
||||||
@AllArgsConstructor
|
@AllArgsConstructor
|
||||||
public class Team {
|
public class Team {
|
||||||
|
|
||||||
|
@JsonIgnore
|
||||||
|
private final static Scoreboard scoreboard = Bukkit.getScoreboardManager().getNewScoreboard();
|
||||||
@JsonIgnore
|
@JsonIgnore
|
||||||
private final HashMap<UUID, TeamPlayer> players = new HashMap<>();
|
private final HashMap<UUID, TeamPlayer> players = new HashMap<>();
|
||||||
@JsonProperty("name")
|
@JsonProperty("name")
|
||||||
|
|
@ -42,15 +53,27 @@ public class Team {
|
||||||
@NotNull
|
@NotNull
|
||||||
@Getter
|
@Getter
|
||||||
private TeamColor color;
|
private TeamColor color;
|
||||||
|
@JsonProperty("flagMaterial")
|
||||||
|
@NotNull
|
||||||
|
@Getter
|
||||||
|
private Material flagMaterial;
|
||||||
|
@JsonProperty("legacyTeamColor")
|
||||||
|
@NotNull
|
||||||
|
@Getter
|
||||||
|
private String legacyTeamColor;
|
||||||
|
|
||||||
public TeamPlayer addPlayer(UUID uuid) {
|
public TeamPlayer addPlayer(Player player) {
|
||||||
|
removeFromScoreBoard(player);
|
||||||
|
UUID uuid = player.getUniqueId();
|
||||||
TeamPlayer teamPlayer = new TeamPlayer(uuid, this);
|
TeamPlayer teamPlayer = new TeamPlayer(uuid, this);
|
||||||
players.put(uuid, teamPlayer);
|
players.put(uuid, teamPlayer);
|
||||||
log.debug("Added player with uuid {} to team with id {}", uuid, id);
|
addToScoreboard(player);
|
||||||
|
log.debug("Added player {} to team with id {}", player.getName(), id);
|
||||||
return teamPlayer;
|
return teamPlayer;
|
||||||
}
|
}
|
||||||
|
|
||||||
public Optional<TeamPlayer> getPlayer(@NotNull UUID uuid) {
|
public Optional<TeamPlayer> getPlayer(@NotNull Player player) {
|
||||||
|
UUID uuid = player.getUniqueId();
|
||||||
if (!players.containsKey(uuid))
|
if (!players.containsKey(uuid))
|
||||||
return Optional.empty();
|
return Optional.empty();
|
||||||
return Optional.of(players.get(uuid));
|
return Optional.of(players.get(uuid));
|
||||||
|
|
@ -60,13 +83,49 @@ public class Team {
|
||||||
return players.values();
|
return players.values();
|
||||||
}
|
}
|
||||||
|
|
||||||
public void removePlayer(@NotNull UUID uuid) {
|
public void removePlayer(@NotNull Player player) {
|
||||||
TeamPlayer remove = players.remove(uuid);
|
removeFromScoreBoard(player);
|
||||||
|
TeamPlayer remove = players.remove(player.getUniqueId());
|
||||||
if (remove != null) {
|
if (remove != null) {
|
||||||
log.debug("Removed player with uuid {} from team with id {}", uuid, id);
|
log.debug("Removed player {} from team with id {}", player.getName(), id);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
private void addToScoreboard(Player player) {
|
||||||
|
org.bukkit.scoreboard.Team team = scoreboard.getTeam("ctf_" + id);
|
||||||
|
if (team == null) {
|
||||||
|
team = scoreboard.registerNewTeam("ctf_" + id);
|
||||||
|
team.displayName(name);
|
||||||
|
NamedTextColor namedTextColor = NamedTextColor.nearestTo(TextColor.color(color.r(), color.g(), color.b()));
|
||||||
|
team.color(namedTextColor);
|
||||||
|
}
|
||||||
|
team.addPlayer(player);
|
||||||
|
player.setScoreboard(scoreboard);
|
||||||
|
}
|
||||||
|
|
||||||
|
private void removeFromScoreBoard(Player player) {
|
||||||
|
scoreboard.getTeams().stream()
|
||||||
|
.filter(team -> team.getName().startsWith("ctf_"))
|
||||||
|
.filter(team -> team.hasPlayer(player))
|
||||||
|
.forEach(team -> team.removePlayer(player));
|
||||||
|
}
|
||||||
|
|
||||||
|
public void setScore(int newScore) {
|
||||||
|
Objective objective = getOrCreateObjective();
|
||||||
|
Score score = objective.getScore(legacyTeamColor + PlainTextComponentSerializer.plainText().serialize(name));
|
||||||
|
score.setScore(newScore);
|
||||||
|
}
|
||||||
|
|
||||||
|
private Objective getOrCreateObjective() {
|
||||||
|
Objective objective = scoreboard.getObjective("teamScores");
|
||||||
|
if (objective == null) {
|
||||||
|
objective = scoreboard.registerNewObjective("teamScores", Criteria.DUMMY,
|
||||||
|
MiniMessage.miniMessage().deserialize("<gold>CTF score</gold>"));
|
||||||
|
objective.setDisplaySlot(DisplaySlot.SIDEBAR);
|
||||||
|
}
|
||||||
|
return objective;
|
||||||
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public boolean equals(Object obj) {
|
public boolean equals(Object obj) {
|
||||||
if (this == obj) {
|
if (this == obj) {
|
||||||
|
|
|
||||||
|
|
@ -1,3 +1,3 @@
|
||||||
#Tue Feb 11 22:21:13 CET 2025
|
#Sat Feb 15 03:47:20 CET 2025
|
||||||
buildNumber=45
|
buildNumber=50
|
||||||
version=0.1
|
version=0.1
|
||||||
|
|
|
||||||
Loading…
Reference in New Issue
Block a user