Chest Tracker

Chest Tracker

728k Downloads

Incompatibility with Custom Enchantments in Minecraft 1.21.4

RGone0 opened this issue · 0 comments

commented

Incompatibility with Custom Enchantments in Minecraft 1.21.4

Description

I've discovered that ChestTracker 2.6.7 is unable to handle items with custom enchantments (non-vanilla enchantments) when running on Minecraft 1.21.4 on a multiplayer server with plugins. This causes exceptions during both saving and loading processes.

Environment

  • Minecraft version: 1.21.4 Fabric
  • ChestTracker version: 2.6.7
  • Fabric Loader: 0.16.14
  • Server type: Multiplayer plugin server with custom enchantments

Detailed Issue Description

When ChestTracker encounters items with custom enchantments (enchantments not present in vanilla Minecraft), it fails to properly serialize/deserialize this data, leading to exceptions.

JSON Storage Mode

When loading container data:

Error loading C:\minecraft\chesttracker\multiplayer\example.json
java.io.IOException: Invalid Memories JSON: No key items in MapLike[{}]; Invalid number of coordinates: 1; No key items in MapLike[{"-12,64,20":{"container":"minecraft:chest","loadedTimestamp":8977,"worldTimestamp":2038871,"realTimestamp":"2025-05-13T05:22:41.196716500Z","items":[{"id":"minecraft:netherite_sword","count":1,"components":{"minecraft:enchantments":{"levels":{"minecraft:custom_enchantments":1}}}}]}}]; Invalid number of coordinates: 1 missed input: {"memories":{"-12,64,20":{"container":"minecraft:chest","loadedTimestamp":8977,"worldTimestamp":2038871,"realTimestamp":"2025-05-13T05:22:41.196716500Z","items":[{"id":"minecraft:netherite_sword","count":1,"components":{"minecraft:enchantments":{"levels":{"minecraft:custom_enchantments":1}}}}]}},"overrides":{}} missed input: {"minecraft:the_end":{"memories":{"-12,64,20":{"container":"minecraft:chest","loadedTimestamp":8977,"worldTimestamp":2038871,"realTimestamp":"2025-05-13T05:22:41.196716500Z","items":[{"id":"minecraft:netherite_sword","count":1,"components":{"minecraft:enchantments":{"levels":{"minecraft:custom_enchantments":1}}}}]}},"overrides":{},"MinecraftDataVersion":4189}}
	at knot/red.jackf.chesttracker.impl.storage.backend.JsonBackend.lambda$load$0(JsonBackend.java:55) ~[chesttracker-2.6.7+1.21.4.jar:?]
	at knot/red.jackf.chesttracker.impl.util.Misc.time(Misc.java:61) ~[chesttracker-2.6.7+1.21.4.jar:?]
	at knot/red.jackf.chesttracker.impl.storage.backend.JsonBackend.load(JsonBackend.java:47) ~[chesttracker-2.6.7+1.21.4.jar:?]
	at knot/red.jackf.chesttracker.impl.storage.Storage.load(Storage.java:84) ~[chesttracker-2.6.7+1.21.4.jar:?]
	at knot/red.jackf.chesttracker.impl.memory.MemoryBankAccessImpl.loadOrCreate(MemoryBankAccessImpl.java:26) ~[chesttracker-2.6.7+1.21.4.jar:?]
	at knot/red.jackf.chesttracker.impl.memory.MemoryBankAccessImpl.loadWithDefaults(MemoryBankAccessImpl.java:64) ~[chesttracker-2.6.7+1.21.4.jar:?]
	at knot/red.jackf.chesttracker.api.providers.ServerProvider.onConnect(ServerProvider.java:85) ~[chesttracker-2.6.7+1.21.4.jar:?]
	at knot/red.jackf.chesttracker.impl.providers.ProviderHandler.lambda$load$1(ProviderHandler.java:47) ~[chesttracker-2.6.7+1.21.4.jar:?]
	at java.base/java.util.Optional.ifPresent(Optional.java:178) ~[?:?]
	at knot/red.jackf.chesttracker.impl.providers.ProviderHandler.load(ProviderHandler.java:45) ~[chesttracker-2.6.7+1.21.4.jar:?]
	at knot/red.jackf.chesttracker.impl.providers.ProviderHandler.lambda$setupEvents$2(ProviderHandler.java:68) ~[chesttracker-2.6.7+1.21.4.jar:?]
	at knot/net.minecraft.class_1255.method_18859(class_1255.java:164) [client-intermediary.jar:?]
	at knot/net.minecraft.class_4093.method_18859(class_4093.java:23) [client-intermediary.jar:?]
	at knot/net.minecraft.class_1255.method_16075(class_1255.java:138) [client-intermediary.jar:?]
	at knot/net.minecraft.class_1255.method_5383(class_1255.java:123) [client-intermediary.jar:?]
	at knot/net.minecraft.class_310.method_1523(class_310.java:1296) [client-intermediary.jar:?]
	at knot/net.minecraft.class_310.method_1514(class_310.java:922) [client-intermediary.jar:?]
	at knot/net.minecraft.client.main.Main.main(Main.java:267) [client-intermediary.jar:?]
	at net.fabricmc.loader.impl.game.minecraft.MinecraftGameProvider.launch(MinecraftGameProvider.java:480) [fabric-loader-0.16.14.jar:?]
	at net.fabricmc.loader.impl.launch.knot.Knot.launch(Knot.java:74) [fabric-loader-0.16.14.jar:?]
	at net.fabricmc.loader.impl.launch.knot.KnotClient.main(KnotClient.java:23) [fabric-loader-0.16.14.jar:?]
	at java.base/jdk.internal.reflect.DirectMethodHandleAccessor.invoke(DirectMethodHandleAccessor.java:103) ~[?:?]
	at java.base/java.lang.reflect.Method.invoke(Method.java:580) ~[?:?]
	at oolloo.jlw.Wrapper.invokeMain(Wrapper.java:112) [JavaWrapper.jar:?]
	at oolloo.jlw.Wrapper.main(Wrapper.java:105) [JavaWrapper.jar:?]

