From 2f70b25e876a4587b81f3dd1668b1aa7aa813831 Mon Sep 17 00:00:00 2001 From: jannis Date: Tue, 10 Feb 2026 19:08:07 +0100 Subject: [PATCH 1/5] added ColorJump --- .../minigames/instance/game/GameList.java | 4 +- .../stateless/types/colorJump/ColorJump.java | 141 ++++++++++++++++++ .../types/colorJump/ColorJumpFactory.java | 33 ++++ 3 files changed, 177 insertions(+), 1 deletion(-) create mode 100644 src/main/java/eu/mhsl/minenet/minigames/instance/game/stateless/types/colorJump/ColorJump.java create mode 100644 src/main/java/eu/mhsl/minenet/minigames/instance/game/stateless/types/colorJump/ColorJumpFactory.java diff --git a/src/main/java/eu/mhsl/minenet/minigames/instance/game/GameList.java b/src/main/java/eu/mhsl/minenet/minigames/instance/game/GameList.java index 0d846b6..328dcda 100644 --- a/src/main/java/eu/mhsl/minenet/minigames/instance/game/GameList.java +++ b/src/main/java/eu/mhsl/minenet/minigames/instance/game/GameList.java @@ -9,6 +9,7 @@ import eu.mhsl.minenet.minigames.instance.game.stateless.types.blockBattle.Block import eu.mhsl.minenet.minigames.instance.game.stateless.types.blockBreakRace.BlockBreakRaceFactory; import eu.mhsl.minenet.minigames.instance.game.stateless.types.boatRace.BoatRaceFactory; import eu.mhsl.minenet.minigames.instance.game.stateless.types.bowSpleef.BowSpleefFactory; +import eu.mhsl.minenet.minigames.instance.game.stateless.types.colorJump.ColorJumpFactory; import eu.mhsl.minenet.minigames.instance.game.stateless.types.deathcube.DeathcubeFactory; import eu.mhsl.minenet.minigames.instance.game.stateless.types.elytraRace.ElytraRaceFactory; import eu.mhsl.minenet.minigames.instance.game.stateless.types.fastbridge.FastbridgeFactory; @@ -50,7 +51,8 @@ public enum GameList { SPACESNAKE(new SpaceSnakeFactory(), GameType.PVP), BOATRACE(new BoatRaceFactory(), GameType.OTHER), PILLARS(new PillarsFactory(), GameType.PROTOTYPE), - BLOCKBATTLE(new BlockBattleFactory(), GameType.PROTOTYPE); + BLOCKBATTLE(new BlockBattleFactory(), GameType.PVP), + COLORJUMP(new ColorJumpFactory(), GameType.PROTOTYPE); private final GameFactory factory; private final GameType type; diff --git a/src/main/java/eu/mhsl/minenet/minigames/instance/game/stateless/types/colorJump/ColorJump.java b/src/main/java/eu/mhsl/minenet/minigames/instance/game/stateless/types/colorJump/ColorJump.java new file mode 100644 index 0000000..b7ee768 --- /dev/null +++ b/src/main/java/eu/mhsl/minenet/minigames/instance/game/stateless/types/colorJump/ColorJump.java @@ -0,0 +1,141 @@ +package eu.mhsl.minenet.minigames.instance.game.stateless.types.colorJump; + +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.CircularPlateTerrainGenerator; +import net.minestom.server.MinecraftServer; +import net.minestom.server.coordinate.Pos; +import net.minestom.server.entity.GameMode; +import net.minestom.server.event.player.PlayerMoveEvent; +import net.minestom.server.instance.batch.AbsoluteBlockBatch; +import net.minestom.server.instance.block.Block; +import net.minestom.server.item.ItemStack; +import net.minestom.server.timer.TaskSchedule; +import org.jetbrains.annotations.NotNull; + +import java.util.List; +import java.util.Objects; +import java.util.concurrent.CompletableFuture; +import java.util.concurrent.ThreadLocalRandom; + +public class ColorJump extends StatelessGame { + private final List blocks = List.of( + Block.RED_CONCRETE, + Block.ORANGE_CONCRETE, + Block.YELLOW_CONCRETE, + Block.LIME_CONCRETE, + Block.LIGHT_BLUE_CONCRETE, + Block.BLUE_CONCRETE, + Block.PURPLE_CONCRETE, + Block.PINK_CONCRETE + ); + private Block currentBlock; + private double roundTime = 5; + + public ColorJump() { + super(Dimension.THE_END.key, "ColorJump", new LastWinsScore()); + + this.setGenerator(new CircularPlateTerrainGenerator(100)); + } + + @Override + protected void onLoad(@NotNull CompletableFuture callback) { + this.generate(); + } + + @Override + protected void onStart() { + this.nextRound(); + } + + private void nextRound() { + this.generate(); + + this.currentBlock = this.blocks.get(ThreadLocalRandom.current().nextInt(this.blocks.size())); + ItemStack item = ItemStack.of(Objects.requireNonNull(this.currentBlock.registry().material())); + this.getPlayers().forEach(player -> { + player.getInventory().clear(); + for(int i = 0; i < 9; i++) { + player.getInventory().setItemStack(i, item); + } + }); + + var scheduler = MinecraftServer.getSchedulerManager(); + TaskSchedule stop = TaskSchedule.stop(); + + scheduler.scheduleTask(() -> { + this.destroyAllExcept(this.currentBlock); + + scheduler.scheduleTask(() -> { + this.onStart(); + return stop; + }, TaskSchedule.seconds(3)); + return stop; + }, TaskSchedule.seconds((long) this.roundTime)); + if(this.roundTime > 0.5) + this.roundTime = this.roundTime *0.9; + + long secondsLeft = Math.max(0, (long) this.roundTime); + + for (int i = Math.min(3, (int) secondsLeft); i >= 0; i--) { + int level = i; + scheduler.scheduleTask(() -> { + this.getPlayers().forEach(player -> player.setLevel(level)); + return stop; + }, TaskSchedule.seconds(secondsLeft-i)); + } + } + + private void generate() { + int y = 30; + AbsoluteBlockBatch batch = new AbsoluteBlockBatch(); + + for (int x = -20; x <= 21; x += 2) { + for (int z = -11; z <= 10; z += 2) { + Block randomBlock = this.blocks.get(ThreadLocalRandom.current().nextInt(this.blocks.size())); + + for (int dx = 0; dx < 2; dx++) { + for (int dz = 0; dz < 2; dz++) { + batch.setBlock(x + dx, y, z + dz, randomBlock); + } + } + } + } + BatchUtil.loadAndApplyBatch(batch, this, () -> {}); + } + + private void destroyAllExcept(Block block) { + AbsoluteBlockBatch batch = new AbsoluteBlockBatch(); + int y = 30; + + for (int x = -20; x <= 21; x++) { + for(int z = -11; z <= 10; z++) { + Pos blockPos = new Pos(x, y, z); + if(this.getBlock(blockPos) != block) + batch.setBlock(blockPos, Block.AIR); + } + } + BatchUtil.loadAndApplyBatch(batch, this, () -> {}); + } + + @Override + public Pos getSpawn() { + return new Pos(0, 31, 0); + } + + @Override + protected void onPlayerMove(@NotNull PlayerMoveEvent playerMoveEvent) { + var player = playerMoveEvent.getPlayer(); + + if(this.isBeforeBeginning && playerMoveEvent.getNewPosition().y() < 29) + player.teleport(this.getSpawn()); + + if(this.isRunning && playerMoveEvent.getNewPosition().y() < 29) { + this.getScore().insertResult(player); + player.teleport(this.getSpawn()); + player.setGameMode(GameMode.SPECTATOR); + } + } +} diff --git a/src/main/java/eu/mhsl/minenet/minigames/instance/game/stateless/types/colorJump/ColorJumpFactory.java b/src/main/java/eu/mhsl/minenet/minigames/instance/game/stateless/types/colorJump/ColorJumpFactory.java new file mode 100644 index 0000000..8c6d53b --- /dev/null +++ b/src/main/java/eu/mhsl/minenet/minigames/instance/game/stateless/types/colorJump/ColorJumpFactory.java @@ -0,0 +1,33 @@ +package eu.mhsl.minenet.minigames.instance.game.stateless.types.colorJump; + +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; + +import java.util.Map; + +public class ColorJumpFactory implements GameFactory { + + @Override + public TranslatedComponent name() { + return TranslatedComponent.byId("game_ColorJump#name"); + } + + @Override + public Material symbol() { + return Material.PINK_CONCRETE; + } + + @Override + public TranslatedComponent description() { + return TranslatedComponent.byId("game_ColorJump#description"); + } + + @Override + public Game manufacture(Room parent, Map> configuration) throws Exception { + return new ColorJump().setParent(parent); + } +} -- 2.30.2 From bf95c8dcc29693f6a91d15f3e388c1467773ee84 Mon Sep 17 00:00:00 2001 From: jannis Date: Tue, 10 Feb 2026 19:12:36 +0100 Subject: [PATCH 2/5] added translations to color jump --- src/main/resources/lang/locales.map.csv | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/src/main/resources/lang/locales.map.csv b/src/main/resources/lang/locales.map.csv index 9418927..870b146 100644 --- a/src/main/resources/lang/locales.map.csv +++ b/src/main/resources/lang/locales.map.csv @@ -182,4 +182,8 @@ description;Build yourself up with your random blocks to reach your opponents an ns:game_BlockBattle#;; name;Block Battle;Block Kampf description;The team that fills the center with their color first wins!;Das Team, welches als erstes die Mitte mit seiner Farbe gefüllt hat, gewinnt! -itemCount;Block Count;Block Anzahl \ No newline at end of file +itemCount;Block Count;Block Anzahl +;; +ns;game_ColorJump#;; +name;Color Jump;Farbsprung +description;Jump on the right color!;Springe auf die richtige Farbe \ No newline at end of file -- 2.30.2 From e822a5c5e25b6924abab4d2f4a9cd59f10625415 Mon Sep 17 00:00:00 2001 From: jannis Date: Tue, 10 Feb 2026 19:17:37 +0100 Subject: [PATCH 3/5] fixed translations for color jump --- src/main/resources/lang/locales.map.csv | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/main/resources/lang/locales.map.csv b/src/main/resources/lang/locales.map.csv index 870b146..6790b7d 100644 --- a/src/main/resources/lang/locales.map.csv +++ b/src/main/resources/lang/locales.map.csv @@ -184,6 +184,6 @@ name;Block Battle;Block Kampf description;The team that fills the center with their color first wins!;Das Team, welches als erstes die Mitte mit seiner Farbe gefüllt hat, gewinnt! itemCount;Block Count;Block Anzahl ;; -ns;game_ColorJump#;; +ns:game_ColorJump#;; name;Color Jump;Farbsprung -description;Jump on the right color!;Springe auf die richtige Farbe \ No newline at end of file +description;Jump on the right color!;Springe auf die richtige Farbe! \ No newline at end of file -- 2.30.2 From d0825695b3fa7cf3f9633ddecfe5c6b9c0a7050a Mon Sep 17 00:00:00 2001 From: jannis Date: Tue, 10 Feb 2026 19:23:06 +0100 Subject: [PATCH 4/5] added an end to color jump --- .../instance/game/stateless/types/colorJump/ColorJump.java | 1 + 1 file changed, 1 insertion(+) diff --git a/src/main/java/eu/mhsl/minenet/minigames/instance/game/stateless/types/colorJump/ColorJump.java b/src/main/java/eu/mhsl/minenet/minigames/instance/game/stateless/types/colorJump/ColorJump.java index b7ee768..d09ac55 100644 --- a/src/main/java/eu/mhsl/minenet/minigames/instance/game/stateless/types/colorJump/ColorJump.java +++ b/src/main/java/eu/mhsl/minenet/minigames/instance/game/stateless/types/colorJump/ColorJump.java @@ -36,6 +36,7 @@ public class ColorJump extends StatelessGame { public ColorJump() { super(Dimension.THE_END.key, "ColorJump", new LastWinsScore()); + this.getScore().setIgnoreLastPlayers(1); this.setGenerator(new CircularPlateTerrainGenerator(100)); } -- 2.30.2 From 2808393c236b2f8f2dc58c6c5955da36b101f08b Mon Sep 17 00:00:00 2001 From: jannis Date: Tue, 10 Feb 2026 21:22:32 +0100 Subject: [PATCH 5/5] solved pr comments --- .../game/stateless/types/colorJump/ColorJump.java | 13 ++++++------- 1 file changed, 6 insertions(+), 7 deletions(-) diff --git a/src/main/java/eu/mhsl/minenet/minigames/instance/game/stateless/types/colorJump/ColorJump.java b/src/main/java/eu/mhsl/minenet/minigames/instance/game/stateless/types/colorJump/ColorJump.java index d09ac55..fef6c13 100644 --- a/src/main/java/eu/mhsl/minenet/minigames/instance/game/stateless/types/colorJump/ColorJump.java +++ b/src/main/java/eu/mhsl/minenet/minigames/instance/game/stateless/types/colorJump/ColorJump.java @@ -70,13 +70,13 @@ public class ColorJump extends StatelessGame { this.destroyAllExcept(this.currentBlock); scheduler.scheduleTask(() -> { - this.onStart(); + this.nextRound(); return stop; }, TaskSchedule.seconds(3)); return stop; }, TaskSchedule.seconds((long) this.roundTime)); if(this.roundTime > 0.5) - this.roundTime = this.roundTime *0.9; + this.roundTime = this.roundTime * 0.9; long secondsLeft = Math.max(0, (long) this.roundTime); @@ -130,12 +130,11 @@ public class ColorJump extends StatelessGame { protected void onPlayerMove(@NotNull PlayerMoveEvent playerMoveEvent) { var player = playerMoveEvent.getPlayer(); - if(this.isBeforeBeginning && playerMoveEvent.getNewPosition().y() < 29) - player.teleport(this.getSpawn()); - - if(this.isRunning && playerMoveEvent.getNewPosition().y() < 29) { + if(playerMoveEvent.getNewPosition().y() >= 29) + return; + player.teleport(this.getSpawn()); + if(this.isRunning) { this.getScore().insertResult(player); - player.teleport(this.getSpawn()); player.setGameMode(GameMode.SPECTATOR); } } -- 2.30.2