Jelajahi Sumber

BETA: Adding new event listener:
* onPvPKill() fired whenever player kills another player.
* Supports UseAntiFeed annotation will notify only after AntiFeedManager validation.
* Added some more javadocs.

Rumen Nikiforov 11 tahun lalu
induk
melakukan
3f4cb10f8e

+ 14 - 8
L2J_Server_BETA/java/com/l2jserver/gameserver/model/L2Object.java

@@ -592,11 +592,6 @@ public abstract class L2Object implements IPositionable
 	
 	public abstract boolean isAutoAttackable(L2Character attacker);
 	
-	public boolean isMarker()
-	{
-		return false;
-	}
-	
 	/**
 	 * Return the visibility state of the L2Object. <B><U> Concept</U> :</B><BR>
 	 * <BR>
@@ -692,9 +687,20 @@ public abstract class L2Object implements IPositionable
 	}
 	
 	/**
-	 * Sends the Server->Client info packet for the object.<br>
-	 * <br>
-	 * Is Overridden in: <li>L2AirShipInstance</li> <li>L2BoatInstance</li> <li>L2DoorInstance</li> <li>L2PcInstance</li> <li>L2StaticObjectInstance</li> <li>L2Decoy</li> <li>L2Npc</li> <li>L2Summon</li> <li>L2Trap</li> <li>L2ItemInstance</li>
+	 * Sends the Server->Client info packet for the object. <br>
+	 * Is Overridden in:
+	 * <ul>
+	 * <li>L2AirShipInstance</li>
+	 * <li>L2BoatInstance</li>
+	 * <li>L2DoorInstance</li>
+	 * <li>L2PcInstance</li>
+	 * <li>L2StaticObjectInstance</li>
+	 * <li>L2Decoy</li>
+	 * <li>L2Npc</li>
+	 * <li>L2Summon</li>
+	 * <li>L2Trap</li>
+	 * <li>L2ItemInstance</li>
+	 * </ul>
 	 * @param activeChar
 	 */
 	public void sendInfo(L2PcInstance activeChar)

+ 27 - 5
L2J_Server_BETA/java/com/l2jserver/gameserver/model/actor/events/CharEvents.java

@@ -50,7 +50,11 @@ public class CharEvents extends AbstractCharEvents
 	}
 	
 	/**
-	 * Fired whenever current char attacks someone.
+	 * Fired whenever current char attacks someone.<br>
+	 * Supported annotations:<br>
+	 * <ul>
+	 * <li>{@link PlayerOnly}</li>
+	 * </ul>
 	 * @param target
 	 * @return {@code true} if current attack is possible, {@code false} otherwise.
 	 */
@@ -82,7 +86,13 @@ public class CharEvents extends AbstractCharEvents
 	}
 	
 	/**
-	 * Fired whenever current char cast a magic.
+	 * Fired whenever current char cast a magic.<br>
+	 * Supported annotations:<br>
+	 * <ul>
+	 * <li>{@link PlayerOnly}</li>
+	 * <li>{@link SkillId}</li>
+	 * <li>{@link SkillLevel}</li>
+	 * </ul>
 	 * @param skill
 	 * @param simultaneously
 	 * @param target
@@ -129,7 +139,11 @@ public class CharEvents extends AbstractCharEvents
 	}
 	
 	/**
-	 * Fired whenever current char dies.
+	 * Fired whenever current char dies.<br>
+	 * Supported annotations:<br>
+	 * <ul>
+	 * <li>{@link PlayerOnly}</li>
+	 * </ul>
 	 * @param killer
 	 * @return {@code true} if current char can die, {@code false} otherwise.
 	 */
@@ -161,7 +175,11 @@ public class CharEvents extends AbstractCharEvents
 	}
 	
 	/**
-	 * Fired whenever current char deal damage.
+	 * Fired whenever current char deal damage.<br>
+	 * Supported annotations:<br>
+	 * <ul>
+	 * <li>{@link PlayerOnly}</li>
+	 * </ul>
 	 * @param damage
 	 * @param target
 	 * @param skill
@@ -191,7 +209,11 @@ public class CharEvents extends AbstractCharEvents
 	}
 	
 	/**
-	 * Fired whenever current char receive damage.
+	 * Fired whenever current char receive damage.<br>
+	 * Supported annotations:<br>
+	 * <ul>
+	 * <li>{@link PlayerOnly}</li>
+	 * </ul>
 	 * @param damage
 	 * @param attacker
 	 * @param skill

+ 10 - 2
L2J_Server_BETA/java/com/l2jserver/gameserver/model/actor/events/PlayableEvents.java

@@ -36,7 +36,11 @@ public class PlayableEvents extends CharEvents
 	}
 	
 	/**
-	 * Fired whenever current char receives any exp.
+	 * Fired whenever current char receives any exp.<br>
+	 * Supported annotations:<br>
+	 * <ul>
+	 * <li>{@link PlayerOnly}</li>
+	 * </ul>
 	 * @param exp
 	 * @return {@code true} if experience can be received, {@code false} otherwise.
 	 */
