Added infrastructure code for game summaries

This commit is contained in:
Elias Müller 2023-12-02 21:24:33 +01:00
parent 894b5464dd
commit c63e4badf4
18 changed files with 110 additions and 54 deletions

View File

@ -5,6 +5,7 @@ import eu.mhsl.minenet.minigames.instance.game.stateless.config.GameFactory;
import eu.mhsl.minenet.minigames.instance.game.stateless.config.Option;
import eu.mhsl.minenet.minigames.message.Icon;
import eu.mhsl.minenet.minigames.message.type.ChatMessage;
import eu.mhsl.minenet.minigames.score.Score;
import eu.mhsl.minenet.minigames.util.CommonEventHandles;
import eu.mhsl.minenet.minigames.instance.Spawnable;
import eu.mhsl.minenet.minigames.instance.room.Room;
@ -27,6 +28,7 @@ import java.util.logging.Logger;
public abstract class Game extends MineNetInstance implements Spawnable {
protected Room parentRoom;
protected boolean isRunning = false;
protected boolean isBeforeBeginning = true;
@ -48,10 +50,15 @@ public abstract class Game extends MineNetInstance implements Spawnable {
.addListener(ItemDropEvent.class, this::onItemDrop);
}
public Game setParent(Room parentRoom) {
this.parentRoom = parentRoom;
return this;
}
public static void initialize(GameFactory factory, List<Option<?>> options, Player owner) {
try {
Game game = factory.manufacture(options);
Game game = factory.manufacture(Room.getRoom(owner).orElseThrow(), options);
game.load();
Room.getRoom(owner).orElseThrow().moveMembersToGame(game);
@ -138,6 +145,10 @@ public abstract class Game extends MineNetInstance implements Spawnable {
});
}
protected void publishScore(Score score) {
this.parentRoom.getTournament().addScore(score);
}
public boolean isRunning() {
return isRunning;
}

View File

@ -18,7 +18,7 @@ import java.util.concurrent.CompletableFuture;
public class StatelessGame extends Game {
private final String name;
private Score score;
private final Score score;
private int timeLimit = 0;
private int timePlayed = 0;
@ -93,11 +93,12 @@ public class StatelessGame extends Game {
public void stop() {
isRunning = false;
this.onStop();
this.publishScore(getScore());
countdownUnload();
}
protected void countdownUnload() {
private void countdownUnload() {
new TitleMessage(Duration.ofSeconds(1)).appendStatic("Finish").send(getPlayers());
scheduler().scheduleTask(this::unload, TaskSchedule.seconds(5), TaskSchedule.stop());
}

View File

@ -1,7 +1,8 @@
package eu.mhsl.minenet.minigames.instance.game.stateless.config;
import eu.mhsl.minenet.minigames.instance.game.stateless.StatelessGame;
import eu.mhsl.minenet.minigames.instance.game.Game;
import eu.mhsl.minenet.minigames.instance.game.stateless.config.restriction.RestrictionHandler;
import eu.mhsl.minenet.minigames.instance.room.Room;
import eu.mhsl.minenet.minigames.message.component.TranslatedComponent;
import net.minestom.server.item.Material;
@ -25,20 +26,20 @@ public interface GameFactory {
return TranslatedComponent.byId("GameFactory#missingDescription");
}
StatelessGame manufacture(Map<String, Option<?>> configuration) throws Exception;
Game manufacture(Room parent, Map<String, Option<?>> configuration) throws Exception;
default StatelessGame manufacture(List<Option<?>> configuration) throws Exception {
if(configuration == null) return manufacture();
default Game manufacture(Room parent, List<Option<?>> configuration) throws Exception {
if(configuration == null) return manufacture(parent);
Map<String, Option<?>> cnf = new HashMap<>();
configuration.forEach(option -> cnf.put(option.getId(), option));
return manufacture(cnf);
return manufacture(parent, cnf);
}
default StatelessGame manufacture() throws Exception {
if(this.configuration() == null) return manufacture(List.of());
default Game manufacture(Room parent) throws Exception {
if(this.configuration() == null) return manufacture(parent, List.of());
return manufacture(this.configuration().getAll());
return manufacture(parent, this.configuration().getAll());
}
}

View File

@ -1,8 +1,9 @@
package eu.mhsl.minenet.minigames.instance.game.stateless.types.acidRain;
import eu.mhsl.minenet.minigames.instance.game.stateless.StatelessGame;
import eu.mhsl.minenet.minigames.instance.game.Game;
import eu.mhsl.minenet.minigames.instance.game.stateless.config.GameFactory;
import eu.mhsl.minenet.minigames.instance.game.stateless.config.Option;
import eu.mhsl.minenet.minigames.instance.room.Room;
import eu.mhsl.minenet.minigames.message.component.TranslatedComponent;
import net.minestom.server.item.Material;
@ -20,7 +21,7 @@ public class AcidRainFactory implements GameFactory {
}
@Override
public StatelessGame manufacture(Map<String, Option<?>> configuration) throws Exception {
return new AcidRain();
public Game manufacture(Room parent, Map<String, Option<?>> configuration) throws Exception {
return new AcidRain().setParent(parent);
}
}

View File

@ -1,8 +1,9 @@
package eu.mhsl.minenet.minigames.instance.game.stateless.types.backrooms;
import eu.mhsl.minenet.minigames.instance.game.stateless.StatelessGame;
import eu.mhsl.minenet.minigames.instance.game.Game;
import eu.mhsl.minenet.minigames.instance.game.stateless.config.GameFactory;
import eu.mhsl.minenet.minigames.instance.game.stateless.config.Option;
import eu.mhsl.minenet.minigames.instance.room.Room;
import eu.mhsl.minenet.minigames.message.component.TranslatedComponent;
import java.util.Map;
@ -14,7 +15,7 @@ public class BackroomsFactory implements GameFactory {
}
@Override
public StatelessGame manufacture(Map<String, Option<?>> configuration) throws Exception {
return new Backrooms();
public Game manufacture(Room parent, Map<String, Option<?>> configuration) throws Exception {
return new Backrooms().setParent(parent);
}
}

View File

@ -1,11 +1,11 @@
package eu.mhsl.minenet.minigames.instance.game.stateless.types.bedwars;
import eu.mhsl.minenet.minigames.instance.game.stateless.StatelessGame;
import eu.mhsl.minenet.minigames.instance.game.stateless.config.ConfigManager;
import eu.mhsl.minenet.minigames.instance.game.Game;
import eu.mhsl.minenet.minigames.instance.game.stateless.config.GameFactory;
import eu.mhsl.minenet.minigames.instance.game.stateless.config.Option;
import eu.mhsl.minenet.minigames.instance.game.stateless.config.restriction.RestrictionHandler;
import eu.mhsl.minenet.minigames.instance.game.stateless.config.restriction.common.MinimalPlayeramountGameRestriction;
import eu.mhsl.minenet.minigames.instance.room.Room;
import eu.mhsl.minenet.minigames.message.component.TranslatedComponent;
import net.minestom.server.item.Material;
@ -34,7 +34,7 @@ public class BedwarsFactory implements GameFactory {
}
@Override
public StatelessGame manufacture(Map<String, Option<?>> configuration) throws Exception {
return new Bedwars();
public Game manufacture(Room parent, Map<String, Option<?>> configuration) throws Exception {
return new Bedwars().setParent(parent);
}
}

View File

@ -1,8 +1,9 @@
package eu.mhsl.minenet.minigames.instance.game.stateless.types.bowSpleef;
import eu.mhsl.minenet.minigames.instance.game.stateless.StatelessGame;
import eu.mhsl.minenet.minigames.instance.game.Game;
import eu.mhsl.minenet.minigames.instance.game.stateless.config.GameFactory;
import eu.mhsl.minenet.minigames.instance.game.stateless.config.Option;
import eu.mhsl.minenet.minigames.instance.room.Room;
import eu.mhsl.minenet.minigames.message.component.TranslatedComponent;
import net.minestom.server.item.Material;
@ -20,7 +21,7 @@ public class BowSpleefFactory implements GameFactory {
}
@Override
public StatelessGame manufacture(Map<String, Option<?>> configuration) throws Exception {
return new BowSpleef();
public Game manufacture(Room parent, Map<String, Option<?>> configuration) throws Exception {
return new BowSpleef().setParent(parent);
}
}

View File

@ -1,10 +1,11 @@
package eu.mhsl.minenet.minigames.instance.game.stateless.types.deathcube;
import eu.mhsl.minenet.minigames.instance.game.stateless.StatelessGame;
import eu.mhsl.minenet.minigames.instance.game.Game;
import eu.mhsl.minenet.minigames.instance.game.stateless.config.GameFactory;
import eu.mhsl.minenet.minigames.instance.game.stateless.config.Option;
import eu.mhsl.minenet.minigames.instance.game.stateless.config.ConfigManager;
import eu.mhsl.minenet.minigames.instance.game.stateless.config.common.NumericOption;
import eu.mhsl.minenet.minigames.instance.room.Room;
import eu.mhsl.minenet.minigames.message.component.TranslatedComponent;
import net.minestom.server.item.Material;
@ -32,8 +33,8 @@ public class DeathcubeFactory implements GameFactory {
}
@Override
public StatelessGame manufacture(Map<String, Option<?>> configuration) {
return new Deathcube(configuration.get("radius").getAsInt(), configuration.get("height").getAsInt(), configuration.get("percentage").getAsInt(), configuration.get("pvpEnabled").getAsInt());
public Game manufacture(Room parent, Map<String, Option<?>> configuration) {
return new Deathcube(configuration.get("radius").getAsInt(), configuration.get("height").getAsInt(), configuration.get("percentage").getAsInt(), configuration.get("pvpEnabled").getAsInt()).setParent(parent);
}
@Override

View File

@ -1,10 +1,11 @@
package eu.mhsl.minenet.minigames.instance.game.stateless.types.elytraRace;
import eu.mhsl.minenet.minigames.instance.game.stateless.StatelessGame;
import eu.mhsl.minenet.minigames.instance.game.Game;
import eu.mhsl.minenet.minigames.instance.game.stateless.config.ConfigManager;
import eu.mhsl.minenet.minigames.instance.game.stateless.config.GameFactory;
import eu.mhsl.minenet.minigames.instance.game.stateless.config.Option;
import eu.mhsl.minenet.minigames.instance.game.stateless.config.common.NumericOption;
import eu.mhsl.minenet.minigames.instance.room.Room;
import eu.mhsl.minenet.minigames.message.component.TranslatedComponent;
import net.minestom.server.item.Material;
@ -28,7 +29,7 @@ public class ElytraRaceFactory implements GameFactory {
}
@Override
public StatelessGame manufacture(Map<String, Option<?>> configuration) throws Exception {
return new ElytraRace(configuration.get("ringCount").getAsInt());
public Game manufacture(Room parent, Map<String, Option<?>> configuration) throws Exception {
return new ElytraRace(configuration.get("ringCount").getAsInt()).setParent(parent);
}
}

View File

@ -1,10 +1,11 @@
package eu.mhsl.minenet.minigames.instance.game.stateless.types.minerun;
import eu.mhsl.minenet.minigames.instance.game.stateless.StatelessGame;
import eu.mhsl.minenet.minigames.instance.game.Game;
import eu.mhsl.minenet.minigames.instance.game.stateless.config.ConfigManager;
import eu.mhsl.minenet.minigames.instance.game.stateless.config.GameFactory;
import eu.mhsl.minenet.minigames.instance.game.stateless.config.Option;
import eu.mhsl.minenet.minigames.instance.game.stateless.config.common.NumericOption;
import eu.mhsl.minenet.minigames.instance.room.Room;
import eu.mhsl.minenet.minigames.message.component.TranslatedComponent;
import net.minestom.server.item.Material;
@ -25,8 +26,8 @@ public class MinerunFactory implements GameFactory {
}
@Override
public StatelessGame manufacture(Map<String, Option<?>> configuration) {
return new Minerun(configuration.get("width").getAsInt(), configuration.get("length").getAsInt(), configuration.get("percentage").getAsInt());
public Game manufacture(Room parent, Map<String, Option<?>> configuration) {
return new Minerun(configuration.get("width").getAsInt(), configuration.get("length").getAsInt(), configuration.get("percentage").getAsInt()).setParent(parent);
}
@Override

View File

@ -1,16 +1,16 @@
package eu.mhsl.minenet.minigames.instance.game.stateless.types.spleef;
import eu.mhsl.minenet.minigames.instance.game.stateless.StatelessGame;
import eu.mhsl.minenet.minigames.instance.game.Game;
import eu.mhsl.minenet.minigames.instance.game.stateless.config.ConfigManager;
import eu.mhsl.minenet.minigames.instance.game.stateless.config.GameFactory;
import eu.mhsl.minenet.minigames.instance.game.stateless.config.Option;
import eu.mhsl.minenet.minigames.instance.game.stateless.config.common.NumericOption;
import eu.mhsl.minenet.minigames.instance.game.stateless.config.restriction.RestrictionHandler;
import eu.mhsl.minenet.minigames.instance.game.stateless.config.restriction.common.MinimalPlayeramountGameRestriction;
import eu.mhsl.minenet.minigames.instance.room.Room;
import eu.mhsl.minenet.minigames.message.component.TranslatedComponent;
import net.minestom.server.item.Material;
import java.util.List;
import java.util.Map;
public class SpleefFactory implements GameFactory {
@ -43,7 +43,7 @@ public class SpleefFactory implements GameFactory {
}
@Override
public StatelessGame manufacture(Map<String, Option<?>> configuration) throws Exception {
return new Spleef(configuration.get("radius").getAsInt(), configuration.get("stackCount").getAsInt());
public Game manufacture(Room parent, Map<String, Option<?>> configuration) throws Exception {
return new Spleef(configuration.get("radius").getAsInt(), configuration.get("stackCount").getAsInt()).setParent(parent);
}
}

View File

@ -1,6 +1,6 @@
package eu.mhsl.minenet.minigames.instance.game.stateless.types.stickfight;
import eu.mhsl.minenet.minigames.instance.game.stateless.StatelessGame;
import eu.mhsl.minenet.minigames.instance.game.Game;
import eu.mhsl.minenet.minigames.instance.game.stateless.config.ConfigManager;
import eu.mhsl.minenet.minigames.instance.game.stateless.config.GameFactory;
import eu.mhsl.minenet.minigames.instance.game.stateless.config.Option;
@ -8,6 +8,7 @@ import eu.mhsl.minenet.minigames.instance.game.stateless.config.common.NumericOp
import eu.mhsl.minenet.minigames.instance.game.stateless.config.restriction.RestrictionHandler;
import eu.mhsl.minenet.minigames.instance.game.stateless.config.restriction.common.MaximalPlayeramountGameRestriction;
import eu.mhsl.minenet.minigames.instance.game.stateless.config.restriction.common.MinimalPlayeramountGameRestriction;
import eu.mhsl.minenet.minigames.instance.room.Room;
import eu.mhsl.minenet.minigames.message.component.TranslatedComponent;
import net.minestom.server.item.Material;
@ -38,8 +39,8 @@ public class StickFightFactory implements GameFactory {
}
@Override
public StatelessGame manufacture(Map<String, Option<?>> configuration) {
return new Stickfight();
public Game manufacture(Room parent, Map<String, Option<?>> configuration) {
return new Stickfight().setParent(parent);
}
@Override

View File

@ -1,10 +1,11 @@
package eu.mhsl.minenet.minigames.instance.game.stateless.types.tntrun;
import eu.mhsl.minenet.minigames.instance.game.stateless.StatelessGame;
import eu.mhsl.minenet.minigames.instance.game.Game;
import eu.mhsl.minenet.minigames.instance.game.stateless.config.ConfigManager;
import eu.mhsl.minenet.minigames.instance.game.stateless.config.GameFactory;
import eu.mhsl.minenet.minigames.instance.game.stateless.config.Option;
import eu.mhsl.minenet.minigames.instance.game.stateless.config.common.NumericOption;
import eu.mhsl.minenet.minigames.instance.room.Room;
import eu.mhsl.minenet.minigames.message.component.TranslatedComponent;
import net.minestom.server.item.Material;
@ -29,7 +30,7 @@ public class TntRunFactory implements GameFactory {
}
@Override
public StatelessGame manufacture(Map<String, Option<?>> configuration) throws Exception {
return new TntRun(configuration.get("radius").getAsInt(), configuration.get("levels").getAsInt());
public Game manufacture(Room parent, Map<String, Option<?>> configuration) throws Exception {
return new TntRun(configuration.get("radius").getAsInt(), configuration.get("levels").getAsInt()).setParent(parent);
}
}

View File

@ -1,8 +1,9 @@
package eu.mhsl.minenet.minigames.instance.game.stateless.types.towerdefense;
import eu.mhsl.minenet.minigames.instance.game.stateless.StatelessGame;
import eu.mhsl.minenet.minigames.instance.game.Game;
import eu.mhsl.minenet.minigames.instance.game.stateless.config.GameFactory;
import eu.mhsl.minenet.minigames.instance.game.stateless.config.Option;
import eu.mhsl.minenet.minigames.instance.room.Room;
import eu.mhsl.minenet.minigames.message.component.TranslatedComponent;
import net.minestom.server.item.Material;
@ -24,7 +25,7 @@ public class TowerdefenseFactory implements GameFactory {
}
@Override
public StatelessGame manufacture(Map<String, Option<?>> configuration) {
return new Towerdefense();
public Game manufacture(Room parent, Map<String, Option<?>> configuration) {
return new Towerdefense().setParent(parent);
}
}

View File

@ -1,10 +1,11 @@
package eu.mhsl.minenet.minigames.instance.game.stateless.types.trafficlightrace;
import eu.mhsl.minenet.minigames.instance.game.stateless.StatelessGame;
import eu.mhsl.minenet.minigames.instance.game.Game;
import eu.mhsl.minenet.minigames.instance.game.stateless.config.GameFactory;
import eu.mhsl.minenet.minigames.instance.game.stateless.config.ConfigManager;
import eu.mhsl.minenet.minigames.instance.game.stateless.config.Option;
import eu.mhsl.minenet.minigames.instance.game.stateless.config.common.NumericOption;
import eu.mhsl.minenet.minigames.instance.room.Room;
import eu.mhsl.minenet.minigames.message.component.TranslatedComponent;
import net.minestom.server.item.Material;
@ -24,8 +25,8 @@ public class TrafficLightRaceFactory implements GameFactory {
}
@Override
public StatelessGame manufacture(Map<String, Option<?>> configuration) {
return new TrafficLightRace(configuration.get("width").getAsInt(), configuration.get("length").getAsInt());
public Game manufacture(Room parent, Map<String, Option<?>> configuration) {
return new TrafficLightRace(configuration.get("width").getAsInt(), configuration.get("length").getAsInt()).setParent(parent);
}
@Override

View File

@ -5,6 +5,7 @@ import eu.mhsl.minenet.minigames.instance.MineNetInstance;
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.score.tournament.Tournament;
import eu.mhsl.minenet.minigames.util.CommonEventHandles;
import eu.mhsl.minenet.minigames.util.MoveInstance;
import eu.mhsl.minenet.minigames.instance.Spawnable;
@ -83,6 +84,7 @@ public class Room extends MineNetInstance implements Spawnable {
public final UUID uuid = UUID.randomUUID();
public final boolean apiDriven;
private GameSelector gameSelector;
private final Tournament tournament = new Tournament();
private Room(Player owner) {
super(Dimension.THE_END.DIMENSION);
this.apiDriven = false;
@ -152,6 +154,10 @@ public class Room extends MineNetInstance implements Spawnable {
.collect(Collectors.toSet());
}
public Tournament getTournament() {
return this.tournament;
}
@Override
public Pos getSpawn() {
return new Pos(0.5, 50, 0.5);

View File

@ -18,7 +18,7 @@ public abstract class Score {
private int ignoreLastPlayers = 0;
private boolean isClosed = false;
protected Game instance;
private List<Set<Player>> scores = new ArrayList<>();
private final List<Set<Player>> scores = new ArrayList<>();
public Score() {}
@ -40,7 +40,7 @@ public abstract class Score {
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()));
insertRemainingPlayers(instance.getPlayers());
}
setDone();
}
@ -55,9 +55,8 @@ public abstract class Score {
this.checkGameEnd();
}
private void insertRemainingPlayers(Set<Player> p) {
if(p.stream().anyMatch(this::hasResult)) return;
this.insertResultImplementation((p));
private void insertRemainingPlayers(Set<Player> players) {
this.insertResultImplementation(players.stream().filter(p -> !hasResult(p)).collect(Collectors.toSet()));
}
public boolean hasResult(Player p) {

View File

@ -0,0 +1,28 @@
package eu.mhsl.minenet.minigames.score.tournament;
import eu.mhsl.minenet.minigames.score.Score;
import net.minestom.server.entity.Player;
import java.util.ArrayList;
import java.util.List;
import java.util.Map;
public class Tournament {
private final List<Score> scores = new ArrayList<>();
public void addScore(Score score) {
this.scores.add(score);
}
public int getScoreCount() {
return this.scores.size();
}
public void reset() {
this.scores.clear();
}
public List<Map<Player, Integer>> getScores() {
return null;
}
}