Selaa lähdekoodia

Save system with Kryo and bytes.
Next: Make the same things for packets

____tbvns____ 5 kuukautta sitten
vanhempi
commit
2a6af534d5

+ 1 - 0
build.gradle

@@ -66,6 +66,7 @@ dependencies {
     }
     modImplementation include("net.kyori:adventure-platform-fabric:5.14.1") // for Minecraft 1.21.2-1.21.3
 
+    implementation 'com.esotericsoftware.kryo:kryo5:5.6.2'
     implementation 'org.reflections:reflections:0.10.2'
     include "io.wispforest:owo-sentinel:${project.owo_version}"
     compileOnly 'org.projectlombok:lombok:1.18.34'

+ 3 - 0
src/client/java/xyz/tbvns/rogue_block/client/Rogue_blockClient.java

@@ -12,6 +12,7 @@ import net.minecraft.client.MinecraftClient;
 import net.minecraft.client.gui.screen.world.CreateWorldScreen;
 import net.minecraft.world.gen.chunk.FlatChunkGenerator;
 import net.minecraft.world.gen.chunk.FlatChunkGeneratorConfig;
+import xyz.tbvns.rogue_block.Packets.PacketManager;
 import xyz.tbvns.rogue_block.client.Events.ClientTickEvent;
 
 public class Rogue_blockClient implements ClientModInitializer {
@@ -20,6 +21,8 @@ public class Rogue_blockClient implements ClientModInitializer {
 
     @Override
     public void onInitializeClient() {
+        PacketManager.setup();
+
         ClientTickEvents.START_WORLD_TICK.register(new ClientTickEvent());
     }
 }

+ 46 - 14
src/main/java/xyz/tbvns/rogue_block/Managers/DataManager.java

@@ -1,5 +1,7 @@
 package xyz.tbvns.rogue_block.Managers;
 
+import com.esotericsoftware.kryo.kryo5.Kryo;
+import com.esotericsoftware.kryo.kryo5.io.*;
 import lombok.Data;
 import net.minecraft.entity.LivingEntity;
 import net.minecraft.nbt.NbtCompound;
@@ -9,33 +11,60 @@ import net.minecraft.server.network.ServerPlayerEntity;
 import net.minecraft.world.PersistentState;
 import net.minecraft.world.PersistentStateManager;
 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.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 {
     //Add thins here if i need global values someday
     //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
     public NbtCompound writeNbt(NbtCompound nbt, RegistryWrapper.WrapperLookup registries) {
         NbtCompound playersNbt = new NbtCompound();
         players.forEach((uuid, playerData) -> {
             NbtCompound playerNbt = new NbtCompound();
-            playerNbt.putInt("points", playerData.points);
+            playerNbt.putByteArray("rogue_block", write(playerData).array());
             playersNbt.put(uuid.toString(), playerNbt);
         });
         nbt.put("players", playersNbt);
@@ -46,17 +75,19 @@ public class DataManager extends PersistentState {
         DataManager dataManager = new DataManager();
         NbtCompound playersNbt = tag.getCompound("players");
         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);
             dataManager.players.put(uuid, playerData);
         });
         return dataManager;
     }
 
