mirror of
https://github.com/CitizensDev/Citizens2.git
synced 2024-11-30 06:33:56 +01:00
Implement SwimmingExaminer
This commit is contained in:
parent
01f00960d7
commit
a8fe35a19d
@ -1,17 +1,11 @@
|
|||||||
package net.citizensnpcs.npc.ai;
|
package net.citizensnpcs.npc.ai;
|
||||||
|
|
||||||
import java.util.Iterator;
|
import java.util.Iterator;
|
||||||
import java.util.ListIterator;
|
|
||||||
|
|
||||||
import org.bukkit.Bukkit;
|
import org.bukkit.Bukkit;
|
||||||
import org.bukkit.Location;
|
import org.bukkit.Location;
|
||||||
import org.bukkit.Material;
|
|
||||||
import org.bukkit.block.Block;
|
|
||||||
import org.bukkit.block.BlockFace;
|
|
||||||
import org.bukkit.block.BlockState;
|
|
||||||
import org.bukkit.entity.Entity;
|
import org.bukkit.entity.Entity;
|
||||||
import org.bukkit.entity.LivingEntity;
|
import org.bukkit.entity.LivingEntity;
|
||||||
import org.bukkit.material.Door;
|
|
||||||
import org.bukkit.util.Vector;
|
import org.bukkit.util.Vector;
|
||||||
|
|
||||||
import com.google.common.collect.Iterables;
|
import com.google.common.collect.Iterables;
|
||||||
@ -31,11 +25,9 @@ import net.citizensnpcs.api.ai.event.NavigationCompleteEvent;
|
|||||||
import net.citizensnpcs.api.ai.event.NavigationReplaceEvent;
|
import net.citizensnpcs.api.ai.event.NavigationReplaceEvent;
|
||||||
import net.citizensnpcs.api.ai.event.NavigationStuckEvent;
|
import net.citizensnpcs.api.ai.event.NavigationStuckEvent;
|
||||||
import net.citizensnpcs.api.ai.event.NavigatorCallback;
|
import net.citizensnpcs.api.ai.event.NavigatorCallback;
|
||||||
import net.citizensnpcs.api.astar.pathfinder.BlockExaminer;
|
import net.citizensnpcs.api.astar.pathfinder.DoorExaminer;
|
||||||
import net.citizensnpcs.api.astar.pathfinder.BlockSource;
|
|
||||||
import net.citizensnpcs.api.astar.pathfinder.MinecraftBlockExaminer;
|
import net.citizensnpcs.api.astar.pathfinder.MinecraftBlockExaminer;
|
||||||
import net.citizensnpcs.api.astar.pathfinder.PathPoint;
|
import net.citizensnpcs.api.astar.pathfinder.SwimmingExaminer;
|
||||||
import net.citizensnpcs.api.astar.pathfinder.PathPoint.PathCallback;
|
|
||||||
import net.citizensnpcs.api.npc.NPC;
|
import net.citizensnpcs.api.npc.NPC;
|
||||||
import net.citizensnpcs.api.util.DataKey;
|
import net.citizensnpcs.api.util.DataKey;
|
||||||
import net.citizensnpcs.util.NMS;
|
import net.citizensnpcs.util.NMS;
|
||||||
@ -59,6 +51,7 @@ public class CitizensNavigator implements Navigator, Runnable {
|
|||||||
|
|
||||||
public CitizensNavigator(NPC npc) {
|
public CitizensNavigator(NPC npc) {
|
||||||
this.npc = npc;
|
this.npc = npc;
|
||||||
|
defaultParams.examiner(new SwimmingExaminer(npc));
|
||||||
if (Setting.NEW_PATHFINDER_OPENS_DOORS.asBoolean()) {
|
if (Setting.NEW_PATHFINDER_OPENS_DOORS.asBoolean()) {
|
||||||
defaultParams.examiner(new DoorExaminer());
|
defaultParams.examiner(new DoorExaminer());
|
||||||
}
|
}
|
||||||
@ -383,41 +376,6 @@ public class CitizensNavigator implements Navigator, Runnable {
|
|||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
public static class DoorExaminer implements BlockExaminer {
|
|
||||||
@Override
|
|
||||||
public float getCost(BlockSource source, PathPoint point) {
|
|
||||||
return 0F;
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public PassableState isPassable(BlockSource source, PathPoint point) {
|
|
||||||
Material in = source.getMaterialAt(point.getVector());
|
|
||||||
if (MinecraftBlockExaminer.isDoor(in)) {
|
|
||||||
point.addCallback(new DoorOpener());
|
|
||||||
return PassableState.PASSABLE;
|
|
||||||
}
|
|
||||||
return PassableState.IGNORE;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
private static class DoorOpener implements PathCallback {
|
|
||||||
@Override
|
|
||||||
public void run(NPC npc, Block point, ListIterator<Block> path) {
|
|
||||||
BlockState state = point.getState();
|
|
||||||
Door door = (Door) state.getData();
|
|
||||||
if (npc.getStoredLocation().distance(point.getLocation()) < 2) {
|
|
||||||
boolean bottom = !door.isTopHalf();
|
|
||||||
Block set = bottom ? point : point.getRelative(BlockFace.DOWN);
|
|
||||||
state = set.getState();
|
|
||||||
door = (Door) state.getData();
|
|
||||||
door.setOpen(true);
|
|
||||||
state.setData(door);
|
|
||||||
state.update();
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
private static final Location STATIONARY_LOCATION = new Location(null, 0, 0, 0);
|
private static final Location STATIONARY_LOCATION = new Location(null, 0, 0, 0);
|
||||||
|
|
||||||
private static int UNINITIALISED_SPEED = Integer.MIN_VALUE;
|
private static int UNINITIALISED_SPEED = Integer.MIN_VALUE;
|
||||||
}
|
}
|
||||||
|
@ -34,7 +34,7 @@ public class EnhancedMovementExaminer implements NeighbourGeneratorBlockExaminer
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
return null;
|
return neighbours;
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
|
@ -273,7 +273,7 @@ public class GuidedWaypointProvider implements EnumerableWaypointProvider {
|
|||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
Waypoint target = available.get(Util.getFastRandom().nextInt(available.size()));
|
Waypoint target = available.get(Util.getFastRandom().nextInt(available.size()));
|
||||||
plan = ASTAR.runFully(new GuidedGoal(target), new GuidedNode(new Waypoint(npc.getStoredLocation())));
|
plan = ASTAR.runFully(new GuidedGoal(target), new GuidedNode(null, new Waypoint(npc.getStoredLocation())));
|
||||||
return plan != null;
|
return plan != null;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -309,7 +309,8 @@ public class GuidedWaypointProvider implements EnumerableWaypointProvider {
|
|||||||
private class GuidedNode extends AStarNode {
|
private class GuidedNode extends AStarNode {
|
||||||
private final Waypoint waypoint;
|
private final Waypoint waypoint;
|
||||||
|
|
||||||
public GuidedNode(Waypoint waypoint) {
|
public GuidedNode(GuidedNode parent, Waypoint waypoint) {
|
||||||
|
super(parent);
|
||||||
this.waypoint = waypoint;
|
this.waypoint = waypoint;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -350,7 +351,7 @@ public class GuidedWaypointProvider implements EnumerableWaypointProvider {
|
|||||||
return Iterables.transform(res, new Function<DistanceResult<Region3D<Waypoint>>, AStarNode>() {
|
return Iterables.transform(res, new Function<DistanceResult<Region3D<Waypoint>>, AStarNode>() {
|
||||||
@Override
|
@Override
|
||||||
public AStarNode apply(DistanceResult<Region3D<Waypoint>> arg0) {
|
public AStarNode apply(DistanceResult<Region3D<Waypoint>> arg0) {
|
||||||
return new GuidedNode(arg0.get().getData());
|
return new GuidedNode(GuidedNode.this, arg0.get().getData());
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
Loading…
Reference in New Issue
Block a user