package Ġcn . ber ber man . em eral d . dsl . item . tag Ċ Ċ import Ġcn . ber ber man . em eral d . extension . debug Ċ import Ġorg . apache . commons . lang . math . Random Utils Ċ import Ġkotlin . properties . ReadWrite Property Ċ import Ġkotlin . reflect . K Property Ċ Ċ /** Ċ Ġ* ĠModify ĠN BT ĠAttribute ĠTag . Ċ Ġ* Ġ@ author Ġber ber man Ċ Ġ*/ Ċ class ĠN BT Attribute Tag Builder Ġ: ĠN BT Tag Builder () Ġ{ Ċ ĉ /** Ċĉ Ġ* ĠAn Ġenum Ġwhich Ġlist Ġdata Ġof ĠN BT ĠName Ġshould Ġimplements Ġthis Ġinterface . Ċĉ Ġ* Ġ@ author Ġber ber man Ċĉ Ġ*/ Ċ ĉ interface ĠIN BT TagName Ġ{ Ċĉ ĉ /** Ċĉĉ Ġ* ĠGet ĠN BT Ġname Ċĉĉ Ġ* Ġ@ return Ġreturns ĠN BT Ġname Ċĉĉ Ġ*/ Ċĉ ĉ fun Ġget NBT Name (): ĠString Ċ ĉ } ĊĊĊ ĉ /** Ċĉ Ġ* ĠN BT ĠTag ĠName Ġenumeration . Ċĉ Ġ*/ Ċ ĉ internal Ġenum Ġclass ĠTag Name Ġ: ĠIN BT TagName Ġ{ Ċĉ ĉ Name , Ċĉ ĉ Type , Ċĉ ĉ Amount , Ċĉ ĉ Operation , Ċĉ ĉ UUID Least , Ċĉ ĉ UUID Most , Ċĉ ĉ Slot ; ĊĊĉ ĉ override Ġfun Ġget NBT Name () Ġ= Ġif Ġ( this Ġ== ĠType ) Ġ" AttributeName " Ġelse Ġname Ċ ĉ } ĊĊ ĉ /** Ċĉ Ġ* ĠN BT Ġmodify Ġtype Ġenumeration . Ċĉ Ġ*/ Ċ ĉ enum Ġclass ĠN BT Type ( private Ġval Ġn bt Name : ĠString ) Ġ: ĠIN BT TagName Ġ{ Ċĉ ĉ /** Ċĉĉ Ġ* Ġmodify Ġattack Damage . Ċĉĉ Ġ*/ Ċĉ ĉ Attack Damage (" attack Damage "), Ċĉ ĉ /** Ċĉĉ Ġ* Ġmodify Ġattack Speed . Ċĉĉ Ġ*/ Ċĉ ĉ Attack Speed (" attack Speed "), Ċĉ ĉ /** Ċĉĉ Ġ* modify Ġ Ġmax Health . Ċĉĉ Ġ*/ Ċĉ ĉ Max Health (" max Health "), Ċĉ ĉ /** Ċĉĉ Ġ* Ġmodify Ġmovement Speed . Ċĉĉ Ġ*/ Ċĉ ĉ Movement Speed (" movement Speed "), Ċĉ ĉ /** Ċĉĉ Ġ* Ġmodify Ġarm or . Ċĉĉ Ġ*/ Ċĉ ĉ Armor (" armor "), Ċĉ ĉ /** Ċĉĉ Ġ* Ġmodify Ġluck . Ċĉĉ Ġ*/ Ċĉ ĉ L uck (" luck "), Ċĉ ĉ /** Ċĉĉ Ġ* ĠShould Ġnever Ġbe Ġused . Ċĉĉ Ġ*/ Ċĉ ĉ Undefined (" null "); ĊĊĉ ĉ override Ġfun Ġget NBT Name () Ġ= Ġ" generic .$ nbt Name " Ċ ĉ } ĊĊ ĉ /** Ċĉ Ġ* ĠN BT Ġslot Ġenumeration . Ċĉ Ġ*/ Ċ ĉ enum Ġclass ĠSlot ( private Ġval Ġn bt Name : ĠString ) Ġ: ĠIN BT TagName Ġ{ Ċĉ ĉ /** Ċĉĉ Ġ* Ġtake Ġeffect Ġwhen Ġit 's Ġon Ġthe Ġmain Ġhand . Ċĉĉ Ġ*/ Ċĉ ĉ Main Hand (" main hand "), Ċĉ ĉ /** Ċĉĉ Ġ* Ġtake Ġeffect Ġwhen Ġit 's Ġon Ġthe Ġoff Ġhand . Ċĉĉ Ġ*/ Ċĉ ĉ Off Hand (" off hand "), Ċĉ ĉ /** Ċĉĉ Ġ* Ġtake Ġeffect Ġwhen Ġit 's Ġwe aring Ġon Ġthe Ġfeet . Ċĉĉ Ġ*/ Ċĉ ĉ Fe et (" fe et "), Ċĉ ĉ /** Ċĉĉ Ġ* Ġtake Ġeffect Ġwhen Ġit 's Ġwe aring Ġon Ġthe Ġle gs . Ċĉĉ Ġ*/ Ċĉ ĉ Le gs (" leg s "), Ċĉ ĉ /** Ċĉĉ Ġ* Ġtake Ġeffect Ġwhen Ġit 's Ġwe aring Ġon Ġthe Ġche st . Ċĉĉ Ġ*/ Ċĉ ĉ Chest (" che st "), Ċĉ ĉ /** Ċĉĉ Ġ* Ġtake Ġeffect Ġwhen Ġit 's Ġwe aring Ġon Ġthe Ġhead . Ċĉĉ Ġ*/ Ċĉ ĉ Head (" head "), Ċĉ ĉ /** Ċĉĉ Ġ* ĠShould Ġnever Ġbe Ġused . Ċĉĉ Ġ*/ Ċĉ ĉ Undefined (" null "); ĊĊĉ ĉ override Ġfun Ġget NBT Name () Ġ= Ġn bt Name Ċ ĉ } ĊĊ ĉ /** Ċĉ Ġ* ĠN BT Ġoperation Ġenumeration Ċĉ Ġ*/ Ċ ĉ enum Ġclass ĠOperation ( private Ġval Ġn bt Value : ĠShort ) Ġ{ Ċĉ ĉ /** Ċĉĉ Ġ* ĠOperation Ġ 0 : ĠAdd itive . ĠAdds Ġall Ġof Ġthe Ġmodifiers ' Ġamounts Ġto Ġthe Ġcurrent Ġvalue Ġof Ġthe Ġattribute . Ċĉĉ Ġ* ĠFor Ġexample , Ġmodifying Ġan Ġattribute Ġwith Ġ{ Amount : 2 , Operation : 0 } Ġand Ġ{ Amount : 4 , Operation : 0 } Ċĉĉ Ġ* Ġwith Ġa ĠBase Ġof Ġ 3 Ġresults Ġin Ġ 9 Ġ( 3 Ġ+ Ġ 2 Ġ+ Ġ 4 Ġ= Ġ 9 ). Ċĉĉ Ġ*/ Ċĉ ĉ Add itive ( 0 ), Ċĉ ĉ /** Ċĉĉ Ġ* ĠOperation Ġ 1 : ĠMultip lic ative . ĠMultip lies Ġthe Ġcurrent Ġvalue Ġof Ġthe Ġattribute Ġby Ġ( 1 Ġ+ Ġx ), Ġwhere Ġx Ġis Ġthe Ġsum Ġof Ġthe Ġmodifiers ' Ġamounts . Ċĉĉ Ġ* ĠFor Ġexample , Ġmodifying Ġan Ġattribute Ġwith Ġ{ Amount : 2 , Operation : 1 } Ġand Ġ{ Amount : 4 , Operation : 1 } Ċĉĉ Ġ* Ġwith Ġa ĠBase Ġof Ġ 3 Ġresults Ġin Ġ 2 1 Ġ( 3 Ġ* Ġ( 1 Ġ+ Ġ 2 Ġ+ Ġ 4 ) Ġ= Ġ 2 1 ). Ċĉĉ Ġ*/ Ċĉ ĉ Multip lic ative ( 1 ), Ċĉ ĉ /** Ċĉĉ Ġ* ĠOperation Ġ 2 : ĠMultip lic ative . ĠFor Ġevery Ġmodifier , Ġmultip lies Ġthe Ġcurrent Ġvalue Ġof Ġthe Ġattribute Ġby Ġ( 1 Ġ+ Ġx ), Ġwhere Ġx Ġis Ġthe Ġamount Ġof Ġthe Ġparticular Ġmodifier . Ċĉĉ Ġ* ĠFunctions Ġthe Ġsame Ġas ĠOperation Ġ 1 Ġif Ġthere Ġis Ġonly Ġa Ġsingle Ġmodifier Ġwith Ġoperation Ġ 1 Ġor Ġ 2 . ĠHowever , Ġfor Ġmultiple Ġmodifiers Ġit Ġwill Ġmultiply Ġthe Ġmodifiers Ġrather Ġthan Ġadding Ġthem . Ċĉĉ Ġ* ĠFor Ġexample , Ġmodifying Ġan Ġattribute Ġwith Ġ{ Amount : 2 , Operation : 2 } Ġand Ġ{ Amount : 4 , Operation : 2 } Ġwith Ġa ĠBase Ġof Ġ 3 Ġresults Ġin Ġ 4 5 Ġ( 3 Ġ* Ġ( 1 Ġ+ Ġ 2 ) Ġ* Ġ( 1 Ġ+ Ġ 4 ) Ġ= Ġ 4 5 ) Ċĉĉ Ġ*/ Ċĉ ĉ @ Deprecated (" magic Ġvalue ", ĠReplace With (" Multip lic ative ")) Ċĉ ĉ Multiple Multip lic ative ( 2 ); ĊĊĉ ĉ fun Ġget NBT Value () Ġ= Ġn bt Value Ċ ĉ } ĊĊ ĉ private Ġfun Ġset TypeName ( type : ĠN BT Type ) Ġ{ Ċĉ ĉ debug (" NBT : add ĠType :${ type . get NBT Name () }") Ċĉ ĉ nbt Tag Compound . setString (" AttributeName ", Ġtype . get NBT Name ()) Ċ ĉ } ĊĊ ĉ private Ġfun ĠString . to NBT TagName ( transformer : Ġ( String ) Ġ-> ĠString ) Ġ= Ċĉĉ ĉ transformer ( this ). let Ġ{ Ċĉĉĉ ĉ object Ġ: ĠIN BT TagName Ġ{ Ċĉĉĉĉ ĉ override Ġfun Ġget NBT Name (): ĠString Ġ= Ġit Ċĉĉĉ ĉ } Ċĉĉ ĉ } ĊĊĊ ĉ private Ġfun Ġset String ( tagName : ĠIN BT TagName , Ġvalue : ĠString ) Ġ{ Ċĉ ĉ setString ( tagName . get NBT Name (), Ġvalue ) Ċ ĉ } ĊĊ ĉ private Ġfun Ġset Int ( tagName : ĠIN BT TagName , Ġvalue : ĠInt ) Ġ{ Ċĉ ĉ setInt ( tagName . get NBT Name (), Ġvalue ) Ċ ĉ } ĊĊ ĉ private Ġfun Ġset Double ( tagName : ĠIN BT TagName , Ġvalue : ĠDouble ) Ġ{ Ċĉ ĉ set Double ( tagName . get NBT Name (), Ġvalue ) Ċ ĉ } ĊĊ ĉ private Ġfun Ġremove ( tagName : ĠIN BT TagName ) Ġ{ Ċĉ ĉ remove ( tagName . get NBT Name ()) Ċ ĉ } ĊĊ ĉ comp anion Ġobject Ġ{ Ċĉ ĉ /** Ċĉĉ Ġ* ĠDefault Ġoperation Ġvalue Ċĉĉ Ġ*/ Ċĉ ĉ val ĠDEFAULT _ OPERATION Ġ= ĠOperation . Add itive Ċĉ ĉ /** Ċĉĉ Ġ* ĠDefault Ġuuid Ġleast Ġvalue Ċĉĉ Ġ*/ Ċĉ ĉ const Ġval ĠDEFAULT _ UUID _ LE AST Ġ= Ġ 1 0 0 0 0 Ċĉ ĉ /** Ċĉĉ Ġ* ĠDefault Ġuuid Ġmost Ġvalue Ċĉĉ Ġ*/ Ċĉ ĉ const Ġval ĠDEFAULT _ UUID _ MO ST Ġ= Ġ 3 0 0 0 0 Ċ ĉ } ĊĊ ĉ // dsl Ġstart Ċ ĉ /** Ċĉ Ġ* ĠWhich ĠN BT ĠTag Ġtype Ġyou Ġwant Ġto Ġmodify . Ċĉ Ġ*/ Ċ ĉ var Ġtype : ĠN BT Type Ġby ĠN BT Attribute Tag Delegate ( NBT Type . Undefined , ĠTag Name . Type ) Ċ ĉ /** Ċĉ Ġ* ĠWhich Ġslot Ġwhere Ġthe Ġitem Ġin Ġthis ĠN BT ĠTag Ġtake Ġeffect . Ċĉ Ġ*/ Ċ ĉ var Ġslot : ĠSlot Ġby ĠN BT Attribute Tag Delegate ( Slot . Undefined , ĠTag Name . Slot ) Ċ ĉ /** Ċĉ Ġ* ĠThe Ġvalue Ġof ĠN BT ĠTag Ċĉ Ġ*/ Ċ ĉ var Ġamount : ĠDouble Ġby ĠN BT Attribute Tag Delegate (. 0 , ĠTag Name . Amount ) Ċ ĉ /** Ċĉ Ġ* ĠN BT Ġoperation Ġtype , Ġsee Ġ[ Operation ] Ċĉ Ġ*/ Ċ ĉ var Ġoperation : ĠOperation Ġby ĠN BT Attribute Tag Delegate ( DEFAULT _ OPERATION , ĠTag Name . Operation ) Ċ ĉ /** Ċĉ Ġ* Ġuuid Least Ġvalue . Ċĉ Ġ*/ Ċ ĉ var Ġuuid Least : ĠInt Ġby ĠN BT Attribute Tag Delegate ( DEFAULT _ UUID _ LE AST , ĠTag Name . UUID Least ) Ċ ĉ /** Ċĉ Ġ* Ġuuid Most Ġvalue . Ċĉ Ġ*/ Ċ ĉ var Ġuuid Most : ĠInt Ġby ĠN BT Attribute Tag Delegate ( DEFAULT _ UUID _ MO ST , ĠTag Name . UUID Most ) ĊĊ ĉ /** Ċĉ Ġ* Ġtag Ġname Ċĉ Ġ*/ Ċ ĉ var Ġname : ĠString Ġby ĠN BT Attribute Tag Delegate (" random ", ĠTag Name . Name ) Ċ ĉ // dsl Ġend ĊĊ ĉ private Ġinner Ġclass ĠN BT Attribute Tag Delegate < T >( initial Value : ĠT , Ġprivate Ġval ĠtagName : ĠTag Name ) Ċĉ ĉ : ĠRead Write Property < Any ?, ĠT > Ġ{ Ċĉ ĉ internal Ġvar Ġfield Ġ= Ġinitial Value ĊĊĉ ĉ init Ġ{ Ċĉĉ ĉ // force Ġinitialize Ċĉĉ ĉ setValue ( null , Ġthis :: field , Ġfield ) Ċĉ ĉ } ĊĊĉ ĉ override Ġfun ĠgetValue ( this Ref : ĠAny ?, Ġproperty : ĠK Property <* >) Ġ= Ġfield ĊĊĉ ĉ override Ġfun ĠsetValue ( this Ref : ĠAny ?, Ġproperty : ĠK Property <* >, Ġvalue : ĠT ) Ġ{ Ċĉĉ ĉ remove ( tagName ) Ċĉĉ ĉ when Ġ( value ) Ġ{ Ċĉĉĉ ĉ is ĠString ĠĠĠ Ġ-> Ġset String ( tagName , Ġif Ġ( value Ġ== Ġ" random ") Ċĉĉĉĉ ĉ Random Utils . next Double (). toString () Ġelse Ġvalue ) Ċĉĉĉ ĉ is ĠInt ĠĠĠĠĠĠ Ġ-> Ġset Int ( tagName , Ġvalue ) Ċĉĉĉ ĉ is ĠDouble ĠĠĠ Ġ-> Ġset Double ( tagName , Ġvalue ) Ċĉĉĉ ĉ is ĠOperation Ġ-> Ġset Int ( tagName , Ġvalue . get NBT Value (). toInt ()) Ċĉĉĉ ĉ is ĠN BT Type ĠĠ Ġ-> Ġ{ Ċĉĉĉĉ ĉ set TypeName ( value ) Ċ // ĉĉĉĉĉ ĉ setString ( TagName . Name , Ġ( value . get NBT Name () Ġ+ ĠRandom Utils . next Double ())) Ċĉĉĉ ĉ } Ċĉĉĉ ĉ is ĠSlot ĠĠĠĠĠ Ġ-> Ġset String ( tagName , Ġvalue . get NBT Name ()) Ċĉĉĉ ĉ else ĠĠĠĠĠĠĠĠ Ġ-> Ġthrow ĠIllegalStateException (" That 's Ġimpossible .") Ċĉĉ ĉ } Ċĉĉ ĉ field Ġ= Ġvalue Ċĉ ĉ } ĊĊ ĉ } Ċ }