From 9992b07ed580f5c2d653ce834528ff4affc2102d Mon Sep 17 00:00:00 2001 From: jannis Date: Sat, 18 Jul 2026 17:41:45 +0200 Subject: [PATCH] added basic obstacle mechanic --- .../types/playerRace/PlayerRace.java | 4 +- .../playerRace/PlayerRaceChunkgenerator.java | 46 +++++++++++++++++++ .../types/playerRace/obstacles/Mudpit.java | 23 ++++++++++ .../types/playerRace/obstacles/Obstacle.java | 18 ++++++++ 4 files changed, 89 insertions(+), 2 deletions(-) create mode 100644 src/main/java/eu/mhsl/minenet/minigames/instance/game/stateless/types/playerRace/PlayerRaceChunkgenerator.java create mode 100644 src/main/java/eu/mhsl/minenet/minigames/instance/game/stateless/types/playerRace/obstacles/Mudpit.java create mode 100644 src/main/java/eu/mhsl/minenet/minigames/instance/game/stateless/types/playerRace/obstacles/Obstacle.java diff --git a/src/main/java/eu/mhsl/minenet/minigames/instance/game/stateless/types/playerRace/PlayerRace.java b/src/main/java/eu/mhsl/minenet/minigames/instance/game/stateless/types/playerRace/PlayerRace.java index b21b8df..ea21829 100644 --- a/src/main/java/eu/mhsl/minenet/minigames/instance/game/stateless/types/playerRace/PlayerRace.java +++ b/src/main/java/eu/mhsl/minenet/minigames/instance/game/stateless/types/playerRace/PlayerRace.java @@ -13,11 +13,11 @@ import java.util.concurrent.CompletableFuture; public class PlayerRace extends StatelessGame { public PlayerRace() { super(Dimension.THE_END.key, "PlayerRace", new LastWinsScore()); + this.setGenerator(new PlayerRaceChunkgenerator(64)); } @Override protected void onLoad(@NotNull CompletableFuture callback) { - AbsoluteBlockBatch batch = new AbsoluteBlockBatch(); this.setBlock(0, 100, 0, Block.AMETHYST_BLOCK); } @@ -26,4 +26,4 @@ public class PlayerRace extends StatelessGame { return new Pos(0.5, 101.5, 0.5); } -} \ No newline at end of file +} diff --git a/src/main/java/eu/mhsl/minenet/minigames/instance/game/stateless/types/playerRace/PlayerRaceChunkgenerator.java b/src/main/java/eu/mhsl/minenet/minigames/instance/game/stateless/types/playerRace/PlayerRaceChunkgenerator.java new file mode 100644 index 0000000..9927953 --- /dev/null +++ b/src/main/java/eu/mhsl/minenet/minigames/instance/game/stateless/types/playerRace/PlayerRaceChunkgenerator.java @@ -0,0 +1,46 @@ +package eu.mhsl.minenet.minigames.instance.game.stateless.types.playerRace; + +import eu.mhsl.minenet.minigames.instance.game.stateless.types.playerRace.obstacles.Obstacle; +import eu.mhsl.minenet.minigames.world.BlockPallet; +import eu.mhsl.minenet.minigames.world.generator.featureEnriched.ValeGenerator; +import eu.mhsl.minenet.minigames.world.generator.terrain.BaseGenerator; +import net.minestom.server.coordinate.Point; +import net.minestom.server.instance.block.Block; + +public class PlayerRaceChunkgenerator extends BaseGenerator { + public PlayerRaceChunkgenerator(int height) { + ValeGenerator vale = new ValeGenerator(); + vale.setXShiftMultiplier(integer -> 0.5d); + vale.setHeightNoiseMultiplier(integer -> 2); + this.addMixIn(vale); + + this.addMixIn(unit -> { + if ( + unit.absoluteStart().chunkX() != 0 || + unit.absoluteStart().chunkZ() < 0 || + unit.absoluteStart().chunkZ() > 16 + ) return; + + Point start = unit.absoluteStart(); + + for(int x = 0; x <= 15; x++) { + for(int z = 0; z <= 15; z++) { + Point blockPosition = start.add(x, height, z); + if(unit.absoluteStart().chunkZ() == 0) { + unit.modifier().setBlock(blockPosition, Block.AMETHYST_BLOCK); + continue; + } + if(unit.absoluteStart().chunkZ() == 16) { + unit.modifier().setBlock(blockPosition, Block.DIAMOND_BLOCK); + continue; + } + if(unit.absoluteStart().chunkZ() % 2 == 1) { + Obstacle.getRandomObstacle().generate(unit, blockPosition); + continue; + } + unit.modifier().setBlock(blockPosition, BlockPallet.GROUND.rnd()); + } + } + }); + } +} diff --git a/src/main/java/eu/mhsl/minenet/minigames/instance/game/stateless/types/playerRace/obstacles/Mudpit.java b/src/main/java/eu/mhsl/minenet/minigames/instance/game/stateless/types/playerRace/obstacles/Mudpit.java new file mode 100644 index 0000000..8bb83c2 --- /dev/null +++ b/src/main/java/eu/mhsl/minenet/minigames/instance/game/stateless/types/playerRace/obstacles/Mudpit.java @@ -0,0 +1,23 @@ +package eu.mhsl.minenet.minigames.instance.game.stateless.types.playerRace.obstacles; + +import de.articdive.jnoise.JNoise; +import eu.mhsl.minenet.minigames.util.GeneratorUtils; +import net.minestom.server.coordinate.Point; +import net.minestom.server.instance.block.Block; +import net.minestom.server.instance.generator.GenerationUnit; + +class Mudpit extends Obstacle { + private final JNoise curves = JNoise.newBuilder() + .fastSimplex() + .setFrequency(0.1) + .build(); + + @Override + public void generate(GenerationUnit unit, Point start) { + GeneratorUtils.foreachXZ(unit, point -> { + int modifier = point.blockX()/16 * -3; + double heightAtBlock = this.curves.getNoise(point.blockX(), point.blockY(), point.blockZ()) * modifier; + unit.modifier().setBlock(point.withY(v -> heightAtBlock), Block.SOUL_SAND); + }); + } +} diff --git a/src/main/java/eu/mhsl/minenet/minigames/instance/game/stateless/types/playerRace/obstacles/Obstacle.java b/src/main/java/eu/mhsl/minenet/minigames/instance/game/stateless/types/playerRace/obstacles/Obstacle.java new file mode 100644 index 0000000..e95f618 --- /dev/null +++ b/src/main/java/eu/mhsl/minenet/minigames/instance/game/stateless/types/playerRace/obstacles/Obstacle.java @@ -0,0 +1,18 @@ +package eu.mhsl.minenet.minigames.instance.game.stateless.types.playerRace.obstacles; + +import net.minestom.server.coordinate.Point; +import net.minestom.server.instance.generator.GenerationUnit; + +import java.util.List; +import java.util.concurrent.ThreadLocalRandom; + +public abstract class Obstacle { + @SuppressWarnings("StaticInitializerReferencesSubClass") + private static final List obstacles = List.of(new Mudpit()); + + public abstract void generate(GenerationUnit unit, Point start); + + public static Obstacle getRandomObstacle() { + return obstacles.get(ThreadLocalRandom.current().nextInt(obstacles.size())); + } +}