فهرست منبع

core support for mass gatekeepers - by kerberos_20

* [DP4692] Required
nBd 17 سال پیش
والد
کامیت
015fe51950

+ 2 - 2
L2_GameServer/java/config/siege.properties

@@ -18,11 +18,11 @@ AttackerMaxClans=500
 DefenderMaxClans=500
 
 #Respawn times in ms
-DefenderRespawn=20000
+DefenderRespawn=30000
 AttackerRespawn=0
 
 #Respawn time penalty for loosing each Control tower
-CTLossPenalty=20000
+CTLossPenalty=60000
 
 #Caste Artefacts and Control Towers spawns
 #

+ 138 - 148
L2_GameServer/java/net/sf/l2j/gameserver/clientpackets/RequestRestartPoint.java

@@ -30,7 +30,6 @@ import net.sf.l2j.gameserver.model.entity.Fort;
 import net.sf.l2j.gameserver.util.IllegalPlayerAction;
 import net.sf.l2j.gameserver.util.Util;
 
-
 /**
  * This class ...
  *
@@ -44,7 +43,6 @@ public final class RequestRestartPoint extends L2GameClientPacket
 	protected int     _requestedPointType;
 	protected boolean _continuation;
 
-
 	@Override
 	protected void readImpl()
 	{
@@ -54,7 +52,7 @@ public final class RequestRestartPoint extends L2GameClientPacket
 	class DeathTask implements Runnable
 	{
 		final L2PcInstance activeChar;
-        
+
 		DeathTask (L2PcInstance _activeChar)
 		{
 			activeChar = _activeChar;
@@ -62,135 +60,134 @@ public final class RequestRestartPoint extends L2GameClientPacket
 
 		public void run()
 		{
-		    Location loc = null;
-            Castle castle = null;
-            Fort fort = null;
-            Boolean isInDefense = false;
-		    
-		    // force jail
-		    if (activeChar.isInJail())
-		    {
-		        _requestedPointType = 27;
-		    }
-		    else if (activeChar.isFestivalParticipant())
-		    {
-		        _requestedPointType = 5;
-		    }
-		    switch (_requestedPointType)
-		    {
-		        case 1: // to clanhall
-		            if (activeChar.getClan() == null || activeChar.getClan().getHasHideout() == 0)
-		            {
-		                //cheater
-		                activeChar.sendMessage("You may not use this respawn point!");
-		                Util.handleIllegalPlayerAction(activeChar, "Player " + activeChar.getName() + " used respawn cheat.", IllegalPlayerAction.PUNISH_KICK);
-		                return;
-		            }
-		            loc = MapRegionTable.getInstance().getTeleToLocation(activeChar, MapRegionTable.TeleportWhereType.ClanHall);
-		            
-		            if (ClanHallManager.getInstance().getClanHallByOwner(activeChar.getClan())!= null &&
-		                    ClanHallManager.getInstance().getClanHallByOwner(activeChar.getClan()).getFunction(ClanHall.FUNC_RESTORE_EXP) != null)
-		            {
-		                activeChar.restoreExp(ClanHallManager.getInstance().getClanHallByOwner(activeChar.getClan()).getFunction(ClanHall.FUNC_RESTORE_EXP).getLvl());
-		            }
-		            break;
-
-		        case 2: // to castle
-		            castle = CastleManager.getInstance().getCastle(activeChar);
-                    
-		            if (castle != null && castle.getSiege().getIsInProgress())
-		            {
-		                //siege in progress
-		                if (castle.getSiege().checkIsDefender(activeChar.getClan()))
-		                	loc = MapRegionTable.getInstance().getTeleToLocation(activeChar, MapRegionTable.TeleportWhereType.Castle);
-		                // Just in case you lost castle while beeing dead.. Port to nearest Town.
-		                else if (castle.getSiege().checkIsAttacker(activeChar.getClan()))
-		                	loc = MapRegionTable.getInstance().getTeleToLocation(activeChar, MapRegionTable.TeleportWhereType.Town);
-		                else
-		                {
-		                	//cheater
-			                activeChar.sendMessage("You may not use this respawn point!");
-			                Util.handleIllegalPlayerAction(activeChar, "Player " + activeChar.getName() + " used respawn cheat.", IllegalPlayerAction.PUNISH_KICK);
-			                return;
-		                }
-		            }
-		            else
-		            {
-		            	if (activeChar.getClan() == null || activeChar.getClan().getHasCastle() == 0)
-			            {
-			                //cheater
-			                activeChar.sendMessage("You may not use this respawn point!");
-			                Util.handleIllegalPlayerAction(activeChar, "Player " + activeChar.getName() + " used respawn cheat.", IllegalPlayerAction.PUNISH_KICK);
-			                return;
-			            }
-		            	else
-		            		loc = MapRegionTable.getInstance().getTeleToLocation(activeChar, MapRegionTable.TeleportWhereType.Castle);
-		            }
-		            break;
-
-		        case 3: // to fortress
-                    fort = FortManager.getInstance().getFort(activeChar);
-                    
-                    if (fort != null && fort.getSiege().getIsInProgress())
-                    {
-                        //siege in progress
-                        if (fort.getSiege().checkIsDefender(activeChar.getClan()))
-                            isInDefense = true;
-                    }
-		            if ((activeChar.getClan() == null || activeChar.getClan().getHasFort() == 0) && !isInDefense)
-		            {
-		                //cheater
-		                activeChar.sendMessage("You may not use this respawn point!");
-		                Util.handleIllegalPlayerAction(activeChar, "Player " + activeChar.getName() + " used respawn cheat.", IllegalPlayerAction.PUNISH_KICK);
-		                return;
-		            }
-		            loc = MapRegionTable.getInstance().getTeleToLocation(activeChar, MapRegionTable.TeleportWhereType.Fortress);
-		            break;
-		            
-		        case 4: // to siege HQ
-		            L2SiegeClan siegeClan = null;
-		            castle = CastleManager.getInstance().getCastle(activeChar);
-                    fort = FortManager.getInstance().getFort(activeChar);
-		            
-                    if (castle != null && castle.getSiege().getIsInProgress())
-                        siegeClan = castle.getSiege().getAttackerClan(activeChar.getClan());
-                    else if (fort != null && fort.getSiege().getIsInProgress())
-                        siegeClan = fort.getSiege().getAttackerClan(activeChar.getClan());
-		            
-		            if (siegeClan == null || siegeClan.getFlag().size() == 0)
-		            {
-		                //cheater
-		                activeChar.sendMessage("You may not use this respawn point!");
-		                Util.handleIllegalPlayerAction(activeChar, "Player " + activeChar.getName() + " used respawn cheat.", IllegalPlayerAction.PUNISH_KICK);
-		                return;
-		            }
-		            loc = MapRegionTable.getInstance().getTeleToLocation(activeChar, MapRegionTable.TeleportWhereType.SiegeFlag);
-		            break;
-		            
-		        case 5: // Fixed or Player is a festival participant
-		            if (!activeChar.isGM() && !activeChar.isFestivalParticipant())
-		            {
-		                //cheater
-		                activeChar.sendMessage("You may not use this respawn point!");
-		                Util.handleIllegalPlayerAction(activeChar, "Player " + activeChar.getName() + " used respawn cheat.", IllegalPlayerAction.PUNISH_KICK);
-		                return;
-		            }
-		            loc = new Location(activeChar.getX(), activeChar.getY(), activeChar.getZ()); // spawn them where they died
-		            break;
-		            
-		        case 27: // to jail
-		            if (!activeChar.isInJail()) return;
-		            loc = new Location(-114356, -249645, -2984);
-		            break;
-		            
-		        default:
-		            loc = MapRegionTable.getInstance().getTeleToLocation(activeChar, MapRegionTable.TeleportWhereType.Town);
-		        break;
-		    }
-		    
-		    //Teleport and revive
-		    activeChar.setIsPendingRevive(true);
-		    activeChar.teleToLocation(loc, true);
+			Location loc = null;
+			Castle castle = null;
+			Fort fort = null;
+			Boolean isInDefense = false;
+
+			// force jail
+			if (activeChar.isInJail())
+			{
+				_requestedPointType = 27;
+			}
+			else if (activeChar.isFestivalParticipant())
+			{
+				_requestedPointType = 5;
+			}
+			switch (_requestedPointType)
+			{
+				case 1: // to clanhall
+					if (activeChar.getClan() == null || activeChar.getClan().getHasHideout() == 0)
+					{
+						//cheater
+						activeChar.sendMessage("You may not use this respawn point!");
+						Util.handleIllegalPlayerAction(activeChar, "Player " + activeChar.getName() + " used respawn cheat.", IllegalPlayerAction.PUNISH_KICK);
+						return;
+					}
+					loc = MapRegionTable.getInstance().getTeleToLocation(activeChar, MapRegionTable.TeleportWhereType.ClanHall);
+
+					if (ClanHallManager.getInstance().getClanHallByOwner(activeChar.getClan())!= null &&
+							ClanHallManager.getInstance().getClanHallByOwner(activeChar.getClan()).getFunction(ClanHall.FUNC_RESTORE_EXP) != null)
+					{
+						activeChar.restoreExp(ClanHallManager.getInstance().getClanHallByOwner(activeChar.getClan()).getFunction(ClanHall.FUNC_RESTORE_EXP).getLvl());
+					}
+					break;
+
+				case 2: // to castle
+					castle = CastleManager.getInstance().getCastle(activeChar);
+
+					if (castle != null && castle.getSiege().getIsInProgress())
+					{
+						//siege in progress
+						if (castle.getSiege().checkIsDefender(activeChar.getClan()))
+							loc = MapRegionTable.getInstance().getTeleToLocation(activeChar, MapRegionTable.TeleportWhereType.Castle);
+						// Just in case you lost castle while beeing dead.. Port to nearest Town.
+						else if (castle.getSiege().checkIsAttacker(activeChar.getClan()))
+							loc = MapRegionTable.getInstance().getTeleToLocation(activeChar, MapRegionTable.TeleportWhereType.Town);
+						else
+						{
+							//cheater
+							activeChar.sendMessage("You may not use this respawn point!");
+							Util.handleIllegalPlayerAction(activeChar, "Player " + activeChar.getName() + " used respawn cheat.", IllegalPlayerAction.PUNISH_KICK);
+							return;
+						}
+					}
+					else
+					{
+						if (activeChar.getClan() == null || activeChar.getClan().getHasCastle() == 0)
+						{
+							//cheater
+							activeChar.sendMessage("You may not use this respawn point!");
+							Util.handleIllegalPlayerAction(activeChar, "Player " + activeChar.getName() + " used respawn cheat.", IllegalPlayerAction.PUNISH_KICK);
+							return;
+						}
+						else
+							loc = MapRegionTable.getInstance().getTeleToLocation(activeChar, MapRegionTable.TeleportWhereType.Castle);
+					}
+					break;
+
+				case 3: // to fortress
+					fort = FortManager.getInstance().getFort(activeChar);
+
+					if (fort != null && fort.getSiege().getIsInProgress())
+					{
+						//siege in progress
+						if (fort.getSiege().checkIsDefender(activeChar.getClan()))
+							isInDefense = true;
+					}
+					if ((activeChar.getClan() == null || activeChar.getClan().getHasFort() == 0) && !isInDefense)
+					{
+						//cheater
+						activeChar.sendMessage("You may not use this respawn point!");
+						Util.handleIllegalPlayerAction(activeChar, "Player " + activeChar.getName() + " used respawn cheat.", IllegalPlayerAction.PUNISH_KICK);
+						return;
+					}
+					loc = MapRegionTable.getInstance().getTeleToLocation(activeChar, MapRegionTable.TeleportWhereType.Fortress);
+					break;
+
+				case 4: // to siege HQ
+					L2SiegeClan siegeClan = null;
+					castle = CastleManager.getInstance().getCastle(activeChar);
+					fort = FortManager.getInstance().getFort(activeChar);
+
+					if (castle != null && castle.getSiege().getIsInProgress())
+						siegeClan = castle.getSiege().getAttackerClan(activeChar.getClan());
+					else if (fort != null && fort.getSiege().getIsInProgress())
+						siegeClan = fort.getSiege().getAttackerClan(activeChar.getClan());
+
+					if (siegeClan == null || siegeClan.getFlag().size() == 0)
+					{
+						//cheater
+						activeChar.sendMessage("You may not use this respawn point!");
+						Util.handleIllegalPlayerAction(activeChar, "Player " + activeChar.getName() + " used respawn cheat.", IllegalPlayerAction.PUNISH_KICK);
+						return;
+					}
+					loc = MapRegionTable.getInstance().getTeleToLocation(activeChar, MapRegionTable.TeleportWhereType.SiegeFlag);
+					break;
+
+				case 5: // Fixed or Player is a festival participant
+					if (!activeChar.isGM() && !activeChar.isFestivalParticipant())
+					{
+						//cheater
+						activeChar.sendMessage("You may not use this respawn point!");
+						Util.handleIllegalPlayerAction(activeChar, "Player " + activeChar.getName() + " used respawn cheat.", IllegalPlayerAction.PUNISH_KICK);
+						return;
+					}
+					loc = new Location(activeChar.getX(), activeChar.getY(), activeChar.getZ()); // spawn them where they died
+					break;
+
+				case 27: // to jail
+					if (!activeChar.isInJail()) return;
+					loc = new Location(-114356, -249645, -2984);
+
+				default:
+					loc = MapRegionTable.getInstance().getTeleToLocation(activeChar, MapRegionTable.TeleportWhereType.Town);
+				break;
+			}
+
+			//Teleport and revive
+			activeChar.setIsPendingRevive(true);
+			activeChar.teleToLocation(loc, true);
 		}
 	}
 
@@ -225,29 +222,22 @@ public final class RequestRestartPoint extends L2GameClientPacket
 			{
 				// Schedule respawn delay for attacker
 				ThreadPoolManager.getInstance().scheduleGeneral(new DeathTask(activeChar), castle.getSiege().getAttackerRespawnDelay());
-				activeChar.sendMessage("You will be re-spawned in " + castle.getSiege().getAttackerRespawnDelay()/1000 + " seconds");
-			}
-			else
-			{
-				// Schedule respawn delay for defender with penalty for CT lose
-				ThreadPoolManager.getInstance().scheduleGeneral(new DeathTask(activeChar), castle.getSiege().getDefenderRespawnDelay());
-				activeChar.sendMessage("You will be re-spawned in " + castle.getSiege().getDefenderRespawnDelay()/1000 + " seconds");
+				if (castle.getSiege().getAttackerRespawnDelay() > 0)
+					activeChar.sendMessage("You will be re-spawned in " + castle.getSiege().getAttackerRespawnDelay()/1000 + " seconds");
+				return;
 			}
-			return;
 		}
-        
-        // run immediatelly (no need to schedule)
-        new DeathTask(activeChar).run();
-	}
-
 
+		// run immediatelly (no need to schedule)
+		new DeathTask(activeChar).run();
+	}
 
 	/* (non-Javadoc)
-     * @see net.sf.l2j.gameserver.clientpackets.ClientBasePacket#getType()
-     */
+	* @see net.sf.l2j.gameserver.clientpackets.ClientBasePacket#getType()
+	*/
 	@Override
 	public String getType()
 	{
 		return _C__6d_REQUESTRESTARTPOINT;
 	}
