Browse Source

Multisell rework for trade equipped items.
Remove unnecessary Inv updates.

JIV 15 years ago
parent
commit
644136d912

+ 1 - 52
L2_GameServer/java/com/l2jserver/gameserver/model/actor/instance/L2SignsPriestInstance.java

@@ -24,9 +24,7 @@ import com.l2jserver.gameserver.cache.HtmCache;
 import com.l2jserver.gameserver.model.L2ItemInstance;
 import com.l2jserver.gameserver.model.L2ItemInstance;
 import com.l2jserver.gameserver.model.actor.L2Npc;
 import com.l2jserver.gameserver.model.actor.L2Npc;
 import com.l2jserver.gameserver.network.SystemMessageId;
 import com.l2jserver.gameserver.network.SystemMessageId;
-import com.l2jserver.gameserver.network.serverpackets.InventoryUpdate;
 import com.l2jserver.gameserver.network.serverpackets.NpcHtmlMessage;
 import com.l2jserver.gameserver.network.serverpackets.NpcHtmlMessage;
-import com.l2jserver.gameserver.network.serverpackets.StatusUpdate;
 import com.l2jserver.gameserver.network.serverpackets.SystemMessage;
 import com.l2jserver.gameserver.network.serverpackets.SystemMessage;
 import com.l2jserver.gameserver.templates.chars.L2NpcTemplate;
 import com.l2jserver.gameserver.templates.chars.L2NpcTemplate;
 
 
@@ -56,8 +54,6 @@ public class L2SignsPriestInstance extends L2Npc
 		else if (command.startsWith("SevenSigns"))
 		else if (command.startsWith("SevenSigns"))
 		{
 		{
 			SystemMessage sm;
 			SystemMessage sm;
-			InventoryUpdate iu;
-			StatusUpdate su;
 
 
 			String path;
 			String path;
 
 
@@ -114,12 +110,7 @@ public class L2SignsPriestInstance extends L2Npc
 					player.sendPacket(new SystemMessage(SystemMessageId.YOU_NOT_ENOUGH_ADENA));
 					player.sendPacket(new SystemMessage(SystemMessageId.YOU_NOT_ENOUGH_ADENA));
 					break;
 					break;
 				}
 				}
-				L2ItemInstance recordSevenSigns = player.getInventory().addItem("SevenSigns", SevenSigns.RECORD_SEVEN_SIGNS_ID, 1, player, this);
-
-				// Send inventory update packet
-				iu = new InventoryUpdate();
-				iu.addNewItem(recordSevenSigns);
-				sendPacket(iu);
+				player.getInventory().addItem("SevenSigns", SevenSigns.RECORD_SEVEN_SIGNS_ID, 1, player, this);
 
 
 				sm = new SystemMessage(SystemMessageId.EARNED_ITEM);
 				sm = new SystemMessage(SystemMessageId.EARNED_ITEM);
 				sm.addItemName(SevenSigns.RECORD_SEVEN_SIGNS_ID);
 				sm.addItemName(SevenSigns.RECORD_SEVEN_SIGNS_ID);
@@ -554,11 +545,6 @@ public class L2SignsPriestInstance extends L2Npc
 				player.reduceAncientAdena("SevenSigns", ancientAdenaConvert, this, true);
 				player.reduceAncientAdena("SevenSigns", ancientAdenaConvert, this, true);
 				player.addAdena("SevenSigns", ancientAdenaConvert, this, true);
 				player.addAdena("SevenSigns", ancientAdenaConvert, this, true);
 
 
-				iu = new InventoryUpdate();
-				iu.addModifiedItem(player.getInventory().getAncientAdenaInstance());
-				iu.addModifiedItem(player.getInventory().getAdenaInstance());
-				player.sendPacket(iu);
-
 				showChatWindow(player, SevenSigns.SEVEN_SIGNS_HTML_PATH + "blkmrkt_5.htm");
 				showChatWindow(player, SevenSigns.SEVEN_SIGNS_HTML_PATH + "blkmrkt_5.htm");
 				break;
 				break;
 			case 9: // Receive Contribution Rewards
 			case 9: // Receive Contribution Rewards
@@ -580,16 +566,6 @@ public class L2SignsPriestInstance extends L2Npc
 
 
 					player.addAncientAdena("SevenSigns", ancientAdenaReward, this, true);
 					player.addAncientAdena("SevenSigns", ancientAdenaReward, this, true);
 
 
