Merged in issue-21 (pull request #69)

Fix to Character Name Reservation

* Ported over changes from resharc/ffxiv-classic-server and merged into new branch.


Approved-by: Filip Maj
This commit is contained in:
PW Anon 2022-01-20 03:15:31 +00:00 committed by Filip Maj
parent 0521b167fb
commit 61069e6d49

View File

@ -68,23 +68,49 @@ namespace Meteor.Lobby
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))) 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 try
{ {
conn.Open(); conn.Open();
pid = 0;
//Check if exists cid = 0;
MySqlCommand cmd = new MySqlCommand("SELECT * FROM characters WHERE name=@name AND serverId=@serverId AND state != 2 AND state != 1", conn); //Check if there exists a character not reserved by the user with the same name and in the same server
MySqlCommand cmd = new MySqlCommand("SELECT * FROM characters WHERE (name=@name AND serverId=@serverId AND (userId!=@userId OR state!=0))", conn);
cmd.Parameters.AddWithValue("@serverId", serverId); cmd.Parameters.AddWithValue("@serverId", serverId);
cmd.Parameters.AddWithValue("@name", name); cmd.Parameters.AddWithValue("@name", name);
cmd.Parameters.AddWithValue("@userId", userId);
using (MySqlDataReader Reader = cmd.ExecuteReader()) using (MySqlDataReader Reader = cmd.ExecuteReader())
{ {
if (Reader.HasRows) if (Reader.HasRows)
{ {
alreadyExists = true; Program.Log.Debug("[SQL] Found character with same name. Exiting...");
return true; //Early exit as we don't need to bother with anything else in this.
} }
} }
//Reserve //Now check for a reserved character
if (!alreadyExists) MySqlCommand cmd3 = new MySqlCommand("SELECT * FROM characters WHERE userId=@userId AND state=0", conn);
cmd3.Parameters.AddWithValue("@userId", userId);
using (MySqlDataReader Reader = cmd3.ExecuteReader())
{
if (Reader.HasRows) //We can reasonably assume that there's only one reserved character per used id
{
Reader.Read();
cid = Reader.GetUInt16(0);
pid = 0xBABE;
}
}
if (cid != 0) //Update our reservation
{
MySqlCommand cmd2 = new MySqlCommand();
cmd2.Connection = conn;
cmd2.CommandText = "UPDATE characters SET serverId = @serverId, name = @name WHERE id = @cid";
cmd2.Prepare();
cmd2.Parameters.AddWithValue("@serverId", serverId);
cmd2.Parameters.AddWithValue("@name", name);
cmd2.Parameters.AddWithValue("@cid", cid);
cmd2.ExecuteNonQuery();
} else //Reserve
{ {
MySqlCommand cmd2 = new MySqlCommand(); MySqlCommand cmd2 = new MySqlCommand();
cmd2.Connection = conn; cmd2.Connection = conn;
@ -98,31 +124,23 @@ namespace Meteor.Lobby
cid = (ushort)cmd2.LastInsertedId; cid = (ushort)cmd2.LastInsertedId;
pid = 0xBABE; pid = 0xBABE;
} }
else
{
pid = 0;
cid = 0;
}
} }
catch (MySqlException e) catch (MySqlException e)
{ {
Program.Log.Error(e.ToString()); Program.Log.Error(e.ToString());
Program.Log.Error(e.ToString()); Program.Log.Error(e.ToString());
pid = 0;
cid = 0; cid = 0;
pid = 0;
} }
finally finally
{ {
conn.Dispose(); conn.Dispose();
} }
Program.Log.Debug("[SQL] CID={0} Created on 'characters' table.", cid); Program.Log.Debug("[SQL] CID={0} Created on 'characters' table.", cid);
} }
return alreadyExists; return alreadyExists;
} }
public static void MakeCharacter(uint accountId, uint cid, CharaInfo charaInfo) public static void MakeCharacter(uint accountId, uint cid, CharaInfo charaInfo)
{ {