-}
+}

+ 3 - 0
L2_GameServer/java/net/sf/l2j/gameserver/datatables/ZoneData.java

@@ -39,6 +39,7 @@ import net.sf.l2j.gameserver.model.zone.form.ZoneNPoly;
 import net.sf.l2j.gameserver.model.zone.type.L2ArenaZone;
 import net.sf.l2j.gameserver.model.zone.type.L2BigheadZone;
 import net.sf.l2j.gameserver.model.zone.type.L2BossZone;
+import net.sf.l2j.gameserver.model.zone.type.L2CastleTeleportZone;
 import net.sf.l2j.gameserver.model.zone.type.L2CastleZone;
 import net.sf.l2j.gameserver.model.zone.type.L2ClanHallZone;
 import net.sf.l2j.gameserver.model.zone.type.L2DamageZone;
@@ -152,6 +153,8 @@ public class ZoneData
 								temp = new L2OlympiadStadiumZone(zoneId);
 							else if (zoneType.equals("CastleZone"))
 								temp = new L2CastleZone(zoneId);
+                            else if (zoneType.equals("CastleTeleportZone"))
+                                temp = new L2CastleTeleportZone(zoneId);
 			                else if (zoneType.equals("FortZone"))
 			                    temp = new L2FortZone(zoneId);              
 							else if (zoneType.equals("DamageZone"))