@@ -68,7 +72,11 @@ public class PlayableEvents extends CharEvents
 	}
 	
 	/**
-	 * Fired whenever current playable's level has change.
+	 * Fired whenever current playable's level has change.<br>
+	 * Supported annotations:<br>
+	 * <ul>
+	 * <li>{@link PlayerOnly}</li>
+	 * </ul>
 	 * @param levels
 	 * @return {@code true} if level change is possible, {@code false} otherwise.
 	 */

+ 40 - 1
L2J_Server_BETA/java/com/l2jserver/gameserver/model/actor/events/PlayerEvents.java

@@ -20,13 +20,16 @@ package com.l2jserver.gameserver.model.actor.events;
 
 import java.util.logging.Level;
 
+import com.l2jserver.gameserver.instancemanager.AntiFeedManager;
 import com.l2jserver.gameserver.model.actor.events.annotations.Message;
+import com.l2jserver.gameserver.model.actor.events.annotations.UseAntiFeed;
 import com.l2jserver.gameserver.model.actor.events.listeners.IDlgAnswerEventListener;
 import com.l2jserver.gameserver.model.actor.events.listeners.IFamePointsChangeEventListener;
 import com.l2jserver.gameserver.model.actor.events.listeners.IKarmaChangeEventListener;
 import com.l2jserver.gameserver.model.actor.events.listeners.IPKPointsChangeEventListener;
 import com.l2jserver.gameserver.model.actor.events.listeners.IPlayerLoginEventListener;
 import com.l2jserver.gameserver.model.actor.events.listeners.IPlayerLogoutEventListener;
+import com.l2jserver.gameserver.model.actor.events.listeners.IPvPKillEventListener;
 import com.l2jserver.gameserver.model.actor.events.listeners.IPvPPointsEventChange;
 import com.l2jserver.gameserver.model.actor.instance.L2PcInstance;
 import com.l2jserver.gameserver.util.Util;
@@ -160,7 +163,11 @@ public class PlayerEvents extends PlayableEvents
 	}
 	
 	/**
-	 * Fired whenever player answer on a dialog yes/no.
+	 * Fired whenever player answer on a dialog yes/no.<br>
+	 * Supported annotations:<br>
+	 * <ul>
+	 * <li>{@link Message}</li>
+	 * </ul>
 	 * @param messageId
 	 * @param answer
 	 * @param requesterId
@@ -235,4 +242,36 @@ public class PlayerEvents extends PlayableEvents
 			}
 		}
 	}
+	
+	/**
+	 * Fired whenever player kills another player.<br>
+	 * Supported annotations:<br>
+	 * <ul>
+	 * <li>{@link UseAntiFeed}</li>
+	 * </ul>
+	 * @param target
+	 */
+	public void onPvPKill(L2PcInstance target)
+	{
+		if (hasListeners())
+		{
+			for (IPvPKillEventListener listener : getEventListeners(IPvPKillEventListener.class))
+			{
+				try
+				{
+					final UseAntiFeed useAntiFeed = listener.getClass().getAnnotation(UseAntiFeed.class);
+					if ((useAntiFeed != null) && !AntiFeedManager.getInstance().check(getActingPlayer(), target))
+					{
+						continue;
+					}
+					
+					listener.onPvPKill(getActingPlayer(), target);
+				}
+				catch (Exception e)
+				{
+					_log.log(Level.WARNING, getClass().getSimpleName() + ": Exception caught: ", e);
+				}
+			}
+		}
+	}
 }

+ 34 - 0
L2J_Server_BETA/java/com/l2jserver/gameserver/model/actor/events/annotations/UseAntiFeed.java

