mojira.dev
MC-194350

Some feature configurations don't load in a datapack (java.lang.IllegalArgumentException: value already present: clh@77f95e19)

The Bug

Features that are defined in a certain way cause the datapack to be unable to be applied.

In case the faulty feature is wrapped into for example another feature of type minecraft:decorated, you won't actually see any errors, as the inner feature seems to default to no_op in that case.
If and only if the outer feature errors, you actually see the error.

Some vanilla files from this dump are affected as well: https://twitter.com/slicedlime/status/1280893773296422912

This is the exception, that shows up:

java.lang.IllegalArgumentException: value already present: clh@77f95e19
	at com.google.common.collect.HashBiMap.put(HashBiMap.java:287)
	at com.google.common.collect.HashBiMap.put(HashBiMap.java:262)
	at gh.a(SourceFile:64)
	at gh.a(SourceFile:75)
	at yb.b(SourceFile:66)
	at yb$$Lambda$3899/603200739.apply(Unknown Source)
	at com.mojang.datafixers.util.Pair.mapFirst(Pair.java:64)
	at yb.a(SourceFile:65)
	at yb$$Lambda$3898/1042558830.apply(Unknown Source)
	at com.mojang.datafixers.util.Either$Left.mapBoth(Either.java:33)
	at com.mojang.serialization.DataResult.map(DataResult.java:110)
	at yb.a(SourceFile:65)
	at ya.decode(SourceFile:36)
	at com.mojang.serialization.Decoder.parse(Decoder.java:18)
	at com.mojang.serialization.codecs.FieldDecoder.decode(FieldDecoder.java:29)
	at com.mojang.serialization.MapCodec$1.decode(MapCodec.java:34)
	at com.mojang.serialization.codecs.RecordCodecBuilder$Instance$3.decode(RecordCodecBuilder.java:248)
	at com.mojang.serialization.codecs.RecordCodecBuilder$2.decode(RecordCodecBuilder.java:107)
	at com.mojang.serialization.MapDecoder.lambda$compressedDecode$0(MapDecoder.java:52)
	at com.mojang.serialization.MapDecoder$$Lambda$2993/543433178.apply(Unknown Source)
	at com.mojang.serialization.DataResult.lambda$flatMap$10(DataResult.java:138)
	at com.mojang.serialization.DataResult$$Lambda$632/2136614370.apply(Unknown Source)
	at com.mojang.datafixers.util.Either$Left.map(Either.java:38)
	at com.mojang.serialization.DataResult.flatMap(DataResult.java:136)
	at com.mojang.serialization.MapDecoder.compressedDecode(MapDecoder.java:52)
	at com.mojang.serialization.MapCodec$MapCodecCodec.decode(MapCodec.java:91)
	at com.mojang.serialization.Decoder.parse(Decoder.java:18)
	at com.mojang.serialization.codecs.FieldDecoder.decode(FieldDecoder.java:29)
	at com.mojang.serialization.MapCodec$1.decode(MapCodec.java:34)
	at com.mojang.serialization.MapDecoder$4.decode(MapDecoder.java:94)
	at com.mojang.serialization.MapCodec$1.decode(MapCodec.java:34)
	at com.mojang.serialization.codecs.KeyDispatchCodec.lambda$null$1(KeyDispatchCodec.java:67)
	at com.mojang.serialization.codecs.KeyDispatchCodec$$Lambda$3844/965811562.apply(Unknown Source)
	at com.mojang.serialization.DataResult.lambda$flatMap$10(DataResult.java:138)
	at com.mojang.serialization.DataResult$$Lambda$632/2136614370.apply(Unknown Source)
	at com.mojang.datafixers.util.Either$Left.map(Either.java:38)
	at com.mojang.serialization.DataResult.flatMap(DataResult.java:136)
	at com.mojang.serialization.codecs.KeyDispatchCodec.lambda$decode$2(KeyDispatchCodec.java:58)
	at com.mojang.serialization.codecs.KeyDispatchCodec$$Lambda$3843/709506664.apply(Unknown Source)
	at com.mojang.serialization.DataResult.lambda$flatMap$10(DataResult.java:138)
	at com.mojang.serialization.DataResult$$Lambda$632/2136614370.apply(Unknown Source)
	at com.mojang.datafixers.util.Either$Left.map(Either.java:38)
	at com.mojang.serialization.DataResult.flatMap(DataResult.java:136)
	at com.mojang.serialization.codecs.KeyDispatchCodec.decode(KeyDispatchCodec.java:56)
	at com.mojang.serialization.MapCodec$3.decode(MapCodec.java:186)
	at com.mojang.serialization.MapDecoder.lambda$compressedDecode$0(MapDecoder.java:52)
	at com.mojang.serialization.MapDecoder$$Lambda$2993/543433178.apply(Unknown Source)
	at com.mojang.serialization.DataResult.lambda$flatMap$10(DataResult.java:138)
	at com.mojang.serialization.DataResult$$Lambda$632/2136614370.apply(Unknown Source)
	at com.mojang.datafixers.util.Either$Left.map(Either.java:38)
	at com.mojang.serialization.DataResult.flatMap(DataResult.java:136)
	at com.mojang.serialization.MapDecoder.compressedDecode(MapDecoder.java:52)
	at com.mojang.serialization.MapCodec$MapCodecCodec.decode(MapCodec.java:91)
	at com.mojang.serialization.Decoder.parse(Decoder.java:18)
	at yb.a(SourceFile:161)
	at yb.a(SourceFile:139)
	at yb.a(SourceFile:74)
	at ya.decode(SourceFile:36)
	at com.mojang.serialization.codecs.ListCodec.lambda$null$2(ListCodec.java:46)
	at com.mojang.serialization.codecs.ListCodec$$Lambda$2996/136037594.accept(Unknown Source)
	at com.mojang.serialization.JsonOps.lambda$getList$7(JsonOps.java:292)
	at com.mojang.serialization.JsonOps$$Lambda$3872/198941055.accept(Unknown Source)
	at com.mojang.serialization.codecs.ListCodec.lambda$decode$4(ListCodec.java:45)
	at com.mojang.serialization.codecs.ListCodec$$Lambda$2995/1792087378.apply(Unknown Source)
	at com.mojang.serialization.DataResult.lambda$flatMap$10(DataResult.java:138)
	at com.mojang.serialization.DataResult$$Lambda$632/2136614370.apply(Unknown Source)
	at com.mojang.datafixers.util.Either$Left.map(Either.java:38)
	at com.mojang.serialization.DataResult.flatMap(DataResult.java:136)
	at com.mojang.serialization.codecs.ListCodec.decode(ListCodec.java:39)
	at com.mojang.serialization.Decoder$3.decode(Decoder.java:77)
	at com.mojang.serialization.Codec$2.decode(Codec.java:71)
	at com.mojang.serialization.codecs.ListCodec.lambda$null$2(ListCodec.java:46)
	at com.mojang.serialization.codecs.ListCodec$$Lambda$2996/136037594.accept(Unknown Source)
	at com.mojang.serialization.JsonOps.lambda$getList$7(JsonOps.java:292)
	at com.mojang.serialization.JsonOps$$Lambda$3872/198941055.accept(Unknown Source)
	at com.mojang.serialization.codecs.ListCodec.lambda$decode$4(ListCodec.java:45)
	at com.mojang.serialization.codecs.ListCodec$$Lambda$2995/1792087378.apply(Unknown Source)
	at com.mojang.serialization.DataResult.lambda$flatMap$10(DataResult.java:138)
	at com.mojang.serialization.DataResult$$Lambda$632/2136614370.apply(Unknown Source)
	at com.mojang.datafixers.util.Either$Left.map(Either.java:38)
	at com.mojang.serialization.DataResult.flatMap(DataResult.java:136)
	at com.mojang.serialization.codecs.ListCodec.decode(ListCodec.java:39)
	at com.mojang.serialization.Decoder.parse(Decoder.java:18)
	at com.mojang.serialization.codecs.FieldDecoder.decode(FieldDecoder.java:29)
	at com.mojang.serialization.MapCodec$1.decode(MapCodec.java:34)
	at com.mojang.serialization.codecs.RecordCodecBuilder$Instance$7.decode(RecordCodecBuilder.java:409)
	at com.mojang.serialization.codecs.RecordCodecBuilder$Instance$7.decode(RecordCodecBuilder.java:405)
	at com.mojang.serialization.codecs.RecordCodecBuilder$2.decode(RecordCodecBuilder.java:107)
	at com.mojang.serialization.MapDecoder.lambda$compressedDecode$0(MapDecoder.java:52)
	at com.mojang.serialization.MapDecoder$$Lambda$2993/543433178.apply(Unknown Source)
	at com.mojang.serialization.DataResult.lambda$flatMap$10(DataResult.java:138)
	at com.mojang.serialization.DataResult$$Lambda$632/2136614370.apply(Unknown Source)
	at com.mojang.datafixers.util.Either$Left.map(Either.java:38)
	at com.mojang.serialization.DataResult.flatMap(DataResult.java:136)
	at com.mojang.serialization.MapDecoder.compressedDecode(MapDecoder.java:52)
	at com.mojang.serialization.MapCodec$MapCodecCodec.decode(MapCodec.java:91)
	at com.mojang.serialization.Decoder.parse(Decoder.java:18)
	at yb.a(SourceFile:161)
	at yb.a(SourceFile:139)
	at yb.a(SourceFile:74)
	at ya.decode(SourceFile:36)
	at com.mojang.serialization.Decoder.parse(Decoder.java:18)
	at com.mojang.serialization.codecs.FieldDecoder.decode(FieldDecoder.java:29)
	at com.mojang.serialization.MapCodec$1.decode(MapCodec.java:34)
	at com.mojang.serialization.MapDecoder$4.decode(MapDecoder.java:94)
	at com.mojang.serialization.MapCodec$1.decode(MapCodec.java:34)
	at com.mojang.serialization.MapCodec$2.decode(MapCodec.java:63)
	at com.mojang.serialization.codecs.KeyDispatchCodec.lambda$null$1(KeyDispatchCodec.java:67)
	at com.mojang.serialization.codecs.KeyDispatchCodec$$Lambda$3844/965811562.apply(Unknown Source)
	at com.mojang.serialization.DataResult.lambda$flatMap$10(DataResult.java:138)
	at com.mojang.serialization.DataResult$$Lambda$632/2136614370.apply(Unknown Source)
	at com.mojang.datafixers.util.Either$Left.map(Either.java:38)
	at com.mojang.serialization.DataResult.flatMap(DataResult.java:136)
	at com.mojang.serialization.codecs.KeyDispatchCodec.lambda$decode$2(KeyDispatchCodec.java:58)
	at com.mojang.serialization.codecs.KeyDispatchCodec$$Lambda$3843/709506664.apply(Unknown Source)
	at com.mojang.serialization.DataResult.lambda$flatMap$10(DataResult.java:138)
	at com.mojang.serialization.DataResult$$Lambda$632/2136614370.apply(Unknown Source)
	at com.mojang.datafixers.util.Either$Left.map(Either.java:38)
	at com.mojang.serialization.DataResult.flatMap(DataResult.java:136)
	at com.mojang.serialization.codecs.KeyDispatchCodec.decode(KeyDispatchCodec.java:56)
	at com.mojang.serialization.MapDecoder.lambda$compressedDecode$0(MapDecoder.java:52)
	at com.mojang.serialization.MapDecoder$$Lambda$2993/543433178.apply(Unknown Source)
	at com.mojang.serialization.DataResult.lambda$flatMap$10(DataResult.java:138)
	at com.mojang.serialization.DataResult$$Lambda$632/2136614370.apply(Unknown Source)
	at com.mojang.datafixers.util.Either$Left.map(Either.java:38)
	at com.mojang.serialization.DataResult.flatMap(DataResult.java:136)
	at com.mojang.serialization.MapDecoder.compressedDecode(MapDecoder.java:52)
	at com.mojang.serialization.MapCodec$MapCodecCodec.decode(MapCodec.java:91)
	at com.mojang.serialization.Decoder.parse(Decoder.java:18)
	at com.mojang.serialization.codecs.FieldDecoder.decode(FieldDecoder.java:29)
	at com.mojang.serialization.MapCodec$1.decode(MapCodec.java:34)
	at com.mojang.serialization.codecs.RecordCodecBuilder$Instance$5.decode(RecordCodecBuilder.java:323)
	at com.mojang.serialization.codecs.RecordCodecBuilder$2.decode(RecordCodecBuilder.java:107)
	at com.mojang.serialization.codecs.KeyDispatchCodec.lambda$null$1(KeyDispatchCodec.java:67)
	at com.mojang.serialization.codecs.KeyDispatchCodec$$Lambda$3844/965811562.apply(Unknown Source)
	at com.mojang.serialization.DataResult.lambda$flatMap$10(DataResult.java:138)
	at com.mojang.serialization.DataResult$$Lambda$632/2136614370.apply(Unknown Source)
	at com.mojang.datafixers.util.Either$Left.map(Either.java:38)
	at com.mojang.serialization.DataResult.flatMap(DataResult.java:136)
	at com.mojang.serialization.codecs.KeyDispatchCodec.lambda$decode$2(KeyDispatchCodec.java:58)
	at com.mojang.serialization.codecs.KeyDispatchCodec$$Lambda$3843/709506664.apply(Unknown Source)
	at com.mojang.serialization.DataResult.lambda$flatMap$10(DataResult.java:138)
	at com.mojang.serialization.DataResult$$Lambda$632/2136614370.apply(Unknown Source)
	at com.mojang.datafixers.util.Either$Left.map(Either.java:38)
	at com.mojang.serialization.DataResult.flatMap(DataResult.java:136)
	at com.mojang.serialization.codecs.KeyDispatchCodec.decode(KeyDispatchCodec.java:56)
	at com.mojang.serialization.MapDecoder.lambda$compressedDecode$0(MapDecoder.java:52)
	at com.mojang.serialization.MapDecoder$$Lambda$2993/543433178.apply(Unknown Source)
	at com.mojang.serialization.DataResult.lambda$flatMap$10(DataResult.java:138)
	at com.mojang.serialization.DataResult$$Lambda$632/2136614370.apply(Unknown Source)
	at com.mojang.datafixers.util.Either$Left.map(Either.java:38)
	at com.mojang.serialization.DataResult.flatMap(DataResult.java:136)
	at com.mojang.serialization.MapDecoder.compressedDecode(MapDecoder.java:52)
	at com.mojang.serialization.MapCodec$MapCodecCodec.decode(MapCodec.java:91)
	at com.mojang.serialization.Decoder.parse(Decoder.java:18)
	at com.mojang.serialization.codecs.FieldDecoder.decode(FieldDecoder.java:29)
	at com.mojang.serialization.MapCodec$1.decode(MapCodec.java:34)
	at com.mojang.serialization.codecs.RecordCodecBuilder$Instance$3.decode(RecordCodecBuilder.java:249)
	at com.mojang.serialization.codecs.RecordCodecBuilder$2.decode(RecordCodecBuilder.java:107)
	at com.mojang.serialization.MapDecoder.lambda$compressedDecode$0(MapDecoder.java:52)
	at com.mojang.serialization.MapDecoder$$Lambda$2993/543433178.apply(Unknown Source)
	at com.mojang.serialization.DataResult.lambda$flatMap$10(DataResult.java:138)
	at com.mojang.serialization.DataResult$$Lambda$632/2136614370.apply(Unknown Source)
	at com.mojang.datafixers.util.Either$Left.map(Either.java:38)
	at com.mojang.serialization.DataResult.flatMap(DataResult.java:136)
	at com.mojang.serialization.MapDecoder.compressedDecode(MapDecoder.java:52)
	at com.mojang.serialization.MapCodec$MapCodecCodec.decode(MapCodec.java:91)
	at com.mojang.serialization.Decoder.parse(Decoder.java:18)
	at com.mojang.serialization.codecs.BaseMapCodec.lambda$decode$2(BaseMapCodec.java:31)
	at com.mojang.serialization.codecs.BaseMapCodec$$Lambda$3836/1071236571.apply(Unknown Source)
	at java.util.stream.ReduceOps$1ReducingSink.accept(ReduceOps.java:80)
	at java.util.stream.ReferencePipeline$3$1.accept(ReferencePipeline.java:193)
	at java.util.HashMap$KeySpliterator.forEachRemaining(HashMap.java:1540)
	at java.util.stream.AbstractPipeline.copyInto(AbstractPipeline.java:512)
	at java.util.stream.AbstractPipeline.wrapAndCopyInto(AbstractPipeline.java:502)
	at java.util.stream.ReduceOps$ReduceOp.evaluateSequential(ReduceOps.java:708)
	at java.util.stream.AbstractPipeline.evaluate(AbstractPipeline.java:234)
	at java.util.stream.ReferencePipeline.reduce(ReferencePipeline.java:484)
	at com.mojang.serialization.codecs.BaseMapCodec.decode(BaseMapCodec.java:27)
	at com.mojang.serialization.codecs.UnboundedMapCodec.lambda$decode$0(UnboundedMapCodec.java:38)
	at com.mojang.serialization.codecs.UnboundedMapCodec$$Lambda$3834/849241856.apply(Unknown Source)
	at com.mojang.serialization.DataResult.lambda$flatMap$10(DataResult.java:138)
	at com.mojang.serialization.DataResult$$Lambda$632/2136614370.apply(Unknown Source)
	at com.mojang.datafixers.util.Either$Left.map(Either.java:38)
	at com.mojang.serialization.DataResult.flatMap(DataResult.java:136)
	at com.mojang.serialization.codecs.UnboundedMapCodec.decode(UnboundedMapCodec.java:38)
	at com.mojang.serialization.Decoder$2.decode(Decoder.java:63)
	at com.mojang.serialization.Codec$2.decode(Codec.java:71)
	at xz.decode(SourceFile:34)
	at com.mojang.serialization.Decoder$2.decode(Decoder.java:63)
	at com.mojang.serialization.Codec$2.decode(Codec.java:71)
	at com.mojang.serialization.Decoder.parse(Decoder.java:18)
	at com.mojang.serialization.codecs.FieldDecoder.decode(FieldDecoder.java:29)
	at com.mojang.serialization.MapCodec$1.decode(MapCodec.java:34)
	at com.mojang.serialization.codecs.RecordCodecBuilder$Instance$5.decode(RecordCodecBuilder.java:324)
	at com.mojang.serialization.codecs.RecordCodecBuilder$2.decode(RecordCodecBuilder.java:107)
	at com.mojang.serialization.MapDecoder.lambda$compressedDecode$0(MapDecoder.java:52)
	at com.mojang.serialization.MapDecoder$$Lambda$2993/543433178.apply(Unknown Source)
	at com.mojang.serialization.DataResult.lambda$flatMap$10(DataResult.java:138)
	at com.mojang.serialization.DataResult$$Lambda$632/2136614370.apply(Unknown Source)
	at com.mojang.datafixers.util.Either$Left.map(Either.java:38)
	at com.mojang.serialization.DataResult.flatMap(DataResult.java:136)
	at com.mojang.serialization.MapDecoder.compressedDecode(MapDecoder.java:52)
	at com.mojang.serialization.MapCodec$MapCodecCodec.decode(MapCodec.java:91)
	at com.mojang.serialization.Decoder$1.decode(Decoder.java:49)
	at com.mojang.serialization.Codec$2.decode(Codec.java:71)
	at com.mojang.serialization.Decoder.decode(Decoder.java:22)
	at com.mojang.serialization.Decoder.parse(Decoder.java:26)
	at dar.a(SourceFile:115)
	at dar.a(SourceFile:206)
	at dar$$Lambda$3828/715497518.apply(Unknown Source)
	at dar.a(SourceFile:169)
	at dar.a(SourceFile:57)
	at dar$a.a(SourceFile:323)
	at dmk.a(SourceFile:1683)
	at dmk$$Lambda$3144/1074078310.apply(Unknown Source)
	at dmk.a(SourceFile:1906)
	at dmk.a(SourceFile:1753)
	at dmk.a(SourceFile:1697)
	at duq$a.e(SourceFile:411)
	at duq$a.a(SourceFile:321)
	at duq$a.a(SourceFile:258)
	at dnr.a(SourceFile:331)
	at dor.a(SourceFile:27)
	at dml.b(SourceFile:92)
	at dml$$Lambda$2888/1388124035.run(Unknown Source)
	at drd.a(SourceFile:431)
	at dml.a(SourceFile:92)
	at dml.c(SourceFile:162)
	at dml$$Lambda$2887/66554485.run(Unknown Source)
	at aqp.execute(SourceFile:94)
	at dml.b(SourceFile:162)
	at dml$$Lambda$2238/1027992087.invoke(Unknown Source)
	at org.lwjgl.glfw.GLFWMouseButtonCallbackI.callback(GLFWMouseButtonCallbackI.java:36)
	at org.lwjgl.system.JNI.invokeV(Native Method)
	at org.lwjgl.glfw.GLFW.glfwWaitEventsTimeout(GLFW.java:3174)
	at com.mojang.blaze3d.systems.RenderSystem.limitDisplayFPS(SourceFile:127)
	at dmk.e(SourceFile:1043)
	at dmk.e(SourceFile:653)
	at net.minecraft.client.main.Main.main(SourceFile:215)

