Przeglądaj źródła

BETA: Unhardcoding TvTEvent checks and giving ability to plug any other event without messing with the core a lot.

Rumen Nikiforov 12 lat temu
rodzic
commit
3f5b389cb0

+ 1 - 2
L2J_Server_BETA/java/com/l2jserver/gameserver/instancemanager/HandysBlockCheckerManager.java

@@ -27,7 +27,6 @@ import com.l2jserver.Config;
 import com.l2jserver.gameserver.ThreadPoolManager;
 import com.l2jserver.gameserver.model.actor.instance.L2PcInstance;
 import com.l2jserver.gameserver.model.entity.BlockCheckerEngine;
-import com.l2jserver.gameserver.model.entity.TvTEvent;
 import com.l2jserver.gameserver.model.itemcontainer.PcInventory;
 import com.l2jserver.gameserver.model.olympiad.OlympiadManager;
 import com.l2jserver.gameserver.model.zone.ZoneId;
@@ -165,7 +164,7 @@ public final class HandysBlockCheckerManager
 				return false;
 			}
 			
-			if (TvTEvent.isPlayerParticipant(player.getObjectId()) || player.isInOlympiadMode())
+			if (player.isOnEvent() || player.isInOlympiadMode())
 			{
 				player.sendMessage("Couldnt register you due other event participation");
 				return false;

+ 2 - 1
L2J_Server_BETA/java/com/l2jserver/gameserver/model/actor/L2Attackable.java

@@ -2080,8 +2080,9 @@ public class L2Attackable extends L2Npc
 	}
 	
 	/**
-	 * @return True if a Dwarf use Sweep on the L2Attackable and if item can be spoiled.
+	 * @return {@code true} if there is a loot to sweep, {@code false} otherwise.
 	 */
+	@Override
 	public boolean isSweepActive()
 	{
 		return _sweepItems != null;

+ 35 - 0
L2J_Server_BETA/java/com/l2jserver/gameserver/model/actor/L2Character.java

@@ -7861,6 +7861,41 @@ public abstract class L2Character extends L2Object implements ISkillsHolder
 		}
 	}
 	
