소스 검색

BETA: Support for ejecting players upon death inside instance zones.
* Overridable from XML templates.
* Configurable in Character.properties.
* Default retail time 60 seconds.
* Removed custom message when ejecting players.
* Minor source format.

Zoey76 12 년 전
부모
커밋
e7ac41a547

+ 5 - 0
L2J_Server_BETA/dist/game/config/Character.properties

@@ -704,6 +704,11 @@ RestorePlayerInstance = False
 # Default: ?
 AllowSummonToInstance = True
 
+# When a player dies, is removed from instance after a fixed period of time.
+# Time in seconds.
+# Default: 60
+EjectDeadPlayerTime = 60
+
 # This option is to enable or disable the use of in game petitions.
 # The MaxPetitionsPerPlayer is the amount of petitions a player can make.
 # The MaximumPendingPetitions is the total amount of petitions in the server.

+ 2 - 0
L2J_Server_BETA/java/com/l2jserver/Config.java

@@ -236,6 +236,7 @@ public final class Config
 	public static int MAX_OFFSET_ON_TELEPORT;
 	public static boolean RESTORE_PLAYER_INSTANCE;
 	public static boolean ALLOW_SUMMON_TO_INSTANCE;
+	public static int EJECT_DEAD_PLAYER_TIME;
 	public static boolean PETITIONING_ALLOWED;
 	public static int MAX_PETITIONS_PER_PLAYER;
 	public static int MAX_PETITIONS_PENDING;
@@ -1703,6 +1704,7 @@ public final class Config
 			MAX_OFFSET_ON_TELEPORT = Integer.parseInt(Character.getProperty("MaxOffsetOnTeleport", "50"));
 			RESTORE_PLAYER_INSTANCE = Boolean.parseBoolean(Character.getProperty("RestorePlayerInstance", "False"));
 			ALLOW_SUMMON_TO_INSTANCE = Boolean.parseBoolean(Character.getProperty("AllowSummonToInstance", "True"));
+			EJECT_DEAD_PLAYER_TIME = 1000 * Integer.parseInt(Character.getProperty("EjectDeadPlayerTime", "60"));
 			PETITIONING_ALLOWED = Boolean.parseBoolean(Character.getProperty("PetitioningAllowed", "True"));
 			MAX_PETITIONS_PER_PLAYER = Integer.parseInt(Character.getProperty("MaxPetitionsPerPlayer", "5"));
 			MAX_PETITIONS_PENDING = Integer.parseInt(Character.getProperty("MaxPetitionsPending", "25"));

+ 1 - 1
L2J_Server_BETA/java/com/l2jserver/gameserver/model/CharEffectList.java

@@ -34,8 +34,8 @@ import com.l2jserver.gameserver.model.actor.L2Character;
 import com.l2jserver.gameserver.model.actor.L2Playable;
 import com.l2jserver.gameserver.model.actor.L2Summon;
 import com.l2jserver.gameserver.model.actor.instance.L2PcInstance;
-import com.l2jserver.gameserver.model.effects.L2Effect;
 import com.l2jserver.gameserver.model.effects.EffectFlag;
+import com.l2jserver.gameserver.model.effects.L2Effect;
 import com.l2jserver.gameserver.model.effects.L2EffectType;
 import com.l2jserver.gameserver.model.olympiad.OlympiadGameManager;
 import com.l2jserver.gameserver.model.olympiad.OlympiadGameTask;

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

@@ -81,8 +81,8 @@ import com.l2jserver.gameserver.model.actor.status.CharStatus;
 import com.l2jserver.gameserver.model.actor.templates.L2CharTemplate;
 import com.l2jserver.gameserver.model.actor.templates.L2NpcTemplate;
 import com.l2jserver.gameserver.model.effects.AbnormalEffect;
-import com.l2jserver.gameserver.model.effects.L2Effect;
 import com.l2jserver.gameserver.model.effects.EffectFlag;
+import com.l2jserver.gameserver.model.effects.L2Effect;
 import com.l2jserver.gameserver.model.effects.L2EffectType;
 import com.l2jserver.gameserver.model.entity.Instance;
 import com.l2jserver.gameserver.model.holders.SkillHolder;

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

