diff --git a/Data/scripts/base/chara/npc/mapobj/MapObjOnlyShowHide.lua b/Data/scripts/base/chara/npc/mapobj/MapObjOnlyShowHide.lua new file mode 100644 index 00000000..fc7add02 --- /dev/null +++ b/Data/scripts/base/chara/npc/mapobj/MapObjOnlyShowHide.lua @@ -0,0 +1,3 @@ +function init(npc) + return false, false, 0, 0, 0, 0; +end \ No newline at end of file diff --git a/Data/scripts/base/chara/npc/populace/PopulaceChocoboLender.lua b/Data/scripts/base/chara/npc/populace/PopulaceChocoboLender.lua index 0c32d5fa..7ffc7e8a 100644 --- a/Data/scripts/base/chara/npc/populace/PopulaceChocoboLender.lua +++ b/Data/scripts/base/chara/npc/populace/PopulaceChocoboLender.lua @@ -48,8 +48,9 @@ function init(npc) end function onEventStarted(player, npc, triggerName) + local classId = npc:GetActorClassId(); local curLevel = 20; -- TODO: pull from character - local hasIssuance = player:GetItemPackage(INVENTORY_KEYITEMS):HasItem(gcIssuances[npc:GetActorClassId()]); + local hasIssuance = player:GetItemPackage(INVENTORY_KEYITEMS):HasItem(gcIssuances[classId]); local hasChocobo = player.hasChocobo; if (hasChocobo == false) then -- Let GMs auto have the issuance for debugging @@ -57,50 +58,64 @@ function onEventStarted(player, npc, triggerName) end local hasFunds = (player:GetCurrentGil() >= rentalPrice); - - callClientFunction(player, "eventTalkWelcome", player); - - local menuChoice = callClientFunction(player, "eventAskMainMenu", player, curLevel, hasFunds, hasIssuance, hasChocobo, hasChocobo, 0); - - if (menuChoice == 1) then -- Issuance option - - callClientFunction(player, "eventTalkMyChocobo", player); - local nameResponse = callClientFunction(player, "eventSetChocoboName", true); - - if (nameResponse == "") then -- Cancel Chocobo naming - callClientFunction(player, "eventCancelChocoboName", player); - callClientFunction(player, "eventTalkStepBreak", player); - player:EndEvent(); - return; - else - local appearance = startAppearances[npc:GetActorClassId()]; - player:IssueChocobo(appearance, nameResponse); - - callClientFunction(player, "eventAfterChocoboName", player); - - --Add Chocobo License and remove issuance - if (player:GetItemPackage(INVENTORY_KEYITEMS):HasItem(2001007) == false) then - player:GetItemPackage(INVENTORY_KEYITEMS):AddItem(2001007); - end - player:GetItemPackage(INVENTORY_KEYITEMS):RemoveItem(gcIssuances[npc:GetActorClassId()], 1); - - --Warp with the special chocobo warp mode. - mountChocobo(player); - GetWorldManager():DoZoneChange(player, cityExits[npc:GetActorClassId()][1], nil, 0, SPAWN_CHOCOBO_GET, cityExits[npc:GetActorClassId()][2], cityExits[npc:GetActorClassId()][3], cityExits[npc:GetActorClassId()][4], cityExits[npc:GetActorClassId()][5]); - end - - elseif(menuChoice == 2) then -- Summon Bird - mountChocobo(player); - GetWorldManager():DoZoneChange(player, cityExits[npc:GetActorClassId()][1], nil, 0, SPAWN_NO_ANIM, cityExits[npc:GetActorClassId()][2], cityExits[npc:GetActorClassId()][3], cityExits[npc:GetActorClassId()][4], cityExits[npc:GetActorClassId()][5]); - elseif(menuChoice == 3) then -- Change Barding - callClientFunction(player, "eventTalkStepBreak", player); - elseif(menuChoice == 5) then -- Rent Bird - mountChocobo(player, true, 1); - GetWorldManager():DoZoneChange(player, cityExits[npc:GetActorClassId()][1], nil, 0, SPAWN_CHOCOBO_RENTAL, cityExits[npc:GetActorClassId()][2], cityExits[npc:GetActorClassId()][3], cityExits[npc:GetActorClassId()][4], cityExits[npc:GetActorClassId()][5]); - else - callClientFunction(player, "eventTalkStepBreak", player); - end - + + + + if ((classId == 1000840) and (player:HasQuest(110009))) then -- Cross-script Man0u0 dialog + local sequence = player:GetQuest(110009):getSequence(); + + if (sequence == 0) then + callClientFunction(player, "delegateEvent", player, GetStaticActor("Man0u0"), "processEvent000_13"); + elseif (sequence == 10) then + callClientFunction(player, "delegateEvent", player, GetStaticActor("Man0u0"), "processEvent020_7"); + else + player:EndEvent(); + end + else + callClientFunction(player, "eventTalkWelcome", player); + + local menuChoice = callClientFunction(player, "eventAskMainMenu", player, curLevel, hasFunds, hasIssuance, hasChocobo, hasChocobo, 0); + + if (menuChoice == 1) then -- Issuance option + + callClientFunction(player, "eventTalkMyChocobo", player); + local nameResponse = callClientFunction(player, "eventSetChocoboName", true); + + if (nameResponse == "") then -- Cancel Chocobo naming + callClientFunction(player, "eventCancelChocoboName", player); + callClientFunction(player, "eventTalkStepBreak", player); + player:EndEvent(); + return; + else + local appearance = startAppearances[classId]; + player:IssueChocobo(appearance, nameResponse); + + callClientFunction(player, "eventAfterChocoboName", player); + + --Add Chocobo License and remove issuance + if (player:GetItemPackage(INVENTORY_KEYITEMS):HasItem(2001007) == false) then + player:GetItemPackage(INVENTORY_KEYITEMS):AddItem(2001007); + end + player:GetItemPackage(INVENTORY_KEYITEMS):RemoveItem(gcIssuances[classId], 1); + + --Warp with the special chocobo warp mode. + mountChocobo(player); + GetWorldManager():DoZoneChange(player, cityExits[classId][1], nil, 0, SPAWN_CHOCOBO_GET, cityExits[classId][2], cityExits[classId][3], cityExits[classId][4], cityExits[classId][5]); + end + + elseif(menuChoice == 2) then -- Summon Bird + mountChocobo(player); + GetWorldManager():DoZoneChange(player, cityExits[classId][1], nil, 0, SPAWN_NO_ANIM, cityExits[classId][2], cityExits[classId][3], cityExits[classId][4], cityExits[classId][5]); + elseif(menuChoice == 3) then -- Change Barding + callClientFunction(player, "eventTalkStepBreak", player); + elseif(menuChoice == 5) then -- Rent Bird + mountChocobo(player, true, 1); + GetWorldManager():DoZoneChange(player, cityExits[classId][1], nil, 0, SPAWN_CHOCOBO_RENTAL, cityExits[classId][2], cityExits[classId][3], cityExits[classId][4], cityExits[classId][5]); + else + callClientFunction(player, "eventTalkStepBreak", player); + end + end + player:EndEvent(); end @@ -114,6 +129,6 @@ function mountChocobo(player, isRental, rentalMinutes) player:SendMountAppearance(); player:SetMountState(1); - player:ChangeSpeed(0.0, 5.0, 10.0, 10.0); + player:ChangeSpeed(0.0, 3.6, 9.0, 9.0); player:ChangeState(15); end \ No newline at end of file diff --git a/Data/scripts/base/chara/npc/populace/PopulaceCompanyWarp.lua b/Data/scripts/base/chara/npc/populace/PopulaceCompanyWarp.lua index eb03c6f8..8b5dd6ac 100644 --- a/Data/scripts/base/chara/npc/populace/PopulaceCompanyWarp.lua +++ b/Data/scripts/base/chara/npc/populace/PopulaceCompanyWarp.lua @@ -109,10 +109,11 @@ function onEventStarted(player, npc, triggerName) if (choice ~= 0) then - player:EndEvent(); + callClientFunction(player, "eventAfterWarpOtherZone", player); - + wait(1); + player:EndEvent(); local player_zone = player:GetPos()[5]; spawnType = 0x0A; if (player_zone == aethernet[city][choice].zone) then diff --git a/Data/scripts/base/chara/npc/populace/PopulaceStandard.lua b/Data/scripts/base/chara/npc/populace/PopulaceStandard.lua index 830bb5c1..f69ad19b 100644 --- a/Data/scripts/base/chara/npc/populace/PopulaceStandard.lua +++ b/Data/scripts/base/chara/npc/populace/PopulaceStandard.lua @@ -28,10 +28,10 @@ function onEventStarted(player, npc, eventType, eventName) local possibleQuests = {}; -- Create the switch table for this npc - if (defaultTalk ~= nil and eventType == EVENT_TALK) then + if (defaultTalk ~= nil and eventType == ETYPE_TALK) then table.insert(possibleQuests, defaultTalk); end - if (tutorialTalk ~= nil and eventType == EVENT_TALK) then + if (tutorialTalk ~= nil and eventType == ETYPE_TALK) then table.insert(possibleQuests, tutorialTalk); end if (activeQuests ~= nil) then diff --git a/Data/scripts/commands/gm/spawn.lua b/Data/scripts/commands/gm/spawn.lua index 6bf4a566..00d85b80 100644 --- a/Data/scripts/commands/gm/spawn.lua +++ b/Data/scripts/commands/gm/spawn.lua @@ -8,10 +8,10 @@ properties = { function onTrigger(player, argc, actorClassId, width, height) - if (actorClassId == nil) then - player:SendMessage(0x20, "", "No actor class id provided."); - return; - end + if (actorClassId == nil) then + player:SendMessage(0x20, "", "No actor class id provided."); + return; + end local pos = player:GetPos(); local x = pos[1]; @@ -20,36 +20,16 @@ function onTrigger(player, argc, actorClassId, width, height) local rot = pos[4]; local zone = pos[5]; -<<<<<<< HEAD - actorClassId = tonumber(actorClassId); - - if (actorClassId ~= nil) then - zone = player:GetZone(); - local w = tonumber(width) or 0; -======= actorClassId = tonumber(actorClassId); if (actorClassId ~= nil) then local w = tonumber(width) or 0; ->>>>>>> ioncannon/quest_system local h = tonumber(height) or 0; printf("%f %f %f", x, y, z); --local x, y, z = player.GetPos(); for i = 0, w do for j = 0, h do -<<<<<<< HEAD - actor = zone:SpawnActor(actorClassId, "test", x + (i - (w / 2) * 3), y, z + (j - (h / 2) * 3), rot); - actor.SetAppearance(1001149) - end - end - end - - if (actor == nil) then - player:SendMessage(0x20, "", "This actor class id cannot be spawned."); - end - -======= - actor = player.CurrentArea:SpawnActor(actorClassId, "test", pos[0] + (i - (w / 2) * 3), pos[1], pos[2] + (j - (h / 2) * 3), pos[3]); + actor = player.CurrentArea:SpawnActor(actorClassId, "test", x + (i - (w / 2) * 3), y, z + (j - (h / 2) * 3), rot); actor.SetAppearance(1001149) end end @@ -59,5 +39,4 @@ function onTrigger(player, argc, actorClassId, width, height) player:SendMessage(0x20, "", "This actor class id cannot be spawned."); end ->>>>>>> ioncannon/quest_system end; \ No newline at end of file diff --git a/Data/scripts/directors/Quest/QuestDirectorMan0u001.lua b/Data/scripts/directors/Quest/QuestDirectorMan0u001.lua index c5c71b7c..efd0bc0d 100644 --- a/Data/scripts/directors/Quest/QuestDirectorMan0u001.lua +++ b/Data/scripts/directors/Quest/QuestDirectorMan0u001.lua @@ -11,7 +11,28 @@ function init() return "/Director/Quest/QuestDirectorMan0u001"; end -function onEventStarted(player, actor, triggerName) + +function onCreateContentArea(players, director, contentArea, contentGroup) + + niellefresne = contentArea:SpawnActor(2290003, "niellefresne", -11.86, 192, 35.06, -0.8); + thancred = contentArea:SpawnActor(2290004, "thancred", -26.41, 192, 39.52, 1.2); + thancred:ChangeState(2); + + mob1 = contentArea:SpawnActor(2203301, "mob1", -6.193, 192, 47.658, -2.224); + + openingStoper = contentArea:SpawnActor(1090385, "openingstoper", -24.34, 192, 34.22, 0); + + for _, player in pairs(players) do + contentGroup:AddMember(player); + end; + + contentGroup:AddMember(director); + contentGroup:AddMember(niellefresne); + contentGroup:AddMember(thancred); + contentGroup:AddMember(mob1); +end + +function onEventStarted(player, director, triggerName) man0u0Quest = player:GetQuest("Man0u0"); startTutorialMode(player); @@ -19,7 +40,8 @@ function onEventStarted(player, actor, triggerName) player:EndEvent(); waitForSignal("playerActive"); wait(1); --If this isn't here, the scripts bugs out. TODO: Find a better alternative. - kickEventContinue(player, actor, "noticeEvent", "noticeEvent"); + kickEventContinue(player, director, "noticeEvent", "noticeEvent"); + callClientFunction(player, "delegateEvent", player, man0u0Quest, "processTtrBtl002", nil, nil, nil); player:EndEvent(); wait(4); @@ -40,7 +62,7 @@ function onEventStarted(player, actor, triggerName) wait(7); player:ChangeMusic(7); player:ChangeState(0); - kickEventContinue(player, actor, "noticeEvent", "noticeEvent"); + kickEventContinue(player, director, "noticeEvent", "noticeEvent"); callClientFunction(player, "delegateEvent", player, man0u0Quest, "processEvent020", nil, nil, nil); --[[ @@ -56,9 +78,8 @@ function onEventStarted(player, actor, triggerName) OpenWidget (DEFEAT ENEMY) ]] - man0u0Quest:NextPhase(10); - player:EndEvent(); - + man0u0Quest:StartSequence(10); player.CurrentArea:ContentFinished(); GetWorldManager():DoZoneChange(player, 175, "PrivateAreaMasterPast", 3, 15, -22.81, 196, 87.82, 2.98); + player:EndEvent(); end diff --git a/Data/scripts/player.lua b/Data/scripts/player.lua index 901dea34..bec9f61b 100644 --- a/Data/scripts/player.lua +++ b/Data/scripts/player.lua @@ -46,18 +46,17 @@ function onBeginLogin(player) player:GetQuest(110005):ClearQuestData(); player:GetQuest(110005):ClearQuestFlags(); elseif (player:HasQuest(110009) == true and player.CurrentArea.ZoneId == 184) then - --director = player.CurrentArea:CreateDirector("OpeningDirector", false); - --player:AddDirector(director); - --director:StartDirector(false); - --player:SetLoginDirector(director); - --player:KickEvent(director, "noticeEvent", true); - -- + director = player.CurrentArea:CreateDirector("OpeningDirector", false); + player:AddDirector(director); + director:StartDirector(true); + player:SetLoginDirector(director); + player:KickEvent(director, "noticeEvent", true); + player.positionX = 5.364327; player.positionY = 196.0; player.positionZ = 133.6561; player.rotation = -2.849384; - player:GetQuest(110009):ClearQuestData(); - player:GetQuest(110009):ClearQuestFlags(); + player:GetQuest(110009):ClearClearData(); end end diff --git a/Data/scripts/quests/man/man0u0.lua b/Data/scripts/quests/man/man0u0.lua index 624e7191..15bb4720 100644 --- a/Data/scripts/quests/man/man0u0.lua +++ b/Data/scripts/quests/man/man0u0.lua @@ -8,7 +8,9 @@ Name: Flowers for All Code: Man0u0 Id: 110009 Prereq: None (Given on chara creation) - +Notes: RURURAJI scripting handled via PopulaceChocoboLender.lua +TO-DO: Sequence 000 - Crowd NPCs. + Sequence 010 - Adv. Guild NPCs ]] -- Sequence Numbers @@ -31,76 +33,41 @@ STOCKY_STRANGER = 1001644; EXIT_TRIGGER = 1090372; OPENING_STOPER_ULDAH = 1090373; ---1001114-1001140: Untargetable standby actors: Add the correct ones at some point for bookkeeping + + +KEEN_EYED_MERCHANT = 1000401; +-- MUMPISH_MIQOTE = 1000992; -- Unused on this client version +HIGH_SPIRITED_FELLOW = 1001042; +DISREPUTABLE_MIDLANDER = 1001044; +LONG_LEGGED_LADY = 1001112; +LARGE_LUNGED_LABORER = 1001645; +TOOTH_GRINDING_TRAVELER = 1001646; +FULL_LIPPED_FILLE = 1001647; +YAYATOKI = 1500129; + +BLOCKER1 = 1090372; +BLOCKER2 = 1090372; +ULDAH_OPENING_EXIT = 1099046; +--1001114-1001140: Untargetable standby actors for sequence 000: Add the correct ones at some point -- Quest Markers -MKRK_YAYATOKI = 11000901; -MKRK_ASCILIA = 11000902; -MKRK_FRETFUL_FARMHAND = 11000903; -MKRK_GIL_DIGGING_MISTRESS = 11000904; -MKRK_UNKNOWN1 = 11000905; -MKRK_UNKNOWN2 = 11000906; +MRKR_YAYATOKI = 11000901; +MRKR_ASCILIA = 11000902; +MRKR_FRETFUL_FARMHAND = 11000903; +MRKR_GIL_DIGGING_MISTRESS = 11000904; +MRKR_COMBAT_TUTORIAL = 11000905; +MRKR_ADV_GUILD = 11000906; -- Quest Flags -FLAG_SEQ000_MINITUT0 = 0; -FLAG_SEQ000_MINITUT1 = 1; -FLAG_SEQ000_MINITUT2 = 2; -FLAG_SEQ000_MINITUT3 = 3; - - ---[[ FUNCTION LIST -processEvent000(A0_1, A1_2, A2_3) -processEvent000_2(A0_4, A1_5, A2_6) -processEvent000_3(A0_7, A1_8, A2_9) -processEvent000_4(A0_10, A1_11, A2_12) -processEvent000_5(A0_13, A1_14, A2_15) -processEvent000_6(A0_16, A1_17, A2_18) -processEvent000_6_2(A0_19, A1_20, A2_21) -processEvent000_7(A0_22, A1_23, A2_24) -processEvent000_8(A0_25, A1_26, A2_27) -processEvent000_9(A0_28, A1_29, A2_30) -processEvent000_10(A0_31, A1_32, A2_33) -processEvent000_11(A0_34, A1_35, A2_36) -processEvent000_12(A0_37, A1_38, A2_39) -processEvent000_13(A0_40, A1_41, A2_42) -processEvent000_14(A0_43, A1_44, A2_45) -processEvent010(A0_46, A1_47, A2_48) -processEvent020(A0_49, A1_50, A2_51) -processEvent020_2(A0_58, A1_59, A2_60) -processEvent020_3(A0_61, A1_62, A2_63) -processEvent020_4(A0_64, A1_65, A2_66) -processEvent020_5(A0_67, A1_68, A2_69) -processEvent020_6(A0_70, A1_71, A2_72) -processEvent020_7(A0_73, A1_74, A2_75) -processEvent020_8(A0_76, A1_77, A2_78) -processTtrNomal001withHQ(A0_79, A1_80, A2_81) -processTtrNomal001(A0_91, A1_92, A2_93) - processTtrNomal002(A0_103, A1_104, A2_105, A3_106) - processTtrNomal003(A0_113, A1_114, A2_115, A3_116) -processTtrAfterBtl001(A0_123, A1_124, A2_125) -processTtrMini001(A0_135, A1_136, A2_137) -processTtrMini002(A0_138, A1_139, A2_140) -processTtrMini002_first(A0_141, A1_142, A2_143) -processTtrMini003(A0_144, A1_145, A2_146) -processTtrMini003_first(A0_147, A1_148, A2_149) -processTtrBlkNml001(A0_150, A1_151, A2_152) - processTtrBtl001(A0_153, A1_154, A2_155, A3_156) - processTtrBtlMagic001(A0_163, A1_164, A2_165, A3_166) - processTtrBtl002(A0_179, A1_180, A2_181, A3_182) -processTtrBtl003(A0_202, A1_203, A2_204) -processTtrBtl004(A0_214, A1_215, A2_216) -processTtrBlkNml002(A0_217, A1_218, A2_219) -processTtrBlkNml003(A0_226, A1_227, A2_228) -processEtc001(A0_235, A1_236, A2_237) -processEtc002(A0_238, A1_239, A2_240) -processEtc003(A0_241, A1_242, A2_243) -processInformDialogAsQuest(A0_244, A1_245, A2_246) - ---]] +FLAG_SEQ000_MINITUT0 = 0; -- PushEvent ASCILIA +FLAG_SEQ000_MINITUT1 = 1; -- TalkEvent ASCILIA +FLAG_SEQ000_MINITUT2 = 2; -- TalkEvent FRETFUL_FARMHAND +FLAG_SEQ000_MINITUT3 = 3; -- TalkEvent GIL_DIGGING_MISTRESS +FLAG_SEQ010_TALK0 = 0; -- TalkEvent YAYATOKI function onStart(player, quest) @@ -111,21 +78,23 @@ function onFinish(player, quest) end function onSequence(player, quest, sequence) - quest:ClearENpcs(); - quest:ClearData(); - + if (sequence == SEQ_000) then -- Setup states incase we loaded in. local asciliaCanPush = not quest:GetFlag(FLAG_SEQ000_MINITUT0); local asciliaFlag = quest:GetFlag(FLAG_SEQ000_MINITUT1) and QFLAG_NONE or QFLAG_PLATE; local fretfulfarmhandFlag = quest:GetFlag(FLAG_SEQ000_MINITUT2) and QFLAG_NONE or QFLAG_PLATE; local gildiggingmistressFlag = quest:GetFlag(FLAG_SEQ000_MINITUT3) and QFLAG_NONE or QFLAG_PLATE; - - local exitCanPush = quest:GetFlags() == 0xF; - local exitFlag = quest:GetFlags() == 0xF and QFLAG_PLATE or QFLAG_NONE; + + local exitFlag = quest:GetFlags() == 0xF and QFLAG_MAP or QFLAG_NONE; - --AddENpc(classId, byte flagType=0,isTalkEnabled, isEmoteEnabled , isPushEnabled , isSpawned) - quest:AddENpc(ASCILIA, asciliaFlag, true, false, asciliaCanPush); + if (asciliaCanPush) then + fretfulfarmhandFlag = QFLAG_NONE; + gildiggingmistressFlag = QFLAG_NONE; + end + + --AddENpc(classId, byte flagType=0,isTalkEnabled, isPushEnabled, isEmoteEnabled, isSpawned) + quest:AddENpc(ASCILIA, asciliaFlag, true, asciliaCanPush); quest:AddENpc(WARBURTON); quest:AddENpc(RURURAJI); quest:AddENpc(BIG_BELLIED_BARKER); @@ -136,12 +105,23 @@ function onSequence(player, quest, sequence) quest:AddENpc(GIL_DIGGING_MISTRESS, gildiggingmistressFlag); quest:AddENpc(TWITTERING_TOMBOY); quest:AddENpc(STOCKY_STRANGER); - quest:AddENpc(EXIT_TRIGGER, exitFlag, false, false, exitCanPush); + quest:AddENpc(EXIT_TRIGGER, exitFlag, false, true); quest:AddENpc(OPENING_STOPER_ULDAH, QFLAG_NONE, false, false, true); - elseif (sequence == SEQ_005) then elseif (sequence == SEQ_010) then - + local yayatokiFlag = quest:GetFlag(FLAG_SEQ010_TALK0) and QFLAG_NONE or QFLAG_PLATE; + local uldahopeningexitFlag = not quest:GetFlag(FLAG_SEQ010_TALK0) and QFLAG_NONE or QFLAG_MAP; + quest:AddENpc(KEEN_EYED_MERCHANT); + quest:AddENpc(HIGH_SPIRITED_FELLOW); + quest:AddENpc(DISREPUTABLE_MIDLANDER); + quest:AddENpc(LONG_LEGGED_LADY); + quest:AddENpc(LARGE_LUNGED_LABORER); + quest:AddENpc(TOOTH_GRINDING_TRAVELER); + quest:AddENpc(FULL_LIPPED_FILLE); + quest:AddENpc(YAYATOKI, yayatokiFlag); + quest:AddENpc(BLOCKER1, QFLAG_NONE, false, true); + -- quest:AddENpc(BLOCKER2, QFLAG_NONE, false, true); + quest:AddENpc(ULDAH_OPENING_EXIT, uldahopeningexitFlag, false, true); end end @@ -154,98 +134,98 @@ function onTalk(player, quest, npc) elseif (sequence == SEQ_010) then seq010_onTalk(player, quest, npc, classId); end + quest:UpdateENPCs(); end function onPush(player, quest, npc) + local sequence = quest:getSequence(); local classId = npc:GetActorClassId(); - + if (sequence == SEQ_000) then if (classId == ASCILIA) then callClientFunction(player, "delegateEvent", player, quest, "processTtrNomal002"); player:EndEvent(); - elseif (classId == OPENING_STOPER_ULDAH) then - + elseif (classId == EXIT_TRIGGER) then + if (quest:GetFlags() == 0xF) then + doExitTrigger(player, quest, npc); + return; + else + callClientFunction(player, "delegateEvent", player, quest, "processTtrBlkNml001"); + GetWorldManager():DoPlayerMoveInZone(player, -22, 196, 87, 2.4, 0x11) + player:EndEvent(); + end end - - elseif (sequence == SEQ_010) then + if (classId == BLOCKER1) then + + posz = player:GetPos()[3]; + + if (posz >= 71 and posz <= 95) then + callClientFunction(player, "delegateEvent", player, quest, "processTtrBlkNml002"); + GetWorldManager():DoPlayerMoveInZone(player, -22.81, 196, 87.82, 2.98, 0x11); + else + callClientFunction(player, "delegateEvent", player, quest, "processTtrBlkNml003"); + GetWorldManager():DoPlayerMoveInZone(player, -0.3, 196, 116, -2.7, 0x11); + end + elseif (classId == ULDAH_OPENING_EXIT) then + player:ReplaceQuest(quest, "Man0u1") + return; + end end + quest:UpdateENPCs(); end function onNotice(player, quest, target) - - callClientFunction(player, "delegateEvent", player, quest, "processTtrNomal001withHQ"); - - + callClientFunction(player, "delegateEvent", player, quest, "processTtrNomal001withHQ"); player:EndEvent(); + quest:UpdateENPCs(); end function seq000_onTalk(player, quest, npc, classId) if (classId == ASCILIA) then - -- Handle the talk tutorial after the push one. - if (not quest:GetFlag(FLAG_SEQ000_MINITUT0)) then + + if (not quest:GetFlag(FLAG_SEQ000_MINITUT0)) then -- If Talk tutorial callClientFunction(player, "delegateEvent", player, quest, "processTtrNomal003"); - quest:SetFlag(FLAG_SEQ000_MINITUT0); - - quest:UpdateENpc(ASCILIA, ENPC_PROP_CAN_PUSH, false); - quest:UpdateENpc(ASCILIA, ENPC_PROP_QFLAG, QFLAG_PLATE); - quest:UpdateENpc(FRETFUL_FARMHAND, ENPC_PROP_QFLAG, QFLAG_PLATE); - quest:UpdateENpc(GIL_DIGGING_MISTRESS, ENPC_PROP_QFLAG, QFLAG_PLATE); + quest:SetFlag(FLAG_SEQ000_MINITUT0); -- Used to disable her PushEvent / Allow for her next TalkEvent else callClientFunction(player, "delegateEvent", player, quest, "processTtrMini001"); - if (not quest:GetFlag(FLAG_SEQ000_MINITUT1)) then - quest:UpdateENpc(ASCILIA, ENPC_PROP_QFLAG, QFLAG_NONE); - quest:SetFlag(FLAG_SEQ000_MINITUT1); - end + quest:SetFlag(FLAG_SEQ000_MINITUT1); -- Ascilia has now been talked to. end - - - elseif (classId == WARBURTON) then - callClientFunction(player, "delegateEvent", player, quest, "processEvent000_3"); - - elseif (classId == RURURAJI) then - callClientFunction(player, "delegateEvent", player, quest, "processEvent000_13"); - - elseif (classId == BIG_BELLIED_BARKER) then - callClientFunction(player, "delegateEvent", player, quest, "processEvent000_6"); - + elseif (classId == FRETFUL_FARMHAND) then if (not quest:GetFlag(FLAG_SEQ000_MINITUT2)) then callClientFunction(player, "delegateEvent", player, quest, "processTtrMini002_first"); - quest:UpdateENpc(FRETFUL_FARMHAND, ENPC_PROP_QFLAG, QFLAG_NONE); quest:SetFlag(FLAG_SEQ000_MINITUT2); else callClientFunction(player, "delegateEvent", player, quest, "processTtrMini002"); - end + end - elseif (classId == DEBAUCHED_DEMONESS) then - callClientFunction(player, "delegateEvent", player, quest, "processEvent000_8"); - - elseif (classId == DAPPER_DAN) then - callClientFunction(player, "delegateEvent", player, quest, "processEvent000_9"); - elseif (classId == LOUTISH_LAD) then - callClientFunction(player, "delegateEvent", player, quest, "processEvent000_10"); - elseif (classId == GIL_DIGGING_MISTRESS) then if (not quest:GetFlag(FLAG_SEQ000_MINITUT3)) then callClientFunction(player, "delegateEvent", player, quest, "processTtrMini003_first"); - quest:UpdateENpc(GIL_DIGGING_MISTRESS, ENPC_PROP_QFLAG, QFLAG_NONE); quest:SetFlag(FLAG_SEQ000_MINITUT3); else callClientFunction(player, "delegateEvent", player, quest, "processTtrMini003"); - end + end + elseif (classId == WARBURTON) then + callClientFunction(player, "delegateEvent", player, quest, "processEvent000_3"); + elseif (classId == RURURAJI) then + callClientFunction(player, "delegateEvent", player, quest, "processEvent000_13"); + elseif (classId == BIG_BELLIED_BARKER) then + callClientFunction(player, "delegateEvent", player, quest, "processEvent000_6"); + elseif (classId == DEBAUCHED_DEMONESS) then + callClientFunction(player, "delegateEvent", player, quest, "processEvent000_8"); + elseif (classId == DAPPER_DAN) then + callClientFunction(player, "delegateEvent", player, quest, "processEvent000_9"); + elseif (classId == LOUTISH_LAD) then + callClientFunction(player, "delegateEvent", player, quest, "processEvent000_10"); elseif (classId == TWITTERING_TOMBOY) then callClientFunction(player, "delegateEvent", player, quest, "processEvent000_12"); elseif (classId == STOCKY_STRANGER) then - callClientFunction(player, "delegateEvent", player, quest, "processEvent000_6_2"); -- TODO: Likely 6, 6_2 looks like a Stoper dialog - end - - if (quest:GetFlags() == 0xF) then - quest:UpdateENpc(EXIT_TRIGGER, ENPC_PROP_CAN_PUSH, true); - quest:UpdateENpc(EXIT_TRIGGER, ENPC_PROP_QFLAG, QFLAG_MAP); + callClientFunction(player, "delegateEvent", player, quest, "processEvent000_6_2"); end player:EndEvent(); @@ -253,15 +233,75 @@ end function seq010_onTalk(player, quest, npc, classId) + if (classId == KEEN_EYED_MERCHANT) then + callClientFunction(player, "delegateEvent", player, quest, "processEvent020_2"); + elseif (classId == HIGH_SPIRITED_FELLOW) then + callClientFunction(player, "delegateEvent", player, quest, "processEvent020_3"); + elseif (classId == DISREPUTABLE_MIDLANDER) then + callClientFunction(player, "delegateEvent", player, quest, "processEvent020_4"); + elseif (classId == LONG_LEGGED_LADY) then + callClientFunction(player, "delegateEvent", player, quest, "processEvent000_14"); + elseif (classId == LARGE_LUNGED_LABORER) then + callClientFunction(player, "delegateEvent", player, quest, "processEtc003"); + elseif (classId == TOOTH_GRINDING_TRAVELER) then + callClientFunction(player, "delegateEvent", player, quest, "processEtc001"); + elseif (classId == FULL_LIPPED_FILLE) then + callClientFunction(player, "delegateEvent", player, quest, "processEtc002"); + elseif (classId == YAYATOKI) then + if (not quest:GetFlag(FLAG_SEQ010_TALK0)) then + callClientFunction(player, "delegateEvent", player, quest, "processEvent020_8"); + quest:SetFlag(FLAG_SEQ010_TALK0); + else + callClientFunction(player, "delegateEvent", player, quest, "processEvent020_8"); + end + end + player:EndEvent(); end function getJournalMapMarkerList(player, quest) local sequence = quest:getSequence(); + local possibleMarkers = {}; if (sequence == SEQ_000) then - return MKRK_ASCILIA, MKRK_FRETFUL_FARMHAND; + if (quest:GetFlag(FLAG_SEQ000_MINITUT0)) then + if (not quest:GetFlag(FLAG_SEQ000_MINITUT1)) then table.insert(possibleMarkers, MRKR_ASCILIA); end + if (not quest:GetFlag(FLAG_SEQ000_MINITUT2)) then table.insert(possibleMarkers, MRKR_FRETFUL_FARMHAND); end + if (not quest:GetFlag(FLAG_SEQ000_MINITUT3)) then table.insert(possibleMarkers, MRKR_GIL_DIGGING_MISTRESS); end + end + elseif (sequence == SEQ_010) then - --return + if (not quest:GetFlag(FLAG_SEQ010_TALK0)) then + table.insert(possibleMarkers, MRKR_YAYATOKI) + else + table.insert(possibleMarkers, MRKR_ADV_GUILD); + end end -end \ No newline at end of file + + return unpack(possibleMarkers) +end + + + + +function doExitTrigger(player, quest, npc) + quest:ClearData(); + quest:StartSequence(SEQ_005); + contentArea = player.CurrentArea:CreateContentArea(player, "/Area/PrivateArea/Content/PrivateAreaMasterSimpleContent", "man0u01", "SimpleContent30079", "Quest/QuestDirectorMan0u001"); + + if (contentArea == nil) then + return; + end + + director = contentArea:GetContentDirector(); + player:AddDirector(director); + director:StartDirector(false); + + player:KickEvent(director, "noticeEvent", true); + player:SetLoginDirector(director); + + GetWorldManager():DoZoneChangeContent(player, contentArea, -24.34, 192, 34.22, 0.78, 16); + return; +end + + diff --git a/Data/scripts/quests/man/man0u1.lua b/Data/scripts/quests/man/man0u1.lua new file mode 100644 index 00000000..156fa866 --- /dev/null +++ b/Data/scripts/quests/man/man0u1.lua @@ -0,0 +1,233 @@ +require("global"); + +--[[ + +Quest Script + +Name: Court in the Sands +Code: Man0u1 +Id: 110010 +Prereq: Flowers for All (Man0u0 - 110009) +Notes: + + +Vid refs - +https://www.youtube.com/watch?v=WNRLrwZ3BJY&t=284s +https://www.youtube.com/watch?v=eZgcq-FMpfw&t=504s + +]] + + +--[[ + +Phase: + +45 (Miner's Guild) + Linette processEvent050 (initial CS) + Change phase to 50 after interaction + +50 (Miner's Guild Instance #1) + Name DisplayName ActorClass Event + Linette 1100016 1000861 processEvent050_2 + Corguevais 1200025 1000043/1001054 processEvent050_11 + Nittma Guttma 1400127 1001286 processEvent050_10 + Nortmoen 1600127 1600042 + F'lhaminn 1900054 1000038/1000842/1001514/2290008 processEvent051_1 + Tyago Moui 1900130 1001203 processEvent050_12 + Shilgen 2200216 1000637 + Muscular Miner 4000202 1000690/1700013 processEvent050_7 + Close-fisted Woman 4000366 1000981 processEvent050_8 + Astonished Adventurer 4000377 1000895 processEvent050_9 + Manic Miner 4000444 1001283 processEvent050_13 + Maddened Miner 4000445 1001284 processEvent050_14 + Maudlin Miner 4000446 1001287 processEvent050_3 + Mocking Miner 4000447 1001288 processEvent050_4 + Monitoring Miner 4000448 1001289 processEvent050_5 + Displeased Dancer 4000449 1001290 processEvent050_6 + + Emotes 103, 108, 121, 125, 140, 135 in that order @ F'lhaminn, then change phase to 51 +51 + Emotes 108 @ Maddened Miner + Emotes 135, 103, 121 @ Manic Miner + Check both for clear state after each interaction and change phase to 55 + +55 (Miner's Guild Instance #2) + +--]] + + + +-- Sequence Numbers +SEQ_000 = 0; -- Ul'dah Adventurer's Guild +SEQ_005 = 5; -- Run to Camp Black Brush & Attune +SEQ_010 = 10; -- Return to the Guild +SEQ_012 = 12; -- Speak to Momodi +SEQ_015 = 15; -- Visiting guilds (GSM, GLD) +SEQ_045 = 45; +SEQ_050 = 50; +SEQ_057 = 57; +SEQ_058 = 58; +SEQ_060 = 60; +SEQ_065 = 65; +SEQ_070 = 70; +SEQ_075 = 75; +SEQ_080 = 80; +SEQ_085 = 85; +SEQ_090 = 90; +SEQ_095 = 95; +SEQ_100 = 100; +SEQ_105 = 105; +SEQ_110 = 110; + + +-- Actor Class Ids +OVERCOMPETITIVE_ADVENTURER = 1000807; +MOMODI = 1000841; +OTOPA_POTTOPA = 1000864; +UNDAUNTED_ADVENTURER = 1000936; +GREEDY_MERCHANT = 1000937; +LIONHEARTED_ADVENTURER = 1000938; +SPRY_SALESMAN = 1000939; + + + +UPBEAT_ADVENTURER = 1000940; +SEEMINGLY_CALM_ADVENTURER = 1000941; +UNKNOWN1 = 0; +UNKNOWN2 = 0 + +THANCRED = 1000948; -- 1000010 + + +-- Quest Markers +MRKR_MOMODI = 11001001; +MRKR_CAMP_BLACK_BRUSH = 11001002; + +-- Quest Items +VELODYNA_COSMOS = 0; -- Seq_000 : 2nd journal arg. >=5 doesn't have. +COLISEUM_PASS = 0; -- Seq_015 : 3rd journal arg. >=5 doesn't have + +-- Quest Flags +FLAG_SEQ000 = 0; + +function onStart(player, quest) + quest:StartSequence(SEQ_000); + + -- Immediately move to the Adventurer's Guild private area + + callClientFunction(player, "delegateEvent", player, quest, "processEventMomodiStart"); + + GetWorldManager():DoZoneChange(player, 175, "PrivateAreaMasterPast", 4, 15, -75.242, 195.009, 74.572, -0.046); + + --callClientFunction(player, "delegateEvent", player, quest, "processEvent000_1"); -- Describes what an Instance is + player:SendGameMessage(quest, 329, 0x20); + player:SendGameMessage(quest, 330, 0x20); +end + +function onFinish(player, quest) +end + +function onSequence(player, quest, sequence) + + if (sequence == SEQ_000) then + -- Setup states incase we loaded in. + + --AddENpc(classId, byte flagType=0,isTalkEnabled, isPushEnabled, isEmoteEnabled, isSpawned) + quest:AddENpc(MOMODI, QFLAG_PLATE); + quest:AddENpc(OTOPA_POTTOPA); + + elseif (sequence == SEQ_005) then + quest:AddENpc(MOMODI); + end +end + +function onTalk(player, quest, npc) + local sequence = quest:getSequence(); + local classId = npc:GetActorClassId(); + + if (sequence == SEQ_000) then + seq000_onTalk(player, quest, npc, classId); + elseif (sequence == SEQ_005) then + seq005_onTalk(player, quest, npc, classId); + end + quest:UpdateENPCs(); +end + +function onPush(player, quest, npc) + + local sequence = quest:getSequence(); + local classId = npc:GetActorClassId(); + player:SendMessage(0x20, "", "Sequence: "..sequence.." Class Id: "..classId); + if (sequence == SEQ_000) then + + elseif (sequence == SEQ_010) then + + end + quest:UpdateENPCs(); +end + + + +function seq000_onTalk(player, quest, npc, classId) + + if (classId == MOMODI) then + callClientFunction(player, "delegateEvent", player, quest, "processEvent010"); + player:EndEvent(); + quest:StartSequence(SEQ_005); + GetWorldManager():DoZoneChange(player, 175, nil, 0, 15, player.positionX, player.positionY, player.positionZ, player.rotation); + return; + elseif (classId == UNDAUNTED_ADVENTURER) then + callClientFunction (player, "delegateEvent", player, quest, "processEvent000_2"); + elseif (classId == GREEDY_MERCHANT) then + callClientFunction (player, "delegateEvent", player, quest, "processEvent000_3"); + elseif (classId == SPRY_SALESMAN) then + callClientFunction (player, "delegateEvent", player, quest, "processEvent000_4"); + elseif (classId == LIONHEARTED_ADVENTURER) then + callClientFunction(player, "delegateEvent", player, quest, "processEvent000_5"); + elseif (classId == UPBEAT_ADVENTURER) then + callClientFunction(player, "delegateEvent", player, quest, "processEvent000_6"); + elseif (classId == SEEMINGLY_CALM_ADVENTURER) then + callClientFunction(player, "delegateEvent", player, quest, "processEvent000_7"); + elseif (classId == OVERCOMPETITIVE_ADVENTURER) then + callClientFunction(player, "delegateEvent", player, quest, "processEvent000_8"); + elseif (classId == OTOPA_POTTOPA) then + callClientFunction(player, "delegateEvent", player, quest, "processEvent000_9"); + elseif (classId == THANCRED) then + callClientFunction(player, "delegateEvent", player, quest, "processEvent000_10"); + end + + player:EndEvent(); +end + +function seq005_onTalk(player, quest, npc, classId) + if (classId == MOMODI) then + callClientFunction(player, "delegateEvent", player, quest, "processEvent010_2"); + end + + player:EndEvent(); +end + + +function getJournalInformation(player, quest) + return 0, VELODYNA_COSMOS, COLISEUM_PASS; +end + + +function getJournalMapMarkerList(player, quest) + local sequence = quest:getSequence(); + local possibleMarkers = {}; + + if (sequence == SEQ_000) then + table.insert(possibleMarkers, MRKR_MOMODI); + elseif (sequence == SEQ_010) then + if (not quest:GetFlag(FLAG_SEQ010_TALK0)) then + table.insert(possibleMarkers, MRKR_YAYATOKI) + else + table.insert(possibleMarkers, MRKR_ADV_GUILD); + end + end + + return unpack(possibleMarkers) +end + + diff --git a/Data/scripts/unique/wil0Battle01/MapObjOnlyShowHide/Man0u0_trtl_gate.lua b/Data/scripts/unique/wil0Battle01/MapObjOnlyShowHide/Man0u0_trtl_gate.lua new file mode 100644 index 00000000..56e69c09 --- /dev/null +++ b/Data/scripts/unique/wil0Battle01/MapObjOnlyShowHide/Man0u0_trtl_gate.lua @@ -0,0 +1,3 @@ +function init(npc) + return false, false, 0, 0, 0x1A5, 4287; +end \ No newline at end of file diff --git a/Map Server/Actors/Chara/Player/Player.cs b/Map Server/Actors/Chara/Player/Player.cs index fb90c85d..8736beac 100644 --- a/Map Server/Actors/Chara/Player/Player.cs +++ b/Map Server/Actors/Chara/Player/Player.cs @@ -1686,6 +1686,7 @@ namespace Meteor.Map.Actors defaultTalk = (Quest) Server.GetStaticActors("DftFst"); break; case 104: + case 107: defaultTalk = (Quest) Server.GetStaticActors("DftWil"); break; case 105: