Статы бижутерии

  • Автор темы Автор темы Reboot
  • Дата начала Дата начала

Reboot

Знаменитый
Пользователь
Сообщения
51
Розыгрыши
0
Репутация
1
Реакции
1
Баллы
1 250
Хроники
  1. Infinite Odyssey
Сборка
l2jmobius
Мучаю исходы мобиуса, хроники андеграунд.
Подскажите каким образом можно реализовать, вот допустим есть у нас блесс веспер серьга, она дает мп и резист к стану, резист к стану реализован через пассивный скилл, но если же надеваешь две таких бижи, скилл дается один и естественно резист увеличивается в один раз, а как сделать чтобы бонусы умножались?
Вот сам итем:

XML:
<item id="16376" name="Vesper Earring" type="Armor">
        <!-- Masterwork Item that increases MP + 37, Sleep Resistance, and Hold Resistance. -->
        <set name="icon" val="icon.vesper_earring_i00" />
        <set name="default_action" val="EQUIP" />
        <set name="bodypart" val="rear;lear" />
        <set name="immediate_effect" val="true" />
        <set name="crystal_count" val="364" />
        <set name="crystal_type" val="S80" />
        <set name="material" val="SILVER" />
        <set name="weight" val="150" />
        <set name="price" val="11394000" />
        <set name="enchant_enabled" val="true" />
        <set name="commissionItemType" val="EARRING" />
        <skills>
            <skill id="8455" level="1" /> <!-- Vesper Earring -->
        </skills>
        <stats>
            <stat type="mDef">94</stat>
            <stat type="maxMp">37</stat>
        </stats>
    </item>

Вот скилл 8455, который дает резист:
XML:
    <skill id="8455" toLevel="1" name="Vesper Earring">
        <!-- Increases Sleep/Hold Resistance. -->
        <icon>icon.vesper_earring_i00</icon>
        <magicLevel>80</magicLevel>
        <operateType>P</operateType>
        <magicCriticalRate>5</magicCriticalRate>
        <effects>
            <effect name="DefenceTrait">
                <SLEEP>5</SLEEP>
                <HOLD>5</HOLD>
            </effect>
        </effects>
    </skill>
 
Мучаю исходы мобиуса, хроники андеграунд.
Подскажите каким образом можно реализовать, вот допустим есть у нас блесс веспер серьга, она дает мп и резист к стану, резист к стану реализован через пассивный скилл, но если же надеваешь две таких бижи, скилл дается один и естественно резист увеличивается в один раз, а как сделать чтобы бонусы умножались?
Вот сам итем:

XML:
<item id="16376" name="Vesper Earring" type="Armor">
        <!-- Masterwork Item that increases MP + 37, Sleep Resistance, and Hold Resistance. -->
        <set name="icon" val="icon.vesper_earring_i00" />
        <set name="default_action" val="EQUIP" />
        <set name="bodypart" val="rear;lear" />
        <set name="immediate_effect" val="true" />
        <set name="crystal_count" val="364" />
        <set name="crystal_type" val="S80" />
        <set name="material" val="SILVER" />
        <set name="weight" val="150" />
        <set name="price" val="11394000" />
        <set name="enchant_enabled" val="true" />
        <set name="commissionItemType" val="EARRING" />
        <skills>
            <skill id="8455" level="1" /> <!-- Vesper Earring -->
        </skills>
        <stats>
            <stat type="mDef">94</stat>
            <stat type="maxMp">37</stat>
        </stats>
    </item>

Вот скилл 8455, который дает резист:
XML:
    <skill id="8455" toLevel="1" name="Vesper Earring">
        <!-- Increases Sleep/Hold Resistance. -->
        <icon>icon.vesper_earring_i00</icon>
        <magicLevel>80</magicLevel>
        <operateType>P</operateType>
        <magicCriticalRate>5</magicCriticalRate>
        <effects>
            <effect name="DefenceTrait">
                <SLEEP>5</SLEEP>
                <HOLD>5</HOLD>
            </effect>
        </effects>
    </skill>
Скопируй такой же скил, и добавь его с другим id, добавь его к биже
 
@rosylik, получится две одинаковые внешне серьги, но если перепутать ид и надеть две одинаковые - будет та же история. :D

Выход - в статы самой серьги написать все резисты, а скил убрать вовсе.
 
@rosylik, получится две одинаковые внешне серьги, но если перепутать ид и надеть две одинаковые - будет та же история. :D

