public byte getAttackElement() { L2ItemInstance weaponInstance = _activeChar.getActiveWeaponInstance(); // 1st order - weapon element if ((weaponInstance != null) && (weaponInstance.getAttackElementType() >= 0)) { return weaponInstance.getAttackElementType(); } // temp fix starts int tempVal = 0, stats[] = {0, 0, 0, 0, 0, 0}; byte returnVal = -2; stats[0] = (int) calcStat(Stats.FIRE_POWER, _activeChar.getTemplate().getBaseFire()); stats[1] = (int) calcStat(Stats.WATER_POWER, _activeChar.getTemplate().getBaseWater()); stats[2] = (int) calcStat(Stats.WIND_POWER, _activeChar.getTemplate().getBaseWind()); stats[3] = (int) calcStat(Stats.EARTH_POWER, _activeChar.getTemplate().getBaseEarth()); stats[4] = (int) calcStat(Stats.HOLY_POWER, _activeChar.getTemplate().getBaseHoly()); stats[5] = (int) calcStat(Stats.DARK_POWER, _activeChar.getTemplate().getBaseDark()); for (byte x = 0; x < 6; x++) { if (stats[x] > tempVal) { returnVal = x; tempVal = stats[x]; } } return returnVal; // temp fix ends /* * uncomment me once deadlocks in getAllEffects() fixed return _activeChar.getElementIdFromEffects(); */ }
@Override public boolean useItem(L2Playable playable, L2ItemInstance item, boolean forceUse) { if (!playable.isPlayer()) { playable.sendPacket(SystemMessageId.YOUR_PET_CANNOT_CARRY_THIS_ITEM); return false; } playable.sendPacket(new ExRequestChangeNicknameColor(item.getObjectId())); return true; }
@Override protected void runImpl() { L2GameClient client = getClient(); if (client != null) { L2Object object = L2World.getInstance().findObject(_objectId); if (object instanceof L2ItemInstance) { L2ItemInstance item = (L2ItemInstance) object; if (item.isPublished()) { client.sendPacket(new ExRpItemLink(item)); } else { if (Config.DEBUG) { _log.info( getClient() + " requested item link for item which wasnt published! ID:" + _objectId); } } } } }
@Override protected void writeImpl() { writeC(0xFE); writeH(0xAD); writeD(_msg.getId()); writeD(_msg.isLocked() ? 1 : 0); writeS(_msg.getReceiverName()); writeS(_msg.getSubject()); writeS(_msg.getContent()); if ((_items != null) && (_items.length > 0)) { writeD(_items.length); for (L2ItemInstance item : _items) { writeItem(item); writeD(item.getObjectId()); } writeQ(_msg.getReqAdena()); writeD(_msg.getSendBySystem()); } else { writeD(0x00); } }
/** * Actions: * * <ul> * <li>Check if the killing object is a player, and then find the party they belong to. * <li>Add a blood offering item to the leader of the party. * <li>Update the party leader's inventory to show the new item addition. * </ul> */ @Override public void doItemDrop(L2Character lastAttacker) { L2PcInstance killingChar = null; if (!(lastAttacker instanceof L2PcInstance)) { return; } killingChar = (L2PcInstance) lastAttacker; L2Party associatedParty = killingChar.getParty(); if (associatedParty == null) { return; } L2PcInstance partyLeader = associatedParty.getLeader(); L2ItemInstance addedOfferings = partyLeader .getInventory() .addItem( "Sign", SevenSignsFestival.FESTIVAL_OFFERING_ID, _bonusMultiplier, partyLeader, this); InventoryUpdate iu = new InventoryUpdate(); if (addedOfferings.getCount() != _bonusMultiplier) { iu.addModifiedItem(addedOfferings); } else { iu.addNewItem(addedOfferings); } partyLeader.sendPacket(iu); super.doItemDrop(lastAttacker); // Normal drop }
@Override public String onAdvEvent(String event, L2Npc npc, L2PcInstance player) { final QuestState qs = getQuestState(player, false); if (qs == null) { return null; } String htmltext = null; switch (event) { case "ACCEPT": { qs.startQuest(); if ((player.getLevel() > 20) && (player.getLevel() < 31)) { playSound(player, QuestSound.ITEMSOUND_QUEST_ACCEPT); qs.setMemoState(2); qs.setCond(3); htmltext = "30981-04.htm"; } else if (player.getLevel() < 21) { qs.setMemoState(1); qs.setMemoStateEx(1, 0); qs.setCond(2); htmltext = "30981-03.htm"; } else if ((player.getLevel() > 30) && (player.getLevel() < 41)) { qs.setMemoState(3); qs.setCond(4); htmltext = "30981-05.htm"; } else { qs.setMemoState(4); qs.setCond(5); htmltext = "30981-06.htm"; } break; } case "30981-11.html": { if ((qs.getMemoState() >= 9) && (qs.getMemoState() <= 12)) { if (hasAtLeastOneQuestItem(player, MANACLES_OF_PENITENT, PENITENTS_MANACLES1)) { if (hasQuestItems(player, PENITENTS_MANACLES1)) { takeItems(player, PENITENTS_MANACLES1, 1); } if (hasQuestItems(player, MANACLES_OF_PENITENT)) { takeItems(player, MANACLES_OF_PENITENT, 1); } qs.setMemoStateEx(1, player.getLevel()); giveItems(player, PENITENTS_MANACLES, 1); qs.setCond(16); htmltext = event; } } break; } case "30981-14.html": case "30981-17.html": { if ((qs.getMemoState() >= 9) && (qs.getMemoState() <= 12)) { htmltext = event; } break; } case "30981-15t.html": { final L2ItemInstance petItem = player.getInventory().getItemByItemId(PENITENTS_MANACLES); final int petLevel = (petItem == null) ? 0 : petItem.getEnchantLevel(); if ((qs.getMemoState() >= 9) && (qs.getMemoState() <= 12) && (petLevel > qs.getMemoStateEx(1))) { final L2Summon summon = player.getSummon(); if (summon != null) { htmltext = event; } else { int i1 = 0; if (player.getLevel() > qs.getMemoStateEx(1)) { i1 = petLevel - qs.getMemoStateEx(1) - (player.getLevel() - qs.getMemoStateEx(1)); } else { i1 = petLevel - qs.getMemoStateEx(1); } if (i1 < 0) { i1 = 0; } int i0 = getRandom(i1) + 1; if (player.getPkKills() <= i0) { giveItems(player, MANACLES_OF_PENITENT, 1); if (petItem != null) { takeItems(player, PENITENTS_MANACLES, -1); } htmltext = "30981-15.html"; player.setPkKills(0); qs.exitQuest(true, true); } else { giveItems(player, MANACLES_OF_PENITENT, 1); if (petItem != null) { takeItems(player, PENITENTS_MANACLES, -1); } htmltext = "30981-16.html"; player.setPkKills(player.getPkKills() - i0); qs.setMemoStateEx(1, 0); } } } break; } case "30981-18.html": { if ((qs.getMemoState() >= 9) && (qs.getMemoState() <= 12)) { qs.exitQuest(true, true); htmltext = event; } break; } } return htmltext; }
@Override public String onTalk(L2Npc npc, L2PcInstance player) { final QuestState qs = getQuestState(player, true); final int memoState = qs.getMemoState(); String htmltext = getNoQuestMsg(player); if (qs.isCreated()) { if (npc.getId() == BLACK_JUDGE) { if (player.getPkKills() == 0) { htmltext = "30981-01.htm"; } else { htmltext = "30981-02.htm"; } } } else if (qs.isStarted()) { switch (npc.getId()) { case BLACK_JUDGE: { if (memoState == 1000) { takeItems(player, PENITENTS_MANACLES, 1); } else if (memoState < 9) { htmltext = "30981-07.html"; } else if ((memoState >= 9) && (memoState <= 12)) { if (!hasAtLeastOneQuestItem( player, MANUAL_OF_MANACLES, MANACLES_OF_PENITENT, PENITENTS_MANACLES1, PENITENTS_MANACLES)) { giveItems(player, MANUAL_OF_MANACLES, 1); qs.setCond(14, true); htmltext = "30981-08.html"; } else if (hasQuestItems(player, MANUAL_OF_MANACLES) && !hasAtLeastOneQuestItem( player, MANACLES_OF_PENITENT, PENITENTS_MANACLES1, PENITENTS_MANACLES)) { htmltext = "30981-09.html"; } else if (hasQuestItems(player, PENITENTS_MANACLES1) && !hasAtLeastOneQuestItem( player, MANUAL_OF_MANACLES, MANACLES_OF_PENITENT, PENITENTS_MANACLES)) { htmltext = "30981-10.html"; } else if (hasQuestItems(player, PENITENTS_MANACLES)) { final L2ItemInstance petItem = player.getInventory().getItemByItemId(PENITENTS_MANACLES); final int petLevel = (petItem == null) ? 0 : petItem.getEnchantLevel(); if (petLevel < (qs.getMemoStateEx(1) + 1)) { htmltext = "30981-12.html"; } else { htmltext = "30981-13.html"; } } else if (hasQuestItems(player, MANACLES_OF_PENITENT) && !hasQuestItems(player, PENITENTS_MANACLES)) { htmltext = "30981-16t.html"; } } break; } case BLACKSMITH_PUSHKIN: { if ((memoState >= 9) && (memoState <= 12)) { if (!hasAtLeastOneQuestItem( player, PENITENTS_MANACLES1, PENITENTS_MANACLES, MANACLES_OF_PENITENT) && hasQuestItems(player, MANUAL_OF_MANACLES)) { if ((getQuestItemsCount(player, BLACKSMITHS_FRAME) > 0) && (getQuestItemsCount(player, STEEL) >= 5) && (getQuestItemsCount(player, ADAMANTITE_NUGGET) >= 2) && (getQuestItemsCount(player, SILVER_NUGGET) >= 10) && (getQuestItemsCount(player, COKES) >= 10)) { takeItems(player, SILVER_NUGGET, 10); takeItems(player, ADAMANTITE_NUGGET, 2); takeItems(player, COKES, 10); takeItems(player, STEEL, 5); takeItems(player, BLACKSMITHS_FRAME, 1); giveItems(player, PENITENTS_MANACLES1, 1); takeItems(player, MANUAL_OF_MANACLES, 1); qs.setCond(15, true); htmltext = "30300-01.html"; } else { htmltext = "30300-02.html"; } } else if (hasAtLeastOneQuestItem( player, PENITENTS_MANACLES1, PENITENTS_MANACLES, MANACLES_OF_PENITENT)) { htmltext = "30300-03.html"; } } break; } case PIOTUR: { if (memoState == 2) { qs.setMemoState(6); qs.setCond(7, true); htmltext = "30597-01.html"; } else if (memoState == 6) { if (getQuestItemsCount(player, TUREK_WAR_HOUNDS_TAIL) < 10) { htmltext = "30597-02.html"; } else { takeItems(player, TUREK_WAR_HOUNDS_TAIL, -1); qs.setMemoState(10); qs.setCond(11, true); htmltext = "30597-03.html"; } } else if (memoState == 10) { htmltext = "30597-04.html"; } break; } case ELDER_CASIAN: { if (memoState == 3) { qs.setMemoState(7); qs.setCond(8, true); htmltext = "30612-01.html"; } else if (memoState == 7) { if (!hasQuestItems(player, TYRANT_KINGPINS_HEART)) { htmltext = "30612-02.html"; } else { takeItems(player, TYRANT_KINGPINS_HEART, -1); qs.setMemoState(11); qs.setCond(12, true); htmltext = "30612-03.html"; } } else if (memoState == 11) { htmltext = "30612-04.html"; } break; } case KATARI: { if (memoState == 1) { qs.setMemoState(5); qs.setCond(6, true); htmltext = "30668-01.html"; } else if (memoState == 5) { if (getQuestItemsCount(player, RATMAN_SCAVENGERS_SKULL) < 10) { htmltext = "30668-02.html"; } else { takeItems(player, RATMAN_SCAVENGERS_SKULL, -1); qs.setMemoState(9); qs.setCond(10, true); htmltext = "30668-03.html"; } } else if (memoState == 9) { htmltext = "30668-04.html"; } break; } case MAGISTER_JOAN: { if (memoState == 4) { qs.setMemoState(8); qs.setCond(9, true); htmltext = "30718-01.html"; } else if (memoState == 8) { if (getQuestItemsCount(player, TRISALIM_TARANTULAS_VENOM_SAC) < 3) { htmltext = "30718-02.html"; } else { takeItems(player, TRISALIM_TARANTULAS_VENOM_SAC, -1); qs.setMemoState(12); qs.setCond(13, true); htmltext = "30718-03.html"; } } else if (memoState == 12) { htmltext = "30718-04.html"; } break; } } } return htmltext; }
@Override public void onStart(BuffInfo info) { L2Character target = info.getEffected(); L2Character activeChar = info.getEffector(); if ((target == null) || target.isDead() || target.isDoor() || target.isInvul()) { return; } double amount = _power; double staticShotBonus = 0; int mAtkMul = 1; boolean sps = info.getSkill().isMagic() && activeChar.isChargedShot(ShotType.SPIRITSHOTS); boolean bss = info.getSkill().isMagic() && activeChar.isChargedShot(ShotType.BLESSED_SPIRITSHOTS); if (((sps || bss) && (activeChar.isPlayer() && activeChar.getActingPlayer().isMageClass())) || activeChar.isSummon()) { staticShotBonus = info.getSkill().getMpConsume(); // static bonus for spiritshots mAtkMul = bss ? 4 : 2; staticShotBonus *= bss ? 2.4 : 1.0; } else if ((sps || bss) && activeChar.isNpc()) { staticShotBonus = 2.4 * info.getSkill().getMpConsume(); // always blessed spiritshots mAtkMul = 4; } else { // no static bonus // grade dynamic bonus final L2ItemInstance weaponInst = activeChar.getActiveWeaponInstance(); if (weaponInst != null) { mAtkMul = weaponInst.getItem().getCrystalType() == CrystalType.S84 ? 4 : weaponInst.getItem().getCrystalType() == CrystalType.S80 ? 2 : 1; } // shot dynamic bonus mAtkMul = bss ? mAtkMul * 4 : mAtkMul + 1; } if (!info.getSkill().isStatic()) { amount += staticShotBonus + Math.sqrt(mAtkMul * activeChar.getMAtk(activeChar, null)); amount = target.calcStat(Stats.HEAL_EFFECT, amount, null, null); // Heal critic, since CT2.3 Gracia Final if (info.getSkill().isMagic() && Formulas.calcMCrit(activeChar.getMCriticalHit(target, info.getSkill()))) { amount *= 3; activeChar.sendPacket(SystemMessageId.M_CRITICAL); activeChar.sendPacket( new ExMagicAttackInfo( activeChar.getObjectId(), target.getObjectId(), ExMagicAttackInfo.CRITICAL_HEAL)); if (target.isPlayer() && (target != activeChar)) { target.sendPacket( new ExMagicAttackInfo( activeChar.getObjectId(), target.getObjectId(), ExMagicAttackInfo.CRITICAL_HEAL)); } } } // Prevents overheal and negative amount final double healAmount = Math.max(Math.min(amount, target.getMaxRecoverableHp() - target.getCurrentHp()), 0); if (healAmount != 0) { target.setCurrentHp(healAmount + target.getCurrentHp()); } if (target.isPlayer()) { if (info.getSkill().getId() == 4051) { target.sendPacket(SystemMessageId.REJUVENATING_HP); } else if (healAmount != 0) { if (activeChar.isPlayer() && (activeChar != target)) { SystemMessage sm = SystemMessage.getSystemMessage(SystemMessageId.S2_HP_HAS_BEEN_RESTORED_BY_C1); sm.addString(activeChar.getName()); sm.addInt((int) healAmount); target.sendPacket(sm); } else { SystemMessage sm = SystemMessage.getSystemMessage(SystemMessageId.S1_HP_HAS_BEEN_RESTORED); sm.addInt((int) healAmount); target.sendPacket(sm); } } amount = Math.max( Math.min(amount - healAmount, target.getMaxRecoverableCp() - target.getCurrentCp()), 0); if (amount != 0) { target.setCurrentCp(amount + target.getCurrentCp()); if (activeChar.isPlayer() && (activeChar != target)) { SystemMessage sm = SystemMessage.getSystemMessage(SystemMessageId.S2_CP_HAS_BEEN_RESTORED_BY_C1); sm.addString(activeChar.getName()); sm.addInt((int) amount); target.sendPacket(sm); } else { SystemMessage sm = SystemMessage.getSystemMessage(SystemMessageId.S1_CP_HAS_BEEN_RESTORED); sm.addInt((int) amount); target.sendPacket(sm); } } } }
@Override protected void readImpl() { L2PcInstance player = getClient().getActiveChar(); if (player == null) { return; } int count = readD(); if ((count < 1) || (count > Config.MAX_ITEM_IN_PACKET) || ((count * BATCH_LENGTH) != _buf.remaining())) { return; } _items = new Item[count]; for (int i = 0; i < count; i++) { int itemId = readD(); int enchantLevel = readD(); long cnt = readQ(); long price = readQ(); if ((itemId < 1) || (cnt < 1) || (price < 0)) { _items = null; return; } int attackAttribute = readH(); // Attack Attribute Type int attackAttributeValue = readH(); // Attack Attribute Value int defenseAttributes[] = new int[6]; for (int h = 0; h < 6; h++) { defenseAttributes[i] = readH(); // Defense attributes } int appearanceId = readD(); // Appearance ID boolean canUse = false; for (L2ItemInstance item : player.getInventory().getItemsByItemId(itemId)) { if ((enchantLevel == item.getEnchantLevel()) && (attackAttribute == item.getAttackElementType()) && (attackAttributeValue == item.getAttackElementPower()) && (appearanceId == item.getVisualId()) && (item.getElementDefAttr((byte) 0) == defenseAttributes[0]) && (item.getElementDefAttr((byte) 1) == defenseAttributes[1]) && (item.getElementDefAttr((byte) 2) == defenseAttributes[2]) && (item.getElementDefAttr((byte) 3) == defenseAttributes[3]) && (item.getElementDefAttr((byte) 4) == defenseAttributes[4]) && (item.getElementDefAttr((byte) 5) == defenseAttributes[5])) { canUse = true; break; } } if (!canUse) { enchantLevel = 0; attackAttribute = -1; attackAttributeValue = 0; defenseAttributes[0] = 0; defenseAttributes[1] = 0; defenseAttributes[2] = 0; defenseAttributes[3] = 0; defenseAttributes[4] = 0; defenseAttributes[5] = 0; appearanceId = 0; } _items[i] = new Item( itemId, cnt, price, enchantLevel, attackAttribute, attackAttributeValue, defenseAttributes, appearanceId); } }
@Override public void runImpl() { final L2PcInstance player = getClient().getActiveChar(); if (player == null) { return; } if (!getClient().getFloodProtectors().getMultiSell().tryPerformAction("multisell choose")) { player.setMultiSell(null); return; } if ((_amount < 1) || (_amount > 5000)) { player.setMultiSell(null); return; } PreparedListContainer list = player.getMultiSell(); if ((list == null) || (list.getListId() != _listId)) { player.setMultiSell(null); return; } final L2Npc npc = player.getLastFolkNPC(); if (((npc != null) && !list.isNpcAllowed(npc.getId())) || ((npc == null) && list.isNpcOnly())) { player.setMultiSell(null); return; } if (!player.isGM() && (npc != null)) { if (!player.isInsideRadius(npc, INTERACTION_DISTANCE, true, false) || (player.getInstanceId() != npc.getInstanceId())) { player.setMultiSell(null); return; } } for (Entry entry : list.getEntries()) { if (entry.getEntryId() == _entryId) { if (!entry.isStackable() && (_amount > 1)) { _log.severe( "Character: " + player.getName() + " is trying to set amount > 1 on non-stackable multisell, id:" + _listId + ":" + _entryId); player.setMultiSell(null); return; } final PcInventory inv = player.getInventory(); int slots = 0; int weight = 0; for (Ingredient e : entry.getProducts()) { if (e.getItemId() < 0) { continue; } if (!e.isStackable()) { slots += e.getItemCount() * _amount; } else if (player.getInventory().getItemByItemId(e.getItemId()) == null) { slots++; } weight += e.getItemCount() * _amount * e.getWeight(); } if (!inv.validateWeight(weight)) { player.sendPacket(SystemMessageId.WEIGHT_LIMIT_EXCEEDED); return; } if (!inv.validateCapacity(slots)) { player.sendPacket(SystemMessageId.SLOTS_FULL); return; } ArrayList<Ingredient> ingredientsList = new ArrayList<>(entry.getIngredients().size()); // Generate a list of distinct ingredients and counts in order to check if the correct // item-counts // are possessed by the player boolean newIng; for (Ingredient 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 (int i = ingredientsList.size(); --i >= 0; ) { Ingredient ex = ingredientsList.get(i); // 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.getEnchantLevel() == e.getEnchantLevel())) { if ((ex.getItemCount() + e.getItemCount()) > Integer.MAX_VALUE) { player.sendPacket(SystemMessageId.YOU_HAVE_EXCEEDED_QUANTITY_THAT_CAN_BE_INPUTTED); return; } // two same ingredients, merge into one and replace old final Ingredient ing = ex.getCopy(); ing.setItemCount(ex.getItemCount() + e.getItemCount()); ingredientsList.set(i, ing); newIng = false; break; } } if (newIng) { // if it's a new ingredient, just store its info directly (item id, count, enchantment) ingredientsList.add(e); } } // now check if the player has sufficient items in the inventory to cover the ingredients' // expences for (Ingredient e : ingredientsList) { if ((e.getItemCount() * _amount) > Integer.MAX_VALUE) { player.sendPacket(SystemMessageId.YOU_HAVE_EXCEEDED_QUANTITY_THAT_CAN_BE_INPUTTED); return; } if (e.getItemId() < 0) { if (!MultisellData.hasSpecialIngredient( e.getItemId(), e.getItemCount() * _amount, player)) { return; } } else { // 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 final long required = ((Config.ALT_BLACKSMITH_USE_RECIPES || !e.getMaintainIngredient()) ? (e.getItemCount() * _amount) : e.getItemCount()); if (inv.getInventoryItemCount( e.getItemId(), list.getMaintainEnchantment() ? e.getEnchantLevel() : -1, false) < required) { SystemMessage sm = SystemMessage.getSystemMessage(SystemMessageId.S2_UNIT_OF_THE_ITEM_S1_REQUIRED); sm.addItemName(e.getTemplate()); sm.addLong(required); player.sendPacket(sm); return; } } } List<L2Augmentation> augmentation = new ArrayList<>(); Elementals[] elemental = null; /** All ok, remove items and add final product */ for (Ingredient e : entry.getIngredients()) { if (e.getItemId() < 0) { if (!MultisellData.takeSpecialIngredient( e.getItemId(), e.getItemCount() * _amount, player)) { return; } } else { L2ItemInstance itemToTake = inv.getItemByItemId( e.getItemId()); // initialize and initial guess for the item to take. if (itemToTake == null) { // 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, id:" + _listId + ":" + _entryId); player.setMultiSell(null); return; } // if (itemToTake.isEquipped()) // { // 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()); // player.setMultiSell(null); // return; // } if (Config.ALT_BLACKSMITH_USE_RECIPES || !e.getMaintainIngredient()) { // 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)) { player.setMultiSell(null); 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 // b) 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 (list.getMaintainEnchantment()) { // loop through this list and remove (one by one) each item until the required // amount is taken. L2ItemInstance[] inventoryContents = inv.getAllItemsByItemId(e.getItemId(), e.getEnchantLevel(), false); for (int i = 0; i < (e.getItemCount() * _amount); i++) { if (inventoryContents[i].isAugmented()) { augmentation.add(inventoryContents[i].getAugmentation()); } if (inventoryContents[i].getElementals() != null) { elemental = inventoryContents[i].getElementals(); } if (!player.destroyItem( "Multisell", inventoryContents[i].getObjectId(), 1, player.getTarget(), true)) { player.setMultiSell(null); return; } } } else // b) enchantment is not maintained. Get the instances with the LOWEST enchantment // level { // NOTE: There are 2 ways to achieve the above goal. // 1) Get all items that have the correct itemId, loop through them until the // lowest enchantment // level is found. Repeat all this for the next item until proper count of items // is reached. // 2) Get all items that have the correct itemId, sort them once based on // enchantment level, // and get the range of items that is necessary. // Method 1 is faster for a small number of items to be exchanged. // Method 2 is faster for large amounts. // // EXPLANATION: // Worst case scenario for algorithm 1 will make it run in a number of cycles // given by: // m*(2n-m+1)/2 where m is the number of items to be exchanged and n is the total // number of inventory items that have a matching id. // With algorithm 2 (sort), sorting takes n*log(n) time and the choice is done in // a single cycle // for case b (just grab the m first items) or in linear time for case a (find the // beginning of items // with correct enchantment, index x, and take all items from x to x+m). // Basically, whenever m > log(n) we have: m*(2n-m+1)/2 = (2nm-m*m+m)/2 > // (2nlogn-logn*logn+logn)/2 = nlog(n) - log(n*n) + log(n) = nlog(n) + log(n/n*n) // = // nlog(n) + log(1/n) = nlog(n) - log(n) = (n-1)log(n) // So for m < log(n) then m*(2n-m+1)/2 > (n-1)log(n) and m*(2n-m+1)/2 > nlog(n) // // IDEALLY: // In order to best optimize the performance, choose which algorithm to run, based // on whether 2^m > n // if ( (2<<(e.getItemCount()// _amount)) < inventoryContents.length ) // // do Algorithm 1, no sorting // else // // do Algorithm 2, sorting // // CURRENT IMPLEMENTATION: // In general, it is going to be very rare for a person to do a massive exchange // of non-stackable items // For this reason, we assume that algorithm 1 will always suffice and we keep // things simple. // If, in the future, it becomes necessary that we optimize, the above discussion // should make it clear // what optimization exactly is necessary (based on the comments under "IDEALLY"). // // choice 1. Small number of items exchanged. No sorting. for (int i = 1; i <= (e.getItemCount() * _amount); i++) { L2ItemInstance[] inventoryContents = inv.getAllItemsByItemId(e.getItemId(), false); itemToTake = inventoryContents[0]; // get item with the LOWEST enchantment level from the inventory... // +0 is lowest by default... if (itemToTake.getEnchantLevel() > 0) { for (L2ItemInstance item : inventoryContents) { if (item.getEnchantLevel() < itemToTake.getEnchantLevel()) { itemToTake = item; // 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)) { player.setMultiSell(null); return; } } } } } } } // Generate the appropriate items for (Ingredient e : entry.getProducts()) { if (e.getItemId() < 0) { MultisellData.giveSpecialProduct(e.getItemId(), e.getItemCount() * _amount, player); } else { if (e.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 ((product != null) && list.getMaintainEnchantment()) { if (i < augmentation.size()) { product.setAugmentation( new L2Augmentation(augmentation.get(i).getAugmentationId())); } if (elemental != null) { for (Elementals elm : elemental) { product.setElementAttr(elm.getElement(), elm.getValue()); } } product.setEnchantLevel(e.getEnchantLevel()); product.updateDatabase(); } } } // msg part SystemMessage sm; if ((e.getItemCount() * _amount) > 1) { sm = SystemMessage.getSystemMessage(SystemMessageId.EARNED_S2_S1_S); sm.addItemName(e.getItemId()); sm.addLong(e.getItemCount() * _amount); player.sendPacket(sm); } else { if (list.getMaintainEnchantment() && (e.getEnchantLevel() > 0)) { sm = SystemMessage.getSystemMessage(SystemMessageId.ACQUIRED_S1_S2); sm.addLong(e.getEnchantLevel()); sm.addItemName(e.getItemId()); } else { sm = SystemMessage.getSystemMessage(SystemMessageId.EARNED_ITEM_S1); sm.addItemName(e.getItemId()); } player.sendPacket(sm); } } } player.sendPacket(new ItemList(player, false)); StatusUpdate su = new StatusUpdate(player); su.addAttribute(StatusUpdate.CUR_LOAD, player.getCurrentLoad()); player.sendPacket(su); // finally, give the tax to the castle... if ((npc != null) && (entry.getTaxAmount() > 0)) { npc.getCastle().addToTreasury(entry.getTaxAmount() * _amount); } break; } } }
public ConfirmDlg addItemName(L2ItemInstance item) { return addItemName(item.getItem().getItemId()); }
private void setEnchant(L2PcInstance activeChar, int ench, int armorType) { // get the target L2Object target = activeChar.getTarget(); if (target == null) { target = activeChar; } L2PcInstance player = null; if (target instanceof L2PcInstance) { player = (L2PcInstance) target; } else { activeChar.sendPacket(SystemMessageId.INCORRECT_TARGET); return; } // now we need to find the equipped weapon of the targeted character... int curEnchant = 0; // display purposes only L2ItemInstance itemInstance = null; // only attempt to enchant if there is a weapon equipped L2ItemInstance parmorInstance = player.getInventory().getPaperdollItem(armorType); if ((parmorInstance != null) && (parmorInstance.getLocationSlot() == armorType)) { itemInstance = parmorInstance; } if (itemInstance != null) { curEnchant = itemInstance.getEnchantLevel(); // set enchant value player.getInventory().unEquipItemInSlot(armorType); itemInstance.setEnchantLevel(ench); player.getInventory().equipItem(itemInstance); // send packets InventoryUpdate iu = new InventoryUpdate(); iu.addModifiedItem(itemInstance); player.sendPacket(iu); player.broadcastPacket(new CharInfo(player)); player.sendPacket(new UserInfo(player)); player.broadcastPacket(new ExBrExtraUserInfo(player)); // informations activeChar.sendMessage( "Changed enchantment of " + player.getName() + "'s " + itemInstance.getItem().getName() + " from " + curEnchant + " to " + ench + "."); player.sendMessage( "Admin has changed the enchantment of your " + itemInstance.getItem().getName() + " from " + curEnchant + " to " + ench + "."); } }
public synchronized void computeNewHeroes(List<StatsSet> newHeroes) { updateHeroes(true); for (Integer objectId : _heroes.keySet()) { final L2PcInstance player = L2World.getInstance().getPlayer(objectId); if (player == null) { continue; } player.setHero(false); for (int i = 0; i < Inventory.PAPERDOLL_TOTALSLOTS; i++) { L2ItemInstance equippedItem = player.getInventory().getPaperdollItem(i); if ((equippedItem != null) && equippedItem.isHeroItem()) { player.getInventory().unEquipItemInSlot(i); } } final InventoryUpdate iu = new InventoryUpdate(); for (L2ItemInstance item : player.getInventory().getAvailableItems(false, false, false)) { if ((item != null) && item.isHeroItem()) { player.destroyItem("Hero", item, null, true); iu.addRemovedItem(item); } } if (!iu.getItems().isEmpty()) { player.sendPacket(iu); } player.broadcastUserInfo(); } if (newHeroes.isEmpty()) { _heroes.clear(); return; } Map<Integer, StatsSet> heroes = new FastMap<>(); for (StatsSet hero : newHeroes) { int charId = hero.getInt(Olympiad.CHAR_ID); if ((_completeHeroes != null) && _completeHeroes.containsKey(charId)) { StatsSet oldHero = _completeHeroes.get(charId); int count = oldHero.getInt(COUNT); oldHero.set(COUNT, count + 1); oldHero.set(PLAYED, 1); oldHero.set(CLAIMED, false); heroes.put(charId, oldHero); } else { StatsSet newHero = new StatsSet(); newHero.set(Olympiad.CHAR_NAME, hero.getString(Olympiad.CHAR_NAME)); newHero.set(Olympiad.CLASS_ID, hero.getInt(Olympiad.CLASS_ID)); newHero.set(COUNT, 1); newHero.set(PLAYED, 1); newHero.set(CLAIMED, false); heroes.put(charId, newHero); } } deleteItemsInDb(); _heroes.clear(); _heroes.putAll(heroes); heroes.clear(); updateHeroes(false); }
@Override protected void writeImpl() { writeC(0xFE); writeH(0x6C); writeD(_item.getObjectId()); writeD(_item.getDisplayId()); writeD(_item.getLocationSlot()); writeQ(_item.getCount()); writeH(_item.getItem().getType2()); writeH(_item.getCustomType1()); writeH(_item.isEquipped() ? 0x01 : 0x00); writeD(_item.getItem().getBodyPart()); writeH(_item.getEnchantLevel()); writeH(_item.getCustomType2()); if (_item.isAugmented()) { writeD(_item.getAugmentation().getAugmentationId()); } else { writeD(0x00); } writeD(_item.getMana()); writeD(_item.isTimeLimitedItem() ? (int) (_item.getRemainingTime() / 1000) : -9999); writeH(_item.getAttackElementType()); writeH(_item.getAttackElementPower()); for (byte i = 0; i < 6; i++) { writeH(_item.getElementDefAttr(i)); } // Enchant Effects for (int op : _item.getEnchantOptions()) { writeH(op); } }
@Override protected void runImpl() { L2PcInstance activeChar = getClient().getActiveChar(); if (activeChar == null) { _log.fine("RequestCrystalizeItem: activeChar was null"); return; } if (!getClient().getFloodProtectors().getTransaction().tryPerformAction("crystallize")) { activeChar.sendMessage("You are crystallizing too fast."); return; } if (_count <= 0) { Util.handleIllegalPlayerAction( activeChar, "[RequestCrystallizeItem] count <= 0! ban! oid: " + _objectId + " owner: " + activeChar.getName(), Config.DEFAULT_PUNISH); return; } if ((activeChar.getPrivateStoreType() != PrivateStoreType.NONE) || !activeChar.isInCrystallize()) { activeChar.sendPacket( SystemMessageId .WHILE_OPERATING_A_PRIVATE_STORE_OR_WORKSHOP_YOU_CANNOT_DISCARD_DESTROY_OR_TRADE_AN_ITEM); return; } int skillLevel = activeChar.getSkillLevel(CommonSkill.CRYSTALLIZE.getId()); if (skillLevel <= 0) { activeChar.sendPacket( SystemMessageId .YOU_MAY_NOT_CRYSTALLIZE_THIS_ITEM_YOUR_CRYSTALLIZATION_SKILL_LEVEL_IS_TOO_LOW); activeChar.sendPacket(ActionFailed.STATIC_PACKET); if ((activeChar.getRace() != Race.DWARF) && (activeChar.getClassId().ordinal() != 117) && (activeChar.getClassId().ordinal() != 55)) { _log.info( "Player " + activeChar.getClient() + " used crystalize with classid: " + activeChar.getClassId().ordinal()); } return; } PcInventory inventory = activeChar.getInventory(); if (inventory != null) { L2ItemInstance item = inventory.getItemByObjectId(_objectId); if (item == null) { activeChar.sendPacket(ActionFailed.STATIC_PACKET); return; } if (item.isHeroItem()) { return; } if (_count > item.getCount()) { _count = activeChar.getInventory().getItemByObjectId(_objectId).getCount(); } } final L2ItemInstance itemToRemove = activeChar.getInventory().getItemByObjectId(_objectId); if ((itemToRemove == null) || itemToRemove.isShadowItem() || itemToRemove.isTimeLimitedItem()) { return; } if (!itemToRemove.getItem().isCrystallizable() || (itemToRemove.getItem().getCrystalCount() <= 0) || (itemToRemove.getItem().getCrystalType() == CrystalType.NONE)) { _log.warning( activeChar.getName() + " (" + activeChar.getObjectId() + ") tried to crystallize " + itemToRemove.getItem().getId()); return; } if (!activeChar.getInventory().canManipulateWithItemId(itemToRemove.getId())) { activeChar.sendMessage("You cannot use this item."); return; } // Check if the char can crystallize items and return if false; boolean canCrystallize = true; switch (itemToRemove.getItem().getCrystalTypePlus()) { case D: { if (skillLevel < 1) { canCrystallize = false; } break; } case C: { if (skillLevel < 2) { canCrystallize = false; } break; } case B: { if (skillLevel < 3) { canCrystallize = false; } break; } case A: { if (skillLevel < 4) { canCrystallize = false; } break; } case S: { if (skillLevel < 5) { canCrystallize = false; } break; } case R: { if (skillLevel < 6) { canCrystallize = false; } break; } } if (!canCrystallize) { activeChar.sendPacket( SystemMessageId .YOU_MAY_NOT_CRYSTALLIZE_THIS_ITEM_YOUR_CRYSTALLIZATION_SKILL_LEVEL_IS_TOO_LOW); activeChar.sendPacket(ActionFailed.STATIC_PACKET); return; } // activeChar.setInCrystallize(true); // unequip if needed SystemMessage sm; if (itemToRemove.isEquipped()) { L2ItemInstance[] unequiped = activeChar.getInventory().unEquipItemInSlotAndRecord(itemToRemove.getLocationSlot()); InventoryUpdate iu = new InventoryUpdate(); for (L2ItemInstance item : unequiped) { iu.addModifiedItem(item); } activeChar.sendPacket(iu); if (itemToRemove.getEnchantLevel() > 0) { sm = SystemMessage.getSystemMessage(SystemMessageId.THE_EQUIPMENT_S1_S2_HAS_BEEN_REMOVED); sm.addInt(itemToRemove.getEnchantLevel()); sm.addItemName(itemToRemove); } else { sm = SystemMessage.getSystemMessage(SystemMessageId.S1_HAS_BEEN_UNEQUIPPED); sm.addItemName(itemToRemove); } activeChar.sendPacket(sm); } // remove from inventory final L2ItemInstance removedItem = activeChar.getInventory().destroyItem("Crystalize", _objectId, _count, activeChar, null); final InventoryUpdate iu = new InventoryUpdate(); iu.addRemovedItem(removedItem); activeChar.sendPacket(iu); final int crystalId = itemToRemove.getItem().getCrystalItemId(); final int crystalAmount = itemToRemove.getCrystalCount(); final List<ItemChanceHolder> items = new ArrayList<>(); items.add(new ItemChanceHolder(crystalId, 100, crystalAmount)); final CrystalizationData data = ItemCrystalizationData.getInstance().getCrystalization(itemToRemove.getId()); if (data != null) { data.getItems().stream().filter(holder -> (holder.getId() != crystalId)).forEach(items::add); } for (ItemChanceHolder holder : items) { final double rand = Rnd.nextDouble() * 100; if (rand < holder.getChance()) { // add crystals final L2ItemInstance createdItem = activeChar .getInventory() .addItem("Crystalize", holder.getId(), holder.getCount(), activeChar, activeChar); sm = SystemMessage.getSystemMessage(SystemMessageId.YOU_HAVE_EARNED_S2_S1_S); sm.addItemName(createdItem); sm.addLong(holder.getCount()); activeChar.sendPacket(sm); } } sm = SystemMessage.getSystemMessage(SystemMessageId.S1_HAS_BEEN_CRYSTALLIZED); sm.addItemName(removedItem); activeChar.sendPacket(sm); activeChar.broadcastUserInfo(); L2World.getInstance().removeObject(removedItem); activeChar.setInCrystallize(false); }