+	/**
+	 * Dummy method overriden in {@link L2PcInstance}
+	 * @return {@code true} if current player can revive and shows 'To Village' button upon death, {@code false} otherwise.
+	 */
+	public boolean canRevive()
+	{
+		return true;
+	}
+	
+	/**
+	 * Dummy method overriden in {@link L2PcInstance}
+	 * @param val
+	 */
+	public void setCanRevive(boolean val)
+	{
+	}
+	
+	/**
+	 * Dummy method overriden in {@link L2Attackable}
+	 * @return {@code true} if there is a loot to sweep, {@code false} otherwise.
+	 */
+	public boolean isSweepActive()
+	{
+		return false;
+	}
+	
+	/**
+	 * Dummy method overriden in {@link L2PcInstance}
+	 * @return {@code true} if player is on event, {@code false} otherwise.
+	 */
+	public boolean isOnEvent()
+	{
+		return false;
+	}
+	
 	// LISTENERS
 	
 	/**

+ 141 - 40
L2J_Server_BETA/java/com/l2jserver/gameserver/model/actor/instance/L2PcInstance.java

@@ -289,6 +289,7 @@ import com.l2jserver.gameserver.scripting.scriptengine.events.HennaEvent;
 import com.l2jserver.gameserver.scripting.scriptengine.events.ProfessionChangeEvent;
 import com.l2jserver.gameserver.scripting.scriptengine.events.TransformEvent;
 import com.l2jserver.gameserver.scripting.scriptengine.listeners.player.EquipmentListener;
+import com.l2jserver.gameserver.scripting.scriptengine.listeners.player.EventListener;
 import com.l2jserver.gameserver.scripting.scriptengine.listeners.player.HennaListener;
 import com.l2jserver.gameserver.scripting.scriptengine.listeners.player.PlayerDespawnListener;
 import com.l2jserver.gameserver.scripting.scriptengine.listeners.player.ProfessionChangeListener;
@@ -368,13 +369,15 @@ public final class L2PcInstance extends L2Playable
 	public static final int STORE_PRIVATE_MANUFACTURE = 5;
 	public static final int STORE_PRIVATE_PACKAGE_SELL = 8;
 	
-	public static final FastList<PlayerDespawnListener> despawnListeners = new FastList<PlayerDespawnListener>().shared();
-	public static final FastList<HennaListener> hennaListeners = new FastList<HennaListener>().shared();
-	public final FastList<EquipmentListener> equipmentListeners = new FastList<EquipmentListener>().shared();
-	public static final FastList<EquipmentListener> globalEquipmentListeners = new FastList<EquipmentListener>().shared();
-	public final FastList<TransformListener> transformListeners = new FastList<TransformListener>().shared();
-	public final FastList<ProfessionChangeListener> professionChangeListeners = new FastList<ProfessionChangeListener>().shared();
-	public static final FastList<ProfessionChangeListener> globalProfessionChangeListeners = new FastList<ProfessionChangeListener>().shared();
+	private static final List<PlayerDespawnListener> DESPAWN_LISTENERS = new FastList<PlayerDespawnListener>().shared();
+	private static final List<HennaListener> HENNA_LISTENERS = new FastList<HennaListener>().shared();
+	private static final List<EquipmentListener> GLOBAL_EQUIPMENT_LISTENERS = new FastList<EquipmentListener>().shared();
+	private static final List<ProfessionChangeListener> GLOBAL_PROFESSION_CHANGE_LISTENERS = new FastList<ProfessionChangeListener>().shared();
+	
+	private final List<EquipmentListener> _equipmentListeners = new FastList<EquipmentListener>().shared();
+	private final List<TransformListener> _transformListeners = new FastList<TransformListener>().shared();
+	private final List<ProfessionChangeListener> _professionChangeListeners = new FastList<ProfessionChangeListener>().shared();
+	private final List<EventListener> _eventListeners = new FastList<EventListener>().shared();
 	
 	public class AIAccessor extends L2Character.AIAccessor
 	{
@@ -856,6 +859,8 @@ public final class L2PcInstance extends L2Playable
 	/** Map containing all custom skills of this player. */
 	private Map<Integer, L2Skill> _customSkills = null;
 	
+	private boolean _canRevive = true;
+	
 	public void setPvpFlagLasts(long time)
 	{
 		_pvpFlagLasts = time;
@@ -1469,7 +1474,7 @@ public final class L2PcInstance extends L2Playable
 	 */
 	public void logout()
 	{
-		for (PlayerDespawnListener listener : despawnListeners)
+		for (PlayerDespawnListener listener : DESPAWN_LISTENERS)
 		{
 			listener.onDespawn(this);
 		}
@@ -9126,7 +9131,7 @@ public final class L2PcInstance extends L2Playable
 		}
 		
 		// Check if the attacker is in TvT and TvT is started
-		if (TvTEvent.isStarted() && TvTEvent.isPlayerParticipant(getObjectId()))
+		if (isOnEvent())
 		{
 			return true;
 		}
@@ -13872,7 +13877,7 @@ public final class L2PcInstance extends L2Playable
 	
 	public void calculateDeathPenaltyBuffLevel(L2Character killer)
 	{
-		if (((getKarma() > 0) || (Rnd.get(1, 100) <= Config.DEATH_PENALTY_CHANCE)) && !(killer instanceof L2PcInstance) && !(canOverrideCond(PcCondOverride.DEATH_PENALTY)) && !(getCharmOfLuck() && killer.isRaid()) && !isPhoenixBlessed() && !isLucky() && !(TvTEvent.isStarted() && TvTEvent.isPlayerParticipant(getObjectId())) && !(isInsideZone(ZoneId.PVP) || isInsideZone(ZoneId.SIEGE)))
+		if (((getKarma() > 0) || (Rnd.get(1, 100) <= Config.DEATH_PENALTY_CHANCE)) && !(killer instanceof L2PcInstance) && !(canOverrideCond(PcCondOverride.DEATH_PENALTY)) && !(getCharmOfLuck() && killer.isRaid()) && !isPhoenixBlessed() && !isLucky() && !isBlockedFromDeathPenalty() && !(isInsideZone(ZoneId.PVP) || isInsideZone(ZoneId.SIEGE)))
 		{
 			increaseDeathPenaltyBuffLevel();
 		}
@@ -16130,6 +16135,25 @@ public final class L2PcInstance extends L2Playable
 		}
 	}
 	
