diff --git a/FFXIVClassic Map Server/Database.cs b/FFXIVClassic Map Server/Database.cs
index a92e2e7b..a258ed5e 100644
--- a/FFXIVClassic Map Server/Database.cs
+++ b/FFXIVClassic Map Server/Database.cs
@@ -12,6 +12,8 @@ using FFXIVClassic_Map_Server.dataobjects.database;
using FFXIVClassic_Map_Server.dataobjects.chara.npc;
using FFXIVClassic_Map_Server.dataobjects.chara;
using FFXIVClassic_Map_Server.utils;
+using FFXIVClassic_Lobby_Server.packets;
+using FFXIVClassic_Map_Server.packets.send.player;
namespace FFXIVClassic_Lobby_Server
{
@@ -160,9 +162,8 @@ namespace FFXIVClassic_Lobby_Server
}
}
- public static void loadPlayerCharacter(Player player, bool isMe)
- {
- //Load basic info
+ public static void loadPlayerCharacter(Player player)
+ {
string query;
MySqlCommand cmd;
@@ -172,87 +173,66 @@ namespace FFXIVClassic_Lobby_Server
{
conn.Open();
- if (isMe)
- {
- query = @"
- SELECT
- name,
- positionX,
- positionY,
- positionZ,
- rotation,
- actorState,
- currentZoneId,
- currentClassJob,
- gcCurrent,
- gcLimsaRank,
- gcGridaniaRank,
- gcUldahRank,
- currentTitle,
- guardian,
- birthDay,
- birthMonth,
- initialNation,
- currentParty,
- restBonus,
- achievementPoints
- FROM characters WHERE id = @charId";
- }
- else
- {
- query = @"
- SELECT
- name,
- positionX,
- positionY,
- positionZ,
- rotation,
- actorState,
- currentZoneId,
- currentClassJob,
- gcCurrent,
- gcLimsaRank,
- gcGridaniaRank,
- gcUldahRank,
- currentTitle
- FROM characters WHERE id = @charId";
- }
+ //Load basic info
+ query = @"
+ SELECT
+ name,
+ positionX,
+ positionY,
+ positionZ,
+ rotation,
+ actorState,
+ currentZoneId,
+ currentClassJob,
+ gcCurrent,
+ gcLimsaRank,
+ gcGridaniaRank,
+ gcUldahRank,
+ currentTitle,
+ guardian,
+ birthDay,
+ birthMonth,
+ initialTown,
+ tribe,
+ currentParty,
+ restBonus,
+ achievementPoints
+ FROM characters WHERE id = @charId";
cmd = new MySqlCommand(query, conn);
cmd.Parameters.AddWithValue("@charId", player.actorId);
using (MySqlDataReader reader = cmd.ExecuteReader())
{
- player.displayNameId = 0xFFFFFFFF;
- player.customDisplayName = reader.GetString(0);
- player.oldPositionX = player.positionX = reader.GetFloat(1);
- player.oldPositionY = player.positionY = reader.GetFloat(2);
- player.oldPositionZ = player.positionZ = reader.GetFloat(3);
- player.oldRotation = player.rotation = reader.GetFloat(4);
- player.currentMainState = reader.GetUInt16(5);
- player.currentZoneId = reader.GetUInt32(6);
- player.charaWork.parameterSave.state_mainSkill[0] = reader.GetByte(7);
- player.gcCurrent = reader.GetByte(8);
- player.gcRankLimsa = reader.GetByte(9);
- player.gcRankGridania = reader.GetByte(10);
- player.gcRankUldah = reader.GetByte(11);
- player.currentTitle = reader.GetUInt32(12);
-
- if (isMe)
+ if (reader.Read())
{
+ player.displayNameId = 0xFFFFFFFF;
+ player.customDisplayName = reader.GetString(0);
+ player.oldPositionX = player.positionX = reader.GetFloat(1);
+ player.oldPositionY = player.positionY = reader.GetFloat(2);
+ player.oldPositionZ = player.positionZ = reader.GetFloat(3);
+ player.oldRotation = player.rotation = reader.GetFloat(4);
+ player.currentMainState = reader.GetUInt16(5);
+ player.currentZoneId = reader.GetUInt32(6);
+ player.charaWork.parameterSave.state_mainSkill[0] = reader.GetByte(7);
+ player.gcCurrent = reader.GetByte(8);
+ player.gcRankLimsa = reader.GetByte(9);
+ player.gcRankGridania = reader.GetByte(10);
+ player.gcRankUldah = reader.GetByte(11);
+ player.currentTitle = reader.GetUInt32(12);
player.playerWork.guardian = reader.GetByte(13);
player.playerWork.birthdayDay = reader.GetByte(14);
player.playerWork.birthdayMonth = reader.GetByte(15);
player.playerWork.initialTown = reader.GetByte(16);
- player.playerWork.restBonusExpRate = reader.GetInt32(17);
- player.achievementPoints = reader.GetUInt32(18);
+ player.playerWork.tribe = reader.GetByte(17);
+ player.playerWork.restBonusExpRate = reader.GetInt32(19);
+ player.achievementPoints = reader.GetUInt32(20);
}
}
//Load appearance
query = @"
SELECT
- baseId,
- tribe,
+ baseId,
size,
voice,
skinColor,
@@ -288,24 +268,31 @@ namespace FFXIVClassic_Lobby_Server
cmd.Parameters.AddWithValue("@charId", player.actorId);
using (MySqlDataReader reader = cmd.ExecuteReader())
{
- player.modelID = DBAppearance.getTribeModel(reader.GetByte(1));
- player.appearanceIDs[Character.SIZE] = reader.GetByte(2);
- player.appearanceIDs[Character.COLORINFO] = (uint)(reader.GetUInt16(4) | (reader.GetUInt16(6) << 10) | (reader.GetUInt16(8) << 20));
- player.appearanceIDs[Character.FACEINFO] = PrimitiveConversion.ToUInt32(CharacterUtils.getFaceInfo(reader.GetByte(9), reader.GetByte(10), reader.GetByte(11), reader.GetByte(12), reader.GetByte(13), reader.GetByte(14), reader.GetByte(15), reader.GetByte(16), reader.GetByte(17), reader.GetByte(18)));
- player.appearanceIDs[Character.HIGHLIGHT_HAIR] = (uint)(reader.GetUInt16(7) | reader.GetUInt16(5) << 10);
- player.appearanceIDs[Character.VOICE] = reader.GetByte(3);
- player.appearanceIDs[Character.WEAPON1] = reader.GetUInt32(19);
- player.appearanceIDs[Character.WEAPON2] = reader.GetUInt32(20);
- player.appearanceIDs[Character.HEADGEAR] = reader.GetUInt32(21);
- player.appearanceIDs[Character.BODYGEAR] = reader.GetUInt32(22);
- player.appearanceIDs[Character.LEGSGEAR] = reader.GetUInt32(23);
- player.appearanceIDs[Character.HANDSGEAR] = reader.GetUInt32(24);
- player.appearanceIDs[Character.FEETGEAR] = reader.GetUInt32(25);
- player.appearanceIDs[Character.WAISTGEAR] = reader.GetUInt32(26);
- player.appearanceIDs[Character.R_EAR] = reader.GetUInt32(27);
- player.appearanceIDs[Character.L_EAR] = reader.GetUInt32(28);
- player.appearanceIDs[Character.R_FINGER] = reader.GetUInt32(29);
- player.appearanceIDs[Character.L_FINGER] = reader.GetUInt32(30);
+ if (reader.Read())
+ {
+ if (reader.GetUInt32(0) == 0xFFFFFFFF)
+ player.modelID = CharacterUtils.getTribeModel(player.playerWork.tribe);
+ else
+ player.modelID = reader.GetUInt32(0);
+ player.appearanceIDs[Character.SIZE] = reader.GetByte(1);
+ player.appearanceIDs[Character.COLORINFO] = (uint)(reader.GetUInt16(3) | (reader.GetUInt16(5) << 10) | (reader.GetUInt16(7) << 20));
+ player.appearanceIDs[Character.FACEINFO] = PrimitiveConversion.ToUInt32(CharacterUtils.getFaceInfo(reader.GetByte(8), reader.GetByte(9), reader.GetByte(10), reader.GetByte(11), reader.GetByte(12), reader.GetByte(13), reader.GetByte(14), reader.GetByte(15), reader.GetByte(16), reader.GetByte(17)));
+ player.appearanceIDs[Character.HIGHLIGHT_HAIR] = (uint)(reader.GetUInt16(6) | reader.GetUInt16(4) << 10);
+ player.appearanceIDs[Character.VOICE] = reader.GetByte(2);
+ player.appearanceIDs[Character.WEAPON1] = reader.GetUInt32(18);
+ player.appearanceIDs[Character.WEAPON2] = reader.GetUInt32(19);
+ player.appearanceIDs[Character.HEADGEAR] = reader.GetUInt32(20);
+ player.appearanceIDs[Character.BODYGEAR] = reader.GetUInt32(21);
+ player.appearanceIDs[Character.LEGSGEAR] = reader.GetUInt32(22);
+ player.appearanceIDs[Character.HANDSGEAR] = reader.GetUInt32(23);
+ player.appearanceIDs[Character.FEETGEAR] = reader.GetUInt32(24);
+ player.appearanceIDs[Character.WAISTGEAR] = reader.GetUInt32(25);
+ player.appearanceIDs[Character.R_EAR] = reader.GetUInt32(26);
+ player.appearanceIDs[Character.L_EAR] = reader.GetUInt32(27);
+ player.appearanceIDs[Character.R_FINGER] = reader.GetUInt32(28);
+ player.appearanceIDs[Character.L_FINGER] = reader.GetUInt32(29);
+ }
+
}
//Load Status Effects
@@ -340,24 +327,15 @@ namespace FFXIVClassic_Lobby_Server
cmd.Parameters.AddWithValue("@charId", player.actorId);
using (MySqlDataReader reader = cmd.ExecuteReader())
{
- player.hasChocobo = reader.GetBoolean(0);
- player.hasGoobbue = reader.GetBoolean(1);
- player.chocoboAppearance = reader.GetByte(2);
- player.chocoboName = reader.GetString(3);
+ if (reader.Read())
+ {
+ player.hasChocobo = reader.GetBoolean(0);
+ player.hasGoobbue = reader.GetBoolean(1);
+ player.chocoboAppearance = reader.GetByte(2);
+ player.chocoboName = reader.GetString(3);
+ }
}
- //Load Achievements
- query = @"
- SELECT
- achievementId
- FROM characters_achievements WHERE characterId = @charId AND timeDone NOT NULL";
-
- //Load Last 5 Completed
- query = @"
- SELECT
- achievementId
- FROM characters_achievements WHERE characterId = @charId ORDER BY timeDone DESC LIMIT 5";
-
//Load Timers
query = @"
SELECT
@@ -380,28 +358,31 @@ namespace FFXIVClassic_Lobby_Server
behests,
companybehests,
returntimer,
- skirmish,
+ skirmish
FROM characters_timers WHERE characterId = @charId";
cmd = new MySqlCommand(query, conn);
cmd.Parameters.AddWithValue("@charId", player.actorId);
using (MySqlDataReader reader = cmd.ExecuteReader())
{
- for (int i = 0; i < player.timers.Length; i++)
- player.timers[i] = reader.GetUInt32(i);
+ if (reader.Read())
+ {
+ for (int i = 0; i < player.timers.Length; i++)
+ player.timers[i] = reader.GetUInt32(i);
+ }
}
//Load Hotbar
query = @"
SELECT
- hotbarIndex,
+ hotbarSlot,
commandId,
recastTime
FROM characters_hotbar WHERE characterId = @charId AND classId = @classId";
cmd = new MySqlCommand(query, conn);
- cmd.Parameters.AddWithValue("@charId", player.actorId);
- //cmd.Parameters.AddWithValue("@classId", player.currentClassId);
+ cmd.Parameters.AddWithValue("@charId", player);
+ cmd.Parameters.AddWithValue("@classId", player.charaWork.parameterSave.state_mainSkill[0]);
using (MySqlDataReader reader = cmd.ExecuteReader())
{
while (reader.Read())
@@ -415,10 +396,12 @@ namespace FFXIVClassic_Lobby_Server
//Load Scenario Quests
query = @"
SELECT
- index,
- questId
+ slot,
+ questId
FROM characters_quest_scenario WHERE characterId = @charId";
-
+
+ cmd = new MySqlCommand(query, conn);
+ cmd.Parameters.AddWithValue("@charId", player);
using (MySqlDataReader reader = cmd.ExecuteReader())
{
while (reader.Read())
@@ -431,12 +414,14 @@ namespace FFXIVClassic_Lobby_Server
//Load Guildleve Quests
query = @"
SELECT
- index,
+ slot,
questId,
abandoned,
completed
FROM characters_quest_scenario WHERE characterId = @charId";
+ cmd = new MySqlCommand(query, conn);
+ cmd.Parameters.AddWithValue("@charId", player);
using (MySqlDataReader reader = cmd.ExecuteReader())
{
while (reader.Read())
@@ -454,8 +439,10 @@ namespace FFXIVClassic_Lobby_Server
npcLinkshellId,
isCalling,
isExtra
- FROM characters_quest_scenario WHERE characterId = @charId";
+ FROM characters_npclinkshell WHERE characterId = @charId";
+ cmd = new MySqlCommand(query, conn);
+ cmd.Parameters.AddWithValue("@charId", player);
using (MySqlDataReader reader = cmd.ExecuteReader())
{
while (reader.Read())
@@ -476,5 +463,76 @@ namespace FFXIVClassic_Lobby_Server
}
}
+ 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)))
+ {
+ try
+ {
+ conn.Open();
+
+ //Load Last 5 Completed
+ string query = @"
+ SELECT
+ achievementId
+ FROM characters_achievements WHERE characterId = @charId ORDER BY timeDone DESC 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())
+ latestAchievements[count] = reader.GetUInt32(0);
+ }
+ }
+ catch (MySqlException e)
+ { Console.WriteLine(e); }
+ finally
+ {
+ conn.Dispose();
+ }
+ }
+
+ return SetLatestAchievementsPacket.buildPacket(player.actorId, latestAchievements);
+ }
+
+ public static SubPacket getAchievements(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)))
+ {
+ try
+ {
+ conn.Open();
+
+ //Load Last 5 Completed
+ string query = @"
+ SELECT
+ achievementId
+ FROM characters_achievements WHERE characterId = @charId AND timeDone NOT NULL";
+
+ MySqlCommand cmd = new MySqlCommand(query, conn);
+ cmd.Parameters.AddWithValue("@charId", player.actorId);
+ using (MySqlDataReader reader = cmd.ExecuteReader())
+ {
+ int count = 0;
+ while (reader.Read())
+ latestAchievements[count] = reader.GetUInt32(0);
+ }
+ }
+ catch (MySqlException e)
+ { Console.WriteLine(e); }
+ finally
+ {
+ conn.Dispose();
+ }
+ }
+
+
+ return SetLatestAchievementsPacket.buildPacket(player.actorId, latestAchievements);
+ }
+
}
}
diff --git a/FFXIVClassic Map Server/FFXIVClassic Map Server.csproj b/FFXIVClassic Map Server/FFXIVClassic Map Server.csproj
index 8e79f2d4..24a13d9a 100644
--- a/FFXIVClassic Map Server/FFXIVClassic Map Server.csproj
+++ b/FFXIVClassic Map Server/FFXIVClassic Map Server.csproj
@@ -64,6 +64,7 @@
+
@@ -209,6 +210,7 @@
+
diff --git a/FFXIVClassic Map Server/PacketProcessor.cs b/FFXIVClassic Map Server/PacketProcessor.cs
index 86723aa8..bf4fb7c7 100644
--- a/FFXIVClassic Map Server/PacketProcessor.cs
+++ b/FFXIVClassic Map Server/PacketProcessor.cs
@@ -49,7 +49,7 @@ namespace FFXIVClassic_Lobby_Server
{
mPlayers = playerList;
mConnections = connectionList;
- initNpcs();
+ // initNpcs();
}
public void processPacket(ClientConnection client, BasePacket packet)
diff --git a/FFXIVClassic Map Server/actors/chara/Character.cs b/FFXIVClassic Map Server/actors/chara/Character.cs
index 936a2c5a..89a99ef0 100644
--- a/FFXIVClassic Map Server/actors/chara/Character.cs
+++ b/FFXIVClassic Map Server/actors/chara/Character.cs
@@ -49,8 +49,7 @@ namespace FFXIVClassic_Map_Server.dataobjects.chara
public Work work = new Work();
public CharaWork charaWork = new CharaWork();
- public PlayerWork playerWork = new PlayerWork();
-
+
public Character(uint actorID) : base(actorID)
{
}
diff --git a/FFXIVClassic Map Server/actors/chara/player/Player.cs b/FFXIVClassic Map Server/actors/chara/player/Player.cs
index 86b006d9..7f0b23c6 100644
--- a/FFXIVClassic Map Server/actors/chara/player/Player.cs
+++ b/FFXIVClassic Map Server/actors/chara/player/Player.cs
@@ -53,8 +53,9 @@ namespace FFXIVClassic_Map_Server.dataobjects.chara
public string chocoboName;
public uint achievementPoints;
+ public ushort[] latestAchievements = new ushort[5];
- PlayerWork playerWork = new PlayerWork();
+ public PlayerWork playerWork = new PlayerWork();
public Player(uint actorID) : base(actorID)
{
@@ -62,58 +63,17 @@ namespace FFXIVClassic_Map_Server.dataobjects.chara
className = "Player";
currentSubState = SetActorStatePacket.SUB_STATE_PLAYER;
- DBStats stats = Database.getCharacterStats(actorID);
-
charaWork.property[0] = 1;
charaWork.property[1] = 1;
charaWork.property[2] = 1;
charaWork.property[4] = 1;
- charaWork.parameterSave.hp[0] = stats.hp;
- charaWork.parameterSave.hpMax[0] = stats.hpMax;
- charaWork.parameterSave.mp = stats.mp;
- charaWork.parameterSave.mpMax = stats.mpMax;
-
charaWork.parameterSave.state_mainSkill[0] = 3;
charaWork.parameterSave.state_mainSkillLevel = 1;
- charaWork.battleSave.skillLevel = 1;
- charaWork.battleSave.skillLevelCap = 2;
- charaWork.battleSave.potencial = 0.5f;
- charaWork.battleSave.physicalExp = 1;
- charaWork.battleSave.negotiationFlag[0] = false;
- charaWork.battleSave.negotiationFlag[1] = false;
-
- for (int i = 0; i < 20; i++)
- charaWork.statusShownTime[i] = 0xFFFFFFFF;
-
- setPlayerAppearance();
+ Database.loadPlayerCharacter(this);
}
-
- public void setPlayerAppearance()
- {
- DBAppearance appearance = Database.getAppearance(true, actorId);
-
- modelID = DBAppearance.getTribeModel(appearance.tribe);
- appearanceIDs[SIZE] = appearance.size;
- appearanceIDs[COLORINFO] = (uint)(appearance.skinColor | (appearance.hairColor << 10) | (appearance.eyeColor << 20));
- appearanceIDs[FACEINFO] = PrimitiveConversion.ToUInt32(appearance.getFaceInfo());
- appearanceIDs[HIGHLIGHT_HAIR] = (uint)(appearance.hairHighlightColor | appearance.hairStyle << 10);
- appearanceIDs[VOICE] = appearance.voice;
- appearanceIDs[WEAPON1] = appearance.mainHand;
- appearanceIDs[WEAPON2] = appearance.offHand;
- appearanceIDs[HEADGEAR] = appearance.head;
- appearanceIDs[BODYGEAR] = appearance.body;
- appearanceIDs[LEGSGEAR] = appearance.legs;
- appearanceIDs[HANDSGEAR] = appearance.hands;
- appearanceIDs[FEETGEAR] = appearance.feet;
- appearanceIDs[WAISTGEAR] = appearance.waist;
- appearanceIDs[R_EAR] = appearance.rightEar;
- appearanceIDs[L_EAR] = appearance.leftEar;
- appearanceIDs[R_FINGER] = appearance.rightFinger;
- appearanceIDs[L_FINGER] = appearance.leftFinger;
- }
-
+
public List create0x132Packets(uint playerActorId)
{
List packets = new List();
diff --git a/FFXIVClassic Map Server/dataobjects/ConnectedPlayer.cs b/FFXIVClassic Map Server/dataobjects/ConnectedPlayer.cs
index ccddc0e7..0d10a17c 100644
--- a/FFXIVClassic Map Server/dataobjects/ConnectedPlayer.cs
+++ b/FFXIVClassic Map Server/dataobjects/ConnectedPlayer.cs
@@ -28,8 +28,8 @@ namespace FFXIVClassic_Map_Server.dataobjects
public ConnectedPlayer(uint actorId)
{
this.actorID = actorId;
- DBCharacter chara = Database.getCharacter(actorId);
- createPlayerActor(actorId, chara);
+ playerActor = new Player(actorId);
+ actorInstanceList.Add(playerActor);
}
public void addConnection(ClientConnection conn)
@@ -89,16 +89,6 @@ namespace FFXIVClassic_Map_Server.dataobjects
return playerActor;
}
- public void createPlayerActor(uint actorId, DBCharacter chara)
- {
- playerActor = new Player(actorId);
-
- playerActor.displayNameId = 0xFFFFFFFF;
- playerActor.customDisplayName = chara.name;
- playerActor.setPlayerAppearance();
- actorInstanceList.Add(playerActor);
- }
-
public void updatePlayerActorPosition(float x, float y, float z, float rot, ushort moveState)
{
/*