Visual onyx recharge effect.

neilperry

Свой человек
Участник
Сообщения
18
Розыгрыши
0
Репутация
11
Реакции
7
Баллы
538
Хроники
  1. Prologue: Prelude of War
Сборка
L2J_Mobius_Essence_5.0_Sylph (protocol 306)
Добрый день.
Подскажите, может кто пытался реализовать визуальный эффект речарджа оникса на сборках мобиуса или l2jorg.
Данная тема уже обсуждалась на сборках старых классик и мейн протоколов grand cursade и fafurion. Там реализация через скрипт broochjewel и playerinstance работает прекрасно для реализации визуальных эффектов от рубина и сапфира.
Пробовал переписать данный скрипт под оникс, заменяя айди предметов и скилов и убирать переменную boolean _is ruby, так как в эсенсе оникс работает для двух значений.
После различных манипуляций в xmlках и ядре оникс начал корректно работать, но визуальный заряд от шотов так и не появился (если в слоте брошке находится оникс 1 и 2 лвл работает дефолтный заряд соулшотов и спиритшотов, с 3 лвла оникса визуальный эффект заряда вообще перестает работать, но удар по мобу от шота меняет цвет). Чувствую, что я где-то близко к истине.
Есть такая вероятность, что айдишники визуального эффекта от предмета и скилла отличаются в dat файлах протоколов 286 и 306?
Хотя если задать параметр скилу оникса, как A1, то эффект речарджа появляется, но эффект не подгружается к автономному использованию шотов.
Заранее благодарю.
 
Ну по идее ведь измененный вид заряда можно показывать просто броадкастом юза определенных скиллов, так что главное найти нужные скиллы и слать MSU с ними при зарядке соответствующих шотов.
В мобиусе ж есть наверное аналог оверовских хэндлеров предметов на тему зарядки шотов? там это все и дописать.

Для примера, у меня фрагмент в хэндлерах шотов, отвечающий за показ правильной анимации заряда разных шотов.
Для ситуаций с одетыми рубином/сапфиром нужный скилл определяется по статам SS_EFFECT/SPS_EFFECT (значение статы зависит от уровня камня, в диапазоне от 1 до 6)
Java:
    private static final int[][] _shotEffectId = {
        // NG, D, C, B, A, S+, R+, , , BEAST
        { 2039, 2150, 2151, 2152, 2153, 2154, 9193, 0, 0, 2033 }, // Soul Shot
        { 2061, 2155, 2156, 2157, 2158, 2159, 9194, 0, 0, 2008 }, // Spirit Shot
        { 2061, 2160, 2161, 2162, 2163, 2164, 9195, 0, 0, 2009 } }; // Blessed Spirit Shot

    protected static final Skill[][] _shotEffect = {
        // Soul Shot | Ruby
        {
            null,
            SkillHolder.getInstance().getSkill(17814, 1),
            SkillHolder.getInstance().getSkill(17814, 2),
            SkillHolder.getInstance().getSkill(17815, 1),
            SkillHolder.getInstance().getSkill(17816, 1),
            SkillHolder.getInstance().getSkill(17817, 1),
            SkillHolder.getInstance().getSkill(18715, 1)
        },
        // Spirit Shot | Sapphire
        {
            null,
            SkillHolder.getInstance().getSkill(17818, 1),
            SkillHolder.getInstance().getSkill(17818, 2),
            SkillHolder.getInstance().getSkill(17819, 1),
            SkillHolder.getInstance().getSkill(17820, 1),
            SkillHolder.getInstance().getSkill(17821, 1),
            SkillHolder.getInstance().getSkill(18718, 1)
        },
        // Blessed Spirit Shot | Sapphire
        {
            null,
            SkillHolder.getInstance().getSkill(17818, 3),
            SkillHolder.getInstance().getSkill(17818, 4),
            SkillHolder.getInstance().getSkill(17819, 2),
            SkillHolder.getInstance().getSkill(17820, 2),
            SkillHolder.getInstance().getSkill(17821, 2),
            SkillHolder.getInstance().getSkill(18718, 2)
        } };

    protected static void broadcastShotEffect(Creature owner, Creature target, int type, int grade)
    {
        int shotEffect = (int) owner.calcStat(type == 0 ? Stats.SS_EFFECT : Stats.SPS_EFFECT);

        if (shotEffect == 0)
            target.broadcastPacket(new MagicSkillUse(target, _shotEffectId[type][grade], 1, 0, 0));
        else
            target.broadcastPacket(new MagicSkillUse(target, _shotEffect[type][shotEffect]));
    }
 