+	/**
+	 * @return {@code true} if current player can revive and shows 'To Village' button upon death, {@code false} otherwise.
+	 */
+	@Override
+	public boolean canRevive()
+	{
+		return _canRevive;
+	}
+	
+	/**
+	 * This method can prevent from displaying 'To Village' button upon death.
+	 * @param val
+	 */
+	@Override
+	public void setCanRevive(boolean val)
+	{
+		_canRevive = val;
+	}
+	
 	// LISTENERS
 	/**
 	 * Fires all the equipment listeners, if any.<br>
@@ -16145,14 +16169,14 @@ public final class L2PcInstance extends L2Playable
 			EquipmentEvent event = new EquipmentEvent();
 			event.setEquipped(!isEquiped);
 			event.setItem(item);
-			for (EquipmentListener listener : equipmentListeners)
+			for (EquipmentListener listener : _equipmentListeners)
 			{
 				if (!listener.onEquip(event))
 				{
 					return false;
 				}
 			}
-			for (EquipmentListener listener : globalEquipmentListeners)
+			for (EquipmentListener listener : GLOBAL_EQUIPMENT_LISTENERS)
 			{
 				if (!listener.onEquip(event))
 				{
@@ -16172,12 +16196,12 @@ public final class L2PcInstance extends L2Playable
 	 */
 	private boolean fireTransformListeners(L2Transformation transformation, boolean isTransforming)
 	{
-		if ((transformation != null) && !transformListeners.isEmpty())
+		if ((transformation != null) && !_transformListeners.isEmpty())
 		{
 			TransformEvent event = new TransformEvent();
 			event.setTransformation(transformation);
 			event.setTransforming(isTransforming);
-			for (TransformListener listener : transformListeners)
+			for (TransformListener listener : _transformListeners)
 			{
 				if (!listener.onTransform(event))
 				{
@@ -16197,13 +16221,13 @@ public final class L2PcInstance extends L2Playable
 	 */
 	private boolean fireHennaListeners(L2Henna henna, boolean isAdding)
 	{
-		if ((henna != null) && !hennaListeners.isEmpty())
+		if ((henna != null) && !HENNA_LISTENERS.isEmpty())
 		{
 			HennaEvent event = new HennaEvent();
 			event.setAdd(isAdding);
 			event.setHenna(henna);
 			event.setPlayer(this);
-			for (HennaListener listener : hennaListeners)
+			for (HennaListener listener : HENNA_LISTENERS)
 			{
 				if (!listener.onRemoveHenna(event))
 				{
@@ -16220,33 +16244,73 @@ public final class L2PcInstance extends L2Playable
 	 */
 	private void fireProfessionChangeListeners(L2PcTemplate t)
 	{
-		if (!professionChangeListeners.isEmpty() || !globalProfessionChangeListeners.isEmpty())
+		if (!_professionChangeListeners.isEmpty() || !GLOBAL_PROFESSION_CHANGE_LISTENERS.isEmpty())
 		{
 			ProfessionChangeEvent event = null;
 			event = new ProfessionChangeEvent();
 			event.setPlayer(this);
 			event.setSubClass(isSubClassActive());
 			event.setTemplate(t);
-			for (ProfessionChangeListener listener : professionChangeListeners)
+			for (ProfessionChangeListener listener : _professionChangeListeners)
 			{
 				listener.professionChanged(event);
 			}
-			for (ProfessionChangeListener listener : globalProfessionChangeListeners)
+			for (ProfessionChangeListener listener : GLOBAL_PROFESSION_CHANGE_LISTENERS)
 			{
 				listener.professionChanged(event);
 			}
 		}
 	}
 	
+	/**
+	 * @return {@code true} if player is on event, {@code false} otherwise.
+	 */
+	@Override
+	public boolean isOnEvent()
+	{
+		for (EventListener listener : _eventListeners)
+		{
+			if (listener.isOnEvent())
+			{
+				return true;
+			}
+		}
+		return super.isOnEvent();
+	}
+	
+	public boolean isBlockedFromExit()
+	{
+		for (EventListener listener : _eventListeners)
+		{
+			if (listener.isOnEvent() && listener.isBlockingExit())
+			{
+				return true;
+			}
+		}
+		return false;
+	}
+	
+	public boolean isBlockedFromDeathPenalty()
+	{
+		for (EventListener listener : _eventListeners)
+		{
+			if (listener.isOnEvent() && listener.isBlockingDeathPenalty())
+			{
+				return true;
+			}
+		}
+		return false;
+	}
+	
 	/**
 	 * Adds a despawn listener
 	 * @param listener
 	 */
 	public static void addDespawnListener(PlayerDespawnListener listener)
 	{
-		if (!despawnListeners.contains(listener))
+		if (!DESPAWN_LISTENERS.contains(listener))
 		{
-			despawnListeners.add(listener);
+			DESPAWN_LISTENERS.add(listener);
 		}
 	}
 	
@@ -16256,7 +16320,7 @@ public final class L2PcInstance extends L2Playable
 	 */
 	public static void removeDespawnListener(PlayerDespawnListener listener)
 	{
-		despawnListeners.remove(listener);
+		DESPAWN_LISTENERS.remove(listener);
 	}
 	
 	/**
@@ -16265,9 +16329,9 @@ public final class L2PcInstance extends L2Playable
 	 */
 	public static void addHennaListener(HennaListener listener)
 	{
-		if (!hennaListeners.contains(listener))
+		if (!HENNA_LISTENERS.contains(listener))
 		{
-			hennaListeners.add(listener);
+			HENNA_LISTENERS.add(listener);
 		}
 	}
 	
@@ -16277,7 +16341,7 @@ public final class L2PcInstance extends L2Playable
 	 */
 	public static void removeHennaListener(HennaListener listener)
 	{
-		hennaListeners.remove(listener);
+		HENNA_LISTENERS.remove(listener);
 	}
 	
 	/**
@@ -16286,9 +16350,9 @@ public final class L2PcInstance extends L2Playable
 	 */
 	public void addEquipmentListener(EquipmentListener listener)
 	{
-		if (!equipmentListeners.contains(listener))
+		if (!_equipmentListeners.contains(listener))
 		{
-			equipmentListeners.add(listener);
+			_equipmentListeners.add(listener);
 		}
 	}
 	
@@ -16298,7 +16362,7 @@ public final class L2PcInstance extends L2Playable
 	 */
 	public void removeEquipmentListener(EquipmentListener listener)
 	{
-		equipmentListeners.remove(listener);
+		_equipmentListeners.remove(listener);
 	}
 	
 	/**
@@ -16307,9 +16371,9 @@ public final class L2PcInstance extends L2Playable
 	 */
 	public static void addGlobalEquipmentListener(EquipmentListener listener)
 	{
-		if (!globalEquipmentListeners.contains(listener))
+		if (!GLOBAL_EQUIPMENT_LISTENERS.contains(listener))
 		{
-			globalEquipmentListeners.add(listener);
+			GLOBAL_EQUIPMENT_LISTENERS.add(listener);
 		}
 	}
 	
@@ -16319,7 +16383,7 @@ public final class L2PcInstance extends L2Playable
 	 */
 	public static void removeGlobalEquipmentListener(EquipmentListener listener)
 	{
-		globalEquipmentListeners.remove(listener);
+		GLOBAL_EQUIPMENT_LISTENERS.remove(listener);
 	}
 	
 	/**
@@ -16328,9 +16392,9 @@ public final class L2PcInstance extends L2Playable
 	 */
 	public void addTransformListener(TransformListener listener)
 	{
-		if (!transformListeners.contains(listener))
+		if (!_transformListeners.contains(listener))
 		{
-			transformListeners.add(listener);
+			_transformListeners.add(listener);
 		}
 	}
 	
@@ -16340,7 +16404,7 @@ public final class L2PcInstance extends L2Playable
 	 */
 	public void removeTransformListener(TransformListener listener)
 	{
-		transformListeners.remove(listener);
+		_transformListeners.remove(listener);
 	}
 	
 	/**
@@ -16349,9 +16413,9 @@ public final class L2PcInstance extends L2Playable
 	 */
 	public void addProfessionChangeListener(ProfessionChangeListener listener)
 	{
-		if (!professionChangeListeners.contains(listener))
+		if (!_professionChangeListeners.contains(listener))
 		{
-			professionChangeListeners.add(listener);
+			_professionChangeListeners.add(listener);
 		}
 	}
 	
@@ -16361,7 +16425,7 @@ public final class L2PcInstance extends L2Playable
 	 */
 	public void removeProfessionChangeListener(ProfessionChangeListener listener)
 	{
-		professionChangeListeners.remove(listener);
+		_professionChangeListeners.remove(listener);
 	}
 	
 	/**
@@ -16370,9 +16434,9 @@ public final class L2PcInstance extends L2Playable
 	 */
 	public static void addGlobalProfessionChangeListener(ProfessionChangeListener listener)
 	{
-		if (!globalProfessionChangeListeners.contains(listener))
+		if (!GLOBAL_PROFESSION_CHANGE_LISTENERS.contains(listener))
 		{
-			globalProfessionChangeListeners.add(listener);
+			GLOBAL_PROFESSION_CHANGE_LISTENERS.add(listener);
 		}
 	}
 	
@@ -16382,6 +16446,43 @@ public final class L2PcInstance extends L2Playable
 	 */
 	public static void removeGlobalProfessionChangeListener(ProfessionChangeListener listener)
 	{
-		globalProfessionChangeListeners.remove(listener);
+		GLOBAL_PROFESSION_CHANGE_LISTENERS.remove(listener);
+	}
+	
+	/**
+	 * Adds a event listener.
+	 * @param listener
+	 */
+	public void addEventListener(EventListener listener)
+	{
+		_eventListeners.add(listener);
+	}
+	
+	/**
+	 * Removes event listener
+	 * @param listener
+	 */
+	public void removeEventListener(EventListener listener)
+	{
+		_eventListeners.remove(listener);
+	}
+	
+	public void removeEventListener(Class<? extends EventListener> clazz)
+	{
+		final Iterator<EventListener> it = _eventListeners.iterator();
+		EventListener event;
+		while (it.hasNext())
+		{
+			event = it.next();
+			if (event.getClass() == clazz)
+			{
+				it.remove();
+			}
+		}
+	}
+	
+	public Collection<EventListener> getEventListeners()
+	{
+		return _eventListeners;
 	}
 }

+ 9 - 1
L2J_Server_BETA/java/com/l2jserver/gameserver/model/entity/TvTEvent.java

@@ -38,6 +38,7 @@ import com.l2jserver.gameserver.datatables.SpawnTable;
 import com.l2jserver.gameserver.instancemanager.AntiFeedManager;
 import com.l2jserver.gameserver.instancemanager.InstanceManager;
 import com.l2jserver.gameserver.model.L2Spawn;
+import com.l2jserver.gameserver.model.L2World;
 import com.l2jserver.gameserver.model.actor.L2Character;
 import com.l2jserver.gameserver.model.actor.L2Npc;
 import com.l2jserver.gameserver.model.actor.L2Summon;
@@ -490,7 +491,7 @@ public class TvTEvent
 		{
 			teamId = (byte) (_teams[0].getParticipatedPlayerCount() > _teams[1].getParticipatedPlayerCount() ? 1 : 0);
 		}
-		
+		playerInstance.addEventListener(new TvTEventListener(playerInstance));
 		return _teams[teamId].addPlayer(playerInstance);
 	}
 	
@@ -512,6 +513,13 @@ public class TvTEvent
 		{
 			// Remove the player from team
 			_teams[teamId].removePlayer(playerObjectId);
+			
+			final L2PcInstance player = L2World.getInstance().getPlayer(playerObjectId);
+			if (player != null)
+			{
+				player.removeEventListener(TvTEventListener.class);
+			}
+			
 			return true;
 		}
 		

+ 65 - 0
L2J_Server_BETA/java/com/l2jserver/gameserver/model/entity/TvTEventListener.java

@@ -0,0 +1,65 @@
+/*
+ * 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.entity;
+
+import com.l2jserver.gameserver.model.actor.instance.L2PcInstance;
+import com.l2jserver.gameserver.scripting.scriptengine.listeners.player.EventListener;
+
+/**
+ * @author UnAfraid
+ */
+public final class TvTEventListener extends EventListener
+{
+	protected TvTEventListener(L2PcInstance player)
+	{
+		super(player);
+	}
+	
+	@Override
+	public void register()
+	{
+		super.register();
+		player.setCanRevive(false);
+	}
+	
+	@Override
+	public void unregister()
+	{
+		super.unregister();
+		player.setCanRevive(true);
+	}
+	
+	@Override
+	public boolean isOnEvent()
+	{
+		return TvTEvent.isStarted() && TvTEvent.isPlayerParticipant(player.getObjectId());
+	}
+	
+	@Override
+	public boolean isBlockingExit()
+	{
+		return true;
+	}
+	
+	@Override
+	public boolean isBlockingDeathPenalty()
+	{
+		return true;
+	}
+}

+ 1 - 2
L2J_Server_BETA/java/com/l2jserver/gameserver/model/olympiad/OlympiadManager.java

@@ -32,7 +32,6 @@ import com.l2jserver.gameserver.model.L2Party;
 import com.l2jserver.gameserver.model.L2World;
 import com.l2jserver.gameserver.model.StatsSet;
 import com.l2jserver.gameserver.model.actor.instance.L2PcInstance;
-import com.l2jserver.gameserver.model.entity.TvTEvent;
 import com.l2jserver.gameserver.network.SystemMessageId;
 import com.l2jserver.gameserver.network.serverpackets.NpcHtmlMessage;
 import com.l2jserver.gameserver.network.serverpackets.SystemMessage;
@@ -491,7 +490,7 @@ public class OlympiadManager
 		}
 		
 		final int charId = noble.getObjectId();
-		if (TvTEvent.isPlayerParticipant(charId))
+		if (noble.isOnEvent())
 		{
 			player.sendMessage("You can't join olympiad while participating on TvT Event.");
 			return false;

+ 1 - 2
L2J_Server_BETA/java/com/l2jserver/gameserver/network/L2GameClient.java

@@ -51,7 +51,6 @@ import com.l2jserver.gameserver.model.L2World;
 import com.l2jserver.gameserver.model.PcCondOverride;
 import com.l2jserver.gameserver.model.actor.instance.L2PcInstance;
 import com.l2jserver.gameserver.model.entity.L2Event;
-import com.l2jserver.gameserver.model.entity.TvTEvent;
 import com.l2jserver.gameserver.model.zone.ZoneId;
 import com.l2jserver.gameserver.network.serverpackets.ActionFailed;
 import com.l2jserver.gameserver.network.serverpackets.L2GameServerPacket;
@@ -800,7 +799,7 @@ public final class L2GameClient extends MMOClient<MMOConnection<L2GameClient>> i
 	protected boolean offlineMode(L2PcInstance player)
 	{
 		boolean canSetShop = false;
-		if (player.isInOlympiadMode() || player.isFestivalParticipant() || TvTEvent.isPlayerParticipant(player.getObjectId()) || player.isInJail() || (player.getVehicle() != null))
+		if (player.isInOlympiadMode() || player.isFestivalParticipant() || player.isBlockedFromExit() || player.isInJail() || (player.getVehicle() != null))
 		{
 			return false;
 		}

+ 6 - 0
L2J_Server_BETA/java/com/l2jserver/gameserver/network/clientpackets/RequestRestart.java

@@ -116,6 +116,12 @@ public final class RequestRestart extends L2GameClientPacket
 			}
 		}
 		
+		if (player.isBlockedFromExit())
+		{
+			sendPacket(RestartResponse.valueOf(false));
+			return;
+		}
+		
 		for (PlayerDespawnListener listener : despawnListeners)
 		{
 			listener.onDespawn(player);

+ 1 - 2
L2J_Server_BETA/java/com/l2jserver/gameserver/network/clientpackets/RequestRestartPoint.java

@@ -32,7 +32,6 @@ import com.l2jserver.gameserver.model.actor.instance.L2SiegeFlagInstance;
 import com.l2jserver.gameserver.model.entity.Castle;
 import com.l2jserver.gameserver.model.entity.ClanHall;
 import com.l2jserver.gameserver.model.entity.Fort;
-import com.l2jserver.gameserver.model.entity.TvTEvent;
 import com.l2jserver.gameserver.model.entity.clanhall.SiegableHall;
 
 /**
@@ -78,7 +77,7 @@ public final class RequestRestartPoint extends L2GameClientPacket
 			return;
 		}
 		
-		if (TvTEvent.isStarted() && TvTEvent.isPlayerParticipant(activeChar.getObjectId()))
+		if (!activeChar.canRevive())
 		{
 			return;
 		}

+ 5 - 14
L2J_Server_BETA/java/com/l2jserver/gameserver/network/serverpackets/Die.java

@@ -26,45 +26,36 @@ import com.l2jserver.gameserver.instancemanager.TerritoryWarManager;
 import com.l2jserver.gameserver.model.L2AccessLevel;
 import com.l2jserver.gameserver.model.L2Clan;
 import com.l2jserver.gameserver.model.L2SiegeClan;
-import com.l2jserver.gameserver.model.actor.L2Attackable;
 import com.l2jserver.gameserver.model.actor.L2Character;
 import com.l2jserver.gameserver.model.actor.instance.L2PcInstance;
 import com.l2jserver.gameserver.model.entity.Castle;
 import com.l2jserver.gameserver.model.entity.Fort;
-import com.l2jserver.gameserver.model.entity.TvTEvent;
 import com.l2jserver.gameserver.model.entity.clanhall.SiegableHall;
 
 public class Die extends L2GameServerPacket
 {
 	private final int _charObjId;
 	private final boolean _canTeleport;
-	private boolean _sweepable;
+	private final boolean _sweepable;
 	private L2AccessLevel _access = AdminTable.getInstance().getAccessLevel(0);
 	private L2Clan _clan;
 	private final L2Character _activeChar;
 	private boolean _isJailed;
 	
-	/**
-	 * @param cha
-	 */
 	public Die(L2Character cha)
 	{
+		_charObjId = cha.getObjectId();
 		_activeChar = cha;
 		if (cha.isPlayer())
 		{
-			L2PcInstance player = (L2PcInstance) cha;
+			final L2PcInstance player = cha.getActingPlayer();
 			_access = player.getAccessLevel();
 			_clan = player.getClan();
 			_isJailed = player.isInJail();
-			
-		}
-		_charObjId = cha.getObjectId();
-		_canTeleport = !((cha.isPlayer() && TvTEvent.isStarted() && TvTEvent.isPlayerParticipant(_charObjId)) || cha.isPendingRevive());
-		if (cha.isL2Attackable())
-		{
-			_sweepable = ((L2Attackable) cha).isSweepActive();
 		}
 		
+		_canTeleport = cha.canRevive() && !cha.isPendingRevive();
+		_sweepable = cha.isL2Attackable() && cha.isSweepActive();
 	}
 	
 	@Override

+ 67 - 0
L2J_Server_BETA/java/com/l2jserver/gameserver/scripting/scriptengine/listeners/player/EventListener.java

@@ -0,0 +1,67 @@
+/*
+ * 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.scripting.scriptengine.listeners.player;
+
+import com.l2jserver.gameserver.model.actor.instance.L2PcInstance;
+import com.l2jserver.gameserver.scripting.scriptengine.impl.L2JListener;
+
+/**
+ * @author UnAfraid
+ */
+public abstract class EventListener extends L2JListener
+{
+	public EventListener(L2PcInstance player)
+	{
+		super.player = player;
+		register();
+	}
+	
+	/**
+	 * @return {@code true} if player is on event, {@code false} otherwise.
+	 */
+	public abstract boolean isOnEvent();
+	
+	/**
+	 * @return {@code true} if player is blocked from leaving the game, {@code false} otherwise.
+	 */
+	public abstract boolean isBlockingExit();
+	
+	/**
+	 * @return {@code true} if player is blocked from receiving death penalty upon death, {@code false} otherwise.
+	 */
+	public abstract boolean isBlockingDeathPenalty();
+	
+	@Override
+	public void register()
+	{
+		if (player != null)
+		{
+			player.addEventListener(this);
+		}
+	}
+	
+	@Override
+	public void unregister()
+	{
+		if (player != null)
+		{
+			player.removeEventListener(this);
+		}
+	}
+}