Quellcode durchsuchen

BETA: Core part for [DP9802].
Patch by: UnAfraid

Adry_85 vor 12 Jahren
Ursprung
Commit
0c3f81b26f

+ 63 - 10
L2J_Server_BETA/java/com/l2jserver/gameserver/model/actor/L2Character.java

@@ -26,6 +26,7 @@ import java.util.Collection;
 import java.util.List;
 import java.util.Map;
 import java.util.Set;
+import java.util.concurrent.CopyOnWriteArrayList;
 import java.util.concurrent.Future;
 import java.util.concurrent.locks.ReentrantLock;
 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.SkillUseHolder;
 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.itemcontainer.Inventory;
 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 volatile List<IDamageReceivedListener> _onDamageReceivedListeners;
+	
 	public final CharEffectList getEffectList()
 	{
 		return _effectList;
@@ -5361,10 +5365,12 @@ public abstract class L2Character extends L2Object implements ISkillsHolder
 				
 				// reduce targets HP
 				target.reduceCurrentHp(damage, this, null);
+				target.notifyDamageReceivedToEffects(damage, this, null, crit);
 				
 				if (reflectedDamage > 0)
 				{
 					reduceCurrentHp(reflectedDamage, target, true, false, null);
+					notifyDamageReceivedToEffects(reflectedDamage, target, null, crit);
 				}
 				
 				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;
 	}
 	
+	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
 	
 	/**
@@ -7861,14 +7924,4 @@ public abstract class L2Character extends L2Object implements ISkillsHolder
 	{
 		globalSkillUseListeners.remove(listener);
 	}
-	
-	public int getClanId()
-	{
-		return 0;
-	}
-	
-	public int getAllyId()
-	{
-		return 0;
-	}
 }

+ 30 - 0
L2J_Server_BETA/java/com/l2jserver/gameserver/model/interfaces/IDamageReceivedListener.java

@@ -0,0 +1,30 @@
+/*
+ * Copyright (C) 2004-2013 L2J Server
+ * 
+ * This file is part of L2J Server.
+ * 
+ * L2J Server is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ * 
+ * L2J Server is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * General Public License for more details.
+ * 
+ * You should have received a copy of the GNU General Public License
+ * along with this program. If not, see <http://www.gnu.org/licenses/>.
+ */
+package com.l2jserver.gameserver.model.interfaces;
+
+import com.l2jserver.gameserver.model.actor.L2Character;
+import com.l2jserver.gameserver.model.skills.L2Skill;
+
+/**
+ * @author UnAfraid
+ */
+public interface IDamageReceivedListener
+{
+	public void onDamageReceived(double damage, L2Character attacker, L2Skill skill, boolean critical);
+}