From d450228e60921d5e30fc53cef7802bf2b1bff655 Mon Sep 17 00:00:00 2001 From: CharonInferar Date: Fri, 23 May 2014 01:44:25 +0200 Subject: [PATCH] Added MixedSpawnArea To save server resources, a mixed spawn area can consist of dynamic groups and lair groups. Also the minimal distance from dynamic group to nearest lair will be kept to prevent lairs and NPCs too close together a bit more. --- options.cfg | 6 +- .../piket_plains_walker_group.py | 3 + .../spawnareas/dantooine_mining_lair.py | 3 +- .../spawnareas/dantooine_mining_mixed.py | 11 ++ src/services/spawn/DynamicSpawnGroup.java | 2 +- src/services/spawn/LairGroupTemplate.java | 2 +- src/services/spawn/MixedSpawnArea.java | 163 ++++++++++++++---- src/services/spawn/SpawnGroup.java | 20 ++- src/services/spawn/SpawnService.java | 22 +++ 9 files changed, 190 insertions(+), 42 deletions(-) create mode 100644 scripts/mobiles/spawnareas/dantooine_mining_mixed.py 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;