Выход - в статы самой серьги написать все резисты, а скил убрать вовсе.
???

Код:
<item id="16376" name="Vesper Earring" type="Armor">
        <!-- Masterwork Item that increases MP + 37, Sleep Resistance, and Hold Resistance. -->
        <set name="icon" val="icon.vesper_earring_i00" />
        <set name="default_action" val="EQUIP" />
        <set name="bodypart" val="rear;lear" />
        <set name="immediate_effect" val="true" />
        <set name="crystal_count" val="364" />
        <set name="crystal_type" val="S80" />
        <set name="material" val="SILVER" />
        <set name="weight" val="150" />
        <set name="price" val="11394000" />
        <set name="enchant_enabled" val="true" />
        <set name="commissionItemType" val="EARRING" />
        <skills>
            <skill id="8455" level="1" /> <!-- Vesper Earring -->
  <skill id="8456" level="1" /> <!-- Vesper Earring -->
        </skills>
        <stats>
            <stat type="mDef">94</stat>
            <stat type="maxMp">37</stat>
        </stats>
    </item>


////СКИЛЛы
 <skill id="8455" toLevel="1" name="Vesper Earring">
        <!-- Increases Sleep/Hold Resistance. -->
        <icon>icon.vesper_earring_i00</icon>
        <magicLevel>80</magicLevel>
        <operateType>P</operateType>
        <magicCriticalRate>5</magicCriticalRate>
        <effects>
            <effect name="DefenceTrait">
                <SLEEP>5</SLEEP>
                <HOLD>5</HOLD>
            </effect>
        </effects>
    </skill>
 <skill id="8456" toLevel="1" name="Vesper Earring">
        <!-- Increases Sleep/Hold Resistance. -->
        <icon>icon.vesper_earring_i00</icon>
        <magicLevel>80</magicLevel>
        <operateType>P</operateType>
        <magicCriticalRate>5</magicCriticalRate>
        <effects>
            <effect name="DefenceTrait">
                <SLEEP>5</SLEEP>
                <HOLD>5</HOLD>
            </effect>
        </effects>
    </skill>
 
@rosylik, ну вот в предложенном Вами варианте что мы на выходе иметь будем?
Серьга 16376 со скиллом 8455 и еще одна 16377 со скиллом 8456? А если я две надену 16376 или две 16377? Или делать левую и правую? :D Почему бы сразу в статы серьги не записать резисты?
 
Все, я неправильно прочитал топик стартера.
 
  • Мне нравится
Реакции: Rolo
Мучаю исходы мобиуса, хроники андеграунд.
Подскажите каким образом можно реализовать, вот допустим есть у нас блесс веспер серьга, она дает мп и резист к стану, резист к стану реализован через пассивный скилл, но если же надеваешь две таких бижи, скилл дается один и естественно резист увеличивается в один раз, а как сделать чтобы бонусы умножались?
Вот сам итем:

XML:
<item id="16376" name="Vesper Earring" type="Armor">
        <!-- Masterwork Item that increases MP + 37, Sleep Resistance, and Hold Resistance. -->
        <set name="icon" val="icon.vesper_earring_i00" />
        <set name="default_action" val="EQUIP" />
        <set name="bodypart" val="rear;lear" />
        <set name="immediate_effect" val="true" />
        <set name="crystal_count" val="364" />
        <set name="crystal_type" val="S80" />
        <set name="material" val="SILVER" />
        <set name="weight" val="150" />
        <set name="price" val="11394000" />
        <set name="enchant_enabled" val="true" />
        <set name="commissionItemType" val="EARRING" />
        <skills>
            <skill id="8455" level="1" /> <!-- Vesper Earring -->
        </skills>
        <stats>
            <stat type="mDef">94</stat>
            <stat type="maxMp">37</stat>
        </stats>
    </item>

Вот скилл 8455, который дает резист:
XML:
    <skill id="8455" toLevel="1" name="Vesper Earring">
        <!-- Increases Sleep/Hold Resistance. -->
        <icon>icon.vesper_earring_i00</icon>
        <magicLevel>80</magicLevel>
        <operateType>P</operateType>
        <magicCriticalRate>5</magicCriticalRate>
        <effects>
            <effect name="DefenceTrait">
                <SLEEP>5</SLEEP>
                <HOLD>5</HOLD>
            </effect>
        </effects>
    </skill>
ну вообще две одинаковых серьги и не должны давать статы х2
или что-то свое пилите?
 
