package org.bukkit.structure; import java.io.File; import java.io.IOException; import java.io.InputStream; import java.io.OutputStream; import java.util.Map; import org.bukkit.NamespacedKey; import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; public interface StructureManager { /** * Gets the currently registered structures. *

* These are the currently loaded structures that the StructureManager is * aware of. When a structure block refers to a structure, these structures * are checked first. If the specified structure is not found among the * currently registered structures, the StructureManager may dynamically * read the structure from the primary world folder, DataPacks, or the * server's own resources. Structures can be registered via {@link * #registerStructure(NamespacedKey, Structure)} * * @return an unmodifiable shallow copy of the currently registered * structures */ @NotNull Map getStructures(); /** * Gets a registered Structure. * * @param structureKey The key for which to get the structure * @return The structure that belongs to the structureKey or * null if there is none registered for that key. */ @Nullable Structure getStructure(@NotNull NamespacedKey structureKey); /** * Registers the given structure. See {@link #getStructures()}. * * @param structureKey The key for which to register the structure * @param structure The structure to register * @return The structure for the specified key, or null if the * structure could not be found. */ @Nullable Structure registerStructure(@NotNull NamespacedKey structureKey, @NotNull Structure structure); /** * Unregisters a structure. Unregisters the specified structure. If the * structure still exists in the primary world folder, a DataPack, or is * part of the server's own resources, it may be loaded and registered again * when it is requested by a plugin or the server itself. * * @param structureKey The key for which to save the structure for * @return The structure that was registered for that key or * null if there was none */ @Nullable Structure unregisterStructure(@NotNull NamespacedKey structureKey); /** * Loads a structure for the specified key and optionally {@link * #registerStructure(NamespacedKey, Structure) registers} it. *

* This will first check the already loaded {@link #getStructures() * registered structures}, and otherwise load the structure from the primary * world folder, DataPacks, and the server's own resources (in this order). *

* When loading the structure from the primary world folder, the given key * is translated to a file as specified by * {@link #getStructureFile(NamespacedKey)}. * * @param structureKey The key for which to load the structure * @param register true to register the loaded structure. * @return The structure, or null if no structure was found for * the specified key */ @Nullable Structure loadStructure(@NotNull NamespacedKey structureKey, boolean register); /** * Loads the structure for the specified key and automatically registers it. * See {@link #loadStructure(NamespacedKey, boolean)}. * * @param structureKey The key for which to load the structure * @return The structure for the specified key, or null if the * structure could not be found. */ @Nullable Structure loadStructure(@NotNull NamespacedKey structureKey); /** * Saves the currently {@link #getStructures() registered structure} for the * specified {@link NamespacedKey key} to the primary world folder as * specified by {#getStructureFile(NamespacedKey}. * * @param structureKey The key for which to save the structure for */ void saveStructure(@NotNull NamespacedKey structureKey); /** * Saves a structure with a given key to the primary world folder. * * @param structureKey The key for which to save the structure for * @param structure The structure to save for this structureKey */ void saveStructure(@NotNull NamespacedKey structureKey, @NotNull Structure structure) throws IOException; /** * Unregisters the specified structure and deletes its {@link * #getStructureFile(NamespacedKey) structure file} from the primary world * folder. Note that this method cannot be used to delete vanilla Minecraft * structures, or structures from DataPacks. Unregistering these structures * will however work fine. * * @param structureKey The key of the structure to remove * @throws IOException If the file could not be removed for some reason. */ void deleteStructure(@NotNull NamespacedKey structureKey) throws IOException; /** * Deletes the {@link #getStructureFile(NamespacedKey) structure file} for * the specified structure from the primary world folder. Note that this * method cannot be used to delete vanilla Minecraft structures, or * structures from DataPacks. Unregistering these structures will however * work fine. * * @param structureKey The key of the structure to remove * @param unregister Whether to also unregister the specified structure if * it is currently loaded. * @throws IOException If the file could not be removed for some reason. */ void deleteStructure(@NotNull NamespacedKey structureKey, boolean unregister) throws IOException; /** * Gets the location where a structure file would exist in the primary world * directory based on the NamespacedKey using the format * world/generated/{NAMESPACE}/structures/{KEY}.nbt. This method will always * return a file, even if none exists at the moment. * * @param structureKey The key to build the filepath from. * @return The location where a file with this key would be. */ @NotNull File getStructureFile(@NotNull NamespacedKey structureKey); /** * Reads a Structure from disk. * * @param file The file of the structure * @return The read structure * @throws IOException when the given file can not be read from */ @NotNull Structure loadStructure(@NotNull File file) throws IOException; /** * Reads a Structure from a stream. * * @param inputStream The file of the structure * @return The read Structure */ @NotNull Structure loadStructure(@NotNull InputStream inputStream) throws IOException; /** * Save a structure to a file. This will overwrite a file if it already * exists. * * @param file the target to save to. * @param structure the Structure to save. * @throws IOException when the given file can not be written to. */ void saveStructure(@NotNull File file, @NotNull Structure structure) throws IOException; /** * Save a structure to a stream. * * @param outputStream the stream to write to. * @param structure the Structure to save. * @throws IOException when the given file can not be written to. */ void saveStructure(@NotNull OutputStream outputStream, @NotNull Structure structure) throws IOException; /** * Creates a new empty structure. * * @return an empty structure. */ @NotNull Structure createStructure(); /** * Creates a copy of this structure. * * @param structure The structure to copy * @return a copy of the structure */ @NotNull Structure copy(@NotNull Structure structure); }