MagmaGuy / BetterStructures

Adds structures to Minecraft worlds using WorldEdit!
GNU General Public License v3.0
24 stars 11 forks source link

+ fixed bug with mob spawning for signs from 1.20.4 #35

Closed thehuze closed 6 months ago

thehuze commented 6 months ago

Description

In version 1.20.4, the NBT tag format for signs was changed, which caused the method String getLine(BaseBlock baseBlock, int line) to not work for schematics created on 1.20.4. Examples of the new and old formats are given below.

Tested the current code on WorldEdit and FastAsyncWorldEdit for schematics from 1.20.4, as well as on structures from the free pack.

Changes

Moved the static methods for parsing lines from com.magmaguy.betterstructures.schematics.SchematicContainer to com.magmaguy.betterstructures.util.WorldEditUtils.

Also implemented separate methods for parsing for FAWE and WorldEdit. Added javadoc comments to all of this.

FastAsyncWorldEdit

Old format

BinaryTagType[CompoundBinaryTag 10]{tags={"Color"=BinaryTagType[StringBinaryTag 8]{value="black"}, "is_waxed"=BinaryTagType[ByteBinaryTag 1 (numeric)]{value=0}, "Text4"=BinaryTagType[StringBinaryTag 8]{value="{\\"text\\":\\"\\"}"}, "Text3"=BinaryTagType[StringBinaryTag 8]{value="{\\"text\\":\\"\\"}"}, "Text2"=BinaryTagType[StringBinaryTag 8]{value="{\\"text\\":\\"pillager\\"}"}, "Text1"=BinaryTagType[StringBinaryTag 8]{value="{\\"text\\":\\"[spawn]\\"}"}, "front_text"=BinaryTagType[CompoundBinaryTag 10]{tags={"messages"=BinaryTagType[ListBinaryTag 9]{tags=[BinaryTagType[StringBinaryTag 8]{value="{\\"text\\":\\"[spawn]\\"}"}, BinaryTagType[StringBinaryTag 8]{value="{\\"text\\":\\"pillager\\"", BinaryTagType[StringBinaryTag 8]{value="{\\"text\\":\\"\\"}"}, BinaryTagType[StringBinaryTag 8]{value="{\\"text\\":\\"\\"}"}], type=BinaryTagType[StringBinaryTag 8]}, "has_glowing_text"=BinaryTagType[ByteBinaryTag 1 (numeric)]{value=0}, "color"=BinaryTagType[StringBinaryTag 8]{value="black"}}}, "back_text"=BinaryTagType[CompoundBinaryTag 10]{tags={"messages"=BinaryTagType[ListBinaryTag 9]{tags=[BinaryTagType[StringBinaryTag 8]{value="{\\"text\\":\\"\\"}"}, BinaryTagType[StringBinaryTag 8]{value="{\\"text\\":\\"\\"}"}, BinaryTagType[StringBinaryTag 8]{value="{\\"text\\":\\"\\"}"}, BinaryTagType[StringBinaryTag 8]{value="{\\"text\\":\\"\\"}"}], type=BinaryTagType[StringBinaryTag 8]}, "has_glowing_text"=BinaryTagType[ByteBinaryTag 1 (numeric)]{value=0}, "color"=BinaryTagType[StringBinaryTag 8]{value="black"}}}, "GlowingText"=BinaryTagType[ByteBinaryTag 1 (numeric)]{value=0}, "x"=BinaryTagType[IntBinaryTag 3 (numeric)]{value=9}, "y"=BinaryTagType[IntBinaryTag 3 (numeric)]{value=5}, "z"=BinaryTagType[IntBinaryTag 3 (numeric)]{value=9}, "id"=BinaryTagType[StringBinaryTag 8]{value="minecraft:sign"}}}

New format

{"back_text"=BinaryTagType[CompoundBinaryTag 10]{tags={"messages"=BinaryTagType[ListBinaryTag 9]{tags=[BinaryTagType[StringBinaryTag 8]{value="\\"\\""}, BinaryTagType[StringBinaryTag 8]{value="\\"\\""}, BinaryTagType[StringBinaryTag 8]{value="\\"\\""}, BinaryTagType[StringBinaryTag 8]{value="\\"\\""}], type=BinaryTagType[StringBinaryTag 8]}, "has_glowing_text"=BinaryTagType[ByteBinaryTag 1 (numeric)]{value=0}, "color"=BinaryTagType[StringBinaryTag 8]{value="black"}}}, "is_waxed"=BinaryTagType[ByteBinaryTag 1 (numeric)]{value=0}, "x"=BinaryTagType[IntBinaryTag 3 (numeric)]{value=13}, "y"=BinaryTagType[IntBinaryTag 3 (numeric)]{value=3}, "z"=BinaryTagType[IntBinaryTag 3 (numeric)]{value=16}, "id"=BinaryTagType[StringBinaryTag 8]{value="minecraft:sign"}, 
"front_text"=BinaryTagType[CompoundBinaryTag 10]{tags={"messages"=BinaryTagType[ListBinaryTag 9]{tags=[BinaryTagType[StringBinaryTag 8]{value="\\"[spawn]\\""}, BinaryTagType[StringBinaryTag 8]**{value="\\"EVOKER\\""}**, BinaryTagType[StringBinaryTag 8]{value="\\"\\""}, BinaryTagType[StringBinaryTag 8]{value="\\"\\""}], type=BinaryTagType[StringBinaryTag 8]}, "has_glowing_text"=BinaryTagType[ByteBinaryTag 1 (numeric)]{value=0}, "color"=BinaryTagType[StringBinaryTag 8]{value="black"}}}}}

{\"text\":\"[spawn]\"}"} to {value="\"[spawn]\""} and changed the order of lines

WorldEdit

Old format

TAG_Compound: 13 entries
{
   TAG_String(black)
   TAG_Byte(0)
   TAG_String({"text":""})
   TAG_String({"text":""})
   TAG_String({"text":"vindicator"})
   TAG_String({"text":"[spawn]"})
   TAG_Compound: 3 entries
   {
      TAG_Byte(0)
      TAG_String(black)
      TAG_List: 4 entries of type TAG_String
      {
         TAG_String({"text":"[spawn]"})
         TAG_String({"text":"vindicator"})
         TAG_String({"text":""})
         TAG_String({"text":""})
      }
   }
   TAG_Compound: 3 entries
   {
      TAG_Byte(0)
      TAG_String(black)
      TAG_List: 4 entries of type TAG_String
      {
         TAG_String({"text":""})
         TAG_String({"text":""})
         TAG_String({"text":""})
         TAG_String({"text":""})
      }
   }
   TAG_Byte(0)
   TAG_Int(8)
   TAG_Int(5)
   TAG_Int(8)
   TAG_String(minecraft:sign)
}

New format

TAG_Compound: 7 entries
{
   TAG_Compound: 3 entries
   {
      TAG_Byte(0)
      TAG_String(black)
      TAG_List: 4 entries of type TAG_String
      {
         TAG_String("")
         TAG_String("")
         TAG_String("")
         TAG_String("")
      }
   }
   TAG_Byte(0)
   TAG_Int(3)
   TAG_Int(1)
   TAG_Int(19)
   TAG_String(minecraft:sign)
   TAG_Compound: 3 entries
   {
      TAG_Byte(0)
      TAG_String(black)
      TAG_List: 4 entries of type TAG_String
      {
         TAG_String("[spawn]")
         TAG_String("vindicator")
         TAG_String("")
         TAG_String("")
      }
   }
}
MagmaGuy commented 6 months ago

Seems great but just to confirm would this work for worldedit for versions prior to 1.20.4?