From 3dd41979f7627d119cdae0bf93f8a1a5bf131849 Mon Sep 17 00:00:00 2001 From: Hannes Frommann Date: Fri, 25 Jul 2025 23:04:03 +0200 Subject: [PATCH] WIP: highground --- .../minigames/instance/game/GameList.java | 4 +- .../types/highGround/HighGround.java | 93 +++++++++++++++++++ .../types/highGround/HighGroundFactory.java | 21 +++++ .../game/stateless/types/sumo/Sumo.java | 3 +- .../stateless/types/sumo/SumoFactory.java | 5 +- .../minenet/minigames/world/BlockPallet.java | 2 +- 6 files changed, 124 insertions(+), 4 deletions(-) create mode 100644 src/main/java/eu/mhsl/minenet/minigames/instance/game/stateless/types/highGround/HighGround.java create mode 100644 src/main/java/eu/mhsl/minenet/minigames/instance/game/stateless/types/highGround/HighGroundFactory.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 eb7ea94..05cb303 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 @@ -8,6 +8,7 @@ import eu.mhsl.minenet.minigames.instance.game.stateless.types.backrooms.Backroo import eu.mhsl.minenet.minigames.instance.game.stateless.types.bedwars.BedwarsFactory; import eu.mhsl.minenet.minigames.instance.game.stateless.types.acidRain.AcidRainFactory; import eu.mhsl.minenet.minigames.instance.game.stateless.types.deathcube.DeathcubeFactory; +import eu.mhsl.minenet.minigames.instance.game.stateless.types.highGround.HighGroundFactory; import eu.mhsl.minenet.minigames.instance.game.stateless.types.jumpDive.JumpDiveFactory; import eu.mhsl.minenet.minigames.instance.game.stateless.types.minerun.MinerunFactory; import eu.mhsl.minenet.minigames.instance.game.stateless.types.spleef.SpleefFactory; @@ -34,7 +35,8 @@ public enum GameList { ELYTRARACE(new ElytraRaceFactory(), GameType.PVP), SPLEEF(new SpleefFactory(), GameType.PVP), JUMPDIVE(new JumpDiveFactory(), GameType.JUMPNRUN), - SUMO(new SumoFactory(), GameType.PVP); + SUMO(new SumoFactory(), GameType.PVP), + HIGHGROUND(new HighGroundFactory(), GameType.PROTOTYPE); private final GameFactory factory; private final GameType type; diff --git a/src/main/java/eu/mhsl/minenet/minigames/instance/game/stateless/types/highGround/HighGround.java b/src/main/java/eu/mhsl/minenet/minigames/instance/game/stateless/types/highGround/HighGround.java new file mode 100644 index 0000000..b194264 --- /dev/null +++ b/src/main/java/eu/mhsl/minenet/minigames/instance/game/stateless/types/highGround/HighGround.java @@ -0,0 +1,93 @@ +package eu.mhsl.minenet.minigames.instance.game.stateless.types.highGround; + +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.world.BlockPallet; +import io.github.togar2.pvp.events.EntityKnockbackEvent; +import io.github.togar2.pvp.events.FinalAttackEvent; +import io.github.togar2.pvp.events.PrepareAttackEvent; +import io.github.togar2.pvp.feature.CombatFeatures; +import net.minestom.server.coordinate.Pos; +import net.minestom.server.entity.Player; +import net.minestom.server.event.player.PlayerMoveEvent; +import net.minestom.server.instance.block.Block; +import org.jetbrains.annotations.NotNull; + +import java.util.concurrent.CompletableFuture; + +public class HighGround extends StatelessGame { + + int radius = 5; + public HighGround() { + super(Dimension.THE_END.key, "highground", new PointsWinScore()); + + this.eventNode().addChild( + CombatFeatures.empty() + .add(CombatFeatures.VANILLA_ATTACK) + .add(CombatFeatures.VANILLA_DAMAGE) + .add(CombatFeatures.VANILLA_KNOCKBACK) + .build() + .createNode() + ); + + this.eventNode().addListener( + FinalAttackEvent.class, + finalAttackEvent -> finalAttackEvent.setBaseDamage(0) + ); + + this.eventNode().addListener(PrepareAttackEvent.class, prepareAttackEvent -> { + if(this.isBeforeBeginning){ + prepareAttackEvent.setCancelled(true); + } + }); + + this.eventNode().addListener( + EntityKnockbackEvent.class, + entityKnockbackEvent -> entityKnockbackEvent.setStrength(1.1f) + ); + } + + @Override + protected void onLoad(@NotNull CompletableFuture callback) { + for (int y = 0; y >= -3; y--) { + int radius = (Math.abs(y) * 5) + 5; + for (int x = -radius; x <= radius; x++) { + for (int z = -radius; z <= radius; z++) { + double distance = new Pos(x, 0, z).distance(0, 0, 0); + if (distance <= radius) { + this.setBlock(x, y, z, y == 0 ? Block.DIAMOND_BLOCK : Block.GRASS_BLOCK); + Pos featurePosition = new Pos(x, y + 1, z); + + if(y >= 0 || this.getBlock(featurePosition).isSolid()) continue; + if (this.rnd.nextDouble() < 0.1){ + this.setBlock(featurePosition, Block.SHORT_GRASS); + } + if (this.rnd.nextDouble() < 0.01){ + this.setBlock(featurePosition, BlockPallet.FLOWER.rnd()); + } + } + } + } + } + } + + @Override + protected void onPlayerMove(@NotNull PlayerMoveEvent playerMoveEvent) { + Player player = playerMoveEvent.getPlayer(); + if(playerMoveEvent.getNewPosition().y() < -10){ + player.teleport(this.getSpawn()); + } + } + + @Override + public Pos getSpawn() { + double theta = this.rnd.nextDouble() * 2 * Math.PI; + + double spawnRadius = this.radius + 5; + double x = spawnRadius * Math.cos(theta); + double z = spawnRadius * Math.sin(theta); + + return new Pos(x, 0, z).withLookAt(new Pos(0, 0, 0)); + } +} diff --git a/src/main/java/eu/mhsl/minenet/minigames/instance/game/stateless/types/highGround/HighGroundFactory.java b/src/main/java/eu/mhsl/minenet/minigames/instance/game/stateless/types/highGround/HighGroundFactory.java new file mode 100644 index 0000000..06d8771 --- /dev/null +++ b/src/main/java/eu/mhsl/minenet/minigames/instance/game/stateless/types/highGround/HighGroundFactory.java @@ -0,0 +1,21 @@ +package eu.mhsl.minenet.minigames.instance.game.stateless.types.highGround; + +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 java.util.Map; + +public class HighGroundFactory implements GameFactory { + @Override + public TranslatedComponent name() { + return TranslatedComponent.byId("game_Highground#name"); + } + + @Override + public Game manufacture(Room parent, Map> configuration) throws Exception { + return new HighGround().setParent(parent); + } +} diff --git a/src/main/java/eu/mhsl/minenet/minigames/instance/game/stateless/types/sumo/Sumo.java b/src/main/java/eu/mhsl/minenet/minigames/instance/game/stateless/types/sumo/Sumo.java index 19fc094..06d9fcb 100644 --- a/src/main/java/eu/mhsl/minenet/minigames/instance/game/stateless/types/sumo/Sumo.java +++ b/src/main/java/eu/mhsl/minenet/minigames/instance/game/stateless/types/sumo/Sumo.java @@ -46,7 +46,8 @@ public class Sumo extends StatelessGame { .add(CombatFeatures.VANILLA_ATTACK) .add(CombatFeatures.VANILLA_DAMAGE) .add(CombatFeatures.VANILLA_KNOCKBACK) - .build().createNode() + .build() + .createNode() ); this.eventNode().addListener(PrepareAttackEvent.class, prepareAttackEvent -> { diff --git a/src/main/java/eu/mhsl/minenet/minigames/instance/game/stateless/types/sumo/SumoFactory.java b/src/main/java/eu/mhsl/minenet/minigames/instance/game/stateless/types/sumo/SumoFactory.java index 290feca..ec5886b 100644 --- a/src/main/java/eu/mhsl/minenet/minigames/instance/game/stateless/types/sumo/SumoFactory.java +++ b/src/main/java/eu/mhsl/minenet/minigames/instance/game/stateless/types/sumo/SumoFactory.java @@ -13,7 +13,10 @@ import java.util.Map; public class SumoFactory implements GameFactory { @Override - public TranslatedComponent name() {return TranslatedComponent.byId("game_Sumo#name");} + public TranslatedComponent name() { + return TranslatedComponent.byId("game_Sumo#name"); + } + public TranslatedComponent description() { return TranslatedComponent.byId("game_Sumo#description"); } diff --git a/src/main/java/eu/mhsl/minenet/minigames/world/BlockPallet.java b/src/main/java/eu/mhsl/minenet/minigames/world/BlockPallet.java index 72bbc3a..483d893 100644 --- a/src/main/java/eu/mhsl/minenet/minigames/world/BlockPallet.java +++ b/src/main/java/eu/mhsl/minenet/minigames/world/BlockPallet.java @@ -12,7 +12,7 @@ public enum BlockPallet { STONE(new Block[] {Block.CHISELED_STONE_BRICKS, Block.STONE_BRICKS, Block.POLISHED_ANDESITE, Block.POLISHED_BLACKSTONE, Block.POLISHED_DIORITE}), WINTER(new Block[] {Block.SNOW_BLOCK, Block.ICE, Block.PACKED_ICE, Block.BLUE_CONCRETE, Block.SEA_LANTERN}), STREET(new Block[] {Block.BLACK_CONCRETE_POWDER, Block.GRAY_CONCRETE_POWDER, Block.GRAVEL, Block.BLACK_CONCRETE, Block.GRAY_CONCRETE}), - + FLOWER(new Block[] {Block.ORANGE_TULIP, Block.PINK_TULIP, Block.RED_TULIP, Block.WHITE_TULIP}), PRESSURE_PLATES(new Block[] {Block.ACACIA_PRESSURE_PLATE, Block.BIRCH_PRESSURE_PLATE, Block.CRIMSON_PRESSURE_PLATE, Block.JUNGLE_PRESSURE_PLATE, Block.OAK_PRESSURE_PLATE, Block.DARK_OAK_PRESSURE_PLATE, Block.HEAVY_WEIGHTED_PRESSURE_PLATE, Block.HEAVY_WEIGHTED_PRESSURE_PLATE, Block.POLISHED_BLACKSTONE_PRESSURE_PLATE, Block.SPRUCE_PRESSURE_PLATE, Block.STONE_PRESSURE_PLATE, Block.WARPED_PRESSURE_PLATE}); final List list;