package Ġme . ar asp le . mc . tr menu . modules . script Ċ Ċ import Ġio . izz el . tab ool ib . internal . apache . lang 3 . math . Number Utils Ċ import Ġio . izz el . tab ool ib . util . Strings Ċ import Ġio . izz el . tab ool ib . util . lite . Sounds Ċ import Ġme . ar asp le . mc . tr menu . api . Ext ends . get Menu Session Ċ import Ġme . ar asp le . mc . tr menu . api . events . Menu Close Event Ċ import Ġme . ar asp le . mc . tr menu . modules . expression . Expressions Ċ import Ġme . ar asp le . mc . tr menu . utils . Ass ist Ċ import Ġme . ar asp le . mc . tr menu . utils . Ms ger Ċ import Ġorg . bukkit . Bu kkit Ċ import Ġorg . bukkit . entity . Player Ċ import Ġorg . bukkit . inventory . ItemStack Ċ import Ġjava . util . function . Function Ċ import Ġjava . util . regex . Pattern Ċ import Ġjavax . script .* Ċ Ċ /** Ċ Ġ* Ġ@ author ĠAr asp le Ċ Ġ* Ġ@ date Ġ 2 0 2 0 / 3 / 2 4 Ġ 1 0 : 5 0 Ċ Ġ*/ Ċ object ĠScripts Ġ{ ĊĊĠĠĠ Ġprivate Ġval Ġbindings Ġ= ĠSimple Bindings () ĊĠĠĠ Ġprivate Ġval Ġengine : ĠScript Engine Ġ= ĠScript Engine Manager ( null ). get Engine ByName (" n ash orn ") ĊĠĠĠ Ġprivate Ġval Ġcompiled Scripts Ġ= Ġmutable Map Of < String , ĠComp iled Script >() ĊĊĠĠĠ Ġconst Ġval Ġfunction Ġ= Ġ" r wp " ĊĠĠĠ Ġval Ġargument Pattern : ĠPattern Ġ= ĠPattern . compile (" [' \"] ? ([ \$ ]? \\ { (.* ?) }) [' \"] ?") ĊĠĠĠ Ġval Ġplaceholder Pattern : ĠPattern Ġ= ĠPattern . compile (" [' \"] ? [$] ? (% .*? %) [' \"] ?") ĊĠĠĠ Ġval Ġbracket Placeholder Pattern : ĠPattern Ġ= ĠPattern . compile (" [{ ]( [^ {} ]+ )[ }] ") ĊĊĠĠĠ Ġinit Ġ{ ĊĠĠĠĠĠĠĠ Ġbindings [" bukkit Server "] Ġ= ĠBu kkit . getServer () ĊĠĠĠĠĠĠĠ Ġbindings [" Tr Utils "] Ġ= ĠAss ist . INSTANCE ĊĠĠĠĠĠĠĠ Ġbindings [" utils "] Ġ= ĠAss ist . INSTANCE ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġexpression ( player : ĠPlayer , Ġexpression : ĠString ) Ġ= Ġscript ( player , ĠExpress ions . parse Expression ( expression ), Ġbindings , Ġtrue ) ĊĊĠĠĠ Ġfun Ġscript ( player : ĠPlayer , Ġscript : ĠString , Ġcache : ĠBoolean ) Ġ= Ġscript ( player , Ġscript , Ġbindings , Ġcache ) ĊĊĠĠĠ Ġfun Ġscript ( player : ĠPlayer , Ġscript : ĠString , Ġbindings : ĠSimple Bindings , Ġcache : ĠBoolean ) Ġ= Ġscript ( player , Ġscript , Ġbindings , Ġfalse , Ġcache ) ĊĊĠĠĠ Ġfun Ġscript ( player : ĠPlayer , Ġscript : ĠString , Ġbindings : ĠSimple Bindings , Ġsilent : ĠBoolean , Ġcache : ĠBoolean ) Ġ= Ġeval ( player , Ġscript , Ġcompile ( script , Ġcache ), Ġbindings , Ġsilent ) ĊĊĠĠĠ Ġprivate Ġfun Ġcompile ( content : ĠString , Ġcache : ĠBoolean ): ĠComp iled Script ? Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn Ġtry Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( cache ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcompiled Scripts . compute If Absent ( content ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġscript Ġ= Ġtranslate ( content ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠMs ger . debug (" PRE - COMPILE - SCRIPT ", Ġcontent , Ġscript ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ( engine Ġas ĠComp il able ). compile ( script ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġ( engine Ġas ĠComp il able ). compile ( content ) ĊĠĠĠĠĠĠĠ Ġ} Ġcatch Ġ( e : ĠThrowable ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġnull ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġeval ( player : ĠPlayer , Ġraw Script : ĠString , Ġscript : ĠComp iled Script ?, Ġbindings : ĠSimple Bindings , Ġsilent : ĠBoolean ): ĠResult Ġ= Ġtry Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġcontent Ġ= ĠSimple Script Context () ĊĠĠĠĠĠĠĠ Ġcontent . set Bindings ( Simple Bindings ( bindings ). let Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġit [" player "] Ġ= Ġplayer ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn @ let Ġit ĊĠĠĠĠĠĠĠ Ġ}, ĠScript Context . ENGINE _ SCOPE ) ĊĠĠĠĠĠĠĠ Ġcontent . setAttribute ( function , ĠFunction < String , ĠString > Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ ĠMs ger . replace ( player , Ġit ) ĊĠĠĠĠĠĠĠ Ġ}, ĠScript Context . ENGINE _ SCOPE ) ĊĠĠĠĠĠĠĠ ĠResult ( script !!. eval ( content )). let Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn @ let Ġit ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} Ġcatch Ġ( e : ĠThrowable ) Ġ{ ĊĠĠĠĠĠĠĠ Ġif Ġ(! silent ) ĠMs ger . print Errors (" SCRIPT ", Ġe , Ġraw Script ) ĊĠĠĠĠĠĠĠ Ġcancel ( player ) ĊĠĠĠĠĠĠĠ ĠResult () ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġcancel ( player : ĠPlayer ) Ġ{ ĊĠĠĠĠĠĠĠ Ġplayer . get Menu Session (). menu ?. let Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġit . close ( player , Ġ 0 , ĠMenu Close Event . Reason . ERROR , Ġtrue , Ġsilent Ġ= Ġfalse ) ĊĠĠĠĠĠĠĠĠĠĠĠ ĠSounds . BLOCK _ AN V IL _ BREAK . play ( player ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġtranslate ( string : ĠString ): ĠString Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġbuffer Ġ= ĠStringBuffer ( string . length ) ĊĠĠĠĠĠĠĠ Ġval Ġcontent Ġ= Ġplaceholder Pattern . matcher ( string ). let Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġwhile Ġ( it . find ()) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġfind Ġ= Ġit . group ( 1 ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġgroup Ġ= ĠStrings . replace With Order ( find , Ġ* get Args ( find )) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġit . append Replacement ( buffer , Ġ"$ function (' ${ escape ( group )} ') ") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġit . append Tail ( buffer ). toString () ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġval Ġbuffer 2 Ġ= ĠStringBuffer ( content . length ) ĊĠĠĠĠĠĠĠ Ġreturn Ġargument Pattern . matcher ( content ). let Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġwhile Ġ( it . find ()) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġgroup Ġ= Ġit . group ( 2 ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġfind Ġ= Ġit . group ( 1 ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġis Function Ġ= Ġfind . startsWith ("$ ") Ċ // ĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġprintln (" Group : Ġ$ group \ n Find : Ġ$ find Ġ--- Ġ$ isFunction ") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ(! isFunction Ġ&& Ġ! group . startsWith (" meta ") Ġ&& Ġ! group . startsWith (" data ") Ġ&& Ġ! group . startsWith (" input ") Ġ&& Ġ! Number Utils . is Par s able ( group ) Ġ&& Ġgroup Ġ!= Ġ" reason ") Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcontinue ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġit . append Replacement ( buffer 2 , Ġ"$ function (' ${ escape ( find )} ') ") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġit . append Tail ( buffer 2 ) ĊĠĠĠĠĠĠĠ Ġ}. toString () ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġget Args ( content : ĠString ): ĠArray < String > Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġreplaces Ġ= Ġmutable ListOf < String >() ĊĠĠĠĠĠĠĠ Ġval Ġbr acker Ġ= Ġbracket Placeholder Pattern . matcher ( content ) ĊĠĠĠĠĠĠĠ Ġvar Ġsize Ġ= Ġ- 1 ĊĠĠĠĠĠĠĠ Ġwhile Ġ( br acker . find ()) Ġsize Ġ= Ġsize . coerce At Least ( Number Utils . toInt ( br acker . group (). remove Sur rounding ("{ ", Ġ"} "), Ġ- 1 )) ĊĠĠĠĠĠĠĠ Ġfor Ġ( i Ġin Ġ 0 .. size ) Ġreplaces . add ("{ tr menu _ args _$ i }") ĊĠĠĠĠĠĠĠ Ġreturn Ġreplaces . to Typed Array () ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġescape ( string : ĠString ): ĠString Ġ= Ġescape Math ( ĊĠĠĠĠĠĠĠ Ġstring ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. replace ("{ ", Ġ"\\ { ") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. replace (" }", Ġ"\\ }") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. replace ("[ ", Ġ"\\ [ ") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. replace (" ]", Ġ"\\ ]") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. replace (" (", Ġ"\\ (" ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. replace (" )", Ġ"\\ )") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. replace ("$ ", Ġ"\\ $ ") ĊĠĠĠ Ġ) ĊĊĠĠĠ Ġprivate Ġfun Ġescape Math ( string : ĠString ): ĠString Ġ= Ġstring ĊĠĠĠĠĠĠĠ Ġ. replace ("+ ", Ġ"\\ +") ĊĠĠĠĠĠĠĠ Ġ. replace ("* ", Ġ"\\ * ") ĊĊĠĠĠ Ġclass ĠResult ( private Ġval Ġresult : ĠAny ?, Ġprivate Ġval Ġthrowable : ĠThrowable ?) Ġ{ ĊĊĠĠĠĠĠĠĠ Ġconstructor ( result : ĠAny ?) Ġ: Ġthis ( result , Ġnull ) ĊĠĠĠĠĠĠĠ Ġconstructor () Ġ: Ġthis ( null , Ġnull ) ĊĊĠĠĠĠĠĠĠ Ġfun Ġis Suc ceed () Ġ= Ġthrowable Ġ== Ġnull Ġ&& Ġresult Ġ!= Ġnull ĊĊĠĠĠĠĠĠĠ Ġfun Ġas Boolean () Ġ= Ġif Ġ( result Ġis ĠBoolean ) Ġresult Ġelse Ġresult . toString (). equals (" yes ", Ġtrue ) ĊĊĠĠĠĠĠĠĠ Ġfun Ġas String () Ġ= Ġresult . toString () ĊĊĠĠĠĠĠĠĠ Ġfun Ġas ItemStack () Ġ= Ġif Ġ( result Ġis ĠItemStack ) Ġresult Ġelse Ġnull ĊĊĠĠĠĠĠĠĠ Ġfun Ġas Collection () Ġ= Ġif Ġ( result Ġis ĠCollection <* >) Ġresult Ġelse Ġnull ĊĊĠĠĠ Ġ} Ċ Ċ }