FILES ----- debug.macros dungeon_worlds.config sky.config [NEW] dungeons\microdungeons\bounty\tutorialbounty.dungeon [NEW] dungeons\microdungeons\bounty\tutorialbounty.json [NEW] dungeons\microdungeons\bounty\tutorialclues.dungeon [NEW] dungeons\microdungeons\bounty\tutorialclues.json dungeons\missions\cultistmissions\cultistmission1.json interface\scripted\bountyboard\bountyboardgui.config interface\scripted\bountyboard\bountyboardgui.lua monsters\boss\swansong\swansong.lua monsters\boss\swansong\swansong.monstertype [NEW] music\dead-or-alive.ogg [NEW] music\swansong.ogg [NEW] music\the-peacekeepers.ogg [NEW] npcs\bounty\ignobletarget.npctype [NEW] npcs\bounty\nobleclue.npctype projectiles\boss\swansong\ophanimspawner\ophanimspawner.projectile quests\bounty\bounty.lua quests\bounty\bounty_gen.lua quests\bounty\capture_bounty.questtemplate quests\bounty\capture_ship_bounty.questtemplate quests\bounty\capture_space_bounty.questtemplate quests\bounty\clue_items.config quests\bounty\clue_npcs.config quests\bounty\clue_objects.config quests\bounty\clue_scans.config quests\bounty\dungeons.config quests\bounty\find_clue_item.questtemplate quests\bounty\find_clue_npc.questtemplate quests\bounty\find_clue_object.questtemplate quests\bounty\find_clue_scan.questtemplate quests\bounty\find_space_clue_item.questtemplate quests\bounty\find_space_clue_npc.questtemplate quests\bounty\find_space_clue_object.questtemplate quests\bounty\find_space_clue_scan.questtemplate [NEW] quests\bounty\find_tutorial_clues.questtemplate quests\bounty\generator.config quests\bounty\kill_bounty_monster.questtemplate quests\bounty\stages.lua radiomessages\bounty.radiomessages scripts\bountygeneration.lua sfx\interface\hyperspace_end.ogg sfx\interface\hyperspace_start.ogg stagehands\bountymanager.lua stagehands\boss\bossmusic.lua DIFFS ----- debug.macros 15a16 > "/giveessentialitem scanmode inspectiontool", 20a22,30 > ], > > "tier6kit" : [ > "/spawnitem rarebroadsword 1 '{\"level\":6}'", > "/spawnitem rareassaultrifle 1 '{\"level\":6}'", > "/spawnitem humantier6mhead", > "/spawnitem humantier6mpants", > "/spawnitem humantier6mchest", > "/spawnitem heatprotectionback" dungeon_worlds.config 514c514 < "musicTrack" : "/music/tranquility-base.ogg", --- > "musicTrack" : "/music/the-peacekeepers.ogg", 530c530 < "musicTrack" : "/music/tranquility-base.ogg", --- > "musicTrack" : "/music/the-peacekeepers.ogg", 546c546 < "musicTrack" : "/music/tranquility-base.ogg", --- > "musicTrack" : "/music/the-peacekeepers.ogg", 562c562 < "musicTrack" : "/music/tranquility-base.ogg", --- > "musicTrack" : "/music/the-peacekeepers.ogg", 578c578 < "musicTrack" : "/music/tranquility-base.ogg", --- > "musicTrack" : "/music/the-peacekeepers.ogg", sky.config 11c11 < "hyperspaceSpeedupTime" : 2.0, --- > "hyperspaceSpeedupTime" : 2.4, 184,185c184,185 < "enterHyperspaceAudioLeadIn" : 7.9, < "exitHyperspaceAudioLeadIn" : 2.7, --- > "enterHyperspaceAudioLeadIn" : 2.4, > "exitHyperspaceAudioLeadIn" : 2.1, dungeons\missions\cultistmissions\cultistmission1.json [TMX file differences are left out for huge size.] interface\scripted\bountyboard\bountyboardgui.config 348c348,349 < "hat" : "cultisthead" --- > "hat" : "cultisthead", > "species" : ["human"] 362a364,384 > "tutorialAssignment" : { > "description" : "Rank I: Hopeful Hunter", > "icon" : "/interface/scripted/bountyboard/rank1.png", > "systemTypes" : ["whitestar"], > "bounties" : { > "minorPlanet" : ["minorMonster", "minorPlanet"], > "minor" : ["minorMonster", "minorPlanet", "minorSpace"], > "major" : ["majorGang"], > "capstone" : ["tutorialCapstone"] > }, > "gang" : { > "name" : "Rowdy Peace Disturbers", > "hat" : "grouchohead" > }, > "rewardMultipliers" : { > "money" : 1.5, > "rank" : 1.0 > }, > "pointsToCapstone" : 0 > }, > 580a603,631 > }, > "useGang" : true > }, > "randomTags" : { > "wantedImage" : "wantedImage", > "captureType" : "capstoneText", > "posterColor" : "majorColor" > } > }, > "tutorialCapstone" : { > "poster" : "major", > "questConfig" : { > "arcType" : "major", > "target" : { > "type" : "npc", > "name" : "Captain Ignoble", > "species" : "novakid", > "typeName" : "ignobletarget", > "parameters" : {} > }, > "targetType" : "npc", > "preBountyQuest" : "pre_bounty", > "questCategories" : ["planet"], > "stepCount" : [2, 2], > "endStep" : "tutorial_bounty", > "rewards" : { > "money" : 50, > "rank" : 20, > "credits" : 1 interface\scripted\bountyboard\bountyboardgui.lua 16a17 > self.tutorialAssignment = config.getParameter("tutorialAssignment") 201c202,206 < if finalAssignment then --- > local tutorial = false > if self.assignment == nil then > tutorial = true > rankInfo = self.tutorialAssignment > elseif finalAssignment then 208c213 < if self.assignment and self.assignment.system then --- > if self.assignment and self.assignment.system and not self.assignment.tutorial then 213a219,222 > self.bountyStation = { > system = newSystem, > worldId = nil > } 217c226 < if boardAssignment then --- > if boardAssignment and not tutorial then 241,244c250 < } < self.bountyStation = { < system = newSystem, < worldId = nil --- > tutorial = tutorial, 247a254,255 > sb.logInfo("Got new assignment") > 270c278 < if self.assignment and boardAssignment and not compare(self.assignment.system, boardAssignment.system) then --- > if self.assignment and not self.assignment.tutorial and boardAssignment and not compare(self.assignment.system, boardAssignment.system) then 404c412 < if player.worldId() == self.bountyStation.worldId then --- > if player.worldId() == self.bountyStation.worldId and not self.assignment.tutorial then 580a589,591 > if self.assignment.tutorial then > poolId = "tutorial" > end 584c595 < if #self.posters > 0 and poolId == "capstone" then --- > if #self.posters > 0 and (poolId == "capstone" or poolId == "tutorial") then 644c655,656 < if poolId == "capstone" then --- > sb.logInfo("Pool id: %s", poolId) > if (poolId == "capstone" or poolId == "tutorial") then 661c673,675 < if self.assignment.final then --- > if self.assignment.tutorial then > rankInfo = self.tutorialAssignment > elseif self.assignment.final then 827,837c841,842 < local rank = self.assignment.rank or getPlayerRank() < local nextRankInfo = self.bountyRanks[rank + 1] < < local pointsToCapstone = 100 < if self.assignment and self.assignment.pointsToCapstone ~= nil then < pointsToCapstone = self.assignment.pointsToCapstone < end < if (nextRankInfo and self.playerRankPoints >= nextRankInfo.threshold) or pointsToCapstone <= 0 then < loadBoard(true) < return < end --- > -- local rank = self.assignment.rank or getPlayerRank() > -- local nextRankInfo = self.bountyRanks[rank + 1] 839,849c844,863 < if nextRankInfo then < player.setProperty("bountyPoints", nextRankInfo.threshold + 10) < else < local rankInfo = self.bountyRanks[rank] < self.assignment.pointsToCapstone = -10 < player.setProperty("bountyAssignment", self.assignment) < end < < removePosters() < player.setProperty("bountyPosters", nil) < loadBoard(false) --- > -- local pointsToCapstone = 100 > -- if self.assignment and self.assignment.pointsToCapstone ~= nil then > -- pointsToCapstone = self.assignment.pointsToCapstone > -- end > -- if (nextRankInfo and self.playerRankPoints >= nextRankInfo.threshold) or pointsToCapstone <= 0 then > -- loadBoard(true) > -- return > -- end > > -- if nextRankInfo then > -- player.setProperty("bountyPoints", nextRankInfo.threshold + 10) > -- else > -- local rankInfo = self.bountyRanks[rank] > -- self.assignment.pointsToCapstone = -10 > -- player.setProperty("bountyAssignment", self.assignment) > -- end > > -- removePosters() > -- player.setProperty("bountyPosters", nil) > -- loadBoard(false) 852,857c866,869 < -- player.setProperty("bountyPoints", nil) < -- player.setProperty("lastBountyAssignment", nil) < -- player.setProperty("bountyAssignment", nil) < -- player.setProperty("bountyPosters", {}) < -- self.assignment.poolId = "standard" < -- player.setProperty("bountyAssignment", self.assignment) --- > player.setProperty("bountyPoints", nil) > player.setProperty("lastBountyAssignment", nil) > player.setProperty("bountyAssignment", nil) > player.setProperty("bountyPosters", {}) monsters\boss\swansong\swansong.lua 290a291,297 > function setMusicEnabled(enabled) > local res = util.await(world.sendEntityMessage("bossmusic", "setMusicEnabled", enabled)) > if not res:succeeded() then > sb.logInfo("Error starting boss music: %s", res:error()) > end > end > 325a333 > setMusicEnabled(true) 387a396,398 > > setMusicEnabled(false) > -- death animation 610a622 > setMusicEnabled(false) 655c667 < local waitTime = dialogTime / #dialog - 1 --- > local waitTime = (dialogTime - 6.0) / (#dialog - 1) 657a670,672 > if i == 3 then > setMusicEnabled(true) > end 661a677 > await(delay(6.0)) monsters\boss\swansong\swansong.monstertype 30a31,32 > "music" : "/music/swansong.ogg", > 262c264 < "mouthOffset" : [4, 4], --- > "mouthOffset" : [4, 12], projectiles\boss\swansong\ophanimspawner\ophanimspawner.projectile 43a44 > "fullbright" : true, quests\bounty\bounty.lua 50c50 < return nextStage() --- > storage.event["scannedClue"] = true 78a79,80 > > self.playingMusic = true 184a187,193 > function stopMusic() > if self.playingMusic then > world.sendEntityMessage(player.id(), "stopAltMusic") > self.playingMusic = false > end > end > 193a203,204 > stopMusic() > 230a242,243 > stopMusic() > 326a340,343 > if storage.stage ~= i then > stopMusic() > end > quests\bounty\bounty_gen.lua 8,12c8 < "scared", < "crazy", < "deceptive", < "tricky", < "bribe", --- > "crazy" 21c17 < local generator, target = questGenerator(behaviorName, "capture_bounty", 3) --- > local generator, target = questGenerator(behaviorName, "tutorial_bounty", 2) 60c56 < generator.preBountyQuest = "pre_bounty_doa" --- > generator.preBountyQuest = "pre_bounty" quests\bounty\capture_bounty.questtemplate 47,48c47,49 < "playApproachMessage" : true, < "playExploreMessage" : true, --- > "playExploreMessage" : false, > "playApproachMessage" : false, > "approachMusic" : "/music/dead-or-alive.ogg", quests\bounty\capture_ship_bounty.questtemplate 48a49,52 > "playExploreMessage" : false, > "playApproachMessage" : false, > "approachMusic" : "/music/dead-or-alive.ogg", > quests\bounty\capture_space_bounty.questtemplate 48a49,52 > "playExploreMessage" : false, > "playApproachMessage" : false, > "approachMusic" : "/music/dead-or-alive.ogg", > quests\bounty\clue_items.config 395a396,402 > "tutorial" : [ > { > "parameters" : { > "noteText" : "--TODO--\n\nHowdy Peacekeeper,\n\nI regret to inform you that I, ^green;Captain Ignoble^reset;, am no longer residing in this particular residence.\n\n I've set up camp somwhere else .\n\nFind me if you can!" > } > } > ], quests\bounty\clue_npcs.config 1a2,39 > "tutorial" : { > "npc" : { > "typeName" : "nobleclue" > }, > "behaviorOverrides" : [ > { > "type" : "notification", > "behavior" : { > "name" : "bounty-interrogate", > "parameters" : { > "quest" : "", > "dialog" : "/quests/bounty/clue_npcs.config:tutorial.clues..dialog" > } > } > } > ], > "clues" : { > "tutorial" : { > "dialog" : { > "interrogateStart" : { > "default" : { > "default" : [ > "--TODO-- You'll need to get past me to reach ^green;Doctor Ignoble^reset;, partn... adversary!" > ] > } > }, > "interrogateEnd" : { > "default" : { > "default" : [ > "--TODO-- I knew a low life like me could never stand against the peacekeepers! ^green;Ignoble^reset; is on this very planet." > ] > } > } > } > } > } > }, > 85c123 < "typeName" : "hostile" --- > "typeName" : "gangmember" quests\bounty\clue_objects.config 288a289,291 > "tutorial" : { > "dialog" : " is [LOCATED] on [PLANET] ^green;^reset;" > }, quests\bounty\clue_scans.config 2a3,5 > "tutorial" : { > "description" : "^#60b8ea;[SIGNATURE TRACE COMPLETE: ^yellow;UPLOADING CO-ORDINATES^#60b8ea;]" > }, 20a24,26 > "tutorial" : { > "description" : "^#60b8ea;[SIGNATURE TRACE COMPLETE: ^yellow;UPLOADING CO-ORDINATES^#60b8ea;]" > }, quests\bounty\dungeons.config 3,7c3,7 < "default" : [ "safehouse", "vault", "undergroundsafehouse", "undergroundvault", "minor_spawn" ], < "ocean" : [ "safehouse", "vault", "boat", "boatvault", "undergroundsafehouse", "undergroundvault", "minor_spawn" ], < "toxic" : [ "safehouse", "vault", "boat", "boatvault", "undergroundsafehouse", "undergroundvault", "minor_spawn" ], < "arctic" : [ "safehouse", "vault", "boat", "boatvault", "undergroundsafehouse", "undergroundvault", "minor_spawn" ], < "magma" : [ "safehouse", "vault", "boat", "boatvault", "undergroundsafehouse", "undergroundvault", "minor_spawn" ] --- > "default" : [ "safehouse", "vault", "undergroundsafehouse", "undergroundvault", "minor_spawn", "tutorialclues", "tutorialbounty" ], > "ocean" : [ "safehouse", "vault", "boat", "boatvault", "undergroundsafehouse", "undergroundvault", "minor_spawn", "tutorialclues", "tutorialbounty" ], > "toxic" : [ "safehouse", "vault", "boat", "boatvault", "undergroundsafehouse", "undergroundvault", "minor_spawn", "tutorialclues", "tutorialbounty" ], > "arctic" : [ "safehouse", "vault", "boat", "boatvault", "undergroundsafehouse", "undergroundvault", "minor_spawn", "tutorialclues", "tutorialbounty" ], > "magma" : [ "safehouse", "vault", "boat", "boatvault", "undergroundsafehouse", "undergroundvault", "minor_spawn", "tutorialclues", "tutorialbounty" ] 41a42,49 > }, > "tutorialclues" : { > "type" : "surface", > "tags" : [ "tutorial_clue" ] > }, > "tutorialbounty" : { > "type" : "surface", > "tags" : [ "tutorial_bounty" ] quests\bounty\find_clue_item.questtemplate 43,44c43,45 < "playApproachMessage" : true, < "playExploreMessage" : true, --- > "playExploreMessage" : false, > "playApproachMessage" : false, > "approachMusic" : "/music/dead-or-alive.ogg", quests\bounty\find_clue_npc.questtemplate 43,44c43,45 < "playApproachMessage" : true, < "playExploreMessage" : true, --- > "playExploreMessage" : false, > "playApproachMessage" : false, > "approachMusic" : "/music/dead-or-alive.ogg", quests\bounty\find_clue_object.questtemplate 43,44c43,45 < "playApproachMessage" : true, < "playExploreMessage" : true, --- > "playExploreMessage" : false, > "playApproachMessage" : false, > "approachMusic" : "/music/dead-or-alive.ogg", quests\bounty\find_clue_scan.questtemplate 43,44c43,45 < "playApproachMessage" : true, < "playExploreMessage" : true, --- > "playExploreMessage" : false, > "playApproachMessage" : false, > "approachMusic" : "/music/dead-or-alive.ogg", quests\bounty\find_space_clue_item.questtemplate 44a45,48 > "playExploreMessage" : false, > "playApproachMessage" : false, > "approachMusic" : "/music/dead-or-alive.ogg", > quests\bounty\find_space_clue_npc.questtemplate 44a45,48 > "playExploreMessage" : false, > "playApproachMessage" : false, > "approachMusic" : "/music/dead-or-alive.ogg", > quests\bounty\find_space_clue_object.questtemplate 44a45,48 > "playExploreMessage" : false, > "playApproachMessage" : false, > "approachMusic" : "/music/dead-or-alive.ogg", > quests\bounty\find_space_clue_scan.questtemplate 44a45,48 > "playExploreMessage" : false, > "playApproachMessage" : false, > "approachMusic" : "/music/dead-or-alive.ogg", > quests\bounty\generator.config 241a242,324 > > "find_tutorial_clues" : { > "category" : "planet", > "quest" : "find_tutorial_clues", > "questParameters" : {}, > "clueTypes" : [ > "tutorial" > ], > > "coordinate" : { > "type" : "world", > "questParameter" : "world" > }, > > "locations" : { > "clue" : { > "type" : "dungeon", > "position" : "surface", > "tags" : [ "tutorial_clue" ] > } > }, > > "spawns" : { > "clueItem" : { > "location" : "clue", > "type" : "clueItem" > }, > "clueScan" : { > "location" : "clue", > "type" : "clueScan" > }, > "clueObject" : { > "location" : "clue", > "type" : "clueObject" > }, > "clueNpc" : { > "location" : "clue", > "type" : "clueNpc", > "npc" : { > "species" : "novakid" > } > } > } > }, > > "tutorial_bounty" : { > "category" : "planet", > "quest" : "capture_bounty", > "questParameters" : {}, > > "coordinate" : { > "type" : "world", > "questParameter" : "world" > }, > > "locations" : { > "bounty" : { > "type" : "dungeon", > "position" : "surface", > "tags" : [ "tutorial_bounty" ] > } > }, > > "spawns" : { > "bounty" : { > "location" : "bounty", > "type" : "bounty", > "behaviorOverrides" : [], > "npc" : { > "typeName" : "ignobletarget", > "species" : "novakid", > "parameters" : { > "scriptConfig" : { > "gang" : { > "name" : "Rowdy Peace Disturbers", > "hat" : "grouchohead" > } > } > } > } > } > } > }, 710,712c793 < }, < < "message" : "Nice work takin' down that criminal, partner!" --- > } 1284a1366,1388 > } > }, > > { > "prev" : { > "clueType" : "tutorial", > > "text" : { > "message" : "--TODO-- Nice work findin' all those clues, partner! You have enough info to track down the rowdy ^green;Captain Ignoble^reset; now!" > } > }, > > "next" : { > "step" : "tutorial_bounty", > > "coordinate" : { > "type" : "previous", > "questParameter" : "world" > }, > > "text" : { > "message" : "--TODO-- I can't believe it, partner! You took Captain Ignoble down. Such a strong fella he was, too! ^orange;Return to the peacekeeper station^reset; for a new assignment." > } quests\bounty\kill_bounty_monster.questtemplate 46a47,49 > "playExploreMessage" : false, > "playApproachMessage" : false, > quests\bounty\stages.lua 4c4,5 < player.radioMessage("exploreclueplanet") --- > local message = config.getParameter("exploreMessage", "exploreclueplanet") > player.radioMessage(message) 11a13 > message = config.getParameter("approachMessage", message) 16a19,29 > function playBountyMusic() > local musicTrack = config.getParameter("approachMusic") > if musicTrack then > local tracks = jarray() > table.insert(tracks, musicTrack) > self.playingMusic = true > sb.logInfo("Play alt music track %s", musicTrack) > world.sendEntityMessage(player.id(), "playAltMusic", {musicTrack}) > end > end > 82a96 > playBountyMusic() 135a150 > playBountyMusic() 190a206 > playBountyMusic() 251a268 > playBountyMusic() 296a314 > playBountyMusic() 316c334 < while true do --- > while not storage.scannedClue do 485a504 > playBountyMusic() 588a608,675 > end > end > > function tutorialClueStage() > local objectiveText = config.getParameter("objectives.tutorialClueStage") > local clueItem = quest.parameters().spawns.spawns.clueItem.item > > quest.setObjectiveList({ > {objectiveText[1], false} > }) > quest.setCompassDirection(nil) > quest.setIndicators({}) > > playBountyMusic() > while not storage.spawned["clueItem"] and not storage.spawned["clueObject"] and not storage.spawned["clueNpc"] and not storage.spawned["clueScan"] do > playExploreMessage() > > if not onQuestWorld() then > return previousStage() > end > > coroutine.yield() > end > > -- scan clue > storage.scanObjects = storage.scanObjects or copyArray(storage.scanIds["clueScan"]) > self.scanClue = quest.parameters().spawns.spawns.clueScan.uuid > > -- object interaction clue > self.onInteract = function(entityId) > if world.entityUniqueId(entityId) ~= storage.spawned["clueObject"] then > return > end > > local name = world.entityName(entityId) > local clueConfig = root.assetJson("/quests/bounty/clue_objects.config")[name] > if clueConfig then > world.sendEntityMessage(quest.questArcDescriptor().stagehandUniqueId, "interactObject", quest.questId(), entityId) > end > end > > playApproachMessage("approachclue") > while true do > local toClue = world.distance(storage.spawned["clueItem"], entity.position()) > local distance = world.magnitude(toClue) > if distance > 32 then > quest.setCompassDirection(vec2.angle(toClue)) > else > quest.setCompassDirection(nil) > end > > local findItemStatus = storage.event["foundClue"] or false > local findObjectStatus = storage.event["objectInteracted"] or false > local findScanStatus = storage.event["scannedClue"] or false > local findNpcStatus = storage.event["clueGiven"] or false > > quest.setObjectiveList({ > {objectiveText[2].findNpc, findNpcStatus}, > {objectiveText[2].findItem, findItemStatus}, > {objectiveText[2].findObject, findObjectStatus}, > {objectiveText[2].findScan, findScanStatus} > }) > > if findItemStatus and findObjectStatus and findScanStatus and findNpcStatus then > return nextStage() > end > > coroutine.yield() radiomessages\bounty.radiomessages 18a19,31 > }, > > "tutorialexplore" : { > "senderName" : "Captain Noble", > "portraitImage" : "/interface/chatbubbles/captain.png:", > "text" : "The target could be anywhere on this planet, even underground! ^green;Explore^reset; the planet until we pick up the ^orange;target signature^reset;", > "unique" : false > }, > "tutorialapproachclue" : { > "senderName" : "Captain Noble", > "portraitImage" : "/interface/chatbubbles/captain.png:", > "text" : "We've picked up the ^orange;target signature^reset;. Track your bounty and the ^green;compass^reset; will show you the direction!", > "unique" : false scripts\bountygeneration.lua 150c150 < local species = util.randomFromList(npcConfig.species, self.rand) --- > local species = util.randomFromList(gang.species or npcConfig.species, self.rand) 199c199 < local species = util.randomFromList({"human", "hylotl", "avian", "glitch", "novakid", "apex", "floran"}, self.rand) --- > local species = util.randomFromList(gang.species or {"human", "hylotl", "avian", "glitch", "novakid", "apex", "floran"}, self.rand) 390c390,396 < local weight = o.weight or 1.0 --- > local weight = o.weight > if weight == nil and o.prev.step then > -- if edge is not weighted, use the weight of the prev step, if any > weight = self.config.steps[o.prev.step].weight > end > weight = weight or 1.0 > 689,690c695,696 < npc = clueConfig.npc, < behaviorOverrides = clueConfig.behaviorOverrides --- > npc = sb.jsonMerge(clueConfig.npc or {}, spawnConfig.npc or {}), > behaviorOverrides = spawnConfig.behaviorOverrides or clueConfig.behaviorOverrides 694c700,703 < step.text.message = clueConfig.clues[step.clueType].message --- > local clueMessage = clueConfig.clues[step.clueType].message > if clueMessage then > step.text.message = clueMessage > end 730c739,741 < step.text.message = clue.message --- > if clue.message then > step.text.message = clue.message > end 776a788,793 > sb.logInfo("SPawnconfig: %s\n%s", spawnConfig.npc, sb.jsonMerge({ > species = generated.species, > typeName = generated.typeName, > parameters = generated.parameters, > level = self.level > }, spawnConfig.npc)) 860a878 > sb.logInfo("Quest text: %s", sb.printJson(step.text)) stagehands\bountymanager.lua 210a211 > local hasScanClue = false 275c276 < if addScanObjectLocation ~= nil then --- > if not hasScanClue and addScanObjectLocation ~= nil then 302a304 > sb.logInfo("Player %s completed %s", playerId, questId) 307a310 > sb.logInfo("Last quest on world? %s", lastQuestOnWorld(questId)) 313a317 > sb.logInfo("Player %s failed %s", playerId, questId) 733,734c737,740 < for _,playerId in ipairs(storage.questStorage[spawnConfig.questId].players) do < self.outbox:sendMessage(playerId, spawnConfig.questId.."setCompleteMessage", sb.replaceTags(clueConfig.message, tags)) --- > if clueConfig.message then > for _,playerId in ipairs(storage.questStorage[spawnConfig.questId].players) do > self.outbox:sendMessage(playerId, spawnConfig.questId.."setCompleteMessage", sb.replaceTags(clueConfig.message, tags)) > end 784,786c790,794 < local tags = util.generateTextTags(self.quests[spawnConfig.questId].parameters.text.tags) < for _,playerId in ipairs(storage.questStorage[spawnConfig.questId].players) do < self.outbox:sendMessage(playerId, spawnConfig.questId.."setCompleteMessage", sb.replaceTags(clueConfig.message, tags)) --- > if clueConfig.message then > local tags = util.generateTextTags(self.quests[spawnConfig.questId].parameters.text.tags) > for _,playerId in ipairs(storage.questStorage[spawnConfig.questId].players) do > self.outbox:sendMessage(playerId, spawnConfig.questId.."setCompleteMessage", sb.replaceTags(clueConfig.message, tags)) > end stagehands\boss\bossmusic.lua 6a7,8 > > message.setHandler("setMusicEnabled", function(_, _, enabled) return setMusicEnabled(enabled) end)