minity icon indicating copy to clipboard operation
minity copied to clipboard

SNBT/JSON encoding does not escape quotes properly

Open AgainPsychoX opened this issue 3 years ago • 2 comments

Code

namespace minecarts_nowadays

?furnace_minecart_name_text = "Minecart with Furnace"
?furnace_minecart_name_snbt = snbt {"text":"{?furnace_minecart_name_text}"}

function replace_drops #minecraft:tick {
	for @minecraft:furnace_minecart {
		/summon minecraft:chest_minecart ~ ~ ~ {CustomDisplayTile:1b,DisplayOffset:6,Tags:["furnace_minecart"],CustomName:"{?furnace_minecart_name_snbt}",DisplayState:{Name:"minecraft:furnace"}}
		/kill @s
	}
	for @item{Item:{id:"minecraft:minecart",Count:1b,tag:{display:{Name:"{?furnace_minecart_name_snbt}"}}}} {
		/kill @e[type=item,limit=1,sort=nearest,nbt={Item:{id:"minecraft:chest",Count:1b}}]
		/summon minecraft:item ~ ~ ~ {Item:{id:"minecraft:furnace_minecart",Count:1b}}
		/kill @s
	}
}

It compiles, but does not load/work properly, as generated mcfunctions are invalid.

Generated output

replace_drops.mcfunction

execute as @e[type=minecraft:furnace_minecart] at @s run function zzz_minity:minecarts_nowadays/_b_4
execute as @e[type=minecraft:item,nbt={Item:{id:"minecraft:minecart",Count:1b,tag:{display:{Name:"{text:"Minecart with Furnace"}"}}}}] at @s run function zzz_minity:minecarts_nowadays/_b_5

_b_$.mcfunction (body of first for statement)

summon minecraft:chest_minecart ~ ~ ~ {CustomDisplayTile:1b,DisplayOffset:6,Tags:["furnace_minecart"],CustomName:"{text:"Minecart with Furnace"}",DisplayState:{Name:"minecraft:furnace"}}
kill @s

Expected output

Example using escaping double quotes with slash:

execute as @e[type=minecraft:furnace_minecart] at @s run function zzz_minity:minecarts_nowadays/_b_4
execute as @e[type=minecraft:item,nbt={Item:{id:"minecraft:minecart",Count:1b,tag:{display:{Name:"{\"text\":\"Minecart with Furnace\"}"}}}}] at @s run function zzz_minity:minecarts_nowadays/_b_5

Example using encapsulating with single quote:

summon minecraft:chest_minecart ~ ~ ~ {CustomDisplayTile:1b,DisplayOffset:6,Tags:["furnace_minecart"],CustomName:'{"text":"Minecart with Furnace"}',DisplayState:{Name:"minecraft:furnace"}}
kill @s

It's expected the SNBT would be escaped, by slashes (" to \" in escaped string) or by encapsulating it in single quotes ('). ~~Also, it won't work without key quotes while executing in Minecraft ("text": ... works, text: ... does not).~~


EDIT: Using SNBT was not valid here, but the issue with quotes is still a bug, both for SNBT and JSON.

(CustomName requires JSON format)

AgainPsychoX avatar Dec 09 '21 20:12 AgainPsychoX