Переглянути джерело

BETA: Few edited/added listeners.
* Added {{{OnCreatureAttacked}}}.
* Splitted {{{OnCreatureDamage}}} to {{{OnCreatureDamageReceived}}} and {{{OnCreatureDamageDealt}}}.
* Added {{{OnPlayerSummonTalk}}}.
* Added util method to unregister listener.

Patch by: !UnAfraid, St3eT

St3eT 11 роки тому
батько
коміт
05b63aa3ac

+ 21 - 3
L2J_Server_BETA/java/com/l2jserver/gameserver/model/actor/L2Character.java

@@ -91,7 +91,9 @@ import com.l2jserver.gameserver.model.entity.Instance;
 import com.l2jserver.gameserver.model.events.EventDispatcher;
 import com.l2jserver.gameserver.model.events.EventType;
 import com.l2jserver.gameserver.model.events.impl.character.OnCreatureAttack;
-import com.l2jserver.gameserver.model.events.impl.character.OnCreatureDamage;
+import com.l2jserver.gameserver.model.events.impl.character.OnCreatureAttacked;
+import com.l2jserver.gameserver.model.events.impl.character.OnCreatureDamageDealt;
+import com.l2jserver.gameserver.model.events.impl.character.OnCreatureDamageReceived;
 import com.l2jserver.gameserver.model.events.impl.character.OnCreatureKill;
 import com.l2jserver.gameserver.model.events.impl.character.OnCreatureSkillUse;
 import com.l2jserver.gameserver.model.events.impl.character.OnCreatureTeleported;
@@ -843,7 +845,22 @@ public abstract class L2Character extends L2Object implements ISkillsHolder, IDe
 			}
 			
 			// Notify to scripts
