mirror of
				https://bitbucket.org/Ioncannon/project-meteor-server.git
				synced 2025-05-20 08:26:59 -04:00 
			
		
		
		
	Finished character creator DB calls, moved DB stuff to Dapper, started work on get characters.
This commit is contained in:
		| @@ -27,6 +27,13 @@ namespace FFXIVClassic_Lobby_Server | |||||||
|         public uint currentUserId = 0; |         public uint currentUserId = 0; | ||||||
|         public uint currentAccount; |         public uint currentAccount; | ||||||
|  |  | ||||||
|  |         //Chara Creation | ||||||
|  |         public string newCharaName; | ||||||
|  |         public uint newCharaPid; | ||||||
|  |         public uint newCharaCid; | ||||||
|  |         public ushort newCharaSlot; | ||||||
|  |         public ushort newCharaWorldId; | ||||||
|  |          | ||||||
|  |  | ||||||
|         public void processIncoming(int bytesIn) |         public void processIncoming(int bytesIn) | ||||||
|         { |         { | ||||||
|   | |||||||
| @@ -1,5 +1,6 @@ | |||||||
| using FFXIVClassic_Lobby_Server.dataobjects; | using FFXIVClassic_Lobby_Server.dataobjects; | ||||||
| using MySql.Data.MySqlClient; | using MySql.Data.MySqlClient; | ||||||
|  | using Dapper; | ||||||
| using Newtonsoft.Json; | using Newtonsoft.Json; | ||||||
| using System; | using System; | ||||||
| using System.Collections.Generic; | using System.Collections.Generic; | ||||||
| @@ -21,7 +22,7 @@ namespace FFXIVClassic_Lobby_Server | |||||||
|                 try |                 try | ||||||
|                 { |                 { | ||||||
|                     conn.Open(); |                     conn.Open(); | ||||||
|                     MySqlCommand cmd = new MySqlCommand("SELECT * FROM ffxiv_sessions WHERE id = @sessionId AND expiration > NOW()", conn); |                     MySqlCommand cmd = new MySqlCommand("SELECT * FROM sessions WHERE id = @sessionId AND expiration > NOW()", conn); | ||||||
|                     cmd.Parameters.AddWithValue("@sessionId", sessionId); |                     cmd.Parameters.AddWithValue("@sessionId", sessionId); | ||||||
|                     using (MySqlDataReader Reader = cmd.ExecuteReader()) |                     using (MySqlDataReader Reader = cmd.ExecuteReader()) | ||||||
|                     { |                     { | ||||||
| @@ -35,7 +36,7 @@ namespace FFXIVClassic_Lobby_Server | |||||||
|                 { Console.WriteLine(e); } |                 { Console.WriteLine(e); } | ||||||
|                 finally |                 finally | ||||||
|                 { |                 { | ||||||
|                     conn.Close(); |                     conn.Dispose(); | ||||||
|                 } |                 } | ||||||
|             } |             } | ||||||
|             return id; |             return id; | ||||||
| @@ -51,7 +52,7 @@ namespace FFXIVClassic_Lobby_Server | |||||||
|                     conn.Open(); |                     conn.Open(); | ||||||
|  |  | ||||||
|                     //Check if exists                     |                     //Check if exists                     | ||||||
|                     MySqlCommand cmd = new MySqlCommand("SELECT * FROM ffxiv_characters2 WHERE name=@name AND serverId=@serverId", conn); |                     MySqlCommand cmd = new MySqlCommand("SELECT * FROM characters WHERE name=@name AND serverId=@serverId", conn); | ||||||
|                     cmd.Parameters.AddWithValue("@serverId", serverId); |                     cmd.Parameters.AddWithValue("@serverId", serverId); | ||||||
|                     cmd.Parameters.AddWithValue("@name", name); |                     cmd.Parameters.AddWithValue("@name", name); | ||||||
|                     using (MySqlDataReader Reader = cmd.ExecuteReader()) |                     using (MySqlDataReader Reader = cmd.ExecuteReader()) | ||||||
| @@ -67,16 +68,15 @@ namespace FFXIVClassic_Lobby_Server | |||||||
|                     { |                     { | ||||||
|                         MySqlCommand cmd2 = new MySqlCommand(); |                         MySqlCommand cmd2 = new MySqlCommand(); | ||||||
|                         cmd2.Connection = conn; |                         cmd2.Connection = conn; | ||||||
|                         cmd2.CommandText = "INSERT INTO ffxiv_characters2(userId, slot, serverId, name, state) VALUES(@userId, @slot, @serverId, @name, 0)"; |                         cmd2.CommandText = "INSERT INTO characters(userId, slot, serverId, name, state) VALUES(@userId, @slot, @serverId, @name, 0)"; | ||||||
|                         cmd2.Prepare(); |                         cmd2.Prepare(); | ||||||
|                         cmd2.Parameters.AddWithValue("@userId", userId); |                         cmd2.Parameters.AddWithValue("@userId", userId); | ||||||
|                         cmd2.Parameters.AddWithValue("@slot", slot); |                         cmd2.Parameters.AddWithValue("@slot", slot); | ||||||
|                         cmd2.Parameters.AddWithValue("@serverId", serverId); |                         cmd2.Parameters.AddWithValue("@serverId", serverId); | ||||||
|                         cmd2.Parameters.AddWithValue("@name", name); |                         cmd2.Parameters.AddWithValue("@name", name); | ||||||
|                         cmd2.ExecuteNonQuery(); |                         cmd2.ExecuteNonQuery(); | ||||||
|  |                         cid = (ushort)cmd2.LastInsertedId; | ||||||
|                         pid = 1; |                         pid = 0xBABE; | ||||||
|                         cid = 1; |  | ||||||
|                     } |                     } | ||||||
|                     else |                     else | ||||||
|                     { |                     { | ||||||
| @@ -91,14 +91,14 @@ namespace FFXIVClassic_Lobby_Server | |||||||
|                 } |                 } | ||||||
|                 finally |                 finally | ||||||
|                 { |                 { | ||||||
|                     conn.Close(); |                     conn.Dispose(); | ||||||
|                 } |                 } | ||||||
|             } |             } | ||||||
|  |  | ||||||
|             return alreadyExists; |             return alreadyExists; | ||||||
|         }         |         }         | ||||||
|  |  | ||||||
|         public static void makeCharacter(uint accountId, String name, Character charaInfo) |         public static void makeCharacter(uint accountId, uint cid, CharaInfo charaInfo) | ||||||
|         { |         { | ||||||
|             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))) | ||||||
|             { |             { | ||||||
| @@ -107,12 +107,13 @@ namespace FFXIVClassic_Lobby_Server | |||||||
|                     conn.Open(); |                     conn.Open(); | ||||||
|                     MySqlCommand cmd = new MySqlCommand(); |                     MySqlCommand cmd = new MySqlCommand(); | ||||||
|                     cmd.Connection = conn; |                     cmd.Connection = conn; | ||||||
|                     cmd.CommandText = "UPDATE ffxiv_characters2 SET data=@encodedInfo WHERE accountId=@accountId AND name=@name"; |                     cmd.CommandText = "UPDATE characters SET state=3, charaInfo=@encodedInfo WHERE userId=@userId AND id=@cid"; | ||||||
|                     cmd.Prepare(); |                     cmd.Prepare(); | ||||||
|  |  | ||||||
|                     cmd.Parameters.AddWithValue("@accountId", accountId); |                     cmd.Parameters.AddWithValue("@userId", accountId); | ||||||
|                     cmd.Parameters.AddWithValue("@name", name); |                     cmd.Parameters.AddWithValue("@cid", cid); | ||||||
|                     cmd.Parameters.AddWithValue("@encodedInfo", JsonConvert.SerializeObject(charaInfo)); |                     string json = JsonConvert.SerializeObject(charaInfo); | ||||||
|  |                     cmd.Parameters.AddWithValue("@encodedInfo", json); | ||||||
|                     cmd.ExecuteNonQuery(); |                     cmd.ExecuteNonQuery(); | ||||||
|  |  | ||||||
|                 } |                 } | ||||||
| @@ -122,7 +123,7 @@ namespace FFXIVClassic_Lobby_Server | |||||||
|                 } |                 } | ||||||
|                 finally |                 finally | ||||||
|                 { |                 { | ||||||
|                     conn.Close(); |                     conn.Dispose(); | ||||||
|                 } |                 } | ||||||
|             } |             } | ||||||
|         } |         } | ||||||
| @@ -136,7 +137,7 @@ namespace FFXIVClassic_Lobby_Server | |||||||
|                     conn.Open(); |                     conn.Open(); | ||||||
|                     MySqlCommand cmd = new MySqlCommand(); |                     MySqlCommand cmd = new MySqlCommand(); | ||||||
|                     cmd.Connection = conn; |                     cmd.Connection = conn; | ||||||
|                     cmd.CommandText = "UPDATE ffxiv_characters2 SET name=@name WHERE id=@cid"; |                     cmd.CommandText = "UPDATE characters SET name=@name WHERE id=@cid"; | ||||||
|                     cmd.Prepare(); |                     cmd.Prepare(); | ||||||
|                     cmd.Parameters.AddWithValue("@cid", characterId); |                     cmd.Parameters.AddWithValue("@cid", characterId); | ||||||
|                     cmd.Parameters.AddWithValue("@name", newName); |                     cmd.Parameters.AddWithValue("@name", newName); | ||||||
| @@ -149,7 +150,7 @@ namespace FFXIVClassic_Lobby_Server | |||||||
|                 } |                 } | ||||||
|                 finally |                 finally | ||||||
|                 { |                 { | ||||||
|                     conn.Close(); |                     conn.Dispose(); | ||||||
|                 } |                 } | ||||||
|             } |             } | ||||||
|         } |         } | ||||||
| @@ -163,7 +164,7 @@ namespace FFXIVClassic_Lobby_Server | |||||||
|                     conn.Open(); |                     conn.Open(); | ||||||
|                     MySqlCommand cmd = new MySqlCommand(); |                     MySqlCommand cmd = new MySqlCommand(); | ||||||
|                     cmd.Connection = conn; |                     cmd.Connection = conn; | ||||||
|                     cmd.CommandText = "UPDATE ffxiv_characters2 SET state=1 WHERE id=@cid AND name=@name"; |                     cmd.CommandText = "UPDATE characters SET state=1 WHERE id=@cid AND name=@name"; | ||||||
|                     cmd.Prepare(); |                     cmd.Prepare(); | ||||||
|                     cmd.Parameters.AddWithValue("@cid", characterId); |                     cmd.Parameters.AddWithValue("@cid", characterId); | ||||||
|                     cmd.Parameters.AddWithValue("@name", name); |                     cmd.Parameters.AddWithValue("@name", name); | ||||||
| @@ -176,61 +177,26 @@ namespace FFXIVClassic_Lobby_Server | |||||||
|                 } |                 } | ||||||
|                 finally |                 finally | ||||||
|                 { |                 { | ||||||
|                     conn.Close(); |                     conn.Dispose(); | ||||||
|                 } |                 } | ||||||
|             } |             } | ||||||
|         } |         } | ||||||
|  |  | ||||||
|         public static List<World> getServers() |         public static List<World> getServers() | ||||||
|         { |         { | ||||||
|             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 (var 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))) | ||||||
|             { |             { | ||||||
|                 List<World> worldList = new List<World>(); |                 List<World> worldList = null; | ||||||
|                 try |                 try | ||||||
|                 { |                 { | ||||||
|                     conn.Open(); |                     conn.Open(); | ||||||
|                     MySqlCommand cmd = new MySqlCommand(); |                     worldList = conn.Query<World>("SELECT * FROM servers WHERE isActive=true").ToList();                                        | ||||||
|                     cmd.Connection = conn; |  | ||||||
|                     cmd.CommandText = "SELECT * FROM servers WHERE isActive=true"; |  | ||||||
|                     cmd.Prepare(); |  | ||||||
|                     MySqlDataReader Reader = cmd.ExecuteReader(); |  | ||||||
|  |  | ||||||
|                      |  | ||||||
|                     if (!Reader.HasRows) return worldList; |  | ||||||
|                     while (Reader.Read()) |  | ||||||
|                     { |  | ||||||
|                         var id = Reader.GetUInt16("id"); |  | ||||||
|                         var name = Reader.GetString("name"); |  | ||||||
|                         var address = Reader.GetString("address"); |  | ||||||
|                         var port = Reader.GetUInt16("port"); |  | ||||||
|                         var listPosition = Reader.GetUInt16("listPosition"); |  | ||||||
|                         var numChars = Reader.GetUInt32("numChars"); |  | ||||||
|                         var maxChars = Reader.GetUInt32("maxChars"); |  | ||||||
|                         var isActive = Reader.GetBoolean("isActive"); |  | ||||||
|  |  | ||||||
|                         if (isActive) |  | ||||||
|                         { |  | ||||||
|                             World world = new World(); |  | ||||||
|                             world.id = id;  |  | ||||||
|                             world.name = name; |  | ||||||
|                             world.address = address; |  | ||||||
|                             world.port = port; |  | ||||||
|                             world.listPosition = listPosition; |  | ||||||
|                             uint result = (uint)(((float)numChars / (float)maxChars) * (float)100); |  | ||||||
|                             world.population = (ushort)result; |  | ||||||
|  |  | ||||||
|                             world.isActive = isActive; |  | ||||||
|                             worldList.Add(world); |  | ||||||
|                         } |  | ||||||
|                     } |  | ||||||
|  |  | ||||||
|                      |  | ||||||
|                 } |                 } | ||||||
|                 catch (MySqlException e) |                 catch (MySqlException e) | ||||||
|                 { } |                 { worldList = new List<World>(); } | ||||||
|                 finally |                 finally | ||||||
|                 {                     |                 {                     | ||||||
|                     conn.Close(); |                     conn.Dispose(); | ||||||
|                 } |                 } | ||||||
|                 return worldList; |                 return worldList; | ||||||
|             } |             } | ||||||
| @@ -238,46 +204,13 @@ namespace FFXIVClassic_Lobby_Server | |||||||
|  |  | ||||||
|         public static World getServer(uint serverId) |         public static World getServer(uint serverId) | ||||||
|         { |         { | ||||||
|             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 (var 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))) | ||||||
|             { |             { | ||||||
|                 World world = null; |                 World world = null; | ||||||
|                 try |                 try | ||||||
|                 { |                 { | ||||||
|                     conn.Open(); |                     conn.Open(); | ||||||
|                     MySqlCommand cmd = new MySqlCommand(); |                     world = conn.Query<World>("SELECT * FROM servers WHERE id=@ServerId", new {ServerId = serverId}).SingleOrDefault();                   | ||||||
|                     cmd.Connection = conn; |  | ||||||
|                     cmd.CommandText = "SELECT * FROM servers WHERE id='%serverId'"; |  | ||||||
|                     cmd.Prepare(); |  | ||||||
|                     cmd.Parameters.AddWithValue("@serverId", serverId); |  | ||||||
|  |  | ||||||
|                     MySqlDataReader Reader = cmd.ExecuteReader(); |  | ||||||
|  |  | ||||||
|                     if (!Reader.HasRows) return world; |  | ||||||
|                     while (Reader.Read()) |  | ||||||
|                     { |  | ||||||
|                         var id = Reader.GetUInt16("id"); |  | ||||||
|                         var name = Reader.GetString("name"); |  | ||||||
|                         var address = Reader.GetString("address"); |  | ||||||
|                         var port = Reader.GetUInt16("port"); |  | ||||||
|                         var listPosition = Reader.GetUInt16("listPosition"); |  | ||||||
|                         var numChars = Reader.GetUInt32("numChars"); |  | ||||||
|                         var maxChars = Reader.GetUInt32("maxChars"); |  | ||||||
|                         var isActive = Reader.GetBoolean("isActive"); |  | ||||||
|  |  | ||||||
|                         if (isActive) |  | ||||||
|                         { |  | ||||||
|                             world = new World(); |  | ||||||
|                             world.id = id; |  | ||||||
|                             world.name = name; |  | ||||||
|                             world.address = address; |  | ||||||
|                             world.port = port; |  | ||||||
|                             world.listPosition = listPosition; |  | ||||||
|                             uint result = ((numChars / maxChars) * 0xFF) & 0xFF; |  | ||||||
|                             world.population = (ushort)result; |  | ||||||
|                             world.isActive = isActive;                            |  | ||||||
|                         } |  | ||||||
|                     } |  | ||||||
|  |  | ||||||
|                 } |                 } | ||||||
|                 catch (MySqlException e) |                 catch (MySqlException e) | ||||||
|                 {                     |                 {                     | ||||||
| @@ -291,5 +224,25 @@ namespace FFXIVClassic_Lobby_Server | |||||||
|             } |             } | ||||||
|         } |         } | ||||||
|  |  | ||||||
|  |         public static List<Character> getCharacters(uint userId) | ||||||
|  |         { | ||||||
|  |             using (var 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))) | ||||||
|  |             { | ||||||
|  |                 List<Character> charaList = null; | ||||||
|  |                 try | ||||||
|  |                 { | ||||||
|  |                     conn.Open(); | ||||||
|  |                     charaList = conn.Query<Character>("SELECT * FROM characters WHERE userId=@UserId AND state in (2,3) ORDER BY slot", new { UserId = userId }).ToList(); | ||||||
|  |                 } | ||||||
|  |                 catch (MySqlException e) | ||||||
|  |                 { charaList = new List<Character>(); } | ||||||
|  |                 finally | ||||||
|  |                 { | ||||||
|  |                     conn.Dispose(); | ||||||
|  |                 } | ||||||
|  |                 return charaList; | ||||||
|  |             } | ||||||
|  |         } | ||||||
|  |  | ||||||
|     } |     } | ||||||
| } | } | ||||||
|   | |||||||
| @@ -37,6 +37,9 @@ | |||||||
|     <Reference Include="Cyotek.Collections.Generic.CircularBuffer"> |     <Reference Include="Cyotek.Collections.Generic.CircularBuffer"> | ||||||
|       <HintPath>..\packages\Cyotek.CircularBuffer.1.0.0.0\lib\net20\Cyotek.Collections.Generic.CircularBuffer.dll</HintPath> |       <HintPath>..\packages\Cyotek.CircularBuffer.1.0.0.0\lib\net20\Cyotek.Collections.Generic.CircularBuffer.dll</HintPath> | ||||||
|     </Reference> |     </Reference> | ||||||
|  |     <Reference Include="Dapper"> | ||||||
|  |       <HintPath>..\packages\Dapper.1.42\lib\net45\Dapper.dll</HintPath> | ||||||
|  |     </Reference> | ||||||
|     <Reference Include="MySql.Data"> |     <Reference Include="MySql.Data"> | ||||||
|       <HintPath>..\packages\MySql.Data.6.9.7\lib\net45\MySql.Data.dll</HintPath> |       <HintPath>..\packages\MySql.Data.6.9.7\lib\net45\MySql.Data.dll</HintPath> | ||||||
|     </Reference> |     </Reference> | ||||||
| @@ -53,6 +56,7 @@ | |||||||
|   </ItemGroup> |   </ItemGroup> | ||||||
|   <ItemGroup> |   <ItemGroup> | ||||||
|     <Compile Include="common\Log.cs" /> |     <Compile Include="common\Log.cs" /> | ||||||
|  |     <Compile Include="dataobjects\CharaInfo.cs" /> | ||||||
|     <Compile Include="dataobjects\Retainer.cs" /> |     <Compile Include="dataobjects\Retainer.cs" /> | ||||||
|     <Compile Include="dataobjects\Character.cs" /> |     <Compile Include="dataobjects\Character.cs" /> | ||||||
|     <Compile Include="ClientConnection.cs" /> |     <Compile Include="ClientConnection.cs" /> | ||||||
|   | |||||||
| @@ -156,11 +156,11 @@ namespace FFXIVClassic_Lobby_Server | |||||||
|  |  | ||||||
|             sendWorldList(client, packet); |             sendWorldList(client, packet); | ||||||
|  |  | ||||||
| 	        BasePacket outgoingPacket = new BasePacket("./packets/getCharsPacket.bin"); | 	        BasePacket outgoingPacket = new BasePacket("./packets/getChars_wo_chars"); | ||||||
|             BasePacket.encryptPacket(client.blowfish, outgoingPacket); |             BasePacket.encryptPacket(client.blowfish, outgoingPacket); | ||||||
| 	        client.queuePacket(outgoingPacket); | 	        client.queuePacket(outgoingPacket); | ||||||
|  |  | ||||||
|             //sendCharacterList(client, packet); |             sendCharacterList(client, packet); | ||||||
|         } |         } | ||||||
|  |  | ||||||
|         private void ProcessSelectCharacter(ClientConnection client, SubPacket packet) |         private void ProcessSelectCharacter(ClientConnection client, SubPacket packet) | ||||||
| @@ -207,9 +207,11 @@ namespace FFXIVClassic_Lobby_Server | |||||||
|  |  | ||||||
|             uint pid = 0, cid = 0; |             uint pid = 0, cid = 0; | ||||||
|  |  | ||||||
|             World world = Database.getServer(worldId); |             if (worldId == 0) | ||||||
|             string worldName = null; |                 worldId = client.newCharaWorldId; | ||||||
|  |  | ||||||
|  |             string worldName = null;            | ||||||
|  |             World world = Database.getServer(worldId); | ||||||
|             if (world != null) |             if (world != null) | ||||||
|                 worldName = world.name; |                 worldName = world.name; | ||||||
|  |  | ||||||
| @@ -233,7 +235,7 @@ namespace FFXIVClassic_Lobby_Server | |||||||
|  |  | ||||||
|                     if (alreadyTaken) |                     if (alreadyTaken) | ||||||
|                     { |                     { | ||||||
|                         ErrorPacket errorPacket = new ErrorPacket(charaReq.sequence, 0xBDB, 0, 13005, ""); |                         ErrorPacket errorPacket = new ErrorPacket(charaReq.sequence, 1003, 0, 13005, ""); //BDB - Chara Name Used, //1003 - Bad Word | ||||||
|                         SubPacket subpacket = errorPacket.buildPacket(); |                         SubPacket subpacket = errorPacket.buildPacket(); | ||||||
|                         BasePacket basePacket = BasePacket.createPacket(subpacket, true, false); |                         BasePacket basePacket = BasePacket.createPacket(subpacket, true, false); | ||||||
|                         BasePacket.encryptPacket(client.blowfish, basePacket); |                         BasePacket.encryptPacket(client.blowfish, basePacket); | ||||||
| @@ -242,13 +244,25 @@ namespace FFXIVClassic_Lobby_Server | |||||||
|                         Log.info(String.Format("User {0} => Error; name taken: \"{1}\"", client.currentUserId, charaReq.characterName)); |                         Log.info(String.Format("User {0} => Error; name taken: \"{1}\"", client.currentUserId, charaReq.characterName)); | ||||||
|                         return; |                         return; | ||||||
|                     } |                     } | ||||||
|  |                     else | ||||||
|  |                     { | ||||||
|  |                         pid = 0; | ||||||
|  |                         client.newCharaCid = cid; | ||||||
|  |                         client.newCharaSlot = slot; | ||||||
|  |                         client.newCharaWorldId = worldId; | ||||||
|  |                         client.newCharaName = name; | ||||||
|  |                     } | ||||||
|  |  | ||||||
|                     Log.info(String.Format("User {0} => Character reserved \"{1}\"", client.currentUserId, charaReq.characterName)); |                     Log.info(String.Format("User {0} => Character reserved \"{1}\"", client.currentUserId, charaReq.characterName)); | ||||||
|                     break; |                     break; | ||||||
|                 case 0x02://Make                     |                 case 0x02://Make                     | ||||||
|                     Character character = Character.EncodedToCharacter(charaReq.characterInfoEncoded); |                     CharaInfo info = new CharaInfo(); | ||||||
|  |  | ||||||
|                     Database.makeCharacter(client.currentUserId, name, character); |                     Database.makeCharacter(client.currentUserId, client.newCharaCid, info); | ||||||
|  |  | ||||||
|  |                     pid = 1; | ||||||
|  |                     cid = client.newCharaCid; | ||||||
|  |                     name = client.newCharaName; | ||||||
|  |  | ||||||
|                     Log.info(String.Format("User {0} => Character created \"{1}\"", client.currentUserId, charaReq.characterName)); |                     Log.info(String.Format("User {0} => Character created \"{1}\"", client.currentUserId, charaReq.characterName)); | ||||||
|                     break; |                     break; | ||||||
| @@ -299,13 +313,9 @@ namespace FFXIVClassic_Lobby_Server | |||||||
|  |  | ||||||
|         private void sendCharacterList(ClientConnection client, SubPacket packet) |         private void sendCharacterList(ClientConnection client, SubPacket packet) | ||||||
|         { |         { | ||||||
|             //List<Character> serverList = Database.getServers(); |             List<Character> characterList = Database.getCharacters(client.currentUserId); | ||||||
|  |  | ||||||
|             List<Character> charaList = new List<Character>(); |             CharacterListPacket characterlistPacket = new CharacterListPacket(2, characterList); | ||||||
|             charaList.Add(new Character()); |  | ||||||
|             charaList.Add(new Character()); |  | ||||||
|  |  | ||||||
|             CharacterListPacket characterlistPacket = new CharacterListPacket(1, charaList); |  | ||||||
|             List<SubPacket> subPackets = characterlistPacket.buildPackets(); |             List<SubPacket> subPackets = characterlistPacket.buildPackets(); | ||||||
|             subPackets[0].debugPrintSubPacket(); |             subPackets[0].debugPrintSubPacket(); | ||||||
|             BasePacket basePacket = BasePacket.createPacket(subPackets, true, false); |             BasePacket basePacket = BasePacket.createPacket(subPackets, true, false); | ||||||
|   | |||||||
							
								
								
									
										9
									
								
								FFXIVClassic_Lobby_Server/app.config
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										9
									
								
								FFXIVClassic_Lobby_Server/app.config
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,9 @@ | |||||||
|  | <?xml version="1.0" encoding="utf-8"?> | ||||||
|  | <configuration> | ||||||
|  |   <system.data> | ||||||
|  |     <DbProviderFactories> | ||||||
|  |       <remove invariant="MySql.Data.MySqlClient" /> | ||||||
|  |       <add name="MySQL Data Provider" invariant="MySql.Data.MySqlClient" description=".Net Framework Data Provider for MySQL" type="MySql.Data.MySqlClient.MySqlClientFactory, MySql.Data, Version=6.9.7.0, Culture=neutral, PublicKeyToken=c5687fc88969c44d" /> | ||||||
|  |     </DbProviderFactories> | ||||||
|  |   </system.data> | ||||||
|  | </configuration> | ||||||
							
								
								
									
										57
									
								
								FFXIVClassic_Lobby_Server/dataobjects/CharaInfo.cs
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										57
									
								
								FFXIVClassic_Lobby_Server/dataobjects/CharaInfo.cs
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,57 @@ | |||||||
|  | using System; | ||||||
|  | using System.Collections.Generic; | ||||||
|  | using System.Linq; | ||||||
|  | using System.Text; | ||||||
|  | using System.Threading.Tasks; | ||||||
|  |  | ||||||
|  | namespace FFXIVClassic_Lobby_Server.dataobjects | ||||||
|  | { | ||||||
|  |     class CharaInfo | ||||||
|  |     { | ||||||
|  |         public uint tribe = 0; | ||||||
|  |         public uint size = 0; | ||||||
|  |         public uint voice = 0; | ||||||
|  |         public uint skinColor = 0; | ||||||
|  |  | ||||||
|  |         public uint hairStyle = 0; | ||||||
|  |         public uint hairColor = 0; | ||||||
|  |         public uint eyeColor = 0; | ||||||
|  |  | ||||||
|  |         public uint faceType = 0; | ||||||
|  |         public uint faceBrow = 0; | ||||||
|  |         public uint faceEye = 0; | ||||||
|  |         public uint faceIris = 0; | ||||||
|  |         public uint faceNose = 0; | ||||||
|  |         public uint faceMouth = 0; | ||||||
|  |         public uint faceJaw = 0; | ||||||
|  |         public uint faceCheek = 0; | ||||||
|  |         public uint faceOption1 = 0; | ||||||
|  |         public uint faceOption2 = 0; | ||||||
|  |  | ||||||
|  |         public uint guardian = 0; | ||||||
|  |         public uint birthMonth = 0; | ||||||
|  |         public uint birthDay = 0; | ||||||
|  |         public uint allegiance = 0; | ||||||
|  |  | ||||||
|  |         public uint weapon1 = 0; | ||||||
|  |         public uint weapon2 = 0; | ||||||
|  |  | ||||||
|  |         public uint headGear = 0; | ||||||
|  |         public uint bodyGear = 0; | ||||||
|  |         public uint legsGear = 0; | ||||||
|  |         public uint handsGear = 0; | ||||||
|  |         public uint feetGear = 0; | ||||||
|  |         public uint waistGear = 0; | ||||||
|  |         public uint rightEarGear = 0; | ||||||
|  |         public uint leftEarGear = 0; | ||||||
|  |         public uint rightFingerGear = 0; | ||||||
|  |         public uint leftFingerGear = 0; | ||||||
|  |          | ||||||
|  |         public byte[] toBytes() | ||||||
|  |         { | ||||||
|  |             byte[] bytes = new byte[0x120]; | ||||||
|  |             return bytes; | ||||||
|  |         } | ||||||
|  |  | ||||||
|  |     } | ||||||
|  | } | ||||||
| @@ -4,62 +4,23 @@ using System.Linq; | |||||||
| using System.Text; | using System.Text; | ||||||
| using System.Threading.Tasks; | using System.Threading.Tasks; | ||||||
| using FFXIVClassic_Lobby_Server.common; | using FFXIVClassic_Lobby_Server.common; | ||||||
|  | using FFXIVClassic_Lobby_Server.dataobjects; | ||||||
|  |  | ||||||
| namespace FFXIVClassic_Lobby_Server | namespace FFXIVClassic_Lobby_Server | ||||||
| { | { | ||||||
|     class Character |     class Character | ||||||
|     { |     { | ||||||
|         public string		name = "Test Test"; |         public uint id; | ||||||
|         public string       world = "Test World"; |         public ushort slot; | ||||||
|  |         public ushort serverId; | ||||||
|  |         public string name; | ||||||
|  |         public ushort state; | ||||||
|  |         public string charaInfo; | ||||||
|  |         public bool isLegacy; | ||||||
|  |         public bool doRename; | ||||||
|  |         public uint currentZoneId; | ||||||
|          |          | ||||||
|         public uint	        id = 0; |         public static String characterToEncoded(CharaInfo chara) | ||||||
|  |  | ||||||
|         public uint         tribe = 0; |  | ||||||
|         public uint         size = 0; |  | ||||||
|         public uint         voice = 0; |  | ||||||
|         public uint         skinColor = 0; |  | ||||||
|  |  | ||||||
|         public uint         hairStyle = 0; |  | ||||||
|         public uint         hairColor = 0; |  | ||||||
|         public uint         eyeColor = 0; |  | ||||||
|  |  | ||||||
|         public uint         faceType = 0; |  | ||||||
|         public uint         faceBrow = 0; |  | ||||||
|         public uint         faceEye = 0; |  | ||||||
|         public uint         faceIris = 0; |  | ||||||
|         public uint         faceNose = 0; |  | ||||||
|         public uint         faceMouth = 0; |  | ||||||
|         public uint         faceJaw = 0; |  | ||||||
|         public uint         faceCheek = 0; |  | ||||||
|         public uint         faceOption1 = 0; |  | ||||||
|         public uint         faceOption2 = 0; |  | ||||||
|  |  | ||||||
|         public uint         guardian = 0; |  | ||||||
|         public uint         birthMonth = 0; |  | ||||||
|         public uint         birthDay = 0; |  | ||||||
|         public uint         allegiance = 0; |  | ||||||
|  |  | ||||||
|         public uint         weapon1 = 0; |  | ||||||
|         public uint         weapon2 = 0; |  | ||||||
|  |  | ||||||
|         public uint         headGear = 0; |  | ||||||
|         public uint         bodyGear = 0; |  | ||||||
|         public uint         legsGear = 0; |  | ||||||
|         public uint         handsGear = 0; |  | ||||||
|         public uint         feetGear = 0; |  | ||||||
|         public uint         waistGear = 0; |  | ||||||
|         public uint         rightEarGear = 0; |  | ||||||
|         public uint         leftEarGear = 0; |  | ||||||
|         public uint         rightFingerGear = 0; |  | ||||||
|         public uint         leftFingerGear = 0; |  | ||||||
|          |  | ||||||
|         public byte[] toBytes() |  | ||||||
|         { |  | ||||||
|             byte[] bytes = new byte[0x120]; |  | ||||||
|             return bytes; |  | ||||||
|         } |  | ||||||
|  |  | ||||||
|         public static String characterToEncoded(Character chara) |  | ||||||
|         { |         { | ||||||
|             String charaInfo = System.Convert.ToBase64String(chara.toBytes()); |             String charaInfo = System.Convert.ToBase64String(chara.toBytes()); | ||||||
|             charaInfo.Replace("+", "-"); |             charaInfo.Replace("+", "-"); | ||||||
| @@ -67,7 +28,7 @@ namespace FFXIVClassic_Lobby_Server | |||||||
|             return charaInfo; |             return charaInfo; | ||||||
|         } |         } | ||||||
|  |  | ||||||
|         public static Character EncodedToCharacter(String charaInfo) |         public static CharaInfo EncodedToCharacter(String charaInfo) | ||||||
|         { |         { | ||||||
|             charaInfo.Replace("+", "-"); |             charaInfo.Replace("+", "-"); | ||||||
|             charaInfo.Replace("/", "_"); |             charaInfo.Replace("/", "_"); | ||||||
| @@ -77,7 +38,8 @@ namespace FFXIVClassic_Lobby_Server | |||||||
|             Console.WriteLine(Utils.ByteArrayToHex(data)); |             Console.WriteLine(Utils.ByteArrayToHex(data)); | ||||||
|             Console.WriteLine("------------Base64 printout------------------"); |             Console.WriteLine("------------Base64 printout------------------"); | ||||||
|  |  | ||||||
|                 Character chara = new Character(); |             CharaInfo chara = new CharaInfo(); | ||||||
|  |  | ||||||
|             return chara; |             return chara; | ||||||
|         } |         } | ||||||
|     } |     } | ||||||
|   | |||||||
| @@ -1,6 +1,7 @@ | |||||||
| <?xml version="1.0" encoding="utf-8"?> | <?xml version="1.0" encoding="utf-8"?> | ||||||
| <packages> | <packages> | ||||||
|   <package id="Cyotek.CircularBuffer" version="1.0.0.0" targetFramework="net45" /> |   <package id="Cyotek.CircularBuffer" version="1.0.0.0" targetFramework="net45" /> | ||||||
|  |   <package id="Dapper" version="1.42" targetFramework="net45" /> | ||||||
|   <package id="MySql.Data" version="6.9.7" targetFramework="net45" /> |   <package id="MySql.Data" version="6.9.7" targetFramework="net45" /> | ||||||
|   <package id="Newtonsoft.Json" version="7.0.1" targetFramework="net45" /> |   <package id="Newtonsoft.Json" version="7.0.1" targetFramework="net45" /> | ||||||
| </packages> | </packages> | ||||||
| @@ -33,7 +33,7 @@ namespace FFXIVClassic_Lobby_Server.packets | |||||||
|             this.command = command; |             this.command = command; | ||||||
|             this.pid = pid; |             this.pid = pid; | ||||||
|             this.cid = cid; |             this.cid = cid; | ||||||
|             this.type = 0x400000; |             this.type = 0x400017; | ||||||
|             this.ticket = ticket; |             this.ticket = ticket; | ||||||
|             this.charaName = charaName;  |             this.charaName = charaName;  | ||||||
|             this.worldName = worldName; |             this.worldName = worldName; | ||||||
|   | |||||||
| @@ -41,7 +41,7 @@ namespace FFXIVClassic_Lobby_Server.packets | |||||||
|  |  | ||||||
|                     //Write List Info |                     //Write List Info | ||||||
|                     binWriter.Write((UInt64)sequence); |                     binWriter.Write((UInt64)sequence); | ||||||
|                     binWriter.Write(characterList.Count - totalCount <= MAXPERPACKET ? (byte)(characterList.Count + 1) : (byte)0); |                     binWriter.Write(characterList.Count - totalCount <= MAXPERPACKET ? (byte)(1) : (byte)0); | ||||||
|                     //binWriter.Write((byte)1); |                     //binWriter.Write((byte)1); | ||||||
|                     binWriter.Write(characterList.Count - totalCount <= MAXPERPACKET ? (UInt32)(characterList.Count - totalCount) : (UInt32)MAXPERPACKET); |                     binWriter.Write(characterList.Count - totalCount <= MAXPERPACKET ? (UInt32)(characterList.Count - totalCount) : (UInt32)MAXPERPACKET); | ||||||
|                     binWriter.Write((byte)0); |                     binWriter.Write((byte)0); | ||||||
| @@ -51,12 +51,26 @@ namespace FFXIVClassic_Lobby_Server.packets | |||||||
|                 binWriter.Seek(0x10 + (0x1D0 * characterCount), SeekOrigin.Begin); |                 binWriter.Seek(0x10 + (0x1D0 * characterCount), SeekOrigin.Begin); | ||||||
|  |  | ||||||
|                 //Write Entries |                 //Write Entries | ||||||
|  |                 World world = Database.getServer(chara.serverId); | ||||||
|  |                 string worldname = world == null ? "Unknown" : world.name; | ||||||
|  |  | ||||||
|                 binWriter.Write((uint)0); //??? |                 binWriter.Write((uint)0); //??? | ||||||
|                 binWriter.Write((uint)(totalCount + 1)); //Character Id             |                 binWriter.Write((uint)chara.id); //Character Id             | ||||||
|                 binWriter.Write((uint)totalCount); //Slot |                 binWriter.Write((byte)totalCount); //Slot | ||||||
|                 binWriter.Write((uint)0); //Options (0x01: Service Account not active, 0x72: Change Chara Name) |  | ||||||
|  |                 byte options = 0; | ||||||
|  |                 if (chara.state == 2) | ||||||
|  |                     options |= 0x01; | ||||||
|  |                 if (chara.doRename) | ||||||
|  |                     options |= 0x02; | ||||||
|  |                 if (chara.isLegacy) | ||||||
|  |                     options |= 0x08; | ||||||
|  |  | ||||||
|  |                 binWriter.Write((byte)options); //Options (0x01: Service Account not active, 0x72: Change Chara Name)  | ||||||
|  |                 binWriter.Write((ushort)0);   | ||||||
|  |                 binWriter.Write((uint)0xF4); //Logged out zone | ||||||
|                 binWriter.Write(Encoding.ASCII.GetBytes(chara.name.PadRight(0x20, '\0'))); //Name |                 binWriter.Write(Encoding.ASCII.GetBytes(chara.name.PadRight(0x20, '\0'))); //Name | ||||||
|                 binWriter.Write(Encoding.ASCII.GetBytes(chara.world.PadRight(0xE, '\0'))); //World Name |                 binWriter.Write(Encoding.ASCII.GetBytes(worldname.PadRight(0xE, '\0'))); //World Name | ||||||
|                 binWriter.Write("wAQAAOonIyMNAAAAV3Jlbml4IFdyb25nABwAAAAEAAAAAwAAAAMAAAA_8OADAAHQFAAEAAABAAAAABTQCAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAGEgAAAAMQAAQCQAAMAsAACKVAAAAPgCAAAAAAAAAAAAAAAAAAAAAAAAAAAAACQAAAAkAwAAAAAAAAAAANvb1M05AQAABBoAAAEABqoiIuIKAAAAcHJ2MElubjAxABEAAABkZWZhdWx0VGVycml0b3J5AAwJAhcABAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAAAgAAAAIAAAAAAAAAAAAAAAA="); //Appearance Data |                 binWriter.Write("wAQAAOonIyMNAAAAV3Jlbml4IFdyb25nABwAAAAEAAAAAwAAAAMAAAA_8OADAAHQFAAEAAABAAAAABTQCAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAGEgAAAAMQAAQCQAAMAsAACKVAAAAPgCAAAAAAAAAAAAAAAAAAAAAAAAAAAAACQAAAAkAwAAAAAAAAAAANvb1M05AQAABBoAAAEABqoiIuIKAAAAcHJ2MElubjAxABEAAABkZWZhdWx0VGVycml0b3J5AAwJAhcABAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAAAgAAAAIAAAAAAAAAAAAAAAA="); //Appearance Data | ||||||
|                  |                  | ||||||
|                 characterCount++; |                 characterCount++; | ||||||
|   | |||||||
		Reference in New Issue
	
	Block a user