From 05034b4d8387521253029ede0ce6b56e08cb672a Mon Sep 17 00:00:00 2001 From: CharonInferar Date: Sat, 3 May 2014 16:31:04 +0200 Subject: [PATCH] group spawn distances added Force sensitive groups now spawn at a distance to each other in random group member numbers. Loot added to FSs --- .../dantooine/dark_force_crystal_hunter.py | 4 +- scripts/mobiles/dantooine/dark_side_savage.py | 2 +- .../force_sensitive_crypt_crawler.py | 6 +- .../dantooine/force_sensitive_renegade.py | 8 +- .../dantooine/forsaken_force_drifter.py | 6 +- .../mobiles/dantooine/novice_force_mystic.py | 6 +- .../untrained_wielder_of_the_dark_side.py | 6 +- .../mobiles/dynamicgroups/dark_jedi_wild_1.py | 18 +++ .../dynamicgroups/force_sensitives_wild_1.py | 10 +- .../mobiles/dynamicgroups/tuskens_wild_1.py | 2 +- .../spawnareas/force_sensitives_dynamic_1.py | 6 +- .../mobiles/spawnareas/tuskens_dynamic_1.py | 2 +- .../dressed_dark_force_crystal_hunter.py | 25 +++- .../object/mobile/dressed_dark_side_savage.py | 19 ++- .../dressed_force_sensitive_crypt_crawler.py | 25 +++- .../dressed_force_sensitive_renegade.py | 25 +++- .../mobile/dressed_forsaken_force_drifter.py | 25 +++- .../mobile/dressed_novice_force_mystic.py | 25 +++- ...essed_untrained_wielder_of_the_darkside.py | 25 +++- src/services/spawn/DynamicSpawnArea.java | 136 ++++++++++++------ src/services/spawn/SpawnService.java | 21 ++- 21 files changed, 332 insertions(+), 70 deletions(-) create mode 100644 scripts/mobiles/dynamicgroups/dark_jedi_wild_1.py diff --git a/scripts/mobiles/dantooine/dark_force_crystal_hunter.py b/scripts/mobiles/dantooine/dark_force_crystal_hunter.py index 219b5091..0c6ded2a 100644 --- a/scripts/mobiles/dantooine/dark_force_crystal_hunter.py +++ b/scripts/mobiles/dantooine/dark_force_crystal_hunter.py @@ -8,13 +8,15 @@ def addTemplate(core): mobileTemplate.setCreatureName('dark_force_crystal_hunter') mobileTemplate.setLevel(90) + mobileTemplate.setMinLevel(60) + mobileTemplate.setMaxLevel(69) mobileTemplate.setDifficulty(0) mobileTemplate.setAttackRange(6) mobileTemplate.setAttackSpeed(1.0) mobileTemplate.setWeaponType(9) mobileTemplate.setMinSpawnDistance(2) mobileTemplate.setMaxSpawnDistance(4) - mobileTemplate.setDeathblow(False) + mobileTemplate.setDeathblow(True) templates = Vector() templates.add('object/mobile/shared_dressed_dark_force_crystal_hunter.iff') diff --git a/scripts/mobiles/dantooine/dark_side_savage.py b/scripts/mobiles/dantooine/dark_side_savage.py index 698c9c9d..dee96f19 100644 --- a/scripts/mobiles/dantooine/dark_side_savage.py +++ b/scripts/mobiles/dantooine/dark_side_savage.py @@ -7,7 +7,7 @@ def addTemplate(core): mobileTemplate = MobileTemplate() mobileTemplate.setCreatureName('eow_dark_side_savage') - mobileTemplate.setLevel(90) + mobileTemplate.setLevel(85) mobileTemplate.setDifficulty(0) mobileTemplate.setAttackRange(6) mobileTemplate.setAttackSpeed(1.0) diff --git a/scripts/mobiles/dantooine/force_sensitive_crypt_crawler.py b/scripts/mobiles/dantooine/force_sensitive_crypt_crawler.py index aee43eee..a74916a2 100644 --- a/scripts/mobiles/dantooine/force_sensitive_crypt_crawler.py +++ b/scripts/mobiles/dantooine/force_sensitive_crypt_crawler.py @@ -8,12 +8,14 @@ def addTemplate(core): mobileTemplate.setCreatureName('eow_force_sensitive_crypt_crawler') mobileTemplate.setLevel(90) + mobileTemplate.setMinLevel(60) + mobileTemplate.setMaxLevel(70) mobileTemplate.setDifficulty(0) mobileTemplate.setAttackRange(6) mobileTemplate.setAttackSpeed(1.0) mobileTemplate.setWeaponType(9) - mobileTemplate.setMinSpawnDistance(2) - mobileTemplate.setMaxSpawnDistance(4) + mobileTemplate.setMinSpawnDistance(3) + mobileTemplate.setMaxSpawnDistance(5) mobileTemplate.setDeathblow(False) templates = Vector() diff --git a/scripts/mobiles/dantooine/force_sensitive_renegade.py b/scripts/mobiles/dantooine/force_sensitive_renegade.py index dab96945..8d3d4257 100644 --- a/scripts/mobiles/dantooine/force_sensitive_renegade.py +++ b/scripts/mobiles/dantooine/force_sensitive_renegade.py @@ -6,14 +6,16 @@ from java.util import Vector def addTemplate(core): mobileTemplate = MobileTemplate() - mobileTemplate.setCreatureName('Force_sensitive_Renegade') + mobileTemplate.setCreatureName('force_sensitive_renegade') mobileTemplate.setLevel(90) + mobileTemplate.setMinLevel(61) + mobileTemplate.setMaxLevel(69) mobileTemplate.setDifficulty(0) mobileTemplate.setAttackRange(6) mobileTemplate.setAttackSpeed(1.0) mobileTemplate.setWeaponType(9) - mobileTemplate.setMinSpawnDistance(2) - mobileTemplate.setMaxSpawnDistance(4) + mobileTemplate.setMinSpawnDistance(4) + mobileTemplate.setMaxSpawnDistance(7) mobileTemplate.setDeathblow(False) templates = Vector() diff --git a/scripts/mobiles/dantooine/forsaken_force_drifter.py b/scripts/mobiles/dantooine/forsaken_force_drifter.py index 52e0a5a3..1fbc8e26 100644 --- a/scripts/mobiles/dantooine/forsaken_force_drifter.py +++ b/scripts/mobiles/dantooine/forsaken_force_drifter.py @@ -7,13 +7,13 @@ def addTemplate(core): mobileTemplate = MobileTemplate() mobileTemplate.setCreatureName('eow_forsaken_force_drifter') - mobileTemplate.setLevel(90) + mobileTemplate.setLevel(74) mobileTemplate.setDifficulty(0) mobileTemplate.setAttackRange(6) mobileTemplate.setAttackSpeed(1.0) mobileTemplate.setWeaponType(9) - mobileTemplate.setMinSpawnDistance(2) - mobileTemplate.setMaxSpawnDistance(4) + mobileTemplate.setMinSpawnDistance(3) + mobileTemplate.setMaxSpawnDistance(6) mobileTemplate.setDeathblow(False) templates = Vector() diff --git a/scripts/mobiles/dantooine/novice_force_mystic.py b/scripts/mobiles/dantooine/novice_force_mystic.py index b89227fb..d7313ad5 100644 --- a/scripts/mobiles/dantooine/novice_force_mystic.py +++ b/scripts/mobiles/dantooine/novice_force_mystic.py @@ -7,13 +7,13 @@ def addTemplate(core): mobileTemplate = MobileTemplate() mobileTemplate.setCreatureName('novice_force_mystic') - mobileTemplate.setLevel(90) + mobileTemplate.setLevel(63) mobileTemplate.setDifficulty(0) mobileTemplate.setAttackRange(6) mobileTemplate.setAttackSpeed(1.0) mobileTemplate.setWeaponType(9) - mobileTemplate.setMinSpawnDistance(2) - mobileTemplate.setMaxSpawnDistance(4) + mobileTemplate.setMinSpawnDistance(4) + mobileTemplate.setMaxSpawnDistance(7) mobileTemplate.setDeathblow(False) templates = Vector() diff --git a/scripts/mobiles/dantooine/untrained_wielder_of_the_dark_side.py b/scripts/mobiles/dantooine/untrained_wielder_of_the_dark_side.py index 71623d04..65f54e75 100644 --- a/scripts/mobiles/dantooine/untrained_wielder_of_the_dark_side.py +++ b/scripts/mobiles/dantooine/untrained_wielder_of_the_dark_side.py @@ -8,12 +8,14 @@ def addTemplate(core): mobileTemplate.setCreatureName('untrained_wielder_of_the_dark_side') mobileTemplate.setLevel(90) + mobileTemplate.setMinLevel(61) + mobileTemplate.setMaxLevel(70) mobileTemplate.setDifficulty(0) mobileTemplate.setAttackRange(6) mobileTemplate.setAttackSpeed(1.0) mobileTemplate.setWeaponType(9) - mobileTemplate.setMinSpawnDistance(2) - mobileTemplate.setMaxSpawnDistance(4) + mobileTemplate.setMinSpawnDistance(4) + mobileTemplate.setMaxSpawnDistance(6) mobileTemplate.setDeathblow(False) templates = Vector() diff --git a/scripts/mobiles/dynamicgroups/dark_jedi_wild_1.py b/scripts/mobiles/dynamicgroups/dark_jedi_wild_1.py new file mode 100644 index 00000000..3bf8c043 --- /dev/null +++ b/scripts/mobiles/dynamicgroups/dark_jedi_wild_1.py @@ -0,0 +1,18 @@ +import sys +from services.spawn import DynamicSpawnGroup +from services.spawn import MobileTemplate +from java.util import Vector + +def addDynamicGroup(core): + dynamicGroup = DynamicSpawnGroup() + mobileTemplates = Vector() + mobileTemplates.add('dark_jedi_master') + mobileTemplates.add('dark_jedi_knight') + mobileTemplates.add('dark_adept') + dynamicGroup.setMobiles(mobileTemplates) + dynamicGroup.setGroupMembersNumber(3) + dynamicGroup.setName('dark_jedi_wild_1') + dynamicGroup.setMaxSpawns(-1) + dynamicGroup.setMinSpawnDistance(150) + core.spawnService.addDynamicGroup('dark_jedi_wild_1', dynamicGroup) + return \ No newline at end of file diff --git a/scripts/mobiles/dynamicgroups/force_sensitives_wild_1.py b/scripts/mobiles/dynamicgroups/force_sensitives_wild_1.py index 2281f370..9ee91b60 100644 --- a/scripts/mobiles/dynamicgroups/force_sensitives_wild_1.py +++ b/scripts/mobiles/dynamicgroups/force_sensitives_wild_1.py @@ -6,11 +6,13 @@ from java.util import Vector def addDynamicGroup(core): dynamicGroup = DynamicSpawnGroup() mobileTemplates = Vector() - mobileTemplates.add('dark_jedi_master') - mobileTemplates.add('dark_jedi_knight') - mobileTemplates.add('dark_adept') + mobileTemplates.add('force_sensitive_crypt_crawler') + mobileTemplates.add('force_sensitive_renegade') + mobileTemplates.add('forsaken_force_drifter') + mobileTemplates.add('novice_force_mystic') + mobileTemplates.add('untrained_wielder_of_the_dark_side') dynamicGroup.setMobiles(mobileTemplates) - dynamicGroup.setGroupMembersNumber(3) + dynamicGroup.setGroupMembersNumber(-3) dynamicGroup.setName('force_sensitives_wild_1') dynamicGroup.setMaxSpawns(-1) dynamicGroup.setMinSpawnDistance(150) diff --git a/scripts/mobiles/dynamicgroups/tuskens_wild_1.py b/scripts/mobiles/dynamicgroups/tuskens_wild_1.py index 4311c189..472747c0 100644 --- a/scripts/mobiles/dynamicgroups/tuskens_wild_1.py +++ b/scripts/mobiles/dynamicgroups/tuskens_wild_1.py @@ -10,6 +10,6 @@ def addDynamicGroup(core): dynamicGroup.setMobiles(mobileTemplates) dynamicGroup.setName('tuskens_wild_1') dynamicGroup.setMaxSpawns(20) - dynamicGroup.setMinSpawnDistance(2) + dynamicGroup.setMinSpawnDistance(25) core.spawnService.addDynamicGroup('tuskens_wild_1', dynamicGroup) return \ No newline at end of file diff --git a/scripts/mobiles/spawnareas/force_sensitives_dynamic_1.py b/scripts/mobiles/spawnareas/force_sensitives_dynamic_1.py index f2d14b80..6c7638ea 100644 --- a/scripts/mobiles/spawnareas/force_sensitives_dynamic_1.py +++ b/scripts/mobiles/spawnareas/force_sensitives_dynamic_1.py @@ -1,5 +1,9 @@ import sys +from java.util import Vector def addSpawnArea(core): - core.spawnService.addDynamicSpawnArea('force_sensitives_wild_1', 4083, 5780, 2048, 'dantooine') + dynamicGroups = Vector() + dynamicGroups.add('force_sensitives_wild_1') + dynamicGroups.add('dark_jedi_wild_1') + core.spawnService.addDynamicSpawnArea(dynamicGroups, 4083, 5780, 2048, 'dantooine') return \ No newline at end of file diff --git a/scripts/mobiles/spawnareas/tuskens_dynamic_1.py b/scripts/mobiles/spawnareas/tuskens_dynamic_1.py index d807e384..4d9f5915 100644 --- a/scripts/mobiles/spawnareas/tuskens_dynamic_1.py +++ b/scripts/mobiles/spawnareas/tuskens_dynamic_1.py @@ -1,5 +1,5 @@ import sys def addSpawnArea(core): - core.spawnService.addDynamicSpawnArea('tuskens_wild_1', 4193, -4724, 200, 'tatooine') + core.spawnService.addDynamicSpawnArea('tuskens_wild_1', 4310, -4786, 250, 'tatooine') return \ No newline at end of file diff --git a/scripts/object/mobile/dressed_dark_force_crystal_hunter.py b/scripts/object/mobile/dressed_dark_force_crystal_hunter.py index ccad8904..dbbb65df 100644 --- a/scripts/object/mobile/dressed_dark_force_crystal_hunter.py +++ b/scripts/object/mobile/dressed_dark_force_crystal_hunter.py @@ -1,4 +1,27 @@ import sys def setup(core, object): - return \ No newline at end of file + + lootPoolNames_1 = ['Junk'] + lootPoolChances_1 = [100] + lootGroupChance_1 = 65 + object.addToLootGroups(lootPoolNames_1,lootPoolChances_1,lootGroupChance_1) + + lootPoolNames_2 = ['jedi_relic_1'] + lootPoolChances_2 = [100] + lootGroupChance_2 = 85 + object.addToLootGroups(lootPoolNames_2,lootPoolChances_2,lootGroupChance_2) + + lootPoolNames_3 = ['colorcrystals'] + lootPoolChances_3 = [100] + lootGroupChance_3 = 12 + object.addToLootGroups(lootPoolNames_3,lootPoolChances_3,lootGroupChance_3) + + lootPoolNames_4 = ['sithholocrons'] + lootPoolChances_4 = [100] + lootGroupChance_4 = 1 + object.addToLootGroups(lootPoolNames_4,lootPoolChances_4,lootGroupChance_4) + + + + return \ No newline at end of file diff --git a/scripts/object/mobile/dressed_dark_side_savage.py b/scripts/object/mobile/dressed_dark_side_savage.py index ccad8904..70052ae4 100644 --- a/scripts/object/mobile/dressed_dark_side_savage.py +++ b/scripts/object/mobile/dressed_dark_side_savage.py @@ -1,4 +1,21 @@ import sys def setup(core, object): - return \ No newline at end of file + + lootPoolNames_1 = ['Junk'] + lootPoolChances_1 = [100] + lootGroupChance_1 = 65 + object.addToLootGroups(lootPoolNames_1,lootPoolChances_1,lootGroupChance_1) + + lootPoolNames_2 = ['jedi_relic_1'] + lootPoolChances_2 = [100] + lootGroupChance_2 = 85 + object.addToLootGroups(lootPoolNames_2,lootPoolChances_2,lootGroupChance_2) + + lootPoolNames_3 = ['colorcrystals'] + lootPoolChances_3 = [100] + lootGroupChance_3 = 12 + object.addToLootGroups(lootPoolNames_3,lootPoolChances_3,lootGroupChance_3) + + + return \ No newline at end of file diff --git a/scripts/object/mobile/dressed_force_sensitive_crypt_crawler.py b/scripts/object/mobile/dressed_force_sensitive_crypt_crawler.py index ccad8904..2c42c975 100644 --- a/scripts/object/mobile/dressed_force_sensitive_crypt_crawler.py +++ b/scripts/object/mobile/dressed_force_sensitive_crypt_crawler.py @@ -1,4 +1,27 @@ import sys def setup(core, object): - return \ No newline at end of file + + lootPoolNames_1 = ['Junk'] + lootPoolChances_1 = [100] + lootGroupChance_1 = 65 + object.addToLootGroups(lootPoolNames_1,lootPoolChances_1,lootGroupChance_1) + + lootPoolNames_2 = ['jedi_relic_1'] + lootPoolChances_2 = [100] + lootGroupChance_2 = 85 + object.addToLootGroups(lootPoolNames_2,lootPoolChances_2,lootGroupChance_2) + + lootPoolNames_3 = ['colorcrystals'] + lootPoolChances_3 = [100] + lootGroupChance_3 = 12 + object.addToLootGroups(lootPoolNames_3,lootPoolChances_3,lootGroupChance_3) + + lootPoolNames_4 = ['jediholocrons'] + lootPoolChances_4 = [100] + lootGroupChance_4 = 1 + object.addToLootGroups(lootPoolNames_4,lootPoolChances_4,lootGroupChance_4) + + + + return \ No newline at end of file diff --git a/scripts/object/mobile/dressed_force_sensitive_renegade.py b/scripts/object/mobile/dressed_force_sensitive_renegade.py index ccad8904..2c42c975 100644 --- a/scripts/object/mobile/dressed_force_sensitive_renegade.py +++ b/scripts/object/mobile/dressed_force_sensitive_renegade.py @@ -1,4 +1,27 @@ import sys def setup(core, object): - return \ No newline at end of file + + lootPoolNames_1 = ['Junk'] + lootPoolChances_1 = [100] + lootGroupChance_1 = 65 + object.addToLootGroups(lootPoolNames_1,lootPoolChances_1,lootGroupChance_1) + + lootPoolNames_2 = ['jedi_relic_1'] + lootPoolChances_2 = [100] + lootGroupChance_2 = 85 + object.addToLootGroups(lootPoolNames_2,lootPoolChances_2,lootGroupChance_2) + + lootPoolNames_3 = ['colorcrystals'] + lootPoolChances_3 = [100] + lootGroupChance_3 = 12 + object.addToLootGroups(lootPoolNames_3,lootPoolChances_3,lootGroupChance_3) + + lootPoolNames_4 = ['jediholocrons'] + lootPoolChances_4 = [100] + lootGroupChance_4 = 1 + object.addToLootGroups(lootPoolNames_4,lootPoolChances_4,lootGroupChance_4) + + + + return \ No newline at end of file diff --git a/scripts/object/mobile/dressed_forsaken_force_drifter.py b/scripts/object/mobile/dressed_forsaken_force_drifter.py index ccad8904..2c42c975 100644 --- a/scripts/object/mobile/dressed_forsaken_force_drifter.py +++ b/scripts/object/mobile/dressed_forsaken_force_drifter.py @@ -1,4 +1,27 @@ import sys def setup(core, object): - return \ No newline at end of file + + lootPoolNames_1 = ['Junk'] + lootPoolChances_1 = [100] + lootGroupChance_1 = 65 + object.addToLootGroups(lootPoolNames_1,lootPoolChances_1,lootGroupChance_1) + + lootPoolNames_2 = ['jedi_relic_1'] + lootPoolChances_2 = [100] + lootGroupChance_2 = 85 + object.addToLootGroups(lootPoolNames_2,lootPoolChances_2,lootGroupChance_2) + + lootPoolNames_3 = ['colorcrystals'] + lootPoolChances_3 = [100] + lootGroupChance_3 = 12 + object.addToLootGroups(lootPoolNames_3,lootPoolChances_3,lootGroupChance_3) + + lootPoolNames_4 = ['jediholocrons'] + lootPoolChances_4 = [100] + lootGroupChance_4 = 1 + object.addToLootGroups(lootPoolNames_4,lootPoolChances_4,lootGroupChance_4) + + + + return \ No newline at end of file diff --git a/scripts/object/mobile/dressed_novice_force_mystic.py b/scripts/object/mobile/dressed_novice_force_mystic.py index ccad8904..2c42c975 100644 --- a/scripts/object/mobile/dressed_novice_force_mystic.py +++ b/scripts/object/mobile/dressed_novice_force_mystic.py @@ -1,4 +1,27 @@ import sys def setup(core, object): - return \ No newline at end of file + + lootPoolNames_1 = ['Junk'] + lootPoolChances_1 = [100] + lootGroupChance_1 = 65 + object.addToLootGroups(lootPoolNames_1,lootPoolChances_1,lootGroupChance_1) + + lootPoolNames_2 = ['jedi_relic_1'] + lootPoolChances_2 = [100] + lootGroupChance_2 = 85 + object.addToLootGroups(lootPoolNames_2,lootPoolChances_2,lootGroupChance_2) + + lootPoolNames_3 = ['colorcrystals'] + lootPoolChances_3 = [100] + lootGroupChance_3 = 12 + object.addToLootGroups(lootPoolNames_3,lootPoolChances_3,lootGroupChance_3) + + lootPoolNames_4 = ['jediholocrons'] + lootPoolChances_4 = [100] + lootGroupChance_4 = 1 + object.addToLootGroups(lootPoolNames_4,lootPoolChances_4,lootGroupChance_4) + + + + return \ No newline at end of file diff --git a/scripts/object/mobile/dressed_untrained_wielder_of_the_darkside.py b/scripts/object/mobile/dressed_untrained_wielder_of_the_darkside.py index ccad8904..dbbb65df 100644 --- a/scripts/object/mobile/dressed_untrained_wielder_of_the_darkside.py +++ b/scripts/object/mobile/dressed_untrained_wielder_of_the_darkside.py @@ -1,4 +1,27 @@ import sys def setup(core, object): - return \ No newline at end of file + + lootPoolNames_1 = ['Junk'] + lootPoolChances_1 = [100] + lootGroupChance_1 = 65 + object.addToLootGroups(lootPoolNames_1,lootPoolChances_1,lootGroupChance_1) + + lootPoolNames_2 = ['jedi_relic_1'] + lootPoolChances_2 = [100] + lootGroupChance_2 = 85 + object.addToLootGroups(lootPoolNames_2,lootPoolChances_2,lootGroupChance_2) + + lootPoolNames_3 = ['colorcrystals'] + lootPoolChances_3 = [100] + lootGroupChance_3 = 12 + object.addToLootGroups(lootPoolNames_3,lootPoolChances_3,lootGroupChance_3) + + lootPoolNames_4 = ['sithholocrons'] + lootPoolChances_4 = [100] + lootGroupChance_4 = 1 + object.addToLootGroups(lootPoolNames_4,lootPoolChances_4,lootGroupChance_4) + + + + return \ No newline at end of file diff --git a/src/services/spawn/DynamicSpawnArea.java b/src/services/spawn/DynamicSpawnArea.java index 76078c99..388195c6 100644 --- a/src/services/spawn/DynamicSpawnArea.java +++ b/src/services/spawn/DynamicSpawnArea.java @@ -21,6 +21,7 @@ ******************************************************************************/ package services.spawn; +import java.util.Collections; import java.util.Iterator; import java.util.Random; import java.util.Vector; @@ -42,12 +43,18 @@ import engine.resources.scene.Point3D; public class DynamicSpawnArea extends SpawnArea { private DynamicSpawnGroup spawnGroup; + private Vector spawnGroups; private Vector mobiles = new Vector(); public DynamicSpawnArea(Planet planet, AbstractCollidable area, DynamicSpawnGroup spawnGroup) { super(planet, area); this.spawnGroup = spawnGroup; } + + public DynamicSpawnArea(Planet planet, AbstractCollidable area, Vector spawnGroups) { + super(planet, area); + this.spawnGroups = spawnGroups; + } @Override @Handler @@ -65,13 +72,31 @@ public class DynamicSpawnArea extends SpawnArea { creature.getEventBus().subscribe(this); // spawn some creatures - if (spawnGroup.getGroupMembersNumber()==0){ - for(int i = 0; i < 5; i++) - spawnCreature(creature); + if (spawnGroups==null){ + if (spawnGroup.getGroupMembersNumber()==-1){ + for(int i = 0; i < 5; i++) + spawnCreature(creature); + } else { + Vector groupMembers = new Vector(); + Point3D randomGroupPosition = getRandomPosition(creature.getWorldPosition(), 32, 100); + for(int i = 0; i < spawnGroup.getGroupMembersNumber(); i++) {// A group with a specified number of members + CreatureObject spawnedCreature = spawnCreatureMember(creature, groupMembers, randomGroupPosition, i); + if (spawnedCreature!=null) + groupMembers.add(spawnedCreature); + } + } } 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(); - for(int i = 0; i < spawnGroup.getGroupMembersNumber(); i++) {// A group with a specified number of members - CreatureObject spawnedCreature = spawnCreatureMember(creature, groupMembers, i); + Point3D randomGroupPosition = getRandomPosition(creature.getWorldPosition(), 32, 100); + int spawnCount = spawnGroup.getGroupMembersNumber(); + if (spawnCount<0) + spawnCount = Math.abs(spawnCount) + new Random().nextInt(spawnGroup.getMobiles().size()-Math.abs(spawnCount)); + for(int i = 0; i < spawnCount; i++) {// A group with a specified or random number of members + CreatureObject spawnedCreature = spawnCreatureMember(creature, groupMembers, randomGroupPosition, i); if (spawnedCreature!=null) groupMembers.add(spawnedCreature); } @@ -109,15 +134,33 @@ public class DynamicSpawnArea extends SpawnArea { if(creature.getSlottedObject("ghost") == null) return; - - if (spawnGroup.getGroupMembersNumber()==0){ - if(new Random().nextFloat() <= 0.25) - spawnCreature(creature); - } else - { + + if (spawnGroups==null){ + if (spawnGroup.getGroupMembersNumber()==-1){ + if(new Random().nextFloat() <= 0.25) + spawnCreature(creature); + } else + { + Vector groupMembers = new Vector(); + Point3D randomGroupPosition = getRandomPosition(creature.getWorldPosition(), 32, 100); + for(int i = 0; i < spawnGroup.getGroupMembersNumber(); i++) {// A group with a specified number of members + CreatureObject spawnedCreature = spawnCreatureMember(creature, groupMembers, randomGroupPosition, i); + if (spawnedCreature!=null) + groupMembers.add(spawnedCreature); + } + } + } 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(); - for(int i = 0; i < spawnGroup.getGroupMembersNumber(); i++) {// A group with a specified number of members - CreatureObject spawnedCreature = spawnCreatureMember(creature, groupMembers, i); + Point3D randomGroupPosition = getRandomPosition(creature.getWorldPosition(), 32, 100); + int spawnCount = spawnGroup.getGroupMembersNumber(); + if (spawnCount<0) + spawnCount = Math.abs(spawnCount) + new Random().nextInt(spawnGroup.getMobiles().size()-Math.abs(spawnCount)); + for(int i = 0; i < spawnCount; i++) {// A group with a specified or random number of members + CreatureObject spawnedCreature = spawnCreatureMember(creature, groupMembers, randomGroupPosition, i); if (spawnedCreature!=null) groupMembers.add(spawnedCreature); } @@ -130,11 +173,19 @@ public class DynamicSpawnArea extends SpawnArea { NGECore core = NGECore.getInstance(); - Iterator it = mobiles.iterator(); - it.forEachRemaining(mobile -> { - if(mobile.getPosture() == Posture.Dead) - it.remove(); - }); +// Iterator it = mobiles.iterator(); // This stops further execution of this method for some reason +// it.forEachRemaining(mobile -> { +// if(mobile.getPosture() == Posture.Dead) +// it.remove(); +// }); + + mobiles.removeAll(Collections.singleton(null)); + Vector removers = new Vector(); + for (CreatureObject ob : mobiles){ + if (ob.getPosture() == Posture.Dead) + removers.add(ob); + } + mobiles.removeAll(removers); if(mobiles.size() >= spawnGroup.getMaxSpawns()) return; @@ -181,39 +232,45 @@ public class DynamicSpawnArea extends SpawnArea { } - private CreatureObject spawnCreatureMember(CreatureObject creature, Vector groupMembers, int spawnIndex) { - System.out.println("spawnCreatureMember"); + private CreatureObject spawnCreatureMember(CreatureObject creature, Vector groupMembers, Point3D randomGroupPosition, int spawnIndex) { + NGECore core = NGECore.getInstance(); - Iterator it = mobiles.iterator(); - it.forEachRemaining(mobile -> { - if(mobile.getPosture() == Posture.Dead) - it.remove(); - }); - +// Iterator it = mobiles.iterator(); // This stops further execution of this method for some reason +// it.forEachRemaining(mobile -> { +// if(mobile.getPosture() == Posture.Dead) +// it.remove(); +// }); + + mobiles.removeAll(Collections.singleton(null)); + Vector removers = new Vector(); + for (CreatureObject ob : mobiles){ + if (ob.getPosture() == Posture.Dead) + removers.add(ob); + } + mobiles.removeAll(removers); + // if(mobiles.size() >= spawnGroup.getMaxSpawns()) // return; - + boolean foundPos = false; int tries = 0; Point3D randomPosition = null; String template = spawnGroup.getMobiles().get(spawnIndex); MobileTemplate mobileTemplate = NGECore.getInstance().spawnService.getMobileTemplate(template); - if (mobileTemplate==null) + if (mobileTemplate==null){ + System.out.println("mobileTemplate==null"); return null; - - - for (CreatureObject cr : groupMembers){ - System.out.println("cr " + cr.getTemplate()); } - while(!foundPos && ++tries < 30) { - randomPosition = getRandomPosition(creature.getWorldPosition(), mobileTemplate.getMinSpawnDistance(), mobileTemplate.getMaxSpawnDistance()); + randomPosition = getRandomPosition(randomGroupPosition, mobileTemplate.getMinSpawnDistance(), mobileTemplate.getMaxSpawnDistance()); - if(randomPosition == null) + if(randomPosition == null){ + System.out.println("randomPosition == null"); return null; + } TerrainService terrainSvc = core.terrainService; @@ -224,7 +281,7 @@ public class DynamicSpawnArea extends SpawnArea { boolean minDistViolated = false; for(CreatureObject mobile : mobiles) { if(mobile.getWorldPosition().getDistance(randomPosition) < spawnGroup.getMinSpawnDistance() && ! groupMembers.contains(mobile)){ - minDistViolated = true; + minDistViolated = true; // Distance to other nearby groups } } if (minDistViolated) @@ -238,8 +295,9 @@ public class DynamicSpawnArea extends SpawnArea { } - if(!foundPos) + if(!foundPos){ return null; + } CreatureObject spawnedCreature = core.spawnService.spawnCreature(template, getPlanet().getName(), 0, randomPosition.x, randomPosition.y, randomPosition.z); @@ -247,8 +305,6 @@ public class DynamicSpawnArea extends SpawnArea { mobiles.add(spawnedCreature); } - return spawnedCreature; - + return spawnedCreature; } - } diff --git a/src/services/spawn/SpawnService.java b/src/services/spawn/SpawnService.java index 89d0a8c0..4008156d 100644 --- a/src/services/spawn/SpawnService.java +++ b/src/services/spawn/SpawnService.java @@ -368,7 +368,7 @@ public class SpawnService { } public void addDynamicSpawnArea(String dynamicGroup, float x, float z, float radius, String planetName) { - DynamicSpawnGroup dynamicGroupTemplate = dynamicGroupTemplates .get(dynamicGroup); + DynamicSpawnGroup dynamicGroupTemplate = dynamicGroupTemplates.get(dynamicGroup); Planet planet = core.terrainService.getPlanetByName(planetName); if(dynamicGroupTemplate == null || planet == null) return; @@ -377,6 +377,25 @@ public class SpawnService { spawnAreas.get(planet).add(dynamicSpawnArea); core.simulationService.addCollidable(collidableCircle, x, z); } + + public void addDynamicSpawnArea(Vector dynamicGroups, float x, float z, float radius, 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; + CollidableCircle collidableCircle = new CollidableCircle(new Point3D(x, 0, z), radius, planet); + DynamicSpawnArea dynamicSpawnArea = new DynamicSpawnArea(planet, collidableCircle, dynamicSpawnGroups); + spawnAreas.get(planet).add(dynamicSpawnArea); + core.simulationService.addCollidable(collidableCircle, x, z); + } public Map getMobileTemplates() { return mobileTemplates;