package Ġcom . mine in aby ss . mob zy . registration Ċ Ċ import Ġcom . mine in aby ss . mob zy . api . nms . aliases . NM SE ntity Ċ import Ġcom . mine in aby ss . mob zy . api . nms . aliases . NM SE ntity Type Ċ import Ġcom . mine in aby ss . mob zy . api . nms . aliases . N MS World Ċ import Ġcom . mine in aby ss . mob zy . api . nms . entity . key Name Ċ import Ġcom . mine in aby ss . mob zy . api . nms . type injection .* Ċ import Ġcom . mine in aby ss . mob zy . ecs . components . initialization . Mob Attributes Ċ import Ġcom . mine in aby ss . mob zy . mo bs . Mob Type Ċ import Ġcom . mine in aby ss . mob zy . mo bs . types .* Ċ import Ġcom . mine in aby ss . mob zy . mo bs . types . NPC Ċ import Ġnet . minecraft . server . v 1 _ 1 6 _ R 2 .* Ċ import Ġsun . misc . Unsafe Ċ import Ġjava . lang . reflect . Field Ċ Ċ /** Ċ Ġ* Ġ@ property Ġtypes ĠUsed Ġfor Ġgetting Ġa ĠMob Type Ġfrom Ġa ĠString , Ġwhich Ġmakes Ġit Ġeasier Ġto Ġaccess Ġfrom Ġ[ Mob Type ] Ċ Ġ* Ġ@ property Ġtemplates ĠA Ġmap Ġof Ġmob Ġ[ Entity Types . mob Name ] s Ġto Ġ[ Mob Type ] s . Ċ Ġ*/ Ċ @ Suppress (" Object PropertyName ") Ċ object ĠMob zy Type Registry Ġ{ ĊĠĠĠ Ġval Ġtype Names Ġget () Ġ= Ġ_ types . keys . toList () ĊĠĠĠ Ġprivate Ġval Ġ_ types : ĠMutable Map < String , ĠN M SE ntity Type <* >> Ġ= Ġmutable Map Of () ĊĊĠĠĠ Ġ/** ĠGets Ġa Ġmob 's Ġ[ Entity Types ] Ġfrom Ġa ĠString Ġif Ġit Ġis Ġregistered Ġwith Ġthe Ġplugin , Ġotherwise Ġthrows Ġan Ġ[ IllegalArgumentException ] Ġ*/ ĊĠĠĠ Ġoperator Ġfun Ġget ( name : ĠString ): ĠN M SE ntity Type < *> Ġ= Ġ_ types [ name . to Entity TypeName ()] ĊĠĠĠĠĠĠĠ Ġ?: Ġerror (" Mob Ġtype Ġ${ name . to Entity TypeName ()} Ġnot Ġfound , Ġonly Ġknow Ġ$ type Names ") ĊĊĠĠĠ Ġoperator Ġfun Ġcontains ( name : ĠString ) Ġ= Ġ_ types . contains ( name . to Entity TypeName ()) ĊĊĠĠĠ Ġprivate Ġval Ġcustom Attributes Ġ= Ġmutable Map Of < NM SE ntity Type <* >, ĠAttribute Provider >() ĊĊĠĠĠ Ġinternal Ġfun Ġclear () Ġ= Ġcustom Attributes . clear () ĊĊĠĠĠ Ġinternal Ġfun Ġinject Default Attributes () Ġ{ ĊĠĠĠĠĠĠĠ Ġtry Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġattribute Defaults Field Ġ= ĠAttribute Defaults :: class . java . getDeclared Field (" b ") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġattribute Defaults Field . is Accessible Ġ= Ġtrue ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġ@ Suppress (" UN CHECK ED _ CAST ") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġcurrent Attributes Ġ= ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ( attribute Defaults Field . get ( null ) Ġas ĠMap < NM SE ntity Type <* >, ĠN MS Attribute Provider >) ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġkey Names To Inject Ġ= Ġcustom Attributes . map Ġ{ Ġit . key . key Name Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġinjected Ġ= Ġcurrent Attributes ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// Ġremove Ġkeys Ġthat Ġare Ġalready Ġinjected ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. filter Keys Ġ{ Ġit . key Name Ġ! in Ġkey Names To Inject Ġ} Ġ+ Ġcustom Attributes ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġunsafe Field : ĠField Ġ= ĠUnsafe :: class . java . getDeclared Field (" the Unsafe ") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġunsafe Field . is Accessible Ġ= Ġtrue ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġunsafe Ġ= Ġunsafe Field . get ( null ) Ġas ĠUnsafe ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġstatic Field Base Ġ= Ġunsafe . static Field Base ( attribute Defaults Field ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġstatic Field Offset Ġ= Ġunsafe . static Field Offset ( attribute Defaults Field ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġunsafe . put Object ( static Field Base , Ġstatic Field Offset , Ġinjected ) ĊĠĠĠĠĠĠĠ Ġ} Ġcatch Ġ( reason : ĠThrowable ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreason . printStackTrace () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġerror (" Failed Ġto Ġinject Ġcustom Ġattribute Ġdefaults ") ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠRegisters Ġa Ġnew Ġentity Ġwith Ġthe Ġserver Ġwith Ġextra Ġparameters Ġfor Ġwidth , Ġheight , Ġand Ġthe Ġfunction Ġfor Ġcreating Ġthe ĊĠĠĠĠ Ġ* Ġentity . ĊĠĠĠĠ Ġ* ĊĠĠĠĠ Ġ* Ġ@ see Ġinject Type ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġfun Ġregister Mob ( name : ĠString , Ġtype : ĠMob Type ): ĠEntity Types < *> Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġinit Ġ= Ġmob Base Classes [ type . base Class ] Ġ?: Ġerror (" Not Ġa Ġvalid Ġparent Ġclass : Ġ${ type . base Class }") ĊĠĠĠĠĠĠĠ Ġval Ġmob ID Ġ= Ġname . to Entity TypeName () ĊĠĠĠĠĠĠĠ Ġval Ġattributes Ġ= Ġtype . get < Mob Attributes >() Ġ?: ĠMob Attributes () ĊĠĠĠĠĠĠĠ Ġval Ġinjected : ĠN M SE ntity Type < Entity > Ġ= ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ( NM SE ntity Type Factory < Entity > Ġ{ Ġentity Type , Ġworld Ġ-> Ġinit ( entity Type , Ġworld ) Ġ}) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. builder For Creature Type ( type . creature Type ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. with Size ( attributes . width , Ġattributes . height ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. apply Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( attributes . fire Imm une ) Ġwith Fire Imm unity () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. inject Type ( mob ID , Ġextend From Ġ= Ġ" z ombie ") ĊĊĠĠĠĠĠĠĠ Ġcustom Attributes [ inject ed ] Ġ= Ġattributes . to N MS Builder (). build () ĊĠĠĠĠĠĠĠ Ġ_ types [ mob ID ] Ġ= Ġinjected ĊĠĠĠĠĠĠĠ Ġreturn Ġinjected ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġval Ġmob Base Classes Ġ= Ġmutable Map Of < String , Ġ( NM SE ntity Type <* >, ĠN MS World ) Ġ-> ĠN M SE ntity >( ĊĠĠĠĠĠĠĠ Ġ" mob zy : f lying " Ġto Ġ:: F lying Mob , Ġ// TODO Ġuse Ġproper Ġkeys ĊĠĠĠĠĠĠĠ Ġ" mob zy : host ile " Ġto Ġ:: Host ile Mob , ĊĠĠĠĠĠĠĠ Ġ" mob zy : passive " Ġto Ġ:: Pass ive Mob , ĊĠĠĠĠĠĠĠ Ġ" mob zy : fish " Ġto Ġ:: Fish Mob , ĊĠĠĠĠĠĠĠ Ġ" mob zy : npc " Ġto Ġ:: NPC , ĊĠĠĠĠĠĠĠ Ġ" mob zy : project ile " Ġto Ġ:: Projectile Entity , ĊĠĠĠ Ġ) ĊĊĠĠĠ Ġfun Ġadd Mob Base Classes ( var arg Ġclasses : ĠPair < String , Ġ( NM SE ntity Type <* >, ĠN MS World ) Ġ-> ĠN M SE ntity >) Ġ{ ĊĠĠĠĠĠĠĠ Ġmob Base Classes Ġ+= Ġclasses ĊĠĠĠ Ġ} Ċ } Ċ Ċ // TODO Ġtry Ġto Ġreduce Ġusage Ġaround Ġcode , Ġshould Ġreally Ġonly Ġbe Ġdone Ġin Ġone Ġcentral Ġplace Ċ internal Ġfun ĠString . to Entity TypeName () Ġ= Ġto LowerCase (). replace (" Ġ", Ġ"_ ") Ċ