Рейтинг темы:
  • 0 Голос(ов) - 0 в среднем
  • 1
  • 2
  • 3
  • 4
  • 5
событие удара моба
#1
Приветствую.

Подскажите - как отловить событие удара по мобу или рб?
Копался копался и не нашел ничего подобного(

Сборка Frozen IL
Ответ
#2
slayer48 Написал:Приветствую.

Подскажите - как отловить событие удара по мобу или рб?
Копался копался и не нашел ничего подобного(

Сборка Frozen IL

Юзайте ивент onAttack(npc, attacker) где аттакер плеер, нпц - моб/рб/ че хош
Ответ
#3
GenCloud Написал:Юзайте ивент onAttack(npc, attacker) где аттакер плеер, нпц - моб/рб/ че хош

Смотрел, подобный метод нигде не обьявлен в сборке...

В первую очередь насколько я понимаю в L2Character.

Есть только квестовые onAttack в АИ эпиков, т.е. Quest:

public String onAttack (L2NpcInstance npc, L2PcInstance attacker, int damage, boolean isPet)
Ответ
#4
да и Quest здесь не подходит.. мне нужно подвязать этот метод абсолютно для всех мобов/рб, экземпляров класса.

что никто не знает?:eek:
Ответ
#5
Код:
/**
* Класс реализующий список слушателей для каждого типа интерфейса.
*
* @author G1ta0
*
* @param <T> базовый интерфейс слушателя
*/
public class ListenerList<T> implements Closeable {
    protected UnsafeCopyOnWriteArraySet<Listener<T>> listeners = new UnsafeCopyOnWriteArraySet<>();

    public Object[] getListeners() {
        return listeners.getUnsafeArray();
    }
    
    /**
     * Добавить слушатель в список
     * @param listener
     * @return возвращает true, если слушатель был добавлен
     */
    public boolean add(Listener<T> listener) {
        return listeners.add(listener);
    }

    /**
     * Удалить слушатель из списка.
     * Не вызывает закрытие слушателя!
     * @param listener
     * @return возвращает true, если слушатель был удален
     */
    public boolean remove(Listener<T> listener) {
        return listeners.remove(listener);
    }

    /**
     * Освобождает ресурсы занятые слушателями и очищает лист слушателей
     */
    @SuppressWarnings("unchecked")
    @Override
    public void close() {
        for(Object listener : getListeners())
            ((Listener<T>)listener).close();
        
        listeners.clear();
    }
}

Код:
/**
* @author Ro0TT
* @date 13.01.2013
*/
@Refactored(date="20.03.2015", author="PointerRage")
@AllArgsConstructor
public class CharListenerList extends ListenerList<L2Character> {
    @Getter(value=AccessLevel.PROTECTED) private final static UnsafeCopyOnWriteArraySet<Listener<L2Character>> global = new UnsafeCopyOnWriteArraySet<>();
    @Getter protected final L2Character actor;

    public static void addGlobal(Listener<L2Character> listener) {
        global.add(listener);
    }

    public static void removeGlobal(Listener<L2Character> listener) {
        global.remove(listener);
    }

    public void onHit(int damage, L2Character attacker, L2Skill skill) {
        for(Object listener : getListeners())
            if(CharacterOnHit.class.isInstance(listener))
                ((CharacterOnHit) listener).onHit(getActor(), damage, attacker, skill);

        for(Object listener : global.getUnsafeArray())
            if(CharacterOnHit.class.isInstance(listener))
                ((CharacterOnHit) listener).onHit(getActor(), damage, attacker, skill);
    }

Код:
public interface CharListener extends Listener<L2Character> {
}

Код:
public interface Listener<T> extends Closeable {
    @Override default void close() {}
}

Код:
public interface CharacterOnHit extends CharListener {
    public void onHit(L2Character actor, int damage, L2Character attacker, L2Skill skill);
}

L2Character::onHitTimer
Код:
...
                // Notify AI with EVT_ATTACKED
                target.getAI().notifyEvent(CtrlEvent.EVT_ATTACKED, this);
                target.getListeners().onHit(miss ? 0 : damage, this, null);
...

L2Character::callSkill
Код:
...
                                if (skill.getSkillType() != L2SkillType.SIGNET && skill.getSkillType() != L2SkillType.SIGNET_CASTTIME)
                                {
                                    ctarget.getAI().notifyEvent(CtrlEvent.EVT_ATTACKED, player);
                                    ctarget.getListeners().onHit(0, this, skill);

...

                                    default:
                                        ctarget.addAttackerToAttackByList(this);
                                        ctarget.getAI().notifyEvent(CtrlEvent.EVT_ATTACKED, this);
                                        ctarget.getListeners().onHit(0, this, skill);
...

L2Character
Код:
    @Getter(lazy=true) protected final CharListenerList listeners = new CharListenerList(this);
    public void addListener(Listener<L2Character> listener) {
        getListeners().add(listener);
    }

    public void removeListener(Listener<L2Character> listener) {
        getListeners().remove(listener);
    }
m0nster.art - clear client patches, linkz to utils & code.
Гадаю по капче.
Ответ
#6
Зачем добавлять систему слушателей для одного места? :confused:

L2Attackable.java не смотрели? Все события обрабатываются именно в нём, а уж потом передаются в Quest нотификации событий.
Родился, живу и когда-нибудь умру.
Ответ
#7
Donatte Написал:Зачем добавлять систему слушателей для одного места? :confused:

L2Attackable.java не смотрели? Все события обрабатываются именно в нём, а уж потом передаются в Quest нотификации событий.

Все что нашел в L2Attackable из подобного:

Код:
    /**
     * Reduce the current HP of the L2Attackable.
     *
     * @param damage The HP decrease value
     * @param attacker The L2Character who attacks
     */
    @Override
    public void reduceCurrentHp(double damage, L2Character attacker)


    /**
     * Reduce the current HP of the L2Attackable, update its _aggroList and launch the doDie Task if necessary.
     *
     * @param attacker The L2Character who attacks
     * @param awake The awake state (If True : stop sleeping)
     */
    @Override
    public void reduceCurrentHp(double damage, L2Character attacker, boolean awake)


    /**
     * Add damage and hate to the attacker AggroInfo of the L2Attackable _aggroList.
     *
     * @param attacker The L2Character that gave damages to this L2Attackable
     * @param damage The number of damages given by the attacker L2Character
     */
    public void addDamage(L2Character attacker, int damage)


    /**
     * Add damage and hate to the attacker AggroInfo of the L2Attackable _aggroList.
     *
     * @param attacker The L2Character that gave damages to this L2Attackable
     * @param damage The number of damages given by the attacker L2Character
     * @param aggro The hate (=damage) given by the attacker L2Character
     */
    public void addDamageHate(L2Character attacker, int damage, int aggro)

Что нибудь из этого реально задействовать?
Ответ
#8
slayer48 Написал:Все что нашел в L2Attackable из подобного:

Код:
    /**
     * Reduce the current HP of the L2Attackable.
     *
     * @param damage The HP decrease value
     * @param attacker The L2Character who attacks
     */
    @Override
    public void reduceCurrentHp(double damage, L2Character attacker)


    /**
     * Reduce the current HP of the L2Attackable, update its _aggroList and launch the doDie Task if necessary.
     *
     * @param attacker The L2Character who attacks
     * @param awake The awake state (If True : stop sleeping)
     */
    @Override
    public void reduceCurrentHp(double damage, L2Character attacker, boolean awake)


    /**
     * Add damage and hate to the attacker AggroInfo of the L2Attackable _aggroList.
     *
     * @param attacker The L2Character that gave damages to this L2Attackable
     * @param damage The number of damages given by the attacker L2Character
     */
    public void addDamage(L2Character attacker, int damage)


    /**
     * Add damage and hate to the attacker AggroInfo of the L2Attackable _aggroList.
     *
     * @param attacker The L2Character that gave damages to this L2Attackable
     * @param damage The number of damages given by the attacker L2Character
     * @param aggro The hate (=damage) given by the attacker L2Character
     */
    public void addDamageHate(L2Character attacker, int damage, int aggro)

Что нибудь из этого реально задействовать?

Это нанесение урона, а не обработка хита. Хит может и промазать, Вы уж нормально описывайте, что Вам нужно.
m0nster.art - clear client patches, linkz to utils & code.
Гадаю по капче.
Ответ


Возможно похожие темы ...
Тема Автор Ответы Просмотры Последний пост
  Узнать текущее хп моба. HastemaNS 4 2,119 08-03-2013, 09:55 PM
Последний пост: HastemaNS
  Дроп с моба. HastemaNS 1 1,279 07-29-2013, 05:18 PM
Последний пост: HastemaNS
  шифт моба skyliver 6 5,881 07-27-2013, 04:52 PM
Последний пост: gorodetskiy
  Из моба вылазят еще 4 моба halaymoon 4 1,936 09-08-2012, 10:23 PM
Последний пост: DetF
  помогите по созданию РБ/моба ty31k 2 1,487 03-03-2012, 03:18 PM
Последний пост: ty31k
  Дроп/споил моба - id 18807 Frightened Ragna Orc Munhgauzen 4 3,450 02-22-2012, 06:26 AM
Последний пост: darkevil
  ДЛЯ МОБА Exsender 4 2,216 02-11-2012, 11:10 AM
Последний пост: Nehrk
  Расстояние удара в ближнем бою Abrom 2 1,573 09-01-2011, 10:46 AM
Последний пост: Deazer
  Движение моба Delakrua 3 2,361 07-18-2011, 02:28 PM
Последний пост: krisadr
  Редактирование моба stench 2 1,802 05-20-2011, 11:42 PM
Последний пост: stench

Перейти к форуму:


Пользователи, просматривающие эту тему: 1 Гость(ей)