/* ĊĠĠ ĠCopyright Ġ 2 0 2 1 Ġillum inator 3 ĊĊĠĠ ĠLicensed Ġunder Ġthe ĠApache ĠLicense , ĠVersion Ġ 2 . 0 Ġ( the Ġ" License "); ĊĠĠ Ġyou Ġmay Ġnot Ġuse Ġthis Ġfile Ġexcept Ġin Ġcompliance Ġwith Ġthe ĠLicense . ĊĠĠ ĠYou Ġmay Ġobtain Ġa Ġcopy Ġof Ġthe ĠLicense Ġat ĊĊĠĠĠĠĠĠ Ġhttp :// www . apache . org / licenses / LICENSE - 2 . 0 ĊĊĠĠ ĠUnless Ġrequired Ġby Ġapplicable Ġlaw Ġor Ġagreed Ġto Ġin Ġwriting , Ġsoftware ĊĠĠ Ġdistributed Ġunder Ġthe ĠLicense Ġis Ġdistributed Ġon Ġan Ġ" AS ĠIS " ĠBASIS , ĊĠĠ ĠWITHOUT ĠWARRANTIES ĠOR ĠCONDITIONS ĠOF ĠANY ĠKIND , Ġeither Ġexpress Ġor Ġimplied . ĊĠĠ ĠSee Ġthe ĠLicense Ġfor Ġthe Ġspecific Ġlanguage Ġgoverning Ġpermissions Ġand ĊĠĠ Ġlimitations Ġunder Ġthe ĠLicense . Ċ Ġ*/ Ċ Ċ package Ġme . illum inator 3 . packet lib . core Ċ Ċ import Ġio . netty . channel . Channel Ċ import Ġme . illum inator 3 . packet lib . extensions .* Ċ import Ġme . illum inator 3 . packet lib . plugin . Plugin Injector Ċ import Ġme . illum inator 3 . packet lib . packet . Packet Ċ import Ġme . illum inator 3 . packet lib . packet . Packet Handler Ċ import Ġme . illum inator 3 . packet lib . packet . Packet Injector Ċ import Ġme . illum inator 3 . packet lib . packet . event . In lined Packet Listener Ċ import Ġme . illum inator 3 . packet lib . packet . event . Packet Event Ċ import Ġme . illum inator 3 . packet lib . packet . event . Packet Listener Ċ import Ġme . illum inator 3 . packet lib . utils . Bi Parameterized Factory Ċ import Ġme . illum inator 3 . packet lib . utils . Hash Ċ import Ġme . illum inator 3 . packet lib . utils . Parameterized Factory Ċ import Ġme . illum inator 3 . packet lib . utils . Reflection Ċ import Ġorg . bukkit . command . Command Executor Ċ import Ġorg . bukkit . command . Tab Comp leter Ċ import Ġorg . bukkit . entity . Player Ċ import Ġorg . bukkit . event . EventHandler Ċ import Ġorg . bukkit . event . Listener Ċ import Ġorg . bukkit . event . player . Player Join Event Ċ import Ġorg . bukkit . event . player . Player Quit Event Ċ import Ġorg . bukkit . plugin . java . Java Plugin Ċ import Ġorg . jetbrains . annotations . NotNull Ċ import Ġjava . lang . reflect . Field Ċ import Ġjava . util .* Ċ import Ġkotlin . collections . HashMap Ċ import Ġkotlin . concurrent . timer Task Ċ import Ġkotlin . jvm . Throws Ċ Ċ /** Ċ Ġ* Ġ@ author Ġillum inator 3 Ċ Ġ*/ Ċ class ĠPacket Lib Ġprivate Ġconstructor Ġ( private Ġval Ġpacket Injector : ĠPacket Injector , Ġprivate Ġval Ġhandler Factory : ĠBi Parameterized Factory < Packet Handler , ĠPacket Lib , ĠPlayer >, Ġprivate Ġval Ġplugin Injector : ĠPlugin Injector , Ġprivate Ġval Ġlib Listener Factory : ĠParameter ized Factory < Listener , ĠPacket Lib >) Ċ { ĊĠĠĠ Ġcompanion Ġobject Ġ{ ĊĠĠĠĠĠĠĠ Ġ@ Jvm Static ĊĠĠĠĠĠĠĠ Ġfun Ġgenerate Library ( packet Injector : ĠPacket Injector , Ġhandler Factory : ĠBi Parameterized Factory < Packet Handler , ĠPacket Lib , ĠPlayer >, Ġplugin Injector : ĠPlugin Injector , Ġlib Listener Factory : ĠParameter ized Factory < Listener , ĠPacket Lib >) Ġ= ĊĠĠĠĠĠĠĠĠĠĠĠ ĠPacket Lib ( packet Injector , Ġhandler Factory , Ġplugin Injector , Ġlib Listener Factory ) ĊĊĠĠĠĠĠĠĠ Ġ@ Jvm Static ĊĠĠĠĠĠĠĠ Ġ@ Throws ( Packet Exception :: class ) ĊĠĠĠĠĠĠĠ Ġ@ NotNull ĊĠĠĠĠĠĠĠ Ġfun Ġget Library ( plugin : ĠJava Plugin ) Ġ= ĊĠĠĠĠĠĠĠĠĠĠĠ Ġplugin . isEnabled ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. else Throw ( Packet Exception (" Plugin Ġnot Ġinitialized ")) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. then Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġprintln ("[ Packet Lib ] Ġ================= == Ġ@" Ġ+ Ġplugin . name Ġ+ Ġ" Ġ================= ==" ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġprintln ("[ Packet Lib ] ĠGenerating Ġ... ") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. return When ({ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠPacket Lib ( generate Packet Injector (), Ġgenerate Handler Factory (), Ġgenerate Plugin Injector ( plugin ), Ġgenerate Lib Listener Factory ()) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ}, Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġnull ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ}) ĊĊĊĠĠĠĠĠĠĠ Ġprivate Ġfun Ġgenerate Packet Injector (): ĠPacket Injector Ġ= ĊĠĠĠĠĠĠĠĠĠĠĠ Ġobject Ġ: ĠPacket Injector Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġprivate Ġval Ġplayer Connection Entity Player : ĠField Ġ= ĠReflection . getField ( Reflection . getClass ("{ nms }. Entity Player "), Ġ" player Connection ") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġprivate Ġval Ġplayer Connection Class : ĠClass < *> Ġ= ĠReflection . getClass ("{ nms }. Player Connection ") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġprivate Ġval Ġplayer Connection Network Manager : ĠField Ġ= ĠReflection . getField ( player Connection Class , Ġ" network Manager ") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġprivate Ġval Ġnetwork Manager : ĠClass < *> Ġ= ĠReflection . getClass ("{ nms }. Network Manager ") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġprivate Ġval Ġchannel : ĠField Ġ= ĠReflection . getField ( network Manager , Ġ" channel ") ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġoverride Ġfun Ġinject ( lib : ĠPacket Lib , Ġplayer : ĠPlayer ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġch Ġ= Ġget Channel ( get Network Manager ( player . as N MS ())) ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġch . pipeline (). get (" injector ") ?: run Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġhandler Ġ= Ġlib . handler Factory . generate ( lib , Ġplayer ) ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġch . pipeline (). add Before (" packet _ handler ", Ġ" injector ", Ġhandler ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġoverride Ġfun Ġun inject ( lib : ĠPacket Lib , Ġplayer : ĠPlayer ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġch Ġ= Ġget Channel ( get Network Manager ( player . as N MS ())) ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġch . pipeline (). get (" injector ") ?. run Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġch . pipeline (). remove (" injector ") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġfun Ġget Network Manager ( player : ĠAny Ġ/* ĠThe ĠN MS Ġplayer Ġ*/ ): ĠAny Ġ/* ĠThe Ġnetwork Ġmanager Ġ*/ Ġ= ĠReflection . getField Value ( player Connection Network Manager , ĠReflection . getField Value ( player Connection Entity Player , Ġplayer )) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġfun Ġget Channel ( network Manager : ĠAny Ġ/* ĠThe Ġnetwork Ġmanager Ġ*/ ): ĠChannel Ġ= ĠReflection . getField Value ( channel , Ġnetwork Manager ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ}. then Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġprintln ("[ Packet Lib ] Ġ... Ġpacket Ġinjector ") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġprivate Ġfun Ġgenerate Handler Factory (): ĠBi Parameterized Factory < Packet Handler , ĠPacket Lib , ĠPlayer > Ġ= ĊĠĠĠĠĠĠĠĠĠĠĠ Ġobject Ġ: ĠBi Parameterized Factory < Packet Handler , ĠPacket Lib , ĠPlayer > Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġoverride Ġfun Ġgenerate ( param 1 : ĠPacket Lib , Ġparam 2 : ĠPlayer ): ĠPacket Handler Ġ= ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġobject Ġ: ĠPacket Handler ( param 2 ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġoverride Ġfun Ġchannel Read ( player : ĠPlayer , Ġpacket : ĠPacket ): ĠBoolean Ġ= ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġparam 1 . listeners . stream (). map Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġit . on Packet 0 ( Packet Event ( player , Ġpacket )) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ}. any Match Ġ{ Ġit Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ}. then Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġprintln ("[ Packet Lib ] Ġ... Ġhandler Ġfactory ") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġprivate Ġfun Ġgenerate Plugin Injector ( plugin : ĠJava Plugin ): ĠPlugin Injector Ġ= ĊĠĠĠĠĠĠĠĠĠĠĠ Ġobject Ġ: ĠPlugin Injector Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġoverride Ġfun Ġregister Listener ( listener : ĠListener ) Ġ= ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġplugin . server . plugin Manager . register Events ( listener , Ġplugin ) ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġoverride Ġfun Ġregister Command ( name : ĠString , Ġcommand : ĠCommand Executor ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġplugin . get Command ( name )?. run Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġexecutor Ġ= Ġcommand ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġoverride Ġfun Ġregister Tab Comp leter ( command : ĠString , Ġtab Comp leter : ĠTab Comp leter ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġplugin . get Command ( command )?. run Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġthis . tab Comp leter Ġ= Ġtab Comp leter ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġoverride Ġfun Ġis Enabled (): ĠBoolean Ġ= Ġplugin . isEnabled ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġoverride Ġfun ĠgetName (): ĠString Ġ= Ġplugin . name ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ}. then Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġprintln ("[ Packet Lib ] Ġ... Ġplugin Ġinjector ") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġprivate Ġfun Ġgenerate Lib Listener Factory (): ĠParameter ized Factory < Listener , ĠPacket Lib > Ġ= ĊĠĠĠĠĠĠĠĠĠĠĠ Ġobject Ġ: ĠParameter ized Factory < Listener , ĠPacket Lib > Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġoverride Ġfun Ġgenerate ( param : ĠPacket Lib ): ĠListener Ġ= ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġobject Ġ: ĠListener Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ@ EventHandler ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġfun Ġon Join ( e : ĠPlayer Join Event ) Ġ= Ġparam . packet Injector . inject ( param , Ġe . player ) ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ@ EventHandler ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġfun Ġon Quit ( e : ĠPlayer Quit Event ) Ġ= Ġparam . packet Injector . un inject ( param , Ġe . player ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ}. then Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġprintln ("[ Packet Lib ] Ġ... Ġlibrary Ġlistener Ġfactory ") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġprivate Ġvar Ġlistener Registered Ġ= Ġfalse ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġinit Ġ{ ĊĠĠĠĠĠĠĠ Ġlistener Registered . then Else Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ ĠTimer (). schedule At Fixed Rate ( timer Task Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġplugin Injector . isEnabled (). then If Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġprintln ("[ Packet Lib ] ĠGenerating Ġlibrary Ġlistener ") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġprintln ("[ Packet Lib ] ĠRegister ing Ġlistener ") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġprintln ("[ Packet Lib ] Ġ================= == Ġ@" Ġ+ Ġplugin Injector . getName () Ġ+ Ġ" Ġ================= ==" ) ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġplugin Injector . register Listener ( lib Listener Factory . generate ( this @ Packet Lib )) ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġlistener Registered Ġ= Ġtrue ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcancel () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ}, Ġ 0 L , Ġ 2 0 L ) ĊĠĠĠĠĠĠĠ Ġ}. then If Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġprintln ("[ Packet Lib ] Ġ================= == Ġ@" Ġ+ Ġplugin Injector . getName () Ġ+ Ġ" Ġ================= ==" ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġval Ġlisteners : ĠMutable List < Packet Listener > Ġ= ĠArrayList () ĊĠĠĠ Ġprivate Ġval Ġcached In lined Listeners : ĠMutable Map < Hash < In lined Packet Listener >, ĠPacket Listener > Ġ= ĠHashMap () ĊĊĠĠĠ Ġfun Ġget Packet Injector (): ĠPacket Injector Ġ= Ġpacket Injector ĊĠĠĠ Ġfun Ġget Handler Factory (): ĠBi Parameterized Factory < Packet Handler , ĠPacket Lib , ĠPlayer > Ġ= Ġhandler Factory ĊĠĠĠ Ġfun Ġget Plugin Injector (): ĠPlugin Injector Ġ= Ġplugin Injector ĊĠĠĠ Ġfun Ġget Lib Listener Factory (): ĠParameter ized Factory < Listener , ĠPacket Lib > Ġ= Ġlib Listener Factory ĊĊĠĠĠ Ġfun Ġget Listeners (): ĠList < Packet Listener > Ġ= Ġlisteners ĊĊĠĠĠ Ġfun Ġregister Listener ( listener : ĠIn lined Packet Listener ) ĊĠĠĠ Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġc listener Ġ= ĊĠĠĠĠĠĠĠĠĠĠĠ Ġobject Ġ: ĠPacket Listener () Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġoverride Ġfun Ġon Packet ( e : ĠPacket Event ) Ġ= ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġlistener . on Packet ( e ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġcached In lined Listeners [ Hash . hash ( listener )] Ġ= Ġc listener ĊĊĠĠĠĠĠĠĠ Ġregister Listener ( c listener ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġregister Listener ( listener : ĠPacket Listener ) ĊĠĠĠ Ġ{ ĊĠĠĠĠĠĠĠ Ġlisteners Ġ+= Ġlistener ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġunregister Listener ( listener : ĠIn lined Packet Listener ) Ġ= ĊĠĠĠĠĠĠĠ Ġunregister Listener ( cached In lined Listeners . remove ( Hash . hash ( listener )) !! ) ĊĊĠĠĠ Ġfun Ġunregister Listener ( listener : ĠPacket Listener ) ĊĠĠĠ Ġ{ ĊĠĠĠĠĠĠĠ Ġlisteners Ġ-= Ġlistener ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġclear Listeners () Ġ= Ġlisteners . clear () Ċ } Ċ Ċ class ĠPacket Exception ( s : ĠString ) Ġ: ĠRuntimeException ( s )