+ 6 - 6
L2_GameServer/java/net/sf/l2j/gameserver/instancemanager/SiegeManager.java

@@ -56,15 +56,15 @@ public class SiegeManager
     // =========================================================
     // Data Field
     private int _attackerMaxClans                              = 500; // Max number of clans
-    private int _attackerRespawnDelay                          = 20000; // Time in ms. Changeable in siege.config
+    private int _attackerRespawnDelay                          = 0; // Time in ms. Changeable in siege.config
     private int _defenderMaxClans                              = 500; // Max number of clans
-    private int _defenderRespawnDelay                          = 10000; // Time in ms. Changeable in siege.config
+    private int _defenderRespawnDelay                          = 30000; // Time in ms. Changeable in siege.config
 
     // Siege settings
     private FastMap<Integer,FastList<SiegeSpawn>>  _artefactSpawnList;
     private FastMap<Integer,FastList<SiegeSpawn>>  _controlTowerSpawnList;
 
-    private int _controlTowerLosePenalty                         = 20000; // Time in ms. Changeable in siege.config
+    private int _controlTowerLosePenalty                         = 60000; // Time in ms. Changeable in siege.config
     private int _flagMaxCount                                   = 1; // Changeable in siege.config
     private int _siegeClanMinLevel                             = 5; // Changeable in siege.config
     private int _siegeLength                                    = 120; // Time in minute. Changeable in siege.config
