|
@@ -26,6 +26,7 @@ import java.util.Collection;
|
|
import java.util.List;
|
|
import java.util.List;
|
|
import java.util.Map;
|
|
import java.util.Map;
|
|
import java.util.Set;
|
|
import java.util.Set;
|
|
|
|
+import java.util.concurrent.CopyOnWriteArrayList;
|
|
import java.util.concurrent.Future;
|
|
import java.util.concurrent.Future;
|
|
import java.util.concurrent.locks.ReentrantLock;
|
|
import java.util.concurrent.locks.ReentrantLock;
|
|
import java.util.logging.Level;
|
|
import java.util.logging.Level;
|
|
@@ -85,6 +86,7 @@ import com.l2jserver.gameserver.model.entity.Instance;
|
|
import com.l2jserver.gameserver.model.holders.SkillHolder;
|
|
import com.l2jserver.gameserver.model.holders.SkillHolder;
|
|
import com.l2jserver.gameserver.model.holders.SkillUseHolder;
|
|
import com.l2jserver.gameserver.model.holders.SkillUseHolder;
|
|
import com.l2jserver.gameserver.model.interfaces.IChanceSkillTrigger;
|
|
import com.l2jserver.gameserver.model.interfaces.IChanceSkillTrigger;
|
|
|
|
+import com.l2jserver.gameserver.model.interfaces.IDamageReceivedListener;
|
|
import com.l2jserver.gameserver.model.interfaces.ISkillsHolder;
|
|
import com.l2jserver.gameserver.model.interfaces.ISkillsHolder;
|
|
import com.l2jserver.gameserver.model.itemcontainer.Inventory;
|
|
import com.l2jserver.gameserver.model.itemcontainer.Inventory;
|
|
import com.l2jserver.gameserver.model.items.L2Item;
|
|
import com.l2jserver.gameserver.model.items.L2Item;
|
|
@@ -230,6 +232,8 @@ public abstract class L2Character extends L2Object implements ISkillsHolder
|
|
|
|
|
|
private final CharEffectList _effectList = new CharEffectList(this);
|
|
private final CharEffectList _effectList = new CharEffectList(this);
|
|
|
|
|
|
|
|
+ private volatile List<IDamageReceivedListener> _onDamageReceivedListeners;
|
|
|
|
+
|
|
public final CharEffectList getEffectList()
|
|
public final CharEffectList getEffectList()
|
|
{
|
|
{
|
|
return _effectList;
|
|
return _effectList;
|
|
@@ -5361,10 +5365,12 @@ public abstract class L2Character extends L2Object implements ISkillsHolder
|
|
|
|
|
|
// reduce targets HP
|
|
// reduce targets HP
|
|
target.reduceCurrentHp(damage, this, null);
|
|
target.reduceCurrentHp(damage, this, null);
|
|
|
|
+ target.notifyDamageReceivedToEffects(damage, this, null, crit);
|
|
|
|
|
|
if (reflectedDamage > 0)
|
|
if (reflectedDamage > 0)
|
|
{
|
|
{
|
|
reduceCurrentHp(reflectedDamage, target, true, false, null);
|
|
reduceCurrentHp(reflectedDamage, target, true, false, null);
|
|
|
|
+ notifyDamageReceivedToEffects(reflectedDamage, target, null, crit);
|
|
}
|
|
}
|
|
|
|
|
|
if (!isBow) // Do not absorb if weapon is of type bow
|
|
if (!isBow) // Do not absorb if weapon is of type bow
|
|
@@ -7597,6 +7603,63 @@ public abstract class L2Character extends L2Object implements ISkillsHolder
|
|
return false;
|
|
return false;
|
|
}
|
|
}
|
|
|
|
|
|
|
|
+ public int getClanId()
|
|
|
|
+ {
|
|
|
|
+ return 0;
|
|
|
|
+ }
|
|
|
|
+
|
|
|
|
+ public int getAllyId()
|
|
|
|
+ {
|
|
|
|
+ return 0;
|
|
|
|
+ }
|
|
|
|
+
|
|
|
|
+ public void registerDamageReceiveListener(IDamageReceivedListener listener)
|
|
|
|
+ {
|
|
|
|
+ if (_onDamageReceivedListeners == null)
|
|
|
|
+ {
|
|
|
|
+ synchronized (this)
|
|
|
|
+ {
|
|
|
|
+ if (_onDamageReceivedListeners == null)
|
|
|
|
+ {
|
|
|
|
+ _onDamageReceivedListeners = new CopyOnWriteArrayList<>();
|
|
|
|
+ }
|
|
|
|
+ }
|
|
|
|
+ }
|
|
|
|
+ _onDamageReceivedListeners.add(listener);
|
|
|
|
+ }
|
|
|
|
+
|
|
|
|
+ public void unregisterDamageReceiveListener(IDamageReceivedListener listener)
|
|
|
|
+ {
|
|
|
|
+ if (_onDamageReceivedListeners != null)
|
|
|
|
+ {
|
|
|
|
+ if (_onDamageReceivedListeners.contains(listener))
|
|
|
|
+ {
|
|
|
|
+ _onDamageReceivedListeners.remove(listener);
|
|
|
|
+ }
|
|
|
|
+ if (_onDamageReceivedListeners.isEmpty())
|
|
|
|
+ {
|
|
|
|
+ synchronized (this)
|
|
|
|
+ {
|
|
|
|
+ if (_onDamageReceivedListeners.isEmpty())
|
|
|
|
+ {
|
|
|
|
+ _onDamageReceivedListeners = null;
|
|
|
|
+ }
|
|
|
|
+ }
|
|
|
|
+ }
|
|
|
|
+ }
|
|
|
|
+ }
|
|
|
|
+
|
|
|
|
+ public void notifyDamageReceivedToEffects(double damage, L2Character attacker, L2Skill skill, boolean critical)
|
|
|
|
+ {
|
|
|
|
+ if (_onDamageReceivedListeners != null)
|
|
|
|
+ {
|
|
|
|
+ for (IDamageReceivedListener listener : _onDamageReceivedListeners)
|
|
|
|
+ {
|
|
|
|
+ listener.onDamageReceived(damage, attacker, skill, critical);
|
|
|
|
+ }
|
|
|
|
+ }
|
|
|
|
+ }
|
|
|
|
+
|
|
// LISTENERS
|
|
// LISTENERS
|
|
|
|
|
|
/**
|
|
/**
|
|
@@ -7861,14 +7924,4 @@ public abstract class L2Character extends L2Object implements ISkillsHolder
|
|
{
|
|
{
|
|
globalSkillUseListeners.remove(listener);
|
|
globalSkillUseListeners.remove(listener);
|
|
}
|
|
}
|
|
-
|
|
|
|
- public int getClanId()
|
|
|
|
- {
|
|
|
|
- return 0;
|
|
|
|
- }
|
|
|
|
-
|
|
|
|
- public int getAllyId()
|
|
|
|
- {
|
|
|
|
- return 0;
|
|
|
|
- }
|
|
|
|
}
|
|
}
|