From 13132eace62115d40b245acc78869339787b5f73 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Elias=20M=C3=BCller?= Date: Mon, 3 Mar 2025 20:28:10 +0100 Subject: [PATCH] fixed minestom-pvp version, made stickfight playable --- build.gradle | 2 +- .../types/jumpDive/JumpDiveFactory.java | 2 +- .../types/stickfight/Stickfight.java | 58 +++++++++++++++---- 3 files changed, 50 insertions(+), 12 deletions(-) diff --git a/build.gradle b/build.gradle index 27e40bf..2c39fcc 100644 --- a/build.gradle +++ b/build.gradle @@ -57,7 +57,7 @@ dependencies { //PvP - implementation 'io.github.TogAr2:MinestomPvP:04180ddf9a' + implementation 'io.github.TogAr2:MinestomPvP:PR62-SNAPSHOT' // Hephaestus engine implementation("team.unnamed:hephaestus-api:0.2.1-SNAPSHOT") 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 index b94c775..2e4fb2e 100644 --- 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 @@ -27,7 +27,7 @@ public class JumpDiveFactory implements GameFactory { 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)); + .addOption(new NumericOption("timeLimit", Material.CLOCK, TranslatedComponent.byId("optionCommon#seconds"), 60, 120, 180, 240, 300)); } 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 6f10d14..d3c6d02 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 @@ -3,20 +3,23 @@ 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.CircularPlateTerrainGenerator; import io.github.togar2.pvp.events.FinalAttackEvent; 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.batch.AbsoluteBlockBatch; import net.minestom.server.instance.block.Block; import org.jetbrains.annotations.NotNull; +import java.util.List; +import java.util.WeakHashMap; import java.util.concurrent.CompletableFuture; public class Stickfight extends StatelessGame { + private final double radius = 20; + private final WeakHashMap spawnPoints = new WeakHashMap<>(); + public Stickfight() { super(Dimension.OVERWORLD.key, "Stickfight", new LastWinsScore()); @@ -38,21 +41,56 @@ public class Stickfight extends StatelessGame { @Override protected void onLoad(@NotNull CompletableFuture callback) { - AbsoluteBlockBatch batch = new AbsoluteBlockBatch(); - for (int z = -10; z <= 10; z++) { - batch.setBlock(0, 50, z, Block.SANDSTONE); - } - batch.setBlock(0, 50, 0, Block.GOLD_BLOCK); + setBlock(0, 50, 0, Block.DIAMOND_BLOCK); + } - BatchUtil.loadAndApplyBatch(batch, this, () -> callback.complete(null)); + @Override + protected void start() { + List players = getPlayers().stream().toList(); + int numPlayers = players.size(); + + for (int i = 0; i < numPlayers; i++) { + double angle = (2 * Math.PI / numPlayers) * i; + int spawnX = (int) (radius * Math.cos(angle)); + int spawnZ = (int) (radius * Math.sin(angle)); + int spawnY = 50; + + Pos spawnpoint = new Pos(spawnX, spawnY + 1, spawnZ).add(0.5); + spawnPoints.put(players.get(i), spawnpoint.withLookAt(getSpawn())); + players.get(i).teleport(spawnpoint); + + generateBridge(spawnX, spawnY, spawnZ); + } + + setBlock(0, 50, 0, Block.GOLD_BLOCK); + super.start(); + } + + private void generateBridge(int startX, int startY, int startZ) { + int steps = (int) (radius * 1.5); + for (int i = 0; i < steps; i++) { + double t = (double) i / steps; + int x = (int) (startX * (1 - t)); + int z = (int) (startZ * (1 - t)); + setBlock(x, startY, z, Block.SANDSTONE); + } } @Override protected void onPlayerMove(@NotNull PlayerMoveEvent playerMoveEvent) { - if(isBeforeBeginning) playerMoveEvent.setCancelled(true); + if(!spawnPoints.containsKey(playerMoveEvent.getPlayer())) { + playerMoveEvent.setCancelled(true); + return; + } + + if(isBeforeBeginning) { + if(spawnPoints.get(playerMoveEvent.getPlayer()).distance(playerMoveEvent.getNewPosition()) < 1) return; + playerMoveEvent.setCancelled(true); + playerMoveEvent.getPlayer().teleport(spawnPoints.get(playerMoveEvent.getPlayer())); + } if(playerMoveEvent.getNewPosition().y() < 40) { - playerMoveEvent.getPlayer().teleport(new Pos(0, 51, 0)); + playerMoveEvent.getPlayer().teleport(spawnPoints.get(playerMoveEvent.getPlayer())); } }