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);