From e1b62d63dfd4fab0ad4e2d9d7cc602cc16613b88 Mon Sep 17 00:00:00 2001 From: cdmpse Date: Fri, 19 Sep 2014 20:06:16 -0500 Subject: [PATCH 1/6] Added Underworld Smuggler Tatooine Quests --- .../quests/tatooine/brokerbarak.py | 42 +++++++++++++++++++ scripts/conversation/quests/tatooine/diala.py | 23 ++++++++++ scripts/conversation/quests/tatooine/jalen.py | 23 ++++++++++ scripts/conversation/quests/tatooine/kaleb.py | 23 ++++++++++ scripts/conversation/quests/tatooine/kara.py | 23 ++++++++++ .../conversation/quests/tatooine/sarlin.py | 23 ++++++++++ .../generic/static/tatooine/brokerbarak.py | 4 +- .../mobiles/generic/static/tatooine/diala.py | 34 +++++++++++++++ .../mobiles/generic/static/tatooine/jalen.py | 34 +++++++++++++++ .../mobiles/generic/static/tatooine/kaleb.py | 34 +++++++++++++++ .../mobiles/generic/static/tatooine/kara.py | 34 +++++++++++++++ .../mobiles/generic/static/tatooine/sarlin.py | 33 +++++++++++++++ .../mobiles/tatooine/smuggler_patrol_bh_1.py | 39 +++++++++++++++++ .../object/mobile/smuggler_broker_barak.py | 8 +++- scripts/object/mobile/smuggler_fence_diala.py | 6 +++ scripts/object/mobile/smuggler_fence_jalen.py | 6 +++ scripts/object/mobile/smuggler_fence_kaleb.py | 6 +++ scripts/object/mobile/smuggler_fence_kara.py | 6 +++ .../object/mobile/smuggler_fence_sarlin.py | 6 +++ .../item_smuggler_contraband_crate_01_01.py | 11 +++++ .../events/signals/smugglerEnemyIncap.py | 9 ++++ .../events/signals/smugglerPatrolHelp.py | 9 ++++ scripts/static_spawns/tatooine/bestine.py | 2 +- .../tatooine/mos_eisley_quest.py | 2 + scripts/static_spawns/tatooine/mos_entha.py | 2 + scripts/static_spawns/tatooine/mos_espa.py | 1 + scripts/static_spawns/tatooine/mos_taike.py | 1 + scripts/static_spawns/tatooine/wayfar.py | 4 +- 28 files changed, 442 insertions(+), 6 deletions(-) create mode 100644 scripts/conversation/quests/tatooine/brokerbarak.py create mode 100644 scripts/conversation/quests/tatooine/diala.py create mode 100644 scripts/conversation/quests/tatooine/jalen.py create mode 100644 scripts/conversation/quests/tatooine/kaleb.py create mode 100644 scripts/conversation/quests/tatooine/kara.py create mode 100644 scripts/conversation/quests/tatooine/sarlin.py create mode 100644 scripts/mobiles/generic/static/tatooine/diala.py create mode 100644 scripts/mobiles/generic/static/tatooine/jalen.py create mode 100644 scripts/mobiles/generic/static/tatooine/kaleb.py create mode 100644 scripts/mobiles/generic/static/tatooine/kara.py create mode 100644 scripts/mobiles/generic/static/tatooine/sarlin.py create mode 100644 scripts/mobiles/tatooine/smuggler_patrol_bh_1.py create mode 100644 scripts/object/tangible/quest/item_smuggler_contraband_crate_01_01.py create mode 100644 scripts/quests/events/signals/smugglerEnemyIncap.py create mode 100644 scripts/quests/events/signals/smugglerPatrolHelp.py diff --git a/scripts/conversation/quests/tatooine/brokerbarak.py b/scripts/conversation/quests/tatooine/brokerbarak.py new file mode 100644 index 00000000..3fdc77e0 --- /dev/null +++ b/scripts/conversation/quests/tatooine/brokerbarak.py @@ -0,0 +1,42 @@ +from resources.common import ConversationOption +from resources.common import OutOfBand +from resources.common import ProsePackage +from java.util import Vector +import sys + +def startConversation(core, actor, npc): + player = actor.getPlayerObject() + if player is None: + return + quest = player.getQuest('smuggle_generic_1') + if quest is None or quest.isCompleted(): + options = Vector() + options.add(ConversationOption(OutOfBand.ProsePackage('@conversation/generic_broker_1:s_17'), 0)) # Yes. + options.add(ConversationOption(OutOfBand.ProsePackage('@conversation/generic_broker_1:s_18'), 0)) # Not right now. + core.conversationService.sendConversationMessage(actor, npc, OutOfBand.ProsePackage('@conversation/generic_broker_1:s_14')) + core.conversationService.sendConversationOptions(actor, npc, options, handleOptionsOne) + return + elif player.getFactionStanding() >= 1000: + core.conversationService.sendStopConversation(actor, npc, 'conversation/generic_broker_1', 's_8') + else: + core.conversationService.sendStopConversation(actor, npc, 'conversation/generic_broker_1', 's_4') + return + +def handleOptionsOne(core, actor, npc, selection): + if selection == 0: # Yes. + options = Vector() + options.add(ConversationOption(OutOfBand.ProsePackage('@conversation/generic_broker_1:s_24'), 0)) # OK + core.conversationService.sendConversationMessage(actor, npc, OutOfBand.ProsePackage('@conversation/generic_broker_1:s_22')) + core.conversationService.sendConversationOptions(actor, npc, options, handleOptionsTwo) + elif selection == 1: # Not right now. + core.conversationService.sendStopConversation(actor, npc, 'conversation/generic_broker_1', 's_30') + return + +def handleOptionsTwo(core, actor, npc, selection): + core.conversationService.sendStopConversation(actor, npc, 'conversation/generic_broker_1', 's_26') + core.questService.sendQuestAcceptWindow(actor, 'quest/smuggle_generic_1') + return + +def endConversation(core, actor, npc): + core.conversationService.sendStopConversation(actor, npc, 'conversation/generic_broker_1', 's_4') + return diff --git a/scripts/conversation/quests/tatooine/diala.py b/scripts/conversation/quests/tatooine/diala.py new file mode 100644 index 00000000..885e2283 --- /dev/null +++ b/scripts/conversation/quests/tatooine/diala.py @@ -0,0 +1,23 @@ +from resources.common import ConversationOption +from resources.common import OutOfBand +from resources.common import ProsePackage +from java.util import Vector +import sys + +def startConversation(core, actor, npc): + player = actor.getPlayerObject() + if player is None: + return + quest = player.getQuest('smuggle_generic_1') + if quest is None or quest.isCompleted(): + core.conversationService.sendStopConversation(actor, npc, 'conversation/fence', 's_10') + elif quest.isTaskActive(3) and quest.isTaskCompleted(7): + core.conversationService.sendStopConversation(actor, npc, 'conversation/fence', 's_5') + core.questService.completeTask(actor, quest, 3) + else: + core.conversationService.sendStopConversation(actor, npc, 'conversation/fence', 's_9') + return + +def endConversation(core, actor, npc): + core.conversationService.sendStopConversation(actor, npc, 'conversation/fence', 's_10') + return diff --git a/scripts/conversation/quests/tatooine/jalen.py b/scripts/conversation/quests/tatooine/jalen.py new file mode 100644 index 00000000..b11cd246 --- /dev/null +++ b/scripts/conversation/quests/tatooine/jalen.py @@ -0,0 +1,23 @@ +from resources.common import ConversationOption +from resources.common import OutOfBand +from resources.common import ProsePackage +from java.util import Vector +import sys + +def startConversation(core, actor, npc): + player = actor.getPlayerObject() + if player is None: + return + quest = player.getQuest('smuggle_generic_1') + if quest is None or quest.isCompleted(): + core.conversationService.sendStopConversation(actor, npc, 'conversation/fence', 's_10') + elif quest.isTaskActive(2) and quest.isTaskCompleted(7): + core.conversationService.sendStopConversation(actor, npc, 'conversation/fence', 's_5') + core.questService.completeTask(actor, quest, 2) + else: + core.conversationService.sendStopConversation(actor, npc, 'conversation/fence', 's_9') + return + +def endConversation(core, actor, npc): + core.conversationService.sendStopConversation(actor, npc, 'conversation/fence', 's_10') + return diff --git a/scripts/conversation/quests/tatooine/kaleb.py b/scripts/conversation/quests/tatooine/kaleb.py new file mode 100644 index 00000000..c715af13 --- /dev/null +++ b/scripts/conversation/quests/tatooine/kaleb.py @@ -0,0 +1,23 @@ +from resources.common import ConversationOption +from resources.common import OutOfBand +from resources.common import ProsePackage +from java.util import Vector +import sys + +def startConversation(core, actor, npc): + player = actor.getPlayerObject() + if player is None: + return + quest = player.getQuest('smuggle_generic_1') + if quest is None or quest.isCompleted(): + core.conversationService.sendStopConversation(actor, npc, 'conversation/fence', 's_10') + elif quest.isTaskActive(1) and quest.isTaskCompleted(7): + core.conversationService.sendStopConversation(actor, npc, 'conversation/fence', 's_5') + core.questService.completeTask(actor, quest, 1) + else: + core.conversationService.sendStopConversation(actor, npc, 'conversation/fence', 's_9') + return + +def endConversation(core, actor, npc): + core.conversationService.sendStopConversation(actor, npc, 'conversation/fence', 's_10') + return diff --git a/scripts/conversation/quests/tatooine/kara.py b/scripts/conversation/quests/tatooine/kara.py new file mode 100644 index 00000000..08cc18fc --- /dev/null +++ b/scripts/conversation/quests/tatooine/kara.py @@ -0,0 +1,23 @@ +from resources.common import ConversationOption +from resources.common import OutOfBand +from resources.common import ProsePackage +from java.util import Vector +import sys + +def startConversation(core, actor, npc): + player = actor.getPlayerObject() + if player is None: + return + quest = player.getQuest('smuggle_generic_1') + if quest is None or quest.isCompleted(): + core.conversationService.sendStopConversation(actor, npc, 'conversation/fence', 's_10') + elif quest.isTaskActive(5) and quest.isTaskCompleted(7): + core.conversationService.sendStopConversation(actor, npc, 'conversation/fence', 's_5') + core.questService.completeTask(actor, quest, 5) + else: + core.conversationService.sendStopConversation(actor, npc, 'conversation/fence', 's_9') + return + +def endConversation(core, actor, npc): + core.conversationService.sendStopConversation(actor, npc, 'conversation/fence', 's_10') + return diff --git a/scripts/conversation/quests/tatooine/sarlin.py b/scripts/conversation/quests/tatooine/sarlin.py new file mode 100644 index 00000000..bc9e0623 --- /dev/null +++ b/scripts/conversation/quests/tatooine/sarlin.py @@ -0,0 +1,23 @@ +from resources.common import ConversationOption +from resources.common import OutOfBand +from resources.common import ProsePackage +from java.util import Vector +import sys + +def startConversation(core, actor, npc): + player = actor.getPlayerObject() + if player is None: + return + quest = player.getQuest('smuggle_generic_1') + if quest is None or quest.isCompleted(): + core.conversationService.sendStopConversation(actor, npc, 'conversation/fence', 's_10') + elif quest.isTaskActive(4) and quest.isTaskCompleted(7): + core.conversationService.sendStopConversation(actor, npc, 'conversation/fence', 's_5') + core.questService.completeTask(actor, quest, 4) + else: + core.conversationService.sendStopConversation(actor, npc, 'conversation/fence', 's_9') + return + +def endConversation(core, actor, npc): + core.conversationService.sendStopConversation(actor, npc, 'conversation/fence', 's_10') + return diff --git a/scripts/mobiles/generic/static/tatooine/brokerbarak.py b/scripts/mobiles/generic/static/tatooine/brokerbarak.py index 1e06a7d5..d61a86c5 100644 --- a/scripts/mobiles/generic/static/tatooine/brokerbarak.py +++ b/scripts/mobiles/generic/static/tatooine/brokerbarak.py @@ -11,11 +11,11 @@ from java.util import Vector def addTemplate(core): mobileTemplate = MobileTemplate() - mobileTemplate.setCustomName('Barak') + mobileTemplate.setCreatureName('smuggler_broker_barak') mobileTemplate.setLevel(1) mobileTemplate.setDifficulty(Difficulty.NORMAL) mobileTemplate.setSocialGroup("township") - mobileTemplate.setOptionsBitmask(Options.INVULNERABLE) + mobileTemplate.setOptionsBitmask(Options.INVULNERABLE | Options.CONVERSABLE) templates = Vector() templates.add('object/mobile/shared_smuggler_broker_barak.iff') diff --git a/scripts/mobiles/generic/static/tatooine/diala.py b/scripts/mobiles/generic/static/tatooine/diala.py new file mode 100644 index 00000000..beb58a2b --- /dev/null +++ b/scripts/mobiles/generic/static/tatooine/diala.py @@ -0,0 +1,34 @@ +import sys +from services.spawn import MobileTemplate +from services.spawn import WeaponTemplate +from resources.datatables import WeaponType +from resources.datatables import Difficulty +from resources.datatables import Options +from resources.datatables import FactionStatus +from java.util import Vector + + +def addTemplate(core): + mobileTemplate = MobileTemplate() + + mobileTemplate.setCreatureName('smuggler_fence_diala') + mobileTemplate.setLevel(1) + mobileTemplate.setDifficulty(Difficulty.NORMAL) + mobileTemplate.setSocialGroup("township") + mobileTemplate.setOptionsBitmask(Options.INVULNERABLE | Options.CONVERSABLE) + + templates = Vector() + templates.add('object/mobile/shared_smuggler_fence_diala.iff') + mobileTemplate.setTemplates(templates) + + weaponTemplates = Vector() + weapontemplate = WeaponTemplate('object/weapon/melee/unarmed/shared_unarmed_default.iff', WeaponType.UNARMED, 1.0, 6, 'kinetic') + weaponTemplates.add(weapontemplate) + mobileTemplate.setWeaponTemplateVector(weaponTemplates) + + attacks = Vector() + mobileTemplate.setDefaultAttack('creatureMeleeAttack') + mobileTemplate.setAttacks(attacks) + + core.spawnService.addMobileTemplate('diala', mobileTemplate) + return \ No newline at end of file diff --git a/scripts/mobiles/generic/static/tatooine/jalen.py b/scripts/mobiles/generic/static/tatooine/jalen.py new file mode 100644 index 00000000..a3db06ea --- /dev/null +++ b/scripts/mobiles/generic/static/tatooine/jalen.py @@ -0,0 +1,34 @@ +import sys +from services.spawn import MobileTemplate +from services.spawn import WeaponTemplate +from resources.datatables import WeaponType +from resources.datatables import Difficulty +from resources.datatables import Options +from resources.datatables import FactionStatus +from java.util import Vector + + +def addTemplate(core): + mobileTemplate = MobileTemplate() + + mobileTemplate.setCreatureName('smuggler_fence_jalen') + mobileTemplate.setLevel(1) + mobileTemplate.setDifficulty(Difficulty.NORMAL) + mobileTemplate.setSocialGroup("township") + mobileTemplate.setOptionsBitmask(Options.INVULNERABLE | Options.CONVERSABLE) + + templates = Vector() + templates.add('object/mobile/shared_smuggler_fence_jalen.iff') + mobileTemplate.setTemplates(templates) + + weaponTemplates = Vector() + weapontemplate = WeaponTemplate('object/weapon/melee/unarmed/shared_unarmed_default.iff', WeaponType.UNARMED, 1.0, 6, 'kinetic') + weaponTemplates.add(weapontemplate) + mobileTemplate.setWeaponTemplateVector(weaponTemplates) + + attacks = Vector() + mobileTemplate.setDefaultAttack('creatureMeleeAttack') + mobileTemplate.setAttacks(attacks) + + core.spawnService.addMobileTemplate('jalen', mobileTemplate) + return \ No newline at end of file diff --git a/scripts/mobiles/generic/static/tatooine/kaleb.py b/scripts/mobiles/generic/static/tatooine/kaleb.py new file mode 100644 index 00000000..43ca9c73 --- /dev/null +++ b/scripts/mobiles/generic/static/tatooine/kaleb.py @@ -0,0 +1,34 @@ +import sys +from services.spawn import MobileTemplate +from services.spawn import WeaponTemplate +from resources.datatables import WeaponType +from resources.datatables import Difficulty +from resources.datatables import Options +from resources.datatables import FactionStatus +from java.util import Vector + + +def addTemplate(core): + mobileTemplate = MobileTemplate() + + mobileTemplate.setCreatureName('smuggler_fence_kaleb') + mobileTemplate.setLevel(1) + mobileTemplate.setDifficulty(Difficulty.NORMAL) + mobileTemplate.setSocialGroup("township") + mobileTemplate.setOptionsBitmask(Options.INVULNERABLE | Options.CONVERSABLE) + + templates = Vector() + templates.add('object/mobile/shared_smuggler_fence_kaleb.iff') + mobileTemplate.setTemplates(templates) + + weaponTemplates = Vector() + weapontemplate = WeaponTemplate('object/weapon/melee/unarmed/shared_unarmed_default.iff', WeaponType.UNARMED, 1.0, 6, 'kinetic') + weaponTemplates.add(weapontemplate) + mobileTemplate.setWeaponTemplateVector(weaponTemplates) + + attacks = Vector() + mobileTemplate.setDefaultAttack('creatureMeleeAttack') + mobileTemplate.setAttacks(attacks) + + core.spawnService.addMobileTemplate('kaleb', mobileTemplate) + return \ No newline at end of file diff --git a/scripts/mobiles/generic/static/tatooine/kara.py b/scripts/mobiles/generic/static/tatooine/kara.py new file mode 100644 index 00000000..8fec5eea --- /dev/null +++ b/scripts/mobiles/generic/static/tatooine/kara.py @@ -0,0 +1,34 @@ +import sys +from services.spawn import MobileTemplate +from services.spawn import WeaponTemplate +from resources.datatables import WeaponType +from resources.datatables import Difficulty +from resources.datatables import Options +from resources.datatables import FactionStatus +from java.util import Vector + + +def addTemplate(core): + mobileTemplate = MobileTemplate() + + mobileTemplate.setCreatureName('smuggler_fence_kara') + mobileTemplate.setLevel(1) + mobileTemplate.setDifficulty(Difficulty.NORMAL) + mobileTemplate.setSocialGroup("township") + mobileTemplate.setOptionsBitmask(Options.INVULNERABLE | Options.CONVERSABLE) + + templates = Vector() + templates.add('object/mobile/shared_smuggler_fence_kara.iff') + mobileTemplate.setTemplates(templates) + + weaponTemplates = Vector() + weapontemplate = WeaponTemplate('object/weapon/melee/unarmed/shared_unarmed_default.iff', WeaponType.UNARMED, 1.0, 6, 'kinetic') + weaponTemplates.add(weapontemplate) + mobileTemplate.setWeaponTemplateVector(weaponTemplates) + + attacks = Vector() + mobileTemplate.setDefaultAttack('creatureMeleeAttack') + mobileTemplate.setAttacks(attacks) + + core.spawnService.addMobileTemplate('kara', mobileTemplate) + return \ No newline at end of file diff --git a/scripts/mobiles/generic/static/tatooine/sarlin.py b/scripts/mobiles/generic/static/tatooine/sarlin.py new file mode 100644 index 00000000..65d478b1 --- /dev/null +++ b/scripts/mobiles/generic/static/tatooine/sarlin.py @@ -0,0 +1,33 @@ +import sys +from services.spawn import MobileTemplate +from services.spawn import WeaponTemplate +from resources.datatables import WeaponType +from resources.datatables import Difficulty +from resources.datatables import Options +from java.util import Vector + + +def addTemplate(core): + mobileTemplate = MobileTemplate() + + mobileTemplate.setCreatureName('smuggler_fence_sarlin') + mobileTemplate.setLevel(1) + mobileTemplate.setDifficulty(Difficulty.NORMAL) + mobileTemplate.setSocialGroup("township") + mobileTemplate.setOptionsBitmask(Options.INVULNERABLE | Options.CONVERSABLE) + + templates = Vector() + templates.add('object/mobile/shared_smuggler_fence_sarlin.iff') + mobileTemplate.setTemplates(templates) + + weaponTemplates = Vector() + weapontemplate = WeaponTemplate('object/weapon/melee/unarmed/shared_unarmed_default.iff', WeaponType.UNARMED, 1.0, 6, 'kinetic') + weaponTemplates.add(weapontemplate) + mobileTemplate.setWeaponTemplateVector(weaponTemplates) + + attacks = Vector() + mobileTemplate.setDefaultAttack('creatureMeleeAttack') + mobileTemplate.setAttacks(attacks) + + core.spawnService.addMobileTemplate('sarlin', mobileTemplate) + return \ No newline at end of file diff --git a/scripts/mobiles/tatooine/smuggler_patrol_bh_1.py b/scripts/mobiles/tatooine/smuggler_patrol_bh_1.py new file mode 100644 index 00000000..9489cc7e --- /dev/null +++ b/scripts/mobiles/tatooine/smuggler_patrol_bh_1.py @@ -0,0 +1,39 @@ +import sys +from services.spawn import MobileTemplate +from services.spawn import WeaponTemplate +from resources.datatables import WeaponType +from resources.datatables import Difficulty +from resources.datatables import Options +from java.util import Vector + + +def addTemplate(core): + mobileTemplate = MobileTemplate() + + mobileTemplate.setCreatureName('jabba_assassin') + mobileTemplate.setLevel(15) + mobileTemplate.setDifficulty(Difficulty.NORMAL) + + mobileTemplate.setMinSpawnDistance(4) + mobileTemplate.setMaxSpawnDistance(8) + mobileTemplate.setDeathblow(True) + mobileTemplate.setScale(1) + mobileTemplate.setSocialGroup("jabba") + mobileTemplate.setAssistRange(0) + mobileTemplate.setStalker(False) + + templates = Vector() + templates.add('object/mobile/shared_dressed_tatooine_jabba_assassin.iff') + mobileTemplate.setTemplates(templates) + + weaponTemplates = Vector() + weapontemplate = WeaponTemplate('object/weapon/ranged/pistol/shared_pistol_cdef.iff', WeaponType.PISTOL, 1.0, 15, 'energy') + weaponTemplates.add(weapontemplate) + mobileTemplate.setWeaponTemplateVector(weaponTemplates) + + attacks = Vector() + mobileTemplate.setDefaultAttack('rangedShotpistol') + mobileTemplate.setAttacks(attacks) + + core.spawnService.addMobileTemplate('smuggler_patrol_bh_1', mobileTemplate) + return \ No newline at end of file diff --git a/scripts/object/mobile/smuggler_broker_barak.py b/scripts/object/mobile/smuggler_broker_barak.py index ccad8904..7dbe75ec 100644 --- a/scripts/object/mobile/smuggler_broker_barak.py +++ b/scripts/object/mobile/smuggler_broker_barak.py @@ -1,4 +1,10 @@ import sys +from resources.datatables import Options def setup(core, object): - return \ No newline at end of file + object.setAttachment('radial_filename', 'object/conversation'); + object.setAttachment('conversationFile','quests/tatooine/brokerbarak') + object.setOptionsBitmask(Options.CONVERSABLE | Options.INVULNERABLE) + object.setStfFilename('mob/creature_names') + object.setStfName('smuggler_broker_barak') + return diff --git a/scripts/object/mobile/smuggler_fence_diala.py b/scripts/object/mobile/smuggler_fence_diala.py index ccad8904..3394e0a4 100644 --- a/scripts/object/mobile/smuggler_fence_diala.py +++ b/scripts/object/mobile/smuggler_fence_diala.py @@ -1,4 +1,10 @@ import sys +from resources.datatables import Options def setup(core, object): + object.setAttachment('radial_filename', 'object/conversation'); + object.setAttachment('conversationFile','quests/tatooine/diala') + object.setOptionsBitmask(Options.CONVERSABLE | Options.INVULNERABLE) + object.setStfFilename('mob/creature_names') + object.setStfName('smuggler_fence_diala') return \ No newline at end of file diff --git a/scripts/object/mobile/smuggler_fence_jalen.py b/scripts/object/mobile/smuggler_fence_jalen.py index ccad8904..b24b0380 100644 --- a/scripts/object/mobile/smuggler_fence_jalen.py +++ b/scripts/object/mobile/smuggler_fence_jalen.py @@ -1,4 +1,10 @@ import sys +from resources.datatables import Options def setup(core, object): + object.setAttachment('radial_filename', 'object/conversation'); + object.setAttachment('conversationFile','quests/tatooine/jalen') + object.setOptionsBitmask(Options.CONVERSABLE | Options.INVULNERABLE) + object.setStfFilename('mob/creature_names') + object.setStfName('smuggler_fence_jalen') return \ No newline at end of file diff --git a/scripts/object/mobile/smuggler_fence_kaleb.py b/scripts/object/mobile/smuggler_fence_kaleb.py index ccad8904..f46c0b3f 100644 --- a/scripts/object/mobile/smuggler_fence_kaleb.py +++ b/scripts/object/mobile/smuggler_fence_kaleb.py @@ -1,4 +1,10 @@ import sys +from resources.datatables import Options def setup(core, object): + object.setAttachment('radial_filename', 'object/conversation'); + object.setAttachment('conversationFile','quests/tatooine/kaleb') + object.setOptionsBitmask(Options.CONVERSABLE | Options.INVULNERABLE) + object.setStfFilename('mob/creature_names') + object.setStfName('smuggler_fence_kaleb') return \ No newline at end of file diff --git a/scripts/object/mobile/smuggler_fence_kara.py b/scripts/object/mobile/smuggler_fence_kara.py index ccad8904..52aa70f6 100644 --- a/scripts/object/mobile/smuggler_fence_kara.py +++ b/scripts/object/mobile/smuggler_fence_kara.py @@ -1,4 +1,10 @@ import sys +from resources.datatables import Options def setup(core, object): + object.setAttachment('radial_filename', 'object/conversation'); + object.setAttachment('conversationFile','quests/tatooine/kara') + object.setOptionsBitmask(Options.CONVERSABLE | Options.INVULNERABLE) + object.setStfFilename('mob/creature_names') + object.setStfName('smuggler_fence_kara') return \ No newline at end of file diff --git a/scripts/object/mobile/smuggler_fence_sarlin.py b/scripts/object/mobile/smuggler_fence_sarlin.py index ccad8904..209832f3 100644 --- a/scripts/object/mobile/smuggler_fence_sarlin.py +++ b/scripts/object/mobile/smuggler_fence_sarlin.py @@ -1,4 +1,10 @@ import sys +from resources.datatables import Options def setup(core, object): + object.setAttachment('radial_filename', 'object/conversation'); + object.setAttachment('conversationFile','quests/tatooine/sarlin') + object.setOptionsBitmask(Options.CONVERSABLE | Options.INVULNERABLE) + object.setStfFilename('mob/creature_names') + object.setStfName('smuggler_fence_sarlin') return \ No newline at end of file diff --git a/scripts/object/tangible/quest/item_smuggler_contraband_crate_01_01.py b/scripts/object/tangible/quest/item_smuggler_contraband_crate_01_01.py new file mode 100644 index 00000000..a1a35fca --- /dev/null +++ b/scripts/object/tangible/quest/item_smuggler_contraband_crate_01_01.py @@ -0,0 +1,11 @@ +import sys + +def setup(core, object): + object.setStfFilename('static_item_n') + object.setStfName('item_smuggler_contraband_crate_01_01') + #object.setStfName('item_bracelet_l_set_bh_dps_01_01') + object.setDetailFilename('smuggle_crate_d') + object.setDetailName('item_smuggler_contraband_crate_01_01') + object.setIntAttribute('required_combat_level', 10) + object.setStringAttribute('class_required', 'Smuggler') + return \ No newline at end of file diff --git a/scripts/quests/events/signals/smugglerEnemyIncap.py b/scripts/quests/events/signals/smugglerEnemyIncap.py new file mode 100644 index 00000000..8f6a5dde --- /dev/null +++ b/scripts/quests/events/signals/smugglerEnemyIncap.py @@ -0,0 +1,9 @@ +def setup(core): + return + +def wait(core, actor): + return + +def activate(core, actor, quest): + core.questService.completeTask(actor, quest, 8) + return \ No newline at end of file diff --git a/scripts/quests/events/signals/smugglerPatrolHelp.py b/scripts/quests/events/signals/smugglerPatrolHelp.py new file mode 100644 index 00000000..ecc0527e --- /dev/null +++ b/scripts/quests/events/signals/smugglerPatrolHelp.py @@ -0,0 +1,9 @@ +def setup(core): + return + +def wait(core, actor): + return + +def activate(core, actor, quest): + core.questService.completeTask(actor, quest, 10) + return \ No newline at end of file diff --git a/scripts/static_spawns/tatooine/bestine.py b/scripts/static_spawns/tatooine/bestine.py index 275ee560..5703e42e 100644 --- a/scripts/static_spawns/tatooine/bestine.py +++ b/scripts/static_spawns/tatooine/bestine.py @@ -44,7 +44,7 @@ def addPlanetSpawns(core, planet): gilBurtin = stcSvc.spawnObject('gilburtin', 'tatooine', hotel.getCellByCellNumber(5), float(20.3), float(1.6), float(12.8), float(0), float(0), float(0.99), float(0)) # Outside - barak = stcSvc.spawnObject('brokerbarak', 'tatooine', long(0), float(-1049), float(5.0), float(-3537), float(0.97), float(0.23)) + barak = stcSvc.spawnObject('brokerbarak', 'tatooine', long(0), float(-1049), float(10), float(-3537), float(0.97), float(0.23)) barrezz = stcSvc.spawnObject('barezz', 'tatooine', long(0), float(-1146.8), float(98.0), float(-3892.1), float(0.75), float(0.65)) diff --git a/scripts/static_spawns/tatooine/mos_eisley_quest.py b/scripts/static_spawns/tatooine/mos_eisley_quest.py index b365360a..6a5cfd9b 100644 --- a/scripts/static_spawns/tatooine/mos_eisley_quest.py +++ b/scripts/static_spawns/tatooine/mos_eisley_quest.py @@ -27,4 +27,6 @@ def addPlanetSpawns(core, planet): # Jano Bix jano = stcSvc.spawnObject('jano', 'tatooine', long(0), float(3186), float(5), float(-4781), float(-0.38), float(0.92)) + # Kaleb + kaleb = stcSvc.spawnObject('kaleb', 'tatooine', long(0), float(3216), float(5), float(-4610), float(0.25), float(1)) return \ No newline at end of file diff --git a/scripts/static_spawns/tatooine/mos_entha.py b/scripts/static_spawns/tatooine/mos_entha.py index 0455d44a..5b61aee2 100644 --- a/scripts/static_spawns/tatooine/mos_entha.py +++ b/scripts/static_spawns/tatooine/mos_entha.py @@ -20,6 +20,8 @@ def addPlanetSpawns(core, planet): ankwee.setCustomName2('An\'kwee') ankwee.setOptionsBitmask(256) + sarlin = stcSvc.spawnObject('sarlin', 'tatooine', long(0), float(1537), float(7), float(3052), float(0.6), float(0.8)) + #Junkdealer stcSvc.spawnObject('junkdealer', 'tatooine', long(0), float(1271), float(7.7), float(2919), float(0), float(0)) stcSvc.spawnObject('junkdealer', 'tatooine', long(0), float(1271), float(7.7), float(2960), float(1), float(0)) diff --git a/scripts/static_spawns/tatooine/mos_espa.py b/scripts/static_spawns/tatooine/mos_espa.py index 7d704567..ce0fb2c7 100644 --- a/scripts/static_spawns/tatooine/mos_espa.py +++ b/scripts/static_spawns/tatooine/mos_espa.py @@ -24,6 +24,7 @@ def addPlanetSpawns(core, planet): #dalaSocuna.setCustomName2('Commander Da\'la Socuna') #dalaSocuna.setOptionsBitmask(256) + diala = stcSvc.spawnObject('diala', 'tatooine', long(0), float(-3105), float(5), float(2314), float(0.48), float(0.88)) #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', building.getCellByCellNumber(2), float(4.7), float(-0.5), float(2.4), float(-0.71), float(0), float(0.70), float(0)) diff --git a/scripts/static_spawns/tatooine/mos_taike.py b/scripts/static_spawns/tatooine/mos_taike.py index 814d7b2e..dd08b8f3 100644 --- a/scripts/static_spawns/tatooine/mos_taike.py +++ b/scripts/static_spawns/tatooine/mos_taike.py @@ -15,6 +15,7 @@ def addPlanetSpawns(core, planet): # TODO Check all NPCs for personalized scripting, change format. + kara = stcSvc.spawnObject('kara', 'tatooine', long(0), float(3839), float(16.13), float(2335), float(-0.1), float(0.98)) #Junkdealer stcSvc.spawnObject('junkdealer', 'tatooine', long(0), float(3902), float(33), float(2362), float(0), float(0)) diff --git a/scripts/static_spawns/tatooine/wayfar.py b/scripts/static_spawns/tatooine/wayfar.py index 0f9fd3f0..b40e025f 100644 --- a/scripts/static_spawns/tatooine/wayfar.py +++ b/scripts/static_spawns/tatooine/wayfar.py @@ -14,8 +14,8 @@ def addPlanetSpawns(core, planet): objSvc = core.objectService # TODO Check all NPCs for personalized scripting, change format. - - + # Smuggler Fence Jalen + jalen = stcSvc.spawnObject('jalen', 'tatooine', long(0), float(-5185), float(75), float(-6458), float(0.7), float(0.7)) #Junkdealer stcSvc.spawnObject('junkdealer', 'tatooine', long(0), float(-5240.87), float(75), float(-641.015), float(0.879), float(0.476)) stcSvc.spawnObject('junkdealer', 'tatooine', long(0), float(-5132.33), float(75), float(-6584.92), float(0.637), float(0.771)) From b5254a20c295c79c71ba9b6376cf528c0080dc3e Mon Sep 17 00:00:00 2001 From: cdmpse Date: Fri, 19 Sep 2014 20:07:04 -0500 Subject: [PATCH 2/6] Updates to "Tasty Dried Critters" Quest --- scripts/conversation/quests/tatooine/byxle.py | 21 +++++++-------- scripts/conversation/quests/tatooine/drixa.py | 8 ++---- scripts/conversation/quests/tatooine/jano.py | 26 ++++--------------- scripts/conversation/quests/tatooine/nogri.py | 8 ++---- .../events/signals/tat_eisley_tdc_e3.py | 1 - .../events/signals/tat_eisley_tdc_e5.py | 1 - .../events/signals/tat_eisley_tdc_e7.py | 1 - .../events/signals/tat_eisley_tdc_e9.py | 1 - 8 files changed, 18 insertions(+), 49 deletions(-) diff --git a/scripts/conversation/quests/tatooine/byxle.py b/scripts/conversation/quests/tatooine/byxle.py index bf632bb3..0c31d697 100644 --- a/scripts/conversation/quests/tatooine/byxle.py +++ b/scripts/conversation/quests/tatooine/byxle.py @@ -6,28 +6,30 @@ import sys def startConversation(core, actor, npc): player = actor.getPlayerObject() - + if player is None: return quest = player.getQuest('tatooine_eisley_tdc') + if quest is None: options = Vector() options.add(ConversationOption(OutOfBand.ProsePackage('@conversation/tatooine_eisley_byxle:s_58'), 0)) core.conversationService.sendConversationMessage(actor, npc, OutOfBand.ProsePackage('@conversation/tatooine_eisley_byxle:s_56')) core.conversationService.sendConversationOptions(actor, npc, options, handleOptionsOne) return - - if quest.getActiveTask() == 8: + elif quest.isCompleted(): + core.conversationService.sendStopConversation(actor, npc, 'conversation/tatooine_eisley_byxle', 's_48') + elif quest.getActiveTask() == 8: options = Vector() # I don't know. He seemed pretty mad. options.add(ConversationOption(OutOfBand.ProsePackage('@conversation/tatooine_eisley_byxle:s_29'), 0)) core.conversationService.sendConversationMessage(actor, npc, OutOfBand.ProsePackage('@conversation/tatooine_eisley_byxle:s_17')) core.conversationService.sendConversationOptions(actor, npc, options, handleOptionsFive) - elif quest.isCompleted() == True: - core.conversationService.sendStopConversation(actor, npc, 'conversation/tatooine_eisley_byxle', 's_48') - else: + + else: core.conversationService.sendStopConversation(actor, npc, 'conversation/tatooine_eisley_byxle', 's_48') + return def handleOptionsOne(core, actor, npc, selection): @@ -69,12 +71,7 @@ def handleOptionsFive(core, actor, npc, selection): def handleOptionsSix(core, actor, npc, selection): core.conversationService.sendStopConversation(actor, npc, 'conversation/tatooine_eisley_byxle', 's_70') - player = actor.getPlayerObject() - if player is None: - return - quest = player.getQuest('tatooine_eisley_tdc') - core.questService.completeActiveTask(actor, quest) - core.questService.sendQuestCompleteWindow(actor, 'quest/tatooine_eisley_tdc') + core.questService.handleActivateSignal(actor, npc, 'tatooine_eisley_tdc', 'tat_eisley_tdc_e9') return def endConversation(core, actor, npc): diff --git a/scripts/conversation/quests/tatooine/drixa.py b/scripts/conversation/quests/tatooine/drixa.py index 88a20fdc..c1b46b0a 100644 --- a/scripts/conversation/quests/tatooine/drixa.py +++ b/scripts/conversation/quests/tatooine/drixa.py @@ -11,7 +11,7 @@ def startConversation(core, actor, npc): quest = player.getQuest('tatooine_eisley_tdc') if quest is None: core.conversationService.sendStopConversation(actor, npc, 'conversation/tatooine_eisley_drixa', 's_43') - elif quest.isCompleted() == True or quest.getActiveTask() > 1: + elif quest.isCompleted() or quest.getActiveTask() > 1: core.conversationService.sendStopConversation(actor, npc, 'conversation/tatooine_eisley_drixa', 's_40') else: options = Vector() @@ -47,11 +47,7 @@ def handleOptionsThree(core, actor, npc, selection): def handleOptionsFour(core, actor, npc, selection): core.conversationService.sendStopConversation(actor, npc, 'conversation/tatooine_eisley_drixa', 's_40') - player = actor.getPlayerObject() - if player is None: - return - quest = player.getQuest('tatooine_eisley_tdc') - core.questService.handleActivateSignal(actor, npc, quest, 2) + core.questService.handleActivateSignal(actor, npc, 'tatooine_eisley_tdc', 'tat_eisley_tdc_e1') return def endConversation(core, actor, npc): diff --git a/scripts/conversation/quests/tatooine/jano.py b/scripts/conversation/quests/tatooine/jano.py index 25eadc45..e4fe7372 100644 --- a/scripts/conversation/quests/tatooine/jano.py +++ b/scripts/conversation/quests/tatooine/jano.py @@ -12,7 +12,9 @@ def startConversation(core, actor, npc): quest = player.getQuest('tatooine_eisley_tdc') if quest is None: - core.conversationService.sendStopConversation(actor, npc, 'conversation/tatooine_eisley_jano', 's_22') + core.conversationService.sendStopConversation(actor, npc, 'conversation/tatooine_eisley_jano', 's_22') + elif quest.isCompleted() or quest.getActiveTask() > 6: + core.conversationService.sendStopConversation(actor, npc, 'conversation/tatooine_eisley_jano', 's_16') elif quest.getActiveTask() == 4: options = Vector() # Here you go, four chewy Chuba combos. @@ -25,8 +27,6 @@ def startConversation(core, actor, npc): options.add(ConversationOption(OutOfBand.ProsePackage('@conversation/tatooine_eisley_jano:s_13'), 0)) core.conversationService.sendConversationMessage(actor, npc, OutOfBand.ProsePackage('@conversation/tatooine_eisley_jano:s_6')) core.conversationService.sendConversationOptions(actor, npc, options, handleOptionsTwo) - elif quest.isCompleted() == True or quest.getActiveTask() > 6: - core.conversationService.sendStopConversation(actor, npc, 'conversation/tatooine_eisley_jano', 's_16') else: core.conversationService.sendStopConversation(actor, npc, 'conversation/tatooine_eisley_jano', 's_22') @@ -34,19 +34,7 @@ def startConversation(core, actor, npc): def handleOptionsOne(core, actor, npc, selection): core.conversationService.sendStopConversation(actor, npc, 'conversation/tatooine_eisley_jano', 's_20') - pos = actor.getWorldPosition() - - player = actor.getPlayerObject() - if player is None: - return - quest = player.getQuest('tatooine_eisley_tdc') - data = core.questService.getQuestData(quest.getName()) - task = data.getTasks().get(5); - count = task.getCount() - type = task.getCreatureType() - for i in xrange(0, count): - core.spawnService.spawnCreature('chuba', actor.getPlanet().getName(), 0, pos.x+1, pos.y, pos.z, 1, 0, 1, 0, 1) - core.questService.completeActiveTask(actor, quest) + core.questService.handleActivateSignal(actor, npc, 'tatooine_eisley_tdc', 'tat_eisley_tdc_e5') return def handleOptionsTwo(core, actor, npc, selection): @@ -58,12 +46,8 @@ def handleOptionsTwo(core, actor, npc, selection): return def handleOptionsThree(core, actor, npc, selection): - player = actor.getPlayerObject() - if player is None: - return core.conversationService.sendStopConversation(actor, npc, 'conversation/tatooine_eisley_jano', 's_16') - quest = player.getQuest('tatooine_eisley_tdc') - core.questService.handleActivateSignal(actor, npc, quest, 6) + core.questService.handleActivateSignal(actor, npc, 'tatooine_eisley_tdc', 'tat_eisley_tdc_e7') return def endConversation(core, actor, npc): diff --git a/scripts/conversation/quests/tatooine/nogri.py b/scripts/conversation/quests/tatooine/nogri.py index 711c0088..40a18bc9 100644 --- a/scripts/conversation/quests/tatooine/nogri.py +++ b/scripts/conversation/quests/tatooine/nogri.py @@ -14,7 +14,7 @@ def startConversation(core, actor, npc): if quest is None: # Too busy getting this cargo ready, no time to talk. core.conversationService.sendStopConversation(actor, npc, 'conversation/tatooine_eisley_nogri', 's_48') - elif quest.isCompleted() == True or quest.getActiveTask() > 3: + elif quest.isCompleted() or quest.getActiveTask() > 3: core.conversationService.sendStopConversation(actor, npc, 'conversation/tatooine_eisley_nogri', 's_42') else: options = Vector() @@ -81,12 +81,8 @@ def handleOptionsSeven(core, actor, npc, selection): return def handleOptionsEight(core, actor, npc, selection): - player = actor.getPlayerObject() - if player is None: - return core.conversationService.sendStopConversation(actor, npc, 'conversation/tatooine_eisley_nogri', 's_42') - quest = player.getQuest('tatooine_eisley_tdc') - core.questService.handleActivateSignal(actor, npc, quest, 4) + core.questService.handleActivateSignal(actor, npc, 'tatooine_eisley_tdc', 'tat_eisley_tdc_e3') return def endConversation(core, actor, npc): diff --git a/scripts/quests/events/signals/tat_eisley_tdc_e3.py b/scripts/quests/events/signals/tat_eisley_tdc_e3.py index ba2bd478..2c219af1 100644 --- a/scripts/quests/events/signals/tat_eisley_tdc_e3.py +++ b/scripts/quests/events/signals/tat_eisley_tdc_e3.py @@ -5,6 +5,5 @@ def wait(core, actor): return def activate(core, actor, quest): - core.questService.completeActiveTask(actor, quest) core.questService.completeActiveTask(actor, quest) return \ No newline at end of file diff --git a/scripts/quests/events/signals/tat_eisley_tdc_e5.py b/scripts/quests/events/signals/tat_eisley_tdc_e5.py index ba2bd478..2c219af1 100644 --- a/scripts/quests/events/signals/tat_eisley_tdc_e5.py +++ b/scripts/quests/events/signals/tat_eisley_tdc_e5.py @@ -5,6 +5,5 @@ def wait(core, actor): return def activate(core, actor, quest): - core.questService.completeActiveTask(actor, quest) core.questService.completeActiveTask(actor, quest) return \ No newline at end of file diff --git a/scripts/quests/events/signals/tat_eisley_tdc_e7.py b/scripts/quests/events/signals/tat_eisley_tdc_e7.py index ba2bd478..2c219af1 100644 --- a/scripts/quests/events/signals/tat_eisley_tdc_e7.py +++ b/scripts/quests/events/signals/tat_eisley_tdc_e7.py @@ -5,6 +5,5 @@ def wait(core, actor): return def activate(core, actor, quest): - core.questService.completeActiveTask(actor, quest) core.questService.completeActiveTask(actor, quest) return \ No newline at end of file diff --git a/scripts/quests/events/signals/tat_eisley_tdc_e9.py b/scripts/quests/events/signals/tat_eisley_tdc_e9.py index ba2bd478..2c219af1 100644 --- a/scripts/quests/events/signals/tat_eisley_tdc_e9.py +++ b/scripts/quests/events/signals/tat_eisley_tdc_e9.py @@ -5,6 +5,5 @@ def wait(core, actor): return def activate(core, actor, quest): - core.questService.completeActiveTask(actor, quest) core.questService.completeActiveTask(actor, quest) return \ No newline at end of file From 868253472819c77f5d8f518eb844c29fcb9aae25 Mon Sep 17 00:00:00 2001 From: cdmpse Date: Fri, 19 Sep 2014 20:08:01 -0500 Subject: [PATCH 3/6] Updates to Quest Services --- src/services/quest/QuestService.java | 314 ++++++++++++++++++--------- src/services/quest/QuestTask.java | 149 ++++++++++++- 2 files changed, 360 insertions(+), 103 deletions(-) diff --git a/src/services/quest/QuestService.java b/src/services/quest/QuestService.java index 48a2c867..fc1eabbb 100644 --- a/src/services/quest/QuestService.java +++ b/src/services/quest/QuestService.java @@ -36,6 +36,7 @@ import java.util.Map; import java.util.Random; import java.util.concurrent.ConcurrentHashMap; import java.util.concurrent.Executors; +import java.util.concurrent.ScheduledExecutorService; import java.util.concurrent.ScheduledFuture; import java.util.concurrent.TimeUnit; import java.util.concurrent.atomic.AtomicInteger; @@ -81,7 +82,8 @@ public class QuestService implements INetworkDispatch { private Map questRewardMap = new ConcurrentHashMap(); private List forceAcceptQuests = new ArrayList(); private Map questCrcMap = new ConcurrentHashMap(); - + private final ScheduledExecutorService scheduler = Executors.newScheduledThreadPool(1); + public QuestService(NGECore core) { this.core = core; @@ -119,59 +121,152 @@ public class QuestService implements INetworkDispatch { } public void activateNextTask(CreatureObject quester, String questName) { - if (quester.getPlayerObject().getQuestJournal().containsKey(CRC.StringtoCRC("quest/" + questName)) && !quester.getPlayerObject().getQuestJournal().get(CRC.StringtoCRC("quest/" + questName)).isCompleted()) { activateNextTask(quester, quester.getPlayerObject().getQuestJournal().get(CRC.StringtoCRC("quest/" + questName))); } } - + public void activateNextTask(CreatureObject quester, Quest quest) { + activateTask(quester, quest, quest.getActiveTask()); + } + + public void activateTask(CreatureObject quester, String questName, int taskId) { + if (quester.getPlayerObject().getQuestJournal().containsKey(CRC.StringtoCRC("quest/" + questName)) && !quester.getPlayerObject().getQuestJournal().get(CRC.StringtoCRC("quest/" + questName)).isCompleted()) { + activateTask(quester, quester.getPlayerObject().getQuestJournal().get(CRC.StringtoCRC("quest/" + questName)), taskId); + } + } + + public void activateTask(CreatureObject quester, Quest quest, int taskId) { if (quester == null || quester.getClient() == null || quester.getClient().getSession() == null) return; - + if (quest.isCompleted()) + return; QuestData qData = getQuestData(quest.getName()); - if (qData == null) return; - PlayerObject player = quester.getPlayerObject(); - if (player == null) return; + QuestTask task = qData.getTasks().get(taskId); + + if (task.getMinStartDelay() > 0 || task.getMaxStartDelay() > 0) { + if (task.getScheduledTask() == null) { + int min = task.getMinStartDelay(); + int max = task.getMaxStartDelay(); + if ((max - min) < 0) + return; + Random random = new Random(); + int delay = random.nextInt(max - min) + min; + ScheduledFuture scheduledTask = scheduler.schedule(new Runnable() { + @Override + public void run() { + try { + activateTask(quester, quest, taskId); + } catch (Exception e) { + e.printStackTrace(); + } + } + }, (long) delay, TimeUnit.SECONDS); + task.setScheduledTask(scheduledTask); + return; + } + task.setScheduledTask(null); + } - int activeStep = quest.getActiveTask(); + if (task.getChanceToSkip() > 0) { + if (new Random().nextInt(100) < task.getChanceToSkip()) { + completeTask(quester, quest, taskId); + return; + } + } - QuestTask task = qData.getTasks().get(activeStep); + quest.setQuestStep(taskId); + player.getContainer().getClient().getSession().write(player.getBaseline(8).createDelta(7)); + String buffName = task.getBuffName(); + if (buffName != null && buffName != "") + core.buffService.addBuffToCreature(quester, buffName, quester); + + if (task.dismountsPlayer()) { + if (core.mountService.isMounted(quester)) { + core.mountService.dismount(quester, (CreatureObject) quester.getContainer()); + } + } + + if (task.createsWaypoint()) { + Point3D location = new Point3D(task.getLocationX(), task.getLocationY(), task.getLocationZ()); + WaypointObject wpGoTo = createWaypoint(task.getWaypointName(), location, task.getPlanet()); + player.getWaypoints().put(wpGoTo.getObjectID(), wpGoTo); + quest.setWaypointId(wpGoTo.getObjectID()); + } + + if (task.getTimerAmount() > 0) { + // fail task at end of timer + } + + // TODO + // set Travel Block: bool TRAVEL_BLOCK, bool TRAVEL_BLOCK_ALLOW_LAUNCH + // set Mount Block: int MOUNT_BLOCK_DURATION + + // quest.task.ground.type switch (task.getType()) { - - // quest.task.ground.go_to_location - case "go_to_location": - // Waypoint created below now + case "spawn": + case "encounter": + Random random = new Random(); + int count = task.getCount(); + if (count == 0) { + int minCount = task.getMinCount(); + int maxCount = task.getMaxCount(); + if (maxCount - minCount < 0) { + System.err.println("MaxCount was less than MinCount for Quest Task: "+task.getName()); + return; + } + count = random.nextInt(maxCount - minCount) + minCount; + } + int minDistance = task.getMinDistance(); + int maxDistance = task.getMaxDistance(); + String creatureType = task.getCreatureType(); + int distance; + float angle, dx, dy; + for (int i = 0; i < count; i++) { + distance = random.nextInt(maxDistance - minDistance) + minDistance; + angle = random.nextFloat() * 2 * (float) Math.PI; + dx = (float) Math.cos(angle) * distance; + dy = (float) Math.sin(angle) * distance; + Point3D pos = quester.getWorldPosition(); + core.spawnService.spawnCreature(creatureType, quester.getPlanet().getName(), 0, pos.x + dx, pos.y, pos.z + dy, 1, 0, 1, 0, 1); + } break; - - // quest.task.ground.comm_player + + case "go_to_location": + return; + case "comm_player": CommPlayerMessage message = new CommPlayerMessage(quester.getObjectID(), OutOfBand.ProsePackage(task.getCommMessageText()), task.getNpcAppearanceTemplate()); quester.getClient().getSession().write(message.serialize()); break; - // quest.task.ground.retrieve_item + case "give_item": + //String itemName = task.getItemToGive(); + try { + // ? + SWGObject item = core.objectService.createObject("object/tangible/smuggler/contraband/shared_contraband_general.iff", quester.getPlanet()); + quester.getSlottedObject("inventory").add(item); + } catch (Exception e) { + e.printStackTrace(); + } + return; + case "retrieve_item": if (quest.getCounterMax() != task.getNumRequired()) { quest.setCounterMax(task.getNumRequired()); quest.setCounterValue(0); } - - player.getQuestRetrieveItemTemplates().put(task.getServerTemplate(), new QuestItem(quest.getName(), activeStep)); - + player.getQuestRetrieveItemTemplates().put(task.getServerTemplate(), new QuestItem(quest.getName(), taskId)); ObjControllerMessage itemCount = new ObjControllerMessage(11, new QuestTaskCounterMessage(quester.getObjectID(), quest, "@quest/groundquests:retrieve_item_counter")); quester.getClient().getSession().write(itemCount.serialize()); - - // Waypoint created below now - break; + return; - // quest.task.ground.timer case "timer": // TODO: Fix timer not showing //System.out.println("Max time: " + task.getMaxTime() + " Min time: " + task.getMinTime()); @@ -181,28 +276,23 @@ public class QuestService implements INetworkDispatch { Console.println("Timer is: " + time.get()); if (time.get() == 0) { //quest.incrementQuestStep(); - completeActiveTask((CreatureObject) core.objectService.getObject(quester.getObjectID()), quest.getName()); + completeTask((CreatureObject) core.objectService.getObject(quester.getObjectID()), quest.getName(), taskId); } else { ObjControllerMessage timer = new ObjControllerMessage(11, new QuestTaskTimerMessage(quester.getObjectID(), quest.getCrcName(), "@quest/groundquests:timer_timertext", time.getAndDecrement())); quester.getClient().getSession().write(timer.serialize()); } }, 1, 1, TimeUnit.SECONDS); - quest.setTimer(taskTimer); - break; + return; - // quest.task.ground.wait_for_signal case "wait_for_signal": core.scriptService.callScript("scripts/quests/events/signals/", task.getSignalName(), "wait", core, quester); - break; - - // quest.task.ground.show_message_box + return; + case "show_message_box": SUIWindow msgBox = core.suiService.createMessageBox(MessageBoxType.MESSAGE_BOX_OK, task.getMsgBoxTitle(), task.getMsgBoxPrompt(), quester, null, 0); - if (task.getMsgBoxSound() != null && !task.getMsgBoxSound().equals("")) quester.playMusic(task.getMsgBoxSound()); - core.suiService.openSUIWindow(msgBox); break; @@ -211,59 +301,51 @@ public class QuestService implements INetworkDispatch { player.getWaypoints().remove(quest.getWaypointId()); core.objectService.destroyObject(quest.getWaypointId()); } - if (quest.getTimer() != null) quest.getTimer().cancel(true); - - completeQuest(player, quest); - return; + break; case "reward": // TODO: System message? - Also check possibility of "Item" column being used for reward as well TangibleObject reward = (TangibleObject) core.objectService.createObject(getQuestRewardTemplate(task.getLootName()), core.terrainService.getPlanetByName(task.getPlanet())); - if (reward == null) return; - quester.getInventory().add(reward); break; + + case "nothing": + break; default: //System.out.println("Don't know what to do for quest task: " + type); break; } - - if (task.createsWaypoint()) { - Point3D location = new Point3D(task.getLocationX(), task.getLocationY(), task.getLocationZ()); - WaypointObject wpGoTo = createWaypoint(task.getWaypointName(), location, task.getPlanet()); - player.getWaypoints().put(wpGoTo.getObjectID(), wpGoTo); - quest.setWaypointId(wpGoTo.getObjectID()); - } - - if (!task.isVisible()) { - completeActiveTask(quester, quest); - return; - } + completeTask(quester, quest, taskId); } - public void completeActiveTask(CreatureObject quester, String questName) { + public void completeActiveTask(CreatureObject quester, String questName) { if (quester.getPlayerObject().getQuestJournal().containsKey(CRC.StringtoCRC("quest/" + questName)) && !quester.getPlayerObject().getQuestJournal().get(CRC.StringtoCRC("quest/" + questName)).isCompleted()) { - completeActiveTask(quester, quester.getPlayerObject().getQuestJournal().get(CRC.StringtoCRC("quest/" + questName))); + completeTask(quester, quester.getPlayerObject().getQuestJournal().get(CRC.StringtoCRC("quest/" + questName)), quester.getPlayerObject().getQuestJournal().get(CRC.StringtoCRC("quest/" + questName)).getActiveTask()); } } public void completeActiveTask(CreatureObject quester, Quest quest) { + completeTask(quester, quest, quest.getActiveTask()); + } + + public void completeTask(CreatureObject quester, String questName, int taskId) { + if (quester.getPlayerObject().getQuestJournal().containsKey(CRC.StringtoCRC("quest/" + questName)) && !quester.getPlayerObject().getQuestJournal().get(CRC.StringtoCRC("quest/" + questName)).isCompleted()) { + completeTask(quester, quester.getPlayerObject().getQuestJournal().get(CRC.StringtoCRC("quest/" + questName)), taskId); + } + } + + public void completeTask(CreatureObject quester, Quest quest, int taskId) { PlayerObject player = quester.getPlayerObject(); if (player == null) return; - QuestData qData = getQuestData(quest.getName()); - - int activeStep = quest.getActiveTask(); - - QuestTask task = qData.getTasks().get(activeStep); - + QuestTask task = qData.getTasks().get(taskId); if (quest.getWaypointId() != 0) { player.getWaypoints().remove(quest.getWaypointId()); core.objectService.destroyObject(quest.getWaypointId()); @@ -278,33 +360,40 @@ public class QuestService implements INetworkDispatch { quester.sendSystemMessage(new OutOfBand(prose), DisplayType.Quest); } - if (activeStep + 1 >= qData.getTasks().size()) { - //QuestList listItem = questRewardMap.get(quest.getName()); - - quest.setCompleted(true); - - // TODO: Unable to determine if this is calculated in "Complete Quest" window should pop up or just finish automatically, but it's the best for now - if (task.isVisible()) - sendQuestCompleteWindow(quester, quest.getCrcName()); - else - completeQuest(player, quest); - - return; - } - - if (task.getGrantQuestOnComplete() != null && !task.getGrantQuestOnComplete().equals("")) { - if(!task.isVisible()) - immediatlyActivateQuest(quester, task.getGrantQuestOnComplete()); - else - sendQuestAcceptWindow(quester, task.getGrantQuestOnComplete()); - } - - quest.incrementQuestStep(); - + quest.completeQuestStep(taskId); player.getContainer().getClient().getSession().write(player.getBaseline(8).createDelta(7)); - activateNextTask(quester, quest); + if (task.getGrantQuestOnComplete() != null && !task.getGrantQuestOnComplete().equals("")) { + if (task.isVisible()) + sendQuestAcceptWindow(quester, task.getGrantQuestOnComplete()); + else + immediatlyActivateQuest(quester, task.getGrantQuestOnComplete()); + } + if (task.getType().equals("complete_quest") || task.getQuestControlOnTaskCompletion() == 1) { + quest.setCompleted(); + quester.getClient().getSession().write(player.getBaseline(8).createDelta(7)); + sendQuestCompleteWindow(quester, quest.getCrcName()); + return; + } + + String list = task.getTasksOnComplete(); + if (list.length() == 0) + return; + ArrayList tasks = new ArrayList<>(); + for (String t : list.split(",")) { + taskId = Integer.parseInt(t); + if (qData.getTasks().get(taskId).getChanceToActivate() == 1) { + tasks.add(taskId); + } else { + activateTask(quester, quest, taskId); + } + } + if (tasks.size() > 0) { + Random random = new Random(); + taskId = tasks.get(random.nextInt(tasks.size())); + activateTask(quester, quest, taskId); + } } public void immediatlyActivateQuest(CreatureObject quester, String questString) { @@ -329,7 +418,8 @@ public class QuestService implements INetworkDispatch { player.getQuestJournal().put(quest.getCrc(), quest); player.setActiveQuest(quest.getName()); - + quest.reset(); + player.getContainer().getClient().getSession().write(player.getBaseline(8).createDelta(7)); activateNextTask(quester, quest); } @@ -339,11 +429,13 @@ public class QuestService implements INetworkDispatch { CreatureObject creo = (CreatureObject) player.getContainer(); - if (!quest.isCompleted()) - quest.setCompleted(true); + if (!quest.isCompleted()) { + quest.setCompleted(); + creo.getClient().getSession().write(player.getBaseline(8).createDelta(7)); + } QuestList info = getQuestList(quest.getName()); - QuestTask task = getQuestData(quest.getName()).getTasks().get(quest.getActiveTask()); + //QuestTask task = getQuestData(quest.getName()).getTasks().get(quest.getActiveTask()); ArrayList recievedItems = new ArrayList(); TangibleObject inventory = (TangibleObject) creo.getSlottedObject("inventory"); @@ -356,11 +448,18 @@ public class QuestService implements INetworkDispatch { PlayMusicMessage completeSound = new PlayMusicMessage("sound/ui_npe2_quest_completed.snd", creo.getObjectID(), 0, true); creo.getClient().getSession().write(completeSound.serialize()); - // TODO: Give other awards - exclusive loots, faction points + // TODO: Give other awards - exclusive loots, etc. // Receiving quest awards (faction, item, exp, credits) - http://youtu.be/-L7Rz1WpmGM?t=14m50s // Give quest items + // Faction Reward + if (info.getRewardFactionAmount() > 0) { + int rewardFactionAmount = info.getRewardFactionAmount(); + int currentAmount = player.getFactionStanding(info.getRewardFactionType()); + player.setFactionStanding(info.getRewardFactionType(), currentAmount + rewardFactionAmount); + } + if (info.getRewardLootName() != null && !info.getRewardLootName().equals("")) { SWGObject rewardLoot = core.objectService.createObject(getQuestRewardTemplate(info.getRewardLootName()), creo.getPlanet()); inventory.add(rewardLoot); @@ -397,7 +496,7 @@ public class QuestService implements INetworkDispatch { } // Give experience - TODO: Give specific type of experience. - if (info.getRewardExperienceAmount() != 0 && info.getTier() != -1 && !(info.getTier() > 6)) { + if (info.getRewardExperienceAmount() < 0 && info.getTier() != -1 && !(info.getTier() > 6)) { int experienceAward = 0; try { DatatableVisitor experienceVisitor = ClientFileManager.loadFile("datatables/quest/quest_experience", DatatableVisitor.class); @@ -410,16 +509,9 @@ public class QuestService implements INetworkDispatch { } catch (InstantiationException | IllegalAccessException e) { e.printStackTrace(); } if (experienceAward != 0) core.playerService.giveExperience(creo, experienceAward); - } else { + } else if (info.getRewardExperienceAmount() > 0) { core.playerService.giveExperience(creo, info.getRewardExperienceAmount()); } - - if (task.getGrantQuestOnComplete() != null && !task.getGrantQuestOnComplete().equals("")) { - if (task.isVisible()) - sendQuestAcceptWindow(creo, task.getGrantQuestOnComplete()); - else - immediatlyActivateQuest(creo, task.getGrantQuestOnComplete()); - } // Update quest & client quest.setRecievedAward(true); @@ -477,6 +569,21 @@ public class QuestService implements INetworkDispatch { } + public void handleActivateSignal(CreatureObject actor, TangibleObject npc, String questName, String signalName) { + if (actor.getPlayerObject().getQuestJournal().containsKey(CRC.StringtoCRC("quest/" + questName)) && !actor.getPlayerObject().getQuestJournal().get(CRC.StringtoCRC("quest/" + questName)).isCompleted()) { + handleActivateSignal(actor, npc, actor.getPlayerObject().getQuestJournal().get(CRC.StringtoCRC("quest/" + questName)), actor.getPlayerObject().getQuestJournal().get(CRC.StringtoCRC("quest/" + questName)).getActiveTask()); + } + } + + public void handleActivateSignal(CreatureObject actor, TangibleObject npc, Quest quest, String signalName) { + for (QuestTask task : getQuestData(quest.getName()).getTasks()) { + if (task.getSignalName().equals(signalName)) { + handleActivateSignal(actor, npc, quest, task.getId()); + return; + } + } + } + public void handleActivateSignal(CreatureObject actor, TangibleObject npc, Quest quest, int taskId) { QuestTask task = getQuestData(quest.getName()).getTasks().get(taskId); if (task == null) @@ -615,6 +722,7 @@ public class QuestService implements INetworkDispatch { if (visitor.getObjectByColumnNameAndIndex("TASK_NAME", r) != null) task.setName((String) visitor.getObjectByColumnNameAndIndex("TASK_NAME", r)); if (visitor.getObjectByColumnNameAndIndex("MUSIC_ON_COMPLETE", r) != null) task.setMusicOnComplete((String) visitor.getObjectByColumnNameAndIndex("MUSIC_ON_COMPLETE", r)); if (visitor.getObjectByColumnNameAndIndex("MUSIC_ON_FAILURE", r) != null) task.setMusicOnFail((String) visitor.getObjectByColumnNameAndIndex("MUSIC_ON_FAILURE", r)); + if (visitor.getObjectByColumnNameAndIndex("CHANCE_TO_ACTIVATE", r) != null) task.setChanceToActivate((int) visitor.getObjectByColumnNameAndIndex("CHANCE_TO_ACTIVATE", r)); if (visitor.getObjectByColumnNameAndIndex("GRANT_QUEST_ON_FAIL_SHOW_SYSTEM_MESSAGE", r) != null) task.setGrantQuestOnFailShowSystemMessage((boolean) visitor.getObjectByColumnNameAndIndex("GRANT_QUEST_ON_FAIL_SHOW_SYSTEM_MESSAGE", r)); if (visitor.getObjectByColumnNameAndIndex("CREATE_WAYPOINT", r) != null) task.setCreatesWaypoint((boolean) visitor.getObjectByColumnNameAndIndex("CREATE_WAYPOINT", r)); if (visitor.getObjectByColumnNameAndIndex("PLANET_NAME", r) != null) task.setPlanet((String) visitor.getObjectByColumnNameAndIndex("PLANET_NAME", r)); @@ -628,8 +736,10 @@ public class QuestService implements INetworkDispatch { if (visitor.getObjectByColumnNameAndIndex("SIGNALS_ON_FAIL", r) != null) task.setSignalsOnFail((String) visitor.getObjectByColumnNameAndIndex("SIGNALS_ON_FAIL", r)); if (visitor.getObjectByColumnNameAndIndex("COMM_MESSAGE_TEXT", r) != null) task.setCommMessageText((String) visitor.getObjectByColumnNameAndIndex("COMM_MESSAGE_TEXT", r)); if (visitor.getObjectByColumnNameAndIndex("NPC_APPEARANCE_SERVER_TEMPLATE", r) != null) task.setNpcAppearanceTemplate(convertToSharedFile((String) visitor.getObjectByColumnNameAndIndex("NPC_APPEARANCE_SERVER_TEMPLATE", r))); - if (visitor.getObjectByColumnNameAndIndex("CREATURE_TYPE", r) != null) task.setCreatureType(convertToSharedFile((String) visitor.getObjectByColumnNameAndIndex("CREATURE_TYPE", r))); + if (visitor.getObjectByColumnNameAndIndex("CREATURE_TYPE", r) != null) task.setCreatureType((String) visitor.getObjectByColumnNameAndIndex("CREATURE_TYPE", r)); if (visitor.getObjectByColumnNameAndIndex("COUNT", r) != null) task.setCount((int) visitor.getObjectByColumnNameAndIndex("COUNT", r)); + if (visitor.getObjectByColumnNameAndIndex("MIN_COUNT", r) != null) task.setMinCount((int) visitor.getObjectByColumnNameAndIndex("MIN_COUNT", r)); + if (visitor.getObjectByColumnNameAndIndex("MAX_COUNT", r) != null) task.setMaxCount((int) visitor.getObjectByColumnNameAndIndex("MAX_COUNT", r)); if (visitor.getObjectByColumnNameAndIndex("MIN_DISTANCE", r) != null) task.setMinDistance((int) visitor.getObjectByColumnNameAndIndex("MIN_DISTANCE", r)); if (visitor.getObjectByColumnNameAndIndex("MAX_DISTANCE", r) != null) task.setMaxDistance((int) visitor.getObjectByColumnNameAndIndex("MAX_DISTANCE", r)); if (visitor.getObjectByColumnNameAndIndex("RELATIVE_OFFSET_X", r) != null) task.setRelativeOffsetX(convertToSharedFile((String) visitor.getObjectByColumnNameAndIndex("RELATIVE_OFFSET_X", r))); @@ -650,7 +760,15 @@ public class QuestService implements INetworkDispatch { if (visitor.getObjectByColumnNameAndIndex("MESSAGE_BOX_SIZE_HEIGHT", r) != null) task.setMsgBoxHeight(Integer.parseInt((String) visitor.getObjectByColumnNameAndIndex("MESSAGE_BOX_SIZE_HEIGHT", r))); if (visitor.getObjectByColumnNameAndIndex("MESSAGE_BOX_SIZE_WIDTH", r) != null) task.setMsgBoxWidth(Integer.parseInt((String) visitor.getObjectByColumnNameAndIndex("MESSAGE_BOX_SIZE_WIDTH", r))); if (visitor.getObjectByColumnNameAndIndex("LOOT_NAME", r) != null) task.setLootName((String) visitor.getObjectByColumnNameAndIndex("LOOT_NAME", r)); - + if (visitor.getObjectByColumnNameAndIndex("TIMER_AMOUNT", r) != null) task.setTimerAmount((int) visitor.getObjectByColumnNameAndIndex("TIMER_AMOUNT", r)); + if (visitor.getObjectByColumnNameAndIndex("ITEM_TO_GIVE", r) != null) task.setItemToGive(convertToSharedFile((String) visitor.getObjectByColumnNameAndIndex("ITEM_TO_GIVE", r))); + if (visitor.getObjectByColumnNameAndIndex("CHANCE_TO_SKIP", r) != null) task.setChanceToSkip((int) visitor.getObjectByColumnNameAndIndex("CHANCE_TO_SKIP", r)); + if (visitor.getObjectByColumnNameAndIndex("MIN_START_DELAY", r) != null) task.setMinStartDelay((int) visitor.getObjectByColumnNameAndIndex("MIN_START_DELAY", r)); + if (visitor.getObjectByColumnNameAndIndex("MAX_START_DELAY", r) != null) task.setMaxStartDelay((int) visitor.getObjectByColumnNameAndIndex("MAX_START_DELAY", r)); + if (visitor.getObjectByColumnNameAndIndex("BUFF_NAME", r) != null) task.setBuffName((String) visitor.getObjectByColumnNameAndIndex("BUFF_NAME", r)); + if (visitor.getObjectByColumnNameAndIndex("DISMOUNT_PLAYER", r) != null) task.setDismountPlayer((boolean) visitor.getObjectByColumnNameAndIndex("DISMOUNT_PLAYER", r)); + if (visitor.getObjectByColumnNameAndIndex("QUEST_CONTROL_ON_TASK_COMPLETION", r) != null) task.setQuestControlOnTaskCompletion((int) visitor.getObjectByColumnNameAndIndex("QUEST_CONTROL_ON_TASK_COMPLETION", r)); + // if (visitor.getObjectByColumnNameAndIndex("MESSAGE_BOX_LOCATION_X", r) != null) task.setMsgBoxWidth((String) visitor.getObjectByColumnNameAndIndex("MESSAGE_BOX_LOCATION_X", r)); // if (visitor.getObjectByColumnNameAndIndex("MESSAGE_BOX_LOCATION_Y", r) != null) task.setMsgBoxWidth((String) visitor.getObjectByColumnNameAndIndex("MESSAGE_BOX_LOCATION_Y", r)); diff --git a/src/services/quest/QuestTask.java b/src/services/quest/QuestTask.java index 39b1f947..e6553b94 100644 --- a/src/services/quest/QuestTask.java +++ b/src/services/quest/QuestTask.java @@ -21,6 +21,8 @@ ******************************************************************************/ package services.quest; +import java.util.concurrent.ScheduledFuture; + public class QuestTask { private String type; // Tells the server what to do when they get the task private String name; @@ -32,6 +34,7 @@ public class QuestTask { private String musicOnActivate; private String musicOnComplete; private String musicOnFail; + private String buffName; private String target; private String parameter; // TODO: What does this do? private String grantQuestOnComplete; @@ -48,9 +51,6 @@ public class QuestTask { private String commMessageText; private String npcAppearanceTemplate; // NPC Appearance Server Template private String creatureType; - private int count; - private int minDistance; - private int maxDistance; private String relativeOffsetX; private String relativeOffsetY; private String tasksOnComplete; @@ -62,7 +62,11 @@ public class QuestTask { private String msgBoxTitle; private String msgBoxSound; private String lootName; + private String itemToGive; + private boolean createItem; + private boolean destroyItem; + private boolean dismountPlayer; private boolean visible; private boolean grantQuestOnCompleteShowSystemMessage; private boolean grantQuestOnFailShowSystemMessage; @@ -80,7 +84,19 @@ public class QuestTask { private int msgBoxWidth; private int msgBoxHeight; private int msgBoxLength; - + private int minStartDelay; + private int maxStartDelay; + private int timerAmount; + private int chanceToActivate; + private int chanceToSkip; + private int numToGive; + private int count; + private int minCount; + private int maxCount; + private int minDistance; + private int maxDistance; + private int questControlOnTaskCompletion; + private long waitMarkerBuilding; private float LocationX; @@ -90,7 +106,9 @@ public class QuestTask { private float waitMarkerY; private float waitMarkerZ; private float radius; - + + private transient ScheduledFuture scheduledTask; + public QuestTask() {} public QuestTask(String type, int id) { @@ -166,6 +184,14 @@ public class QuestTask { this.musicOnFail = musicOnFail; } + public int getChanceToActivate() { + return chanceToActivate; + } + + public void setChanceToActivate(int chanceToActivate) { + this.chanceToActivate = chanceToActivate; + } + public String getTarget() { return target; } @@ -595,4 +621,117 @@ public class QuestTask { public void setLootName(String lootName) { this.lootName = lootName; } + + public int getTimerAmount() { + return timerAmount; + } + + public void setTimerAmount(int timerAmount) { + this.timerAmount = timerAmount; + } + + public String getBuffName() { + return buffName; + } + + public void setBuffName(String buffName) { + this.buffName = buffName; + } + + public int getChanceToSkip() { + return chanceToSkip; + } + + public void setChanceToSkip(int chanceToSkip) { + this.chanceToSkip = chanceToSkip; + } + + public int getMinCount() { + return minCount; + } + + public void setMinCount(int minCount) { + this.minCount = minCount; + } + + public int getMaxCount() { + return maxCount; + } + + public void setMaxCount(int maxCount) { + this.maxCount = maxCount; + } + + public String getItemToGive() { + return itemToGive; + } + + public void setItemToGive(String itemToGive) { + this.itemToGive = itemToGive; + } + + + public int getMinStartDelay() { + return minStartDelay; + } + + public void setMinStartDelay(int minStartDelay) { + this.minStartDelay = minStartDelay; + } + + public int getMaxStartDelay() { + return maxStartDelay; + } + + public void setMaxStartDelay(int maxStartDelay) { + this.maxStartDelay = maxStartDelay; + } + + public boolean dismountsPlayer() { + return dismountPlayer; + } + + public void setDismountPlayer(boolean dismountPlayer) { + this.dismountPlayer = dismountPlayer; + } + + public ScheduledFuture getScheduledTask() { + return scheduledTask; + } + + public void setScheduledTask(ScheduledFuture scheduledTask) { + this.scheduledTask = scheduledTask; + } + + public int getNumToGive() { + return numToGive; + } + + public void setNumToGive(int numToGive) { + this.numToGive = numToGive; + } + + public boolean isCreateItem() { + return createItem; + } + + public void setCreateItem(boolean createItem) { + this.createItem = createItem; + } + + public boolean isDestroyItem() { + return destroyItem; + } + + public void setDestroyItem(boolean destroyItem) { + this.destroyItem = destroyItem; + } + + public int getQuestControlOnTaskCompletion() { + return questControlOnTaskCompletion; + } + + public void setQuestControlOnTaskCompletion(int questControlOnTaskCompletion) { + this.questControlOnTaskCompletion = questControlOnTaskCompletion; + } } From f54e2a35c2b4656076f5cafa6496cdc43965f982 Mon Sep 17 00:00:00 2001 From: cdmpse Date: Fri, 19 Sep 2014 20:08:52 -0500 Subject: [PATCH 4/6] Updates to Quest Resource and Script --- scripts/commands/completequest.py | 3 --- src/resources/quest/Quest.java | 43 ++++++++++++++++++++++++------- 2 files changed, 33 insertions(+), 13 deletions(-) diff --git a/scripts/commands/completequest.py b/scripts/commands/completequest.py index 1eeea046..fda8cd55 100644 --- a/scripts/commands/completequest.py +++ b/scripts/commands/completequest.py @@ -18,8 +18,5 @@ def run(core, actor, target, commandString): if quest is None: return - if (quest.getActiveTask() != (core.questService.getQuestData(quest.getName()).getTasks().size() - 1)): - return - core.questService.completeQuest(player, quest) return \ No newline at end of file diff --git a/src/resources/quest/Quest.java b/src/resources/quest/Quest.java index 99189609..cb7e7e5a 100644 --- a/src/resources/quest/Quest.java +++ b/src/resources/quest/Quest.java @@ -76,7 +76,11 @@ public class Quest extends Delta implements Serializable { public void setOwnerId(long ownerId) { this.ownerId = ownerId; } - + + public boolean isTaskActive(int taskId) { + return activeStepBitmask.get(taskId); + } + public int getActiveTask() { return activeStep; } @@ -85,16 +89,18 @@ public class Quest extends Delta implements Serializable { this.activeStep = activeStep; } + public boolean isTaskCompleted(int taskId) { + return completedStepBitmask.get(taskId); + } + public boolean isCompleted() { return isCompleted; } - - public void setCompleted(boolean isCompleted) { - if (isCompleted) { - //activeStepBitmask.set(activeStep, false); - completedStepBitmask.set(activeStep); - } - this.isCompleted = isCompleted; + + public void setCompleted() { + activeStepBitmask.clear(); + completedStepBitmask.set(0, 16, true); + this.isCompleted = true; } public boolean hasRecievedAward() { @@ -131,13 +137,31 @@ public class Quest extends Delta implements Serializable { activeStep++; activeStepBitmask.set(activeStep, true); - //System.out.println("Active step was "+ (activeStep - 1) + " and is now " + activeStep ); } public void complete() { completedStepBitmask.set(activeStep); + } + + public void completeQuestStep(int step) { + completedStepBitmask.set(step); + activeStepBitmask.set(step, false); + } + + public void setQuestStep(int step) { + activeStep = step; + addActiveStep(step); + } + + public void addActiveStep(int step) { + activeStepBitmask.set(step, true); + } + + public void reset() { + activeStep = 0; activeStepBitmask.clear(); + completedStepBitmask.clear(); } public ScheduledFuture getTimer() { @@ -224,5 +248,4 @@ public class Quest extends Delta implements Serializable { //StringUtilities.printBytes(buffer.array()); return buffer.array(); } - } From 70f2ee1fc001b1a5eabb30dfbaf8bad5099c74db Mon Sep 17 00:00:00 2001 From: cdmpse Date: Fri, 19 Sep 2014 20:20:11 -0500 Subject: [PATCH 5/6] Fixed Syntax Errors --- .../wearables/bracelet/item_bracelet_l_set_bh_dps_01_01.py | 2 +- .../bracelet/item_bracelet_l_set_commando_dps_01_01.py | 2 +- .../wearables/bracelet/item_bracelet_r_set_bh_dps_01_01.py | 2 +- .../wearables/necklace/item_necklace_set_bh_dps_01_01.py | 2 +- .../tangible/wearables/ring/item_band_set_bh_dps_01_01.py | 2 +- .../tangible/wearables/ring/item_ring_set_bh_dps_01_01.py | 2 +- 6 files changed, 6 insertions(+), 6 deletions(-) diff --git a/scripts/object/tangible/wearables/bracelet/item_bracelet_l_set_bh_dps_01_01.py b/scripts/object/tangible/wearables/bracelet/item_bracelet_l_set_bh_dps_01_01.py index 343e99a4..45c62a40 100644 --- a/scripts/object/tangible/wearables/bracelet/item_bracelet_l_set_bh_dps_01_01.py +++ b/scripts/object/tangible/wearables/bracelet/item_bracelet_l_set_bh_dps_01_01.py @@ -13,6 +13,6 @@ def setup(core, object): object.setIntAttribute('cat_skill_mod_bonus.@stat_n:expertise_cooldown_line_dm', 1) object.setStringAttribute('@set_bonus:piece_bonus_count_3', '@set_bonus:set_bonus_bh_dps_1') object.setStringAttribute('@set_bonus:piece_bonus_count_4', '@set_bonus:set_bonus_bh_dps_2') - object.setStringAttribute('@set_bonus:piece_bonus_count_5', '@set_bonus:set_bonus_bh_dps_3) + object.setStringAttribute('@set_bonus:piece_bonus_count_5', '@set_bonus:set_bonus_bh_dps_3') object.setAttachment('setBonus', 'set_bonus_bh_dps') return \ No newline at end of file diff --git a/scripts/object/tangible/wearables/bracelet/item_bracelet_l_set_commando_dps_01_01.py b/scripts/object/tangible/wearables/bracelet/item_bracelet_l_set_commando_dps_01_01.py index 865e7b8c..e543cff7 100644 --- a/scripts/object/tangible/wearables/bracelet/item_bracelet_l_set_commando_dps_01_01.py +++ b/scripts/object/tangible/wearables/bracelet/item_bracelet_l_set_commando_dps_01_01.py @@ -12,6 +12,6 @@ def setup(core, object): object.setIntAttribute('cat_skill_mod_bonus.@stat_n:expertise_freeshot_co_grenade', 2) object.setStringAttribute('@set_bonus:piece_bonus_count_3', '@set_bonus:set_bonus_commando_dps_1') object.setStringAttribute('@set_bonus:piece_bonus_count_4', '@set_bonus:set_bonus_commando_dps_2') - object.setStringAttribute('@set_bonus:piece_bonus_count_5', '@set_bonus:set_bonus_commando_dps_3) + object.setStringAttribute('@set_bonus:piece_bonus_count_5', '@set_bonus:set_bonus_commando_dps_3') object.setAttachment('setBonus', 'set_bonus_commando_dps') return \ No newline at end of file diff --git a/scripts/object/tangible/wearables/bracelet/item_bracelet_r_set_bh_dps_01_01.py b/scripts/object/tangible/wearables/bracelet/item_bracelet_r_set_bh_dps_01_01.py index 08a7a2d6..ec863b10 100644 --- a/scripts/object/tangible/wearables/bracelet/item_bracelet_r_set_bh_dps_01_01.py +++ b/scripts/object/tangible/wearables/bracelet/item_bracelet_r_set_bh_dps_01_01.py @@ -13,6 +13,6 @@ def setup(core, object): object.setIntAttribute('cat_skill_mod_bonus.@stat_n:expertise_cooldown_line_dm', 1) object.setStringAttribute('@set_bonus:piece_bonus_count_3', '@set_bonus:set_bonus_bh_dps_1') object.setStringAttribute('@set_bonus:piece_bonus_count_4', '@set_bonus:set_bonus_bh_dps_2') - object.setStringAttribute('@set_bonus:piece_bonus_count_5', '@set_bonus:set_bonus_bh_dps_3) + object.setStringAttribute('@set_bonus:piece_bonus_count_5', '@set_bonus:set_bonus_bh_dps_3') object.setAttachment('setBonus', 'set_bonus_bh_dps') return \ No newline at end of file diff --git a/scripts/object/tangible/wearables/necklace/item_necklace_set_bh_dps_01_01.py b/scripts/object/tangible/wearables/necklace/item_necklace_set_bh_dps_01_01.py index 32a45e54..86cf5f2a 100644 --- a/scripts/object/tangible/wearables/necklace/item_necklace_set_bh_dps_01_01.py +++ b/scripts/object/tangible/wearables/necklace/item_necklace_set_bh_dps_01_01.py @@ -13,6 +13,6 @@ def setup(core, object): object.setIntAttribute('cat_skill_mod_bonus.@stat_n:expertise_cooldown_line_dm', 1) object.setStringAttribute('@set_bonus:piece_bonus_count_3', '@set_bonus:set_bonus_bh_dps_1') object.setStringAttribute('@set_bonus:piece_bonus_count_4', '@set_bonus:set_bonus_bh_dps_2') - object.setStringAttribute('@set_bonus:piece_bonus_count_5', '@set_bonus:set_bonus_bh_dps_3) + object.setStringAttribute('@set_bonus:piece_bonus_count_5', '@set_bonus:set_bonus_bh_dps_3') object.setAttachment('setBonus', 'set_bonus_bh_dps') return \ No newline at end of file diff --git a/scripts/object/tangible/wearables/ring/item_band_set_bh_dps_01_01.py b/scripts/object/tangible/wearables/ring/item_band_set_bh_dps_01_01.py index 90d0db77..b7cf8f58 100644 --- a/scripts/object/tangible/wearables/ring/item_band_set_bh_dps_01_01.py +++ b/scripts/object/tangible/wearables/ring/item_band_set_bh_dps_01_01.py @@ -15,6 +15,6 @@ def setup(core, object): object.setIntAttribute('cat_skill_mod_bonus.@stat_n:expertise_cooldown_line_dm', 1) object.setStringAttribute('@set_bonus:piece_bonus_count_3', '@set_bonus:set_bonus_bh_dps_1') object.setStringAttribute('@set_bonus:piece_bonus_count_4', '@set_bonus:set_bonus_bh_dps_2') - object.setStringAttribute('@set_bonus:piece_bonus_count_5', '@set_bonus:set_bonus_bh_dps_3) + object.setStringAttribute('@set_bonus:piece_bonus_count_5', '@set_bonus:set_bonus_bh_dps_3') object.setAttachment('setBonus', 'set_bonus_bh_dps') return \ No newline at end of file diff --git a/scripts/object/tangible/wearables/ring/item_ring_set_bh_dps_01_01.py b/scripts/object/tangible/wearables/ring/item_ring_set_bh_dps_01_01.py index 9bb5bc01..365a9d3d 100644 --- a/scripts/object/tangible/wearables/ring/item_ring_set_bh_dps_01_01.py +++ b/scripts/object/tangible/wearables/ring/item_ring_set_bh_dps_01_01.py @@ -15,6 +15,6 @@ def setup(core, object): object.setIntAttribute('cat_skill_mod_bonus.@stat_n:expertise_cooldown_line_dm', 1) object.setStringAttribute('@set_bonus:piece_bonus_count_3', '@set_bonus:set_bonus_bh_dps_1') object.setStringAttribute('@set_bonus:piece_bonus_count_4', '@set_bonus:set_bonus_bh_dps_2') - object.setStringAttribute('@set_bonus:piece_bonus_count_5', '@set_bonus:set_bonus_bh_dps_3) + object.setStringAttribute('@set_bonus:piece_bonus_count_5', '@set_bonus:set_bonus_bh_dps_3') object.setAttachment('setBonus', 'set_bonus_bh_dps') return \ No newline at end of file From 293f533e0d401465107459a787fbe021248d5715 Mon Sep 17 00:00:00 2001 From: cdmpse Date: Sun, 21 Sep 2014 17:11:47 -0500 Subject: [PATCH 6/6] Fixed Syntax Errors --- scripts/loot/lootPools/dantooine/re_junk_rogue_droid.py | 2 +- scripts/loot/lootPools/dathomir/re_junk_nightsister_sentry.py | 2 +- scripts/loot/lootPools/jediholocrons.py | 2 +- scripts/loot/lootPools/junk_organic.py | 2 +- scripts/loot/lootPools/yavin_iv/re_junk_crazed_geonosian.py | 2 +- .../loot/lootPools/yavin_iv/re_junk_yavin_blacksun_assassin.py | 2 -- 6 files changed, 5 insertions(+), 7 deletions(-) diff --git a/scripts/loot/lootPools/dantooine/re_junk_rogue_droid.py b/scripts/loot/lootPools/dantooine/re_junk_rogue_droid.py index 803baf78..0bbd3d0e 100644 --- a/scripts/loot/lootPools/dantooine/re_junk_rogue_droid.py +++ b/scripts/loot/lootPools/dantooine/re_junk_rogue_droid.py @@ -1,7 +1,7 @@ def itemNames(): - return ['aeromagnifier','comlink',control_box','droid_motor_red'] + return ['aeromagnifier','comlink','control_box','droid_motor_red'] def itemChances(): diff --git a/scripts/loot/lootPools/dathomir/re_junk_nightsister_sentry.py b/scripts/loot/lootPools/dathomir/re_junk_nightsister_sentry.py index 768fbccc..cce227a0 100644 --- a/scripts/loot/lootPools/dathomir/re_junk_nightsister_sentry.py +++ b/scripts/loot/lootPools/dathomir/re_junk_nightsister_sentry.py @@ -1,7 +1,7 @@ def itemNames(): - return ['armor_repair_device','chassis_blueprints','dented_metal_case','medical_console',medical_device','motor','software_module','speederdrive'] + return ['armor_repair_device','chassis_blueprints','dented_metal_case','medical_console','medical_device','motor','software_module','speederdrive'] def itemChances(): diff --git a/scripts/loot/lootPools/jediholocrons.py b/scripts/loot/lootPools/jediholocrons.py index af0a9daa..45d4b00a 100644 --- a/scripts/loot/lootPools/jediholocrons.py +++ b/scripts/loot/lootPools/jediholocrons.py @@ -3,7 +3,7 @@ def itemNames(): items=['jedi_holocron_1_5','jedi_holocron_2_5','jedi_holocron_3_5','jedi_holocron_4_5','jedi_holocron_5_5'] items=items+['jedi_holocron_1_5_wp','jedi_holocron_2_5_wp','jedi_holocron_3_5_wp','jedi_holocron_4_5_wp','jedi_holocron_5_5_wp'] - return names + return items def itemChances(): diff --git a/scripts/loot/lootPools/junk_organic.py b/scripts/loot/lootPools/junk_organic.py index ee2e7073..d92789ad 100644 --- a/scripts/loot/lootPools/junk_organic.py +++ b/scripts/loot/lootPools/junk_organic.py @@ -1,7 +1,7 @@ def itemNames(): - templates=['antenna','brain','eye','gland','heart','stomach'] leg, Nerve Complex, organ missing + templates=['antenna','brain','eye','gland','heart','stomach']# leg, Nerve Complex, organ missing return templates diff --git a/scripts/loot/lootPools/yavin_iv/re_junk_crazed_geonosian.py b/scripts/loot/lootPools/yavin_iv/re_junk_crazed_geonosian.py index 8f5de199..ad31deaf 100644 --- a/scripts/loot/lootPools/yavin_iv/re_junk_crazed_geonosian.py +++ b/scripts/loot/lootPools/yavin_iv/re_junk_crazed_geonosian.py @@ -1,7 +1,7 @@ def itemNames(): - return ['armor_repair_device','dented_metal_case',medical_console','worklight'] + return ['armor_repair_device','dented_metal_case','medical_console','worklight'] def itemChances(): diff --git a/scripts/loot/lootPools/yavin_iv/re_junk_yavin_blacksun_assassin.py b/scripts/loot/lootPools/yavin_iv/re_junk_yavin_blacksun_assassin.py index 68561623..c0402f6e 100644 --- a/scripts/loot/lootPools/yavin_iv/re_junk_yavin_blacksun_assassin.py +++ b/scripts/loot/lootPools/yavin_iv/re_junk_yavin_blacksun_assassin.py @@ -1,8 +1,6 @@ def itemNames(): - return ['chassis_blueprints','circuit_board','medical_console','motor','software_module','used_vidscreen'] def itemChances(): - return [15,10,5,30,30,10] \ No newline at end of file