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