From 7394dfe8d86c1c2e6caa1c4d948f8f28ffb1d196 Mon Sep 17 00:00:00 2001 From: RecursivePineapple Date: Thu, 13 Nov 2025 13:10:10 -0500 Subject: [PATCH] Fix crash when linking upgraded MM --- .../common/items/manipulator/MMState.java | 15 ++++++++- .../common/persist/BitSetJsonAdapter.java | 33 +++++++++++++++++++ 2 files changed, 47 insertions(+), 1 deletion(-) create mode 100644 src/main/java/com/recursive_pineapple/matter_manipulator/common/persist/BitSetJsonAdapter.java diff --git a/src/main/java/com/recursive_pineapple/matter_manipulator/common/items/manipulator/MMState.java b/src/main/java/com/recursive_pineapple/matter_manipulator/common/items/manipulator/MMState.java index 981259e8..cf98b1e0 100644 --- a/src/main/java/com/recursive_pineapple/matter_manipulator/common/items/manipulator/MMState.java +++ b/src/main/java/com/recursive_pineapple/matter_manipulator/common/items/manipulator/MMState.java @@ -56,6 +56,7 @@ import com.recursive_pineapple.matter_manipulator.common.data.WeightedSpecList; import com.recursive_pineapple.matter_manipulator.common.items.MMUpgrades; import com.recursive_pineapple.matter_manipulator.common.items.manipulator.ItemMatterManipulator.ManipulatorTier; +import com.recursive_pineapple.matter_manipulator.common.persist.BitSetJsonAdapter; import com.recursive_pineapple.matter_manipulator.common.persist.NBTJsonAdapter; import com.recursive_pineapple.matter_manipulator.common.persist.StaticEnumJsonAdapter; import com.recursive_pineapple.matter_manipulator.common.persist.UIDJsonAdapter; @@ -78,6 +79,7 @@ public class MMState { .registerTypeAdapter(NBTTagCompound.class, new NBTJsonAdapter()) .registerTypeAdapter(ForgeDirection.class, new StaticEnumJsonAdapter<>(ForgeDirection.class)) .registerTypeAdapter(WeightedSpecList.class, new WeightedListJsonAdapter()) + .registerTypeAdapter(BitSet.class, new BitSetJsonAdapter()) .create(); @SerializedName("jv") @@ -91,7 +93,7 @@ public class MMState { public double charge; public BitSet installedUpgrades = new BitSet(); - public int upgradeProvidedCapabilities; + public transient int upgradeProvidedCapabilities; public transient ItemMatterManipulator manipulator; @@ -148,9 +150,20 @@ private static void migrateJson(JsonObject obj) { config.remove("replaceWhitelist"); config.remove("replaceWith"); } + version = 1; } + if (version == 1) { + // Load with the default encoder + BitSet bitSet = new Gson().fromJson(obj.get("installedUpgrades"), BitSet.class); + + // Save with the new encoder + obj.add("installedUpgrades", GSON.toJsonTree(bitSet)); + + version = 2; + } + obj.addProperty("jv", version); } diff --git a/src/main/java/com/recursive_pineapple/matter_manipulator/common/persist/BitSetJsonAdapter.java b/src/main/java/com/recursive_pineapple/matter_manipulator/common/persist/BitSetJsonAdapter.java new file mode 100644 index 00000000..6be719ec --- /dev/null +++ b/src/main/java/com/recursive_pineapple/matter_manipulator/common/persist/BitSetJsonAdapter.java @@ -0,0 +1,33 @@ +package com.recursive_pineapple.matter_manipulator.common.persist; + +import java.lang.reflect.Type; +import java.util.Base64; +import java.util.BitSet; + +import com.google.gson.JsonDeserializationContext; +import com.google.gson.JsonDeserializer; +import com.google.gson.JsonElement; +import com.google.gson.JsonParseException; +import com.google.gson.JsonSerializationContext; +import com.google.gson.JsonSerializer; + +public class BitSetJsonAdapter implements JsonSerializer, JsonDeserializer { + + @Override + public BitSet deserialize(JsonElement json, Type typeOfT, JsonDeserializationContext context) throws JsonParseException { + String str = context.deserialize(json, String.class); + + byte[] data = Base64.getDecoder().decode(str); + + return BitSet.valueOf(data); + } + + @Override + public JsonElement serialize(BitSet src, Type typeOfSrc, JsonSerializationContext context) { + byte[] data = src.toByteArray(); + + String str = Base64.getEncoder().encodeToString(data); + + return context.serialize(str); + } +}