package Ġnet . bar ri bob . park our . ai Ċ Ċ import Ġnet . bar ri bob . ma el st rom . M ael st rom Mod Ċ import Ġnet . bar ri bob . ma el st rom . general . event . Timed Event Ċ import Ġnet . bar ri bob . ma el st rom . static _ utilities .* Ċ import Ġnet . bar ri bob . park our . Mod Utils Ċ import Ġnet . minecraft . entity . ai . goal . Goal Ċ import Ġnet . minecraft . entity . attribute . Entity Attributes Ċ import Ġnet . minecraft . entity . mob . Mob Entity Ċ import Ġnet . minecraft . util . hit . Hit Result Ċ import Ġnet . minecraft . util . math . Block Pos Ċ import Ġnet . minecraft . util . math . Vec 3 d Ċ import Ġnet . minecraft . world . Ray cast Context Ċ import Ġjava . util .* Ċ import Ġkotlin . math . floor Ċ import Ġkotlin . math . pow Ċ import Ġkotlin . math . sqrt Ċ Ċ /** Ċ Ġ* ĠJump ing ĠAI Ġby ĠBar ri bob Ċ Ġ* Ċ Ġ* ĠWhat Ġit Ġdoes Ċ Ġ* ĠDetect s Ġg aps Ġand Ġcomp uls ively Ġmakes Ġentities Ġjump Ġover Ġthem Ġif Ġthey Ġare Ġin Ġthe Ġgeneral Ġdirection Ġof Ġthe Ġtarget Ċ Ġ* ĠWill Ġdetect Ġwater , Ġl ava Ġand Ġfire Ġas Ġwell . Ċ Ġ* Ċ Ġ* ĠWhat Ġit Ġdoes Ġnot Ġdo Ċ Ġ* ĠDoes Ġnot Ġemploy Ġany Ġactual Ġpath Ġfinding , Ġso Ġit 's Ġnot Ġa Ġtrue Ġjump ing Ġnavigation Ġai Ċ Ġ* ĠThus Ġit Ġcan 't Ġdo Ġcomplex Ġpar k our Ġin Ġorder Ġto Ġget Ġto Ġa Ġtarget Ċ Ġ* Ċ Ġ* ĠKnown ĠIssues Ċ Ġ* ĠSp ider Ġnavigation Ġmakes Ġso Ġthat Ġsp iders Ġspeed Ġoff Ġinto Ġa Ġstraight Ġdirection Ċ Ġ* ĠJump Ġcalculations Ġstart Ġto Ġover estimate Ġthe Ġdistance Ġwith Ġhigh Ġve locities ... Ġmostly Ġbecause Ġm inecraft Ġhas Ġa Ġstrange ly Ġhigh Ġair Ġresistance Ġeffect Ġgoing Ġon Ċ Ġ*/ Ċ class ĠJump To Target Goal ( private Ġval Ġentity : ĠMob Entity ) Ġ: ĠGoal () Ġ{ ĊĠĠĠ Ġprivate Ġval Ġmin Target Distance Ġ= Ġ 1 . 5 Ġ// ĠMinimum Ġdistance Ġrequired Ġfor Ġthe Ġjump Ġai Ġto Ġactivate ĊĠĠĠ Ġprivate Ġval Ġjump Clear ance Above Head Ġ= Ġ 1 . 0 Ġ// ĠY Ġoffset Ġabove Ġan Ġentity 's Ġhit box Ġto Ġray cast Ġto Ġsee Ġif Ġthere Ġare Ġany Ġblocks Ġin Ġthe Ġway Ġof Ġthe Ġjump ĊĠĠĠ Ġprivate Ġval Ġforward Movement Ticks Ġ= Ġ 4 0 Ġ// ĠHow Ġmany Ġticks Ġthe Ġentity Ġwill Ġ" press Ġthe Ġforward Ġkey " Ġwhile Ġjump ing ĊĠĠĠ Ġprivate Ġval Ġangle sTo Attempt Jump Ġ= Ġ(- 4 5 .. 4 5 Ġstep Ġ 5 ). toList () ĊĠĠĠ Ġprivate Ġval Ġedge Detection Distance Ġ= Ġ 2 . 0 Ġ// ĠMaximum Ġdistance Ġan Ġentity Ġcan Ġfrom Ġan Ġedge Ġbefore Ġthe Ġai Ġcons iders Ġrunning ĊĠĠĠ Ġprivate Ġval Ġdetection Points Ġ= Ġfloor ( edge Detection Distance Ġ* Ġ 8 ). toInt () ĊĠĠĠ Ġprivate Ġval Ġmove Speed Ġ= Ġ 1 . 0 ĊĠĠĠ Ġprivate Ġval Ġjump Forward Speed Ġ= Ġ 5 . 0 ĊĠĠĠ Ġprivate Ġval Ġgravity Ġ= Ġ 0 . 1 ĊĠĠĠ Ġprivate Ġval Ġy Velocity Scale Ġ= Ġ 1 . 5 3 ĊĠĠĠ Ġprivate Ġval Ġjump Noise Ġ= Ġ 0 . 1 ĊĠĠĠ Ġprivate Ġval Ġmax Ticks Attempt Navigation Ġ= Ġ 4 0 ĊĠĠĠ Ġprivate Ġvar Ġjump Data : ĠJump Data ? Ġ= Ġnull ĊĊĠĠĠ Ġdata Ġclass ĠJump Data ( val Ġjump Vel : ĠPair < Double , ĠDouble >, Ġval Ġdirection : ĠVec 3 d , Ġval Ġedge Pos : ĠVec 3 d , Ġvar Ġticks At tempted : ĠInt Ġ= Ġ 0 ) ĊĊĠĠĠ Ġinit Ġ{ ĊĠĠĠĠĠĠĠ Ġcontrols Ġ= ĠEnum Set . of ( Control . MOVE , ĠControl . JUMP ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġcan Start (): ĠBoolean Ġ{ ĊĠĠĠĠĠĠĠ Ġif Ġ( entity . navigation Ġ!= Ġnull Ġ&& Ġentity . is On Ground Ġ&& Ġjump Data Ġ== Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġpath Ġ= Ġentity . navigation . current Path Ġ?: Ġreturn Ġfalse ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġpath Range Ġ= Ġpath . currentNode Index Ġuntil Ġpath . length ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġhas No Ob stacles Ġ= Ġpath Range . map Ġ{ ĠgetNode ( path . getNode ( it ). pos ) Ġ}. none Ġ{ Ġit Ġ== ĠBlock Type . PASS ABLE _ OB ST AC LE Ġ|| Ġit Ġ== ĠBlock Type . SOLID _ OB ST AC LE Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġif ( entity . navigation . is Following Path Ġ&& Ġpath . re aches Target () Ġ&& Ġhas No Ob stacles ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġfalse ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġtarget Ġ= Ġentity . navigation . target Pos ?. as Vec 3 d ()?. add ( 0 . 5 , Ġ 0 . 0 , Ġ 0 . 5 ) ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġif ( target Ġ== Ġnull Ġ|| Ġtarget . distance To ( entity . pos ) Ġ< Ġmin Target Distance ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġfalse ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġjump Data Ġ= Ġfind Jump ( target ) ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġif ( jump Data Ġ!= Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġthis . jump Data Ġ= Ġjump Data ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġtrue ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġreturn Ġjump Data Ġ!= Ġnull ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġfind Jump ( target : ĠVec 3 d ): ĠJump Data ? Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġtarget Direction : ĠVec 3 d Ġ= Ġtarget . subtract ( entity . pos ). plane Project ( new Vec 3 d ( y Ġ= Ġ 1 . 0 )). normalize () ĊĊĠĠĠĠĠĠĠ Ġfor ( angle Ġin Ġangle sTo Attempt Jump ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġjump Direction Ġ= Ġtarget Direction . rotate Vector ( new Vec 3 d ( y Ġ= Ġ 1 . 0 ), Ġangle . toDouble ()) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġg aps Ġ= Ġmutable ListOf < Pair < Vec 3 d , ĠBlock Type >>() ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġend Pos Ġ= Ġentity . pos . add ( jump Direction . multiply ( edge Detection Distance )) ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġif ( entity . velocity . add ( jump Direction ). length Squared () Ġ< Ġjump Direction . length Squared ()) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcontinue ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠ ĠMath Utils . line Callback ( entity . pos , Ġend Pos , Ġdetection Points ) Ġ{ Ġpos , Ġ_ Ġ-> Ġg aps . add ( Pair ( pos , ĠgetNode ( Block Pos ( pos )))) Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġpairs Ġ= Ġg aps . zip With Next (). first OrNull Ġ{ Ġit . first . second Ġ== ĠBlock Type . WAL K ABLE Ġ&& Ġit . second . second Ġ== ĠBlock Type . PASS ABLE _ OB ST AC LE Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġhas G aps In AR ow Ġ= Ġg aps . zip With Next (). first OrNull Ġ{ Ġit . first . second Ġ== ĠBlock Type . WAL K ABLE Ġ&& Ġit . second . second Ġ== ĠBlock Type . WAL K ABLE Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġif ( pairs Ġ!= Ġnull Ġ&& Ġhas G aps In AR ow Ġ!= Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġdir And Vel Ġ= Ġget Jump Length ( pairs . second . first , Ġjump Direction ) ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( dir And Vel Ġ!= Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreturn ĠJump Data ( dir And Vel . second , Ġdir And Vel . first , Ġpairs . second . first ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġreturn Ġnull ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġtick () Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġjump Data Ġ= Ġjump Data Ġ?: Ġreturn ĊĊĠĠĠĠĠĠĠ Ġjump Data . ticks At tempted Ġ+= Ġ 1 ĊĊĠĠĠĠĠĠĠ Ġif ( jump Data . ticks At tempted Ġ> Ġmax Ticks Attempt Navigation ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġentity . navigation . stop () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġthis . jump Data Ġ= Ġnull ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġif ( Block Pos ( this . entity . pos ) Ġ!= ĠBlockPos ( jump Data . edge Pos )) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġentity . move Control . moveTo ( jump Data . edge Pos . x , Ġjump Data . edge Pos . y , Ġjump Data . edge Pos . z , Ġmove Speed ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġjump ( jump Data ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġjump ( jump Data : ĠJump Data ) Ġ{ ĊĠĠĠĠĠĠĠ ĠMod Utils . le ap Tow ards ( ĊĠĠĠĠĠĠĠĠĠĠĠ Ġentity , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġentity . pos . add ( jump Data . direction ), ĊĠĠĠĠĠĠĠĠĠĠĠ Ġjump Data . jump Vel . first Ġ+ Ġjump Data . jump Vel . first Ġ* ĠRandom Utils . double ( jump Noise ), ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( jump Data . jump Vel . second Ġ> Ġ 0 ) Ġ 0 . 0 Ġelse Ġ 0 . 1 ĊĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠ Ġif Ġ( jump Data . jump Vel . second Ġ> Ġ 0 ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġentity . jump Control . setActive () ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġval Ġcallback Ġ= Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġmove Pos Ġ= Ġentity . pos . add ( jump Data . direction . multiply ( 3 . 0 )) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif (! entity . is On Ground ) Ġentity . move Control . moveTo ( move Pos . x , Ġmove Pos . y , Ġmove Pos . z , Ġjump Forward Speed ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġval Ġshould Cancel Ġ= Ġ{ Ġ! entity . is Alive Ġ|| Ġentity . is On Ground Ġ} ĊĠĠĠĠĠĠĠ ĠM ael st rom Mod . server Event Scheduler . add Event ( Timed Event ( callback , Ġ 0 , Ġforward Movement Ticks , Ġshould Cancel )) ĊĠĠĠĠĠĠĠ Ġentity . navigation . stop () ĊĠĠĠĠĠĠĠ Ġthis . jump Data Ġ= Ġnull ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġget Mob Jump Abilities (): ĠTrip le < Double , ĠInt , ĠDouble > Ġ Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġjump Y Vel Ġ= ĠMod Utils . get Jump Velocity ( entity . world , Ġentity ) Ġ// ĠMaximum Ġy Ġvelocity Ġfor Ġa Ġjump . ĠUsed Ġin Ġdetermining Ġif Ġan Ġentity Ġcan Ġmake Ġa Ġjump ĊĠĠĠĠĠĠĠ Ġval Ġmax Jump Height Ġ= Ġ( jump Y Vel Ġ* Ġ 4 ). toInt () ĊĠĠĠĠĠĠĠ Ġval Ġmax H oriz onal Velocity Ġ= Ġentity . getAttribute Value ( Entity Attributes . GENERIC _ MOVE MENT _ SPEED ) Ġ* Ġmove Speed ĊĠĠĠĠĠĠĠ Ġreturn ĠTrip le ( jump Y Vel , Ġmax Jump Height , Ġmax H oriz onal Velocity ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġget Jump Offsets ( max Hor z Vel : ĠDouble ): ĠList < Pair < Int , ĠInt >> Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġsteps : ĠInt Ġ= Ġwhen Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġmax Hor z Vel Ġ< Ġ 0 . 2 4 Ġ-> Ġ 3 ĊĠĠĠĠĠĠĠĠĠĠĠ Ġmax Hor z Vel Ġ> Ġ 0 . 2 4 Ġ&& Ġmax Hor z Vel Ġ< Ġ 0 . 3 Ġ-> Ġ 4 ĊĠĠĠĠĠĠĠĠĠĠĠ Ġelse Ġ-> Ġ 5 ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġreturn Ġ( 0 .. steps ). flatMap Ġ{ Ġd Ġ-> Ġ( 0 .. ( steps Ġ- Ġd )). map Ġ{ Ġy Ġ-> ĠPair ( d , Ġy ) Ġ} Ġ}. sorted By Ġ{ Ġpair Ġ-> Ġpair . first Ġ+ Ġpair . second Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġget Jump Length ( actor Pos : ĠVec 3 d , Ġtarget Direction : ĠVec 3 d ): ĠPair < Vec 3 d , ĠPair < Double , ĠDouble >> ? Ġ{ ĊĊĠĠĠĠĠĠĠ Ġval Ġ( max Y Vel , Ġmax Jump Height , Ġmax Hor z Vel ) Ġ= Ġget Mob Jump Abilities () ĊĠĠĠĠĠĠĠ Ġval Ġjump Offsets Ġ= Ġget Jump Offsets ( max Hor z Vel ) ĊĊĠĠĠĠĠĠĠ Ġfor Ġ(( x , Ġy ) Ġin Ġjump Offsets ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġscaled Step X Ġ= Ġ 1 . 0 Ġ+ Ġx ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġjump To Pos Ġ= Ġactor Pos . add ( target Direction . multiply ( scaled Step X )) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġblock Pos Ġ= ĠBlockPos ( jump To Pos ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġground Height Ġ= Ġfind Ground At ( block Pos , Ġy , Ġmax Jump Height ) Ġ?: Ġcontinue ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġwalk able Pos Ġ= ĠBlockPos ( block Pos . x , Ġground Height , Ġblock Pos . z ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġblock Shape Ġ= Ġentity . world . getBlock State ( walk able Pos ). get Collision Shape ( entity . world , Ġwalk able Pos ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġoffset Pos Ġ= Ġactor Pos . subtract ( walk able Pos . as Vec 3 d ()) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġcorner Pos Ġ= ĠMod Utils . find Closest Corner ( offset Pos , Ġblock Shape , Ġ 1 6 )?. add ( walk able Pos . as Vec 3 d ()) Ġ?: Ġcontinue ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġhorizontal Jump Pos Ġ= ĠVec 3 d ( corner Pos . x , Ġactor Pos . y , Ġcorner Pos . z ) ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġjump Length Ġ= Ġhorizontal Jump Pos . subtract ( actor Pos ). length () Ġ- Ġ( entity . width Ġ* Ġ 0 . 5 ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġre calculated Direction Ġ= Ġhorizontal Jump Pos . subtract ( actor Pos ). normalize () ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ(! has Clear ance ( actor Pos , Ġjump Length , Ġtarget Direction )) Ġreturn Ġnull ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġblock Height Ġ= Ġif (! block Shape . isEmpty ) Ġblock Shape . bounding Box . y Length Ġelse Ġ 0 . 0 ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġjump Height Ġ= Ġground Height Ġ+ Ġblock Height Ġ- Ġactor Pos . y ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġfor ( jump Eff ort Ġin ĠlistOf ( 0 . 0 , Ġmax Y Vel )) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġx Vel With Jump Ġ= Ġcalculate Required X Velocity ( jump Length , Ġjump Height , Ġjump Eff ort ) ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif ( x Vel With Jump Ġ< Ġmax Hor z Vel ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreturn ĠPair ( re calculated Direction , ĠPair ( x Vel With Jump , Ġjump Eff ort )) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġnull ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġreturn Ġnull ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġcalculate Required X Velocity ( jump Length : ĠDouble , Ġjump Height : ĠDouble , Ġy Vel : ĠDouble ): ĠDouble Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġscaled Y Vel Ġ= Ġy Vel Ġ* Ġy Velocity Scale ĊĠĠĠĠĠĠĠ Ġval Ġquadr atic Sqrt Ġ= Ġsqrt ( scaled Y Vel . pow ( 2 ) Ġ- Ġ 4 Ġ* Ġ- Ġjump Height Ġ* Ġ- gravity ) ĊĠĠĠĠĠĠĠ Ġif ( quadr atic Sqrt . isNaN ()) Ġreturn ĠDouble . POSITIVE _ INFINITY ĊĠĠĠĠĠĠĠ Ġval Ġnum erator Ġ= Ġif (- scaled Y Vel Ġ> Ġ 0 ) Ġ- scaled Y Vel Ġ+ Ġquadr atic Sqrt Ġelse Ġ- scaled Y Vel Ġ- Ġquadr atic Sqrt ĊĠĠĠĠĠĠĠ Ġval Ġtime Ġ= Ġnum erator Ġ/ Ġ( 2 Ġ* Ġ- gravity ) ĊĠĠĠĠĠĠĠ Ġif ( time Ġ== Ġ 0 . 0 ) Ġreturn ĠDouble . POSITIVE _ INFINITY ĊĠĠĠĠĠĠĠ Ġreturn Ġjump Length Ġ/ Ġtime ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠFinds Ġthe Ġfirst Ġy Ġposition Ġthat Ġhas Ġwalk able Ġground Ġor Ġnone ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġprivate Ġfun Ġfind Ground At ( pos : ĠBlockPos , Ġheight : ĠInt , Ġmax Jump Height : ĠInt ): ĠInt ? Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġrange Ġ= Ġ(- height .. max Jump Height ) ĊĠĠĠĠĠĠĠ Ġval Ġwalk able Pos Ġ= Ġrange . first OrNull { ĠgetNode ( pos . up ( it )) Ġ== ĠBlock Type . WAL K ABLE Ġ} ĊĠĠĠĠĠĠĠ Ġreturn Ġif ( walk able Pos Ġ== Ġnull ) Ġnull Ġelse Ġwalk able Pos Ġ+ Ġpos . y Ġ- Ġ 1 ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠFinds Ġif Ġthere Ġare Ġany Ġblocks Ġabove Ġthe Ġentity Ġthat Ġmay Ġblock Ġthe Ġjump ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġprivate Ġfun Ġhas Clear ance ( actor Pos : ĠVec 3 d , Ġjump Length : ĠDouble , Ġjump Direction : ĠVec 3 d ): ĠBoolean Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġrequired Height Ġ= Ġentity . height Ġ+ Ġjump Clear ance Above Head ĊĠĠĠĠĠĠĠ Ġval Ġstart Ġ= Ġactor Pos . y Offset ( required Height ) ĊĠĠĠĠĠĠĠ Ġval Ġend Ġ= Ġstart . add ( jump Direction . multiply ( jump Length )) ĊĠĠĠĠĠĠĠ Ġval Ġresult Ġ= Ġentity . world . ray cast ( Ray cast Context ( start , Ġend , ĠRay cast Context . Shape Type . COLL IDER , ĠRay cast Context . Fluid Handling . NONE , Ġentity )) ĊĠĠĠĠĠĠĠ Ġreturn Ġresult . type Ġ== ĠHit Result . Type . MIS S ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun ĠgetNode ( pos : ĠBlockPos ): ĠBlock Type Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn ĠMod Utils . getBlock Type ( entity . world , Ġpos , Ġ 2 ) ĊĠĠĠ Ġ} Ċ } Ċ