Форум администраторов игровых серверов

Форум администраторов игровых серверов (https://forum.zone-game.info/TT.php)
-   Игровой клиент (https://forum.zone-game.info/forumdisplay.php?f=54)
-   -   Interlude альтернатива abnormal effect'ам (https://forum.zone-game.info/showthread.php?t=44114)

Sharper 12.08.2019 13:09

Interlude альтернатива abnormal effect'ам
 
Есть задача: создать визуальные эффекты на модельке персонажа на время действия каких-нибудь баффов/дебаффов на нём. Подобное в л2 уже есть, называется abnormal effect (сайленс, стан, корни и т.п.) Но свой abnormal в Interlude добавить довольно сложно (нужно редактировать engine.dll). Можно ли придумать какой-то обходной путь для реализации задачи?
У меня пока только одна идея: через анимацию каста (skill.usk) сделать непрекращающийся эффект на персонаже. Это работает, анимация держится на персонаже столько, сколько ей указываешь в skill.usk, но эта анимация не привязана к эффекту, который висит в строке баффов/дебаффов, т.е. если эффект снять раньше конца анимации - он всё равно будет отображаться, а если скилл скастовать несколько раз на одну цель визуальные эффекты накладываются друг на друга. Решить это видится возможным лишь привязкой анимации к своему эффекту в строке баффов/дебаффов. Для этого уже есть abnormal'ы, но с ними очень трудно работать.

Возможно ли выполнить подобную привязку, чтобы не прибегать к abnormal?

finfan 12.08.2019 13:35

Re: Interlude альтернатива abnormal effect'ам
 
Цитата:

Сообщение от Sharper (Сообщение 434642)
Есть задача: создать визуальные эффекты на модельке персонажа на время действия каких-нибудь баффов/дебаффов на нём. Подобное в л2 уже есть, называется abnormal effect (сайленс, стан, корни и т.п.) Но свой abnormal в Interlude добавить довольно сложно (нужно редактировать engine.dll). Можно ли придумать какой-то обходной путь для реализации задачи?
У меня пока только одна идея: через анимацию каста (skill.usk) сделать непрекращающийся эффект на персонаже. Это работает, анимация держится на персонаже столько, сколько ей указываешь в skill.usk, но эта анимация не привязана к эффекту, который висит в строке баффов/дебаффов, т.е. если эффект снять раньше конца анимации - он всё равно будет отображаться, а если скилл скастовать несколько раз на одну цель визуальные эффекты накладываются друг на друга. Решить это видится возможным лишь привязкой анимации к своему эффекту в строке баффов/дебаффов. Для этого уже есть abnormal'ы, но с ними очень трудно работать.

Возможно ли выполнить подобную привязку, чтобы не прибегать к abnormal?

Abnormal данные для новых "аля эффектов".
Код:

public enum AnotherAbnormals {
    HealEffect(9999)
}

private final int id;

public AnotherAbnormals(int id) {
    this.id = id;
}

Модернизируем DocumentBase или то дерьмо которое отвечает за распарс effects в скилах, чтобы получить эффекты следующей (примерной) записью:
Код:

<effect name="Buff" time="1" count="10" val="0" otherAbnormal="HealEffect"/>
Теперь у нас есть возможность добавлять свои абнормалы и автоматом за счёт дерьмовой системы распарса - распаршивать их правильно.

Запуск абнормалов в игре.
Модифицируем код в родителе L2Effect.java по методу onAction который по дефолту является абстрактным и переделываем по дсебя:

Код:

onAction() {    effected.broadcastPacket(MagicSkillUse(_template.getOtherAbnormal().getId()))
}

Либо модифицировать эффекты с onAction, и в каждой реализации эффекта вроде EffectDamOverTime.java добавлять туда отсыл broadcast (или sendPacket если надо только чтобы цель видела данный эффект визуально (что снизит нагрузон)) пакета MagicSkillUse. Получим следующий механизм:

Каждый тик, эффект будет обрабатывать onAction метод, внутри которого будет ваша реализация broadcastPacket(MagicSkillUse) в который ID вы передаёте из otherAbnormal.getId().

Второй вариант, если нужно, чтобы эффекты работали и без тиков (это полная херня, и лучше сделать все эффекты тиковыми лол, если требуется конкретная реализация этой задачи). Вы вызываете при старте эффекта ThreadpoolManager.schedule(magicSkillUse) и устанавливаете время и период, но при отключении эффекта (при его завершении) надо будет обязательно его отменять аля task.cancel(), в противном случае - эффект будет бесконечным.

ВАЖНО!
Работать корректно будут только те эффекты, которые имеют onActionStartCast анимацию и ВСЁ. Т.е. нельзя будет запихнуть тикающий эффект например виндстрайка, т.к. он состоит из 3-ёх вижов анимации.

VladislavManukhov 13.08.2019 21:06

Re: Interlude альтернатива abnormal effect'ам
 
Цитата:

Сообщение от finfan (Сообщение 434643)
Abnormal данные для новых "аля эффектов".
Код:

public enum AnotherAbnormals {
    HealEffect(9999)
}

private final int id;

public AnotherAbnormals(int id) {
    this.id = id;
}

Модернизируем DocumentBase или то дерьмо которое отвечает за распарс effects в скилах, чтобы получить эффекты следующей (примерной) записью:
Код:

<effect name="Buff" time="1" count="10" val="0" otherAbnormal="HealEffect"/>
Теперь у нас есть возможность добавлять свои абнормалы и автоматом за счёт дерьмовой системы распарса - распаршивать их правильно.

Запуск абнормалов в игре.
Модифицируем код в родителе L2Effect.java по методу onAction который по дефолту является абстрактным и переделываем по дсебя:

Код:

onAction() {    effected.broadcastPacket(MagicSkillUse(_template.getOtherAbnormal().getId()))
}

Либо модифицировать эффекты с onAction, и в каждой реализации эффекта вроде EffectDamOverTime.java добавлять туда отсыл broadcast (или sendPacket если надо только чтобы цель видела данный эффект визуально (что снизит нагрузон)) пакета MagicSkillUse. Получим следующий механизм:

Каждый тик, эффект будет обрабатывать onAction метод, внутри которого будет ваша реализация broadcastPacket(MagicSkillUse) в который ID вы передаёте из otherAbnormal.getId().

Второй вариант, если нужно, чтобы эффекты работали и без тиков (это полная херня, и лучше сделать все эффекты тиковыми лол, если требуется конкретная реализация этой задачи). Вы вызываете при старте эффекта ThreadpoolManager.schedule(magicSkillUse) и устанавливаете время и период, но при отключении эффекта (при его завершении) надо будет обязательно его отменять аля task.cancel(), в противном случае - эффект будет бесконечным.

ВАЖНО!
Работать корректно будут только те эффекты, которые имеют onActionStartCast анимацию и ВСЁ. Т.е. нельзя будет запихнуть тикающий эффект например виндстрайка, т.к. он состоит из 3-ёх вижов анимации.


Я похоу дурачек) Я просто больше по клиент части. Я так и не понял что к чему. точнее цепочку я понял. А вот как, что куда вписывать....

finfan 13.08.2019 21:31

Re: Interlude альтернатива abnormal effect'ам
 
Сначала реши главную задачу - работоспособность.

Тебе понадобиться следующее:

1. Свой абнормал енум для простоты его юза в будущем
https://mmo-develop.ru/attachments/s...t_1-png.26628/

2. Найди код EffectDamOverTime.java и добавь что-то похожее на это
https://mmo-develop.ru/attachments/s...t_2-png.26629/

Зайди в игру, и првоерь работспособность используя на цель любой скилл с таким эффектом, например Bleed (ID: 96)

Жертва под кровотоком должна будет проигрывать анимацию бафа Might https://mmo-develop.ru/attachments/s...t_3-png.26630/ каждые N секунд установленные в эффекте.

Если всё будет работать, дальше я уверен ты найдёшь как сделать так, чтобы такая хрень была автоматической - используя механизм парса эффектов (модифицуруя его собственноручно)

Главную роль тут играет ID в енуме: 4365 я его взял не с небес. Это мгновенный эффект от Might бафа, с оффициальным названием: skill.mu.4365 в skillgrp.dat файле в папке system клиента.

Оппортунизм в том, чтобы твой шарик летающий вокруг цели в течение всего времени эффекта, имел в исходах следующее говно:

Это правильно, так эффект не будет тормозить чара и всё будет проигрываться как у мужика.
https://mmo-develop.ru/attachments/s...t_4-png.26631/

А вот это - проигрываться будет только базово + будет тормозить игрока (будет своеобразный ступор происходить визуально)
https://mmo-develop.ru/attachments/s...t_5-png.26632/

Смысл в том, что мгновенно эффект будет проигрываться только если установлено хоть 1 хоть 100 анимаций но в колонку CastingActions, никаких ShotActions и других не должно быть, иначе пососать.


Текущее время: 12:33. Часовой пояс GMT +3.

Powered by vBulletin® Version 3.8.6
Copyright ©2000 - 2024, Jelsoft Enterprises Ltd. Перевод: zCarot