1
Fork 0
mirror of https://bitbucket.org/Ioncannon/project-meteor-server.git synced 2025-04-20 11:47:48 +00:00

Quest data is now saved/loaded from the DB.

This commit is contained in:
Filip Maj 2016-04-10 13:11:12 -04:00
parent b8a3d4f1e0
commit fe111ab6ca
3 changed files with 108 additions and 10 deletions

View file

@ -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) public static void loadPlayerCharacter(Player player)
{ {
string query; string query;
@ -627,7 +677,9 @@ namespace FFXIVClassic_Lobby_Server
query = @" query = @"
SELECT SELECT
slot, slot,
questId questId,
questData,
questFlags
FROM characters_quest_scenario WHERE characterId = @charId"; FROM characters_quest_scenario WHERE characterId = @charId";
cmd = new MySqlCommand(query, conn); cmd = new MySqlCommand(query, conn);
@ -638,9 +690,21 @@ namespace FFXIVClassic_Lobby_Server
{ {
int index = reader.GetUInt16(0); int index = reader.GetUInt16(0);
player.playerWork.questScenario[index] = 0xA0F00000 | reader.GetUInt32(1); 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; 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);
} }
} }

View file

@ -993,6 +993,17 @@ namespace FFXIVClassic_Map_Server.Actors
return false; 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) public void setDirector(string directorType)
{ {
if (directorType.Equals("openingDirector")) if (directorType.Equals("openingDirector"))

View file

@ -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;
using System.Collections.Generic; using System.Collections.Generic;
@ -6,6 +8,7 @@ namespace FFXIVClassic_Map_Server.Actors
{ {
class Quest : Actor class Quest : Actor
{ {
private Player owner;
private int currentPhase = 0; private int currentPhase = 0;
private uint questFlags = 0; private uint questFlags = 0;
private Dictionary<string, Object> questData = new Dictionary<string, object>(); private Dictionary<string, Object> questData = new Dictionary<string, object>();
@ -16,14 +19,19 @@ namespace FFXIVClassic_Map_Server.Actors
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<Dictionary<string, Object>>(questDataJson);
if (questData == null)
questData = new Dictionary<string, object>();
} }
public void UpdateQuestData(string dataName, object data) public void SetQuestData(string dataName, object data)
{ {
if (questData.ContainsKey(dataName))
questData[dataName] = data; questData[dataName] = data;
//Inform update //Inform update
@ -81,5 +89,20 @@ namespace FFXIVClassic_Map_Server.Actors
currentPhase++; currentPhase++;
} }
public uint GetQuestFlags()
{
return questFlags;
}
public string GetSerializedQuestData()
{
return JsonConvert.SerializeObject(questData, Formatting.Indented);
}
public void SaveData()
{
Database.saveQuest(owner, this);
}
} }
} }