Browse Source

BETA: Implementing '''onNpcHate''' quest listener

Patch by: !UnAfraid
malyelfik 11 năm trước cách đây
mục cha
commit
d282ed69b7

+ 20 - 0
L2J_Server_BETA/java/com/l2jserver/gameserver/ai/L2AttackableAI.java

@@ -484,6 +484,26 @@ public class L2AttackableAI extends L2CharacterAI implements Runnable
 					}
 				}
 				
+				if (obj.isPlayable())
+				{
+					final List<Quest> quests = getActiveChar().getTemplate().getEventQuests(QuestEventType.ON_NPC_HATE);
+					if (quests != null)
+					{
+						boolean breaking = false;
+						for (Quest q : quests)
+						{
+							if (!q.onNpcHate(getActiveChar(), (L2Playable) obj))
+							{
+								breaking = true;
+							}
+						}
+						if (breaking)
+						{
+							continue;
+						}
+					}
+				}
+				
 				// TODO: The AI Script ought to handle aggro behaviors in onSee. Once implemented, aggro behaviors ought
 				// to be removed from here. (Fulminus)
 				// For each L2Character check if the target is autoattackable

+ 2 - 1
L2J_Server_BETA/java/com/l2jserver/gameserver/enums/QuestEventType.java

@@ -42,7 +42,8 @@ public enum QuestEventType
 	ON_MOVE_FINISHED(true), // onMoveFinished action, triggered when NPC stops after moving
 	ON_NODE_ARRIVED(true), // onNodeArrived action, triggered when NPC, controlled by Walking Manager, arrives to next node
 	ON_SEE_CREATURE(true), // onSeeCreature action, triggered when NPC's known list include the character
-	ON_ROUTE_FINISHED(true); // onRouteFinished action, triggered when NPC, controlled by Walking Manager, arrives to last node
+	ON_ROUTE_FINISHED(true), // onRouteFinished action, triggered when NPC, controlled by Walking Manager, arrives to last node
+	ON_NPC_HATE(true);
 	
 	// control whether this event type is allowed for the same npc template in multiple quests
 	// or if the npc must be registered in at most one quest for the specified event

+ 30 - 0
L2J_Server_BETA/java/com/l2jserver/gameserver/model/quest/Quest.java

@@ -53,8 +53,10 @@ import com.l2jserver.gameserver.model.L2Object;
 import com.l2jserver.gameserver.model.L2Party;
 import com.l2jserver.gameserver.model.L2Spawn;
 import com.l2jserver.gameserver.model.Location;
+import com.l2jserver.gameserver.model.actor.L2Attackable;
 import com.l2jserver.gameserver.model.actor.L2Character;
 import com.l2jserver.gameserver.model.actor.L2Npc;
+import com.l2jserver.gameserver.model.actor.L2Playable;
 import com.l2jserver.gameserver.model.actor.instance.L2DoorInstance;
 import com.l2jserver.gameserver.model.actor.instance.L2MonsterInstance;
 import com.l2jserver.gameserver.model.actor.instance.L2PcInstance;
@@ -1355,6 +1357,16 @@ public class Quest extends ManagedScript implements IIdentifiable
 		
 	}
 	
+	/**
+	 * @param mob
+	 * @param playable
+	 * @return {@code true} if npc can hate the playable, {@code false} otherwise.
+	 */
+	public boolean onNpcHate(L2Attackable mob, L2Playable playable)
+	{
+		return true;
+	}
+	
 	/**
 	 * Show an error message to the specified player.
 	 * @param player the player to whom to send the error (must be a GM)
@@ -2185,6 +2197,24 @@ public class Quest extends ManagedScript implements IIdentifiable
 		addEventId(QuestEventType.ON_ROUTE_FINISHED, npcIds);
 	}
 	
+	/**
+	 * Register onNpcHate trigger for NPC
+	 * @param npcIds
+	 */
+	public void addNpcHateId(int... npcIds)
+	{
+		addEventId(QuestEventType.ON_NPC_HATE, npcIds);
+	}
+	
+	/**
+	 * Register onNpcHate trigger for NPC
+	 * @param npcIds
+	 */
+	public void addNpcHateId(Collection<Integer> npcIds)
+	{
+		addEventId(QuestEventType.ON_NPC_HATE, npcIds);
+	}
+	
 	/**
 	 * Use this method to get a random party member from a player's party.<br>
 	 * Useful when distributing rewards after killing an NPC.