Refactored Score system

This commit is contained in:
2023-09-30 21:58:08 +02:00
parent 4fc8503d63
commit eecdeff77c
33 changed files with 248 additions and 103 deletions

View File

@@ -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();
}
}

View File

@@ -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();
}
}

View 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;
}
}

View File

@@ -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();
}
}