-    public static playerData getPlayerState(LivingEntity player) {
+    public static PlayerData getPlayerState(LivingEntity player) {
         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());
         state.markDirty();
         return playerState;
@@ -68,6 +99,7 @@ public class DataManager extends PersistentState {
             null // Supposed to be an 'DataFixTypes' enum, but we can just pass null
     );
 
+
     public static DataManager getServerState(MinecraftServer server) {
         PersistentStateManager persistentStateManager = server.getWorld(World.OVERWORLD).getPersistentStateManager();
         DataManager state = persistentStateManager.getOrCreate(type, Rogue_block.MOD_ID);

+ 4 - 0
src/main/java/xyz/tbvns/rogue_block/Managers/Savable.java

@@ -0,0 +1,4 @@
+package xyz.tbvns.rogue_block.Managers;
+
+public interface Savable {
+}

+ 32 - 0
src/main/java/xyz/tbvns/rogue_block/Managers/registeredSavable/PlayerData.java

@@ -0,0 +1,32 @@
+package xyz.tbvns.rogue_block.Managers.registeredSavable;
+
+import xyz.tbvns.rogue_block.Managers.Savable;
+import xyz.tbvns.rogue_block.Upgrades.Upgrade;
+
+import java.util.ArrayList;
+import java.util.List;
+
+public class PlayerData implements Savable {
+
+    private int points = 0;
+
+    private List<Class<? extends Upgrade>> upgrades = new ArrayList<>();
+
+    public int addPoints(int amount) {
+        points += amount;
+        return points;
+    }
+
+    public void setPoints(int points) {
+        this.points = points;
+    }
+
+    public int getPoints() {
+        return points;
+    }
+
+    //TODO: replace that with lombok
+    public List<Class<? extends Upgrade>> getUpgrades() {
+        return upgrades;
+    }
+}

+ 4 - 0
src/main/java/xyz/tbvns/rogue_block/Packets/Packet.java

@@ -0,0 +1,4 @@
+package xyz.tbvns.rogue_block.Packets;
+
+public interface Packet {
+}

+ 37 - 0
src/main/java/xyz/tbvns/rogue_block/Packets/PacketManager.java

@@ -0,0 +1,37 @@
+package xyz.tbvns.rogue_block.Packets;
+
+import com.esotericsoftware.kryo.kryo5.Kryo;
+import com.esotericsoftware.kryo.kryo5.io.ByteBufferOutputStream;
+import com.esotericsoftware.kryo.kryo5.io.Input;
+import com.esotericsoftware.kryo.kryo5.io.Output;
+import org.reflections.Reflections;
+import xyz.tbvns.rogue_block.Upgrades.PassiveUpgrade;
+
+import java.nio.ByteBuffer;
+import java.util.Set;
+
+public class PacketManager {
+    static Kryo kryo = new Kryo();
+    public static void setup() {
+        Reflections reflections = new Reflections("xyz.tbvns.rogue_block.Packets.registeredPackets");
+        Set<Class<? extends Packet>> passiveUpgrade = reflections.getSubTypesOf(Packet.class);
+        for (Class<? extends Packet> element : passiveUpgrade) {
+            kryo.register(element);
+        }
+    }
+
+    public static Packet read(ByteBuffer buffer) {
+        Input input = new Input(buffer.array());
+        Packet packet = kryo.readObject(input, Packet.class);
+        input.close();
+        return packet;
+    }
+
+    public static ByteBuffer write(Packet packet) {
+        Output output = new Output(new ByteBufferOutputStream());
+        kryo.writeObject(output, packet);
+        ByteBuffer buffer = ((ByteBufferOutputStream) output.getOutputStream()).getByteBuffer();
+        output.close();
+        return buffer;
+    }
+}

+ 22 - 0
src/main/java/xyz/tbvns/rogue_block/Packets/registeredPackets/UpgradePacket.java

@@ -0,0 +1,22 @@
+package xyz.tbvns.rogue_block.Packets.registeredPackets;
+
+import xyz.tbvns.rogue_block.Packets.Packet;
+import xyz.tbvns.rogue_block.Upgrades.Upgrade;
+
+import java.util.List;
+//TODO: replace that with @Data and @AllArgsConstructor
+public class UpgradePacket implements Packet {
+    public UpgradePacket(List<Class<? extends Upgrade>> boughtUpgrades) {
+        this.boughtUpgrades = boughtUpgrades;
+    }
+
+    public List<Class<? extends Upgrade>> getBoughtUpgrades() {
+        return boughtUpgrades;
+    }
+
+    public void setBoughtUpgrades(List<Class<? extends Upgrade>> boughtUpgrades) {
+        this.boughtUpgrades = boughtUpgrades;
+    }
+
+    private List<Class<? extends Upgrade>> boughtUpgrades;
+}

+ 4 - 0
src/main/java/xyz/tbvns/rogue_block/Rogue_block.java

@@ -8,6 +8,8 @@ import net.fabricmc.fabric.api.networking.v1.ServerPlayConnectionEvents;
 import xyz.tbvns.rogue_block.Events.PlayerJoinEvents;
 import xyz.tbvns.rogue_block.Events.PlayerStartButtonEvent;
 import xyz.tbvns.rogue_block.Events.ServerStartEvent;
+import xyz.tbvns.rogue_block.Managers.DataManager;
+import xyz.tbvns.rogue_block.Packets.PacketManager;
 import xyz.tbvns.rogue_block.Upgrades.UpgradesManager;
 
 public class Rogue_block implements ModInitializer {
@@ -20,5 +22,7 @@ public class Rogue_block implements ModInitializer {
         ServerLifecycleEvents.SERVER_STARTED.register(new ServerStartEvent());
 
         UpgradesManager.loadUpgrades();
+        PacketManager.setup();
+        DataManager.setup();
     }
 }

+ 7 - 0
src/main/java/xyz/tbvns/rogue_block/Upgrades/Upgrade.java

@@ -5,10 +5,13 @@ import net.kyori.adventure.text.TextComponent;
 import net.kyori.adventure.text.format.Style;
 import net.kyori.adventure.text.format.TextColor;
 import net.kyori.adventure.text.format.TextDecoration;
+import net.minecraft.entity.player.PlayerEntity;
 import net.minecraft.item.ItemStack;
 import net.minecraft.item.Items;
+import net.minecraft.server.network.ServerPlayerEntity;
 import net.minecraft.text.OrderedText;
 import net.minecraft.text.Text;
+import xyz.tbvns.rogue_block.Managers.DataManager;
 
 import java.util.ArrayList;
 import java.util.List;
@@ -30,6 +33,10 @@ public interface Upgrade {
         return 0;
     }
 
+    default void onBought(ServerPlayerEntity entity) {
+        DataManager.getPlayerState(entity).getUpgrades().add(this.getClass());
+    }
+
     default UpgradeType getType() {
         return UpgradeType.Passive;
     }

+ 1 - 1
src/main/java/xyz/tbvns/rogue_block/mixin/MixinAchievementReward.java

@@ -17,6 +17,6 @@ public class MixinAchievementReward {
         int point = advancementRewards.experience() / 10;
         if (point == 0) return;
         DataManager.getPlayerState(player).addPoints(point);
-        player.sendMessage(Text.of("§aReceived §b§l" + point + "§r§a points for completing an achievement."));
+        player.sendMessage(Text.of("§aReceived §b§l" + point + "§r§a points for completing an achievement.§r§7(Total: " + DataManager.getPlayerState(player).getPoints() + ")"));
     }
 }