package Ġorg . val ky ri ens k ies . mod . common . world Ċ Ċ import Ġnet . minecraft . block . BlockState Ċ import Ġnet . minecraft . client . world . Client World Ċ import Ġnet . minecraft . fluid . Fluid State Ċ import Ġnet . minecraft . util . hit . Block Hit Result Ċ import Ġnet . minecraft . util . hit . Hit Result Ċ import Ġnet . minecraft . util . math . Block Pos Ċ import Ġnet . minecraft . util . math . Direction Ċ import Ġnet . minecraft . util . math . Math Helper Ċ import Ġnet . minecraft . util . math . Vec 3 d Ċ import Ġnet . minecraft . world . Ray cast Context Ċ import Ġnet . minecraft . world . World Ċ import Ġorg . val ky ri ens k ies . mod . common . ship Object World Ċ import Ġorg . val ky ri ens k ies . mod . common . util . to JO ML Ċ import Ġorg . val ky ri ens k ies . mod . common . util . to Vec 3 d Ċ import Ġjava . util . function . Bi Function Ċ import Ġjava . util . function . Function Ċ Ċ @ Jvm Over loads Ċ fun ĠClient World . ray cast Include Sh ips ( ctx : ĠRay cast Context , Ġshould Transform Hit Pos : ĠBoolean Ġ= Ġtrue ): ĠBlock Hit Result Ġ{ ĊĠĠĠ Ġval Ġvanilla Hit Ġ= Ġray cast ( ctx ) ĊĊĠĠĠ Ġvar Ġclosest Hit Ġ= Ġvanilla Hit ĊĠĠĠ Ġvar Ġclosest Hit Pos Ġ= Ġvanilla Hit . pos ĊĠĠĠ Ġvar Ġclosest Hit Dist Ġ= Ġclosest Hit Pos . squared Distance To ( ctx . start ) ĊĊĠĠĠ Ġ// ĠTODO Ġmake Ġthis Ġmore Ġefficient ĊĠĠĠ Ġ// ĠIterate Ġevery Ġship , Ġfind Ġdo Ġthe Ġray cast Ġin Ġship Ġspace , ĊĠĠĠ Ġ// Ġchoose Ġthe Ġray cast Ġwith Ġthe Ġlowest Ġdistance Ġto Ġthe Ġstart Ġposition . ĊĠĠĠ Ġfor Ġ( ship Ġin Ġship Object World . ship Objects . values ) Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġworld To Ship Ġ= Ġship . render Transform . world To Ship Matrix ĊĠĠĠĠĠĠĠ Ġval Ġship To World Ġ= Ġship . render Transform . ship To World Matrix ĊĠĠĠĠĠĠĠ Ġval Ġship Start Ġ= Ġworld To Ship . transform Position ( ctx . start . to JO ML ()). to Vec 3 d () ĊĠĠĠĠĠĠĠ Ġval Ġship End Ġ= Ġworld To Ship . transform Position ( ctx . end . to JO ML ()). to Vec 3 d () ĊĊĠĠĠĠĠĠĠ Ġval Ġship Hit Ġ= Ġray cast ( ctx , Ġship Start , Ġship End ) ĊĠĠĠĠĠĠĠ Ġval Ġship Hit Pos Ġ= Ġship To World . transform Position ( ship Hit . pos . to JO ML ()). to Vec 3 d () ĊĠĠĠĠĠĠĠ Ġval Ġship Hit Dist Ġ= Ġship Hit Pos . squared Distance To ( ctx . start ) ĊĊĠĠĠĠĠĠĠ Ġif Ġ( ship Hit Dist Ġ< Ġclosest Hit Dist Ġ&& Ġship Hit . type Ġ!= ĠHit Result . Type . MIS S ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġclosest Hit Ġ= Ġship Hit ĊĠĠĠĠĠĠĠĠĠĠĠ Ġclosest Hit Pos Ġ= Ġship Hit Pos ĊĠĠĠĠĠĠĠĠĠĠĠ Ġclosest Hit Dist Ġ= Ġship Hit Dist ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġif Ġ(! should Transform Hit Pos ) Ġ{ ĊĠĠĠĠĠĠĠ Ġclosest Hit Pos Ġ= Ġclosest Hit . pos ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġreturn Ġif Ġ( closest Hit . type Ġ== ĠHit Result . Type . MIS S ) Ġ{ ĊĠĠĠĠĠĠĠ ĠBlock Hit Result . create Mis sed ( closest Hit Pos , Ġclosest Hit . side , Ġclosest Hit . block Pos ) ĊĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠ ĠBlock Hit Result ( closest Hit Pos , Ġclosest Hit . side , Ġclosest Hit . block Pos , Ġclosest Hit . is Inside Block ) ĊĠĠĠ Ġ} Ċ } Ċ Ċ // Ġcopy Ġpaste Ġof Ġvanilla Ġray cast Ġwith Ġthe Ġoption Ġto Ġspecify Ġa Ġcustom Ġstart / end Ċ private Ġfun ĠWorld . ray cast ( context : ĠRay cast Context , Ġreal Start : ĠVec 3 d , Ġreal End : ĠVec 3 d ): ĠBlock Hit Result Ġ{ ĊĠĠĠ Ġreturn Ġray cast ( ĊĠĠĠĠĠĠĠ Ġreal Start , Ġreal End , Ġcontext , ĊĠĠĠĠĠĠĠ Ġ{ Ġray cast Context : ĠRay cast Context , Ġblock Pos : ĠBlockPos ? Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġblock State : ĠBlock State Ġ= Ġget BlockState ( block Pos ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġfluid State : ĠFluid State Ġ= Ġget Fluid State ( block Pos ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġvec 3 d Ġ= Ġreal Start ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġvec 3 d 2 Ġ= Ġreal End ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġvoxel Shape Ġ= Ġray cast Context . getBlock Shape ( block State , Ġthis , Ġblock Pos ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġblock Hit Result : ĠBlock Hit Result ? Ġ= Ġray cast Block ( vec 3 d , Ġvec 3 d 2 , Ġblock Pos , Ġvoxel Shape , Ġblock State ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġvoxel Shape 2 Ġ= Ġray cast Context . get Fluid Shape ( fluid State , Ġthis , Ġblock Pos ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġblock Hit Result 2 Ġ= Ġvoxel Shape 2 . ray cast ( vec 3 d , Ġvec 3 d 2 , Ġblock Pos ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġd Ġ= Ġif Ġ( block Hit Result Ġ== Ġnull ) ĠDouble . MAX _ VALUE Ġelse Ġreal Start . squared Distance To ( block Hit Result . pos ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġe Ġ= Ġif Ġ( block Hit Result 2 Ġ== Ġnull ) ĠDouble . MAX _ VALUE Ġelse Ġreal End . squared Distance To ( block Hit Result 2 . pos ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( d Ġ<= Ġe ) Ġblock Hit Result Ġelse Ġblock Hit Result 2 ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ) Ġ{ Ġray cast Context : ĠRay cast Context Ġ-> ĊĠĠĠĠĠĠĠ Ġval Ġvec 3 d Ġ= Ġreal Start . subtract ( real End ) ĊĠĠĠĠĠĠĠ ĠBlock Hit Result . create Mis sed ( real End , ĠDirection . getF acing ( vec 3 d . x , Ġvec 3 d . y , Ġvec 3 d . z ), ĠBlockPos ( real End )) ĊĠĠĠ Ġ} Ġas ĠBlock Hit Result Ċ } Ċ Ċ private Ġfun Ġ< T > Ġray cast ( ĊĠĠĠ Ġreal Start : ĠVec 3 d , ĊĠĠĠ Ġreal End : ĠVec 3 d , ĊĠĠĠ Ġray cast Context : ĠRay cast Context , ĊĠĠĠ Ġcontext : ĠBi Function < Ray cast Context , ĠBlockPos ?, ĠT >, ĊĠĠĠ Ġblock Ray caster : ĠFunction < Ray cast Context , ĠT > Ċ ): ĠT Ġ{ ĊĠĠĠ Ġval Ġvec 3 d Ġ= Ġreal Start ĊĠĠĠ Ġval Ġvec 3 d 2 Ġ= Ġreal End ĊĠĠĠ Ġreturn Ġif Ġ( vec 3 d Ġ== Ġvec 3 d 2 ) Ġ{ ĊĠĠĠĠĠĠĠ Ġblock Ray caster . apply ( ray cast Context ) ĊĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġd Ġ= ĠMath Helper . lerp (- 1 . 0 E - 7 , Ġvec 3 d 2 . x , Ġvec 3 d . x ) ĊĠĠĠĠĠĠĠ Ġval Ġe Ġ= ĠMath Helper . lerp (- 1 . 0 E - 7 , Ġvec 3 d 2 . y , Ġvec 3 d . y ) ĊĠĠĠĠĠĠĠ Ġval Ġf Ġ= ĠMath Helper . lerp (- 1 . 0 E - 7 , Ġvec 3 d 2 . z , Ġvec 3 d . z ) ĊĠĠĠĠĠĠĠ Ġval Ġg Ġ= ĠMath Helper . lerp (- 1 . 0 E - 7 , Ġvec 3 d . x , Ġvec 3 d 2 . x ) ĊĠĠĠĠĠĠĠ Ġval Ġh Ġ= ĠMath Helper . lerp (- 1 . 0 E - 7 , Ġvec 3 d . y , Ġvec 3 d 2 . y ) ĊĠĠĠĠĠĠĠ Ġval Ġi Ġ= ĠMath Helper . lerp (- 1 . 0 E - 7 , Ġvec 3 d . z , Ġvec 3 d 2 . z ) ĊĠĠĠĠĠĠĠ Ġvar Ġj Ġ= ĠMath Helper . floor ( g ) ĊĠĠĠĠĠĠĠ Ġvar Ġk Ġ= ĠMath Helper . floor ( h ) ĊĠĠĠĠĠĠĠ Ġvar Ġl Ġ= ĠMath Helper . floor ( i ) ĊĠĠĠĠĠĠĠ Ġval Ġmutable Ġ= ĠBlockPos . Mutable ( j , Ġk , Ġl ) ĊĠĠĠĠĠĠĠ Ġval Ġ` object `: ĠT ? Ġ= Ġcontext . apply ( ray cast Context , Ġmutable ) ĊĠĠĠĠĠĠĠ Ġif Ġ(` object ` Ġ!= Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ` object ` ĊĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġm Ġ= Ġd Ġ- Ġg ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġn Ġ= Ġe Ġ- Ġh ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġo Ġ= Ġf Ġ- Ġi ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġp Ġ= ĠMath Helper . sign ( m ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġq Ġ= ĠMath Helper . sign ( n ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġr Ġ= ĠMath Helper . sign ( o ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġs Ġ= Ġif Ġ( p Ġ== Ġ 0 ) ĠDouble . MAX _ VALUE Ġelse Ġp . toDouble () Ġ/ Ġm ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġt Ġ= Ġif Ġ( q Ġ== Ġ 0 ) ĠDouble . MAX _ VALUE Ġelse Ġq . toDouble () Ġ/ Ġn ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġu Ġ= Ġif Ġ( r Ġ== Ġ 0 ) ĠDouble . MAX _ VALUE Ġelse Ġr . toDouble () Ġ/ Ġo ĊĠĠĠĠĠĠĠĠĠĠĠ Ġvar Ġv Ġ= Ġs Ġ* Ġif Ġ( p Ġ> Ġ 0 ) Ġ 1 . 0 Ġ- ĠMath Helper . fraction al Part ( g ) Ġelse ĠMath Helper . fraction al Part ( g ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġvar Ġw Ġ= Ġt Ġ* Ġif Ġ( q Ġ> Ġ 0 ) Ġ 1 . 0 Ġ- ĠMath Helper . fraction al Part ( h ) Ġelse ĠMath Helper . fraction al Part ( h ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġvar Ġx Ġ= Ġu Ġ* Ġif Ġ( r Ġ> Ġ 0 ) Ġ 1 . 0 Ġ- ĠMath Helper . fraction al Part ( i ) Ġelse ĠMath Helper . fraction al Part ( i ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġvar Ġobject 2 : ĠT ? ĊĠĠĠĠĠĠĠĠĠĠĠ Ġdo Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( v Ġ> Ġ 1 . 0 Ġ&& Ġw Ġ> Ġ 1 . 0 Ġ&& Ġx Ġ> Ġ 1 . 0 ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġblock Ray caster . apply ( ray cast Context ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( v Ġ< Ġw ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( v Ġ< Ġx ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġj Ġ+= Ġp ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġv Ġ+= Ġs ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġl Ġ+= Ġr ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġx Ġ+= Ġu ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġif Ġ( w Ġ< Ġx ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġk Ġ+= Ġq ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġw Ġ+= Ġt ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġl Ġ+= Ġr ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġx Ġ+= Ġu ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġobject 2 Ġ= Ġcontext . apply ( ray cast Context , Ġmutable . set ( j , Ġk , Ġl )) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġwhile Ġ( object 2 Ġ== Ġnull ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġobject 2 ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} Ċ } Ċ