From a07aa12783637ccf46dfa218767e2f7538001fc7 Mon Sep 17 00:00:00 2001 From: Filip Maj Date: Sat, 8 Jun 2019 14:46:19 -0400 Subject: [PATCH] Fixed new positions after realignment not saving. Fixed Dealer info not clearing from the db sometimes. --- FFXIVClassic Map Server/Database.cs | 42 +++++++++++++++++++ FFXIVClassic Map Server/WorldManager.cs | 2 - .../actors/chara/ItemPackage.cs | 11 ++++- .../dataobjects/InventoryItem.cs | 15 +++++++ 4 files changed, 67 insertions(+), 3 deletions(-) diff --git a/FFXIVClassic Map Server/Database.cs b/FFXIVClassic Map Server/Database.cs index 14b958c4..6f81de73 100644 --- a/FFXIVClassic Map Server/Database.cs +++ b/FFXIVClassic Map Server/Database.cs @@ -1635,6 +1635,48 @@ namespace FFXIVClassic_Map_Server } } + public static void UpdateItemPositions(List updated) + { + 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 = @" + UPDATE characters_inventory + SET slot = @slot + WHERE serverItemId = @serverItemId; + "; + + using (MySqlTransaction trans = conn.BeginTransaction()) + { + using (MySqlCommand cmd = new MySqlCommand(query, conn, trans)) + { + foreach (InventoryItem item in updated) + { + cmd.Parameters.Clear(); + cmd.Parameters.AddWithValue("@serverItemId", item.uniqueId); + cmd.Parameters.AddWithValue("@slot", item.slot); + cmd.ExecuteNonQuery(); + } + + trans.Commit(); + } + } + } + catch (MySqlException e) + { + Program.Log.Error(e.ToString()); + } + finally + { + conn.Dispose(); + } + } + + } + public static void SetQuantity(ulong serverItemId, int quantity) { 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))) diff --git a/FFXIVClassic Map Server/WorldManager.cs b/FFXIVClassic Map Server/WorldManager.cs index 0468357a..149cfd41 100644 --- a/FFXIVClassic Map Server/WorldManager.cs +++ b/FFXIVClassic Map Server/WorldManager.cs @@ -1638,14 +1638,12 @@ namespace FFXIVClassic_Map_Server bazaarPackage.RemoveItem(reward); reward.SetNormal(); player.AddItem(reward); - Database.ClearDealingInfo(reward); if (seek != null) { bazaarPackage.RemoveItem(seek); seek.SetNormal(); player.AddItem(seek); - Database.ClearDealingInfo(seek); } player.CheckBazaarFlags(); diff --git a/FFXIVClassic Map Server/actors/chara/ItemPackage.cs b/FFXIVClassic Map Server/actors/chara/ItemPackage.cs index 5df79535..1d4cdb44 100644 --- a/FFXIVClassic Map Server/actors/chara/ItemPackage.cs +++ b/FFXIVClassic Map Server/actors/chara/ItemPackage.cs @@ -826,7 +826,9 @@ namespace FFXIVClassic_Map_Server.actors.chara.player private void DoRealign() { - int lastNullSlot = -1; + List positionUpdate = new List(); + + int lastNullSlot = -1; for (int i = 0; i < endOfListIndex; i++) { @@ -838,7 +840,12 @@ namespace FFXIVClassic_Map_Server.actors.chara.player else if (list[i] != null && lastNullSlot != -1) { list[lastNullSlot] = list[i]; + if (list[lastNullSlot].GetOfferedTo() != null) + { + list[lastNullSlot].UpdateOfferedSlot((ushort)(list[lastNullSlot].slot - lastNullSlot)); + } list[lastNullSlot].slot = (ushort)lastNullSlot; + positionUpdate.Add(list[lastNullSlot]); list[i] = null; isDirty[lastNullSlot] = true; isDirty[i] = true; @@ -848,6 +855,8 @@ namespace FFXIVClassic_Map_Server.actors.chara.player if (lastNullSlot != -1) endOfListIndex = lastNullSlot; + + Database.UpdateItemPositions(positionUpdate); } #endregion diff --git a/FFXIVClassic Map Server/dataobjects/InventoryItem.cs b/FFXIVClassic Map Server/dataobjects/InventoryItem.cs index 6fdd1ed9..f4daf32b 100644 --- a/FFXIVClassic Map Server/dataobjects/InventoryItem.cs +++ b/FFXIVClassic Map Server/dataobjects/InventoryItem.cs @@ -271,6 +271,9 @@ namespace FFXIVClassic_Map_Server.dataobjects public void SetNormal() { + if (dealingMode != 0 || tags[0] == TAG_ATTACHED) + Database.ClearDealingInfo(this); + tags[0] = 0; tagValues[0] = 0; dealingVal = 0; @@ -319,6 +322,18 @@ namespace FFXIVClassic_Map_Server.dataobjects Database.SetDealingInfo(this); } + public void UpdateOfferedSlot(ushort delta) + { + if (dealingMode == DEALINGMODE_REFERENCED) + { + ushort attachedItemPackage = (ushort)((dealingAttached1 >> 16) & 0xFF); + ushort attachedSlot = (ushort)(dealingAttached1 & 0xFF); + attachedSlot -= delta; + dealingAttached1 = ((attachedItemPackage << 16) | attachedSlot); + Database.SetDealingInfo(this); + } + } + protected void SetSeeking() { tags[0] = TAG_ATTACHED;