From 2761d66d60492078cf2f2a9f8ff78c1517b36fdf Mon Sep 17 00:00:00 2001 From: ThrisStraizo <45871917+ThrisStraizo@users.noreply.github.com> Date: Sat, 9 May 2026 08:57:27 -0700 Subject: [PATCH] Moment of Truth implementation This PR implements the quest Moment of Truth along with the framework for the battlefield fight. --- .../Jade_Sepulcher/moment_of_truth.lua | 62 ++++++ scripts/globals/quests.lua | 2 +- scripts/quests/ahtUrhgan/Moment_of_Truth.lua | 183 ++++++++++++++++++ scripts/zones/Jade_Sepulcher/IDs.lua | 5 +- scripts/zones/Mamook/DefaultActions.lua | 1 + scripts/zones/Mamook/IDs.lua | 1 + sql/mob_spawn_points.sql | 36 ++-- 7 files changed, 269 insertions(+), 21 deletions(-) create mode 100644 scripts/battlefields/Jade_Sepulcher/moment_of_truth.lua create mode 100644 scripts/quests/ahtUrhgan/Moment_of_Truth.lua diff --git a/scripts/battlefields/Jade_Sepulcher/moment_of_truth.lua b/scripts/battlefields/Jade_Sepulcher/moment_of_truth.lua new file mode 100644 index 00000000000..02001dedd18 --- /dev/null +++ b/scripts/battlefields/Jade_Sepulcher/moment_of_truth.lua @@ -0,0 +1,62 @@ +----------------------------------- +-- Area: Jade Sepulcher +-- Quest: The Beast Within - Limit Break (BLU) +----------------------------------- +local jadeSepulcherID = zones[xi.zone.JADE_SEPULCHER] +----------------------------------- + +local content = BattlefieldQuest:new({ + zoneId = xi.zone.JADE_SEPULCHER, + battlefieldId = xi.battlefield.id.MOMENT_OF_TRUTH, + maxPlayers = 6, + timeLimit = utils.minutes(30), + index = 3, + entryNpc = '_1v0', + exitNpcs = { '_1v1', '_1v2', '_1v3' }, + questArea = xi.questLog.AHT_URHGAN, + quest = xi.quest.id.ahtUrhgan.MOMENT_OF_TRUTH, + requiredVar = 'Quest[6][30]Prog', + requiredValue = 4, +}) + +content.groups = +{ + { + mobIds = + { + { + jadeSepulcherID.mob.SHADOWHAND_KAJEEL_JA, + jadeSepulcherID.mob.SHADOWHAND_KAJEEL_JA + 1, + jadeSepulcherID.mob.SHADOWHAND_KAJEEL_JA + 2, + jadeSepulcherID.mob.SHADOWHAND_KAJEEL_JA + 3, + jadeSepulcherID.mob.SHADOWHAND_KAJEEL_JA + 4, + jadeSepulcherID.mob.SHADOWHAND_KAJEEL_JA + 5 + }, + + { + jadeSepulcherID.mob.SHADOWHAND_KAJEEL_JA + 6, + jadeSepulcherID.mob.SHADOWHAND_KAJEEL_JA + 7, + jadeSepulcherID.mob.SHADOWHAND_KAJEEL_JA + 8, + jadeSepulcherID.mob.SHADOWHAND_KAJEEL_JA + 9, + jadeSepulcherID.mob.SHADOWHAND_KAJEEL_JA + 10, + jadeSepulcherID.mob.SHADOWHAND_KAJEEL_JA + 11 + }, + + { + jadeSepulcherID.mob.SHADOWHAND_KAJEEL_JA + 12, + jadeSepulcherID.mob.SHADOWHAND_KAJEEL_JA + 13, + jadeSepulcherID.mob.SHADOWHAND_KAJEEL_JA + 14, + jadeSepulcherID.mob.SHADOWHAND_KAJEEL_JA + 15, + jadeSepulcherID.mob.SHADOWHAND_KAJEEL_JA + 16, + jadeSepulcherID.mob.SHADOWHAND_KAJEEL_JA + 17 + }, + + }, + + allDeath = function(battlefield, mob) + battlefield:setStatus(xi.battlefield.status.WON) + end, + }, +} + +return content:register() diff --git a/scripts/globals/quests.lua b/scripts/globals/quests.lua index 9d757f3f15e..9c2f280baf0 100644 --- a/scripts/globals/quests.lua +++ b/scripts/globals/quests.lua @@ -651,7 +651,7 @@ xi.quest.id = THE_WAYWARD_AUTOMATON = 27, -- + OPERATION_TEATIME = 28, -- + PUPPETMASTER_BLUES = 29, -- + Converted - MOMENT_OF_TRUTH = 30, + MOMENT_OF_TRUTH = 30, -- + Converted THREE_MEN_AND_A_CLOSET = 31, -- + Converted FIVE_SECONDS_OF_FAME = 32, -- JP ENTRIES OR INVALID diff --git a/scripts/quests/ahtUrhgan/Moment_of_Truth.lua b/scripts/quests/ahtUrhgan/Moment_of_Truth.lua new file mode 100644 index 00000000000..2c5e6bb8a70 --- /dev/null +++ b/scripts/quests/ahtUrhgan/Moment_of_Truth.lua @@ -0,0 +1,183 @@ +----------------------------------- +-- Moment of Truth: Quest 6 30 +-- Mishhar, Whitegate , !pos -12 -6 29 50 +-- QM7, Mamook, !pos 216.861,-26.141,-94.554 65 +----------------------------------- + +local quest = Quest:new(xi.questLog.AHT_URHGAN, xi.quest.id.ahtUrhgan.MOMENT_OF_TRUTH) + +quest.sections = +{ + -- Section: Quest available + { + check = function(player, status, vars) + return status == xi.questStatus.QUEST_AVAILABLE and + player:getQuestStatus(xi.questLog.AHT_URHGAN, xi.quest.id.ahtUrhgan.GIVE_PEACE_A_CHANCE) == xi.questStatus.QUEST_COMPLETED + end, + + [xi.zone.AHT_URHGAN_WHITEGATE] = + { + ['Mishhar'] = + { + onTrigger = function(player, npc) + return quest:progressEvent(800) + end, + }, + + onEventFinish = + { + [800] = function(player, csid, option, npc) + quest:begin(player) + end, + }, + }, + }, + + -- Section: Quest accepted + { + check = function(player, status, vars) + return status == xi.questStatus.QUEST_ACCEPTED + end, + + [xi.zone.AHT_URHGAN_WHITEGATE] = + { + ['Mishhar'] = + { + onTrigger = function(player, npc) + local questProgress = quest:getVar(player, 'Prog') + if questProgress == 0 then + return quest:event(801) + elseif questProgress == 1 then + return quest:progressEvent(803) + elseif questProgress == 2 then + return quest:event(588) + elseif + questProgress == 3 or + questProgress == 4 + then + return quest:event(804) + elseif questProgress == 5 then + return quest:progressEvent(805) + end + end, + }, + + onTriggerAreaEnter = + { + [5] = function(player, region) + if quest:getVar(player, 'Prog') == 0 then + return quest:progressEvent(802) + end + end, + }, + + onEventFinish = + { + [802] = function(player, csid, option, npc) + quest:setVar(player, 'Prog', 1) + end, + + [803] = function(player, csid, option, npc) + quest:setVar(player, 'Prog', 2) + end, + + [805] = function(player, csid, option, npc) + local jobRewardItems = + { + [xi.job.WAR] = xi.item.STRENGTH_POTION, + [xi.job.MNK] = xi.item.STRENGTH_POTION, + [xi.job.DRK] = xi.item.STRENGTH_POTION, + [xi.job.DRG] = xi.item.STRENGTH_POTION, + + [xi.job.WHM] = xi.item.MIND_POTION, + + [xi.job.BLM] = xi.item.INTELLIGENCE_POTION, + [xi.job.SCH] = xi.item.INTELLIGENCE_POTION, + + [xi.job.RDM] = xi.item.VILE_ELIXIR_P1, + [xi.job.BLU] = xi.item.VILE_ELIXIR_P1, + + [xi.job.THF] = xi.item.HERMES_QUENCHER, + [xi.job.PLD] = xi.item.VITALITY_POTION, + + [xi.job.BST] = xi.item.CHARISMA_POTION, + [xi.job.BRD] = xi.item.CHARISMA_POTION, + [xi.job.DNC] = xi.item.CHARISMA_POTION, + + [xi.job.RNG] = xi.item.AGILITY_POTION, + [xi.job.NIN] = xi.item.AGILITY_POTION, + [xi.job.COR] = xi.item.AGILITY_POTION, + + [xi.job.SAM] = xi.item.ICARUS_WING, + [xi.job.SMN] = xi.item.PRO_ETHER_P1, + [xi.job.PUP] = xi.item.DEXTERITY_POTION, + } + + local playerjob = player:getMainJob() + local rewardItem = jobRewardItems[playerjob] + + if npcUtil.giveItem(player, rewardItem) then + quest:complete(player) + end + end, + }, + }, + + [xi.zone.MAMOOK] = + { + ['qm7'] = + { + onTrigger = function(player, npc) + if quest:getVar(player, 'Prog') == 2 then + return quest:progressCutscene(221) + end + end, + }, + + onEventFinish = + { + [221] = function(player, csid, option, npc) + quest:setVar(player, 'Prog', 3) + end, + }, + }, + + [xi.zone.JADE_SEPULCHER] = + { + ['_1v0'] = + { + onTrigger = function(player, npc) + if quest:getVar(player, 'Prog') == 3 then + return quest:progressEvent(3) + end + end, + }, + + onEventFinish = + { + [3] = function(player, csid, option, npc) + quest:setVar(player, 'Prog', 4) + end, + + [32001] = function(player, csid, option, npc) + if player:getLocalVar('battlefieldWin') == xi.battlefield.id.MOMENT_OF_TRUTH then + quest:setVar(player, 'Prog', 5) + end + end, + }, + }, + }, + + { + check = function(player, status, vars) + return status == xi.questStatus.QUEST_COMPLETED + end, + + [xi.zone.AHT_URHGAN_WHITEGATE] = + { + ['Mishhar'] = quest:event(806):replaceDefault(), + }, + }, +} + +return quest diff --git a/scripts/zones/Jade_Sepulcher/IDs.lua b/scripts/zones/Jade_Sepulcher/IDs.lua index f7a1fd4386d..7bb267aebb7 100644 --- a/scripts/zones/Jade_Sepulcher/IDs.lua +++ b/scripts/zones/Jade_Sepulcher/IDs.lua @@ -43,8 +43,9 @@ zones[xi.zone.JADE_SEPULCHER] = }, mob = { - LANCELORD_GAHEEL_JA = GetFirstID('Lancelord_Gaheel_Ja'), - RAUBAHN = GetFirstID('Raubahn'), + LANCELORD_GAHEEL_JA = GetFirstID('Lancelord_Gaheel_Ja'), + RAUBAHN = GetFirstID('Raubahn'), + SHADOWHAND_KAJEEL_JA = GetFirstID('Shadowhand_Kajeel_Ja'), }, npc = { diff --git a/scripts/zones/Mamook/DefaultActions.lua b/scripts/zones/Mamook/DefaultActions.lua index 474e7956793..cc887347547 100644 --- a/scripts/zones/Mamook/DefaultActions.lua +++ b/scripts/zones/Mamook/DefaultActions.lua @@ -3,4 +3,5 @@ local ID = zones[xi.zone.MAMOOK] return { ['qm1'] = { messageSpecial = ID.text.SICKLY_SWEET }, ['qm2'] = { messageSpecial = ID.text.NUMEROUS_STRANDS }, + ['qm7'] = { messageSpecial = ID.text.NOTHING_OUT_OF_ORDINARY }, } diff --git a/scripts/zones/Mamook/IDs.lua b/scripts/zones/Mamook/IDs.lua index febf0de506e..6791574a6a7 100644 --- a/scripts/zones/Mamook/IDs.lua +++ b/scripts/zones/Mamook/IDs.lua @@ -20,6 +20,7 @@ zones[xi.zone.MAMOOK] = LOGGING_IS_POSSIBLE_HERE = 7550, -- Logging is possible here if you have . PARTY_MEMBERS_HAVE_FALLEN = 7907, -- All party members have fallen in battle. Now leaving the battlefield. THE_PARTY_WILL_BE_REMOVED = 7914, -- If all party members' HP are still zero after # minute[/s], the party will be removed from the battlefield. + NOTHING_OUT_OF_ORDINARY = 8031, -- Nothing out of the ordinary happens. IMPENDING_BATTLE = 8075, -- You feel the rush of impending battle! PECULIAR_SENSATION = 8133, -- % is overcome by a peculiar sensation. NUMEROUS_STRANDS = 8680, -- Numerous strands of hair are scattered all over... diff --git a/sql/mob_spawn_points.sql b/sql/mob_spawn_points.sql index 3f87f058b63..31f68017912 100644 --- a/sql/mob_spawn_points.sql +++ b/sql/mob_spawn_points.sql @@ -15429,24 +15429,24 @@ INSERT INTO `mob_spawn_points` VALUES (17051674,0,'Raubahn','Raubahn',3,70,70,0, INSERT INTO `mob_spawn_points` VALUES (17051675,0,'Raubahn','Raubahn',3,70,70,-240,48,-240,161); -- Moment of Truth -INSERT INTO `mob_spawn_points` VALUES (17051676,0,'Shadowhand_Kajeel_Ja','Shadowhand Kajeel Ja',4,75,75,0.000,0.000,0.000,0); -INSERT INTO `mob_spawn_points` VALUES (17051677,0,'Blacktattoo_Vedool_Ja','Blacktattoo Vedool Ja',5,75,75,0.000,0.000,0.000,0); -INSERT INTO `mob_spawn_points` VALUES (17051678,0,'Whitetattoo_Rahool_Ja','Whitetattoo Rahool Ja',6,75,75,0.000,0.000,0.000,0); -INSERT INTO `mob_spawn_points` VALUES (17051679,0,'Wabjahl','Wabjahl',7,1,1,0.000,0.000,0.000,0); -INSERT INTO `mob_spawn_points` VALUES (17051680,0,'Tiyaash','Tiyaash',8,1,1,0.000,0.000,0.000,0); -INSERT INTO `mob_spawn_points` VALUES (17051681,0,'Jasweem','Jasweem',9,1,1,0.000,0.000,0.000,0); -INSERT INTO `mob_spawn_points` VALUES (17051682,0,'Shadowhand_Kajeel_Ja','Shadowhand Kajeel Ja',4,75,75,0.000,0.000,0.000,0); -INSERT INTO `mob_spawn_points` VALUES (17051683,0,'Blacktattoo_Vedool_Ja','Blacktattoo Vedool Ja',5,75,75,0.000,0.000,0.000,0); -INSERT INTO `mob_spawn_points` VALUES (17051684,0,'Whitetattoo_Rahool_Ja','Whitetattoo Rahool Ja',6,75,75,0.000,0.000,0.000,0); -INSERT INTO `mob_spawn_points` VALUES (17051685,0,'Wabjahl','Wabjahl',7,1,1,0.000,0.000,0.000,0); -INSERT INTO `mob_spawn_points` VALUES (17051686,0,'Tiyaash','Tiyaash',8,1,1,0.000,0.000,0.000,0); -INSERT INTO `mob_spawn_points` VALUES (17051687,0,'Jasweem','Jasweem',9,1,1,0.000,0.000,0.000,0); -INSERT INTO `mob_spawn_points` VALUES (17051688,0,'Shadowhand_Kajeel_Ja','Shadowhand Kajeel Ja',4,75,75,0.000,0.000,0.000,0); -INSERT INTO `mob_spawn_points` VALUES (17051689,0,'Blacktattoo_Vedool_Ja','Blacktattoo Vedool Ja',5,75,75,0.000,0.000,0.000,0); -INSERT INTO `mob_spawn_points` VALUES (17051690,0,'Whitetattoo_Rahool_Ja','Whitetattoo Rahool Ja',6,75,75,0.000,0.000,0.000,0); -INSERT INTO `mob_spawn_points` VALUES (17051691,0,'Wabjahl','Wabjahl',7,1,1,0.000,0.000,0.000,0); -INSERT INTO `mob_spawn_points` VALUES (17051692,0,'Tiyaash','Tiyaash',8,1,1,0.000,0.000,0.000,0); -INSERT INTO `mob_spawn_points` VALUES (17051693,0,'Jasweem','Jasweem',9,1,1,0.000,0.000,0.000,0); +INSERT INTO `mob_spawn_points` VALUES (17051676,0,'Shadowhand_Kajeel_Ja','Shadowhand Kajeel Ja',4,65,65,240.000,-31.500,240.000,161); +INSERT INTO `mob_spawn_points` VALUES (17051677,0,'Blacktattoo_Vedool_Ja','Blacktattoo Vedool Ja',5,65,65,241.733,-31.500,241.960,161); +INSERT INTO `mob_spawn_points` VALUES (17051678,0,'Whitetattoo_Rahool_Ja','Whitetattoo Rahool Ja',6,65,65,238.186,-31.368,237.123,161); +INSERT INTO `mob_spawn_points` VALUES (17051679,0,'Wabjahl','Wabjahl',7,50,50,243.526,-31.269,237.983,161); +INSERT INTO `mob_spawn_points` VALUES (17051680,0,'Tiyaash','Tiyaash',8,50,50,242.895,-31.240,237.164,161); +INSERT INTO `mob_spawn_points` VALUES (17051681,0,'Jasweem','Jasweem',9,50,50,242.492,-31.162,236.115,161); +INSERT INTO `mob_spawn_points` VALUES (17051682,0,'Shadowhand_Kajeel_Ja','Shadowhand Kajeel Ja',4,65,65,0,8,0,161); +INSERT INTO `mob_spawn_points` VALUES (17051683,0,'Blacktattoo_Vedool_Ja','Blacktattoo Vedool Ja',5,65,65,1.733,8,1.960,161); +INSERT INTO `mob_spawn_points` VALUES (17051684,0,'Whitetattoo_Rahool_Ja','Whitetattoo Rahool Ja',6,65,65,-1.814,8,-2.877,161); +INSERT INTO `mob_spawn_points` VALUES (17051685,0,'Wabjahl','Wabjahl',7,50,50,3.526,7.769,-2.017,161); +INSERT INTO `mob_spawn_points` VALUES (17051686,0,'Tiyaash','Tiyaash',8,50,50,2.895,7.740,-2.836,161); +INSERT INTO `mob_spawn_points` VALUES (17051687,0,'Jasweem','Jasweem',9,50,50,2.492,7.662,-3.885,161); +INSERT INTO `mob_spawn_points` VALUES (17051688,0,'Shadowhand_Kajeel_Ja','Shadowhand Kajeel Ja',4,65,65,-240,48,-240,161); +INSERT INTO `mob_spawn_points` VALUES (17051689,0,'Blacktattoo_Vedool_Ja','Blacktattoo Vedool Ja',5,65,65,-238.267,48,-238.040,161); +INSERT INTO `mob_spawn_points` VALUES (17051690,0,'Whitetattoo_Rahool_Ja','Whitetattoo Rahool Ja',6,65,65,-241.814,48,-242.887,161); +INSERT INTO `mob_spawn_points` VALUES (17051691,0,'Wabjahl','Wabjahl',7,50,50,-236.474,48,-242.017,161); +INSERT INTO `mob_spawn_points` VALUES (17051692,0,'Tiyaash','Tiyaash',8,50,50,-237.105,48,-237.164,161); +INSERT INTO `mob_spawn_points` VALUES (17051693,0,'Jasweem','Jasweem',9,50,50,-237.508,48,-243.885,161); -- ToAU 29: Puppet in Peril INSERT INTO `mob_spawn_points` VALUES (17051694,0,'Lancelord_Gaheel_Ja','Lancelord Gaheel Ja',10,80,80,238.707,-32.000,240.117,170);