-					// Send inventory update packet
-					iu = new InventoryUpdate();
-					iu.addModifiedItem(player.getInventory().getAncientAdenaInstance());
-					sendPacket(iu);
-
-					// Update current load as well
-					su = new StatusUpdate(player.getObjectId());
-					su.addAttribute(StatusUpdate.CUR_LOAD, player.getCurrentLoad());
-					sendPacket(su);
-
 					if (this instanceof L2DawnPriestInstance)
 					if (this instanceof L2DawnPriestInstance)
 						showChatWindow(player, 9, "dawn_a", false);
 						showChatWindow(player, 9, "dawn_a", false);
 					else
 					else
@@ -683,22 +659,6 @@ public class L2SignsPriestInstance extends L2Npc
 
 
 					player.addAncientAdena("SevenSigns", ancientAdenaRewardAll, this, true);
 					player.addAncientAdena("SevenSigns", ancientAdenaRewardAll, this, true);
 
 
-					// Send inventory update packet
-					iu = new InventoryUpdate();
-					iu.addModifiedItem(player.getInventory().getAncientAdenaInstance());
-					if (blueStonesAll != null)
-						iu.addModifiedItem(blueStonesAll);
-					if (greenStonesAll != null)
-						iu.addModifiedItem(greenStonesAll);
-					if (redStonesAll != null)
-						iu.addModifiedItem(redStonesAll);
-					sendPacket(iu);
-
-					// Update current load as well
-					su = new StatusUpdate(player.getObjectId());
-					su.addAttribute(StatusUpdate.CUR_LOAD, player.getCurrentLoad());
-					sendPacket(su);
-
 					if (this instanceof L2DawnPriestInstance)
 					if (this instanceof L2DawnPriestInstance)
 						showChatWindow(player, 18, "dawn", false);
 						showChatWindow(player, 18, "dawn", false);
 					else
 					else
@@ -776,17 +736,6 @@ public class L2SignsPriestInstance extends L2Npc
 						{
 						{
 							player.addAncientAdena("SevenSigns", ancientAdenaReward, this, true);
 							player.addAncientAdena("SevenSigns", ancientAdenaReward, this, true);
 
 
-							// Send inventory update packet
-							iu = new InventoryUpdate();
-							iu.addModifiedItem(player.getInventory().getAncientAdenaInstance());
-							iu.addModifiedItem(convertItem);
-							sendPacket(iu);
-
-							// Update current load as well
-							su = new StatusUpdate(player.getObjectId());
-							su.addAttribute(StatusUpdate.CUR_LOAD, player.getCurrentLoad());
-							sendPacket(su);
-
 							if (this instanceof L2DawnPriestInstance)
 							if (this instanceof L2DawnPriestInstance)
 								showChatWindow(player, 18, "dawn", false);
 								showChatWindow(player, 18, "dawn", false);
 							else
 							else

+ 11 - 8
L2_GameServer/java/com/l2jserver/gameserver/model/itemcontainer/ItemContainer.java

@@ -152,29 +152,32 @@ public abstract class ItemContainer
 		return null;
 		return null;
 	}
 	}
 	
 	
+	/**
+	 * @see  com.l2jserver.gameserver.model.itemcontainer.ItemContainer#getInventoryItemCount(int, int, boolean)
+	 */
+	public long getInventoryItemCount(int itemId, int enchantLevel)
+	{
+		return getInventoryItemCount(itemId, enchantLevel, true);
+	}
+	
 	/**
 	/**
 	 * Gets count of item in the inventory
 	 * Gets count of item in the inventory
 	 * @param itemId : Item to look for
 	 * @param itemId : Item to look for
 	 * @param enchantLevel : enchant level to match on, or -1 for ANY enchant level
 	 * @param enchantLevel : enchant level to match on, or -1 for ANY enchant level
+	 * @param includeEquipped : include equipped items
 	 * @return int corresponding to the number of items matching the above conditions.
 	 * @return int corresponding to the number of items matching the above conditions.
 	 */
 	 */
