diff --git a/Data/scripts/commands/gm/quest.lua b/Data/scripts/commands/gm/quest.lua index 3f227706..eab846ef 100644 --- a/Data/scripts/commands/gm/quest.lua +++ b/Data/scripts/commands/gm/quest.lua @@ -40,7 +40,7 @@ function onTrigger(player, argc, command, var1, var2, var3) elseif command == "remove" or command == "delete" or command == "-" then if tonumber(var1) and player:HasQuest(tonumber(var1)) == true then - player:RemoveQuestByQuestId(tonumber(var1)); + player:RemoveQuest(tonumber(var1)); message = ("removing quest "..var1); else if player:HasQuest(var1) == true then @@ -53,7 +53,7 @@ function onTrigger(player, argc, command, var1, var2, var3) q4 = bit32.band(q3, 0xA0F00000); printf(q4); - --player:RemoveQuest(quest.Name); + player:RemoveQuest(quest.Name); end else message = ("remove error: either incorrect ID or quest "..var1.." isn't active on character"); @@ -137,7 +137,7 @@ function onTrigger(player, argc, command, var1, var2, var3) player:GetQuest(questvar):GetData():ClearFlag(flagvar); end player:GetQuest(questvar):UpdateENPCs(); - player:GetQuest(questvar):SaveData(); + player:GetQuest(questvar):GetData():Save(); if boolvar == true then message = ("changing flag "..tonumber(var2).." to true on quest "..questvar); else @@ -156,7 +156,7 @@ function onTrigger(player, argc, command, var1, var2, var3) player:GetQuest(questvar):GetData():SetCounter(index, tonumber(var3)); player:GetQuest(questvar):UpdateENPCs(); - player:GetQuest(questvar):SaveData(); + player:GetQuest(questvar):GetData():Save(); message = ("changing counter "..tonumber(var2).." to "..var3); else message = ("error: command "..command.." not recognized"); diff --git a/Data/scripts/global.lua b/Data/scripts/global.lua index 92e9a4e4..e3eaa18d 100644 --- a/Data/scripts/global.lua +++ b/Data/scripts/global.lua @@ -153,13 +153,7 @@ ETYPE_PUSH = 2; ETYPE_EMOTE = 3; ETYPE_NOTICE = 5; --- QUEST INSTANCE -ENPC_PROP_QFLAG = 0; -ENPC_PROP_CAN_TALK = 1; -ENPC_PROP_CAN_PUSH = 2; -ENPC_PROP_CAN_EMOTE = 3; -ENPC_PROP_CAN_NOTICE = 4; - +-- QUEST FLAGS QFLAG_NONE = 0; QFLAG_PLATE = 2; QFLAG_MAP = 3; diff --git a/Data/scripts/quests/trl1/Trl0g1.lua b/Data/scripts/quests/trl1/Trl0g1.lua new file mode 100644 index 00000000..e07ec868 --- /dev/null +++ b/Data/scripts/quests/trl1/Trl0g1.lua @@ -0,0 +1,29 @@ +require ("global") + +--[[ + +Quest Script + +Name: Getting Started (Mother Miounne) +Code: Trl0g1 +Id: 110141 + +Enables the "Getting Started" option on Miounne. +* NOTE: This quest is active for all players at all times. +]] + +function onTalk(player, quest, npc, eventName) + local choice = callClientFunction(player, "delegateEvent", player, quest, "processEventMiounneStart"); + + if (choice == 1) then + callClientFunction(player, "delegateEvent", player, quest, "processEvent225"); + elseif (choice == 2) then + callClientFunction(player, "delegateEvent", player, quest, "processEvent230"); + end + + player:EndEvent(); +end + +function IsQuestENPC(player, quest, npc) + return npc:GetActorClassId()] == 1000230; +end \ No newline at end of file diff --git a/Data/scripts/quests/trl1/Trl0l1.lua b/Data/scripts/quests/trl1/Trl0l1.lua new file mode 100644 index 00000000..6e8ac0f5 --- /dev/null +++ b/Data/scripts/quests/trl1/Trl0l1.lua @@ -0,0 +1,29 @@ +require ("global") + +--[[ + +Quest Script + +Name: Getting Started (Baderon) +Code: Trl0l1 +Id: 110140 + +Enables the "Getting Started" option on Baderon. +* NOTE: This quest is active for all players at all times. +]] + +function onTalk(player, quest, npc, eventName) + local choice = callClientFunction(player, "delegateEvent", player, quest, "processEventBaderonStart"); + + if (choice == 1) then + callClientFunction(player, "delegateEvent", player, quest, "processEvent640"); + elseif (choice == 2) then + callClientFunction(player, "delegateEvent", player, quest, "processEvent650"); + end + + player:EndEvent(); +end + +function IsQuestENPC(player, quest, npc) + return npc:GetActorClassId()] == 1000137; +end \ No newline at end of file diff --git a/Data/scripts/quests/trl1/Trl0u1.lua b/Data/scripts/quests/trl1/Trl0u1.lua new file mode 100644 index 00000000..bf5734d0 --- /dev/null +++ b/Data/scripts/quests/trl1/Trl0u1.lua @@ -0,0 +1,29 @@ +require ("global") + +--[[ + +Quest Script + +Name: Getting Started (Momodi) +Code: Trl0u1 +Id: 110142 + +Enables the "Getting Started" option on Momodi. +* NOTE: This quest is active for all players at all times. +]] + +function onTalk(player, quest, npc, eventName) + local choice = callClientFunction(player, "delegateEvent", player, quest, "processEventMomodiStart"); + + if (choice == 1) then + callClientFunction(player, "delegateEvent", player, quest, "processEvent235"); + elseif (choice == 2) then + callClientFunction(player, "delegateEvent", player, quest, "processEvent240"); + end + + player:EndEvent(); +end + +function IsQuestENPC(player, quest, npc) + return npc:GetActorClassId() == 1000841; +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 143cb108..98f1bc59 100644 --- a/Map Server/Actors/Chara/Player/Player.cs +++ b/Map Server/Actors/Chara/Player/Player.cs @@ -1574,9 +1574,9 @@ namespace Meteor.Map.Actors #region Quests - Debug/Misc Related // Force-Add a quest by Id. Called be debug scripts. - public void AddQuest(uint id, bool isSilent = false) + public void AddQuest(int id, bool isSilent = false) { - Actor actor = Server.GetStaticActors((0xA0F00000 | id)); + Actor actor = Server.GetStaticActors((0xA0F00000 | (uint)id)); AddQuest(actor.Name, isSilent); } @@ -1596,8 +1596,7 @@ namespace Meteor.Map.Actors if (activeQuest == null) questStateManager.ForceAddActiveQuest(questScenario[freeSlot]); - - Database.SaveQuest(this, questScenario[freeSlot], freeSlot); + SendQuestClientUpdate(freeSlot); if (!isSilent) @@ -1606,9 +1605,11 @@ namespace Meteor.Map.Actors } questScenario[freeSlot].OnAccept(); + + Database.SaveQuest(this, questScenario[freeSlot], freeSlot); } - public void RemoveQuest(uint id) + public void RemoveQuest(int id) { for (int i = 0; i < questScenario.Length; i++) { diff --git a/Map Server/Actors/Quest/Quest.cs b/Map Server/Actors/Quest/Quest.cs index 387f7572..0bad40bc 100644 --- a/Map Server/Actors/Quest/Quest.cs +++ b/Map Server/Actors/Quest/Quest.cs @@ -123,7 +123,7 @@ namespace Meteor.Map.Actors.QuestNS public void UpdateENPCs() { - if (data.Dirty) + if (data != null && data.Dirty) { if (questState != null) questState.UpdateState(); @@ -186,7 +186,7 @@ namespace Meteor.Map.Actors.QuestNS { List returned = LuaEngine.GetInstance().CallLuaFunctionForReturn(caller, this, "IsQuestENPC", true, npc, this); bool scriptReturned = returned != null && returned.Count != 0 && returned[0].typeID == 3; - return scriptReturned || questState.HasENpc(npc.GetActorClassId()); + return scriptReturned || (questState?.HasENpc(npc.GetActorClassId()) ?? false); } public void StartSequence(ushort sequence) diff --git a/Map Server/Actors/Quest/QuestStateManager.cs b/Map Server/Actors/Quest/QuestStateManager.cs index 3bc6c0ec..6dd15b13 100644 --- a/Map Server/Actors/Quest/QuestStateManager.cs +++ b/Map Server/Actors/Quest/QuestStateManager.cs @@ -72,7 +72,7 @@ namespace Meteor.Map.Actors.QuestNS public void UpdateQuestCompleted(Quest quest) { - CompletedQuestsBitfield.Set(quest.Id - SCENARIO_START); + CompletedQuestsBitfield.Set(quest.GetQuestId() - SCENARIO_START); QuestGameData[] updated = Server.GetQuestGamedataByPrerequisite(quest.GetQuestId()); foreach (var questData in updated) PrereqBitfield.Set(questData.Id - SCENARIO_START); diff --git a/Map Server/Packets/Send/Actor/SetActorPropetyPacket.cs b/Map Server/Packets/Send/Actor/SetActorPropetyPacket.cs index f5d1d969..775f54e4 100644 --- a/Map Server/Packets/Send/Actor/SetActorPropetyPacket.cs +++ b/Map Server/Packets/Send/Actor/SetActorPropetyPacket.cs @@ -274,9 +274,7 @@ namespace Meteor.Map.packets.send.actor CloseStreams(); - SubPacket packet = new SubPacket(OPCODE, sourceActorId, data); - packet.DebugPrintSubPacket(); - return packet; + return new SubPacket(OPCODE, sourceActorId, data); } }