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.instance.game.stateless.config.Option;
import eu.mhsl.minenet.minigames.message.Icon; import eu.mhsl.minenet.minigames.message.Icon;
import eu.mhsl.minenet.minigames.message.type.ChatMessage; 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.util.CommonEventHandles;
import eu.mhsl.minenet.minigames.instance.Spawnable; import eu.mhsl.minenet.minigames.instance.Spawnable;
import eu.mhsl.minenet.minigames.instance.room.Room; 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 { public abstract class Game extends MineNetInstance implements Spawnable {
protected Room parentRoom;
protected boolean isRunning = false; protected boolean isRunning = false;
protected boolean isBeforeBeginning = true; protected boolean isBeforeBeginning = true;
@ -48,10 +50,15 @@ public abstract class Game extends MineNetInstance implements Spawnable {
.addListener(ItemDropEvent.class, this::onItemDrop); .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) { public static void initialize(GameFactory factory, List<Option<?>> options, Player owner) {
try { try {
Game game = factory.manufacture(options); Game game = factory.manufacture(Room.getRoom(owner).orElseThrow(), options);
game.load(); game.load();
Room.getRoom(owner).orElseThrow().moveMembersToGame(game); 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() { public boolean isRunning() {
return isRunning; return isRunning;
} }

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

@ -1,10 +1,11 @@
package eu.mhsl.minenet.minigames.instance.game.stateless.types.trafficlightrace; 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.GameFactory;
import eu.mhsl.minenet.minigames.instance.game.stateless.config.ConfigManager; 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.Option;
import eu.mhsl.minenet.minigames.instance.game.stateless.config.common.NumericOption; 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 eu.mhsl.minenet.minigames.message.component.TranslatedComponent;
import net.minestom.server.item.Material; import net.minestom.server.item.Material;
@ -24,8 +25,8 @@ public class TrafficLightRaceFactory implements GameFactory {
} }
@Override @Override
public StatelessGame manufacture(Map<String, Option<?>> configuration) { public Game manufacture(Room parent, Map<String, Option<?>> configuration) {
return new TrafficLightRace(configuration.get("width").getAsInt(), configuration.get("length").getAsInt()); return new TrafficLightRace(configuration.get("width").getAsInt(), configuration.get("length").getAsInt()).setParent(parent);
} }
@Override @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.instance.game.Game;
import eu.mhsl.minenet.minigames.message.Icon; import eu.mhsl.minenet.minigames.message.Icon;
import eu.mhsl.minenet.minigames.message.type.ChatMessage; 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.CommonEventHandles;
import eu.mhsl.minenet.minigames.util.MoveInstance; import eu.mhsl.minenet.minigames.util.MoveInstance;
import eu.mhsl.minenet.minigames.instance.Spawnable; 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 UUID uuid = UUID.randomUUID();
public final boolean apiDriven; public final boolean apiDriven;
private GameSelector gameSelector; private GameSelector gameSelector;
private final Tournament tournament = new Tournament();
private Room(Player owner) { private Room(Player owner) {
super(Dimension.THE_END.DIMENSION); super(Dimension.THE_END.DIMENSION);
this.apiDriven = false; this.apiDriven = false;
@ -152,6 +154,10 @@ public class Room extends MineNetInstance implements Spawnable {
.collect(Collectors.toSet()); .collect(Collectors.toSet());
} }
public Tournament getTournament() {
return this.tournament;
}
@Override @Override
public Pos getSpawn() { public Pos getSpawn() {
return new Pos(0.5, 50, 0.5); return new Pos(0.5, 50, 0.5);

View File

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