Refactored score system

This commit is contained in:
Elias Müller 2023-10-01 20:54:48 +02:00
parent 91069b76c6
commit 4b82b81d63
8 changed files with 102 additions and 88 deletions

View File

@ -61,7 +61,7 @@ class Deathcube extends StatelessGame {
protected void onPlayerMove(@NotNull PlayerMoveEvent playerMoveEvent) { protected void onPlayerMove(@NotNull PlayerMoveEvent playerMoveEvent) {
super.onPlayerMove(playerMoveEvent); super.onPlayerMove(playerMoveEvent);
if(isBeforeBeginning) if(playerMoveEvent.getNewPosition().y() > 51.5) playerMoveEvent.setCancelled(true); 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 @Override

View File

@ -94,14 +94,13 @@ class Minerun extends StatelessGame {
new ActionBarMessage().appendStatic(Component.text("Please stay in line!", NamedTextColor.RED)).send(p); 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); playerMoveEvent.setCancelled(true);
} }
if(middle.z() < preRun + length + afterMines) { // player cannot go back if(middle.z() < preRun + length + afterMines && getScore().hasResult(p)) { // player cannot go back after winning
// playerMoveEvent.setCancelled(true); playerMoveEvent.setCancelled(true);
// new ActionBarMessage().appendStatic(Component.text("You cannot go back on the Field!", NamedTextColor.RED)).send(p); new ActionBarMessage().appendStatic(Component.text("You cannot go back on the Field!", NamedTextColor.RED)).send(p);
return;
} }
if(Intersect.withPressurePlate(this, BlockPallet.PRESSURE_PLATES, middle)) { //Player died 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 if(middle.z() > preRun + length + afterMines) { // Player finished
getScore().addResult(p); getScore().insertResult(p);
} }
} }

View File

