From fe111ab6ca44bfce98e74e5f9901e2b22f33c53b Mon Sep 17 00:00:00 2001 From: Filip Maj Date: Sun, 10 Apr 2016 13:11:12 -0400 Subject: [PATCH] Quest data is now saved/loaded from the DB. --- FFXIVClassic Map Server/Database.cs | 68 ++++++++++++++++++- .../actors/chara/player/Player.cs | 11 +++ FFXIVClassic Map Server/actors/quest/Quest.cs | 39 ++++++++--- 3 files changed, 108 insertions(+), 10 deletions(-) diff --git a/FFXIVClassic Map Server/Database.cs b/FFXIVClassic Map Server/Database.cs index 06a03b1e..881910bc 100644 --- a/FFXIVClassic Map Server/Database.cs +++ b/FFXIVClassic Map Server/Database.cs @@ -310,6 +310,56 @@ namespace FFXIVClassic_Lobby_Server } } + public static void saveQuest(Player player, Quest quest) + { + int slot = player.getQuestSlot(quest.actorId); + if (slot == -1) + { + Log.error(String.Format("Tried saving quest player didn't have: Player: {0:x}, QuestId: {0:x}", player.actorId, quest.actorId)); + return; + } + else + saveQuest(player, quest, slot); + } + + public static void saveQuest(Player player, Quest quest, int slot) + { + string query; + MySqlCommand cmd; + + using (MySqlConnection conn = new MySqlConnection(String.Format("Server={0}; Port={1}; Database={2}; UID={3}; Password={4}", ConfigConstants.DATABASE_HOST, ConfigConstants.DATABASE_PORT, ConfigConstants.DATABASE_NAME, ConfigConstants.DATABASE_USERNAME, ConfigConstants.DATABASE_PASSWORD))) + { + try + { + conn.Open(); + + query = @" + INSERT INTO characters_quest_scenario + (characterId, slot, questId, questData, questFlags) + VALUES + (@charaId, @slot, @questId, @questData, @questFlags) + ON DUPLICATE KEY UPDATE + questData = @questData, questFlags = @questFlags + "; + + cmd = new MySqlCommand(query, conn); + cmd.Parameters.AddWithValue("@charaId", player.actorId); + cmd.Parameters.AddWithValue("@slot", slot); + cmd.Parameters.AddWithValue("@questId", quest.actorId); + cmd.Parameters.AddWithValue("@questData", quest.GetSerializedQuestData()); + cmd.Parameters.AddWithValue("@questFlags", quest.GetQuestFlags()); + + cmd.ExecuteNonQuery(); + } + catch (MySqlException e) + { Console.WriteLine(e); } + finally + { + conn.Dispose(); + } + } + } + public static void loadPlayerCharacter(Player player) { string query; @@ -627,7 +677,9 @@ namespace FFXIVClassic_Lobby_Server query = @" SELECT slot, - questId + questId, + questData, + questFlags FROM characters_quest_scenario WHERE characterId = @charId"; cmd = new MySqlCommand(query, conn); @@ -638,9 +690,21 @@ namespace FFXIVClassic_Lobby_Server { int index = reader.GetUInt16(0); player.playerWork.questScenario[index] = 0xA0F00000 | reader.GetUInt32(1); + string questData = null; + uint questFlags = 0; + + if (!reader.IsDBNull(2)) + questData = reader.GetString(2); + else + questData = "{}"; + + if (!reader.IsDBNull(3)) + questFlags = reader.GetUInt32(3); + else + questFlags = 0; string questName = Server.getStaticActors(player.playerWork.questScenario[index]).actorName; - player.questScenario[index] = new Quest(player.playerWork.questScenario[index], questName); + player.questScenario[index] = new Quest(player, player.playerWork.questScenario[index], questName, questData, questFlags); } } diff --git a/FFXIVClassic Map Server/actors/chara/player/Player.cs b/FFXIVClassic Map Server/actors/chara/player/Player.cs index d2bad572..7405ed9d 100644 --- a/FFXIVClassic Map Server/actors/chara/player/Player.cs +++ b/FFXIVClassic Map Server/actors/chara/player/Player.cs @@ -993,6 +993,17 @@ namespace FFXIVClassic_Map_Server.Actors return false; } + public int getQuestSlot(uint id) + { + for (int i = 0; i < questScenario.Length; i++) + { + if (questScenario[i] != null && questScenario[i].actorId == (0xA0F00000 | id)) + return i; + } + + return -1; + } + public void setDirector(string directorType) { if (directorType.Equals("openingDirector")) diff --git a/FFXIVClassic Map Server/actors/quest/Quest.cs b/FFXIVClassic Map Server/actors/quest/Quest.cs index 707349b8..a8bd5c34 100644 --- a/FFXIVClassic Map Server/actors/quest/Quest.cs +++ b/FFXIVClassic Map Server/actors/quest/Quest.cs @@ -1,4 +1,6 @@ -using FFXIVClassic_Lobby_Server.common; +using FFXIVClassic_Lobby_Server; +using FFXIVClassic_Lobby_Server.common; +using Newtonsoft.Json; using System; using System.Collections.Generic; @@ -6,6 +8,7 @@ namespace FFXIVClassic_Map_Server.Actors { class Quest : Actor { + private Player owner; private int currentPhase = 0; private uint questFlags = 0; private Dictionary questData = new Dictionary(); @@ -13,17 +16,22 @@ namespace FFXIVClassic_Map_Server.Actors public Quest(uint actorID, string name) : base(actorID) { - actorName = name; + actorName = name; } - public void InitQuestData(string dataName, object initialValue) + public Quest(Player owner, uint actorID, string name, string questDataJson, uint questFlags) + : base(actorID) { - questData[dataName] = initialValue; + this.owner = owner; + actorName = name; + this.questFlags = questFlags; + this.questData = JsonConvert.DeserializeObject>(questDataJson); + if (questData == null) + questData = new Dictionary(); } - - public void UpdateQuestData(string dataName, object data) - { - if (questData.ContainsKey(dataName)) + + public void SetQuestData(string dataName, object data) + { questData[dataName] = data; //Inform update @@ -81,5 +89,20 @@ namespace FFXIVClassic_Map_Server.Actors currentPhase++; } + public uint GetQuestFlags() + { + return questFlags; + } + + public string GetSerializedQuestData() + { + return JsonConvert.SerializeObject(questData, Formatting.Indented); + } + + public void SaveData() + { + Database.saveQuest(owner, this); + } + } }