Skip to content

Commit

Permalink
Add FlyingBlockExaminer and fix an issue with cloning NavigatorParame…
Browse files Browse the repository at this point in the history
…ters
  • Loading branch information
fullwall committed Nov 4, 2013
1 parent eea753c commit 9c9e250
Show file tree
Hide file tree
Showing 7 changed files with 85 additions and 28 deletions.
15 changes: 12 additions & 3 deletions src/main/java/net/citizensnpcs/api/ai/NavigatorParameters.java
@@ -1,5 +1,6 @@
package net.citizensnpcs.api.ai;

import java.util.ArrayList;
import java.util.List;

import net.citizensnpcs.api.ai.event.CancelReason;
Expand All @@ -13,10 +14,10 @@ public class NavigatorParameters implements Cloneable {
private AttackStrategy attackStrategy;
private boolean avoidWater;
private float baseSpeed = 1F;
private final List<NavigatorCallback> callbacks = Lists.newArrayListWithExpectedSize(3);
private List<NavigatorCallback> callbacks = Lists.newArrayListWithExpectedSize(3);
private AttackStrategy defaultStrategy;
private double distanceMargin = 2F;
private final List<BlockExaminer> examiners = Lists.newArrayList();
private List<BlockExaminer> examiners = Lists.newArrayList();
private float range;
private float speedModifier = 1F;
private int stationaryTicks = -1;
Expand Down Expand Up @@ -109,9 +110,17 @@ public NavigatorParameters clearExaminers() {
}

@Override
@SuppressWarnings("unchecked")
public NavigatorParameters clone() {
try {
return (NavigatorParameters) super.clone();
NavigatorParameters clone = (NavigatorParameters) super.clone();
if (callbacks instanceof ArrayList) {
clone.callbacks = (List<NavigatorCallback>) ((ArrayList<NavigatorCallback>) callbacks).clone();
}
if (examiners instanceof ArrayList) {
clone.examiners = (List<BlockExaminer>) ((ArrayList<BlockExaminer>) examiners).clone();
}
return clone;
} catch (CloneNotSupportedException e) {
return null;
}
Expand Down
@@ -0,0 +1,30 @@
package net.citizensnpcs.api.astar.pathfinder;

import org.bukkit.Material;
import org.bukkit.util.Vector;

public class FlyingBlockExaminer implements BlockExaminer {
@Override
public float getCost(BlockSource source, PathPoint point) {
Vector pos = point.getVector();
Material above = source.getMaterialAt(pos.clone().add(UP));
Material in = source.getMaterialAt(pos);
if (above == Material.WEB || in == Material.WEB) {
return 1F;
}
return 0.5F;
}

@Override
public boolean isPassable(BlockSource source, PathPoint point) {
Vector pos = point.getVector();
Material above = source.getMaterialAt(pos.clone().add(UP));
Material in = source.getMaterialAt(pos);
if (MinecraftBlockExaminer.isLiquid(above, in)) {
return false;
}
return MinecraftBlockExaminer.canStandIn(above, in);
}

private static final Vector UP = new Vector(0, 1, 0);
}
@@ -1,5 +1,6 @@
package net.citizensnpcs.api.astar.pathfinder;

import java.util.Arrays;
import java.util.EnumSet;
import java.util.Set;

Expand All @@ -9,16 +10,6 @@
import org.bukkit.util.Vector;

public class MinecraftBlockExaminer implements BlockExaminer {
private boolean contains(Material[] search, Material... find) {
for (Material haystack : search) {
for (Material needle : find) {
if (haystack == needle)
return true;
}
}
return false;
}

@Override
public float getCost(BlockSource source, PathPoint point) {
Vector pos = point.getVector();
Expand All @@ -34,10 +25,6 @@ public float getCost(BlockSource source, PathPoint point) {
return 0.5F; // TODO: add light level-specific costs
}

private boolean isLiquid(Material... materials) {
return contains(materials, Material.WATER, Material.STATIONARY_WATER, Material.LAVA, Material.STATIONARY_LAVA);
}

@Override
public boolean isPassable(BlockSource source, PathPoint point) {
Vector pos = point.getVector();
Expand All @@ -53,8 +40,8 @@ public boolean isPassable(BlockSource source, PathPoint point) {
return true;
}

public static boolean canStandIn(Material mat) {
return PASSABLE.contains(mat);
public static boolean canStandIn(Material... mat) {
return PASSABLE.containsAll(Arrays.asList(mat));
}

public static boolean canStandOn(Block block) {
Expand All @@ -67,6 +54,20 @@ public static boolean canStandOn(Material mat) {
return !UNWALKABLE.contains(mat) && !PASSABLE.contains(mat);
}

private static boolean contains(Material[] search, Material... find) {
for (Material haystack : search) {
for (Material needle : find) {
if (haystack == needle)
return true;
}
}
return false;
}

public static boolean isLiquid(Material... materials) {
return contains(materials, Material.WATER, Material.STATIONARY_WATER, Material.LAVA, Material.STATIONARY_LAVA);
}

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,
Expand All @@ -79,6 +80,5 @@ public static boolean canStandOn(Material mat) {
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);
}
3 changes: 2 additions & 1 deletion src/main/java/net/citizensnpcs/api/npc/AbstractNPC.java
Expand Up @@ -315,8 +315,9 @@ public void save(DataKey root) {
}
if (traitNames.length() > 0) {
root.setString("traitnames", traitNames.substring(0, traitNames.length() - 1));
} else
} else {
root.setString("traitnames", "");
}
for (String name : removedTraits) {
root.removeKey("traits." + name);
}
Expand Down
Expand Up @@ -102,10 +102,11 @@ private static void deserialise(PersistField field, DataKey root) throws Excepti
List<Object> list = (List<Object>) (!List.class.isAssignableFrom(collectionType) ? Lists.newArrayList()
: collectionType.newInstance());
Object raw = root.getRaw(field.key);
if (raw instanceof List && collectionType.isAssignableFrom(raw.getClass()))
if (raw instanceof List && collectionType.isAssignableFrom(raw.getClass())) {
list = (List<Object>) raw;
else
} else {
deserialiseCollection(list, root, field);
}
value = list;
} else if (Set.class.isAssignableFrom(type)) {
Set<Object> set;
Expand Down Expand Up @@ -335,8 +336,9 @@ public static void registerPersistDelegate(Class<?> clazz, Class<? extends Persi
public static void save(Object instance, DataKey root) {
Class<?> clazz = instance.getClass();
Field[] fields = getFields(clazz);
for (Field field : fields)
for (Field field : fields) {
serialise(new PersistField(field, instance), root);
}
}

private static void serialise(PersistField field, DataKey root) {
Expand Down Expand Up @@ -369,8 +371,9 @@ private static void serialiseValue(PersistField field, DataKey root, Object valu
((Persister<Object>) field.delegate).save(value, root);
} else if (value instanceof Enum) {
root.setRaw("", ((Enum<?>) value).name());
} else
} else {
root.setRaw("", value);
}
}

private static final Map<Class<?>, Field[]> fieldCache = new WeakHashMap<Class<?>, Field[]>();
Expand Down
7 changes: 4 additions & 3 deletions src/main/java/net/citizensnpcs/api/trait/trait/Inventory.java
@@ -1,14 +1,14 @@
package net.citizensnpcs.api.trait.trait;

import java.util.Arrays;

import net.citizensnpcs.api.exception.NPCLoadException;
import net.citizensnpcs.api.trait.Trait;
import net.citizensnpcs.api.util.DataKey;
import net.citizensnpcs.api.util.ItemStorage;

import org.bukkit.inventory.ItemStack;

import java.util.Arrays;

/**
* Represents an NPC's inventory.
*/
Expand Down Expand Up @@ -47,8 +47,9 @@ public void save(DataKey key) {
for (ItemStack item : contents) {
// Clear previous items to avoid conflicts
key.removeKey(String.valueOf(slot));
if (item != null)
if (item != null) {
ItemStorage.saveItem(key.getRelative(String.valueOf(slot)), item);
}
slot++;
}
}
Expand Down
Expand Up @@ -50,6 +50,14 @@ public void loadsCollections() {
}
}

@Test
public void longLoadSaveTest() {
LongLoadSaveTest load = new LongLoadSaveTest();
PersistenceLoader.save(load, root);
PersistenceLoader.load(load, root);
assertEquals(load.term, 234234233);
}

@Test
public void processesRequiredCorrectly() {
assertThat(PersistenceLoader.load(RequiredTest.class, root), is(nullValue()));
Expand Down Expand Up @@ -115,6 +123,11 @@ public static class InferenceTest {
public Map<String, Integer> map = new ConcurrentHashMap<String, Integer>();
}

public static class LongLoadSaveTest {
@Persist
private final long term = 234234233;
}

public static class RequiredTest {
@Persist(required = true)
private int requiredInteger;
Expand Down

0 comments on commit 9c9e250

Please sign in to comment.