mirror of
https://github.com/Minestom/Minestom.git
synced 2025-03-02 11:21:15 +01:00
Added InstanceContainer#saveInstance to save its SerializableData + its uniqueId
This commit is contained in:
parent
cb743bc7d5
commit
b7b334645f
@ -10,6 +10,7 @@ import net.minestom.server.utils.validate.Check;
|
||||
|
||||
import java.util.HashMap;
|
||||
import java.util.Map;
|
||||
import java.util.UUID;
|
||||
|
||||
public class DataManager {
|
||||
|
||||
@ -43,6 +44,8 @@ public class DataManager {
|
||||
registerType(String.class, new StringData());
|
||||
registerType(String[].class, new StringArrayData());
|
||||
|
||||
registerType(UUID.class, new UuidType());
|
||||
|
||||
registerType(SerializableData.class, new SerializableDataData());
|
||||
|
||||
registerType(ItemStack.class, new ItemStackData());
|
||||
|
19
src/main/java/net/minestom/server/data/type/UuidType.java
Normal file
19
src/main/java/net/minestom/server/data/type/UuidType.java
Normal file
@ -0,0 +1,19 @@
|
||||
package net.minestom.server.data.type;
|
||||
|
||||
import net.minestom.server.data.DataType;
|
||||
import net.minestom.server.network.packet.PacketReader;
|
||||
import net.minestom.server.network.packet.PacketWriter;
|
||||
|
||||
import java.util.UUID;
|
||||
|
||||
public class UuidType extends DataType<UUID> {
|
||||
@Override
|
||||
public void encode(PacketWriter packetWriter, UUID value) {
|
||||
packetWriter.writeUuid(value);
|
||||
}
|
||||
|
||||
@Override
|
||||
public UUID decode(PacketReader packetReader) {
|
||||
return packetReader.readUuid();
|
||||
}
|
||||
}
|
@ -51,7 +51,7 @@ public abstract class Instance implements BlockModifier, EventHandler, DataConta
|
||||
protected Set<ExperienceOrb> experienceOrbs = new CopyOnWriteArraySet<>();
|
||||
// Entities per chunk
|
||||
protected Map<Long, Set<Entity>> chunkEntities = new ConcurrentHashMap<>();
|
||||
private UUID uniqueId;
|
||||
protected UUID uniqueId;
|
||||
|
||||
private Data data;
|
||||
private ExplosionSupplier explosionSupplier;
|
||||
|
@ -3,6 +3,7 @@ package net.minestom.server.instance;
|
||||
import io.netty.buffer.ByteBuf;
|
||||
import net.minestom.server.MinecraftServer;
|
||||
import net.minestom.server.data.Data;
|
||||
import net.minestom.server.data.SerializableData;
|
||||
import net.minestom.server.entity.Player;
|
||||
import net.minestom.server.event.player.PlayerBlockBreakEvent;
|
||||
import net.minestom.server.instance.batch.BlockBatch;
|
||||
@ -38,8 +39,12 @@ import java.util.function.Consumer;
|
||||
/**
|
||||
* InstanceContainer is an instance that contains chunks in contrary to SharedInstance.
|
||||
*/
|
||||
// TODO save data + other things such as UUID
|
||||
public class InstanceContainer extends Instance {
|
||||
|
||||
private static final String UUID_KEY = "uuid";
|
||||
private static final String DATA_KEY = "data";
|
||||
|
||||
private StorageFolder storageFolder;
|
||||
|
||||
private List<SharedInstance> sharedInstances = new CopyOnWriteArrayList<>();
|
||||
@ -54,7 +59,16 @@ public class InstanceContainer extends Instance {
|
||||
|
||||
public InstanceContainer(UUID uniqueId, Dimension dimension, StorageFolder storageFolder) {
|
||||
super(uniqueId, dimension);
|
||||
|
||||
this.storageFolder = storageFolder;
|
||||
|
||||
if (storageFolder == null)
|
||||
return;
|
||||
// Retrieve instance data
|
||||
this.uniqueId = storageFolder.getOrDefault(UUID_KEY, UUID.class, uniqueId);
|
||||
|
||||
Data data = storageFolder.getOrDefault(DATA_KEY, SerializableData.class, null);
|
||||
setData(data);
|
||||
}
|
||||
|
||||
@Override
|
||||
@ -309,6 +323,27 @@ public class InstanceContainer extends Instance {
|
||||
return ChunkUtils.isChunkUnloaded(chunk) ? null : chunk;
|
||||
}
|
||||
|
||||
/**
|
||||
* Save the instance ({@link #getUniqueId()} {@link #getData()}) and call {@link #saveChunksToStorageFolder(Runnable)}
|
||||
* <p>
|
||||
* WARNING: {@link #getData()} needs to be a {@link SerializableData} in order to be saved
|
||||
*
|
||||
* @param callback the callback
|
||||
*/
|
||||
public void saveInstance(Runnable callback) {
|
||||
Check.notNull(getStorageFolder(), "You cannot save the instance if no StorageFolder has been defined");
|
||||
|
||||
this.storageFolder.set(UUID_KEY, getUniqueId(), UUID.class);
|
||||
Data data = getData();
|
||||
if (data != null) {
|
||||
Check.stateCondition(!(data instanceof SerializableData),
|
||||
"Instance#getData needs to be a SerializableData in order to be saved");
|
||||
this.storageFolder.set(DATA_KEY, (SerializableData) getData(), SerializableData.class);
|
||||
}
|
||||
|
||||
saveChunksToStorageFolder(callback);
|
||||
}
|
||||
|
||||
@Override
|
||||
public void saveChunkToStorageFolder(Chunk chunk, Runnable callback) {
|
||||
Check.notNull(getStorageFolder(), "You cannot save the chunk if no StorageFolder has been defined");
|
||||
|
@ -7,6 +7,8 @@ import net.minestom.server.utils.BlockPosition;
|
||||
import net.minestom.server.utils.SerializerUtils;
|
||||
import net.minestom.server.utils.Utils;
|
||||
|
||||
import java.util.UUID;
|
||||
|
||||
public class PacketReader {
|
||||
|
||||
private ByteBuf buffer;
|
||||
@ -90,6 +92,12 @@ public class PacketReader {
|
||||
return SerializerUtils.longToBlockPosition(value);
|
||||
}
|
||||
|
||||
public UUID readUuid() {
|
||||
long most = readLong();
|
||||
long least = readLong();
|
||||
return new UUID(most, least);
|
||||
}
|
||||
|
||||
public ItemStack readSlot() {
|
||||
return Utils.readItemStack(this);
|
||||
}
|
||||
|
Loading…
Reference in New Issue
Block a user