-	public long getInventoryItemCount(int itemId, int enchantLevel)
+	public long getInventoryItemCount(int itemId, int enchantLevel, boolean includeEquipped)
 	{
 	{
 		long count = 0;
 		long count = 0;
 		
 		
 		for (L2ItemInstance item : _items)
 		for (L2ItemInstance item : _items)
-		{
-			if (item == null)
-				continue;
-
-			if (item.getItemId() == itemId
-					&& ((item.getEnchantLevel() == enchantLevel) || (enchantLevel < 0)))
+			if (item.getItemId() == itemId && ((item.getEnchantLevel() == enchantLevel) || (enchantLevel < 0)) && (includeEquipped || !item.isEquipped()))
 				//if (item.isAvailable((L2PcInstance)getOwner(), true) || item.getItem().getType2() == 3)//available or quest item
 				//if (item.isAvailable((L2PcInstance)getOwner(), true) || item.getItem().getType2() == 3)//available or quest item
 				if (item.isStackable())
 				if (item.isStackable())
 					count = item.getCount();
 					count = item.getCount();
 				else
 				else
 					count++;
 					count++;
-		}
 		
 		
 		return count;
 		return count;
 	}
 	}

+ 25 - 4
L2_GameServer/java/com/l2jserver/gameserver/model/itemcontainer/PcInventory.java

@@ -138,32 +138,53 @@ public class PcInventory extends Inventory
 		return list.toArray(new L2ItemInstance[list.size()]);
 		return list.toArray(new L2ItemInstance[list.size()]);
 	}
 	}
 
 
+	/**
+	 * @see net.sf.l2j.gameserver.model.itemcontainer.PcInventory#getAllItemsByItemId(int, boolean)
+	 */
+	public L2ItemInstance[] getAllItemsByItemId(int itemId)
+	{
+		return getAllItemsByItemId(itemId, true);
+	}
+	
 	/**
 	/**
 	 * Returns the list of all items in inventory that have a given item id.
 	 * Returns the list of all items in inventory that have a given item id.
+	 * @param itemId : ID of item
+	 * @param includeEquipped : include equipped items
 	 * @return L2ItemInstance[] : matching items from inventory
 	 * @return L2ItemInstance[] : matching items from inventory
 	 */
 	 */
-	public L2ItemInstance[] getAllItemsByItemId(int itemId)
+	public L2ItemInstance[] getAllItemsByItemId(int itemId, boolean includeEquipped)
 	{
 	{
 		List<L2ItemInstance> list = new FastList<L2ItemInstance>();
 		List<L2ItemInstance> list = new FastList<L2ItemInstance>();
 		for (L2ItemInstance item : _items)
 		for (L2ItemInstance item : _items)
 		{
 		{
-			if (item.getItemId() == itemId)
+			if (item.getItemId() == itemId && (includeEquipped || !item.isEquipped()))
 				list.add(item);
 				list.add(item);
 		}
 		}
 
 
 		return list.toArray(new L2ItemInstance[list.size()]);
 		return list.toArray(new L2ItemInstance[list.size()]);
 	}
 	}
 
 
+	/**
+	 * @see net.sf.l2j.gameserver.model.itemcontainer.PcInventory#getAllItemsByItemId(int, int, boolean)
+	 */
+	public L2ItemInstance[] getAllItemsByItemId(int itemId, int enchantment)
+	{
+		return getAllItemsByItemId(itemId, enchantment, true);
+	}
+	
 	/**
 	/**
 	 * Returns the list of all items in inventory that have a given item id AND a given enchantment level.
 	 * Returns the list of all items in inventory that have a given item id AND a given enchantment level.
+	 * @param itemId : ID of item
+	 * @param enchantment : enchant level of item
+	 * @param includeEquipped : include equipped items
 	 * @return L2ItemInstance[] : matching items from inventory
 	 * @return L2ItemInstance[] : matching items from inventory
 	 */
 	 */
