/
MCNavigationStrategy.java
80 lines (69 loc) · 2.57 KB
/
MCNavigationStrategy.java
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
package net.citizensnpcs.npc.ai;
import org.bukkit.Location;
import org.bukkit.craftbukkit.v1_10_R1.entity.CraftLivingEntity;
import net.citizensnpcs.api.ai.NavigatorParameters;
import net.citizensnpcs.api.ai.TargetType;
import net.citizensnpcs.api.ai.event.CancelReason;
import net.citizensnpcs.api.npc.NPC;
import net.citizensnpcs.util.NMS;
import net.minecraft.server.v1_10_R1.EntityLiving;
import net.minecraft.server.v1_10_R1.NavigationAbstract;
public class MCNavigationStrategy extends AbstractPathStrategy {
private final EntityLiving handle;
private float lastSpeed;
private final NavigationAbstract navigation;
private final NavigatorParameters parameters;
private final Location target;
MCNavigationStrategy(final NPC npc, Location dest, NavigatorParameters params) {
super(TargetType.LOCATION);
this.target = dest;
this.parameters = params;
this.lastSpeed = parameters.speed();
handle = ((CraftLivingEntity) npc.getEntity()).getHandle();
handle.onGround = true;
// not sure of a better way around this - if onGround is false, then
// navigation won't execute, and calling entity.move doesn't
// entirely fix the problem.
navigation = NMS.getNavigation(handle);
navigation.a(dest.getX(), dest.getY(), dest.getZ(), parameters.speed());
if (NMS.isNavigationFinished(navigation)) {
setCancelReason(CancelReason.STUCK);
}
}
private double distanceSquared() {
return handle.getBukkitEntity().getLocation(HANDLE_LOCATION).distanceSquared(target);
}
@Override
public Location getTargetAsLocation() {
return target;
}
@Override
public TargetType getTargetType() {
return TargetType.LOCATION;
}
@Override
public void stop() {
NMS.stopNavigation(navigation);
}
@Override
public String toString() {
return "MCNavigationStrategy [target=" + target + "]";
}
@Override
public boolean update() {
if (getCancelReason() != null)
return true;
if (parameters.speed() != lastSpeed) {
navigation.a(target.getX(), target.getY(), target.getZ(), parameters.speed());
lastSpeed = parameters.speed();
}
navigation.a(parameters.speed());
parameters.run();
if (distanceSquared() < parameters.distanceMargin()) {
stop();
return true;
}
return NMS.isNavigationFinished(navigation);
}
private static final Location HANDLE_LOCATION = new Location(null, 0, 0, 0);
}