package Ġio . ely tra . api . nbt . tags Ċ Ċ import Ġio . ely tra . api . nbt . N bt InputStream Ċ import Ġjava . io .* Ċ import Ġjava . util .* Ċ Ċ class ĠNbt Compound ( name : ĠString ?, Ġtags : ĠIterable < N bt Tag > Ġ= Ġempty List ()) Ġ: ĠNbt Tag ( name ), ĠIterable < N bt Tag > Ġ{ ĊĠĠĠ Ġoverride Ġval Ġtag Type Ġ= ĠNbt Tag Type . COMP O UND ĊĠĠĠ Ġoverride Ġval Ġhas Value Ġ= Ġfalse ĊĠĠĠ Ġoverride Ġval Ġcodec Ġ= ĠCodec ĊĊĠĠĠ Ġprivate Ġval Ġtags : ĠMutable Map < String , ĠNbt Tag > Ġ= Ġmutable Map Of () ĊĊĠĠĠ Ġinit Ġ{ ĊĠĠĠĠĠĠĠ Ġtags . forEach Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġadd ( it ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġadd ( tag : ĠNbt Tag ) Ġ{ ĊĠĠĠĠĠĠĠ Ġrequire ( tag Ġ!= Ġthis ) Ġ{ Ġ" Can 't Ġadd Ġcompound Ġtag Ġto Ġitself " Ġ} ĊĠĠĠĠĠĠĠ Ġrequire ( tag . parent Ġ== Ġnull ) Ġ{ Ġ" A Ġtag Ġmay Ġonly Ġbe Ġadded Ġto Ġa Ġsingle Ġcompound / list Ġat Ġa Ġtime " Ġ} ĊĠĠĠĠĠĠĠ Ġval Ġname Ġ= Ġrequire NotNull ( tag . name ) Ġ{ Ġ" Can 't Ġadd Ġname less Ġtag Ġto Ġcompound " Ġ} ĊĠĠĠĠĠĠĠ Ġtags [ name ] Ġ= Ġtag ĊĠĠĠĠĠĠĠ Ġtag . parent Ġ= Ġthis ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġadd Range ( tags : ĠIterable < N bt Tag >) Ġ{ ĊĠĠĠĠĠĠĠ Ġtags . forEach Ġ{ Ġadd ( it ) Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġremove ( tag : ĠNbt Tag ): ĠBoolean Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġremoved Ġ= Ġtags . remove ( tag . name ) Ġ?: Ġreturn Ġfalse ĊĠĠĠĠĠĠĠ Ġremoved . parent Ġ= Ġnull ĊĠĠĠĠĠĠĠ Ġreturn Ġtrue ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġclear () Ġ{ ĊĠĠĠĠĠĠĠ Ġthis . forEach Ġ{ Ġit . parent Ġ= Ġnull Ġ} ĊĠĠĠĠĠĠĠ Ġtags . clear () ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġcontains ( tag : ĠNbt Tag ): ĠBoolean Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn Ġtags . contains Value ( tag ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġcontains ( key : ĠString ): ĠBoolean Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn Ġtags . containsKey ( key ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġval Ġsize : ĠInt ĊĠĠĠĠĠĠĠ Ġget () Ġ= Ġtags . size ĊĊĠĠĠ Ġoperator Ġfun Ġget ( tagName : ĠString ): ĠNbt Tag ? Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn Ġtags [ tagName ] ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġdeep Clone (): ĠNbt Tag Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġcopy Ġ= ĠNbt Compound ( name ) ĊĠĠĠĠĠĠĠ Ġtags . values . forEach Ġ{ Ġcopy . add ( it . deep Clone ()) Ġ} ĊĠĠĠĠĠĠĠ Ġreturn Ġcopy ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġiterator (): ĠIterator < N bt Tag > Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn Ġtags . values . iterator () ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġpretty Print ( sb : ĠStringBuilder , Ġindent Str : ĠString , Ġindent Level : ĠInt ) Ġ{ ĊĠĠĠĠĠĠĠ Ġfor Ġ( i Ġin Ġ 0 Ġuntil Ġindent Level ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġsb . append ( indent Str ) ĊĠĠĠĠĠĠĠ Ġsb . append ( tag Type . not ch ian Name ) ĊĠĠĠĠĠĠĠ Ġsb . append ("( \" $ name \") ") ĊĠĠĠĠĠĠĠ Ġsb . append (": Ġ$ size Ġentries Ġ{ ") ĊĠĠĠĠĠĠĠ Ġif Ġ( size Ġ> Ġ 0 ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġsb . append ln () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġthis . forEach Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġit . pretty Print ( sb , Ġindent Str , Ġindent Level Ġ+ Ġ 1 ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġsb . append ln () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġfor Ġ( i Ġin Ġ 0 Ġuntil Ġindent Level ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġsb . append ( indent Str ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġsb . append (' }') ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġobject ĠCodec Ġ: ĠNbt Tag Codec () Ġ{ ĊĠĠĠĠĠĠĠ Ġoverride Ġval Ġid Ġ= Ġ 1 0 ĊĠĠĠĠĠĠĠ Ġfun Ġserialize In cluding Self ( obj : ĠNbt Compound , Ġstream : ĠData Output ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġstream . write Byte ( id ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġserialize ( obj , Ġstream ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġoverride Ġfun Ġserialize ( obj : ĠAny , Ġstream : ĠData Output ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( obj Ġ! is ĠNbt Compound ) Ġthrow ĠIllegalArgumentException () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġstream . write Byte ( N bt Compound . Codec . id ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġstream . write UTF ( obj . name Ġ?: Ġ"") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġobj . tags . values . forEach Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġstream . write Byte ( it . codec . id ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġstream . write UTF ( it . name Ġ?: Ġ"") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġit . codec . serialize ( it , Ġstream ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġstream . write Byte ( N bt End . Codec . id ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġoverride Ġfun Ġdeserialize ( name : ĠString ?, Ġstream : ĠNbt InputStream ): ĠNbt Tag Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġchildren Ġ= ĠArrayList < N bt Tag >( 5 ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġwhile Ġ( true ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġchild Ġ= Ġstream . read Tag () Ġ?: Ġthrow ĠIllegalStateException (" Null Ġtag Ġin ĠNbt Compound ") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( child Ġis ĠNbt End ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġbreak ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġchildren . add ( child ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn ĠNbt Compound ( name , Ġchildren ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġto Bytes (): ĠByteArray Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġbs Ġ= ĠByteArrayOutputStream () ĊĠĠĠĠĠĠĠ Ġval Ġos : ĠData Output Ġ= ĠData OutputStream ( bs ) ĊĠĠĠĠĠĠĠ ĠCodec . serialize ( this , Ġos ) ĊĠĠĠĠĠĠĠ Ġreturn Ġbs . toByteArray () ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġcompanion Ġobject Ġ{ ĊĠĠĠĠĠĠĠ Ġfun Ġdeserialize ( stream : ĠInputStream ): ĠNbt Compound Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġos : ĠData Input Ġ= ĠData InputStream ( stream ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn ĠCodec . deserialize ( N bt InputStream ( os )) Ġas ĠNbt Compound ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} Ċ } Ċ