@@ -5,16 +5,19 @@ import de.metaphoriker.pathetic.api.pathing.Pathfinder
55import de.metaphoriker.pathetic.api.pathing.filter.PathFilter
66import de.metaphoriker.pathetic.api.pathing.result.PathfinderResult
77import io.github.dockyardmc.entity.Entity
8+ import io.github.dockyardmc.events.EntityNavigatorPickOffsetEvent
9+ import io.github.dockyardmc.events.Events
810import io.github.dockyardmc.location.Location
911import io.github.dockyardmc.pathfinding.PatheticPlatformDockyard.toLocation
1012import io.github.dockyardmc.pathfinding.PatheticPlatformDockyard.toPathPosition
1113import io.github.dockyardmc.runnables.ticks
1214import io.github.dockyardmc.scheduler.SchedulerTask
1315import io.github.dockyardmc.utils.Disposable
1416import io.github.dockyardmc.utils.UsedAfterDisposedException
17+ import io.github.dockyardmc.utils.getEntityEventContext
1518import io.github.dockyardmc.utils.locationLerp
1619
17- class Navigator (val entity : Entity , var speedTicksPerBlock : Int , val pathfinder : Pathfinder , val filters : List <PathFilter >): Disposable {
20+ class Navigator (val entity : Entity , var speedTicksPerBlock : Int , val pathfinder : Pathfinder , val filters : List <PathFilter >) : Disposable {
1821
1922 var state = State .IDLE
2023 private set
@@ -29,15 +32,16 @@ class Navigator(val entity: Entity, var speedTicksPerBlock: Int, val pathfinder:
2932 private var newPathQueue = mutableListOf<Location >()
3033
3134 private var currentTask: SchedulerTask ? = null
35+ private var currentInterpolationTask: SchedulerTask ? = null
3236 val navigationSchedulerTask get() = currentTask
3337
3438 private var currentNavigationNodeIndex = 0
3539
3640 val currentPath get() = path.toList()
3741
3842 fun updatePathfindingPath (target : Location ) {
39- if (state == State .DISPOSED ) throw UsedAfterDisposedException (this )
40- if (isCurrentlyPathfinding) return
43+ if (state == State .DISPOSED ) throw UsedAfterDisposedException (this )
44+ if (isCurrentlyPathfinding) return
4145 val start = entity.location.getBlockLocation().subtract(0 , 1 , 0 ).toPathPosition()
4246 val end = target.toPathPosition()
4347
@@ -52,7 +56,13 @@ class Navigator(val entity: Entity, var speedTicksPerBlock: Int, val pathfinder:
5256 return @thenAccept
5357 }
5458
55- val newPath = result.path.map { it.toLocation() }.toMutableList()
59+ val newPath = result.path.map { pathPosition ->
60+ val event = EntityNavigatorPickOffsetEvent (entity, this , pathPosition.toLocation(), getEntityEventContext(entity))
61+ Events .dispatch(event)
62+
63+ event.location
64+ }.toMutableList()
65+
5666 newPathQueue = newPath
5767 if (currentTask == null ) startNavigating()
5868 }
@@ -63,12 +73,12 @@ class Navigator(val entity: Entity, var speedTicksPerBlock: Int, val pathfinder:
6373 path.clear()
6474 path.addAll(newPathQueue)
6575 newPathQueue.clear()
66- currentNavigationNodeIndex = if (path.size >= 5 ) 2 else 1
76+ currentNavigationNodeIndex = if (path.size >= 5 ) 2 else 1
6777 }
6878 }
6979
7080 private fun startNavigating () {
71- if (state == State .DISPOSED ) throw UsedAfterDisposedException (this )
81+ if (state == State .DISPOSED ) throw UsedAfterDisposedException (this )
7282 state = State .NAVIGATING
7383 cancelNavigating()
7484 updatePathWhileNavigating()
@@ -91,12 +101,14 @@ class Navigator(val entity: Entity, var speedTicksPerBlock: Int, val pathfinder:
91101 }
92102
93103 var j = 0
94- entity.world.scheduler.repeat(speedTicksPerBlock, 1 .ticks) { lerpLoop ->
104+ currentInterpolationTask = entity.world.scheduler.repeat(speedTicksPerBlock, 1 .ticks) { _ ->
105+ if (entity.isDead) return @repeat
95106 j++
96107 val progress = j / speedTicksPerBlock.toDouble()
97108 val interpolated = locationLerp(currentStepPosition, normalizePathLocation(nextStepPosition), progress.toFloat())
98109 val direction = interpolated.toVector3d() - (entity.location).toVector3d()
99- entity.teleport(interpolated.setDirection(direction))
110+ val location = interpolated.setDirection(direction)
111+ entity.teleport(location)
100112
101113 if (j == speedTicksPerBlock) {
102114 currentNavigationNodeIndex++
@@ -108,7 +120,9 @@ class Navigator(val entity: Entity, var speedTicksPerBlock: Int, val pathfinder:
108120
109121 fun cancelNavigating () {
110122 currentTask?.cancel()
123+ currentInterpolationTask?.cancel()
111124 currentTask = null
125+ currentInterpolationTask = null
112126 }
113127
114128 enum class State {
0 commit comments