@@ -168,10 +168,10 @@ public class SiegeManager
 
             // Siege setting
             _attackerMaxClans = Integer.decode(siegeSettings.getProperty("AttackerMaxClans", "500"));
-            _attackerRespawnDelay = Integer.decode(siegeSettings.getProperty("AttackerRespawn", "30000"));
-            _controlTowerLosePenalty = Integer.decode(siegeSettings.getProperty("CTLossPenalty", "20000"));
+            _attackerRespawnDelay = Integer.decode(siegeSettings.getProperty("AttackerRespawn", "0"));
+            _controlTowerLosePenalty = Integer.decode(siegeSettings.getProperty("CTLossPenalty", "60000"));
             _defenderMaxClans = Integer.decode(siegeSettings.getProperty("DefenderMaxClans", "500"));
-            _defenderRespawnDelay = Integer.decode(siegeSettings.getProperty("DefenderRespawn", "20000"));
+            _defenderRespawnDelay = Integer.decode(siegeSettings.getProperty("DefenderRespawn", "30000"));
             _flagMaxCount = Integer.decode(siegeSettings.getProperty("MaxFlags", "1"));
             _siegeClanMinLevel = Integer.decode(siegeSettings.getProperty("SiegeClanMinLevel", "5"));
             _siegeLength = Integer.decode(siegeSettings.getProperty("SiegeLength", "120"));

