diff --git a/.project b/.project
index 5c73c250..d1bd5e27 100644
--- a/.project
+++ b/.project
@@ -5,6 +5,11 @@
+
+ org.python.pydev.PyDevBuilder
+
+
+
org.eclipse.jdt.core.javabuilder
@@ -13,5 +18,6 @@
org.eclipse.jdt.core.javanature
+ org.python.pydev.pythonNature
diff --git a/ngengine_public.jar b/ngengine_public.jar
index c5451df1..beacd257 100644
Binary files a/ngengine_public.jar and b/ngengine_public.jar differ
diff --git a/scripts/buffs/drink_breath_of_heaven.py b/scripts/buffs/drink_breath_of_heaven.py
new file mode 100644
index 00000000..34ee2c0a
--- /dev/null
+++ b/scripts/buffs/drink_breath_of_heaven.py
@@ -0,0 +1,14 @@
+import sys
+
+def setup(core, actor, buff):
+ return
+
+def add(core, actor, buff):
+ core.skillModService.addSkillMod(actor, 'constitution_modified', 80)
+ core.skillModService.addSkillMod(actor, 'expertise_dodge', 3)
+ return
+
+def remove(core, actor, buff):
+ core.skillModService.deductSkillMod(actor, 'constitution_modified', 80)
+ core.skillModService.deductSkillMod(actor, 'expertise_dodge', 3)
+ return
diff --git a/scripts/conversation/missions/bounty_droid_probot.py b/scripts/conversation/missions/bounty_droid_probot.py
new file mode 100644
index 00000000..ea327232
--- /dev/null
+++ b/scripts/conversation/missions/bounty_droid_probot.py
@@ -0,0 +1,70 @@
+from resources.common import ConversationOption
+from resources.common import OutOfBand
+from resources.common import ProsePackage
+from java.util import Vector
+import time
+import sys
+
+def startConversation(core, actor, npc):
+ convSvc = core.conversationService
+
+ probotRequester = core.objectService.getObject(long(npc.getAttachment('probotRequester')))
+
+ if probotRequester is None:
+ core.objectService.destroyObject(npc)
+ return
+
+ if probotRequester.getObjectId() != actor.getObjectId():
+ prose = ProsePackage('conversation/bounty_probot', 's_6')
+ outOfBand = OutOfBand()
+ outOfBand.addProsePackage(prose)
+ convSvc.sendConversationMessage(actor, npc, outOfBand)
+ return
+
+ mission = core.objectService.getObject(long(npc.getAttachment('attachedMission')))
+
+ if mission is None:
+ prose = ProsePackage('conversation/bounty_probot', 's_4')
+ outOfBand = OutOfBand()
+ outOfBand.addProsePackage(prose)
+ convSvc.sendConversationMessage(actor, npc, prose)
+ return
+
+ objective = mission.getObjective()
+
+ if objective is None:
+ prose = ProsePackage('conversation/bounty_probot', 's_4')
+ outOfBand = OutOfBand()
+ outOfBand.addProsePackage(prose)
+ convSvc.sendConversationMessage(actor, npc, prose)
+ return
+
+ prose = ProsePackage('conversation/bounty_probot', 's_5')
+ outOfBand = OutOfBand()
+ outOfBand.addProsePackage(prose)
+ convSvc.sendConversationMessage(actor, npc, outOfBand)
+
+ options = Vector()
+ optionProse = ProsePackage('conversation/bounty_probot', 's_8')
+ optionOOB = OutOfBand()
+ optionOOB.addProsePackage(optionProse)
+ options.add(ConversationOption(optionOOB, 0))
+ convSvc.sendConversationOptions(actor, npc, options, handleBioTransmit)
+
+ return
+
+def handleBioTransmit(core, actor, npc, selection):
+ core.conversationService.handleEndConversation(actor, npc)
+ actor.sendSystemMessage('@mission/mission_generic:probe_droid_takeoff', 0)
+
+ npc.setPosture(8)
+
+ time.sleep(7)
+ objective = core.objectService.getObject(long(npc.getAttachment('attachedMission'))).getObjective()
+ objective.beginArakydUpdate(actor)
+ core.objectService.destroyObject(npc)
+ return
+
+def endConversation(core, actor, npc):
+ core.conversationService.sendStopConversation(actor, npc, '', '')
+ return
diff --git a/scripts/conversation/missions/deliver.py b/scripts/conversation/missions/deliver.py
index f8ee5667..774e3e01 100644
--- a/scripts/conversation/missions/deliver.py
+++ b/scripts/conversation/missions/deliver.py
@@ -66,5 +66,5 @@ def handleCompletionStage(core, actor, npc, objective, mission):
return
core.conversationService.sendStopConversation(actor, npc, mission.getMissionDescription(), 'm' + str(mission.getMissionId()) + 's')
- objective.complete(core, actor)
+ core.missionService.handleMissionComplete(actor, mission)
return
\ No newline at end of file
diff --git a/scripts/mobiles/dantooine/dark_adept.py b/scripts/mobiles/dantooine/dark_adept.py
index 5a0df6df..fd56213d 100644
--- a/scripts/mobiles/dantooine/dark_adept.py
+++ b/scripts/mobiles/dantooine/dark_adept.py
@@ -17,6 +17,8 @@ def addTemplate(core):
mobileTemplate.setMinSpawnDistance(4)
mobileTemplate.setMaxSpawnDistance(8)
mobileTemplate.setDeathblow(True)
+ mobileTemplate.setSocialGroup('dark jedi')
+ mobileTemplate.setAssistRange(12)
templates = Vector()
diff --git a/scripts/mobiles/dantooine/dark_force_crystal_hunter.py b/scripts/mobiles/dantooine/dark_force_crystal_hunter.py
index 0c6ded2a..09b3c0f3 100644
--- a/scripts/mobiles/dantooine/dark_force_crystal_hunter.py
+++ b/scripts/mobiles/dantooine/dark_force_crystal_hunter.py
@@ -13,26 +13,24 @@ def addTemplate(core):
mobileTemplate.setDifficulty(0)
mobileTemplate.setAttackRange(6)
mobileTemplate.setAttackSpeed(1.0)
- mobileTemplate.setWeaponType(9)
+ mobileTemplate.setWeaponType(4)
mobileTemplate.setMinSpawnDistance(2)
mobileTemplate.setMaxSpawnDistance(4)
mobileTemplate.setDeathblow(True)
+ mobileTemplate.setSocialGroup('remnants of kun')
+ mobileTemplate.setAssistRange(12)
templates = Vector()
templates.add('object/mobile/shared_dressed_dark_force_crystal_hunter.iff')
mobileTemplate.setTemplates(templates)
weaponTemplates = Vector()
- weapontemplate = WeaponTemplate('object/weapon/melee/sword/crafted_saber/shared_sword_lightsaber_one_handed_gen5.iff', 9, 1.0)
+ weapontemplate = WeaponTemplate('object/weapon/melee/sword/shared_sword_01.iff', 4, 1.0)
weaponTemplates.add(weapontemplate)
- weapontemplate = WeaponTemplate('object/weapon/melee/2h_sword/crafted_saber/shared_sword_lightsaber_two_handed_gen5.iff', 10, 1.0)
- weaponTemplates.add(weapontemplate)
- weapontemplate = WeaponTemplate('object/weapon/melee/polearm/crafted_saber/shared_sword_lightsaber_polearm_gen5.iff', 11, 1.0)
- weaponTemplates.add(weapontemplate)
mobileTemplate.setWeaponTemplateVector(weaponTemplates)
attacks = Vector()
- mobileTemplate.setDefaultAttack('saberHit')
+ mobileTemplate.setDefaultAttack('meleehit')
mobileTemplate.setAttacks(attacks)
core.spawnService.addMobileTemplate('dark_force_crystal_hunter', mobileTemplate)
diff --git a/scripts/mobiles/dantooine/dark_jedi_knight.py b/scripts/mobiles/dantooine/dark_jedi_knight.py
index 337b7b82..bcd26a26 100644
--- a/scripts/mobiles/dantooine/dark_jedi_knight.py
+++ b/scripts/mobiles/dantooine/dark_jedi_knight.py
@@ -17,6 +17,8 @@ def addTemplate(core):
mobileTemplate.setMinSpawnDistance(3)
mobileTemplate.setMaxSpawnDistance(5)
mobileTemplate.setDeathblow(True)
+ mobileTemplate.setSocialGroup('dark jedi')
+ mobileTemplate.setAssistRange(12)
templates = Vector()
templates.add('object/mobile/shared_dressed_dark_jedi_male_human_01.iff')
diff --git a/scripts/mobiles/dantooine/dark_jedi_master.py b/scripts/mobiles/dantooine/dark_jedi_master.py
index 8ad845e3..6d6566ae 100644
--- a/scripts/mobiles/dantooine/dark_jedi_master.py
+++ b/scripts/mobiles/dantooine/dark_jedi_master.py
@@ -15,6 +15,8 @@ def addTemplate(core):
mobileTemplate.setMinSpawnDistance(3)
mobileTemplate.setMaxSpawnDistance(5)
mobileTemplate.setDeathblow(True)
+ mobileTemplate.setSocialGroup('dark jedi')
+ mobileTemplate.setAssistRange(12)
templates = Vector()
templates.add('object/mobile/shared_dressed_dark_jedi_master_female_twk_01.iff')
diff --git a/scripts/mobiles/dantooine/dark_side_savage.py b/scripts/mobiles/dantooine/dark_side_savage.py
index dee96f19..9f8138f1 100644
--- a/scripts/mobiles/dantooine/dark_side_savage.py
+++ b/scripts/mobiles/dantooine/dark_side_savage.py
@@ -11,26 +11,23 @@ def addTemplate(core):
mobileTemplate.setDifficulty(0)
mobileTemplate.setAttackRange(6)
mobileTemplate.setAttackSpeed(1.0)
- mobileTemplate.setWeaponType(9)
+ mobileTemplate.setWeaponType(6)
mobileTemplate.setMinSpawnDistance(2)
mobileTemplate.setMaxSpawnDistance(4)
mobileTemplate.setDeathblow(False)
+ mobileTemplate.setSocialGroup('remnants of kun')
templates = Vector()
templates.add('object/mobile/shared_dressed_dark_side_savage.iff')
mobileTemplate.setTemplates(templates)
weaponTemplates = Vector()
- weapontemplate = WeaponTemplate('object/weapon/melee/sword/crafted_saber/shared_sword_lightsaber_one_handed_gen5.iff', 9, 1.0)
+ weapontemplate = WeaponTemplate('object/weapon/melee/unarmed/shared_unarmed_default.iff', 6, 1.0)
weaponTemplates.add(weapontemplate)
- weapontemplate = WeaponTemplate('object/weapon/melee/2h_sword/crafted_saber/shared_sword_lightsaber_two_handed_gen5.iff', 10, 1.0)
- weaponTemplates.add(weapontemplate)
- weapontemplate = WeaponTemplate('object/weapon/melee/polearm/crafted_saber/shared_sword_lightsaber_polearm_gen5.iff', 11, 1.0)
- weaponTemplates.add(weapontemplate)
mobileTemplate.setWeaponTemplateVector(weaponTemplates)
attacks = Vector()
- mobileTemplate.setDefaultAttack('saberHit')
+ mobileTemplate.setDefaultAttack('creatureMeleeAttack')
mobileTemplate.setAttacks(attacks)
core.spawnService.addMobileTemplate('dark_side_savage', mobileTemplate)
diff --git a/scripts/mobiles/dantooine/force_sensitive_crypt_crawler.py b/scripts/mobiles/dantooine/force_sensitive_crypt_crawler.py
index a74916a2..bbbf90f5 100644
--- a/scripts/mobiles/dantooine/force_sensitive_crypt_crawler.py
+++ b/scripts/mobiles/dantooine/force_sensitive_crypt_crawler.py
@@ -13,26 +13,23 @@ def addTemplate(core):
mobileTemplate.setDifficulty(0)
mobileTemplate.setAttackRange(6)
mobileTemplate.setAttackSpeed(1.0)
- mobileTemplate.setWeaponType(9)
+ mobileTemplate.setWeaponType(7)
mobileTemplate.setMinSpawnDistance(3)
mobileTemplate.setMaxSpawnDistance(5)
mobileTemplate.setDeathblow(False)
+ mobileTemplate.setSocialGroup('remnants of kun')
templates = Vector()
templates.add('object/mobile/shared_dressed_force_sensitive_crypt_crawler.iff')
mobileTemplate.setTemplates(templates)
weaponTemplates = Vector()
- weapontemplate = WeaponTemplate('object/weapon/melee/sword/crafted_saber/shared_sword_lightsaber_one_handed_gen5.iff', 9, 1.0)
+ weapontemplate = WeaponTemplate('object/weapon/melee/polearm/shared_lance_staff_wood_s1.iff', 7, 1.0)
weaponTemplates.add(weapontemplate)
- weapontemplate = WeaponTemplate('object/weapon/melee/2h_sword/crafted_saber/shared_sword_lightsaber_two_handed_gen5.iff', 10, 1.0)
- weaponTemplates.add(weapontemplate)
- weapontemplate = WeaponTemplate('object/weapon/melee/polearm/crafted_saber/shared_sword_lightsaber_polearm_gen5.iff', 11, 1.0)
- weaponTemplates.add(weapontemplate)
mobileTemplate.setWeaponTemplateVector(weaponTemplates)
attacks = Vector()
- mobileTemplate.setDefaultAttack('saberHit')
+ mobileTemplate.setDefaultAttack('meleehit')
mobileTemplate.setAttacks(attacks)
core.spawnService.addMobileTemplate('force_sensitive_crypt_crawler', mobileTemplate)
diff --git a/scripts/mobiles/dantooine/force_sensitive_renegade.py b/scripts/mobiles/dantooine/force_sensitive_renegade.py
index 8d3d4257..1efb1591 100644
--- a/scripts/mobiles/dantooine/force_sensitive_renegade.py
+++ b/scripts/mobiles/dantooine/force_sensitive_renegade.py
@@ -13,26 +13,24 @@ def addTemplate(core):
mobileTemplate.setDifficulty(0)
mobileTemplate.setAttackRange(6)
mobileTemplate.setAttackSpeed(1.0)
- mobileTemplate.setWeaponType(9)
+ mobileTemplate.setWeaponType(6)
mobileTemplate.setMinSpawnDistance(4)
mobileTemplate.setMaxSpawnDistance(7)
mobileTemplate.setDeathblow(False)
+ mobileTemplate.setSocialGroup('force renegade')
+
templates = Vector()
templates.add('object/mobile/shared_dressed_force_sensitive_renegade.iff')
mobileTemplate.setTemplates(templates)
weaponTemplates = Vector()
- weapontemplate = WeaponTemplate('object/weapon/melee/sword/crafted_saber/shared_sword_lightsaber_one_handed_gen5.iff', 9, 1.0)
+ weapontemplate = WeaponTemplate('object/weapon/melee/unarmed/shared_unarmed_default.iff', 6, 1.0)
weaponTemplates.add(weapontemplate)
- weapontemplate = WeaponTemplate('object/weapon/melee/2h_sword/crafted_saber/shared_sword_lightsaber_two_handed_gen5.iff', 10, 1.0)
- weaponTemplates.add(weapontemplate)
- weapontemplate = WeaponTemplate('object/weapon/melee/polearm/crafted_saber/shared_sword_lightsaber_polearm_gen5.iff', 11, 1.0)
- weaponTemplates.add(weapontemplate)
mobileTemplate.setWeaponTemplateVector(weaponTemplates)
attacks = Vector()
- mobileTemplate.setDefaultAttack('saberHit')
+ mobileTemplate.setDefaultAttack('creatureMeleeAttack')
mobileTemplate.setAttacks(attacks)
core.spawnService.addMobileTemplate('force_sensitive_renegade', mobileTemplate)
diff --git a/scripts/mobiles/dantooine/forsaken_force_drifter.py b/scripts/mobiles/dantooine/forsaken_force_drifter.py
index 1fbc8e26..3cb43224 100644
--- a/scripts/mobiles/dantooine/forsaken_force_drifter.py
+++ b/scripts/mobiles/dantooine/forsaken_force_drifter.py
@@ -11,26 +11,23 @@ def addTemplate(core):
mobileTemplate.setDifficulty(0)
mobileTemplate.setAttackRange(6)
mobileTemplate.setAttackSpeed(1.0)
- mobileTemplate.setWeaponType(9)
+ mobileTemplate.setWeaponType(6)
mobileTemplate.setMinSpawnDistance(3)
mobileTemplate.setMaxSpawnDistance(6)
mobileTemplate.setDeathblow(False)
+ mobileTemplate.setSocialGroup('force renegade')
templates = Vector()
templates.add('object/mobile/shared_dressed_forsaken_force_drifter.iff')
mobileTemplate.setTemplates(templates)
weaponTemplates = Vector()
- weapontemplate = WeaponTemplate('object/weapon/melee/sword/crafted_saber/shared_sword_lightsaber_one_handed_gen5.iff', 9, 1.0)
+ weapontemplate = WeaponTemplate('object/weapon/melee/unarmed/shared_unarmed_default.iff', 6, 1.0)
weaponTemplates.add(weapontemplate)
- weapontemplate = WeaponTemplate('object/weapon/melee/2h_sword/crafted_saber/shared_sword_lightsaber_two_handed_gen5.iff', 10, 1.0)
- weaponTemplates.add(weapontemplate)
- weapontemplate = WeaponTemplate('object/weapon/melee/polearm/crafted_saber/shared_sword_lightsaber_polearm_gen5.iff', 11, 1.0)
- weaponTemplates.add(weapontemplate)
mobileTemplate.setWeaponTemplateVector(weaponTemplates)
attacks = Vector()
- mobileTemplate.setDefaultAttack('saberHit')
+ mobileTemplate.setDefaultAttack('creatureMeleeAttack')
mobileTemplate.setAttacks(attacks)
core.spawnService.addMobileTemplate('forsaken_force_drifter', mobileTemplate)
diff --git a/scripts/mobiles/dantooine/novice_force_mystic.py b/scripts/mobiles/dantooine/novice_force_mystic.py
index d7313ad5..b034a3ae 100644
--- a/scripts/mobiles/dantooine/novice_force_mystic.py
+++ b/scripts/mobiles/dantooine/novice_force_mystic.py
@@ -11,26 +11,23 @@ def addTemplate(core):
mobileTemplate.setDifficulty(0)
mobileTemplate.setAttackRange(6)
mobileTemplate.setAttackSpeed(1.0)
- mobileTemplate.setWeaponType(9)
+ mobileTemplate.setWeaponType(4)
mobileTemplate.setMinSpawnDistance(4)
mobileTemplate.setMaxSpawnDistance(7)
mobileTemplate.setDeathblow(False)
+ mobileTemplate.setSocialGroup('force renegade')
templates = Vector()
templates.add('object/mobile/shared_dressed_novice_force_mystic.iff')
mobileTemplate.setTemplates(templates)
weaponTemplates = Vector()
- weapontemplate = WeaponTemplate('object/weapon/melee/sword/crafted_saber/shared_sword_lightsaber_one_handed_gen5.iff', 9, 1.0)
+ weapontemplate = WeaponTemplate('object/weapon/melee/sword/shared_sword_01.iff', 4, 1.0)
weaponTemplates.add(weapontemplate)
- weapontemplate = WeaponTemplate('object/weapon/melee/2h_sword/crafted_saber/shared_sword_lightsaber_two_handed_gen5.iff', 10, 1.0)
- weaponTemplates.add(weapontemplate)
- weapontemplate = WeaponTemplate('object/weapon/melee/polearm/crafted_saber/shared_sword_lightsaber_polearm_gen5.iff', 11, 1.0)
- weaponTemplates.add(weapontemplate)
mobileTemplate.setWeaponTemplateVector(weaponTemplates)
attacks = Vector()
- mobileTemplate.setDefaultAttack('saberHit')
+ mobileTemplate.setDefaultAttack('meleehit')
mobileTemplate.setAttacks(attacks)
core.spawnService.addMobileTemplate('novice_force_mystic', mobileTemplate)
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 65f54e75..dacb0620 100644
--- a/scripts/mobiles/dantooine/untrained_wielder_of_the_dark_side.py
+++ b/scripts/mobiles/dantooine/untrained_wielder_of_the_dark_side.py
@@ -13,26 +13,24 @@ def addTemplate(core):
mobileTemplate.setDifficulty(0)
mobileTemplate.setAttackRange(6)
mobileTemplate.setAttackSpeed(1.0)
- mobileTemplate.setWeaponType(9)
+ mobileTemplate.setWeaponType(4)
mobileTemplate.setMinSpawnDistance(4)
mobileTemplate.setMaxSpawnDistance(6)
mobileTemplate.setDeathblow(False)
+ mobileTemplate.setSocialGroup('remnants of kun')
+ mobileTemplate.setAssistRange(12)
templates = Vector()
templates.add('object/mobile/shared_dressed_untrained_wielder_of_the_darkside.iff')
mobileTemplate.setTemplates(templates)
weaponTemplates = Vector()
- weapontemplate = WeaponTemplate('object/weapon/melee/sword/crafted_saber/shared_sword_lightsaber_one_handed_gen5.iff', 9, 1.0)
+ weapontemplate = WeaponTemplate('object/weapon/melee/sword/shared_sword_01.iff', 4, 1.0)
weaponTemplates.add(weapontemplate)
- weapontemplate = WeaponTemplate('object/weapon/melee/2h_sword/crafted_saber/shared_sword_lightsaber_two_handed_gen5.iff', 10, 1.0)
- weaponTemplates.add(weapontemplate)
- weapontemplate = WeaponTemplate('object/weapon/melee/polearm/crafted_saber/shared_sword_lightsaber_polearm_gen5.iff', 11, 1.0)
- weaponTemplates.add(weapontemplate)
mobileTemplate.setWeaponTemplateVector(weaponTemplates)
attacks = Vector()
- mobileTemplate.setDefaultAttack('saberHit')
+ mobileTemplate.setDefaultAttack('meleehit')
mobileTemplate.setAttacks(attacks)
core.spawnService.addMobileTemplate('untrained_wielder_of_the_dark_side', mobileTemplate)
diff --git a/scripts/mobiles/dynamicgroups/adolescent_krayt_wild_1.py b/scripts/mobiles/dynamicgroups/adolescent_krayt_wild_1.py
new file mode 100644
index 00000000..f542e938
--- /dev/null
+++ b/scripts/mobiles/dynamicgroups/adolescent_krayt_wild_1.py
@@ -0,0 +1,16 @@
+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('adolescent_krayt_dragon')
+ dynamicGroup.setMobiles(mobileTemplates)
+ dynamicGroup.setGroupMembersNumber(1)
+ dynamicGroup.setName('adolescent_krayt_wild_1')
+ dynamicGroup.setMaxSpawns(1)
+ dynamicGroup.setMinSpawnDistance(150)
+ core.spawnService.addDynamicGroup('adolescent_krayt_wild_1', dynamicGroup)
+ return
\ No newline at end of file
diff --git a/scripts/mobiles/dynamicgroups/canyon_krayt_wild_1.py b/scripts/mobiles/dynamicgroups/canyon_krayt_wild_1.py
new file mode 100644
index 00000000..27b392b6
--- /dev/null
+++ b/scripts/mobiles/dynamicgroups/canyon_krayt_wild_1.py
@@ -0,0 +1,16 @@
+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('canyon_krayt_dragon')
+ dynamicGroup.setMobiles(mobileTemplates)
+ dynamicGroup.setGroupMembersNumber(1)
+ dynamicGroup.setName('canyon_krayt_wild_1')
+ dynamicGroup.setMaxSpawns(1)
+ dynamicGroup.setMinSpawnDistance(150)
+ core.spawnService.addDynamicGroup('canyon_krayt_wild_1', dynamicGroup)
+ return
\ No newline at end of file
diff --git a/scripts/mobiles/dynamicgroups/giant_canyon_krayt_wild_1.py b/scripts/mobiles/dynamicgroups/giant_canyon_krayt_wild_1.py
new file mode 100644
index 00000000..90595b2f
--- /dev/null
+++ b/scripts/mobiles/dynamicgroups/giant_canyon_krayt_wild_1.py
@@ -0,0 +1,16 @@
+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('giant_canyon_krayt_dragon')
+ dynamicGroup.setMobiles(mobileTemplates)
+ dynamicGroup.setGroupMembersNumber(1)
+ dynamicGroup.setName('giant_canyon_krayt_dragon_1')
+ dynamicGroup.setMaxSpawns(1)
+ dynamicGroup.setMinSpawnDistance(60)
+ core.spawnService.addDynamicGroup('giant_canyon_krayt_dragon_1', dynamicGroup)
+ return
\ No newline at end of file
diff --git a/scripts/mobiles/dynamicgroups/grand_canyon_krayt_wild_1.py b/scripts/mobiles/dynamicgroups/grand_canyon_krayt_wild_1.py
new file mode 100644
index 00000000..f8f13fe8
--- /dev/null
+++ b/scripts/mobiles/dynamicgroups/grand_canyon_krayt_wild_1.py
@@ -0,0 +1,16 @@
+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('grand_canyon_krayt_dragon')
+ dynamicGroup.setMobiles(mobileTemplates)
+ dynamicGroup.setGroupMembersNumber(1)
+ dynamicGroup.setName('grand_canyon_krayt_dragon_1')
+ dynamicGroup.setMaxSpawns(1)
+ dynamicGroup.setMinSpawnDistance(60)
+ core.spawnService.addDynamicGroup('grand_canyon_krayt_dragon_1', dynamicGroup)
+ return
\ No newline at end of file
diff --git a/scripts/mobiles/dynamicgroups/juvenile_krayts_wild_1.py b/scripts/mobiles/dynamicgroups/juvenile_krayts_wild_1.py
new file mode 100644
index 00000000..a65c74cc
--- /dev/null
+++ b/scripts/mobiles/dynamicgroups/juvenile_krayts_wild_1.py
@@ -0,0 +1,16 @@
+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('juvenile_canyon_krayt_dragon')
+ dynamicGroup.setMobiles(mobileTemplates)
+ dynamicGroup.setGroupMembersNumber(6)
+ dynamicGroup.setName('juvenile_krayts_wild_1')
+ dynamicGroup.setMaxSpawns(1)
+ dynamicGroup.setMinSpawnDistance(150)
+ core.spawnService.addDynamicGroup('juvenile_krayts_wild_1', dynamicGroup)
+ return
\ No newline at end of file
diff --git a/scripts/mobiles/dynamicgroups/krayt_dragon_ancient_wild_1.py b/scripts/mobiles/dynamicgroups/krayt_dragon_ancient_wild_1.py
new file mode 100644
index 00000000..ec8ea7a8
--- /dev/null
+++ b/scripts/mobiles/dynamicgroups/krayt_dragon_ancient_wild_1.py
@@ -0,0 +1,16 @@
+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('krayt_dragon_ancient')
+ dynamicGroup.setMobiles(mobileTemplates)
+ dynamicGroup.setGroupMembersNumber(1)
+ dynamicGroup.setName('krayt_dragon_ancient_1')
+ dynamicGroup.setMaxSpawns(1)
+ dynamicGroup.setMinSpawnDistance(5)
+ core.spawnService.addDynamicGroup('krayt_dragon_ancient_1', dynamicGroup)
+ return
\ No newline at end of file
diff --git a/scripts/mobiles/dynamicgroups/mos_eisley_carrion_kreetle_01.py b/scripts/mobiles/dynamicgroups/mos_eisley_carrion_kreetle_01.py
new file mode 100644
index 00000000..db1bc7c3
--- /dev/null
+++ b/scripts/mobiles/dynamicgroups/mos_eisley_carrion_kreetle_01.py
@@ -0,0 +1,16 @@
+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('carrion_kreetle')
+ dynamicGroup.setMobiles(mobileTemplates)
+ dynamicGroup.setGroupMembersNumber(1)
+ dynamicGroup.setName('mos_eisley_carrion_kreetle_01')
+ dynamicGroup.setMaxSpawns(-1)
+ dynamicGroup.setMinSpawnDistance(5)
+ core.spawnService.addDynamicGroup('mos_eisley_carrion_kreetle_01', dynamicGroup)
+ return
\ No newline at end of file
diff --git a/scripts/mobiles/dynamicgroups/mos_eisley_city_sewer_rats_01.py b/scripts/mobiles/dynamicgroups/mos_eisley_city_sewer_rats_01.py
new file mode 100644
index 00000000..37c76c65
--- /dev/null
+++ b/scripts/mobiles/dynamicgroups/mos_eisley_city_sewer_rats_01.py
@@ -0,0 +1,16 @@
+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('city_sewer_swamprat')
+ dynamicGroup.setMobiles(mobileTemplates)
+ dynamicGroup.setGroupMembersNumber(1)
+ dynamicGroup.setName('mos_eisley_city_sewer_rats_01')
+ dynamicGroup.setMaxSpawns(-1)
+ dynamicGroup.setMinSpawnDistance(5)
+ core.spawnService.addDynamicGroup('mos_eisley_city_sewer_rats_01', dynamicGroup)
+ return
\ No newline at end of file
diff --git a/scripts/mobiles/dynamicgroups/mos_eisley_mound_mites_01.py b/scripts/mobiles/dynamicgroups/mos_eisley_mound_mites_01.py
new file mode 100644
index 00000000..46f2eddb
--- /dev/null
+++ b/scripts/mobiles/dynamicgroups/mos_eisley_mound_mites_01.py
@@ -0,0 +1,16 @@
+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('mound_mite')
+ dynamicGroup.setMobiles(mobileTemplates)
+ dynamicGroup.setGroupMembersNumber(1)
+ dynamicGroup.setName('mos_eisley_mound_mites_01')
+ dynamicGroup.setMaxSpawns(-1)
+ dynamicGroup.setMinSpawnDistance(5)
+ core.spawnService.addDynamicGroup('mos_eisley_mound_mites_01', dynamicGroup)
+ return
\ No newline at end of file
diff --git a/scripts/mobiles/dynamicgroups/mos_eisley_rock_mites_01.py b/scripts/mobiles/dynamicgroups/mos_eisley_rock_mites_01.py
new file mode 100644
index 00000000..ead62ff3
--- /dev/null
+++ b/scripts/mobiles/dynamicgroups/mos_eisley_rock_mites_01.py
@@ -0,0 +1,16 @@
+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('rockmite')
+ dynamicGroup.setMobiles(mobileTemplates)
+ dynamicGroup.setGroupMembersNumber(1)
+ dynamicGroup.setName('mos_eisley_rock_mites_01')
+ dynamicGroup.setMaxSpawns(-1)
+ dynamicGroup.setMinSpawnDistance(5)
+ core.spawnService.addDynamicGroup('mos_eisley_rock_mites_01', dynamicGroup)
+ return
\ No newline at end of file
diff --git a/scripts/mobiles/dynamicgroups/mos_eisley_sickly_womp_rats_01.py b/scripts/mobiles/dynamicgroups/mos_eisley_sickly_womp_rats_01.py
new file mode 100644
index 00000000..73f1a14d
--- /dev/null
+++ b/scripts/mobiles/dynamicgroups/mos_eisley_sickly_womp_rats_01.py
@@ -0,0 +1,16 @@
+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('sickly_womprat')
+ dynamicGroup.setMobiles(mobileTemplates)
+ dynamicGroup.setGroupMembersNumber(1)
+ dynamicGroup.setName('mos_eisley_sickly_womp_rats_01')
+ dynamicGroup.setMaxSpawns(-1)
+ dynamicGroup.setMinSpawnDistance(5)
+ core.spawnService.addDynamicGroup('mos_eisley_sickly_womp_rats_01', dynamicGroup)
+ return
\ No newline at end of file
diff --git a/scripts/mobiles/dynamicgroups/mos_eisley_tame_worrts_01.py b/scripts/mobiles/dynamicgroups/mos_eisley_tame_worrts_01.py
new file mode 100644
index 00000000..148f876b
--- /dev/null
+++ b/scripts/mobiles/dynamicgroups/mos_eisley_tame_worrts_01.py
@@ -0,0 +1,16 @@
+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('tame_worrt')
+ dynamicGroup.setMobiles(mobileTemplates)
+ dynamicGroup.setGroupMembersNumber(1)
+ dynamicGroup.setName('mos_eisley_tame_worrts_01')
+ dynamicGroup.setMaxSpawns(-1)
+ dynamicGroup.setMinSpawnDistance(5)
+ core.spawnService.addDynamicGroup('mos_eisley_tame_worrts_01', dynamicGroup)
+ return
\ No newline at end of file
diff --git a/scripts/mobiles/dynamicgroups/mos_eisley_tempest_rills_01.py b/scripts/mobiles/dynamicgroups/mos_eisley_tempest_rills_01.py
new file mode 100644
index 00000000..cb230f4f
--- /dev/null
+++ b/scripts/mobiles/dynamicgroups/mos_eisley_tempest_rills_01.py
@@ -0,0 +1,16 @@
+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('tempest_rill')
+ dynamicGroup.setMobiles(mobileTemplates)
+ dynamicGroup.setGroupMembersNumber(1)
+ dynamicGroup.setName('mos_eisley_tempest_rills_01')
+ dynamicGroup.setMaxSpawns(-1)
+ dynamicGroup.setMinSpawnDistance(5)
+ core.spawnService.addDynamicGroup('mos_eisley_tempest_rills_01', dynamicGroup)
+ return
\ No newline at end of file
diff --git a/scripts/mobiles/dynamicgroups/mos_eisley_womp_rats_01.py b/scripts/mobiles/dynamicgroups/mos_eisley_womp_rats_01.py
new file mode 100644
index 00000000..00637d0f
--- /dev/null
+++ b/scripts/mobiles/dynamicgroups/mos_eisley_womp_rats_01.py
@@ -0,0 +1,16 @@
+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('womprat')
+ dynamicGroup.setMobiles(mobileTemplates)
+ dynamicGroup.setGroupMembersNumber(1)
+ dynamicGroup.setName('mos_eisley_womprats_01')
+ dynamicGroup.setMaxSpawns(-1)
+ dynamicGroup.setMinSpawnDistance(5)
+ core.spawnService.addDynamicGroup('mos_eisley_womprats_01', dynamicGroup)
+ return
\ No newline at end of file
diff --git a/scripts/mobiles/spawnareas/krayt_graveyard_dynamic_1.py b/scripts/mobiles/spawnareas/krayt_graveyard_dynamic_1.py
new file mode 100644
index 00000000..7a998fa8
--- /dev/null
+++ b/scripts/mobiles/spawnareas/krayt_graveyard_dynamic_1.py
@@ -0,0 +1,11 @@
+import sys
+from java.util import Vector
+
+def addSpawnArea(core):
+ dynamicGroups = Vector()
+ dynamicGroups.add('adolescent_krayt_wild_1')
+ dynamicGroups.add('juvenile_krayts_wild_1')
+ dynamicGroups.add('canyon_krayt_wild_1')
+ dynamicGroups.add('giant_canyon_krayt_dragon_1')
+ core.spawnService.addDynamicSpawnArea(dynamicGroups, 6471, 4267, 1024, 'tatooine')
+ return
\ No newline at end of file
diff --git a/scripts/mobiles/spawnareas/krayt_graveyard_dynamic_2.py b/scripts/mobiles/spawnareas/krayt_graveyard_dynamic_2.py
new file mode 100644
index 00000000..e97d5637
--- /dev/null
+++ b/scripts/mobiles/spawnareas/krayt_graveyard_dynamic_2.py
@@ -0,0 +1,8 @@
+import sys
+from java.util import Vector
+
+def addSpawnArea(core):
+ dynamicGroups = Vector()
+ dynamicGroups.add('grand_canyon_krayt_dragon_1')
+ core.spawnService.addDynamicSpawnArea(dynamicGroups, 7431, 4762, 120, 'tatooine')
+ return
\ No newline at end of file
diff --git a/scripts/mobiles/spawnareas/krayt_graveyard_dynamic_3.py b/scripts/mobiles/spawnareas/krayt_graveyard_dynamic_3.py
new file mode 100644
index 00000000..0d863838
--- /dev/null
+++ b/scripts/mobiles/spawnareas/krayt_graveyard_dynamic_3.py
@@ -0,0 +1,8 @@
+import sys
+from java.util import Vector
+
+def addSpawnArea(core):
+ dynamicGroups = Vector()
+ dynamicGroups.add('krayt_dragon_ancient_1')
+ core.spawnService.addDynamicSpawnArea(dynamicGroups, 7490, 4466, 10, 'tatooine')
+ return
\ No newline at end of file
diff --git a/scripts/mobiles/spawnareas/krayt_graveyard_dynamic_4.py b/scripts/mobiles/spawnareas/krayt_graveyard_dynamic_4.py
new file mode 100644
index 00000000..275f8a8c
--- /dev/null
+++ b/scripts/mobiles/spawnareas/krayt_graveyard_dynamic_4.py
@@ -0,0 +1,8 @@
+import sys
+from java.util import Vector
+
+def addSpawnArea(core):
+ dynamicGroups = Vector()
+ dynamicGroups.add('krayt_dragon_ancient_1')
+ core.spawnService.addDynamicSpawnArea(dynamicGroups, 6794, 4307, 10, 'tatooine')
+ return
\ No newline at end of file
diff --git a/scripts/mobiles/spawnareas/krayt_graveyard_dynamic_5.py b/scripts/mobiles/spawnareas/krayt_graveyard_dynamic_5.py
new file mode 100644
index 00000000..90c70591
--- /dev/null
+++ b/scripts/mobiles/spawnareas/krayt_graveyard_dynamic_5.py
@@ -0,0 +1,8 @@
+import sys
+from java.util import Vector
+
+def addSpawnArea(core):
+ dynamicGroups = Vector()
+ dynamicGroups.add('krayt_dragon_ancient_1')
+ core.spawnService.addDynamicSpawnArea(dynamicGroups, 7493, 5992, 10, 'tatooine')
+ return
\ No newline at end of file
diff --git a/scripts/mobiles/spawnareas/legacy_starter_tatooine_1.py b/scripts/mobiles/spawnareas/legacy_starter_tatooine_1.py
new file mode 100644
index 00000000..e397088d
--- /dev/null
+++ b/scripts/mobiles/spawnareas/legacy_starter_tatooine_1.py
@@ -0,0 +1,9 @@
+import sys
+from java.util import Vector
+
+def addSpawnArea(core):
+ dynamicGroups = Vector()
+ dynamicGroups.add('mos_eisley_carrion_kreetle_01')
+ dynamicGroups.add('mos_eisley_city_sewer_rats_01')
+ core.spawnService.addDynamicSpawnArea(dynamicGroups, 3216, -4465, 100, 'tatooine')
+ return
\ No newline at end of file
diff --git a/scripts/mobiles/spawnareas/legacy_starter_tatooine_2.py b/scripts/mobiles/spawnareas/legacy_starter_tatooine_2.py
new file mode 100644
index 00000000..60c6b356
--- /dev/null
+++ b/scripts/mobiles/spawnareas/legacy_starter_tatooine_2.py
@@ -0,0 +1,9 @@
+import sys
+from java.util import Vector
+
+def addSpawnArea(core):
+ dynamicGroups = Vector()
+ dynamicGroups.add('mos_eisley_tame_worrts_01')
+ dynamicGroups.add('mos_eisley_sickly_womp_rats_01')
+ core.spawnService.addDynamicSpawnArea(dynamicGroups, 3115, -4758, 100, 'tatooine')
+ return
\ No newline at end of file
diff --git a/scripts/mobiles/spawnareas/legacy_starter_tatooine_3.py b/scripts/mobiles/spawnareas/legacy_starter_tatooine_3.py
new file mode 100644
index 00000000..140d9432
--- /dev/null
+++ b/scripts/mobiles/spawnareas/legacy_starter_tatooine_3.py
@@ -0,0 +1,9 @@
+import sys
+from java.util import Vector
+
+def addSpawnArea(core):
+ dynamicGroups = Vector()
+ dynamicGroups.add('mos_eisley_tame_worrts_01')
+ dynamicGroups.add('mos_eisley_rock_mites_01')
+ core.spawnService.addDynamicSpawnArea(dynamicGroups, 3153, -4945, 100, 'tatooine')
+ return
\ No newline at end of file
diff --git a/scripts/mobiles/spawnareas/legacy_starter_tatooine_4.py b/scripts/mobiles/spawnareas/legacy_starter_tatooine_4.py
new file mode 100644
index 00000000..8edcc45b
--- /dev/null
+++ b/scripts/mobiles/spawnareas/legacy_starter_tatooine_4.py
@@ -0,0 +1,9 @@
+import sys
+from java.util import Vector
+
+def addSpawnArea(core):
+ dynamicGroups = Vector()
+ dynamicGroups.add('mos_eisley_tempest_rills_01')
+ dynamicGroups.add('mos_eisley_mound_mites_01')
+ core.spawnService.addDynamicSpawnArea(dynamicGroups, 3841, -4345, 100, 'tatooine')
+ return
\ No newline at end of file
diff --git a/scripts/mobiles/spawnareas/legacy_starter_tatooine_5.py b/scripts/mobiles/spawnareas/legacy_starter_tatooine_5.py
new file mode 100644
index 00000000..44fcbc17
--- /dev/null
+++ b/scripts/mobiles/spawnareas/legacy_starter_tatooine_5.py
@@ -0,0 +1,9 @@
+import sys
+from java.util import Vector
+
+def addSpawnArea(core):
+ dynamicGroups = Vector()
+ dynamicGroups.add('mos_eisley_womprats_01')
+ dynamicGroups.add('mos_eisley_mound_mites_01')
+ core.spawnService.addDynamicSpawnArea(dynamicGroups, 3587, -4354, 100, 'tatooine')
+ return
\ No newline at end of file
diff --git a/scripts/mobiles/tatooine/adolescent_krayt_dragon.py b/scripts/mobiles/tatooine/adolescent_krayt_dragon.py
index c1c3fb85..9e28d4c8 100644
--- a/scripts/mobiles/tatooine/adolescent_krayt_dragon.py
+++ b/scripts/mobiles/tatooine/adolescent_krayt_dragon.py
@@ -8,15 +8,23 @@ def addTemplate(core):
mobileTemplate.setCreatureName('krayt_dragon_adolescent')
mobileTemplate.setLevel(84)
+ mobileTemplate.setMinLevel(80)
+ mobileTemplate.setMaxLevel(84)
mobileTemplate.setDifficulty(2)
mobileTemplate.setAttackRange(12)
- mobileTemplate.setWeaponType(6)
mobileTemplate.setAttackSpeed(1.0)
+ mobileTemplate.setWeaponType(6)
+ mobileTemplate.setMinSpawnDistance(4)
+ mobileTemplate.setMaxSpawnDistance(8)
+ mobileTemplate.setDeathblow(True)
+ mobileTemplate.setScale(0.5)
+
+
templates = Vector()
templates.add('object/mobile/shared_krayt_dragon.iff')
mobileTemplate.setTemplates(templates)
-
+
weaponTemplates = Vector()
weapontemplate = WeaponTemplate('object/weapon/melee/unarmed/shared_unarmed_default.iff', 6, 1.0)
weaponTemplates.add(weapontemplate)
diff --git a/scripts/mobiles/tatooine/bantha.py b/scripts/mobiles/tatooine/bantha.py
index 19ee591f..43e6dbf7 100644
--- a/scripts/mobiles/tatooine/bantha.py
+++ b/scripts/mobiles/tatooine/bantha.py
@@ -12,6 +12,14 @@ def addTemplate(core):
mobileTemplate.setAttackRange(5)
mobileTemplate.setWeaponType(6)
mobileTemplate.setAttackSpeed(1.0)
+ mobileTemplate.setMilkType('Wild Milk')
+ mobileTemplate.setMilkAmount(250)
+ mobileTemplate.setHideType('Wooly Hide')
+ mobileTemplate.setHideAmount(325)
+ mobileTemplate.setMeatType('Herbivore Meat')
+ mobileTemplate.setMeatAmount(450)
+ mobileTemplate.setBoneType('Animal Bones')
+ mobileTemplate.setBoneAmount(250)
templates = Vector()
templates.add('object/mobile/shared_bantha_hue.iff')
diff --git a/scripts/mobiles/tatooine/canyon_krayt_dragon.py b/scripts/mobiles/tatooine/canyon_krayt_dragon.py
index 7eb53cc6..08197313 100644
--- a/scripts/mobiles/tatooine/canyon_krayt_dragon.py
+++ b/scripts/mobiles/tatooine/canyon_krayt_dragon.py
@@ -8,15 +8,23 @@ def addTemplate(core):
mobileTemplate.setCreatureName('canyon_krayt_dragon')
mobileTemplate.setLevel(85)
+ mobileTemplate.setMinLevel(80)
+ mobileTemplate.setMaxLevel(86)
mobileTemplate.setDifficulty(2)
mobileTemplate.setAttackRange(12)
- mobileTemplate.setWeaponType(6)
mobileTemplate.setAttackSpeed(1.0)
+ mobileTemplate.setWeaponType(6)
+ mobileTemplate.setMinSpawnDistance(4)
+ mobileTemplate.setMaxSpawnDistance(8)
+ mobileTemplate.setDeathblow(True)
+ mobileTemplate.setScale(0.8)
+
+
templates = Vector()
templates.add('object/mobile/shared_canyon_krayt_dragon.iff')
mobileTemplate.setTemplates(templates)
-
+
weaponTemplates = Vector()
weapontemplate = WeaponTemplate('object/weapon/melee/unarmed/shared_unarmed_default.iff', 6, 1.0)
weaponTemplates.add(weapontemplate)
diff --git a/scripts/mobiles/tatooine/carion_kreetle.py b/scripts/mobiles/tatooine/carion_kreetle.py
index f1a1bf01..0a8a8494 100644
--- a/scripts/mobiles/tatooine/carion_kreetle.py
+++ b/scripts/mobiles/tatooine/carion_kreetle.py
@@ -8,15 +8,23 @@ def addTemplate(core):
mobileTemplate.setCreatureName('fragile_kreetle')
mobileTemplate.setLevel(2)
+ mobileTemplate.setMinLevel(5)
+ mobileTemplate.setMaxLevel(7)
mobileTemplate.setDifficulty(0)
- mobileTemplate.setAttackRange(5)
- mobileTemplate.setWeaponType(6)
+ mobileTemplate.setAttackRange(4)
mobileTemplate.setAttackSpeed(1.0)
+ mobileTemplate.setWeaponType(6)
+ mobileTemplate.setMinSpawnDistance(4)
+ mobileTemplate.setMaxSpawnDistance(8)
+ mobileTemplate.setDeathblow(False)
+ mobileTemplate.setScale(1)
+
+
templates = Vector()
templates.add('object/mobile/shared_kreetle.iff')
mobileTemplate.setTemplates(templates)
-
+
weaponTemplates = Vector()
weapontemplate = WeaponTemplate('object/weapon/melee/unarmed/shared_unarmed_default.iff', 6, 1.0)
weaponTemplates.add(weapontemplate)
diff --git a/scripts/mobiles/tatooine/city_sewer_swamprat.py b/scripts/mobiles/tatooine/city_sewer_swamprat.py
index ecb72a17..d3f34960 100644
--- a/scripts/mobiles/tatooine/city_sewer_swamprat.py
+++ b/scripts/mobiles/tatooine/city_sewer_swamprat.py
@@ -7,16 +7,24 @@ def addTemplate(core):
mobileTemplate = MobileTemplate()
mobileTemplate.setCreatureName('city_sewer_swamprat')
- mobileTemplate.setLevel(3)
+ mobileTemplate.setLevel(4)
+ mobileTemplate.setMinLevel(4)
+ mobileTemplate.setMaxLevel(4)
mobileTemplate.setDifficulty(0)
- mobileTemplate.setAttackRange(5)
- mobileTemplate.setWeaponType(6)
+ mobileTemplate.setAttackRange(4)
mobileTemplate.setAttackSpeed(1.0)
+ mobileTemplate.setWeaponType(6)
+ mobileTemplate.setMinSpawnDistance(4)
+ mobileTemplate.setMaxSpawnDistance(8)
+ mobileTemplate.setDeathblow(False)
+ mobileTemplate.setScale(1)
+
+
templates = Vector()
templates.add('object/mobile/shared_womp_rat.iff')
mobileTemplate.setTemplates(templates)
-
+
weaponTemplates = Vector()
weapontemplate = WeaponTemplate('object/weapon/melee/unarmed/shared_unarmed_default.iff', 6, 1.0)
weaponTemplates.add(weapontemplate)
diff --git a/scripts/mobiles/tatooine/giant_canyon_krayt_dragon.py b/scripts/mobiles/tatooine/giant_canyon_krayt_dragon.py
index 2d86f3cd..5da03190 100644
--- a/scripts/mobiles/tatooine/giant_canyon_krayt_dragon.py
+++ b/scripts/mobiles/tatooine/giant_canyon_krayt_dragon.py
@@ -8,15 +8,23 @@ def addTemplate(core):
mobileTemplate.setCreatureName('giant_canyon_krayt_dragon')
mobileTemplate.setLevel(87)
+ mobileTemplate.setMinLevel(80)
+ mobileTemplate.setMaxLevel(88)
mobileTemplate.setDifficulty(2)
mobileTemplate.setAttackRange(12)
- mobileTemplate.setWeaponType(6)
mobileTemplate.setAttackSpeed(1.0)
+ mobileTemplate.setWeaponType(6)
+ mobileTemplate.setMinSpawnDistance(4)
+ mobileTemplate.setMaxSpawnDistance(8)
+ mobileTemplate.setDeathblow(True)
+ mobileTemplate.setScale(2.5)
+
+
templates = Vector()
- templates.add('object/mobile/shared_krayt_dragon.iff')
+ templates.add('object/mobile/shared_canyon_krayt_dragon.iff')
mobileTemplate.setTemplates(templates)
-
+
weaponTemplates = Vector()
weapontemplate = WeaponTemplate('object/weapon/melee/unarmed/shared_unarmed_default.iff', 6, 1.0)
weaponTemplates.add(weapontemplate)
diff --git a/scripts/mobiles/tatooine/grand_krayt_dragon.py b/scripts/mobiles/tatooine/grand_krayt_dragon.py
index d149306b..060fec50 100644
--- a/scripts/mobiles/tatooine/grand_krayt_dragon.py
+++ b/scripts/mobiles/tatooine/grand_krayt_dragon.py
@@ -8,15 +8,23 @@ def addTemplate(core):
mobileTemplate.setCreatureName('krayt_dragon_grand')
mobileTemplate.setLevel(88)
+ mobileTemplate.setMinLevel(80)
+ mobileTemplate.setMaxLevel(89)
mobileTemplate.setDifficulty(2)
mobileTemplate.setAttackRange(12)
- mobileTemplate.setWeaponType(6)
mobileTemplate.setAttackSpeed(1.0)
+ mobileTemplate.setWeaponType(6)
+ mobileTemplate.setMinSpawnDistance(4)
+ mobileTemplate.setMaxSpawnDistance(8)
+ mobileTemplate.setDeathblow(True)
+ mobileTemplate.setScale(2.6)
+
+
templates = Vector()
- templates.add('object/mobile/shared_krayt_dragon.iff')
+ templates.add('object/mobile/shared_canyon_krayt_dragon.iff')
mobileTemplate.setTemplates(templates)
-
+
weaponTemplates = Vector()
weapontemplate = WeaponTemplate('object/weapon/melee/unarmed/shared_unarmed_default.iff', 6, 1.0)
weaponTemplates.add(weapontemplate)
diff --git a/scripts/mobiles/tatooine/juvenile_canyon_krayt_dragon.py b/scripts/mobiles/tatooine/juvenile_canyon_krayt_dragon.py
index d06ec11d..02a36d90 100644
--- a/scripts/mobiles/tatooine/juvenile_canyon_krayt_dragon.py
+++ b/scripts/mobiles/tatooine/juvenile_canyon_krayt_dragon.py
@@ -8,15 +8,23 @@ def addTemplate(core):
mobileTemplate.setCreatureName('juvenile_canyon_krayt')
mobileTemplate.setLevel(82)
+ mobileTemplate.setMinLevel(78)
+ mobileTemplate.setMaxLevel(82)
mobileTemplate.setDifficulty(2)
mobileTemplate.setAttackRange(12)
- mobileTemplate.setWeaponType(6)
mobileTemplate.setAttackSpeed(1.0)
+ mobileTemplate.setWeaponType(6)
+ mobileTemplate.setMinSpawnDistance(4)
+ mobileTemplate.setMaxSpawnDistance(8)
+ mobileTemplate.setDeathblow(True)
+ mobileTemplate.setScale(0.5)
+
+
templates = Vector()
- templates.add('object/mobile/shared_juvenile_canyon_krayt.iff')
+ templates.add('object/mobile/shared_krayt_dragon.iff')
mobileTemplate.setTemplates(templates)
-
+
weaponTemplates = Vector()
weapontemplate = WeaponTemplate('object/weapon/melee/unarmed/shared_unarmed_default.iff', 6, 1.0)
weaponTemplates.add(weapontemplate)
diff --git a/scripts/mobiles/tatooine/krayt_dragon_ancient.py b/scripts/mobiles/tatooine/krayt_dragon_ancient.py
index b8450ec0..9e3e68c0 100644
--- a/scripts/mobiles/tatooine/krayt_dragon_ancient.py
+++ b/scripts/mobiles/tatooine/krayt_dragon_ancient.py
@@ -8,15 +8,23 @@ def addTemplate(core):
mobileTemplate.setCreatureName('krayt_dragon_ancient')
mobileTemplate.setLevel(90)
+ mobileTemplate.setMinLevel(90)
+ mobileTemplate.setMaxLevel(90)
mobileTemplate.setDifficulty(2)
mobileTemplate.setAttackRange(12)
- mobileTemplate.setWeaponType(6)
mobileTemplate.setAttackSpeed(1.0)
+ mobileTemplate.setWeaponType(6)
+ mobileTemplate.setMinSpawnDistance(4)
+ mobileTemplate.setMaxSpawnDistance(8)
+ mobileTemplate.setDeathblow(True)
+ mobileTemplate.setScale(2.8)
+
+
templates = Vector()
templates.add('object/mobile/shared_krayt_dragon.iff')
mobileTemplate.setTemplates(templates)
-
+
weaponTemplates = Vector()
weapontemplate = WeaponTemplate('object/weapon/melee/unarmed/shared_unarmed_default.iff', 6, 1.0)
weaponTemplates.add(weapontemplate)
diff --git a/scripts/mobiles/tatooine/mound_mite.py b/scripts/mobiles/tatooine/mound_mite.py
index c62a5715..ff49aa4c 100644
--- a/scripts/mobiles/tatooine/mound_mite.py
+++ b/scripts/mobiles/tatooine/mound_mite.py
@@ -8,15 +8,23 @@ def addTemplate(core):
mobileTemplate.setCreatureName('mound_mite')
mobileTemplate.setLevel(4)
+ mobileTemplate.setMinLevel(5)
+ mobileTemplate.setMaxLevel(7)
mobileTemplate.setDifficulty(0)
- mobileTemplate.setAttackRange(5)
- mobileTemplate.setWeaponType(6)
+ mobileTemplate.setAttackRange(4)
mobileTemplate.setAttackSpeed(1.0)
+ mobileTemplate.setWeaponType(6)
+ mobileTemplate.setMinSpawnDistance(4)
+ mobileTemplate.setMaxSpawnDistance(8)
+ mobileTemplate.setDeathblow(False)
+ mobileTemplate.setScale(1)
+
+
templates = Vector()
templates.add('object/mobile/shared_mound_mite.iff')
mobileTemplate.setTemplates(templates)
-
+
weaponTemplates = Vector()
weapontemplate = WeaponTemplate('object/weapon/melee/unarmed/shared_unarmed_default.iff', 6, 1.0)
weaponTemplates.add(weapontemplate)
diff --git a/scripts/mobiles/tatooine/rockmite.py b/scripts/mobiles/tatooine/rockmite.py
index bd6f39e5..a6ac06bc 100644
--- a/scripts/mobiles/tatooine/rockmite.py
+++ b/scripts/mobiles/tatooine/rockmite.py
@@ -8,15 +8,23 @@ def addTemplate(core):
mobileTemplate.setCreatureName('rockmite')
mobileTemplate.setLevel(8)
+ mobileTemplate.setMinLevel(8)
+ mobileTemplate.setMaxLevel(9)
mobileTemplate.setDifficulty(0)
- mobileTemplate.setAttackRange(5)
- mobileTemplate.setWeaponType(6)
+ mobileTemplate.setAttackRange(4)
mobileTemplate.setAttackSpeed(1.0)
+ mobileTemplate.setWeaponType(6)
+ mobileTemplate.setMinSpawnDistance(4)
+ mobileTemplate.setMaxSpawnDistance(8)
+ mobileTemplate.setDeathblow(False)
+ mobileTemplate.setScale(1)
+
+
templates = Vector()
templates.add('object/mobile/shared_rock_mite.iff')
mobileTemplate.setTemplates(templates)
-
+
weaponTemplates = Vector()
weapontemplate = WeaponTemplate('object/weapon/melee/unarmed/shared_unarmed_default.iff', 6, 1.0)
weaponTemplates.add(weapontemplate)
diff --git a/scripts/mobiles/tatooine/sickly_womprat.py b/scripts/mobiles/tatooine/sickly_womprat.py
index 3961ece7..da6e0c5f 100644
--- a/scripts/mobiles/tatooine/sickly_womprat.py
+++ b/scripts/mobiles/tatooine/sickly_womprat.py
@@ -7,16 +7,24 @@ def addTemplate(core):
mobileTemplate = MobileTemplate()
mobileTemplate.setCreatureName('sickly_womprat')
- mobileTemplate.setLevel(1)
+ mobileTemplate.setLevel(4)
+ mobileTemplate.setMinLevel(5)
+ mobileTemplate.setMaxLevel(13)
mobileTemplate.setDifficulty(0)
- mobileTemplate.setAttackRange(5)
- mobileTemplate.setWeaponType(6)
+ mobileTemplate.setAttackRange(4)
mobileTemplate.setAttackSpeed(1.0)
+ mobileTemplate.setWeaponType(6)
+ mobileTemplate.setMinSpawnDistance(4)
+ mobileTemplate.setMaxSpawnDistance(8)
+ mobileTemplate.setDeathblow(False)
+ mobileTemplate.setScale(1)
+
+
templates = Vector()
templates.add('object/mobile/shared_womp_rat.iff')
mobileTemplate.setTemplates(templates)
-
+
weaponTemplates = Vector()
weapontemplate = WeaponTemplate('object/weapon/melee/unarmed/shared_unarmed_default.iff', 6, 1.0)
weaponTemplates.add(weapontemplate)
diff --git a/scripts/mobiles/tatooine/tame_worrt.py b/scripts/mobiles/tatooine/tame_worrt.py
index 75bda089..b78b5c1c 100644
--- a/scripts/mobiles/tatooine/tame_worrt.py
+++ b/scripts/mobiles/tatooine/tame_worrt.py
@@ -8,15 +8,23 @@ def addTemplate(core):
mobileTemplate.setCreatureName('tame_worrt')
mobileTemplate.setLevel(5)
+ mobileTemplate.setMinLevel(5)
+ mobileTemplate.setMaxLevel(6)
mobileTemplate.setDifficulty(0)
- mobileTemplate.setAttackRange(5)
- mobileTemplate.setWeaponType(6)
+ mobileTemplate.setAttackRange(4)
mobileTemplate.setAttackSpeed(1.0)
+ mobileTemplate.setWeaponType(6)
+ mobileTemplate.setMinSpawnDistance(4)
+ mobileTemplate.setMaxSpawnDistance(8)
+ mobileTemplate.setDeathblow(False)
+ mobileTemplate.setScale(1)
+
+
templates = Vector()
templates.add('object/mobile/shared_worrt.iff')
mobileTemplate.setTemplates(templates)
-
+
weaponTemplates = Vector()
weapontemplate = WeaponTemplate('object/weapon/melee/unarmed/shared_unarmed_default.iff', 6, 1.0)
weaponTemplates.add(weapontemplate)
diff --git a/scripts/mobiles/tatooine/tempest_rill.py b/scripts/mobiles/tatooine/tempest_rill.py
index d5df155c..3224a410 100644
--- a/scripts/mobiles/tatooine/tempest_rill.py
+++ b/scripts/mobiles/tatooine/tempest_rill.py
@@ -8,15 +8,23 @@ def addTemplate(core):
mobileTemplate.setCreatureName('rill_tempest')
mobileTemplate.setLevel(8)
+ mobileTemplate.setMinLevel(8)
+ mobileTemplate.setMaxLevel(10)
mobileTemplate.setDifficulty(0)
- mobileTemplate.setAttackRange(5)
- mobileTemplate.setWeaponType(6)
+ mobileTemplate.setAttackRange(4)
mobileTemplate.setAttackSpeed(1.0)
+ mobileTemplate.setWeaponType(6)
+ mobileTemplate.setMinSpawnDistance(4)
+ mobileTemplate.setMaxSpawnDistance(8)
+ mobileTemplate.setDeathblow(False)
+ mobileTemplate.setScale(1)
+
+
templates = Vector()
templates.add('object/mobile/shared_rill.iff')
mobileTemplate.setTemplates(templates)
-
+
weaponTemplates = Vector()
weapontemplate = WeaponTemplate('object/weapon/melee/unarmed/shared_unarmed_default.iff', 6, 1.0)
weaponTemplates.add(weapontemplate)
diff --git a/scripts/mobiles/tatooine/womprat.py b/scripts/mobiles/tatooine/womprat.py
index 7852829b..b67a9948 100644
--- a/scripts/mobiles/tatooine/womprat.py
+++ b/scripts/mobiles/tatooine/womprat.py
@@ -7,16 +7,24 @@ def addTemplate(core):
mobileTemplate = MobileTemplate()
mobileTemplate.setCreatureName('womprat')
- mobileTemplate.setLevel(5)
+ mobileTemplate.setLevel(4)
+ mobileTemplate.setMinLevel(5)
+ mobileTemplate.setMaxLevel(13)
mobileTemplate.setDifficulty(0)
- mobileTemplate.setAttackRange(5)
- mobileTemplate.setWeaponType(6)
+ mobileTemplate.setAttackRange(4)
mobileTemplate.setAttackSpeed(1.0)
+ mobileTemplate.setWeaponType(6)
+ mobileTemplate.setMinSpawnDistance(4)
+ mobileTemplate.setMaxSpawnDistance(8)
+ mobileTemplate.setDeathblow(False)
+ mobileTemplate.setScale(1)
+
+
templates = Vector()
templates.add('object/mobile/shared_womp_rat.iff')
mobileTemplate.setTemplates(templates)
-
+
weaponTemplates = Vector()
weapontemplate = WeaponTemplate('object/weapon/melee/unarmed/shared_unarmed_default.iff', 6, 1.0)
weaponTemplates.add(weapontemplate)
diff --git a/scripts/object/creature/npc/droid/imperial_probot_bounty.py b/scripts/object/creature/npc/droid/imperial_probot_bounty.py
index ccad8904..de71643c 100644
--- a/scripts/object/creature/npc/droid/imperial_probot_bounty.py
+++ b/scripts/object/creature/npc/droid/imperial_probot_bounty.py
@@ -1,4 +1,8 @@
+from resources.datatables import Options
import sys
def setup(core, object):
+ object.setAttachment('radial_filename', 'object/conversation');
+ object.setAttachment('conversationFile','missions/bounty_droid_probot')
+ object.setOptionsBitmask(Options.CONVERSABLE | Options.INVULNERABLE)
return
\ No newline at end of file
diff --git a/scripts/object/tangible/food/crafted/drink_breath_of_heaven.py b/scripts/object/tangible/food/crafted/drink_breath_of_heaven.py
index ccad8904..eec73983 100644
--- a/scripts/object/tangible/food/crafted/drink_breath_of_heaven.py
+++ b/scripts/object/tangible/food/crafted/drink_breath_of_heaven.py
@@ -1,4 +1,5 @@
import sys
def setup(core, object):
- return
\ No newline at end of file
+ object.setAttachment('radial_filename', 'shared_drink_breath_of_heaven')
+ return
diff --git a/scripts/object/tangible/mission/mission_bounty_droid_probot.py b/scripts/object/tangible/mission/mission_bounty_droid_probot.py
index ccad8904..4b30916a 100644
--- a/scripts/object/tangible/mission/mission_bounty_droid_probot.py
+++ b/scripts/object/tangible/mission/mission_bounty_droid_probot.py
@@ -1,4 +1,5 @@
import sys
def setup(core, object):
+ object.setAttachment('radial_filename', 'npc/bounty_probot')
return
\ No newline at end of file
diff --git a/scripts/object/tangible/mission/mission_bounty_droid_seeker.py b/scripts/object/tangible/mission/mission_bounty_droid_seeker.py
index ccad8904..516734c3 100644
--- a/scripts/object/tangible/mission/mission_bounty_droid_seeker.py
+++ b/scripts/object/tangible/mission/mission_bounty_droid_seeker.py
@@ -1,4 +1,5 @@
import sys
def setup(core, object):
+ object.setAttachment('radial_filename', 'npc/bounty_seeker')
return
\ No newline at end of file
diff --git a/scripts/radial/npc/bounty_probot.py b/scripts/radial/npc/bounty_probot.py
new file mode 100644
index 00000000..1301c027
--- /dev/null
+++ b/scripts/radial/npc/bounty_probot.py
@@ -0,0 +1,30 @@
+from resources.common import RadialOptions
+import sys
+
+def createRadial(core, owner, target, radials):
+ radials.add(RadialOptions(0, 138, 1, '@mission/mission_generic:probe_droid_summon'))
+ return
+
+def handleSelection(core, owner, target, option):
+
+ if option == 138 and target:
+ id = owner.getPlayerObject().getBountyMissionId()
+ if id is None or id == 0:
+ owner.sendSystemMessage('@mission/mission_generic:bounty_no_mission', 0)
+ return
+
+ mission = core.objectService.getObject(id)
+ if mission is None:
+ owner.sendSystemMessage('@mission/mission_generic:bounty_no_mission', 0)
+ return
+
+ if mission.getObjective().isArakydActive():
+ owner.sendSystemMessage('@mission/mission_generic:probe_droid_too_many', 0)
+ return
+
+ if not core.terrainService.canBuildAtPosition(owner, owner.getPosition().x, owner.getPosition().z):
+ owner.sendSystemMessage('@mission/mission_generic:probe_droid_bad_location', 0)
+ return
+
+ mission.getObjective().handleProbeDroidSummon(core, owner)
+ return
\ No newline at end of file
diff --git a/scripts/radial/npc/bounty_seeker.py b/scripts/radial/npc/bounty_seeker.py
new file mode 100644
index 00000000..d7e829fe
--- /dev/null
+++ b/scripts/radial/npc/bounty_seeker.py
@@ -0,0 +1,41 @@
+from resources.common import RadialOptions
+from resources.common import SpawnPoint
+import time
+import sys
+
+def createRadial(core, owner, target, radials):
+ radials.clear()
+ radials.add(RadialOptions(0, 138, 0, 'Track Target'))
+ radials.add(RadialOptions(1, 136, 0, '@mission/mission_generic:probe_droid_track_target')) # Track Bounty Target
+ radials.add(RadialOptions(1, 137, 0, '@mission/mission_generic:probe_droid_find_target')) # Identify Bounty Target
+ return
+
+def handleSelection(core, owner, target, option):
+
+ if option == 136 and target or option == 138 and target:
+ id = owner.getPlayerObject().getBountyMissionId()
+ if id is None or id == 0:
+ owner.sendSystemMessage('@mission/mission_generic:bounty_no_mission', 0)
+ return
+
+ mission = core.objectService.getObject(id)
+ if mission is None:
+ owner.sendSystemMessage('@mission/mission_generic:bounty_no_mission', 0)
+ return
+
+ if mission.getObjective().isSeekerActive():
+ owner.sendSystemMessage('@mission/mission_generic:bounty_already_tracking', 0)
+ return
+ pos = SpawnPoint.getRandomPosition(owner.getPosition(), 1, 3, owner.getPlanetId())
+ ori = owner.getOrientation()
+ seeker = core.staticService.spawnObject('object/creature/npc/droid/crafted/shared_probe_droid_advanced.iff', owner.getPlanet().getName(), 0, pos.x, pos.y, pos.z, ori.y, ori.w)
+ time.sleep(3)
+ owner.sendSystemMessage('@mission/mission_generic:seeker_droid_standby', 0)
+ seeker.setPosture(8)
+ time.sleep(7.5)
+ mission.getObjective().beginSeekerUpdates(core, owner)
+ return
+
+ if option == 137 and target:
+ return
+ return
\ No newline at end of file
diff --git a/scripts/radial/npc/corpse.py b/scripts/radial/npc/corpse.py
index dc93d74a..28a63986 100644
--- a/scripts/radial/npc/corpse.py
+++ b/scripts/radial/npc/corpse.py
@@ -4,10 +4,23 @@ import sys
def createRadial(core, owner, target, radials):
radials.clear()
radials.add(RadialOptions(0, 36, 0, 'Loot'))
-
+ if target.getAttachment('AI') and core.resourceService.canHarvest(owner, target):
+ radials.add(RadialOptions(0, 163, 3, '@sui:harvest_corpse'))
+ radials.add(RadialOptions(2, 164, 3, '@sui:harvest_meat'))
+ radials.add(RadialOptions(2, 165, 3, '@sui:harvest_hide'))
+ radials.add(RadialOptions(2, 166, 3, '@sui:harvest_bone'))
+
+
return
def handleSelection(core, owner, target, option):
+
+ if option == 164 and target.getAttachment('AI') and core.resourceService.canHarvest(owner, target):
+ core.resourceService.doHarvest(owner, target, 'meat')
+ if option == 165 and target.getAttachment('AI') and core.resourceService.canHarvest(owner, target):
+ core.resourceService.doHarvest(owner, target, 'hide')
+ if option == 166 and target.getAttachment('AI') and core.resourceService.canHarvest(owner, target):
+ core.resourceService.doHarvest(owner, target, 'bone')
if option == 36 and target:
#core.lootService.handleLootRequest(owner,target)
core.lootService.handleLootRequest(owner,target)
diff --git a/scripts/radial/npc/mobile.py b/scripts/radial/npc/mobile.py
new file mode 100644
index 00000000..decba1d8
--- /dev/null
+++ b/scripts/radial/npc/mobile.py
@@ -0,0 +1,16 @@
+from resources.common import RadialOptions
+import sys
+
+def createRadial(core, owner, target, radials):
+ radials.clear()
+ if target.getAttachment('AI') and core.resourceService.canMilk(owner, target):
+ radials.add(RadialOptions(0, 167, 3, '@pet/pet_menu:milk_me'))
+
+ return
+
+def handleSelection(core, owner, target, option):
+
+ if option == 167 and target.getAttachment('AI') and core.resourceService.canMilk(owner, target):
+ core.resourceService.doMilk(owner, target)
+ return
+
\ No newline at end of file
diff --git a/scripts/radial/shared_drink_breath_of_heaven.py b/scripts/radial/shared_drink_breath_of_heaven.py
new file mode 100644
index 00000000..11ae9ca7
--- /dev/null
+++ b/scripts/radial/shared_drink_breath_of_heaven.py
@@ -0,0 +1,16 @@
+import resources.objects.creature.CreatureObject;
+from resources.common import RadialOptions
+import sys
+
+def createRadial(core, owner, target, radials):
+ radials.add(RadialOptions(0, 21, 1, ''))
+ radials.add(RadialOptions(0, 7, 1, ''))
+ radials.add(RadialOptions(0, 15, 1, ''))
+ return
+
+def handleSelection(core, owner, object, option):
+ if option == 21:
+ core.buffService.addBuffToCreature(owner, 'drink_breath_of_heaven', owner)
+
+ core.objectService.destroyObject(object)
+ return
diff --git a/scripts/static_spawns/kaas.py b/scripts/static_spawns/kaas/kaas.py
similarity index 100%
rename from scripts/static_spawns/kaas.py
rename to scripts/static_spawns/kaas/kaas.py
diff --git a/scripts/static_spawns/lok.py b/scripts/static_spawns/lok.py
deleted file mode 100644
index 30c9163e..00000000
--- a/scripts/static_spawns/lok.py
+++ /dev/null
@@ -1,10 +0,0 @@
-
-import sys
-from resources.datatables import Options
-from resources.datatables import StateStatus
-
-def addPlanetSpawns(core, planet):
-#This Script is no longer to be used for NPC Scripting. - Levarris
-
-
- return
diff --git a/scripts/static_spawns/lok/lok.py b/scripts/static_spawns/lok/lok.py
new file mode 100644
index 00000000..658c4a93
--- /dev/null
+++ b/scripts/static_spawns/lok/lok.py
@@ -0,0 +1,14 @@
+
+import sys
+from resources.datatables import Options
+from resources.datatables import StateStatus
+
+def addPlanetSpawns(core, planet):
+########################################################
+# DO NOT ADD ANYTHING ELSE TO THIS SCRIPT, PLEASE USE THE
+# SUBFOLDERS FOR EACH PLANET AND CREATE NEW SCRIPTS FOR
+# EACH AREA OF A PLANET. - LEVARRIS
+########################################################
+
+
+ return
diff --git a/scripts/static_spawns/naboo.py b/scripts/static_spawns/naboo.py
deleted file mode 100644
index c1072308..00000000
--- a/scripts/static_spawns/naboo.py
+++ /dev/null
@@ -1,8 +0,0 @@
-import sys
-
-def addPlanetSpawns(core, planet):
-
- stcSvc = core.staticService
- #this script is no longer for NPC spawning - Levarris
-
- return
\ No newline at end of file
diff --git a/scripts/static_spawns/naboo/naboo.py b/scripts/static_spawns/naboo/naboo.py
new file mode 100644
index 00000000..7b0f3034
--- /dev/null
+++ b/scripts/static_spawns/naboo/naboo.py
@@ -0,0 +1,11 @@
+import sys
+
+def addPlanetSpawns(core, planet):
+
+ stcSvc = core.staticService
+########################################################
+# DO NOT ADD ANYTHING ELSE TO THIS SCRIPT, PLEASE USE THE
+# SUBFOLDERS FOR EACH PLANET AND CREATE NEW SCRIPTS FOR
+# EACH AREA OF A PLANET. - LEVARRIS
+
+ return
\ No newline at end of file
diff --git a/scripts/static_spawns/rori/placeholder.txt b/scripts/static_spawns/rori/placeholder.txt
deleted file mode 100644
index e69de29b..00000000
diff --git a/scripts/static_spawns/rori.py b/scripts/static_spawns/rori/restuss.py
similarity index 100%
rename from scripts/static_spawns/rori.py
rename to scripts/static_spawns/rori/restuss.py
diff --git a/scripts/static_spawns/rori/rori.py b/scripts/static_spawns/rori/rori.py
new file mode 100644
index 00000000..ff976d80
--- /dev/null
+++ b/scripts/static_spawns/rori/rori.py
@@ -0,0 +1,14 @@
+import sys
+
+def addPlanetSpawns(core, planet):
+
+ stcSvc = core.staticService
+
+########################################################
+# DO NOT ADD ANYTHING ELSE TO THIS SCRIPT, PLEASE USE THE
+# SUBFOLDERS FOR EACH PLANET AND CREATE NEW SCRIPTS FOR
+# EACH AREA OF A PLANET. - LEVARRIS
+########################################################
+
+
+ return
\ No newline at end of file
diff --git a/scripts/static_spawns/tatooine.py b/scripts/static_spawns/tatooine.py
deleted file mode 100644
index 1ce34894..00000000
--- a/scripts/static_spawns/tatooine.py
+++ /dev/null
@@ -1,35 +0,0 @@
-import sys
-from resources.datatables import Options
-from resources.datatables import StateStatus
-
-def addPlanetSpawns(core, planet):
-
- stcSvc = core.staticService
-
- # Objects
-
- stcSvc.spawnObject('object/tangible/terminal/shared_terminal_character_builder.iff', 'tatooine', long(0), float(3525), float(4), float(-4801), float(0.70), float(0.71))
-
- # Buildings
-
- # Example
- #building = stcSvc.spawnObject('object/building/myThatchedHut.iff', 'tatooine', long(0), float(3525), float(4), float(-4804), float(0.70), float(0.71))
- #stcSvc.spawnObject('object/mobile/shared_my_npc.iff', 'tatooine', building.getCellByCellNumber(7), float(3525), float(4), float(-4804), float(0.70), float(0.71))
-
- # NPCs
-
- stcSvc.spawnObject('object/mobile/shared_respec_seller_f_1.iff', 'tatooine', long(0), float(3533.14), float(5), float(-4788.86), float(-0.3327), float(0.9288))
-
- stcSvc.spawnObject('object/mobile/shared_junk_dealer_m_01.iff', 'tatooine', long(0), float(3525), float(4), float(-4804), float(0.70), float(0.71))
-
- #stcSvc.spawnObject('object/mobile/shared_3po_protocol_droid_red.iff', 'tatooine', long(26582), float(-14.3), float(2.0), float(47.4), float(0.70), float(0.71))
-
- impRecruiter = stcSvc.spawnObject('object/mobile/shared_dressed_imperial_officer_f.iff', 'tatooine', long(1280132), float(-6), float(1), float(9.2), float(0.70), float(0.71))
- impRecruiter.setOptionsBitmask(264)
-
- rebRecruiter = stcSvc.spawnObject('object/mobile/shared_dressed_rebel_recruiter_human_female_01.iff', 'tatooine', long(1082887), float(-30.5), float(-0.5), float(6.2), float(0.70), float(0.71))
- rebRecruiter.setOptionsBitmask(264)
-
-
- return
-
diff --git a/scripts/static_spawns/tatooine/anchorhead.py b/scripts/static_spawns/tatooine/anchorhead.py
new file mode 100644
index 00000000..379246f2
--- /dev/null
+++ b/scripts/static_spawns/tatooine/anchorhead.py
@@ -0,0 +1,51 @@
+import sys
+# Project SWG: Anchorhead: Static Spawns
+# (C)2014 ProjectSWG
+
+
+
+from resources.datatables import Options
+from resources.datatables import State
+
+def addPlanetSpawns(core, planet):
+
+
+ stcSvc = core.staticService
+ objSvc = core.objectService
+
+ # TODO Check all NPCs for personalized scripting, change format.
+
+ # Cantina Interior
+ rebRecruiter = stcSvc.spawnObject('object/mobile/shared_dressed_rebel_recruiter_human_female_01.iff', 'tatooine', long(1213345), float(-2.2), float(0.4), float(-5.4), float(0), float(0))
+ rebRecruiter.setOptionsBitmask(264)
+
+ borraSetas = stcSvc.spawnObject('object/mobile/shared_dressed_commoner_tatooine_rodian_female_03.iff', 'tatooine', long(1213345), float(9.8), float(0.4), float(-1.2), float(-0.65), float(0.75))
+ borraSetas.setCustomName2('Borra Setas')
+ borraSetas.setOptionsBitmask(256)
+
+ # Outside
+ aaphKoden = stcSvc.spawnObject('object/mobile/shared_dressed_tatooine_aaph_koden.iff', 'tatooine', long(0), float(129), float(5.0), float(-5399), float(-0.67), float(0.73))
+ aaphKoden.setCustomName2('Aaph Koden')
+ aaphKoden.setOptionsBitmask(256)
+
+ Alger = stcSvc.spawnObject('object/mobile/shared_smuggler_fence_alger.iff', 'tatooine', long(0), float(107), float(5.0), float(-5315), float(0.96), float(0.26))
+ Alger.setCustomName2('Alger')
+ Alger.setOptionsBitmask(256)
+
+ carhlaBastra = stcSvc.spawnObject('object/mobile/shared_dressed_legacy_bastra.iff', 'tatooine', long(0), float(128), float(5.0), float(-5428), float(-0.26), float(0.96))
+ carhlaBastra.setCustomName2('Carh\'la Bastra')
+ carhlaBastra.setOptionsBitmask(256)
+
+ cuanTalon = stcSvc.spawnObject('object/mobile/shared_dressed_legacy_cuan.iff', 'tatooine', long(0), float(-161.7), float(65.0), float(-5322.8), float(0), float(0))
+ cuanTalon.setCustomName2('Cuan Talon')
+ cuanTalon.setOptionsBitmask(256)
+
+ dromaOrdo = stcSvc.spawnObject('object/mobile/shared_dressed_anchorjobs_ordo.iff', 'tatooine', long(0), float(110), float(52.0), float(-5431), float(0.36), float(0.93))
+ dromaOrdo.setCustomName2('Droma Ordo')
+ dromaOrdo.setOptionsBitmask(256)
+
+ Sorna = stcSvc.spawnObject('object/mobile/shared_dressed_tatooine_tosche_sorna.iff', 'tatooine', long(0), float(-135), float(52.0), float(-5331), float(0.36), float(0.93))
+ Sorna.setCustomName2('Sorna')
+ Sorna.setOptionsBitmask(256)
+ return
+
diff --git a/scripts/static_spawns/tatooine/bestine.py b/scripts/static_spawns/tatooine/bestine.py
new file mode 100644
index 00000000..caaeed4a
--- /dev/null
+++ b/scripts/static_spawns/tatooine/bestine.py
@@ -0,0 +1,100 @@
+import sys
+# Project SWG: Bestine: Static Spawns
+# (C)2014 ProjectSWG
+
+
+
+from resources.datatables import Options
+from resources.datatables import State
+
+def addPlanetSpawns(core, planet):
+
+
+ stcSvc = core.staticService
+ objSvc = core.objectService
+
+ # TODO Check all NPCs for personalized scripting, change format.
+
+ # City hall
+ indigoSiyan = stcSvc.spawnObject('object/mobile/shared_dressed_indigo_siyan.iff', 'tatooine', long(926483), float(24.7), float(3.2), float(-30.7), float(-0.06), float(0.99))
+ indigoSiyan.setCustomName2('Indigo Siyan')
+ indigoSiyan.setOptionsBitmask(256)
+
+ keanna = stcSvc.spawnObject('object/mobile/shared_dressed_keanna_likyna.iff', 'tatooine', long(926480), float(-18.7), float(3.2), float(20.6), float(-0.97), float(0.2))
+ keanna.setCustomName2('Keanna Li\'kyna')
+ keanna.setOptionsBitmask(256)
+
+ oberhaur = stcSvc.spawnObject('object/mobile/shared_space_imperial_tier2_tatooine_oberhaur.iff', 'tatooine', long(926480), float(-21.9), float(3.2), float(26.9), float(0.99), float(0.01))
+ oberhaur.setCustomName2('Commander Oberhaur')
+ oberhaur.setOptionsBitmask(256)
+
+ seanTrenwell = stcSvc.spawnObject('object/mobile/shared_dressed_sean_trenwell.iff', 'tatooine', long(926483), float(19.4), float(3.2), float(-36), float(-0.06), float(0.99))
+ seanTrenwell.setCustomName2('Sean Trenwell')
+ seanTrenwell.setOptionsBitmask(256)
+
+ talmont = stcSvc.spawnObject('object/mobile/shared_prefect_talmont.iff', 'tatooine', long(926475), float(-1.9), float(3.1), float(-10.3), float(0.99), float(0))
+ talmont.setCustomName2('Prefect Talmont')
+ talmont.setOptionsBitmask(256)
+
+ tourAryon = stcSvc.spawnObject('object/mobile/shared_dressed_tatooine_tour_aryon.iff', 'tatooine', long(926479), float(-36.8), float(1.3), float(0.3), float(0.8), float(0.59))
+ tourAryon.setCustomName2('Tour Aryon')
+ tourAryon.setOptionsBitmask(256)
+
+ victorVisalis = stcSvc.spawnObject('object/mobile/shared_dressed_victor_visalis.iff', 'tatooine', long(926480), float(-26.7), float(3.2), float(20.8), float(0.96), float(0.24))
+ victorVisalis.setCustomName2('Victor Visalis')
+ victorVisalis.setOptionsBitmask(256)
+
+ wilhalmSkrim = stcSvc.spawnObject('object/mobile/shared_dressed_tatooine_wilhalm_skrim.iff', 'tatooine', long(926482), float(28.9), float(1.3), float(-6.0), float(0.23), float(0.97))
+ wilhalmSkrim.setCustomName2('Wilhalm Skrim')
+ wilhalmSkrim.setOptionsBitmask(256)
+
+
+ #Miscellaneous Building Interiors
+ akalColzet = stcSvc.spawnObject('object/mobile/shared_dressed_imperial_trainer_space_01.iff', 'tatooine', long(1212359), float(0.7), float(1.8), float(-14), float(0), float(0.99))
+ akalColzet.setCustomName2('lt. Akal Colzet')
+ akalColzet.setOptionsBitmask(256)
+
+ fariousGletch = stcSvc.spawnObject('object/mobile/shared_dressed_tatooine_farious_gletch.iff', 'tatooine', long(1278989), float(2.0), float(-0.4), float(-5.7), float(-0.15), float(0.98))
+ fariousGletch.setCustomName2('Farious Gletch')
+ fariousGletch.setOptionsBitmask(256)
+
+ pfilbeeJhorn = stcSvc.spawnObject('object/mobile/shared_dressed_tatooine_pfilbee_jhorn.iff', 'tatooine', long(1279923), float(5.1), float(0.1), float(-3.8), float(-0.7), float(0.71))
+ pfilbeeJhorn.setCustomName2('Pfilbee Jhorn')
+ pfilbeeJhorn.setOptionsBitmask(256)
+
+ #Hotel interior
+ gilBurtin = stcSvc.spawnObject('object/mobile/shared_dressed_industrialist_trainer_01.iff', 'tatooine', long(1223850), float(20.3), float(1.6), float(12.8), float(0.99), float(0))
+ gilBurtin.setCustomName2('Gil Burtin')
+ gilBurtin.setOptionsBitmask(256)
+
+ # Outside
+ barak = stcSvc.spawnObject('object/mobile/shared_smuggler_broker_barak.iff', 'tatooine', long(0), float(-1049), float(5.0), float(-3537), float(0.97), float(0.23))
+ barak.setCustomName2('Barak')
+ barak.setOptionsBitmask(256)
+
+ barrezz = stcSvc.spawnObject('object/mobile/shared_dressed_dressed_legacy_barrezz.iff', 'tatooine', long(0), float(-1146.8), float(98.0), float(-3892.1), float(0.75), float(0.65))
+ barrezz.setCustomName2('Commander Barrezz')
+ barrezz.setOptionsBitmask(256)
+
+ jasha = stcSvc.spawnObject('object/mobile/shared_dressed_bestinejobs_jasha.iff', 'tatooine', long(0), float(-1128), float(98.0), float(-3900), float(-0.42), float(0.90))
+ jasha.setCustomName2('Captain Jasha')
+ jasha.setOptionsBitmask(256)
+
+ dkrn = stcSvc.spawnObject('object/mobile/shared_dressed_imperial_general_m.iff', 'tatooine', long(0), float(-1160), float(5.0), float(-3525), float(0.90), float(-0.41))
+ dkrn.setCustomName2('Commander D\'krn')
+ dkrn.setOptionsBitmask(256)
+
+ gunham = stcSvc.spawnObject('object/mobile/shared_dressed_imperial_lieutenant_m.iff', 'tatooine', long(0), float(-1125), float(12.2), float(-3620), float(0.9), float(0.42))
+ gunham.setCustomName2('Commander Gunham')
+ gunham.setOptionsBitmask(256)
+
+ kormundThrylle = stcSvc.spawnObject('object/mobile/shared_dressed_tatooine_kormund_thrylle.iff', 'tatooine', long(0), float(-1043), float(10.0), float(-3530), float(0.99), float(0.06))
+ kormundThrylle.setCustomName2('Kormund Thrylle')
+ kormundThrylle.setOptionsBitmask(256)
+
+ calebKnolar = stcSvc.spawnObject('object/mobile/shared_dressed_imperial_major_cold_m.iff', 'tatooine', long(0), float(-1149), float(98.0), float(-3903), float(0.42), float(0.91))
+ calebKnolar.setCustomName2('Major Caleb Knolar')
+ calebKnolar.setOptionsBitmask(256)
+
+ return
+
diff --git a/scripts/static_spawns/tatooine/jabbas_palace.py b/scripts/static_spawns/tatooine/jabbas_palace.py
new file mode 100644
index 00000000..df11aef4
--- /dev/null
+++ b/scripts/static_spawns/tatooine/jabbas_palace.py
@@ -0,0 +1,82 @@
+import sys
+# Project SWG: Jabba's Palace: Static Spawns
+# (C)2014 ProjectSWG
+
+
+
+from resources.datatables import Options
+from resources.datatables import State
+
+def addPlanetSpawns(core, planet):
+
+
+ stcSvc = core.staticService
+ objSvc = core.objectService
+
+ # TODO Check all NPCs for personalized scripting, change format.
+
+ # TODO Verify proper cell IDs once Jabba's Palace is spawning properly again.
+
+ reelo = stcSvc.spawnObject('object/mobile/shared_reelo_baruk.iff', 'tatooine', long(26560), float(-3.5), float(0.2), float(113.5), float(0), float(0))
+ reelo.setCustomName2('Reelo Baruk')
+ reelo.setOptionsBitmask(264)
+
+ reeyees = stcSvc.spawnObject('object/mobile/shared_dressed_gran_thug_male_01.iff', 'tatooine', long(26560), float(5.8), float(0.2), float(115.7), float(0.70), float(-0.71))
+ reeyees.setCustomName2('Ree-Yees')
+ reeyees.setOptionsBitmask(264)
+
+ ephant = stcSvc.spawnObject('object/mobile/shared_ephant_mon.iff', 'tatooine', long(26564), float(-6.1), float(5.8), float(86.1), float(0), float(0))
+ ephant.setCustomName2('Ephant Mon')
+ ephant.setOptionsBitmask(264)
+
+ porcellus = stcSvc.spawnObject('object/mobile/shared_dressed_porcellus.iff', 'tatooine', long(26572), float(-44.0), float(3.0), float(63.4), float(0), float(0))
+ porcellus.setCustomName2('Porcellus')
+ porcellus.setOptionsBitmask(264)
+
+ barada = stcSvc.spawnObject('object/mobile/shared_barada.iff', 'tatooine', long(26596), float(31.2), float(0.2), float(-1.0), float(0.98), float(-0.17))
+ barada.setCustomName2('Barada')
+ barada.setOptionsBitmask(264)
+
+ bibMain = stcSvc.spawnObject('object/mobile/shared_bib_fortuna.iff', 'tatooine', long(26582), float(-11.1), float(2.0), float(49.5), float(0.70), float(0.71))
+ bibMain.setCustomName2('Bib Fortuna')
+ bibMain.setOptionsBitmask(264)
+
+ jabba = stcSvc.spawnObject('object/mobile/shared_jabba_the_hutt.iff', 'tatooine', long(26582), float(-17.0), float(2.8), float(44.9), float(0.70), float(0.71))
+ jabba.setCustomName2('Jabba the Hutt')
+ jabba.setOptionsBitmask(264)
+
+ oola = stcSvc.spawnObject('object/mobile/shared_oola.iff', 'tatooine', long(26582), float(-10.3), float(2.0), float(43.9), float(0.70), float(-0.71))
+ oola.setCustomName2('Oola')
+ oola.setOptionsBitmask(264)
+
+ bobaFett = stcSvc.spawnObject('object/mobile/shared_boba_fett.iff', 'tatooine', long(26582), float(-1.0), float(3.0), float(33.1), float(0), float(0))
+ bobaFett.setCustomName2('Boba Fett')
+ bobaFett.setOptionsBitmask(264)
+
+ ev9d9 = stcSvc.spawnObject('object/mobile/shared_ev_9d9.iff', 'tatooine', long(26574), float(18.8), float(0.2), float(78.7), float(1.0), float(0))
+ ev9d9.setCustomName2('EV-9D9')
+ ev9d9.setOptionsBitmask(264)
+
+ malakili = stcSvc.spawnObject('object/mobile/shared_malakili.iff', 'tatooine', long(26599), float(17.3), float(-11.0), float(43.8), float(0), float(0))
+ malakili.setCustomName2('Malakili')
+ malakili.setOptionsBitmask(264)
+
+# TODO Need to somehow get the cellID for the Rancor Pit or it will NEVER be spawned.
+
+ maxRebo = stcSvc.spawnObject('object/mobile/shared_max_rebo.iff', 'tatooine', long(26582), float(-1.4), float(3.0), float(26.9), float(0.42), float(-0.9))
+ maxRebo.setCustomName2('Max Rebo')
+ maxRebo.setOptionsBitmask(264)
+
+ droopy = stcSvc.spawnObject('object/mobile/shared_droopy_mccool.iff', 'tatooine', long(26582), float(-3.9), float(3.0), float(26.1), float(0.42), float(-0.9))
+ droopy.setCustomName2('Droopy McCool')
+ droopy.setOptionsBitmask(264)
+
+ sySnootles = stcSvc.spawnObject('object/mobile/shared_sy_snootles.iff', 'tatooine', long(26582), float(-1.4), float(3.0), float(29.8), float(0.42), float(-0.))
+ sySnootles.setCustomName2('Sy Snootles')
+ sySnootles.setOptionsBitmask(264)
+
+ g5po = stcSvc.spawnObject('object/mobile/shared_3po_protocol_droid_red.iff', 'tatooine', long(26582), float(-14.3), float(2.0), float(47.4), float(0.70), float(0.71))
+ g5po.setCustomName2('G5-PO')
+ g5po.setOptionsBitmask(264)
+ return
+
diff --git a/scripts/static_spawns/tatooine/jawa_sandcrawler_legacy.py b/scripts/static_spawns/tatooine/jawa_sandcrawler_legacy.py
new file mode 100644
index 00000000..4a4d0c61
--- /dev/null
+++ b/scripts/static_spawns/tatooine/jawa_sandcrawler_legacy.py
@@ -0,0 +1,25 @@
+import sys
+# Project SWG: Jawa Sandcrawler - Legacy Quest Area: Static Spawns
+# (C)2014 ProjectSWG
+
+
+
+from resources.datatables import Options
+from resources.datatables import State
+
+def addPlanetSpawns(core, planet):
+
+
+ stcSvc = core.staticService
+ objSvc = core.objectService
+
+ # TODO Check all NPCs for personalized scripting, change format.
+
+ #Outside
+ fa2po = stcSvc.spawnObject('object/mobile/shared_3po_protocol_droid.iff', 'tatooine', long(0), float(-3805.7), float(30.4), float(-4721.6), float(0), float(0))
+ fa2po.setCustomName2('FA-2PO')
+ fa2po.setOptionsBitmask(256)
+
+
+ return
+
diff --git a/scripts/static_spawns/tatooine/lars_homestead.py b/scripts/static_spawns/tatooine/lars_homestead.py
new file mode 100644
index 00000000..88c7b417
--- /dev/null
+++ b/scripts/static_spawns/tatooine/lars_homestead.py
@@ -0,0 +1,25 @@
+import sys
+# Project SWG: Mos Entha: Static Spawns
+# (C)2014 ProjectSWG
+
+
+
+from resources.datatables import Options
+from resources.datatables import State
+
+def addPlanetSpawns(core, planet):
+
+
+ stcSvc = core.staticService
+ objSvc = core.objectService
+
+ # TODO Check all NPCs for personalized scripting, change format.
+
+ #Outside
+ zefAndo = stcSvc.spawnObject('object/mobile/shared_dressed_legacy_zef.iff', 'tatooine', long(0), float(-2574.9), float(0), float(-5516.7), float(0), float(0))
+ zefAndo.setCustomName2('Zef Ando')
+ zefAndo.setOptionsBitmask(256)
+
+
+ return
+
diff --git a/scripts/static_spawns/tatooine/mos_eisley.py b/scripts/static_spawns/tatooine/mos_eisley.py
new file mode 100644
index 00000000..8b3ac25f
--- /dev/null
+++ b/scripts/static_spawns/tatooine/mos_eisley.py
@@ -0,0 +1,336 @@
+import sys
+# Project SWG: Mos Eisley: Static Spawns
+# (C)2014 ProjectSWG
+
+
+
+from resources.datatables import Options
+from resources.datatables import State
+
+def addPlanetSpawns(core, planet):
+
+
+ stcSvc = core.staticService
+ objSvc = core.objectService
+
+ # TODO Check all NPCs for personalized scripting, change format.
+
+ #Cantina Interior
+ wuher = stcSvc.spawnObject('object/mobile/shared_wuher.iff', 'tatooine', long(1082877), float(8.6), float(-0.9), float(0.4), float(0.71), float(0.71))
+ wuher.setCustomName2('Wuher')
+ wuher.setOptionsBitmask(256)
+
+ chadraFanFemale = stcSvc.spawnObject('object/mobile/shared_chadra_fan_female.iff', 'tatooine', long(1082877), float(10.6), float(-0.9), float(-1.5), float(0.42), float(0.90))
+ chadraFanFemale.setCustomName2('a Chadra Fan Female')
+ chadraFanFemale.setOptionsBitmask(256)
+
+ chadraFanMale = stcSvc.spawnObject('object/mobile/shared_chadra_fan_male.iff', 'tatooine', long(1082877), float(10.7), float(-0.9), float(-0.3), float(0.64), float(0.77))
+ chadraFanMale.setCustomName2('a Chadra Fan Male')
+ chadraFanMale.setOptionsBitmask(256)
+
+ muftak = stcSvc.spawnObject('object/mobile/shared_muftak.iff', 'tatooine', long(1082877), float(20.3), float(-0.9), float(4.9), float(0.82), float(0.57))
+ muftak.setCustomName2('Muftak')
+ muftak.setOptionsBitmask(256)
+
+ chissMale1 = stcSvc.spawnObject('object/mobile/ep3/shared_ep3_etyyy_chiss_poacher_01.iff', 'tatooine', long(1082877), float(1.7), float(-0.9), float(-5.0), float(0.71), float(0.71))
+ chissMale1.setCustomName2('a Chiss Male')
+ chissMale1.setOptionsBitmask(256)
+
+ chissMale2 = stcSvc.spawnObject('object/mobile/ep3/shared_ep3_etyyy_chiss_poacher_02.iff', 'tatooine', long(1082877), float(3.4), float(-0.9), float(-4.8), float(0), float(0))
+ chissMale2.setCustomName2('a Chiss Male')
+ chissMale2.setOptionsBitmask(256)
+
+ cantinaStorm = stcSvc.spawnObject('object/mobile/shared_stormtrooper.iff', 'tatooine', long(1082877), float(2.9), float(-0.9), float(-6.5), float(0.71), float(0.71))
+ cantinaStorm.setCustomName2('a Stormtrooper')
+ cantinaStorm.setOptionsBitmask(256)
+
+ cantinaStormL = stcSvc.spawnObject('object/mobile/shared_stormtrooper_groupleader.iff', 'tatooine', long(1082877), float(3.6), float(-0.9), float(-7.9), float(0.71), float(0.71))
+ cantinaStormL.setCustomName2('a Stormtrooper Squad Leader')
+ cantinaStormL.setOptionsBitmask(256)
+
+ figrinDan = stcSvc.spawnObject('object/mobile/tatooine_npc/shared_figrin_dan.iff', 'tatooine', long(1082880), float(3.7), float(-0.9), float(-14.4), float(0.42), float(0.91))
+ figrinDan.setCustomName2('Figrin D\'an')
+ figrinDan.setOptionsBitmask(256)
+
+ techMor = stcSvc.spawnObject('object/mobile/tatooine_npc/shared_figrin_dan.iff', 'tatooine', long(1082880), float(4.0), float(-0.9), float(-17.0), float(0.42), float(0.91))
+ techMor.setCustomName2('Tech M\'or')
+ techMor.setOptionsBitmask(256)
+
+ doikkNats = stcSvc.spawnObject('object/mobile/tatooine_npc/shared_figrin_dan.iff', 'tatooine', long(1082880), float(2.2), float(-0.9), float(-16.4), float(0.42), float(0.91))
+ doikkNats.setCustomName2('Doikk Na\'ts')
+ doikkNats.setOptionsBitmask(256)
+
+ tednDahai = stcSvc.spawnObject('object/mobile/tatooine_npc/shared_figrin_dan.iff', 'tatooine', long(1082880), float(1.3), float(-0.9), float(-15.2), float(0.42), float(0.91))
+ tednDahai.setCustomName2('Tedn Dahai')
+ tednDahai.setOptionsBitmask(256)
+
+ nalanCheel = stcSvc.spawnObject('object/mobile/tatooine_npc/shared_figrin_dan.iff', 'tatooine', long(1082880), float(0.5), float(-0.9), float(-17.1), float(0.42), float(0.91))
+ nalanCheel.setCustomName2('Nalan Cheel')
+ nalanCheel.setOptionsBitmask(256)
+
+ businessman1 = stcSvc.spawnObject('object/mobile/shared_dressed_businessman_human_male_01.iff', 'tatooine', long(1082877), float(11.0), float(-0.9), float(2.1), float(0.38), float(-0.92))
+ businessman1.setCustomName2('a Businessman')
+ businessman1.setOptionsBitmask(256)
+
+ commoner1 = stcSvc.spawnObject('object/mobile/shared_dressed_commoner_tatooine_aqualish_male_01.iff', 'tatooine', long(1082877), float(10.3), float(-0.9), float(2.7), float(0.82), float(0.57))
+ commoner1.setCustomName2('a Commoner')
+ commoner1.setOptionsBitmask(256)
+
+ entertainer1 = stcSvc.spawnObject('object/mobile/shared_dressed_entertainer_trainer_twk_female_01.iff', 'tatooine', long(1082877), float(9.4), float(-0.9), float(3.9), float(0.38), float(-0.92))
+ entertainer1.setCustomName2('an Entertainer')
+ entertainer1.setOptionsBitmask(256)
+
+ noble1 = stcSvc.spawnObject('object/mobile/shared_dressed_noble_trandoshan_male_01.iff', 'tatooine', long(1082877), float(8.6), float(-0.9), float(4.8), float(0.82), float(0.57))
+ noble1.setCustomName2('a Noble')
+ noble1.setOptionsBitmask(256)
+
+ commoner2 = stcSvc.spawnObject('object/mobile/shared_dressed_commoner_tatooine_trandoshan_female_01.iff', 'tatooine', long(1082877), float(4.1), float(-0.9), float(5.7), float(1), float(0))
+ commoner2.setCustomName2('a Commoner')
+ commoner2.setOptionsBitmask(256)
+
+ commoner3 = stcSvc.spawnObject('object/mobile/shared_dressed_commoner_naboo_bothan_female_01.iff', 'tatooine', long(1082877), float(3.1), float(-0.9), float(5.9), float(1), float(0))
+ commoner3.setCustomName2('a Commoner')
+ commoner3.setOptionsBitmask(256)
+
+ commoner4 = stcSvc.spawnObject('object/mobile/shared_dressed_commoner_fat_twilek_male_01.iff', 'tatooine', long(1082877), float(1.7), float(-0.9), float(6.0), float(1), float(0))
+ commoner4.setCustomName2('a Commoner')
+ commoner4.setOptionsBitmask(256)
+
+ commoner5 = stcSvc.spawnObject('object/mobile/shared_dressed_commoner_naboo_bothan_male_01.iff', 'tatooine', long(1082877), float(-0.4), float(-0.9), float(5.9), float(1), float(0))
+ commoner5.setCustomName2('a Commoner')
+ commoner5.setOptionsBitmask(256)
+
+ commoner6 = stcSvc.spawnObject('object/mobile/shared_dressed_commoner_naboo_human_male_05.iff', 'tatooine', long(1082877), float(16.0), float(-0.9), float(4.1), float(0), float(0))
+ commoner6.setCustomName2('a Commoner')
+ commoner6.setOptionsBitmask(256)
+
+ commoner7 = stcSvc.spawnObject('object/mobile/shared_dressed_commoner_fat_zabrak_male_01.iff', 'tatooine', long(1082877), float(8.8), float(-0.9), float(-6.0), float(0.98), float(-0.22))
+ commoner7.setCustomName2('a Patron')
+ commoner7.setOptionsBitmask(256)
+
+ commoner8 = stcSvc.spawnObject('object/mobile/shared_dressed_commoner_naboo_human_male_08.iff', 'tatooine', long(1082877), float(6.8), float(-0.9), float(-6.5), float(0.98), float(-0.22))
+ commoner8.setCustomName2('a Patron')
+ commoner8.setOptionsBitmask(256)
+
+ commoner9 = stcSvc.spawnObject('object/mobile/shared_dressed_commoner_tatooine_aqualish_male_09.iff', 'tatooine', long(1082877), float(1.1), float(-0.9), float(-7.7), float(0.42), float(0.91))
+ commoner9.setCustomName2('a Commoner')
+ commoner9.setOptionsBitmask(256)
+
+ commoner10 = stcSvc.spawnObject('object/mobile/shared_dressed_commoner_tatooine_nikto_male_04.iff', 'tatooine', long(1082877), float(2.1), float(-0.9), float(-8.4), float(0.42), float(0.91))
+ commoner10.setCustomName2('a Commoner')
+ commoner10.setOptionsBitmask(256)
+
+ anetiaKahryn = stcSvc.spawnObject('object/mobile/shared_dressed_twk_entertainer.iff', 'tatooine', long(1082878), float(19.8), float(-0.9), float(-21), float(-0.03), float(0.99))
+ anetiaKahryn.setCustomName2('Anetia Kah\'ryn')
+ anetiaKahryn.setOptionsBitmask(256)
+
+ dravis = stcSvc.spawnObject('object/mobile/shared_space_privateer_tier1_tatooine.iff', 'tatooine', long(1082886), float(-21.7), float(-0.9), float(25.5), float(0.99), float(0.03))
+ dravis.setCustomName2('Dravis')
+ dravis.setOptionsBitmask(256)
+
+ talonKarrde = stcSvc.spawnObject('object/mobile/shared_dressed_talon_karrde.iff', 'tatooine', long(1082887), float(-25.7), float(-0.5), float(8.8), float(0.21), float(0.97))
+ talonKarrde.setCustomName2('Talon Karrde')
+ talonKarrde.setOptionsBitmask(256)
+
+ #Starport Interior
+
+ bartender1 = stcSvc.spawnObject('object/mobile/shared_dressed_commoner_tatooine_nikto_male_04.iff', 'tatooine', long(1106380), float(-59.1), float(2.6), float(39.5), float(0), float(0))
+ bartender1.setCustomName2('a Bartender')
+ bartender1.setOptionsBitmask(256)
+
+ #City Hall Interior
+
+ #Lucky Despot Interior TODO: Check Cell IDs for Spawned NPCS inside once Lucky Despot is spawning properly again.
+
+ hansolo1 = stcSvc.spawnObject('object/mobile/shared_han_solo.iff', 'tatooine', long(26949), float(32.3), float(7.0), float(1.6), float(0), float(0))
+ hansolo1.setCustomName2('Han Solo')
+ hansolo1.setOptionsBitmask(256)
+
+ #Medical Center Interior
+
+ #Theater Interior
+
+ #Miscellaneous Building Interiors
+
+ #Outside
+ businessman2 = stcSvc.spawnObject('object/mobile/shared_dressed_businessman_human_male_01.iff', 'tatooine', long(0), float(3663.3), float(4.0), float(-4738.6), float(0), float(0))
+ businessman2.setCustomName2('a Businessman')
+ businessman2.setOptionsBitmask(256)
+
+ noble2 = stcSvc.spawnObject('object/mobile/shared_dressed_noble_human_female_01.iff', 'tatooine', long(0), float(3542.3), float(5.0), float(-4826.0), float(0.42), float(0.91))
+ noble2.setCustomName2('a Noble')
+ noble2.setOptionsBitmask(256)
+
+ commoner11 = stcSvc.spawnObject('object/mobile/shared_dressed_commoner_naboo_human_male_06.iff', 'tatooine', long(0), float(3529.1), float(5.0), float(-4900.4), float(0.42), float(0.91))
+ commoner11.setCustomName2('a Commoner')
+ commoner11.setOptionsBitmask(256)
+
+ businessman3 = stcSvc.spawnObject('object/mobile/shared_dressed_commoner_tatooine_trandoshan_male_02.iff', 'tatooine', long(0), float(3595.7), float(5.0), float(-4740.1), float(0), float(0))
+ businessman3.setCustomName2('a Businessman')
+ businessman3.setOptionsBitmask(256)
+
+ jawa1 = stcSvc.spawnObject('object/mobile/shared_jawa.iff', 'tatooine', long(0), float(3663.3), float(5.0), float(-4858.6), float(0), float(0))
+ jawa1.setCustomName2('a Jawa')
+ jawa1.setOptionsBitmask(256)
+
+ commoner12 = stcSvc.spawnObject('object/mobile/shared_dressed_commoner_naboo_moncal_male_01.iff', 'tatooine', long(0), float(3490.3), float(5.0), float(-4799.4), float(0), float(0))
+ commoner12.setCustomName2('a Scientist')
+ commoner12.setOptionsBitmask(256)
+
+ commoner13 = stcSvc.spawnObject('object/mobile/shared_dressed_commoner_naboo_zabrak_female_02.iff', 'tatooine', long(0), float(3559.7), float(5.0), float(-4725.9), float(0), float(0))
+ commoner13.setCustomName2('a Commoner')
+ commoner13.setOptionsBitmask(256)
+
+ commoner14 = stcSvc.spawnObject('object/mobile/shared_dressed_commoner_tatooine_devaronian_male_01.iff', 'tatooine', long(0), float(3527.7), float(5.0), float(-4721.1), float(0.71), float(0.71))
+ commoner14.setCustomName2('a Commoner')
+ commoner14.setOptionsBitmask(256)
+
+ commoner15 = stcSvc.spawnObject('object/mobile/shared_dressed_commoner_tatooine_aqualish_female_01.iff', 'tatooine', long(0), float(3514.9), float(5.0), float(-4737.8), float(0), float(0))
+ commoner15.setCustomName2('a Commoner')
+ commoner15.setOptionsBitmask(256)
+
+ jawa2 = stcSvc.spawnObject('object/mobile/shared_jawa.iff', 'tatooine', long(0), float(3485.2), float(4.9), float(-4859.2), float(0), float(0))
+ jawa2.setCustomName2('a Jawa')
+ jawa2.setOptionsBitmask(256)
+
+ jawa3 = stcSvc.spawnObject('object/mobile/shared_jawa.iff', 'tatooine', long(0), float(3465.3), float(5.0), float(-4860.1), float(0.71), float(-0.71))
+ jawa3.setCustomName2('a Jawa')
+ jawa3.setOptionsBitmask(256)
+
+ jawa4 = stcSvc.spawnObject('object/mobile/shared_jawa.iff', 'tatooine', long(0), float(3486.8), float(5.0), float(-4884.7), float(0.43051), float(-0.9025))
+ jawa4.setCustomName2('a Jawa')
+ jawa4.setOptionsBitmask(256)
+
+ jawa5 = stcSvc.spawnObject('object/mobile/shared_jawa.iff', 'tatooine', long(0), float(3487.1), float(5.0), float(-4886.0), float(0.95105), float(0.3090))
+ jawa5.setCustomName2('a Jawa')
+ jawa5.setOptionsBitmask(256)
+
+ jawa6 = stcSvc.spawnObject('object/mobile/shared_jawa.iff', 'tatooine', long(0), float(3488.8), float(5.0), float(-4884.4), float(0.3255), float(-0.9455))
+ jawa6.setCustomName2('a Jawa')
+ jawa6.setOptionsBitmask(256)
+
+ jawa7 = stcSvc.spawnObject('object/mobile/shared_jawa.iff', 'tatooine', long(0), float(3472.2), float(5.0), float(-4918.4), float(0), float(0))
+ jawa7.setCustomName2('a Jawa')
+ jawa7.setOptionsBitmask(256)
+
+ jawa8 = stcSvc.spawnObject('object/mobile/shared_jawa.iff', 'tatooine', long(0), float(3471.4), float(5.0), float(-4919.5), float(0), float(0))
+ jawa8.setCustomName2('a Jawa')
+ jawa8.setOptionsBitmask(256)
+
+ jawa9 = stcSvc.spawnObject('object/mobile/shared_jawa.iff', 'tatooine', long(0), float(3470.3), float(5.0), float(-4918.7), float(0), float(0))
+ jawa9.setCustomName2('a Jawa')
+ jawa9.setOptionsBitmask(256)
+
+ bib = stcSvc.spawnObject('object/mobile/shared_bib_fortuna.iff', 'tatooine', long(0), float(3552.4), float(5.0), float(-4933.2), float(0.31730), float(-0.9483))
+ bib.setCustomName2('Bib Fortuna')
+ bib.setOptionsBitmask(256)
+
+ commoner16 = stcSvc.spawnObject('object/mobile/shared_dressed_commoner_naboo_human_male_06.iff', 'tatooine', long(0), float(3398.2), float(4.0), float(-4654.2), float(0.42), float(0.91))
+ commoner16.setCustomName2('a Commoner')
+ commoner16.setOptionsBitmask(256)
+
+ noble3 = stcSvc.spawnObject('object/mobile/shared_dressed_noble_human_female_01.iff', 'tatooine', long(0), float(3396.3), float(4.0), float(-4774.1), float(0.42), float(0.91))
+ noble3.setCustomName2('a Noble')
+ noble3.setOptionsBitmask(256)
+
+ entertainer1 = stcSvc.spawnObject('object/mobile/shared_dressed_entertainer_trainer_twk_female_01.iff', 'tatooine', long(0), float(3305.7), float(5.6), float(-4771.7), float(0), float(0))
+ entertainer1.setCustomName2('an Entertainer')
+ entertainer1.setOptionsBitmask(256)
+
+ r3m6 = stcSvc.spawnObject('object/mobile/shared_r3.iff', 'tatooine', long(0), float(3460.1), float(4.0), float(-4898.2), float(0.38), float(-0.92))
+ r3m6.setCustomName2('R3-M6')
+ r3m6.setOptionsBitmask(256)
+
+ eg1 = stcSvc.spawnObject('object/mobile/shared_eg6_power_droid.iff', 'tatooine', long(0), float(3463.8), float(4.0), float(-4882.6), float(-0.38), float(0.92))
+ eg1.setCustomName2('an EG-6 Power Droid')
+ eg1.setOptionsBitmask(256)
+
+ commoner17 = stcSvc.spawnObject('object/mobile/shared_dressed_commoner_naboo_zabrak_female_02.iff', 'tatooine', long(0), float(3452.6), float(4.0), float(-4937.1), float(0), float(0))
+ commoner17.setCustomName2('a Commoner')
+ commoner17.setOptionsBitmask(256)
+
+ lifter1 = stcSvc.spawnObject('object/mobile/shared_cll8_binary_load_lifter.iff', 'tatooine', long(0), float(3547), float(5.0), float(-4768.9), float(0), float(0))
+ lifter1.setCustomName2('a CLL-8 Binary Load Lifter')
+ lifter1.setOptionsBitmask(256)
+
+ r3j7 = stcSvc.spawnObject('object/mobile/shared_r3.iff', 'tatooine', long(0), float(3311.1), float(4.0), float(-4820.2), float(0.38), float(-0.92))
+ r3j7.setCustomName2('R3-J7')
+ r3j7.setOptionsBitmask(256)
+
+ noble4 = stcSvc.spawnObject('object/mobile/shared_dressed_noble_human_female_03.iff', 'tatooine', long(0), float(3255.3), float(4.0), float(-4848.1), float(0.42), float(0.91))
+ noble4.setCustomName2('a Noble')
+ noble4.setOptionsBitmask(256)
+
+ byxlePedette = stcSvc.spawnObject('object/mobile/shared_dressed_tatooine_opening_byxle.iff', 'tatooine', long(0), float(3365), float(5), float(-4639), float(0.99), float(0.12))
+ byxlePedette.setOptionsBitmask(264)
+
+ errikDarksider = stcSvc.spawnObject('object/mobile/shared_dressed_herald_tatooine_01.iff', 'tatooine', long(0), float(3381), float(4.6), float(-4498), float(0.91), float(0.40))
+ errikDarksider.setCustomName2('Errik Darksider')
+ errikDarksider.setOptionsBitmask(256)
+
+ gendra = stcSvc.spawnObject('object/mobile/shared_dressed_gendra.iff', 'tatooine', long(0), float(3308), float(5.6), float(-4785), float(0.84), float(0.53))
+ gendra.setOptionsBitmask(264)
+
+ lurval = stcSvc.spawnObject('object/mobile/shared_lurval.iff', 'tatooine', long(0), float(3387), float(5), float(-4791), float(-0.4), float(0.91))
+ lurval.setCustomName2('Lurval')
+ lurval.setOptionsBitmask(256)
+
+ matildaCarson = stcSvc.spawnObject('object/mobile/shared_dressed_noble_human_female_02.iff', 'tatooine', long(0), float(3490.2), float(5), float(-4778), float(0.87), float(0.48))
+ matildaCarson.setCustomName2('Matilda Carson')
+ matildaCarson.setOptionsBitmask(256)
+
+ vanvi = stcSvc.spawnObject('object/mobile/shared_dressed_bestine_artist01.iff', 'tatooine', long(0), float(3312), float(5), float(-4655), float(0.95), float(-0.28))
+ vanvi.setCustomName2('Vanvi Hotn')
+ vanvi.setOptionsBitmask(256)
+
+ #Eisley Legacy Quest NPCs
+
+ vourk = stcSvc.spawnObject('object/mobile/shared_dressed_tatooine_opening_santos.iff', 'tatooine', long(0), float(3520.0), float(5.0), float(-4821.0), float(0.42), float(0.91))
+ vourk.setCustomName2('Vourk Ver\'Zremp')
+ vourk.setOptionsBitmask(256)
+
+ mayor = stcSvc.spawnObject('object/mobile/shared_dressed_mayor_mikdanyell_guhrantt.iff', 'tatooine', long(1279960), float(1.2), float(2.5), float(5.4), float(0), float(0))
+ mayor.setOptionsBitmask(264)
+
+ enthaKandela = stcSvc.spawnObject('object/mobile/shared_dressed_entha_kandela.iff', 'tatooine', long(0), float(3511), float(5.0), float(-4785), float(0.70), float(0.71))
+ enthaKandela.setCustomName2('Entha Kandela')
+ enthaKandela.setOptionsBitmask(256)
+
+ purvis = stcSvc.spawnObject('object/mobile/shared_dressed_purvis_arrison.iff', 'tatooine', long(0), float(3512.4), float(5.0), float(-4764.9), float(0.38), float(-0.92))
+ purvis.setCustomName2('Purvis Arrison')
+ purvis.setOptionsBitmask(256)
+
+ peawpRdawc = stcSvc.spawnObject('object/mobile/shared_peawp_bodyguard_trainer.iff', 'tatooine', long(1189639), float(-11.8), float(1.1), float(-10.1), float(0), float(0))
+ peawpRdawc.setCustomName2('Peawp R\'dawc')
+ peawpRdawc.setOptionsBitmask(256)
+
+ nikoBrehe = stcSvc.spawnObject('object/mobile/shared_dressed_tatooine_opening_niko.iff', 'tatooine', long(0), float(3506.7), float(5.0), float(-4795.8), float(0.70), float(0.71))
+ nikoBrehe.setOptionsBitmask(264)
+
+ dunir = stcSvc.spawnObject('object/mobile/shared_dressed_tatooine_opening_dunir.iff', 'tatooine', long(0), float(3520.7), float(5.0), float(-4683.7), float(0.99), float(-0.08))
+ dunir.setOptionsBitmask(264)
+
+ #Eisley Ship Controller
+ stcSvc.spawnObject('object/mobile/shared_distant_ship_controller.iff', 'tatooine', long(0), float(3542.3), float(5.0), float(-4826.0), float(0.42), float(0.91))
+
+ #recruiters
+ impRecruiter = stcSvc.spawnObject('object/mobile/shared_dressed_imperial_officer_f.iff', 'tatooine', long(1280132), float(-6), float(1), float(9.2), float(0.70), float(0.71))
+ impRecruiter.setOptionsBitmask(264)
+
+
+
+ #Profession Counselor
+ stcSvc.spawnObject('object/mobile/shared_respec_seller_f_1.iff', 'tatooine', long(0), float(3533.14), float(5), float(-4788.86), float(-0.3327), float(0.9288))
+
+ #Junk Dealers
+ stcSvc.spawnObject('object/mobile/shared_junk_dealer_m_01.iff', 'tatooine', long(0), float(3355), float(5), float(-4823), float(0.71), float(0.71))
+ stcSvc.spawnObject('object/mobile/shared_junk_dealer_m_01.iff', 'tatooine', long(0), float(3412), float(5), float(-4713), float(0.71), float(-0.71))
+ stcSvc.spawnObject('object/mobile/shared_junk_dealer_m_01.iff', 'tatooine', long(0), float(3500), float(5), float(-4960), float(0), float(0))
+ stcSvc.spawnObject('object/mobile/shared_junk_dealer_m_01.iff', 'tatooine', long(0), float(3497), float(5), float(-4928), float(0), float(1))
+ stcSvc.spawnObject('object/mobile/shared_junk_dealer_m_01.iff', 'tatooine', long(0), float(3377), float(5), float(-4524), float(0.71), float(0.71))
+ stcSvc.spawnObject('object/mobile/shared_junk_dealer_m_01.iff', 'tatooine', long(0), float(3271), float(5), float(-4704), float(0), float(0))
+ stcSvc.spawnObject('object/mobile/shared_junk_dealer_m_01.iff', 'tatooine', long(0), float(3476), float(5), float(-4665), float(0.71), float(0.71))
+
+
+ return
+
diff --git a/scripts/static_spawns/tatooine/mos_entha.py b/scripts/static_spawns/tatooine/mos_entha.py
new file mode 100644
index 00000000..e99d36ea
--- /dev/null
+++ b/scripts/static_spawns/tatooine/mos_entha.py
@@ -0,0 +1,25 @@
+import sys
+# Project SWG: Mos Entha: Static Spawns
+# (C)2014 ProjectSWG
+
+
+
+from resources.datatables import Options
+from resources.datatables import State
+
+def addPlanetSpawns(core, planet):
+
+
+ stcSvc = core.staticService
+ objSvc = core.objectService
+
+ # TODO Check all NPCs for personalized scripting, change format.
+
+ #Outside
+ ankwee = stcSvc.spawnObject('object/mobile/shared_dressed_tatooine_entha_ankwee.iff', 'tatooine', long(0), float(1351), float(5.0), float(3108), float(0.42), float(0.91))
+ ankwee.setCustomName2('An\'kwee')
+ ankwee.setOptionsBitmask(256)
+
+
+ return
+
diff --git a/scripts/static_spawns/tatooine/mos_espa.py b/scripts/static_spawns/tatooine/mos_espa.py
new file mode 100644
index 00000000..6cb589b3
--- /dev/null
+++ b/scripts/static_spawns/tatooine/mos_espa.py
@@ -0,0 +1,69 @@
+import sys
+# Project SWG: Mos Espa: Static Spawns
+# (C)2014 ProjectSWG
+
+
+
+from resources.datatables import Options
+from resources.datatables import State
+
+def addPlanetSpawns(core, planet):
+
+
+ stcSvc = core.staticService
+ objSvc = core.objectService
+
+ # TODO Check all NPCs for personalized scripting, change format.
+
+ # Cantina Interior
+ dalaSocuna = stcSvc.spawnObject('object/mobile/shared_space_rebel_tier1_tatooine_socuna.iff', 'tatooine', long(1256068), float(-28.4), float(-0.5), float(9.4), float(0.33), float(0.94))
+ dalaSocuna.setCustomName2('Commander Da\'la Socuna')
+ dalaSocuna.setOptionsBitmask(256)
+
+ #Watto's Shop ****TODO: Get Proper cells for Watto's Shop once Buildout structures are spawning as intended again.
+
+ watto = stcSvc.spawnObject('object/mobile/shared_watto.iff', 'tatooine', long(26670), float(4.7), float(-0.5), float(2.4), float(0.70), float(-0.71))
+ watto.setCustomName2('Watto')
+ watto.setOptionsBitmask(256)
+
+ #Exterior Uninteractable NPCs
+ commoner18 = stcSvc.spawnObject('object/mobile/shared_dressed_commoner_naboo_zabrak_female_02.iff', 'tatooine', long(0), float(-2915.3), float(5.0), float(2148.5), float(0), float(0))
+ commoner18.setCustomName2('a Commoner')
+ commoner18.setOptionsBitmask(256)
+
+ jawa10 = stcSvc.spawnObject('object/mobile/shared_jawa.iff', 'tatooine', long(0), float(-2966.3), float(5.0), float(2196.9), float(0), float(0))
+ jawa10.setCustomName2('a Jawa')
+ jawa10.setOptionsBitmask(256)
+
+ commoner19 = stcSvc.spawnObject('object/mobile/shared_dressed_commoner_naboo_human_male_06.iff', 'tatooine', long(0), float(-2960.4), float(5.0), float(2271.3), float(0), float(0))
+ commoner19.setCustomName2('a Commoner')
+ commoner19.setOptionsBitmask(256)
+
+ commoner20 = stcSvc.spawnObject('object/mobile/shared_dressed_commoner_tatooine_devaronian_male_01.iff', 'tatooine', long(0), float(-2934.3), float(5.0), float(2298.9), float(0.71), float(0.71))
+ commoner20.setCustomName2('a Commoner')
+ commoner20.setOptionsBitmask(256)
+
+ commoner21 = stcSvc.spawnObject('object/mobile/shared_dressed_noble_human_female_01.iff', 'tatooine', long(0), float(-2897.7), float(5.0), float(2345.4), float(0.71), float(0.71))
+ commoner21.setCustomName2('a Commoner')
+ commoner21.setOptionsBitmask(256)
+
+ commoner22 = stcSvc.spawnObject('object/mobile/shared_dressed_commoner_fat_twilek_male_01.iff', 'tatooine', long(0), float(-2763.8), float(5.0), float(2305.2), float(0.71), float(0.71))
+ commoner22.setCustomName2('a Commoner')
+ commoner22.setOptionsBitmask(256)
+
+ jawa11 = stcSvc.spawnObject('object/mobile/shared_jawa.iff', 'tatooine', long(0), float(-2936.8), float(5.0), float(2078.4), float(0.95105), float(0.3090))
+ jawa11.setCustomName2('a Jawa')
+ jawa11.setOptionsBitmask(256)
+
+ businessman4 = stcSvc.spawnObject('object/mobile/shared_dressed_commoner_tatooine_trandoshan_male_02.iff', 'tatooine', long(0), float(-2914.2), float(5.0), float(2022.4), float(0), float(0))
+ businessman4.setCustomName2('a Businessman')
+ businessman4.setOptionsBitmask(256)
+
+ commoner23 = stcSvc.spawnObject('object/mobile/shared_dressed_commoner_naboo_moncal_male_01.iff', 'tatooine', long(0), float(-2904.1), float(5.0), float(1965.3), float(0.71), float(0.71))
+ commoner23.setCustomName2('a Commoner')
+ commoner23.setOptionsBitmask(256)
+
+
+
+ return
+
diff --git a/scripts/static_spawns/tatooine/placeholder.txt b/scripts/static_spawns/tatooine/placeholder.txt
deleted file mode 100644
index e69de29b..00000000
diff --git a/scripts/static_spawns/tatooine/tatooine.py b/scripts/static_spawns/tatooine/tatooine.py
new file mode 100644
index 00000000..9a45d308
--- /dev/null
+++ b/scripts/static_spawns/tatooine/tatooine.py
@@ -0,0 +1,21 @@
+import sys
+from resources.datatables import Options
+from resources.datatables import State
+
+def addPlanetSpawns(core, planet):
+########################################################
+# DO NOT ADD ANYTHING ELSE TO THIS SCRIPT, PLEASE USE THE
+# SUBFOLDERS FOR EACH PLANET AND CREATE NEW SCRIPTS FOR
+# EACH AREA OF A PLANET. - LEVARRIS
+########################################################
+ stcSvc = core.staticService
+ # Blue Frog: Uncomment only when needed for testing.
+ stcSvc.spawnObject('object/tangible/terminal/shared_terminal_character_builder.iff', 'tatooine', long(0), float(3525), float(4), float(-4801), float(0.70), float(0.71))
+
+########################################################
+# DO NOT ADD ANYTHING ELSE TO THIS SCRIPT, PLEASE USE THE
+# SUBFOLDERS FOR EACH PLANET AND CREATE NEW SCRIPTS FOR
+# EACH AREA OF A PLANET. - LEVARRIS
+########################################################
+ return
+
diff --git a/src/resources/common/ProsePackage.java b/src/resources/common/ProsePackage.java
index b461bb8e..6af9bbe4 100644
--- a/src/resources/common/ProsePackage.java
+++ b/src/resources/common/ProsePackage.java
@@ -55,6 +55,12 @@ public class ProsePackage {
stf.setStfName(stfLabel);
}
+ public ProsePackage(String stfFile, String stfLabel, String ttCustomString) {
+ stf.setStfFilename(stfFile);
+ stf.setStfName(stfLabel);
+ this.ttCustomString = ttCustomString;
+ }
+
public ProsePackage(String stfFile, String stfLabel, long tuObjectId, String tuStfFile, String tuStfLabel, String tuCustomString) {
stf.setStfFilename(stfFile);
stf.setStfName(stfLabel);
diff --git a/src/resources/datatables/MilkState.java b/src/resources/datatables/MilkState.java
new file mode 100644
index 00000000..002b6e7c
--- /dev/null
+++ b/src/resources/datatables/MilkState.java
@@ -0,0 +1,28 @@
+/*******************************************************************************
+ * Copyright (c) 2013
+ *
+ * This File is part of NGECore2.
+ *
+ * This program is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU Lesser General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public License
+ * along with this program. If not, see .
+ *
+ * Using NGEngine to work with NGECore2 is making a combined work based on NGEngine.
+ * Therefore all terms and conditions of the GNU Lesser General Public License cover the combination.
+ ******************************************************************************/
+package resources.datatables;
+
+public class MilkState {
+ public static final byte NOTYETMILKED = 0;
+ public static final byte MILKINGINPROGRESS = 1;
+ public static final byte MILKED = 2;
+}
diff --git a/src/resources/objectives/BountyMissionObjective.java b/src/resources/objectives/BountyMissionObjective.java
index caa8edbf..09a928f4 100644
--- a/src/resources/objectives/BountyMissionObjective.java
+++ b/src/resources/objectives/BountyMissionObjective.java
@@ -25,15 +25,21 @@ import java.util.Random;
import java.util.concurrent.Executors;
import java.util.concurrent.ScheduledFuture;
import java.util.concurrent.TimeUnit;
+import java.util.concurrent.atomic.AtomicInteger;
import protocol.swg.CommPlayerMessage;
+import protocol.swg.PlayClientEffectLocMessage;
+import protocol.swg.UpdatePVPStatusMessage;
+import engine.resources.common.CRC;
import engine.resources.container.Traverser;
import engine.resources.objects.SWGObject;
import engine.resources.scene.Point3D;
+import engine.resources.scene.Quaternion;
import main.NGECore;
import resources.common.BountyListItem;
import resources.common.OutOfBand;
import resources.common.ProsePackage;
+import resources.common.SpawnPoint;
import resources.datatables.DisplayType;
import resources.objects.creature.CreatureObject;
import resources.objects.mission.MissionObject;
@@ -43,15 +49,27 @@ import services.mission.MissionObjective;
public class BountyMissionObjective extends MissionObjective {
+ private static final long serialVersionUID = 1L;
+
private Point3D lastKnownLocation;
private String lastKnownPlanet;
- private ScheduledFuture> locationUpdater;
+ private ScheduledFuture> seekerUpdates;
+ private ScheduledFuture> probeSummonTask;
private long markObjId;
private boolean seekerActive = false;
private String seekerPlanet = "";
private boolean arakydActive = false;
-
+
+ private Point3D arakydLandingLocation;
+
+ ////// Droids in the world - Set Posture to 8 to launch them. //////
+ // Seeker Droids: object/creature/npc/droid/crafted/shared_probe_droid_advanced.iff
+ // Arakyd Droids: object/creature/npc/droid/shared_imperial_probot_bounty.iff
+
+ ///// Inventory form /////
+ // Seeker Droids: object/tangible/mission/shared_mission_bounty_droid_seeker.iff
+ // Arakyd Droids: object/tangible/mission/shared_mission_bounty_droid_probot.iff
public BountyMissionObjective(MissionObject parent) {
super(parent);
}
@@ -76,7 +94,7 @@ public class BountyMissionObjective extends MissionObjective {
String message = "@mission/mission_bounty_informant:target_hard_" + Integer.toString(new Random().nextInt(4) + 1);
CommPlayerMessage comm = new CommPlayerMessage(player.getObjectId(), new OutOfBand(new ProsePackage(message)));
- comm.setTime(5000);
+ comm.setTime(2000);
switch (bountyTarget.getFaction()) {
case "neutral":
comm.setModel("object/mobile/shared_dressed_assassin_mission_giver_0" + Integer.toString(new Random().nextInt(2) + 1) + ".iff");
@@ -90,8 +108,17 @@ public class BountyMissionObjective extends MissionObjective {
} //Could also be: object/mobile/shared_bounty_guild_bounty_check.iff || object/mobile/shared_bounty_check_fugitive_x.iff
player.getClient().getSession().write(comm.serialize());
+
+ player.getPlayerObject().setBountyMissionId(getMissionObject().getObjectId());
+
+ /*CreatureObject target = (CreatureObject) core.objectService.getObject(markObjId);
+ if (target != null && target.getPlanetId() == player.getPlanetId()) {
+ UpdatePVPStatusMessage upvpm = new UpdatePVPStatusMessage(player.getObjectID(), core.factionService.calculatePvpStatus(player, target), player.getFaction());
+ player.getClient().getSession().write(upvpm.serialize());
+ }*/
}
+
@Override
public void complete(NGECore core, CreatureObject player) {
BountyListItem bounty = core.missionService.getBountyListItem(markObjId);
@@ -111,16 +138,20 @@ public class BountyMissionObjective extends MissionObjective {
clearActiveMissions(core, bounty);
core.missionService.removeBounty(markObjId);
+ player.getPlayerObject().setBountyMissionId(0);
}
@Override
public void abort(NGECore core, CreatureObject player) {
+ cancelLocationUpdates();
+
BountyListItem bounty = core.missionService.getBountyListItem(markObjId);
if (bounty == null)
return;
bounty.removeBountyHunter(player.getObjectId());
+ player.getPlayerObject().setBountyMissionId(0);
}
@Override
@@ -182,51 +213,147 @@ public class BountyMissionObjective extends MissionObjective {
}
}
- public void beginSeekerUpdates(NGECore core) {
+ public void handleProbeDroidSummon(NGECore core, final CreatureObject actor) {
+
+ actor.sendSystemMessage("@mission/mission_generic:probe_droid_launch_prep", DisplayType.Broadcast);
+ AtomicInteger countDown = new AtomicInteger();
+
+ ScheduledFuture> summon = Executors.newScheduledThreadPool(1).scheduleAtFixedRate(new Runnable() {
+
+ @Override
+ public void run() {
+ switch(countDown.incrementAndGet()) {
+ case 15:
+ actor.sendSystemMessage("@mission/mission_generic:probe_droid_arrival_5", DisplayType.Broadcast);
+ break;
+ case 16:
+ actor.sendSystemMessage("@mission/mission_generic:probe_droid_arrival_4", DisplayType.Broadcast);
+ break;
+ case 17:
+ actor.sendSystemMessage("@mission/mission_generic:probe_droid_arrival_3", DisplayType.Broadcast);
+ break;
+ case 18:
+ actor.sendSystemMessage("@mission/mission_generic:probe_droid_arrival_2", DisplayType.Broadcast);
+ break;
+ case 19:
+ actor.sendSystemMessage("@mission/mission_generic:probe_droid_arrival_1", DisplayType.Broadcast);
+ arakydLandingLocation = SpawnPoint.getRandomPosition(actor.getPosition(), 50, 120, actor.getPlanetId());
+ PlayClientEffectLocMessage effectMsg = new PlayClientEffectLocMessage("clienteffect/probot_delivery.cef", actor.getPlanet().getName(), arakydLandingLocation);
+ actor.getClient().getSession().write(effectMsg.serialize());
+ break;
+ case 20:
+ break;
+ case 23:
+ Quaternion ori = actor.getOrientation();
+
+ CreatureObject probe = (CreatureObject) NGECore.getInstance().staticService.spawnObject("object/creature/npc/droid/shared_imperial_probot_bounty.iff",
+ actor.getPlanet().getName(), 0, arakydLandingLocation.x, arakydLandingLocation.y, arakydLandingLocation.z, ori.y, ori.w);
+
+ // TODO: Move probe to the player.
+
+ probe.setAttachment("probotRequester", actor.getObjectID());
+ probe.setAttachment("attachedMission", getMissionObject().getObjectID());
+ actor.sendSystemMessage("@mission/mission_generic:probe_droid_arrival", DisplayType.Broadcast);
+ probeSummonTask.cancel(false);
+ break;
+ }
+ }
+ }, 1, 1, TimeUnit.SECONDS);
+
+ probeSummonTask = summon;
+
+ }
+
+ public void beginSeekerUpdates(NGECore core, CreatureObject actor) {
if (!seekerActive) {
setSeekerActive(true);
- setSeekerPlanet(getMissionObject().getGrandparent().getPlanet().getName());
+ setSeekerPlanet(actor.getPlanet().getName());
- ScheduledFuture> updates = Executors.newScheduledThreadPool(1).scheduleAtFixedRate(new Runnable() {
+ AtomicInteger updates = new AtomicInteger();
+ ScheduledFuture> updater = Executors.newScheduledThreadPool(1).scheduleAtFixedRate(new Runnable() {
@Override
public void run() {
-
+
MissionObject mission = getMissionObject();
SWGObject target = core.objectService.getObject(markObjId);
- CreatureObject player = (CreatureObject) mission.getGrandparent();
-
+
if (target == null) {
- player.sendSystemMessage("@mission/mission_generic:player_target_inactive", DisplayType.Broadcast);
+ actor.sendSystemMessage("@mission/mission_generic:player_target_inactive", DisplayType.Broadcast);
cancelLocationUpdates();
return;
} else if (target.getPlanet().getName() != getSeekerPlanet()) {
- player.sendSystemMessage("@mission/mission_generic:target_not_on_planet", DisplayType.Broadcast);
+ actor.sendSystemMessage("@mission/mission_generic:target_not_on_planet", DisplayType.Broadcast);
cancelLocationUpdates();
return;
} else {
- WaypointObject missionWp = mission.getAttachedWaypoint();
-
- if (missionWp == null) {
- player.sendSystemMessage("@mission/mission_generic:target_not_found_1", DisplayType.Broadcast);
+
+ if (updates.get() >= 5) {
+ actor.sendSystemMessage("@mission/mission_generic:target_track_lost", DisplayType.Broadcast);
cancelLocationUpdates();
return;
}
- missionWp.setPosition(target.getWorldPosition());
+
+ WaypointObject missionWp = mission.getAttachedWaypoint();
- mission.setAttachedWaypoint(missionWp);
- player.sendSystemMessage("@mission/mission_generic:target_location_updated_ground", DisplayType.Broadcast);
+ if (missionWp == null) {
+ WaypointObject waypoint = (WaypointObject) NGECore.getInstance().objectService.createObject("object/waypoint/shared_waypoint.iff", target.getPlanet(),
+ target.getWorldPosition().x, target.getWorldPosition().z, target.getWorldPosition().y);
+ waypoint.setActive(true);
+ waypoint.setColor(WaypointObject.ORANGE);
+ waypoint.setName(getMissionObject().getMissionTargetName());
+ waypoint.setPlanetCRC(CRC.StringtoCRC(target.getPlanet().getName()));
+ waypoint.setStringAttribute("", "");
+ getMissionObject().setAttachedWaypoint(waypoint);
+ actor.sendSystemMessage("@mission/mission_generic:target_location_updated_ground", DisplayType.Broadcast);
+ } else {
+ missionWp.setPosition(target.getWorldPosition());
+ mission.setAttachedWaypoint(missionWp);
+ actor.sendSystemMessage("@mission/mission_generic:target_location_updated_ground", DisplayType.Broadcast);
+ }
+ updates.getAndIncrement();
}
}
}, 60, 15, TimeUnit.SECONDS);
- setLocationUpdater(updates);
+ seekerUpdates = updater;
}
}
+ public void beginArakydUpdate(final CreatureObject actor) {
+ arakydActive = true;
+ Executors.newScheduledThreadPool(1).schedule(() -> {
+
+ int number = new Random().nextInt(100);
+
+ // Effectively a 16% chance of failing. The failure type is calculated by subtracting 10 from the number received.
+ if (number <= 16 && number != 0) { actor.sendSystemMessage("@mission/mission_generic:target_not_found_" + String.valueOf(10 - number), (byte) 0); return; }
+
+ SWGObject target = NGECore.getInstance().objectService.getObject(markObjId);
+ if (target == null) { actor.sendSystemMessage("@mission/mission_generic:player_target_inactive", DisplayType.Broadcast); }
+
+ WaypointObject waypoint = (WaypointObject) NGECore.getInstance().objectService.createObject("object/waypoint/shared_waypoint.iff", target.getPlanet(),
+ target.getWorldPosition().x, target.getWorldPosition().z, target.getWorldPosition().y);
+ waypoint.setActive(true);
+ waypoint.setColor(WaypointObject.ORANGE);
+ waypoint.setName(getMissionObject().getMissionTargetName());
+ waypoint.setPlanetCRC(CRC.StringtoCRC(target.getPlanet().getName()));
+ waypoint.setStringAttribute("", "");
+ getMissionObject().setAttachedWaypoint(waypoint);
+
+ actor.sendSystemMessage("@mission/mission_generic:target_location_updated_ground", DisplayType.Broadcast);
+ actor.sendSystemMessage("@mission/mission_generic:target_located_" + target.getPlanet().getName(), DisplayType.Broadcast);
+
+ }, 180, TimeUnit.SECONDS);
+ }
+
public void cancelLocationUpdates() {
- getLocationUpdater().cancel(true);
+ if (seekerUpdates != null)
+ seekerUpdates.cancel(true);
+ if (probeSummonTask != null)
+ probeSummonTask.cancel(true);
+
setSeekerActive(false);
setSeekerPlanet("");
setArakydActive(false);
@@ -244,10 +371,6 @@ public class BountyMissionObjective extends MissionObjective {
public void setLastKnownPlanet(String lastKnownPlanet) { this.lastKnownPlanet = lastKnownPlanet; }
- public ScheduledFuture> getLocationUpdater() { return locationUpdater; }
-
- public void setLocationUpdater(ScheduledFuture> locationUpdater) { this.locationUpdater = locationUpdater; }
-
public boolean isSeekerActive() { return seekerActive; }
public void setSeekerActive(boolean seekerActive) { this.seekerActive = seekerActive; }
diff --git a/src/resources/objectives/DeliveryMissionObjective.java b/src/resources/objectives/DeliveryMissionObjective.java
index 6a116a8e..7d5f029b 100644
--- a/src/resources/objectives/DeliveryMissionObjective.java
+++ b/src/resources/objectives/DeliveryMissionObjective.java
@@ -33,6 +33,8 @@ import services.mission.MissionObjective;
public class DeliveryMissionObjective extends MissionObjective {
+ private static final long serialVersionUID = 1L;
+
private TangibleObject deliveryObject;
private CreatureObject missionGiver;
private CreatureObject dropOffNpc;
diff --git a/src/resources/objectives/DestroyMissionObjective.java b/src/resources/objectives/DestroyMissionObjective.java
index 7437d46f..442e4384 100644
--- a/src/resources/objectives/DestroyMissionObjective.java
+++ b/src/resources/objectives/DestroyMissionObjective.java
@@ -28,6 +28,8 @@ import services.mission.MissionObjective;
public class DestroyMissionObjective extends MissionObjective {
+ private static final long serialVersionUID = 1L;
+
public DestroyMissionObjective(MissionObject parent) {
super(parent);
}
diff --git a/src/resources/objects/creature/CreatureObject.java b/src/resources/objects/creature/CreatureObject.java
index d724e44b..38668e6b 100644
--- a/src/resources/objects/creature/CreatureObject.java
+++ b/src/resources/objects/creature/CreatureObject.java
@@ -185,7 +185,7 @@ public class CreatureObject extends TangibleObject implements Serializable {
@NotPersistent
private transient ConcurrentHashMap cooldowns = new ConcurrentHashMap();
@NotPersistent
- private transient long tefTime = System.currentTimeMillis();
+ private transient long tefTime = 0;
@NotPersistent
private transient SWGObject useTarget;
@@ -213,7 +213,6 @@ public class CreatureObject extends TangibleObject implements Serializable {
duelList = Collections.synchronizedList(new ArrayList());
cooldowns = new ConcurrentHashMap();
performanceAudience = new Vector();
- tefTime = System.currentTimeMillis();
messageBuilder = new CreatureMessageBuilder(this);
}
diff --git a/src/resources/objects/player/PlayerObject.java b/src/resources/objects/player/PlayerObject.java
index f9319a8d..9dd04221 100644
--- a/src/resources/objects/player/PlayerObject.java
+++ b/src/resources/objects/player/PlayerObject.java
@@ -150,6 +150,8 @@ public class PlayerObject extends IntangibleObject implements Serializable {
@NotPersistent
private transient boolean callingCompanion = false;
+ private long bountyMissionId;
+
public PlayerObject() {
super();
messageBuilder = new PlayerMessageBuilder(this);
@@ -894,10 +896,8 @@ public class PlayerObject extends IntangibleObject implements Serializable {
public boolean isMemberOfChannel(int roomId) {
if (chatChannels.contains(roomId)) {
- System.out.println("Member of the channel!");
return true;
}
- System.out.println("Not a Member of the channel!");
return false;
}
@@ -909,6 +909,14 @@ public class PlayerObject extends IntangibleObject implements Serializable {
this.callingCompanion = callingCompanion;
}
+ public long getBountyMissionId() {
+ return bountyMissionId;
+ }
+
+ public void setBountyMissionId(long bountyMissionId) {
+ this.bountyMissionId = bountyMissionId;
+ }
+
public ObjectMessageBuilder getMessageBuilder() {
return messageBuilder;
}
diff --git a/src/resources/objects/tangible/TangibleObject.java b/src/resources/objects/tangible/TangibleObject.java
index cb2e4f3f..5b2e9ad9 100644
--- a/src/resources/objects/tangible/TangibleObject.java
+++ b/src/resources/objects/tangible/TangibleObject.java
@@ -128,6 +128,7 @@ public class TangibleObject extends SWGObject implements Serializable {
@Override
public void initAfterDBLoad() {
super.init();
+ defendersList = new Vector();
messageBuilder = new TangibleMessageBuilder(this);
}
diff --git a/src/services/ConnectionService.java b/src/services/ConnectionService.java
index b5e5e1e7..faf3b513 100644
--- a/src/services/ConnectionService.java
+++ b/src/services/ConnectionService.java
@@ -279,8 +279,10 @@ public class ConnectionService implements INetworkDispatch {
object.setAttachment("disconnectTask", null);
List> schedulers = core.playerService.getSchedulers().get(object.getObjectID());
- schedulers.forEach(s -> s.cancel(true));
- schedulers.clear();
+ if(schedulers != null) {
+ schedulers.forEach(s -> s.cancel(true));
+ schedulers.clear();
+ }
core.playerService.getSchedulers().remove(object.getObjectID());
core.getSWGObjectODB().put(object.getObjectID(), object);
diff --git a/src/services/DevService.java b/src/services/DevService.java
index 8f3822bb..5f99911c 100644
--- a/src/services/DevService.java
+++ b/src/services/DevService.java
@@ -86,12 +86,13 @@ public class DevService implements INetworkDispatch {
suiOptions.put((long) 23, "Jedi Items");
suiOptions.put((long) 26, "Installations");
suiOptions.put((long) 110, "Survey Devices");
+ if(creature.getPlayerObject().getProfession().equals("bounty_hunter_1a")) suiOptions.put((long) 123, "Tracking Droids");
if(creature.getClient().isGM()) suiOptions.put((long) 120, "House Deeds");
if(creature.getClient().isGM()) suiOptions.put((long) 125, "Crafting Tools");
if(creature.getClient().isGM()) suiOptions.put((long) 130, "Vehicle Deeds");
if(creature.getClient().isGM()) suiOptions.put((long) 121, "Sandbox City");
if(creature.getClient().isGM()) suiOptions.put((long) 122, "Jedi Ruins");
-
+
break;
case 3: // [Items] Weapons
suiOptions.put((long) 30, "Jedi Weapons");
@@ -103,6 +104,7 @@ public class DevService implements INetworkDispatch {
suiOptions.put((long) 40, "Unity Ring");
suiOptions.put((long) 41, "Tusken Rucksack");
suiOptions.put((long) 42, "Heroism Jewlery Set");
+ suiOptions.put((long) 43, "Breath of Heaven");
break;
case 5: // [Items] Armor
suiOptions.put((long) 50, "Assault Armor");
@@ -342,6 +344,12 @@ public class DevService implements INetworkDispatch {
inventory.add(heroismBraceletRight);
inventory.add(heroismBraceletLeft);
return;
+ case 43:
+ TangibleObject drink = (TangibleObject) core.objectService.createObject("object/tangible/food/crafted/shared_drink_breath_of_heaven.iff", planet);
+ drink.setFloatAttribute("cat_stat_mod_bonus.@stat_n:constitution_modified", 100);
+ drink.setFloatAttribute("cat_stat_mod_bonus.@stat_n:dodge", 3);
+ inventory.add(drink);
+ return;
case 50: // [Items] Assault Armor
sendCharacterBuilderSUI(player, 6);
return;
@@ -1168,11 +1176,23 @@ public class DevService implements INetworkDispatch {
case 121:
NGECore.getInstance().playerCityService.buildSandboxTestCity(player);
+ return;
case 122:
Point3D position = new Point3D(4086,15,5554);
core.simulationService.transferToPlanet(player, core.terrainService.getPlanetByName("dantooine"), position, player.getOrientation(), null);
-
+ return;
+
+ case 123:
+ TangibleObject arakydDroids = (TangibleObject) core.objectService.createObject("object/tangible/mission/shared_mission_bounty_droid_probot.iff", planet);
+ //arakydDroids.setStackable(true);
+ //arakydDroids.setStackCount(10);
+ inventory.add(arakydDroids);
+
+ TangibleObject seekerDroids = (TangibleObject) core.objectService.createObject("object/tangible/mission/shared_mission_bounty_droid_seeker.iff", planet);
+ inventory.add(seekerDroids);
+ return;
+
case 125:
TangibleObject genericCraftingTool = (TangibleObject) core.objectService.createObject("object/tangible/crafting/station/shared_generic_tool.iff", planet);
genericCraftingTool.setCustomName("Generic Crafting Tool");
diff --git a/src/services/PlayerService.java b/src/services/PlayerService.java
index 8cc06788..d66ac23a 100644
--- a/src/services/PlayerService.java
+++ b/src/services/PlayerService.java
@@ -1306,6 +1306,13 @@ public class PlayerService implements INetworkDispatch {
bounty = 1000000;
}
+ if (core.getBountiesODB().contains(attacker.getObjectID())) {
+ if (((BountyListItem) core.getBountiesODB().get(attacker.getObjectID())).getCreditReward() >= 20000000) {
+ victim.sendSystemMessage("@bounty_hunter:max_bounty", DisplayType.Broadcast);
+ return;
+ }
+ }
+
// Try removing bounty amount from the bank first then cash. Remove amount accordingly if bank/cash is less than placed bounty.
if (bounty > victim.getBankCredits()) {
int difference = bounty - victim.getBankCredits();
@@ -1321,12 +1328,15 @@ public class PlayerService implements INetworkDispatch {
if (!core.missionService.addToExistingBounty(attacker.getObjectId(), victim.getObjectId(), bounty))
core.missionService.createNewBounty(attacker, victim.getObjectId(), bounty);
+
+ victim.sendSystemMessage("You have placed a bounty for " + bounty + " credits on the head of " + attacker.getCustomName(), (byte) 0);
}
}
});
bountyWindow.setProperty("txtInput:NumericInteger", "true");
bountyWindow.setProperty("txtInput:MaxLength", "7");
+ bountyWindow.setProperty("inputBox:Size", "306,306");
core.suiService.openSUIWindow(bountyWindow);
}
diff --git a/src/services/StaticService.java b/src/services/StaticService.java
index d41c26d8..3479748d 100644
--- a/src/services/StaticService.java
+++ b/src/services/StaticService.java
@@ -168,7 +168,7 @@ public class StaticService implements INetworkDispatch {
}
} else {
if (cell == null) {
- System.err.println("StaticService: Cell not found");
+ System.err.println("StaticService: Cell not found for: " + template);
return object;
}
diff --git a/src/services/SurveyService.java b/src/services/SurveyService.java
index 39b75519..a2e3cdb5 100644
--- a/src/services/SurveyService.java
+++ b/src/services/SurveyService.java
@@ -174,7 +174,7 @@ public class SurveyService implements INetworkDispatch {
containerObject.initializeStats(sampleResource);
containerObject.setProprietor(crafter);
SWGObject crafterInventory = crafter.getSlottedObject("inventory");
- container.setStackCount(stackCount,crafter);
+ containerObject.setStackCount(stackCount,crafter);
crafterInventory.add(containerObject);
player.setRecentContainer(containerObject);
}
diff --git a/src/services/ai/AIActor.java b/src/services/ai/AIActor.java
index 99363374..87745fe7 100644
--- a/src/services/ai/AIActor.java
+++ b/src/services/ai/AIActor.java
@@ -64,6 +64,8 @@ public class AIActor {
private ScheduledFuture> regenTask;
private ScheduledFuture> aggroCheckTask;
private boolean isStalking = false;
+ private byte milkState = 0;
+ private boolean hasBeenHarvested = false;
public AIActor(CreatureObject creature, Point3D spawnPosition, ScheduledExecutorService scheduler) {
this.creature = creature;
@@ -109,18 +111,25 @@ public class AIActor {
public void setSpawnPosition(Point3D spawnPosition) {
this.spawnPosition = spawnPosition;
}
-
+
public void addDefender(CreatureObject defender) {
+ addDefender(defender, false);
+ }
+
+
+ public void addDefender(CreatureObject defender, boolean isAssisting) {
creature.addDefender(defender);
if(followObject == null)
setFollowObject(defender);
setCurrentState(new AttackState());
- NGECore.getInstance().simulationService.get(creature.getPlanet(), creature.getWorldPosition().x, creature.getWorldPosition().z, 30).stream().filter((obj) ->
- obj instanceof CreatureObject &&
- obj.getAttachment("AI") != null &&
- ((AIActor) obj.getAttachment("AI")).getMobileTemplate().getSocialGroup().equals(getMobileTemplate().getSocialGroup()) &&
- obj.inRange(creature.getWorldPosition(), ((AIActor) obj.getAttachment("AI")).getMobileTemplate().getAssistRange())
- ).forEach((obj) -> ((AIActor) obj.getAttachment("AI")).addDefender(defender));
+ if(!isAssisting) {
+ NGECore.getInstance().simulationService.get(creature.getPlanet(), creature.getWorldPosition().x, creature.getWorldPosition().z, 30).stream().filter((obj) ->
+ obj instanceof CreatureObject &&
+ obj.getAttachment("AI") != null &&
+ ((AIActor) obj.getAttachment("AI")).getMobileTemplate().getSocialGroup().equals(getMobileTemplate().getSocialGroup()) &&
+ obj.inRange(creature.getWorldPosition(), ((AIActor) obj.getAttachment("AI")).getMobileTemplate().getAssistRange())
+ ).forEach((obj) -> ((AIActor) obj.getAttachment("AI")).addDefender(defender, true));
+ }
}
public void removeDefender(CreatureObject defender) {
@@ -284,6 +293,7 @@ public class AIActor {
public void scheduleDespawn() {
scheduler.schedule(() -> {
+ aggroCheckTask.cancel(true);
regenTask.cancel(true);
damageMap.clear();
followObject = null;
@@ -308,5 +318,29 @@ public class AIActor {
public void setStalking(boolean isStalking) {
this.isStalking = isStalking;
}
+
+ public byte getMilkState() {
+ synchronized(creature.getMutex()) {
+ return milkState;
+ }
+ }
+
+ public void setMilkState(byte milkState) {
+ synchronized(creature.getMutex()) {
+ this.milkState = milkState;
+ }
+ }
+
+ public boolean hasBeenHarvested() {
+ synchronized(creature.getMutex()) {
+ return hasBeenHarvested;
+ }
+ }
+
+ public void setHasBeenHarvested(boolean hasBeenHarvested) {
+ synchronized(creature.getMutex()) {
+ this.hasBeenHarvested = hasBeenHarvested;
+ }
+ }
}
diff --git a/src/services/combat/CombatService.java b/src/services/combat/CombatService.java
index cfebc8c5..fc61e166 100644
--- a/src/services/combat/CombatService.java
+++ b/src/services/combat/CombatService.java
@@ -43,11 +43,15 @@ import protocol.swg.objectControllerObjects.StartTask;
import resources.buffs.Buff;
import resources.buffs.DamageOverTime;
import resources.common.FileUtilities;
+import resources.common.OutOfBand;
+import resources.common.ProsePackage;
import resources.datatables.Options;
import resources.datatables.Elemental;
import resources.datatables.Posture;
import resources.datatables.WeaponType;
+import resources.objectives.BountyMissionObjective;
import resources.objects.creature.CreatureObject;
+import resources.objects.mission.MissionObject;
import resources.objects.player.PlayerObject;
import resources.objects.tangible.TangibleObject;
import resources.objects.waypoint.WaypointObject;
@@ -800,8 +804,10 @@ public class CombatService implements INetworkDispatch {
}, target.getIncapTimer(), TimeUnit.SECONDS);
target.setIncapTask(incapTask);
core.buffService.addBuffToCreature(target, "incapWeaken", target);
- if(target.getSlottedObject("ghost") != null)
- attacker.sendSystemMessage("You incapacitate " + target.getCustomName() + ".", (byte) 0);
+ if(target.getSlottedObject("ghost") != null) {
+ target.sendSystemMessage(new OutOfBand(new ProsePackage("base_player", "prose_victim_incap", attacker.getCustomName())), (byte) 0);
+ attacker.sendSystemMessage(new OutOfBand(new ProsePackage("base_player", "prose_target_incap", target.getCustomName())), (byte) 0);
+ }
return;
} else if(target.getHealth() - damage <= 0 && target.getAttachment("AI") != null) {
synchronized(target.getMutex()) {
@@ -983,17 +989,50 @@ public class CombatService implements INetworkDispatch {
target.stopIncapTask();
target.setIncapTask(null);
target.setPosture((byte) 14);
- attacker.sendSystemMessage("You have killed " + target.getCustomName() + ".", (byte) 0);
- target.sendSystemMessage("@base_player:victim_dead", (byte) 0);
+
+ if (target.getSlottedObject("ghost") != null && attacker.getSlottedObject("ghost") != null) {
+ boolean bountyWindow = true;
+ if (target.getPlayerObject().getBountyMissionId() != 0) {
+ MissionObject mission = (MissionObject) core.objectService.getObject(target.getPlayerObject().getBountyMissionId());
+ if (mission != null && mission.getBountyObjId() == attacker.getObjectId()) {
+ bountyWindow = false;
+ target.sendSystemMessage(new OutOfBand(new ProsePackage("bounty_hunter", "bounty_failed_hunter", attacker.getCustomName())), (byte) 0);
+
+ ProsePackage pp = new ProsePackage("bounty_hunter", "bounty_failed_target", attacker.getCustomName());
+ pp.setToCustomString("their");
+ attacker.sendSystemMessage(new OutOfBand(pp), (byte) 0);
+
+ core.missionService.handleMissionAbort(target, mission);
+ }
+ } else if (attacker.getPlayerObject().getBountyMissionId() != 0) {
+ MissionObject mission = (MissionObject) core.objectService.getObject(attacker.getPlayerObject().getBountyMissionId());
+ if (mission != null && mission.getBountyObjId() == target.getObjectId()) {
+ bountyWindow = false;
+ ProsePackage targetProse = new ProsePackage("bounty_hunter", "bounty_success_target", attacker.getCustomName());
+ targetProse.setDiInteger(mission.getCreditReward());
+ target.sendSystemMessage(new OutOfBand(targetProse), (byte) 0);
+
+ ProsePackage attackerProse = new ProsePackage("bounty_hunter", "bounty_success_hunter", target.getCustomName());
+ attackerProse.setToCustomString("their"); // should be his or her: http://youtu.be/BqeDQQSETJI?t=2m19s
+ attackerProse.setDiInteger(mission.getCreditReward());
+ attacker.sendSystemMessage(new OutOfBand(attackerProse), (byte) 0);
+
+ core.missionService.handleMissionComplete(attacker, mission);
+ }
+ }
+
+ if(target.getDuelList().contains(attacker))
+ bountyWindow = false;
+ handleEndDuel(target, attacker, false);
+
+ if (bountyWindow) core.playerService.sendSetBountyWindow(target, attacker);
+ } else { attacker.sendSystemMessage("You have killed " + target.getCustomName() + ".", (byte) 0); }
+
attacker.removeDefender(target);
target.removeDefender(attacker);
target.setSpeedMultiplierBase(0);
target.setTurnRadius(0);
-
- if(!target.getDuelList().contains(attacker) && attacker.getSlottedObject("ghost") != null)
- core.playerService.sendSetBountyWindow(target, attacker);
- else
- handleEndDuel(target, attacker, false);
+ target.sendSystemMessage(new OutOfBand(new ProsePackage("base_player", "prose_victim_dead", attacker.getCustomName())), (byte) 0);
core.playerService.sendCloningWindow(target, attacker.getSlottedObject("ghost") != null);
}
diff --git a/src/services/gcw/FactionService.java b/src/services/gcw/FactionService.java
index 26749914..1d8534cb 100644
--- a/src/services/gcw/FactionService.java
+++ b/src/services/gcw/FactionService.java
@@ -276,18 +276,18 @@ public class FactionService implements INetworkDispatch {
long targetId = target.getObjectID();
- if (object.getSlottedObject("mission_bag") != null) {
- object.getSlottedObject("mission_bag").viewChildren(object, false, false, (mission) -> {
- if (((MissionObject) mission).getBountyObjId() == targetId) {
+ if (object.getSlottedObject("datapad") != null) {
+ object.getSlottedObject("datapad").viewChildren(object, false, false, (mission) -> {
+ if (mission instanceof MissionObject && ((MissionObject) mission).getBountyObjId() == targetId) {
ref.set(PvpStatus.Attackable | PvpStatus.Aggressive);
}
});
}
if (ghost != null && ghost.getProfession().contains("smuggler") &&
- target.getSlottedObject("mission_bag") != null) {
- target.getSlottedObject("mission_bag").viewChildren(target, false, false, (mission) -> {
- if (((MissionObject) mission).getBountyObjId() == object.getObjectID()) {
+ target.getSlottedObject("datapad") != null) {
+ target.getSlottedObject("datapad").viewChildren(target, false, false, (mission) -> {
+ if (mission instanceof MissionObject && ((MissionObject) mission).getBountyObjId() == object.getObjectID()) {
ref.set(PvpStatus.Attackable);
}
});
diff --git a/src/services/mission/MissionService.java b/src/services/mission/MissionService.java
index c2fc0371..a4fc802b 100644
--- a/src/services/mission/MissionService.java
+++ b/src/services/mission/MissionService.java
@@ -153,11 +153,8 @@ public class MissionService implements INetworkDispatch {
if (terminalType == TerminalType.GENERIC) {
handleMissionListRequest(core.objectService.getObject(request.getObjectId()), request.getTickCount(), TerminalType.GENERIC);
} else if (terminalType == TerminalType.BOUNTY) {
- if (!object.hasSkill("class_bountyhunter_phase1_novice")) {
- object.sendSystemMessage("@mission/mission_generic:not_bounty_hunter_terminal", (byte) 0);
- } /*else {
- handleMissionListRequest(core.objectService.getObject(request.getObjectId()), request.getTickCount(), TerminalType.BOUNTY);
- }*/
+ if (!object.hasSkill("class_bountyhunter_phase1_novice")) { object.sendSystemMessage("@mission/mission_generic:not_bounty_hunter_terminal", (byte) 0); }
+ else { handleMissionListRequest(core.objectService.getObject(request.getObjectId()), request.getTickCount(), TerminalType.BOUNTY); }
} else if (terminalType == TerminalType.ENTERTAINER) {
} else if (terminalType == TerminalType.ARTISAN) {
@@ -323,6 +320,15 @@ public class MissionService implements INetworkDispatch {
});
}
+ public void handleMissionComplete(CreatureObject creature, MissionObject mission) {
+ MissionObjective objective = mission.getObjective();
+
+ if (objective == null)
+ return;
+
+ objective.complete(core, creature);
+ }
+
private boolean handleMissionAccept(CreatureObject creature, MissionObject mission) {
SWGObject missionBag = creature.getSlottedObject("mission_bag");
@@ -435,11 +441,14 @@ public class MissionService implements INetworkDispatch {
if (bountyList.size() > 0) {
boolean gotBounty = false;
- while (!gotBounty) {
+ int attempts = 0;
+ while (!gotBounty && attempts < 5) {
bountyTarget = getRandomBounty();
- if (bountyTarget == null || bountyTarget.getAssignedHunters().size() >= 3 || bountyTarget.getCreditReward() < 20000)
+ if (bountyTarget == null || bountyTarget.getAssignedHunters().size() >= 3 || bountyTarget.getCreditReward() < 20000 || bountyTarget.getObjectId() == player.getObjectId()) {
+ attempts++;
continue;
+ }
else
gotBounty = true;
}
@@ -561,13 +570,9 @@ public class MissionService implements INetworkDispatch {
}
public boolean removeBounty(long bountyTarget, boolean listRemove) {
- Transaction txn = bountiesODB.getEnvironment().beginTransaction(null, null);
-
if (listRemove)
bountyList.remove(bountiesODB.get(bountyTarget));
-
bountiesODB.remove(bountyTarget);
- txn.commitSync();
return true;
}
diff --git a/src/services/object/ObjectService.java b/src/services/object/ObjectService.java
index 5f9d8f6b..c3ec991e 100644
--- a/src/services/object/ObjectService.java
+++ b/src/services/object/ObjectService.java
@@ -914,9 +914,8 @@ public class ObjectService implements INetworkDispatch {
if(!core.getConfig().getString("MOTD").equals(""))
creature.sendSystemMessage(core.getConfig().getString("MOTD"), (byte) 2);
- BountyListItem bounty = (BountyListItem) core.getBountiesODB().get(creature.getObjectID());
- if (bounty != null)
- core.missionService.getBountyList().add(bounty);
+ if (core.getBountiesODB().contains(creature.getObjectId()))
+ core.missionService.getBountyList().add((BountyListItem) core.getBountiesODB().get(creature.getObjectId()));
if (creature.getSlottedObject("datapad") != null) {
creature.getSlottedObject("datapad").viewChildren(creature, true, false, new Traverser() {
diff --git a/src/services/resources/ResourceService.java b/src/services/resources/ResourceService.java
index d6719c0b..09d9c9c5 100644
--- a/src/services/resources/ResourceService.java
+++ b/src/services/resources/ResourceService.java
@@ -28,6 +28,7 @@ import java.util.Random;
import java.util.Vector;
import java.util.concurrent.Executors;
import java.util.concurrent.ScheduledExecutorService;
+import java.util.concurrent.TimeUnit;
import com.sleepycat.persist.EntityCursor;
@@ -40,11 +41,15 @@ import engine.resources.scene.Point3D;
import engine.resources.scene.Quaternion;
import engine.resources.service.INetworkDispatch;
import engine.resources.service.INetworkRemoteEvent;
+import resources.common.OutOfBand;
+import resources.common.ProsePackage;
+import resources.datatables.MilkState;
import resources.objects.creature.CreatureObject;
import resources.objects.harvester.HarvesterObject;
import resources.objects.resource.GalacticResource;
import resources.objects.resource.ResourceContainerObject;
import resources.objects.resource.ResourceRoot;
+import services.ai.AIActor;
/**
* @author Charon
@@ -122,7 +127,8 @@ public class ResourceService implements INetworkDispatch {
createCollections3();
}
// }
-
+ core.commandService.registerCommand("harvestcorpse");
+ core.commandService.registerCommand("milkcreature");
core.commandService.registerCommand("resourcecontainersplit");
core.commandService.registerCommand("resourcecontainertransfer");
core.commandService.registerCommand("factorycratesplit");
@@ -7244,7 +7250,7 @@ public class ResourceService implements INetworkDispatch {
resourceRoot = new ResourceRoot();
resourceRoot.setResourceFileName("meat_carnivore_corellia");
- resourceRoot.setResourceClass("Canivore Meat");
+ resourceRoot.setResourceClass("Carnivore Meat");
resourceRoot.setResourceType("Corellian");
resourceRoot.setgeneralType((byte) GalacticResource.GENERAL_MEAT);
resourceRoot.setContainerType((byte) ResourceRoot.CONTAINER_TYPE_ORGANIC_FOOD);
@@ -7260,7 +7266,7 @@ public class ResourceService implements INetworkDispatch {
resourceRoot = new ResourceRoot();
resourceRoot.setResourceFileName("meat_carnivore_dantooine");
- resourceRoot.setResourceClass("Canivore Meat");
+ resourceRoot.setResourceClass("Carnivore Meat");
resourceRoot.setResourceType("Dantooine");
resourceRoot.setgeneralType((byte) GalacticResource.GENERAL_MEAT);
resourceRoot.setContainerType((byte) ResourceRoot.CONTAINER_TYPE_ORGANIC_FOOD);
@@ -7275,7 +7281,7 @@ public class ResourceService implements INetworkDispatch {
resourceRoot = new ResourceRoot();
resourceRoot.setResourceFileName("meat_carnivore_dathomir");
- resourceRoot.setResourceClass("Canivore Meat");
+ resourceRoot.setResourceClass("Carnivore Meat");
resourceRoot.setResourceType("Dathomirian");
resourceRoot.setgeneralType((byte) GalacticResource.GENERAL_MEAT);
resourceRoot.setContainerType((byte) ResourceRoot.CONTAINER_TYPE_ORGANIC_FOOD);
@@ -7290,7 +7296,7 @@ public class ResourceService implements INetworkDispatch {
resourceRoot = new ResourceRoot();
resourceRoot.setResourceFileName("meat_carnivore_endor");
- resourceRoot.setResourceClass("Canivore Meat");
+ resourceRoot.setResourceClass("Carnivore Meat");
resourceRoot.setResourceType("Endorian");
resourceRoot.setgeneralType((byte) GalacticResource.GENERAL_MEAT);
resourceRoot.setContainerType((byte) ResourceRoot.CONTAINER_TYPE_ORGANIC_FOOD);
@@ -7305,7 +7311,7 @@ public class ResourceService implements INetworkDispatch {
resourceRoot = new ResourceRoot();
resourceRoot.setResourceFileName("meat_carnivore_lok");
- resourceRoot.setResourceClass("Canivore Meat");
+ resourceRoot.setResourceClass("Carnivore Meat");
resourceRoot.setResourceType("Lokian");
resourceRoot.setgeneralType((byte) GalacticResource.GENERAL_MEAT);
resourceRoot.setContainerType((byte) ResourceRoot.CONTAINER_TYPE_ORGANIC_FOOD);
@@ -7320,7 +7326,7 @@ public class ResourceService implements INetworkDispatch {
resourceRoot = new ResourceRoot();
resourceRoot.setResourceFileName("meat_carnivore_naboo");
- resourceRoot.setResourceClass("Canivore Meat");
+ resourceRoot.setResourceClass("Carnivore Meat");
resourceRoot.setResourceType("Nabooian");
resourceRoot.setgeneralType((byte) GalacticResource.GENERAL_MEAT);
resourceRoot.setContainerType((byte) ResourceRoot.CONTAINER_TYPE_ORGANIC_FOOD);
@@ -7335,7 +7341,7 @@ public class ResourceService implements INetworkDispatch {
resourceRoot = new ResourceRoot();
resourceRoot.setResourceFileName("meat_carnivore_rori");
- resourceRoot.setResourceClass("Canivore Meat");
+ resourceRoot.setResourceClass("Carnivore Meat");
resourceRoot.setResourceType("Rori");
resourceRoot.setgeneralType((byte) GalacticResource.GENERAL_MEAT);
resourceRoot.setContainerType((byte) ResourceRoot.CONTAINER_TYPE_ORGANIC_FOOD);
@@ -7350,7 +7356,7 @@ public class ResourceService implements INetworkDispatch {
resourceRoot = new ResourceRoot();
resourceRoot.setResourceFileName("meat_carnivore_talus");
- resourceRoot.setResourceClass("Canivore Meat");
+ resourceRoot.setResourceClass("Carnivore Meat");
resourceRoot.setResourceType("Talusian");
resourceRoot.setgeneralType((byte) GalacticResource.GENERAL_MEAT);
resourceRoot.setContainerType((byte) ResourceRoot.CONTAINER_TYPE_ORGANIC_FOOD);
@@ -7365,7 +7371,7 @@ public class ResourceService implements INetworkDispatch {
resourceRoot = new ResourceRoot();
resourceRoot.setResourceFileName("meat_carnivore_tatooine");
- resourceRoot.setResourceClass("Canivore Meat");
+ resourceRoot.setResourceClass("Carnivore Meat");
resourceRoot.setResourceType("Tatooinian");
resourceRoot.setgeneralType((byte) GalacticResource.GENERAL_MEAT);
resourceRoot.setContainerType((byte) ResourceRoot.CONTAINER_TYPE_ORGANIC_FOOD);
@@ -7380,7 +7386,7 @@ public class ResourceService implements INetworkDispatch {
resourceRoot = new ResourceRoot();
resourceRoot.setResourceFileName("meat_carnivore_yavin4");
- resourceRoot.setResourceClass("Canivore Meat");
+ resourceRoot.setResourceClass("Carnivore Meat");
resourceRoot.setResourceType("Yavinian");
resourceRoot.setgeneralType((byte) GalacticResource.GENERAL_MEAT);
resourceRoot.setContainerType((byte) ResourceRoot.CONTAINER_TYPE_ORGANIC_FOOD);
@@ -9324,7 +9330,7 @@ public class ResourceService implements INetworkDispatch {
resourceRoot = new ResourceRoot();
resourceRoot.setResourceFileName("meat_carnivore_kashyyyk");
- resourceRoot.setResourceClass("Herbivore Meat");
+ resourceRoot.setResourceClass("Carnivore Meat");
resourceRoot.setResourceType("Kashyyykian");
resourceRoot.setgeneralType((byte) GalacticResource.GENERAL_MEAT);
resourceRoot.setContainerType((byte) ResourceRoot.CONTAINER_TYPE_ORGANIC_FOOD);
@@ -11429,28 +11435,216 @@ public class ResourceService implements INetworkDispatch {
}
// Utility method to quickly spawn resource containers into the inventory
- public ResourceContainerObject spawnSpecificResourceContainer(String spawnType, CreatureObject crafter,int stackCount){
- ResourceContainerObject containerObject = null;
- for (GalacticResource sampleResource : allSpawnedResources){
- if (sampleResource.getResourceRoot().getResourceClass().contains(spawnType)){
- String resourceContainerIFF = ResourceRoot.CONTAINER_TYPE_IFF_SIGNIFIER[sampleResource.getResourceRoot().getContainerType()];
- containerObject = (ResourceContainerObject) core.objectService.createObject(resourceContainerIFF, crafter.getPlanet());
- containerObject.setProprietor(crafter);
- containerObject.setStackCount(stackCount,false);
- //int stackCount = core.resourceService.getResourceSampleQuantity(crafter, sampleResource);
- containerObject.initializeStats(sampleResource);
- int resCRC = CRC.StringtoCRC(resourceContainerIFF);
- containerObject.setIffFileName(resourceContainerIFF);
- long objectId = containerObject.getObjectID();
- SWGObject crafterInventory = crafter.getSlottedObject("inventory");
- crafterInventory.add(containerObject);
- return containerObject;
- }
+ public ResourceContainerObject spawnSpecificResourceContainer(String spawnType, CreatureObject crafter,int stackCount){
+ ResourceContainerObject containerObject = null;
+ for (GalacticResource sampleResource : allSpawnedResources){
+ if (sampleResource.getResourceRoot().getResourceClass().contains(spawnType)){
+ String resourceContainerIFF = ResourceRoot.CONTAINER_TYPE_IFF_SIGNIFIER[sampleResource.getResourceRoot().getContainerType()];
+ containerObject = (ResourceContainerObject) core.objectService.createObject(resourceContainerIFF, crafter.getPlanet());
+ containerObject.setProprietor(crafter);
+ containerObject.setStackCount(stackCount,false);
+ //int stackCount = core.resourceService.getResourceSampleQuantity(crafter, sampleResource);
+ containerObject.initializeStats(sampleResource);
+ int resCRC = CRC.StringtoCRC(resourceContainerIFF);
+ containerObject.setIffFileName(resourceContainerIFF);
+ long objectId = containerObject.getObjectID();
+ SWGObject crafterInventory = crafter.getSlottedObject("inventory");
+ crafterInventory.add(containerObject);
+ return containerObject;
}
- return containerObject;
+ }
+ return containerObject;
+ }
+
+ public void giveResource(CreatureObject actor, GalacticResource res, int amount) {
+
+ ResourceContainerObject foundContainer = core.surveyService.findResourceContainerInInventory(actor, res);
+
+ if(foundContainer != null && amount < ResourceContainerObject.maximalStackCapacity - foundContainer.getStackCount()) {
+ foundContainer.setStackCount(foundContainer.getStackCount() + amount, actor);
+ } else {
+ SWGObject inventory = actor.getSlottedObject("inventory");
+ String resourceContainerIFF = ResourceRoot.CONTAINER_TYPE_IFF_SIGNIFIER[res.getResourceRoot().getContainerType()];
+ ResourceContainerObject containerObject = (ResourceContainerObject) core.objectService.createObject(resourceContainerIFF, actor.getPlanet());
+ containerObject.initializeStats(res);
+ containerObject.setProprietor(actor);
+ containerObject.setStackCount(amount, actor);
+ inventory.add(containerObject);
}
- public Vector getCompleteResourceNameHistory() {
- return completeResourceNameHistory;
+ }
+
+ public boolean canMilk(CreatureObject actor, CreatureObject target) {
+
+ if(target.getPosture() == 14 || !actor.inRange(target.getWorldPosition(), 5) || actor.getCombatFlag() == 1 || target.getCombatFlag() == 1)
+ return false;
+
+ AIActor ai = (AIActor) target.getAttachment("AI");
+
+ if(ai.getMobileTemplate().getMilkAmount() <= 0 || ai.getMobileTemplate().getMilkType() == null || ai.getMilkState() == MilkState.MILKED || ai.getMilkState() == MilkState.MILKINGINPROGRESS)
+ return false;
+
+ return true;
+
+ }
+
+ public boolean canHarvest(CreatureObject actor, CreatureObject target) {
+
+ if(target.getPosture() != 14)
+ return false;
+
+ AIActor ai = (AIActor) target.getAttachment("AI");
+
+ if(ai.getMobileTemplate().getMeatAmount() <= 0 && ai.getMobileTemplate().getBoneAmount() <= 0 && ai.getMobileTemplate().getHideAmount() <= 0)
+ return false;
+
+ if(target.getKiller() != actor && !(actor.getGroupId() == target.getGroupId() && actor.getGroupId() != 0))
+ return false;
+
+ return true;
+
+ }
+
+ public void doHarvest(CreatureObject actor, CreatureObject target, String type) {
+
+ AIActor ai = (AIActor) target.getAttachment("AI");
+
+ if(!actor.inRange(target.getWorldPosition(), 7)) {
+ actor.sendSystemMessage("You are too far away to harvest the creature.", (byte) 0);
+ return;
}
+
+ if(ai.hasBeenHarvested()) {
+ actor.sendSystemMessage("@skl_use:nothing_to_harvest", (byte) 0);
+ return;
+ }
+
+ ai.setHasBeenHarvested(true);
+
+ String resType = "";
+ int resAmount = 0;
+
+ switch(type) {
+
+ case "hide":
+ resType = ai.getMobileTemplate().getHideType();
+ resAmount = ai.getMobileTemplate().getHideAmount();
+ break;
+ case "meat":
+ resType = ai.getMobileTemplate().getMeatType();
+ resAmount = ai.getMobileTemplate().getMeatAmount();
+ break;
+ case "bone":
+ resType = ai.getMobileTemplate().getBoneType();
+ resAmount = ai.getMobileTemplate().getBoneAmount();
+ break;
+
+ }
+
+ resAmount += (resAmount * (actor.getSkillModBase("creature_harvesting") / 100));
+ GalacticResource res = grabResourceByClass(resType, target.getPlanetId());
+
+ if(res == null) {
+ actor.sendSystemMessage("@skl_use:nothing_to_harvest", (byte) 0);
+ ai.setHasBeenHarvested(false);
+ return;
+ }
+
+ float density = res.deliverConcentrationForSurvey(target.getPlanetId(), target.getWorldPosition().x, target.getWorldPosition().z);
+
+ if(density >= 0.8f) {
+ resAmount *= 1.25f;
+ } else if(density >= 0.6f) {
+ resAmount *= 1.f;
+ } else if(density >= 0.4f) {
+ resAmount *= 0.75f;
+ } else {
+ resAmount *= 0.5f;
+ }
+
+ giveResource(actor, res, resAmount);
+ actor.sendSystemMessage("@skl_use:corpse_harvest_success", (byte) 0);
+
+ }
+
+ public void doMilk(CreatureObject actor, CreatureObject target) {
+
+ AIActor ai = (AIActor) target.getAttachment("AI");
+ ai.setMilkState(MilkState.MILKINGINPROGRESS);
+ actor.sendSystemMessage("@skl_use:milk_begin", (byte) 0);
+
+ scheduler.schedule(() -> {
+
+ if(actor.getInventoryItemCount() >= 80) {
+ actor.sendSystemMessage("@skl_use:milk_inventory_full", (byte) 0);
+ ai.setMilkState(MilkState.NOTYETMILKED);
+ return;
+ }
+
+ if(target.getPosture() == 14) {
+ actor.sendSystemMessage("@skl_use:milk_cant_milk_the_dead", (byte) 0);
+ ai.setMilkState(MilkState.NOTYETMILKED);
+ return;
+ }
+
+ if(!actor.inRange(target.getWorldPosition(), 5)) {
+ actor.sendSystemMessage("@skl_use:milk_too_far", (byte) 0);
+ ai.setMilkState(MilkState.NOTYETMILKED);
+ return;
+ }
+
+ if(actor.getCombatFlag() == 1) {
+ actor.sendSystemMessage("@skl_use:milk_combat", (byte) 0);
+ ai.setMilkState(MilkState.NOTYETMILKED);
+ return;
+ }
+
+ if(new Random().nextFloat() <= 0.05f) {
+ actor.sendSystemMessage("@skl_use:milk_not_hidden", (byte) 0);
+ ai.setMilkState(MilkState.NOTYETMILKED);
+ ai.addDefender(actor);
+ return;
+ }
+
+ giveMilk(actor, target);
+
+ }, 10000, TimeUnit.MILLISECONDS);
+
+ }
+
+ public void giveMilk(CreatureObject actor, CreatureObject target) {
+
+ AIActor ai = (AIActor) target.getAttachment("AI");
+ String milkType = ai.getMobileTemplate().getMilkType();
+ int milkAmount = ai.getMobileTemplate().getMilkAmount();
+
+ GalacticResource res = grabResourceByClass(milkType, target.getPlanetId());
+
+ if(res == null) {
+ actor.sendSystemMessage("Can't find milk resource.", (byte) 0);
+ ai.setMilkState(MilkState.NOTYETMILKED);
+ return;
+ }
+
+ float density = res.deliverConcentrationForSurvey(target.getPlanetId(), target.getWorldPosition().x, target.getWorldPosition().z);
+
+ if(density >= 0.8f) {
+ milkAmount *= 1.25f;
+ } else if(density >= 0.6f) {
+ milkAmount *= 1.f;
+ } else if(density >= 0.4f) {
+ milkAmount *= 0.75f;
+ } else {
+ milkAmount *= 0.5f;
+ }
+
+ giveResource(actor, res, milkAmount);
+ ai.setMilkState(MilkState.MILKED);
+ actor.sendSystemMessage("@skl_use:milk_success", (byte) 0);
+
+ }
+
+ public Vector getCompleteResourceNameHistory() {
+ return completeResourceNameHistory;
+ }
}
diff --git a/src/services/spawn/MobileTemplate.java b/src/services/spawn/MobileTemplate.java
index 61098040..564a2be4 100644
--- a/src/services/spawn/MobileTemplate.java
+++ b/src/services/spawn/MobileTemplate.java
@@ -51,9 +51,11 @@ public class MobileTemplate {
private int minSpawnDistance = 0;
private int maxSpawnDistance = 0;
private boolean deathblow = false;
- private String socialGroup; // see prima guide
+ private String socialGroup = ""; // see prima guide
private int assistRange; // use prima guide for ranges
private boolean isStalker = false;
+ private String meatType, milkType, boneType, hideType;
+ private int meatAmount, milkAmount, boneAmount, hideAmount;
public Vector getTemplates() {
return templates;
@@ -262,4 +264,68 @@ public class MobileTemplate {
public void setStalker(boolean isStalker) {
this.isStalker = isStalker;
}
+
+ public String getMeatType() {
+ return meatType;
+ }
+
+ public void setMeatType(String meatType) {
+ this.meatType = meatType;
+ }
+
+ public String getMilkType() {
+ return milkType;
+ }
+
+ public void setMilkType(String milkType) {
+ this.milkType = milkType;
+ }
+
+ public String getBoneType() {
+ return boneType;
+ }
+
+ public void setBoneType(String boneType) {
+ this.boneType = boneType;
+ }
+
+ public String getHideType() {
+ return hideType;
+ }
+
+ public void setHideType(String hideType) {
+ this.hideType = hideType;
+ }
+
+ public int getMeatAmount() {
+ return meatAmount;
+ }
+
+ public void setMeatAmount(int meatAmount) {
+ this.meatAmount = meatAmount;
+ }
+
+ public int getMilkAmount() {
+ return milkAmount;
+ }
+
+ public void setMilkAmount(int milkAmount) {
+ this.milkAmount = milkAmount;
+ }
+
+ public int getBoneAmount() {
+ return boneAmount;
+ }
+
+ public void setBoneAmount(int boneAmount) {
+ this.boneAmount = boneAmount;
+ }
+
+ public int getHideAmount() {
+ return hideAmount;
+ }
+
+ public void setHideAmount(int hideAmount) {
+ this.hideAmount = hideAmount;
+ }
}
diff --git a/src/services/spawn/SpawnService.java b/src/services/spawn/SpawnService.java
index 4008156d..26336387 100644
--- a/src/services/spawn/SpawnService.java
+++ b/src/services/spawn/SpawnService.java
@@ -197,6 +197,7 @@ public class SpawnService {
AIActor actor = new AIActor(creature, creature.getPosition(), scheduler);
creature.setAttachment("AI", actor);
+ creature.setAttachment("radial_filename", "npc/mobile");
actor.setMobileTemplate(mobileTemplate);