diff --git a/FFXIVClassic Map Server/Database.cs b/FFXIVClassic Map Server/Database.cs index c76c6452..866de839 100644 --- a/FFXIVClassic Map Server/Database.cs +++ b/FFXIVClassic Map Server/Database.cs @@ -457,45 +457,7 @@ namespace FFXIVClassic_Lobby_Server } } - public static void getLatestAchievements(Player player) - { - 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(); - - //Load Last 5 Completed - string query = @" - SELECT - achievementId - FROM characters_achievements WHERE characterId = @charId ORDER BY timeDone LIMIT 5"; - - MySqlCommand cmd = new MySqlCommand(query, conn); - cmd.Parameters.AddWithValue("@charId", player.actorId); - using (MySqlDataReader reader = cmd.ExecuteReader()) - { - int count = 0; - while (reader.Read()) - { - player.latestAchievements[count++] = reader.GetUInt32(0); - } - - for (; count < player.latestAchievements.Length; count++) - player.latestAchievements[count] = 0; - } - } - catch (MySqlException e) - { Console.WriteLine(e); } - finally - { - conn.Dispose(); - } - } - - } - - public static SubPacket getAchievements(Player player) + public static SubPacket getLatestAchievements(Player player) { uint[] latestAchievements = new uint[5]; 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))) @@ -506,9 +468,10 @@ namespace FFXIVClassic_Lobby_Server //Load Last 5 Completed string query = @" - SELECT - achievementId - FROM characters_achievements WHERE characterId = @charId AND timeDone NOT NULL"; + SELECT + characters_achievements.achievementId FROM characters_achievements + INNER JOIN gamedata_achievements ON characters_achievements.achievementId = gamedata_achievements.achievementId + WHERE characterId = @charId AND rewardPoints <> 0 ORDER BY timeDone LIMIT 5"; MySqlCommand cmd = new MySqlCommand(query, conn); cmd.Parameters.AddWithValue("@charId", player.actorId); @@ -516,7 +479,10 @@ namespace FFXIVClassic_Lobby_Server { int count = 0; while (reader.Read()) - latestAchievements[count] = reader.GetUInt32(0); + { + uint id = reader.GetUInt32(0); + latestAchievements[count++] = id; + } } } catch (MySqlException e) @@ -527,8 +493,51 @@ namespace FFXIVClassic_Lobby_Server } } + return SetLatestAchievementsPacket.buildPacket(player.actorId, latestAchievements); + } - return SetLatestAchievementsPacket.buildPacket(player.actorId, latestAchievements); + public static SubPacket getAchievementsPacket(Player player) + { + SetCompletedAchievementsPacket cheevosPacket = new SetCompletedAchievementsPacket(); + + 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(); + + string query = @" + SELECT packetOffsetId + FROM characters_achievements + INNER JOIN gamedata_achievements ON characters_achievements.achievementId = gamedata_achievements.achievementId + WHERE characterId = @charId AND timeDone IS NOT NULL"; + + MySqlCommand cmd = new MySqlCommand(query, conn); + cmd.Parameters.AddWithValue("@charId", player.actorId); + using (MySqlDataReader reader = cmd.ExecuteReader()) + { + while (reader.Read()) + { + uint offset = reader.GetUInt32(0); + + if (offset < 0 || offset >= cheevosPacket.achievementFlags.Length) + { + Log.error("SQL Error; achievement flag offset id out of range: " + offset); + continue; + } + cheevosPacket.achievementFlags[offset] = true; + } + } + } + catch (MySqlException e) + { Console.WriteLine(e); } + finally + { + conn.Dispose(); + } + } + + return cheevosPacket.buildPacket(player.actorId); } } diff --git a/FFXIVClassic Map Server/FFXIVClassic Map Server.csproj b/FFXIVClassic Map Server/FFXIVClassic Map Server.csproj index 300107f9..166a7102 100644 --- a/FFXIVClassic Map Server/FFXIVClassic Map Server.csproj +++ b/FFXIVClassic Map Server/FFXIVClassic Map Server.csproj @@ -207,6 +207,7 @@ + diff --git a/FFXIVClassic Map Server/PacketProcessor.cs b/FFXIVClassic Map Server/PacketProcessor.cs index 1aae6736..67bfc4b9 100644 --- a/FFXIVClassic Map Server/PacketProcessor.cs +++ b/FFXIVClassic Map Server/PacketProcessor.cs @@ -182,23 +182,19 @@ namespace FFXIVClassic_Lobby_Server break; //Unknown case 0x0002: - BasePacket reply8 = new BasePacket("./packets/login/login8_data.bin"); - BasePacket reply9 = new BasePacket("./packets/login/login9_zonesetup.bin"); - BasePacket reply10 = new BasePacket("./packets/login/login10.bin"); - BasePacket reply11 = new BasePacket("./packets/login/login11.bin"); - BasePacket reply12 = new BasePacket("./packets/login/login12.bin"); + BasePacket reply8 = new BasePacket("./packets/login/login8_data.bin"); //Debug, World Master, Director created + BasePacket reply9 = new BasePacket("./packets/login/login9_zonesetup.bin"); //Area Master, Bed, Book created + BasePacket reply10 = new BasePacket("./packets/login/login10.bin"); //Item Storage, Inn Door created + BasePacket reply11 = new BasePacket("./packets/login/login11.bin"); //NPC Create ??? Final init #region replaceid //currancy.replaceActorID(player.actorID); //keyitems.replaceActorID(player.actorID); - packet196.replaceActorID(player.actorID); - reply7.replaceActorID(player.actorID); reply8.replaceActorID(player.actorID); reply9.replaceActorID(player.actorID); reply10.replaceActorID(player.actorID); reply11.replaceActorID(player.actorID); - reply12.replaceActorID(player.actorID); #endregion client.queuePacket(SetMapPacket.buildPacket(player.actorID, 0xD1, 0xF4), true, false); @@ -302,9 +298,7 @@ namespace FFXIVClassic_Lobby_Server client.queuePacket(reply8); client.queuePacket(reply9); client.queuePacket(reply10); - // client.queuePacket(reply11); - client.queuePacket(reply12); - + client.queuePacket(reply11); break; //Chat Received @@ -554,8 +548,8 @@ namespace FFXIVClassic_Lobby_Server packet.replaceActorID(entry.Value.actorID); actorPacket.replaceActorID(entry.Value.actorID); - entry.Value.getConnection2().queuePacket(packet); - entry.Value.getConnection2().queuePacket(actorPacket); + entry.Value.getConnection1().queuePacket(packet); + entry.Value.getConnection1().queuePacket(actorPacket); } diff --git a/FFXIVClassic Map Server/actors/chara/player/Player.cs b/FFXIVClassic Map Server/actors/chara/player/Player.cs index 44d47784..02304750 100644 --- a/FFXIVClassic Map Server/actors/chara/player/Player.cs +++ b/FFXIVClassic Map Server/actors/chara/player/Player.cs @@ -55,7 +55,6 @@ namespace FFXIVClassic_Map_Server.dataobjects.chara public string chocoboName; public uint achievementPoints; - public uint[] latestAchievements = new uint[5]; public PlayerWork playerWork = new PlayerWork(); @@ -110,8 +109,6 @@ namespace FFXIVClassic_Map_Server.dataobjects.chara charaWork.commandBorder = 0x20; Database.loadPlayerCharacter(this); - - Database.getLatestAchievements(this); } public List create0x132Packets(uint playerActorId) @@ -189,12 +186,8 @@ namespace FFXIVClassic_Map_Server.dataobjects.chara subpackets.Add(SetHasGoobbuePacket.buildPacket(playerActorId, hasGoobbue)); subpackets.Add(SetAchievementPointsPacket.buildPacket(playerActorId, achievementPoints)); - subpackets.Add(SetLatestAchievementsPacket.buildPacket(playerActorId, latestAchievements)); - - SetCompletedAchievementsPacket cheevos = new SetCompletedAchievementsPacket(); - for (int i = 0; i < cheevos.achievementFlags.Length; i++) - cheevos.achievementFlags[i] = true; - subpackets.Add(cheevos.buildPacket(playerActorId)); + subpackets.Add(Database.getLatestAchievements(this)); + subpackets.Add(Database.getAchievementsPacket(this)); /* if (isInn) diff --git a/FFXIVClassic Map Server/packets/send/player/SetCompletedAchievementsPacket.cs b/FFXIVClassic Map Server/packets/send/player/SetCompletedAchievementsPacket.cs index 25479a70..054e3659 100644 --- a/FFXIVClassic Map Server/packets/send/player/SetCompletedAchievementsPacket.cs +++ b/FFXIVClassic Map Server/packets/send/player/SetCompletedAchievementsPacket.cs @@ -24,7 +24,7 @@ namespace FFXIVClassic_Map_Server.packets.send.player public const int CATEGORY_DUNGEONS = 750; public const int CATEGORY_EXPLORATION = 800; public const int CATEGORY_GRAND_COMPANY = 820; - + public const ushort OPCODE = 0x019A; public const uint PACKET_SIZE = 0xA0; @@ -48,6 +48,6 @@ namespace FFXIVClassic_Map_Server.packets.send.player return new SubPacket(OPCODE, playerActorID, playerActorID, data); } - + } } \ No newline at end of file