From 8bd2e5ce35ea76adbfed471314c2592dc2c9b788 Mon Sep 17 00:00:00 2001 From: Skold <113406182+Skold177@users.noreply.github.com> Date: Fri, 24 Apr 2026 00:14:52 -0400 Subject: [PATCH] [lua] Repeatable Quest Fixes Fixes duplicate gil reward Co-Authored-By: slashtangent <78345197+slashtangent@users.noreply.github.com> --- .../quests/windurst/Toraimarai_Turmoil.lua | 64 ++++++++++--------- scripts/quests/windurst/Waking_Dreams.lua | 4 +- 2 files changed, 36 insertions(+), 32 deletions(-) diff --git a/scripts/quests/windurst/Toraimarai_Turmoil.lua b/scripts/quests/windurst/Toraimarai_Turmoil.lua index bd618b8c840..f506de7dd73 100644 --- a/scripts/quests/windurst/Toraimarai_Turmoil.lua +++ b/scripts/quests/windurst/Toraimarai_Turmoil.lua @@ -13,10 +13,10 @@ local quest = Quest:new(xi.questLog.WINDURST, xi.quest.id.windurst.TORAIMARAI_TU quest.reward = { - gil = 4500, - fame = 100, + gil = 4500, + fame = 100, fameArea = xi.fameArea.WINDURST, - title = xi.title.CERTIFIED_RHINOSTERY_VENTURER, + title = xi.title.CERTIFIED_RHINOSTERY_VENTURER, } quest.sections = @@ -46,7 +46,7 @@ quest.sections = }, { - --initial completion + -- Initial completion check = function(player, status, vars) return status == xi.questStatus.QUEST_ACCEPTED end, @@ -55,22 +55,19 @@ quest.sections = { ['Ohbiru-Dohbiru'] = { - onTrigger = quest:event(786, 4500, xi.keyItem.RHINOSTERY_CERTIFICATE, xi.item.STARMITE_SHELL), -- Reminder text. - onTrade = function(player, npc, trade) if npcUtil.tradeHasExactly(trade, { { xi.item.STARMITE_SHELL, 3 } }) then return quest:progressEvent(791) end end, - }, - ['Leepe-Hoppe'] = - { onTrigger = function(player, npc) - return quest:event(790, 0, xi.ki.RHINOSTERY_CERTIFICATE) + return quest:event(786, 4500, xi.keyItem.RHINOSTERY_CERTIFICATE, xi.item.STARMITE_SHELL) -- Reminder text. end, }, + ['Leepe-Hoppe'] = quest:event(790, 0, xi.ki.RHINOSTERY_CERTIFICATE), + onEventFinish = { [791] = function(player, csid, option, npc) @@ -83,24 +80,14 @@ quest.sections = [xi.zone.WINDURST_WALLS] = { - ['Polikal-Ramikal'] = - { - onTrigger = function(player, npc) - return quest:event(391) - end, - }, + ['Polikal-Ramikal'] = quest:event(391), - ['Yoran-Oran'] = - { - onTrigger = function(player, npc) - return quest:event(392) - end, - }, + ['Yoran-Oran'] = quest:event(392), }, }, { - --repeat completion + -- Repeat completion check = function(player, status, vars) return status == xi.questStatus.QUEST_COMPLETED end, @@ -109,24 +96,39 @@ quest.sections = { ['Ohbiru-Dohbiru'] = { - onTrigger = quest:event(795, 4500, 0, xi.item.STARMITE_SHELL), -- repeat dialog - onTrade = function(player, npc, trade) - if npcUtil.tradeHasExactly(trade, { { xi.item.STARMITE_SHELL, 3 } }) then + if + quest:getVar(player, 'Prog') == 1 and + npcUtil.tradeHasExactly(trade, { { xi.item.STARMITE_SHELL, 3 } }) + then return quest:progressEvent(791) end end, + + onTrigger = function(player, npc) + if quest:getVar(player, 'Prog') == 1 then + return quest:event(786, 4500, xi.keyItem.RHINOSTERY_CERTIFICATE, xi.item.STARMITE_SHELL) -- Reminder text. + else + return quest:event(795, 4500, 0, xi.item.STARMITE_SHELL) -- Repeat dialog. + end + end, }, onEventFinish = { [791] = function(player, csid, option, npc) - player:confirmTrade() + if quest:getVar(player, 'Prog') == 1 then + quest:setVar(player, 'Prog', 0) + player:confirmTrade() + player:addFame(xi.fameArea.WINDURST, 50) + npcUtil.giveCurrency(player, 'gil', 4500) + end + end, - --From previous implementation, award 100 fame on first completion, - -- and 50 fame for any subsequent trade. - player:addFame(xi.fameArea.WINDURST, 50) - npcUtil.giveCurrency(player, 'gil', 4500) + [795] = function(player, csid, option, npc) + if option == 1 then + quest:setVar(player, 'Prog', 1) + end end, }, }, diff --git a/scripts/quests/windurst/Waking_Dreams.lua b/scripts/quests/windurst/Waking_Dreams.lua index 97bd3fee6b7..38ee92554d7 100644 --- a/scripts/quests/windurst/Waking_Dreams.lua +++ b/scripts/quests/windurst/Waking_Dreams.lua @@ -106,6 +106,7 @@ quest.sections = if quest:complete(player) then player:delKeyItem(xi.ki.WHISPER_OF_DREAMS) player:setCharVar('Darkness_Named_date', JstMidnight()) + quest:setMustZone(player) end end, }, @@ -115,7 +116,8 @@ quest.sections = -- Section 3: Quest completed (repeats) { check = function(player, status, vars) - return status == xi.questStatus.QUEST_COMPLETED + return status == xi.questStatus.QUEST_COMPLETED and + not quest:getMustZone(player) end, [xi.zone.WINDURST_WATERS] =