package Ġio . github . mr png . nbt . implementation Ċ Ċ import Ġio . github . mr png . nbt .* Ċ import Ġio . github . mr png . nbt . Tag Type .* Ċ import Ġio . github . mr png . nbt . extension .* Ċ import Ġjava . nio .* Ċ Ċ type alias ĠCompound Map Ġ= ĠMap < String , ĠTag Any > Ċ Ċ open Ġclass ĠTag Compound Ġprotected Ġconstructor ( name : ĠString ? Ġ= Ġnull ): ĠTag < Compound Map >( TAG _ COMP O UND , Ġname ) Ġ{ ĊĉĊ ĉ override Ġval Ġsize InBytes Ċĉ ĉ get () Ġ= Ġ_ value . entries . sum By Ġ{ Ġ( name , Ġtag ) Ġ-> Ċĉĉ ĉ Byte . SIZE _ BYTES Ġ+ Ġ( Short . SIZE _ BYTES Ġ+ Ġname . toByteArray (). size ) Ġ+ Ġtag . size InBytes Ċĉ ĉ } Ġ+ ĠByte . SIZE _ BYTES ĊĉĊ ĉ constructor ( value : ĠCompound Map , Ġname : ĠString ? Ġ= Ġnull ): Ġthis ( name ) Ġ{ Ċĉ ĉ _ value Ġ= Ġvalue . map Ġ{ Ġ( name , Ġtag ) Ġ-> Ġname Ġto Ġtag . ensure Name ( name ) Ġ}. toMap () Ċ ĉ } ĊĉĊ ĉ constructor ( byte Buffer : ĠByteBuffer , Ġname : ĠString ? Ġ= Ġnull ): Ġthis ( name ) Ġ{ Ċĉ ĉ read ( byte Buffer ) Ċ ĉ } ĊĉĊ ĉ internal Ġfun Ġwrite Root ( byte Buffer : ĠByteBuffer ) Ġ{ Ċĉ ĉ byte Buffer . put ( TAG _ COMP O UND . id . to Byte ()) Ċĉ ĉ byte Buffer . putString ( name Ġ?: Ġ"") ĊĉĉĊĉ ĉ write ( byte Buffer ) Ċ ĉ } ĊĉĊ ĉ operator Ġfun Ġget ( name : ĠString ) Ġ= Ġ_ value [ name ] ĊĉĊ ĉ final Ġoverride Ġfun Ġread ( byte Buffer : ĠByteBuffer ) Ġ{ Ċĉ ĉ val Ġvalue Ġ= Ġmutable Map Of < String , ĠTag Any >() ĊĉĉĊĉ ĉ var Ġnext Id : ĠInt Ċĉ ĉ do Ġ{ Ċĉĉ ĉ next Id Ġ= Ġbyte Buffer . byte . toInt () ĊĉĉĉĊĉĉ ĉ if Ġ( next Id Ġ== ĠTAG _ END . id ) Ġbreak ĊĉĉĉĊĉĉ ĉ val Ġnext Name Ġ= Ġbyte Buffer . string Ċĉĉ ĉ val Ġnext Tag Ġ= Ġread ( next Id , Ġbyte Buffer , Ġnext Name ) ĊĉĉĉĊĉĉ ĉ value [ next Name ] Ġ= Ġnext Tag Ċĉ ĉ } Ġwhile Ġ( true ) ĊĉĉĊĉ ĉ _ value Ġ= Ġvalue Ċ ĉ } ĊĉĊ ĉ override Ġfun Ġwrite ( byte Buffer : ĠByteBuffer ) Ġ{ Ċĉ ĉ _ value . entries . forEach Ġ{ Ġ( name , Ġtag ) Ġ-> Ċĉĉ ĉ byte Buffer . put ( tag . type . id . to Byte ()) Ċĉĉ ĉ byte Buffer . putString ( name ) ĊĉĉĉĊĉĉ ĉ tag . write ( byte Buffer ) Ċĉ ĉ } ĊĉĉĊĉ ĉ byte Buffer . put ( TAG _ END . id . to Byte ()) Ċ ĉ } ĊĉĊ ĉ override Ġfun Ġclone ( name : ĠString ?) Ġ= ĠTag Compound ( value . map Ġ{ Ġ( name , Ġtag ) Ġ-> Ġname Ġto Ġtag . clone ( name ) Ġ}. toMap (), Ġname ) ĊĉĊ ĉ override Ġfun ĠtoString () Ġ= Ġbuild String Ġ{ Ċĉ ĉ append ("${ prefix () }{ ") ĊĉĉĊĉ ĉ if Ġ( value . isNotEmpty ()) Ġ{ Ċĉĉ ĉ append ln (). tab () Ċĉĉ ĉ append ln ( Ċĉĉĉ ĉ value . entries . sorted With ( NBT Comparator ). join ToString (", \ n \ t ") Ġ{ Ġ(_, Ġnext Tag ) Ġ-> Ċĉĉĉĉ ĉ when Ġ( next Tag . type ) Ġ{ Ċĉĉĉĉĉ ĉ TAG _ COMP O UND , ĠTAG _ LIST Ġ-> Ġnext Tag . toString (). replace ("\ n ", Ġ"\ n \ t ") Ċĉĉĉĉĉ ĉ else Ġ-> Ġnext Tag . toString () Ċĉĉĉĉ ĉ } Ċĉĉĉ ĉ } Ċĉĉ ĉ ) Ċĉ ĉ } ĊĉĉĊĉ ĉ append (" }") Ċ ĉ } ĊĉĊ ĉ comp anion Ġobject Ġ{ ĊĉĉĊĉ ĉ /** ĠCustom Ġ[ Comparator ] Ġfor ĠN BT Ġentries Ġin Ġa Ġ[ Tag Compound ], Ġinspired Ġby ĠN BT Explorer . Ġ*/ Ċĉ ĉ val ĠN BT Comparator Ġ= ĠComparator < Map . Entry < String , ĠTag Any >> Ġ{ Ġ( name 1 , Ġtag 1 ), Ġ( name 2 , Ġtag 2 ) Ġ-> Ċĉĉ ĉ val Ġtype 1 Ġ= Ġtag 1 . type Ċĉĉ ĉ val Ġtype 2 Ġ= Ġtag 2 . type ĊĉĉĉĊĉĉ ĉ fun Ġcompare Names () Ġ= Ġname 1 . toLowerCase (). compareTo ( name 2 . toLowerCase ()) ĊĉĉĉĊĉĉ ĉ when Ġ{ Ċĉĉĉ ĉ type 1 Ġ== ĠTAG _ COMP O UND Ġ-> Ġif Ġ( type 2 Ġ== ĠTAG _ COMP O UND ) Ġcompare Names () Ġelse Ġ- 1 Ċĉĉĉ ĉ type 2 Ġ== ĠTAG _ COMP O UND Ġ-> Ġ 1 Ċĉĉĉ ĉ type 1 Ġ== ĠTAG _ LIST Ġ-> Ġif Ġ( type 2 Ġ== ĠTAG _ LIST ) Ġcompare Names () Ġelse Ġ- 1 Ċĉĉĉ ĉ type 2 Ġ== ĠTAG _ LIST Ġ-> Ġ 1 Ċĉĉĉ ĉ else Ġ-> Ġcompare Names () Ċĉĉ ĉ } Ċĉ ĉ } Ċ ĉ } Ċ } Ċ