From d3a7d47b1ac9ddd9797f86bf515c45054623df96 Mon Sep 17 00:00:00 2001 From: CharonInferar Date: Fri, 8 Aug 2014 18:25:57 +0200 Subject: [PATCH] Added Lair template overloads and Boss spawns for lairs - Content devs can now add lairCRC vectors and bosses - The boss spawns will only work after the invasion commit because then lairs will get health bars and the lair will spawn more waves --- scripts/mobiles/lairgroups/lok_bosstest.py | 11 +++++ scripts/mobiles/lairs/lok_gurk_lair.py | 8 ++++ scripts/mobiles/lok/lok_gurk.py | 46 ++++++++++++++++++ scripts/mobiles/lok/reclusive_gurk_king.py | 46 ++++++++++++++++++ .../mobiles/spawnareas/lok_lair_bosstest_1.py | 6 +++ scripts/radial/npc/untamable.py | 2 +- .../objects/creature/CreatureObject.java | 4 ++ src/services/LootService.java | 2 +- src/services/ai/LairActor.java | 16 ++++++- src/services/spawn/LairTemplate.java | 48 +++++++++++++++++++ src/services/spawn/SpawnService.java | 25 +++++++++- 11 files changed, 210 insertions(+), 4 deletions(-) create mode 100644 scripts/mobiles/lairgroups/lok_bosstest.py create mode 100644 scripts/mobiles/lairs/lok_gurk_lair.py create mode 100644 scripts/mobiles/lok/lok_gurk.py create mode 100644 scripts/mobiles/lok/reclusive_gurk_king.py create mode 100644 scripts/mobiles/spawnareas/lok_lair_bosstest_1.py diff --git a/scripts/mobiles/lairgroups/lok_bosstest.py b/scripts/mobiles/lairgroups/lok_bosstest.py new file mode 100644 index 00000000..bc781ff8 --- /dev/null +++ b/scripts/mobiles/lairgroups/lok_bosstest.py @@ -0,0 +1,11 @@ +import sys +from services.spawn import LairSpawnTemplate +from java.util import Vector + +def addLairGroup(core): + spawnTemplate1 = LairSpawnTemplate(-1, 'lok_gurk_lair', 5, 20) + spawnTemplates = Vector() + spawnTemplates.add(spawnTemplate1) + + core.spawnService.addLairGroup('lok_bosstest', spawnTemplates) + return \ No newline at end of file diff --git a/scripts/mobiles/lairs/lok_gurk_lair.py b/scripts/mobiles/lairs/lok_gurk_lair.py new file mode 100644 index 00000000..9c7997b3 --- /dev/null +++ b/scripts/mobiles/lairs/lok_gurk_lair.py @@ -0,0 +1,8 @@ +import sys +from java.util import Vector + +def addTemplate(core): + lairCRCs = Vector() + lairCRCs.add('object/tangible/terminal/shared_terminal_character_builder.iff') + core.spawnService.addLairTemplate('lok_gurk_lair', 'lok_gurk', 15, lairCRCs,'reclusive_gurk_king') + return \ No newline at end of file diff --git a/scripts/mobiles/lok/lok_gurk.py b/scripts/mobiles/lok/lok_gurk.py new file mode 100644 index 00000000..fa561007 --- /dev/null +++ b/scripts/mobiles/lok/lok_gurk.py @@ -0,0 +1,46 @@ +import sys +from services.spawn import MobileTemplate +from services.spawn import WeaponTemplate +from resources.datatables import WeaponType +from resources.datatables import Difficulty +from resources.datatables import Options +from java.util import Vector + + +def addTemplate(core): + mobileTemplate = MobileTemplate() + + mobileTemplate.setCustomName('A gurk') + mobileTemplate.setLevel(79) + mobileTemplate.setMinLevel(79) + mobileTemplate.setMaxLevel(80) + mobileTemplate.setDifficulty(Difficulty.NORMAL) + + mobileTemplate.setMinSpawnDistance(4) + mobileTemplate.setMaxSpawnDistance(8) + mobileTemplate.setDeathblow(True) + mobileTemplate.setScale(1) + mobileTemplate.setMeatType("Carnivore Meat") + mobileTemplate.setMeatAmount(1450) + mobileTemplate.setHideType("Leathery Hide") + mobileTemplate.setHideAmount(1350) + mobileTemplate.setSocialGroup("kimogila") + mobileTemplate.setAssistRange(12) + mobileTemplate.setStalker(True) + mobileTemplate.setOptionsBitmask(Options.AGGRESSIVE | Options.ATTACKABLE) + + templates = Vector() + templates.add('object/mobile/shared_voritor_dasher.iff') + mobileTemplate.setTemplates(templates) + + weaponTemplates = Vector() + weapontemplate = WeaponTemplate('object/weapon/melee/unarmed/shared_unarmed_default.iff', WeaponType.UNARMED, 1.0, 6, 'kinetic') + weaponTemplates.add(weapontemplate) + mobileTemplate.setWeaponTemplateVector(weaponTemplates) + + attacks = Vector() + mobileTemplate.setDefaultAttack('creatureMeleeAttack') + mobileTemplate.setAttacks(attacks) + + core.spawnService.addMobileTemplate('lok_gurk', mobileTemplate) + return \ No newline at end of file diff --git a/scripts/mobiles/lok/reclusive_gurk_king.py b/scripts/mobiles/lok/reclusive_gurk_king.py new file mode 100644 index 00000000..754ca0fe --- /dev/null +++ b/scripts/mobiles/lok/reclusive_gurk_king.py @@ -0,0 +1,46 @@ +import sys +from services.spawn import MobileTemplate +from services.spawn import WeaponTemplate +from resources.datatables import WeaponType +from resources.datatables import Difficulty +from resources.datatables import Options +from java.util import Vector + + +def addTemplate(core): + mobileTemplate = MobileTemplate() + + mobileTemplate.setCustomName('Gurk King') + mobileTemplate.setLevel(79) + mobileTemplate.setMinLevel(79) + mobileTemplate.setMaxLevel(80) + mobileTemplate.setDifficulty(Difficulty.BOSS) + + mobileTemplate.setMinSpawnDistance(4) + mobileTemplate.setMaxSpawnDistance(8) + mobileTemplate.setDeathblow(True) + mobileTemplate.setScale(1) + mobileTemplate.setMeatType("Carnivore Meat") + mobileTemplate.setMeatAmount(1450) + mobileTemplate.setHideType("Leathery Hide") + mobileTemplate.setHideAmount(1350) + mobileTemplate.setSocialGroup("kimogila") + mobileTemplate.setAssistRange(12) + mobileTemplate.setStalker(True) + mobileTemplate.setOptionsBitmask(Options.AGGRESSIVE | Options.ATTACKABLE) + + templates = Vector() + templates.add('object/mobile/shared_recluse_gurk_king.iff') + mobileTemplate.setTemplates(templates) + + weaponTemplates = Vector() + weapontemplate = WeaponTemplate('object/weapon/melee/unarmed/shared_unarmed_default.iff', WeaponType.UNARMED, 1.0, 6, 'kinetic') + weaponTemplates.add(weapontemplate) + mobileTemplate.setWeaponTemplateVector(weaponTemplates) + + attacks = Vector() + mobileTemplate.setDefaultAttack('creatureMeleeAttack') + mobileTemplate.setAttacks(attacks) + + core.spawnService.addMobileTemplate('reclusive_gurk_king', mobileTemplate) + return \ No newline at end of file diff --git a/scripts/mobiles/spawnareas/lok_lair_bosstest_1.py b/scripts/mobiles/spawnareas/lok_lair_bosstest_1.py new file mode 100644 index 00000000..64d88a8d --- /dev/null +++ b/scripts/mobiles/spawnareas/lok_lair_bosstest_1.py @@ -0,0 +1,6 @@ +# Spawn Area file created with PSWG Planetary Spawn Tool +import sys + +def addSpawnArea(core): + core.spawnService.addLairSpawnArea('lok_bosstest', -2400, 3600, 1800, 'lok') + return diff --git a/scripts/radial/npc/untamable.py b/scripts/radial/npc/untamable.py index 420fb6d0..e75e088f 100644 --- a/scripts/radial/npc/untamable.py +++ b/scripts/radial/npc/untamable.py @@ -7,6 +7,6 @@ def createRadial(core, owner, target, radials): return def handleSelection(core, owner, target, option): + return - \ No newline at end of file diff --git a/src/resources/objects/creature/CreatureObject.java b/src/resources/objects/creature/CreatureObject.java index 332d1731..432bbf70 100644 --- a/src/resources/objects/creature/CreatureObject.java +++ b/src/resources/objects/creature/CreatureObject.java @@ -1487,6 +1487,10 @@ public class CreatureObject extends TangibleObject implements Serializable { getClient().getSession().write(new PlayMusicMessage(sndFile, targetId, 1, false).serialize()); } + public void playMusicSelf(String sndFile, long targetId, int repetitions, boolean flag) { + getClient().getSession().write(new PlayMusicMessage(sndFile, targetId, 1, false).serialize()); + } + public boolean getGroupDance() { synchronized(objectMutex) { return groupDance; diff --git a/src/services/LootService.java b/src/services/LootService.java index 6811ee64..3ac9ee45 100644 --- a/src/services/LootService.java +++ b/src/services/LootService.java @@ -242,7 +242,7 @@ public class LootService implements INetworkDispatch { if (droppedItem.getAttachment("LootItemName").toString().contains("Loot Chest")){ lootedObject.playEffectObject("appearance/pt_rare_chest.prt", ""); - requester.playMusic("sound/rare_loot_chest.snd"); + requester.playMusicSelf("sound/rare_loot_chest.snd", requester.getObjectID(),1,false); } } diff --git a/src/services/ai/LairActor.java b/src/services/ai/LairActor.java index 56fa0ac5..1bb1e4b8 100644 --- a/src/services/ai/LairActor.java +++ b/src/services/ai/LairActor.java @@ -42,6 +42,8 @@ public class LairActor { private Vector creatureTemplates; private volatile int spawnWave = 0; private short level; + private String bossTemplate; + private boolean bossSpawned = false; public LairActor(TangibleObject lairObject, String creatureTemplate) { this.lairObject = lairObject; @@ -118,6 +120,10 @@ public class LairActor { } break; case 3: + if (bossTemplate!=null && ! bossSpawned){ + CreatureObject boss = (CreatureObject)NGECore.getInstance().spawnService.spawnCreature(bossTemplate, lairObject.getPlanet().getName(), 0L, lairObject.getPosition().x + 3, lairObject.getPosition().y, lairObject.getPosition().z, lairObject.getOrientation().w, lairObject.getOrientation().x, lairObject.getOrientation().y,lairObject.getOrientation().z,-1); + bossSpawned = true; + } return; default: @@ -139,7 +145,7 @@ public class LairActor { creatureTemplate = creatureTemplates.get(new Random().nextInt(creatureTemplates.size())); float babyChance = new Random().nextFloat(); CreatureObject creature = null; - if (babyChance>0.9){ + if (babyChance>0.1){ creature = NGECore.getInstance().spawnService.spawnCreature(creatureTemplate, lairObject.getPlanet().getName(), 0, position.x, position.y, position.z, level); } else { creature = NGECore.getInstance().spawnService.spawnCreatureBaby(creatureTemplate, lairObject.getPlanet().getName(), 0, position.x, position.y, position.z, level); @@ -197,4 +203,12 @@ public class LairActor { public void setLevel(short level) { this.level = level; } + + public String getBossTemplate() { + return bossTemplate; + } + + public void setBossTemplate(String bossTemplate) { + this.bossTemplate = bossTemplate; + } } diff --git a/src/services/spawn/LairTemplate.java b/src/services/spawn/LairTemplate.java index 04741351..c94dfe50 100644 --- a/src/services/spawn/LairTemplate.java +++ b/src/services/spawn/LairTemplate.java @@ -29,7 +29,9 @@ public class LairTemplate { private String lairCRC; private String mobileName; private Vector mobiles; + private Vector lairCRCs; private int mobileLimit; + private String bossTemplate; public LairTemplate(String name, String mobile, int mobileLimit, String lairCRC) { this.name = name; @@ -45,6 +47,36 @@ public class LairTemplate { this.lairCRC = lairCRC; } + public LairTemplate(String name, Vector mobiles, int mobileLimit, Vector lairCRCs) { + this.name = name; + this.mobiles = mobiles; + this.mobileLimit = mobileLimit; + this.lairCRCs = lairCRCs; + } + + public LairTemplate(String name, Vector mobiles, int mobileLimit, Vector lairCRCs, String bossTemplate) { + this.name = name; + this.mobiles = mobiles; + this.mobileLimit = mobileLimit; + this.lairCRCs = lairCRCs; + this.bossTemplate = bossTemplate; + } + + public LairTemplate(String name, String mobile, int mobileLimit, Vector lairCRCs, String bossTemplate) { + this.name = name; + this.mobileName = mobile; + this.mobileLimit = mobileLimit; + this.lairCRCs = lairCRCs; + this.bossTemplate = bossTemplate; + } + + public LairTemplate(String name, String mobile, int mobileLimit, Vector lairCRCs) { + this.name = name; + this.mobileName = mobile; + this.mobileLimit = mobileLimit; + this.lairCRCs = lairCRCs; + } + public String getLairCRC() { return lairCRC; } @@ -85,4 +117,20 @@ public class LairTemplate { this.mobiles = mobiles; } + public Vector getLairCRCs() { + return lairCRCs; + } + + public void setLairCRCs(Vector lairCRCs) { + this.lairCRCs = lairCRCs; + } + + public String getBossTemplate() { + return bossTemplate; + } + + public void setBossTemplate(String bossTemplate) { + this.bossTemplate = bossTemplate; + } + } diff --git a/src/services/spawn/SpawnService.java b/src/services/spawn/SpawnService.java index 1a612118..0fc22032 100644 --- a/src/services/spawn/SpawnService.java +++ b/src/services/spawn/SpawnService.java @@ -436,7 +436,15 @@ public class SpawnService { LairTemplate lairTemplate = lairTemplates.get(lairSpawnTemplate); if(lairTemplate == null) return null; - TangibleObject lairObject = (TangibleObject) core.objectService.createObject(lairTemplate.getLairCRC(), 0, planet, position, new Quaternion(1, 0, 0, 0)); + + TangibleObject lairObject = null; + if (lairTemplate.getLairCRC()==null){ + String lairCRC = lairTemplate.getLairCRCs().get(new Random().nextInt(lairTemplate.getLairCRCs().size())); + System.out.println("Lair CRC " + lairCRC); + lairObject = (TangibleObject) core.objectService.createObject(lairCRC, 0, planet, position, new Quaternion(1, 0, 0, 0)); + } else { + lairObject = (TangibleObject) core.objectService.createObject(lairTemplate.getLairCRC().trim(), 0, planet, position, new Quaternion(1, 0, 0, 0)); + } if(lairObject == null) return null; @@ -452,6 +460,9 @@ public class SpawnService { lairObject.setAttachment("AI", lairActor); + if (lairTemplate.getBossTemplate()!=null) + lairActor.setBossTemplate(lairTemplate.getBossTemplate()); + core.simulationService.add(lairObject, position.x, position.z, true); lairActor.spawnNewCreatures(); @@ -506,6 +517,18 @@ public class SpawnService { lairTemplates.put(name, new LairTemplate(name, mobiles, mobileLimit, lairCRC)); } + public void addLairTemplate(String name, Vector mobiles, int mobileLimit, Vector lairCRCs) { + lairTemplates.put(name, new LairTemplate(name, mobiles, mobileLimit, lairCRCs)); + } + + public void addLairTemplate(String name, Vector mobiles, int mobileLimit, Vector lairCRCs, String bossTemplate) { + lairTemplates.put(name, new LairTemplate(name, mobiles, mobileLimit, lairCRCs)); + } + + public void addLairTemplate(String name, String mobile, int mobileLimit, Vector lairCRCs, String bossTemplate) { + lairTemplates.put(name, new LairTemplate(name, mobile, mobileLimit, lairCRCs)); + } + public void loadLairGroups() { Path p = Paths.get("scripts/mobiles/lairgroups"); FileVisitor fv = new SimpleFileVisitor() {