|
@@ -1,5 +1,7 @@
|
|
package xyz.tbvns.rogue_block.Managers;
|
|
package xyz.tbvns.rogue_block.Managers;
|
|
|
|
|
|
|
|
+import com.esotericsoftware.kryo.kryo5.Kryo;
|
|
|
|
+import com.esotericsoftware.kryo.kryo5.io.*;
|
|
import lombok.Data;
|
|
import lombok.Data;
|
|
import net.minecraft.entity.LivingEntity;
|
|
import net.minecraft.entity.LivingEntity;
|
|
import net.minecraft.nbt.NbtCompound;
|
|
import net.minecraft.nbt.NbtCompound;
|
|
@@ -9,33 +11,60 @@ import net.minecraft.server.network.ServerPlayerEntity;
|
|
import net.minecraft.world.PersistentState;
|
|
import net.minecraft.world.PersistentState;
|
|
import net.minecraft.world.PersistentStateManager;
|
|
import net.minecraft.world.PersistentStateManager;
|
|
import net.minecraft.world.World;
|
|
import net.minecraft.world.World;
|
|
|
|
+import org.reflections.Reflections;
|
|
|
|
+import xyz.tbvns.rogue_block.Managers.registeredSavable.PlayerData;
|
|
|
|
+import xyz.tbvns.rogue_block.Packets.Packet;
|
|
import xyz.tbvns.rogue_block.Rogue_block;
|
|
import xyz.tbvns.rogue_block.Rogue_block;
|
|
|
|
+import xyz.tbvns.rogue_block.Upgrades.Upgrade;
|
|
|
|
|
|
-import java.util.HashMap;
|
|
|
|
-import java.util.UUID;
|
|
|
|
|
|
+import java.io.ByteArrayOutputStream;
|
|
|
|
+import java.nio.ByteBuffer;
|
|
|
|
+import java.util.*;
|
|
|
|
|
|
public class DataManager extends PersistentState {
|
|
public class DataManager extends PersistentState {
|
|
//Add thins here if i need global values someday
|
|
//Add thins here if i need global values someday
|
|
//Useful doc: https://fabricmc.net/wiki/tutorial:persistent_states a bit outdated tho
|
|
//Useful doc: https://fabricmc.net/wiki/tutorial:persistent_states a bit outdated tho
|
|
|
|
+ public HashMap<UUID, PlayerData> players = new HashMap<>();
|
|
|
|
|
|
- public HashMap<UUID, playerData> players = new HashMap<>();
|
|
|
|
|
|
+ static Kryo kryo = new Kryo();
|
|
|
|
+ public static void setup() {
|
|
|
|
+ kryo.setRegistrationRequired(false);
|
|
|
|
|
|
- @Data
|
|
|
|
- public static class playerData {
|
|
|
|
- private int points = 0;
|
|
|
|
|
|
+ kryo.register(ArrayList.class);
|
|
|
|
+ kryo.register(Savable.class);
|
|
|
|
|
|
- public int addPoints(int amount) {
|
|
|
|
- points += amount;
|
|
|
|
- return points;
|
|
|
|
|
|
+ Reflections reflections = new Reflections("xyz.tbvns.rogue_block.Managers.registeredSavable");
|
|
|
|
+ Set<Class<? extends Savable>> passiveUpgrade = reflections.getSubTypesOf(Savable.class);
|
|
|
|
+ for (Class<? extends Savable> element : passiveUpgrade) {
|
|
|
|
+ kryo.register(element);
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
|
|
|
|
+ public static PlayerData readPlayerData(byte[] buffer) {
|
|
|
|
+ System.out.println(Arrays.toString(buffer));
|
|
|
|
+ ByteBuffer byteBuffer = ByteBuffer.wrap(buffer, 0, 1000);
|
|
|
|
+ buffer = byteBuffer.array();
|
|
|
|
+ System.out.println(Arrays.toString(buffer));
|
|
|
|
+ Input input = new Input(buffer);
|
|
|
|
+ PlayerData playerData = kryo.readObject(input, PlayerData.class);
|
|
|
|
+ input.close();
|
|
|
|
+ return playerData;
|
|
|
|
+ }
|
|
|
|
+
|
|
|
|
+ public static ByteBuffer write(PlayerData object) {
|
|
|
|
+ Output output = new Output(1000);
|
|
|
|
+ kryo.writeObject(output, object);
|
|
|
|
+ ByteBuffer buffer = ByteBuffer.wrap(output.getBuffer());
|
|
|
|
+ output.close();
|
|
|
|
+ return buffer;
|
|
|
|
+ }
|
|
|
|
+
|
|
@Override
|
|
@Override
|
|
public NbtCompound writeNbt(NbtCompound nbt, RegistryWrapper.WrapperLookup registries) {
|
|
public NbtCompound writeNbt(NbtCompound nbt, RegistryWrapper.WrapperLookup registries) {
|
|
NbtCompound playersNbt = new NbtCompound();
|
|
NbtCompound playersNbt = new NbtCompound();
|
|
players.forEach((uuid, playerData) -> {
|
|
players.forEach((uuid, playerData) -> {
|
|
NbtCompound playerNbt = new NbtCompound();
|
|
NbtCompound playerNbt = new NbtCompound();
|
|
- playerNbt.putInt("points", playerData.points);
|
|
|
|
|
|
+ playerNbt.putByteArray("rogue_block", write(playerData).array());
|
|
playersNbt.put(uuid.toString(), playerNbt);
|
|
playersNbt.put(uuid.toString(), playerNbt);
|
|
});
|
|
});
|
|
nbt.put("players", playersNbt);
|
|
nbt.put("players", playersNbt);
|
|
@@ -46,17 +75,19 @@ public class DataManager extends PersistentState {
|
|
DataManager dataManager = new DataManager();
|
|
DataManager dataManager = new DataManager();
|
|
NbtCompound playersNbt = tag.getCompound("players");
|
|
NbtCompound playersNbt = tag.getCompound("players");
|
|
playersNbt.getKeys().forEach(key -> {
|
|
playersNbt.getKeys().forEach(key -> {
|
|
- playerData playerData = new playerData();
|
|
|
|
- playerData.points = playersNbt.getCompound(key).getInt("points");
|
|
|
|
|
|
+ PlayerData playerData = readPlayerData(playersNbt.getCompound(key).getByteArray("rogue_block"));
|
|
|
|
+ if (playerData == null) {
|
|
|
|
+ playerData = new PlayerData();
|
|
|
|
+ }
|
|
UUID uuid = UUID.fromString(key);
|
|
UUID uuid = UUID.fromString(key);
|
|
dataManager.players.put(uuid, playerData);
|
|
dataManager.players.put(uuid, playerData);
|
|
});
|
|
});
|
|
return dataManager;
|
|
return dataManager;
|
|
}
|
|
}
|
|
|
|
|
|
- public static playerData getPlayerState(LivingEntity player) {
|
|
|
|
|
|
+ public static PlayerData getPlayerState(LivingEntity player) {
|
|
DataManager serverState = getServerState(player.getWorld().getServer());
|
|
DataManager serverState = getServerState(player.getWorld().getServer());
|
|
- playerData playerState = serverState.players.computeIfAbsent(player.getUuid(), uuid -> new playerData());
|
|
|
|
|
|
+ PlayerData playerState = serverState.players.computeIfAbsent(player.getUuid(), uuid -> new PlayerData());
|
|
DataManager state = getServerState(player.getServer());
|
|
DataManager state = getServerState(player.getServer());
|
|
state.markDirty();
|
|
state.markDirty();
|
|
return playerState;
|
|
return playerState;
|
|
@@ -68,6 +99,7 @@ public class DataManager extends PersistentState {
|
|
null // Supposed to be an 'DataFixTypes' enum, but we can just pass null
|
|
null // Supposed to be an 'DataFixTypes' enum, but we can just pass null
|
|
);
|
|
);
|
|
|
|
|
|
|
|
+
|
|
public static DataManager getServerState(MinecraftServer server) {
|
|
public static DataManager getServerState(MinecraftServer server) {
|
|
PersistentStateManager persistentStateManager = server.getWorld(World.OVERWORLD).getPersistentStateManager();
|
|
PersistentStateManager persistentStateManager = server.getWorld(World.OVERWORLD).getPersistentStateManager();
|
|
DataManager state = persistentStateManager.getOrCreate(type, Rogue_block.MOD_ID);
|
|
DataManager state = persistentStateManager.getOrCreate(type, Rogue_block.MOD_ID);
|