Улучшение предметов

uter81

Пляшущий с бубном
Участник
Сообщения
210
Розыгрыши
0
Репутация
0
Реакции
11
Баллы
280
Хроники
  1. Shadow of the Kamael
Исходники
Присутствуют
Сборка
l2jMobius
Всем привет, подскажите как прописать в xml, при улучшение предмета, что бы заточка не учитывалась.
Например улучшаю у нпс пояс Правителя +15 2 лв на 3лв. Если пояс 2 лв не точен то улучшает на 3 лв, а если он вточен пишет нет предмета.

Код:
<item>
        <ingredient id="48418" count="5" /> <!-- Authority Ornament -->
        <ingredient id="45584" count="200" /> <!-- Mark of Battle -->
        <ingredient id="48417" count="1" /> <!-- Ruler's Authority - Genesis Lv. 2-->
        <production id="81751" count="1" chance="0" /> <!-- Ruler's Authority - Chaos Lv. 3 -->
        <production id="81751" count="1" chance="15" /> <!-- Ruler's Authority - Chaos Lv. 3 -->
        <production id="48417" count="1" chance="85" /> <!-- Ruler's Authority - Genesis Lv. 2 -->
    </item>
 
Код:
enchantmentLevel=""
добавь попробуй
 
keep_enchanted наверное нужон.
вот что за привычка тыкать все подряд в качестве атрибутов :pandaredlol: Не поймет такое парсер, и убедится в этом можно открыв MultisellData.java или multisell.xsd

парсер:
Java:
                            if ("ingredient".equalsIgnoreCase(d.getNodeName()))
                            {
                                final int id = parseInteger(d.getAttributes(), "id");
                                final long count = parseLong(d.getAttributes(), "count");
                                final byte enchantmentLevel = parseByte(d.getAttributes(), "enchantmentLevel", (byte) 0);
                                final Boolean maintainIngredient = parseBoolean(d.getAttributes(), "maintainIngredient", false);
                                final ItemChanceHolder ingredient = new ItemChanceHolder(id, 0, count, enchantmentLevel, maintainIngredient);
                                if (itemExists(ingredient))
                                {
                                    ingredients.add(ingredient);
                                   
                                    lastIngredientId = id;
                                    lastIngredientCount = count;
                                }
                                else
                                {
                                    LOGGER.warning("Invalid ingredient id or count for itemId: " + ingredient.getId() + ", count: " + ingredient.getCount() + " in list: " + listId);
                                    continue;
                                }
                            }
схема:
XML:
                            <xs:element name="ingredient" minOccurs="0" maxOccurs="unbounded">
                                <xs:complexType>
                                    <xs:attribute name="id" type="xs:integer" use="required" />
                                    <xs:attribute name="count" type="xs:positiveInteger" use="required" />
                                    <xs:attribute name="enchantmentLevel" type="xs:integer" />
                                    <xs:attribute name="maintainIngredient" type="xs:boolean" />
                                </xs:complexType>
                            </xs:element>

Шел 2024 год, а разрабы л2ж все продолжали насиловать хмл разметку (удобно вносить изменения и т.п.)
Зачем нам (де)сериализация, используя например тот же json. Перебирая ноды через XmlReader :Wahaha:

uter81, пересмотреть проверки в классе MultiSellChoose, в частности все что связанно с проверками на энчант.