+ 116 - 89
L2_GameServer/java/net/sf/l2j/gameserver/model/actor/instance/L2CastleTeleporterInstance.java

@@ -15,33 +15,39 @@
 package net.sf.l2j.gameserver.model.actor.instance;
 
 /**
- * @author NightMarez
- * @version $Revision: 1.3.2.2.2.5 $ $Date: 2005/03/27 15:29:32 $
+ * @author Kerberos
  *
  */
 
+import java.io.File;
+import java.io.FileInputStream;
+import java.io.InputStream;
+import java.util.Properties;
 import java.util.StringTokenizer;
 
 import net.sf.l2j.Config;
-import net.sf.l2j.gameserver.datatables.TeleportLocationTable;
-import net.sf.l2j.gameserver.model.L2CharPosition;
-import net.sf.l2j.gameserver.model.L2TeleportLocation;
+import net.sf.l2j.gameserver.ThreadPoolManager;
+import net.sf.l2j.gameserver.ai.CtrlIntention;
+import net.sf.l2j.gameserver.datatables.MapRegionTable;
+import net.sf.l2j.gameserver.instancemanager.CastleManager;
+import net.sf.l2j.gameserver.model.L2World;
+import net.sf.l2j.gameserver.model.entity.Castle;
+import net.sf.l2j.gameserver.model.zone.L2ZoneManager;
 import net.sf.l2j.gameserver.serverpackets.ActionFailed;
+import net.sf.l2j.gameserver.serverpackets.MyTargetSelected;
 import net.sf.l2j.gameserver.serverpackets.NpcHtmlMessage;