@@ -454,7 +454,7 @@ public class L2Npc extends L2Character
 	
 	/**
 	 * Switches random Animation state into val.
-	 * @param val needed state of random animation	 
+	 * @param val needed state of random animation
 	 */
 	public void setRandomAnimationEnabled(boolean val)
 	{

+ 12 - 1
L2J_Server_BETA/java/com/l2jserver/gameserver/model/actor/L2Playable.java

@@ -19,14 +19,16 @@
 package com.l2jserver.gameserver.model.actor;
 
 import com.l2jserver.gameserver.ai.CtrlEvent;
+import com.l2jserver.gameserver.instancemanager.InstanceManager;
 import com.l2jserver.gameserver.model.actor.instance.L2PcInstance;
 import com.l2jserver.gameserver.model.actor.knownlist.PlayableKnownList;
 import com.l2jserver.gameserver.model.actor.stat.PlayableStat;
 import com.l2jserver.gameserver.model.actor.status.PlayableStatus;
 import com.l2jserver.gameserver.model.actor.templates.L2CharTemplate;
-import com.l2jserver.gameserver.model.effects.L2Effect;
 import com.l2jserver.gameserver.model.effects.EffectFlag;
+import com.l2jserver.gameserver.model.effects.L2Effect;
 import com.l2jserver.gameserver.model.effects.L2EffectType;
+import com.l2jserver.gameserver.model.entity.Instance;
 import com.l2jserver.gameserver.model.quest.QuestState;
 import com.l2jserver.gameserver.model.skills.L2Skill;
 
@@ -171,6 +173,15 @@ public abstract class L2Playable extends L2Character
 				qs.getQuest().notifyDeath((killer == null ? this : killer), this, qs);
 			}
 		}
+		// Notify instance
+		if (getInstanceId() > 0)
+		{
+			final Instance instance = InstanceManager.getInstance().getInstance(getInstanceId());
+			if (instance != null)
+			{
+				instance.notifyDeath(killer, this);
+			}
+		}
 		
 		if (killer != null)
 		{

+ 9 - 1
L2J_Server_BETA/java/com/l2jserver/gameserver/model/actor/instance/L2PcInstance.java

@@ -157,9 +157,9 @@ import com.l2jserver.gameserver.model.base.Race;
 import com.l2jserver.gameserver.model.base.Sex;
 import com.l2jserver.gameserver.model.base.SubClass;
 import com.l2jserver.gameserver.model.effects.AbnormalEffect;
+import com.l2jserver.gameserver.model.effects.EffectFlag;
 import com.l2jserver.gameserver.model.effects.EffectTemplate;
 import com.l2jserver.gameserver.model.effects.L2Effect;
-import com.l2jserver.gameserver.model.effects.EffectFlag;
 import com.l2jserver.gameserver.model.effects.L2EffectType;
 import com.l2jserver.gameserver.model.entity.Castle;
 import com.l2jserver.gameserver.model.entity.Duel;
@@ -11728,6 +11728,14 @@ public final class L2PcInstance extends L2Playable
 				getParty().getDimensionalRift().memberRessurected(this);
 			}
 		}
+		if (getInstanceId() > 0)
+		{
+			final Instance instance = InstanceManager.getInstance().getInstance(getInstanceId());
+			if (instance != null)
+			{
+				instance.cancelEjectDeadPlayer(this);
+			}
+		}
 	}
 	
 	@Override

+ 94 - 11
L2J_Server_BETA/java/com/l2jserver/gameserver/model/entity/Instance.java

@@ -31,6 +31,8 @@ import java.util.logging.Logger;
 
 import javax.xml.parsers.DocumentBuilderFactory;
 
+import javolution.util.FastMap;
+
 import org.w3c.dom.Document;
 import org.w3c.dom.NamedNodeMap;
 import org.w3c.dom.Node;
@@ -50,6 +52,7 @@ import com.l2jserver.gameserver.model.L2WorldRegion;
 import com.l2jserver.gameserver.model.Location;
 import com.l2jserver.gameserver.model.StatsSet;
 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.instance.L2DoorInstance;
 import com.l2jserver.gameserver.model.actor.instance.L2PcInstance;
@@ -67,13 +70,13 @@ import com.l2jserver.util.L2FastMap;
  * Main class for game instances.
  * @author evill33t, GodKratos
  */
