public void RemoveInfo(RestartInfo pInfo) { if (pInfo == null) { return; } using (DeleteQueryBuilder dqb = new DeleteQueryBuilder("session_restarts")) { dqb.SetWhereColumn("character_id", pInfo.CharacterID); dqb.SetWhereColumn("world_id", pInfo.WorldID); dqb.SetWhereColumn("ip", pInfo.IP); dqb.SetWhereColumn("machine_id", pInfo.MachineID); dqb.RunQuery(); } Cache.Remove(pInfo); }
public virtual void HandleInventoryUpdate(ClientConnection pConnection, MaplePacket pPacket) { CharacterInventory inventory = pConnection.CharData.Inventory; byte type1 = pPacket.ReadByte(); byte items = pPacket.ReadByte(); byte type3 = pPacket.ReadByte(); if (type3 == 0) // Add or update item { for (var amnt = 0; amnt < items; amnt++) { byte type4 = pPacket.ReadByte(); byte inv = pPacket.ReadByte(); short slot = pPacket.ReadShort(); inv -= 1; if (type4 == 0) // New Item { ItemBase item = ItemBase.DecodeItemData(pConnection, pPacket); if (inv == 0) { // Equip byte internalInventory = CharacterInventory.GetEquipInventoryFromSlot(slot); slot = CharacterInventory.CorrectEquipSlot(internalInventory, slot); if (!inventory.EquipmentItems[internalInventory].ContainsKey(slot)) inventory.EquipmentItems[internalInventory].Add(slot, item as ItemEquip); else inventory.EquipmentItems[internalInventory][slot] = item as ItemEquip; } else { if (!inventory.InventoryItems[inv - 1].ContainsKey((byte)slot)) inventory.InventoryItems[inv - 1].Add((byte)slot, item); else inventory.InventoryItems[inv - 1][(byte)slot] = item; } using (InsertQueryBuilder itemsTable = new InsertQueryBuilder("items")) { itemsTable.OnDuplicateUpdate = true; Queries.SaveItem(pConnection, inv, slot, item, itemsTable); itemsTable.RunQuery(); } if (item is ItemPet) { var pet = item as ItemPet; using (InsertQueryBuilder petTable = new InsertQueryBuilder("pets")) { petTable.OnDuplicateUpdate = true; Queries.SavePet(pConnection.CharacterInternalID, pet, petTable); petTable.RunQuery(); } } } else if (type4 == 1) // Update amount { short amount = pPacket.ReadShort(); if (inv == 0) { pConnection.Logger_WriteLine("WUTWUT"); // Should _never_ happen continue; } ItemBase item = inventory.InventoryItems[inv - 1][(byte)slot]; item.Amount = amount; AccountDataCache.Instance.SetChecksumOfSlot(pConnection.CharacterID, pConnection.WorldID, inv, slot, item.GetChecksum()); using (UpdateQueryBuilder itemTable = new UpdateQueryBuilder("items")) { itemTable.SetColumn("amount", amount); itemTable.SetColumn("checksum", item.GetChecksum()); itemTable.SetWhereColumn("inventory", inv); itemTable.SetWhereColumn("slot", slot); itemTable.SetWhereColumn("character_id", pConnection.CharacterInternalID); MySQL_Connection.Instance.RunQuery(itemTable.ToString()); } } else if (type4 == 2) // Swap { short slotfrom = slot; short slotto = pPacket.ReadShort(); bool founditem = false; if (inv == 0) { // Equips! byte internalInventoryFrom = CharacterInventory.GetEquipInventoryFromSlot(slotfrom); byte internalInventoryTo = CharacterInventory.GetEquipInventoryFromSlot(slotto); slotfrom = CharacterInventory.CorrectEquipSlot(internalInventoryFrom, slotfrom); slotto = CharacterInventory.CorrectEquipSlot(internalInventoryTo, slotto); // Switch Equips ItemEquip item = inventory.EquipmentItems[internalInventoryFrom][slotfrom]; if (inventory.EquipmentItems[internalInventoryTo].ContainsKey(slotto)) { inventory.EquipmentItems[internalInventoryFrom][slotfrom] = inventory.EquipmentItems[internalInventoryTo][slotto]; inventory.EquipmentItems[internalInventoryTo].Remove(slotto); // Remove item founditem = true; } else { inventory.EquipmentItems[internalInventoryFrom].Remove(slotfrom); } inventory.EquipmentItems[internalInventoryTo].Add(slotto, item); } else { // Switch Items ItemBase item = inventory.InventoryItems[inv - 1][(byte)slotfrom]; if (inventory.InventoryItems[inv - 1].ContainsKey((byte)slotto)) { inventory.InventoryItems[inv - 1][(byte)slotfrom] = inventory.InventoryItems[inv - 1][(byte)slotto]; inventory.InventoryItems[inv - 1].Remove((byte)slotto); // Remove item founditem = true; } else { inventory.InventoryItems[inv - 1].Remove((byte)slotfrom); } inventory.InventoryItems[inv - 1].Add((byte)slotto, item); } if (founditem) // New slot contained item { using (UpdateQueryBuilder itemTable = new UpdateQueryBuilder("items")) { itemTable.SetColumn("slot", slotfrom + 3000); itemTable.SetWhereColumn("inventory", inv); itemTable.SetWhereColumn("slot", slotto); itemTable.SetWhereColumn("character_id", pConnection.CharacterInternalID); MySQL_Connection.Instance.RunQuery(itemTable.ToString()); } } using (UpdateQueryBuilder itemTable = new UpdateQueryBuilder("items")) { itemTable.SetColumn("slot", slotto); itemTable.SetWhereColumn("inventory", inv); itemTable.SetWhereColumn("slot", slotfrom); itemTable.SetWhereColumn("character_id", pConnection.CharacterInternalID); MySQL_Connection.Instance.RunQuery(itemTable.ToString()); } if (founditem) // Fix other slot { using (UpdateQueryBuilder itemTable = new UpdateQueryBuilder("items")) { itemTable.SetColumn("slot", slotfrom); itemTable.SetWhereColumn("inventory", inv); itemTable.SetWhereColumn("slot", slotfrom + 3000); itemTable.SetWhereColumn("character_id", pConnection.CharacterInternalID); MySQL_Connection.Instance.RunQuery(itemTable.ToString()); } } } else if (type4 == 3) { // Drop/delete item. if (inv == 0) { // Equips! byte internalInventory = CharacterInventory.GetEquipInventoryFromSlot(slot); slot = CharacterInventory.CorrectEquipSlot(internalInventory, slot); if (inventory.EquipmentItems[internalInventory].ContainsKey(slot)) { inventory.EquipmentItems[internalInventory].Remove(slot); AccountDataCache.Instance.DeleteItemChecksum(pConnection, 0, slot); } else pConnection.Logger_WriteLine("!!! Could not find item @ {0} {1}", inv, slot); } else { if (inventory.InventoryItems[inv - 1].ContainsKey((byte)slot)) { inventory.InventoryItems[inv - 1].Remove((byte)slot); AccountDataCache.Instance.DeleteItemChecksum(pConnection, (ushort)(inv - 1), slot); } else pConnection.Logger_WriteLine("!!! Could not find item @ {0} {1}", inv, slot); } using (DeleteQueryBuilder itemTable = new DeleteQueryBuilder("items")) { itemTable.SetWhereColumn("inventory", inv); itemTable.SetWhereColumn("slot", slot); itemTable.SetWhereColumn("character_id", pConnection.CharacterInternalID); itemTable.RunQuery(); } } else if (type4 == 4) { pPacket.ReadLong(); // Unknown..? } else if (type4 == 5) { // 'Swap' items from and to bags inv -= 1; short from = slot; byte slotfrom = (byte)(from % 100); byte bagfrom = (byte)(from / 100); short to = pPacket.ReadShort(); byte slotto = (byte)(to % 100); byte bagto = (byte)(to / 100); slotfrom -= 1; slotto -= 1; if (bagto == 0) bagto = 255; else bagto -= 1; if (bagfrom == 0) bagfrom = 255; else bagfrom -= 1; ushort invto = bagto == 255 ? inv : GameHelper.GetBagID(bagto, inv); ushort invfrom = bagfrom == 255 ? inv : GameHelper.GetBagID(bagfrom, inv); if ( (bagfrom != 255 && bagto != 255) || (bagfrom == bagto) || // Check if the item is being moved to itself or something (bagfrom == 255 && !inventory.InventoryItems[inv].ContainsKey(slotfrom)) || (bagfrom != 255 && (!inventory.BagItems.ContainsKey(invfrom) || !inventory.BagItems[invfrom].Items.ContainsKey(slotfrom))) || (bagto != 255 && !inventory.BagItems.ContainsKey(invto)) // Only check if bag exists ) { pConnection.Logger_WriteLine("Invalid item movement in bag !!!"); continue; } bool founditem = false; if (bagfrom == 255) { // Move to bag ItemBase ib = inventory.InventoryItems[inv][slotfrom]; if (inventory.BagItems[invto].Items.ContainsKey(slotto)) { inventory.InventoryItems[inv][slotfrom] = inventory.BagItems[invto].Items[slotto]; inventory.BagItems[invto].Items.Remove(slotto); founditem = true; } inventory.BagItems[invto].Items.Add(slotto, ib); } else { // Move to normal slot ItemBase ib = inventory.BagItems[invfrom].Items[slotfrom]; if (inventory.InventoryItems[inv].ContainsKey(slotto)) { inventory.BagItems[invfrom].Items[slotfrom] = inventory.InventoryItems[inv][slotto]; inventory.InventoryItems[inv].Remove(slotto); } inventory.InventoryItems[inv].Add(slotto, ib); using (InsertQueryBuilder itemsTable = new InsertQueryBuilder("items")) { itemsTable.OnDuplicateUpdate = true; Queries.SaveItem(pConnection, inv, slot, ib, itemsTable); itemsTable.RunQuery(); } } /* * Item A: item being used to move/swap | inv 3, slot 21 (Etc) | slotfrom, invfrom * Item B: item that is being swapped with A | inv 11, slot 3 (Bag 2) | slotto, invto * * Move B to a temp slot, to the new inventory: inv 11 -> inv 3, slot 3 -> slot 3021 * Move A to B: inv 3 -> inv 11, slot 21 -> slot 3 * Move B to A: slot 3021 -> slot 21 * */ if (founditem) // New slot contained item { // Temporary moving item using (UpdateQueryBuilder itemTable = new UpdateQueryBuilder("items")) { itemTable.SetColumn("slot", slotfrom + 3000); itemTable.SetColumn("inventory", invfrom); itemTable.SetWhereColumn("inventory", invto); itemTable.SetWhereColumn("slot", slotto); itemTable.SetWhereColumn("character_id", pConnection.CharacterInternalID); MySQL_Connection.Instance.RunQuery(itemTable.ToString()); } } using (UpdateQueryBuilder itemTable = new UpdateQueryBuilder("items")) { itemTable.SetColumn("slot", slotto); itemTable.SetColumn("inventory", invto); itemTable.SetWhereColumn("inventory", invfrom); itemTable.SetWhereColumn("slot", slotfrom); itemTable.SetWhereColumn("character_id", pConnection.CharacterInternalID); MySQL_Connection.Instance.RunQuery(itemTable.ToString()); } if (founditem) // Fix other slot { using (UpdateQueryBuilder itemTable = new UpdateQueryBuilder("items")) { itemTable.SetColumn("slot", slotfrom); itemTable.SetWhereColumn("inventory", invfrom); itemTable.SetWhereColumn("slot", slotfrom + 3000); itemTable.SetWhereColumn("character_id", pConnection.CharacterInternalID); MySQL_Connection.Instance.RunQuery(itemTable.ToString()); } } } else if (type4 == 6) { // Update bag item amount inv -= 1; short from = slot; byte slotfrom = (byte)(from % 100); byte bagfrom = (byte)(from / 100); short amount = pPacket.ReadShort(); slotfrom -= 1; if (bagfrom == 0) { pConnection.Logger_WriteLine("Invalid item bag!"); continue; } else bagfrom -= 1; ushort invfrom = GameHelper.GetBagID(bagfrom, inv); if ( !inventory.BagItems.ContainsKey(invfrom) || !inventory.BagItems[invfrom].Items.ContainsKey(slotfrom) ) { pConnection.Logger_WriteLine("Invalid item movement in bag (item did not exist)!!!"); continue; } ItemBase item = inventory.BagItems[invfrom].Items[slotfrom]; item.Amount = amount; AccountDataCache.Instance.SetChecksumOfSlot(pConnection.CharacterID, pConnection.WorldID, inv, slot, item.GetChecksum()); using (UpdateQueryBuilder itemTable = new UpdateQueryBuilder("items")) { itemTable.SetColumn("amount", amount); itemTable.SetColumn("checksum", item.GetChecksum()); itemTable.SetWhereColumn("inventory", invfrom); itemTable.SetWhereColumn("slot", slot); itemTable.SetWhereColumn("character_id", pConnection.CharacterInternalID); MySQL_Connection.Instance.RunQuery(itemTable.ToString()); } } else if (type4 == 7) { // Delete/drop bag item D: inv -= 1; short from = slot; byte slotfrom = (byte)(from % 100); byte bagfrom = (byte)(from / 100); slotfrom -= 1; bagfrom -= 1; ushort invfrom = GameHelper.GetBagID(bagfrom, inv); using (DeleteQueryBuilder itemTable = new DeleteQueryBuilder("items")) { itemTable.SetWhereColumn("inventory", invfrom); itemTable.SetWhereColumn("slot", slotfrom); itemTable.SetWhereColumn("character_id", pConnection.CharacterInternalID); MySQL_Connection.Instance.RunQuery(itemTable.ToString()); } } else if (type4 == 8) { // Swap/move item in bags inv -= 1; short from = slot; byte slotfrom = (byte)(from % 100); byte bagfrom = (byte)(from / 100); short to = pPacket.ReadShort(); byte slotto = (byte)(to % 100); byte bagto = (byte)(to / 100); slotfrom -= 1; slotto -= 1; bagto -= 1; bagfrom -= 1; ushort invto = GameHelper.GetBagID(bagto, inv); ushort invfrom = GameHelper.GetBagID(bagfrom, inv); if (!inventory.BagItems.ContainsKey(invfrom) || !inventory.BagItems.ContainsKey(invto)) { pConnection.Logger_WriteLine("Invalid item movement in bag"); continue; } if (!inventory.BagItems[invfrom].Items.ContainsKey(slotfrom)) { pConnection.Logger_WriteLine("Invalid item movement in bag (item not found)"); continue; } ItemBase item = inventory.BagItems[invfrom].Items[slotfrom]; bool founditem = false; if (inventory.BagItems[invto].Items.ContainsKey(slotto)) { // Swap inventory.BagItems[invfrom].Items[slotfrom] = inventory.BagItems[invto].Items[slotto]; inventory.BagItems[invto].Items.Remove(slotto); // Delete item founditem = true; } inventory.BagItems[invto].Items.Add(slotto, item); if (founditem) // New slot contained item { // Temporary moving item using (UpdateQueryBuilder itemTable = new UpdateQueryBuilder("items")) { itemTable.SetColumn("slot", slotfrom + 3000); itemTable.SetColumn("inventory", invfrom); itemTable.SetWhereColumn("inventory", invto); itemTable.SetWhereColumn("slot", slotto); itemTable.SetWhereColumn("character_id", pConnection.CharacterInternalID); MySQL_Connection.Instance.RunQuery(itemTable.ToString()); } } using (UpdateQueryBuilder itemTable = new UpdateQueryBuilder("items")) { itemTable.SetColumn("slot", slotto); itemTable.SetColumn("inventory", invto); itemTable.SetWhereColumn("inventory", invfrom); itemTable.SetWhereColumn("slot", slotfrom); itemTable.SetWhereColumn("character_id", pConnection.CharacterInternalID); MySQL_Connection.Instance.RunQuery(itemTable.ToString()); } if (founditem) // Fix other slot { using (UpdateQueryBuilder itemTable = new UpdateQueryBuilder("items")) { itemTable.SetColumn("slot", slotfrom); itemTable.SetWhereColumn("inventory", invfrom); itemTable.SetWhereColumn("slot", slotfrom + 3000); itemTable.SetWhereColumn("character_id", pConnection.CharacterInternalID); MySQL_Connection.Instance.RunQuery(itemTable.ToString()); } } } else if (type4 == 9) { // Add item directly to bag inv -= 1; ItemBase item = ItemBase.DecodeItemData(pConnection, pPacket); short from = slot; byte slotfrom = (byte)(from % 100); byte bagfrom = (byte)(from / 100); slotfrom -= 1; bagfrom -= 1; ushort invfrom = GameHelper.GetBagID(bagfrom, inv); if (!inventory.BagItems.ContainsKey(invfrom)) continue; inventory.BagItems[invfrom].Items[slotfrom] = item; using (InsertQueryBuilder itemsTable = new InsertQueryBuilder("items")) { itemsTable.OnDuplicateUpdate = true; Queries.SaveItem(pConnection, invfrom, slotfrom, item, itemsTable); itemsTable.RunQuery(); } if (item is ItemPet) { var pet = item as ItemPet; using (InsertQueryBuilder petTable = new InsertQueryBuilder("pets")) { petTable.OnDuplicateUpdate = true; Queries.SavePet(pConnection.CharacterInternalID, pet, petTable); petTable.RunQuery(); } } } else if (type4 == 10) { pConnection.Logger_WriteLine("Player probably removed some bag item... O.o?"); } } } pConnection.SendTimeUpdate(); }
public void RemoveInfo(RestartInfo pInfo) { if (pInfo == null) return; using (DeleteQueryBuilder dqb = new DeleteQueryBuilder("session_restarts")) { dqb.SetWhereColumn("character_id", pInfo.CharacterID); dqb.SetWhereColumn("world_id", pInfo.WorldID); dqb.SetWhereColumn("ip", pInfo.IP); dqb.SetWhereColumn("machine_id", pInfo.MachineID); dqb.RunQuery(); } Cache.Remove(pInfo); }
public virtual void HandleMessage(ClientConnection pConnection, MaplePacket pPacket) { byte type = pPacket.ReadByte(); if (type == 0x0C) { ushort id = pPacket.ReadUShort(); string data = pPacket.ReadString(); // Server data update using (InsertQueryBuilder iqb = new InsertQueryBuilder("quests_running_party")) { iqb.OnDuplicateUpdate = true; iqb.AddColumn("character_id"); iqb.AddColumn("questid"); iqb.AddColumn("data", true); iqb.AddRow(pConnection.CharacterInternalID, id, data); iqb.RunQuery(); } } else if (type == 0x01) { ushort id = pPacket.ReadUShort(); byte mode = pPacket.ReadByte(); if (mode == 1) { string text = pPacket.ReadString(); using (InsertQueryBuilder iqb = new InsertQueryBuilder("quests_running")) { iqb.OnDuplicateUpdate = true; iqb.AddColumn("character_id"); iqb.AddColumn("questid"); iqb.AddColumn("data", true); iqb.AddRow(pConnection.CharacterInternalID, id, text); iqb.RunQuery(); } } else if (mode == 2) { // Quest complete long time = pPacket.ReadLong(); using (DeleteQueryBuilder dqb = new DeleteQueryBuilder("quests_running")) { dqb.SetWhereColumn("character_id", pConnection.CharacterInternalID); dqb.SetWhereColumn("questid", id); dqb.RunQuery(); } using (InsertQueryBuilder iqb = new InsertQueryBuilder("quests_done")) { iqb.OnDuplicateUpdate = true; iqb.AddColumn("character_id"); iqb.AddColumn("questid"); iqb.AddColumn("time", true); iqb.AddRow(pConnection.CharacterInternalID, id, time); iqb.RunQuery(); } } } }