+import net.sf.l2j.gameserver.serverpackets.NpcSay;
+import net.sf.l2j.gameserver.serverpackets.ValidateLocation;
 import net.sf.l2j.gameserver.templates.L2NpcTemplate;
 
 public final class L2CastleTeleporterInstance extends L2FolkInstance
 {
-	//private static Logger _log = Logger.getLogger(L2TeleporterInstance.class.getName());
-
-	private static final int COND_ALL_FALSE = 0;
-	private static final int COND_BUSY_BECAUSE_OF_SIEGE = 1;
-	private static final int COND_OWNER = 2;
-	private static final int COND_REGULAR = 3;
+	private boolean _currentTask = false;
+	L2ZoneManager _zoneManager;
 
 	/**
-	 * @param template
-	 */
+	* @param template
+	*/
 	public L2CastleTeleporterInstance(int objectId, L2NpcTemplate template)
 	{
 		super(objectId, template);
@@ -50,112 +56,133 @@ public final class L2CastleTeleporterInstance extends L2FolkInstance
 	@Override
 	public void onBypassFeedback(L2PcInstance player, String command)
 	{
-		int condition = validateCondition(player);
-		if (condition <= COND_BUSY_BECAUSE_OF_SIEGE)
-			return;
-
 		StringTokenizer st = new StringTokenizer(command, " ");
 		String actualCommand = st.nextToken(); // Get actual command
 
-		if (actualCommand.equalsIgnoreCase("goto"))
+		if (actualCommand.equalsIgnoreCase("tele"))
 		{
-			if (st.countTokens() <= 0) {return;}
-			int whereTo = Integer.parseInt(st.nextToken());
-			if (condition == COND_REGULAR)
-			{
-				doTeleport(player, whereTo);
-				return;
-			}
-			else if (condition == COND_OWNER)
-			{
-				int minPrivilegeLevel = 0; // NOTE: Replace 0 with highest level when privilege level is implemented
-				if (st.countTokens() >= 1) {minPrivilegeLevel = Integer.parseInt(st.nextToken());}
-				if (10 >= minPrivilegeLevel) // NOTE: Replace 10 with privilege level of player
-					doTeleport(player, whereTo);
-				else
-					player.sendMessage("You don't have the sufficient access level to teleport there.");
-				return;
-			}
+			doTeleport(player);
+			String filename = "data/html/castleteleporter/MassGK-1.htm";
+			NpcHtmlMessage html = new NpcHtmlMessage(getObjectId());
+			html.setFile(filename);
+			player.sendPacket(html);
+			return;
 		}
 		else
 			super.onBypassFeedback(player, command);
 	}
 
-	@Override
-	public String getHtmlPath(int npcId, int val)
-	{
-		String pom = "";
-		if (val == 0)
-		{
-			pom = "" + npcId;
-		}
-		else
-		{
-			pom = npcId + "-" + val;
-		}
-
-		return "data/html/teleporter/" + pom + ".htm";
-	}
-
-
 	@Override
 	public void showChatWindow(L2PcInstance player)
 	{
-		String filename = "data/html/teleporter/castleteleporter-no.htm";
-
-		int condition = validateCondition(player);
-		if (condition == COND_REGULAR)
-		{
-			super.showChatWindow(player);
-			return;
-		}
-		else if (condition > COND_ALL_FALSE)
+		String filename = "data/html/castleteleporter/MassGK-1.htm";
+		if (!getTask())
 		{
-			if (condition == COND_BUSY_BECAUSE_OF_SIEGE)
-				filename = "data/html/teleporter/castleteleporter-busy.htm"; // Busy because of siege
-			else if (condition == COND_OWNER)                                // Clan owns castle
-				filename = "data/html/teleporter/" + getNpcId() + ".htm";    // Owner message window
+			filename = "data/html/castleteleporter/MassGK.htm";
 		}
-
 		NpcHtmlMessage html = new NpcHtmlMessage(getObjectId());
 		html.setFile(filename);
 		html.replace("%objectId%", String.valueOf(getObjectId()));
-		html.replace("%npcname%", getName());
 		player.sendPacket(html);
 	}
 
-	private void doTeleport(L2PcInstance player, int val)
+	private void doTeleport(L2PcInstance player)
+	{
+		try {
+			InputStream is              = new FileInputStream(new File(Config.SIEGE_CONFIGURATION_FILE));
+			Properties siegeSettings    = new Properties();
+			siegeSettings.load(is);
+			is.close();
+
+			long delay = Integer.decode(siegeSettings.getProperty("DefenderRespawn", "30000"));
+
+			Castle castle = CastleManager.getInstance().getCastle(player.getX(), player.getY(), player.getZ());
+			if (castle != null && castle.getSiege().getIsInProgress())
+				delay = castle.getSiege().getDefenderRespawnDelay();
+			if (delay > 480000)
+				delay = 480000;
+			setTask(true);
+			ThreadPoolManager.getInstance().scheduleGeneral(new oustAllPlayers(), delay );
+		} catch (Exception e) {
+            e.printStackTrace();
+        }
+	}
+	void oustAllPlayers()
+	{
+		getCastle().oustAllPlayers();
+	}
+
+	class oustAllPlayers implements Runnable
 	{
-		L2TeleportLocation list = TeleportLocationTable.getInstance().getTemplate(val);
-		if (list != null)
+		public void run()
 		{
-			if(player.reduceAdena("Teleport", list.getPrice(), player.getLastFolkNPC(), true))
+			try
 			{
-				if (Config.DEBUG)
-					_log.fine("Teleporting player "+player.getName()+" to new location: "+list.getLocX()+":"+list.getLocY()+":"+list.getLocZ());
-
-				// teleport
-				player.teleToLocation(list.getLocX(), list.getLocY(), list.getLocZ(), true);
-				player.stopMove(new L2CharPosition(list.getLocX(), list.getLocY(), list.getLocZ(), player.getHeading()));
+				NpcSay cs = new NpcSay(getObjectId(), 1, getNpcId(), "The defenders of "+ getCastle().getName()+" castle will be teleported to the inner castle.");
+				int region = MapRegionTable.getInstance().getMapRegion(getX(), getY());
+				for (L2PcInstance player : L2World.getInstance().getAllPlayers())
+				{
+					if (region == MapRegionTable.getInstance().getMapRegion(player.getX(),player.getY()))
+					{
+						player.sendPacket(cs);
+					}
+				}
+				oustAllPlayers();
+				setTask(false);
+			}
+			catch (NullPointerException e)
+			{
+				e.printStackTrace();
 			}
 		}
+	}
+
+	/**
+	* this is called when a player interacts with this NPC
+	* @param player
+	*/
+	@Override
+	public void onAction(L2PcInstance player)
+	{
+		if (!canTarget(player)) return;
+
+		// Check if the L2PcInstance already target the L2NpcInstance
+		if (this != player.getTarget())
+		{
+			// Set the target of the L2PcInstance player
+			player.setTarget(this);
+
+			// Send a Server->Client packet MyTargetSelected to the L2PcInstance player
+			MyTargetSelected my = new MyTargetSelected(getObjectId(), 0);
+			player.sendPacket(my);
+
+			// Send a Server->Client packet ValidateLocation to correct the L2NpcInstance position and heading on the client
+			player.sendPacket(new ValidateLocation(this));
+		}
 		else
 		{
-			_log.warning("No teleport destination with id:" +val);
+			// Calculate the distance between the L2PcInstance and the L2NpcInstance
+			if (!canInteract(player))
+			{
+				// Notify the L2PcInstance AI with AI_INTENTION_INTERACT
+				player.getAI().setIntention(CtrlIntention.AI_INTENTION_INTERACT, this);
+			}
+			else
+			{
+				showChatWindow(player);
+			}
 		}
-		player.sendPacket( ActionFailed.STATIC_PACKET );
+		// Send a Server->Client ActionFailed to the L2PcInstance in order to avoid that the client wait another packet
+		player.sendPacket(ActionFailed.STATIC_PACKET);
 	}
 
-	private int validateCondition(L2PcInstance player)
+	public boolean getTask()
 	{
-		if (player.getClan() != null && getCastle() != null)
-		{
-			if (getCastle().getSiege().getIsInProgress())
-				return COND_BUSY_BECAUSE_OF_SIEGE;                    // Busy because of siege
-			else if (getCastle().getOwnerId() == player.getClanId())  // Clan owns castle
-				return COND_OWNER;	// Owner
-		}
+		return _currentTask;
+	}
 
-		return COND_ALL_FALSE;
+	public void setTask(boolean state)
+	{
+		_currentTask = state;
 	}
-}
+}