-public class Instance
+public final class Instance
 {
 	private static final Logger _log = Logger.getLogger(Instance.class.getName());
 	
 	private final int _id;
 	private String _name;
-	
+	private int _ejectTime = Config.EJECT_DEAD_PLAYER_TIME;
 	private final L2FastList<Integer> _players = new L2FastList<>(true);
 	private final List<L2Npc> _npcs = new L2FastList<>(true);
 	private final Map<Integer, L2DoorInstance> _doors = new L2FastMap<>(true);
@@ -90,6 +93,7 @@ public class Instance
 	private String _timerText = "";
 	
 	protected ScheduledFuture<?> _checkTimeUpTask = null;
+	protected final Map<Integer, ScheduledFuture<?>> _ejectDeadTasks = new FastMap<>();
 	
 	public Instance(int id)
 	{
@@ -125,6 +129,22 @@ public class Instance
 		_name = name;
 	}
 	
+	/**
+	 * @return the eject time
+	 */
+	public int getEjectTime()
+	{
+		return _ejectTime;
+	}
+	
+	/**
+	 * @param ejectTime the player eject time upon death
+	 */
+	public void setEjectTime(int ejectTime)
+	{
+		_ejectTime = ejectTime;
+	}
+	
 	/**
 	 * @return whether summon friend type skills are allowed for this instance
 	 */
@@ -417,11 +437,13 @@ public class Instance
 	{
 		L2Spawn spawnDat;
 		L2NpcTemplate npcTemplate;
-		String name = null;
-		name = n.getAttributes().getNamedItem("name").getNodeValue();
-		setName(name);
+		_name = n.getAttributes().getNamedItem("name").getNodeValue();
+		Node a = n.getAttributes().getNamedItem("ejectTime");
+		if (a != null)
+		{
+			_ejectTime = 1000 * Integer.parseInt(a.getNodeValue());
+		}
 		
-		Node a;
 		Node first = n.getFirstChild();
 		for (n = first; n != null; n = n.getNextSibling())
 		{
@@ -434,16 +456,18 @@ public class Instance
 					_instanceEndTime = System.currentTimeMillis() + (Long.parseLong(a.getNodeValue()) * 60000) + 15000;
 				}
 			}
-			//@formatter:off
-			/*			
- 			else if ("timeDelay".equalsIgnoreCase(n.getNodeName()))
+			// @formatter:off
+			/*
+			else if ("timeDelay".equalsIgnoreCase(n.getNodeName()))
 			{
 				a = n.getAttributes().getNamedItem("val");
 				if (a != null)
+				{
 					instance.setTimeDelay(Integer.parseInt(a.getNodeValue()));
+				}
 			}
 			*/
-			//@formatter:on
+			// @formatter:on
 			else if ("allowSummon".equalsIgnoreCase(n.getNodeName()))
 			{
 				a = n.getAttributes().getNamedItem("val");
@@ -699,6 +723,39 @@ public class Instance
 		}
 	}
 	
+	public void cancelEjectDeadPlayer(L2PcInstance player)
+	{
+		if (_ejectDeadTasks.containsKey(player.getObjectId()))
+		{
+			final ScheduledFuture<?> task = _ejectDeadTasks.remove(player.getObjectId());
+			if (task != null)
+			{
+				task.cancel(true);
+			}
+		}
+	}
+	
+	/**
+	 * @param killer the character that killed the {@code victim}
+	 * @param victim the character that was killed by the {@code killer}
+	 */
+	public final void notifyDeath(L2Character killer, L2Character victim)
+	{
+		onDeath(killer, victim);
+	}
+	
+	/**
+	 * @param killer
+	 * @param victim
+	 */
+	protected void onDeath(L2Character killer, L2Character victim)
+	{
+		if ((victim != null) && victim.isPlayer())
+		{
+			_ejectDeadTasks.put(victim.getObjectId(), ThreadPoolManager.getInstance().scheduleGeneral(new EjectPlayer(victim.getActingPlayer()), _ejectTime));
+		}
+	}
+	
 	public class CheckTimeUp implements Runnable
 	{
 		private final int _remaining;
@@ -724,6 +781,33 @@ public class Instance
 		}
 	}
 	
+	protected class EjectPlayer implements Runnable
+	{
+		private final L2PcInstance _player;
+		
+		public EjectPlayer(L2PcInstance player)
+		{
+			_player = player;
+		}
+		
+		@Override
+		public void run()
+		{
+			if ((_player != null) && _player.isDead() && (_player.getInstanceId() == getId()))
+			{
+				_player.setInstanceId(0);
+				if (getSpawnLoc() != null)
+				{
+					_player.teleToLocation(getSpawnLoc(), true);
+				}
+				else
+				{
+					_player.teleToLocation(MapRegionManager.TeleportWhereType.Town);
+				}
+			}
+		}
+	}
+	
 	public final class EjectProcedure implements IL2Procedure<Integer>
 	{
 		@Override
@@ -733,7 +817,6 @@ public class Instance
 			if ((player != null) && (player.getInstanceId() == getId()))
 			{
 				player.setInstanceId(0);
-				player.sendMessage("You were removed from the instance");
 				if (getSpawnLoc() != null)
 				{
 					player.teleToLocation(getSpawnLoc(), true);