diff --git a/FFXIVClassic_Lobby_Server/Database.cs b/FFXIVClassic_Lobby_Server/Database.cs
index 11c62ae6..7a3eaec2 100644
--- a/FFXIVClassic_Lobby_Server/Database.cs
+++ b/FFXIVClassic_Lobby_Server/Database.cs
@@ -41,7 +41,7 @@ namespace FFXIVClassic_Lobby_Server
return id;
}
- public static bool reserveCharacter(uint userId, uint slot, uint serverId, String name)
+ public static bool reserveCharacter(uint userId, uint slot, uint serverId, String name, out uint pid, out uint cid)
{
bool alreadyExists = false;
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)))
@@ -57,7 +57,9 @@ namespace FFXIVClassic_Lobby_Server
using (MySqlDataReader Reader = cmd.ExecuteReader())
{
if (Reader.HasRows)
- alreadyExists = true;
+ {
+ alreadyExists = true;
+ }
}
//Reserve
@@ -72,12 +74,20 @@ namespace FFXIVClassic_Lobby_Server
cmd2.Parameters.AddWithValue("@serverId", serverId);
cmd2.Parameters.AddWithValue("@name", name);
cmd2.ExecuteNonQuery();
- }
+ pid = 1;
+ cid = 1;
+ }
+ else
+ {
+ pid = 0;
+ cid = 0;
+ }
}
catch (MySqlException e)
{
-
+ pid = 0;
+ cid = 0;
}
finally
{
@@ -181,7 +191,7 @@ namespace FFXIVClassic_Lobby_Server
conn.Open();
MySqlCommand cmd = new MySqlCommand();
cmd.Connection = conn;
- cmd.CommandText = "SELECT * FROM ffxiv_servers WHERE isActive=true";
+ cmd.CommandText = "SELECT * FROM servers WHERE isActive=true";
cmd.Prepare();
MySqlDataReader Reader = cmd.ExecuteReader();
@@ -236,7 +246,7 @@ namespace FFXIVClassic_Lobby_Server
conn.Open();
MySqlCommand cmd = new MySqlCommand();
cmd.Connection = conn;
- cmd.CommandText = "SELECT * FROM ffxiv_servers WHERE id=%serverId";
+ cmd.CommandText = "SELECT * FROM servers WHERE id='%serverId'";
cmd.Prepare();
cmd.Parameters.AddWithValue("@serverId", serverId);
@@ -270,12 +280,11 @@ namespace FFXIVClassic_Lobby_Server
}
catch (MySqlException e)
- {
-
+ {
}
finally
{
- conn.Close();
+ conn.Dispose();
}
return world;
diff --git a/FFXIVClassic_Lobby_Server/FFXIVClassic_Lobby_Server.csproj b/FFXIVClassic_Lobby_Server/FFXIVClassic_Lobby_Server.csproj
index 3dd9aa16..009dbfd7 100644
--- a/FFXIVClassic_Lobby_Server/FFXIVClassic_Lobby_Server.csproj
+++ b/FFXIVClassic_Lobby_Server/FFXIVClassic_Lobby_Server.csproj
@@ -63,8 +63,7 @@
-
-
+
diff --git a/FFXIVClassic_Lobby_Server/PacketProcessor.cs b/FFXIVClassic_Lobby_Server/PacketProcessor.cs
index 25e54f6e..373e86f1 100644
--- a/FFXIVClassic_Lobby_Server/PacketProcessor.cs
+++ b/FFXIVClassic_Lobby_Server/PacketProcessor.cs
@@ -198,75 +198,74 @@ namespace FFXIVClassic_Lobby_Server
var name = charaReq.characterName;
var worldId = charaReq.worldId;
+ uint pid = 0, cid = 0;
+
+ World world = Database.getServer(worldId);
+ string worldName = null;
+
+ if (world != null)
+ worldName = world.name;
+
+ if (worldName == null)
+ {
+ ErrorPacket errorPacket = new ErrorPacket(charaReq.sequence, 0, 0, 13001, "World does not exist or is inactive.");
+ SubPacket subpacket = errorPacket.buildPacket();
+ BasePacket basePacket = BasePacket.createPacket(subpacket, true, false);
+ BasePacket.encryptPacket(client.blowfish, basePacket);
+ client.queuePacket(basePacket);
+
+ Console.WriteLine("User {0} => Error; invalid server id: \"{1}\"", client.currentUserId, worldId);
+ return;
+ }
+
switch (code)
{
case 0x01://Reserve
- var alreadyTaken = Database.reserveCharacter(client.currentUserId, slot, worldId, name);
+
+ var alreadyTaken = Database.reserveCharacter(client.currentUserId, slot, worldId, name, out pid, out cid);
if (alreadyTaken)
{
- ErrorPacket errorPacket = new ErrorPacket(charaReq.sequence, 13005, 0, 0, "");
+ ErrorPacket errorPacket = new ErrorPacket(charaReq.sequence, 0, 0, 13005, "");
SubPacket subpacket = errorPacket.buildPacket();
BasePacket basePacket = BasePacket.createPacket(subpacket, true, false);
- basePacket.debugPrintPacket();
BasePacket.encryptPacket(client.blowfish, basePacket);
client.queuePacket(basePacket);
Console.WriteLine("User {0} => Error; name taken: \"{1}\"", client.currentUserId, charaReq.characterName);
return;
- }
+ }
- //Confirm Reserve
- CharaCreatorPacket confirmReserve = new CharaCreatorPacket(charaReq.sequence, CharaCreatorPacket.RESERVE, 1, 1, 1, name, "World Name");
- BasePacket confirmReservePacket = BasePacket.createPacket(confirmReserve.buildPacket(), true, false);
- BasePacket.encryptPacket(client.blowfish, confirmReservePacket);
- client.queuePacket(confirmReservePacket);
-
- Console.WriteLine("User {0} => Reserving character \"{1}\"", client.currentUserId, charaReq.characterName);
+ Console.WriteLine("User {0} => Character reserved \"{1}\"", client.currentUserId, charaReq.characterName);
break;
case 0x02://Make
Character character = Character.EncodedToCharacter(charaReq.characterInfoEncoded);
Database.makeCharacter(client.currentUserId, name, character);
- //Confirm
- CharaCreatorPacket makeChara = new CharaCreatorPacket(charaReq.sequence, CharaCreatorPacket.MAKE, 1, 1, 1, name, "World Name");
- BasePacket confirmMakePacket = BasePacket.createPacket(makeChara.buildPacket(), true, false);
- BasePacket.encryptPacket(client.blowfish, confirmMakePacket);
- client.queuePacket(confirmMakePacket);
-
- Console.WriteLine("User {0} => Character created!", client.currentUserId);
+ Console.WriteLine("User {0} => Character created \"{1}\"", client.currentUserId, charaReq.characterName);
break;
case 0x03://Rename
-
- //Confirm
- CharaCreatorPacket renameChara = new CharaCreatorPacket(charaReq.sequence, CharaCreatorPacket.RENAME, 1, 1, 1, name, "World Name");
- BasePacket confirmRenamePacket = BasePacket.createPacket(renameChara.buildPacket(), true, false);
- BasePacket.encryptPacket(client.blowfish, confirmRenamePacket);
- client.queuePacket(confirmRenamePacket);
-
- Console.WriteLine("User {0} => Character renamed to \"{1}\"", client.currentUserId, charaReq.characterName);
+
+ Console.WriteLine("User {0} => Character renamed \"{1}\"", client.currentUserId, charaReq.characterName);
break;
case 0x04://Delete
Database.deleteCharacter(charaReq.characterId, charaReq.characterName);
-
- //Confirm
- CharaCreatorPacket deleteChara = new CharaCreatorPacket(charaReq.sequence, CharaCreatorPacket.MAKE, 1, 1, 1, name, "World Name");
- BasePacket confirmDeletePacket = BasePacket.createPacket(deleteChara.buildPacket(), true, false);
- BasePacket.encryptPacket(client.blowfish, confirmDeletePacket);
- client.queuePacket(confirmDeletePacket);
-
+
Console.WriteLine("User {0} => Character deleted \"{1}\"", client.currentUserId, charaReq.characterName);
break;
case 0x06://Rename Retainer
- //Confirm
- CharaCreatorPacket renameRetainerChara = new CharaCreatorPacket(charaReq.sequence, CharaCreatorPacket.RENAME_RETAINER, 1, 1, 1, name, "World Name");
- BasePacket confirmRenameRetainerPacket = BasePacket.createPacket(renameRetainerChara.buildPacket(), true, false);
- BasePacket.encryptPacket(client.blowfish, confirmRenameRetainerPacket);
- client.queuePacket(confirmRenameRetainerPacket);
+ Console.WriteLine("User {0} => Retainer renamed \"{1}\"", client.currentUserId, charaReq.characterName);
break;
- }
+ }
+
+ CharaCreatorPacket charaCreator = new CharaCreatorPacket(charaReq.sequence, code, pid, cid, 1, name, worldName);
+ BasePacket charaCreatorPacket = BasePacket.createPacket(charaCreator.buildPacket(), true, false);
+ charaCreatorPacket.debugPrintPacket();
+ BasePacket.encryptPacket(client.blowfish, charaCreatorPacket);
+ client.queuePacket(charaCreatorPacket);
+
}
private void sendWorldList(ClientConnection client, SubPacket packet)
@@ -281,7 +280,7 @@ namespace FFXIVClassic_Lobby_Server
}
- private void sendUnknownList(ClientConnection client, SubPacket packet)
+ private void sendImportList(ClientConnection client, SubPacket packet)
{
}
diff --git a/FFXIVClassic_Lobby_Server/packets/ErrorPacket.cs b/FFXIVClassic_Lobby_Server/packets/ErrorPacket.cs
index 949b483f..2b9b2e53 100644
--- a/FFXIVClassic_Lobby_Server/packets/ErrorPacket.cs
+++ b/FFXIVClassic_Lobby_Server/packets/ErrorPacket.cs
@@ -35,7 +35,7 @@ namespace FFXIVClassic_Lobby_Server.packets
binWriter.Write(errorCode);
binWriter.Write(statusCode);
binWriter.Write(textId);
- binWriter.Write(message);
+ binWriter.Write(Encoding.ASCII.GetBytes(message));
byte[] data = memStream.GetBuffer();
binWriter.Dispose();