Мучаю исходы мобиуса, хроники андеграунд.
Подскажите каким образом можно реализовать, вот допустим есть у нас блесс веспер серьга, она дает мп и резист к стану, резист к стану реализован через пассивный скилл, но если же надеваешь две таких бижи, скилл дается один и естественно резист увеличивается в один раз, а как сделать чтобы бонусы умножались?
Вот сам итем:

XML:
<item id="16376" name="Vesper Earring" type="Armor">
        <!-- Masterwork Item that increases MP + 37, Sleep Resistance, and Hold Resistance. -->
        <set name="icon" val="icon.vesper_earring_i00" />
        <set name="default_action" val="EQUIP" />
        <set name="bodypart" val="rear;lear" />
        <set name="immediate_effect" val="true" />
        <set name="crystal_count" val="364" />
        <set name="crystal_type" val="S80" />
        <set name="material" val="SILVER" />
        <set name="weight" val="150" />
        <set name="price" val="11394000" />
        <set name="enchant_enabled" val="true" />
        <set name="commissionItemType" val="EARRING" />
        <skills>
            <skill id="8455" level="1" /> <!-- Vesper Earring -->
        </skills>
        <stats>
            <stat type="mDef">94</stat>
            <stat type="maxMp">37</stat>
        </stats>
    </item>

Вот скилл 8455, который дает резист:
XML:
    <skill id="8455" toLevel="1" name="Vesper Earring">
        <!-- Increases Sleep/Hold Resistance. -->
        <icon>icon.vesper_earring_i00</icon>
        <magicLevel>80</magicLevel>
        <operateType>P</operateType>
        <magicCriticalRate>5</magicCriticalRate>
        <effects>
            <effect name="DefenceTrait">
                <SLEEP>5</SLEEP>
                <HOLD>5</HOLD>
            </effect>
        </effects>
    </skill>
Сделайте как сет брони ( game\data\stats\armorsets\Sets.xml )
К примеру вот Сияние Наследника и Диадемы Власти;
Код:
<set id="323" minimumPieces="2">
        <requiredItems>
            <item id="29752" /> <!-- Heir's Radiance Lv. 3 (PvE) -->
            <item id="29756" /> <!-- Heir's Radiance Lv. 3 (PvP) -->
            <item id="48202" /> <!-- Warrior's Circlet -->
            <item id="48203" /> <!-- Noble Warrior's Circlet -->
            <item id="48204" /> <!-- Radiant Warrior's Circlet -->
        </requiredItems>
        <skills>
            <skill id="29393" level="2" minimumPieces="2" /> <!-- Warrior's Heir -->
        </skills>
    </set>
 
  • Мне нравится
Реакции: Rolo
@MrKirill1232, ну да, видимо единственный вариант, прийдется делать очень много сетов...
 
или впилить кондишны в эффекты, если таких нет и вобще такое поддерживается.
чтобы чекалась экипированная бижа и дополнительные статы давались только если одето к примеру два одинаковых кольца.

В сервере на базе овера это бы выглядело примерно так:
Код:
<add order="0x40" stat="statName" value="10" />
<add order="0x40" stat="statName" value="10">
    <using twoIdentical="RING" />
</add>
т.е. вторая стата прибавится только в случае когда сработает кондишн на наличие двух экипированных одинаковых колец.
 
  • Мне нравится
Реакции: Rolo
или впилить кондишны в эффекты, если таких нет и вобще такое поддерживается.
чтобы чекалась экипированная бижа и дополнительные статы давались только если одето к примеру два одинаковых кольца.

В сервере на базе овера это бы выглядело примерно так:
Код:
<add order="0x40" stat="statName" value="10" />
<add order="0x40" stat="statName" value="10">
    <using twoIdenticalRings="true" />
</add>
т.е. вторая стата прибавится только в случае когда кондишн проверит что экипировано два одинаковых кольца
тут остается прикол, что нужно все равно всем кольцам давать эффекты, ибо один и тот же эффект не может быть наложен дважды...
 
Обратите внимание, что данный пользователь заблокирован! Не совершайте с ним никаких сделок! Перейдите в его профиль, чтобы узнать причину блокировки.
тут остается прикол, что нужно все равно всем кольцам давать эффекты, ибо один и тот же эффект не может быть наложен дважды...
Так тогда почему не дописать что эффекты с Id таким то могут накладываться дважды? )
 
