diff --git a/.gradle/7.4/checksums/checksums.lock b/.gradle/7.4/checksums/checksums.lock index 45c9f35..145d569 100644 Binary files a/.gradle/7.4/checksums/checksums.lock and b/.gradle/7.4/checksums/checksums.lock differ diff --git a/.gradle/7.4/dependencies-accessors/dependencies-accessors.lock b/.gradle/7.4/dependencies-accessors/dependencies-accessors.lock index b49701e..3e6137a 100644 Binary files a/.gradle/7.4/dependencies-accessors/dependencies-accessors.lock and b/.gradle/7.4/dependencies-accessors/dependencies-accessors.lock differ diff --git a/.gradle/7.4/executionHistory/executionHistory.bin b/.gradle/7.4/executionHistory/executionHistory.bin index 0dfa9c3..1eaa468 100644 Binary files a/.gradle/7.4/executionHistory/executionHistory.bin and b/.gradle/7.4/executionHistory/executionHistory.bin differ diff --git a/.gradle/7.4/executionHistory/executionHistory.lock b/.gradle/7.4/executionHistory/executionHistory.lock index a87e280..881dbb9 100644 Binary files a/.gradle/7.4/executionHistory/executionHistory.lock and b/.gradle/7.4/executionHistory/executionHistory.lock differ diff --git a/.gradle/7.4/fileHashes/fileHashes.bin b/.gradle/7.4/fileHashes/fileHashes.bin index 3ee621a..c8728ff 100644 Binary files a/.gradle/7.4/fileHashes/fileHashes.bin and b/.gradle/7.4/fileHashes/fileHashes.bin differ diff --git a/.gradle/7.4/fileHashes/fileHashes.lock b/.gradle/7.4/fileHashes/fileHashes.lock index deb4dcd..bcbb142 100644 Binary files a/.gradle/7.4/fileHashes/fileHashes.lock and b/.gradle/7.4/fileHashes/fileHashes.lock differ diff --git a/.gradle/7.4/fileHashes/resourceHashesCache.bin b/.gradle/7.4/fileHashes/resourceHashesCache.bin index ef5f3d7..fbf0bed 100644 Binary files a/.gradle/7.4/fileHashes/resourceHashesCache.bin and b/.gradle/7.4/fileHashes/resourceHashesCache.bin differ diff --git a/.gradle/buildOutputCleanup/buildOutputCleanup.lock b/.gradle/buildOutputCleanup/buildOutputCleanup.lock index a80a216..e8a0767 100644 Binary files a/.gradle/buildOutputCleanup/buildOutputCleanup.lock and b/.gradle/buildOutputCleanup/buildOutputCleanup.lock differ diff --git a/.idea/misc.xml b/.idea/misc.xml index 0852492..4903e32 100644 --- a/.idea/misc.xml +++ b/.idea/misc.xml @@ -1,4 +1,3 @@ - diff --git a/.idea/modules.xml b/.idea/modules.xml index 774f6ac..a057ca1 100644 --- a/.idea/modules.xml +++ b/.idea/modules.xml @@ -4,6 +4,8 @@ + + \ No newline at end of file diff --git a/.idea/modules/Minigames.main.iml b/.idea/modules/Minigames.main.iml index c462275..e2243fb 100644 --- a/.idea/modules/Minigames.main.iml +++ b/.idea/modules/Minigames.main.iml @@ -9,4 +9,8 @@ + + + + \ No newline at end of file diff --git a/.idea/modules/Minigames.test.iml b/.idea/modules/Minigames.test.iml index c462275..e2243fb 100644 --- a/.idea/modules/Minigames.test.iml +++ b/.idea/modules/Minigames.test.iml @@ -9,4 +9,8 @@ + + + + \ No newline at end of file diff --git a/.idea/modules/eu.mhsl.minenet.Minigames.main.iml b/.idea/modules/eu.mhsl.minenet.Minigames.main.iml new file mode 100644 index 0000000..c462275 --- /dev/null +++ b/.idea/modules/eu.mhsl.minenet.Minigames.main.iml @@ -0,0 +1,12 @@ + + + + + + + ADVENTURE + + + + + \ No newline at end of file diff --git a/.idea/modules/eu.mhsl.minenet.Minigames.test.iml b/.idea/modules/eu.mhsl.minenet.Minigames.test.iml new file mode 100644 index 0000000..c462275 --- /dev/null +++ b/.idea/modules/eu.mhsl.minenet.Minigames.test.iml @@ -0,0 +1,12 @@ + + + + + + + ADVENTURE + + + + + \ No newline at end of file diff --git a/build.gradle b/build.gradle index f63a750..741891b 100644 --- a/build.gradle +++ b/build.gradle @@ -33,7 +33,11 @@ dependencies { //https://jitpack.io/#Minestom/Minestom //implementation 'com.github.Minestom:Minestom:aa621021e2' - implementation 'com.github.Minestom.Minestom:Minestom:79ce9570ea' + //implementation 'com.github.Minestom.Minestom:Minestom:4f7ff5b474' +// implementation 'com.github.Minestom.Minestom:Minestom:2cdb3911b0' +// implementation 'com.github.Minestom:MinestomDataGenerator:ddde11056e' + implementation 'com.github.waxeria:Minestom:e0427a36f3' + //Tools //implementation 'com.github.Articdive.JNoise:jnoise-core:4.0.0' diff --git a/build/resources/main/lang/locales.map.csv b/build/resources/main/lang/locales.map.csv index 90e9f3b..bc31d23 100644 --- a/build/resources/main/lang/locales.map.csv +++ b/build/resources/main/lang/locales.map.csv @@ -37,7 +37,8 @@ join_notFound;Lobby not found: ;Lobby konnte nicht gefunden werden: ns:score#;; result;Results;Ergebnisse thanks;Thank you for Playing;Danke für‘s spielen -finish;Finish;Fertig +finish;Yout did it;Du hast es geschafft +death;You are out;Du hast verloren ;; ns:restriction#;; fail;Some requirements are not met;Bedinungen sind nicht erfüllt @@ -83,3 +84,8 @@ description;Only go forward if the Trafficlights show green;Gehe nur bei Grün v ns:game_Towerdefense#;; name;Towerdefense;Towerdefense description;Protect the path ????;?????? +;; +ns:game_Spleef#;; +name;Spleef;Spleef; +description;Spleef other players and be the last survivor;Zerstöre Blöcke unter anderen Spielern und sei der letzte im Feld +shovelName;Snow thrower;Schneeflug \ No newline at end of file diff --git a/build/tmp/compileJava/previous-compilation-data.bin b/build/tmp/compileJava/previous-compilation-data.bin index df60fe6..19befc1 100644 Binary files a/build/tmp/compileJava/previous-compilation-data.bin and b/build/tmp/compileJava/previous-compilation-data.bin differ diff --git a/resources/lang/locales.map.csv b/resources/lang/locales.map.csv index 90e9f3b..bc31d23 100644 --- a/resources/lang/locales.map.csv +++ b/resources/lang/locales.map.csv @@ -37,7 +37,8 @@ join_notFound;Lobby not found: ;Lobby konnte nicht gefunden werden: ns:score#;; result;Results;Ergebnisse thanks;Thank you for Playing;Danke für‘s spielen -finish;Finish;Fertig +finish;Yout did it;Du hast es geschafft +death;You are out;Du hast verloren ;; ns:restriction#;; fail;Some requirements are not met;Bedinungen sind nicht erfüllt @@ -83,3 +84,8 @@ description;Only go forward if the Trafficlights show green;Gehe nur bei Grün v ns:game_Towerdefense#;; name;Towerdefense;Towerdefense description;Protect the path ????;?????? +;; +ns:game_Spleef#;; +name;Spleef;Spleef; +description;Spleef other players and be the last survivor;Zerstöre Blöcke unter anderen Spielern und sei der letzte im Feld +shovelName;Snow thrower;Schneeflug \ No newline at end of file diff --git a/src/main/java/eu/mhsl/minenet/minigames/instance/game/Game.java b/src/main/java/eu/mhsl/minenet/minigames/instance/game/Game.java index 9d61f3c..7ddb040 100644 --- a/src/main/java/eu/mhsl/minenet/minigames/instance/game/Game.java +++ b/src/main/java/eu/mhsl/minenet/minigames/instance/game/Game.java @@ -101,7 +101,7 @@ public abstract class Game extends MineNetInstance implements Spawnable { }, TaskSchedule.seconds(10), TaskSchedule.stop()); } - protected void onLoad(CompletableFuture callback) { + protected void onLoad(@NotNull CompletableFuture callback) { callback.complete(null); } @@ -133,7 +133,7 @@ public abstract class Game extends MineNetInstance implements Spawnable { protected void checkAbandoned() { scheduleNextTick((instance) -> { - if(instance.getPlayers().size() == 0) this.unload(); + if(instance.getPlayers().isEmpty()) this.unload(); }); } diff --git a/src/main/java/eu/mhsl/minenet/minigames/instance/game/stateless/StatelessGame.java b/src/main/java/eu/mhsl/minenet/minigames/instance/game/stateless/StatelessGame.java index d0a2afb..101db05 100644 --- a/src/main/java/eu/mhsl/minenet/minigames/instance/game/stateless/StatelessGame.java +++ b/src/main/java/eu/mhsl/minenet/minigames/instance/game/stateless/StatelessGame.java @@ -18,14 +18,14 @@ import java.util.concurrent.CompletableFuture; public class StatelessGame extends Game { private final String name; - private final Score score = new Score(this); + private Score score; private int timeLimit = 0; private int timePlayed = 0; private final boolean preventExit = false; - public StatelessGame(DimensionType dimensionType, String gameName) { + public StatelessGame(DimensionType dimensionType, String gameName, Score score) { super(dimensionType); - + this.score = score; this.name = gameName; } @@ -61,6 +61,9 @@ public class StatelessGame extends Game { @Override protected void start() { + score.setInstance(this); + score.attachListeners(); + countdownStart().thenRun(() -> { super.start(); diff --git a/src/main/java/eu/mhsl/minenet/minigames/instance/game/stateless/types/backrooms/Backrooms.java b/src/main/java/eu/mhsl/minenet/minigames/instance/game/stateless/types/backrooms/Backrooms.java index 0499e07..18d558d 100644 --- a/src/main/java/eu/mhsl/minenet/minigames/instance/game/stateless/types/backrooms/Backrooms.java +++ b/src/main/java/eu/mhsl/minenet/minigames/instance/game/stateless/types/backrooms/Backrooms.java @@ -2,13 +2,19 @@ package eu.mhsl.minenet.minigames.instance.game.stateless.types.backrooms; import eu.mhsl.minenet.minigames.instance.Dimension; import eu.mhsl.minenet.minigames.instance.game.stateless.StatelessGame; +import eu.mhsl.minenet.minigames.score.NoScore; +import net.minestom.server.event.player.PlayerBlockBreakEvent; +import org.jetbrains.annotations.NotNull; public class Backrooms extends StatelessGame { public Backrooms() { - super(Dimension.NETHER.DIMENSION, "Backrooms"); + super(Dimension.NETHER.DIMENSION, "Backrooms", new NoScore()); BackroomsGenerator generator = new BackroomsGenerator(); setGenerator(unit -> generator.generateRoom(unit, 50)); } - + @Override + protected void onBlockBreak(@NotNull PlayerBlockBreakEvent playerBlockBreakEvent) { + playerBlockBreakEvent.setCancelled(false); + } } diff --git a/src/main/java/eu/mhsl/minenet/minigames/instance/game/stateless/types/bedwars/Bedwars.java b/src/main/java/eu/mhsl/minenet/minigames/instance/game/stateless/types/bedwars/Bedwars.java index 6b50f52..37d417f 100644 --- a/src/main/java/eu/mhsl/minenet/minigames/instance/game/stateless/types/bedwars/Bedwars.java +++ b/src/main/java/eu/mhsl/minenet/minigames/instance/game/stateless/types/bedwars/Bedwars.java @@ -5,6 +5,7 @@ import eu.mhsl.minenet.minigames.instance.Dimension; import eu.mhsl.minenet.minigames.instance.game.stateless.StatelessGame; import eu.mhsl.minenet.minigames.instance.game.stateless.types.bedwars.data.BedwarsTeam; import eu.mhsl.minenet.minigames.message.type.ActionBarMessage; +import eu.mhsl.minenet.minigames.score.LastWinsScore; import eu.mhsl.minenet.minigames.util.MaterialUtil; import eu.mhsl.minenet.minigames.util.Position; import net.kyori.adventure.text.Component; @@ -37,7 +38,7 @@ public class Bedwars extends StatelessGame { public Bedwars() throws IOException { - super(Dimension.OVERWORLD.DIMENSION, "Bedwars"); + super(Dimension.OVERWORLD.DIMENSION, "Bedwars", new LastWinsScore()); setChunkLoader(new AnvilLoader(Resource.GAME_MAP.getPath().resolve("bedwars/test"))); Configuration config = ConfigurationProvider.getProvider(YamlConfiguration.class).load(Resource.GAME_MAP.getPath().resolve("bedwars/test/config.yml").toFile()); diff --git a/src/main/java/eu/mhsl/minenet/minigames/instance/game/stateless/types/deathcube/Deathcube.java b/src/main/java/eu/mhsl/minenet/minigames/instance/game/stateless/types/deathcube/Deathcube.java index 00e41d9..f67f0d1 100644 --- a/src/main/java/eu/mhsl/minenet/minigames/instance/game/stateless/types/deathcube/Deathcube.java +++ b/src/main/java/eu/mhsl/minenet/minigames/instance/game/stateless/types/deathcube/Deathcube.java @@ -1,6 +1,7 @@ package eu.mhsl.minenet.minigames.instance.game.stateless.types.deathcube; import eu.mhsl.minenet.minigames.instance.game.stateless.StatelessGame; +import eu.mhsl.minenet.minigames.score.FirstWinsScore; import eu.mhsl.minenet.minigames.util.BatchUtil; import eu.mhsl.minenet.minigames.instance.Dimension; import eu.mhsl.minenet.minigames.world.generator.BlockPallet; @@ -22,7 +23,7 @@ class Deathcube extends StatelessGame { final int percentage; public Deathcube(int radius, int height, int percentage, int pvpEnabled) { - super(Dimension.THE_END.DIMENSION, "Deathcube"); + super(Dimension.THE_END.DIMENSION, "Deathcube", new FirstWinsScore()); this.radius = radius; this.height = height + 49; this.percentage = percentage; @@ -38,7 +39,7 @@ class Deathcube extends StatelessGame { } @Override - protected void onLoad(CompletableFuture callback) { + protected void onLoad(@NotNull CompletableFuture callback) { AbsoluteBlockBatch batch = new AbsoluteBlockBatch(); for(int x = -radius; x <= radius; x++) { diff --git a/src/main/java/eu/mhsl/minenet/minigames/instance/game/stateless/types/minerun/Minerun.java b/src/main/java/eu/mhsl/minenet/minigames/instance/game/stateless/types/minerun/Minerun.java index b58ce05..9e28a7a 100644 --- a/src/main/java/eu/mhsl/minenet/minigames/instance/game/stateless/types/minerun/Minerun.java +++ b/src/main/java/eu/mhsl/minenet/minigames/instance/game/stateless/types/minerun/Minerun.java @@ -2,6 +2,7 @@ package eu.mhsl.minenet.minigames.instance.game.stateless.types.minerun; import eu.mhsl.minenet.minigames.instance.game.stateless.StatelessGame; import eu.mhsl.minenet.minigames.message.type.ActionBarMessage; +import eu.mhsl.minenet.minigames.score.FirstWinsScore; import eu.mhsl.minenet.minigames.util.BatchUtil; import eu.mhsl.minenet.minigames.util.Intersect; import eu.mhsl.minenet.minigames.instance.Dimension; @@ -24,16 +25,16 @@ import java.util.concurrent.CompletableFuture; class Minerun extends StatelessGame { - private int minePercentage = 50; - private int width = 100; - private int length = 50; + private int minePercentage; + private int width; + private int length; private final int preRun = 5; private final int afterMines = 2; private final int afterFinishLine = 10; public Minerun(int width, int length, int minePercentage) { - super(Dimension.THE_END.DIMENSION, "Minerun"); + super(Dimension.THE_END.DIMENSION, "Minerun", new FirstWinsScore()); setGenerator(new SquareTerrainGenerator(width, length + preRun + afterFinishLine, true)); this.width = width; @@ -42,7 +43,7 @@ class Minerun extends StatelessGame { } @Override - protected void onLoad(CompletableFuture callback) { + protected void onLoad(@NotNull CompletableFuture callback) { int spawnToFinishLine = preRun + length + afterMines; Random random = new Random(); @@ -97,9 +98,9 @@ class Minerun extends StatelessGame { playerMoveEvent.setCancelled(true); } - if(getScore().hasResult(p) && middle.z() < preRun + length + afterMines) { // player cannot go back - playerMoveEvent.setCancelled(true); - new ActionBarMessage().appendStatic(Component.text("You cannot go back on the Field!", NamedTextColor.RED)).send(p); + if(middle.z() < preRun + length + afterMines) { // player cannot go back +// playerMoveEvent.setCancelled(true); +// new ActionBarMessage().appendStatic(Component.text("You cannot go back on the Field!", NamedTextColor.RED)).send(p); return; } diff --git a/src/main/java/eu/mhsl/minenet/minigames/instance/game/stateless/types/stickfight/Stickfight.java b/src/main/java/eu/mhsl/minenet/minigames/instance/game/stateless/types/stickfight/Stickfight.java index 1748758..39d9221 100644 --- a/src/main/java/eu/mhsl/minenet/minigames/instance/game/stateless/types/stickfight/Stickfight.java +++ b/src/main/java/eu/mhsl/minenet/minigames/instance/game/stateless/types/stickfight/Stickfight.java @@ -2,6 +2,7 @@ package eu.mhsl.minenet.minigames.instance.game.stateless.types.stickfight; import eu.mhsl.minenet.minigames.instance.Dimension; import eu.mhsl.minenet.minigames.instance.game.stateless.StatelessGame; +import eu.mhsl.minenet.minigames.score.LastWinsScore; import eu.mhsl.minenet.minigames.util.BatchUtil; import eu.mhsl.minenet.minigames.world.generator.terrain.CircularTerrainGenerator; import io.github.bloepiloepi.pvp.config.*; @@ -17,7 +18,7 @@ import java.util.concurrent.CompletableFuture; public class Stickfight extends StatelessGame { public Stickfight() { - super(Dimension.OVERWORLD.DIMENSION, "Stickfight"); + super(Dimension.OVERWORLD.DIMENSION, "Stickfight", new LastWinsScore()); eventNode().addChild( PvPConfig.emptyBuilder() @@ -35,7 +36,7 @@ public class Stickfight extends StatelessGame { } @Override - protected void onLoad(CompletableFuture callback) { + protected void onLoad(@NotNull CompletableFuture callback) { AbsoluteBlockBatch batch = new AbsoluteBlockBatch(); for (int z = -10; z <= 10; z++) { batch.setBlock(0, 50, z, Block.SANDSTONE); diff --git a/src/main/java/eu/mhsl/minenet/minigames/instance/game/stateless/types/towerdefense/Towerdefense.java b/src/main/java/eu/mhsl/minenet/minigames/instance/game/stateless/types/towerdefense/Towerdefense.java index cfb44a0..ff8db5a 100644 --- a/src/main/java/eu/mhsl/minenet/minigames/instance/game/stateless/types/towerdefense/Towerdefense.java +++ b/src/main/java/eu/mhsl/minenet/minigames/instance/game/stateless/types/towerdefense/Towerdefense.java @@ -3,13 +3,14 @@ package eu.mhsl.minenet.minigames.instance.game.stateless.types.towerdefense; import eu.mhsl.minenet.minigames.instance.Dimension; import eu.mhsl.minenet.minigames.instance.game.stateless.StatelessGame; import eu.mhsl.minenet.minigames.instance.game.stateless.types.towerdefense.generator.MazeGenerator; +import eu.mhsl.minenet.minigames.score.NoScore; import net.minestom.server.entity.Player; import net.minestom.server.item.ItemStack; import net.minestom.server.item.Material; public class Towerdefense extends StatelessGame { public Towerdefense() { - super(Dimension.NETHER.DIMENSION, "Towerdefense"); + super(Dimension.NETHER.DIMENSION, "Towerdefense", new NoScore()); setGenerator(new MazeGenerator()); } diff --git a/src/main/java/eu/mhsl/minenet/minigames/instance/game/stateless/types/trafficlightrace/TrafficLightRace.java b/src/main/java/eu/mhsl/minenet/minigames/instance/game/stateless/types/trafficlightrace/TrafficLightRace.java index 33ef83c..6bdd271 100644 --- a/src/main/java/eu/mhsl/minenet/minigames/instance/game/stateless/types/trafficlightrace/TrafficLightRace.java +++ b/src/main/java/eu/mhsl/minenet/minigames/instance/game/stateless/types/trafficlightrace/TrafficLightRace.java @@ -1,6 +1,7 @@ package eu.mhsl.minenet.minigames.instance.game.stateless.types.trafficlightrace; import eu.mhsl.minenet.minigames.instance.game.stateless.StatelessGame; +import eu.mhsl.minenet.minigames.score.FirstWinsScore; import eu.mhsl.minenet.minigames.util.BatchUtil; import eu.mhsl.minenet.minigames.instance.Dimension; import net.minestom.server.coordinate.Vec; @@ -18,11 +19,11 @@ class TrafficLightRace extends StatelessGame { private int phaseCounter = 1; public TrafficLightRace() { - super(Dimension.THE_END.DIMENSION, "Ampelrennen"); + super(Dimension.THE_END.DIMENSION, "Ampelrennen", new FirstWinsScore()); } @Override - protected void onLoad(CompletableFuture callback) { + protected void onLoad(@NotNull CompletableFuture callback) { AbsoluteBlockBatch batch = new AbsoluteBlockBatch(); for (int x = -10; x <= 10; x++) { for (int z = 5; z <= 100; z++) { diff --git a/src/main/java/eu/mhsl/minenet/minigames/instance/room/Room.java b/src/main/java/eu/mhsl/minenet/minigames/instance/room/Room.java index c1fb834..73e02a9 100644 --- a/src/main/java/eu/mhsl/minenet/minigames/instance/room/Room.java +++ b/src/main/java/eu/mhsl/minenet/minigames/instance/room/Room.java @@ -13,13 +13,11 @@ import eu.mhsl.minenet.minigames.instance.hub.Hub; import eu.mhsl.minenet.minigames.instance.room.entity.GameSelector; import net.minestom.server.MinecraftServer; import net.minestom.server.coordinate.Pos; +import net.minestom.server.entity.GameMode; import net.minestom.server.entity.Player; import net.minestom.server.event.player.PlayerBlockBreakEvent; import net.minestom.server.event.player.PlayerDisconnectEvent; import net.minestom.server.instance.AnvilLoader; -import team.unnamed.hephaestus.ModelDataCursor; -import team.unnamed.hephaestus.reader.ModelReader; -import team.unnamed.hephaestus.reader.blockbench.BBModelReader; import java.util.*; import java.util.logging.Logger; @@ -55,6 +53,7 @@ public class Room extends MineNetInstance implements Spawnable { p.clearEffects(); p.clearTitle(); p.getInventory().clear(); + p.setGameMode(GameMode.ADVENTURE); rooms.put(p, room); MoveInstance.move(p, room); } diff --git a/src/main/java/eu/mhsl/minenet/minigames/score/FirstWinsScore.java b/src/main/java/eu/mhsl/minenet/minigames/score/FirstWinsScore.java new file mode 100644 index 0000000..390e94c --- /dev/null +++ b/src/main/java/eu/mhsl/minenet/minigames/score/FirstWinsScore.java @@ -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 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 getResults() { + return scores.stream().map(Player::getUsername).toList(); + } +} diff --git a/src/main/java/eu/mhsl/minenet/minigames/score/LastWinsScore.java b/src/main/java/eu/mhsl/minenet/minigames/score/LastWinsScore.java new file mode 100644 index 0000000..0f600a4 --- /dev/null +++ b/src/main/java/eu/mhsl/minenet/minigames/score/LastWinsScore.java @@ -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 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 getResults() { + return scores.stream().map(Player::getUsername).toList(); + } +} diff --git a/src/main/java/eu/mhsl/minenet/minigames/score/NoScore.java b/src/main/java/eu/mhsl/minenet/minigames/score/NoScore.java new file mode 100644 index 0000000..84cb2d3 --- /dev/null +++ b/src/main/java/eu/mhsl/minenet/minigames/score/NoScore.java @@ -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 getResults() { + return null; + } +} diff --git a/src/main/java/eu/mhsl/minenet/minigames/score/Score.java b/src/main/java/eu/mhsl/minenet/minigames/score/Score.java index 5c6f7e1..5b781b2 100644 --- a/src/main/java/eu/mhsl/minenet/minigames/score/Score.java +++ b/src/main/java/eu/mhsl/minenet/minigames/score/Score.java @@ -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 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 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 getMap() { - return results; - } - - public List getMapFormatted() { - List out = new ArrayList<>(); - - for (Map.Entry entry : getMap().entrySet()) { - out.add(entry.getValue() + ": " + entry.getKey().getUsername()); - } - - return out; - } - - public int countResults() { - return results.size(); - } - } diff --git a/src/main/resources/lang/locales.map.csv b/src/main/resources/lang/locales.map.csv index 90e9f3b..bc31d23 100644 --- a/src/main/resources/lang/locales.map.csv +++ b/src/main/resources/lang/locales.map.csv @@ -37,7 +37,8 @@ join_notFound;Lobby not found: ;Lobby konnte nicht gefunden werden: ns:score#;; result;Results;Ergebnisse thanks;Thank you for Playing;Danke für‘s spielen -finish;Finish;Fertig +finish;Yout did it;Du hast es geschafft +death;You are out;Du hast verloren ;; ns:restriction#;; fail;Some requirements are not met;Bedinungen sind nicht erfüllt @@ -83,3 +84,8 @@ description;Only go forward if the Trafficlights show green;Gehe nur bei Grün v ns:game_Towerdefense#;; name;Towerdefense;Towerdefense description;Protect the path ????;?????? +;; +ns:game_Spleef#;; +name;Spleef;Spleef; +description;Spleef other players and be the last survivor;Zerstöre Blöcke unter anderen Spielern und sei der letzte im Feld +shovelName;Snow thrower;Schneeflug \ No newline at end of file