-			EventDispatcher.getInstance().notifyEventAsync(new OnCreatureAttack(this, target), this);
+			final TerminateReturn attackReturn = EventDispatcher.getInstance().notifyEvent(new OnCreatureAttack(this, target), this, TerminateReturn.class);
+			if ((attackReturn != null) && attackReturn.terminate())
+			{
+				getAI().setIntention(CtrlIntention.AI_INTENTION_ACTIVE);
+				sendPacket(ActionFailed.STATIC_PACKET);
+				return;
+			}
+			
+			// Notify to scripts
+			final TerminateReturn attackedReturn = EventDispatcher.getInstance().notifyEvent(new OnCreatureAttacked(this, target), target, TerminateReturn.class);
+			if ((attackedReturn != null) && attackedReturn.terminate())
+			{
+				getAI().setIntention(CtrlIntention.AI_INTENTION_ACTIVE);
+				sendPacket(ActionFailed.STATIC_PACKET);
+				return;
+			}
 			
 			if (!isAlikeDead())
 			{
@@ -6952,7 +6969,8 @@ public abstract class L2Character extends L2Object implements ISkillsHolder, IDe
 	 */
 	public void notifyDamageReceived(double damage, L2Character attacker, Skill skill, boolean critical, boolean damageOverTime)
 	{
-		EventDispatcher.getInstance().notifyEventAsync(new OnCreatureDamage(attacker, this, damage, skill, critical, damageOverTime), this, attacker);
+		EventDispatcher.getInstance().notifyEventAsync(new OnCreatureDamageReceived(attacker, this, damage, skill, critical, damageOverTime), this);
+		EventDispatcher.getInstance().notifyEventAsync(new OnCreatureDamageDealt(attacker, this, damage, skill, critical, damageOverTime), attacker);
 	}
 	
 	/**

+ 60 - 0
L2J_Server_BETA/java/com/l2jserver/gameserver/model/entity/TvTEventPlayer.java

@@ -0,0 +1,60 @@
+/*
+ * Copyright (C) 2004-2014 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.entity;
+
+import com.l2jserver.gameserver.model.actor.instance.L2PcInstance;
+
+/**
+ * @author UnAfraid
+ */
+public class TvTEventPlayer
+{
+	private final L2PcInstance _player;
+	
+	protected TvTEventPlayer(L2PcInstance player)
+	{
+		_player = player;
+		
+	}
+	
+	public boolean isOnEvent()
+	{
+		return TvTEvent.isStarted() && TvTEvent.isPlayerParticipant(getPlayer().getObjectId());
+	}
+	
+	public boolean isBlockingExit()
+	{
+		return true;
+	}
+	
+	public boolean isBlockingDeathPenalty()
+	{
+		return true;
+	}
+	
+	public boolean canRevive()
+	{
+		return false;
+	}
+	
+	public L2PcInstance getPlayer()
+	{
+		return _player;
+	}
+}

+ 25 - 0
L2J_Server_BETA/java/com/l2jserver/gameserver/model/events/AbstractScript.java

@@ -90,6 +90,7 @@ import com.l2jserver.gameserver.model.events.impl.character.player.OnPlayerLogou
 import com.l2jserver.gameserver.model.events.impl.character.player.OnPlayerProfessionChange;
 import com.l2jserver.gameserver.model.events.impl.character.player.OnPlayerSkillLearn;
 import com.l2jserver.gameserver.model.events.impl.character.player.OnPlayerSummonSpawn;
+import com.l2jserver.gameserver.model.events.impl.character.player.OnPlayerSummonTalk;
 import com.l2jserver.gameserver.model.events.impl.character.trap.OnTrapAction;
 import com.l2jserver.gameserver.model.events.impl.item.OnItemBypassEvent;
 import com.l2jserver.gameserver.model.events.impl.item.OnItemTalk;
@@ -828,6 +829,30 @@ public abstract class AbstractScript extends ManagedScript
 	
 	// ---------------------------------------------------------------------------------------------------------------------------
 	
+	/**
+	 * Provides instant callback operation when {@link L2PcInstance} talk with a servitor or a pet
+	 * @param callback
+	 * @param npcIds
+	 * @return
+	 */
+	protected final List<AbstractEventListener> setPlayerSummonTalkId(Consumer<OnPlayerSummonTalk> callback, int... npcIds)
+	{
+		return registerConsumer(callback, EventType.ON_PLAYER_SUMMON_TALK, ListenerRegisterType.NPC, npcIds);
+	}
+	
+	/**
+	 * Provides instant callback operation when {@link L2PcInstance} talk with a servitor or a pet
+	 * @param callback
+	 * @param npcIds
+	 * @return
+	 */
+	protected final List<AbstractEventListener> setPlayerSummonTalkId(Consumer<OnPlayerSummonSpawn> callback, Collection<Integer> npcIds)
+	{
+		return registerConsumer(callback, EventType.ON_PLAYER_SUMMON_TALK, ListenerRegisterType.NPC, npcIds);
+	}
+	
+	// ---------------------------------------------------------------------------------------------------------------------------
+	
 	/**
 	 * Provides instant callback operation when {@link L2PcInstance} summons a servitor or a pet
 	 * @param callback

+ 8 - 2
L2J_Server_BETA/java/com/l2jserver/gameserver/model/events/EventType.java

@@ -20,7 +20,9 @@ package com.l2jserver.gameserver.model.events;
 
 import com.l2jserver.gameserver.model.events.impl.IBaseEvent;
 import com.l2jserver.gameserver.model.events.impl.character.OnCreatureAttack;
-import com.l2jserver.gameserver.model.events.impl.character.OnCreatureDamage;
+import com.l2jserver.gameserver.model.events.impl.character.OnCreatureAttacked;
+import com.l2jserver.gameserver.model.events.impl.character.OnCreatureDamageDealt;
+import com.l2jserver.gameserver.model.events.impl.character.OnCreatureDamageReceived;
 import com.l2jserver.gameserver.model.events.impl.character.OnCreatureKill;
 import com.l2jserver.gameserver.model.events.impl.character.OnCreatureSkillUse;
 import com.l2jserver.gameserver.model.events.impl.character.OnCreatureTeleported;
@@ -64,6 +66,7 @@ import com.l2jserver.gameserver.model.events.impl.character.player.OnPlayerResto
 import com.l2jserver.gameserver.model.events.impl.character.player.OnPlayerSelect;
 import com.l2jserver.gameserver.model.events.impl.character.player.OnPlayerSkillLearn;
 import com.l2jserver.gameserver.model.events.impl.character.player.OnPlayerSummonSpawn;
+import com.l2jserver.gameserver.model.events.impl.character.player.OnPlayerSummonTalk;
 import com.l2jserver.gameserver.model.events.impl.character.player.OnPlayerTransform;
 import com.l2jserver.gameserver.model.events.impl.character.player.clan.OnPlayerClanCreate;
 import com.l2jserver.gameserver.model.events.impl.character.player.clan.OnPlayerClanDestroy;
@@ -121,7 +124,9 @@ public enum EventType
 	
 	// Creature events
 	ON_CREATURE_ATTACK(OnCreatureAttack.class, void.class, TerminateReturn.class),
-	ON_CREATURE_DAMAGE(OnCreatureDamage.class, void.class, TerminateReturn.class),
+	ON_CREATURE_ATTACKED(OnCreatureAttacked.class, void.class, TerminateReturn.class),
+	ON_CREATURE_DAMAGE_RECEIVED(OnCreatureDamageReceived.class, void.class),
+	ON_CREATURE_DAMAGE_DEALT(OnCreatureDamageDealt.class, void.class),
 	ON_CREATURE_KILL(OnCreatureKill.class, void.class, TerminateReturn.class),
 	ON_CREATURE_SKILL_USE(OnCreatureSkillUse.class, void.class, TerminateReturn.class),
 	ON_CREATURE_TELEPORTED(OnCreatureTeleported.class, void.class),
@@ -200,6 +205,7 @@ public enum EventType
 	ON_PLAYER_SELECT(OnPlayerSelect.class, void.class),
 	ON_PLAYER_SKILL_LEARN(OnPlayerSkillLearn.class, void.class),
 	ON_PLAYER_SUMMON_SPAWN(OnPlayerSummonSpawn.class, void.class),
+	ON_PLAYER_SUMMON_TALK(OnPlayerSummonTalk.class, void.class),
 	ON_PLAYER_TRANSFORM(OnPlayerTransform.class, void.class),
 	
 	// Trap events

+ 14 - 0
L2J_Server_BETA/java/com/l2jserver/gameserver/model/events/ListenersContainer.java

@@ -22,6 +22,7 @@ import java.util.Map;
 import java.util.Queue;
 import java.util.concurrent.ConcurrentHashMap;
 import java.util.concurrent.PriorityBlockingQueue;
+import java.util.function.Predicate;
 
 import com.l2jserver.gameserver.model.events.listeners.AbstractEventListener;
 import com.l2jserver.util.EmptyQueue;
@@ -81,6 +82,19 @@ public class ListenersContainer
 		return (_listeners != null) && _listeners.containsKey(type) ? _listeners.get(type) : EmptyQueue.emptyQueue();
 	}
 	
+	public void removeListenerIf(EventType type, Predicate<? super AbstractEventListener> filter)
+	{
+		getListeners(type).stream().filter(filter).forEach(AbstractEventListener::unregisterMe);
+	}
+	
+	public void removeListenerIf(Predicate<? super AbstractEventListener> filter)
+	{
+		if (_listeners != null)
+		{
+			getListeners().values().forEach(queue -> queue.stream().filter(filter).forEach(AbstractEventListener::unregisterMe));
+		}
+	}
+	
 	public boolean hasListener(EventType type)
 	{
 		return !getListeners(type).isEmpty();

+ 55 - 0
L2J_Server_BETA/java/com/l2jserver/gameserver/model/events/impl/character/OnCreatureAttacked.java

@@ -0,0 +1,55 @@
+/*
+ * 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.events.impl.character;
+
+import com.l2jserver.gameserver.model.actor.L2Character;
+import com.l2jserver.gameserver.model.events.EventType;
+import com.l2jserver.gameserver.model.events.impl.IBaseEvent;
+
+/**
+ * An instantly executed event when L2Character is attacked by L2Character.
+ * @author UnAfraid
+ */
+public class OnCreatureAttacked implements IBaseEvent
+{
+	private final L2Character _attacker;
+	private final L2Character _target;
+	
+	public OnCreatureAttacked(L2Character attacker, L2Character target)
+	{
+		_attacker = attacker;
+		_target = target;
+	}
+	
+	public final L2Character getAttacker()
+	{
+		return _attacker;
+	}
+	
+	public final L2Character getTarget()
+	{
+		return _target;
+	}
+	
+	@Override
+	public EventType getType()
+	{
+		return EventType.ON_CREATURE_ATTACKED;
+	}
+}

+ 3 - 3
L2J_Server_BETA/java/com/l2jserver/gameserver/model/events/impl/character/OnCreatureDamage.java → L2J_Server_BETA/java/com/l2jserver/gameserver/model/events/impl/character/OnCreatureDamageDealt.java

@@ -27,7 +27,7 @@ import com.l2jserver.gameserver.model.skills.Skill;
  * An instantly executed event when L2Character is attacked by L2Character.
  * @author UnAfraid
  */
-public class OnCreatureDamage implements IBaseEvent
+public class OnCreatureDamageDealt implements IBaseEvent
 {
 	private final L2Character _attacker;
 	private final L2Character _target;
@@ -36,7 +36,7 @@ public class OnCreatureDamage implements IBaseEvent
 	private final boolean _crit;
 	private final boolean _damageOverTime;
 	
-	public OnCreatureDamage(L2Character attacker, L2Character target, double damage, Skill skill, boolean crit, boolean damageOverTime)
+	public OnCreatureDamageDealt(L2Character attacker, L2Character target, double damage, Skill skill, boolean crit, boolean damageOverTime)
 	{
 		_attacker = attacker;
 		_target = target;
@@ -79,6 +79,6 @@ public class OnCreatureDamage implements IBaseEvent
 	@Override
 	public EventType getType()
 	{
-		return EventType.ON_CREATURE_DAMAGE;
+		return EventType.ON_CREATURE_DAMAGE_DEALT;
 	}
 }

+ 84 - 0
L2J_Server_BETA/java/com/l2jserver/gameserver/model/events/impl/character/OnCreatureDamageReceived.java

@@ -0,0 +1,84 @@
+/*
+ * 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.events.impl.character;
+
+import com.l2jserver.gameserver.model.actor.L2Character;
+import com.l2jserver.gameserver.model.events.EventType;
+import com.l2jserver.gameserver.model.events.impl.IBaseEvent;
+import com.l2jserver.gameserver.model.skills.Skill;
+
+/**
+ * An instantly executed event when L2Character is attacked by L2Character.
+ * @author UnAfraid
+ */
+public class OnCreatureDamageReceived implements IBaseEvent
+{
+	private final L2Character _attacker;
+	private final L2Character _target;
+	private final double _damage;
+	private final Skill _skill;
+	private final boolean _crit;
+	private final boolean _damageOverTime;
+	
+	public OnCreatureDamageReceived(L2Character attacker, L2Character target, double damage, Skill skill, boolean crit, boolean damageOverTime)
+	{
+		_attacker = attacker;
+		_target = target;
+		_damage = damage;
+		_skill = skill;
+		_crit = crit;
+		_damageOverTime = damageOverTime;
+	}
+	
+	public final L2Character getAttacker()
+	{
+		return _attacker;
+	}
+	
+	public final L2Character getTarget()
+	{
+		return _target;
+	}
+	
+	public double getDamage()
+	{
+		return _damage;
+	}
+	
+	public Skill getSkill()
+	{
+		return _skill;
+	}
+	
+	public boolean isCritical()
+	{
+		return _crit;
+	}
+	
+	public boolean isDamageOverTime()
+	{
+		return _damageOverTime;
+	}
+	
+	@Override
+	public EventType getType()
+	{
+		return EventType.ON_CREATURE_DAMAGE_RECEIVED;
+	}
+}

+ 47 - 0
L2J_Server_BETA/java/com/l2jserver/gameserver/model/events/impl/character/player/OnPlayerSummonTalk.java

@@ -0,0 +1,47 @@
+/*
+ * Copyright (C) 2004-2014 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.events.impl.character.player;
+
+import com.l2jserver.gameserver.model.actor.L2Summon;
+import com.l2jserver.gameserver.model.events.EventType;
+import com.l2jserver.gameserver.model.events.impl.IBaseEvent;
+
+/**
+ * @author St3eT
+ */
+public class OnPlayerSummonTalk implements IBaseEvent
+{
+	private final L2Summon _summon;
+	
+	public OnPlayerSummonTalk(L2Summon summon)
+	{
+		_summon = summon;
+	}
+	
+	public L2Summon getSummon()
+	{
+		return _summon;
+	}
+	
+	@Override
+	public EventType getType()
+	{
+		return EventType.ON_PLAYER_SUMMON_TALK;
+	}
+}

+ 34 - 14
L2J_Server_BETA/java/com/l2jserver/gameserver/model/quest/Quest.java

@@ -1320,7 +1320,15 @@ public class Quest extends AbstractScript implements IIdentifiable
 	/**
 	 * @param summon
 	 */
-	public void onSummon(L2Summon summon)
+	public void onSummonSpawn(L2Summon summon)
+	{
+		
+	}
+	
+	/**
+	 * @param summon
+	 */
+	public void onSummonTalk(L2Summon summon)
 	{
 		
 	}
@@ -2152,21 +2160,39 @@ public class Quest extends AbstractScript implements IIdentifiable
 	}
 	
 	/**
-	 * Register onSummon trigger when summon is spawned.
+	 * Register onSummonSpawn trigger when summon is spawned.
 	 * @param npcIds
 	 */
-	public void addSummonId(int... npcIds)
+	public void addSummonSpawnId(int... npcIds)
 	{
-		setPlayerSummonSpawnId(event -> onSummon(event.getSummon()), npcIds);
+		setPlayerSummonSpawnId(event -> onSummonSpawn(event.getSummon()), npcIds);
 	}
 	
 	/**
-	 * Register onSummon trigger when summon is spawned.
+	 * Register onSummonSpawn trigger when summon is spawned.
 	 * @param npcIds
 	 */
-	public void addSummonId(Collection<Integer> npcIds)
+	public void addSummonSpawnId(Collection<Integer> npcIds)
 	{
-		setPlayerSummonSpawnId(event -> onSummon(event.getSummon()), npcIds);
+		setPlayerSummonSpawnId(event -> onSummonSpawn(event.getSummon()), npcIds);
+	}
+	
+	/**
+	 * Register onSummonTalk trigger when master talked to summon.
+	 * @param npcIds
+	 */
+	public void addSummonTalkId(int... npcIds)
+	{
+		setPlayerSummonTalkId(event -> onSummonTalk(event.getSummon()), npcIds);
+	}
+	
+	/**
+	 * Register onSummonTalk trigger when summon is spawned.
+	 * @param npcIds
+	 */
+	public void addSummonTalkId(Collection<Integer> npcIds)
+	{
+		setPlayerSummonTalkId(event -> onSummonTalk(event.getSummon()), npcIds);
 	}
 	
 	/**
@@ -2680,13 +2706,7 @@ public class Quest extends AbstractScript implements IIdentifiable
 		}
 		else
 		{
-			for (AbstractEventListener listener : getListeners())
-			{
-				if (listener.getType() == EventType.ON_PLAYER_LOGIN)
-				{
-					listener.unregisterMe();
-				}
-			}
+			getListeners().stream().filter(listener -> listener.getType() == EventType.ON_PLAYER_LOGIN).forEach(AbstractEventListener::unregisterMe);
 		}
 	}