diff --git a/build/tmp/compileJava/previous-compilation-data.bin b/build/tmp/compileJava/previous-compilation-data.bin deleted file mode 100644 index 98411aa..0000000 Binary files a/build/tmp/compileJava/previous-compilation-data.bin and /dev/null differ diff --git a/src/main/java/eu/mhsl/minenet/minigames/instance/game/stateless/types/deathcube/Deathcube.java b/src/main/java/eu/mhsl/minenet/minigames/instance/game/stateless/types/deathcube/Deathcube.java index f67f0d1..f8710e3 100644 --- a/src/main/java/eu/mhsl/minenet/minigames/instance/game/stateless/types/deathcube/Deathcube.java +++ b/src/main/java/eu/mhsl/minenet/minigames/instance/game/stateless/types/deathcube/Deathcube.java @@ -61,7 +61,7 @@ class Deathcube extends StatelessGame { protected void onPlayerMove(@NotNull PlayerMoveEvent playerMoveEvent) { super.onPlayerMove(playerMoveEvent); if(isBeforeBeginning) if(playerMoveEvent.getNewPosition().y() > 51.5) playerMoveEvent.setCancelled(true); - if(playerMoveEvent.getNewPosition().y() > height) getScore().addResult(playerMoveEvent.getPlayer()); + if(playerMoveEvent.getNewPosition().y() > height) getScore().insertResult(playerMoveEvent.getPlayer()); } @Override diff --git a/src/main/java/eu/mhsl/minenet/minigames/instance/game/stateless/types/minerun/Minerun.java b/src/main/java/eu/mhsl/minenet/minigames/instance/game/stateless/types/minerun/Minerun.java index 9e28a7a..e7da287 100644 --- a/src/main/java/eu/mhsl/minenet/minigames/instance/game/stateless/types/minerun/Minerun.java +++ b/src/main/java/eu/mhsl/minenet/minigames/instance/game/stateless/types/minerun/Minerun.java @@ -94,14 +94,13 @@ class Minerun extends StatelessGame { new ActionBarMessage().appendStatic(Component.text("Please stay in line!", NamedTextColor.RED)).send(p); } - if(!isRunning && middle.z() > preRun+0.5) { //player cannot go forward before game start + if(!isRunning && middle.z() > preRun+0.5) { //player cannot go forward before the game start playerMoveEvent.setCancelled(true); } - if(middle.z() < preRun + length + afterMines) { // player cannot go back -// playerMoveEvent.setCancelled(true); -// new ActionBarMessage().appendStatic(Component.text("You cannot go back on the Field!", NamedTextColor.RED)).send(p); - return; + if(middle.z() < preRun + length + afterMines && getScore().hasResult(p)) { // player cannot go back after winning + playerMoveEvent.setCancelled(true); + new ActionBarMessage().appendStatic(Component.text("You cannot go back on the Field!", NamedTextColor.RED)).send(p); } if(Intersect.withPressurePlate(this, BlockPallet.PRESSURE_PLATES, middle)) { //Player died @@ -111,7 +110,7 @@ class Minerun extends StatelessGame { } if(middle.z() > preRun + length + afterMines) { // Player finished - getScore().addResult(p); + getScore().insertResult(p); } } diff --git a/src/main/java/eu/mhsl/minenet/minigames/instance/game/stateless/types/spleef/Spleef.java b/src/main/java/eu/mhsl/minenet/minigames/instance/game/stateless/types/spleef/Spleef.java index 7078a9e..456388c 100644 --- a/src/main/java/eu/mhsl/minenet/minigames/instance/game/stateless/types/spleef/Spleef.java +++ b/src/main/java/eu/mhsl/minenet/minigames/instance/game/stateless/types/spleef/Spleef.java @@ -26,7 +26,8 @@ public class Spleef extends StatelessGame { final int totalElevation = 50; public Spleef(int radius, int stackCount) { - super(Dimension.OVERWORLD.DIMENSION, "Spleef", new LastWinsScore(1)); + super(Dimension.OVERWORLD.DIMENSION, "Spleef", new LastWinsScore()); + getScore().setIgnoreLastPlayers(1); this.radius = radius; this.stackCount = stackCount; @@ -78,7 +79,7 @@ public class Spleef extends StatelessGame { if(playerMoveEvent.getNewPosition().y() < totalElevation) { playerMoveEvent.getPlayer().setGameMode(GameMode.SPECTATOR); playerMoveEvent.getPlayer().getInventory().clear(); - getScore().addResult(playerMoveEvent.getPlayer()); + getScore().insertResult(playerMoveEvent.getPlayer()); } } diff --git a/src/main/java/eu/mhsl/minenet/minigames/score/FirstWinsScore.java b/src/main/java/eu/mhsl/minenet/minigames/score/FirstWinsScore.java index af542be..bc505dd 100644 --- a/src/main/java/eu/mhsl/minenet/minigames/score/FirstWinsScore.java +++ b/src/main/java/eu/mhsl/minenet/minigames/score/FirstWinsScore.java @@ -1,46 +1,20 @@ package eu.mhsl.minenet.minigames.score; +import eu.mhsl.minenet.minigames.message.TranslatableMessage; import eu.mhsl.minenet.minigames.message.type.TitleMessage; import net.minestom.server.entity.Player; import java.time.Duration; -import java.util.ArrayList; -import java.util.List; +import java.util.Set; public class FirstWinsScore extends Score { - private List scores = new ArrayList<>(); - private int ignoreLastPlayers = 0; - - - public FirstWinsScore() {} - - public FirstWinsScore(int ignoreLastPlayers) { - this.ignoreLastPlayers = ignoreLastPlayers; - } - - public void setIgnoreLastPlayers(int ignoreLastPlayers) { - this.ignoreLastPlayers = ignoreLastPlayers; + @Override + public void insertResultImplementation(Set p) { + getScores().add(p); } @Override - protected void checkGameEnd() { - if(this.isDone()) return; - if(instance.getPlayers().isEmpty()) return; - if(scores.size() >= instance.getPlayers().size() - ignoreLastPlayers) setDone(); - } - - @Override - public void addResult(Player p) { - if(scores.contains(p)) return; - scores.add(p); - - new TitleMessage(Duration.ofMillis(1000), Duration.ofSeconds(1)).appendTranslated("score#finish").send(p); - - this.checkGameEnd(); - } - - @Override - protected List getResults() { - return scores.stream().map(Player::getUsername).toList(); + protected TranslatableMessage scoreMessage() { + return new TitleMessage(Duration.ofMillis(1000), Duration.ofSeconds(1)).appendTranslated("score#finish"); } } diff --git a/src/main/java/eu/mhsl/minenet/minigames/score/LastWinsScore.java b/src/main/java/eu/mhsl/minenet/minigames/score/LastWinsScore.java index dc05cf5..c2bae16 100644 --- a/src/main/java/eu/mhsl/minenet/minigames/score/LastWinsScore.java +++ b/src/main/java/eu/mhsl/minenet/minigames/score/LastWinsScore.java @@ -1,47 +1,20 @@ package eu.mhsl.minenet.minigames.score; +import eu.mhsl.minenet.minigames.message.TranslatableMessage; import eu.mhsl.minenet.minigames.message.type.TitleMessage; import net.minestom.server.entity.Player; import java.time.Duration; -import java.util.ArrayList; -import java.util.List; +import java.util.Set; public class LastWinsScore extends Score { - private List scores = new ArrayList<>(); - private int ignoreLastPlayers = 0; - - public LastWinsScore() {} - - public LastWinsScore(int ignoreLastPlayers) { - this.ignoreLastPlayers = ignoreLastPlayers; + @Override + public void insertResultImplementation(Set p) { + getScores().add(0, p); } @Override - protected void checkGameEnd() { - if(this.isDone()) return; - if(!instance.isRunning()) return; - if(instance.getPlayers().isEmpty()) return; - if(scores.size() >= instance.getPlayers().size() - ignoreLastPlayers) { - if(ignoreLastPlayers > 0) { - instance.getPlayers().stream().filter(player -> !scores.contains(player)).forEach(this::addResult); - } - setDone(); - } - } - - @Override - public void addResult(Player p) { - if(scores.contains(p)) return; - scores.add(0, p); - - new TitleMessage(Duration.ofMillis(1000), Duration.ofSeconds(1)).appendTranslated("score#death").send(p); - - this.checkGameEnd(); - } - - @Override - protected List getResults() { - return scores.stream().map(Player::getUsername).toList(); + protected TranslatableMessage scoreMessage() { + return new TitleMessage(Duration.ofMillis(1000), Duration.ofSeconds(1)).appendTranslated("score#death"); } } diff --git a/src/main/java/eu/mhsl/minenet/minigames/score/NoScore.java b/src/main/java/eu/mhsl/minenet/minigames/score/NoScore.java index 84cb2d3..91478d5 100644 --- a/src/main/java/eu/mhsl/minenet/minigames/score/NoScore.java +++ b/src/main/java/eu/mhsl/minenet/minigames/score/NoScore.java @@ -1,8 +1,9 @@ package eu.mhsl.minenet.minigames.score; +import eu.mhsl.minenet.minigames.message.TranslatableMessage; import net.minestom.server.entity.Player; -import java.util.List; +import java.util.Set; public class NoScore extends Score { @Override @@ -10,12 +11,14 @@ public class NoScore extends Score { } @Override - public void addResult(Player p) { + public void insertResultImplementation(Set p) { } @Override - protected List getResults() { + protected TranslatableMessage scoreMessage() { return null; } + + } diff --git a/src/main/java/eu/mhsl/minenet/minigames/score/Score.java b/src/main/java/eu/mhsl/minenet/minigames/score/Score.java index 225fc29..7ad4c15 100644 --- a/src/main/java/eu/mhsl/minenet/minigames/score/Score.java +++ b/src/main/java/eu/mhsl/minenet/minigames/score/Score.java @@ -2,17 +2,30 @@ package eu.mhsl.minenet.minigames.score; import eu.mhsl.minenet.minigames.instance.game.Game; import eu.mhsl.minenet.minigames.message.Icon; +import eu.mhsl.minenet.minigames.message.TranslatableMessage; import eu.mhsl.minenet.minigames.message.type.ChatMessage; import net.minestom.server.entity.Player; import net.minestom.server.event.instance.AddEntityToInstanceEvent; import net.minestom.server.event.instance.RemoveEntityFromInstanceEvent; import net.minestom.server.event.player.PlayerDisconnectEvent; +import java.util.ArrayList; import java.util.List; +import java.util.Set; +import java.util.stream.Collectors; public abstract class Score { - private boolean isDone = false; + private int ignoreLastPlayers = 0; + private boolean isClosed = false; protected Game instance; + private List> scores = new ArrayList<>(); + + public Score() {} + + public Score(int ignoreLastPlayers) { + this.ignoreLastPlayers = ignoreLastPlayers; + } + public void attachListeners() { this.instance.eventNode() @@ -21,22 +34,57 @@ public abstract class Score { .addListener(PlayerDisconnectEvent.class, addEntityToInstanceEvent -> checkGameEnd()); } - abstract protected void checkGameEnd(); - public abstract void addResult(Player p); - abstract protected List getResults(); + protected void checkGameEnd() { + if(this.isClosed()) return; + if(!instance.isRunning()) return; + if(instance.getPlayers().isEmpty()) return; + if(resultCount() >= instance.getPlayers().size() - ignoreLastPlayers) { + if(ignoreLastPlayers > 0) { + insertRemainingPlayers(instance.getPlayers().stream().filter(player -> !hasResult(player)).collect(Collectors.toSet())); + } + setDone(); + } + } + protected abstract void insertResultImplementation(Set p); + protected abstract TranslatableMessage scoreMessage(); - public boolean isDone() { - return isDone; + public void insertResult(Player p) { + if(hasResult(p)) return; + this.scoreMessage().send(p); + this.insertResultImplementation(Set.of(p)); + this.checkGameEnd(); + } + + private void insertRemainingPlayers(Set p) { + if(p.stream().anyMatch(this::hasResult)) return; + this.insertResultImplementation((p)); + } + + public boolean hasResult(Player p) { + return this.getScores().stream().anyMatch(players -> players.contains(p)); + } + + public int resultCount() { + return this.getScores().stream().map(Set::size).reduce(Integer::sum).orElse(0); } public void setDone() { - if(isDone) return; - isDone = true; + if(isClosed) return; + isClosed = true; new ChatMessage(Icon.STAR, true) .appendTranslated("score#result") .newLine() .indent() - .numberedList(getResults()) + .numberedList( + getScores() + .stream() + .map(players -> players + .stream() + .map(Player::getUsername) + .collect(Collectors.joining(", ")) + ) + .toList() + ) .undent() .newLine() .appendTranslated("score#thanks") @@ -45,11 +93,27 @@ public abstract class Score { instance.stop(); } + public boolean isClosed() { + return isClosed; + } + protected void onGameEnd() { this.instance.stop(); } + public List> getScores() { + return scores; + } + public void setInstance(Game instance) { this.instance = instance; } + + public int getIgnoreLastPlayers() { + return ignoreLastPlayers; + } + + public void setIgnoreLastPlayers(int ignoreLastPlayers) { + this.ignoreLastPlayers = ignoreLastPlayers; + } }