Сообщений: 60
Тем: 19
Зарегистрирован: Sep 2013
Репутация:
45
Приветствую.
Подскажите - как отловить событие удара по мобу или рб?
Копался копался и не нашел ничего подобного(
Сборка Frozen IL
Сообщений: 329
Тем: 16
Зарегистрирован: Nov 2014
slayer48 Написал:Приветствую.
Подскажите - как отловить событие удара по мобу или рб?
Копался копался и не нашел ничего подобного(
Сборка Frozen IL
Юзайте ивент onAttack(npc, attacker) где аттакер плеер, нпц - моб/рб/ че хош
Сообщений: 60
Тем: 19
Зарегистрирован: Sep 2013
Репутация:
45
09-04-2015, 03:02 PM
(Сообщение последний раз редактировалось: 09-05-2015, 08:23 PM slayer48.)
GenCloud Написал:Юзайте ивент onAttack(npc, attacker) где аттакер плеер, нпц - моб/рб/ че хош
Смотрел, подобный метод нигде не обьявлен в сборке...
В первую очередь насколько я понимаю в L2Character.
Есть только квестовые onAttack в АИ эпиков, т.е. Quest:
public String onAttack (L2NpcInstance npc, L2PcInstance attacker, int damage, boolean isPet)
Сообщений: 60
Тем: 19
Зарегистрирован: Sep 2013
Репутация:
45
да и Quest здесь не подходит.. мне нужно подвязать этот метод абсолютно для всех мобов/рб, экземпляров класса.
что никто не знает?:eek:
Сообщений: 2,454
Тем: 53
Зарегистрирован: Apr 2010
Репутация:
19,728
Код: /**
* Класс реализующий список слушателей для каждого типа интерфейса.
*
* @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.
Гадаю по капче.
Сообщений: 1,240
Тем: 29
Зарегистрирован: May 2013
Репутация:
2,505
Зачем добавлять систему слушателей для одного места? :confused:
L2Attackable.java не смотрели? Все события обрабатываются именно в нём, а уж потом передаются в Quest нотификации событий.
Родился, живу и когда-нибудь умру.
Сообщений: 60
Тем: 19
Зарегистрирован: Sep 2013
Репутация:
45
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)
Что нибудь из этого реально задействовать?
Сообщений: 2,454
Тем: 53
Зарегистрирован: Apr 2010
Репутация:
19,728
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.
Гадаю по капче.
|