package Ġspatial craft ing . client . particle Ċ Ċ import Ġfab rick tx . api .* Ċ import Ġnet . fabric mc . api . Env Type Ċ import Ġnet . fabric mc . api . Environment Ċ import Ġnet . minecraft . client . world . Client World Ċ import Ġnet . minecraft . item . ItemStack Ċ import Ġnet . minecraft . item . Items Ċ import Ġnet . minecraft . nbt . Compound Tag Ċ import Ġnet . minecraft . util . math . Block Pos Ċ import Ġnet . minecraft . util . math . Vec 3 d Ċ import Ġnet . minecraft . world . World Ċ import Ġscheduler . Block Scheduler Ċ import Ġspatial craft ing . cr after . Cr after Mult ib lock Ċ import Ġspatial craft ing . cr after . Cr after Piece Block Ċ import Ġspatial craft ing . cr after . get Cr after Entity OrNull Ċ import Ġspatial craft ing . log Info Ċ import Ġspatial craft ing . log Warning Ċ import Ġkotlin . math . max Ċ import Ġkotlin . math . round ToInt Ċ import Ġkotlin . time . Duration Ċ import Ġkotlin . time . seconds Ċ Ċ private Ġval ĠTime Between Particles Ġ= Ġ 0 . 1 . seconds ĊĊ Ċ private Ġval ĠY End Pos Increase Speed Ġ= Ġ 0 . 5 . bps Ċ private Ġval ĠSl am down Speed Ġ= Ġ 4 . bps Ċ private Ġval ĠBase Block Flight Speed Ġ= Ġ 1 . bps Ċ private Ġval ĠBlock Flight Speed Increase PerSecond Ġ= Ġ 0 . 2 . bps Ċ private Ġval ĠPhase 2 StartTime Ġ= Ġ 5 . seconds Ċ Ċ private Ġconst Ġval ĠDuration Data Key Ġ= Ġ" particle _ craft _ duration " Ċ private Ġconst Ġval ĠStart Time Key Ġ= Ġ" particle _ craft _ start _ time " Ċ Ċ fun Ġplay All Craft Particles ( world : ĠWorld , Ġmult ib lock : ĠCr after Mult ib lock , Ġduration : ĠDuration ) Ġ{ ĊĠĠĠ Ġval Ġblock Ġ= ĠCr after Piece Block . All . first () ĊĠĠĠ Ġval Ġduration Data Ġ= ĠCompound Tag (). apply Ġ{ ĊĠĠĠĠĠĠĠ Ġput Duration ( Duration Data Key , Ġduration ) ĊĠĠĠĠĠĠĠ Ġput Long ( StartTime Key , Ġworld . time ) ĊĠĠĠ Ġ} ĊĠĠĠ Ġmult ib lock . cancellationToken s . craft ing Particles Ġ= ĠBlock Scheduler . repeat For ( duration . in Ticks . toInt (), ĊĠĠĠĠĠĠĠĠĠĠĠ Ġtick Interval Ġ= ĠTime Between Particles . in Ticks . toInt (), ĊĠĠĠĠĠĠĠĠĠĠĠ Ġblock Ġ= Ġblock , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġschedule Id Ġ= ĠCr after Piece Block . Emit Round Of Craft ing Particles , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġblock Pos Ġ= Ġmult ib lock . ar bitrary Cr after Pos , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġworld Ġ= Ġworld , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġadditional Data Ġ= Ġduration Data ĊĠĠĠ Ġ) ĊĠĠĠ Ġ// ĠExecute Ġthe Ġfirst Ġone Ġimmediately ĊĠĠĠ Ġblock . on Schedule End ( world , Ġmult ib lock . ar bitrary Cr after Pos , Ġschedule Id Ġ= ĠCr after Piece Block . Emit Round Of Craft ing Particles , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġadditional Data Ġ= Ġduration Data ) Ċ } Ċ Ċ @ Environment ( Env Type . CLIENT ) Ċ fun Ġplay Round Of Craft Particles ( world : ĠWorld , Ġany Cr after Pos : ĠBlockPos , Ġparticle Data : ĠCompound Tag ) Ġ{ ĊĠĠĠ Ġval Ġmult ib lock Ġ= Ġworld . get Cr after Entity OrNull ( any Cr after Pos )?. mult ib lock In Ġ?: Ġrun Ġ{ ĊĠĠĠĠĠĠĠ Ġlog Info Ġ{ Ġ" Can 't Ġfind Ġmult ib lock Ġto Ġemit Ġcraft Ġparticles Ġwith Ġat Ġpos Ġ$ any Cr after Pos " Ġ} ĊĠĠĠĠĠĠĠ Ġreturn ĊĠĠĠ Ġ} ĊĠĠĠ Ġworld Ġas ĠClient World ĊĊĠĠĠ Ġplay Round Of Craft Particles ( world , Ġmult ib lock , Ġparticle Data ) Ċ } ĊĊ Ċ @ Environment ( Env Type . CLIENT ) Ċ private Ġfun Ġplay Round Of Craft Particles ( world : ĠClient World , Ġmult ib lock : ĠCr after Mult ib lock , Ġparticle Data : ĠCompound Tag ) Ġ{ ĊĊĠĠĠ Ġval Ġcraft Duration Ġ= Ġparticle Data . get Duration ( Duration Data Key ) ĊĠĠĠ Ġif Ġ( craft Duration Ġ== Ġ 0 . ticks ) Ġlog Warning Ġ{ Ġ" Craft Ġinitiated Ġwith Ġ 0 Ġduration ." Ġ} ĊĠĠĠ Ġval Ġcraft StartTime Ġ= Ġparticle Data . getLong ( StartTime Key ) ĊĠĠĠ Ġif Ġ( craft StartTime Ġ== Ġ 0 L ) Ġlog Warning Ġ{ Ġ" Craft Ġstart Ġtime Ġis Ġset Ġto Ġ 0 ." Ġ} ĊĊĊĠĠĠ Ġval Ġho log ram Particle Data Ġ= Ġmult ib lock . get Ho log ram Entities ( world ). map Ġ{ ĊĠĠĠĠĠĠĠ ĠHo log ram Particle Data ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠSh oot s Ġparticles Ġfrom Ġthe Ġ 4 Ġcorners Ġof Ġthe Ġho log ram ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcorner 1 Location Ġ= Ġit . pos Ġ+ Ġvec 3 d ( 0 . 2 , Ġ 0 . 5 , Ġ 0 . 2 ), ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcorner 2 Location Ġ= Ġit . pos Ġ+ Ġvec 3 d ( 0 . 2 , Ġ 0 . 5 , Ġ 0 . 8 ), ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcorner 3 Location Ġ= Ġit . pos Ġ+ Ġvec 3 d ( 0 . 8 , Ġ 0 . 5 , Ġ 0 . 2 ), ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcorner 4 Location Ġ= Ġit . pos Ġ+ Ġvec 3 d ( 0 . 8 , Ġ 0 . 5 , Ġ 0 . 8 ), ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġitem Stack Ġ= Ġit . getItem () ĊĠĠĠĠĠĠĠ Ġ) ĊĠĠĠ Ġ} ĊĊĊĊĠĠĠ ĠCraft Particle Emitter ( world Ġ= Ġworld , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// TODO Ġthis Ġvalue Ġis Ġresponsible Ġon Ġsome Ġway Ġto Ġthe Ġy Ġvalue Ġof Ġwhere Ġthe Ġparticles Ġend ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// Ġat Ġthe Ġend Ġof Ġthe Ġcraft , Ġbut Ġit Ġdoesn 't Ġseem Ġto Ġwork Ġproperly ĊĠĠĠĠĠĠĠĠĠĠĠ Ġcraft Y End Pos Ġ= Ġmult ib lock . center Of Ho log r ams (). y Ġ/* - Ġ 1 . 0 */, Ġ Ġ/* + Ġ 6 . 5 */ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġoriginal End Pos Ġ= Ġmult ib lock . center Of Ho log r ams (), ĊĠĠĠĠĠĠĠĠĠĠĠ Ġall Ho log ram Data Ġ= Ġho log ram Particle Data , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġcraft Duration Ġ= Ġcraft Duration , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġtime Passed Ġ= Ġ( world . time Ġ- Ġcraft StartTime ). ticks ĊĊĠĠĠ Ġ). emit () Ċ } Ċ Ċ // TODO : Ġthe Ġobjects Ġhere Ġseem Ġover comp licated Ċ data Ġclass ĠHo log ram Particle Data ( val Ġcorner 1 Location : ĠVec 3 d , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġcorner 2 Location : ĠVec 3 d , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġcorner 3 Location : ĠVec 3 d , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġcorner 4 Location : ĠVec 3 d , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġitem Stack : ĠItemStack ) Ċ Ċ class ĠCraft Particle Emitter ( val Ġworld : ĠClient World , Ġval Ġcraft Duration : ĠDuration , Ġval Ġoriginal End Pos : ĠVec 3 d , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġcraft Y End Pos : ĠDouble , Ġval Ġall Ho log ram Data : ĠList < Ho log ram Particle Data >, Ġval Ġtime Passed : ĠDuration ) Ġ{ ĊĊĠĠĠ Ġfun Ġemit () Ġ{ ĊĠĠĠĠĠĠĠ Ġfor Ġ( ho log ram Ġin Ġall Ho log ram Data ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( ho log ram . item Stack . item Ġ!= ĠItems . AIR ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġemit Ho log ram Particles ( ho log ram ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ// ĠThis Ġis Ġused Ġto Ġmake Ġparticles Ġstop Ġappearing Ġslightly Ġbefore Ġthe Ġcraft ing Ġstops , Ġsuch Ġthat Ġit Ġlooks Ġlike Ġonce ĠALL Ġparticles Ġhave Ġstopped Ġthe Ġcraft ing Ġis Ġdone . ĊĠĠĠ Ġprivate Ġfun Ġget Relative Ticks Passed ( ho log ram : ĠHo log ram Particle Data ): ĠDuration Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġend Pos : ĠVec 3 d Ġ= Ġcalc End Pos ( time Passed , Ġcraft Duration , Ġoriginal End Pos , Ġcraft Y End Pos ) ĊĠĠĠĠĠĠĠ Ġreturn Ġ( time Passed Ġ+ Ġ( Math Util . minimal Distance Of ( ho log ram . corner 1 Location , Ġend Pos ) Ġ/ Ġcalc Speed ( time Passed ). blocks Per Tick ). round ToInt (). ticks ) ĊĠĠĠ Ġ} ĊĊĊĠĠĠ Ġprivate Ġfun Ġemit Ho log ram Particles ( ho log ram Data : ĠHo log ram Particle Data ) Ġ{ ĊĠĠĠĠĠĠĠ Ġ// ĠMake Ġparticles Ġstop Ġappearing Ġslightly Ġbefore Ġthe Ġcraft ing Ġstops , ĊĠĠĠĠĠĠĠ Ġif Ġ( craft Duration Ġ> Ġget Relative Ticks Passed ( ho log ram Data )) Ġ{ ĊĊĠĠĠĠĠĠĠĠĠĠĠ ĠParticle Builder ( world , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġoriginal End Pos , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġtime Passed , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcraft Duration , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcraft Y End Pos , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġho log ram Data . item Stack ). run Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġshoot Particle From ( ho log ram Data . corner 1 Location ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġshoot Particle From ( ho log ram Data . corner 2 Location ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġshoot Particle From ( ho log ram Data . corner 3 Location ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġshoot Particle From ( ho log ram Data . corner 4 Location ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊ Ċ } Ċ Ċ fun Ġcalc Speed ( time Passed : ĠDuration ): ĠSpeed Ġ{ ĊĠĠĠ Ġreturn ĠBase Block Flight Speed Ġ+ Ġdistance Passed In Ġ{ Ġtime Passed Ġwith ĠBlock Flight Speed Increase PerSecond Ġ}. bps Ċ } Ċ Ċ fun Ġcalc End Pos ( ticks Passed : ĠDuration , Ġtotal Duration : ĠDuration , Ġcenter Of Ho log r ams : ĠVec 3 d , Ġcraft End Y : ĠDouble ): ĠVec 3 d Ġ{ ĊĠĠĠ Ġvar Ġend Y : ĠDouble ĊĠĠĠ Ġend Y Ġ= Ġif Ġ( ticks Passed Ġ>= ĠPhase 2 StartTime ) Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġphase 2 Time Passed Ġ= Ġticks Passed Ġ- ĠPhase 2 StartTime ĊĠĠĠĠĠĠĠ Ġcenter Of Ho log r ams . y Ġ+ Ġdistance Passed In Ġ{ Ġphase 2 Time Passed Ġwith ĠY End Pos Increase Speed Ġ} ĊĠĠĠ Ġ} ĊĊĊĠĠĠ Ġ// ĠCalculates Ġphase Ġ 3 Ġstart Ġtime Ġbased Ġon Ġhow Ġclose Ġthe Ġcraft ing Ġis Ġto Ġending ĊĠĠĠ Ġelse Ġ{ ĊĠĠĠĠĠĠĠ Ġcenter Of Ho log r ams . y ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġval Ġphase 3 StartTime Ġ= Ġ( total Duration Ġ- Ġ(( end Y Ġ- Ġcraft End Y ) Ġ/ ĠSl am down Speed . blocks Per Tick ). round ToInt (). ticks ) ĊĠĠĠ Ġif Ġ( ticks Passed Ġ>= Ġphase 3 StartTime ) Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġphase 3 Ticks Passed Ġ= Ġticks Passed Ġ- Ġphase 3 StartTime ĊĠĠĠĠĠĠĠ Ġend Y Ġ= Ġmax ( craft End Y , Ġend Y Ġ- Ġdistance Passed In Ġ{ Ġphase 3 Ticks Passed Ġwith ĠSl am down Speed Ġ}) ĊĠĠĠ Ġ} ĊĠĠĠ Ġreturn ĠVec 3 d ( center Of Ho log r ams . x , Ġend Y , Ġcenter Of Ho log r ams . z ) Ċ } ĊĊ