diff --git a/src/resources/objects/SWGObject.java b/src/resources/objects/SWGObject.java index b55b82ae..8f3426ed 100644 --- a/src/resources/objects/SWGObject.java +++ b/src/resources/objects/SWGObject.java @@ -77,6 +77,8 @@ public abstract class SWGObject implements Serializable, Comparable { private int volume = 0; private float complexity = 1; private int containerType = 0; + private boolean isBuildout = false; + private double loadRange = 0; private int slotArrangement = -1; @@ -419,6 +421,22 @@ public abstract class SWGObject implements Serializable, Comparable { public int getMaxContainerSize() { return Integer.valueOf(templateAttributes.get("containerVolumeLimit").toString()); } + + public void setBuildout(boolean buildout) { + this.isBuildout = buildout; + } + + public boolean isBuildout() { + return isBuildout; + } + + public double getLoadRange() { + return loadRange; + } + + public void setLoadRange(double range) { + this.loadRange = range; + } public ContainerPermissions getContainerPermissions() { return containerPermissions; } diff --git a/src/resources/objects/buildouts/TerrainBuildoutLoader.java b/src/resources/objects/buildouts/TerrainBuildoutLoader.java index 08642075..f4a5c693 100644 --- a/src/resources/objects/buildouts/TerrainBuildoutLoader.java +++ b/src/resources/objects/buildouts/TerrainBuildoutLoader.java @@ -87,6 +87,8 @@ class TerrainBuildoutLoader { for (int row = 0; row < areaTable.getRowCount(); row++) { buildoutRow.load(areaTable.getRow(row), crcTable); SWGObject object = createObject(buildoutRow); + object.setBuildout(true); + object.setLoadRange(buildoutRow.getRadius()); addObject(object, buildoutRow.getContainerId()); setCellInformation(object, buildoutRow.getCellIndex()); updatePermissions(object); diff --git a/src/services/objects/ObjectAwareness.java b/src/services/objects/ObjectAwareness.java index d6adc765..aa25285f 100644 --- a/src/services/objects/ObjectAwareness.java +++ b/src/services/objects/ObjectAwareness.java @@ -13,7 +13,7 @@ import resources.objects.quadtree.QuadTree; public class ObjectAwareness { - private static final double AWARE_RANGE = 200; + private static final double AWARE_RANGE = 1024; private final Map > quadTree; @@ -60,6 +60,8 @@ public class ObjectAwareness { } public void update(SWGObject obj) { + if (obj.isBuildout()) + return; Location l = obj.getLocation(); if (invalidLocation(l)) return; @@ -68,7 +70,7 @@ public class ObjectAwareness { synchronized (tree) { List range = tree.getWithinRange(l.getX(), l.getZ(), AWARE_RANGE); for (SWGObject inRange : range) { - if (isValidInRange(obj, inRange)) + if (isValidInRange(obj, inRange, l)) objectAware.add(inRange); } } @@ -83,12 +85,26 @@ public class ObjectAwareness { return l == null || l.getTerrain() == null; } - private boolean isValidInRange(SWGObject obj, SWGObject inRange) { + private boolean isValidInRange(SWGObject obj, SWGObject inRange, Location objLoc) { if (inRange.getObjectId() == obj.getObjectId()) return false; if (inRange instanceof CreatureObject && inRange.getOwner() == null) return false; + Location inRangeLoc = inRange.getLocation(); + double distSquared = distanceSquared(objLoc, inRangeLoc); + if (inRange.getLoadRange() != 0 && distSquared > square(inRange.getLoadRange())) + return false; + if (inRange.getLoadRange() == 0 && distSquared > 200) + return false; return true; } + private double distanceSquared(Location l1, Location l2) { + return square(l1.getX()-l2.getX()) + square(l1.getY()-l2.getY()) + square(l1.getZ()-l2.getZ()); + } + + private double square(double x) { + return x * x; + } + } \ No newline at end of file