+ 17 - 0
L2_GameServer/java/net/sf/l2j/gameserver/model/entity/Castle.java

@@ -40,6 +40,7 @@ import net.sf.l2j.gameserver.model.L2Manor;
 import net.sf.l2j.gameserver.model.L2Object;
 import net.sf.l2j.gameserver.model.actor.instance.L2DoorInstance;
 import net.sf.l2j.gameserver.model.actor.instance.L2PcInstance;
+import net.sf.l2j.gameserver.model.zone.type.L2CastleTeleportZone;
 import net.sf.l2j.gameserver.model.zone.type.L2CastleZone;
 import net.sf.l2j.gameserver.serverpackets.PlaySound;
 import net.sf.l2j.gameserver.serverpackets.PledgeShowInfoUpdate;
@@ -83,6 +84,7 @@ public class Castle
 	private double _taxRate                    = 0;
 	private int _treasury                      = 0;
     private L2CastleZone _zone;
+    private L2CastleTeleportZone _teleZone;
     private L2Clan _formerOwner				   = null;
     private int _nbArtifact					   = 1;
     private Map<Integer, Integer> _engrave	   = new FastMap<Integer, Integer>();
@@ -218,6 +220,21 @@ public class Castle
     	return _zone;
     }
 
+    public void setTeleZone(L2CastleTeleportZone zone)
+	{
+    	_teleZone = zone;
+	}
+
+	public L2CastleTeleportZone getTeleZone()
+	{
+		return _teleZone;
+	}
+
+	public void oustAllPlayers()
+	{
+		_teleZone.oustAllPlayers();
+	}
+
     /**
      * Get the objects distance to this castle
      * @param obj

+ 131 - 0
L2_GameServer/java/net/sf/l2j/gameserver/model/zone/type/L2CastleTeleportZone.java

@@ -0,0 +1,131 @@
+/*
+ * This program 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.
+ * 
+ * This program 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 net.sf.l2j.gameserver.model.zone.type;
+
+import javolution.util.FastList;
+import net.sf.l2j.gameserver.instancemanager.CastleManager;
+import net.sf.l2j.gameserver.model.L2Character;
+import net.sf.l2j.gameserver.model.actor.instance.L2PcInstance;
+import net.sf.l2j.gameserver.model.entity.Castle;
+import net.sf.l2j.gameserver.model.zone.L2ZoneType;
+import net.sf.l2j.util.Rnd;
+
+/**
+ * A castle teleporter zone
+ * used for Mass Gatekeepers
+ *
+ * @author  Kerberos
+ */
+public class L2CastleTeleportZone extends L2ZoneType
+{
+	private int[] _spawnLoc;
+	private int _castleId;
+	private Castle _castle;
+	
+	public L2CastleTeleportZone(int id)
+	{
+		super(id);
+
+		_spawnLoc = new int[5];
+	}
+
+	@Override
+	public void setParameter(String name, String value)
+	{
+		if (name.equals("castleId"))
+		{
+			_castleId = Integer.parseInt(value);
+
+			// Register self to the correct castle
+			_castle = CastleManager.getInstance().getCastleById(_castleId);
+			_castle.setTeleZone(this);
+		}
+		else if (name.equals("spawnMinX"))
+		{
+			_spawnLoc[0] = Integer.parseInt(value);
+		}
+		else if (name.equals("spawnMaxX"))
+		{
+			_spawnLoc[1] = Integer.parseInt(value);
+		}
+		else if (name.equals("spawnMinY"))
+		{
+			_spawnLoc[2] = Integer.parseInt(value);
+		}
+		else if (name.equals("spawnMaxY"))
+		{
+			_spawnLoc[3] = Integer.parseInt(value);
+		}
+		else if (name.equals("spawnZ"))
+		{
+			_spawnLoc[4] = Integer.parseInt(value);
+		}
+		else super.setParameter(name, value);
+	}
+
+	@Override
+	protected void onEnter(L2Character character) {}
+
+	@Override
+	protected void onExit(L2Character character) {}
+
+	@Override
+	protected void onDieInside(L2Character character) {}
+
+	@Override
+	protected void onReviveInside(L2Character character) {}
+
+	/**
+	 * Returns all players within this zone
+	 * @return
+	 */
+	public FastList<L2PcInstance> getAllPlayers()
+	{
+		FastList<L2PcInstance> players = new FastList<L2PcInstance>();
+
+		for (L2Character temp : _characterList.values())
+		{
+			if (temp instanceof L2PcInstance)
+				players.add((L2PcInstance)temp);
+		}
+
+		return players;
+	}
+
+    public void oustAllPlayers()
+    {
+        if (_characterList == null) return;
+        if (_characterList.isEmpty()) return;
+        for (L2Character character : _characterList.values())
+        {
+            if (character == null) continue;
+            if (character instanceof L2PcInstance)
+            {
+                L2PcInstance player = (L2PcInstance) character;
+                if (player.isOnline() == 1)
+                	player.teleToLocation(Rnd.get(_spawnLoc[0], _spawnLoc[1]), Rnd.get(_spawnLoc[2], _spawnLoc[3]), _spawnLoc[4]);
+            }
+        }
+    }
+
+	/**
+	 * Get the spawn locations
+	 * @return
+	 */
+	public int[] getSpawn()
+	{
+		return _spawnLoc;
+	}
+}