mojira.dev
MC-310098

Trying to mix item modifier references and inline values in a list prevents the pack from loading

The bug

Previously, a loot table could apply a list of item modifiers, with some declared inline and some being references:

{
  "pools": [
    {
      "rolls": 1,
      "entries": [
        {
          "type": "item",
          "name": "apple",
          "functions": [
            {
              "function": "set_count",
              "count": 5
            },
            {
              "function": "reference",
              "name": "test:whatever"
            }
          ]
        }
      ]
    }
  ]
}

The new syntax would look like this:

{
  "pools": [
    {
      "rolls": 1,
      "entries": [
        {
          "type": "item",
          "name": "apple",
          "modifier": [
            {
              "type": "set_count",
              "count": 5
            },
            "test:whatever"
          ]
        }
      ]
    }
  ]
}

However, this does not work. This prevents the world from loading, and causes /reload to fail. The following error is logged:

[09:54:58] [Server thread/WARN]: Failed to execute reload
java.util.concurrent.CompletionException: java.lang.StackOverflowError
	at java.base/java.util.concurrent.CompletableFuture.wrapInCompletionException(CompletableFuture.java:323)
	at java.base/java.util.concurrent.CompletableFuture.encodeThrowable(CompletableFuture.java:359)
	at java.base/java.util.concurrent.CompletableFuture.completeThrowable(CompletableFuture.java:364)
	at java.base/java.util.concurrent.CompletableFuture$AsyncRun.run(CompletableFuture.java:1828)
	at java.base/java.util.concurrent.CompletableFuture$AsyncRun.exec(CompletableFuture.java:1817)
	at java.base/java.util.concurrent.ForkJoinTask.doExec(ForkJoinTask.java:511)
	at java.base/java.util.concurrent.ForkJoinPool$WorkQueue.topLevelExec(ForkJoinPool.java:1450)
	at java.base/java.util.concurrent.ForkJoinPool.runWorker(ForkJoinPool.java:2019)
	at java.base/java.util.concurrent.ForkJoinWorkerThread.run(ForkJoinWorkerThread.java:187)
