diff --git a/options.cfg b/options.cfg index 03abf4cf..4a7be4e0 100644 --- a/options.cfg +++ b/options.cfg @@ -1,7 +1,7 @@ -LOAD.SNAPSHOT_OBJECTS=1 -LOAD.BUILDOUT_OBJECTS=1 +LOAD.SNAPSHOT_OBJECTS=0 +LOAD.BUILDOUT_OBJECTS=0 #LOAD.BUILDOUT_ONLY_FOR="dantooine" LOAD.RESOURCE.SYSTEM=1 # Misc -CLEAN.ODB.FOLDERS=0 \ No newline at end of file +CLEAN.ODB.FOLDERS=1 \ No newline at end of file diff --git a/scripts/mobiles/dynamicgroups/piket_plains_walker_group.py b/scripts/mobiles/dynamicgroups/piket_plains_walker_group.py index 84bdefe0..2d6914b7 100644 --- a/scripts/mobiles/dynamicgroups/piket_plains_walker_group.py +++ b/scripts/mobiles/dynamicgroups/piket_plains_walker_group.py @@ -8,6 +8,9 @@ def addDynamicGroup(core): dynamicGroup = DynamicSpawnGroup() mobileTemplates = Vector() mobileTemplates.add('piket_plains_walker') + mobileTemplates.add('piket_plains_walker') + mobileTemplates.add('piket_plains_walker') + mobileTemplates.add('piket_plains_walker') dynamicGroup.setMobiles(mobileTemplates) dynamicGroup.setGroupMembersNumber(-3) dynamicGroup.setName('piket_plains_walker_group') diff --git a/scripts/mobiles/spawnareas/dantooine_mining_lair.py b/scripts/mobiles/spawnareas/dantooine_mining_lair.py index f3fba3f0..a4e6734a 100644 --- a/scripts/mobiles/spawnareas/dantooine_mining_lair.py +++ b/scripts/mobiles/spawnareas/dantooine_mining_lair.py @@ -1,6 +1,7 @@ # Spawn Area file created with PSWG Planetary Spawn Tool import sys +from java.util import Vector def addSpawnArea(core): - core.spawnService.addLairSpawnArea('mixed_lair_group_1', 0, 2355, 1024, 'dantooine') + #core.spawnService.addLairSpawnArea('mixed_lair_group_1', 0, 2355, 1024, 'dantooine') return diff --git a/scripts/mobiles/spawnareas/dantooine_mining_mixed.py b/scripts/mobiles/spawnareas/dantooine_mining_mixed.py new file mode 100644 index 00000000..7fd81cad --- /dev/null +++ b/scripts/mobiles/spawnareas/dantooine_mining_mixed.py @@ -0,0 +1,11 @@ +# Spawn Area file created with PSWG Planetary Spawn Tool +import sys +from java.util import Vector + +def addSpawnArea(core): + mixedGroups = Vector() + mixedGroups.add('piket_plains_walker_group') + mixedGroups.add('mixed_lair_group_1') + mixedGroups.add('naboo_starter') + core.spawnService.addMixedSpawnArea(mixedGroups, 0, 2355, 1024, 'dantooine') + return diff --git a/src/services/spawn/DynamicSpawnGroup.java b/src/services/spawn/DynamicSpawnGroup.java index da3df12e..ceaed7d1 100644 --- a/src/services/spawn/DynamicSpawnGroup.java +++ b/src/services/spawn/DynamicSpawnGroup.java @@ -23,7 +23,7 @@ package services.spawn; import java.util.Vector; -public class DynamicSpawnGroup { +public class DynamicSpawnGroup extends SpawnGroup { private Vector mobiles; private String name; diff --git a/src/services/spawn/LairGroupTemplate.java b/src/services/spawn/LairGroupTemplate.java index 4cca3ea2..49e816ba 100644 --- a/src/services/spawn/LairGroupTemplate.java +++ b/src/services/spawn/LairGroupTemplate.java @@ -2,7 +2,7 @@ package services.spawn; import java.util.Vector; -public class LairGroupTemplate { +public class LairGroupTemplate extends SpawnGroup{ private Vector lairSpawnTemplates; private String name; diff --git a/src/services/spawn/MixedSpawnArea.java b/src/services/spawn/MixedSpawnArea.java index 4a24c44d..e0b0a68b 100644 --- a/src/services/spawn/MixedSpawnArea.java +++ b/src/services/spawn/MixedSpawnArea.java @@ -35,6 +35,7 @@ import resources.common.collidables.AbstractCollidable.ExitEvent; import resources.objects.creature.CreatureObject; import services.TerrainService; import services.SimulationService.MoveEvent; +import services.ai.LairActor; import engine.resources.objects.SWGObject; import engine.resources.scene.Planet; import engine.resources.scene.Point3D; @@ -44,6 +45,8 @@ public class MixedSpawnArea extends SpawnArea { private SpawnGroup spawnGroup; private Vector spawnGroups; private Vector mobiles = new Vector(); + private Vector lairs = new Vector(); + private long lastSpawnTime = 0; public MixedSpawnArea(Planet planet, AbstractCollidable area, SpawnGroup spawnGroup) { super(planet, area); @@ -89,26 +92,43 @@ public class MixedSpawnArea extends SpawnArea { } else { // select randomly one of the spawngroups -> minimizes number of collidables for areas with multiple different NPC groups // One spawnarea -> many NPC groups + + int index = new Random().nextInt(spawnGroups.size()); this.spawnGroup = spawnGroups.get(index); - Vector groupMembers = new Vector(); - Point3D randomGroupPosition = getRandomPosition(creature.getWorldPosition(), 32, 100); - int spawnCount = spawnGroup.getGroupMembersNumber(); - if (spawnCount<0){ - int spawnCount2 = 1; - if (Math.abs(spawnCount) groupMembers = new Vector(); + Point3D randomGroupPosition = getRandomPosition(creature.getWorldPosition(), 32, 100); + int spawnCount = spawnGroup.getGroupMembersNumber(); + if (spawnCount<0){ + int spawnCount2 = 1; + if (Math.abs(spawnCount) many NPC groups int index = new Random().nextInt(spawnGroups.size()); this.spawnGroup = spawnGroups.get(index); - - Vector groupMembers = new Vector(); - //Point3D randomGroupPosition = getRandomPosition(creature.getWorldPosition(), 32, 100); - Point3D randomGroupPosition = getRandomPosition(creature.getWorldPosition(), 32, spawnGroup.getMinSpawnDistance()+10); - int spawnCount = spawnGroup.getGroupMembersNumber(); - if (spawnCount<0){ - int spawnCount2 = 1; - if (Math.abs(spawnCount) groupMembers = new Vector(); + //Point3D randomGroupPosition = getRandomPosition(creature.getWorldPosition(), 32, 100); + Point3D randomGroupPosition = getRandomPosition(creature.getWorldPosition(), 32, spawnGroup.getMinSpawnDistance()+10); + int spawnCount = spawnGroup.getGroupMembersNumber(); + if (spawnCount<0){ + int spawnCount2 = 1; + if (Math.abs(spawnCount) lairTemplates = lairGroup.getLairSpawnTemplates(); + + if(lairGroup == null || lairTemplates.isEmpty()) + return; + + if((System.currentTimeMillis() - lastSpawnTime) < 10000) + return; + + Point3D randomPosition = getRandomPosition(object.getWorldPosition(), 32.f, 200.f); + + if(randomPosition == null) + return; + + TerrainService terrainSvc = core.terrainService; + + float height = terrainSvc.getHeight(getPlanet().getID(), randomPosition.x, randomPosition.z); + randomPosition.y = height; + + for(LairActor otherLair : lairs) { + if(otherLair.getLairObject().getWorldPosition().getDistance(randomPosition) < 30) + return; + } + + if(!terrainSvc.canBuildAtPosition(object, randomPosition.x, randomPosition.z)) + return; + + Random random = new Random(); + + LairSpawnTemplate lairSpawn = lairTemplates.get(random.nextInt(lairTemplates.size())); + + int level = -1; // If level equals -1 then the mobile template CL will be used! + if (lairSpawn.getMinLevel() != -1 && lairSpawn.getMaxLevel()!=-1) + level = random.nextInt((int) (lairSpawn.getMaxLevel() - lairSpawn.getMinLevel()) + 1) + lairSpawn.getMinLevel(); + + + + LairActor lairActor = core.spawnService.spawnLair(lairSpawn.getLairTemplate(), getPlanet(), randomPosition, (short) level); + if(lairActor == null) + return; + lairs.add(lairActor); + lastSpawnTime = System.currentTimeMillis(); + + } + } diff --git a/src/services/spawn/SpawnGroup.java b/src/services/spawn/SpawnGroup.java index de8abe0f..b0d62402 100644 --- a/src/services/spawn/SpawnGroup.java +++ b/src/services/spawn/SpawnGroup.java @@ -21,10 +21,26 @@ ******************************************************************************/ package services.spawn; +import java.util.Vector; +// Making this an abstract class, not having to implement unused methods in either spawn group classes public abstract class SpawnGroup { - public SpawnGroup() { - + public SpawnGroup() {} + + public int getGroupMembersNumber(){ + return 0; + } + + public Vector getMobiles() { + return new Vector(); + } + + public int getMinSpawnDistance(){ + return 0; + } + + public int getMaxSpawns(){ + return 0; } } diff --git a/src/services/spawn/SpawnService.java b/src/services/spawn/SpawnService.java index b3edec85..4d6c4084 100644 --- a/src/services/spawn/SpawnService.java +++ b/src/services/spawn/SpawnService.java @@ -418,6 +418,28 @@ public class SpawnService { spawnAreas.get(planet).add(dynamicSpawnArea); core.simulationService.addCollidable(collidableCircle, x, z); } + + public void addMixedSpawnArea(Vector passedGroups, float x, float z, float radius, 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; + CollidableCircle collidableCircle = new CollidableCircle(new Point3D(x, 0, z), radius, planet); + MixedSpawnArea dynamicSpawnArea = new MixedSpawnArea(planet, collidableCircle, mixedSpawnGroups); + spawnAreas.get(planet).add(dynamicSpawnArea); + core.simulationService.addCollidable(collidableCircle, x, z); + } public Map getMobileTemplates() { return mobileTemplates;