xenapopalus 0 Опубликовано 14 февраля, 2012 в общем трабла такова: когда пихаю в мультиселл ID 4ёх значные типа 9856,9857 и т.д. всё чики-пики а вот когда 5ти значные типа 10000 или 50000 - непонятная ошибки как исправить? понимаю что проще сделать всё 4ёх значное но свободных ID 4ёх значных уже не осталось Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты
DarkLight 1 Опубликовано 14 февраля, 2012 проблема в том , что сервак неможет принимать такие большие цифры, ставь поменьше и будет всё ок, незнаю просто сервер не может тупо прочить и всё, я незнаю почему но не хочет. так, что ставь малые цыфорки З.Ы ставь цыфры меньше 9999 Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты
BlackDream 321 Опубликовано 14 февраля, 2012 непомню точно но там вроде бы есть лимит какойто толи 50к максимум толи чета в етом роде) Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты
revars 2 Опубликовано 14 февраля, 2012 По-моему лимит 65к. Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты
Saick 46 Опубликовано 14 февраля, 2012 Блин его убрать 1 мин дела Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты
DarkLight 1 Опубликовано 14 февраля, 2012 Блин его убрать 1 мин дела Ты насчёт лимита? А можешь рассказать как, а то очень давно интересуюсь этим делом ,но никак руки не доходят до этого. Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты
Saick 46 Опубликовано 14 февраля, 2012 Ты насчёт лимита? А можешь рассказать как, а то очень давно интересуюсь этим делом ,но никак руки не доходят до этого. исходники есть? Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты
DarkLight 1 Опубликовано 14 февраля, 2012 имеются исходники Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты
Saick 46 Опубликовано 14 февраля, 2012 MultiSellChoose.java в етом файле Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты
xenapopalus 0 Опубликовано 14 февраля, 2012 MultiSellChoose.javaв етом файле может подскажешь как на фрозенах этот лимит убрать? Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты
xenapopalus 0 Опубликовано 14 февраля, 2012 проблема в том , что сервак неможет принимать такие большие цифры, ставь поменьше и будет всё ок, незнаю просто сервер не может тупо прочить и всё, я незнаю почему но не хочет. так, что ставь малые цыфорки З.Ы ставь цыфры меньше 9999 до этого я и сам допёр но я уже объяснил что не могу ставить меньше 9999 - ибо всё занято Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты
DarkLight 1 Опубликовано 14 февраля, 2012 до этого я и сам допёрно я уже объяснил что не могу ставить меньше 9999 - ибо всё занято Почитай выше , и попробуй сделать, похимичь, в этом мире всё возможно ) Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты
Saick 46 Опубликовано 14 февраля, 2012 Скрытый текстpackage net.sf.l2j.gameserver.network.clientpackets;import java.util.List;import java.util.logging.Logger;import javolution.util.FastList;import net.sf.l2j.Config;import net.sf.l2j.gameserver.datatables.ItemTable;import net.sf.l2j.gameserver.model.L2Augmentation;import net.sf.l2j.gameserver.model.L2ItemInstance;import net.sf.l2j.gameserver.model.L2Multisell;import net.sf.l2j.gameserver.model.PcInventory;import net.sf.l2j.gameserver.model.L2Multisell.MultiSellEntry;import net.sf.l2j.gameserver.model.L2Multisell.MultiSellIngredient;import net.sf.l2j.gameserver.model.L2Multisell.MultiSellListContainer;import net.sf.l2j.gameserver.model.actor.instance.L2NpcInstance;import net.sf.l2j.gameserver.model.actor.instance.L2PcInstance;import net.sf.l2j.gameserver.network.SystemMessageId;import net.sf.l2j.gameserver.network.serverpackets.ItemList;import net.sf.l2j.gameserver.network.serverpackets.PledgeShowInfoUpdate;import net.sf.l2j.gameserver.network.serverpackets.StatusUpdate;import net.sf.l2j.gameserver.network.serverpackets.SystemMessage;import net.sf.l2j.gameserver.templates.L2Armor;import net.sf.l2j.gameserver.templates.L2Item;import net.sf.l2j.gameserver.templates.L2Weapon;import net.sf.l2j.gameserver.util.FloodProtector;import net.sf.l2j.gameserver.util.Util;public class MultiSellChoose extends L2GameClientPacket{ private static final String _C__A7_MULTISELLCHOOSE = "[C] A7 MultiSellChoose"; private static Logger _log = Logger.getLogger(MultiSellChoose.class.getName()); private int _listId; private int _entryId; private int _amount; private int _enchantment; private int _transactionTax; // local handling of taxation private int _enchantCheck = 0; @Override protected void readImpl() { _listId = readD(); _entryId = readD(); _amount = readD(); // _enchantment = readH(); // <---commented this line because it did NOT work! _enchantment = _entryId % 100000; _entryId = _entryId / 100000; _transactionTax = 0; // initialize tax amount to 0... } @Override public void runImpl() { if(_amount < 1 || _amount > Config.MAX_MULTISELL) return; MultiSellListContainer list = L2Multisell.getInstance().getList(_listId); if(list == null) return; L2PcInstance player = getClient().getActiveChar(); if(player == null) return; for(MultiSellEntry entry : list.getEntries()) { if(entry.getEntryId() == _entryId) { doExchange(player,entry,list.getApplyTaxes(), list.getMaintainEnchantment(), _enchantment, list.getBidNpcId()); return; } } } private void doExchange(L2PcInstance player, MultiSellEntry templateEntry, boolean applyTaxes, boolean maintainEnchantment, int enchantment, String bidNpcId) { PcInventory inv = player.getInventory(); boolean maintainItemFound = false; if (!FloodProtector.getInstance().tryPerformAction(player.getObjectId(), FloodProtector.PROTECTED_MULTISELL)) { player.sendMessage("You can buy every 1 Second!."); return; } // given the template entry and information about maintaining enchantment and applying taxes // re-create the instance of the entry that will be used for this exchange // i.e. change the enchantment level of select ingredient/products and adena amount appropriately. L2NpcInstance merchant = (player.getTarget() instanceof L2NpcInstance)? (L2NpcInstance) player.getTarget() : null; if (merchant == null) return; MultiSellEntry entry = prepareEntry(merchant, templateEntry, applyTaxes, maintainEnchantment, enchantment); for(MultiSellIngredient e : entry.getProducts()) { if (!ItemTable.getInstance().createDummyItem(e.getItemId()).isStackable() && _amount > (player.GetInventoryLimit() - player.getInventory().getSize())) { player.sendPacket(new SystemMessage(SystemMessageId.YOU_HAVE_EXCEEDED_QUANTITY_THAT_CAN_BE_INPUTTED)); return; } } if (bidNpcId != null) { List<Integer> Result = new FastList<Integer>(); for (String id : bidNpcId.split(",")) { Result.add(Integer.parseInt(id)); } if(!Result.contains(merchant.getNpcId())) { Util.handleIllegalPlayerAction(player,"Player "+player.getName()+" tried to use multisell Exploit!", Config.DEFAULT_PUNISH); return; } } // Generate a list of distinct ingredients and counts in order to check if the correct item-counts // are possessed by the player FastList<MultiSellIngredient> _ingredientsList = new FastList<MultiSellIngredient>(); boolean newIng = true; for(MultiSellIngredient e: entry.getIngredients()) { newIng = true; // at this point, the template has already been modified so that enchantments are properly included // whenever they need to be applied. Uniqueness of items is thus judged by item id AND enchantment level for(MultiSellIngredient ex: _ingredientsList) { // if the item was already added in the list, merely increment the count // this happens if 1 list entry has the same ingredient twice (example 2 swords = 1 dual) if( (ex.getItemId() == e.getItemId()) && (ex.getEnchantmentLevel() == e.getEnchantmentLevel()) ) { if ((double)ex.getItemCount() + e.getItemCount() > Integer.MAX_VALUE) { player.sendPacket(new SystemMessage(SystemMessageId.YOU_HAVE_EXCEEDED_QUANTITY_THAT_CAN_BE_INPUTTED)); _ingredientsList.clear(); _ingredientsList = null; return; } ex.setItemCount(ex.getItemCount() + e.getItemCount()); newIng = false; } } if(newIng) { if (maintainEnchantment || e.getMantainIngredient()) { maintainItemFound = true; } // if it's a new ingredient, just store its info directly (item id, count, enchantment) _ingredientsList.add(L2Multisell.getInstance().new MultiSellIngredient(e)); } } if (!maintainItemFound) { for (MultiSellIngredient product : entry.getProducts()) { product.setEnchantmentLevel(0); } } // now check if the player has sufficient items in the inventory to cover the ingredients' expences for(MultiSellIngredient e : _ingredientsList) { if((double)e.getItemCount() * _amount > Integer.MAX_VALUE ) { player.sendPacket(new SystemMessage(SystemMessageId.YOU_HAVE_EXCEEDED_QUANTITY_THAT_CAN_BE_INPUTTED)); _ingredientsList.clear(); _ingredientsList = null; return; } if(e.getItemId() !=65336 && e.getItemId() !=65436) { // 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 if( inv.getInventoryItemCount(e.getItemId(), maintainEnchantment? e.getEnchantmentLevel() : -1) < ((Config.ALT_BLACKSMITH_USE_RECIPES || !e.getMantainIngredient()) ? (e.getItemCount() * _amount) : e.getItemCount()) ) { player.sendPacket(new SystemMessage(SystemMessageId.NOT_ENOUGH_ITEMS)); _ingredientsList.clear(); _ingredientsList = null; return; } } if(e.getItemId() == 65336) { if(player.getClan() == null) { player.sendPacket(new SystemMessage(SystemMessageId.YOU_ARE_NOT_A_CLAN_MEMBER)); return; } if(!player.isClanLeader()) { player.sendPacket(new SystemMessage(SystemMessageId.ONLY_THE_CLAN_LEADER_IS_ENABLED)); return; } if(player.getClan().getReputationScore() < e.getItemCount() * _amount) { player.sendPacket(new SystemMessage(SystemMessageId.THE_CLAN_REPUTATION_SCORE_IS_TOO_LOW)); return; } } if(e.getItemId() == 65436) { if((e.getItemCount()*_amount) > player.getPcCafeScore()) { player.sendPacket(new SystemMessage(SystemMessageId.NOT_ENOUGH_ITEMS)); return; } } } _ingredientsList.clear(); _ingredientsList = null; FastList<L2Augmentation> augmentation = new FastList<L2Augmentation>(); /** All ok, remove items and add final product */ for(MultiSellIngredient e : entry.getIngredients()) { if(e.getItemId()!=65336 && e.getItemId()!=65436) { L2ItemInstance itemToTake = inv.getItemByItemId(e.getItemId()); // initialize and initial guess for the item to take. if (itemToTake == null) { _log.severe("Character: " + player.getName() + " is trying to cheat in multisell, merchatnt id:" + merchant.getNpcId()); return; } 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. _log.severe("Character: " + player.getName() + " is trying to cheat in multisell, merchatnt id:" + merchant.getNpcId()); return; } { L2Item tempItem = ItemTable.getInstance().createDummyItem(e.getItemId()).getItem(); if ((tempItem instanceof L2Armor) || (tempItem instanceof L2Weapon)) _enchantCheck = e.getEnchantmentLevel(); } if (Config.ALT_BLACKSMITH_USE_RECIPES || !e.getMantainIngredient()) { // if it's a stackable item, just reduce the amount from the first (only) instance that is found in the inventory if (itemToTake.isStackable()) { if (!player.destroyItem("Multisell", itemToTake.getObjectId(), (e.getItemCount() * _amount), player.getTarget(), true)) return; } else { // for non-stackable items, one of two scenaria are possible: // a) list maintains enchantment: get the instances that exactly match the requested enchantment level // list does not maintain enchantment: get the instances with the LOWEST enchantment level // a) if enchantment is maintained, then get a list of items that exactly match this enchantment if (maintainEnchantment) { L2ItemInstance[] inventoryContents = inv.getAllItemsByItemId(e.getItemId(), e.getEnchantmentLevel()); for (int i = 0; i < (e.getItemCount() * _amount); i++) { if (inventoryContents.isAugmented()) augmentation.add(inventoryContents.getAugmentation()); if (!player.destroyItem("Multisell", inventoryContents.getObjectId(), 1, player.getTarget(), true)) return; } } else // enchantment is not maintained. Get the instances with the LOWEST enchantment level { // choice 1. Small number of items exchanged. No sorting. for (int i = 1; i <= (e.getItemCount() * _amount); i++) { L2ItemInstance[] inventoryContents = inv.getAllItemsByItemId(e.getItemId()); itemToTake = inventoryContents[0]; // get item with the LOWEST enchantment level from the inventory... // +0 is lowest by default... if (itemToTake.getEnchantLevel() > 0) { for (int j = 0; j < inventoryContents.length; j++) { if (inventoryContents[j].getEnchantLevel() < itemToTake.getEnchantLevel()) { itemToTake = inventoryContents[j]; // nothing will have enchantment less than 0. If a zero-enchanted // item is found, just take it if (itemToTake.getEnchantLevel() == 0) break; } } } if (!player.destroyItem("Multisell", itemToTake.getObjectId(), 1, player.getTarget(), true)) return; } } } } } else { if (e.getItemId() == 65336) { int repCost = player.getClan().getReputationScore() - e.getItemCount() * _amount; player.getClan().setReputationScore(repCost, true); SystemMessage smsg = new SystemMessage(SystemMessageId.S1_DEDUCTED_FROM_CLAN_REP); smsg.addNumber(e.getItemCount()); player.sendPacket(smsg); player.getClan().broadcastToOnlineMembers(new PledgeShowInfoUpdate(player.getClan())); } else { player.reducePcCafeScore(e.getItemCount()*_amount); player.sendPacket((new SystemMessage(1709)).addNumber(e.getItemCount())); } } } // Generate the appropriate items for(MultiSellIngredient e : entry.getProducts()) { if (_enchantCheck < e.getEnchantmentLevel()) { L2Item tempItem = ItemTable.getInstance().createDummyItem(e.getItemId()).getItem(); if ((tempItem instanceof L2Armor) || (tempItem instanceof L2Weapon)) { player.sendMessage("Ohh Cheat dont work? You have a problem now!"); Util.handleIllegalPlayerAction(player,"Warning!! Character "+player.getName()+" of account "+player.getAccountName()+" trying to enchant cheat.", Config.DEFAULT_PUNISH); return; } } if (ItemTable.getInstance().createDummyItem(e.getItemId()).isStackable()) { inv.addItem("Multisell", e.getItemId(), (e.getItemCount() * _amount), player, player.getTarget()); } else { L2ItemInstance product = null; for (int i = 0; i < (e.getItemCount() * _amount); i++) { product = inv.addItem("Multisell", e.getItemId(), 1, player, player.getTarget()); if (Config.ENABLE_MODIFY_ENCHANT_MULTISELL) { if (Config.ENCHANT_MULTISELL_LIST.containsKey(_listId)) { product.setEnchantLevel(Config.ENCHANT_MULTISELL_LIST.get(_listId)); } } if (maintainEnchantment) { if (i < augmentation.size()) { product.setAugmentation(new L2Augmentation(product, augmentation.get(i).getAugmentationId(), augmentation.get(i).getSkill(), true)); } product.setEnchantLevel(e.getEnchantmentLevel()); } } } // msg part SystemMessage sm; if (e.getItemCount() * _amount > 1) { sm = new SystemMessage(SystemMessageId.EARNED_S2_S1_S); sm.addItemName(e.getItemId()); sm.addNumber(e.getItemCount() * _amount); player.sendPacket(sm); sm = null; } else { if(_enchantment > 0) { sm = new SystemMessage(SystemMessageId.ACQUIRED); sm.addNumber(_enchantment); sm.addItemName(e.getItemId()); } else { sm = new SystemMessage(SystemMessageId.EARNED_ITEM); sm.addItemName(e.getItemId()); } player.sendPacket(sm); sm = null; } } player.sendPacket(new ItemList(player, false)); StatusUpdate su = new StatusUpdate(player.getObjectId()); su.addAttribute(StatusUpdate.CUR_LOAD, player.getCurrentLoad()); player.sendPacket(su); su = null; // finally, give the tax to the castle... if (merchant != null && merchant.getIsInTown() && merchant.getCastle().getOwnerId() > 0) merchant.getCastle().addToTreasury(_transactionTax * _amount); } private MultiSellEntry prepareEntry(L2NpcInstance merchant, MultiSellEntry templateEntry, boolean applyTaxes, boolean maintainEnchantment, int enchantLevel) { MultiSellEntry newEntry = L2Multisell.getInstance().new MultiSellEntry(); newEntry.setEntryId(templateEntry.getEntryId()); int totalAdenaCount = 0; for (MultiSellIngredient ing : templateEntry.getIngredients()) { // load the ingredient from the template MultiSellIngredient newIngredient = L2Multisell.getInstance().new MultiSellIngredient(ing); if (newIngredient.getItemId() == 57 && newIngredient.isTaxIngredient()) { double taxRate = 0.0; if (applyTaxes) { if (merchant != null && merchant.getIsInTown()) taxRate = merchant.getCastle().getTaxRate(); } _transactionTax = (int)Math.round(newIngredient.getItemCount()*taxRate); totalAdenaCount += _transactionTax; continue; // do not yet add this adena amount to the list as non-taxIngredient adena might be entered later (order not guaranteed) } else if (ing.getItemId() == 57) // && !ing.isTaxIngredient() { totalAdenaCount += newIngredient.getItemCount(); continue; // do not yet add this adena amount to the list as taxIngredient adena might be entered later (order not guaranteed) } // if it is an armor/weapon, modify the enchantment level appropriately, if necessary else if (maintainEnchantment) { L2Item tempItem = ItemTable.getInstance().createDummyItem(newIngredient.getItemId()).getItem(); if ((tempItem instanceof L2Armor) || (tempItem instanceof L2Weapon)) newIngredient.setEnchantmentLevel(enchantLevel); } // finally, add this ingredient to the entry newEntry.addIngredient(newIngredient); } // Next add the adena amount, if any if (totalAdenaCount > 0) newEntry.addIngredient(L2Multisell.getInstance().new MultiSellIngredient(57, totalAdenaCount, false, false)); // Now modify the enchantment level of products, if necessary for (MultiSellIngredient ing : templateEntry.getProducts()) { // load the ingredient from the template MultiSellIngredient newIngredient = L2Multisell.getInstance().new MultiSellIngredient(ing); if (maintainEnchantment) { // if it is an armor/weapon, modify the enchantment level appropriately // (note, if maintain enchantment is "false" this modification will result to a +0) L2Item tempItem = ItemTable.getInstance().createDummyItem(newIngredient.getItemId()).getItem(); if ((tempItem instanceof L2Armor) || (tempItem instanceof L2Weapon)) newIngredient.setEnchantmentLevel(enchantLevel); } newEntry.addProduct(newIngredient); } return newEntry; } @Override public String getType() { return _C__A7_MULTISELLCHOOSE; }} вот мой ко думаю поймёш Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты
xenapopalus 0 Опубликовано 14 февраля, 2012 Скрытый текстpackage net.sf.l2j.gameserver.network.clientpackets; import java.util.List; import java.util.logging.Logger; import javolution.util.FastList; import net.sf.l2j.Config; import net.sf.l2j.gameserver.datatables.ItemTable; import net.sf.l2j.gameserver.model.L2Augmentation; import net.sf.l2j.gameserver.model.L2ItemInstance; import net.sf.l2j.gameserver.model.L2Multisell; import net.sf.l2j.gameserver.model.PcInventory; import net.sf.l2j.gameserver.model.L2Multisell.MultiSellEntry; import net.sf.l2j.gameserver.model.L2Multisell.MultiSellIngredient; import net.sf.l2j.gameserver.model.L2Multisell.MultiSellListContainer; import net.sf.l2j.gameserver.model.actor.instance.L2NpcInstance; import net.sf.l2j.gameserver.model.actor.instance.L2PcInstance; import net.sf.l2j.gameserver.network.SystemMessageId; import net.sf.l2j.gameserver.network.serverpackets.ItemList; import net.sf.l2j.gameserver.network.serverpackets.PledgeShowInfoUpdate; import net.sf.l2j.gameserver.network.serverpackets.StatusUpdate; import net.sf.l2j.gameserver.network.serverpackets.SystemMessage; import net.sf.l2j.gameserver.templates.L2Armor; import net.sf.l2j.gameserver.templates.L2Item; import net.sf.l2j.gameserver.templates.L2Weapon; import net.sf.l2j.gameserver.util.FloodProtector; import net.sf.l2j.gameserver.util.Util; public class MultiSellChoose extends L2GameClientPacket { private static final String _C__A7_MULTISELLCHOOSE = "[C] A7 MultiSellChoose"; private static Logger _log = Logger.getLogger(MultiSellChoose.class.getName()); private int _listId; private int _entryId; private int _amount; private int _enchantment; private int _transactionTax; // local handling of taxation private int _enchantCheck = 0; @Override protected void readImpl() { _listId = readD(); _entryId = readD(); _amount = readD(); // _enchantment = readH(); // <---commented this line because it did NOT work! _enchantment = _entryId % 100000; _entryId = _entryId / 100000; _transactionTax = 0; // initialize tax amount to 0... } @Override public void runImpl() { if(_amount < 1 || _amount > Config.MAX_MULTISELL) return; MultiSellListContainer list = L2Multisell.getInstance().getList(_listId); if(list == null) return; L2PcInstance player = getClient().getActiveChar(); if(player == null) return; for(MultiSellEntry entry : list.getEntries()) { if(entry.getEntryId() == _entryId) { doExchange(player,entry,list.getApplyTaxes(), list.getMaintainEnchantment(), _enchantment, list.getBidNpcId()); return; } } } private void doExchange(L2PcInstance player, MultiSellEntry templateEntry, boolean applyTaxes, boolean maintainEnchantment, int enchantment, String bidNpcId) { PcInventory inv = player.getInventory(); boolean maintainItemFound = false; if (!FloodProtector.getInstance().tryPerformAction(player.getObjectId(), FloodProtector.PROTECTED_MULTISELL)) { player.sendMessage("You can buy every 1 Second!."); return; } // given the template entry and information about maintaining enchantment and applying taxes // re-create the instance of the entry that will be used for this exchange // i.e. change the enchantment level of select ingredient/products and adena amount appropriately. L2NpcInstance merchant = (player.getTarget() instanceof L2NpcInstance)? (L2NpcInstance) player.getTarget() : null; if (merchant == null) return; MultiSellEntry entry = prepareEntry(merchant, templateEntry, applyTaxes, maintainEnchantment, enchantment); for(MultiSellIngredient e : entry.getProducts()) { if (!ItemTable.getInstance().createDummyItem(e.getItemId()).isStackable() && _amount > (player.GetInventoryLimit() - player.getInventory().getSize())) { player.sendPacket(new SystemMessage(SystemMessageId.YOU_HAVE_EXCEEDED_QUANTITY_THAT_CAN_BE_INPUTTED)); return; } } if (bidNpcId != null) { List<Integer> Result = new FastList<Integer>(); for (String id : bidNpcId.split(",")) { Result.add(Integer.parseInt(id)); } if(!Result.contains(merchant.getNpcId())) { Util.handleIllegalPlayerAction(player,"Player "+player.getName()+" tried to use multisell Exploit!", Config.DEFAULT_PUNISH); return; } } // Generate a list of distinct ingredients and counts in order to check if the correct item-counts // are possessed by the player FastList<MultiSellIngredient> _ingredientsList = new FastList<MultiSellIngredient>(); boolean newIng = true; for(MultiSellIngredient e: entry.getIngredients()) { newIng = true; // at this point, the template has already been modified so that enchantments are properly included // whenever they need to be applied. Uniqueness of items is thus judged by item id AND enchantment level for(MultiSellIngredient ex: _ingredientsList) { // if the item was already added in the list, merely increment the count // this happens if 1 list entry has the same ingredient twice (example 2 swords = 1 dual) if( (ex.getItemId() == e.getItemId()) && (ex.getEnchantmentLevel() == e.getEnchantmentLevel()) ) { if ((double)ex.getItemCount() + e.getItemCount() > Integer.MAX_VALUE) { player.sendPacket(new SystemMessage(SystemMessageId.YOU_HAVE_EXCEEDED_QUANTITY_THAT_CAN_BE_INPUTTED)); _ingredientsList.clear(); _ingredientsList = null; return; } ex.setItemCount(ex.getItemCount() + e.getItemCount()); newIng = false; } } if(newIng) { if (maintainEnchantment || e.getMantainIngredient()) { maintainItemFound = true; } // if it's a new ingredient, just store its info directly (item id, count, enchantment) _ingredientsList.add(L2Multisell.getInstance().new MultiSellIngredient(e)); } } if (!maintainItemFound) { for (MultiSellIngredient product : entry.getProducts()) { product.setEnchantmentLevel(0); } } // now check if the player has sufficient items in the inventory to cover the ingredients' expences for(MultiSellIngredient e : _ingredientsList) { if((double)e.getItemCount() * _amount > Integer.MAX_VALUE ) { player.sendPacket(new SystemMessage(SystemMessageId.YOU_HAVE_EXCEEDED_QUANTITY_THAT_CAN_BE_INPUTTED)); _ingredientsList.clear(); _ingredientsList = null; return; } if(e.getItemId() !=65336 && e.getItemId() !=65436) { // 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 if( inv.getInventoryItemCount(e.getItemId(), maintainEnchantment? e.getEnchantmentLevel() : -1) < ((Config.ALT_BLACKSMITH_USE_RECIPES || !e.getMantainIngredient()) ? (e.getItemCount() * _amount) : e.getItemCount()) ) { player.sendPacket(new SystemMessage(SystemMessageId.NOT_ENOUGH_ITEMS)); _ingredientsList.clear(); _ingredientsList = null; return; } } if(e.getItemId() == 65336) { if(player.getClan() == null) { player.sendPacket(new SystemMessage(SystemMessageId.YOU_ARE_NOT_A_CLAN_MEMBER)); return; } if(!player.isClanLeader()) { player.sendPacket(new SystemMessage(SystemMessageId.ONLY_THE_CLAN_LEADER_IS_ENABLED)); return; } if(player.getClan().getReputationScore() < e.getItemCount() * _amount) { player.sendPacket(new SystemMessage(SystemMessageId.THE_CLAN_REPUTATION_SCORE_IS_TOO_LOW)); return; } } if(e.getItemId() == 65436) { if((e.getItemCount()*_amount) > player.getPcCafeScore()) { player.sendPacket(new SystemMessage(SystemMessageId.NOT_ENOUGH_ITEMS)); return; } } } _ingredientsList.clear(); _ingredientsList = null; FastList<L2Augmentation> augmentation = new FastList<L2Augmentation>(); /** All ok, remove items and add final product */ for(MultiSellIngredient e : entry.getIngredients()) { if(e.getItemId()!=65336 && e.getItemId()!=65436) { L2ItemInstance itemToTake = inv.getItemByItemId(e.getItemId()); // initialize and initial guess for the item to take. if (itemToTake == null) { _log.severe("Character: " + player.getName() + " is trying to cheat in multisell, merchatnt id:" + merchant.getNpcId()); return; } 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. _log.severe("Character: " + player.getName() + " is trying to cheat in multisell, merchatnt id:" + merchant.getNpcId()); return; } { L2Item tempItem = ItemTable.getInstance().createDummyItem(e.getItemId()).getItem(); if ((tempItem instanceof L2Armor) || (tempItem instanceof L2Weapon)) _enchantCheck = e.getEnchantmentLevel(); } if (Config.ALT_BLACKSMITH_USE_RECIPES || !e.getMantainIngredient()) { // if it's a stackable item, just reduce the amount from the first (only) instance that is found in the inventory if (itemToTake.isStackable()) { if (!player.destroyItem("Multisell", itemToTake.getObjectId(), (e.getItemCount() * _amount), player.getTarget(), true)) return; } else { // for non-stackable items, one of two scenaria are possible: // a) list maintains enchantment: get the instances that exactly match the requested enchantment level // list does not maintain enchantment: get the instances with the LOWEST enchantment level // a) if enchantment is maintained, then get a list of items that exactly match this enchantment if (maintainEnchantment) { L2ItemInstance[] inventoryContents = inv.getAllItemsByItemId(e.getItemId(), e.getEnchantmentLevel()); for (int i = 0; i < (e.getItemCount() * _amount); i++) { if (inventoryContents.isAugmented()) augmentation.add(inventoryContents.getAugmentation()); if (!player.destroyItem("Multisell", inventoryContents.getObjectId(), 1, player.getTarget(), true)) return; } } else // enchantment is not maintained. Get the instances with the LOWEST enchantment level { // choice 1. Small number of items exchanged. No sorting. for (int i = 1; i <= (e.getItemCount() * _amount); i++) { L2ItemInstance[] inventoryContents = inv.getAllItemsByItemId(e.getItemId()); itemToTake = inventoryContents[0]; // get item with the LOWEST enchantment level from the inventory... // +0 is lowest by default... if (itemToTake.getEnchantLevel() > 0) { for (int j = 0; j < inventoryContents.length; j++) { if (inventoryContents[j].getEnchantLevel() < itemToTake.getEnchantLevel()) { itemToTake = inventoryContents[j]; // nothing will have enchantment less than 0. If a zero-enchanted // item is found, just take it if (itemToTake.getEnchantLevel() == 0) break; } } } if (!player.destroyItem("Multisell", itemToTake.getObjectId(), 1, player.getTarget(), true)) return; } } } } } else { if (e.getItemId() == 65336) { int repCost = player.getClan().getReputationScore() - e.getItemCount() * _amount; player.getClan().setReputationScore(repCost, true); SystemMessage smsg = new SystemMessage(SystemMessageId.S1_DEDUCTED_FROM_CLAN_REP); smsg.addNumber(e.getItemCount()); player.sendPacket(smsg); player.getClan().broadcastToOnlineMembers(new PledgeShowInfoUpdate(player.getClan())); } else { player.reducePcCafeScore(e.getItemCount()*_amount); player.sendPacket((new SystemMessage(1709)).addNumber(e.getItemCount())); } } } // Generate the appropriate items for(MultiSellIngredient e : entry.getProducts()) { if (_enchantCheck < e.getEnchantmentLevel()) { L2Item tempItem = ItemTable.getInstance().createDummyItem(e.getItemId()).getItem(); if ((tempItem instanceof L2Armor) || (tempItem instanceof L2Weapon)) { player.sendMessage("Ohh Cheat dont work? You have a problem now!"); Util.handleIllegalPlayerAction(player,"Warning!! Character "+player.getName()+" of account "+player.getAccountName()+" trying to enchant cheat.", Config.DEFAULT_PUNISH); return; } } if (ItemTable.getInstance().createDummyItem(e.getItemId()).isStackable()) { inv.addItem("Multisell", e.getItemId(), (e.getItemCount() * _amount), player, player.getTarget()); } else { L2ItemInstance product = null; for (int i = 0; i < (e.getItemCount() * _amount); i++) { product = inv.addItem("Multisell", e.getItemId(), 1, player, player.getTarget()); if (Config.ENABLE_MODIFY_ENCHANT_MULTISELL) { if (Config.ENCHANT_MULTISELL_LIST.containsKey(_listId)) { product.setEnchantLevel(Config.ENCHANT_MULTISELL_LIST.get(_listId)); } } if (maintainEnchantment) { if (i < augmentation.size()) { product.setAugmentation(new L2Augmentation(product, augmentation.get(i).getAugmentationId(), augmentation.get(i).getSkill(), true)); } product.setEnchantLevel(e.getEnchantmentLevel()); } } } // msg part SystemMessage sm; if (e.getItemCount() * _amount > 1) { sm = new SystemMessage(SystemMessageId.EARNED_S2_S1_S); sm.addItemName(e.getItemId()); sm.addNumber(e.getItemCount() * _amount); player.sendPacket(sm); sm = null; } else { if(_enchantment > 0) { sm = new SystemMessage(SystemMessageId.ACQUIRED); sm.addNumber(_enchantment); sm.addItemName(e.getItemId()); } else { sm = new SystemMessage(SystemMessageId.EARNED_ITEM); sm.addItemName(e.getItemId()); } player.sendPacket(sm); sm = null; } } player.sendPacket(new ItemList(player, false)); StatusUpdate su = new StatusUpdate(player.getObjectId()); su.addAttribute(StatusUpdate.CUR_LOAD, player.getCurrentLoad()); player.sendPacket(su); su = null; // finally, give the tax to the castle... if (merchant != null && merchant.getIsInTown() && merchant.getCastle().getOwnerId() > 0) merchant.getCastle().addToTreasury(_transactionTax * _amount); } private MultiSellEntry prepareEntry(L2NpcInstance merchant, MultiSellEntry templateEntry, boolean applyTaxes, boolean maintainEnchantment, int enchantLevel) { MultiSellEntry newEntry = L2Multisell.getInstance().new MultiSellEntry(); newEntry.setEntryId(templateEntry.getEntryId()); int totalAdenaCount = 0; for (MultiSellIngredient ing : templateEntry.getIngredients()) { // load the ingredient from the template MultiSellIngredient newIngredient = L2Multisell.getInstance().new MultiSellIngredient(ing); if (newIngredient.getItemId() == 57 && newIngredient.isTaxIngredient()) { double taxRate = 0.0; if (applyTaxes) { if (merchant != null && merchant.getIsInTown()) taxRate = merchant.getCastle().getTaxRate(); } _transactionTax = (int)Math.round(newIngredient.getItemCount()*taxRate); totalAdenaCount += _transactionTax; continue; // do not yet add this adena amount to the list as non-taxIngredient adena might be entered later (order not guaranteed) } else if (ing.getItemId() == 57) // && !ing.isTaxIngredient() { totalAdenaCount += newIngredient.getItemCount(); continue; // do not yet add this adena amount to the list as taxIngredient adena might be entered later (order not guaranteed) } // if it is an armor/weapon, modify the enchantment level appropriately, if necessary else if (maintainEnchantment) { L2Item tempItem = ItemTable.getInstance().createDummyItem(newIngredient.getItemId()).getItem(); if ((tempItem instanceof L2Armor) || (tempItem instanceof L2Weapon)) newIngredient.setEnchantmentLevel(enchantLevel); } // finally, add this ingredient to the entry newEntry.addIngredient(newIngredient); } // Next add the adena amount, if any if (totalAdenaCount > 0) newEntry.addIngredient(L2Multisell.getInstance().new MultiSellIngredient(57, totalAdenaCount, false, false)); // Now modify the enchantment level of products, if necessary for (MultiSellIngredient ing : templateEntry.getProducts()) { // load the ingredient from the template MultiSellIngredient newIngredient = L2Multisell.getInstance().new MultiSellIngredient(ing); if (maintainEnchantment) { // if it is an armor/weapon, modify the enchantment level appropriately // (note, if maintain enchantment is "false" this modification will result to a +0) L2Item tempItem = ItemTable.getInstance().createDummyItem(newIngredient.getItemId()).getItem(); if ((tempItem instanceof L2Armor) || (tempItem instanceof L2Weapon)) newIngredient.setEnchantmentLevel(enchantLevel); } newEntry.addProduct(newIngredient); } return newEntry; } @Override public String getType() { return _C__A7_MULTISELLCHOOSE; } } вот мой ко думаю поймёш файл MultiSellChoose.java не обнаружил у фрозенов это где? Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты
taste 501 Опубликовано 14 февраля, 2012 файл MultiSellChoose.java не обнаружилу фрозенов это где? ищи лучше там есть Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты
xenapopalus 0 Опубликовано 15 февраля, 2012 ищи лучше там есть сказали бы где) Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты
DarkLight 1 Опубликовано 16 февраля, 2012 непробывал в поиск вбивать? Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты
xenapopalus 0 Опубликовано 16 февраля, 2012 непробывал в поиск вбивать? пипец какие же вы умные - как же я сразу не допёр п.с. это был сарказм Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты
taste 501 Опубликовано 16 февраля, 2012 люблю людей которые по 3 дня ждут вместо того что бы 5 минут потратить на gameserver\head-src\com\l2jfrozen\gameserver\network\clientpackets Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты