diff --git a/FFXIVClassic Map Server/Database.cs b/FFXIVClassic Map Server/Database.cs index 6b90a874..aecf28b7 100644 --- a/FFXIVClassic Map Server/Database.cs +++ b/FFXIVClassic Map Server/Database.cs @@ -477,7 +477,6 @@ namespace FFXIVClassic_Lobby_Server { conn.Open(); - //Load Last 5 Completed string query = @" SELECT serverItemId, @@ -600,7 +599,7 @@ namespace FFXIVClassic_Lobby_Server string query = @" UPDATE characters_inventory SET quantity = @quantity - WHERE serverItemId = (SELECT id FROM server_items WHERE characterId = @charId AND slot = @slot LIMIT 1) + WHERE characterId = @charId AND slot = @slot "; MySqlCommand cmd = new MySqlCommand(query, conn); @@ -622,20 +621,23 @@ namespace FFXIVClassic_Lobby_Server public static void removeItem(Player player, ulong serverItemId) { - 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))) + using (MySqlConnection conn = new MySqlConnection(String.Format("Server={0}; Port={1}; Database={2}; UID={3}; Password={4}; Allow User Variables=True", 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 slot INTO @slotToDelete FROM characters_inventory WHERE serverItemId = @serverItemId; UPDATE characters_inventory SET slot = slot - 1 - WHERE characterId = 108 AND slot > @slotToDelete; + WHERE characterId = @charId AND slot > @slotToDelete; + DELETE FROM characters_inventory WHERE serverItemId = @serverItemId; + + DELETE FROM server_items + WHERE id = @serverItemId; "; MySqlCommand cmd = new MySqlCommand(query, conn); @@ -656,28 +658,26 @@ namespace FFXIVClassic_Lobby_Server public static void removeItem(Player player, ushort slot) { - 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))) + using (MySqlConnection conn = new MySqlConnection(String.Format("Server={0}; Port={1}; Database={2}; UID={3}; Password={4}; Allow User Variables=True", 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 serverItemId INTO @serverItemId FROM characters_inventory WHERE characterId = @charId AND slot = @slot; + + DELETE FROM characters_inventory + WHERE characterId = @charId AND slot = @slot; + DELETE FROM server_items - WHERE slot = @slot; - "; + WHERE id = @serverItemId; - string query2 = @" - DELETE FROM character_inventory - WHERE uniqueServerId = @uniqueItemId; - UPDATE character_inventory + UPDATE characters_inventory SET slot = slot - 1 - WHERE characterId = @charId AND slot > @slot + WHERE characterId = @charId AND slot > @slot; "; - query += query2; - MySqlCommand cmd = new MySqlCommand(query, conn); cmd.Parameters.AddWithValue("@charId", player.actorId); cmd.Parameters.AddWithValue("@slot", slot); diff --git a/FFXIVClassic Map Server/Server.cs b/FFXIVClassic Map Server/Server.cs index ec626973..8c36d0d1 100644 --- a/FFXIVClassic Map Server/Server.cs +++ b/FFXIVClassic Map Server/Server.cs @@ -424,19 +424,19 @@ namespace FFXIVClassic_Lobby_Server } } - private void removeItem(ConnectedPlayer client, ushort slot) + private void removeItem(ConnectedPlayer client, uint itemId, int quantity) { if (client != null) { Player p = client.getActor(); - p.inventories[Inventory.NORMAL].removeItem(slot); + p.inventories[Inventory.NORMAL].removeItem(itemId, quantity); } else { foreach (KeyValuePair entry in mConnectedPlayerList) { Player p = entry.Value.getActor(); - p.inventories[Inventory.NORMAL].removeItem(slot); + p.inventories[Inventory.NORMAL].removeItem(itemId, quantity); } } } @@ -507,7 +507,10 @@ namespace FFXIVClassic_Lobby_Server try { - removeItem(client, UInt16.Parse(split[1])); + if (split.Length == 2) + removeItem(client, UInt32.Parse(split[1]), 1); + else if (split.Length == 3) + removeItem(client, UInt32.Parse(split[1]), Int32.Parse(split[2])); } catch (Exception e) { diff --git a/FFXIVClassic Map Server/actors/chara/player/Inventory.cs b/FFXIVClassic Map Server/actors/chara/player/Inventory.cs index eba9225a..00879636 100644 --- a/FFXIVClassic Map Server/actors/chara/player/Inventory.cs +++ b/FFXIVClassic Map Server/actors/chara/player/Inventory.cs @@ -99,9 +99,11 @@ namespace FFXIVClassic_Map_Server.actors.chara.player public void removeItem(uint itemId, int quantity) { - if (!hasItem(itemId)) + if (!hasItem(itemId, quantity)) return; + List slotsToUpdate = new List(); + List itemsToRemove = new List(); List slotsToRemove = new List(); List addItemPackets = new List(); @@ -115,9 +117,14 @@ namespace FFXIVClassic_Map_Server.actors.chara.player { //Stack nomnomed if (item.quantity - quantityCount <= 0) - slotsToRemove.Add(item.slot); + { + itemsToRemove.Add(item); + } else + { + slotsToUpdate.Add(item.slot); item.quantity -= quantityCount; //Stack reduced + } quantityCount -= item.quantity; lowestSlot = item.slot; @@ -127,13 +134,15 @@ namespace FFXIVClassic_Map_Server.actors.chara.player } } - list.Sort(); - int numSlotsRemoved = 0; - for (int i = 0; i < slotsToRemove.Count; i++) + for (int i = 0; i < slotsToUpdate.Count; i++) { - Database.removeItem(owner, (ushort)(slotsToRemove[i] - numSlotsRemoved)); - list.RemoveAt(slotsToRemove[i] - numSlotsRemoved); - numSlotsRemoved++; + Database.setQuantity(owner, slotsToUpdate[i], list[slotsToUpdate[i]].quantity); + } + + for (int i = 0; i < itemsToRemove.Count; i++) + { + Database.removeItem(owner, itemsToRemove[i].uniqueId); + list.Remove(itemsToRemove[i]); } owner.queuePacket(InventoryBeginChangePacket.buildPacket(owner.actorId)); @@ -146,7 +155,7 @@ namespace FFXIVClassic_Map_Server.actors.chara.player owner.queuePacket(InventoryEndChangePacket.buildPacket(owner.actorId)); } - public void removeItem(uint itemDBId) + public void removeItem(ulong itemDBId) { ushort slot = 0; Item toDelete = null; @@ -179,6 +188,9 @@ namespace FFXIVClassic_Map_Server.actors.chara.player public void removeItem(ushort slot) { + if (slot >= list.Count) + return; + list.RemoveAt((int)slot); Database.removeItem(owner, slot); @@ -293,9 +305,7 @@ namespace FFXIVClassic_Map_Server.actors.chara.player Item item = list[i]; if (item.itemId == itemId && item.quantity < item.maxStack) { - int oldQuantity = item.quantity; - item.quantity = Math.Min(item.quantity + quantityCount, item.maxStack); - quantityCount -= (item.maxStack - oldQuantity); + quantityCount -= (item.maxStack - item.quantity); if (quantityCount <= 0) break; }