@@ -0,0 +1,34 @@
+/*
+ * 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.actor.events.annotations;
+
+import java.lang.annotation.ElementType;
+import java.lang.annotation.Retention;
+import java.lang.annotation.RetentionPolicy;
+import java.lang.annotation.Target;
+
+/**
+ * @author UnAfraid
+ */
+@Retention(RetentionPolicy.RUNTIME)
+@Target(ElementType.TYPE)
+public @interface UseAntiFeed
+{
+	
+}

+ 29 - 0
L2J_Server_BETA/java/com/l2jserver/gameserver/model/actor/events/listeners/IPvPKillEventListener.java

@@ -0,0 +1,29 @@
+/*
+ * 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.actor.events.listeners;
+
+import com.l2jserver.gameserver.model.actor.instance.L2PcInstance;
+
+/**
+ * @author UnAfraid
+ */
+public interface IPvPKillEventListener extends IEventListener
+{
+	public void onPvPKill(L2PcInstance attacker, L2PcInstance target);
+}

+ 37 - 32
L2J_Server_BETA/java/com/l2jserver/gameserver/model/actor/instance/L2PcInstance.java

@@ -5460,47 +5460,52 @@ public final class L2PcInstance extends L2Playable
 		
 		if (killer != null)
 		{
-			L2PcInstance pk = killer.getActingPlayer();
-			
-			TvTEvent.onKill(killer, this);
-			
-			if (L2Event.isParticipant(pk) && (pk != null))
+			final L2PcInstance pk = killer.getActingPlayer();
+			if (pk != null)
 			{
-				pk.getEventStatus().kills.add(this);
-			}
-			
-			// announce pvp/pk
-			if (Config.ANNOUNCE_PK_PVP && (pk != null) && !pk.isGM())
-			{
-				String msg = "";
-				if (getPvpFlag() == 0)
+				pk.getEvents().onPvPKill(this);
+				
+				TvTEvent.onKill(killer, this);
+				
+				if (L2Event.isParticipant(pk))
 				{
-					msg = Config.ANNOUNCE_PK_MSG.replace("$killer", pk.getName()).replace("$target", getName());
-					if (Config.ANNOUNCE_PK_PVP_NORMAL_MESSAGE)
-					{
-						SystemMessage sm = SystemMessage.getSystemMessage(SystemMessageId.S1);
-						sm.addString(msg);
-						Announcements.getInstance().announceToAll(sm);
-					}
-					else
-					{
-						Announcements.getInstance().announceToAll(msg);
-					}
+					pk.getEventStatus().kills.add(this);
 				}
-				else if (getPvpFlag() != 0)
+				
+				// announce pvp/pk
+				if (Config.ANNOUNCE_PK_PVP && !pk.isGM())
 				{
-					msg = Config.ANNOUNCE_PVP_MSG.replace("$killer", pk.getName()).replace("$target", getName());
-					if (Config.ANNOUNCE_PK_PVP_NORMAL_MESSAGE)
+					String msg = "";
+					if (getPvpFlag() == 0)
 					{
-						SystemMessage sm = SystemMessage.getSystemMessage(SystemMessageId.S1);
-						sm.addString(msg);
-						Announcements.getInstance().announceToAll(sm);
+						msg = Config.ANNOUNCE_PK_MSG.replace("$killer", pk.getName()).replace("$target", getName());
+						if (Config.ANNOUNCE_PK_PVP_NORMAL_MESSAGE)
+						{
+							SystemMessage sm = SystemMessage.getSystemMessage(SystemMessageId.S1);
+							sm.addString(msg);
+							Announcements.getInstance().announceToAll(sm);
+						}
+						else
+						{
+							Announcements.getInstance().announceToAll(msg);
+						}
 					}
-					else
+					else if (getPvpFlag() != 0)
 					{
-						Announcements.getInstance().announceToAll(msg);
+						msg = Config.ANNOUNCE_PVP_MSG.replace("$killer", pk.getName()).replace("$target", getName());
+						if (Config.ANNOUNCE_PK_PVP_NORMAL_MESSAGE)
+						{
+							SystemMessage sm = SystemMessage.getSystemMessage(SystemMessageId.S1);
+							sm.addString(msg);
+							Announcements.getInstance().announceToAll(sm);
+						}
+						else
+						{
+							Announcements.getInstance().announceToAll(msg);
+						}
 					}
 				}
+				
 			}
 			
 			broadcastStatusUpdate();