Refactored Score system
This commit is contained in:
@@ -0,0 +1,45 @@
|
||||
package eu.mhsl.minenet.minigames.score;
|
||||
|
||||
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;
|
||||
|
||||
public class FirstWinsScore extends Score {
|
||||
private List<Player> 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
|
||||
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) {
|
||||
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();
|
||||
}
|
||||
}
|
@@ -0,0 +1,44 @@
|
||||
package eu.mhsl.minenet.minigames.score;
|
||||
|
||||
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;
|
||||
|
||||
public class LastWinsScore extends Score {
|
||||
private List<Player> scores = new ArrayList<>();
|
||||
private int ignoreLastPlayers = 0;
|
||||
|
||||
public LastWinsScore() {}
|
||||
|
||||
public LastWinsScore(int ignoreLastPlayers) {
|
||||
this.ignoreLastPlayers = ignoreLastPlayers;
|
||||
}
|
||||
|
||||
public void setIgnoreLastPlayers(int ignoreLastPlayers) {
|
||||
this.ignoreLastPlayers = ignoreLastPlayers;
|
||||
}
|
||||
|
||||
@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) {
|
||||
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();
|
||||
}
|
||||
}
|
21
src/main/java/eu/mhsl/minenet/minigames/score/NoScore.java
Normal file
21
src/main/java/eu/mhsl/minenet/minigames/score/NoScore.java
Normal file
@@ -0,0 +1,21 @@
|
||||
package eu.mhsl.minenet.minigames.score;
|
||||
|
||||
import net.minestom.server.entity.Player;
|
||||
|
||||
import java.util.List;
|
||||
|
||||
public class NoScore extends Score {
|
||||
@Override
|
||||
protected void checkGameEnd() {
|
||||
}
|
||||
|
||||
@Override
|
||||
public void addResult(Player p) {
|
||||
|
||||
}
|
||||
|
||||
@Override
|
||||
protected List<String> getResults() {
|
||||
return null;
|
||||
}
|
||||
}
|
@@ -1,87 +1,53 @@
|
||||
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.type.ChatMessage;
|
||||
import eu.mhsl.minenet.minigames.message.type.TitleMessage;
|
||||
import eu.mhsl.minenet.minigames.instance.game.Game;
|
||||
import net.minestom.server.entity.Player;
|
||||
import net.minestom.server.event.Event;
|
||||
import net.minestom.server.event.instance.AddEntityToInstanceEvent;
|
||||
import net.minestom.server.event.instance.RemoveEntityFromInstanceEvent;
|
||||
import net.minestom.server.event.player.PlayerDisconnectEvent;
|
||||
|
||||
import java.time.Duration;
|
||||
import java.util.*;
|
||||
import java.util.List;
|
||||
|
||||
public class Score {
|
||||
public abstract class Score {
|
||||
private boolean isDone = false;
|
||||
protected Game instance;
|
||||
|
||||
private boolean closed = false;
|
||||
private final HashMap<Player, Integer> results = new HashMap<>();
|
||||
protected final Game instance;
|
||||
private Runnable callback;
|
||||
public void attachListeners() {
|
||||
this.instance.eventNode()
|
||||
.addListener(AddEntityToInstanceEvent.class, addEntityToInstanceEvent -> checkGameEnd())
|
||||
.addListener(RemoveEntityFromInstanceEvent.class, addEntityToInstanceEvent -> checkGameEnd())
|
||||
.addListener(PlayerDisconnectEvent.class, addEntityToInstanceEvent -> checkGameEnd());
|
||||
}
|
||||
|
||||
public Score(Game instance) {
|
||||
abstract protected void checkGameEnd();
|
||||
public abstract void addResult(Player p);
|
||||
abstract protected List<String> getResults();
|
||||
|
||||
public boolean isDone() {
|
||||
return isDone;
|
||||
}
|
||||
|
||||
public void setDone() {
|
||||
isDone = true;
|
||||
new ChatMessage(Icon.STAR)
|
||||
.appendTranslated("score#result")
|
||||
.indent(1)
|
||||
.pipe()
|
||||
.list(getResults())
|
||||
.indent(-1).newLine()
|
||||
.appendTranslated("score#thanks")
|
||||
.send(instance.getPlayers());
|
||||
|
||||
instance.stop();
|
||||
}
|
||||
|
||||
protected void onGameEnd() {
|
||||
this.instance.stop();
|
||||
}
|
||||
|
||||
public void setInstance(Game instance) {
|
||||
this.instance = instance;
|
||||
|
||||
this.callback = instance::stop;
|
||||
|
||||
instance.eventNode()
|
||||
.addListener(AddEntityToInstanceEvent.class, this::checkGameEnd)
|
||||
.addListener(RemoveEntityFromInstanceEvent.class, this::checkGameEnd)
|
||||
.addListener(PlayerDisconnectEvent.class, this::checkGameEnd);
|
||||
}
|
||||
|
||||
public void onClose(Runnable callback) {
|
||||
this.callback = callback;
|
||||
}
|
||||
|
||||
private void checkGameEnd(Event e) {
|
||||
if(closed) return;
|
||||
if(instance.getPlayers().size() < 1) return;
|
||||
if(countResults() >= instance.getPlayers().size()) {
|
||||
callback.run();
|
||||
|
||||
new ChatMessage(Icon.STAR)
|
||||
.appendTranslated("score#result").indent(1)
|
||||
.list(getMapFormatted())
|
||||
.indent(-1).newLine()
|
||||
.appendTranslated("score#thanks")
|
||||
.send(instance.getPlayers());
|
||||
|
||||
closed = true;
|
||||
}
|
||||
}
|
||||
|
||||
public void addResult(Player p) {
|
||||
if(closed) return;
|
||||
if(results.containsKey(p)) return;
|
||||
results.put(p, countResults()+1);
|
||||
|
||||
new TitleMessage(Duration.ofMillis(500), Duration.ofSeconds(1)).appendTranslated("score#finish").send(p);
|
||||
|
||||
checkGameEnd(null);
|
||||
}
|
||||
|
||||
public boolean hasResult(Player p) {
|
||||
return results.containsKey(p);
|
||||
}
|
||||
|
||||
public HashMap<Player, Integer> getMap() {
|
||||
return results;
|
||||
}
|
||||
|
||||
public List<String> getMapFormatted() {
|
||||
List<String> out = new ArrayList<>();
|
||||
|
||||
for (Map.Entry<Player, Integer> entry : getMap().entrySet()) {
|
||||
out.add(entry.getValue() + ": " + entry.getKey().getUsername());
|
||||
}
|
||||
|
||||
return out;
|
||||
}
|
||||
|
||||
public int countResults() {
|
||||
return results.size();
|
||||
}
|
||||
|
||||
}
|
||||
|
Reference in New Issue
Block a user