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.xcenter.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;