/// <summary> /// Create a new item. /// </summary> /// <param name="player">Player entity</param> /// <param name="e"></param> private void CreateItem(IPlayerEntity player, InventoryCreateItemEventArgs e) { ItemData itemData = e.ItemData; if (itemData.IsStackable) { // TODO: stackable items } else { for (var i = 0; i < e.Quantity; i++) { int availableSlot = player.Inventory.GetAvailableSlot(); if (availableSlot < 0) { WorldPacketFactory.SendDefinedText(player, DefineText.TID_GAME_LACKSPACE); break; } Logger.Debug("Available slot: {0}", availableSlot); var newItem = new Item(e.ItemId, 1, e.CreatorId) { Slot = availableSlot, UniqueId = availableSlot, }; player.Inventory.Items[availableSlot] = newItem; WorldPacketFactory.SendItemCreation(player, newItem); } } }
public static void CreateItem(IPlayerEntity player, string[] parameters) { Logger.Debug("{0} want to create an item", player.Object.Name); if (parameters.Length <= 0) { Logger.Error("Chat: /createitem command must have at least one parameter."); return; } if (!player.Inventory.HasAvailableSlots()) { WorldPacketFactory.SendDefinedText(player, DefineText.TID_GAME_LACKSPACE); return; } var quantity = 1; if (!int.TryParse(parameters[0], out int itemId)) { ItemData itemData = GameResources.Instance.Items[parameters[0]]; itemId = itemData?.Id ?? -1; } if (parameters.Length >= 2) { int.TryParse(parameters[1], out quantity); } var createItemEvent = new InventoryCreateItemEventArgs(itemId, quantity, player.PlayerData.Id); player.NotifySystem <InventorySystem>(createItemEvent); }
/// <summary> /// Verify all conditions to pickup a dropped item. /// </summary> /// <param name="player">The player trying to pick-up the dropped item.</param> /// <param name="droppedItem">The dropped item.</param> private void PickUpDroppedItem(IPlayerEntity player, IItemEntity droppedItem) { // TODO: check if drop belongs to a party. if (droppedItem.Drop.HasOwner && droppedItem.Drop.Owner != player) { WorldPacketFactory.SendDefinedText(player, DefineText.TID_GAME_PRIORITYITEMPER, $"\"{droppedItem.Object.Name}\""); return; } if (droppedItem.Drop.IsGold) { int droppedGoldAmount = droppedItem.Drop.Item.Quantity; long gold = player.PlayerData.Gold + droppedGoldAmount; if (gold > int.MaxValue || gold < 0) // Check gold overflow { WorldPacketFactory.SendDefinedText(player, DefineText.TID_GAME_TOOMANYMONEY_USE_PERIN); return; } else { player.PlayerData.Gold = (int)gold; WorldPacketFactory.SendUpdateAttributes(player, DefineAttributes.GOLD, player.PlayerData.Gold); WorldPacketFactory.SendDefinedText(player, DefineText.TID_GAME_REAPMONEY, droppedGoldAmount.ToString("###,###,###,###"), gold.ToString("###,###,###,###")); } } else { var inventoryItemCreationEvent = new InventoryCreateItemEventArgs(droppedItem.Drop.Item.Id, droppedItem.Drop.Item.Quantity, -1, droppedItem.Drop.Item.Refine); player.NotifySystem <InventorySystem>(inventoryItemCreationEvent); WorldPacketFactory.SendDefinedText(player, DefineText.TID_GAME_REAPITEM, $"\"{droppedItem.Object.Name}\""); } WorldPacketFactory.SendMotion(player, ObjectMessageType.OBJMSG_PICKUP); droppedItem.Delete(); }
/// <summary> /// Create a new item. /// </summary> /// <param name="player">Player entity</param> /// <param name="e"></param> private void ProcessCreateItem(IPlayerEntity player, InventoryCreateItemEventArgs e) { ItemData itemData = e.ItemData; if (itemData.IsStackable) { int quantity = Math.Min(e.Quantity, itemData.PackMax); for (int i = 0; i < EquipOffset; i++) { Item inventoryItem = player.Inventory.Items[i]; if (inventoryItem == null) { continue; } if (inventoryItem.Id == e.ItemId) { if (inventoryItem.Quantity + quantity > itemData.PackMax) { inventoryItem.Quantity = itemData.PackMax; quantity -= itemData.PackMax - inventoryItem.Quantity; } else { inventoryItem.Quantity += quantity; quantity = 0; } WorldPacketFactory.SendItemUpdate(player, UpdateItemType.UI_NUM, inventoryItem.UniqueId, inventoryItem.Quantity); } } if (quantity > 0) { if (!player.Inventory.HasAvailableSlots()) { WorldPacketFactory.SendDefinedText(player, DefineText.TID_GAME_LACKSPACE); } else { var item = new Item(e.ItemId, quantity, -1); if (player.Inventory.CreateItem(item)) { WorldPacketFactory.SendItemCreation(player, item); } else { Logger.LogError("Inventory: Failed to create item."); } } } } else { for (var i = 0; i < e.Quantity; i++) { int availableSlot = player.Inventory.GetAvailableSlot(); if (availableSlot < 0) { WorldPacketFactory.SendDefinedText(player, DefineText.TID_GAME_LACKSPACE); break; } var newItem = new Item(e.ItemId, 1, e.CreatorId) { Slot = availableSlot, UniqueId = player.Inventory.Items[availableSlot].UniqueId, Refine = (byte)Math.Max(e.Refine, 0) }; player.Inventory.Items[availableSlot] = newItem; WorldPacketFactory.SendItemCreation(player, newItem); } } }