Caused by: java.lang.StackOverflowError
	at net.minecraft.resources.Identifier.bySeparator(Identifier.java:81)
	at net.minecraft.resources.Identifier.parse(Identifier.java:50)
	at net.minecraft.resources.Identifier.read(Identifier.java:105)
	at com.mojang.serialization.Decoder$1.lambda$decode$1(Decoder.java:49)
	at com.mojang.serialization.DataResult$Success.flatMap(DataResult.java:201)
	at com.mojang.serialization.Decoder$1.decode(Decoder.java:49)
	at com.mojang.serialization.Codec$2.decode(Codec.java:74)
	at com.mojang.serialization.Codec$1.decode(Codec.java:48)
	at com.mojang.serialization.Decoder$1.decode(Decoder.java:49)
	at com.mojang.serialization.Codec$2.decode(Codec.java:74)
	at com.mojang.serialization.Codec$4.decode(Codec.java:333)
	at com.mojang.serialization.Decoder$2.decode(Decoder.java:63)
	at com.mojang.serialization.Codec$2.decode(Codec.java:74)
	at com.mojang.serialization.Decoder.parse(Decoder.java:18)
	at com.mojang.serialization.codecs.FieldDecoder.decode(FieldDecoder.java:29)
	at com.mojang.serialization.MapCodec$2.decode(MapCodec.java:78)
	at com.mojang.serialization.codecs.KeyDispatchCodec.decode(KeyDispatchCodec.java:37)
	at com.mojang.serialization.MapDecoder.lambda$compressedDecode$1(MapDecoder.java:52)
	at com.mojang.serialization.DataResult$Success.flatMap(DataResult.java:201)
	at com.mojang.serialization.MapDecoder.compressedDecode(MapDecoder.java:52)
	at com.mojang.serialization.MapCodec$MapCodecCodec.decode(MapCodec.java:159)
	at com.mojang.serialization.codecs.EitherCodec.decode(EitherCodec.java:14)
	at com.mojang.serialization.Decoder$2.decode(Decoder.java:63)
	at com.mojang.serialization.Codec$2.decode(Codec.java:74)
	at com.mojang.serialization.Codec$RecursiveCodec.decode(Codec.java:219)
	at net.minecraft.resources.RegistryFileCodec.decode(RegistryFileCodec.java:65)
	at com.mojang.serialization.codecs.ListCodec$DecoderState.accept(ListCodec.java:74)
	at com.mojang.serialization.JsonOps.lambda$getList$21(JsonOps.java:308)
	at com.mojang.serialization.codecs.ListCodec.lambda$decode$2(ListCodec.java:45)
	at com.mojang.serialization.DataResult$Success.flatMap(DataResult.java:201)
	at com.mojang.serialization.codecs.ListCodec.decode(ListCodec.java:43)
	at com.mojang.serialization.Decoder$1.decode(Decoder.java:49)
	at com.mojang.serialization.Codec$2.decode(Codec.java:74)
	at com.mojang.serialization.codecs.EitherCodec.decode(EitherCodec.java:14)
	at com.mojang.serialization.Decoder$2.decode(Decoder.java:63)
	at com.mojang.serialization.Codec$2.decode(Codec.java:74)
	at com.mojang.serialization.codecs.EitherCodec.decode(EitherCodec.java:18)
	...
	at com.mojang.serialization.Decoder$2.decode(Decoder.java:63)
	at com.mojang.serialization.Codec$2.decode(Codec.java:74)
	at com.mojang.serialization.codecs.EitherCodec.decode(EitherCodec.java:18)
	at com.mojang.serialization.Decoder$2.decode(Decoder.java:63)
	at com.mojang.serialization.Codec$2.decode(Codec.java:74)
	at com.mojang.serialization.Codec$RecursiveCodec.decode(Codec.java:219)
	at net.minecraft.resources.RegistryFileCodec.decode(RegistryFileCodec.java:65)
	at com.mojang.serialization.codecs.EitherCodec.decode(EitherCodec.java:18)
	at com.mojang.serialization.Decoder$2.decode(Decoder.java:63)
	at com.mojang.serialization.Codec$2.decode(Codec.java:74)
	at com.mojang.serialization.codecs.EitherCodec.decode(EitherCodec.java:18)
	at net.minecraft.resources.HolderSetCodec.decode(HolderSetCodec.java:49)
	at com.mojang.serialization.Decoder$2.decode(Decoder.java:63)
	at com.mojang.serialization.Codec$2.decode(Codec.java:74)
	at com.mojang.serialization.codecs.EitherCodec.decode(EitherCodec.java:18)
	at com.mojang.serialization.Decoder$2.decode(Decoder.java:63)
	at com.mojang.serialization.Codec$2.decode(Codec.java:74)
	at com.mojang.serialization.Codec$RecursiveCodec.decode(Codec.java:219)
	at net.minecraft.resources.RegistryFileCodec.decode(RegistryFileCodec.java:65)
	at com.mojang.serialization.codecs.EitherCodec.decode(EitherCodec.java:18)
	at com.mojang.serialization.Decoder$2.decode(Decoder.java:63)
	at com.mojang.serialization.Codec$2.decode(Codec.java:74)
	at com.mojang.serialization.codecs.EitherCodec.decode(EitherCodec.java:18)
	at net.minecraft.resources.HolderSetCodec.decode(HolderSetCodec.java:49)
	at com.mojang.serialization.Decoder$2.decode(Decoder.java:63)
	at com.mojang.serialization.Codec$2.decode(Codec.java:74)
[media]

Attachments

Comments 1

tryashtar

boq

Community Consensus

26.3 Snapshot 4

26.3 Snapshot 5

Retrieved