п.с. - Просмотрев часть кода:
Java:
        // Validate the requested item with its full stats.
        //@formatter:off
        if ((itemEnchantment != null) && ((_amount > 1)
            || (itemEnchantment.getEnchantLevel() != _enchantLevel)
            || (itemEnchantment.getAttackElementType() != _attackAttribute)
            || (itemEnchantment.getAttackElementPower() != _attributePower)
            || (itemEnchantment.getAttributeDefence(AttributeType.FIRE) != _fireDefence)
            || (itemEnchantment.getAttributeDefence(AttributeType.WATER) != _waterDefence)
            || (itemEnchantment.getAttributeDefence(AttributeType.WIND) != _windDefence)
            || (itemEnchantment.getAttributeDefence(AttributeType.EARTH) != _earthDefence)
            || (itemEnchantment.getAttributeDefence(AttributeType.HOLY) != _holyDefence)
            || (itemEnchantment.getAttributeDefence(AttributeType.DARK) != _darkDefence)
            || ((itemEnchantment.getAugmentation() == null) && ((_augmentOption1 != 0) || (_augmentOption2 != 0)))
            || ((itemEnchantment.getAugmentation() != null) && ((itemEnchantment.getAugmentation().getOption1Id() != _augmentOption1) || (itemEnchantment.getAugmentation().getOption2Id() != _augmentOption2)))
            || ((_soulCrystalOptions != null) && !itemEnchantment.soulCrystalOptionsMatch(_soulCrystalOptions))
            || ((_soulCrystalOptions == null) && !itemEnchantment.getSoulCrystalOptions().isEmpty())
            || ((_soulCrystalSpecialOptions != null) && !itemEnchantment.soulCrystalSpecialOptionsMatch(_soulCrystalSpecialOptions))
            || ((_soulCrystalSpecialOptions == null) && !itemEnchantment.getSoulCrystalSpecialOptions().isEmpty())
            ))
        //@formatter:on
        {
            PacketLogger.warning("Character: " + player.getName() + " is trying to upgrade equippable item, but the stats doesn't match. Id: " + _listId + " entry: " + _entryId);
            player.setMultiSell(null);
            return;
        }

Java:
            // Check for enchanted level and ingredient count requirements.
            final List<ItemChanceHolder> summedIngredients = new ArrayList<>();
            for (ItemChanceHolder ingredient : entry.getIngredients())
            {
                boolean added = false;
                for (ItemChanceHolder summedIngredient : summedIngredients)
                {
                    if ((summedIngredient.getId() == ingredient.getId()) && (summedIngredient.getEnchantmentLevel() == ingredient.getEnchantmentLevel()))
                    {
                        summedIngredients.add(new ItemChanceHolder(ingredient.getId(), ingredient.getChance(), ingredient.getCount() + summedIngredient.getCount(), ingredient.getEnchantmentLevel(), ingredient.isMaintainIngredient()));
                        summedIngredients.remove(summedIngredient);
                        added = true;
                    }
                }
                if (!added)
                {
                    summedIngredients.add(ingredient);
                }
            }
            for (ItemChanceHolder ingredient : summedIngredients)
            {
                if (ingredient.getEnchantmentLevel() > 0)
                {
                    int found = 0;
                    for (Item item : inventory.getAllItemsByItemId(ingredient.getId(), ingredient.getEnchantmentLevel()))
                    {
                        if (item.getEnchantLevel() >= ingredient.getEnchantmentLevel())
                        {
                            found++;
                        }
                    }
                   
                    if (found < ingredient.getCount())
                    {
                        final SystemMessage sm = new SystemMessage(SystemMessageId.YOU_NEED_A_N_S1);
                        sm.addString("+" + ingredient.getEnchantmentLevel() + " " + ItemData.getInstance().getTemplate(ingredient.getId()).getName());
                        player.sendPacket(sm);
                        return;
                    }
                }
                else if (!checkIngredients(player, list, inventory, clan, ingredient.getId(), Math.multiplyExact(ingredient.getCount(), _amount)))
                {
                    return;
                }
            }
           
            final InventoryUpdate iu = new InventoryUpdate();
            boolean itemEnchantmentProcessed = (itemEnchantment == null);
           
            // Take all ingredients
            for (ItemChanceHolder ingredient : entry.getIngredients())
у меня чуть глаза не вытекли :Bloodnose: какие-то безконечные переборы, цикл в цикле с циклами. Зато версия явы апнута до 21
 
Назад
Сверху Снизу