Store most popular IBaseEvent to reduce object creation.

This commit is contained in:
MobiusDevelopment
2021-10-25 00:52:51 +00:00
parent 4b302b66db
commit 64223af7fd
216 changed files with 5815 additions and 1727 deletions
@@ -66,7 +66,11 @@ public class LargeCocoon extends AbstractNpcAI
{ {
case "attack": case "attack":
{ {
onCreatureAttacked(new OnCreatureAttacked(player, npc, null)); final OnCreatureAttacked attackEvent = new OnCreatureAttacked();
attackEvent.setAttacker(player);
attackEvent.setTarget(npc);
attackEvent.setSkill(null);
onCreatureAttacked(attackEvent);
break; break;
} }
case "attackPowerful": case "attackPowerful":
@@ -66,6 +66,8 @@ import org.l2jmobius.gameserver.taskmanager.AttackStanceTaskManager;
*/ */
public class CreatureAI extends AbstractAI public class CreatureAI extends AbstractAI
{ {
private OnNpcMoveFinished _onNpcMoveFinished = null;
public static class IntentionCommand public static class IntentionCommand
{ {
protected final CtrlIntention _crtlIntention; protected final CtrlIntention _crtlIntention;
@@ -691,7 +693,11 @@ public class CreatureAI extends AbstractAI
WalkingManager.getInstance().onArrived(npc); // Walking Manager support WalkingManager.getInstance().onArrived(npc); // Walking Manager support
// Notify to scripts // Notify to scripts
EventDispatcher.getInstance().notifyEventAsync(new OnNpcMoveFinished(npc), npc); if (_onNpcMoveFinished == null)
{
_onNpcMoveFinished = new OnNpcMoveFinished(npc);
}
EventDispatcher.getInstance().notifyEventAsync(_onNpcMoveFinished, npc);
} }
// Launch actions corresponding to the Event Think // Launch actions corresponding to the Event Think
@@ -103,6 +103,8 @@ import org.l2jmobius.gameserver.model.events.impl.creature.OnCreatureDamageRecei
import org.l2jmobius.gameserver.model.events.impl.creature.OnCreatureDeath; import org.l2jmobius.gameserver.model.events.impl.creature.OnCreatureDeath;
import org.l2jmobius.gameserver.model.events.impl.creature.OnCreatureKilled; import org.l2jmobius.gameserver.model.events.impl.creature.OnCreatureKilled;
import org.l2jmobius.gameserver.model.events.impl.creature.OnCreatureSee; import org.l2jmobius.gameserver.model.events.impl.creature.OnCreatureSee;
import org.l2jmobius.gameserver.model.events.impl.creature.OnCreatureSkillFinishCast;
import org.l2jmobius.gameserver.model.events.impl.creature.OnCreatureSkillUse;
import org.l2jmobius.gameserver.model.events.impl.creature.OnCreatureTeleport; import org.l2jmobius.gameserver.model.events.impl.creature.OnCreatureTeleport;
import org.l2jmobius.gameserver.model.events.impl.creature.OnCreatureTeleported; import org.l2jmobius.gameserver.model.events.impl.creature.OnCreatureTeleported;
import org.l2jmobius.gameserver.model.events.listeners.AbstractEventListener; import org.l2jmobius.gameserver.model.events.listeners.AbstractEventListener;
@@ -289,6 +291,14 @@ public abstract class Creature extends WorldObject implements ISkillsHolder, IDe
/** A list containing the dropped items of this fake player. */ /** A list containing the dropped items of this fake player. */
private final List<ItemInstance> _fakePlayerDrops = new CopyOnWriteArrayList<>(); private final List<ItemInstance> _fakePlayerDrops = new CopyOnWriteArrayList<>();
private OnCreatureAttack _onCreatureAttack = null;
private OnCreatureAttacked _onCreatureAttacked = null;
private OnCreatureDamageDealt _onCreatureDamageDealt = null;
private OnCreatureDamageReceived _onCreatureDamageReceived = null;
private OnCreatureAttackAvoid _onCreatureAttackAvoid = null;
public OnCreatureSkillFinishCast onCreatureSkillFinishCast = null;
public OnCreatureSkillUse onCreatureSkillUse = null;
/** /**
* Creates a creature. * Creates a creature.
* @param template the creature template * @param template the creature template
@@ -567,6 +577,14 @@ public abstract class Creature extends WorldObject implements ISkillsHolder, IDe
{ {
_summoner.removeSummonedNpc(getObjectId()); _summoner.removeSummonedNpc(getObjectId());
} }
_onCreatureAttack = null;
_onCreatureAttacked = null;
_onCreatureDamageDealt = null;
_onCreatureDamageReceived = null;
_onCreatureAttackAvoid = null;
onCreatureSkillFinishCast = null;
onCreatureSkillUse = null;
} }
@Override @Override
@@ -3908,8 +3926,24 @@ public abstract class Creature extends WorldObject implements ISkillsHolder, IDe
doAttack(hit.getDamage(), target, null, false, false, hit.isCritical(), false); doAttack(hit.getDamage(), target, null, false, false, hit.isCritical(), false);
// Notify to scripts when the attack has been done. // Notify to scripts when the attack has been done.
EventDispatcher.getInstance().notifyEvent(new OnCreatureAttack(this, target, null), this); if (_onCreatureAttack == null)
EventDispatcher.getInstance().notifyEvent(new OnCreatureAttacked(this, target, null), target); {
_onCreatureAttack = new OnCreatureAttack();
}
_onCreatureAttack.setAttacker(this);
_onCreatureAttack.setTarget(target);
_onCreatureAttack.setSkill(null);
EventDispatcher.getInstance().notifyEvent(_onCreatureAttack, this);
if (_onCreatureAttacked == null)
{
_onCreatureAttacked = new OnCreatureAttacked();
}
_onCreatureAttacked.setAttacker(this);
_onCreatureAttacked.setTarget(target);
_onCreatureAttacked.setSkill(null);
EventDispatcher.getInstance().notifyEvent(_onCreatureAttacked, target);
if (_triggerSkills != null) if (_triggerSkills != null)
{ {
for (OptionsSkillHolder holder : _triggerSkills.values()) for (OptionsSkillHolder holder : _triggerSkills.values())
@@ -4640,10 +4674,32 @@ public abstract class Creature extends WorldObject implements ISkillsHolder, IDe
// Notify of this attack only if there is an attacking creature. // Notify of this attack only if there is an attacking creature.
if (attacker != null) if (attacker != null)
{ {
EventDispatcher.getInstance().notifyEventAsync(new OnCreatureDamageDealt(attacker, this, amount, skill, critical, isDOT, reflect), attacker); if (_onCreatureDamageDealt == null)
{
_onCreatureDamageDealt = new OnCreatureDamageDealt();
}
_onCreatureDamageDealt.setAttacker(attacker);
_onCreatureDamageDealt.setTarget(this);
_onCreatureDamageDealt.setDamage(amount);
_onCreatureDamageDealt.setSkill(skill);
_onCreatureDamageDealt.setCritical(critical);
_onCreatureDamageDealt.setDamageOverTime(isDOT);
_onCreatureDamageDealt.setReflect(reflect);
EventDispatcher.getInstance().notifyEvent(_onCreatureDamageDealt, attacker);
} }
final DamageReturn term = EventDispatcher.getInstance().notifyEvent(new OnCreatureDamageReceived(attacker, this, amount, skill, critical, isDOT, reflect), this, DamageReturn.class); if (_onCreatureDamageReceived == null)
{
_onCreatureDamageReceived = new OnCreatureDamageReceived();
}
_onCreatureDamageReceived.setAttacker(attacker);
_onCreatureDamageReceived.setTarget(this);
_onCreatureDamageReceived.setDamage(amount);
_onCreatureDamageReceived.setSkill(skill);
_onCreatureDamageReceived.setCritical(critical);
_onCreatureDamageReceived.setDamageOverTime(isDOT);
_onCreatureDamageReceived.setReflect(reflect);
final DamageReturn term = EventDispatcher.getInstance().notifyEvent(_onCreatureDamageReceived, this, DamageReturn.class);
if (term != null) if (term != null)
{ {
if (term.terminate()) if (term.terminate())
@@ -5040,7 +5096,14 @@ public abstract class Creature extends WorldObject implements ISkillsHolder, IDe
*/ */
public void notifyAttackAvoid(Creature target, boolean isDot) public void notifyAttackAvoid(Creature target, boolean isDot)
{ {
EventDispatcher.getInstance().notifyEventAsync(new OnCreatureAttackAvoid(this, target, isDot), target); if (_onCreatureAttackAvoid == null)
{
_onCreatureAttackAvoid = new OnCreatureAttackAvoid();
}
_onCreatureAttackAvoid.setAttacker(this);
_onCreatureAttackAvoid.setTarget(target);
_onCreatureAttackAvoid.setDamageOverTime(isDot);
EventDispatcher.getInstance().notifyEvent(_onCreatureAttackAvoid, target);
} }
/** /**
@@ -27,15 +27,12 @@ import org.l2jmobius.gameserver.model.skills.Skill;
*/ */
public class OnCreatureAttack implements IBaseEvent public class OnCreatureAttack implements IBaseEvent
{ {
private final Creature _attacker; private Creature _attacker;
private final Creature _target; private Creature _target;
private final Skill _skill; private Skill _skill;
public OnCreatureAttack(Creature attacker, Creature target, Skill skill) public OnCreatureAttack()
{ {
_attacker = attacker;
_target = target;
_skill = skill;
} }
public Creature getAttacker() public Creature getAttacker()
@@ -43,16 +40,31 @@ public class OnCreatureAttack implements IBaseEvent
return _attacker; return _attacker;
} }
public synchronized void setAttacker(Creature attacker)
{
_attacker = attacker;
}
public Creature getTarget() public Creature getTarget()
{ {
return _target; return _target;
} }
public synchronized void setTarget(Creature target)
{
_target = target;
}
public Skill getSkill() public Skill getSkill()
{ {
return _skill; return _skill;
} }
public synchronized void setSkill(Skill skill)
{
_skill = skill;
}
@Override @Override
public EventType getType() public EventType getType()
{ {
@@ -26,20 +26,12 @@ import org.l2jmobius.gameserver.model.events.impl.IBaseEvent;
*/ */
public class OnCreatureAttackAvoid implements IBaseEvent public class OnCreatureAttackAvoid implements IBaseEvent
{ {
private final Creature _attacker; private Creature _attacker;
private final Creature _target; private Creature _target;
private final boolean _damageOverTime; private boolean _damageOverTime;
/** public OnCreatureAttackAvoid()
* @param attacker who attack
* @param target who avoid
* @param isDot is dot damage
*/
public OnCreatureAttackAvoid(Creature attacker, Creature target, boolean isDot)
{ {
_attacker = attacker;
_target = target;
_damageOverTime = isDot;
} }
public Creature getAttacker() public Creature getAttacker()
@@ -47,19 +39,31 @@ public class OnCreatureAttackAvoid implements IBaseEvent
return _attacker; return _attacker;
} }
public synchronized void setAttacker(Creature attacker)
{
_attacker = attacker;
}
public Creature getTarget() public Creature getTarget()
{ {
return _target; return _target;
} }
/** public synchronized void setTarget(Creature target)
* @return {
*/ _target = target;
}
public boolean isDamageOverTime() public boolean isDamageOverTime()
{ {
return _damageOverTime; return _damageOverTime;
} }
public synchronized void setDamageOverTime(boolean damageOverTime)
{
_damageOverTime = damageOverTime;
}
@Override @Override
public EventType getType() public EventType getType()
{ {
@@ -27,15 +27,12 @@ import org.l2jmobius.gameserver.model.skills.Skill;
*/ */
public class OnCreatureAttacked implements IBaseEvent public class OnCreatureAttacked implements IBaseEvent
{ {
private final Creature _attacker; private Creature _attacker;
private final Creature _target; private Creature _target;
private final Skill _skill; private Skill _skill;
public OnCreatureAttacked(Creature attacker, Creature target, Skill skill) public OnCreatureAttacked()
{ {
_attacker = attacker;
_target = target;
_skill = skill;
} }
public Creature getAttacker() public Creature getAttacker()
@@ -43,16 +40,31 @@ public class OnCreatureAttacked implements IBaseEvent
return _attacker; return _attacker;
} }
public synchronized void setAttacker(Creature attacker)
{
_attacker = attacker;
}
public Creature getTarget() public Creature getTarget()
{ {
return _target; return _target;
} }
public synchronized void setTarget(Creature target)
{
_target = target;
}
public Skill getSkill() public Skill getSkill()
{ {
return _skill; return _skill;
} }
public synchronized void setSkill(Skill skill)
{
_skill = skill;
}
@Override @Override
public EventType getType() public EventType getType()
{ {
@@ -27,23 +27,16 @@ import org.l2jmobius.gameserver.model.skills.Skill;
*/ */
public class OnCreatureDamageDealt implements IBaseEvent public class OnCreatureDamageDealt implements IBaseEvent
{ {
private final Creature _attacker; private Creature _attacker;
private final Creature _target; private Creature _target;
private final double _damage; private double _damage;
private final Skill _skill; private Skill _skill;
private final boolean _crit; private boolean _crit;
private final boolean _damageOverTime; private boolean _damageOverTime;
private final boolean _reflect; private boolean _reflect;
public OnCreatureDamageDealt(Creature attacker, Creature target, double damage, Skill skill, boolean crit, boolean damageOverTime, boolean reflect) public OnCreatureDamageDealt()
{ {
_attacker = attacker;
_target = target;
_damage = damage;
_skill = skill;
_crit = crit;
_damageOverTime = damageOverTime;
_reflect = reflect;
} }
public Creature getAttacker() public Creature getAttacker()
@@ -51,36 +44,71 @@ public class OnCreatureDamageDealt implements IBaseEvent
return _attacker; return _attacker;
} }
public synchronized void setAttacker(Creature attacker)
{
_attacker = attacker;
}
public Creature getTarget() public Creature getTarget()
{ {
return _target; return _target;
} }
public synchronized void setTarget(Creature target)
{
_target = target;
}
public double getDamage() public double getDamage()
{ {
return _damage; return _damage;
} }
public synchronized void setDamage(double damage)
{
_damage = damage;
}
public Skill getSkill() public Skill getSkill()
{ {
return _skill; return _skill;
} }
public synchronized void setSkill(Skill skill)
{
_skill = skill;
}
public boolean isCritical() public boolean isCritical()
{ {
return _crit; return _crit;
} }
public synchronized void setCritical(boolean crit)
{
_crit = crit;
}
public boolean isDamageOverTime() public boolean isDamageOverTime()
{ {
return _damageOverTime; return _damageOverTime;
} }
public synchronized void setDamageOverTime(boolean damageOverTime)
{
_damageOverTime = damageOverTime;
}
public boolean isReflect() public boolean isReflect()
{ {
return _reflect; return _reflect;
} }
public synchronized void setReflect(boolean reflect)
{
_reflect = reflect;
}
@Override @Override
public EventType getType() public EventType getType()
{ {
@@ -27,23 +27,16 @@ import org.l2jmobius.gameserver.model.skills.Skill;
*/ */
public class OnCreatureDamageReceived implements IBaseEvent public class OnCreatureDamageReceived implements IBaseEvent
{ {
private final Creature _attacker; private Creature _attacker;
private final Creature _target; private Creature _target;
private final double _damage; private double _damage;
private final Skill _skill; private Skill _skill;
private final boolean _crit; private boolean _crit;
private final boolean _damageOverTime; private boolean _damageOverTime;
private final boolean _reflect; private boolean _reflect;
public OnCreatureDamageReceived(Creature attacker, Creature target, double damage, Skill skill, boolean crit, boolean damageOverTime, boolean reflect) public OnCreatureDamageReceived()
{ {
_attacker = attacker;
_target = target;
_damage = damage;
_skill = skill;
_crit = crit;
_damageOverTime = damageOverTime;
_reflect = reflect;
} }
public Creature getAttacker() public Creature getAttacker()
@@ -51,36 +44,71 @@ public class OnCreatureDamageReceived implements IBaseEvent
return _attacker; return _attacker;
} }
public synchronized void setAttacker(Creature attacker)
{
_attacker = attacker;
}
public Creature getTarget() public Creature getTarget()
{ {
return _target; return _target;
} }
public synchronized void setTarget(Creature target)
{
_target = target;
}
public double getDamage() public double getDamage()
{ {
return _damage; return _damage;
} }
public synchronized void setDamage(double damage)
{
_damage = damage;
}
public Skill getSkill() public Skill getSkill()
{ {
return _skill; return _skill;
} }
public synchronized void setSkill(Skill skill)
{
_skill = skill;
}
public boolean isCritical() public boolean isCritical()
{ {
return _crit; return _crit;
} }
public synchronized void setCritical(boolean crit)
{
_crit = crit;
}
public boolean isDamageOverTime() public boolean isDamageOverTime()
{ {
return _damageOverTime; return _damageOverTime;
} }
public synchronized void setDamageOverTime(boolean damageOverTime)
{
_damageOverTime = damageOverTime;
}
public boolean isReflect() public boolean isReflect()
{ {
return _reflect; return _reflect;
} }
public synchronized void setReflect(boolean reflect)
{
_reflect = reflect;
}
@Override @Override
public EventType getType() public EventType getType()
{ {
@@ -28,17 +28,13 @@ import org.l2jmobius.gameserver.model.skills.Skill;
*/ */
public class OnCreatureSkillFinishCast implements IBaseEvent public class OnCreatureSkillFinishCast implements IBaseEvent
{ {
private final Creature _caster; private Creature _caster;
private final Skill _skill; private WorldObject _target;
private final boolean _simultaneously; private Skill _skill;
private final WorldObject _target; private boolean _simultaneously;
public OnCreatureSkillFinishCast(Creature caster, WorldObject target, Skill skill, boolean simultaneously) public OnCreatureSkillFinishCast()
{ {
_caster = caster;
_skill = skill;
_simultaneously = simultaneously;
_target = target;
} }
public Creature getCaster() public Creature getCaster()
@@ -46,21 +42,41 @@ public class OnCreatureSkillFinishCast implements IBaseEvent
return _caster; return _caster;
} }
public synchronized void setCaster(Creature caster)
{
_caster = caster;
}
public WorldObject getTarget() public WorldObject getTarget()
{ {
return _target; return _target;
} }
public synchronized void setTarget(WorldObject target)
{
_target = target;
}
public Skill getSkill() public Skill getSkill()
{ {
return _skill; return _skill;
} }
public synchronized void setSkill(Skill skill)
{
_skill = skill;
}
public boolean isSimultaneously() public boolean isSimultaneously()
{ {
return _simultaneously; return _simultaneously;
} }
public synchronized void setSimultaneously(boolean simultaneously)
{
_simultaneously = simultaneously;
}
@Override @Override
public EventType getType() public EventType getType()
{ {
@@ -27,15 +27,12 @@ import org.l2jmobius.gameserver.model.skills.Skill;
*/ */
public class OnCreatureSkillUse implements IBaseEvent public class OnCreatureSkillUse implements IBaseEvent
{ {
private final Creature _caster; private Creature _caster;
private final Skill _skill; private Skill _skill;
private final boolean _simultaneously; private boolean _simultaneously;
public OnCreatureSkillUse(Creature caster, Skill skill, boolean simultaneously) public OnCreatureSkillUse()
{ {
_caster = caster;
_skill = skill;
_simultaneously = simultaneously;
} }
public Creature getCaster() public Creature getCaster()
@@ -43,16 +40,31 @@ public class OnCreatureSkillUse implements IBaseEvent
return _caster; return _caster;
} }
public synchronized void setCaster(Creature caster)
{
_caster = caster;
}
public Skill getSkill() public Skill getSkill()
{ {
return _skill; return _skill;
} }
public synchronized void setSkill(Skill skill)
{
_skill = skill;
}
public boolean isSimultaneously() public boolean isSimultaneously()
{ {
return _simultaneously; return _simultaneously;
} }
public synchronized void setSimultaneously(boolean simultaneously)
{
_simultaneously = simultaneously;
}
@Override @Override
public EventType getType() public EventType getType()
{ {
@@ -523,7 +523,15 @@ public class SkillCaster implements Runnable
} }
// Notify skill is casted. // Notify skill is casted.
EventDispatcher.getInstance().notifyEvent(new OnCreatureSkillFinishCast(caster, target, _skill, _skill.isWithoutAction()), caster); if (caster.onCreatureSkillFinishCast == null)
{
caster.onCreatureSkillFinishCast = new OnCreatureSkillFinishCast();
}
caster.onCreatureSkillFinishCast.setCaster(caster);
caster.onCreatureSkillFinishCast.setTarget(target);
caster.onCreatureSkillFinishCast.setSkill(_skill);
caster.onCreatureSkillFinishCast.setSimultaneously(_skill.isWithoutAction());
EventDispatcher.getInstance().notifyEvent(caster.onCreatureSkillFinishCast, caster);
// Call the skill's effects and AI interraction and stuff. // Call the skill's effects and AI interraction and stuff.
callSkill(caster, target, _targets, _skill, _item); callSkill(caster, target, _targets, _skill, _item);
@@ -968,7 +976,14 @@ public class SkillCaster implements Runnable
return false; return false;
} }
final TerminateReturn term = EventDispatcher.getInstance().notifyEvent(new OnCreatureSkillUse(caster, skill, skill.isWithoutAction()), caster, TerminateReturn.class); if (caster.onCreatureSkillUse == null)
{
caster.onCreatureSkillUse = new OnCreatureSkillUse();
}
caster.onCreatureSkillUse.setCaster(caster);
caster.onCreatureSkillUse.setSkill(skill);
caster.onCreatureSkillUse.setSimultaneously(skill.isWithoutAction());
final TerminateReturn term = EventDispatcher.getInstance().notifyEvent(caster.onCreatureSkillUse, caster, TerminateReturn.class);
if ((term != null) && term.terminate()) if ((term != null) && term.terminate())
{ {
caster.sendPacket(ActionFailed.STATIC_PACKET); caster.sendPacket(ActionFailed.STATIC_PACKET);
@@ -66,7 +66,11 @@ public class LargeCocoon extends AbstractNpcAI
{ {
case "attack": case "attack":
{ {
onCreatureAttacked(new OnCreatureAttacked(player, npc, null)); final OnCreatureAttacked attackEvent = new OnCreatureAttacked();
attackEvent.setAttacker(player);
attackEvent.setTarget(npc);
attackEvent.setSkill(null);
onCreatureAttacked(attackEvent);
break; break;
} }
case "attackPowerful": case "attackPowerful":
@@ -66,6 +66,8 @@ import org.l2jmobius.gameserver.taskmanager.AttackStanceTaskManager;
*/ */
public class CreatureAI extends AbstractAI public class CreatureAI extends AbstractAI
{ {
private OnNpcMoveFinished _onNpcMoveFinished = null;
public static class IntentionCommand public static class IntentionCommand
{ {
protected final CtrlIntention _crtlIntention; protected final CtrlIntention _crtlIntention;
@@ -691,7 +693,11 @@ public class CreatureAI extends AbstractAI
WalkingManager.getInstance().onArrived(npc); // Walking Manager support WalkingManager.getInstance().onArrived(npc); // Walking Manager support
// Notify to scripts // Notify to scripts
EventDispatcher.getInstance().notifyEventAsync(new OnNpcMoveFinished(npc), npc); if (_onNpcMoveFinished == null)
{
_onNpcMoveFinished = new OnNpcMoveFinished(npc);
}
EventDispatcher.getInstance().notifyEventAsync(_onNpcMoveFinished, npc);
} }
// Launch actions corresponding to the Event Think // Launch actions corresponding to the Event Think
@@ -103,6 +103,8 @@ import org.l2jmobius.gameserver.model.events.impl.creature.OnCreatureDamageRecei
import org.l2jmobius.gameserver.model.events.impl.creature.OnCreatureDeath; import org.l2jmobius.gameserver.model.events.impl.creature.OnCreatureDeath;
import org.l2jmobius.gameserver.model.events.impl.creature.OnCreatureKilled; import org.l2jmobius.gameserver.model.events.impl.creature.OnCreatureKilled;
import org.l2jmobius.gameserver.model.events.impl.creature.OnCreatureSee; import org.l2jmobius.gameserver.model.events.impl.creature.OnCreatureSee;
import org.l2jmobius.gameserver.model.events.impl.creature.OnCreatureSkillFinishCast;
import org.l2jmobius.gameserver.model.events.impl.creature.OnCreatureSkillUse;
import org.l2jmobius.gameserver.model.events.impl.creature.OnCreatureTeleport; import org.l2jmobius.gameserver.model.events.impl.creature.OnCreatureTeleport;
import org.l2jmobius.gameserver.model.events.impl.creature.OnCreatureTeleported; import org.l2jmobius.gameserver.model.events.impl.creature.OnCreatureTeleported;
import org.l2jmobius.gameserver.model.events.listeners.AbstractEventListener; import org.l2jmobius.gameserver.model.events.listeners.AbstractEventListener;
@@ -289,6 +291,14 @@ public abstract class Creature extends WorldObject implements ISkillsHolder, IDe
/** A list containing the dropped items of this fake player. */ /** A list containing the dropped items of this fake player. */
private final List<ItemInstance> _fakePlayerDrops = new CopyOnWriteArrayList<>(); private final List<ItemInstance> _fakePlayerDrops = new CopyOnWriteArrayList<>();
private OnCreatureAttack _onCreatureAttack = null;
private OnCreatureAttacked _onCreatureAttacked = null;
private OnCreatureDamageDealt _onCreatureDamageDealt = null;
private OnCreatureDamageReceived _onCreatureDamageReceived = null;
private OnCreatureAttackAvoid _onCreatureAttackAvoid = null;
public OnCreatureSkillFinishCast onCreatureSkillFinishCast = null;
public OnCreatureSkillUse onCreatureSkillUse = null;
/** /**
* Creates a creature. * Creates a creature.
* @param template the creature template * @param template the creature template
@@ -567,6 +577,14 @@ public abstract class Creature extends WorldObject implements ISkillsHolder, IDe
{ {
_summoner.removeSummonedNpc(getObjectId()); _summoner.removeSummonedNpc(getObjectId());
} }
_onCreatureAttack = null;
_onCreatureAttacked = null;
_onCreatureDamageDealt = null;
_onCreatureDamageReceived = null;
_onCreatureAttackAvoid = null;
onCreatureSkillFinishCast = null;
onCreatureSkillUse = null;
} }
@Override @Override
@@ -3908,8 +3926,24 @@ public abstract class Creature extends WorldObject implements ISkillsHolder, IDe
doAttack(hit.getDamage(), target, null, false, false, hit.isCritical(), false); doAttack(hit.getDamage(), target, null, false, false, hit.isCritical(), false);
// Notify to scripts when the attack has been done. // Notify to scripts when the attack has been done.
EventDispatcher.getInstance().notifyEvent(new OnCreatureAttack(this, target, null), this); if (_onCreatureAttack == null)
EventDispatcher.getInstance().notifyEvent(new OnCreatureAttacked(this, target, null), target); {
_onCreatureAttack = new OnCreatureAttack();
}
_onCreatureAttack.setAttacker(this);
_onCreatureAttack.setTarget(target);
_onCreatureAttack.setSkill(null);
EventDispatcher.getInstance().notifyEvent(_onCreatureAttack, this);
if (_onCreatureAttacked == null)
{
_onCreatureAttacked = new OnCreatureAttacked();
}
_onCreatureAttacked.setAttacker(this);
_onCreatureAttacked.setTarget(target);
_onCreatureAttacked.setSkill(null);
EventDispatcher.getInstance().notifyEvent(_onCreatureAttacked, target);
if (_triggerSkills != null) if (_triggerSkills != null)
{ {
for (OptionsSkillHolder holder : _triggerSkills.values()) for (OptionsSkillHolder holder : _triggerSkills.values())
@@ -4640,10 +4674,32 @@ public abstract class Creature extends WorldObject implements ISkillsHolder, IDe
// Notify of this attack only if there is an attacking creature. // Notify of this attack only if there is an attacking creature.
if (attacker != null) if (attacker != null)
{ {
EventDispatcher.getInstance().notifyEventAsync(new OnCreatureDamageDealt(attacker, this, amount, skill, critical, isDOT, reflect), attacker); if (_onCreatureDamageDealt == null)
{
_onCreatureDamageDealt = new OnCreatureDamageDealt();
}
_onCreatureDamageDealt.setAttacker(attacker);
_onCreatureDamageDealt.setTarget(this);
_onCreatureDamageDealt.setDamage(amount);
_onCreatureDamageDealt.setSkill(skill);
_onCreatureDamageDealt.setCritical(critical);
_onCreatureDamageDealt.setDamageOverTime(isDOT);
_onCreatureDamageDealt.setReflect(reflect);
EventDispatcher.getInstance().notifyEvent(_onCreatureDamageDealt, attacker);
} }
final DamageReturn term = EventDispatcher.getInstance().notifyEvent(new OnCreatureDamageReceived(attacker, this, amount, skill, critical, isDOT, reflect), this, DamageReturn.class); if (_onCreatureDamageReceived == null)
{
_onCreatureDamageReceived = new OnCreatureDamageReceived();
}
_onCreatureDamageReceived.setAttacker(attacker);
_onCreatureDamageReceived.setTarget(this);
_onCreatureDamageReceived.setDamage(amount);
_onCreatureDamageReceived.setSkill(skill);
_onCreatureDamageReceived.setCritical(critical);
_onCreatureDamageReceived.setDamageOverTime(isDOT);
_onCreatureDamageReceived.setReflect(reflect);
final DamageReturn term = EventDispatcher.getInstance().notifyEvent(_onCreatureDamageReceived, this, DamageReturn.class);
if (term != null) if (term != null)
{ {
if (term.terminate()) if (term.terminate())
@@ -5040,7 +5096,14 @@ public abstract class Creature extends WorldObject implements ISkillsHolder, IDe
*/ */
public void notifyAttackAvoid(Creature target, boolean isDot) public void notifyAttackAvoid(Creature target, boolean isDot)
{ {
EventDispatcher.getInstance().notifyEventAsync(new OnCreatureAttackAvoid(this, target, isDot), target); if (_onCreatureAttackAvoid == null)
{
_onCreatureAttackAvoid = new OnCreatureAttackAvoid();
}
_onCreatureAttackAvoid.setAttacker(this);
_onCreatureAttackAvoid.setTarget(target);
_onCreatureAttackAvoid.setDamageOverTime(isDot);
EventDispatcher.getInstance().notifyEvent(_onCreatureAttackAvoid, target);
} }
/** /**
@@ -27,15 +27,12 @@ import org.l2jmobius.gameserver.model.skills.Skill;
*/ */
public class OnCreatureAttack implements IBaseEvent public class OnCreatureAttack implements IBaseEvent
{ {
private final Creature _attacker; private Creature _attacker;
private final Creature _target; private Creature _target;
private final Skill _skill; private Skill _skill;
public OnCreatureAttack(Creature attacker, Creature target, Skill skill) public OnCreatureAttack()
{ {
_attacker = attacker;
_target = target;
_skill = skill;
} }
public Creature getAttacker() public Creature getAttacker()
@@ -43,16 +40,31 @@ public class OnCreatureAttack implements IBaseEvent
return _attacker; return _attacker;
} }
public synchronized void setAttacker(Creature attacker)
{
_attacker = attacker;
}
public Creature getTarget() public Creature getTarget()
{ {
return _target; return _target;
} }
public synchronized void setTarget(Creature target)
{
_target = target;
}
public Skill getSkill() public Skill getSkill()
{ {
return _skill; return _skill;
} }
public synchronized void setSkill(Skill skill)
{
_skill = skill;
}
@Override @Override
public EventType getType() public EventType getType()
{ {
@@ -26,20 +26,12 @@ import org.l2jmobius.gameserver.model.events.impl.IBaseEvent;
*/ */
public class OnCreatureAttackAvoid implements IBaseEvent public class OnCreatureAttackAvoid implements IBaseEvent
{ {
private final Creature _attacker; private Creature _attacker;
private final Creature _target; private Creature _target;
private final boolean _damageOverTime; private boolean _damageOverTime;
/** public OnCreatureAttackAvoid()
* @param attacker who attack
* @param target who avoid
* @param isDot is dot damage
*/
public OnCreatureAttackAvoid(Creature attacker, Creature target, boolean isDot)
{ {
_attacker = attacker;
_target = target;
_damageOverTime = isDot;
} }
public Creature getAttacker() public Creature getAttacker()
@@ -47,19 +39,31 @@ public class OnCreatureAttackAvoid implements IBaseEvent
return _attacker; return _attacker;
} }
public synchronized void setAttacker(Creature attacker)
{
_attacker = attacker;
}
public Creature getTarget() public Creature getTarget()
{ {
return _target; return _target;
} }
/** public synchronized void setTarget(Creature target)
* @return {
*/ _target = target;
}
public boolean isDamageOverTime() public boolean isDamageOverTime()
{ {
return _damageOverTime; return _damageOverTime;
} }
public synchronized void setDamageOverTime(boolean damageOverTime)
{
_damageOverTime = damageOverTime;
}
@Override @Override
public EventType getType() public EventType getType()
{ {
@@ -27,15 +27,12 @@ import org.l2jmobius.gameserver.model.skills.Skill;
*/ */
public class OnCreatureAttacked implements IBaseEvent public class OnCreatureAttacked implements IBaseEvent
{ {
private final Creature _attacker; private Creature _attacker;
private final Creature _target; private Creature _target;
private final Skill _skill; private Skill _skill;
public OnCreatureAttacked(Creature attacker, Creature target, Skill skill) public OnCreatureAttacked()
{ {
_attacker = attacker;
_target = target;
_skill = skill;
} }
public Creature getAttacker() public Creature getAttacker()
@@ -43,16 +40,31 @@ public class OnCreatureAttacked implements IBaseEvent
return _attacker; return _attacker;
} }
public synchronized void setAttacker(Creature attacker)
{
_attacker = attacker;
}
public Creature getTarget() public Creature getTarget()
{ {
return _target; return _target;
} }
public synchronized void setTarget(Creature target)
{
_target = target;
}
public Skill getSkill() public Skill getSkill()
{ {
return _skill; return _skill;
} }
public synchronized void setSkill(Skill skill)
{
_skill = skill;
}
@Override @Override
public EventType getType() public EventType getType()
{ {
@@ -27,23 +27,16 @@ import org.l2jmobius.gameserver.model.skills.Skill;
*/ */
public class OnCreatureDamageDealt implements IBaseEvent public class OnCreatureDamageDealt implements IBaseEvent
{ {
private final Creature _attacker; private Creature _attacker;
private final Creature _target; private Creature _target;
private final double _damage; private double _damage;
private final Skill _skill; private Skill _skill;
private final boolean _crit; private boolean _crit;
private final boolean _damageOverTime; private boolean _damageOverTime;
private final boolean _reflect; private boolean _reflect;
public OnCreatureDamageDealt(Creature attacker, Creature target, double damage, Skill skill, boolean crit, boolean damageOverTime, boolean reflect) public OnCreatureDamageDealt()
{ {
_attacker = attacker;
_target = target;
_damage = damage;
_skill = skill;
_crit = crit;
_damageOverTime = damageOverTime;
_reflect = reflect;
} }
public Creature getAttacker() public Creature getAttacker()
@@ -51,36 +44,71 @@ public class OnCreatureDamageDealt implements IBaseEvent
return _attacker; return _attacker;
} }
public synchronized void setAttacker(Creature attacker)
{
_attacker = attacker;
}
public Creature getTarget() public Creature getTarget()
{ {
return _target; return _target;
} }
public synchronized void setTarget(Creature target)
{
_target = target;
}
public double getDamage() public double getDamage()
{ {
return _damage; return _damage;
} }
public synchronized void setDamage(double damage)
{
_damage = damage;
}
public Skill getSkill() public Skill getSkill()
{ {
return _skill; return _skill;
} }
public synchronized void setSkill(Skill skill)
{
_skill = skill;
}
public boolean isCritical() public boolean isCritical()
{ {
return _crit; return _crit;
} }
public synchronized void setCritical(boolean crit)
{
_crit = crit;
}
public boolean isDamageOverTime() public boolean isDamageOverTime()
{ {
return _damageOverTime; return _damageOverTime;
} }
public synchronized void setDamageOverTime(boolean damageOverTime)
{
_damageOverTime = damageOverTime;
}
public boolean isReflect() public boolean isReflect()
{ {
return _reflect; return _reflect;
} }
public synchronized void setReflect(boolean reflect)
{
_reflect = reflect;
}
@Override @Override
public EventType getType() public EventType getType()
{ {
@@ -27,23 +27,16 @@ import org.l2jmobius.gameserver.model.skills.Skill;
*/ */
public class OnCreatureDamageReceived implements IBaseEvent public class OnCreatureDamageReceived implements IBaseEvent
{ {
private final Creature _attacker; private Creature _attacker;
private final Creature _target; private Creature _target;
private final double _damage; private double _damage;
private final Skill _skill; private Skill _skill;
private final boolean _crit; private boolean _crit;
private final boolean _damageOverTime; private boolean _damageOverTime;
private final boolean _reflect; private boolean _reflect;
public OnCreatureDamageReceived(Creature attacker, Creature target, double damage, Skill skill, boolean crit, boolean damageOverTime, boolean reflect) public OnCreatureDamageReceived()
{ {
_attacker = attacker;
_target = target;
_damage = damage;
_skill = skill;
_crit = crit;
_damageOverTime = damageOverTime;
_reflect = reflect;
} }
public Creature getAttacker() public Creature getAttacker()
@@ -51,36 +44,71 @@ public class OnCreatureDamageReceived implements IBaseEvent
return _attacker; return _attacker;
} }
public synchronized void setAttacker(Creature attacker)
{
_attacker = attacker;
}
public Creature getTarget() public Creature getTarget()
{ {
return _target; return _target;
} }
public synchronized void setTarget(Creature target)
{
_target = target;
}
public double getDamage() public double getDamage()
{ {
return _damage; return _damage;
} }
public synchronized void setDamage(double damage)
{
_damage = damage;
}
public Skill getSkill() public Skill getSkill()
{ {
return _skill; return _skill;
} }
public synchronized void setSkill(Skill skill)
{
_skill = skill;
}
public boolean isCritical() public boolean isCritical()
{ {
return _crit; return _crit;
} }
public synchronized void setCritical(boolean crit)
{
_crit = crit;
}
public boolean isDamageOverTime() public boolean isDamageOverTime()
{ {
return _damageOverTime; return _damageOverTime;
} }
public synchronized void setDamageOverTime(boolean damageOverTime)
{
_damageOverTime = damageOverTime;
}
public boolean isReflect() public boolean isReflect()
{ {
return _reflect; return _reflect;
} }
public synchronized void setReflect(boolean reflect)
{
_reflect = reflect;
}
@Override @Override
public EventType getType() public EventType getType()
{ {
@@ -28,17 +28,13 @@ import org.l2jmobius.gameserver.model.skills.Skill;
*/ */
public class OnCreatureSkillFinishCast implements IBaseEvent public class OnCreatureSkillFinishCast implements IBaseEvent
{ {
private final Creature _caster; private Creature _caster;
private final Skill _skill; private WorldObject _target;
private final boolean _simultaneously; private Skill _skill;
private final WorldObject _target; private boolean _simultaneously;
public OnCreatureSkillFinishCast(Creature caster, WorldObject target, Skill skill, boolean simultaneously) public OnCreatureSkillFinishCast()
{ {
_caster = caster;
_skill = skill;
_simultaneously = simultaneously;
_target = target;
} }
public Creature getCaster() public Creature getCaster()
@@ -46,21 +42,41 @@ public class OnCreatureSkillFinishCast implements IBaseEvent
return _caster; return _caster;
} }
public synchronized void setCaster(Creature caster)
{
_caster = caster;
}
public WorldObject getTarget() public WorldObject getTarget()
{ {
return _target; return _target;
} }
public synchronized void setTarget(WorldObject target)
{
_target = target;
}
public Skill getSkill() public Skill getSkill()
{ {
return _skill; return _skill;
} }
public synchronized void setSkill(Skill skill)
{
_skill = skill;
}
public boolean isSimultaneously() public boolean isSimultaneously()
{ {
return _simultaneously; return _simultaneously;
} }
public synchronized void setSimultaneously(boolean simultaneously)
{
_simultaneously = simultaneously;
}
@Override @Override
public EventType getType() public EventType getType()
{ {
@@ -27,15 +27,12 @@ import org.l2jmobius.gameserver.model.skills.Skill;
*/ */
public class OnCreatureSkillUse implements IBaseEvent public class OnCreatureSkillUse implements IBaseEvent
{ {
private final Creature _caster; private Creature _caster;
private final Skill _skill; private Skill _skill;
private final boolean _simultaneously; private boolean _simultaneously;
public OnCreatureSkillUse(Creature caster, Skill skill, boolean simultaneously) public OnCreatureSkillUse()
{ {
_caster = caster;
_skill = skill;
_simultaneously = simultaneously;
} }
public Creature getCaster() public Creature getCaster()
@@ -43,16 +40,31 @@ public class OnCreatureSkillUse implements IBaseEvent
return _caster; return _caster;
} }
public synchronized void setCaster(Creature caster)
{
_caster = caster;
}
public Skill getSkill() public Skill getSkill()
{ {
return _skill; return _skill;
} }
public synchronized void setSkill(Skill skill)
{
_skill = skill;
}
public boolean isSimultaneously() public boolean isSimultaneously()
{ {
return _simultaneously; return _simultaneously;
} }
public synchronized void setSimultaneously(boolean simultaneously)
{
_simultaneously = simultaneously;
}
@Override @Override
public EventType getType() public EventType getType()
{ {
@@ -523,7 +523,15 @@ public class SkillCaster implements Runnable
} }
// Notify skill is casted. // Notify skill is casted.
EventDispatcher.getInstance().notifyEvent(new OnCreatureSkillFinishCast(caster, target, _skill, _skill.isWithoutAction()), caster); if (caster.onCreatureSkillFinishCast == null)
{
caster.onCreatureSkillFinishCast = new OnCreatureSkillFinishCast();
}
caster.onCreatureSkillFinishCast.setCaster(caster);
caster.onCreatureSkillFinishCast.setTarget(target);
caster.onCreatureSkillFinishCast.setSkill(_skill);
caster.onCreatureSkillFinishCast.setSimultaneously(_skill.isWithoutAction());
EventDispatcher.getInstance().notifyEvent(caster.onCreatureSkillFinishCast, caster);
// Call the skill's effects and AI interraction and stuff. // Call the skill's effects and AI interraction and stuff.
callSkill(caster, target, _targets, _skill, _item); callSkill(caster, target, _targets, _skill, _item);
@@ -968,7 +976,14 @@ public class SkillCaster implements Runnable
return false; return false;
} }
final TerminateReturn term = EventDispatcher.getInstance().notifyEvent(new OnCreatureSkillUse(caster, skill, skill.isWithoutAction()), caster, TerminateReturn.class); if (caster.onCreatureSkillUse == null)
{
caster.onCreatureSkillUse = new OnCreatureSkillUse();
}
caster.onCreatureSkillUse.setCaster(caster);
caster.onCreatureSkillUse.setSkill(skill);
caster.onCreatureSkillUse.setSimultaneously(skill.isWithoutAction());
final TerminateReturn term = EventDispatcher.getInstance().notifyEvent(caster.onCreatureSkillUse, caster, TerminateReturn.class);
if ((term != null) && term.terminate()) if ((term != null) && term.terminate())
{ {
caster.sendPacket(ActionFailed.STATIC_PACKET); caster.sendPacket(ActionFailed.STATIC_PACKET);
@@ -66,7 +66,11 @@ public class LargeCocoon extends AbstractNpcAI
{ {
case "attack": case "attack":
{ {
onCreatureAttacked(new OnCreatureAttacked(player, npc, null)); final OnCreatureAttacked attackEvent = new OnCreatureAttacked();
attackEvent.setAttacker(player);
attackEvent.setTarget(npc);
attackEvent.setSkill(null);
onCreatureAttacked(attackEvent);
break; break;
} }
case "attackPowerful": case "attackPowerful":
@@ -66,6 +66,8 @@ import org.l2jmobius.gameserver.taskmanager.AttackStanceTaskManager;
*/ */
public class CreatureAI extends AbstractAI public class CreatureAI extends AbstractAI
{ {
private OnNpcMoveFinished _onNpcMoveFinished = null;
public static class IntentionCommand public static class IntentionCommand
{ {
protected final CtrlIntention _crtlIntention; protected final CtrlIntention _crtlIntention;
@@ -691,7 +693,11 @@ public class CreatureAI extends AbstractAI
WalkingManager.getInstance().onArrived(npc); // Walking Manager support WalkingManager.getInstance().onArrived(npc); // Walking Manager support
// Notify to scripts // Notify to scripts
EventDispatcher.getInstance().notifyEventAsync(new OnNpcMoveFinished(npc), npc); if (_onNpcMoveFinished == null)
{
_onNpcMoveFinished = new OnNpcMoveFinished(npc);
}
EventDispatcher.getInstance().notifyEventAsync(_onNpcMoveFinished, npc);
} }
// Launch actions corresponding to the Event Think // Launch actions corresponding to the Event Think
@@ -103,6 +103,8 @@ import org.l2jmobius.gameserver.model.events.impl.creature.OnCreatureDamageRecei
import org.l2jmobius.gameserver.model.events.impl.creature.OnCreatureDeath; import org.l2jmobius.gameserver.model.events.impl.creature.OnCreatureDeath;
import org.l2jmobius.gameserver.model.events.impl.creature.OnCreatureKilled; import org.l2jmobius.gameserver.model.events.impl.creature.OnCreatureKilled;
import org.l2jmobius.gameserver.model.events.impl.creature.OnCreatureSee; import org.l2jmobius.gameserver.model.events.impl.creature.OnCreatureSee;
import org.l2jmobius.gameserver.model.events.impl.creature.OnCreatureSkillFinishCast;
import org.l2jmobius.gameserver.model.events.impl.creature.OnCreatureSkillUse;
import org.l2jmobius.gameserver.model.events.impl.creature.OnCreatureTeleport; import org.l2jmobius.gameserver.model.events.impl.creature.OnCreatureTeleport;
import org.l2jmobius.gameserver.model.events.impl.creature.OnCreatureTeleported; import org.l2jmobius.gameserver.model.events.impl.creature.OnCreatureTeleported;
import org.l2jmobius.gameserver.model.events.listeners.AbstractEventListener; import org.l2jmobius.gameserver.model.events.listeners.AbstractEventListener;
@@ -289,6 +291,14 @@ public abstract class Creature extends WorldObject implements ISkillsHolder, IDe
/** A list containing the dropped items of this fake player. */ /** A list containing the dropped items of this fake player. */
private final List<ItemInstance> _fakePlayerDrops = new CopyOnWriteArrayList<>(); private final List<ItemInstance> _fakePlayerDrops = new CopyOnWriteArrayList<>();
private OnCreatureAttack _onCreatureAttack = null;
private OnCreatureAttacked _onCreatureAttacked = null;
private OnCreatureDamageDealt _onCreatureDamageDealt = null;
private OnCreatureDamageReceived _onCreatureDamageReceived = null;
private OnCreatureAttackAvoid _onCreatureAttackAvoid = null;
public OnCreatureSkillFinishCast onCreatureSkillFinishCast = null;
public OnCreatureSkillUse onCreatureSkillUse = null;
/** /**
* Creates a creature. * Creates a creature.
* @param template the creature template * @param template the creature template
@@ -567,6 +577,14 @@ public abstract class Creature extends WorldObject implements ISkillsHolder, IDe
{ {
_summoner.removeSummonedNpc(getObjectId()); _summoner.removeSummonedNpc(getObjectId());
} }
_onCreatureAttack = null;
_onCreatureAttacked = null;
_onCreatureDamageDealt = null;
_onCreatureDamageReceived = null;
_onCreatureAttackAvoid = null;
onCreatureSkillFinishCast = null;
onCreatureSkillUse = null;
} }
@Override @Override
@@ -3908,8 +3926,24 @@ public abstract class Creature extends WorldObject implements ISkillsHolder, IDe
doAttack(hit.getDamage(), target, null, false, false, hit.isCritical(), false); doAttack(hit.getDamage(), target, null, false, false, hit.isCritical(), false);
// Notify to scripts when the attack has been done. // Notify to scripts when the attack has been done.
EventDispatcher.getInstance().notifyEvent(new OnCreatureAttack(this, target, null), this); if (_onCreatureAttack == null)
EventDispatcher.getInstance().notifyEvent(new OnCreatureAttacked(this, target, null), target); {
_onCreatureAttack = new OnCreatureAttack();
}
_onCreatureAttack.setAttacker(this);
_onCreatureAttack.setTarget(target);
_onCreatureAttack.setSkill(null);
EventDispatcher.getInstance().notifyEvent(_onCreatureAttack, this);
if (_onCreatureAttacked == null)
{
_onCreatureAttacked = new OnCreatureAttacked();
}
_onCreatureAttacked.setAttacker(this);
_onCreatureAttacked.setTarget(target);
_onCreatureAttacked.setSkill(null);
EventDispatcher.getInstance().notifyEvent(_onCreatureAttacked, target);
if (_triggerSkills != null) if (_triggerSkills != null)
{ {
for (OptionsSkillHolder holder : _triggerSkills.values()) for (OptionsSkillHolder holder : _triggerSkills.values())
@@ -4640,10 +4674,32 @@ public abstract class Creature extends WorldObject implements ISkillsHolder, IDe
// Notify of this attack only if there is an attacking creature. // Notify of this attack only if there is an attacking creature.
if (attacker != null) if (attacker != null)
{ {
EventDispatcher.getInstance().notifyEventAsync(new OnCreatureDamageDealt(attacker, this, amount, skill, critical, isDOT, reflect), attacker); if (_onCreatureDamageDealt == null)
{
_onCreatureDamageDealt = new OnCreatureDamageDealt();
}
_onCreatureDamageDealt.setAttacker(attacker);
_onCreatureDamageDealt.setTarget(this);
_onCreatureDamageDealt.setDamage(amount);
_onCreatureDamageDealt.setSkill(skill);
_onCreatureDamageDealt.setCritical(critical);
_onCreatureDamageDealt.setDamageOverTime(isDOT);
_onCreatureDamageDealt.setReflect(reflect);
EventDispatcher.getInstance().notifyEvent(_onCreatureDamageDealt, attacker);
} }
final DamageReturn term = EventDispatcher.getInstance().notifyEvent(new OnCreatureDamageReceived(attacker, this, amount, skill, critical, isDOT, reflect), this, DamageReturn.class); if (_onCreatureDamageReceived == null)
{
_onCreatureDamageReceived = new OnCreatureDamageReceived();
}
_onCreatureDamageReceived.setAttacker(attacker);
_onCreatureDamageReceived.setTarget(this);
_onCreatureDamageReceived.setDamage(amount);
_onCreatureDamageReceived.setSkill(skill);
_onCreatureDamageReceived.setCritical(critical);
_onCreatureDamageReceived.setDamageOverTime(isDOT);
_onCreatureDamageReceived.setReflect(reflect);
final DamageReturn term = EventDispatcher.getInstance().notifyEvent(_onCreatureDamageReceived, this, DamageReturn.class);
if (term != null) if (term != null)
{ {
if (term.terminate()) if (term.terminate())
@@ -5040,7 +5096,14 @@ public abstract class Creature extends WorldObject implements ISkillsHolder, IDe
*/ */
public void notifyAttackAvoid(Creature target, boolean isDot) public void notifyAttackAvoid(Creature target, boolean isDot)
{ {
EventDispatcher.getInstance().notifyEventAsync(new OnCreatureAttackAvoid(this, target, isDot), target); if (_onCreatureAttackAvoid == null)
{
_onCreatureAttackAvoid = new OnCreatureAttackAvoid();
}
_onCreatureAttackAvoid.setAttacker(this);
_onCreatureAttackAvoid.setTarget(target);
_onCreatureAttackAvoid.setDamageOverTime(isDot);
EventDispatcher.getInstance().notifyEvent(_onCreatureAttackAvoid, target);
} }
/** /**
@@ -27,15 +27,12 @@ import org.l2jmobius.gameserver.model.skills.Skill;
*/ */
public class OnCreatureAttack implements IBaseEvent public class OnCreatureAttack implements IBaseEvent
{ {
private final Creature _attacker; private Creature _attacker;
private final Creature _target; private Creature _target;
private final Skill _skill; private Skill _skill;
public OnCreatureAttack(Creature attacker, Creature target, Skill skill) public OnCreatureAttack()
{ {
_attacker = attacker;
_target = target;
_skill = skill;
} }
public Creature getAttacker() public Creature getAttacker()
@@ -43,16 +40,31 @@ public class OnCreatureAttack implements IBaseEvent
return _attacker; return _attacker;
} }
public synchronized void setAttacker(Creature attacker)
{
_attacker = attacker;
}
public Creature getTarget() public Creature getTarget()
{ {
return _target; return _target;
} }
public synchronized void setTarget(Creature target)
{
_target = target;
}
public Skill getSkill() public Skill getSkill()
{ {
return _skill; return _skill;
} }
public synchronized void setSkill(Skill skill)
{
_skill = skill;
}
@Override @Override
public EventType getType() public EventType getType()
{ {
@@ -26,20 +26,12 @@ import org.l2jmobius.gameserver.model.events.impl.IBaseEvent;
*/ */
public class OnCreatureAttackAvoid implements IBaseEvent public class OnCreatureAttackAvoid implements IBaseEvent
{ {
private final Creature _attacker; private Creature _attacker;
private final Creature _target; private Creature _target;
private final boolean _damageOverTime; private boolean _damageOverTime;
/** public OnCreatureAttackAvoid()
* @param attacker who attack
* @param target who avoid
* @param isDot is dot damage
*/
public OnCreatureAttackAvoid(Creature attacker, Creature target, boolean isDot)
{ {
_attacker = attacker;
_target = target;
_damageOverTime = isDot;
} }
public Creature getAttacker() public Creature getAttacker()
@@ -47,19 +39,31 @@ public class OnCreatureAttackAvoid implements IBaseEvent
return _attacker; return _attacker;
} }
public synchronized void setAttacker(Creature attacker)
{
_attacker = attacker;
}
public Creature getTarget() public Creature getTarget()
{ {
return _target; return _target;
} }
/** public synchronized void setTarget(Creature target)
* @return {
*/ _target = target;
}
public boolean isDamageOverTime() public boolean isDamageOverTime()
{ {
return _damageOverTime; return _damageOverTime;
} }
public synchronized void setDamageOverTime(boolean damageOverTime)
{
_damageOverTime = damageOverTime;
}
@Override @Override
public EventType getType() public EventType getType()
{ {
@@ -27,15 +27,12 @@ import org.l2jmobius.gameserver.model.skills.Skill;
*/ */
public class OnCreatureAttacked implements IBaseEvent public class OnCreatureAttacked implements IBaseEvent
{ {
private final Creature _attacker; private Creature _attacker;
private final Creature _target; private Creature _target;
private final Skill _skill; private Skill _skill;
public OnCreatureAttacked(Creature attacker, Creature target, Skill skill) public OnCreatureAttacked()
{ {
_attacker = attacker;
_target = target;
_skill = skill;
} }
public Creature getAttacker() public Creature getAttacker()
@@ -43,16 +40,31 @@ public class OnCreatureAttacked implements IBaseEvent
return _attacker; return _attacker;
} }
public synchronized void setAttacker(Creature attacker)
{
_attacker = attacker;
}
public Creature getTarget() public Creature getTarget()
{ {
return _target; return _target;
} }
public synchronized void setTarget(Creature target)
{
_target = target;
}
public Skill getSkill() public Skill getSkill()
{ {
return _skill; return _skill;
} }
public synchronized void setSkill(Skill skill)
{
_skill = skill;
}
@Override @Override
public EventType getType() public EventType getType()
{ {
@@ -27,23 +27,16 @@ import org.l2jmobius.gameserver.model.skills.Skill;
*/ */
public class OnCreatureDamageDealt implements IBaseEvent public class OnCreatureDamageDealt implements IBaseEvent
{ {
private final Creature _attacker; private Creature _attacker;
private final Creature _target; private Creature _target;
private final double _damage; private double _damage;
private final Skill _skill; private Skill _skill;
private final boolean _crit; private boolean _crit;
private final boolean _damageOverTime; private boolean _damageOverTime;
private final boolean _reflect; private boolean _reflect;
public OnCreatureDamageDealt(Creature attacker, Creature target, double damage, Skill skill, boolean crit, boolean damageOverTime, boolean reflect) public OnCreatureDamageDealt()
{ {
_attacker = attacker;
_target = target;
_damage = damage;
_skill = skill;
_crit = crit;
_damageOverTime = damageOverTime;
_reflect = reflect;
} }
public Creature getAttacker() public Creature getAttacker()
@@ -51,36 +44,71 @@ public class OnCreatureDamageDealt implements IBaseEvent
return _attacker; return _attacker;
} }
public synchronized void setAttacker(Creature attacker)
{
_attacker = attacker;
}
public Creature getTarget() public Creature getTarget()
{ {
return _target; return _target;
} }
public synchronized void setTarget(Creature target)
{
_target = target;
}
public double getDamage() public double getDamage()
{ {
return _damage; return _damage;
} }
public synchronized void setDamage(double damage)
{
_damage = damage;
}
public Skill getSkill() public Skill getSkill()
{ {
return _skill; return _skill;
} }
public synchronized void setSkill(Skill skill)
{
_skill = skill;
}
public boolean isCritical() public boolean isCritical()
{ {
return _crit; return _crit;
} }
public synchronized void setCritical(boolean crit)
{
_crit = crit;
}
public boolean isDamageOverTime() public boolean isDamageOverTime()
{ {
return _damageOverTime; return _damageOverTime;
} }
public synchronized void setDamageOverTime(boolean damageOverTime)
{
_damageOverTime = damageOverTime;
}
public boolean isReflect() public boolean isReflect()
{ {
return _reflect; return _reflect;
} }
public synchronized void setReflect(boolean reflect)
{
_reflect = reflect;
}
@Override @Override
public EventType getType() public EventType getType()
{ {
@@ -27,23 +27,16 @@ import org.l2jmobius.gameserver.model.skills.Skill;
*/ */
public class OnCreatureDamageReceived implements IBaseEvent public class OnCreatureDamageReceived implements IBaseEvent
{ {
private final Creature _attacker; private Creature _attacker;
private final Creature _target; private Creature _target;
private final double _damage; private double _damage;
private final Skill _skill; private Skill _skill;
private final boolean _crit; private boolean _crit;
private final boolean _damageOverTime; private boolean _damageOverTime;
private final boolean _reflect; private boolean _reflect;
public OnCreatureDamageReceived(Creature attacker, Creature target, double damage, Skill skill, boolean crit, boolean damageOverTime, boolean reflect) public OnCreatureDamageReceived()
{ {
_attacker = attacker;
_target = target;
_damage = damage;
_skill = skill;
_crit = crit;
_damageOverTime = damageOverTime;
_reflect = reflect;
} }
public Creature getAttacker() public Creature getAttacker()
@@ -51,36 +44,71 @@ public class OnCreatureDamageReceived implements IBaseEvent
return _attacker; return _attacker;
} }
public synchronized void setAttacker(Creature attacker)
{
_attacker = attacker;
}
public Creature getTarget() public Creature getTarget()
{ {
return _target; return _target;
} }
public synchronized void setTarget(Creature target)
{
_target = target;
}
public double getDamage() public double getDamage()
{ {
return _damage; return _damage;
} }
public synchronized void setDamage(double damage)
{
_damage = damage;
}
public Skill getSkill() public Skill getSkill()
{ {
return _skill; return _skill;
} }
public synchronized void setSkill(Skill skill)
{
_skill = skill;
}
public boolean isCritical() public boolean isCritical()
{ {
return _crit; return _crit;
} }
public synchronized void setCritical(boolean crit)
{
_crit = crit;
}
public boolean isDamageOverTime() public boolean isDamageOverTime()
{ {
return _damageOverTime; return _damageOverTime;
} }
public synchronized void setDamageOverTime(boolean damageOverTime)
{
_damageOverTime = damageOverTime;
}
public boolean isReflect() public boolean isReflect()
{ {
return _reflect; return _reflect;
} }
public synchronized void setReflect(boolean reflect)
{
_reflect = reflect;
}
@Override @Override
public EventType getType() public EventType getType()
{ {
@@ -28,17 +28,13 @@ import org.l2jmobius.gameserver.model.skills.Skill;
*/ */
public class OnCreatureSkillFinishCast implements IBaseEvent public class OnCreatureSkillFinishCast implements IBaseEvent
{ {
private final Creature _caster; private Creature _caster;
private final Skill _skill; private WorldObject _target;
private final boolean _simultaneously; private Skill _skill;
private final WorldObject _target; private boolean _simultaneously;
public OnCreatureSkillFinishCast(Creature caster, WorldObject target, Skill skill, boolean simultaneously) public OnCreatureSkillFinishCast()
{ {
_caster = caster;
_skill = skill;
_simultaneously = simultaneously;
_target = target;
} }
public Creature getCaster() public Creature getCaster()
@@ -46,21 +42,41 @@ public class OnCreatureSkillFinishCast implements IBaseEvent
return _caster; return _caster;
} }
public synchronized void setCaster(Creature caster)
{
_caster = caster;
}
public WorldObject getTarget() public WorldObject getTarget()
{ {
return _target; return _target;
} }
public synchronized void setTarget(WorldObject target)
{
_target = target;
}
public Skill getSkill() public Skill getSkill()
{ {
return _skill; return _skill;
} }
public synchronized void setSkill(Skill skill)
{
_skill = skill;
}
public boolean isSimultaneously() public boolean isSimultaneously()
{ {
return _simultaneously; return _simultaneously;
} }
public synchronized void setSimultaneously(boolean simultaneously)
{
_simultaneously = simultaneously;
}
@Override @Override
public EventType getType() public EventType getType()
{ {
@@ -27,15 +27,12 @@ import org.l2jmobius.gameserver.model.skills.Skill;
*/ */
public class OnCreatureSkillUse implements IBaseEvent public class OnCreatureSkillUse implements IBaseEvent
{ {
private final Creature _caster; private Creature _caster;
private final Skill _skill; private Skill _skill;
private final boolean _simultaneously; private boolean _simultaneously;
public OnCreatureSkillUse(Creature caster, Skill skill, boolean simultaneously) public OnCreatureSkillUse()
{ {
_caster = caster;
_skill = skill;
_simultaneously = simultaneously;
} }
public Creature getCaster() public Creature getCaster()
@@ -43,16 +40,31 @@ public class OnCreatureSkillUse implements IBaseEvent
return _caster; return _caster;
} }
public synchronized void setCaster(Creature caster)
{
_caster = caster;
}
public Skill getSkill() public Skill getSkill()
{ {
return _skill; return _skill;
} }
public synchronized void setSkill(Skill skill)
{
_skill = skill;
}
public boolean isSimultaneously() public boolean isSimultaneously()
{ {
return _simultaneously; return _simultaneously;
} }
public synchronized void setSimultaneously(boolean simultaneously)
{
_simultaneously = simultaneously;
}
@Override @Override
public EventType getType() public EventType getType()
{ {
@@ -523,7 +523,15 @@ public class SkillCaster implements Runnable
} }
// Notify skill is casted. // Notify skill is casted.
EventDispatcher.getInstance().notifyEvent(new OnCreatureSkillFinishCast(caster, target, _skill, _skill.isWithoutAction()), caster); if (caster.onCreatureSkillFinishCast == null)
{
caster.onCreatureSkillFinishCast = new OnCreatureSkillFinishCast();
}
caster.onCreatureSkillFinishCast.setCaster(caster);
caster.onCreatureSkillFinishCast.setTarget(target);
caster.onCreatureSkillFinishCast.setSkill(_skill);
caster.onCreatureSkillFinishCast.setSimultaneously(_skill.isWithoutAction());
EventDispatcher.getInstance().notifyEvent(caster.onCreatureSkillFinishCast, caster);
// Call the skill's effects and AI interraction and stuff. // Call the skill's effects and AI interraction and stuff.
callSkill(caster, target, _targets, _skill, _item); callSkill(caster, target, _targets, _skill, _item);
@@ -968,7 +976,14 @@ public class SkillCaster implements Runnable
return false; return false;
} }
final TerminateReturn term = EventDispatcher.getInstance().notifyEvent(new OnCreatureSkillUse(caster, skill, skill.isWithoutAction()), caster, TerminateReturn.class); if (caster.onCreatureSkillUse == null)
{
caster.onCreatureSkillUse = new OnCreatureSkillUse();
}
caster.onCreatureSkillUse.setCaster(caster);
caster.onCreatureSkillUse.setSkill(skill);
caster.onCreatureSkillUse.setSimultaneously(skill.isWithoutAction());
final TerminateReturn term = EventDispatcher.getInstance().notifyEvent(caster.onCreatureSkillUse, caster, TerminateReturn.class);
if ((term != null) && term.terminate()) if ((term != null) && term.terminate())
{ {
caster.sendPacket(ActionFailed.STATIC_PACKET); caster.sendPacket(ActionFailed.STATIC_PACKET);
@@ -66,7 +66,11 @@ public class LargeCocoon extends AbstractNpcAI
{ {
case "attack": case "attack":
{ {
onCreatureAttacked(new OnCreatureAttacked(player, npc, null)); final OnCreatureAttacked attackEvent = new OnCreatureAttacked();
attackEvent.setAttacker(player);
attackEvent.setTarget(npc);
attackEvent.setSkill(null);
onCreatureAttacked(attackEvent);
break; break;
} }
case "attackPowerful": case "attackPowerful":
@@ -66,6 +66,8 @@ import org.l2jmobius.gameserver.taskmanager.AttackStanceTaskManager;
*/ */
public class CreatureAI extends AbstractAI public class CreatureAI extends AbstractAI
{ {
private OnNpcMoveFinished _onNpcMoveFinished = null;
public static class IntentionCommand public static class IntentionCommand
{ {
protected final CtrlIntention _crtlIntention; protected final CtrlIntention _crtlIntention;
@@ -691,7 +693,11 @@ public class CreatureAI extends AbstractAI
WalkingManager.getInstance().onArrived(npc); // Walking Manager support WalkingManager.getInstance().onArrived(npc); // Walking Manager support
// Notify to scripts // Notify to scripts
EventDispatcher.getInstance().notifyEventAsync(new OnNpcMoveFinished(npc), npc); if (_onNpcMoveFinished == null)
{
_onNpcMoveFinished = new OnNpcMoveFinished(npc);
}
EventDispatcher.getInstance().notifyEventAsync(_onNpcMoveFinished, npc);
} }
// Launch actions corresponding to the Event Think // Launch actions corresponding to the Event Think
@@ -103,6 +103,8 @@ import org.l2jmobius.gameserver.model.events.impl.creature.OnCreatureDamageRecei
import org.l2jmobius.gameserver.model.events.impl.creature.OnCreatureDeath; import org.l2jmobius.gameserver.model.events.impl.creature.OnCreatureDeath;
import org.l2jmobius.gameserver.model.events.impl.creature.OnCreatureKilled; import org.l2jmobius.gameserver.model.events.impl.creature.OnCreatureKilled;
import org.l2jmobius.gameserver.model.events.impl.creature.OnCreatureSee; import org.l2jmobius.gameserver.model.events.impl.creature.OnCreatureSee;
import org.l2jmobius.gameserver.model.events.impl.creature.OnCreatureSkillFinishCast;
import org.l2jmobius.gameserver.model.events.impl.creature.OnCreatureSkillUse;
import org.l2jmobius.gameserver.model.events.impl.creature.OnCreatureTeleport; import org.l2jmobius.gameserver.model.events.impl.creature.OnCreatureTeleport;
import org.l2jmobius.gameserver.model.events.impl.creature.OnCreatureTeleported; import org.l2jmobius.gameserver.model.events.impl.creature.OnCreatureTeleported;
import org.l2jmobius.gameserver.model.events.listeners.AbstractEventListener; import org.l2jmobius.gameserver.model.events.listeners.AbstractEventListener;
@@ -289,6 +291,14 @@ public abstract class Creature extends WorldObject implements ISkillsHolder, IDe
/** A list containing the dropped items of this fake player. */ /** A list containing the dropped items of this fake player. */
private final List<ItemInstance> _fakePlayerDrops = new CopyOnWriteArrayList<>(); private final List<ItemInstance> _fakePlayerDrops = new CopyOnWriteArrayList<>();
private OnCreatureAttack _onCreatureAttack = null;
private OnCreatureAttacked _onCreatureAttacked = null;
private OnCreatureDamageDealt _onCreatureDamageDealt = null;
private OnCreatureDamageReceived _onCreatureDamageReceived = null;
private OnCreatureAttackAvoid _onCreatureAttackAvoid = null;
public OnCreatureSkillFinishCast onCreatureSkillFinishCast = null;
public OnCreatureSkillUse onCreatureSkillUse = null;
/** /**
* Creates a creature. * Creates a creature.
* @param template the creature template * @param template the creature template
@@ -567,6 +577,14 @@ public abstract class Creature extends WorldObject implements ISkillsHolder, IDe
{ {
_summoner.removeSummonedNpc(getObjectId()); _summoner.removeSummonedNpc(getObjectId());
} }
_onCreatureAttack = null;
_onCreatureAttacked = null;
_onCreatureDamageDealt = null;
_onCreatureDamageReceived = null;
_onCreatureAttackAvoid = null;
onCreatureSkillFinishCast = null;
onCreatureSkillUse = null;
} }
@Override @Override
@@ -3908,8 +3926,24 @@ public abstract class Creature extends WorldObject implements ISkillsHolder, IDe
doAttack(hit.getDamage(), target, null, false, false, hit.isCritical(), false); doAttack(hit.getDamage(), target, null, false, false, hit.isCritical(), false);
// Notify to scripts when the attack has been done. // Notify to scripts when the attack has been done.
EventDispatcher.getInstance().notifyEvent(new OnCreatureAttack(this, target, null), this); if (_onCreatureAttack == null)
EventDispatcher.getInstance().notifyEvent(new OnCreatureAttacked(this, target, null), target); {
_onCreatureAttack = new OnCreatureAttack();
}
_onCreatureAttack.setAttacker(this);
_onCreatureAttack.setTarget(target);
_onCreatureAttack.setSkill(null);
EventDispatcher.getInstance().notifyEvent(_onCreatureAttack, this);
if (_onCreatureAttacked == null)
{
_onCreatureAttacked = new OnCreatureAttacked();
}
_onCreatureAttacked.setAttacker(this);
_onCreatureAttacked.setTarget(target);
_onCreatureAttacked.setSkill(null);
EventDispatcher.getInstance().notifyEvent(_onCreatureAttacked, target);
if (_triggerSkills != null) if (_triggerSkills != null)
{ {
for (OptionsSkillHolder holder : _triggerSkills.values()) for (OptionsSkillHolder holder : _triggerSkills.values())
@@ -4640,10 +4674,32 @@ public abstract class Creature extends WorldObject implements ISkillsHolder, IDe
// Notify of this attack only if there is an attacking creature. // Notify of this attack only if there is an attacking creature.
if (attacker != null) if (attacker != null)
{ {
EventDispatcher.getInstance().notifyEventAsync(new OnCreatureDamageDealt(attacker, this, amount, skill, critical, isDOT, reflect), attacker); if (_onCreatureDamageDealt == null)
{
_onCreatureDamageDealt = new OnCreatureDamageDealt();
}
_onCreatureDamageDealt.setAttacker(attacker);
_onCreatureDamageDealt.setTarget(this);
_onCreatureDamageDealt.setDamage(amount);
_onCreatureDamageDealt.setSkill(skill);
_onCreatureDamageDealt.setCritical(critical);
_onCreatureDamageDealt.setDamageOverTime(isDOT);
_onCreatureDamageDealt.setReflect(reflect);
EventDispatcher.getInstance().notifyEvent(_onCreatureDamageDealt, attacker);
} }
final DamageReturn term = EventDispatcher.getInstance().notifyEvent(new OnCreatureDamageReceived(attacker, this, amount, skill, critical, isDOT, reflect), this, DamageReturn.class); if (_onCreatureDamageReceived == null)
{
_onCreatureDamageReceived = new OnCreatureDamageReceived();
}
_onCreatureDamageReceived.setAttacker(attacker);
_onCreatureDamageReceived.setTarget(this);
_onCreatureDamageReceived.setDamage(amount);
_onCreatureDamageReceived.setSkill(skill);
_onCreatureDamageReceived.setCritical(critical);
_onCreatureDamageReceived.setDamageOverTime(isDOT);
_onCreatureDamageReceived.setReflect(reflect);
final DamageReturn term = EventDispatcher.getInstance().notifyEvent(_onCreatureDamageReceived, this, DamageReturn.class);
if (term != null) if (term != null)
{ {
if (term.terminate()) if (term.terminate())
@@ -5040,7 +5096,14 @@ public abstract class Creature extends WorldObject implements ISkillsHolder, IDe
*/ */
public void notifyAttackAvoid(Creature target, boolean isDot) public void notifyAttackAvoid(Creature target, boolean isDot)
{ {
EventDispatcher.getInstance().notifyEventAsync(new OnCreatureAttackAvoid(this, target, isDot), target); if (_onCreatureAttackAvoid == null)
{
_onCreatureAttackAvoid = new OnCreatureAttackAvoid();
}
_onCreatureAttackAvoid.setAttacker(this);
_onCreatureAttackAvoid.setTarget(target);
_onCreatureAttackAvoid.setDamageOverTime(isDot);
EventDispatcher.getInstance().notifyEvent(_onCreatureAttackAvoid, target);
} }
/** /**
@@ -27,15 +27,12 @@ import org.l2jmobius.gameserver.model.skills.Skill;
*/ */
public class OnCreatureAttack implements IBaseEvent public class OnCreatureAttack implements IBaseEvent
{ {
private final Creature _attacker; private Creature _attacker;
private final Creature _target; private Creature _target;
private final Skill _skill; private Skill _skill;
public OnCreatureAttack(Creature attacker, Creature target, Skill skill) public OnCreatureAttack()
{ {
_attacker = attacker;
_target = target;
_skill = skill;
} }
public Creature getAttacker() public Creature getAttacker()
@@ -43,16 +40,31 @@ public class OnCreatureAttack implements IBaseEvent
return _attacker; return _attacker;
} }
public synchronized void setAttacker(Creature attacker)
{
_attacker = attacker;
}
public Creature getTarget() public Creature getTarget()
{ {
return _target; return _target;
} }
public synchronized void setTarget(Creature target)
{
_target = target;
}
public Skill getSkill() public Skill getSkill()
{ {
return _skill; return _skill;
} }
public synchronized void setSkill(Skill skill)
{
_skill = skill;
}
@Override @Override
public EventType getType() public EventType getType()
{ {
@@ -26,20 +26,12 @@ import org.l2jmobius.gameserver.model.events.impl.IBaseEvent;
*/ */
public class OnCreatureAttackAvoid implements IBaseEvent public class OnCreatureAttackAvoid implements IBaseEvent
{ {
private final Creature _attacker; private Creature _attacker;
private final Creature _target; private Creature _target;
private final boolean _damageOverTime; private boolean _damageOverTime;
/** public OnCreatureAttackAvoid()
* @param attacker who attack
* @param target who avoid
* @param isDot is dot damage
*/
public OnCreatureAttackAvoid(Creature attacker, Creature target, boolean isDot)
{ {
_attacker = attacker;
_target = target;
_damageOverTime = isDot;
} }
public Creature getAttacker() public Creature getAttacker()
@@ -47,19 +39,31 @@ public class OnCreatureAttackAvoid implements IBaseEvent
return _attacker; return _attacker;
} }
public synchronized void setAttacker(Creature attacker)
{
_attacker = attacker;
}
public Creature getTarget() public Creature getTarget()
{ {
return _target; return _target;
} }
/** public synchronized void setTarget(Creature target)
* @return {
*/ _target = target;
}
public boolean isDamageOverTime() public boolean isDamageOverTime()
{ {
return _damageOverTime; return _damageOverTime;
} }
public synchronized void setDamageOverTime(boolean damageOverTime)
{
_damageOverTime = damageOverTime;
}
@Override @Override
public EventType getType() public EventType getType()
{ {
@@ -27,15 +27,12 @@ import org.l2jmobius.gameserver.model.skills.Skill;
*/ */
public class OnCreatureAttacked implements IBaseEvent public class OnCreatureAttacked implements IBaseEvent
{ {
private final Creature _attacker; private Creature _attacker;
private final Creature _target; private Creature _target;
private final Skill _skill; private Skill _skill;
public OnCreatureAttacked(Creature attacker, Creature target, Skill skill) public OnCreatureAttacked()
{ {
_attacker = attacker;
_target = target;
_skill = skill;
} }
public Creature getAttacker() public Creature getAttacker()
@@ -43,16 +40,31 @@ public class OnCreatureAttacked implements IBaseEvent
return _attacker; return _attacker;
} }
public synchronized void setAttacker(Creature attacker)
{
_attacker = attacker;
}
public Creature getTarget() public Creature getTarget()
{ {
return _target; return _target;
} }
public synchronized void setTarget(Creature target)
{
_target = target;
}
public Skill getSkill() public Skill getSkill()
{ {
return _skill; return _skill;
} }
public synchronized void setSkill(Skill skill)
{
_skill = skill;
}
@Override @Override
public EventType getType() public EventType getType()
{ {
@@ -27,23 +27,16 @@ import org.l2jmobius.gameserver.model.skills.Skill;
*/ */
public class OnCreatureDamageDealt implements IBaseEvent public class OnCreatureDamageDealt implements IBaseEvent
{ {
private final Creature _attacker; private Creature _attacker;
private final Creature _target; private Creature _target;
private final double _damage; private double _damage;
private final Skill _skill; private Skill _skill;
private final boolean _crit; private boolean _crit;
private final boolean _damageOverTime; private boolean _damageOverTime;
private final boolean _reflect; private boolean _reflect;
public OnCreatureDamageDealt(Creature attacker, Creature target, double damage, Skill skill, boolean crit, boolean damageOverTime, boolean reflect) public OnCreatureDamageDealt()
{ {
_attacker = attacker;
_target = target;
_damage = damage;
_skill = skill;
_crit = crit;
_damageOverTime = damageOverTime;
_reflect = reflect;
} }
public Creature getAttacker() public Creature getAttacker()
@@ -51,36 +44,71 @@ public class OnCreatureDamageDealt implements IBaseEvent
return _attacker; return _attacker;
} }
public synchronized void setAttacker(Creature attacker)
{
_attacker = attacker;
}
public Creature getTarget() public Creature getTarget()
{ {
return _target; return _target;
} }
public synchronized void setTarget(Creature target)
{
_target = target;
}
public double getDamage() public double getDamage()
{ {
return _damage; return _damage;
} }
public synchronized void setDamage(double damage)
{
_damage = damage;
}
public Skill getSkill() public Skill getSkill()
{ {
return _skill; return _skill;
} }
public synchronized void setSkill(Skill skill)
{
_skill = skill;
}
public boolean isCritical() public boolean isCritical()
{ {
return _crit; return _crit;
} }
public synchronized void setCritical(boolean crit)
{
_crit = crit;
}
public boolean isDamageOverTime() public boolean isDamageOverTime()
{ {
return _damageOverTime; return _damageOverTime;
} }
public synchronized void setDamageOverTime(boolean damageOverTime)
{
_damageOverTime = damageOverTime;
}
public boolean isReflect() public boolean isReflect()
{ {
return _reflect; return _reflect;
} }
public synchronized void setReflect(boolean reflect)
{
_reflect = reflect;
}
@Override @Override
public EventType getType() public EventType getType()
{ {
@@ -27,23 +27,16 @@ import org.l2jmobius.gameserver.model.skills.Skill;
*/ */
public class OnCreatureDamageReceived implements IBaseEvent public class OnCreatureDamageReceived implements IBaseEvent
{ {
private final Creature _attacker; private Creature _attacker;
private final Creature _target; private Creature _target;
private final double _damage; private double _damage;
private final Skill _skill; private Skill _skill;
private final boolean _crit; private boolean _crit;
private final boolean _damageOverTime; private boolean _damageOverTime;
private final boolean _reflect; private boolean _reflect;
public OnCreatureDamageReceived(Creature attacker, Creature target, double damage, Skill skill, boolean crit, boolean damageOverTime, boolean reflect) public OnCreatureDamageReceived()
{ {
_attacker = attacker;
_target = target;
_damage = damage;
_skill = skill;
_crit = crit;
_damageOverTime = damageOverTime;
_reflect = reflect;
} }
public Creature getAttacker() public Creature getAttacker()
@@ -51,36 +44,71 @@ public class OnCreatureDamageReceived implements IBaseEvent
return _attacker; return _attacker;
} }
public synchronized void setAttacker(Creature attacker)
{
_attacker = attacker;
}
public Creature getTarget() public Creature getTarget()
{ {
return _target; return _target;
} }
public synchronized void setTarget(Creature target)
{
_target = target;
}
public double getDamage() public double getDamage()
{ {
return _damage; return _damage;
} }
public synchronized void setDamage(double damage)
{
_damage = damage;
}
public Skill getSkill() public Skill getSkill()
{ {
return _skill; return _skill;
} }
public synchronized void setSkill(Skill skill)
{
_skill = skill;
}
public boolean isCritical() public boolean isCritical()
{ {
return _crit; return _crit;
} }
public synchronized void setCritical(boolean crit)
{
_crit = crit;
}
public boolean isDamageOverTime() public boolean isDamageOverTime()
{ {
return _damageOverTime; return _damageOverTime;
} }
public synchronized void setDamageOverTime(boolean damageOverTime)
{
_damageOverTime = damageOverTime;
}
public boolean isReflect() public boolean isReflect()
{ {
return _reflect; return _reflect;
} }
public synchronized void setReflect(boolean reflect)
{
_reflect = reflect;
}
@Override @Override
public EventType getType() public EventType getType()
{ {
@@ -28,17 +28,13 @@ import org.l2jmobius.gameserver.model.skills.Skill;
*/ */
public class OnCreatureSkillFinishCast implements IBaseEvent public class OnCreatureSkillFinishCast implements IBaseEvent
{ {
private final Creature _caster; private Creature _caster;
private final Skill _skill; private WorldObject _target;
private final boolean _simultaneously; private Skill _skill;
private final WorldObject _target; private boolean _simultaneously;
public OnCreatureSkillFinishCast(Creature caster, WorldObject target, Skill skill, boolean simultaneously) public OnCreatureSkillFinishCast()
{ {
_caster = caster;
_skill = skill;
_simultaneously = simultaneously;
_target = target;
} }
public Creature getCaster() public Creature getCaster()
@@ -46,21 +42,41 @@ public class OnCreatureSkillFinishCast implements IBaseEvent
return _caster; return _caster;
} }
public synchronized void setCaster(Creature caster)
{
_caster = caster;
}
public WorldObject getTarget() public WorldObject getTarget()
{ {
return _target; return _target;
} }
public synchronized void setTarget(WorldObject target)
{
_target = target;
}
public Skill getSkill() public Skill getSkill()
{ {
return _skill; return _skill;
} }
public synchronized void setSkill(Skill skill)
{
_skill = skill;
}
public boolean isSimultaneously() public boolean isSimultaneously()
{ {
return _simultaneously; return _simultaneously;
} }
public synchronized void setSimultaneously(boolean simultaneously)
{
_simultaneously = simultaneously;
}
@Override @Override
public EventType getType() public EventType getType()
{ {
@@ -27,15 +27,12 @@ import org.l2jmobius.gameserver.model.skills.Skill;
*/ */
public class OnCreatureSkillUse implements IBaseEvent public class OnCreatureSkillUse implements IBaseEvent
{ {
private final Creature _caster; private Creature _caster;
private final Skill _skill; private Skill _skill;
private final boolean _simultaneously; private boolean _simultaneously;
public OnCreatureSkillUse(Creature caster, Skill skill, boolean simultaneously) public OnCreatureSkillUse()
{ {
_caster = caster;
_skill = skill;
_simultaneously = simultaneously;
} }
public Creature getCaster() public Creature getCaster()
@@ -43,16 +40,31 @@ public class OnCreatureSkillUse implements IBaseEvent
return _caster; return _caster;
} }
public synchronized void setCaster(Creature caster)
{
_caster = caster;
}
public Skill getSkill() public Skill getSkill()
{ {
return _skill; return _skill;
} }
public synchronized void setSkill(Skill skill)
{
_skill = skill;
}
public boolean isSimultaneously() public boolean isSimultaneously()
{ {
return _simultaneously; return _simultaneously;
} }
public synchronized void setSimultaneously(boolean simultaneously)
{
_simultaneously = simultaneously;
}
@Override @Override
public EventType getType() public EventType getType()
{ {
@@ -523,7 +523,15 @@ public class SkillCaster implements Runnable
} }
// Notify skill is casted. // Notify skill is casted.
EventDispatcher.getInstance().notifyEvent(new OnCreatureSkillFinishCast(caster, target, _skill, _skill.isWithoutAction()), caster); if (caster.onCreatureSkillFinishCast == null)
{
caster.onCreatureSkillFinishCast = new OnCreatureSkillFinishCast();
}
caster.onCreatureSkillFinishCast.setCaster(caster);
caster.onCreatureSkillFinishCast.setTarget(target);
caster.onCreatureSkillFinishCast.setSkill(_skill);
caster.onCreatureSkillFinishCast.setSimultaneously(_skill.isWithoutAction());
EventDispatcher.getInstance().notifyEvent(caster.onCreatureSkillFinishCast, caster);
// Call the skill's effects and AI interraction and stuff. // Call the skill's effects and AI interraction and stuff.
callSkill(caster, target, _targets, _skill, _item); callSkill(caster, target, _targets, _skill, _item);
@@ -968,7 +976,14 @@ public class SkillCaster implements Runnable
return false; return false;
} }
final TerminateReturn term = EventDispatcher.getInstance().notifyEvent(new OnCreatureSkillUse(caster, skill, skill.isWithoutAction()), caster, TerminateReturn.class); if (caster.onCreatureSkillUse == null)
{
caster.onCreatureSkillUse = new OnCreatureSkillUse();
}
caster.onCreatureSkillUse.setCaster(caster);
caster.onCreatureSkillUse.setSkill(skill);
caster.onCreatureSkillUse.setSimultaneously(skill.isWithoutAction());
final TerminateReturn term = EventDispatcher.getInstance().notifyEvent(caster.onCreatureSkillUse, caster, TerminateReturn.class);
if ((term != null) && term.terminate()) if ((term != null) && term.terminate())
{ {
caster.sendPacket(ActionFailed.STATIC_PACKET); caster.sendPacket(ActionFailed.STATIC_PACKET);
@@ -66,7 +66,11 @@ public class LargeCocoon extends AbstractNpcAI
{ {
case "attack": case "attack":
{ {
onCreatureAttacked(new OnCreatureAttacked(player, npc, null)); final OnCreatureAttacked attackEvent = new OnCreatureAttacked();
attackEvent.setAttacker(player);
attackEvent.setTarget(npc);
attackEvent.setSkill(null);
onCreatureAttacked(attackEvent);
break; break;
} }
case "attackPowerful": case "attackPowerful":
@@ -66,6 +66,8 @@ import org.l2jmobius.gameserver.taskmanager.AttackStanceTaskManager;
*/ */
public class CreatureAI extends AbstractAI public class CreatureAI extends AbstractAI
{ {
private OnNpcMoveFinished _onNpcMoveFinished = null;
public static class IntentionCommand public static class IntentionCommand
{ {
protected final CtrlIntention _crtlIntention; protected final CtrlIntention _crtlIntention;
@@ -691,7 +693,11 @@ public class CreatureAI extends AbstractAI
WalkingManager.getInstance().onArrived(npc); // Walking Manager support WalkingManager.getInstance().onArrived(npc); // Walking Manager support
// Notify to scripts // Notify to scripts
EventDispatcher.getInstance().notifyEventAsync(new OnNpcMoveFinished(npc), npc); if (_onNpcMoveFinished == null)
{
_onNpcMoveFinished = new OnNpcMoveFinished(npc);
}
EventDispatcher.getInstance().notifyEventAsync(_onNpcMoveFinished, npc);
} }
// Launch actions corresponding to the Event Think // Launch actions corresponding to the Event Think
@@ -103,6 +103,8 @@ import org.l2jmobius.gameserver.model.events.impl.creature.OnCreatureDamageRecei
import org.l2jmobius.gameserver.model.events.impl.creature.OnCreatureDeath; import org.l2jmobius.gameserver.model.events.impl.creature.OnCreatureDeath;
import org.l2jmobius.gameserver.model.events.impl.creature.OnCreatureKilled; import org.l2jmobius.gameserver.model.events.impl.creature.OnCreatureKilled;
import org.l2jmobius.gameserver.model.events.impl.creature.OnCreatureSee; import org.l2jmobius.gameserver.model.events.impl.creature.OnCreatureSee;
import org.l2jmobius.gameserver.model.events.impl.creature.OnCreatureSkillFinishCast;
import org.l2jmobius.gameserver.model.events.impl.creature.OnCreatureSkillUse;
import org.l2jmobius.gameserver.model.events.impl.creature.OnCreatureTeleport; import org.l2jmobius.gameserver.model.events.impl.creature.OnCreatureTeleport;
import org.l2jmobius.gameserver.model.events.impl.creature.OnCreatureTeleported; import org.l2jmobius.gameserver.model.events.impl.creature.OnCreatureTeleported;
import org.l2jmobius.gameserver.model.events.listeners.AbstractEventListener; import org.l2jmobius.gameserver.model.events.listeners.AbstractEventListener;
@@ -289,6 +291,14 @@ public abstract class Creature extends WorldObject implements ISkillsHolder, IDe
/** A list containing the dropped items of this fake player. */ /** A list containing the dropped items of this fake player. */
private final List<ItemInstance> _fakePlayerDrops = new CopyOnWriteArrayList<>(); private final List<ItemInstance> _fakePlayerDrops = new CopyOnWriteArrayList<>();
private OnCreatureAttack _onCreatureAttack = null;
private OnCreatureAttacked _onCreatureAttacked = null;
private OnCreatureDamageDealt _onCreatureDamageDealt = null;
private OnCreatureDamageReceived _onCreatureDamageReceived = null;
private OnCreatureAttackAvoid _onCreatureAttackAvoid = null;
public OnCreatureSkillFinishCast onCreatureSkillFinishCast = null;
public OnCreatureSkillUse onCreatureSkillUse = null;
/** /**
* Creates a creature. * Creates a creature.
* @param template the creature template * @param template the creature template
@@ -567,6 +577,14 @@ public abstract class Creature extends WorldObject implements ISkillsHolder, IDe
{ {
_summoner.removeSummonedNpc(getObjectId()); _summoner.removeSummonedNpc(getObjectId());
} }
_onCreatureAttack = null;
_onCreatureAttacked = null;
_onCreatureDamageDealt = null;
_onCreatureDamageReceived = null;
_onCreatureAttackAvoid = null;
onCreatureSkillFinishCast = null;
onCreatureSkillUse = null;
} }
@Override @Override
@@ -3908,8 +3926,24 @@ public abstract class Creature extends WorldObject implements ISkillsHolder, IDe
doAttack(hit.getDamage(), target, null, false, false, hit.isCritical(), false); doAttack(hit.getDamage(), target, null, false, false, hit.isCritical(), false);
// Notify to scripts when the attack has been done. // Notify to scripts when the attack has been done.
EventDispatcher.getInstance().notifyEvent(new OnCreatureAttack(this, target, null), this); if (_onCreatureAttack == null)
EventDispatcher.getInstance().notifyEvent(new OnCreatureAttacked(this, target, null), target); {
_onCreatureAttack = new OnCreatureAttack();
}
_onCreatureAttack.setAttacker(this);
_onCreatureAttack.setTarget(target);
_onCreatureAttack.setSkill(null);
EventDispatcher.getInstance().notifyEvent(_onCreatureAttack, this);
if (_onCreatureAttacked == null)
{
_onCreatureAttacked = new OnCreatureAttacked();
}
_onCreatureAttacked.setAttacker(this);
_onCreatureAttacked.setTarget(target);
_onCreatureAttacked.setSkill(null);
EventDispatcher.getInstance().notifyEvent(_onCreatureAttacked, target);
if (_triggerSkills != null) if (_triggerSkills != null)
{ {
for (OptionsSkillHolder holder : _triggerSkills.values()) for (OptionsSkillHolder holder : _triggerSkills.values())
@@ -4640,10 +4674,32 @@ public abstract class Creature extends WorldObject implements ISkillsHolder, IDe
// Notify of this attack only if there is an attacking creature. // Notify of this attack only if there is an attacking creature.
if (attacker != null) if (attacker != null)
{ {
EventDispatcher.getInstance().notifyEventAsync(new OnCreatureDamageDealt(attacker, this, amount, skill, critical, isDOT, reflect), attacker); if (_onCreatureDamageDealt == null)
{
_onCreatureDamageDealt = new OnCreatureDamageDealt();
}
_onCreatureDamageDealt.setAttacker(attacker);
_onCreatureDamageDealt.setTarget(this);
_onCreatureDamageDealt.setDamage(amount);
_onCreatureDamageDealt.setSkill(skill);
_onCreatureDamageDealt.setCritical(critical);
_onCreatureDamageDealt.setDamageOverTime(isDOT);
_onCreatureDamageDealt.setReflect(reflect);
EventDispatcher.getInstance().notifyEvent(_onCreatureDamageDealt, attacker);
} }
final DamageReturn term = EventDispatcher.getInstance().notifyEvent(new OnCreatureDamageReceived(attacker, this, amount, skill, critical, isDOT, reflect), this, DamageReturn.class); if (_onCreatureDamageReceived == null)
{
_onCreatureDamageReceived = new OnCreatureDamageReceived();
}
_onCreatureDamageReceived.setAttacker(attacker);
_onCreatureDamageReceived.setTarget(this);
_onCreatureDamageReceived.setDamage(amount);
_onCreatureDamageReceived.setSkill(skill);
_onCreatureDamageReceived.setCritical(critical);
_onCreatureDamageReceived.setDamageOverTime(isDOT);
_onCreatureDamageReceived.setReflect(reflect);
final DamageReturn term = EventDispatcher.getInstance().notifyEvent(_onCreatureDamageReceived, this, DamageReturn.class);
if (term != null) if (term != null)
{ {
if (term.terminate()) if (term.terminate())
@@ -5049,7 +5105,14 @@ public abstract class Creature extends WorldObject implements ISkillsHolder, IDe
*/ */
public void notifyAttackAvoid(Creature target, boolean isDot) public void notifyAttackAvoid(Creature target, boolean isDot)
{ {
EventDispatcher.getInstance().notifyEventAsync(new OnCreatureAttackAvoid(this, target, isDot), target); if (_onCreatureAttackAvoid == null)
{
_onCreatureAttackAvoid = new OnCreatureAttackAvoid();
}
_onCreatureAttackAvoid.setAttacker(this);
_onCreatureAttackAvoid.setTarget(target);
_onCreatureAttackAvoid.setDamageOverTime(isDot);
EventDispatcher.getInstance().notifyEvent(_onCreatureAttackAvoid, target);
} }
/** /**
@@ -27,15 +27,12 @@ import org.l2jmobius.gameserver.model.skills.Skill;
*/ */
public class OnCreatureAttack implements IBaseEvent public class OnCreatureAttack implements IBaseEvent
{ {
private final Creature _attacker; private Creature _attacker;
private final Creature _target; private Creature _target;
private final Skill _skill; private Skill _skill;
public OnCreatureAttack(Creature attacker, Creature target, Skill skill) public OnCreatureAttack()
{ {
_attacker = attacker;
_target = target;
_skill = skill;
} }
public Creature getAttacker() public Creature getAttacker()
@@ -43,16 +40,31 @@ public class OnCreatureAttack implements IBaseEvent
return _attacker; return _attacker;
} }
public synchronized void setAttacker(Creature attacker)
{
_attacker = attacker;
}
public Creature getTarget() public Creature getTarget()
{ {
return _target; return _target;
} }
public synchronized void setTarget(Creature target)
{
_target = target;
}
public Skill getSkill() public Skill getSkill()
{ {
return _skill; return _skill;
} }
public synchronized void setSkill(Skill skill)
{
_skill = skill;
}
@Override @Override
public EventType getType() public EventType getType()
{ {
@@ -26,20 +26,12 @@ import org.l2jmobius.gameserver.model.events.impl.IBaseEvent;
*/ */
public class OnCreatureAttackAvoid implements IBaseEvent public class OnCreatureAttackAvoid implements IBaseEvent
{ {
private final Creature _attacker; private Creature _attacker;
private final Creature _target; private Creature _target;
private final boolean _damageOverTime; private boolean _damageOverTime;
/** public OnCreatureAttackAvoid()
* @param attacker who attack
* @param target who avoid
* @param isDot is dot damage
*/
public OnCreatureAttackAvoid(Creature attacker, Creature target, boolean isDot)
{ {
_attacker = attacker;
_target = target;
_damageOverTime = isDot;
} }
public Creature getAttacker() public Creature getAttacker()
@@ -47,19 +39,31 @@ public class OnCreatureAttackAvoid implements IBaseEvent
return _attacker; return _attacker;
} }
public synchronized void setAttacker(Creature attacker)
{
_attacker = attacker;
}
public Creature getTarget() public Creature getTarget()
{ {
return _target; return _target;
} }
/** public synchronized void setTarget(Creature target)
* @return {
*/ _target = target;
}
public boolean isDamageOverTime() public boolean isDamageOverTime()
{ {
return _damageOverTime; return _damageOverTime;
} }
public synchronized void setDamageOverTime(boolean damageOverTime)
{
_damageOverTime = damageOverTime;
}
@Override @Override
public EventType getType() public EventType getType()
{ {
@@ -27,15 +27,12 @@ import org.l2jmobius.gameserver.model.skills.Skill;
*/ */
public class OnCreatureAttacked implements IBaseEvent public class OnCreatureAttacked implements IBaseEvent
{ {
private final Creature _attacker; private Creature _attacker;
private final Creature _target; private Creature _target;
private final Skill _skill; private Skill _skill;
public OnCreatureAttacked(Creature attacker, Creature target, Skill skill) public OnCreatureAttacked()
{ {
_attacker = attacker;
_target = target;
_skill = skill;
} }
public Creature getAttacker() public Creature getAttacker()
@@ -43,16 +40,31 @@ public class OnCreatureAttacked implements IBaseEvent
return _attacker; return _attacker;
} }
public synchronized void setAttacker(Creature attacker)
{
_attacker = attacker;
}
public Creature getTarget() public Creature getTarget()
{ {
return _target; return _target;
} }
public synchronized void setTarget(Creature target)
{
_target = target;
}
public Skill getSkill() public Skill getSkill()
{ {
return _skill; return _skill;
} }
public synchronized void setSkill(Skill skill)
{
_skill = skill;
}
@Override @Override
public EventType getType() public EventType getType()
{ {
@@ -27,23 +27,16 @@ import org.l2jmobius.gameserver.model.skills.Skill;
*/ */
public class OnCreatureDamageDealt implements IBaseEvent public class OnCreatureDamageDealt implements IBaseEvent
{ {
private final Creature _attacker; private Creature _attacker;
private final Creature _target; private Creature _target;
private final double _damage; private double _damage;
private final Skill _skill; private Skill _skill;
private final boolean _crit; private boolean _crit;
private final boolean _damageOverTime; private boolean _damageOverTime;
private final boolean _reflect; private boolean _reflect;
public OnCreatureDamageDealt(Creature attacker, Creature target, double damage, Skill skill, boolean crit, boolean damageOverTime, boolean reflect) public OnCreatureDamageDealt()
{ {
_attacker = attacker;
_target = target;
_damage = damage;
_skill = skill;
_crit = crit;
_damageOverTime = damageOverTime;
_reflect = reflect;
} }
public Creature getAttacker() public Creature getAttacker()
@@ -51,36 +44,71 @@ public class OnCreatureDamageDealt implements IBaseEvent
return _attacker; return _attacker;
} }
public synchronized void setAttacker(Creature attacker)
{
_attacker = attacker;
}
public Creature getTarget() public Creature getTarget()
{ {
return _target; return _target;
} }
public synchronized void setTarget(Creature target)
{
_target = target;
}
public double getDamage() public double getDamage()
{ {
return _damage; return _damage;
} }
public synchronized void setDamage(double damage)
{
_damage = damage;
}
public Skill getSkill() public Skill getSkill()
{ {
return _skill; return _skill;
} }
public synchronized void setSkill(Skill skill)
{
_skill = skill;
}
public boolean isCritical() public boolean isCritical()
{ {
return _crit; return _crit;
} }
public synchronized void setCritical(boolean crit)
{
_crit = crit;
}
public boolean isDamageOverTime() public boolean isDamageOverTime()
{ {
return _damageOverTime; return _damageOverTime;
} }
public synchronized void setDamageOverTime(boolean damageOverTime)
{
_damageOverTime = damageOverTime;
}
public boolean isReflect() public boolean isReflect()
{ {
return _reflect; return _reflect;
} }
public synchronized void setReflect(boolean reflect)
{
_reflect = reflect;
}
@Override @Override
public EventType getType() public EventType getType()
{ {
@@ -27,23 +27,16 @@ import org.l2jmobius.gameserver.model.skills.Skill;
*/ */
public class OnCreatureDamageReceived implements IBaseEvent public class OnCreatureDamageReceived implements IBaseEvent
{ {
private final Creature _attacker; private Creature _attacker;
private final Creature _target; private Creature _target;
private final double _damage; private double _damage;
private final Skill _skill; private Skill _skill;
private final boolean _crit; private boolean _crit;
private final boolean _damageOverTime; private boolean _damageOverTime;
private final boolean _reflect; private boolean _reflect;
public OnCreatureDamageReceived(Creature attacker, Creature target, double damage, Skill skill, boolean crit, boolean damageOverTime, boolean reflect) public OnCreatureDamageReceived()
{ {
_attacker = attacker;
_target = target;
_damage = damage;
_skill = skill;
_crit = crit;
_damageOverTime = damageOverTime;
_reflect = reflect;
} }
public Creature getAttacker() public Creature getAttacker()
@@ -51,36 +44,71 @@ public class OnCreatureDamageReceived implements IBaseEvent
return _attacker; return _attacker;
} }
public synchronized void setAttacker(Creature attacker)
{
_attacker = attacker;
}
public Creature getTarget() public Creature getTarget()
{ {
return _target; return _target;
} }
public synchronized void setTarget(Creature target)
{
_target = target;
}
public double getDamage() public double getDamage()
{ {
return _damage; return _damage;
} }
public synchronized void setDamage(double damage)
{
_damage = damage;
}
public Skill getSkill() public Skill getSkill()
{ {
return _skill; return _skill;
} }
public synchronized void setSkill(Skill skill)
{
_skill = skill;
}
public boolean isCritical() public boolean isCritical()
{ {
return _crit; return _crit;
} }
public synchronized void setCritical(boolean crit)
{
_crit = crit;
}
public boolean isDamageOverTime() public boolean isDamageOverTime()
{ {
return _damageOverTime; return _damageOverTime;
} }
public synchronized void setDamageOverTime(boolean damageOverTime)
{
_damageOverTime = damageOverTime;
}
public boolean isReflect() public boolean isReflect()
{ {
return _reflect; return _reflect;
} }
public synchronized void setReflect(boolean reflect)
{
_reflect = reflect;
}
@Override @Override
public EventType getType() public EventType getType()
{ {
@@ -28,17 +28,13 @@ import org.l2jmobius.gameserver.model.skills.Skill;
*/ */
public class OnCreatureSkillFinishCast implements IBaseEvent public class OnCreatureSkillFinishCast implements IBaseEvent
{ {
private final Creature _caster; private Creature _caster;
private final Skill _skill; private WorldObject _target;
private final boolean _simultaneously; private Skill _skill;
private final WorldObject _target; private boolean _simultaneously;
public OnCreatureSkillFinishCast(Creature caster, WorldObject target, Skill skill, boolean simultaneously) public OnCreatureSkillFinishCast()
{ {
_caster = caster;
_skill = skill;
_simultaneously = simultaneously;
_target = target;
} }
public Creature getCaster() public Creature getCaster()
@@ -46,21 +42,41 @@ public class OnCreatureSkillFinishCast implements IBaseEvent
return _caster; return _caster;
} }
public synchronized void setCaster(Creature caster)
{
_caster = caster;
}
public WorldObject getTarget() public WorldObject getTarget()
{ {
return _target; return _target;
} }
public synchronized void setTarget(WorldObject target)
{
_target = target;
}
public Skill getSkill() public Skill getSkill()
{ {
return _skill; return _skill;
} }
public synchronized void setSkill(Skill skill)
{
_skill = skill;
}
public boolean isSimultaneously() public boolean isSimultaneously()
{ {
return _simultaneously; return _simultaneously;
} }
public synchronized void setSimultaneously(boolean simultaneously)
{
_simultaneously = simultaneously;
}
@Override @Override
public EventType getType() public EventType getType()
{ {
@@ -27,15 +27,12 @@ import org.l2jmobius.gameserver.model.skills.Skill;
*/ */
public class OnCreatureSkillUse implements IBaseEvent public class OnCreatureSkillUse implements IBaseEvent
{ {
private final Creature _caster; private Creature _caster;
private final Skill _skill; private Skill _skill;
private final boolean _simultaneously; private boolean _simultaneously;
public OnCreatureSkillUse(Creature caster, Skill skill, boolean simultaneously) public OnCreatureSkillUse()
{ {
_caster = caster;
_skill = skill;
_simultaneously = simultaneously;
} }
public Creature getCaster() public Creature getCaster()
@@ -43,16 +40,31 @@ public class OnCreatureSkillUse implements IBaseEvent
return _caster; return _caster;
} }
public synchronized void setCaster(Creature caster)
{
_caster = caster;
}
public Skill getSkill() public Skill getSkill()
{ {
return _skill; return _skill;
} }
public synchronized void setSkill(Skill skill)
{
_skill = skill;
}
public boolean isSimultaneously() public boolean isSimultaneously()
{ {
return _simultaneously; return _simultaneously;
} }
public synchronized void setSimultaneously(boolean simultaneously)
{
_simultaneously = simultaneously;
}
@Override @Override
public EventType getType() public EventType getType()
{ {
@@ -523,7 +523,15 @@ public class SkillCaster implements Runnable
} }
// Notify skill is casted. // Notify skill is casted.
EventDispatcher.getInstance().notifyEvent(new OnCreatureSkillFinishCast(caster, target, _skill, _skill.isWithoutAction()), caster); if (caster.onCreatureSkillFinishCast == null)
{
caster.onCreatureSkillFinishCast = new OnCreatureSkillFinishCast();
}
caster.onCreatureSkillFinishCast.setCaster(caster);
caster.onCreatureSkillFinishCast.setTarget(target);
caster.onCreatureSkillFinishCast.setSkill(_skill);
caster.onCreatureSkillFinishCast.setSimultaneously(_skill.isWithoutAction());
EventDispatcher.getInstance().notifyEvent(caster.onCreatureSkillFinishCast, caster);
// Call the skill's effects and AI interraction and stuff. // Call the skill's effects and AI interraction and stuff.
callSkill(caster, target, _targets, _skill, _item); callSkill(caster, target, _targets, _skill, _item);
@@ -968,7 +976,14 @@ public class SkillCaster implements Runnable
return false; return false;
} }
final TerminateReturn term = EventDispatcher.getInstance().notifyEvent(new OnCreatureSkillUse(caster, skill, skill.isWithoutAction()), caster, TerminateReturn.class); if (caster.onCreatureSkillUse == null)
{
caster.onCreatureSkillUse = new OnCreatureSkillUse();
}
caster.onCreatureSkillUse.setCaster(caster);
caster.onCreatureSkillUse.setSkill(skill);
caster.onCreatureSkillUse.setSimultaneously(skill.isWithoutAction());
final TerminateReturn term = EventDispatcher.getInstance().notifyEvent(caster.onCreatureSkillUse, caster, TerminateReturn.class);
if ((term != null) && term.terminate()) if ((term != null) && term.terminate())
{ {
caster.sendPacket(ActionFailed.STATIC_PACKET); caster.sendPacket(ActionFailed.STATIC_PACKET);
@@ -66,7 +66,11 @@ public class LargeCocoon extends AbstractNpcAI
{ {
case "attack": case "attack":
{ {
onCreatureAttacked(new OnCreatureAttacked(player, npc, null)); final OnCreatureAttacked attackEvent = new OnCreatureAttacked();
attackEvent.setAttacker(player);
attackEvent.setTarget(npc);
attackEvent.setSkill(null);
onCreatureAttacked(attackEvent);
break; break;
} }
case "attackPowerful": case "attackPowerful":
@@ -66,6 +66,8 @@ import org.l2jmobius.gameserver.taskmanager.AttackStanceTaskManager;
*/ */
public class CreatureAI extends AbstractAI public class CreatureAI extends AbstractAI
{ {
private OnNpcMoveFinished _onNpcMoveFinished = null;
public static class IntentionCommand public static class IntentionCommand
{ {
protected final CtrlIntention _crtlIntention; protected final CtrlIntention _crtlIntention;
@@ -691,7 +693,11 @@ public class CreatureAI extends AbstractAI
WalkingManager.getInstance().onArrived(npc); // Walking Manager support WalkingManager.getInstance().onArrived(npc); // Walking Manager support
// Notify to scripts // Notify to scripts
EventDispatcher.getInstance().notifyEventAsync(new OnNpcMoveFinished(npc), npc); if (_onNpcMoveFinished == null)
{
_onNpcMoveFinished = new OnNpcMoveFinished(npc);
}
EventDispatcher.getInstance().notifyEventAsync(_onNpcMoveFinished, npc);
} }
// Launch actions corresponding to the Event Think // Launch actions corresponding to the Event Think
@@ -103,6 +103,8 @@ import org.l2jmobius.gameserver.model.events.impl.creature.OnCreatureDamageRecei
import org.l2jmobius.gameserver.model.events.impl.creature.OnCreatureDeath; import org.l2jmobius.gameserver.model.events.impl.creature.OnCreatureDeath;
import org.l2jmobius.gameserver.model.events.impl.creature.OnCreatureKilled; import org.l2jmobius.gameserver.model.events.impl.creature.OnCreatureKilled;
import org.l2jmobius.gameserver.model.events.impl.creature.OnCreatureSee; import org.l2jmobius.gameserver.model.events.impl.creature.OnCreatureSee;
import org.l2jmobius.gameserver.model.events.impl.creature.OnCreatureSkillFinishCast;
import org.l2jmobius.gameserver.model.events.impl.creature.OnCreatureSkillUse;
import org.l2jmobius.gameserver.model.events.impl.creature.OnCreatureTeleport; import org.l2jmobius.gameserver.model.events.impl.creature.OnCreatureTeleport;
import org.l2jmobius.gameserver.model.events.impl.creature.OnCreatureTeleported; import org.l2jmobius.gameserver.model.events.impl.creature.OnCreatureTeleported;
import org.l2jmobius.gameserver.model.events.listeners.AbstractEventListener; import org.l2jmobius.gameserver.model.events.listeners.AbstractEventListener;
@@ -289,6 +291,14 @@ public abstract class Creature extends WorldObject implements ISkillsHolder, IDe
/** A list containing the dropped items of this fake player. */ /** A list containing the dropped items of this fake player. */
private final List<ItemInstance> _fakePlayerDrops = new CopyOnWriteArrayList<>(); private final List<ItemInstance> _fakePlayerDrops = new CopyOnWriteArrayList<>();
private OnCreatureAttack _onCreatureAttack = null;
private OnCreatureAttacked _onCreatureAttacked = null;
private OnCreatureDamageDealt _onCreatureDamageDealt = null;
private OnCreatureDamageReceived _onCreatureDamageReceived = null;
private OnCreatureAttackAvoid _onCreatureAttackAvoid = null;
public OnCreatureSkillFinishCast onCreatureSkillFinishCast = null;
public OnCreatureSkillUse onCreatureSkillUse = null;
/** /**
* Creates a creature. * Creates a creature.
* @param template the creature template * @param template the creature template
@@ -567,6 +577,14 @@ public abstract class Creature extends WorldObject implements ISkillsHolder, IDe
{ {
_summoner.removeSummonedNpc(getObjectId()); _summoner.removeSummonedNpc(getObjectId());
} }
_onCreatureAttack = null;
_onCreatureAttacked = null;
_onCreatureDamageDealt = null;
_onCreatureDamageReceived = null;
_onCreatureAttackAvoid = null;
onCreatureSkillFinishCast = null;
onCreatureSkillUse = null;
} }
@Override @Override
@@ -3908,8 +3926,24 @@ public abstract class Creature extends WorldObject implements ISkillsHolder, IDe
doAttack(hit.getDamage(), target, null, false, false, hit.isCritical(), false); doAttack(hit.getDamage(), target, null, false, false, hit.isCritical(), false);
// Notify to scripts when the attack has been done. // Notify to scripts when the attack has been done.
EventDispatcher.getInstance().notifyEvent(new OnCreatureAttack(this, target, null), this); if (_onCreatureAttack == null)
EventDispatcher.getInstance().notifyEvent(new OnCreatureAttacked(this, target, null), target); {
_onCreatureAttack = new OnCreatureAttack();
}
_onCreatureAttack.setAttacker(this);
_onCreatureAttack.setTarget(target);
_onCreatureAttack.setSkill(null);
EventDispatcher.getInstance().notifyEvent(_onCreatureAttack, this);
if (_onCreatureAttacked == null)
{
_onCreatureAttacked = new OnCreatureAttacked();
}
_onCreatureAttacked.setAttacker(this);
_onCreatureAttacked.setTarget(target);
_onCreatureAttacked.setSkill(null);
EventDispatcher.getInstance().notifyEvent(_onCreatureAttacked, target);
if (_triggerSkills != null) if (_triggerSkills != null)
{ {
for (OptionsSkillHolder holder : _triggerSkills.values()) for (OptionsSkillHolder holder : _triggerSkills.values())
@@ -4640,10 +4674,32 @@ public abstract class Creature extends WorldObject implements ISkillsHolder, IDe
// Notify of this attack only if there is an attacking creature. // Notify of this attack only if there is an attacking creature.
if (attacker != null) if (attacker != null)
{ {
EventDispatcher.getInstance().notifyEventAsync(new OnCreatureDamageDealt(attacker, this, amount, skill, critical, isDOT, reflect), attacker); if (_onCreatureDamageDealt == null)
{
_onCreatureDamageDealt = new OnCreatureDamageDealt();
}
_onCreatureDamageDealt.setAttacker(attacker);
_onCreatureDamageDealt.setTarget(this);
_onCreatureDamageDealt.setDamage(amount);
_onCreatureDamageDealt.setSkill(skill);
_onCreatureDamageDealt.setCritical(critical);
_onCreatureDamageDealt.setDamageOverTime(isDOT);
_onCreatureDamageDealt.setReflect(reflect);
EventDispatcher.getInstance().notifyEvent(_onCreatureDamageDealt, attacker);
} }
final DamageReturn term = EventDispatcher.getInstance().notifyEvent(new OnCreatureDamageReceived(attacker, this, amount, skill, critical, isDOT, reflect), this, DamageReturn.class); if (_onCreatureDamageReceived == null)
{
_onCreatureDamageReceived = new OnCreatureDamageReceived();
}
_onCreatureDamageReceived.setAttacker(attacker);
_onCreatureDamageReceived.setTarget(this);
_onCreatureDamageReceived.setDamage(amount);
_onCreatureDamageReceived.setSkill(skill);
_onCreatureDamageReceived.setCritical(critical);
_onCreatureDamageReceived.setDamageOverTime(isDOT);
_onCreatureDamageReceived.setReflect(reflect);
final DamageReturn term = EventDispatcher.getInstance().notifyEvent(_onCreatureDamageReceived, this, DamageReturn.class);
if (term != null) if (term != null)
{ {
if (term.terminate()) if (term.terminate())
@@ -5049,7 +5105,14 @@ public abstract class Creature extends WorldObject implements ISkillsHolder, IDe
*/ */
public void notifyAttackAvoid(Creature target, boolean isDot) public void notifyAttackAvoid(Creature target, boolean isDot)
{ {
EventDispatcher.getInstance().notifyEventAsync(new OnCreatureAttackAvoid(this, target, isDot), target); if (_onCreatureAttackAvoid == null)
{
_onCreatureAttackAvoid = new OnCreatureAttackAvoid();
}
_onCreatureAttackAvoid.setAttacker(this);
_onCreatureAttackAvoid.setTarget(target);
_onCreatureAttackAvoid.setDamageOverTime(isDot);
EventDispatcher.getInstance().notifyEvent(_onCreatureAttackAvoid, target);
} }
/** /**
@@ -27,15 +27,12 @@ import org.l2jmobius.gameserver.model.skills.Skill;
*/ */
public class OnCreatureAttack implements IBaseEvent public class OnCreatureAttack implements IBaseEvent
{ {
private final Creature _attacker; private Creature _attacker;
private final Creature _target; private Creature _target;
private final Skill _skill; private Skill _skill;
public OnCreatureAttack(Creature attacker, Creature target, Skill skill) public OnCreatureAttack()
{ {
_attacker = attacker;
_target = target;
_skill = skill;
} }
public Creature getAttacker() public Creature getAttacker()
@@ -43,16 +40,31 @@ public class OnCreatureAttack implements IBaseEvent
return _attacker; return _attacker;
} }
public synchronized void setAttacker(Creature attacker)
{
_attacker = attacker;
}
public Creature getTarget() public Creature getTarget()
{ {
return _target; return _target;
} }
public synchronized void setTarget(Creature target)
{
_target = target;
}
public Skill getSkill() public Skill getSkill()
{ {
return _skill; return _skill;
} }
public synchronized void setSkill(Skill skill)
{
_skill = skill;
}
@Override @Override
public EventType getType() public EventType getType()
{ {
@@ -26,20 +26,12 @@ import org.l2jmobius.gameserver.model.events.impl.IBaseEvent;
*/ */
public class OnCreatureAttackAvoid implements IBaseEvent public class OnCreatureAttackAvoid implements IBaseEvent
{ {
private final Creature _attacker; private Creature _attacker;
private final Creature _target; private Creature _target;
private final boolean _damageOverTime; private boolean _damageOverTime;
/** public OnCreatureAttackAvoid()
* @param attacker who attack
* @param target who avoid
* @param isDot is dot damage
*/
public OnCreatureAttackAvoid(Creature attacker, Creature target, boolean isDot)
{ {
_attacker = attacker;
_target = target;
_damageOverTime = isDot;
} }
public Creature getAttacker() public Creature getAttacker()
@@ -47,19 +39,31 @@ public class OnCreatureAttackAvoid implements IBaseEvent
return _attacker; return _attacker;
} }
public synchronized void setAttacker(Creature attacker)
{
_attacker = attacker;
}
public Creature getTarget() public Creature getTarget()
{ {
return _target; return _target;
} }
/** public synchronized void setTarget(Creature target)
* @return {
*/ _target = target;
}
public boolean isDamageOverTime() public boolean isDamageOverTime()
{ {
return _damageOverTime; return _damageOverTime;
} }
public synchronized void setDamageOverTime(boolean damageOverTime)
{
_damageOverTime = damageOverTime;
}
@Override @Override
public EventType getType() public EventType getType()
{ {
@@ -27,15 +27,12 @@ import org.l2jmobius.gameserver.model.skills.Skill;
*/ */
public class OnCreatureAttacked implements IBaseEvent public class OnCreatureAttacked implements IBaseEvent
{ {
private final Creature _attacker; private Creature _attacker;
private final Creature _target; private Creature _target;
private final Skill _skill; private Skill _skill;
public OnCreatureAttacked(Creature attacker, Creature target, Skill skill) public OnCreatureAttacked()
{ {
_attacker = attacker;
_target = target;
_skill = skill;
} }
public Creature getAttacker() public Creature getAttacker()
@@ -43,16 +40,31 @@ public class OnCreatureAttacked implements IBaseEvent
return _attacker; return _attacker;
} }
public synchronized void setAttacker(Creature attacker)
{
_attacker = attacker;
}
public Creature getTarget() public Creature getTarget()
{ {
return _target; return _target;
} }
public synchronized void setTarget(Creature target)
{
_target = target;
}
public Skill getSkill() public Skill getSkill()
{ {
return _skill; return _skill;
} }
public synchronized void setSkill(Skill skill)
{
_skill = skill;
}
@Override @Override
public EventType getType() public EventType getType()
{ {
@@ -27,23 +27,16 @@ import org.l2jmobius.gameserver.model.skills.Skill;
*/ */
public class OnCreatureDamageDealt implements IBaseEvent public class OnCreatureDamageDealt implements IBaseEvent
{ {
private final Creature _attacker; private Creature _attacker;
private final Creature _target; private Creature _target;
private final double _damage; private double _damage;
private final Skill _skill; private Skill _skill;
private final boolean _crit; private boolean _crit;
private final boolean _damageOverTime; private boolean _damageOverTime;
private final boolean _reflect; private boolean _reflect;
public OnCreatureDamageDealt(Creature attacker, Creature target, double damage, Skill skill, boolean crit, boolean damageOverTime, boolean reflect) public OnCreatureDamageDealt()
{ {
_attacker = attacker;
_target = target;
_damage = damage;
_skill = skill;
_crit = crit;
_damageOverTime = damageOverTime;
_reflect = reflect;
} }
public Creature getAttacker() public Creature getAttacker()
@@ -51,36 +44,71 @@ public class OnCreatureDamageDealt implements IBaseEvent
return _attacker; return _attacker;
} }
public synchronized void setAttacker(Creature attacker)
{
_attacker = attacker;
}
public Creature getTarget() public Creature getTarget()
{ {
return _target; return _target;
} }
public synchronized void setTarget(Creature target)
{
_target = target;
}
public double getDamage() public double getDamage()
{ {
return _damage; return _damage;
} }
public synchronized void setDamage(double damage)
{
_damage = damage;
}
public Skill getSkill() public Skill getSkill()
{ {
return _skill; return _skill;
} }
public synchronized void setSkill(Skill skill)
{
_skill = skill;
}
public boolean isCritical() public boolean isCritical()
{ {
return _crit; return _crit;
} }
public synchronized void setCritical(boolean crit)
{
_crit = crit;
}
public boolean isDamageOverTime() public boolean isDamageOverTime()
{ {
return _damageOverTime; return _damageOverTime;
} }
public synchronized void setDamageOverTime(boolean damageOverTime)
{
_damageOverTime = damageOverTime;
}
public boolean isReflect() public boolean isReflect()
{ {
return _reflect; return _reflect;
} }
public synchronized void setReflect(boolean reflect)
{
_reflect = reflect;
}
@Override @Override
public EventType getType() public EventType getType()
{ {
@@ -27,23 +27,16 @@ import org.l2jmobius.gameserver.model.skills.Skill;
*/ */
public class OnCreatureDamageReceived implements IBaseEvent public class OnCreatureDamageReceived implements IBaseEvent
{ {
private final Creature _attacker; private Creature _attacker;
private final Creature _target; private Creature _target;
private final double _damage; private double _damage;
private final Skill _skill; private Skill _skill;
private final boolean _crit; private boolean _crit;
private final boolean _damageOverTime; private boolean _damageOverTime;
private final boolean _reflect; private boolean _reflect;
public OnCreatureDamageReceived(Creature attacker, Creature target, double damage, Skill skill, boolean crit, boolean damageOverTime, boolean reflect) public OnCreatureDamageReceived()
{ {
_attacker = attacker;
_target = target;
_damage = damage;
_skill = skill;
_crit = crit;
_damageOverTime = damageOverTime;
_reflect = reflect;
} }
public Creature getAttacker() public Creature getAttacker()
@@ -51,36 +44,71 @@ public class OnCreatureDamageReceived implements IBaseEvent
return _attacker; return _attacker;
} }
public synchronized void setAttacker(Creature attacker)
{
_attacker = attacker;
}
public Creature getTarget() public Creature getTarget()
{ {
return _target; return _target;
} }
public synchronized void setTarget(Creature target)
{
_target = target;
}
public double getDamage() public double getDamage()
{ {
return _damage; return _damage;
} }
public synchronized void setDamage(double damage)
{
_damage = damage;
}
public Skill getSkill() public Skill getSkill()
{ {
return _skill; return _skill;
} }
public synchronized void setSkill(Skill skill)
{
_skill = skill;
}
public boolean isCritical() public boolean isCritical()
{ {
return _crit; return _crit;
} }
public synchronized void setCritical(boolean crit)
{
_crit = crit;
}
public boolean isDamageOverTime() public boolean isDamageOverTime()
{ {
return _damageOverTime; return _damageOverTime;
} }
public synchronized void setDamageOverTime(boolean damageOverTime)
{
_damageOverTime = damageOverTime;
}
public boolean isReflect() public boolean isReflect()
{ {
return _reflect; return _reflect;
} }
public synchronized void setReflect(boolean reflect)
{
_reflect = reflect;
}
@Override @Override
public EventType getType() public EventType getType()
{ {
@@ -28,17 +28,13 @@ import org.l2jmobius.gameserver.model.skills.Skill;
*/ */
public class OnCreatureSkillFinishCast implements IBaseEvent public class OnCreatureSkillFinishCast implements IBaseEvent
{ {
private final Creature _caster; private Creature _caster;
private final Skill _skill; private WorldObject _target;
private final boolean _simultaneously; private Skill _skill;
private final WorldObject _target; private boolean _simultaneously;
public OnCreatureSkillFinishCast(Creature caster, WorldObject target, Skill skill, boolean simultaneously) public OnCreatureSkillFinishCast()
{ {
_caster = caster;
_skill = skill;
_simultaneously = simultaneously;
_target = target;
} }
public Creature getCaster() public Creature getCaster()
@@ -46,21 +42,41 @@ public class OnCreatureSkillFinishCast implements IBaseEvent
return _caster; return _caster;
} }
public synchronized void setCaster(Creature caster)
{
_caster = caster;
}
public WorldObject getTarget() public WorldObject getTarget()
{ {
return _target; return _target;
} }
public synchronized void setTarget(WorldObject target)
{
_target = target;
}
public Skill getSkill() public Skill getSkill()
{ {
return _skill; return _skill;
} }
public synchronized void setSkill(Skill skill)
{
_skill = skill;
}
public boolean isSimultaneously() public boolean isSimultaneously()
{ {
return _simultaneously; return _simultaneously;
} }
public synchronized void setSimultaneously(boolean simultaneously)
{
_simultaneously = simultaneously;
}
@Override @Override
public EventType getType() public EventType getType()
{ {
@@ -27,15 +27,12 @@ import org.l2jmobius.gameserver.model.skills.Skill;
*/ */
public class OnCreatureSkillUse implements IBaseEvent public class OnCreatureSkillUse implements IBaseEvent
{ {
private final Creature _caster; private Creature _caster;
private final Skill _skill; private Skill _skill;
private final boolean _simultaneously; private boolean _simultaneously;
public OnCreatureSkillUse(Creature caster, Skill skill, boolean simultaneously) public OnCreatureSkillUse()
{ {
_caster = caster;
_skill = skill;
_simultaneously = simultaneously;
} }
public Creature getCaster() public Creature getCaster()
@@ -43,16 +40,31 @@ public class OnCreatureSkillUse implements IBaseEvent
return _caster; return _caster;
} }
public synchronized void setCaster(Creature caster)
{
_caster = caster;
}
public Skill getSkill() public Skill getSkill()
{ {
return _skill; return _skill;
} }
public synchronized void setSkill(Skill skill)
{
_skill = skill;
}
public boolean isSimultaneously() public boolean isSimultaneously()
{ {
return _simultaneously; return _simultaneously;
} }
public synchronized void setSimultaneously(boolean simultaneously)
{
_simultaneously = simultaneously;
}
@Override @Override
public EventType getType() public EventType getType()
{ {
@@ -523,7 +523,15 @@ public class SkillCaster implements Runnable
} }
// Notify skill is casted. // Notify skill is casted.
EventDispatcher.getInstance().notifyEvent(new OnCreatureSkillFinishCast(caster, target, _skill, _skill.isWithoutAction()), caster); if (caster.onCreatureSkillFinishCast == null)
{
caster.onCreatureSkillFinishCast = new OnCreatureSkillFinishCast();
}
caster.onCreatureSkillFinishCast.setCaster(caster);
caster.onCreatureSkillFinishCast.setTarget(target);
caster.onCreatureSkillFinishCast.setSkill(_skill);
caster.onCreatureSkillFinishCast.setSimultaneously(_skill.isWithoutAction());
EventDispatcher.getInstance().notifyEvent(caster.onCreatureSkillFinishCast, caster);
// Call the skill's effects and AI interraction and stuff. // Call the skill's effects and AI interraction and stuff.
callSkill(caster, target, _targets, _skill, _item); callSkill(caster, target, _targets, _skill, _item);
@@ -968,7 +976,14 @@ public class SkillCaster implements Runnable
return false; return false;
} }
final TerminateReturn term = EventDispatcher.getInstance().notifyEvent(new OnCreatureSkillUse(caster, skill, skill.isWithoutAction()), caster, TerminateReturn.class); if (caster.onCreatureSkillUse == null)
{
caster.onCreatureSkillUse = new OnCreatureSkillUse();
}
caster.onCreatureSkillUse.setCaster(caster);
caster.onCreatureSkillUse.setSkill(skill);
caster.onCreatureSkillUse.setSimultaneously(skill.isWithoutAction());
final TerminateReturn term = EventDispatcher.getInstance().notifyEvent(caster.onCreatureSkillUse, caster, TerminateReturn.class);
if ((term != null) && term.terminate()) if ((term != null) && term.terminate())
{ {
caster.sendPacket(ActionFailed.STATIC_PACKET); caster.sendPacket(ActionFailed.STATIC_PACKET);
@@ -66,7 +66,11 @@ public class LargeCocoon extends AbstractNpcAI
{ {
case "attack": case "attack":
{ {
onCreatureAttacked(new OnCreatureAttacked(player, npc, null)); final OnCreatureAttacked attackEvent = new OnCreatureAttacked();
attackEvent.setAttacker(player);
attackEvent.setTarget(npc);
attackEvent.setSkill(null);
onCreatureAttacked(attackEvent);
break; break;
} }
case "attackPowerful": case "attackPowerful":
@@ -66,6 +66,8 @@ import org.l2jmobius.gameserver.taskmanager.AttackStanceTaskManager;
*/ */
public class CreatureAI extends AbstractAI public class CreatureAI extends AbstractAI
{ {
private OnNpcMoveFinished _onNpcMoveFinished = null;
public static class IntentionCommand public static class IntentionCommand
{ {
protected final CtrlIntention _crtlIntention; protected final CtrlIntention _crtlIntention;
@@ -691,7 +693,11 @@ public class CreatureAI extends AbstractAI
WalkingManager.getInstance().onArrived(npc); // Walking Manager support WalkingManager.getInstance().onArrived(npc); // Walking Manager support
// Notify to scripts // Notify to scripts
EventDispatcher.getInstance().notifyEventAsync(new OnNpcMoveFinished(npc), npc); if (_onNpcMoveFinished == null)
{
_onNpcMoveFinished = new OnNpcMoveFinished(npc);
}
EventDispatcher.getInstance().notifyEventAsync(_onNpcMoveFinished, npc);
} }
// Launch actions corresponding to the Event Think // Launch actions corresponding to the Event Think
@@ -103,6 +103,8 @@ import org.l2jmobius.gameserver.model.events.impl.creature.OnCreatureDamageRecei
import org.l2jmobius.gameserver.model.events.impl.creature.OnCreatureDeath; import org.l2jmobius.gameserver.model.events.impl.creature.OnCreatureDeath;
import org.l2jmobius.gameserver.model.events.impl.creature.OnCreatureKilled; import org.l2jmobius.gameserver.model.events.impl.creature.OnCreatureKilled;
import org.l2jmobius.gameserver.model.events.impl.creature.OnCreatureSee; import org.l2jmobius.gameserver.model.events.impl.creature.OnCreatureSee;
import org.l2jmobius.gameserver.model.events.impl.creature.OnCreatureSkillFinishCast;
import org.l2jmobius.gameserver.model.events.impl.creature.OnCreatureSkillUse;
import org.l2jmobius.gameserver.model.events.impl.creature.OnCreatureTeleport; import org.l2jmobius.gameserver.model.events.impl.creature.OnCreatureTeleport;
import org.l2jmobius.gameserver.model.events.impl.creature.OnCreatureTeleported; import org.l2jmobius.gameserver.model.events.impl.creature.OnCreatureTeleported;
import org.l2jmobius.gameserver.model.events.listeners.AbstractEventListener; import org.l2jmobius.gameserver.model.events.listeners.AbstractEventListener;
@@ -289,6 +291,14 @@ public abstract class Creature extends WorldObject implements ISkillsHolder, IDe
/** A list containing the dropped items of this fake player. */ /** A list containing the dropped items of this fake player. */
private final List<ItemInstance> _fakePlayerDrops = new CopyOnWriteArrayList<>(); private final List<ItemInstance> _fakePlayerDrops = new CopyOnWriteArrayList<>();
private OnCreatureAttack _onCreatureAttack = null;
private OnCreatureAttacked _onCreatureAttacked = null;
private OnCreatureDamageDealt _onCreatureDamageDealt = null;
private OnCreatureDamageReceived _onCreatureDamageReceived = null;
private OnCreatureAttackAvoid _onCreatureAttackAvoid = null;
public OnCreatureSkillFinishCast onCreatureSkillFinishCast = null;
public OnCreatureSkillUse onCreatureSkillUse = null;
/** /**
* Creates a creature. * Creates a creature.
* @param template the creature template * @param template the creature template
@@ -567,6 +577,14 @@ public abstract class Creature extends WorldObject implements ISkillsHolder, IDe
{ {
_summoner.removeSummonedNpc(getObjectId()); _summoner.removeSummonedNpc(getObjectId());
} }
_onCreatureAttack = null;
_onCreatureAttacked = null;
_onCreatureDamageDealt = null;
_onCreatureDamageReceived = null;
_onCreatureAttackAvoid = null;
onCreatureSkillFinishCast = null;
onCreatureSkillUse = null;
} }
@Override @Override
@@ -3908,8 +3926,24 @@ public abstract class Creature extends WorldObject implements ISkillsHolder, IDe
doAttack(hit.getDamage(), target, null, false, false, hit.isCritical(), false); doAttack(hit.getDamage(), target, null, false, false, hit.isCritical(), false);
// Notify to scripts when the attack has been done. // Notify to scripts when the attack has been done.
EventDispatcher.getInstance().notifyEvent(new OnCreatureAttack(this, target, null), this); if (_onCreatureAttack == null)
EventDispatcher.getInstance().notifyEvent(new OnCreatureAttacked(this, target, null), target); {
_onCreatureAttack = new OnCreatureAttack();
}
_onCreatureAttack.setAttacker(this);
_onCreatureAttack.setTarget(target);
_onCreatureAttack.setSkill(null);
EventDispatcher.getInstance().notifyEvent(_onCreatureAttack, this);
if (_onCreatureAttacked == null)
{
_onCreatureAttacked = new OnCreatureAttacked();
}
_onCreatureAttacked.setAttacker(this);
_onCreatureAttacked.setTarget(target);
_onCreatureAttacked.setSkill(null);
EventDispatcher.getInstance().notifyEvent(_onCreatureAttacked, target);
if (_triggerSkills != null) if (_triggerSkills != null)
{ {
for (OptionsSkillHolder holder : _triggerSkills.values()) for (OptionsSkillHolder holder : _triggerSkills.values())
@@ -4640,10 +4674,32 @@ public abstract class Creature extends WorldObject implements ISkillsHolder, IDe
// Notify of this attack only if there is an attacking creature. // Notify of this attack only if there is an attacking creature.
if (attacker != null) if (attacker != null)
{ {
EventDispatcher.getInstance().notifyEventAsync(new OnCreatureDamageDealt(attacker, this, amount, skill, critical, isDOT, reflect), attacker); if (_onCreatureDamageDealt == null)
{
_onCreatureDamageDealt = new OnCreatureDamageDealt();
}
_onCreatureDamageDealt.setAttacker(attacker);
_onCreatureDamageDealt.setTarget(this);
_onCreatureDamageDealt.setDamage(amount);
_onCreatureDamageDealt.setSkill(skill);
_onCreatureDamageDealt.setCritical(critical);
_onCreatureDamageDealt.setDamageOverTime(isDOT);
_onCreatureDamageDealt.setReflect(reflect);
EventDispatcher.getInstance().notifyEvent(_onCreatureDamageDealt, attacker);
} }
final DamageReturn term = EventDispatcher.getInstance().notifyEvent(new OnCreatureDamageReceived(attacker, this, amount, skill, critical, isDOT, reflect), this, DamageReturn.class); if (_onCreatureDamageReceived == null)
{
_onCreatureDamageReceived = new OnCreatureDamageReceived();
}
_onCreatureDamageReceived.setAttacker(attacker);
_onCreatureDamageReceived.setTarget(this);
_onCreatureDamageReceived.setDamage(amount);
_onCreatureDamageReceived.setSkill(skill);
_onCreatureDamageReceived.setCritical(critical);
_onCreatureDamageReceived.setDamageOverTime(isDOT);
_onCreatureDamageReceived.setReflect(reflect);
final DamageReturn term = EventDispatcher.getInstance().notifyEvent(_onCreatureDamageReceived, this, DamageReturn.class);
if (term != null) if (term != null)
{ {
if (term.terminate()) if (term.terminate())
@@ -5049,7 +5105,14 @@ public abstract class Creature extends WorldObject implements ISkillsHolder, IDe
*/ */
public void notifyAttackAvoid(Creature target, boolean isDot) public void notifyAttackAvoid(Creature target, boolean isDot)
{ {
EventDispatcher.getInstance().notifyEventAsync(new OnCreatureAttackAvoid(this, target, isDot), target); if (_onCreatureAttackAvoid == null)
{
_onCreatureAttackAvoid = new OnCreatureAttackAvoid();
}
_onCreatureAttackAvoid.setAttacker(this);
_onCreatureAttackAvoid.setTarget(target);
_onCreatureAttackAvoid.setDamageOverTime(isDot);
EventDispatcher.getInstance().notifyEvent(_onCreatureAttackAvoid, target);
} }
/** /**
@@ -27,15 +27,12 @@ import org.l2jmobius.gameserver.model.skills.Skill;
*/ */
public class OnCreatureAttack implements IBaseEvent public class OnCreatureAttack implements IBaseEvent
{ {
private final Creature _attacker; private Creature _attacker;
private final Creature _target; private Creature _target;
private final Skill _skill; private Skill _skill;
public OnCreatureAttack(Creature attacker, Creature target, Skill skill) public OnCreatureAttack()
{ {
_attacker = attacker;
_target = target;
_skill = skill;
} }
public Creature getAttacker() public Creature getAttacker()
@@ -43,16 +40,31 @@ public class OnCreatureAttack implements IBaseEvent
return _attacker; return _attacker;
} }
public synchronized void setAttacker(Creature attacker)
{
_attacker = attacker;
}
public Creature getTarget() public Creature getTarget()
{ {
return _target; return _target;
} }
public synchronized void setTarget(Creature target)
{
_target = target;
}
public Skill getSkill() public Skill getSkill()
{ {
return _skill; return _skill;
} }
public synchronized void setSkill(Skill skill)
{
_skill = skill;
}
@Override @Override
public EventType getType() public EventType getType()
{ {
@@ -26,20 +26,12 @@ import org.l2jmobius.gameserver.model.events.impl.IBaseEvent;
*/ */
public class OnCreatureAttackAvoid implements IBaseEvent public class OnCreatureAttackAvoid implements IBaseEvent
{ {
private final Creature _attacker; private Creature _attacker;
private final Creature _target; private Creature _target;
private final boolean _damageOverTime; private boolean _damageOverTime;
/** public OnCreatureAttackAvoid()
* @param attacker who attack
* @param target who avoid
* @param isDot is dot damage
*/
public OnCreatureAttackAvoid(Creature attacker, Creature target, boolean isDot)
{ {
_attacker = attacker;
_target = target;
_damageOverTime = isDot;
} }
public Creature getAttacker() public Creature getAttacker()
@@ -47,19 +39,31 @@ public class OnCreatureAttackAvoid implements IBaseEvent
return _attacker; return _attacker;
} }
public synchronized void setAttacker(Creature attacker)
{
_attacker = attacker;
}
public Creature getTarget() public Creature getTarget()
{ {
return _target; return _target;
} }
/** public synchronized void setTarget(Creature target)
* @return {
*/ _target = target;
}
public boolean isDamageOverTime() public boolean isDamageOverTime()
{ {
return _damageOverTime; return _damageOverTime;
} }
public synchronized void setDamageOverTime(boolean damageOverTime)
{
_damageOverTime = damageOverTime;
}
@Override @Override
public EventType getType() public EventType getType()
{ {
@@ -27,15 +27,12 @@ import org.l2jmobius.gameserver.model.skills.Skill;
*/ */
public class OnCreatureAttacked implements IBaseEvent public class OnCreatureAttacked implements IBaseEvent
{ {
private final Creature _attacker; private Creature _attacker;
private final Creature _target; private Creature _target;
private final Skill _skill; private Skill _skill;
public OnCreatureAttacked(Creature attacker, Creature target, Skill skill) public OnCreatureAttacked()
{ {
_attacker = attacker;
_target = target;
_skill = skill;
} }
public Creature getAttacker() public Creature getAttacker()
@@ -43,16 +40,31 @@ public class OnCreatureAttacked implements IBaseEvent
return _attacker; return _attacker;
} }
public synchronized void setAttacker(Creature attacker)
{
_attacker = attacker;
}
public Creature getTarget() public Creature getTarget()
{ {
return _target; return _target;
} }
public synchronized void setTarget(Creature target)
{
_target = target;
}
public Skill getSkill() public Skill getSkill()
{ {
return _skill; return _skill;
} }
public synchronized void setSkill(Skill skill)
{
_skill = skill;
}
@Override @Override
public EventType getType() public EventType getType()
{ {
@@ -27,23 +27,16 @@ import org.l2jmobius.gameserver.model.skills.Skill;
*/ */
public class OnCreatureDamageDealt implements IBaseEvent public class OnCreatureDamageDealt implements IBaseEvent
{ {
private final Creature _attacker; private Creature _attacker;
private final Creature _target; private Creature _target;
private final double _damage; private double _damage;
private final Skill _skill; private Skill _skill;
private final boolean _crit; private boolean _crit;
private final boolean _damageOverTime; private boolean _damageOverTime;
private final boolean _reflect; private boolean _reflect;
public OnCreatureDamageDealt(Creature attacker, Creature target, double damage, Skill skill, boolean crit, boolean damageOverTime, boolean reflect) public OnCreatureDamageDealt()
{ {
_attacker = attacker;
_target = target;
_damage = damage;
_skill = skill;
_crit = crit;
_damageOverTime = damageOverTime;
_reflect = reflect;
} }
public Creature getAttacker() public Creature getAttacker()
@@ -51,36 +44,71 @@ public class OnCreatureDamageDealt implements IBaseEvent
return _attacker; return _attacker;
} }
public synchronized void setAttacker(Creature attacker)
{
_attacker = attacker;
}
public Creature getTarget() public Creature getTarget()
{ {
return _target; return _target;
} }
public synchronized void setTarget(Creature target)
{
_target = target;
}
public double getDamage() public double getDamage()
{ {
return _damage; return _damage;
} }
public synchronized void setDamage(double damage)
{
_damage = damage;
}
public Skill getSkill() public Skill getSkill()
{ {
return _skill; return _skill;
} }
public synchronized void setSkill(Skill skill)
{
_skill = skill;
}
public boolean isCritical() public boolean isCritical()
{ {
return _crit; return _crit;
} }
public synchronized void setCritical(boolean crit)
{
_crit = crit;
}
public boolean isDamageOverTime() public boolean isDamageOverTime()
{ {
return _damageOverTime; return _damageOverTime;
} }
public synchronized void setDamageOverTime(boolean damageOverTime)
{
_damageOverTime = damageOverTime;
}
public boolean isReflect() public boolean isReflect()
{ {
return _reflect; return _reflect;
} }
public synchronized void setReflect(boolean reflect)
{
_reflect = reflect;
}
@Override @Override
public EventType getType() public EventType getType()
{ {
@@ -27,23 +27,16 @@ import org.l2jmobius.gameserver.model.skills.Skill;
*/ */
public class OnCreatureDamageReceived implements IBaseEvent public class OnCreatureDamageReceived implements IBaseEvent
{ {
private final Creature _attacker; private Creature _attacker;
private final Creature _target; private Creature _target;
private final double _damage; private double _damage;
private final Skill _skill; private Skill _skill;
private final boolean _crit; private boolean _crit;
private final boolean _damageOverTime; private boolean _damageOverTime;
private final boolean _reflect; private boolean _reflect;
public OnCreatureDamageReceived(Creature attacker, Creature target, double damage, Skill skill, boolean crit, boolean damageOverTime, boolean reflect) public OnCreatureDamageReceived()
{ {
_attacker = attacker;
_target = target;
_damage = damage;
_skill = skill;
_crit = crit;
_damageOverTime = damageOverTime;
_reflect = reflect;
} }
public Creature getAttacker() public Creature getAttacker()
@@ -51,36 +44,71 @@ public class OnCreatureDamageReceived implements IBaseEvent
return _attacker; return _attacker;
} }
public synchronized void setAttacker(Creature attacker)
{
_attacker = attacker;
}
public Creature getTarget() public Creature getTarget()
{ {
return _target; return _target;
} }
public synchronized void setTarget(Creature target)
{
_target = target;
}
public double getDamage() public double getDamage()
{ {
return _damage; return _damage;
} }
public synchronized void setDamage(double damage)
{
_damage = damage;
}
public Skill getSkill() public Skill getSkill()
{ {
return _skill; return _skill;
} }
public synchronized void setSkill(Skill skill)
{
_skill = skill;
}
public boolean isCritical() public boolean isCritical()
{ {
return _crit; return _crit;
} }
public synchronized void setCritical(boolean crit)
{
_crit = crit;
}
public boolean isDamageOverTime() public boolean isDamageOverTime()
{ {
return _damageOverTime; return _damageOverTime;
} }
public synchronized void setDamageOverTime(boolean damageOverTime)
{
_damageOverTime = damageOverTime;
}
public boolean isReflect() public boolean isReflect()
{ {
return _reflect; return _reflect;
} }
public synchronized void setReflect(boolean reflect)
{
_reflect = reflect;
}
@Override @Override
public EventType getType() public EventType getType()
{ {
@@ -28,17 +28,13 @@ import org.l2jmobius.gameserver.model.skills.Skill;
*/ */
public class OnCreatureSkillFinishCast implements IBaseEvent public class OnCreatureSkillFinishCast implements IBaseEvent
{ {
private final Creature _caster; private Creature _caster;
private final Skill _skill; private WorldObject _target;
private final boolean _simultaneously; private Skill _skill;
private final WorldObject _target; private boolean _simultaneously;
public OnCreatureSkillFinishCast(Creature caster, WorldObject target, Skill skill, boolean simultaneously) public OnCreatureSkillFinishCast()
{ {
_caster = caster;
_skill = skill;
_simultaneously = simultaneously;
_target = target;
} }
public Creature getCaster() public Creature getCaster()
@@ -46,21 +42,41 @@ public class OnCreatureSkillFinishCast implements IBaseEvent
return _caster; return _caster;
} }
public synchronized void setCaster(Creature caster)
{
_caster = caster;
}
public WorldObject getTarget() public WorldObject getTarget()
{ {
return _target; return _target;
} }
public synchronized void setTarget(WorldObject target)
{
_target = target;
}
public Skill getSkill() public Skill getSkill()
{ {
return _skill; return _skill;
} }
public synchronized void setSkill(Skill skill)
{
_skill = skill;
}
public boolean isSimultaneously() public boolean isSimultaneously()
{ {
return _simultaneously; return _simultaneously;
} }
public synchronized void setSimultaneously(boolean simultaneously)
{
_simultaneously = simultaneously;
}
@Override @Override
public EventType getType() public EventType getType()
{ {
@@ -27,15 +27,12 @@ import org.l2jmobius.gameserver.model.skills.Skill;
*/ */
public class OnCreatureSkillUse implements IBaseEvent public class OnCreatureSkillUse implements IBaseEvent
{ {
private final Creature _caster; private Creature _caster;
private final Skill _skill; private Skill _skill;
private final boolean _simultaneously; private boolean _simultaneously;
public OnCreatureSkillUse(Creature caster, Skill skill, boolean simultaneously) public OnCreatureSkillUse()
{ {
_caster = caster;
_skill = skill;
_simultaneously = simultaneously;
} }
public Creature getCaster() public Creature getCaster()
@@ -43,16 +40,31 @@ public class OnCreatureSkillUse implements IBaseEvent
return _caster; return _caster;
} }
public synchronized void setCaster(Creature caster)
{
_caster = caster;
}
public Skill getSkill() public Skill getSkill()
{ {
return _skill; return _skill;
} }
public synchronized void setSkill(Skill skill)
{
_skill = skill;
}
public boolean isSimultaneously() public boolean isSimultaneously()
{ {
return _simultaneously; return _simultaneously;
} }
public synchronized void setSimultaneously(boolean simultaneously)
{
_simultaneously = simultaneously;
}
@Override @Override
public EventType getType() public EventType getType()
{ {
@@ -523,7 +523,15 @@ public class SkillCaster implements Runnable
} }
// Notify skill is casted. // Notify skill is casted.
EventDispatcher.getInstance().notifyEvent(new OnCreatureSkillFinishCast(caster, target, _skill, _skill.isWithoutAction()), caster); if (caster.onCreatureSkillFinishCast == null)
{
caster.onCreatureSkillFinishCast = new OnCreatureSkillFinishCast();
}
caster.onCreatureSkillFinishCast.setCaster(caster);
caster.onCreatureSkillFinishCast.setTarget(target);
caster.onCreatureSkillFinishCast.setSkill(_skill);
caster.onCreatureSkillFinishCast.setSimultaneously(_skill.isWithoutAction());
EventDispatcher.getInstance().notifyEvent(caster.onCreatureSkillFinishCast, caster);
// Call the skill's effects and AI interraction and stuff. // Call the skill's effects and AI interraction and stuff.
callSkill(caster, target, _targets, _skill, _item); callSkill(caster, target, _targets, _skill, _item);
@@ -968,7 +976,14 @@ public class SkillCaster implements Runnable
return false; return false;
} }
final TerminateReturn term = EventDispatcher.getInstance().notifyEvent(new OnCreatureSkillUse(caster, skill, skill.isWithoutAction()), caster, TerminateReturn.class); if (caster.onCreatureSkillUse == null)
{
caster.onCreatureSkillUse = new OnCreatureSkillUse();
}
caster.onCreatureSkillUse.setCaster(caster);
caster.onCreatureSkillUse.setSkill(skill);
caster.onCreatureSkillUse.setSimultaneously(skill.isWithoutAction());
final TerminateReturn term = EventDispatcher.getInstance().notifyEvent(caster.onCreatureSkillUse, caster, TerminateReturn.class);
if ((term != null) && term.terminate()) if ((term != null) && term.terminate())
{ {
caster.sendPacket(ActionFailed.STATIC_PACKET); caster.sendPacket(ActionFailed.STATIC_PACKET);
@@ -63,7 +63,11 @@ public class LargeCocoon extends AbstractNpcAI
{ {
case "attack": case "attack":
{ {
onCreatureAttacked(new OnCreatureAttacked(player, npc, null)); final OnCreatureAttacked attackEvent = new OnCreatureAttacked();
attackEvent.setAttacker(player);
attackEvent.setTarget(npc);
attackEvent.setSkill(null);
onCreatureAttacked(attackEvent);
break; break;
} }
case "attackPowerful": case "attackPowerful":
@@ -66,6 +66,8 @@ import org.l2jmobius.gameserver.taskmanager.AttackStanceTaskManager;
*/ */
public class CreatureAI extends AbstractAI public class CreatureAI extends AbstractAI
{ {
private OnNpcMoveFinished _onNpcMoveFinished = null;
public static class IntentionCommand public static class IntentionCommand
{ {
protected final CtrlIntention _crtlIntention; protected final CtrlIntention _crtlIntention;
@@ -691,7 +693,11 @@ public class CreatureAI extends AbstractAI
WalkingManager.getInstance().onArrived(npc); // Walking Manager support WalkingManager.getInstance().onArrived(npc); // Walking Manager support
// Notify to scripts // Notify to scripts
EventDispatcher.getInstance().notifyEventAsync(new OnNpcMoveFinished(npc), npc); if (_onNpcMoveFinished == null)
{
_onNpcMoveFinished = new OnNpcMoveFinished(npc);
}
EventDispatcher.getInstance().notifyEventAsync(_onNpcMoveFinished, npc);
} }
// Launch actions corresponding to the Event Think // Launch actions corresponding to the Event Think
@@ -103,6 +103,8 @@ import org.l2jmobius.gameserver.model.events.impl.creature.OnCreatureDamageRecei
import org.l2jmobius.gameserver.model.events.impl.creature.OnCreatureDeath; import org.l2jmobius.gameserver.model.events.impl.creature.OnCreatureDeath;
import org.l2jmobius.gameserver.model.events.impl.creature.OnCreatureKilled; import org.l2jmobius.gameserver.model.events.impl.creature.OnCreatureKilled;
import org.l2jmobius.gameserver.model.events.impl.creature.OnCreatureSee; import org.l2jmobius.gameserver.model.events.impl.creature.OnCreatureSee;
import org.l2jmobius.gameserver.model.events.impl.creature.OnCreatureSkillFinishCast;
import org.l2jmobius.gameserver.model.events.impl.creature.OnCreatureSkillUse;
import org.l2jmobius.gameserver.model.events.impl.creature.OnCreatureTeleport; import org.l2jmobius.gameserver.model.events.impl.creature.OnCreatureTeleport;
import org.l2jmobius.gameserver.model.events.impl.creature.OnCreatureTeleported; import org.l2jmobius.gameserver.model.events.impl.creature.OnCreatureTeleported;
import org.l2jmobius.gameserver.model.events.listeners.AbstractEventListener; import org.l2jmobius.gameserver.model.events.listeners.AbstractEventListener;
@@ -289,6 +291,14 @@ public abstract class Creature extends WorldObject implements ISkillsHolder, IDe
/** A list containing the dropped items of this fake player. */ /** A list containing the dropped items of this fake player. */
private final List<ItemInstance> _fakePlayerDrops = new CopyOnWriteArrayList<>(); private final List<ItemInstance> _fakePlayerDrops = new CopyOnWriteArrayList<>();
private OnCreatureAttack _onCreatureAttack = null;
private OnCreatureAttacked _onCreatureAttacked = null;
private OnCreatureDamageDealt _onCreatureDamageDealt = null;
private OnCreatureDamageReceived _onCreatureDamageReceived = null;
private OnCreatureAttackAvoid _onCreatureAttackAvoid = null;
public OnCreatureSkillFinishCast onCreatureSkillFinishCast = null;
public OnCreatureSkillUse onCreatureSkillUse = null;
/** /**
* Creates a creature. * Creates a creature.
* @param template the creature template * @param template the creature template
@@ -567,6 +577,14 @@ public abstract class Creature extends WorldObject implements ISkillsHolder, IDe
{ {
_summoner.removeSummonedNpc(getObjectId()); _summoner.removeSummonedNpc(getObjectId());
} }
_onCreatureAttack = null;
_onCreatureAttacked = null;
_onCreatureDamageDealt = null;
_onCreatureDamageReceived = null;
_onCreatureAttackAvoid = null;
onCreatureSkillFinishCast = null;
onCreatureSkillUse = null;
} }
@Override @Override
@@ -3907,8 +3925,24 @@ public abstract class Creature extends WorldObject implements ISkillsHolder, IDe
doAttack(hit.getDamage(), target, null, false, false, hit.isCritical(), false); doAttack(hit.getDamage(), target, null, false, false, hit.isCritical(), false);
// Notify to scripts when the attack has been done. // Notify to scripts when the attack has been done.
EventDispatcher.getInstance().notifyEvent(new OnCreatureAttack(this, target, null), this); if (_onCreatureAttack == null)
EventDispatcher.getInstance().notifyEvent(new OnCreatureAttacked(this, target, null), target); {
_onCreatureAttack = new OnCreatureAttack();
}
_onCreatureAttack.setAttacker(this);
_onCreatureAttack.setTarget(target);
_onCreatureAttack.setSkill(null);
EventDispatcher.getInstance().notifyEvent(_onCreatureAttack, this);
if (_onCreatureAttacked == null)
{
_onCreatureAttacked = new OnCreatureAttacked();
}
_onCreatureAttacked.setAttacker(this);
_onCreatureAttacked.setTarget(target);
_onCreatureAttacked.setSkill(null);
EventDispatcher.getInstance().notifyEvent(_onCreatureAttacked, target);
if (_triggerSkills != null) if (_triggerSkills != null)
{ {
for (OptionsSkillHolder holder : _triggerSkills.values()) for (OptionsSkillHolder holder : _triggerSkills.values())
@@ -4639,10 +4673,32 @@ public abstract class Creature extends WorldObject implements ISkillsHolder, IDe
// Notify of this attack only if there is an attacking creature. // Notify of this attack only if there is an attacking creature.
if (attacker != null) if (attacker != null)
{ {
EventDispatcher.getInstance().notifyEventAsync(new OnCreatureDamageDealt(attacker, this, amount, skill, critical, isDOT, reflect), attacker); if (_onCreatureDamageDealt == null)
{
_onCreatureDamageDealt = new OnCreatureDamageDealt();
}
_onCreatureDamageDealt.setAttacker(attacker);
_onCreatureDamageDealt.setTarget(this);
_onCreatureDamageDealt.setDamage(amount);
_onCreatureDamageDealt.setSkill(skill);
_onCreatureDamageDealt.setCritical(critical);
_onCreatureDamageDealt.setDamageOverTime(isDOT);
_onCreatureDamageDealt.setReflect(reflect);
EventDispatcher.getInstance().notifyEvent(_onCreatureDamageDealt, attacker);
} }
final DamageReturn term = EventDispatcher.getInstance().notifyEvent(new OnCreatureDamageReceived(attacker, this, amount, skill, critical, isDOT, reflect), this, DamageReturn.class); if (_onCreatureDamageReceived == null)
{
_onCreatureDamageReceived = new OnCreatureDamageReceived();
}
_onCreatureDamageReceived.setAttacker(attacker);
_onCreatureDamageReceived.setTarget(this);
_onCreatureDamageReceived.setDamage(amount);
_onCreatureDamageReceived.setSkill(skill);
_onCreatureDamageReceived.setCritical(critical);
_onCreatureDamageReceived.setDamageOverTime(isDOT);
_onCreatureDamageReceived.setReflect(reflect);
final DamageReturn term = EventDispatcher.getInstance().notifyEvent(_onCreatureDamageReceived, this, DamageReturn.class);
if (term != null) if (term != null)
{ {
if (term.terminate()) if (term.terminate())
@@ -5048,7 +5104,14 @@ public abstract class Creature extends WorldObject implements ISkillsHolder, IDe
*/ */
public void notifyAttackAvoid(Creature target, boolean isDot) public void notifyAttackAvoid(Creature target, boolean isDot)
{ {
EventDispatcher.getInstance().notifyEventAsync(new OnCreatureAttackAvoid(this, target, isDot), target); if (_onCreatureAttackAvoid == null)
{
_onCreatureAttackAvoid = new OnCreatureAttackAvoid();
}
_onCreatureAttackAvoid.setAttacker(this);
_onCreatureAttackAvoid.setTarget(target);
_onCreatureAttackAvoid.setDamageOverTime(isDot);
EventDispatcher.getInstance().notifyEvent(_onCreatureAttackAvoid, target);
} }
/** /**
@@ -27,15 +27,12 @@ import org.l2jmobius.gameserver.model.skills.Skill;
*/ */
public class OnCreatureAttack implements IBaseEvent public class OnCreatureAttack implements IBaseEvent
{ {
private final Creature _attacker; private Creature _attacker;
private final Creature _target; private Creature _target;
private final Skill _skill; private Skill _skill;
public OnCreatureAttack(Creature attacker, Creature target, Skill skill) public OnCreatureAttack()
{ {
_attacker = attacker;
_target = target;
_skill = skill;
} }
public Creature getAttacker() public Creature getAttacker()
@@ -43,16 +40,31 @@ public class OnCreatureAttack implements IBaseEvent
return _attacker; return _attacker;
} }
public synchronized void setAttacker(Creature attacker)
{
_attacker = attacker;
}
public Creature getTarget() public Creature getTarget()
{ {
return _target; return _target;
} }
public synchronized void setTarget(Creature target)
{
_target = target;
}
public Skill getSkill() public Skill getSkill()
{ {
return _skill; return _skill;
} }
public synchronized void setSkill(Skill skill)
{
_skill = skill;
}
@Override @Override
public EventType getType() public EventType getType()
{ {
@@ -26,20 +26,12 @@ import org.l2jmobius.gameserver.model.events.impl.IBaseEvent;
*/ */
public class OnCreatureAttackAvoid implements IBaseEvent public class OnCreatureAttackAvoid implements IBaseEvent
{ {
private final Creature _attacker; private Creature _attacker;
private final Creature _target; private Creature _target;
private final boolean _damageOverTime; private boolean _damageOverTime;
/** public OnCreatureAttackAvoid()
* @param attacker who attack
* @param target who avoid
* @param isDot is dot damage
*/
public OnCreatureAttackAvoid(Creature attacker, Creature target, boolean isDot)
{ {
_attacker = attacker;
_target = target;
_damageOverTime = isDot;
} }
public Creature getAttacker() public Creature getAttacker()
@@ -47,19 +39,31 @@ public class OnCreatureAttackAvoid implements IBaseEvent
return _attacker; return _attacker;
} }
public synchronized void setAttacker(Creature attacker)
{
_attacker = attacker;
}
public Creature getTarget() public Creature getTarget()
{ {
return _target; return _target;
} }
/** public synchronized void setTarget(Creature target)
* @return {
*/ _target = target;
}
public boolean isDamageOverTime() public boolean isDamageOverTime()
{ {
return _damageOverTime; return _damageOverTime;
} }
public synchronized void setDamageOverTime(boolean damageOverTime)
{
_damageOverTime = damageOverTime;
}
@Override @Override
public EventType getType() public EventType getType()
{ {
@@ -27,15 +27,12 @@ import org.l2jmobius.gameserver.model.skills.Skill;
*/ */
public class OnCreatureAttacked implements IBaseEvent public class OnCreatureAttacked implements IBaseEvent
{ {
private final Creature _attacker; private Creature _attacker;
private final Creature _target; private Creature _target;
private final Skill _skill; private Skill _skill;
public OnCreatureAttacked(Creature attacker, Creature target, Skill skill) public OnCreatureAttacked()
{ {
_attacker = attacker;
_target = target;
_skill = skill;
} }
public Creature getAttacker() public Creature getAttacker()
@@ -43,16 +40,31 @@ public class OnCreatureAttacked implements IBaseEvent
return _attacker; return _attacker;
} }
public synchronized void setAttacker(Creature attacker)
{
_attacker = attacker;
}
public Creature getTarget() public Creature getTarget()
{ {
return _target; return _target;
} }
public synchronized void setTarget(Creature target)
{
_target = target;
}
public Skill getSkill() public Skill getSkill()
{ {
return _skill; return _skill;
} }
public synchronized void setSkill(Skill skill)
{
_skill = skill;
}
@Override @Override
public EventType getType() public EventType getType()
{ {
@@ -27,23 +27,16 @@ import org.l2jmobius.gameserver.model.skills.Skill;
*/ */
public class OnCreatureDamageDealt implements IBaseEvent public class OnCreatureDamageDealt implements IBaseEvent
{ {
private final Creature _attacker; private Creature _attacker;
private final Creature _target; private Creature _target;
private final double _damage; private double _damage;
private final Skill _skill; private Skill _skill;
private final boolean _crit; private boolean _crit;
private final boolean _damageOverTime; private boolean _damageOverTime;
private final boolean _reflect; private boolean _reflect;
public OnCreatureDamageDealt(Creature attacker, Creature target, double damage, Skill skill, boolean crit, boolean damageOverTime, boolean reflect) public OnCreatureDamageDealt()
{ {
_attacker = attacker;
_target = target;
_damage = damage;
_skill = skill;
_crit = crit;
_damageOverTime = damageOverTime;
_reflect = reflect;
} }
public Creature getAttacker() public Creature getAttacker()
@@ -51,36 +44,71 @@ public class OnCreatureDamageDealt implements IBaseEvent
return _attacker; return _attacker;
} }
public synchronized void setAttacker(Creature attacker)
{
_attacker = attacker;
}
public Creature getTarget() public Creature getTarget()
{ {
return _target; return _target;
} }
public synchronized void setTarget(Creature target)
{
_target = target;
}
public double getDamage() public double getDamage()
{ {
return _damage; return _damage;
} }
public synchronized void setDamage(double damage)
{
_damage = damage;
}
public Skill getSkill() public Skill getSkill()
{ {
return _skill; return _skill;
} }
public synchronized void setSkill(Skill skill)
{
_skill = skill;
}
public boolean isCritical() public boolean isCritical()
{ {
return _crit; return _crit;
} }
public synchronized void setCritical(boolean crit)
{
_crit = crit;
}
public boolean isDamageOverTime() public boolean isDamageOverTime()
{ {
return _damageOverTime; return _damageOverTime;
} }
public synchronized void setDamageOverTime(boolean damageOverTime)
{
_damageOverTime = damageOverTime;
}
public boolean isReflect() public boolean isReflect()
{ {
return _reflect; return _reflect;
} }
public synchronized void setReflect(boolean reflect)
{
_reflect = reflect;
}
@Override @Override
public EventType getType() public EventType getType()
{ {
@@ -27,23 +27,16 @@ import org.l2jmobius.gameserver.model.skills.Skill;
*/ */
public class OnCreatureDamageReceived implements IBaseEvent public class OnCreatureDamageReceived implements IBaseEvent
{ {
private final Creature _attacker; private Creature _attacker;
private final Creature _target; private Creature _target;
private final double _damage; private double _damage;
private final Skill _skill; private Skill _skill;
private final boolean _crit; private boolean _crit;
private final boolean _damageOverTime; private boolean _damageOverTime;
private final boolean _reflect; private boolean _reflect;
public OnCreatureDamageReceived(Creature attacker, Creature target, double damage, Skill skill, boolean crit, boolean damageOverTime, boolean reflect) public OnCreatureDamageReceived()
{ {
_attacker = attacker;
_target = target;
_damage = damage;
_skill = skill;
_crit = crit;
_damageOverTime = damageOverTime;
_reflect = reflect;
} }
public Creature getAttacker() public Creature getAttacker()
@@ -51,36 +44,71 @@ public class OnCreatureDamageReceived implements IBaseEvent
return _attacker; return _attacker;
} }
public synchronized void setAttacker(Creature attacker)
{
_attacker = attacker;
}
public Creature getTarget() public Creature getTarget()
{ {
return _target; return _target;
} }
public synchronized void setTarget(Creature target)
{
_target = target;
}
public double getDamage() public double getDamage()
{ {
return _damage; return _damage;
} }
public synchronized void setDamage(double damage)
{
_damage = damage;
}
public Skill getSkill() public Skill getSkill()
{ {
return _skill; return _skill;
} }
public synchronized void setSkill(Skill skill)
{
_skill = skill;
}
public boolean isCritical() public boolean isCritical()
{ {
return _crit; return _crit;
} }
public synchronized void setCritical(boolean crit)
{
_crit = crit;
}
public boolean isDamageOverTime() public boolean isDamageOverTime()
{ {
return _damageOverTime; return _damageOverTime;
} }
public synchronized void setDamageOverTime(boolean damageOverTime)
{
_damageOverTime = damageOverTime;
}
public boolean isReflect() public boolean isReflect()
{ {
return _reflect; return _reflect;
} }
public synchronized void setReflect(boolean reflect)
{
_reflect = reflect;
}
@Override @Override
public EventType getType() public EventType getType()
{ {
@@ -28,17 +28,13 @@ import org.l2jmobius.gameserver.model.skills.Skill;
*/ */
public class OnCreatureSkillFinishCast implements IBaseEvent public class OnCreatureSkillFinishCast implements IBaseEvent
{ {
private final Creature _caster; private Creature _caster;
private final Skill _skill; private WorldObject _target;
private final boolean _simultaneously; private Skill _skill;
private final WorldObject _target; private boolean _simultaneously;
public OnCreatureSkillFinishCast(Creature caster, WorldObject target, Skill skill, boolean simultaneously) public OnCreatureSkillFinishCast()
{ {
_caster = caster;
_skill = skill;
_simultaneously = simultaneously;
_target = target;
} }
public Creature getCaster() public Creature getCaster()
@@ -46,21 +42,41 @@ public class OnCreatureSkillFinishCast implements IBaseEvent
return _caster; return _caster;
} }
public synchronized void setCaster(Creature caster)
{
_caster = caster;
}
public WorldObject getTarget() public WorldObject getTarget()
{ {
return _target; return _target;
} }
public synchronized void setTarget(WorldObject target)
{
_target = target;
}
public Skill getSkill() public Skill getSkill()
{ {
return _skill; return _skill;
} }
public synchronized void setSkill(Skill skill)
{
_skill = skill;
}
public boolean isSimultaneously() public boolean isSimultaneously()
{ {
return _simultaneously; return _simultaneously;
} }
public synchronized void setSimultaneously(boolean simultaneously)
{
_simultaneously = simultaneously;
}
@Override @Override
public EventType getType() public EventType getType()
{ {
@@ -27,15 +27,12 @@ import org.l2jmobius.gameserver.model.skills.Skill;
*/ */
public class OnCreatureSkillUse implements IBaseEvent public class OnCreatureSkillUse implements IBaseEvent
{ {
private final Creature _caster; private Creature _caster;
private final Skill _skill; private Skill _skill;
private final boolean _simultaneously; private boolean _simultaneously;
public OnCreatureSkillUse(Creature caster, Skill skill, boolean simultaneously) public OnCreatureSkillUse()
{ {
_caster = caster;
_skill = skill;
_simultaneously = simultaneously;
} }
public Creature getCaster() public Creature getCaster()
@@ -43,16 +40,31 @@ public class OnCreatureSkillUse implements IBaseEvent
return _caster; return _caster;
} }
public synchronized void setCaster(Creature caster)
{
_caster = caster;
}
public Skill getSkill() public Skill getSkill()
{ {
return _skill; return _skill;
} }
public synchronized void setSkill(Skill skill)
{
_skill = skill;
}
public boolean isSimultaneously() public boolean isSimultaneously()
{ {
return _simultaneously; return _simultaneously;
} }
public synchronized void setSimultaneously(boolean simultaneously)
{
_simultaneously = simultaneously;
}
@Override @Override
public EventType getType() public EventType getType()
{ {
@@ -523,7 +523,15 @@ public class SkillCaster implements Runnable
} }
// Notify skill is casted. // Notify skill is casted.
EventDispatcher.getInstance().notifyEvent(new OnCreatureSkillFinishCast(caster, target, _skill, _skill.isWithoutAction()), caster); if (caster.onCreatureSkillFinishCast == null)
{
caster.onCreatureSkillFinishCast = new OnCreatureSkillFinishCast();
}
caster.onCreatureSkillFinishCast.setCaster(caster);
caster.onCreatureSkillFinishCast.setTarget(target);
caster.onCreatureSkillFinishCast.setSkill(_skill);
caster.onCreatureSkillFinishCast.setSimultaneously(_skill.isWithoutAction());
EventDispatcher.getInstance().notifyEvent(caster.onCreatureSkillFinishCast, caster);
// Call the skill's effects and AI interraction and stuff. // Call the skill's effects and AI interraction and stuff.
callSkill(caster, target, _targets, _skill, _item); callSkill(caster, target, _targets, _skill, _item);
@@ -968,7 +976,14 @@ public class SkillCaster implements Runnable
return false; return false;
} }
final TerminateReturn term = EventDispatcher.getInstance().notifyEvent(new OnCreatureSkillUse(caster, skill, skill.isWithoutAction()), caster, TerminateReturn.class); if (caster.onCreatureSkillUse == null)
{
caster.onCreatureSkillUse = new OnCreatureSkillUse();
}
caster.onCreatureSkillUse.setCaster(caster);
caster.onCreatureSkillUse.setSkill(skill);
caster.onCreatureSkillUse.setSimultaneously(skill.isWithoutAction());
final TerminateReturn term = EventDispatcher.getInstance().notifyEvent(caster.onCreatureSkillUse, caster, TerminateReturn.class);
if ((term != null) && term.terminate()) if ((term != null) && term.terminate())
{ {
caster.sendPacket(ActionFailed.STATIC_PACKET); caster.sendPacket(ActionFailed.STATIC_PACKET);
@@ -63,7 +63,11 @@ public class LargeCocoon extends AbstractNpcAI
{ {
case "attack": case "attack":
{ {
onCreatureAttacked(new OnCreatureAttacked(player, npc, null)); final OnCreatureAttacked attackEvent = new OnCreatureAttacked();
attackEvent.setAttacker(player);
attackEvent.setTarget(npc);
attackEvent.setSkill(null);
onCreatureAttacked(attackEvent);
break; break;
} }
case "attackPowerful": case "attackPowerful":
@@ -66,6 +66,8 @@ import org.l2jmobius.gameserver.taskmanager.AttackStanceTaskManager;
*/ */
public class CreatureAI extends AbstractAI public class CreatureAI extends AbstractAI
{ {
private OnNpcMoveFinished _onNpcMoveFinished = null;
public static class IntentionCommand public static class IntentionCommand
{ {
protected final CtrlIntention _crtlIntention; protected final CtrlIntention _crtlIntention;
@@ -691,7 +693,11 @@ public class CreatureAI extends AbstractAI
WalkingManager.getInstance().onArrived(npc); // Walking Manager support WalkingManager.getInstance().onArrived(npc); // Walking Manager support
// Notify to scripts // Notify to scripts
EventDispatcher.getInstance().notifyEventAsync(new OnNpcMoveFinished(npc), npc); if (_onNpcMoveFinished == null)
{
_onNpcMoveFinished = new OnNpcMoveFinished(npc);
}
EventDispatcher.getInstance().notifyEventAsync(_onNpcMoveFinished, npc);
} }
// Launch actions corresponding to the Event Think // Launch actions corresponding to the Event Think
@@ -103,6 +103,8 @@ import org.l2jmobius.gameserver.model.events.impl.creature.OnCreatureDamageRecei
import org.l2jmobius.gameserver.model.events.impl.creature.OnCreatureDeath; import org.l2jmobius.gameserver.model.events.impl.creature.OnCreatureDeath;
import org.l2jmobius.gameserver.model.events.impl.creature.OnCreatureKilled; import org.l2jmobius.gameserver.model.events.impl.creature.OnCreatureKilled;
import org.l2jmobius.gameserver.model.events.impl.creature.OnCreatureSee; import org.l2jmobius.gameserver.model.events.impl.creature.OnCreatureSee;
import org.l2jmobius.gameserver.model.events.impl.creature.OnCreatureSkillFinishCast;
import org.l2jmobius.gameserver.model.events.impl.creature.OnCreatureSkillUse;
import org.l2jmobius.gameserver.model.events.impl.creature.OnCreatureTeleport; import org.l2jmobius.gameserver.model.events.impl.creature.OnCreatureTeleport;
import org.l2jmobius.gameserver.model.events.impl.creature.OnCreatureTeleported; import org.l2jmobius.gameserver.model.events.impl.creature.OnCreatureTeleported;
import org.l2jmobius.gameserver.model.events.listeners.AbstractEventListener; import org.l2jmobius.gameserver.model.events.listeners.AbstractEventListener;
@@ -289,6 +291,14 @@ public abstract class Creature extends WorldObject implements ISkillsHolder, IDe
/** A list containing the dropped items of this fake player. */ /** A list containing the dropped items of this fake player. */
private final List<ItemInstance> _fakePlayerDrops = new CopyOnWriteArrayList<>(); private final List<ItemInstance> _fakePlayerDrops = new CopyOnWriteArrayList<>();
private OnCreatureAttack _onCreatureAttack = null;
private OnCreatureAttacked _onCreatureAttacked = null;
private OnCreatureDamageDealt _onCreatureDamageDealt = null;
private OnCreatureDamageReceived _onCreatureDamageReceived = null;
private OnCreatureAttackAvoid _onCreatureAttackAvoid = null;
public OnCreatureSkillFinishCast onCreatureSkillFinishCast = null;
public OnCreatureSkillUse onCreatureSkillUse = null;
/** /**
* Creates a creature. * Creates a creature.
* @param template the creature template * @param template the creature template
@@ -567,6 +577,14 @@ public abstract class Creature extends WorldObject implements ISkillsHolder, IDe
{ {
_summoner.removeSummonedNpc(getObjectId()); _summoner.removeSummonedNpc(getObjectId());
} }
_onCreatureAttack = null;
_onCreatureAttacked = null;
_onCreatureDamageDealt = null;
_onCreatureDamageReceived = null;
_onCreatureAttackAvoid = null;
onCreatureSkillFinishCast = null;
onCreatureSkillUse = null;
} }
@Override @Override
@@ -3907,8 +3925,24 @@ public abstract class Creature extends WorldObject implements ISkillsHolder, IDe
doAttack(hit.getDamage(), target, null, false, false, hit.isCritical(), false); doAttack(hit.getDamage(), target, null, false, false, hit.isCritical(), false);
// Notify to scripts when the attack has been done. // Notify to scripts when the attack has been done.
EventDispatcher.getInstance().notifyEvent(new OnCreatureAttack(this, target, null), this); if (_onCreatureAttack == null)
EventDispatcher.getInstance().notifyEvent(new OnCreatureAttacked(this, target, null), target); {
_onCreatureAttack = new OnCreatureAttack();
}
_onCreatureAttack.setAttacker(this);
_onCreatureAttack.setTarget(target);
_onCreatureAttack.setSkill(null);
EventDispatcher.getInstance().notifyEvent(_onCreatureAttack, this);
if (_onCreatureAttacked == null)
{
_onCreatureAttacked = new OnCreatureAttacked();
}
_onCreatureAttacked.setAttacker(this);
_onCreatureAttacked.setTarget(target);
_onCreatureAttacked.setSkill(null);
EventDispatcher.getInstance().notifyEvent(_onCreatureAttacked, target);
if (_triggerSkills != null) if (_triggerSkills != null)
{ {
for (OptionsSkillHolder holder : _triggerSkills.values()) for (OptionsSkillHolder holder : _triggerSkills.values())
@@ -4639,10 +4673,32 @@ public abstract class Creature extends WorldObject implements ISkillsHolder, IDe
// Notify of this attack only if there is an attacking creature. // Notify of this attack only if there is an attacking creature.
if (attacker != null) if (attacker != null)
{ {
EventDispatcher.getInstance().notifyEventAsync(new OnCreatureDamageDealt(attacker, this, amount, skill, critical, isDOT, reflect), attacker); if (_onCreatureDamageDealt == null)
{
_onCreatureDamageDealt = new OnCreatureDamageDealt();
}
_onCreatureDamageDealt.setAttacker(attacker);
_onCreatureDamageDealt.setTarget(this);
_onCreatureDamageDealt.setDamage(amount);
_onCreatureDamageDealt.setSkill(skill);
_onCreatureDamageDealt.setCritical(critical);
_onCreatureDamageDealt.setDamageOverTime(isDOT);
_onCreatureDamageDealt.setReflect(reflect);
EventDispatcher.getInstance().notifyEvent(_onCreatureDamageDealt, attacker);
} }
final DamageReturn term = EventDispatcher.getInstance().notifyEvent(new OnCreatureDamageReceived(attacker, this, amount, skill, critical, isDOT, reflect), this, DamageReturn.class); if (_onCreatureDamageReceived == null)
{
_onCreatureDamageReceived = new OnCreatureDamageReceived();
}
_onCreatureDamageReceived.setAttacker(attacker);
_onCreatureDamageReceived.setTarget(this);
_onCreatureDamageReceived.setDamage(amount);
_onCreatureDamageReceived.setSkill(skill);
_onCreatureDamageReceived.setCritical(critical);
_onCreatureDamageReceived.setDamageOverTime(isDOT);
_onCreatureDamageReceived.setReflect(reflect);
final DamageReturn term = EventDispatcher.getInstance().notifyEvent(_onCreatureDamageReceived, this, DamageReturn.class);
if (term != null) if (term != null)
{ {
if (term.terminate()) if (term.terminate())
@@ -5048,7 +5104,14 @@ public abstract class Creature extends WorldObject implements ISkillsHolder, IDe
*/ */
public void notifyAttackAvoid(Creature target, boolean isDot) public void notifyAttackAvoid(Creature target, boolean isDot)
{ {
EventDispatcher.getInstance().notifyEventAsync(new OnCreatureAttackAvoid(this, target, isDot), target); if (_onCreatureAttackAvoid == null)
{
_onCreatureAttackAvoid = new OnCreatureAttackAvoid();
}
_onCreatureAttackAvoid.setAttacker(this);
_onCreatureAttackAvoid.setTarget(target);
_onCreatureAttackAvoid.setDamageOverTime(isDot);
EventDispatcher.getInstance().notifyEvent(_onCreatureAttackAvoid, target);
} }
/** /**
@@ -27,15 +27,12 @@ import org.l2jmobius.gameserver.model.skills.Skill;
*/ */
public class OnCreatureAttack implements IBaseEvent public class OnCreatureAttack implements IBaseEvent
{ {
private final Creature _attacker; private Creature _attacker;
private final Creature _target; private Creature _target;
private final Skill _skill; private Skill _skill;
public OnCreatureAttack(Creature attacker, Creature target, Skill skill) public OnCreatureAttack()
{ {
_attacker = attacker;
_target = target;
_skill = skill;
} }
public Creature getAttacker() public Creature getAttacker()
@@ -43,16 +40,31 @@ public class OnCreatureAttack implements IBaseEvent
return _attacker; return _attacker;
} }
public synchronized void setAttacker(Creature attacker)
{
_attacker = attacker;
}
public Creature getTarget() public Creature getTarget()
{ {
return _target; return _target;
} }
public synchronized void setTarget(Creature target)
{
_target = target;
}
public Skill getSkill() public Skill getSkill()
{ {
return _skill; return _skill;
} }
public synchronized void setSkill(Skill skill)
{
_skill = skill;
}
@Override @Override
public EventType getType() public EventType getType()
{ {
@@ -26,20 +26,12 @@ import org.l2jmobius.gameserver.model.events.impl.IBaseEvent;
*/ */
public class OnCreatureAttackAvoid implements IBaseEvent public class OnCreatureAttackAvoid implements IBaseEvent
{ {
private final Creature _attacker; private Creature _attacker;
private final Creature _target; private Creature _target;
private final boolean _damageOverTime; private boolean _damageOverTime;
/** public OnCreatureAttackAvoid()
* @param attacker who attack
* @param target who avoid
* @param isDot is dot damage
*/
public OnCreatureAttackAvoid(Creature attacker, Creature target, boolean isDot)
{ {
_attacker = attacker;
_target = target;
_damageOverTime = isDot;
} }
public Creature getAttacker() public Creature getAttacker()
@@ -47,19 +39,31 @@ public class OnCreatureAttackAvoid implements IBaseEvent
return _attacker; return _attacker;
} }
public synchronized void setAttacker(Creature attacker)
{
_attacker = attacker;
}
public Creature getTarget() public Creature getTarget()
{ {
return _target; return _target;
} }
/** public synchronized void setTarget(Creature target)
* @return {
*/ _target = target;
}
public boolean isDamageOverTime() public boolean isDamageOverTime()
{ {
return _damageOverTime; return _damageOverTime;
} }
public synchronized void setDamageOverTime(boolean damageOverTime)
{
_damageOverTime = damageOverTime;
}
@Override @Override
public EventType getType() public EventType getType()
{ {
@@ -27,15 +27,12 @@ import org.l2jmobius.gameserver.model.skills.Skill;
*/ */
public class OnCreatureAttacked implements IBaseEvent public class OnCreatureAttacked implements IBaseEvent
{ {
private final Creature _attacker; private Creature _attacker;
private final Creature _target; private Creature _target;
private final Skill _skill; private Skill _skill;
public OnCreatureAttacked(Creature attacker, Creature target, Skill skill) public OnCreatureAttacked()
{ {
_attacker = attacker;
_target = target;
_skill = skill;
} }
public Creature getAttacker() public Creature getAttacker()
@@ -43,16 +40,31 @@ public class OnCreatureAttacked implements IBaseEvent
return _attacker; return _attacker;
} }
public synchronized void setAttacker(Creature attacker)
{
_attacker = attacker;
}
public Creature getTarget() public Creature getTarget()
{ {
return _target; return _target;
} }
public synchronized void setTarget(Creature target)
{
_target = target;
}
public Skill getSkill() public Skill getSkill()
{ {
return _skill; return _skill;
} }
public synchronized void setSkill(Skill skill)
{
_skill = skill;
}
@Override @Override
public EventType getType() public EventType getType()
{ {
@@ -27,23 +27,16 @@ import org.l2jmobius.gameserver.model.skills.Skill;
*/ */
public class OnCreatureDamageDealt implements IBaseEvent public class OnCreatureDamageDealt implements IBaseEvent
{ {
private final Creature _attacker; private Creature _attacker;
private final Creature _target; private Creature _target;
private final double _damage; private double _damage;
private final Skill _skill; private Skill _skill;
private final boolean _crit; private boolean _crit;
private final boolean _damageOverTime; private boolean _damageOverTime;
private final boolean _reflect; private boolean _reflect;
public OnCreatureDamageDealt(Creature attacker, Creature target, double damage, Skill skill, boolean crit, boolean damageOverTime, boolean reflect) public OnCreatureDamageDealt()
{ {
_attacker = attacker;
_target = target;
_damage = damage;
_skill = skill;
_crit = crit;
_damageOverTime = damageOverTime;
_reflect = reflect;
} }
public Creature getAttacker() public Creature getAttacker()
@@ -51,36 +44,71 @@ public class OnCreatureDamageDealt implements IBaseEvent
return _attacker; return _attacker;
} }
public synchronized void setAttacker(Creature attacker)
{
_attacker = attacker;
}
public Creature getTarget() public Creature getTarget()
{ {
return _target; return _target;
} }
public synchronized void setTarget(Creature target)
{
_target = target;
}
public double getDamage() public double getDamage()
{ {
return _damage; return _damage;
} }
public synchronized void setDamage(double damage)
{
_damage = damage;
}
public Skill getSkill() public Skill getSkill()
{ {
return _skill; return _skill;
} }
public synchronized void setSkill(Skill skill)
{
_skill = skill;
}
public boolean isCritical() public boolean isCritical()
{ {
return _crit; return _crit;
} }
public synchronized void setCritical(boolean crit)
{
_crit = crit;
}
public boolean isDamageOverTime() public boolean isDamageOverTime()
{ {
return _damageOverTime; return _damageOverTime;
} }
public synchronized void setDamageOverTime(boolean damageOverTime)
{
_damageOverTime = damageOverTime;
}
public boolean isReflect() public boolean isReflect()
{ {
return _reflect; return _reflect;
} }
public synchronized void setReflect(boolean reflect)
{
_reflect = reflect;
}
@Override @Override
public EventType getType() public EventType getType()
{ {
@@ -27,23 +27,16 @@ import org.l2jmobius.gameserver.model.skills.Skill;
*/ */
public class OnCreatureDamageReceived implements IBaseEvent public class OnCreatureDamageReceived implements IBaseEvent
{ {
private final Creature _attacker; private Creature _attacker;
private final Creature _target; private Creature _target;
private final double _damage; private double _damage;
private final Skill _skill; private Skill _skill;
private final boolean _crit; private boolean _crit;
private final boolean _damageOverTime; private boolean _damageOverTime;
private final boolean _reflect; private boolean _reflect;
public OnCreatureDamageReceived(Creature attacker, Creature target, double damage, Skill skill, boolean crit, boolean damageOverTime, boolean reflect) public OnCreatureDamageReceived()
{ {
_attacker = attacker;
_target = target;
_damage = damage;
_skill = skill;
_crit = crit;
_damageOverTime = damageOverTime;
_reflect = reflect;
} }
public Creature getAttacker() public Creature getAttacker()
@@ -51,36 +44,71 @@ public class OnCreatureDamageReceived implements IBaseEvent
return _attacker; return _attacker;
} }
public synchronized void setAttacker(Creature attacker)
{
_attacker = attacker;
}
public Creature getTarget() public Creature getTarget()
{ {
return _target; return _target;
} }
public synchronized void setTarget(Creature target)
{
_target = target;
}
public double getDamage() public double getDamage()
{ {
return _damage; return _damage;
} }
public synchronized void setDamage(double damage)
{
_damage = damage;
}
public Skill getSkill() public Skill getSkill()
{ {
return _skill; return _skill;
} }
public synchronized void setSkill(Skill skill)
{
_skill = skill;
}
public boolean isCritical() public boolean isCritical()
{ {
return _crit; return _crit;
} }
public synchronized void setCritical(boolean crit)
{
_crit = crit;
}
public boolean isDamageOverTime() public boolean isDamageOverTime()
{ {
return _damageOverTime; return _damageOverTime;
} }
public synchronized void setDamageOverTime(boolean damageOverTime)
{
_damageOverTime = damageOverTime;
}
public boolean isReflect() public boolean isReflect()
{ {
return _reflect; return _reflect;
} }
public synchronized void setReflect(boolean reflect)
{
_reflect = reflect;
}
@Override @Override
public EventType getType() public EventType getType()
{ {
@@ -28,17 +28,13 @@ import org.l2jmobius.gameserver.model.skills.Skill;
*/ */
public class OnCreatureSkillFinishCast implements IBaseEvent public class OnCreatureSkillFinishCast implements IBaseEvent
{ {
private final Creature _caster; private Creature _caster;
private final Skill _skill; private WorldObject _target;
private final boolean _simultaneously; private Skill _skill;
private final WorldObject _target; private boolean _simultaneously;
public OnCreatureSkillFinishCast(Creature caster, WorldObject target, Skill skill, boolean simultaneously) public OnCreatureSkillFinishCast()
{ {
_caster = caster;
_skill = skill;
_simultaneously = simultaneously;
_target = target;
} }
public Creature getCaster() public Creature getCaster()
@@ -46,21 +42,41 @@ public class OnCreatureSkillFinishCast implements IBaseEvent
return _caster; return _caster;
} }
public synchronized void setCaster(Creature caster)
{
_caster = caster;
}
public WorldObject getTarget() public WorldObject getTarget()
{ {
return _target; return _target;
} }
public synchronized void setTarget(WorldObject target)
{
_target = target;
}
public Skill getSkill() public Skill getSkill()
{ {
return _skill; return _skill;
} }
public synchronized void setSkill(Skill skill)
{
_skill = skill;
}
public boolean isSimultaneously() public boolean isSimultaneously()
{ {
return _simultaneously; return _simultaneously;
} }
public synchronized void setSimultaneously(boolean simultaneously)
{
_simultaneously = simultaneously;
}
@Override @Override
public EventType getType() public EventType getType()
{ {
@@ -27,15 +27,12 @@ import org.l2jmobius.gameserver.model.skills.Skill;
*/ */
public class OnCreatureSkillUse implements IBaseEvent public class OnCreatureSkillUse implements IBaseEvent
{ {
private final Creature _caster; private Creature _caster;
private final Skill _skill; private Skill _skill;
private final boolean _simultaneously; private boolean _simultaneously;
public OnCreatureSkillUse(Creature caster, Skill skill, boolean simultaneously) public OnCreatureSkillUse()
{ {
_caster = caster;
_skill = skill;
_simultaneously = simultaneously;
} }
public Creature getCaster() public Creature getCaster()
@@ -43,16 +40,31 @@ public class OnCreatureSkillUse implements IBaseEvent
return _caster; return _caster;
} }
public synchronized void setCaster(Creature caster)
{
_caster = caster;
}
public Skill getSkill() public Skill getSkill()
{ {
return _skill; return _skill;
} }
public synchronized void setSkill(Skill skill)
{
_skill = skill;
}
public boolean isSimultaneously() public boolean isSimultaneously()
{ {
return _simultaneously; return _simultaneously;
} }
public synchronized void setSimultaneously(boolean simultaneously)
{
_simultaneously = simultaneously;
}
@Override @Override
public EventType getType() public EventType getType()
{ {
@@ -523,7 +523,15 @@ public class SkillCaster implements Runnable
} }
// Notify skill is casted. // Notify skill is casted.
EventDispatcher.getInstance().notifyEvent(new OnCreatureSkillFinishCast(caster, target, _skill, _skill.isWithoutAction()), caster); if (caster.onCreatureSkillFinishCast == null)
{
caster.onCreatureSkillFinishCast = new OnCreatureSkillFinishCast();
}
caster.onCreatureSkillFinishCast.setCaster(caster);
caster.onCreatureSkillFinishCast.setTarget(target);
caster.onCreatureSkillFinishCast.setSkill(_skill);
caster.onCreatureSkillFinishCast.setSimultaneously(_skill.isWithoutAction());
EventDispatcher.getInstance().notifyEvent(caster.onCreatureSkillFinishCast, caster);
// Call the skill's effects and AI interraction and stuff. // Call the skill's effects and AI interraction and stuff.
callSkill(caster, target, _targets, _skill, _item); callSkill(caster, target, _targets, _skill, _item);
@@ -968,7 +976,14 @@ public class SkillCaster implements Runnable
return false; return false;
} }
final TerminateReturn term = EventDispatcher.getInstance().notifyEvent(new OnCreatureSkillUse(caster, skill, skill.isWithoutAction()), caster, TerminateReturn.class); if (caster.onCreatureSkillUse == null)
{
caster.onCreatureSkillUse = new OnCreatureSkillUse();
}
caster.onCreatureSkillUse.setCaster(caster);
caster.onCreatureSkillUse.setSkill(skill);
caster.onCreatureSkillUse.setSimultaneously(skill.isWithoutAction());
final TerminateReturn term = EventDispatcher.getInstance().notifyEvent(caster.onCreatureSkillUse, caster, TerminateReturn.class);
if ((term != null) && term.terminate()) if ((term != null) && term.terminate())
{ {
caster.sendPacket(ActionFailed.STATIC_PACKET); caster.sendPacket(ActionFailed.STATIC_PACKET);
@@ -63,7 +63,11 @@ public class LargeCocoon extends AbstractNpcAI
{ {
case "attack": case "attack":
{ {
onCreatureAttacked(new OnCreatureAttacked(player, npc, null)); final OnCreatureAttacked attackEvent = new OnCreatureAttacked();
attackEvent.setAttacker(player);
attackEvent.setTarget(npc);
attackEvent.setSkill(null);
onCreatureAttacked(attackEvent);
break; break;
} }
case "attackPowerful": case "attackPowerful":

Some files were not shown because too many files have changed in this diff Show More