NBT Storage Mode

When saving container data:

Error saving object
java.io.IOException: Error encoding to NBT DataResult.Error['Element Reference{ResourceKey[minecraft:enchantment / minecraft:swift_sneak]=Enchantment 迅捷潜行} is not valid in current registry set; Element Reference{ResourceKey[minecraft:enchantment / minecraft:zidongbuzhong]=Enchantment enchantment.minecraft.zidongbuzhong} is not valid in current registry set;
......
Element Reference{ResourceKey[minecraft:enchantment / minecraft:custom_enchantments]=Enchantment custom_enchantments} is not valid in current registry set']
	at knot/red.jackf.chesttracker.impl.util.FileUtil.saveToNbt(FileUtil.java:48) ~[chesttracker-2.6.7+1.21.4.jar:?]
	at knot/red.jackf.chesttracker.impl.storage.backend.NbtBackend.save(NbtBackend.java:37) ~[chesttracker-2.6.7+1.21.4.jar:?]
	at knot/red.jackf.chesttracker.impl.storage.Storage.save(Storage.java:104) ~[chesttracker-2.6.7+1.21.4.jar:?]
	at knot/red.jackf.chesttracker.impl.memory.MemoryBankAccessImpl.save(MemoryBankAccessImpl.java:54) ~[chesttracker-2.6.7+1.21.4.jar:?]
	at knot/red.jackf.chesttracker.impl.memory.MemoryBankAccessImpl.unload(MemoryBankAccessImpl.java:38) ~[chesttracker-2.6.7+1.21.4.jar:?]
	at knot/red.jackf.chesttracker.impl.providers.ProviderHandler.unload(ProviderHandler.java:54) ~[chesttracker-2.6.7+1.21.4.jar:?]
	at knot/red.jackf.chesttracker.impl.providers.ProviderHandler.load(ProviderHandler.java:38) ~[chesttracker-2.6.7+1.21.4.jar:?]
	at knot/red.jackf.chesttracker.impl.providers.ProviderHandler.lambda$setupEvents$2(ProviderHandler.java:68) ~[chesttracker-2.6.7+1.21.4.jar:?]
	at knot/net.minecraft.class_1255.method_18859(class_1255.java:164) [client-intermediary.jar:?]
	at knot/net.minecraft.class_4093.method_18859(class_4093.java:23) [client-intermediary.jar:?]
	at knot/net.minecraft.class_1255.method_16075(class_1255.java:138) [client-intermediary.jar:?]
	at knot/net.minecraft.class_1255.method_5383(class_1255.java:123) [client-intermediary.jar:?]
	at knot/net.minecraft.class_310.method_1523(class_310.java:1296) [client-intermediary.jar:?]
	at knot/net.minecraft.class_310.method_1514(class_310.java:922) [client-intermediary.jar:?]
	at knot/net.minecraft.client.main.Main.main(Main.java:267) [client-intermediary.jar:?]
	at net.fabricmc.loader.impl.game.minecraft.MinecraftGameProvider.launch(MinecraftGameProvider.java:480) [fabric-loader-0.16.14.jar:?]
	at net.fabricmc.loader.impl.launch.knot.Knot.launch(Knot.java:74) [fabric-loader-0.16.14.jar:?]
	at net.fabricmc.loader.impl.launch.knot.KnotClient.main(KnotClient.java:23) [fabric-loader-0.16.14.jar:?]
	at java.base/jdk.internal.reflect.DirectMethodHandleAccessor.invoke(DirectMethodHandleAccessor.java:103) ~[?:?]
	at java.base/java.lang.reflect.Method.invoke(Method.java:580) ~[?:?]
	at oolloo.jlw.Wrapper.invokeMain(Wrapper.java:112) [JavaWrapper.jar:?]
	at oolloo.jlw.Wrapper.main(Wrapper.java:105) [JavaWrapper.jar:?]

When loading NBT data:

Error loading object at C:\minecraft\chesttracker\multiplayer\example.nbt
java.io.IOException: Invalid NBT: No key items in MapLike[{}]; Invalid number of coordinates: 1; No key items in MapLike[...]
at knot/red.jackf.chesttracker.impl.util.FileUtil.loadFromNbt(FileUtil.java:77) ~[chesttracker-2.6.7+1.21.4.jar:?]
	at knot/red.jackf.chesttracker.impl.storage.backend.NbtBackend.lambda$load$0(NbtBackend.java:23) ~[chesttracker-2.6.7+1.21.4.jar:?]
	at knot/red.jackf.chesttracker.impl.util.Misc.time(Misc.java:61) ~[chesttracker-2.6.7+1.21.4.jar:?]
	at knot/red.jackf.chesttracker.impl.storage.backend.NbtBackend.load(NbtBackend.java:23) ~[chesttracker-2.6.7+1.21.4.jar:?]
	at knot/red.jackf.chesttracker.impl.storage.Storage.load(Storage.java:84) ~[chesttracker-2.6.7+1.21.4.jar:?]
	at knot/red.jackf.chesttracker.impl.memory.MemoryBankAccessImpl.loadOrCreate(MemoryBankAccessImpl.java:26) ~[chesttracker-2.6.7+1.21.4.jar:?]
	at knot/red.jackf.chesttracker.impl.memory.MemoryBankAccessImpl.loadWithDefaults(MemoryBankAccessImpl.java:64) ~[chesttracker-2.6.7+1.21.4.jar:?]
	at knot/red.jackf.chesttracker.api.providers.ServerProvider.onConnect(ServerProvider.java:85) ~[chesttracker-2.6.7+1.21.4.jar:?]
	at knot/red.jackf.chesttracker.impl.providers.ProviderHandler.lambda$load$1(ProviderHandler.java:47) ~[chesttracker-2.6.7+1.21.4.jar:?]
	at java.base/java.util.Optional.ifPresent(Optional.java:178) ~[?:?]
	at knot/red.jackf.chesttracker.impl.providers.ProviderHandler.load(ProviderHandler.java:45) ~[chesttracker-2.6.7+1.21.4.jar:?]
	at knot/red.jackf.chesttracker.impl.providers.ProviderHandler.lambda$setupEvents$2(ProviderHandler.java:68) ~[chesttracker-2.6.7+1.21.4.jar:?]
	at knot/net.minecraft.class_1255.method_18859(class_1255.java:164) [client-intermediary.jar:?]
	at knot/net.minecraft.class_4093.method_18859(class_4093.java:23) [client-intermediary.jar:?]
	at knot/net.minecraft.class_1255.method_16075(class_1255.java:138) [client-intermediary.jar:?]
	at knot/net.minecraft.class_1255.method_5383(class_1255.java:123) [client-intermediary.jar:?]
	at knot/net.minecraft.class_310.method_1523(class_310.java:1296) [client-intermediary.jar:?]
	at knot/net.minecraft.class_310.method_1514(class_310.java:922) [client-intermediary.jar:?]
	at knot/net.minecraft.client.main.Main.main(Main.java:267) [client-intermediary.jar:?]
	at net.fabricmc.loader.impl.game.minecraft.MinecraftGameProvider.launch(MinecraftGameProvider.java:480) [fabric-loader-0.16.14.jar:?]
	at net.fabricmc.loader.impl.launch.knot.Knot.launch(Knot.java:74) [fabric-loader-0.16.14.jar:?]
	at net.fabricmc.loader.impl.launch.knot.KnotClient.main(KnotClient.java:23) [fabric-loader-0.16.14.jar:?]
	at java.base/jdk.internal.reflect.DirectMethodHandleAccessor.invoke(DirectMethodHandleAccessor.java:103) ~[?:?]
	at java.base/java.lang.reflect.Method.invoke(Method.java:580) ~[?:?]
	at oolloo.jlw.Wrapper.invokeMain(Wrapper.java:112) [JavaWrapper.jar:?]
	at oolloo.jlw.Wrapper.main(Wrapper.java:105) [JavaWrapper.jar:?]

Reproduction

  1. Install ChestTracker 2.6.7 on Minecraft 1.21.4 Fabric
  2. Connect to a multiplayer server that has plugins adding custom enchantments
  3. Open containers containing items with custom enchantments
  4. During gameplay, the mod appears to track items normally without visible errors
  5. Upon exiting the game:
    • When using NBT storage mode: An exception is thrown during the saving process (although the file size increases, indicating some content was written)
    • When using JSON storage mode: No exceptions occur during saving
  6. Upon next game launch after having saved data with custom enchanted items:
    • Both storage modes (NBT and JSON) will throw loading exceptions when trying to read the previously saved data

Example Data

This is a simplified example of data that triggers the exception:

{
  "minecraft:the_end": {
    "memories": {
      "-12,64,20": {
        "container": "minecraft:chest",
        "loadedTimestamp": 8977,
        "worldTimestamp": 2038871,
        "realTimestamp": "2025-05-13T05:22:41.196716500Z",
        "items": [
          {
            "id": "minecraft:netherite_sword",
            "count": 1,
            "components": {
              "minecraft:enchantments": {
                "levels": {
                  "minecraft:custom_enchantments": 1
                }
              }
            }
          }
        ]
      }
    },
    "overrides": {},
    "MinecraftDataVersion": 4189
  }
}

Regular items without custom enchantments work fine. The issue specifically occurs with custom enchantments not present in vanilla Minecraft.

Additional Context

The core issue appears to be that ChestTracker doesn't properly handle enchantment registry keys that aren't part of the vanilla Minecraft registry. The NBT serialization error explicitly states this: "Element Reference{ResourceKey[minecraft:enchantment / minecraft:custom_enchantments]=Enchantment custom_enchantments} is not valid in current registry set".

Possible Solutions

The mod may need to implement a more flexible registry handling system that can store unknown enchantment identifiers as strings rather than trying to resolve them against the current registry set. Alternatively, it could implement a filtering mechanism to remove custom enchantments before serialization while preserving the rest of the item data.