diff --git a/src/main/java/eu/mhsl/minenet/minigames/instance/game/stateless/StatelessGame.java b/src/main/java/eu/mhsl/minenet/minigames/instance/game/stateless/StatelessGame.java index 2855e20..c9efbb0 100644 --- a/src/main/java/eu/mhsl/minenet/minigames/instance/game/stateless/StatelessGame.java +++ b/src/main/java/eu/mhsl/minenet/minigames/instance/game/stateless/StatelessGame.java @@ -23,6 +23,7 @@ public class StatelessGame extends Game { private int timeLimit = 0; private int timePlayed = 0; + public StatelessGame(DynamicRegistry.Key<DimensionType> dimensionType, String gameName, Score score) { super(dimensionType); this.score = score; diff --git a/src/main/java/eu/mhsl/minenet/minigames/instance/game/stateless/types/anvilRun/AnvilRun.java b/src/main/java/eu/mhsl/minenet/minigames/instance/game/stateless/types/anvilRun/AnvilRun.java index 1cd2900..38e8082 100644 --- a/src/main/java/eu/mhsl/minenet/minigames/instance/game/stateless/types/anvilRun/AnvilRun.java +++ b/src/main/java/eu/mhsl/minenet/minigames/instance/game/stateless/types/anvilRun/AnvilRun.java @@ -5,6 +5,7 @@ import eu.mhsl.minenet.minigames.score.LastWinsScore; import eu.mhsl.minenet.minigames.instance.Dimension; 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.Entity; import net.minestom.server.entity.EntityType; @@ -13,6 +14,8 @@ import net.minestom.server.event.entity.EntityTickEvent; 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.timer.Scheduler; +import net.minestom.server.timer.TaskSchedule; import org.jetbrains.annotations.NotNull; import java.util.ArrayList; @@ -23,11 +26,13 @@ class AnvilRun extends StatelessGame { final int spawnHeight = 30; final int radius; - final List<Entity> anvils = new ArrayList<>(); + final int speed; + final List<Pos> anvilSpawnPositions = new ArrayList<>(); - public AnvilRun(int radius, int pvpEnabled) { + public AnvilRun(int radius, int speed) { super(Dimension.THE_END.key, "Anvil Run", new LastWinsScore()); this.radius = radius; + this.speed = speed; this.setGenerator(new CircularPlateTerrainGenerator(radius)); } @@ -40,12 +45,8 @@ class AnvilRun extends StatelessGame { if(new Pos(x, 0, z).distance(new Pos(0, 0, 0)) > radius) continue; int height = super.rnd.nextInt(100, 500); - Entity anvil = new Entity(EntityType.FALLING_BLOCK); - ((FallingBlockMeta) anvil.getEntityMeta()).setBlock(Block.ANVIL); - anvil.setNoGravity(true); - anvil.setInstance(this, new Pos(x+0.5, height, z+0.5)); - anvils.add(anvil); + anvilSpawnPositions.add(new Pos(x+0.5, height, z+0.5)); batch.setBlock(x, spawnHeight-1, z, Block.SNOW_BLOCK); } @@ -54,11 +55,25 @@ class AnvilRun extends StatelessGame { BatchUtil.loadAndApplyBatch(batch, this, () -> callback.complete(null)); } + protected void spawnAnvil(Pos spawnPosition) { + Entity anvil = new Entity(EntityType.FALLING_BLOCK); + ((FallingBlockMeta) anvil.getEntityMeta()).setBlock(Block.ANVIL); + anvil.setInstance(this, spawnPosition); + } + @Override protected void onStart() { super.onStart(); - anvils.forEach(anvil -> anvil.setNoGravity(false)); + Scheduler scheduler = MinecraftServer.getSchedulerManager(); + scheduler.submitTask(() -> { + if(anvilSpawnPositions.isEmpty()) return TaskSchedule.stop(); + for(int i = 0; i < speed; i++) { + Pos position = anvilSpawnPositions.remove(super.rnd.nextInt(0, anvilSpawnPositions.size()-1)); + spawnAnvil(position); + } + return TaskSchedule.seconds(1); + }); } @Override diff --git a/src/main/java/eu/mhsl/minenet/minigames/instance/game/stateless/types/anvilRun/AnvilRunFactory.java b/src/main/java/eu/mhsl/minenet/minigames/instance/game/stateless/types/anvilRun/AnvilRunFactory.java index 403acc0..5901c68 100644 --- a/src/main/java/eu/mhsl/minenet/minigames/instance/game/stateless/types/anvilRun/AnvilRunFactory.java +++ b/src/main/java/eu/mhsl/minenet/minigames/instance/game/stateless/types/anvilRun/AnvilRunFactory.java @@ -26,13 +26,12 @@ public class AnvilRunFactory implements GameFactory { public ConfigManager configuration() { return new ConfigManager() .addOption(new NumericOption("radius", Material.HEART_OF_THE_SEA, TranslatedComponent.byId("optionCommon#radius"), 5, 10, 15, 20, 25, 30)) - .addOption(new NumericOption("pvpEnabled", Material.STICK, TranslatedComponent.byId("game_Deathcube#optionPvpEnabled"), 1, 0)); - + .addOption(new NumericOption("speed", Material.STICK, TranslatedComponent.byId("game_Deathcube#speed"), 10, 25, 50, 100, 250, 500)); } @Override public Game manufacture(Room parent, Map<String, Option<?>> configuration) { - return new AnvilRun(configuration.get("radius").getAsInt(), configuration.get("pvpEnabled").getAsInt()).setParent(parent); + return new AnvilRun(configuration.get("radius").getAsInt(), configuration.get("speed").getAsInt()).setParent(parent); } @Override diff --git a/src/main/java/eu/mhsl/minenet/minigames/instance/game/stateless/types/deathcube/Deathcube.java b/src/main/java/eu/mhsl/minenet/minigames/instance/game/stateless/types/deathcube/Deathcube.java index fe95674..fc79e93 100644 --- a/src/main/java/eu/mhsl/minenet/minigames/instance/game/stateless/types/deathcube/Deathcube.java +++ b/src/main/java/eu/mhsl/minenet/minigames/instance/game/stateless/types/deathcube/Deathcube.java @@ -24,7 +24,7 @@ class Deathcube extends StatelessGame { this.radius = radius; this.height = height + 49; this.percentage = percentage; - this.setGenerator(new CircularPlateTerrainGenerator(radius+10).setPlateHeight(50).setGenerateBorders(true)); + this.setGenerator(new CircularPlateTerrainGenerator(radius+10).setPlateHeight(50)); // if(pvpEnabled == 1) eventNode().addChild( // TODO update // PvPConfig.emptyBuilder() @@ -57,12 +57,20 @@ class Deathcube extends StatelessGame { @Override protected void onPlayerMove(@NotNull PlayerMoveEvent playerMoveEvent) { super.onPlayerMove(playerMoveEvent); - if(isBeforeBeginning) if(playerMoveEvent.getNewPosition().y() > 51.5) playerMoveEvent.setCancelled(true); + if(playerMoveEvent.getNewPosition().y() < 48) { + playerMoveEvent.setCancelled(true); + playerMoveEvent.getPlayer().teleport(getSpawn()); + return; + } + if(isBeforeBeginning && playerMoveEvent.getNewPosition().y() > 51.5) { + playerMoveEvent.setCancelled(true); + return; + } if(playerMoveEvent.getNewPosition().y() > height) getScore().insertResult(playerMoveEvent.getPlayer()); } @Override public Pos getSpawn() { - return new Pos(0, radius+5, 30); + return new Pos(0, 50, -(radius+5)); } }