How to Reproduce

I am not sure about the exact conditions. One example seems to be when a minecraft:random_selector is nested into a minecraft:decorated feature.

For testing I attached a datapack with a minimal custom biome that still reproduces this bug.

  1. click "create new world"

  2. In the world creation screen, click "Data Packs"

  3. Drag

[media]
  1. onto the screen that you just opened opened.

  2. Enable the pack by clicking the arrow, moving it to the "Selected" column

  3. Go back to the world creation screen
    → ❌ The game freezes on "Validating selected data packs", and the exception posted above appears in the log.

Analyses

Responsible is the buggy:crash_trees feature which is defined as follows:

{
	"name": "minecraft:decorated",
	"config": {
		"decorator": {
			"name": "minecraft:decorated",
			"config": {
				"outer": {
					"name": "minecraft:square",
					"config": {}
				},
				"inner": {
					"name": "minecraft:heightmap",
					"config": {}
				}
			}
		},
		"feature": {
			"name": "minecraft:random_selector",
			"config": {
				"default": "minecraft:oak",
				"features": [
					{
						"feature": "minecraft:fancy_oak",
						"chance": 0.1
					}
				]
			}
		}
	}
}

If the decorator is ommited, the random_selector feature works as expected:

{
	"name": "minecraft:random_selector",
	"config": {
		"default": "minecraft:oak",
		"features": [
			{
				"feature": "minecraft:fancy_oak",
				"chance": 0.1
			}
		]
	}
}

The outer decorated feature works as expected too, when using a different inner feature:

{
	"name": "minecraft:decorated",
	"config": {
		"decorator": {
			"name": "minecraft:decorated",
			"config": {
				"outer": {
					"name": "minecraft:square",
					"config": {}
				},
				"inner": {
					"name": "minecraft:heightmap",
					"config": {}
				}
			}
		},
		"feature": "minecraft:oak"
	}
}

The combination of the two, however, does not work for some reason.

Linked issues

Attachments

Comments 3

Using a debugger I was able to verify the duplicate object is a ConfiguredFeature (yarn mapping, "clh") for the "no_op" feature, stored in the "kg". This is used as a default value. I have not discovered why the Ops returns a successful DataResult instead of an error.

Tested in 20w29a, still crashing for the same reason.

After a bit more investigating, I found this mostly seems to happen when using unnamed features. It looks like those are all stored at the same location in the BiMap causing this crash. This also appears to happen when any incorrect data is entered as then a default one is used (maybe no_op) also causing the same one to be present multiple times.

NeunEinser

slicedlime

Community Consensus

Low

Custom Worlds, World generation

20w28a, 20w29a

20w30a

Retrieved