From 5ca8ad8bd76ce28bd0e3fe543b97e72291c4852a Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Elias=20M=C3=BCller?= Date: Mon, 3 Mar 2025 01:28:29 +0100 Subject: [PATCH] added jumpDive game --- .../minenet/minigames/command/Commands.java | 2 +- .../handler/global/PlayerLoginHandler.java | 2 +- .../minigames/instance/game/GameList.java | 4 +- .../game/stateless/StatelessGame.java | 10 +- .../stateless/types/jumpDive/JumpDive.java | 99 +++++++++++++++++++ .../types/jumpDive/JumpDiveFactory.java | 43 ++++++++ .../minenet/minigames/skin/SkinCache.java | 2 +- 7 files changed, 156 insertions(+), 6 deletions(-) create mode 100644 src/main/java/eu/mhsl/minenet/minigames/instance/game/stateless/types/jumpDive/JumpDive.java create mode 100644 src/main/java/eu/mhsl/minenet/minigames/instance/game/stateless/types/jumpDive/JumpDiveFactory.java diff --git a/src/main/java/eu/mhsl/minenet/minigames/command/Commands.java b/src/main/java/eu/mhsl/minenet/minigames/command/Commands.java index 93ea88b..a9a6a90 100644 --- a/src/main/java/eu/mhsl/minenet/minigames/command/Commands.java +++ b/src/main/java/eu/mhsl/minenet/minigames/command/Commands.java @@ -41,7 +41,7 @@ public enum Commands { static { MinecraftServer.getCommandManager().setUnknownCommandCallback((sender, command) -> { if(command.isBlank()) return; - new ChatMessage(Icon.ERROR).appendStatic("Unknown command").quote(command).send(sender); + new ChatMessage(Icon.ERROR).appendStatic("Unknown command: ").quote(command).send(sender); }); } } diff --git a/src/main/java/eu/mhsl/minenet/minigames/handler/global/PlayerLoginHandler.java b/src/main/java/eu/mhsl/minenet/minigames/handler/global/PlayerLoginHandler.java index 2e17600..b694668 100644 --- a/src/main/java/eu/mhsl/minenet/minigames/handler/global/PlayerLoginHandler.java +++ b/src/main/java/eu/mhsl/minenet/minigames/handler/global/PlayerLoginHandler.java @@ -51,7 +51,7 @@ public class PlayerLoginHandler implements EventListener 0) { - scheduler().submitTask(() -> { + if(this.timeLimitTask != null) { + this.timeLimitTask.cancel(); + this.timePlayed = 0; + } + if(this.timeLimit > 0) { + this.timeLimitTask = scheduler().submitTask(() -> { if(!isRunning || timeLimit == 0) return TaskSchedule.stop(); if(timeLimit <= timePlayed) { stop(); diff --git a/src/main/java/eu/mhsl/minenet/minigames/instance/game/stateless/types/jumpDive/JumpDive.java b/src/main/java/eu/mhsl/minenet/minigames/instance/game/stateless/types/jumpDive/JumpDive.java new file mode 100644 index 0000000..dd4cf4e --- /dev/null +++ b/src/main/java/eu/mhsl/minenet/minigames/instance/game/stateless/types/jumpDive/JumpDive.java @@ -0,0 +1,99 @@ +package eu.mhsl.minenet.minigames.instance.game.stateless.types.jumpDive; + +import eu.mhsl.minenet.minigames.instance.Dimension; +import eu.mhsl.minenet.minigames.instance.game.stateless.StatelessGame; +import eu.mhsl.minenet.minigames.score.PointsWinScore; +import eu.mhsl.minenet.minigames.util.BatchUtil; +import eu.mhsl.minenet.minigames.world.BlockPallet; +import net.kyori.adventure.sound.Sound; +import net.minestom.server.coordinate.Pos; +import net.minestom.server.entity.Player; +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.sound.SoundEvent; +import org.jetbrains.annotations.NotNull; + +import java.util.WeakHashMap; +import java.util.concurrent.CompletableFuture; + +public class JumpDive extends StatelessGame { + private final int radius; + private final int height; + private final int timeLimit; + + private final WeakHashMap scores = new WeakHashMap<>(); + + public JumpDive(int radius, int height, int timeLimit) { + super(Dimension.OVERWORLD.key, "jumpDive", new PointsWinScore()); + this.radius = radius; + this.height = height; + this.timeLimit = timeLimit; + } + + @Override + protected void onLoad(@NotNull CompletableFuture callback) { + AbsoluteBlockBatch batch = new AbsoluteBlockBatch(); + + for(int x = -radius*2; x <= radius*2; x++) { + for(int z = -radius*2; z <= radius*2; z++) { + if(new Pos(x, 0, z).distance(new Pos(0, 0, 0)) > radius) { + batch.setBlock(x, height, z, BlockPallet.STONE.rnd()); + } else { + batch.setBlock(x, 0, z, BlockPallet.GROUND.rnd()); + batch.setBlock(x, 1, z, Block.WATER); + } + } + } + + BatchUtil.loadAndApplyBatch(batch, this, () -> callback.complete(null)); + } + + @Override + protected void onStart() { + setTimeLimit(timeLimit); + } + + @Override + protected void onPlayerMove(@NotNull PlayerMoveEvent playerMoveEvent) { + Player p = playerMoveEvent.getPlayer(); + + if( + p.isOnGround() && playerMoveEvent.getNewPosition().y() < height + || playerMoveEvent.getNewPosition().y() < 0 + || isBeforeBeginning && playerMoveEvent.getNewPosition().y() < height + ) { + p.teleport(getSpawn()); + playerMoveEvent.setCancelled(true); + } + + if( + playerMoveEvent.getNewPosition().y() <= 1 + && playerMoveEvent.getNewPosition().distance(0, 1, 0) < radius + 0.5 + && !(!isBeforeBeginning && !isRunning) + ) { + setBlock(playerMoveEvent.getNewPosition().withY(1), Block.REDSTONE_BLOCK); + scores.merge(p, 1, Integer::sum); + p.teleport(getSpawn()); + playerMoveEvent.setCancelled(true); + p.playSound(Sound.sound(SoundEvent.ENTITY_EXPERIENCE_ORB_PICKUP, Sound.Source.PLAYER, 2f, 2f)); + } + } + + @Override + protected void onStop() { + getPlayers().forEach(player -> getScore().insertResult(player, scores.getOrDefault(player, 0))); + } + + @Override + public Pos getSpawn() { + double theta = rnd.nextDouble() * 2 * Math.PI; + + double spawnRadius = radius + 2; + double x = spawnRadius * Math.cos(theta); + double z = spawnRadius * Math.sin(theta); + + return new Pos(x, height + 2, z).withLookAt(new Pos(0, height, 0)); + + } +} diff --git a/src/main/java/eu/mhsl/minenet/minigames/instance/game/stateless/types/jumpDive/JumpDiveFactory.java b/src/main/java/eu/mhsl/minenet/minigames/instance/game/stateless/types/jumpDive/JumpDiveFactory.java new file mode 100644 index 0000000..c884b00 --- /dev/null +++ b/src/main/java/eu/mhsl/minenet/minigames/instance/game/stateless/types/jumpDive/JumpDiveFactory.java @@ -0,0 +1,43 @@ +package eu.mhsl.minenet.minigames.instance.game.stateless.types.jumpDive; + +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; + +import java.util.Map; + +public class JumpDiveFactory implements GameFactory { + @Override + public TranslatedComponent name() { + return TranslatedComponent.byId("gmae_jumpDive#name"); + } + + @Override + public TranslatedComponent description() { + return TranslatedComponent.byId("game_Deathcube#description"); + } + + @Override + public ConfigManager configuration() { + return new ConfigManager() + .addOption(new NumericOption("radius", Material.HEART_OF_THE_SEA, TranslatedComponent.byId("optionCommon#radius"), 5, 8, 10, 12, 14, 16)) + .addOption(new NumericOption("height", Material.SCAFFOLDING, TranslatedComponent.byId("optionCommon#height"), 30, 60, 90)) + .addOption(new NumericOption("timeLimit", Material.CLOCK, TranslatedComponent.byId("optionCommon#timeLimit"), 60, 120, 180, 240, 300)); + + } + + @Override + public Game manufacture(Room parent, Map> configuration) throws Exception { + return new JumpDive(configuration.get("radius").getAsInt(), configuration.get("height").getAsInt(), configuration.get("timeLimit").getAsInt()).setParent(parent); + } + + @Override + public Material symbol() { + return Material.WATER_BUCKET; + } +} diff --git a/src/main/java/eu/mhsl/minenet/minigames/skin/SkinCache.java b/src/main/java/eu/mhsl/minenet/minigames/skin/SkinCache.java index e07e47a..4325232 100644 --- a/src/main/java/eu/mhsl/minenet/minigames/skin/SkinCache.java +++ b/src/main/java/eu/mhsl/minenet/minigames/skin/SkinCache.java @@ -20,6 +20,6 @@ public class SkinCache { MinecraftServer.getSchedulerManager().scheduleTask(() -> { p.setSkin(SkinCache.getSkin(p.getUsername())); return TaskSchedule.stop(); - }, TaskSchedule.seconds(3)); + }, TaskSchedule.millis(500)); } }