Files
ChunkAPI/src/main/java/com/falsepattern/chunk/api/DataManager.java
T

239 lines
8.6 KiB
Java
Raw Normal View History

2023-03-30 17:19:42 +02:00
/*
2023-04-18 21:08:38 +02:00
* Copyright (c) 2023 FalsePattern
* This work is licensed under the Creative Commons Attribution-NonCommercial-NoDerivatives 4.0 International License.
* To view a copy of this license, visit http://creativecommons.org/licenses/by-nc-nd/4.0/
* or send a letter to Creative Commons, PO Box 1866, Mountain View, CA 94042, USA.
2023-03-30 17:19:42 +02:00
*/
2023-03-09 21:44:17 +01:00
package com.falsepattern.chunk.api;
2023-03-30 17:48:26 +02:00
import com.falsepattern.lib.StableAPI;
2023-03-30 17:17:11 +02:00
import org.jetbrains.annotations.Contract;
import org.jetbrains.annotations.NotNull;
import org.jetbrains.annotations.Nullable;
2023-03-28 23:58:39 +02:00
2023-03-09 21:44:17 +01:00
import net.minecraft.nbt.NBTTagCompound;
2023-03-30 17:17:11 +02:00
import net.minecraft.world.chunk.Chunk;
import net.minecraft.world.chunk.storage.ExtendedBlockStorage;
2023-03-28 23:58:39 +02:00
import java.nio.ByteBuffer;
2023-03-09 21:44:17 +01:00
/**
2023-03-30 17:17:11 +02:00
* Singleton instances that can manage custom in chunks. This class only manages the registration of
* managers. For the actual networking and data storage, see the internal interfaces of this interface.
* Note: This interface does nothing by itself, you also need to implement one or more of the internal interfaces.
2023-03-30 17:48:26 +02:00
*
* @since 0.5.0
* @see PacketDataManager
* @see ChunkDataManager
2023-12-13 19:42:32 +01:00
* @see SubChunkDataManager
* @see DataRegistry
2023-03-30 17:48:26 +02:00
* @author FalsePattern
* @version 0.5.0
2023-03-09 21:44:17 +01:00
*/
@StableAPI(since = "0.5.0")
public interface DataManager {
2023-03-28 23:58:39 +02:00
/**
* @return The domain of this manager. Usually the modid of the mod that owns this manager.
*/
2023-03-30 17:48:26 +02:00
@StableAPI.Expose
2023-03-30 17:17:11 +02:00
@Contract(pure = true)
2023-03-28 23:58:39 +02:00
String domain();
2023-03-09 21:44:17 +01:00
/**
2023-03-28 23:58:39 +02:00
* @return The id of this manager. Usually the name of the manager. Unique per domain.
2023-03-09 21:44:17 +01:00
*/
2023-03-30 17:48:26 +02:00
@StableAPI.Expose
2023-03-30 17:17:11 +02:00
@Contract(pure = true)
2023-03-09 21:44:17 +01:00
String id();
2023-03-28 23:58:39 +02:00
2023-03-09 21:44:17 +01:00
/**
2023-03-30 17:17:11 +02:00
* Implement this interface if you want to synchronize your data with the client.
2023-03-30 17:48:26 +02:00
*
* @since 0.5.0
2023-03-30 17:48:26 +02:00
* @author FalsePattern
* @version 0.5.0
2023-03-09 21:44:17 +01:00
*/
@StableAPI(since = "0.5.0")
interface PacketDataManager extends DataManager {
2023-03-30 17:17:11 +02:00
/**
* @return The maximum amount of bytes your data can take up in a packet.
2023-03-30 17:40:30 +02:00
*
* @implSpec This is used to determine the size of the packet compression/decompression buffer.
2023-07-16 13:58:46 +02:00
* Only called ONCE, during registration!
2023-03-30 17:17:11 +02:00
*/
2023-03-30 17:48:26 +02:00
@StableAPI.Expose
2023-03-30 17:17:11 +02:00
@Contract(pure = true)
int maxPacketSize();
2023-03-28 23:58:39 +02:00
2023-03-30 17:17:11 +02:00
/**
* Serializes your data into a packet.
*
* @param chunk The chunk to serialize.
*/
2023-12-13 16:41:41 +01:00
@Contract(mutates = "param4")
2023-03-30 17:48:26 +02:00
@StableAPI.Expose
2023-12-13 19:42:32 +01:00
void writeToBuffer(Chunk chunk, int subChunkMask, boolean forceUpdate, ByteBuffer data);
2023-03-28 23:58:39 +02:00
2023-03-30 17:17:11 +02:00
/**
* Deserializes your data from a packet.
* Mutates this object.
*
* @param chunk The chunk to deserialize.
* @param buffer The packet buffer to read from.
*/
2023-12-13 16:34:22 +01:00
@Contract(mutates = "param1,param4")
2023-03-30 17:48:26 +02:00
@StableAPI.Expose
2023-12-13 19:42:32 +01:00
void readFromBuffer(Chunk chunk, int subChunkMask, boolean forceUpdate, ByteBuffer buffer);
2023-03-30 17:17:11 +02:00
}
2023-03-28 23:58:39 +02:00
/**
2023-12-13 19:42:32 +01:00
* The common superinterface for RootDataManager and SubChunkDataManager.
* Contains version information and messages for users attempting to upgrade/remove versions.
* @since 0.5.0
* @author FalsePattern
* @version 0.5.0
*/
@StableAPI(since = "0.5.0")
interface StorageDataManager extends DataManager {
/**
* @return The current version of the data manager
*/
@StableAPI.Expose
@Contract(pure = true)
@NotNull
String version();
/**
* @return The message to show to users when a world is opened with this mod for the first time.
* Return null to show no message, and treat the manager as fully compatible with vanilla.
*/
@StableAPI.Expose
@Contract(pure = true)
@Nullable
String newInstallDescription();
/**
* @return The message to show to users when this manager is removed, AND they try to load the world (stored in the
* world's NBT during previous saves)
*/
@StableAPI.Expose
@Contract(pure = true)
@NotNull
String uninstallMessage();
/**
* @param priorVersion The version of the manager this world was saved with.
* @return A warning message to show to the user when upgrading.\
* If null, the manager is treated as fully compatible with the old version, and no warning is shown.
*/
@StableAPI.Expose
@Contract(pure = true)
@Nullable
String versionChangeMessage(String priorVersion);
}
2023-03-09 21:44:17 +01:00
/**
* Implement this interface if you want to save your data to disk. This is called once per chunk, hence "root"
2023-03-30 17:48:26 +02:00
*
* @since 0.5.0
2023-03-30 17:48:26 +02:00
* @author FalsePattern
* @version 0.5.0
2023-03-09 21:44:17 +01:00
*/
@StableAPI(since = "0.5.0")
interface ChunkDataManager extends StorageDataManager {
2023-03-30 17:17:11 +02:00
/**
* If false, the given nbt compound will be a freshly created object that gets inserted into the actual
* level NBT tag under the `domain:id` name.
* <p>
* If true, the nbt tag passed in into the write/read methods will be the raw Level NBT tag without filtering.
*
* @implNote This is used internally for reimplementing the vanilla logic. Only change this if you know what you're doing.
*/
2023-03-30 17:48:26 +02:00
@StableAPI.Expose
2023-03-30 17:17:11 +02:00
@Contract(pure = true)
default boolean chunkPrivilegedAccess() {
return false;
}
/**
* Serializes your data into an NBT tag. This is used when saving the chunk to disk.
*/
2023-12-13 16:34:22 +01:00
@Contract(mutates = "param2")
2023-03-30 17:48:26 +02:00
@StableAPI.Expose
2023-03-30 17:17:11 +02:00
void writeChunkToNBT(Chunk chunk, NBTTagCompound nbt);
/**
* Deserializes your data from an NBT tag. This is used when loading the chunk from disk.
* The NBT *may* be null if the chunk was saved before this manager was registered
* (e.g., loading save before the mod was added), and the manager is not {@link #chunkPrivilegedAccess() privileged}.
* In this case, you should initialize the data to a sane default.
*/
2023-12-13 16:34:22 +01:00
@Contract(mutates = "param1")
2023-03-30 17:48:26 +02:00
@StableAPI.Expose
2023-03-30 17:17:11 +02:00
void readChunkFromNBT(Chunk chunk, NBTTagCompound nbt);
2023-12-13 16:34:22 +01:00
/**
* Directly copies data from one chunk to another chunk.
* @param from The chunk to copy data from.
* @param to The chunk to copy data to.
*/
@Contract(mutates = "param2")
2023-12-28 20:57:24 +01:00
@StableAPI.Expose
void cloneChunk(Chunk from, Chunk to);
2023-03-30 17:17:11 +02:00
}
2023-03-28 23:58:39 +02:00
2023-03-09 21:44:17 +01:00
/**
2023-12-13 19:42:32 +01:00
* Implement this interface if you want to save your subChunk data to disk. This is called once per
2023-03-30 17:17:11 +02:00
* ExtendedBlockStorage per chunk. (16 times per chunk)
2023-03-30 17:48:26 +02:00
*
* @since 0.5.0
2023-03-30 17:48:26 +02:00
* @author FalsePattern
* @version 0.5.0
2023-03-09 21:44:17 +01:00
*/
@StableAPI(since = "0.5.0")
2023-12-13 19:42:32 +01:00
interface SubChunkDataManager extends StorageDataManager {
2023-03-30 17:17:11 +02:00
/**
* If false, the given nbt compound will be a freshly created object that gets inserted into the actual
* segment NBT tag under the `domain:id` name.
* <p>
* If true, the nbt tag passed in into the write/read methods will be the raw segment NBT tag without filtering.
*
* @implNote This is used internally for reimplementing the vanilla logic. Only change this if you know what you're doing.
*/
2023-03-30 17:48:26 +02:00
@StableAPI.Expose
2023-03-30 17:17:11 +02:00
@Contract(pure = true)
2023-12-13 19:42:32 +01:00
default boolean subChunkPrivilegedAccess() {
2023-03-30 17:17:11 +02:00
return false;
}
2023-03-30 17:40:30 +02:00
2023-03-30 17:17:11 +02:00
/**
* Serializes your data into an NBT tag. This is used when saving the chunk to disk.
*/
2023-12-13 16:34:22 +01:00
@Contract(mutates = "param3")
2023-03-30 17:48:26 +02:00
@StableAPI.Expose
2023-12-13 19:42:32 +01:00
void writeSubChunkToNBT(Chunk chunk, ExtendedBlockStorage subChunk, NBTTagCompound nbt);
2023-03-30 17:17:11 +02:00
/**
* Deserializes your data from an NBT tag. This is used when loading the chunk from disk.
* The NBT *may* be null if the chunk was saved before this manager was registered
2023-12-13 19:42:32 +01:00
* (e.g., loading save before the mod was added), and the manager is not {@link #subChunkPrivilegedAccess() privileged}.
2023-03-30 17:17:11 +02:00
* In this case, you should initialize the data to a sane default.
*/
2023-12-13 16:34:22 +01:00
@Contract(mutates = "param2")
2023-03-30 17:48:26 +02:00
@StableAPI.Expose
2023-12-13 19:42:32 +01:00
void readSubChunkFromNBT(Chunk chunk, ExtendedBlockStorage subChunk, NBTTagCompound nbt);
2023-12-13 16:34:22 +01:00
/**
2023-12-13 19:42:32 +01:00
* Directly copies data from one subChunk to another.
* @param fromChunk The owner of the subChunk to copy data from.
* @param from The subChunk to copy data from.
* @param to The subChunk to copy data to.
2023-12-13 16:34:22 +01:00
*/
@Contract(mutates = "param3")
2023-12-28 20:57:24 +01:00
@StableAPI.Expose
2023-12-13 19:42:32 +01:00
void cloneSubChunk(Chunk fromChunk, ExtendedBlockStorage from, ExtendedBlockStorage to);
2023-03-30 17:17:11 +02:00
}
2023-03-09 21:44:17 +01:00
}