diff --git a/.vitepress/config.mts b/.vitepress/config.mts index 822bbc7..c6d57f1 100644 --- a/.vitepress/config.mts +++ b/.vitepress/config.mts @@ -78,11 +78,17 @@ export default defineConfig({ text: "World", items: [ { text: "Instances", link: "/docs/world/instances" }, + { + text: "Loading", + link: "/docs/world/loading", + items: [ + { text: "Anvil", link: "/docs/world/loading/anvil" }, + ], + }, { text: "Chunk Management", link: "/docs/world/chunk-management", items: [ - { text: "Anvil Loader", link: "/docs/world/anvilloader" }, { text: "Lighting", link: "/docs/world/lightloader" }, ], }, diff --git a/docs/world/anvilloader.md b/docs/world/anvilloader.md deleted file mode 100644 index a837524..0000000 --- a/docs/world/anvilloader.md +++ /dev/null @@ -1,23 +0,0 @@ ---- -description: >- - This page describes how to load a world folder using AnvilLoader ---- - -## Loading a world using AnvilLoader - -In order to load a world into an instance, use the `InstanceContainer#setChunkLoader(ChunkLoader)` function. - -An example of using this method to load a world is: - -```java -InstanceContainer.setChunkLoader(new AnvilLoader("worlds/world")); -``` - -This will load the world inside the `worlds/world` directory into the InstanceContainer, allowing you to use the instance as before but having the world loaded inside. - -In order to load a world, the world folder will only need the `/region` folder, as it contains the block data. - -## Saving a world - -In order to save a world, you will have to use the `InstanceContainer#saveChunksToStorage()` function, -this will only work if you have previously loaded a world into the instance using AnvilLoader. diff --git a/docs/world/loading.md b/docs/world/loading.md new file mode 100644 index 0000000..758fc3a --- /dev/null +++ b/docs/world/loading.md @@ -0,0 +1,28 @@ +# World Loading + +In order to load or save an [`Instance`](https://javadoc.minestom.net/net.minestom.server/net/minestom/server/instance/Instance.html), you must provide a [`ChunkLoader`](https://javadoc.minestom.net/net.minestom.server/net/minestom/server/instance/ChunkLoader.html) that Minestom will use to read and write chunk data to and from. + +When creating your instance, you can provide the loader in multiple ways: +* [`InstanceManager#createInstanceContainer(@Nullable ChunkLoader)`](https://javadoc.minestom.net/net.minestom.server/net/minestom/server/instance/InstanceManager.html#createInstanceContainer(net.minestom.server.instance.ChunkLoader)) +* [`InstanceManager#createInstanceContainer(RegistryKey, @Nullable ChunkLoader)`](https://javadoc.minestom.net/net.minestom.server/net/minestom/server/instance/InstanceManager.html#createInstanceContainer(net.minestom.server.instance.ChunkLoader)) +* [`InstanceContainer#setChunkLoader(ChunkLoader)`](https://javadoc.minestom.net/net.minestom.server/net/minestom/server/instance/InstanceContainer.html#setChunkLoader(net.minestom.server.instance.ChunkLoader)) + +Minestom will automatically load chunks from the loader once provided. + +## Saving + +Saving must be done in two steps: +1. [`Instance#saveChunksToStorage`](https://javadoc.minestom.net/net.minestom.server/net/minestom/server/instance/Instance.html#saveChunksToStorage()) +2. [`Instance#saveInstance`](https://javadoc.minestom.net/net.minestom.server/net/minestom/server/instance/Instance.html#saveInstance()) + +```java +MinecraftServer.getSchedulerManager().buildShutdownTask(() -> { + this.instance.saveChunksToStorage(); + this.instance.saveInstance(); +}); +``` + +## Loaders + +* [No-op](https://javadoc.minestom.net/net.minestom.server/net/minestom/server/instance/ChunkLoader.html#noop()) +* [Anvil](/docs/world/loading/anvil.md) diff --git a/docs/world/loading/anvil.md b/docs/world/loading/anvil.md new file mode 100644 index 0000000..a0eee25 --- /dev/null +++ b/docs/world/loading/anvil.md @@ -0,0 +1,19 @@ +# Anvil Loader + +Anvil is the format made by Mojang for vanilla. Minestom provides this format and it is chosen **by default** on newly created instances. Anvil is a multi-file world format, so must be provided with a directory to store world data. The anvil loader also supports reading light data from the worlds, this is enabled by default. + +## Requirements + +Worlds to be used with [`AnvilLoader`](https://javadoc.minestom.net/net.minestom.server/net/minestom/server/instance/anvil/AnvilLoader.html) only need to contain the `region` directory, which is where the chunk data comes from. Chunk loaders do not read entity data. + +## Usage + +To use a world from the **runtime file system**, you can do something like the following code snippet, which constructs the loader using [`AnvilLoader#(Path)`](https://javadoc.minestom.net/net.minestom.server/net/minestom/server/instance/anvil/AnvilLoader.html#%3Cinit%3E(java.nio.file.Path)). + +```java +final Path directory = this.worlds.join("world"); +final AnvilLoader loader = new AnvilLoader(directory); +final InstanceContainer instance = MinecraftServer.getInstanceManager().createInstanceContainer(loader); +``` + +Remember, however, that this **does not** read from the jar resources. Other war crimes must be committed for this to happen. \ No newline at end of file