Fixed the crash when class change is to a level 0 class. Now autosets to level 1.

This commit is contained in:
Filip Maj 2018-04-07 15:34:11 -04:00
parent 0b13b590a0
commit 880b1f3066
2 changed files with 92 additions and 0 deletions

View File

@ -2352,5 +2352,85 @@ namespace FFXIVClassic_Map_Server
} }
} }
public static void PlayerCharacterUpdateClassLevel(Player player, byte classId, short level)
{
string query;
MySqlCommand cmd;
string[] classNames = {
"",
"",
"pug",
"gla",
"mrd",
"",
"",
"arc",
"lnc",
"",
"",
"",
"",
"",
"",
"",
"",
"",
"",
"",
"",
"",
"thm",
"cnj",
"",
"",
"",
"",
"",
"crp",
"bsm",
"arm",
"gsm",
"ltw",
"wvr",
"alc",
"cul",
"",
"",
"min",
"btn",
"fsh"
};
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();
query = String.Format(@"
UPDATE characters_class_levels
SET
{0}=@level
WHERE
characterId = @characterId", classNames[classId]);
cmd = new MySqlCommand(query, conn);
cmd.Parameters.AddWithValue("@level", level);
cmd.Parameters.AddWithValue("@characterId", player.actorId);
cmd.ExecuteNonQuery();
}
catch (MySqlException e)
{
Program.Log.Error(e.ToString());
}
finally
{
conn.Dispose();
}
}
}
} }
} }

View File

@ -990,6 +990,8 @@ namespace FFXIVClassic_Map_Server.Actors
public void PrepareClassChange(byte classId) public void PrepareClassChange(byte classId)
{ {
//If new class, init abilties and level //If new class, init abilties and level
if (charaWork.battleSave.skillLevel[classId - 1] <= 0)
UpdateClassLevel(classId, 1);
SendCharaExpInfo(); SendCharaExpInfo();
} }
@ -1038,6 +1040,16 @@ namespace FFXIVClassic_Map_Server.Actors
Database.SavePlayerCurrentClass(this); Database.SavePlayerCurrentClass(this);
} }
public void UpdateClassLevel(byte classId, short level)
{
Database.PlayerCharacterUpdateClassLevel(this, classId, level);
charaWork.battleSave.skillLevel[classId - 1] = level;
ActorPropertyPacketUtil propertyBuilder = new ActorPropertyPacketUtil("charaWork/exp", this);
propertyBuilder.AddProperty(String.Format("charaWork.battleSave.skillLevel[{0}]", classId-1));
List<SubPacket> packets = propertyBuilder.Done();
QueuePackets(packets);
}
public void GraphicChange(int slot, InventoryItem invItem) public void GraphicChange(int slot, InventoryItem invItem)
{ {
if (invItem == null) if (invItem == null)