Skip to content

Commit

Permalink
Add some pathfinding helper methods
Browse files Browse the repository at this point in the history
  • Loading branch information
fullwall committed Jan 12, 2014
1 parent e71c33b commit 77e3a4f
Show file tree
Hide file tree
Showing 5 changed files with 81 additions and 24 deletions.
14 changes: 13 additions & 1 deletion src/main/java/net/citizensnpcs/api/ai/NavigatorParameters.java
Expand Up @@ -253,6 +253,18 @@ public NavigatorParameters range(float range) {
return this;
}

/**
* Removes a previously added run callback.
*
* @see #addRunCallback(Runnable)
* @param runnable
* The run callback to remove
*/
public NavigatorParameters removeRunCallback(Runnable runnable) {
runCallbacks.remove(runnable);
return this;
}

/**
* @return The modified movement speed as given by {@link #baseSpeed()}
* multiplied by {@link #speedModifier()}
Expand Down Expand Up @@ -343,7 +355,7 @@ public NavigatorParameters stuckAction(StuckAction action) {
/**
* FOR INTERNAL USE ONLY: ticks all {@link Runnable} callbacks.
*/
public void tick() {
public void run() {
for (int i = 0; i < runCallbacks.size(); i++) {
runCallbacks.get(i).run();
}
Expand Down
Expand Up @@ -11,6 +11,15 @@
import org.bukkit.util.Vector;

public class MinecraftBlockExaminer implements BlockExaminer {
private boolean checkLadders(BlockSource source, PathPoint point, Material above, Material below, Material in) {
if (above == Material.LADDER && in == Material.LADDER) {
return true;
}
if (below == Material.LADDER)
return true;
return false;
}

@Override
public float getCost(BlockSource source, PathPoint point) {
Vector pos = point.getVector();
Expand All @@ -35,9 +44,37 @@ public PassableState isPassable(BlockSource source, PathPoint point) {
if (!below.isBlock() || !canStandOn(below)) {
return PassableState.UNPASSABLE;
}
if (!canStandIn(above) || !canStandIn(in)) {
if ((!canStandIn(above) || !canStandIn(in)) /*&& !checkLadders(source, point, above, below, in)*/) {
return PassableState.UNPASSABLE;
}
}/*
if (in == Material.LADDER) {
point.addCallback(new PathCallback() {
boolean added = false;
@Override
public void run(final NPC npc, Block point, double radius) {
if (added || npc.data().<Boolean> get("running-ladder", false)) {
added = true;
return;
}
npc.getNavigator().getLocalParameters().addRunCallback(new Runnable() {
Location dummy = new Location(null, 0, 0, 0);
@Override
public void run() {
System.err.println('d');
if (npc.getEntity().getLocation(dummy).getBlock().getType() == Material.LADDER) {
npc.getEntity().setVelocity(npc.getEntity().getVelocity().setY(0.5));
} else {
npc.getNavigator().getLocalParameters().removeRunCallback(this);
}
}
});
added = true;
npc.data().set("running-ladder", true);
}
});
}*/
return PassableState.PASSABLE;
}

Expand Down Expand Up @@ -89,13 +126,13 @@ public static boolean isLiquid(Material... materials) {
private static final Vector DOWN = new Vector(0, -1, 0);
private static final Set<Material> PASSABLE = EnumSet.of(Material.AIR, Material.DEAD_BUSH, Material.DETECTOR_RAIL,
Material.DIODE, Material.DIODE_BLOCK_OFF, Material.DIODE_BLOCK_ON, Material.FENCE_GATE,
Material.ITEM_FRAME, Material.LADDER, Material.LEVER, Material.LONG_GRASS, Material.CARPET,
Material.MELON_STEM, Material.NETHER_FENCE, Material.PUMPKIN_STEM, Material.POWERED_RAIL, Material.RAILS,
Material.RED_ROSE, Material.RED_MUSHROOM, Material.REDSTONE, Material.REDSTONE_TORCH_OFF,
Material.REDSTONE_TORCH_OFF, Material.REDSTONE_WIRE, Material.SIGN, Material.SIGN_POST, Material.SNOW,
Material.DOUBLE_PLANT, Material.STRING, Material.STONE_BUTTON, Material.SUGAR_CANE_BLOCK,
Material.TRIPWIRE, Material.VINE, Material.WALL_SIGN, Material.WHEAT, Material.WATER, Material.WEB,
Material.WOOD_BUTTON, Material.WOODEN_DOOR, Material.STATIONARY_WATER);
Material.ITEM_FRAME, Material.LEVER, Material.LONG_GRASS, Material.CARPET, Material.MELON_STEM,
Material.NETHER_FENCE, Material.PUMPKIN_STEM, Material.POWERED_RAIL, Material.RAILS, Material.RED_ROSE,
Material.RED_MUSHROOM, Material.REDSTONE, Material.REDSTONE_TORCH_OFF, Material.REDSTONE_TORCH_OFF,
Material.REDSTONE_WIRE, Material.SIGN, Material.SIGN_POST, Material.SNOW, Material.DOUBLE_PLANT,
Material.STRING, Material.STONE_BUTTON, Material.SUGAR_CANE_BLOCK, Material.TRIPWIRE, Material.VINE,
Material.WALL_SIGN, Material.WHEAT, Material.WATER, Material.WEB, Material.WOOD_BUTTON,
Material.WOODEN_DOOR, Material.STATIONARY_WATER);
private static final Set<Material> UNWALKABLE = EnumSet.of(Material.AIR, Material.LAVA, Material.STATIONARY_LAVA,
Material.CACTUS);
private static final Vector UP = new Vector(0, 1, 0);
Expand Down
24 changes: 13 additions & 11 deletions src/main/java/net/citizensnpcs/api/astar/pathfinder/Path.java
Expand Up @@ -43,6 +43,10 @@ public boolean isComplete() {
return index >= path.length;
}

public void run(NPC npc) {
path[index].run(npc);
}

@Override
public String toString() {
return Arrays.toString(path);
Expand All @@ -52,19 +56,11 @@ public String toString() {
public void update(Agent agent) {
if (isComplete())
return;
PathEntry entry = path[index];
if (entry.hasCallbacks()) {
NPC npc = (NPC) agent;
Block block = entry.getBlockUsingWorld(npc.getEntity().getWorld());
for (PathCallback callback : entry.callbacks) {
callback.run(npc, block);
}
}
++index;
}

private static class PathEntry {
final Iterable<PathCallback> callbacks;
final List<PathCallback> callbacks;
final Vector vector;

private PathEntry(Vector vector, List<PathCallback> callbacks) {
Expand All @@ -76,8 +72,14 @@ private Block getBlockUsingWorld(World world) {
return world.getBlockAt(vector.getBlockX(), vector.getBlockY(), vector.getBlockZ());
}

private boolean hasCallbacks() {
return callbacks != null;
public void run(NPC npc) {
if (callbacks != null) {
Block block = getBlockUsingWorld(npc.getEntity().getWorld());
double distance = npc.getStoredLocation().distance(block.getLocation());
for (PathCallback callback : callbacks) {
callback.run(npc, block, distance);
}
}
}

@Override
Expand Down
Expand Up @@ -8,9 +8,11 @@
public interface PathPoint {
void addCallback(PathCallback callback);

PathPoint getParentPoint();

Vector getVector();

public static interface PathCallback {
void run(NPC npc, Block point);
void run(NPC npc, Block point, double radius);
}
}
Expand Up @@ -102,6 +102,11 @@ private VectorNode getNewNode(Vector mod) {
return new VectorNode(mod, blockSource, examiners);
}

@Override
public PathPoint getParentPoint() {
return (PathPoint) getParent();
}

@Override
public Vector getVector() {
return location;
Expand All @@ -110,8 +115,7 @@ public Vector getVector() {
@Override
public int hashCode() {
final int prime = 31;
int result = prime + ((location == null) ? 0 : location.hashCode());
return result;
return prime + ((location == null) ? 0 : location.hashCode());
}

public float heuristicDistance(Vector goal) {
Expand Down

0 comments on commit 77e3a4f

Please sign in to comment.