public void addItem(uint[] itemId) { if (!isSpaceForAdd(itemId[0], itemId.Length)) { return; } //Update lists and db owner.queuePacket(InventoryBeginChangePacket.buildPacket(owner.actorId)); owner.queuePacket(InventorySetBeginPacket.buildPacket(owner.actorId, inventoryCapacity, inventoryCode)); int startPos = list.Count; //New item that spilled over for (int i = 0; i < itemId.Length; i++) { Item gItem = Server.getItemGamedata(itemId[i]); InventoryItem addedItem = Database.addItem(owner, itemId[i], 1, (byte)1, gItem.isExclusive ? (byte)0x3 : (byte)0x0, gItem.durability, inventoryCode); list.Add(addedItem); } sendInventoryPackets(startPos); owner.queuePacket(InventorySetEndPacket.buildPacket(owner.actorId)); owner.queuePacket(InventoryEndChangePacket.buildPacket(owner.actorId)); }
public void Equip(ushort slot, InventoryItem item) { if (slot >= list.Length) { return; } if (writeToDB) { Database.equipItem(owner, slot, item.uniqueId); } owner.queuePacket(InventoryBeginChangePacket.buildPacket(owner.actorId)); if (list[slot] != null) { normalInventory.RefreshItem(list[slot], item); } else { normalInventory.RefreshItem(item); } owner.queuePacket(InventorySetBeginPacket.buildPacket(owner.actorId, inventoryCapacity, inventoryCode)); SendEquipmentPackets(slot, item); owner.queuePacket(InventorySetEndPacket.buildPacket(owner.actorId)); owner.queuePacket(InventoryEndChangePacket.buildPacket(owner.actorId)); list[slot] = item; }
public void removeItem(ulong itemDBId) { ushort slot = 0; InventoryItem toDelete = null; foreach (InventoryItem item in list) { if (item.uniqueId == itemDBId) { toDelete = item; break; } slot++; } if (toDelete == null) { return; } int oldListSize = list.Count; list.RemoveAt(slot); Database.removeItem(owner, itemDBId, inventoryCode); //Realign slots for (int i = slot; i < list.Count; i++) { list[i].slot = (ushort)i; } owner.queuePacket(InventoryBeginChangePacket.buildPacket(owner.actorId)); owner.queuePacket(InventorySetBeginPacket.buildPacket(owner.actorId, inventoryCapacity, inventoryCode)); sendInventoryPackets(slot); sendInventoryRemovePackets(slot); if (slot != oldListSize - 1) { sendInventoryRemovePackets((ushort)(oldListSize - 1)); } owner.queuePacket(InventorySetEndPacket.buildPacket(owner.actorId)); if (inventoryCode == NORMAL) { owner.getEquipment().SendFullEquipment(false); } owner.queuePacket(InventoryEndChangePacket.buildPacket(owner.actorId)); }
public void SendFullEquipment(bool doClear) { List <ushort> slotsToUpdate = new List <ushort>(); for (ushort i = 0; i < list.Length; i++) { if (list[i] == null && doClear) { slotsToUpdate.Add(0); } else if (list[i] != null) { slotsToUpdate.Add(i); } } owner.queuePacket(InventorySetBeginPacket.buildPacket(owner.actorId, inventoryCapacity, inventoryCode)); SendEquipmentPackets(slotsToUpdate); owner.queuePacket(InventorySetEndPacket.buildPacket(owner.actorId)); }
public void SendCheckEquipmentToPlayer(Player toPlayer) { List <InventoryItem> items = new List <InventoryItem>(); for (ushort i = 0; i < list.Length; i++) { if (list[i] != null) { InventoryItem equipItem = new InventoryItem(list[i], i); items.Add(equipItem); } } toPlayer.queuePacket(InventorySetBeginPacket.buildPacket(owner.actorId, toPlayer.actorId, 0x23, Inventory.EQUIPMENT_OTHERPLAYER)); int currentIndex = 0; while (true) { if (items.Count - currentIndex >= 16) { toPlayer.queuePacket(InventoryListX16Packet.buildPacket(owner.actorId, toPlayer.actorId, items, ref currentIndex)); } else if (items.Count - currentIndex > 1) { toPlayer.queuePacket(InventoryListX08Packet.buildPacket(owner.actorId, toPlayer.actorId, items, ref currentIndex)); } else if (items.Count - currentIndex == 1) { toPlayer.queuePacket(InventoryListX01Packet.buildPacket(owner.actorId, toPlayer.actorId, items[currentIndex])); currentIndex++; } else { break; } } toPlayer.queuePacket(InventorySetEndPacket.buildPacket(owner.actorId, toPlayer.actorId)); }
public void removeItem(ushort slot) { if (slot >= list.Count) { return; } int oldListSize = list.Count; list.RemoveAt((int)slot); Database.removeItem(owner, slot, inventoryCode); //Realign slots for (int i = slot; i < list.Count; i++) { list[i].slot = (ushort)i; } owner.queuePacket(InventoryBeginChangePacket.buildPacket(owner.actorId)); owner.queuePacket(InventorySetBeginPacket.buildPacket(owner.actorId, inventoryCapacity, inventoryCode)); sendInventoryPackets(slot); sendInventoryRemovePackets(slot); if (slot != oldListSize - 1) { sendInventoryRemovePackets((ushort)(oldListSize - 1)); } owner.queuePacket(InventorySetEndPacket.buildPacket(owner.actorId)); if (inventoryCode == NORMAL) { owner.getEquipment().SendFullEquipment(false); } owner.queuePacket(InventoryEndChangePacket.buildPacket(owner.actorId)); }
public void Unequip(ushort slot) { if (slot >= list.Length) { return; } if (writeToDB) { Database.unequipItem(owner, slot); } owner.queuePacket(InventoryBeginChangePacket.buildPacket(owner.actorId)); normalInventory.RefreshItem(list[slot]); owner.queuePacket(InventorySetBeginPacket.buildPacket(owner.actorId, inventoryCapacity, inventoryCode)); SendEquipmentPackets(slot, null); owner.queuePacket(InventorySetEndPacket.buildPacket(owner.actorId)); owner.queuePacket(InventoryEndChangePacket.buildPacket(owner.actorId)); list[slot] = null; }
public void addItem(uint itemId, int quantity, byte quality) { if (!isSpaceForAdd(itemId, quantity)) { return; } Item gItem = Server.getItemGamedata(itemId); List <ushort> slotsToUpdate = new List <ushort>(); List <SubPacket> addItemPackets = new List <SubPacket>(); //Check if item id exists int quantityCount = quantity; for (int i = 0; i < list.Count; i++) { InventoryItem item = list[i]; if (item.itemId == itemId && item.quantity < gItem.maxStack) { slotsToUpdate.Add(item.slot); int oldQuantity = item.quantity; item.quantity = Math.Min(item.quantity + quantityCount, gItem.maxStack); quantityCount -= (gItem.maxStack - oldQuantity); if (quantityCount <= 0) { break; } } } //If it's unique, abort //if (quantityCount > 0 && storedItem.isUnique) // return ITEMERROR_UNIQUE; //If Inventory is full //if (quantityCount > 0 && isInventoryFull()) // return ITEMERROR_FULL; //Update lists and db owner.queuePacket(InventoryBeginChangePacket.buildPacket(owner.actorId)); owner.queuePacket(InventorySetBeginPacket.buildPacket(owner.actorId, inventoryCapacity, inventoryCode)); //These had their quantities changed foreach (ushort slot in slotsToUpdate) { Database.setQuantity(owner, slot, inventoryCode, list[slot].quantity); if (inventoryCode != CURRENCY && inventoryCode != KEYITEMS) { sendInventoryPackets(list[slot]); } } //New item that spilled over while (quantityCount > 0) { InventoryItem addedItem = Database.addItem(owner, itemId, Math.Min(quantityCount, gItem.maxStack), quality, gItem.isExclusive ? (byte)0x3 : (byte)0x0, gItem.durability, inventoryCode); list.Add(addedItem); if (inventoryCode != CURRENCY && inventoryCode != KEYITEMS) { sendInventoryPackets(addedItem); } quantityCount -= gItem.maxStack; } if (inventoryCode == CURRENCY || inventoryCode == KEYITEMS) { sendFullInventory(); } owner.queuePacket(InventorySetEndPacket.buildPacket(owner.actorId)); owner.queuePacket(InventoryEndChangePacket.buildPacket(owner.actorId)); }
public void RefreshItem(List <InventoryItem> items) { owner.queuePacket(InventorySetBeginPacket.buildPacket(owner.actorId, inventoryCapacity, inventoryCode)); sendInventoryPackets(items); owner.queuePacket(InventorySetEndPacket.buildPacket(owner.actorId)); }
public void sendFullInventory() { owner.queuePacket(InventorySetBeginPacket.buildPacket(owner.actorId, inventoryCapacity, inventoryCode)); sendInventoryPackets(0); owner.queuePacket(InventorySetEndPacket.buildPacket(owner.actorId)); }
public void removeItem(uint itemId, int quantity) { if (!hasItem(itemId, quantity)) { return; } List <ushort> slotsToUpdate = new List <ushort>(); List <InventoryItem> itemsToRemove = new List <InventoryItem>(); List <ushort> slotsToRemove = new List <ushort>(); List <SubPacket> addItemPackets = new List <SubPacket>(); //Remove as we go along int quantityCount = quantity; ushort lowestSlot = 0; for (int i = list.Count - 1; i >= 0; i--) { InventoryItem item = list[i]; if (item.itemId == itemId) { int oldQuantity = item.quantity; //Stack nomnomed if (item.quantity - quantityCount <= 0) { itemsToRemove.Add(item); slotsToRemove.Add(item.slot); } else { slotsToUpdate.Add(item.slot); item.quantity -= quantityCount; //Stack reduced } quantityCount -= oldQuantity; lowestSlot = item.slot; if (quantityCount <= 0) { break; } } } for (int i = 0; i < slotsToUpdate.Count; i++) { Database.setQuantity(owner, slotsToUpdate[i], inventoryCode, list[slotsToUpdate[i]].quantity); } int oldListSize = list.Count; for (int i = 0; i < itemsToRemove.Count; i++) { Database.removeItem(owner, itemsToRemove[i].uniqueId, inventoryCode); list.Remove(itemsToRemove[i]); } //Realign slots for (int i = lowestSlot; i < list.Count; i++) { list[i].slot = (ushort)i; } //Added tail end items that need to be cleared for slot realignment for (int i = oldListSize - 1; i >= oldListSize - itemsToRemove.Count; i--) { if (!slotsToRemove.Contains((ushort)i)) { slotsToRemove.Add((ushort)i); } } owner.queuePacket(InventoryBeginChangePacket.buildPacket(owner.actorId)); owner.queuePacket(InventorySetBeginPacket.buildPacket(owner.actorId, inventoryCapacity, inventoryCode)); sendInventoryPackets(lowestSlot); sendInventoryRemovePackets(slotsToRemove); owner.queuePacket(InventorySetEndPacket.buildPacket(owner.actorId)); if (inventoryCode == NORMAL) { owner.getEquipment().SendFullEquipment(false); } owner.queuePacket(InventoryEndChangePacket.buildPacket(owner.actorId)); }