Последнее редактирование:
Оно было реализовано в фафурион сборке таким образом:
Заряд шота -> активейт слота в брошке -> подгрузка айдишников из енума (хэндлер брушджевела) -> шоты в итемхэндлерах


Спасибо за пример. Сейчас попробую реализовать в хэндлерах шотов.
 
Ну а в скиллах это выглядит к примеру так, ну для овера - в данном случае за выбранный для броадкаста скилл отвечает стата ssEffect
XML:
    <skill id="18717" levels="6" name="Рубин">
        <!--
            [01] Урон от Зарядов Души / Зарядов Души Зверя +1%.
            [02] Урон от Зарядов Души / Зарядов Души Зверя +3.5%.
            [03] Урон от Зарядов Души / Зарядов Души Зверя +7.5%.
            [04] Урон от Зарядов Души / Зарядов Души Зверя +12.5%.
            [05] Урон от Зарядов Души / Зарядов Души Зверя +20%.
            [06] Урон от Зарядов Души / Зарядов Души Зверя +20%, Физ. Атк. +9%.
        -->
        <table name="#icon">icon.etc_bm_jewel_ruby_i00 icon.etc_bm_jewel_ruby_i00 icon.etc_bm_jewel_ruby_i00 icon.etc_bm_jewel_ruby_i00 icon.etc_bm_jewel_ruby_i00 icon.bm_jewel_ssdmg_high_lv1_lavianrose</table>
        <table name="#val1">1 2 3 4 5 6</table>
        <table name="#val2">0.010 0.035 0.075 0.125 0.2 0.2</table>
        <table name="#val3">1.0 1.0 1.0 1.0 1.0 1.09</table>
        <stat name="icon" value="#icon" />
        <stat name="target" value="SELF" />
        <stat name="skillType" value="BUFF" />
        <stat name="operateType" value="OP_PASSIVE" />
        <for>
            <set order="0x10" stat="ssEffect" value="#val1" />
            <add order="0x40" stat="ssBonus" value="#val2" />
            <mul order="0x30" stat="pAtk" value="#val3" />
        </for>
    </skill>
ну а в мобиусе просто запилить к примеру какой-то pump-эффект, который добавить в скиллы нужных камней и который будет выставлять на время своего действия переменную, указывающую какой скилл броадкастить

Ну и чтоб было понятней по параметрам метода, делающего броадкаст скилла шотов - что передается в него в разных ситуациях:
Код:
обычные соулшоты:
broadcastShotEffect(player, player, 0, weaponItem.getGrade().getGroup());

обычные спиритшоты:
broadcastShotEffect(player, player, 1, weaponItem.getGrade().getGroup());

блессед спиритшоты:
broadcastShotEffect(player, player, 2, weaponItem.getGrade().getGroup());

бист соулшоты:
broadcastShotEffect(player, summon, 0, 9);

бист спиритшоты:
broadcastShotEffect(player, summon, 1, 9);

бист блессед спиритшоты:
broadcastShotEffect(player, summon, 2, 9);
 
А я же правильно понимаю, что айдишники в клиенте работают следующим образом?

AdditionalSoulshotEffect.dat выдает айдишники айтемов с эффектом удара
AdditionalJewelEquipEffect.dat выдает айдишники скилов с эффектом речарджа шотов

В итоге получается, что в хэндлере шотов я должен прописать модуль shoteffect с айди айтема и айди скилла?
 
Ну я не знаю как там у тебя в мобиусе реализовано конкретно.
Как выше уже видно - я у себя не по эквипнутым камням определяю а по стате из скилла в них, т.е. мне не требуется каждый раз при заряде проверять - одет или нет подходящий камень.
 
Оффтоп:
Не советую юзать l2jorg, там есть бэкдоры.
 
  • Мне нравится
Реакции: kick
Назад
Сверху Снизу