diff --git a/.idea/compiler.xml b/.idea/compiler.xml
index b86273d..7b18ee8 100644
--- a/.idea/compiler.xml
+++ b/.idea/compiler.xml
@@ -3,4 +3,11 @@
+
+
+
\ No newline at end of file
diff --git a/build.gradle b/build.gradle
index a216060..9a890d3 100644
--- a/build.gradle
+++ b/build.gradle
@@ -11,6 +11,7 @@ version '1.0-SNAPSHOT'
repositories {
mavenCentral()
+ maven { url = 'https://mvn.everbuild.org/public' }
}
java {
@@ -38,6 +39,9 @@ dependencies {
//PvP
implementation 'io.github.togar2:MinestomPvP:2026.05.30-26.1.1'
+
+ //Block placement
+ implementation 'org.everbuild.blocksandstuff:blocksandstuff-blocks:1.10.2-SNAPSHOT'
}
tasks {
diff --git a/src/main/java/eu/mhsl/minenet/minigames/instance/game/stateless/types/bedwars/Bedwars.java b/src/main/java/eu/mhsl/minenet/minigames/instance/game/stateless/types/bedwars/Bedwars.java
index 68273aa..ee9aca2 100644
--- a/src/main/java/eu/mhsl/minenet/minigames/instance/game/stateless/types/bedwars/Bedwars.java
+++ b/src/main/java/eu/mhsl/minenet/minigames/instance/game/stateless/types/bedwars/Bedwars.java
@@ -26,6 +26,7 @@ import net.minestom.server.item.ItemStack;
import net.minestom.server.item.Material;
import net.minestom.server.timer.ExecutionType;
import net.minestom.server.timer.TaskSchedule;
+import net.minestom.server.world.DimensionType;
import org.jetbrains.annotations.NotNull;
import java.io.IOException;
@@ -41,7 +42,7 @@ public class Bedwars extends StatelessGame {
public Bedwars() throws IOException {
super(Dimension.OVERWORLD.key, "Bedwars", new LastWinsScore());
- this.setChunkLoader(new AnvilLoader(Resource.GAME_MAP.getPath().resolve("bedwars/test")));
+ this.setChunkLoader(new AnvilLoader(Resource.GAME_MAP.getPath().resolve("bedwars/test"), DimensionType.OVERWORLD.key()));
Configuration config = ConfigurationProvider.getProvider(YamlConfiguration.class).load(Resource.GAME_MAP.getPath().resolve("bedwars/test/config.yml").toFile());
List teamNames = config.getStringList("setup.teams");
diff --git a/src/main/java/eu/mhsl/minenet/minigames/instance/game/stateless/types/boatRace/BoatRace.java b/src/main/java/eu/mhsl/minenet/minigames/instance/game/stateless/types/boatRace/BoatRace.java
index f6b81cb..2ace4bc 100644
--- a/src/main/java/eu/mhsl/minenet/minigames/instance/game/stateless/types/boatRace/BoatRace.java
+++ b/src/main/java/eu/mhsl/minenet/minigames/instance/game/stateless/types/boatRace/BoatRace.java
@@ -15,6 +15,7 @@ import net.minestom.server.entity.Player;
import net.minestom.server.event.player.PlayerMoveEvent;
import net.minestom.server.instance.anvil.AnvilLoader;
import net.minestom.server.instance.block.Block;
+import net.minestom.server.world.DimensionType;
import org.jetbrains.annotations.NotNull;
import java.util.concurrent.CompletableFuture;
@@ -23,7 +24,7 @@ import java.util.concurrent.CompletableFuture;
public class BoatRace extends StatelessGame {
public BoatRace() {
super(Dimension.OVERWORLD.key, "boatRace", new FirstWinsScore());
- this.setChunkLoader(new AnvilLoader(Resource.GAME_MAP.getPath().resolve("boatRace/woodlandMansion")));
+ this.setChunkLoader(new AnvilLoader(Resource.GAME_MAP.getPath().resolve("boatRace/woodlandMansion"), DimensionType.OVERWORLD.key()));
}
@Override
diff --git a/src/main/java/eu/mhsl/minenet/minigames/instance/game/stateless/types/buildBattle/BuildBattle.java b/src/main/java/eu/mhsl/minenet/minigames/instance/game/stateless/types/buildBattle/BuildBattle.java
index 95ce16c..ccb2a25 100644
--- a/src/main/java/eu/mhsl/minenet/minigames/instance/game/stateless/types/buildBattle/BuildBattle.java
+++ b/src/main/java/eu/mhsl/minenet/minigames/instance/game/stateless/types/buildBattle/BuildBattle.java
@@ -11,8 +11,10 @@ import net.minestom.server.coordinate.Pos;
import net.minestom.server.entity.GameMode;
import net.minestom.server.entity.Player;
import net.minestom.server.event.player.PlayerBlockBreakEvent;
+import net.minestom.server.event.player.PlayerBlockInteractEvent;
import net.minestom.server.event.player.PlayerBlockPlaceEvent;
import net.minestom.server.event.player.PlayerUseItemEvent;
+import net.minestom.server.event.player.PlayerUseItemOnBlockEvent;
import net.minestom.server.item.ItemStack;
import net.minestom.server.item.Material;
import net.minestom.server.timer.TaskSchedule;
@@ -60,7 +62,12 @@ public class BuildBattle extends StatelessGame {
super(Dimension.THE_END.key, "BuildBattle", new PointsWinScore());
this.seconds = seconds;
this.setGenerator(new BuildBattleChunkgenerator(height));
+ BuildBattleBlockRules.register();
this.eventNode().addListener(PlayerUseItemEvent.class, this::onRatingItemUse);
+ this.eventNode().addListener(PlayerUseItemOnBlockEvent.class, e -> FluidFlowHelper.onBucketUse(e, p -> this.isInArea(p, e.getPlayer())));
+ this.eventNode().addListener(PlayerBlockInteractEvent.class, e -> {
+ if (this.isInArea(e.getBlockPosition(), e.getPlayer())) BuildBattleBlockRules.onInteract(e);
+ });
}
@Override
@@ -76,6 +83,21 @@ public class BuildBattle extends StatelessGame {
this.getPlayers().forEach(player -> player.setGameMode(GameMode.CREATIVE));
this.scheduler().scheduleTask(this::endBuildPhase, TaskSchedule.seconds(this.seconds), TaskSchedule.stop());
+ this.scheduleCountdown();
+ }
+
+ private void scheduleCountdown() {
+ int[] marks = {30, 10, 5, 4, 3, 2, 1};
+ for (int m : marks) {
+ if (this.seconds <= m) continue;
+ int remaining = m;
+ this.scheduler().scheduleTask(() -> {
+ NamedTextColor color = remaining <= 5 ? NamedTextColor.RED : (remaining <= 10 ? NamedTextColor.GOLD : NamedTextColor.YELLOW);
+ this.sendMessage(Component.text("Noch ", NamedTextColor.GRAY)
+ .append(Component.text(remaining, color))
+ .append(Component.text(" Sekunde" + (remaining == 1 ? "" : "n") + " Bauzeit!", NamedTextColor.GRAY)));
+ }, TaskSchedule.seconds(this.seconds - m), TaskSchedule.stop());
+ }
}
private void endBuildPhase() {
@@ -97,11 +119,11 @@ public class BuildBattle extends StatelessGame {
);
this.spawnPositions.put(player, plotCenter);
- if(this.spawnPosx >= rowCount) {
+ if(this.spawnPosx >= rowCount - 1) {
this.spawnPosx = 0;
this.spawnPosz++;
- }
- this.spawnPosx++;
+ } else this.spawnPosx ++;
+
player.setGameMode(GameMode.ADVENTURE);
this.scheduler().scheduleNextTick(() -> player.teleport(plotCenter.add(0, 1.5, 0)));
return super.onPlayerJoin(player);
@@ -109,12 +131,32 @@ public class BuildBattle extends StatelessGame {
@Override
protected void onBlockBreak(@NotNull PlayerBlockBreakEvent event) {
- event.setCancelled(!this.isInArea(event.getBlockPosition(), event.getPlayer()));
+ if (!this.isInArea(event.getBlockPosition(), event.getPlayer())) {
+ event.setCancelled(true);
+ return;
+ }
+ FluidFlowHelper.onBreak(event);
}
@Override
protected void onBlockPlace(@NotNull PlayerBlockPlaceEvent event) {
- event.setCancelled(!this.isInArea(event.getBlockPosition(), event.getPlayer()));
+ if (!this.isInArea(event.getBlockPosition(), event.getPlayer())) {
+ event.setCancelled(true);
+ return;
+ }
+ FluidFlowHelper.onPlace(event);
+ }
+
+ private Pos safeSpawn(Player owner) {
+ Pos center = this.spawnPositions.get(owner);
+ int topY = center.blockY();
+ for (int y = 300; y >= center.blockY(); y--) {
+ if (!this.getBlock(center.blockX(), y, center.blockZ()).isAir()) {
+ topY = y;
+ break;
+ }
+ }
+ return new Pos(center.x(), topY + 3, center.z()).withView(center.yaw(), center.pitch());
}
private void rating() {
@@ -136,7 +178,7 @@ public class BuildBattle extends StatelessGame {
this.currentOwner = owner;
this.currentVotes.clear();
- Pos plot = this.spawnPositions.get(owner).add(0, 1.5, 0);
+ Pos plot = this.safeSpawn(owner);
this.sendMessage(Component.text("Bewerte das Grundstück von " + owner.getUsername() + "!"));
this.getPlayers().forEach(p -> {
p.teleport(plot);
@@ -164,21 +206,21 @@ public class BuildBattle extends StatelessGame {
}
private void finishRound() {
- int sum = this.currentVotes.values().stream().mapToInt(Integer::intValue).sum();
- this.getPlayers().forEach(p -> p.getInventory().clear());
+ int voteSum = this.currentVotes.values().stream()
+ .mapToInt(Integer::intValue)
+ .sum();
+ int score = (int) Math.round((double) voteSum / this.getPlayers().size());
- Player owner = this.currentOwner;
+ this.getPlayers().forEach(p -> p.getInventory().clear());
+ this.getScore().insertResult(this.currentOwner, score);
this.currentOwner = null;
- this.getScore().insertResult(owner, sum);
}
private boolean isInArea(Point block, Player player) {
Pos center = this.spawnPositions.get(player);
- double dx = block.x() - center.x();
- double dy = block.y() - center.y();
- double dz = block.z() - center.z();
- return dx >= -plotHalf && dx < plotHalf
- && dy >= 1 && dy <= 300
- && dz >= -plotHalf && dz < plotHalf;
+ if (center == null) return false;
+ Pos min = new Pos(center.x() - plotHalf, center.y() + 1, center.z() - plotHalf);
+ Pos max = new Pos(center.x() + plotHalf - 1, 300, center.z() + plotHalf - 1);
+ return eu.mhsl.minenet.minigames.util.Position.isInArea(block, min, max);
}
}
diff --git a/src/main/java/eu/mhsl/minenet/minigames/instance/game/stateless/types/buildBattle/BuildBattleBlockRules.java b/src/main/java/eu/mhsl/minenet/minigames/instance/game/stateless/types/buildBattle/BuildBattleBlockRules.java
new file mode 100644
index 0000000..5ab090c
--- /dev/null
+++ b/src/main/java/eu/mhsl/minenet/minigames/instance/game/stateless/types/buildBattle/BuildBattleBlockRules.java
@@ -0,0 +1,85 @@
+package eu.mhsl.minenet.minigames.instance.game.stateless.types.buildBattle;
+
+import net.minestom.server.MinecraftServer;
+import net.minestom.server.event.player.PlayerBlockInteractEvent;
+import net.minestom.server.instance.block.Block;
+import net.minestom.server.instance.block.BlockHandler;
+import net.minestom.server.instance.block.rule.BlockPlacementRule;
+import org.everbuild.blocksandstuff.blocks.group.VanillaBlockBehaviour;
+import org.everbuild.blocksandstuff.blocks.group.VanillaPlacementRules;
+import org.everbuild.blocksandstuff.blocks.group.behaviour.BehaviourGroup;
+import org.everbuild.blocksandstuff.blocks.group.placement.PlacementGroup;
+import org.jetbrains.annotations.Nullable;
+
+import java.util.HashMap;
+import java.util.Map;
+
+public final class BuildBattleBlockRules {
+ private BuildBattleBlockRules() {}
+
+ private static final ThreadLocal interactingInBuildBattle = ThreadLocal.withInitial(() -> false);
+ private static final Map behaviours = new HashMap<>();
+ private static boolean registered = false;
+
+ public static synchronized void register() {
+ if (registered) return;
+ registered = true;
+
+ var blockManager = MinecraftServer.getBlockManager();
+ for (PlacementGroup group : VanillaPlacementRules.INSTANCE.getALL()) {
+ for (Block block : group.getBlockGroup().allMatching()) {
+ blockManager.registerBlockPlacementRule(new BuildBattleOnlyRule(group.createRule(block)));
+ }
+ }
+
+ for (BehaviourGroup group : VanillaBlockBehaviour.INSTANCE.getALL()) {
+ for (Block block : group.getBlockGroup().allMatching()) {
+ behaviours.put(block.id(), group.createHandler(block));
+ }
+ }
+
+ MinecraftServer.getGlobalEventHandler().addListener(PlayerBlockInteractEvent.class,
+ e -> interactingInBuildBattle.set(e.getInstance() instanceof BuildBattle));
+ }
+
+ public static void onInteract(PlayerBlockInteractEvent event) {
+ BlockHandler handler = behaviours.get(event.getBlock().id());
+ if (handler == null) return;
+ boolean continueItemUse = handler.onInteract(new BlockHandler.Interaction(
+ event.getBlock(), event.getInstance(), event.getBlockFace(), event.getBlockPosition(),
+ event.getCursorPosition(), event.getPlayer(), event.getHand()
+ ));
+ if (!continueItemUse) event.setBlockingItemUse(true);
+ }
+
+ private static final class BuildBattleOnlyRule extends BlockPlacementRule {
+ private final BlockPlacementRule delegate;
+
+ private BuildBattleOnlyRule(BlockPlacementRule delegate) {
+ super(delegate.getBlock());
+ this.delegate = delegate;
+ }
+
+ @Override
+ public @Nullable Block blockPlace(PlacementState placementState) {
+ if (!(placementState.instance() instanceof BuildBattle)) return placementState.block();
+ return this.delegate.blockPlace(placementState);
+ }
+
+ @Override
+ public Block blockUpdate(UpdateState updateState) {
+ if (!(updateState.instance() instanceof BuildBattle)) return updateState.currentBlock();
+ return this.delegate.blockUpdate(updateState);
+ }
+
+ @Override
+ public boolean isSelfReplaceable(Replacement replacement) {
+ return interactingInBuildBattle.get() && this.delegate.isSelfReplaceable(replacement);
+ }
+
+ @Override
+ public int maxUpdateDistance() {
+ return this.delegate.maxUpdateDistance();
+ }
+ }
+}
diff --git a/src/main/java/eu/mhsl/minenet/minigames/instance/game/stateless/types/buildBattle/FluidFlowHelper.java b/src/main/java/eu/mhsl/minenet/minigames/instance/game/stateless/types/buildBattle/FluidFlowHelper.java
new file mode 100644
index 0000000..2e80a38
--- /dev/null
+++ b/src/main/java/eu/mhsl/minenet/minigames/instance/game/stateless/types/buildBattle/FluidFlowHelper.java
@@ -0,0 +1,267 @@
+package eu.mhsl.minenet.minigames.instance.game.stateless.types.buildBattle;
+
+import net.minestom.server.coordinate.BlockVec;
+import net.minestom.server.coordinate.Point;
+import net.minestom.server.event.player.PlayerBlockBreakEvent;
+import net.minestom.server.event.player.PlayerBlockPlaceEvent;
+import net.minestom.server.event.player.PlayerUseItemOnBlockEvent;
+import net.minestom.server.instance.Instance;
+import net.minestom.server.instance.block.Block;
+import net.minestom.server.item.Material;
+import net.minestom.server.timer.TaskSchedule;
+import net.minestom.server.utils.Direction;
+
+import java.util.ArrayDeque;
+import java.util.HashSet;
+import java.util.Set;
+import java.util.function.Predicate;
+
+public final class FluidFlowHelper {
+ private FluidFlowHelper() {}
+
+ private static final int WATER_TICK = 5;
+ private static final int LAVA_TICK = 30;
+ private static final int WATER_RANGE = 7;
+ private static final int LAVA_RANGE = 3;
+ private static final int FALLING = 8;
+
+ public static void onBucketUse(PlayerUseItemOnBlockEvent event, Predicate inArea) {
+ Material m = event.getItemStack().material();
+ Instance inst = event.getPlayer().getInstance();
+ if (inst == null) return;
+ Point hit = event.getPosition();
+ var face = event.getBlockFace();
+ BlockVec placePos = new BlockVec(
+ hit.blockX() + face.toDirection().normalX(),
+ hit.blockY() + face.toDirection().normalY(),
+ hit.blockZ() + face.toDirection().normalZ()
+ );
+ if (!inArea.test(placePos)) return;
+
+ if (m == Material.WATER_BUCKET) {
+ inst.setBlock(placePos, Block.WATER.withProperty("level", "0"));
+ scheduleFlow(inst, placePos, true);
+ } else if (m == Material.LAVA_BUCKET) {
+ inst.setBlock(placePos, Block.LAVA.withProperty("level", "0"));
+ scheduleFlow(inst, placePos, false);
+ } else if (m == Material.BUCKET) {
+ Block existing = inst.getBlock(placePos);
+ if (isWater(existing) || isLava(existing)) inst.setBlock(placePos, Block.AIR);
+ }
+ }
+
+ public static void onPlace(PlayerBlockPlaceEvent event) {
+ Block b = event.getBlock();
+ if (isWater(b) || isLava(b)) {
+ Instance inst = event.getInstance();
+ BlockVec pos = event.getBlockPosition();
+ scheduleFlow(inst, pos, isWater(b));
+ }
+ triggerNeighbors(event.getInstance(), event.getBlockPosition());
+ }
+
+ public static void onBreak(PlayerBlockBreakEvent event) {
+ triggerNeighbors(event.getInstance(), event.getBlockPosition());
+ }
+
+ private static void triggerNeighbors(Instance inst, BlockVec pos) {
+ for (Direction d : Direction.values()) {
+ BlockVec np = new BlockVec(pos.blockX() + d.normalX(), pos.blockY() + d.normalY(), pos.blockZ() + d.normalZ());
+ Block nb = inst.getBlock(np);
+ if (isWater(nb) || isLava(nb)) scheduleFlow(inst, np, isWater(nb));
+ }
+ }
+
+ private static void scheduleFlow(Instance inst, BlockVec pos, boolean water) {
+ int delay = water ? WATER_TICK : LAVA_TICK;
+ inst.scheduler().buildTask(() -> step(inst, pos, water)).delay(TaskSchedule.tick(delay)).schedule();
+ }
+
+ private static void step(Instance inst, BlockVec pos, boolean water) {
+ Block self = inst.getBlock(pos);
+ if (water ? !isWater(self) : !isLava(self)) return;
+
+ int level = parseLevel(self);
+ boolean source = level == 0;
+ boolean falling = level >= FALLING;
+ int flowLevel = source ? 1 : (falling ? 1 : level + 1);
+ int maxRange = water ? WATER_RANGE : LAVA_RANGE;
+
+ if (!source && !falling) {
+ int newLevel = computeIncomingLevel(inst, pos, water, maxRange);
+ if (newLevel == -1) {
+ inst.setBlock(pos, Block.AIR);
+ triggerNeighbors(inst, pos);
+ return;
+ }
+ if (newLevel != level) {
+ inst.setBlock(pos, (water ? Block.WATER : Block.LAVA).withProperty("level", String.valueOf(newLevel)));
+ level = newLevel;
+ flowLevel = level + 1;
+ }
+ }
+
+ if (water && !source && countAdjacentSources(inst, pos, true) >= 2
+ && hasSolidBelow(inst, pos)) {
+ inst.setBlock(pos, Block.WATER.withProperty("level", "0"));
+ scheduleFlow(inst, pos, true);
+ triggerNeighbors(inst, pos);
+ return;
+ }
+
+ BlockVec below = new BlockVec(pos.blockX(), pos.blockY() - 1, pos.blockZ());
+ Block belowBlock = inst.getBlock(below);
+ if (isReplaceable(belowBlock) || (water ? isWater(belowBlock) : isLava(belowBlock))) {
+ if (handleFluidCollision(inst, below, water)) {
+ triggerNeighbors(inst, below);
+ return;
+ }
+ Block target = (water ? Block.WATER : Block.LAVA).withProperty("level", String.valueOf(FALLING));
+ if (!belowBlock.compare(target) || !target.getProperty("level").equals(belowBlock.getProperty("level"))) {
+ if (!(isWater(belowBlock) && parseLevel(belowBlock) == 0)
+ && !(isLava(belowBlock) && parseLevel(belowBlock) == 0)) {
+ inst.setBlock(below, target);
+ scheduleFlow(inst, below, water);
+ triggerNeighbors(inst, below);
+ }
+ }
+ if (!hasSolidBelow(inst, pos) && !source) return;
+ }
+
+ if (flowLevel > maxRange) return;
+
+ Set targets = findFlowTargets(inst, pos, water, maxRange - (source ? 0 : level));
+ for (Direction d : Direction.HORIZONTAL) {
+ if (!targets.contains(d)) continue;
+ BlockVec np = new BlockVec(pos.blockX() + d.normalX(), pos.blockY(), pos.blockZ() + d.normalZ());
+ Block nb = inst.getBlock(np);
+ if (handleFluidCollision(inst, np, water)) continue;
+ if (!isReplaceable(nb) && !(water ? isWater(nb) : isLava(nb))) continue;
+ int existingLevel = (water ? isWater(nb) : isLava(nb)) ? parseLevel(nb) : Integer.MAX_VALUE;
+ if (existingLevel == 0) continue;
+ if (flowLevel < existingLevel) {
+ inst.setBlock(np, (water ? Block.WATER : Block.LAVA).withProperty("level", String.valueOf(flowLevel)));
+ scheduleFlow(inst, np, water);
+ triggerNeighbors(inst, np);
+ }
+ }
+ }
+
+ private static int computeIncomingLevel(Instance inst, BlockVec pos, boolean water, int maxRange) {
+ int min = Integer.MAX_VALUE;
+ BlockVec above = new BlockVec(pos.blockX(), pos.blockY() + 1, pos.blockZ());
+ Block ab = inst.getBlock(above);
+ if ((water ? isWater(ab) : isLava(ab))) return FALLING;
+ for (Direction d : Direction.HORIZONTAL) {
+ BlockVec np = new BlockVec(pos.blockX() + d.normalX(), pos.blockY(), pos.blockZ() + d.normalZ());
+ Block nb = inst.getBlock(np);
+ if (water ? isWater(nb) : isLava(nb)) {
+ int nl = parseLevel(nb);
+ if (nl >= FALLING) nl = 0;
+ if (nl < min) min = nl;
+ }
+ }
+ if (min == Integer.MAX_VALUE) return -1;
+ int result = min + 1;
+ if (result > maxRange) return -1;
+ return result;
+ }
+
+ private static Set findFlowTargets(Instance inst, BlockVec pos, boolean water, int remaining) {
+ Set result = new HashSet<>();
+ if (remaining <= 0) return result;
+ int bestDist = Integer.MAX_VALUE;
+ int[] dist = new int[4];
+ Direction[] dirs = {Direction.NORTH, Direction.EAST, Direction.SOUTH, Direction.WEST};
+ for (int i = 0; i < 4; i++) {
+ BlockVec np = new BlockVec(pos.blockX() + dirs[i].normalX(), pos.blockY(), pos.blockZ() + dirs[i].normalZ());
+ Block nb = inst.getBlock(np);
+ if (!isReplaceable(nb) && !(water ? isWater(nb) : isLava(nb))) { dist[i] = Integer.MAX_VALUE; continue; }
+ dist[i] = bfsDownhill(inst, np, water, remaining);
+ if (dist[i] < bestDist) bestDist = dist[i];
+ }
+ if (bestDist == Integer.MAX_VALUE) {
+ for (int i = 0; i < 4; i++) {
+ if (dist[i] < Integer.MAX_VALUE) result.add(dirs[i]);
+ }
+ } else {
+ for (int i = 0; i < 4; i++) {
+ if (dist[i] == bestDist) result.add(dirs[i]);
+ }
+ }
+ return result;
+ }
+
+ private static int bfsDownhill(Instance inst, BlockVec start, boolean water, int remaining) {
+ ArrayDeque queue = new ArrayDeque<>();
+ Set visited = new HashSet<>();
+ queue.add(new int[]{start.blockX(), start.blockY(), start.blockZ(), 0});
+ visited.add(key(start.blockX(), start.blockY(), start.blockZ()));
+ while (!queue.isEmpty()) {
+ int[] c = queue.poll();
+ BlockVec cp = new BlockVec(c[0], c[1], c[2]);
+ Block below = inst.getBlock(new BlockVec(c[0], c[1] - 1, c[2]));
+ if (isReplaceable(below) && !(water ? isWater(below) : isLava(below))) return c[3];
+ if (c[3] >= remaining) continue;
+ for (Direction d : Direction.HORIZONTAL) {
+ int nx = c[0] + d.normalX(), nz = c[2] + d.normalZ();
+ long k = key(nx, c[1], nz);
+ if (visited.contains(k)) continue;
+ Block nb = inst.getBlock(new BlockVec(nx, c[1], nz));
+ if (!isReplaceable(nb) && !(water ? isWater(nb) : isLava(nb))) continue;
+ visited.add(k);
+ queue.add(new int[]{nx, c[1], nz, c[3] + 1});
+ }
+ }
+ return Integer.MAX_VALUE;
+ }
+
+ private static long key(int x, int y, int z) {
+ return ((long) x & 0x3FFFFFFL) | (((long) z & 0x3FFFFFFL) << 26) | (((long) y & 0xFFFL) << 52);
+ }
+
+ private static int countAdjacentSources(Instance inst, BlockVec pos, boolean water) {
+ int c = 0;
+ for (Direction d : Direction.HORIZONTAL) {
+ Block nb = inst.getBlock(new BlockVec(pos.blockX() + d.normalX(), pos.blockY(), pos.blockZ() + d.normalZ()));
+ if ((water ? isWater(nb) : isLava(nb)) && parseLevel(nb) == 0) c++;
+ }
+ return c;
+ }
+
+ private static boolean hasSolidBelow(Instance inst, BlockVec pos) {
+ Block below = inst.getBlock(new BlockVec(pos.blockX(), pos.blockY() - 1, pos.blockZ()));
+ return below.isSolid();
+ }
+
+ private static boolean handleFluidCollision(Instance inst, BlockVec pos, boolean incomingIsWater) {
+ Block target = inst.getBlock(pos);
+ if (incomingIsWater && isLava(target)) {
+ boolean lavaSource = parseLevel(target) == 0;
+ inst.setBlock(pos, lavaSource ? Block.OBSIDIAN : Block.COBBLESTONE);
+ return true;
+ }
+ if (!incomingIsWater && isWater(target)) {
+ inst.setBlock(pos, Block.STONE);
+ return true;
+ }
+ return false;
+ }
+
+ private static boolean isReplaceable(Block b) {
+ if (b.isAir()) return true;
+ String p = b.key().value();
+ return p.equals("short_grass") || p.equals("tall_grass") || p.equals("fern") || p.equals("large_fern")
+ || p.equals("dead_bush") || p.equals("seagrass") || p.equals("tall_seagrass") || p.equals("vine")
+ || p.equals("snow") || p.equals("fire") || p.equals("soul_fire");
+ }
+
+ private static boolean isWater(Block b) { return b.compare(Block.WATER); }
+ private static boolean isLava(Block b) { return b.compare(Block.LAVA); }
+
+ private static int parseLevel(Block b) {
+ String s = b.getProperty("level");
+ if (s == null) return 0;
+ try { return Integer.parseInt(s); } catch (NumberFormatException e) { return 0; }
+ }
+}
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
index 193ec36..e13986e 100644
--- 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
@@ -9,6 +9,7 @@ import io.github.togar2.pvp.events.FinalAttackEvent;
import io.github.togar2.pvp.events.PrepareAttackEvent;
import io.github.togar2.pvp.feature.CombatFeatures;
import io.github.togar2.pvp.feature.knockback.KnockbackSettings;
+import net.minestom.server.ServerFlag;
import net.minestom.server.coordinate.Pos;
import net.minestom.server.entity.Player;
import net.minestom.server.event.instance.InstanceTickEvent;
@@ -51,15 +52,18 @@ class HighGround extends StatelessGame {
this.eventNode().addListener(
EntityKnockbackEvent.class,
- entityKnockbackEvent -> entityKnockbackEvent.setSettings(
- KnockbackSettings.builder()
- .horizontal(1.1)
- .vertical(KnockbackSettings.DEFAULT.vertical())
- .verticalLimit(KnockbackSettings.DEFAULT.verticalLimit())
- .extraHorizontal(KnockbackSettings.DEFAULT.extraHorizontal())
- .extraVertical(KnockbackSettings.DEFAULT.extraVertical())
- .build()
- )
+ entityKnockbackEvent -> {
+ double tps = ServerFlag.SERVER_TICKS_PER_SECOND;
+ entityKnockbackEvent.setSettings(
+ KnockbackSettings.builder()
+ .horizontal(1.1)
+ .vertical(KnockbackSettings.DEFAULT.vertical() / tps)
+ .verticalLimit(KnockbackSettings.DEFAULT.verticalLimit() / tps)
+ .extraHorizontal(KnockbackSettings.DEFAULT.extraHorizontal() / tps)
+ .extraVertical(KnockbackSettings.DEFAULT.extraVertical() / tps)
+ .build()
+ );
+ }
);
this.eventNode().addListener(InstanceTickEvent.class, instanceTickEvent -> {
diff --git a/src/main/java/eu/mhsl/minenet/minigames/instance/game/stateless/types/tetris/Tetris.java b/src/main/java/eu/mhsl/minenet/minigames/instance/game/stateless/types/tetris/Tetris.java
index 0f3336f..b293b61 100644
--- a/src/main/java/eu/mhsl/minenet/minigames/instance/game/stateless/types/tetris/Tetris.java
+++ b/src/main/java/eu/mhsl/minenet/minigames/instance/game/stateless/types/tetris/Tetris.java
@@ -147,10 +147,10 @@ class Tetris extends StatelessGame {
TetrisGame tetrisGame = this.tetrisGames.get(p);
- p.teleport(tetrisGame.getPlayerSpawnPosition());
tetrisGame.sidebar.addViewer(p);
MinecraftServer.getSchedulerManager().scheduleTask(() -> {
+ p.teleport(tetrisGame.getPlayerSpawnPosition());
Entity ghostBlock = new Entity(EntityType.BLOCK_DISPLAY);
((BlockDisplayMeta) ghostBlock.getEntityMeta()).setBlockState(Block.AIR);
ghostBlock.setNoGravity(true);
@@ -159,7 +159,6 @@ class Tetris extends StatelessGame {
return TaskSchedule.stop();
}, TaskSchedule.nextTick());
-
return super.onPlayerJoin(p);
}
diff --git a/src/main/java/eu/mhsl/minenet/minigames/instance/game/stateless/types/tetris/game/TetrisGame.java b/src/main/java/eu/mhsl/minenet/minigames/instance/game/stateless/types/tetris/game/TetrisGame.java
index 5098939..e50c7ba 100644
--- a/src/main/java/eu/mhsl/minenet/minigames/instance/game/stateless/types/tetris/game/TetrisGame.java
+++ b/src/main/java/eu/mhsl/minenet/minigames/instance/game/stateless/types/tetris/game/TetrisGame.java
@@ -92,7 +92,7 @@ public class TetrisGame {
int standardTickDelay = 40;
if(this.isFast) standardTickDelay = 20;
- TaskSchedule nextTick = TaskSchedule.tick(Math.round((float) standardTickDelay / this.level));
+ TaskSchedule nextTick = TaskSchedule.tick(Math.max(Math.round((float) standardTickDelay / this.level), 1));
if(this.paused) return nextTick;
this.tick();
return nextTick;
diff --git a/src/main/java/eu/mhsl/minenet/minigames/instance/hub/Hub.java b/src/main/java/eu/mhsl/minenet/minigames/instance/hub/Hub.java
index 1ba0635..383c8ce 100644
--- a/src/main/java/eu/mhsl/minenet/minigames/instance/hub/Hub.java
+++ b/src/main/java/eu/mhsl/minenet/minigames/instance/hub/Hub.java
@@ -12,8 +12,7 @@ import net.minestom.server.event.player.PlayerBlockBreakEvent;
import net.minestom.server.event.player.PlayerBlockInteractEvent;
import net.minestom.server.event.player.PlayerBlockPlaceEvent;
import net.minestom.server.instance.anvil.AnvilLoader;
-
-import java.nio.file.Path;
+import net.minestom.server.world.DimensionType;
public class Hub extends MineNetInstance implements Spawnable {
public static final Hub INSTANCE = new Hub();
@@ -21,7 +20,7 @@ public class Hub extends MineNetInstance implements Spawnable {
static {
MinecraftServer.getInstanceManager().registerInstance(INSTANCE);
- INSTANCE.setChunkLoader(new AnvilLoader(Resource.HUB_MAP.getPath()));
+ INSTANCE.setChunkLoader(new AnvilLoader(Resource.HUB_MAP.getPath(), DimensionType.OVERWORLD.key()));
INSTANCE.eventNode()
.addListener(PlayerBlockBreakEvent.class, CommonEventHandles::cancel)
@@ -33,7 +32,6 @@ public class Hub extends MineNetInstance implements Spawnable {
private Hub() {
super(Dimension.THE_END.key);
- this.setChunkLoader(new AnvilLoader(Path.of("maps/hub")));
this.setTime(18000);
this.defaultClock().pause();
diff --git a/src/main/java/eu/mhsl/minenet/minigames/instance/room/Room.java b/src/main/java/eu/mhsl/minenet/minigames/instance/room/Room.java
index 4e156ce..40cefd5 100644
--- a/src/main/java/eu/mhsl/minenet/minigames/instance/room/Room.java
+++ b/src/main/java/eu/mhsl/minenet/minigames/instance/room/Room.java
@@ -18,6 +18,7 @@ import net.minestom.server.entity.Player;
import net.minestom.server.event.player.PlayerBlockBreakEvent;
import net.minestom.server.event.player.PlayerDisconnectEvent;
import net.minestom.server.instance.anvil.AnvilLoader;
+import net.minestom.server.world.DimensionType;
import java.util.*;
import java.util.logging.Logger;
@@ -102,7 +103,7 @@ public class Room extends MineNetInstance implements Spawnable {
private void construct() {
MinecraftServer.getInstanceManager().registerInstance(this);
- this.setChunkLoader(new AnvilLoader(Resource.LOBBY_MAP.getPath()));
+ this.setChunkLoader(new AnvilLoader(Resource.LOBBY_MAP.getPath(), DimensionType.OVERWORLD.key()));
this.gameSelector = new GameSelector();
this.gameSelector.setInstance(this, new Pos(0.5, 50, 19.5));
diff --git a/src/main/java/eu/mhsl/minenet/minigames/score/tournament/TournamentDisplay.java b/src/main/java/eu/mhsl/minenet/minigames/score/tournament/TournamentDisplay.java
index 16d5495..6fe9782 100644
--- a/src/main/java/eu/mhsl/minenet/minigames/score/tournament/TournamentDisplay.java
+++ b/src/main/java/eu/mhsl/minenet/minigames/score/tournament/TournamentDisplay.java
@@ -12,6 +12,7 @@ import net.minestom.server.entity.GameMode;
import net.minestom.server.entity.Player;
import net.minestom.server.event.player.PlayerMoveEvent;
import net.minestom.server.instance.anvil.AnvilLoader;
+import net.minestom.server.world.DimensionType;
import java.util.Comparator;
import java.util.List;
@@ -29,7 +30,7 @@ public class TournamentDisplay extends MineNetInstance implements Spawnable {
public TournamentDisplay(Tournament tournament) {
super(Dimension.OVERWORLD.key);
- this.setChunkLoader(new AnvilLoader(Resource.RESULT_DISPLAY.getPath()));
+ this.setChunkLoader(new AnvilLoader(Resource.RESULT_DISPLAY.getPath(), DimensionType.OVERWORLD.key()));
this.places = tournament.getPlaces();
this.tournament = tournament;
diff --git a/src/main/java/eu/mhsl/minenet/minigames/util/Position.java b/src/main/java/eu/mhsl/minenet/minigames/util/Position.java
index bb5dc2e..e9d0d50 100644
--- a/src/main/java/eu/mhsl/minenet/minigames/util/Position.java
+++ b/src/main/java/eu/mhsl/minenet/minigames/util/Position.java
@@ -44,4 +44,17 @@ public class Position {
public static boolean hasPositionChanged(Pos oldPos, Pos newPos) {
return !oldPos.withView(0, 0).equals(newPos.withView(0, 0));
}
+
+ public static boolean isInArea(Point point, Point pos1, Point pos2) {
+ double minX = Math.min(pos1.x(), pos2.x());
+ double maxX = Math.max(pos1.x(), pos2.x());
+ double minY = Math.min(pos1.y(), pos2.y());
+ double maxY = Math.max(pos1.y(), pos2.y());
+ double minZ = Math.min(pos1.z(), pos2.z());
+ double maxZ = Math.max(pos1.z(), pos2.z());
+
+ return point.x() >= minX && point.x() <= maxX
+ && point.y() >= minY && point.y() <= maxY
+ && point.z() >= minZ && point.z() <= maxZ;
+ }
}
diff --git a/src/main/resources/maps/game/bedwars/test/region/r.-1.-1.mca b/src/main/resources/maps/game/bedwars/test/dimensions/minecraft/overworld/region/r.-1.-1.mca
similarity index 100%
rename from src/main/resources/maps/game/bedwars/test/region/r.-1.-1.mca
rename to src/main/resources/maps/game/bedwars/test/dimensions/minecraft/overworld/region/r.-1.-1.mca
diff --git a/src/main/resources/maps/game/bedwars/test/region/r.-1.-2.mca b/src/main/resources/maps/game/bedwars/test/dimensions/minecraft/overworld/region/r.-1.-2.mca
similarity index 100%
rename from src/main/resources/maps/game/bedwars/test/region/r.-1.-2.mca
rename to src/main/resources/maps/game/bedwars/test/dimensions/minecraft/overworld/region/r.-1.-2.mca
diff --git a/src/main/resources/maps/game/bedwars/test/region/r.-1.0.mca b/src/main/resources/maps/game/bedwars/test/dimensions/minecraft/overworld/region/r.-1.0.mca
similarity index 100%
rename from src/main/resources/maps/game/bedwars/test/region/r.-1.0.mca
rename to src/main/resources/maps/game/bedwars/test/dimensions/minecraft/overworld/region/r.-1.0.mca
diff --git a/src/main/resources/maps/game/bedwars/test/region/r.-1.1.mca b/src/main/resources/maps/game/bedwars/test/dimensions/minecraft/overworld/region/r.-1.1.mca
similarity index 100%
rename from src/main/resources/maps/game/bedwars/test/region/r.-1.1.mca
rename to src/main/resources/maps/game/bedwars/test/dimensions/minecraft/overworld/region/r.-1.1.mca
diff --git a/src/main/resources/maps/game/bedwars/test/region/r.-2.-1.mca b/src/main/resources/maps/game/bedwars/test/dimensions/minecraft/overworld/region/r.-2.-1.mca
similarity index 100%
rename from src/main/resources/maps/game/bedwars/test/region/r.-2.-1.mca
rename to src/main/resources/maps/game/bedwars/test/dimensions/minecraft/overworld/region/r.-2.-1.mca
diff --git a/src/main/resources/maps/game/bedwars/test/region/r.-2.-2.mca b/src/main/resources/maps/game/bedwars/test/dimensions/minecraft/overworld/region/r.-2.-2.mca
similarity index 100%
rename from src/main/resources/maps/game/bedwars/test/region/r.-2.-2.mca
rename to src/main/resources/maps/game/bedwars/test/dimensions/minecraft/overworld/region/r.-2.-2.mca
diff --git a/src/main/resources/maps/game/bedwars/test/region/r.-2.0.mca b/src/main/resources/maps/game/bedwars/test/dimensions/minecraft/overworld/region/r.-2.0.mca
similarity index 100%
rename from src/main/resources/maps/game/bedwars/test/region/r.-2.0.mca
rename to src/main/resources/maps/game/bedwars/test/dimensions/minecraft/overworld/region/r.-2.0.mca
diff --git a/src/main/resources/maps/game/bedwars/test/region/r.-2.1.mca b/src/main/resources/maps/game/bedwars/test/dimensions/minecraft/overworld/region/r.-2.1.mca
similarity index 100%
rename from src/main/resources/maps/game/bedwars/test/region/r.-2.1.mca
rename to src/main/resources/maps/game/bedwars/test/dimensions/minecraft/overworld/region/r.-2.1.mca
diff --git a/src/main/resources/maps/game/bedwars/test/region/r.0.-1.mca b/src/main/resources/maps/game/bedwars/test/dimensions/minecraft/overworld/region/r.0.-1.mca
similarity index 100%
rename from src/main/resources/maps/game/bedwars/test/region/r.0.-1.mca
rename to src/main/resources/maps/game/bedwars/test/dimensions/minecraft/overworld/region/r.0.-1.mca
diff --git a/src/main/resources/maps/game/bedwars/test/region/r.0.-2.mca b/src/main/resources/maps/game/bedwars/test/dimensions/minecraft/overworld/region/r.0.-2.mca
similarity index 100%
rename from src/main/resources/maps/game/bedwars/test/region/r.0.-2.mca
rename to src/main/resources/maps/game/bedwars/test/dimensions/minecraft/overworld/region/r.0.-2.mca
diff --git a/src/main/resources/maps/game/bedwars/test/region/r.0.0.mca b/src/main/resources/maps/game/bedwars/test/dimensions/minecraft/overworld/region/r.0.0.mca
similarity index 100%
rename from src/main/resources/maps/game/bedwars/test/region/r.0.0.mca
rename to src/main/resources/maps/game/bedwars/test/dimensions/minecraft/overworld/region/r.0.0.mca
diff --git a/src/main/resources/maps/game/bedwars/test/region/r.0.1.mca b/src/main/resources/maps/game/bedwars/test/dimensions/minecraft/overworld/region/r.0.1.mca
similarity index 100%
rename from src/main/resources/maps/game/bedwars/test/region/r.0.1.mca
rename to src/main/resources/maps/game/bedwars/test/dimensions/minecraft/overworld/region/r.0.1.mca
diff --git a/src/main/resources/maps/game/bedwars/test/region/r.1.-1.mca b/src/main/resources/maps/game/bedwars/test/dimensions/minecraft/overworld/region/r.1.-1.mca
similarity index 100%
rename from src/main/resources/maps/game/bedwars/test/region/r.1.-1.mca
rename to src/main/resources/maps/game/bedwars/test/dimensions/minecraft/overworld/region/r.1.-1.mca
diff --git a/src/main/resources/maps/game/bedwars/test/region/r.1.-2.mca b/src/main/resources/maps/game/bedwars/test/dimensions/minecraft/overworld/region/r.1.-2.mca
similarity index 100%
rename from src/main/resources/maps/game/bedwars/test/region/r.1.-2.mca
rename to src/main/resources/maps/game/bedwars/test/dimensions/minecraft/overworld/region/r.1.-2.mca
diff --git a/src/main/resources/maps/game/bedwars/test/region/r.1.0.mca b/src/main/resources/maps/game/bedwars/test/dimensions/minecraft/overworld/region/r.1.0.mca
similarity index 100%
rename from src/main/resources/maps/game/bedwars/test/region/r.1.0.mca
rename to src/main/resources/maps/game/bedwars/test/dimensions/minecraft/overworld/region/r.1.0.mca
diff --git a/src/main/resources/maps/game/bedwars/test/region/r.1.1.mca b/src/main/resources/maps/game/bedwars/test/dimensions/minecraft/overworld/region/r.1.1.mca
similarity index 100%
rename from src/main/resources/maps/game/bedwars/test/region/r.1.1.mca
rename to src/main/resources/maps/game/bedwars/test/dimensions/minecraft/overworld/region/r.1.1.mca
diff --git a/src/main/resources/maps/game/boatRace/woodlandMansion/region/r.-1.-1.mca b/src/main/resources/maps/game/boatRace/woodlandMansion/dimensions/minecraft/overworld/region/r.-1.-1.mca
similarity index 100%
rename from src/main/resources/maps/game/boatRace/woodlandMansion/region/r.-1.-1.mca
rename to src/main/resources/maps/game/boatRace/woodlandMansion/dimensions/minecraft/overworld/region/r.-1.-1.mca
diff --git a/src/main/resources/maps/game/boatRace/woodlandMansion/region/r.-1.-2.mca b/src/main/resources/maps/game/boatRace/woodlandMansion/dimensions/minecraft/overworld/region/r.-1.-2.mca
similarity index 100%
rename from src/main/resources/maps/game/boatRace/woodlandMansion/region/r.-1.-2.mca
rename to src/main/resources/maps/game/boatRace/woodlandMansion/dimensions/minecraft/overworld/region/r.-1.-2.mca
diff --git a/src/main/resources/maps/game/boatRace/woodlandMansion/region/r.-1.0.mca b/src/main/resources/maps/game/boatRace/woodlandMansion/dimensions/minecraft/overworld/region/r.-1.0.mca
similarity index 100%
rename from src/main/resources/maps/game/boatRace/woodlandMansion/region/r.-1.0.mca
rename to src/main/resources/maps/game/boatRace/woodlandMansion/dimensions/minecraft/overworld/region/r.-1.0.mca
diff --git a/src/main/resources/maps/game/boatRace/woodlandMansion/region/r.-1.1.mca b/src/main/resources/maps/game/boatRace/woodlandMansion/dimensions/minecraft/overworld/region/r.-1.1.mca
similarity index 100%
rename from src/main/resources/maps/game/boatRace/woodlandMansion/region/r.-1.1.mca
rename to src/main/resources/maps/game/boatRace/woodlandMansion/dimensions/minecraft/overworld/region/r.-1.1.mca
diff --git a/src/main/resources/maps/game/boatRace/woodlandMansion/region/r.-1.2.mca b/src/main/resources/maps/game/boatRace/woodlandMansion/dimensions/minecraft/overworld/region/r.-1.2.mca
similarity index 100%
rename from src/main/resources/maps/game/boatRace/woodlandMansion/region/r.-1.2.mca
rename to src/main/resources/maps/game/boatRace/woodlandMansion/dimensions/minecraft/overworld/region/r.-1.2.mca
diff --git a/src/main/resources/maps/game/boatRace/woodlandMansion/region/r.-2.-1.mca b/src/main/resources/maps/game/boatRace/woodlandMansion/dimensions/minecraft/overworld/region/r.-2.-1.mca
similarity index 100%
rename from src/main/resources/maps/game/boatRace/woodlandMansion/region/r.-2.-1.mca
rename to src/main/resources/maps/game/boatRace/woodlandMansion/dimensions/minecraft/overworld/region/r.-2.-1.mca
diff --git a/src/main/resources/maps/game/boatRace/woodlandMansion/region/r.-2.-2.mca b/src/main/resources/maps/game/boatRace/woodlandMansion/dimensions/minecraft/overworld/region/r.-2.-2.mca
similarity index 100%
rename from src/main/resources/maps/game/boatRace/woodlandMansion/region/r.-2.-2.mca
rename to src/main/resources/maps/game/boatRace/woodlandMansion/dimensions/minecraft/overworld/region/r.-2.-2.mca
diff --git a/src/main/resources/maps/game/boatRace/woodlandMansion/region/r.-2.0.mca b/src/main/resources/maps/game/boatRace/woodlandMansion/dimensions/minecraft/overworld/region/r.-2.0.mca
similarity index 100%
rename from src/main/resources/maps/game/boatRace/woodlandMansion/region/r.-2.0.mca
rename to src/main/resources/maps/game/boatRace/woodlandMansion/dimensions/minecraft/overworld/region/r.-2.0.mca
diff --git a/src/main/resources/maps/game/boatRace/woodlandMansion/region/r.-2.1.mca b/src/main/resources/maps/game/boatRace/woodlandMansion/dimensions/minecraft/overworld/region/r.-2.1.mca
similarity index 100%
rename from src/main/resources/maps/game/boatRace/woodlandMansion/region/r.-2.1.mca
rename to src/main/resources/maps/game/boatRace/woodlandMansion/dimensions/minecraft/overworld/region/r.-2.1.mca
diff --git a/src/main/resources/maps/game/boatRace/woodlandMansion/region/r.-2.2.mca b/src/main/resources/maps/game/boatRace/woodlandMansion/dimensions/minecraft/overworld/region/r.-2.2.mca
similarity index 100%
rename from src/main/resources/maps/game/boatRace/woodlandMansion/region/r.-2.2.mca
rename to src/main/resources/maps/game/boatRace/woodlandMansion/dimensions/minecraft/overworld/region/r.-2.2.mca
diff --git a/src/main/resources/maps/game/boatRace/woodlandMansion/region/r.0.-1.mca b/src/main/resources/maps/game/boatRace/woodlandMansion/dimensions/minecraft/overworld/region/r.0.-1.mca
similarity index 100%
rename from src/main/resources/maps/game/boatRace/woodlandMansion/region/r.0.-1.mca
rename to src/main/resources/maps/game/boatRace/woodlandMansion/dimensions/minecraft/overworld/region/r.0.-1.mca
diff --git a/src/main/resources/maps/game/boatRace/woodlandMansion/region/r.0.-2.mca b/src/main/resources/maps/game/boatRace/woodlandMansion/dimensions/minecraft/overworld/region/r.0.-2.mca
similarity index 100%
rename from src/main/resources/maps/game/boatRace/woodlandMansion/region/r.0.-2.mca
rename to src/main/resources/maps/game/boatRace/woodlandMansion/dimensions/minecraft/overworld/region/r.0.-2.mca
diff --git a/src/main/resources/maps/game/boatRace/woodlandMansion/region/r.0.0.mca b/src/main/resources/maps/game/boatRace/woodlandMansion/dimensions/minecraft/overworld/region/r.0.0.mca
similarity index 100%
rename from src/main/resources/maps/game/boatRace/woodlandMansion/region/r.0.0.mca
rename to src/main/resources/maps/game/boatRace/woodlandMansion/dimensions/minecraft/overworld/region/r.0.0.mca
diff --git a/src/main/resources/maps/game/boatRace/woodlandMansion/region/r.0.1.mca b/src/main/resources/maps/game/boatRace/woodlandMansion/dimensions/minecraft/overworld/region/r.0.1.mca
similarity index 100%
rename from src/main/resources/maps/game/boatRace/woodlandMansion/region/r.0.1.mca
rename to src/main/resources/maps/game/boatRace/woodlandMansion/dimensions/minecraft/overworld/region/r.0.1.mca
diff --git a/src/main/resources/maps/game/boatRace/woodlandMansion/region/r.0.2.mca b/src/main/resources/maps/game/boatRace/woodlandMansion/dimensions/minecraft/overworld/region/r.0.2.mca
similarity index 100%
rename from src/main/resources/maps/game/boatRace/woodlandMansion/region/r.0.2.mca
rename to src/main/resources/maps/game/boatRace/woodlandMansion/dimensions/minecraft/overworld/region/r.0.2.mca
diff --git a/src/main/resources/maps/game/boatRace/woodlandMansion/region/r.1.-1.mca b/src/main/resources/maps/game/boatRace/woodlandMansion/dimensions/minecraft/overworld/region/r.1.-1.mca
similarity index 100%
rename from src/main/resources/maps/game/boatRace/woodlandMansion/region/r.1.-1.mca
rename to src/main/resources/maps/game/boatRace/woodlandMansion/dimensions/minecraft/overworld/region/r.1.-1.mca
diff --git a/src/main/resources/maps/game/boatRace/woodlandMansion/region/r.1.-2.mca b/src/main/resources/maps/game/boatRace/woodlandMansion/dimensions/minecraft/overworld/region/r.1.-2.mca
similarity index 100%
rename from src/main/resources/maps/game/boatRace/woodlandMansion/region/r.1.-2.mca
rename to src/main/resources/maps/game/boatRace/woodlandMansion/dimensions/minecraft/overworld/region/r.1.-2.mca
diff --git a/src/main/resources/maps/game/boatRace/woodlandMansion/region/r.1.0.mca b/src/main/resources/maps/game/boatRace/woodlandMansion/dimensions/minecraft/overworld/region/r.1.0.mca
similarity index 100%
rename from src/main/resources/maps/game/boatRace/woodlandMansion/region/r.1.0.mca
rename to src/main/resources/maps/game/boatRace/woodlandMansion/dimensions/minecraft/overworld/region/r.1.0.mca
diff --git a/src/main/resources/maps/game/boatRace/woodlandMansion/region/r.1.1.mca b/src/main/resources/maps/game/boatRace/woodlandMansion/dimensions/minecraft/overworld/region/r.1.1.mca
similarity index 100%
rename from src/main/resources/maps/game/boatRace/woodlandMansion/region/r.1.1.mca
rename to src/main/resources/maps/game/boatRace/woodlandMansion/dimensions/minecraft/overworld/region/r.1.1.mca
diff --git a/src/main/resources/maps/game/boatRace/woodlandMansion/region/r.1.2.mca b/src/main/resources/maps/game/boatRace/woodlandMansion/dimensions/minecraft/overworld/region/r.1.2.mca
similarity index 100%
rename from src/main/resources/maps/game/boatRace/woodlandMansion/region/r.1.2.mca
rename to src/main/resources/maps/game/boatRace/woodlandMansion/dimensions/minecraft/overworld/region/r.1.2.mca
diff --git a/src/main/resources/maps/hub/region/r.-1.-1.mca b/src/main/resources/maps/hub/dimensions/minecraft/overworld/region/r.-1.-1.mca
similarity index 100%
rename from src/main/resources/maps/hub/region/r.-1.-1.mca
rename to src/main/resources/maps/hub/dimensions/minecraft/overworld/region/r.-1.-1.mca
diff --git a/src/main/resources/maps/hub/region/r.-1.-2.mca b/src/main/resources/maps/hub/dimensions/minecraft/overworld/region/r.-1.-2.mca
similarity index 100%
rename from src/main/resources/maps/hub/region/r.-1.-2.mca
rename to src/main/resources/maps/hub/dimensions/minecraft/overworld/region/r.-1.-2.mca
diff --git a/src/main/resources/maps/hub/region/r.-1.0.mca b/src/main/resources/maps/hub/dimensions/minecraft/overworld/region/r.-1.0.mca
similarity index 100%
rename from src/main/resources/maps/hub/region/r.-1.0.mca
rename to src/main/resources/maps/hub/dimensions/minecraft/overworld/region/r.-1.0.mca
diff --git a/src/main/resources/maps/hub/region/r.-1.1.mca b/src/main/resources/maps/hub/dimensions/minecraft/overworld/region/r.-1.1.mca
similarity index 100%
rename from src/main/resources/maps/hub/region/r.-1.1.mca
rename to src/main/resources/maps/hub/dimensions/minecraft/overworld/region/r.-1.1.mca
diff --git a/src/main/resources/maps/hub/region/r.-2.-1.mca b/src/main/resources/maps/hub/dimensions/minecraft/overworld/region/r.-2.-1.mca
similarity index 100%
rename from src/main/resources/maps/hub/region/r.-2.-1.mca
rename to src/main/resources/maps/hub/dimensions/minecraft/overworld/region/r.-2.-1.mca
diff --git a/src/main/resources/maps/hub/region/r.-2.-2.mca b/src/main/resources/maps/hub/dimensions/minecraft/overworld/region/r.-2.-2.mca
similarity index 100%
rename from src/main/resources/maps/hub/region/r.-2.-2.mca
rename to src/main/resources/maps/hub/dimensions/minecraft/overworld/region/r.-2.-2.mca
diff --git a/src/main/resources/maps/hub/region/r.-2.0.mca b/src/main/resources/maps/hub/dimensions/minecraft/overworld/region/r.-2.0.mca
similarity index 100%
rename from src/main/resources/maps/hub/region/r.-2.0.mca
rename to src/main/resources/maps/hub/dimensions/minecraft/overworld/region/r.-2.0.mca
diff --git a/src/main/resources/maps/hub/region/r.-2.1.mca b/src/main/resources/maps/hub/dimensions/minecraft/overworld/region/r.-2.1.mca
similarity index 100%
rename from src/main/resources/maps/hub/region/r.-2.1.mca
rename to src/main/resources/maps/hub/dimensions/minecraft/overworld/region/r.-2.1.mca
diff --git a/src/main/resources/maps/hub/region/r.0.-1.mca b/src/main/resources/maps/hub/dimensions/minecraft/overworld/region/r.0.-1.mca
similarity index 100%
rename from src/main/resources/maps/hub/region/r.0.-1.mca
rename to src/main/resources/maps/hub/dimensions/minecraft/overworld/region/r.0.-1.mca
diff --git a/src/main/resources/maps/hub/region/r.0.-2.mca b/src/main/resources/maps/hub/dimensions/minecraft/overworld/region/r.0.-2.mca
similarity index 100%
rename from src/main/resources/maps/hub/region/r.0.-2.mca
rename to src/main/resources/maps/hub/dimensions/minecraft/overworld/region/r.0.-2.mca
diff --git a/src/main/resources/maps/hub/region/r.0.0.mca b/src/main/resources/maps/hub/dimensions/minecraft/overworld/region/r.0.0.mca
similarity index 100%
rename from src/main/resources/maps/hub/region/r.0.0.mca
rename to src/main/resources/maps/hub/dimensions/minecraft/overworld/region/r.0.0.mca
diff --git a/src/main/resources/maps/hub/region/r.0.1.mca b/src/main/resources/maps/hub/dimensions/minecraft/overworld/region/r.0.1.mca
similarity index 100%
rename from src/main/resources/maps/hub/region/r.0.1.mca
rename to src/main/resources/maps/hub/dimensions/minecraft/overworld/region/r.0.1.mca
diff --git a/src/main/resources/maps/hub/region/r.1.-1.mca b/src/main/resources/maps/hub/dimensions/minecraft/overworld/region/r.1.-1.mca
similarity index 100%
rename from src/main/resources/maps/hub/region/r.1.-1.mca
rename to src/main/resources/maps/hub/dimensions/minecraft/overworld/region/r.1.-1.mca
diff --git a/src/main/resources/maps/hub/region/r.1.-2.mca b/src/main/resources/maps/hub/dimensions/minecraft/overworld/region/r.1.-2.mca
similarity index 100%
rename from src/main/resources/maps/hub/region/r.1.-2.mca
rename to src/main/resources/maps/hub/dimensions/minecraft/overworld/region/r.1.-2.mca
diff --git a/src/main/resources/maps/hub/region/r.1.0.mca b/src/main/resources/maps/hub/dimensions/minecraft/overworld/region/r.1.0.mca
similarity index 100%
rename from src/main/resources/maps/hub/region/r.1.0.mca
rename to src/main/resources/maps/hub/dimensions/minecraft/overworld/region/r.1.0.mca
diff --git a/src/main/resources/maps/hub/region/r.1.1.mca b/src/main/resources/maps/hub/dimensions/minecraft/overworld/region/r.1.1.mca
similarity index 100%
rename from src/main/resources/maps/hub/region/r.1.1.mca
rename to src/main/resources/maps/hub/dimensions/minecraft/overworld/region/r.1.1.mca
diff --git a/src/main/resources/maps/lobby/region/r.-1.-1.mca b/src/main/resources/maps/lobby/dimensions/minecraft/overworld/region/r.-1.-1.mca
similarity index 100%
rename from src/main/resources/maps/lobby/region/r.-1.-1.mca
rename to src/main/resources/maps/lobby/dimensions/minecraft/overworld/region/r.-1.-1.mca
diff --git a/src/main/resources/maps/lobby/region/r.-1.0.mca b/src/main/resources/maps/lobby/dimensions/minecraft/overworld/region/r.-1.0.mca
similarity index 100%
rename from src/main/resources/maps/lobby/region/r.-1.0.mca
rename to src/main/resources/maps/lobby/dimensions/minecraft/overworld/region/r.-1.0.mca
diff --git a/src/main/resources/maps/lobby/region/r.0.-1.mca b/src/main/resources/maps/lobby/dimensions/minecraft/overworld/region/r.0.-1.mca
similarity index 100%
rename from src/main/resources/maps/lobby/region/r.0.-1.mca
rename to src/main/resources/maps/lobby/dimensions/minecraft/overworld/region/r.0.-1.mca
diff --git a/src/main/resources/maps/lobby/region/r.0.0.mca b/src/main/resources/maps/lobby/dimensions/minecraft/overworld/region/r.0.0.mca
similarity index 100%
rename from src/main/resources/maps/lobby/region/r.0.0.mca
rename to src/main/resources/maps/lobby/dimensions/minecraft/overworld/region/r.0.0.mca
diff --git a/src/main/resources/maps/resultdisplay/region/r.-1.-1.mca b/src/main/resources/maps/resultdisplay/dimensions/minecraft/overworld/region/r.-1.-1.mca
similarity index 100%
rename from src/main/resources/maps/resultdisplay/region/r.-1.-1.mca
rename to src/main/resources/maps/resultdisplay/dimensions/minecraft/overworld/region/r.-1.-1.mca
diff --git a/src/main/resources/maps/resultdisplay/region/r.-1.-2.mca b/src/main/resources/maps/resultdisplay/dimensions/minecraft/overworld/region/r.-1.-2.mca
similarity index 100%
rename from src/main/resources/maps/resultdisplay/region/r.-1.-2.mca
rename to src/main/resources/maps/resultdisplay/dimensions/minecraft/overworld/region/r.-1.-2.mca
diff --git a/src/main/resources/maps/resultdisplay/region/r.-1.0.mca b/src/main/resources/maps/resultdisplay/dimensions/minecraft/overworld/region/r.-1.0.mca
similarity index 100%
rename from src/main/resources/maps/resultdisplay/region/r.-1.0.mca
rename to src/main/resources/maps/resultdisplay/dimensions/minecraft/overworld/region/r.-1.0.mca
diff --git a/src/main/resources/maps/resultdisplay/region/r.-1.1.mca b/src/main/resources/maps/resultdisplay/dimensions/minecraft/overworld/region/r.-1.1.mca
similarity index 100%
rename from src/main/resources/maps/resultdisplay/region/r.-1.1.mca
rename to src/main/resources/maps/resultdisplay/dimensions/minecraft/overworld/region/r.-1.1.mca
diff --git a/src/main/resources/maps/resultdisplay/region/r.-2.-1.mca b/src/main/resources/maps/resultdisplay/dimensions/minecraft/overworld/region/r.-2.-1.mca
similarity index 100%
rename from src/main/resources/maps/resultdisplay/region/r.-2.-1.mca
rename to src/main/resources/maps/resultdisplay/dimensions/minecraft/overworld/region/r.-2.-1.mca
diff --git a/src/main/resources/maps/resultdisplay/region/r.-2.-2.mca b/src/main/resources/maps/resultdisplay/dimensions/minecraft/overworld/region/r.-2.-2.mca
similarity index 100%
rename from src/main/resources/maps/resultdisplay/region/r.-2.-2.mca
rename to src/main/resources/maps/resultdisplay/dimensions/minecraft/overworld/region/r.-2.-2.mca
diff --git a/src/main/resources/maps/resultdisplay/region/r.-2.0.mca b/src/main/resources/maps/resultdisplay/dimensions/minecraft/overworld/region/r.-2.0.mca
similarity index 100%
rename from src/main/resources/maps/resultdisplay/region/r.-2.0.mca
rename to src/main/resources/maps/resultdisplay/dimensions/minecraft/overworld/region/r.-2.0.mca
diff --git a/src/main/resources/maps/resultdisplay/region/r.-2.1.mca b/src/main/resources/maps/resultdisplay/dimensions/minecraft/overworld/region/r.-2.1.mca
similarity index 100%
rename from src/main/resources/maps/resultdisplay/region/r.-2.1.mca
rename to src/main/resources/maps/resultdisplay/dimensions/minecraft/overworld/region/r.-2.1.mca
diff --git a/src/main/resources/maps/resultdisplay/region/r.0.-1.mca b/src/main/resources/maps/resultdisplay/dimensions/minecraft/overworld/region/r.0.-1.mca
similarity index 100%
rename from src/main/resources/maps/resultdisplay/region/r.0.-1.mca
rename to src/main/resources/maps/resultdisplay/dimensions/minecraft/overworld/region/r.0.-1.mca
diff --git a/src/main/resources/maps/resultdisplay/region/r.0.-2.mca b/src/main/resources/maps/resultdisplay/dimensions/minecraft/overworld/region/r.0.-2.mca
similarity index 100%
rename from src/main/resources/maps/resultdisplay/region/r.0.-2.mca
rename to src/main/resources/maps/resultdisplay/dimensions/minecraft/overworld/region/r.0.-2.mca
diff --git a/src/main/resources/maps/resultdisplay/region/r.0.0.mca b/src/main/resources/maps/resultdisplay/dimensions/minecraft/overworld/region/r.0.0.mca
similarity index 100%
rename from src/main/resources/maps/resultdisplay/region/r.0.0.mca
rename to src/main/resources/maps/resultdisplay/dimensions/minecraft/overworld/region/r.0.0.mca
diff --git a/src/main/resources/maps/resultdisplay/region/r.0.1.mca b/src/main/resources/maps/resultdisplay/dimensions/minecraft/overworld/region/r.0.1.mca
similarity index 100%
rename from src/main/resources/maps/resultdisplay/region/r.0.1.mca
rename to src/main/resources/maps/resultdisplay/dimensions/minecraft/overworld/region/r.0.1.mca
diff --git a/src/main/resources/maps/resultdisplay/region/r.1.-1.mca b/src/main/resources/maps/resultdisplay/dimensions/minecraft/overworld/region/r.1.-1.mca
similarity index 100%
rename from src/main/resources/maps/resultdisplay/region/r.1.-1.mca
rename to src/main/resources/maps/resultdisplay/dimensions/minecraft/overworld/region/r.1.-1.mca
diff --git a/src/main/resources/maps/resultdisplay/region/r.1.-2.mca b/src/main/resources/maps/resultdisplay/dimensions/minecraft/overworld/region/r.1.-2.mca
similarity index 100%
rename from src/main/resources/maps/resultdisplay/region/r.1.-2.mca
rename to src/main/resources/maps/resultdisplay/dimensions/minecraft/overworld/region/r.1.-2.mca
diff --git a/src/main/resources/maps/resultdisplay/region/r.1.0.mca b/src/main/resources/maps/resultdisplay/dimensions/minecraft/overworld/region/r.1.0.mca
similarity index 100%
rename from src/main/resources/maps/resultdisplay/region/r.1.0.mca
rename to src/main/resources/maps/resultdisplay/dimensions/minecraft/overworld/region/r.1.0.mca
diff --git a/src/main/resources/maps/resultdisplay/region/r.1.1.mca b/src/main/resources/maps/resultdisplay/dimensions/minecraft/overworld/region/r.1.1.mca
similarity index 100%
rename from src/main/resources/maps/resultdisplay/region/r.1.1.mca
rename to src/main/resources/maps/resultdisplay/dimensions/minecraft/overworld/region/r.1.1.mca