<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>
<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, добавь его к бижеМучаю исходы мобиуса, хроники андеграунд.
Подскажите каким образом можно реализовать, вот допустим есть у нас блесс веспер серьга, она дает мп и резист к стану, резист к стану реализован через пассивный скилл, но если же надеваешь две таких бижи, скилл дается один и естественно резист увеличивается в один раз, а как сделать чтобы бонусы умножались?
Вот сам итем:
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>
???rosylik, получится две одинаковые внешне серьги, но если перепутать ид и надеть две одинаковые - будет та же история.
Выход - в статы самой серьги написать все резисты, а скил убрать вовсе.
<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>
ну вообще две одинаковых серьги и не должны давать статы х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 )Мучаю исходы мобиуса, хроники андеграунд.
Подскажите каким образом можно реализовать, вот допустим есть у нас блесс веспер серьга, она дает мп и резист к стану, резист к стану реализован через пассивный скилл, но если же надеваешь две таких бижи, скилл дается один и естественно резист увеличивается в один раз, а как сделать чтобы бонусы умножались?
Вот сам итем:
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>
<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>
<add order="0x40" stat="statName" value="10" />
<add order="0x40" stat="statName" value="10">
<using twoIdentical="RING" />
</add>
тут остается прикол, что нужно все равно всем кольцам давать эффекты, ибо один и тот же эффект не может быть наложен дважды...или впилить кондишны в эффекты, если таких нет и вобще такое поддерживается.
чтобы чекалась экипированная бижа и дополнительные статы давались только если одето к примеру два одинаковых кольца.
В сервере на базе овера это бы выглядело примерно так:
т.е. вторая стата прибавится только в случае когда кондишн проверит что экипировано два одинаковых кольцаКод:<add order="0x40" stat="statName" value="10" /> <add order="0x40" stat="statName" value="10"> <using twoIdenticalRings="true" /> </add>
Так тогда почему не дописать что эффекты с Id таким то могут накладываться дважды? )тут остается прикол, что нужно все равно всем кольцам давать эффекты, ибо один и тот же эффект не может быть наложен дважды...
К этому и пытаюсь прийти, как это реализовать пока не придумал...Так тогда почему не дописать что эффекты с Id таким то могут накладываться дважды? )
+++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;
}
Яб до такого не додумалсяПрошу прощения, что влезаю в вашу беседу, но решение этой задачи буквально на поверхности, хоть и требует не большой доработки напильником.
Как вариант:
в 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 думаю додумаете сами, принцип вроде описал понятно.
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];
}
.....
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++;
++ }
.....
необязательно - если не сильно волнует что в клиенте не будет писаться что при двух одетых бижах бонус больше, то можно просто слать фейковый уровень для несуществующих в клиенте уровней.Из минусов - нужно добавлять уровень умения и в клиенте
Без разницы на скилл, он вообще может не отображаться, суть только в том, чтобы давались статы, сами же статы, будут указаны на биженеобязательно - если не сильно волнует что в клиенте не будет писаться что при двух одетых бижах бонус больше, то можно просто слать фейковый уровень для несуществующих в клиенте уровней.
т.е. банально для вторго уровня к примеру все равно слать первый уровень.
в том же овере это к примеру параметры displayId/displayLevel, позволяющие подменять в клиенте информацию о реально наложенном скилле на другую.
We use cookies and similar technologies for the following purposes:
Do you accept cookies and these technologies?
We use cookies and similar technologies for the following purposes:
Do you accept cookies and these technologies?