diff --git a/event/src/main/java/eu/mhsl/craftattack/spawn/event/appliances/deathrun/Deathrun.java b/event/src/main/java/eu/mhsl/craftattack/spawn/event/appliances/deathrun/Deathrun.java index c9b8a50..ed6abef 100644 --- a/event/src/main/java/eu/mhsl/craftattack/spawn/event/appliances/deathrun/Deathrun.java +++ b/event/src/main/java/eu/mhsl/craftattack/spawn/event/appliances/deathrun/Deathrun.java @@ -1,15 +1,12 @@ package eu.mhsl.craftattack.spawn.event.appliances.deathrun; -import eu.mhsl.craftattack.spawn.core.Main; import eu.mhsl.craftattack.spawn.core.appliance.Appliance; import eu.mhsl.craftattack.spawn.event.appliances.eventController.AbstractEvent; import net.kyori.adventure.text.Component; import net.kyori.adventure.title.Title; -import net.kyori.adventure.util.Ticks; import org.bukkit.Bukkit; import org.bukkit.World; import org.bukkit.entity.Player; -import org.bukkit.event.Listener; import org.bukkit.plugin.java.JavaPlugin; import org.jetbrains.annotations.NotNull; @@ -17,8 +14,6 @@ import java.util.*; @Appliance.Flags(autoload = false) public class Deathrun extends AbstractEvent { - private int scoreboardUpdateTaskId; - @Override public void initialize(@NotNull JavaPlugin plugin) { World world = Bukkit.getWorlds().getFirst(); @@ -28,11 +23,6 @@ public class Deathrun extends AbstractEvent { this.start(); } - @Override - public void onDisable() { - if(this.scoreboardUpdateTaskId != -1) Bukkit.getScheduler().cancelTask(this.scoreboardUpdateTaskId); - } - @Override public void start() { Title title = Title.title(Component.text("Start"), Component.text("Erreiche die höchste x-Koordinate!")); @@ -41,17 +31,7 @@ public class Deathrun extends AbstractEvent { World world = Bukkit.getWorlds().getFirst(); world.getWorldBorder().setSize(world.getWorldBorder().getMaxSize()); - this.updateScoreboards(); - this.scoreboardUpdateTaskId = Bukkit.getScheduler().scheduleSyncRepeatingTask( - Main.instance(), - this::updateScoreboards, - Ticks.TICKS_PER_SECOND, - Ticks.TICKS_PER_SECOND - ); - } - - private void updateScoreboards() { - Bukkit.getOnlinePlayers().forEach(this::updateScoreboard); + this.getScoreboardBuilder().updateScoreboards(); } @Override @@ -66,14 +46,12 @@ public class Deathrun extends AbstractEvent { } @Override - public String displayName() { - return "Deathrun"; + public List getPlayers() { + return List.of(); } @Override - protected @NotNull List listeners() { - return List.of( - new DeathrunListener() - ); + public String displayName() { + return "Deathrun"; } } diff --git a/event/src/main/java/eu/mhsl/craftattack/spawn/event/appliances/deathrun/DeathrunListener.java b/event/src/main/java/eu/mhsl/craftattack/spawn/event/appliances/deathrun/DeathrunListener.java deleted file mode 100644 index cd56f80..0000000 --- a/event/src/main/java/eu/mhsl/craftattack/spawn/event/appliances/deathrun/DeathrunListener.java +++ /dev/null @@ -1,15 +0,0 @@ -package eu.mhsl.craftattack.spawn.event.appliances.deathrun; - -import eu.mhsl.craftattack.spawn.core.appliance.ApplianceListener; -import org.bukkit.event.EventHandler; -import org.bukkit.event.player.PlayerMoveEvent; - -class DeathrunListener extends ApplianceListener { - @EventHandler - public void onPlayerMove(PlayerMoveEvent event) { - if(!event.hasChangedPosition()) return; - if(event.getTo().clone().subtract(event.getFrom()).x() == 0) return; - - this.getAppliance().updateScore(event.getPlayer()); - } -} diff --git a/event/src/main/java/eu/mhsl/craftattack/spawn/event/appliances/eventController/AbstractEvent.java b/event/src/main/java/eu/mhsl/craftattack/spawn/event/appliances/eventController/AbstractEvent.java index 63ca6ce..540974b 100644 --- a/event/src/main/java/eu/mhsl/craftattack/spawn/event/appliances/eventController/AbstractEvent.java +++ b/event/src/main/java/eu/mhsl/craftattack/spawn/event/appliances/eventController/AbstractEvent.java @@ -11,17 +11,7 @@ import java.util.*; public abstract class AbstractEvent extends Appliance implements Event { private final Map playerScoreboards = new HashMap<>(); private final List playerScores = new ArrayList<>(); - private final EventScoreboardBuilder scoreboardBuilder = new EventScoreboardBuilder(3, 2, 3); - - @Override - public Map getPlayerScoreboards() { - return this.playerScoreboards; - } - - @Override - public List getPlayerScores() { - return this.playerScores; - } + private final EventScoreboardBuilder scoreboardBuilder = new EventScoreboardBuilder(this, 3, 2, 3); @Override public EventScoreboardBuilder getScoreboardBuilder() { diff --git a/event/src/main/java/eu/mhsl/craftattack/spawn/event/appliances/eventController/Event.java b/event/src/main/java/eu/mhsl/craftattack/spawn/event/appliances/eventController/Event.java index 8312404..70e4f4d 100644 --- a/event/src/main/java/eu/mhsl/craftattack/spawn/event/appliances/eventController/Event.java +++ b/event/src/main/java/eu/mhsl/craftattack/spawn/event/appliances/eventController/Event.java @@ -1,31 +1,16 @@ package eu.mhsl.craftattack.spawn.event.appliances.eventController; -import eu.mhsl.craftattack.spawn.event.appliances.eventController.scoreboard.EventScoreEntry; import eu.mhsl.craftattack.spawn.event.appliances.eventController.scoreboard.EventScoreboardBuilder; import org.bukkit.entity.Player; -import org.bukkit.scoreboard.Scoreboard; import java.util.List; -import java.util.Map; -import java.util.UUID; public interface Event { String displayName(); - Map getPlayerScoreboards(); - List getPlayerScores(); EventScoreboardBuilder getScoreboardBuilder(); void start(); void stop(); + List getPlayers(); int getScore(Player p); - default void updateScore(Player p) { - System.out.println(this.getPlayerScores().removeIf(entry -> entry.playerUuid().equals(p.getUniqueId()))); - this.getPlayerScores().add(new EventScoreEntry(p.getUniqueId(), p.getName(), this.getScore(p))); - } - default void updateScoreboard(Player p) { - this.updateScore(p); - Scoreboard scoreboard = this.getScoreboardBuilder().buildFor(p, this); - this.getPlayerScoreboards().put(p.getUniqueId(), scoreboard); - p.setScoreboard(scoreboard); - } } diff --git a/event/src/main/java/eu/mhsl/craftattack/spawn/event/appliances/eventController/EventController.java b/event/src/main/java/eu/mhsl/craftattack/spawn/event/appliances/eventController/EventController.java index 0673815..0e92a99 100644 --- a/event/src/main/java/eu/mhsl/craftattack/spawn/event/appliances/eventController/EventController.java +++ b/event/src/main/java/eu/mhsl/craftattack/spawn/event/appliances/eventController/EventController.java @@ -26,7 +26,6 @@ public class EventController extends Appliance { public void enableEvent(Appliance event) { this.getEventAppliances().forEach(appliance -> appliance.disableSequence(Main.instance())); Main.instance().restartAppliance(event.getClass()); -// Main.instance().getAppliance(event.getClass()) } public void disableEvent(Appliance event) { diff --git a/event/src/main/java/eu/mhsl/craftattack/spawn/event/appliances/eventController/scoreboard/EventScoreboardBuilder.java b/event/src/main/java/eu/mhsl/craftattack/spawn/event/appliances/eventController/scoreboard/EventScoreboardBuilder.java index c4941f5..80133d4 100644 --- a/event/src/main/java/eu/mhsl/craftattack/spawn/event/appliances/eventController/scoreboard/EventScoreboardBuilder.java +++ b/event/src/main/java/eu/mhsl/craftattack/spawn/event/appliances/eventController/scoreboard/EventScoreboardBuilder.java @@ -1,42 +1,58 @@ package eu.mhsl.craftattack.spawn.event.appliances.eventController.scoreboard; +import eu.mhsl.craftattack.spawn.core.Main; import eu.mhsl.craftattack.spawn.event.appliances.eventController.Event; import net.kyori.adventure.text.Component; import net.kyori.adventure.text.format.NamedTextColor; +import net.kyori.adventure.util.Ticks; import org.bukkit.Bukkit; import org.bukkit.entity.Player; import org.bukkit.scoreboard.DisplaySlot; import org.bukkit.scoreboard.Objective; import org.bukkit.scoreboard.Scoreboard; -import java.util.Comparator; -import java.util.List; +import java.util.*; import java.util.stream.IntStream; public class EventScoreboardBuilder { private final int topPlaces; private final int aroundPlaces; private final int bottomPlaces; + private final Event event; + private final Comparator scoreComparator; + private final List playerScores = new ArrayList<>(); + private final Map playerScoreboardMap = new HashMap<>(); + private int scoreboardUpdateTaskId = -1; - public EventScoreboardBuilder(int topPlaces, int aroundPlaces, int bottomPlaces) { + public EventScoreboardBuilder(Event event) { + this(event, 3, 2, 3); + } + + public EventScoreboardBuilder(Event event, int topPlaces, int aroundPlaces, int bottomPlaces) { + this(event, topPlaces, aroundPlaces, bottomPlaces, Comparator.comparingInt(EventScoreEntry::score).reversed()); + } + + public EventScoreboardBuilder(Event event, int topPlaces, int aroundPlaces, int bottomPlaces, Comparator scoreComparator) { + this.event = event; this.topPlaces = topPlaces; this.aroundPlaces = aroundPlaces; this.bottomPlaces = bottomPlaces; + this.scoreComparator = scoreComparator; } - public Scoreboard buildFor(Player p, Event event) { - List scoreMap = event.getPlayerScores(); + public Scoreboard buildFor(Player p) { + List scoreMap = this.playerScores; Scoreboard newScoreboard = Bukkit.getScoreboardManager().getNewScoreboard(); Objective objective = newScoreboard.registerNewObjective( "event", "dummy", - Component.text("Scoreboard %s".formatted(event.displayName()), NamedTextColor.GOLD) + Component.text("Scoreboard %s".formatted(this.event.displayName()), NamedTextColor.GOLD) ); objective.setDisplaySlot(DisplaySlot.SIDEBAR); if(scoreMap.isEmpty()) return newScoreboard; - scoreMap.sort(Comparator.comparingInt(EventScoreEntry::score).reversed()); + scoreMap.sort(this.scoreComparator); System.out.print(scoreMap); EventScoreEntry playerScoreEntry = scoreMap.stream() @@ -44,7 +60,7 @@ public class EventScoreboardBuilder { .findFirst() .orElse(null); if(playerScoreEntry == null) { - playerScoreEntry = new EventScoreEntry(p.getUniqueId(), p.getName(), event.getScore(p)); + playerScoreEntry = new EventScoreEntry(p.getUniqueId(), p.getName(), this.event.getScore(p)); scoreMap.add(playerScoreEntry); } @@ -79,9 +95,37 @@ public class EventScoreboardBuilder { objective.getScore(line).setScore(place); }); + this.playerScoreboardMap.put(p.getUniqueId(), newScoreboard); return newScoreboard; } + public void startAutomaticUpdates() { + this.scoreboardUpdateTaskId = Bukkit.getScheduler().scheduleSyncRepeatingTask( + Main.instance(), + this::updateScoreboards, + Ticks.TICKS_PER_SECOND, + Ticks.TICKS_PER_SECOND + ); + } + + public void stopAutomaticUpdates() { + if(this.scoreboardUpdateTaskId != -1) Bukkit.getScheduler().cancelTask(this.scoreboardUpdateTaskId); + this.scoreboardUpdateTaskId = -1; + } + + private void updateScore(Player p) { + this.playerScores.removeIf(entry -> entry.playerUuid().equals(p.getUniqueId())); + this.playerScores.add(new EventScoreEntry(p.getUniqueId(), p.getName(), this.event.getScore(p))); + } + + public void updateScoreboards() { + Bukkit.getOnlinePlayers().forEach(player -> { + this.updateScore(player); + Scoreboard scoreboard = this.buildFor(player); + player.setScoreboard(scoreboard); + }); + } + private String formattedLine(int place, String name, int score) { name = this.trimName(name); return name + ": " + score;