@ -26,7 +26,8 @@ public class Spleef extends StatelessGame {
final int totalElevation = 50; final int totalElevation = 50;
public Spleef(int radius, int stackCount) { 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.radius = radius;
this.stackCount = stackCount; this.stackCount = stackCount;
@ -78,7 +79,7 @@ public class Spleef extends StatelessGame {
if(playerMoveEvent.getNewPosition().y() < totalElevation) { if(playerMoveEvent.getNewPosition().y() < totalElevation) {
playerMoveEvent.getPlayer().setGameMode(GameMode.SPECTATOR); playerMoveEvent.getPlayer().setGameMode(GameMode.SPECTATOR);
playerMoveEvent.getPlayer().getInventory().clear(); playerMoveEvent.getPlayer().getInventory().clear();
getScore().addResult(playerMoveEvent.getPlayer()); getScore().insertResult(playerMoveEvent.getPlayer());
} }
} }

View File

@ -1,46 +1,20 @@
package eu.mhsl.minenet.minigames.score; package eu.mhsl.minenet.minigames.score;
import eu.mhsl.minenet.minigames.message.TranslatableMessage;
import eu.mhsl.minenet.minigames.message.type.TitleMessage; import eu.mhsl.minenet.minigames.message.type.TitleMessage;
import net.minestom.server.entity.Player; import net.minestom.server.entity.Player;
import java.time.Duration; import java.time.Duration;
import java.util.ArrayList; import java.util.Set;
import java.util.List;
public class FirstWinsScore extends Score { public class FirstWinsScore extends Score {
private List<Player> scores = new ArrayList<>(); @Override
private int ignoreLastPlayers = 0; public void insertResultImplementation(Set<Player> p) {
getScores().add(p);
public FirstWinsScore() {}
public FirstWinsScore(int ignoreLastPlayers) {
this.ignoreLastPlayers = ignoreLastPlayers;
}
public void setIgnoreLastPlayers(int ignoreLastPlayers) {
this.ignoreLastPlayers = ignoreLastPlayers;
} }
@Override @Override
protected void checkGameEnd() { protected TranslatableMessage scoreMessage() {
if(this.isDone()) return; return new TitleMessage(Duration.ofMillis(1000), Duration.ofSeconds(1)).appendTranslated("score#finish");
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<String> getResults() {
return scores.stream().map(Player::getUsername).toList();
} }
} }

View File

@ -1,47 +1,20 @@
package eu.mhsl.minenet.minigames.score; package eu.mhsl.minenet.minigames.score;
import eu.mhsl.minenet.minigames.message.TranslatableMessage;
import eu.mhsl.minenet.minigames.message.type.TitleMessage; import eu.mhsl.minenet.minigames.message.type.TitleMessage;
import net.minestom.server.entity.Player; import net.minestom.server.entity.Player;
import java.time.Duration; import java.time.Duration;
import java.util.ArrayList; import java.util.Set;
import java.util.List;
public class LastWinsScore extends Score { public class LastWinsScore extends Score {
private List<Player> scores = new ArrayList<>(); @Override
private int ignoreLastPlayers = 0; public void insertResultImplementation(Set<Player> p) {
getScores().add(0, p);
public LastWinsScore() {}
public LastWinsScore(int ignoreLastPlayers) {
this.ignoreLastPlayers = ignoreLastPlayers;
} }
@Override @Override
protected void checkGameEnd() { protected TranslatableMessage scoreMessage() {
if(this.isDone()) return; return new TitleMessage(Duration.ofMillis(1000), Duration.ofSeconds(1)).appendTranslated("score#death");
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<String> getResults() {
return scores.stream().map(Player::getUsername).toList();
} }
} }

View File

@ -1,8 +1,9 @@
package eu.mhsl.minenet.minigames.score; package eu.mhsl.minenet.minigames.score;
import eu.mhsl.minenet.minigames.message.TranslatableMessage;
import net.minestom.server.entity.Player; import net.minestom.server.entity.Player;
import java.util.List; import java.util.Set;
public class NoScore extends Score { public class NoScore extends Score {
@Override @Override
@ -10,12 +11,14 @@ public class NoScore extends Score {
} }
@Override @Override
public void addResult(Player p) { public void insertResultImplementation(Set<Player> p) {
} }
@Override @Override
protected List<String> getResults() { protected TranslatableMessage scoreMessage() {
return null; return null;
} }
} }

View File

@ -2,17 +2,30 @@ package eu.mhsl.minenet.minigames.score;
import eu.mhsl.minenet.minigames.instance.game.Game; import eu.mhsl.minenet.minigames.instance.game.Game;
import eu.mhsl.minenet.minigames.message.Icon; import eu.mhsl.minenet.minigames.message.Icon;
import eu.mhsl.minenet.minigames.message.TranslatableMessage;
import eu.mhsl.minenet.minigames.message.type.ChatMessage; import eu.mhsl.minenet.minigames.message.type.ChatMessage;
import net.minestom.server.entity.Player; import net.minestom.server.entity.Player;
import net.minestom.server.event.instance.AddEntityToInstanceEvent; import net.minestom.server.event.instance.AddEntityToInstanceEvent;
import net.minestom.server.event.instance.RemoveEntityFromInstanceEvent; import net.minestom.server.event.instance.RemoveEntityFromInstanceEvent;
import net.minestom.server.event.player.PlayerDisconnectEvent; import net.minestom.server.event.player.PlayerDisconnectEvent;
import java.util.ArrayList;
import java.util.List; import java.util.List;
import java.util.Set;
import java.util.stream.Collectors;
public abstract class Score { public abstract class Score {
private boolean isDone = false; private int ignoreLastPlayers = 0;
private boolean isClosed = false;
protected Game instance; protected Game instance;
private List<Set<Player>> scores = new ArrayList<>();
public Score() {}
public Score(int ignoreLastPlayers) {
this.ignoreLastPlayers = ignoreLastPlayers;
}
public void attachListeners() { public void attachListeners() {
this.instance.eventNode() this.instance.eventNode()
@ -21,22 +34,57 @@ public abstract class Score {
.addListener(PlayerDisconnectEvent.class, addEntityToInstanceEvent -> checkGameEnd()); .addListener(PlayerDisconnectEvent.class, addEntityToInstanceEvent -> checkGameEnd());
} }
abstract protected void checkGameEnd(); protected void checkGameEnd() {
public abstract void addResult(Player p); if(this.isClosed()) return;
abstract protected List<String> getResults(); 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<Player> p);
protected abstract TranslatableMessage scoreMessage();
public boolean isDone() { public void insertResult(Player p) {
return isDone; if(hasResult(p)) return;
this.scoreMessage().send(p);
this.insertResultImplementation(Set.of(p));
this.checkGameEnd();
}
private void insertRemainingPlayers(Set<Player> 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() { public void setDone() {
if(isDone) return; if(isClosed) return;
isDone = true; isClosed = true;
new ChatMessage(Icon.STAR, true) new ChatMessage(Icon.STAR, true)
.appendTranslated("score#result") .appendTranslated("score#result")
.newLine() .newLine()
.indent() .indent()
.numberedList(getResults()) .numberedList(
getScores()
.stream()
.map(players -> players
.stream()
.map(Player::getUsername)
.collect(Collectors.joining(", "))
)
.toList()
)
.undent() .undent()
.newLine() .newLine()
.appendTranslated("score#thanks") .appendTranslated("score#thanks")
@ -45,11 +93,27 @@ public abstract class Score {
instance.stop(); instance.stop();
} }
public boolean isClosed() {
return isClosed;
}
protected void onGameEnd() { protected void onGameEnd() {
this.instance.stop(); this.instance.stop();
} }
public List<Set<Player>> getScores() {
return scores;
}
public void setInstance(Game instance) { public void setInstance(Game instance) {
this.instance = instance; this.instance = instance;
} }
public int getIgnoreLastPlayers() {
return ignoreLastPlayers;
}
public void setIgnoreLastPlayers(int ignoreLastPlayers) {
this.ignoreLastPlayers = ignoreLastPlayers;
}
} }