/* Ċ Ġ* ĠThe ĠMIT ĠLicense Ġ( MIT ) Ċ Ġ* Ċ Ġ* ĠCopyright Ġ( c ) Ġ 2 0 1 6 - 2 0 1 8 : Ċ Ġ* Ġ ĉ Un a ĠTh omp son Ġ( un as cri bed ), Ċ Ġ* Ġ ĉ Is aac ĠE lling son Ġ( F alk re on ), Ċ Ġ* Ġ ĉ J am ie ĠM ans field Ġ( jam ier ocks ), Ċ Ġ* Ġ ĉ Alex ĠP one bs he k Ġ( cap it alth ree ), Ċ Ġ* Ġ ĉ and Ġcontributors Ċ Ġ* Ċ Ġ* ĠPermission Ġis Ġhereby Ġgranted , Ġfree Ġof Ġcharge , Ġto Ġany Ġperson Ġobtaining Ġa Ġcopy Ġof Ċ Ġ* Ġthis Ġsoftware Ġand Ġassociated Ġdocumentation Ġfiles Ġ( the Ġ" Software "), Ġto Ġdeal Ġin Ċ Ġ* Ġthe ĠSoftware Ġwithout Ġrestriction , Ġincluding Ġwithout Ġlimitation Ġthe Ġrights Ġto Ċ Ġ* Ġuse , Ġcopy , Ġmodify , Ġmerge , Ġpublish , Ġdistribute , Ġsublicense , Ġand / or Ġsell Ġcopies Ċ Ġ* Ġof Ġthe ĠSoftware , Ġand Ġto Ġpermit Ġpersons Ġto Ġwhom Ġthe ĠSoftware Ġis Ġfurnished Ġto Ġdo Ċ Ġ* Ġso , Ġsubject Ġto Ġthe Ġfollowing Ġconditions : Ċ Ġ* Ċ Ġ* ĠThe Ġabove Ġcopyright Ġnotice Ġand Ġthis Ġpermission Ġnotice Ġshall Ġbe Ġincluded Ġin Ġall Ċ Ġ* Ġcopies Ġor Ġsubstantial Ġportions Ġof Ġthe ĠSoftware . Ċ Ġ* Ċ Ġ* ĠTHE ĠSOFTWARE ĠIS ĠPROVIDED Ġ" AS ĠIS ", ĠWITHOUT ĠWARRANTY ĠOF ĠANY ĠKIND , ĠEXPRESS ĠOR Ċ Ġ* ĠIMPLIED , ĠINCLUDING ĠBUT ĠNOT ĠLIMITED ĠTO ĠTHE ĠWARRANTIES ĠOF ĠMERCHANTABILITY , Ċ Ġ* ĠFITNESS ĠFOR ĠA ĠPARTICULAR ĠPURPOSE ĠAND ĠNONINFRINGEMENT . ĠIN ĠNO ĠEVENT ĠSHALL ĠTHE Ċ Ġ* ĠAUTHORS ĠOR ĠCOPYRIGHT ĠHOLDERS ĠBE ĠLIABLE ĠFOR ĠANY ĠCLAIM , ĠDAMAGES ĠOR ĠOTHER Ċ Ġ* ĠLIABILITY , ĠWHETHER ĠIN ĠAN ĠACTION ĠOF ĠCONTRACT , ĠTORT ĠOR ĠOTHERWISE , ĠARISING ĠFROM , Ċ Ġ* ĠOUT ĠOF ĠOR ĠIN ĠCONNECTION ĠWITH ĠTHE ĠSOFTWARE ĠOR ĠTHE ĠUSE ĠOR ĠOTHER ĠDEALINGS ĠIN ĠTHE Ċ Ġ* ĠSOFTWARE . Ċ Ġ*/ Ċ Ċ package Ġcom . ely trade v . concrete . rules engine ĊĊ Ċ import Ġcom . ely trade v . concrete . common . Either Ċ import Ġnet . minecraftforge . fml . common . Mod Ċ import Ġnet . minecraftforge . fml . common . event . F ML Pre Initialization Event Ċ import Ġnet . minecraftforge . fml . common . event . F ML Server Starting Event Ċ Ċ import Ġjava . util . function . Predicate ĊĊ Ċ private Ġval ĠADD NUM _ SLOT _ ID Ġ= Ġ 0 Ċ Ċ internal Ġclass ĠExample Rules Engine Ġ: ĠRules Engine < Example Rules Engine . Example Context >() Ġ{ ĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* Ġdomain Pred icates Ġshould Ġreturn Ġa Ġmap Ġof Ġprefix Ġcharacters Ġto Ġthe Ġcorresponding Ġpredicate Ġparsers Ġfor Ġyour ĊĠĠĠĠ Ġ* Ġpredicates . Ġ ĠPredicate Ġparsers Ġtake Ġthe Ġremainder Ġof Ġthe Ġstring Ġ( after Ġremoving Ġthe Ġprefix Ġchar ) Ġand Ġreturn ĊĠĠĠĠ Ġ* Ġeither Ġa Ġpredicate , Ġor Ġa Ġstring Ġerror Ġmessage . ĊĠĠĠĠ Ġ* ĊĠĠĠĠ Ġ* Ġ@ return Ġthe Ġmap ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġoverride Ġfun Ġget Domain Pred icates () Ġ= Ġdomain Pred icates ĊĠĠĠ Ġprivate Ġval Ġdomain Pred icates Ġ= Ġmap Of < Char , Ġ( String ) Ġ-> ĠEither < Predicate < Example Context >, ĠString >>( ĊĠĠĠĠĠĠĠ Ġ'/' Ġto Ġ{ s : ĠString Ġ-> Ċ // ĠĠĠĠ ĠThis Ġis Ġan Ġexample Ġof Ġa Ġpredicate Ġparser . Ġ ĠNote Ġthat Ġthe Ġpredicate Ġparser Ġreceives Ġa Ġstring Ġwith Ġthe Ġprefix Ċ // ĠĠĠĠ Ġcharacter Ġalready Ġremoved . ĊĠĠĠ Ġs . toInt OrNull () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ? . let Ġ{ ĠEither . left < Predicate < Example Context >, ĠString >( Div is ibility Predicate ( it )) Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ?: Ġ ĠEither . right (" Invalid Ġinteger : Ġ\"$ s \" ") ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ) ĊĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* Ġ=== THIS ĠFUNCTION ĠIS ĠOPTIONAL === ĊĠĠĠĠ Ġ* ĠThis Ġis Ġthe Ġstructure Ġof Ġthe Ġdefault Ġpredicate Ġparser , Ġwhich , Ġif Ġdefined , Ġis Ġused Ġfor Ġany Ġpredicates Ġthat Ġdo Ġnot ĊĠĠĠĠ Ġ* Ġhave Ġa Ġrecognized Ġprefix Ġcharacter . Ġ ĠNote Ġthe Ġtype Ġsignature Ġis Ġthe Ġsame Ġas Ġindividual Ġpredicate Ġparsers . ĊĠĠĠĠ Ġ* ĊĠĠĠĠ Ġ* Ġ@ param Ġstr Ġpredicate Ġstring ĊĠĠĠĠ Ġ* Ġ@ return ĠEither Ġpredicate , Ġor Ġstring Ġerror ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġoverride Ġfun Ġdefault Predicate ( str : ĠString ): ĠEither < Predicate < Example Context >, ĠString > Ġ= ĊĠĠĠĠĠĠĠ ĠEither . right (" This Ġrules Ġlanguage Ġdoesn 't Ġsupport Ġun - prefix ed Ġpredicates , Ġbut Ġit Ġcan Ġif Ġyou Ġchange Ġthis Ġfunction !") ĊĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠSet Ġof Ġslot Ġids Ġfor Ġeffects . Ġ ĠWh enever Ġrules Ġare Ġevaluated , Ġonly Ġthe Ġfirst Ġmatching Ġeffect Ġwill Ġbe Ġused Ġfor Ġeach ĊĠĠĠĠ Ġ* Ġof Ġthese Ġslots . ĊĠĠĠĠ Ġ* ĊĠĠĠĠ Ġ* Ġ@ return Ġset ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġoverride Ġfun Ġget Effect Slots () Ġ= Ġeffect Slots ĊĠĠĠ Ġprivate Ġval Ġeffect Slots Ġ= Ġset Of ( ADD NUM _ SLOT _ ID ) ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠParser Ġfor Ġeffects . Ġ ĠNote Ġthat Ġyou Ġare Ġresponsible Ġfor Ġthe Ġentire Ġeffect Ġparsing , Ġso Ġif Ġyou Ġwant Ġa Ġprefix - based ĊĠĠĠĠ Ġ* Ġapproach Ġthat 's Ġon Ġyou . Ġ ĠThe Ġparser Ġcan Ġreturn Ġmultiple Ġeffects , Ġthe Ġmost Ġobvious Ġexample Ġbeing Ġa Ġ" finalize " ĊĠĠĠĠ Ġ* Ġeffect Ġto Ġfill Ġall Ġremaining Ġeffect Ġslots Ġwith Ġno - ops Ġ( as Ġl ing ering Ġlo ot Ġhas ). Ġ ĠThe Ġparser Ġcan Ġreturn Ġno Ġeffects , ĊĠĠĠĠ Ġ* Ġbut Ġthat Ġprobably Ġwouldn 't Ġmake Ġsense . ĊĠĠĠĠ Ġ* ĊĠĠĠĠ Ġ* Ġ@ param Ġs Ġstring Ġto Ġparse Ġfor Ġeffects ĊĠĠĠĠ Ġ* Ġ@ return ĠEither Ġany Ġnumber Ġof Ġeffects , Ġor Ġa ĠString Ġerror ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġoverride Ġfun Ġparse Effect ( s : ĠString ): ĠEither < Iterable < Effect < Example Context >>, ĠString > Ġ= Ġs . toInt OrNull () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ? . let { Either . left < Iterable < Effect < Example Context >>, ĠString >( set Of ( Add Number Effect ( Integer . parseInt ( s )))) } ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ?: Either . right (" Invalid Ġinteger : Ġ\"$ s \" ") ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠThe Ġevaluation Ġcontext Ġis Ġthe Ġtype Ġparameter Ġfor Ġthe Ġabstract Ġrules Ġengine Ġas Ġwell Ġas Ġall Ġeffects Ġand Ġpredicates . ĊĠĠĠĠ Ġ* ĠPopulate Ġit Ġwith Ġany Ġreferences Ġthat Ġyour Ġpredicates Ġwill Ġneed Ġto Ġevaluate Ġon , Ġand Ġthat Ġyour Ġeffects Ġwill Ġneed Ġto ĊĠĠĠĠ Ġ* Ġdo Ġtheir Ġthing . Ġ ĠA Ġgiven Ġinstance Ġshould Ġonly Ġbe Ġused Ġonce . Ġ ĠWrite Ġin Ġthe Ġcontext , Ġpass Ġit Ġto Ġact , Ġand Ġthen Ġread ĊĠĠĠĠ Ġ* Ġout Ġany Ġresults Ġyou Ġneed , Ġbut Ġdo Ġnot Ġcall Ġact Ġtwice Ġwith Ġthe Ġsame Ġinstance . ĊĠĠĠĠ Ġ* ĠNote Ġas Ġwell Ġthat Ġall Ġpredicate Ġevaluation Ġhappens Ġbefore Ġrules Ġare Ġapplied , Ġso Ġit Ġis Ġok Ġto Ġpredicate Ġon Ġthe Ġsame ĊĠĠĠĠ Ġ* Ġstate Ġthat Ġyour Ġeffects Ġaffect . ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġinternal Ġclass ĠExample Context ( var Ġthe Int : ĠInt ) Ġ: ĠEvaluation Context () ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠOur Ġpredicate , Ġwhich Ġtests Ġdiv is ibility Ġby Ġa Ġgiven Ġnumber ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġinternal Ġclass ĠDiv is ibility Predicate ( private Ġval Ġtest : ĠInt ) Ġ: ĠPredicate < Example Context > Ġ{ ĊĠĠĠĠĠĠĠ Ġoverride Ġfun Ġtest ( ctx : ĠExample Context ) Ġ= Ġctx . the Int Ġ% Ġtest Ġ== Ġ 0 ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠOur Ġeffect , Ġwhich Ġadds Ġa Ġgiven Ġnumber ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġinternal Ġclass ĠAdd Number Effect ( val Ġi : ĠInt ) Ġ: ĠEffect < Example Context > Ġ{ ĊĠĠĠĠĠĠĠ Ġ/** ĊĠĠĠĠĠĠĠĠ Ġ* Ġ@ return Ġ 0 Ġto Ġmatch Ġthe Ġslot Ġid Ġprovided Ġin Ġget Effect Slots Ġabove ĊĠĠĠĠĠĠĠĠ Ġ*/ ĊĠĠĠĠĠĠĠ Ġoverride Ġfun Ġget Slot () Ġ= ĠADD NUM _ SLOT _ ID ĊĊĠĠĠĠĠĠĠ Ġoverride Ġfun Ġaccept ( ctx : ĠExample Context ) Ġ{ ctx . the Int Ġ+= Ġi } ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* Ġ=== THIS ĠFUNCTION ĠIS ĠOPTIONAL === ĊĠĠĠĠ Ġ* Ġ@ return ĠA Ġlist Ġof Ġany Ġvariable Ġnames Ġfor Ġinteresting Ġnumbers , Ġwhich Ġcan Ġbe Ġreferenced Ġin Ġthe Ġin equality ĊĠĠĠĠ Ġ* Ġcomparison Ġoperator . Ġ ĠAny Ġcollection Ġtype Ġis Ġallowed Ġbut Ġiteration Ġorder Ġmust Ġcorrespond Ġto Ġthe Ġinteresting ĊĠĠĠĠ Ġ* Ġnumbers Ġarray . ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġoverride Ġfun Ġinteresting Number List () Ġ= Ġinteresting Numbers ĊĠĠĠ Ġprivate Ġval Ġinteresting Numbers Ġ= Ġset Of (" it ") ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* Ġ=== THIS ĠFUNCTION ĠIS ĠOPTIONAL === ĊĠĠĠĠ Ġ* Ġ@ param Ġfrom Ġsome Ġcontext ĊĠĠĠĠ Ġ* Ġ@ return Ġpopulated Ġarray Ġof Ġinteresting Ġnumbers , Ġcorresponding Ġposition ally Ġto Ġthe Ġvariable Ġnames Ġin ĊĠĠĠĠ Ġ* Ġinteresting Number List . ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġoverride Ġfun Ġgen Inter esting Numbers ( from : ĠExample Rules Engine . Example Context ): ĠDouble Array Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn Ġdouble ArrayOf ( from . the Int . toDouble ()) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* Ġ=== THIS ĠFUNCTION ĠIS ĠOPTIONAL === ĊĠĠĠĠ Ġ* Ġ@ return Ġa Ġstring Ġto Ġpopulate Ġnewly Ġgenerated Ġrules Ġfiles Ġwith Ġinstead Ġof Ġthe Ġempty Ġstring ĊĠĠĠĠ Ġ* ĠConsider Ġproviding Ġsensible Ġdefault Ġrules Ġor Ġdocumentation Ġon Ġyour Ġformat ! ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġoverride Ġfun Ġgen Default Rules () Ġ= Ġ""" ĊĠĠĠĠĠĠĠ Ġ# ĠPred icates : Ġ/ x : Ġtests Ġdiv is ibility Ġby Ġx . Ġ Ġx : Ġtests Ġdiv is ibility Ġby Ġx . ĊĠĠĠĠĠĠĠ Ġ# ĠEffect s : Ġx : Ġadds Ġx . ĊĠĠĠĠĠĠĠ Ġdiv six Ġ[ Ġ/ 2 Ġ/ 3 Ġ] ĊĠĠĠĠĠĠĠĠ 0 Ġ% div six Ġ/ 5 Ġ-> Ġ 3 0 ĊĠĠĠ Ġ""" Ċ } Ċ Ċ internal Ġclass ĠExample Mod Ġ{ ĊĠĠĠ Ġval Ġengine Ġ= ĠExample Rules Engine () ĊĊĠĠĠ Ġ@ Mod . EventHandler ĊĠĠĠ Ġfun Ġpre Init ( event : ĠF ML Pre Initialization Event ) Ġ= ĊĠĠĠĠĠĠĠ Ġ// ĠThis Ġwill Ġsave Ġthe Ġrules Ġfile Ġpath , Ġdo Ġan Ġinitial Ġload Ġof Ġthe Ġrules , Ġand Ġlog Ġthe Ġresult ĊĠĠĠĠĠĠĠ Ġengine . load Rules File ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġevent . mod Configuration Directory . resolve (" simp lem ath . rules "), ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġevent . mod Log ĊĠĠĠĠĠĠĠ Ġ) ĊĊĠĠĠ Ġ@ Mod . EventHandler ĊĠĠĠ Ġfun Ġstart ( event : ĠF ML Server Starting Event ) Ġ= ĊĠĠĠĠĠĠĠ Ġ// ĠThis Ġwill Ġgenerate Ġand Ġregister Ġa Ġsimple Ġserver Ġcommand Ġthat Ġre loads Ġour Ġrules Ġfile Ġand Ġsends Ġthe Ġresulting Ġsuccess / error Ġmessage Ġto Ġwho ever Ġran Ġthe Ġcommand ĊĠĠĠĠĠĠĠ Ġengine . register Reload Command ( event , Ġ" math reload ") ĊĊĠĠĠ Ġfun Ġsuper Fake EventHandler () Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġstarting Int Ġ= Ġ 3 ĊĠĠĠĠĠĠĠ Ġ// Ġbuild Ġand Ġpopulate Ġcontext Ġwith Ġinput Ġdata ĊĠĠĠĠĠĠĠ Ġval Ġctx Ġ= ĠExample Rules Engine . Example Context ( starting Int ) ĊĠĠĠĠĠĠĠ Ġ// Ġresolves Ġenough Ġpredicates Ġto Ġfully Ġdetermine Ġwhat Ġeffects Ġshould Ġbe Ġrun , Ġthen Ġruns Ġthem ĊĠĠĠĠĠĠĠ Ġengine . act ( ctx ) ĊĠĠĠĠĠĠĠ Ġ// Ġif Ġdesired , Ġretrieve Ġany Ġinformation Ġfrom Ġthe Ġused Ġcontext Ġgenerated Ġby Ġyour ĠEffect Ġimplementations ĊĠĠĠĠĠĠĠ Ġval Ġpost Modification Ġ= Ġctx . the Int ĊĠĠĠ Ġ} Ċ }