diff --git a/.gitignore b/.gitignore index 047fe92..875e3a2 100644 --- a/.gitignore +++ b/.gitignore @@ -70,3 +70,4 @@ replay_pid* # End of https://www.toptal.com/developers/gitignore/api/java local.gradle config.yml +resources diff --git a/src/main/java/eu/mhsl/craftattack/teamLobby/Lobby.java b/src/main/java/eu/mhsl/craftattack/teamLobby/Lobby.java index 9ea853a..52841f1 100644 --- a/src/main/java/eu/mhsl/craftattack/teamLobby/Lobby.java +++ b/src/main/java/eu/mhsl/craftattack/teamLobby/Lobby.java @@ -4,6 +4,7 @@ import eu.mhsl.craftattack.teamLobby.data.Team; import eu.mhsl.craftattack.teamLobby.util.CommonHandler; import eu.mhsl.craftattack.teamLobby.util.PluginMessageUtil; import eu.mhsl.craftattack.teamLobby.util.PosSerializer; +import eu.mhsl.craftattack.teamLobby.util.ResourceExtractor; import net.kyori.adventure.sound.Sound; import net.kyori.adventure.text.Component; import net.kyori.adventure.text.format.NamedTextColor; @@ -18,6 +19,7 @@ import net.minestom.server.event.instance.RemoveEntityFromInstanceEvent; import net.minestom.server.event.player.PlayerBlockBreakEvent; import net.minestom.server.event.player.PlayerBlockInteractEvent; import net.minestom.server.instance.InstanceContainer; +import net.minestom.server.instance.anvil.AnvilLoader; import net.minestom.server.instance.block.Block; import net.minestom.server.network.packet.server.play.ParticlePacket; import net.minestom.server.particle.Particle; @@ -30,6 +32,7 @@ import net.minestom.server.utils.NamespaceID; import net.minestom.server.world.DimensionType; import org.spongepowered.configurate.ConfigurationNode; +import java.nio.file.Path; import java.util.UUID; import java.util.function.Consumer; import java.util.stream.Collectors; @@ -86,7 +89,9 @@ public class Lobby extends InstanceContainer { TaskSchedule.millis(100) ); - this.setGenerator(unit -> unit.modifier().fillHeight(0, 10, Block.BAMBOO_BLOCK)); + Path worldPath = Path.of(ResourceExtractor.commonRessourcePath.toString(), "world"); + ResourceExtractor.extractResourceFolder("/world", worldPath); + this.setChunkLoader(new AnvilLoader(worldPath)); this.setBlock(this.spawnPoint.sub(0, 1 ,0), Block.DIAMOND_BLOCK); } diff --git a/src/main/java/eu/mhsl/craftattack/teamLobby/util/ResourceExtractor.java b/src/main/java/eu/mhsl/craftattack/teamLobby/util/ResourceExtractor.java new file mode 100644 index 0000000..5556156 --- /dev/null +++ b/src/main/java/eu/mhsl/craftattack/teamLobby/util/ResourceExtractor.java @@ -0,0 +1,64 @@ +package eu.mhsl.craftattack.teamLobby.util; + +import java.io.IOException; +import java.io.InputStream; +import java.net.URISyntaxException; +import java.net.URL; +import java.nio.file.*; +import java.util.Enumeration; +import java.util.jar.JarEntry; +import java.util.jar.JarFile; + +public class ResourceExtractor { + public static final Path commonRessourcePath = Path.of("resources"); + + public static void extractResourceFolder(String resourcePath, Path outputDir) { + try { + handle(resourcePath, outputDir); + } catch(Exception e) { + throw new RuntimeException(e); + } + } + + private static void handle(String resourcePath, Path outputDir) throws URISyntaxException, IOException { + URL resourceURL = ResourceExtractor.class.getResource(resourcePath); + if (resourceURL == null) { + throw new IllegalArgumentException("Resource path not found: " + resourcePath); + } + + if (resourceURL.getProtocol().equals("jar")) { + String jarPath = resourceURL.getPath().substring(5, resourceURL.getPath().indexOf("!")); + try (JarFile jar = new JarFile(Paths.get(jarPath).toFile())) { + Enumeration entries = jar.entries(); + while (entries.hasMoreElements()) { + JarEntry entry = entries.nextElement(); + String name = entry.getName(); + + if (name.startsWith(resourcePath.substring(1) + "/") && !entry.isDirectory()) { + InputStream is = jar.getInputStream(entry); + Path outPath = outputDir.resolve(name.substring(resourcePath.length())); + Files.createDirectories(outPath.getParent()); + Files.copy(is, outPath, StandardCopyOption.REPLACE_EXISTING); + } + } + } + } else { + Path resourceDir = Paths.get(resourceURL.toURI()); + + try(var files = Files.walk(resourceDir)) { + files.forEach(source -> { + try { + Path destination = outputDir.resolve(resourceDir.relativize(source).toString()); + if (Files.isDirectory(source)) { + Files.createDirectories(destination); + } else { + Files.copy(source, destination, StandardCopyOption.REPLACE_EXISTING); + } + } catch (IOException e) { + throw new RuntimeException(e); + } + }); + } + } + } +} \ No newline at end of file diff --git a/src/main/resources/world/region/r.-1.-1.mca b/src/main/resources/world/region/r.-1.-1.mca new file mode 100644 index 0000000..38a07e4 Binary files /dev/null and b/src/main/resources/world/region/r.-1.-1.mca differ diff --git a/src/main/resources/world/region/r.-1.0.mca b/src/main/resources/world/region/r.-1.0.mca new file mode 100644 index 0000000..7f7e5a7 Binary files /dev/null and b/src/main/resources/world/region/r.-1.0.mca differ diff --git a/src/main/resources/world/region/r.0.-1.mca b/src/main/resources/world/region/r.0.-1.mca new file mode 100644 index 0000000..af19690 Binary files /dev/null and b/src/main/resources/world/region/r.0.-1.mca differ diff --git a/src/main/resources/world/region/r.0.0.mca b/src/main/resources/world/region/r.0.0.mca new file mode 100644 index 0000000..d5773ff Binary files /dev/null and b/src/main/resources/world/region/r.0.0.mca differ