Achievements are now loaded from the database. Cleaned up login packets.

This commit is contained in:
Filip Maj 2016-01-16 18:38:49 -05:00
parent f7702bca13
commit 724445a54a
5 changed files with 65 additions and 68 deletions

View File

@ -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);
}
}

View File

@ -207,6 +207,7 @@
<Compile Include="Server.cs" />
<Compile Include="utils\ActorPropertyPacketUtil.cs" />
<Compile Include="utils\CharacterUtils.cs" />
<Compile Include="utils\SQLGeneration.cs" />
<Compile Include="Zone.cs" />
</ItemGroup>
<ItemGroup>

View File

@ -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);
}

View File

@ -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<SubPacket> 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)

View File

@ -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);
}
}
}