Прошу прощения, что влезаю в вашу беседу, но решение этой задачи буквально на поверхности, хоть и требует не большой доработки напильником.
Как вариант:
в L2Character добавляем List<int>, например _doubledSkills, куда будут складываться задвоенные эффекты

Там же правим функции addSkill и removeSkill. Суть - там фактически происходит "вытеснение" старого эффекта
и если мы добавляя скил, вытесняем его и этот скил входит в список тех что можно задвоить - добавляем в skill.id в список задвоенных скилов _doubledSkills
и не вытесняем старый эффект.
В removeSkill делаем обратную проверку - что если убираемый skill.id есть в _doubledSkills, мы убираем его из _doubledSkills, делаем конкретно на его стату разовый removeStatFunc (удаляя одну из двух наложенных StatFunction), а полностью убираем эффект только если скил не присутствует в списке задвоенных
Кусок кода взят из оригинального l2j, исключительно как образец в какую сторону копать

... gameserver\model\actor\L2Character.java
Код:
+++private volatile List<int> _doubledSkills = new ArrayList<>();
    public Skill addSkill(Skill newSkill) {
        Skill oldSkill = null;
        if (newSkill != null) {
            // Replace oldSkill by newSkill or Add the newSkill
            oldSkill = _skills.put(newSkill.getId(), newSkill);
            // If an old skill has been replaced, remove all its Func objects
            if (oldSkill != null) {
++++ if ((oldSkill.Id == bla bla bla ) && (!_doubledSkills.Contains(oldSkill.Id)) { // -вместо bla bla bla можно хоть отдельный словарь запилить с разрешенными для задвоения id
++++                 _doubleEffects.put(oldSkill.Id)
++++ }    else {
                removeStatsOwner(oldSkill);
                if (oldSkill.isPassive()) {
                    stopSkillEffects(false, oldSkill.getId());
                }
+++ }
            }
            // Add Func objects of newSkill to the calculator set of the L2Character
            addStatFuncs(newSkill.getStatFuncs(null, this));
            
            if (newSkill.isPassive()) {
                newSkill.applyEffects(this, this, false, true, false, 0);
            }
        }
        return oldSkill;
    }
- исключительно черновик накиданный за пару минут раздумий, ни в коем случае не для продакшна;
пример для removeSkill думаю додумаете сами, принцип вроде описал понятно.
 
  • Мне нравится
Реакции: Rolo

    Rolo

    Баллов: 9
    За сообщение
Прошу прощения, что влезаю в вашу беседу, но решение этой задачи буквально на поверхности, хоть и требует не большой доработки напильником.
Как вариант:
в L2Character добавляем List<int>, например _doubledSkills, куда будут складываться задвоенные эффекты

Там же правим функции addSkill и removeSkill. Суть - там фактически происходит "вытеснение" старого эффекта
и если мы добавляя скил, вытесняем его и этот скил входит в список тех что можно задвоить - добавляем в skill.id в список задвоенных скилов _doubledSkills
и не вытесняем старый эффект.
В removeSkill делаем обратную проверку - что если убираемый skill.id есть в _doubledSkills, мы убираем его из _doubledSkills, делаем конкретно на его стату разовый removeStatFunc (удаляя одну из двух наложенных StatFunction), а полностью убираем эффект только если скил не присутствует в списке задвоенных
Кусок кода взят из оригинального l2j, исключительно как образец в какую сторону копать

... gameserver\model\actor\L2Character.java
Код:
+++private volatile List<int> _doubledSkills = new ArrayList<>();
    public Skill addSkill(Skill newSkill) {
        Skill oldSkill = null;
        if (newSkill != null) {
            // Replace oldSkill by newSkill or Add the newSkill
            oldSkill = _skills.put(newSkill.getId(), newSkill);
            // If an old skill has been replaced, remove all its Func objects
            if (oldSkill != null) {
++++ if ((oldSkill.Id == bla bla bla ) && (!_doubledSkills.Contains(oldSkill.Id)) { // -вместо bla bla bla можно хоть отдельный словарь запилить с разрешенными для задвоения id
++++                 _doubleEffects.put(oldSkill.Id)
++++ }    else {
                removeStatsOwner(oldSkill);
                if (oldSkill.isPassive()) {
                    stopSkillEffects(false, oldSkill.getId());
                }
+++ }
            }
            // Add Func objects of newSkill to the calculator set of the L2Character
            addStatFuncs(newSkill.getStatFuncs(null, this));
           
            if (newSkill.isPassive()) {
                newSkill.applyEffects(this, this, false, true, false, 0);
            }
        }
        return oldSkill;
    }
- исключительно черновик накиданный за пару минут раздумий, ни в коем случае не для продакшна;
пример для removeSkill думаю додумаете сами, принцип вроде описал понятно.
Яб до такого не додумался :Coowl:
 
Прошу извинить, не доглядел один важный момент, подводный камень - removeFunc не удаляет одну взятую StatFunction,
а пересоздает весь массив, не включая в него statFunction, если верить оригинальным исходникам l2j, а в нашем случае statFunction для одного и того же скила, примененного дважды, будет дважды одинаковым. Проблема тут сразу в двух местах - во первых, удалятся обе statFunction при снятии одного из элементов бижутерии, а во вторых - пересозданный массив _functions будет иметь бОльшую длину, чем должен быть, а значит при каждом обращении к массиву функций нужно будет проверять что значение не null, что будет нести серьезные накладные расходы, да и правок по всему калькулятору для внедрения этой проверки будет не мало.
gameserver\model\stats\Calculator.java
Код:
    public synchronized void removeFunc(AbstractFunction function) {
        AbstractFunction[] funcs = _functions;
        AbstractFunction[] tmp = new AbstractFunction[funcs.length - 1]; // << проблема тут
        
        int i;
        
        for (i = 0; (i < (funcs.length - 1)) && (function != funcs[i]); i++) { // << и проблема тут
            tmp[i] = funcs[i];
        }
        
        .....
и чтоб обойти эту проблему, потребуется модифицировать еще и эту функцию, чтоб statFunction удалялась лишь один раз.

Код:
public synchronized void removeFunc(AbstractFunction function) {
        AbstractFunction[] funcs = _functions;
        AbstractFunction[] tmp = new AbstractFunction[funcs.length - 1];

        int i; // итератор старого массива

--        for (i = 0; (i < (funcs.length - 1)) && (function != funcs[i]); i++) {
--            tmp[i] = funcs[i];
--        }

++        int j = 0; // итератор нового массива, на выходе должен получиться равный значению funcs.length - 1
++        boolean _removed =false;
++        for (i = 0; i < funcs.length; i++) 
++        {
++            if ((function == funcs[i]) && !_removed) 
++            {    
++                _removed = true;
++                continue;
++            }
++            tmp[j] = funcs[i];
++            j++;
++        }

        .....
 
  • Мне нравится
Реакции: Rolo
Или добавить еще один уровень скилла, и выдавать при условии, что надеты две одинаковые бижи
Из минусов - нужно добавлять уровень умения и в клиенте
Из плюсов - меньше кода и костылей, позволит видить игрокам "буст", так как скилы будут отображатся в пассивках
 
Из минусов - нужно добавлять уровень умения и в клиенте
необязательно - если не сильно волнует что в клиенте не будет писаться что при двух одетых бижах бонус больше, то можно просто слать фейковый уровень для несуществующих в клиенте уровней.
т.е. банально для вторго уровня к примеру все равно слать первый уровень.
в том же овере это к примеру параметры displayId/displayLevel, позволяющие подменять в клиенте информацию о реально наложенном скилле на другую.
 
необязательно - если не сильно волнует что в клиенте не будет писаться что при двух одетых бижах бонус больше, то можно просто слать фейковый уровень для несуществующих в клиенте уровней.
т.е. банально для вторго уровня к примеру все равно слать первый уровень.
в том же овере это к примеру параметры displayId/displayLevel, позволяющие подменять в клиенте информацию о реально наложенном скилле на другую.
Без разницы на скилл, он вообще может не отображаться, суть только в том, чтобы давались статы, сами же статы, будут указаны на биже

@Influence, это вы имеете ввиду тот же вариант с арморсет? то есть если две бижи скилл = такой? а не будет ли так, что одна бижа скиллид = 1, а если две бижи сет скиллид = 1, 2 выдает?

В общем печальные исходы эти мобиус, так неудобно все сделано, есть ли более менее исходники год, где реализованы скилы, на квесты и прочее все равно, все будет переделано, что можно взять для основы?
 
есть ли более менее исходники год, где реализованы скилы, на квесты и прочее все равно, все будет переделано, что можно взять для основы?
разве что брать что-то на базе овера к примеру и допиливать самому :)
 
Назад
Сверху Снизу