diff --git a/src/resources/common/collidables/CollidableBox.java b/src/resources/common/collidables/CollidableBox.java
index 4fd64080..c721b8d6 100644
--- a/src/resources/common/collidables/CollidableBox.java
+++ b/src/resources/common/collidables/CollidableBox.java
@@ -21,7 +21,112 @@
******************************************************************************/
package resources.common.collidables;
-public class CollidableBox {
+import java.util.Random;
+
+import engine.resources.objects.SWGObject;
+import engine.resources.scene.Planet;
+import engine.resources.scene.Point3D;
+
+public class CollidableBox extends AbstractCollidable {
+
+ private Point3D center;
+ private float width;
+ private float height;
+ private float widthHalf;
+ private float heightHalf;
+
+ public CollidableBox(Point3D center, float width, float height, Planet planet) {
+ this.setCenter(center);
+ this.setWidth(width);
+ this.setHeight(height);
+ this.setPlanet(planet);
+ }
+
+ public Point3D getCenter() {
+ return center;
+ }
+
+ public void setCenter(Point3D center) {
+ this.center = center;
+ }
+
+ public float getWidth() {
+ return width;
+ }
+
+ public void setWidth(float width) {
+ this.width = width;
+ this.widthHalf=.5F*width;
+ }
+
+ public float getHeight() {
+ return height;
+ }
+
+ public void setHeight(float height) {
+ this.height = height;
+ this.heightHalf=.5F*height;
+ }
+
+ @Override
+ public boolean doesCollide(SWGObject obj) {
+ Point3D objectPos = obj.getWorldPosition();
+ return (objectPos.x>center.x-widthHalf) &&
+ (objectPos.x
center.z-heightHalf) &&
+ (objectPos.zcenter.x-widthHalf) &&
+ (position.xcenter.z-heightHalf) &&
+ (position.zwidthHalf)
+ randomX = widthHalf - 5;
+ if (randomZ>heightHalf)
+ randomZ = heightHalf - 5;
+ if (new Random().nextFloat()<.5)
+ coordX = center.x + randomX;
+ else
+ coordX = center.x - randomX;
+ if (new Random().nextFloat()<.5)
+ coordZ = center.z + randomZ;
+ else
+ coordZ = center.z - randomZ;
+
+ return new Point3D((float) coordX, 0, (float) coordZ);
+ }
+
+ @Override
+ public Point3D getRandomPosition() {
+ Random random = new Random();
+ float coordX;
+ float coordZ;
+ float randomX = random.nextInt((int) widthHalf);
+ float randomZ = random.nextInt((int) heightHalf);
+ if (new Random().nextFloat()<.5)
+ coordX = center.x + randomX;
+ else
+ coordX = center.x - randomX;
+ if (new Random().nextFloat()<.5)
+ coordZ = center.z + randomZ;
+ else
+ coordZ = center.z - randomZ;
+
+ return new Point3D((float) coordX, 0, (float) coordZ);
+ }
diff --git a/src/services/spawn/SpawnService.java b/src/services/spawn/SpawnService.java
index 752a1171..af6ba774 100644
--- a/src/services/spawn/SpawnService.java
+++ b/src/services/spawn/SpawnService.java
@@ -38,6 +38,7 @@ import java.util.concurrent.ConcurrentHashMap;
import java.util.concurrent.Executors;
import java.util.concurrent.ScheduledExecutorService;
+import resources.common.collidables.CollidableBox;
import resources.common.collidables.CollidableCircle;
import resources.datatables.Options;
import resources.datatables.PvpStatus;
@@ -556,6 +557,7 @@ public class SpawnService {
}
}
+ // Circular LairSpawnArea
public void addLairSpawnArea(String lairGroup, float x, float z, float radius, String planetName) {
LairGroupTemplate lairGroupTemplate = lairGroupTemplates.get(lairGroup);
Planet planet = core.terrainService.getPlanetByName(planetName);
@@ -567,6 +569,19 @@ public class SpawnService {
core.simulationService.addCollidable(collidableCircle, x, z);
}
+ // Rectangular LairSpawnArea
+ public void addLairSpawnArea(String lairGroup, float x, float z, float width, float height, String planetName) {
+ LairGroupTemplate lairGroupTemplate = lairGroupTemplates.get(lairGroup);
+ Planet planet = core.terrainService.getPlanetByName(planetName);
+ if(lairGroupTemplate == null || planet == null)
+ return;
+ CollidableBox collidableBox = new CollidableBox(new Point3D(x, 0, z), width, height, planet);
+ LairSpawnArea lairSpawnArea = new LairSpawnArea(planet, collidableBox, lairGroupTemplate);
+ spawnAreas.get(planet).add(lairSpawnArea);
+ core.simulationService.addCollidable(collidableBox, x, z);
+ }
+
+ // Circular DynamicSpawnArea
public void addDynamicSpawnArea(String dynamicGroup, float x, float z, float radius, String planetName) {
DynamicSpawnGroup dynamicGroupTemplate = dynamicGroupTemplates.get(dynamicGroup);
Planet planet = core.terrainService.getPlanetByName(planetName);
@@ -578,6 +593,19 @@ public class SpawnService {
core.simulationService.addCollidable(collidableCircle, x, z);
}
+ // Rectangular DynamicSpawnArea
+ public void addDynamicSpawnArea(String dynamicGroup, float x, float z, float width, float height, String planetName) {
+ DynamicSpawnGroup dynamicGroupTemplate = dynamicGroupTemplates.get(dynamicGroup);
+ Planet planet = core.terrainService.getPlanetByName(planetName);
+ if(dynamicGroupTemplate == null || planet == null)
+ return;
+ CollidableBox collidableBox = new CollidableBox(new Point3D(x, 0, z), width, height, planet);
+ DynamicSpawnArea dynamicSpawnArea = new DynamicSpawnArea(planet, collidableBox, dynamicGroupTemplate);
+ spawnAreas.get(planet).add(dynamicSpawnArea);
+ core.simulationService.addCollidable(collidableBox, x, z);
+ }
+
+ // Circular DynamicSpawnArea with Vector argument
public void addDynamicSpawnArea(Vector dynamicGroups, float x, float z, float radius, String planetName) {
Vector dynamicSpawnGroups = new Vector();
for (String template : dynamicGroups){
@@ -597,6 +625,27 @@ public class SpawnService {
core.simulationService.addCollidable(collidableCircle, x, z);
}
+ // Rectangular DynamicSpawnArea with Vector argument
+ public void addDynamicSpawnArea(Vector dynamicGroups, float x, float z, float width, float height, String planetName) {
+ Vector dynamicSpawnGroups = new Vector();
+ for (String template : dynamicGroups){
+ if (dynamicGroupTemplates.get(template)==null){
+ System.err.println("Dynamic Group template " + template +" not found in spawnservice collection!");
+ return;
+ }
+ dynamicSpawnGroups.add(dynamicGroupTemplates.get(template));
+ }
+
+ Planet planet = core.terrainService.getPlanetByName(planetName);
+ if(dynamicSpawnGroups == null || dynamicSpawnGroups.size() == 0 || planet == null)
+ return;
+ CollidableBox collidableBox = new CollidableBox(new Point3D(x, 0, z), width, height, planet);
+ DynamicSpawnArea dynamicSpawnArea = new DynamicSpawnArea(planet, collidableBox, dynamicSpawnGroups);
+ spawnAreas.get(planet).add(dynamicSpawnArea);
+ core.simulationService.addCollidable(collidableBox, x, z);
+ }
+
+ // Circular MixedSpawnArea
public void addMixedSpawnArea(Vector passedGroups, float x, float z, float radius, String planetName) {
Vector mixedSpawnGroups = new Vector();
for (String template : passedGroups){
@@ -618,6 +667,29 @@ public class SpawnService {
spawnAreas.get(planet).add(dynamicSpawnArea);
core.simulationService.addCollidable(collidableCircle, x, z);
}
+
+ // Rectangular MixedSpawnArea
+ public void addMixedSpawnArea(Vector passedGroups, float x, float z, float width, float height, String planetName) {
+ Vector mixedSpawnGroups = new Vector();
+ for (String template : passedGroups){
+ if (dynamicGroupTemplates.get(template)!=null){
+ mixedSpawnGroups.add(dynamicGroupTemplates.get(template));
+ }
+ if (lairGroupTemplates.get(template)!=null){
+ mixedSpawnGroups.add(lairGroupTemplates.get(template));
+ }
+ if(dynamicGroupTemplates.get(template) == null && lairGroupTemplates.get(template)==null)
+ return;
+ }
+
+ Planet planet = core.terrainService.getPlanetByName(planetName);
+ if(mixedSpawnGroups == null || mixedSpawnGroups.size() == 0 || planet == null)
+ return;
+ CollidableBox collidableBox = new CollidableBox(new Point3D(x, 0, z), width, height, planet);
+ MixedSpawnArea dynamicSpawnArea = new MixedSpawnArea(planet, collidableBox, mixedSpawnGroups);
+ spawnAreas.get(planet).add(dynamicSpawnArea);
+ core.simulationService.addCollidable(collidableBox, x, z);
+ }
public Map getMobileTemplates() {
return mobileTemplates;