-	public L2ItemInstance[] getAllItemsByItemId(int itemId, int enchantment)
+	public L2ItemInstance[] getAllItemsByItemId(int itemId, int enchantment, boolean includeEquipped)
 	{
 	{
 		List<L2ItemInstance> list = new FastList<L2ItemInstance>();
 		List<L2ItemInstance> list = new FastList<L2ItemInstance>();
 		for (L2ItemInstance item : _items)
 		for (L2ItemInstance item : _items)
 		{
 		{
-			if ((item.getItemId() == itemId) && (item.getEnchantLevel() == enchantment))
+			if ((item.getItemId() == itemId) && (item.getEnchantLevel() == enchantment) && (includeEquipped || !item.isEquipped()))
 				list.add(item);
 				list.add(item);
 		}
 		}
 
 

+ 5 - 5
L2_GameServer/java/com/l2jserver/gameserver/network/clientpackets/MultiSellChoose.java

@@ -246,7 +246,7 @@ public class MultiSellChoose extends L2GameClientPacket
 				{
 				{
 					// if this is not a list that maintains enchantment, check the count of all items that have the given id.
 					// if this is not a list that maintains enchantment, check the count of all items that have the given id.
 					// otherwise, check only the count of items with exactly the needed enchantment level
 					// otherwise, check only the count of items with exactly the needed enchantment level
-					if (inv.getInventoryItemCount(e.getItemId(), maintainEnchantment ? e.getEnchantmentLevel() : -1) < ((Config.ALT_BLACKSMITH_USE_RECIPES || !e.getMantainIngredient()) ? (e.getItemCount() * _amount) : e.getItemCount()))
+					if (inv.getInventoryItemCount(e.getItemId(), maintainEnchantment ? e.getEnchantmentLevel() : -1, false) < ((Config.ALT_BLACKSMITH_USE_RECIPES || !e.getMantainIngredient()) ? (e.getItemCount() * _amount) : e.getItemCount()))
 					{
 					{
 						player.sendPacket(new SystemMessage(SystemMessageId.NOT_ENOUGH_REQUIRED_ITEMS));//Update by rocknow
 						player.sendPacket(new SystemMessage(SystemMessageId.NOT_ENOUGH_REQUIRED_ITEMS));//Update by rocknow
 						_ingredientsList.clear();
 						_ingredientsList.clear();
@@ -295,11 +295,11 @@ public class MultiSellChoose extends L2GameClientPacket
 						return;
 						return;
 					}
 					}
 					
 					
-					if (itemToTake.isEquipped())
+					/*if (itemToTake.isEquipped())
 					{ //this is a cheat, transaction will be aborted and if any items already taken will not be returned back to inventory!
 					{ //this is a cheat, transaction will be aborted and if any items already taken will not be returned back to inventory!
 						_log.severe("Character: " + player.getName() + " is trying to cheat in multisell, exchanging equipped item, merchatnt id:" + merchant.getNpcId());
 						_log.severe("Character: " + player.getName() + " is trying to cheat in multisell, exchanging equipped item, merchatnt id:" + merchant.getNpcId());
 						return;
 						return;
-					}
+					}*/
 
 
 					if (itemToTake.isWear())
 					if (itemToTake.isWear())
 					{//Player trying to buy something from the Multisell store with an item that's just being used from the Wear option from merchants.
 					{//Player trying to buy something from the Multisell store with an item that's just being used from the Wear option from merchants.
@@ -325,7 +325,7 @@ public class MultiSellChoose extends L2GameClientPacket
 							if (maintainEnchantment)
 							if (maintainEnchantment)
 							{
 							{
 								// loop through this list and remove (one by one) each item until the required amount is taken.
 								// loop through this list and remove (one by one) each item until the required amount is taken.
-								L2ItemInstance[] inventoryContents = inv.getAllItemsByItemId(e.getItemId(), e.getEnchantmentLevel());
+								L2ItemInstance[] inventoryContents = inv.getAllItemsByItemId(e.getItemId(), e.getEnchantmentLevel(), false);
 								for (int i = 0; i < (e.getItemCount() * _amount); i++)
 								for (int i = 0; i < (e.getItemCount() * _amount); i++)
 								{
 								{
 									if (inventoryContents[i].isAugmented())
 									if (inventoryContents[i].isAugmented())
@@ -376,7 +376,7 @@ public class MultiSellChoose extends L2GameClientPacket
 								// choice 1.  Small number of items exchanged.  No sorting.
 								// choice 1.  Small number of items exchanged.  No sorting.
 								for (int i = 1; i <= (e.getItemCount() * _amount); i++)
 								for (int i = 1; i <= (e.getItemCount() * _amount); i++)
 								{
 								{
-									L2ItemInstance[] inventoryContents = inv.getAllItemsByItemId(e.getItemId());
+									L2ItemInstance[] inventoryContents = inv.getAllItemsByItemId(e.getItemId(), false);
 									
 									
 									itemToTake = inventoryContents[0];
 									itemToTake = inventoryContents[0];
 									// get item with the LOWEST enchantment level  from the inventory...
 									// get item with the LOWEST enchantment level  from the inventory...