From 1833f821fa015cd316544812c83c96e38a570618 Mon Sep 17 00:00:00 2001 From: CharonInferar Date: Sat, 3 May 2014 00:42:25 +0200 Subject: [PATCH] Taking into account fixed member groups --- .../dynamicgroups/force_sensitives_wild_1.py | 24 ++++++ .../spawnareas/force_sensitives_dynamic_1.py | 5 ++ src/services/object/ObjectService.java | 11 ++- src/services/spawn/DynamicSpawnArea.java | 83 ++++++++++++++++--- src/services/spawn/DynamicSpawnGroup.java | 27 ++++++ 5 files changed, 137 insertions(+), 13 deletions(-) create mode 100644 scripts/mobiles/dynamicgroups/force_sensitives_wild_1.py create mode 100644 scripts/mobiles/spawnareas/force_sensitives_dynamic_1.py diff --git a/scripts/mobiles/dynamicgroups/force_sensitives_wild_1.py b/scripts/mobiles/dynamicgroups/force_sensitives_wild_1.py new file mode 100644 index 00000000..6a10889e --- /dev/null +++ b/scripts/mobiles/dynamicgroups/force_sensitives_wild_1.py @@ -0,0 +1,24 @@ +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('tusken_raider') + mobileTemplates.add('tusken_raider') + mobileTemplates.add('tusken_raider') + dynamicGroup.setMobiles(mobileTemplates) + memberCLs = Vector() + memberCLs.add(72) + memberCLs.add(90) + memberCLs.add(90) + dynamicGroup.setmemberCLs(memberCLs) + dynamicGroup.setGroupMemberNumber(3) + dynamicGroup.setName('force_sensitives_wild_1') + dynamicGroup.setMaxSpawns(20) + dynamicGroup.setMinSpawnDistance(2) + dynamicGroup.setMaxSpawnDistance(4) + core.spawnService.addDynamicGroup('force_sensitives_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 new file mode 100644 index 00000000..608e901c --- /dev/null +++ b/scripts/mobiles/spawnareas/force_sensitives_dynamic_1.py @@ -0,0 +1,5 @@ +import sys + +def addSpawnArea(core): + core.spawnService.addDynamicSpawnArea('force_sensitives_wild_1', 3860, -4784, 2048, 'tatooine') + return \ No newline at end of file diff --git a/src/services/object/ObjectService.java b/src/services/object/ObjectService.java index 93048051..6fcebc55 100644 --- a/src/services/object/ObjectService.java +++ b/src/services/object/ObjectService.java @@ -23,6 +23,7 @@ package services.object; import java.io.FileNotFoundException; import java.io.IOException; +import java.lang.reflect.Method; import java.nio.ByteOrder; import java.sql.PreparedStatement; import java.sql.ResultSet; @@ -571,9 +572,13 @@ public class ObjectService implements INetworkDispatch { while (cursor.hasNext()) { SWGObject object = (SWGObject) cursor.next(); - - if (object != null && object.getCustomName() != null && customName.length() > 0 && object.getCustomName().startsWith(customName)) { - return object; + + if (object == null) { + continue; + } + + if (object.getCustomName() != null && customName.length() > 0 && object.getCustomName().startsWith(customName)) { + return object; } } diff --git a/src/services/spawn/DynamicSpawnArea.java b/src/services/spawn/DynamicSpawnArea.java index 210c8183..0f2499aa 100644 --- a/src/services/spawn/DynamicSpawnArea.java +++ b/src/services/spawn/DynamicSpawnArea.java @@ -52,7 +52,7 @@ public class DynamicSpawnArea extends SpawnArea { @Override @Handler public void onEnter(EnterEvent event) { - System.err.println("We got a spawn!!!!!!!!!!!!!"); + SWGObject object = event.object; if(object == null || !(object instanceof CreatureObject)) @@ -65,8 +65,13 @@ public class DynamicSpawnArea extends SpawnArea { creature.getEventBus().subscribe(this); // spawn some creatures - for(int i = 0; i < 5; i++) - spawnCreature(creature); + if (spawnGroup.getGroupMemberNumber()==-1){ + for(int i = 0; i < 5; i++) + spawnCreature(creature); + } else { + for(int i = 0; i < spawnGroup.getGroupMemberNumber(); i++) // A group with a specified number of members + spawnCreatureMember(creature, i); + } } @@ -108,7 +113,7 @@ public class DynamicSpawnArea extends SpawnArea { private void spawnCreature(CreatureObject creature) { - + NGECore core = NGECore.getInstance(); Iterator it = mobiles.iterator(); @@ -119,7 +124,7 @@ public class DynamicSpawnArea extends SpawnArea { if(mobiles.size() >= spawnGroup.getMaxSpawns()) return; - + boolean foundPos = false; int tries = 0; Point3D randomPosition = null; @@ -136,10 +141,12 @@ public class DynamicSpawnArea extends SpawnArea { float height = terrainSvc.getHeight(getPlanet().getID(), randomPosition.x, randomPosition.z); randomPosition.y = height; - for(CreatureObject mobile : mobiles) { - if(mobile.getWorldPosition().getDistance(randomPosition) > spawnGroup.getMinSpawnDistance()) - foundPos = true; - } + if (mobiles.size()>0){ // Fix, mobiles must be filled first, before doing this check + for(CreatureObject mobile : mobiles) { + if(mobile.getWorldPosition().getDistance(randomPosition) > spawnGroup.getMinSpawnDistance()) + foundPos = true; + } + } else {foundPos = true;} if(!terrainSvc.canBuildAtPosition(creature, randomPosition.x, randomPosition.z)) foundPos = false; @@ -153,8 +160,64 @@ public class DynamicSpawnArea extends SpawnArea { String mobileTemplate = spawnGroup.getMobiles().get(random.nextInt(spawnGroup.getMobiles().size())); CreatureObject spawnedCreature = core.spawnService.spawnCreature(mobileTemplate, getPlanet().getName(), 0, randomPosition.x, randomPosition.y, randomPosition.z); - if(spawnedCreature != null) + if(spawnedCreature != null){ mobiles.add(spawnedCreature); + } + + } + + + private void spawnCreatureMember(CreatureObject creature, int spawnIndex) { + + NGECore core = NGECore.getInstance(); + + Iterator it = mobiles.iterator(); + it.forEachRemaining(mobile -> { + if(mobile.getPosture() == Posture.Dead) + it.remove(); + }); + + if(mobiles.size() >= spawnGroup.getMaxSpawns()) + return; + + short memberCL = (spawnGroup.getMembersCL().get(spawnIndex)).shortValue(); + + boolean foundPos = false; + int tries = 0; + Point3D randomPosition = null; + + while(!foundPos && ++tries < 10) { + + randomPosition = getRandomPosition(creature.getWorldPosition(), spawnGroup.getMinSpawnDistance(), spawnGroup.getMaxSpawnDistance()); + + if(randomPosition == null) + return; + + TerrainService terrainSvc = core.terrainService; + + float height = terrainSvc.getHeight(getPlanet().getID(), randomPosition.x, randomPosition.z); + randomPosition.y = height; + + if (mobiles.size()>0){ // Fix, mobiles must be filled first, before doing this check + for(CreatureObject mobile : mobiles) { + if(mobile.getWorldPosition().getDistance(randomPosition) > spawnGroup.getMinSpawnDistance()) + foundPos = true; + } + } else {foundPos = true;} + + if(!terrainSvc.canBuildAtPosition(creature, randomPosition.x, randomPosition.z)) + foundPos = false; + + } + + if(!foundPos) + return; + + String mobileTemplate = spawnGroup.getMobiles().get(spawnIndex); + CreatureObject spawnedCreature = core.spawnService.spawnCreature(mobileTemplate, getPlanet().getName(), 0, randomPosition.x, randomPosition.y, randomPosition.z, memberCL); + if(spawnedCreature != null){ + mobiles.add(spawnedCreature); + } } diff --git a/src/services/spawn/DynamicSpawnGroup.java b/src/services/spawn/DynamicSpawnGroup.java index a29f6ae2..db5acc5d 100644 --- a/src/services/spawn/DynamicSpawnGroup.java +++ b/src/services/spawn/DynamicSpawnGroup.java @@ -29,6 +29,9 @@ public class DynamicSpawnGroup { private String name; private int maxSpawns; private int minSpawnDistance; + private int maxSpawnDistance; + private int groupMemberNumber = -1; + private Vector membersCL; public Vector getMobiles() { return mobiles; @@ -61,5 +64,29 @@ public class DynamicSpawnGroup { public void setMinSpawnDistance(int minSpawnDistance) { this.minSpawnDistance = minSpawnDistance; } + + public int getGroupMemberNumber() { + return groupMemberNumber; + } + + public void setGroupMemberNumber(int groupMemberNumber) { + this.groupMemberNumber = groupMemberNumber; + } + + public int getMaxSpawnDistance() { + return maxSpawnDistance; + } + + public void setMaxSpawnDistance(int maxSpawnDistance) { + this.maxSpawnDistance = maxSpawnDistance; + } + + public Vector getMembersCL() { + return membersCL; + } + + public void setMembersCL(Vector membersCL) { + this.membersCL = membersCL; + } }