From 880b1f30661269a377b021f7cb4fa700e9075607 Mon Sep 17 00:00:00 2001 From: Filip Maj Date: Sat, 7 Apr 2018 15:34:11 -0400 Subject: [PATCH] Fixed the crash when class change is to a level 0 class. Now autosets to level 1. --- FFXIVClassic Map Server/Database.cs | 80 +++++++++++++++++++ .../actors/chara/player/Player.cs | 12 +++ 2 files changed, 92 insertions(+) diff --git a/FFXIVClassic Map Server/Database.cs b/FFXIVClassic Map Server/Database.cs index 093ff0f3..c90ef0e8 100644 --- a/FFXIVClassic Map Server/Database.cs +++ b/FFXIVClassic Map Server/Database.cs @@ -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(); + } + } + } + } } diff --git a/FFXIVClassic Map Server/actors/chara/player/Player.cs b/FFXIVClassic Map Server/actors/chara/player/Player.cs index c54d7393..6a28e76c 100644 --- a/FFXIVClassic Map Server/actors/chara/player/Player.cs +++ b/FFXIVClassic Map Server/actors/chara/player/Player.cs @@ -990,6 +990,8 @@ namespace FFXIVClassic_Map_Server.Actors public void PrepareClassChange(byte classId) { //If new class, init abilties and level + if (charaWork.battleSave.skillLevel[classId - 1] <= 0) + UpdateClassLevel(classId, 1); SendCharaExpInfo(); } @@ -1038,6 +1040,16 @@ namespace FFXIVClassic_Map_Server.Actors 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 packets = propertyBuilder.Done(); + QueuePackets(packets); + } + public void GraphicChange(int slot, InventoryItem invItem) { if (invItem == null)