Browse Source

BETA: Retail Like '''"Respawn Zones"''' by Nyaran.
* Reworked MapRegion system. Moved to xml, an put in spawn locations. Can add banned race for map regions.
* Added respawn_zones.xml. Respawn locations are defined per race and link to MapRegion by name.
* Added support for banish respawn locations for Clan Halls, Fortress and Castles
* Added retail support for other respawn locs (for siege towns)
* Modified teleToLocation functions for add support to variable randomOffset. (booleans functions use config values, can be replaced with an integer value)
* Added enum for castles
* Added function for get random point in area
* Added retail support for Residence zones (for mass teleporter). Only for castles now.
* Enabled castle_teleport_zones and removed custom_castle_teleport_zones.
* If player is in respawn zone, when dies, only appear To Village button

'''NOTE: Require DataPack [DP8225]'''

MELERIX 13 years ago
parent
commit
afaac1d7c9
47 changed files with 1140 additions and 998 deletions
  1. 2 2
      L2J_Server_BETA/java/com/l2jserver/gameserver/GameServer.java
  2. 3 3
      L2J_Server_BETA/java/com/l2jserver/gameserver/SevenSigns.java
  3. 2 2
      L2J_Server_BETA/java/com/l2jserver/gameserver/SevenSignsFestival.java
  4. 4 3
      L2J_Server_BETA/java/com/l2jserver/gameserver/datatables/DoorTable.java
  5. 0 522
      L2J_Server_BETA/java/com/l2jserver/gameserver/datatables/MapRegionTable.java
  6. 14 10
      L2J_Server_BETA/java/com/l2jserver/gameserver/instancemanager/ClanHallManager.java
  7. 499 0
      L2J_Server_BETA/java/com/l2jserver/gameserver/instancemanager/MapRegionManager.java
  8. 26 260
      L2J_Server_BETA/java/com/l2jserver/gameserver/instancemanager/TownManager.java
  9. 27 6
      L2J_Server_BETA/java/com/l2jserver/gameserver/instancemanager/ZoneManager.java
  10. 2 2
      L2J_Server_BETA/java/com/l2jserver/gameserver/model/AutoSpawnHandler.java
  11. 200 0
      L2J_Server_BETA/java/com/l2jserver/gameserver/model/L2MapRegion.java
  12. 2 2
      L2J_Server_BETA/java/com/l2jserver/gameserver/model/PartyMatchRoom.java
  13. 44 11
      L2J_Server_BETA/java/com/l2jserver/gameserver/model/actor/L2Character.java
  14. 2 2
      L2J_Server_BETA/java/com/l2jserver/gameserver/model/actor/L2Vehicle.java
  15. 10 10
      L2J_Server_BETA/java/com/l2jserver/gameserver/model/actor/instance/L2AuctioneerInstance.java
  16. 3 3
      L2J_Server_BETA/java/com/l2jserver/gameserver/model/actor/instance/L2CastleTeleporterInstance.java
  17. 4 4
      L2J_Server_BETA/java/com/l2jserver/gameserver/model/actor/instance/L2PcInstance.java
  18. 5 5
      L2J_Server_BETA/java/com/l2jserver/gameserver/model/entity/Castle.java
  19. 8 0
      L2J_Server_BETA/java/com/l2jserver/gameserver/model/entity/ClanHall.java
  20. 3 3
      L2J_Server_BETA/java/com/l2jserver/gameserver/model/entity/FortSiege.java
  21. 3 3
      L2J_Server_BETA/java/com/l2jserver/gameserver/model/entity/Instance.java
  22. 8 8
      L2J_Server_BETA/java/com/l2jserver/gameserver/model/entity/Siege.java
  23. 2 0
      L2J_Server_BETA/java/com/l2jserver/gameserver/model/zone/L2ZoneForm.java
  24. 56 7
      L2J_Server_BETA/java/com/l2jserver/gameserver/model/zone/L2ZoneRespawn.java
  25. 11 0
      L2J_Server_BETA/java/com/l2jserver/gameserver/model/zone/form/ZoneCuboid.java
  26. 15 0
      L2J_Server_BETA/java/com/l2jserver/gameserver/model/zone/form/ZoneCylinder.java
  27. 41 0
      L2J_Server_BETA/java/com/l2jserver/gameserver/model/zone/form/ZoneNPoly.java
  28. 2 2
      L2J_Server_BETA/java/com/l2jserver/gameserver/model/zone/type/L2ArenaZone.java
  29. 5 5
      L2J_Server_BETA/java/com/l2jserver/gameserver/model/zone/type/L2BossZone.java
  30. 4 10
      L2J_Server_BETA/java/com/l2jserver/gameserver/model/zone/type/L2CastleZone.java
  31. 4 4
      L2J_Server_BETA/java/com/l2jserver/gameserver/model/zone/type/L2ClanHallZone.java
  32. 2 10
      L2J_Server_BETA/java/com/l2jserver/gameserver/model/zone/type/L2ConditionZone.java
  33. 4 6
      L2J_Server_BETA/java/com/l2jserver/gameserver/model/zone/type/L2FortZone.java
  34. 4 4
      L2J_Server_BETA/java/com/l2jserver/gameserver/model/zone/type/L2OlympiadStadiumZone.java
  35. 10 48
      L2J_Server_BETA/java/com/l2jserver/gameserver/model/zone/type/L2ResidenceTeleportZone.java
  36. 72 0
      L2J_Server_BETA/java/com/l2jserver/gameserver/model/zone/type/L2RespawnZone.java
  37. 2 2
      L2J_Server_BETA/java/com/l2jserver/gameserver/model/zone/type/L2SiegeZone.java
  38. 2 8
      L2J_Server_BETA/java/com/l2jserver/gameserver/model/zone/type/L2TownZone.java
  39. 7 7
      L2J_Server_BETA/java/com/l2jserver/gameserver/network/SystemMessageId.java
  40. 2 2
      L2J_Server_BETA/java/com/l2jserver/gameserver/network/clientpackets/EnterWorld.java
  41. 8 8
      L2J_Server_BETA/java/com/l2jserver/gameserver/network/clientpackets/RequestRestartPoint.java
  42. 3 1
      L2J_Server_BETA/java/com/l2jserver/gameserver/network/serverpackets/Die.java
  43. 2 2
      L2J_Server_BETA/java/com/l2jserver/gameserver/network/serverpackets/ExManagePartyRoomMember.java
  44. 2 2
      L2J_Server_BETA/java/com/l2jserver/gameserver/network/serverpackets/ExPartyRoomMember.java
  45. 2 2
      L2J_Server_BETA/java/com/l2jserver/gameserver/script/EngineInterface.java
  46. 5 5
      L2J_Server_BETA/java/com/l2jserver/gameserver/skills/l2skills/L2SkillTeleport.java
  47. 2 2
      L2J_Server_BETA/launcher/L2 GameServer.launch

+ 2 - 2
L2J_Server_BETA/java/com/l2jserver/gameserver/GameServer.java

@@ -57,7 +57,6 @@ import com.l2jserver.gameserver.datatables.HerbDropTable;
 import com.l2jserver.gameserver.datatables.HeroSkillTable;
 import com.l2jserver.gameserver.datatables.ItemTable;
 import com.l2jserver.gameserver.datatables.LevelUpData;
-import com.l2jserver.gameserver.datatables.MapRegionTable;
 import com.l2jserver.gameserver.datatables.MerchantPriceConfigTable;
 import com.l2jserver.gameserver.datatables.MultiSell;
 import com.l2jserver.gameserver.datatables.NobleSkillTable;
@@ -104,6 +103,7 @@ import com.l2jserver.gameserver.instancemanager.InstanceManager;
 import com.l2jserver.gameserver.instancemanager.ItemAuctionManager;
 import com.l2jserver.gameserver.instancemanager.ItemsOnGroundManager;
 import com.l2jserver.gameserver.instancemanager.MailManager;
+import com.l2jserver.gameserver.instancemanager.MapRegionManager;
 import com.l2jserver.gameserver.instancemanager.MercTicketManager;
 import com.l2jserver.gameserver.instancemanager.PetitionManager;
 import com.l2jserver.gameserver.instancemanager.QuestManager;
@@ -212,7 +212,7 @@ public class GameServer
 		GameTimeController.getInstance();
 		InstanceManager.getInstance();
 		L2World.getInstance();
-		MapRegionTable.getInstance();
+		MapRegionManager.getInstance();
 		Announcements.getInstance();
 		GlobalVariablesManager.getInstance();
 		

+ 3 - 3
L2J_Server_BETA/java/com/l2jserver/gameserver/SevenSigns.java

@@ -29,9 +29,9 @@ import javolution.util.FastMap;
 
 import com.l2jserver.Config;
 import com.l2jserver.L2DatabaseFactory;
-import com.l2jserver.gameserver.datatables.MapRegionTable;
 import com.l2jserver.gameserver.datatables.SkillTable;
 import com.l2jserver.gameserver.instancemanager.CastleManager;
+import com.l2jserver.gameserver.instancemanager.MapRegionManager;
 import com.l2jserver.gameserver.instancemanager.QuestManager;
 import com.l2jserver.gameserver.instancemanager.TerritoryWarManager;
 import com.l2jserver.gameserver.model.AutoChatHandler;
@@ -1398,7 +1398,7 @@ public class SevenSigns
 				{
 					if (!onlinePlayer.isGM() && onlinePlayer.isIn7sDungeon() && (currPlayer == null || !currPlayer.getString("cabal").equals(compWinner)))
 					{
-						onlinePlayer.teleToLocation(MapRegionTable.TeleportWhereType.Town);
+						onlinePlayer.teleToLocation(MapRegionManager.TeleportWhereType.Town);
 						onlinePlayer.setIsIn7sDungeon(false);
 						onlinePlayer.sendMessage("You have been teleported to the nearest town due to the beginning of the Seal Validation period.");
 					}
@@ -1407,7 +1407,7 @@ public class SevenSigns
 				{
 					if (!onlinePlayer.isGM() && onlinePlayer.isIn7sDungeon() && (currPlayer == null || !currPlayer.getString("cabal").isEmpty()))
 					{
-						onlinePlayer.teleToLocation(MapRegionTable.TeleportWhereType.Town);
+						onlinePlayer.teleToLocation(MapRegionManager.TeleportWhereType.Town);
 						onlinePlayer.setIsIn7sDungeon(false);
 						onlinePlayer.sendMessage("You have been teleported to the nearest town because you have not signed for any cabal.");
 					}

+ 2 - 2
L2J_Server_BETA/java/com/l2jserver/gameserver/SevenSignsFestival.java

@@ -35,9 +35,9 @@ import com.l2jserver.gameserver.ai.CtrlIntention;
 import com.l2jserver.gameserver.datatables.CharNameTable;
 import com.l2jserver.gameserver.datatables.ClanTable;
 import com.l2jserver.gameserver.datatables.ExperienceTable;
-import com.l2jserver.gameserver.datatables.MapRegionTable;
 import com.l2jserver.gameserver.datatables.NpcTable;
 import com.l2jserver.gameserver.datatables.SpawnTable;
+import com.l2jserver.gameserver.instancemanager.MapRegionManager;
 import com.l2jserver.gameserver.model.L2CharPosition;
 import com.l2jserver.gameserver.model.L2Clan;
 import com.l2jserver.gameserver.model.L2ItemInstance;
@@ -2405,7 +2405,7 @@ public class SevenSignsFestival implements SpawnListener
 				// If an exception occurs, just move the player to the nearest town.
 				try
 				{
-					participant.teleToLocation(MapRegionTable.TeleportWhereType.Town);
+					participant.teleToLocation(MapRegionManager.TeleportWhereType.Town);
 					participant.sendMessage("You have been removed from the festival arena.");
 				}
 				catch (NullPointerException e2)

+ 4 - 3
L2J_Server_BETA/java/com/l2jserver/gameserver/datatables/DoorTable.java

@@ -31,6 +31,7 @@ import com.l2jserver.Config;
 import com.l2jserver.gameserver.idfactory.IdFactory;
 import com.l2jserver.gameserver.instancemanager.ClanHallManager;
 import com.l2jserver.gameserver.instancemanager.InstanceManager;
+import com.l2jserver.gameserver.instancemanager.MapRegionManager;
 import com.l2jserver.gameserver.model.actor.instance.L2DoorInstance;
 import com.l2jserver.gameserver.model.entity.ClanHall;
 import com.l2jserver.gameserver.pathfinding.AbstractNodeLoc;
@@ -221,7 +222,7 @@ public class DoorTable
 			door.setRange(rangeXMin, rangeYMin, rangeZMin, rangeXMax, rangeYMax, rangeZMax);
 			door.setCurrentHpMp(door.getMaxHp(), door.getMaxMp());
 			door.setXYZInvisible(x, y, z);
-			door.setMapRegion(MapRegionTable.getInstance().getMapRegion(x, y));
+			door.setMapRegion(MapRegionManager.getInstance().getMapRegionId(x, y));
 			door.setEmitter(emitter);
 			door.setTargetable(targetable);
 			
@@ -232,7 +233,7 @@ public class DoorTable
 		}
 		catch (Exception e)
 		{
-			_log.severe("Error in door data at line: " + line);
+			_log.log(Level.SEVERE, "Error in door data at line: " + line, e);
 		}
 		return door;
 	}
@@ -299,7 +300,7 @@ public class DoorTable
 		if (instanceId > 0 && InstanceManager.getInstance().getInstance(instanceId) != null)
 			allDoors = InstanceManager.getInstance().getInstance(instanceId).getDoors();
 		else
-			allDoors = _regions.get(MapRegionTable.getInstance().getMapRegion(x, y));
+			allDoors = _regions.get(MapRegionManager.getInstance().getMapRegionId(x, y));
 		
 		if (allDoors == null)
 			return false;

+ 0 - 522
L2J_Server_BETA/java/com/l2jserver/gameserver/datatables/MapRegionTable.java

@@ -1,522 +0,0 @@
-/*
- * 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 com.l2jserver.gameserver.datatables;
-
-import java.sql.Connection;
-import java.sql.PreparedStatement;
-import java.sql.ResultSet;
-import java.util.List;
-import java.util.logging.Level;
-import java.util.logging.Logger;
-
-import com.l2jserver.Config;
-import com.l2jserver.L2DatabaseFactory;
-import com.l2jserver.gameserver.SevenSigns;
-import com.l2jserver.gameserver.instancemanager.CastleManager;
-import com.l2jserver.gameserver.instancemanager.ClanHallManager;
-import com.l2jserver.gameserver.instancemanager.FortManager;
-import com.l2jserver.gameserver.instancemanager.InstanceManager;
-import com.l2jserver.gameserver.instancemanager.TerritoryWarManager;
-import com.l2jserver.gameserver.instancemanager.TownManager;
-import com.l2jserver.gameserver.instancemanager.ZoneManager;
-import com.l2jserver.gameserver.model.Location;
-import com.l2jserver.gameserver.model.actor.L2Character;
-import com.l2jserver.gameserver.model.actor.L2Npc;
-import com.l2jserver.gameserver.model.actor.instance.L2PcInstance;
-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.Instance;
-import com.l2jserver.gameserver.model.zone.type.L2ArenaZone;
-import com.l2jserver.gameserver.model.zone.type.L2ClanHallZone;
-
-
-/**
- * This class ...
- */
-public class MapRegionTable
-{
-	private static Logger _log = Logger.getLogger(MapRegionTable.class.getName());
-	
-	private final int[][] _regions = new int[16][18];
-	
-	public static enum TeleportWhereType
-	{
-		Castle,
-		ClanHall,
-		SiegeFlag,
-		Town,
-		Fortress
-	}
-	
-	public static MapRegionTable getInstance()
-	{
-		return SingletonHolder._instance;
-	}
-	
-	private MapRegionTable()
-	{
-		int count2 = 0;
-		
-		//LineNumberReader lnr = null;
-		Connection con = null;
-		try
-		{
-			con = L2DatabaseFactory.getInstance().getConnection();
-			PreparedStatement statement = con.prepareStatement("SELECT region, sec0, sec1, sec2, sec3, sec4, sec5, sec6, sec7, sec8, sec9, sec10,sec11,sec12,sec13,sec14,sec15 FROM mapregion");
-			ResultSet rset = statement.executeQuery();
-			int region;
-			while (rset.next())
-			{
-				region = rset.getInt(1);
-				
-				for (int j = 0; j < 16; j++)
-				{
-					_regions[j][region] = rset.getInt(j + 2);
-					count2++;
-					//_log.fine(j+","+region+" -> "+rset.getInt(j+2));
-				}
-			}
-			
-			rset.close();
-			statement.close();
-			if (Config.DEBUG)
-				_log.fine(count2 + " mapregion loaded");
-		}
-		catch (Exception e)
-		{
-			_log.log(Level.SEVERE, "Error loading Map Region Table.", e);
-		}
-		finally
-		{
-			L2DatabaseFactory.close(con);
-		}
-	}
-	
-	public final int getMapRegion(int posX, int posY)
-	{
-		try
-		{
-			return _regions[getMapRegionX(posX)][getMapRegionY(posY)];
-		}
-		catch (ArrayIndexOutOfBoundsException e)
-		{
-			// Position sent is outside MapRegionTable area.
-			if (Config.DEBUG)
-				_log.log(Level.WARNING, "MapRegionTable: Player outside map regions at X,Y=" + posX + "," + posY, e);
-			return 0;
-		}
-	}
-	
-	public final int getMapRegionX(int posX)
-	{
-		return (posX >> 15) + 9;// + centerTileX;
-	}
-	
-	public final int getMapRegionY(int posY)
-	{
-		return (posY >> 15) + 10;// + centerTileX;
-	}
-	
-	public int getAreaCastle(L2Character activeChar)
-	{
-		int area = getClosestTownNumber(activeChar);
-		int castle;
-		switch (area)
-		{
-			case 0:
-				castle = 1;
-				break;//Talking Island Village
-			case 1:
-				castle = 4;
-				break; //Elven Village
-			case 2:
-				castle = 4;
-				break; //Dark Elven Village
-			case 3:
-				castle = 9;
-				break; //Orc Village
-			case 4:
-				castle = 9;
-				break; //Dwarven Village
-			case 5:
-				castle = 1;
-				break; //Town of Gludio
-			case 6:
-				castle = 1;
-				break; //Gludin Village
-			case 7:
-				castle = 2;
-				break; //Town of Dion
-			case 8:
-				castle = 3;
-				break; //Town of Giran
-			case 9:
-				castle = 4;
-				break; //Town of Oren
-			case 10:
-				castle = 5;
-				break; //Town of Aden
-			case 11:
-				castle = 5;
-				break; //Hunters Village
-			case 12:
-				castle = 3;
-				break; //Giran Harbor
-			case 13:
-				castle = 6;
-				break; //Heine
-			case 14:
-				castle = 8;
-				break; //Rune Township
-			case 15:
-				castle = 7;
-				break; //Town of Goddard
-			case 16:
-				castle = 9;
-				break; //Town of Shuttgart
-			case 17:
-				castle = 2;
-				break; //Floran Village
-			case 18:
-				castle = 8;
-				break; //Primeval Isle Wharf
-			case 19:
-				castle = 5;
-				break; //Kamael Village
-			case 20:
-				castle = 6;
-				break; //South of Wastelands Camp
-			case 21:
-				castle = 8;
-				break; //Fantasy Island
-			default:
-				castle = 5;
-				break; //Town of Aden
-		}
-		return castle;
-	}
-	
-	public int getClosestTownNumber(L2Character activeChar)
-	{
-		return getMapRegion(activeChar.getX(), activeChar.getY());
-	}
-	
-	/**
-	 * Get town name by character position
-	 * @param activeChar
-	 * @return String
-	 */
-	public String getClosestTownName(L2Character activeChar)
-	{
-		return getClosestTownName(getMapRegion(activeChar.getX(), activeChar.getY()));
-	}
-	
-	/**
-	 * Get town name by town id
-	 * @param townId
-	 * @return String
-	 */
-	public String getClosestTownName(int townId)
-	{
-		String nearestTown = null;
-		switch (townId)
-		{
-			case 0:
-				nearestTown = "Talking Island Village";
-				break;
-			case 1:
-				nearestTown = "Elven Village";
-				break;
-			case 2:
-				nearestTown = "Dark Elven Village";
-				break;
-			case 3:
-				nearestTown = "Orc Village";
-				break;
-			case 4:
-				nearestTown = "Dwarven Village";
-				break;
-			case 5:
-				nearestTown = "Town of Gludio";
-				break;
-			case 6:
-				nearestTown = "Gludin Village";
-				break;
-			case 7:
-				nearestTown = "Town of Dion";
-				break;
-			case 8:
-				nearestTown = "Town of Giran";
-				break;
-			case 9:
-				nearestTown = "Town of Oren";
-				break;
-			case 10:
-				nearestTown = "Town of Aden";
-				break;
-			case 11:
-				nearestTown = "Hunters Village";
-				break;
-			case 12:
-				nearestTown = "Giran Harbor";
-				break;
-			case 13:
-				nearestTown = "Heine";
-				break;
-			case 14:
-				nearestTown = "Rune Township";
-				break;
-			case 15:
-				nearestTown = "Town of Goddard";
-				break;
-			case 16:
-				nearestTown = "Town of Schuttgart";
-				break;
-			case 18:
-				nearestTown = "Primeval Isle";
-				break;
-			case 19:
-				nearestTown = "Kamael Village";
-				break;
-			case 20:
-				nearestTown = "South of Wastelands Camp";
-				break;
-			case 21:
-				nearestTown = "Fantasy Island";
-				break;
-			case 22:
-				nearestTown = "Neutral Zone";
-				break;
-			case 23:
-				nearestTown = "Coliseum";
-				break;
-			case 24:
-				nearestTown = "GM Consultation service";
-				break;
-			case 25:
-				nearestTown = "Dimensional Gap";
-				break;
-			case 26:
-				nearestTown = "Cemetary of the Empire";
-				break;
-			case 27:
-				nearestTown = "Inside the Steel Citadel";
-				break;
-			case 28:
-				nearestTown = "Steel Citadel Resistance";
-				break;
-			case 29:
-				nearestTown = "Inside Kamaloka";
-				break;
-			case 30:
-				nearestTown = "Inside Nia Kamaloka";
-				break;
-			case 31:
-				nearestTown = "Inside Rim Kamaloka";
-				break;
-			case 32:
-				nearestTown = "Keucereus clan association";
-				break;
-			case 33:
-				nearestTown = "Inside the Seed of Infinity";
-				break;
-			case 34:
-				nearestTown = "Outside the Seed of Infinity";
-				break;
-			case 35:
-				nearestTown = "Aerial Cleft";
-				break;
-			default:
-				nearestTown = "Town of Aden";
-				break;
-		}
-		
-		return nearestTown;
-	}
-	
-	public Location getTeleToLocation(L2Character activeChar, TeleportWhereType teleportWhere)
-	{
-		int[] coord;
-		
-		if (activeChar instanceof L2PcInstance)
-		{
-			L2PcInstance player = ((L2PcInstance) activeChar);
-			
-			// If in Monster Derby Track
-			if (player.isInsideZone(L2Character.ZONE_MONSTERTRACK))
-				return new Location(12661, 181687, -3560);
-			
-			Castle castle = null;
-			Fort fort = null;
-			ClanHall clanhall = null;
-			
-			if (player.getClan() != null
-					&& !player.isFlyingMounted()
-					&& !player.isFlying()) // flying players in gracia cant use teleports to aden continent
-			{
-				// If teleport to clan hall
-				if (teleportWhere == TeleportWhereType.ClanHall)
-				{
-					
-					clanhall = ClanHallManager.getInstance().getClanHallByOwner(player.getClan());
-					if (clanhall != null)
-					{
-						L2ClanHallZone zone = clanhall.getZone();
-						if (zone != null && !player.isFlyingMounted())
-							return zone.getSpawnLoc();
-					}
-				}
-				
-				// If teleport to castle
-				if (teleportWhere == TeleportWhereType.Castle)
-				{
-					castle = CastleManager.getInstance().getCastleByOwner(player.getClan());
-					// Otherwise check if player is on castle or fortress ground
-					// and player's clan is defender
-					if (castle == null)
-					{
-						castle = CastleManager.getInstance().getCastle(player);
-						if (!(castle != null && castle.getSiege().getIsInProgress() && castle.getSiege().getDefenderClan(player.getClan()) != null))
-							castle = null;
-					}
-					
-					if (castle != null && castle.getCastleId() > 0)
-						return castle.getCastleZone().getSpawnLoc();
-				}
-				
-				// If teleport to fortress
-				if (teleportWhere == TeleportWhereType.Fortress)
-				{
-					fort = FortManager.getInstance().getFortByOwner(player.getClan());
-					// Otherwise check if player is on castle or fortress ground
-					// and player's clan is defender
-					if (fort == null)
-					{
-						fort = FortManager.getInstance().getFort(player);
-						if (!(fort != null && fort.getSiege().getIsInProgress() && fort.getOwnerClan() == player.getClan()))
-							fort = null;
-					}
-					
-					if (fort != null && fort.getFortId() > 0)
-						return fort.getFortZone().getSpawnLoc();
-				}
-				
-				// If teleport to SiegeHQ
-				if (teleportWhere == TeleportWhereType.SiegeFlag)
-				{
-					castle = CastleManager.getInstance().getCastle(player);
-					fort = FortManager.getInstance().getFort(player);
-					L2SiegeFlagInstance tw_flag = TerritoryWarManager.getInstance().getFlagForClan(player.getClan());
-					if (tw_flag != null)
-						return new Location(tw_flag.getX(), tw_flag.getY(), tw_flag.getZ());
-					else if (castle != null)
-					{
-						if (castle.getSiege().getIsInProgress())
-						{
-							// Check if player's clan is attacker
-							List<L2Npc> flags = castle.getSiege().getFlag(player.getClan());
-							if (flags != null && !flags.isEmpty())
-							{
-								// Spawn to flag - Need more work to get player to the nearest flag
-								L2Npc flag = flags.get(0);
-								return new Location(flag.getX(), flag.getY(), flag.getZ());
-							}
-						}
-						
-					}
-					else if (fort != null)
-					{
-						if (fort.getSiege().getIsInProgress())
-						{
-							// Check if player's clan is attacker
-							List<L2Npc> flags = fort.getSiege().getFlag(player.getClan());
-							if (flags != null && !flags.isEmpty())
-							{
-								// Spawn to flag - Need more work to get player to the nearest flag
-								L2Npc flag = flags.get(0);
-								return new Location(flag.getX(), flag.getY(), flag.getZ());
-							}
-						}
-					}
-				}
-			}
-			
-			//Karma player land out of city
-			if (player.getKarma() > 0)
-			{
-				try
-				{
-					return TownManager.getClosestTown(activeChar).getChaoticSpawnLoc();
-				}
-				catch (Exception e)
-				{
-					if (player.isFlyingMounted()) // prevent flying players to teleport outside of gracia
-						return new Location(-186330, 242944, 2544);
-					else
-						return new Location(17817, 170079, -3530);
-				}
-			}
-			
-			// Checking if in arena
-			L2ArenaZone arena = ZoneManager.getInstance().getArena(player);
-			if (arena != null)
-				return arena.getSpawnLoc();
-			
-			//Checking if needed to be respawned in "far" town from the castle;
-			castle = CastleManager.getInstance().getCastle(player);
-			if (castle != null)
-			{
-				if (castle.getSiege().getIsInProgress())
-				{
-					// Check if player's clan is participating
-					if ((castle.getSiege().checkIsDefender(player.getClan()) || castle.getSiege().checkIsAttacker(player.getClan()))
-							&& SevenSigns.getInstance().getSealOwner(SevenSigns.SEAL_STRIFE) == SevenSigns.CABAL_DAWN)
-						return TownManager.getSecondClosestTown(activeChar).getSpawnLoc();
-				}
-			}
-			
-			// Checking if in an instance
-			if (player.getInstanceId() > 0)
-			{
-				Instance inst = InstanceManager.getInstance().getInstance(player.getInstanceId());
-				if (inst != null)
-				{
-					coord = inst.getSpawnLoc();
-					if (coord[0] != 0 && coord[1] != 0 && coord[2] != 0)
-						return new Location(coord[0], coord[1], coord[2]);
-				}
-			}
-		}
-		
-		// Get the nearest town
-		try
-		{
-			return TownManager.getClosestTown(activeChar).getSpawnLoc();
-		}
-		catch (NullPointerException e)
-		{
-			// port to the Talking Island if no closest town found
-			return new Location(-84176, 243382, -3126);
-		}
-	}
-	
-	@SuppressWarnings("synthetic-access")
-	private static class SingletonHolder
-	{
-		protected static final MapRegionTable _instance = new MapRegionTable();
-	}
-}

+ 14 - 10
L2J_Server_BETA/java/com/l2jserver/gameserver/instancemanager/ClanHallManager.java

@@ -26,6 +26,7 @@ import javolution.util.FastMap;
 import com.l2jserver.L2DatabaseFactory;
 import com.l2jserver.gameserver.datatables.ClanTable;
 import com.l2jserver.gameserver.model.L2Clan;
+import com.l2jserver.gameserver.model.L2Object;
 import com.l2jserver.gameserver.model.entity.Auction;
 import com.l2jserver.gameserver.model.entity.ClanHall;
 import com.l2jserver.gameserver.model.zone.type.L2ClanHallZone;
@@ -195,17 +196,20 @@ public class ClanHallManager
 	}
 	
 	/** Get Clan Hall by x,y,z */
-	/*
-		public final ClanHall getClanHall(int x, int y, int z)
+	public final ClanHall getClanHall(int x, int y, int z)
+	{
+		for (ClanHall temp : getClanHalls().values())
 		{
-			for (Map.Entry<Integer, ClanHall> ch : _clanHall.entrySet())
-				if (ch.getValue().getZone().isInsideZone(x, y, z)) return ch.getValue();
-
-			for (Map.Entry<Integer, ClanHall> ch : _freeClanHall.entrySet())
-				if (ch.getValue().getZone().isInsideZone(x, y, z)) return ch.getValue();
-
-			return null;
-		}*/
+			if (temp.checkIfInZone(x, y, z))
+				return temp;
+		}
+		return null;
+	}
+	
+	public final ClanHall getClanHall(L2Object activeObject)
+	{
+		return getClanHall(activeObject.getX(), activeObject.getY(), activeObject.getZ());
+	}
 	
 	public final ClanHall getNearbyClanHall(int x, int y, int maxDist)
 	{

+ 499 - 0
L2J_Server_BETA/java/com/l2jserver/gameserver/instancemanager/MapRegionManager.java

@@ -0,0 +1,499 @@
+/*
+ * 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 com.l2jserver.gameserver.instancemanager;
+
+import java.io.File;
+import java.util.List;
+import java.util.Map;
+import java.util.logging.Level;
+import java.util.logging.Logger;
+
+import javax.xml.parsers.DocumentBuilderFactory;
+
+import org.w3c.dom.Document;
+import org.w3c.dom.NamedNodeMap;
+import org.w3c.dom.Node;
+
+import com.l2jserver.Config;
+import com.l2jserver.gameserver.SevenSigns;
+import com.l2jserver.gameserver.model.L2MapRegion;
+import com.l2jserver.gameserver.model.L2Object;
+import com.l2jserver.gameserver.model.Location;
+import com.l2jserver.gameserver.model.actor.L2Character;
+import com.l2jserver.gameserver.model.actor.L2Npc;
+import com.l2jserver.gameserver.model.actor.instance.L2PcInstance;
+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.Instance;
+import com.l2jserver.gameserver.model.zone.type.L2ClanHallZone;
+import com.l2jserver.gameserver.model.zone.type.L2RespawnZone;
+
+import javolution.util.FastMap;
+
+/**
+ * @author Nyaran
+ *
+ */
+public class MapRegionManager
+{
+	protected static final Logger _log = Logger.getLogger(MapRegionManager.class.getName());
+	private static Map<String, L2MapRegion> _regions;
+	
+	private static final String FILE = "MapRegion.xml";
+	
+	public static enum TeleportWhereType
+	{
+		Castle,
+		Castle_banish,
+		ClanHall,
+		ClanHall_banish,
+		SiegeFlag,
+		Town,
+		Fortress,
+		Fortress_banish,
+		Territory,
+		Territory_banish
+	}
+	
+	public static MapRegionManager getInstance()
+	{
+		return SingletonHolder._instance;
+	}
+	
+	private MapRegionManager()
+	{
+		_regions = new FastMap<String, L2MapRegion>();
+		
+		try
+		{
+			load();
+		}
+		catch (Exception e)
+		{
+			e.printStackTrace();
+			_log.log(Level.SEVERE, "Failed loading MapRegion", e);
+		}
+	}
+	
+	private static void load() throws Exception
+	{
+		DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance();
+		factory.setValidating(false);
+		factory.setIgnoringComments(true);
+		File file = new File(Config.DATAPACK_ROOT + "/data/" + FILE);
+		if (file.exists())
+		{
+			Document doc = factory.newDocumentBuilder().parse(file);
+			for (Node n = doc.getFirstChild(); n != null; n = n.getNextSibling())
+			{
+				if ("list".equalsIgnoreCase(n.getNodeName()))
+				{
+					for (Node d = n.getFirstChild(); d != null; d = d.getNextSibling())
+					{
+						if ("region".equalsIgnoreCase(d.getNodeName()))
+						{
+							NamedNodeMap attrs = d.getAttributes();
+							Node att;
+							String name = "";
+							String town = "";
+							int locId = -1;
+							int castle = -1;
+							int bbs = -1;
+							
+							att = attrs.getNamedItem("name");
+							if (att == null)
+							{
+								_log.severe("Missing name for MapRegion, skipping");
+								continue;
+							}
+							name = att.getNodeValue();
+							
+							att = attrs.getNamedItem("town");
+							if (att == null)
+							{
+								_log.severe("Missing town for MapRegion name: " + name + ", skipping");
+								continue;
+							}
+							town = att.getNodeValue();
+							
+							att = attrs.getNamedItem("locId");
+							if (att == null)
+							{
+								_log.severe("Missing locId for MapRegion name: " + name + ", skipping");
+								continue;
+							}
+							locId = Integer.parseInt(att.getNodeValue());
+							
+							att = attrs.getNamedItem("castle");
+							if (att == null)
+							{
+								_log.severe("Missing castle for MapRegion name: " + name + ", skipping");
+								continue;
+							}
+							castle = Integer.parseInt(att.getNodeValue());
+							
+							att = attrs.getNamedItem("bbs");
+							if (att == null)
+							{
+								_log.severe("Missing bbs for MapRegion name: " + name + ", skipping");
+								continue;
+							}
+							bbs = Integer.parseInt(att.getNodeValue());
+							
+							L2MapRegion region = new L2MapRegion(name, town, locId, castle, bbs);
+							for (Node c = d.getFirstChild(); c != null; c = c.getNextSibling())
+							{
+								if ("respawnPoint".equalsIgnoreCase(c.getNodeName()))
+								{
+									attrs = c.getAttributes();
+									int spawnX = Integer.parseInt(attrs.getNamedItem("X").getNodeValue());
+									int spawnY = Integer.parseInt(attrs.getNamedItem("Y").getNodeValue());
+									int spawnZ = Integer.parseInt(attrs.getNamedItem("Z").getNodeValue());
+									
+									Node val = attrs.getNamedItem("isOther");
+									boolean other = val != null && Boolean.parseBoolean(val.getNodeValue());
+									
+									val = attrs.getNamedItem("isChaotic");
+									boolean chaotic = val != null && Boolean.parseBoolean(val.getNodeValue());
+									
+									val = attrs.getNamedItem("isBanish");
+									boolean banish = val != null && Boolean.parseBoolean(val.getNodeValue());
+									
+									if (other)
+										region.addOtherSpawn(spawnX, spawnY, spawnZ);
+									else if (chaotic)
+										region.addChaoticSpawn(spawnX, spawnY, spawnZ);
+									else if (banish)
+										region.addBanishSpawn(spawnX, spawnY, spawnZ);
+									else
+										region.addSpawn(spawnX, spawnY, spawnZ);
+								}
+								else if ("map".equalsIgnoreCase(c.getNodeName()))
+								{
+									attrs = c.getAttributes();
+									int mapX = Integer.parseInt(attrs.getNamedItem("X").getNodeValue());
+									int mapY = Integer.parseInt(attrs.getNamedItem("Y").getNodeValue());
+									
+									region.addMap(mapX, mapY);
+								}
+								else if ("banned".equalsIgnoreCase(c.getNodeName()))
+								{
+									attrs = c.getAttributes();
+									String race = attrs.getNamedItem("race").getNodeValue();
+									String point = attrs.getNamedItem("point").getNodeValue();
+									
+									region.addBannedRace(race, point);
+								}
+							}
+							_regions.put(name, region);
+						}
+					}
+				}
+			}
+		}
+		else
+			_log.severe("MapRegion file (" + file.getAbsolutePath() + ") doesnt exists.");
+	}
+	
+	public final L2MapRegion getMapRegion(int locX, int locY)
+	{
+		for (L2MapRegion region : _regions.values())
+		{
+			if (region.isZoneInRegion(getMapRegionX(locX), getMapRegionY(locY)))
+				return region;
+		}
+		return null;
+	}
+	
+	public final int getMapRegionId(int locX, int locY)
+	{
+		L2MapRegion region = getMapRegion(locX, locY);
+		if (region != null)
+			return region.getLocId();
+		
+		if (Config.DEBUG_PATH)
+			_log.log(Level.WARNING, "MapRegionManager: Player outside map regions at X,Y=" + locX + "," + locY);
+		return 0;
+	}
+	
+	public final L2MapRegion getMapRegion(L2Object obj)
+	{
+		return getMapRegion(obj.getX(), obj.getY());
+	}
+	
+	public final int getMapRegionId(L2Object obj)
+	{
+		return getMapRegionId(obj.getX(), obj.getY());
+	}
+	
+	public final int getMapRegionX(int posX)
+	{
+		return (posX >> 15) + 9 + 11;// + centerTileX;
+	}
+	
+	public final int getMapRegionY(int posY)
+	{
+		return (posY >> 15) + 10 + 8;// + centerTileX;
+	}
+	
+	/**
+	 * Get town name by character position
+	 * @param townId
+	 * @return String
+	 */
+	public String getClosestTownName(L2Character activeChar)
+	{
+		L2MapRegion region = getMapRegion(activeChar);
+		
+		if (region == null)
+			return "Aden Castle Town";
+		
+		return region.getTown();
+	}
+	
+	public int getAreaCastle(L2Character activeChar)
+	{
+		L2MapRegion region = getMapRegion(activeChar);
+		
+		if (region == null)
+			return 0;
+		
+		return region.getCastle();
+	}
+	
+	public Location getTeleToLocation(L2Character activeChar, TeleportWhereType teleportWhere)
+	{
+		int[] coord;
+		
+		if (activeChar instanceof L2PcInstance)
+		{
+			L2PcInstance player = ((L2PcInstance) activeChar);
+			
+			Castle castle = null;
+			Fort fort = null;
+			ClanHall clanhall = null;
+			
+			if (player.getClan() != null && !player.isFlyingMounted() && !player.isFlying()) // flying players in gracia cant use teleports to aden continent
+			{
+				// If teleport to clan hall
+				if (teleportWhere == TeleportWhereType.ClanHall)
+				{
+					clanhall = ClanHallManager.getInstance().getClanHallByOwner(player.getClan());
+					if (clanhall != null)
+					{
+						L2ClanHallZone zone = clanhall.getZone();
+						if (zone != null && !player.isFlyingMounted())
+						{
+							if (player.getKarma() > 0)
+								return zone.getChaoticSpawnLoc();
+							else
+								return zone.getSpawnLoc();
+						}
+					}
+				}
+				
+				// If teleport to castle
+				if (teleportWhere == TeleportWhereType.Castle)
+				{
+					castle = CastleManager.getInstance().getCastleByOwner(player.getClan());
+					// Otherwise check if player is on castle or fortress ground
+					// and player's clan is defender
+					if (castle == null)
+					{
+						castle = CastleManager.getInstance().getCastle(player);
+						if (!(castle != null && castle.getSiege().getIsInProgress() && castle.getSiege().getDefenderClan(player.getClan()) != null))
+							castle = null;
+					}
+					
+					if (castle != null && castle.getCastleId() > 0)
+					{
+						if (player.getKarma() > 0)
+							return castle.getCastleZone().getChaoticSpawnLoc();
+						else
+							return castle.getCastleZone().getSpawnLoc();
+					}
+				}
+				
+				// If teleport to fortress
+				if (teleportWhere == TeleportWhereType.Fortress)
+				{
+					fort = FortManager.getInstance().getFortByOwner(player.getClan());
+					// Otherwise check if player is on castle or fortress ground
+					// and player's clan is defender
+					if (fort == null)
+					{
+						fort = FortManager.getInstance().getFort(player);
+						if (!(fort != null && fort.getSiege().getIsInProgress() && fort.getOwnerClan() == player.getClan()))
+							fort = null;
+					}
+					
+					if (fort != null && fort.getFortId() > 0)
+					{
+						if (player.getKarma() > 0)
+							return fort.getFortZone().getChaoticSpawnLoc();
+						else
+							return fort.getFortZone().getSpawnLoc();
+					}
+				}
+				
+				// If teleport to SiegeHQ
+				if (teleportWhere == TeleportWhereType.SiegeFlag)
+				{
+					castle = CastleManager.getInstance().getCastle(player);
+					fort = FortManager.getInstance().getFort(player);
+					L2SiegeFlagInstance tw_flag = TerritoryWarManager.getInstance().getFlagForClan(player.getClan());
+					if (tw_flag != null)
+						return new Location(tw_flag.getX(), tw_flag.getY(), tw_flag.getZ());
+					else if (castle != null)
+					{
+						if (castle.getSiege().getIsInProgress())
+						{
+							// Check if player's clan is attacker
+							List<L2Npc> flags = castle.getSiege().getFlag(player.getClan());
+							if (flags != null && !flags.isEmpty())
+							{
+								// Spawn to flag - Need more work to get player to the nearest flag
+								L2Npc flag = flags.get(0);
+								return new Location(flag.getX(), flag.getY(), flag.getZ());
+							}
+						}
+						
+					}
+					else if (fort != null)
+					{
+						if (fort.getSiege().getIsInProgress())
+						{
+							// Check if player's clan is attacker
+							List<L2Npc> flags = fort.getSiege().getFlag(player.getClan());
+							if (flags != null && !flags.isEmpty())
+							{
+								// Spawn to flag - Need more work to get player to the nearest flag
+								L2Npc flag = flags.get(0);
+								return new Location(flag.getX(), flag.getY(), flag.getZ());
+							}
+						}
+					}
+				}
+			}
+			
+			if (teleportWhere == TeleportWhereType.Castle_banish)
+			{
+				castle = CastleManager.getInstance().getCastle(player);
+				if (castle != null)
+					return castle.getCastleZone().getBanishSpawnLoc();
+			}
+			else if (teleportWhere == TeleportWhereType.Fortress_banish)
+			{
+				fort = FortManager.getInstance().getFort(activeChar);
+				if (fort != null)
+					return fort.getFortZone().getBanishSpawnLoc();
+			}
+			else if (teleportWhere == TeleportWhereType.ClanHall_banish)
+			{
+				clanhall = ClanHallManager.getInstance().getClanHall(activeChar);
+				if (clanhall != null)
+					return clanhall.getZone().getBanishSpawnLoc();
+			}
+			
+			
+			//Karma player land out of city
+			if (player.getKarma() > 0)
+			{
+				try
+				{
+					L2RespawnZone zone = ZoneManager.getInstance().getZone(player, L2RespawnZone.class);
+					if (zone != null)
+						return getRestartRegion(activeChar, zone.getRespawnPoint((L2PcInstance) activeChar)).getChaoticSpawnLoc();
+					else
+						return getMapRegion(activeChar).getChaoticSpawnLoc();
+				}
+				catch (Exception e)
+				{
+					if (player.isFlyingMounted()) // prevent flying players to teleport outside of gracia
+						return _regions.get("union_base_of_kserth").getChaoticSpawnLoc();
+					else
+						return _regions.get("talking_island_town").getChaoticSpawnLoc();
+				}
+			}
+			
+			//Checking if needed to be respawned in "far" town from the castle;
+			castle = CastleManager.getInstance().getCastle(player);
+			if (castle != null)
+			{
+				if (castle.getSiege().getIsInProgress())
+				{
+					// Check if player's clan is participating
+					if ((castle.getSiege().checkIsDefender(player.getClan()) || castle.getSiege().checkIsAttacker(player.getClan())) && SevenSigns.getInstance().getSealOwner(SevenSigns.SEAL_STRIFE) == SevenSigns.CABAL_DAWN)
+						return castle.getCastleZone().getOtherSpawnLoc();
+				}
+			}
+			
+			// Checking if in an instance
+			if (player.getInstanceId() > 0)
+			{
+				Instance inst = InstanceManager.getInstance().getInstance(player.getInstanceId());
+				if (inst != null)
+				{
+					coord = inst.getSpawnLoc();
+					if (coord[0] != 0 && coord[1] != 0 && coord[2] != 0)
+						return new Location(coord[0], coord[1], coord[2]);
+				}
+			}
+		}
+		
+		// Get the nearest town
+		try
+		{
+			L2RespawnZone zone = ZoneManager.getInstance().getZone(activeChar, L2RespawnZone.class);
+			if (zone != null)
+				return getRestartRegion(activeChar, zone.getRespawnPoint((L2PcInstance) activeChar)).getSpawnLoc();
+			else
+				return getMapRegion(activeChar).getSpawnLoc();
+		}
+		catch (Exception e)
+		{
+			// port to the Talking Island if no closest town found
+			if (Config.DEBUG)
+				_log.log(Level.WARNING, "Not defined respawn point for coords loc X=" + activeChar.getX() + " Y=" + activeChar.getY() + " Z=" + activeChar.getZ());
+			return _regions.get("talking_island_town").getSpawnLoc();
+		}
+	}
+	
+	public L2MapRegion getRestartRegion(L2Character activeChar, String point)
+	{
+		try
+		{
+			L2PcInstance player = ((L2PcInstance) activeChar);
+			L2MapRegion region = _regions.get(point);
+			
+			if (region.getBannedRace().containsKey(player.getRace()))
+				getRestartRegion(player, region.getBannedRace().get(player.getRace()));
+			return region;
+		}
+		catch (Exception e)
+		{
+			return _regions.get("talking_island_town");
+		}
+	}
+	
+	@SuppressWarnings("synthetic-access")
+	private static class SingletonHolder
+	{
+		protected static final MapRegionManager _instance = new MapRegionManager();
+	}
+	
+}

+ 26 - 260
L2J_Server_BETA/java/com/l2jserver/gameserver/instancemanager/TownManager.java

@@ -14,8 +14,6 @@
  */
 package com.l2jserver.gameserver.instancemanager;
 
-import com.l2jserver.gameserver.datatables.MapRegionTable;
-import com.l2jserver.gameserver.model.L2Object;
 import com.l2jserver.gameserver.model.entity.Castle;
 import com.l2jserver.gameserver.model.zone.L2ZoneType;
 import com.l2jserver.gameserver.model.zone.type.L2TownZone;
@@ -24,260 +22,38 @@ public class TownManager
 {
 	//private static final Logger _log = Logger.getLogger(TownManager.class.getName());
 	
-	// =========================================================
-	// Property - Public
-	
-	public final static L2TownZone getClosestTown(L2Object activeObject)
-	{
-		switch (MapRegionTable.getInstance().getMapRegion(activeObject.getPosition().getX(), activeObject.getPosition().getY()))
-		{
-			case 0:
-				return getTown(2); // TI
-			case 1:
-				return getTown(3); // Elven
-			case 2:
-				return getTown(1); // DE
-			case 3:
-				return getTown(4); // Orc
-			case 4:
-				return getTown(6); // Dwarven
-			case 5:
-				return getTown(7); // Gludio
-			case 6:
-				return getTown(5); // Gludin
-			case 7:
-				return getTown(8); // Dion
-			case 8:
-				return getTown(9); // Giran
-			case 9:
-				return getTown(10); // Oren
-			case 10:
-				return getTown(12); // Aden
-			case 11:
-				return getTown(11); // HV
-			case 12:
-				return getTown(9); // Giran Harbour
-			case 13:
-				return getTown(15); // Heine
-			case 14:
-				return getTown(14); // Rune
-			case 15:
-				return getTown(13); // Goddard
-			case 16:
-				return getTown(17); // Schuttgart
-			case 17:
-				return getTown(16); // Floran
-			case 18:
-				return getTown(19); //Primeval Isle
-			case 19:
-				return getTown(20); //Kamael Village
-			case 20:
-				return getTown(21); //South of Wastelands Camp
-			case 21:
-				return getTown(22); //Fantasy Island
-			case 22:
-				return getTown(23); //Neutral Zone
-			case 23:
-				return getTown(24);//Coliseum
-			case 24:
-				return getTown(25);//GM Consultation service
-			case 25:
-				return getTown(26);//Dimensional Gap
-			case 26:
-				return getTown(27);//Cemetery of the Empire
-			case 27:
-				return getTown(28);//inside the Steel Citadel
-			case 28:
-				return getTown(29);//Steel Citadel Resistance
-			case 29:
-				return getTown(30);//Inside Kamaloka
-			case 30:
-				return getTown(31);//Inside Nia Kamaloka
-			case 31:
-				return getTown(32);//Inside Rim Kamaloka
-			case 32:
-				return getTown(33);//near the Keucereus clan association location
-			case 33:
-				return getTown(34);//inside the Seed of Infinity
-			case 34:
-				return getTown(35);//outside the Seed of Infinity
-			case 35:
-				return getTown(36);//inside Aerial Cleft
-		}
-		
-		return getTown(16); // Default to floran
-	}
-	
-	public final static L2TownZone getSecondClosestTown(L2Object activeObject)
+	public final static int getTownCastle(int townId)
 	{
-		switch (MapRegionTable.getInstance().getMapRegion(activeObject.getPosition().getX(), activeObject.getPosition().getY()))
+		switch(townId)
 		{
-			case 0:
-				return getTown(5); // TI
-			case 1:
-				return getTown(5); // Elven
-			case 2:
-				return getTown(5); // DE
-			case 3:
-				return getTown(4); // Orc
-			case 4:
-				return getTown(6); // Dwarven
-			case 5:
-				return getTown(5); // Gludio
-			case 6:
-				return getTown(5); // Gludin
-			case 7:
-				return getTown(7); // Dion
-			case 8:
-				return getTown(11); // Giran
-			case 9:
-				return getTown(11); // Oren
-			case 10:
-				return getTown(11); // Aden
-			case 11:
-				return getTown(11); // HV
-			case 12:
-				return getTown(16); // Giran Harbour
-			case 13:
-				return getTown(16); // Heine
-			case 14:
-				return getTown(13); // Rune
-			case 15:
-				return getTown(12); // Goddard
-			case 16:
-				return getTown(6); // Schuttgart
-			case 17:
-				return getTown(16); // Floran
-			case 18:
-				return getTown(19); //Primeval Isle
-			case 19:
-				return getTown(20); //Kamael Village
-			case 20:
-				return getTown(21); //South of Wastelands Camp
-			case 21:
-				return getTown(22); //Fantasy Island
-			case 22:
-				return getTown(23); //Neutral Zone
-			case 23:
-				return getTown(24);//Coliseum
-			case 24:
-				return getTown(25);//GM Consultation service
-			case 25:
-				return getTown(26);//Dimensional Gap
-			case 26:
-				return getTown(27);//Cemetery of the Empire
-			case 27:
-				return getTown(28);//inside the Steel Citadel
-			case 28:
-				return getTown(29);//Steel Citadel Resistance
-			case 29:
-				return getTown(30);//Inside Kamaloka
-			case 30:
-				return getTown(31);//Inside Nia Kamaloka
-			case 31:
-				return getTown(32);//Inside Rim Kamaloka
-			case 32:
-				return getTown(33);//near the Keucereus clan association location
-			case 33:
-				return getTown(34);//inside the Seed of Infinity
-			case 34:
-				return getTown(35);//outside the Seed of Infinity
-			case 35:
-				return getTown(36);//inside Aerial Cleft
+			case 912:
+				return 1;
+			case 916:
+				return 2;
+			case 918:
+				return 3;
+			case 922:
+				return 4;
+			case 924:
+				return 5;
+			case 926:
+				return 6;
+			case 1537:
+				return 7;
+			case 1538:
+				return 8;
+			case 1714:
+				return 9;
+			default:
+				return 0;
 		}
-		
-		return getTown(16); // Default to floran
-	}
-	
-	public final static int getClosestLocation(L2Object activeObject)
-	{
-		switch (MapRegionTable.getInstance().getMapRegion(activeObject.getPosition().getX(), activeObject.getPosition().getY()))
-		{
-			case 0:
-				return 1; // TI
-			case 1:
-				return 4; // Elven
-			case 2:
-				return 3; // DE
-			case 3:
-				return 9; // Orc
-			case 4:
-				return 9; // Dwarven
-			case 5:
-				return 2; // Gludio
-			case 6:
-				return 2; // Gludin
-			case 7:
-				return 5; // Dion
-			case 8:
-				return 6; // Giran
-			case 9:
-				return 10; // Oren
-			case 10:
-				return 13; // Aden
-			case 11:
-				return 11; // HV
-			case 12:
-				return 6; // Giran Harbour
-			case 13:
-				return 12; // Heine
-			case 14:
-				return 14; // Rune
-			case 15:
-				return 15; // Goddard
-			case 16:
-				return 9; // Schuttgart
-				/*
-			case 17:
-				return getTown(16); // Floran
-			case 18:
-				return getTown(19); //Primeval Isle
-            case 19:
-                return getTown(20); //Kamael Village
-            case 20:
-                return getTown(21); //South of Wastelands Camp
-            case 21:
-                return getTown(22); //Fantasy Island
-            case 22:
-                return 7; //Neutral Zone
-            case 23:
-                return getTown(24);//Coliseum
-            case 24:
-                return getTown(25);//GM Consultation service
-            case 25:
-                return getTown(26);//Dimensional Gap
-            case 26:
-                return getTown(27);//Cemetery of the Empire
-            case 27:
-                return getTown(28);//inside the Steel Citadel
-            case 28:
-                return getTown(29);//Steel Citadel Resistance
-            case 29:
-                return getTown(30);//Inside Kamaloka
-            case 30:
-                return getTown(31);//Inside Nia Kamaloka
-            case 31:
-                return getTown(32);//Inside Rim Kamaloka
-            case 32:
-                return getTown(33);//near the Keucereus clan association location
-            case 33:
-                return getTown(34);//inside the Seed of Infinity
-            case 34:
-                return getTown(35);//outside the Seed of Infinity
-            case 35:
-                return getTown(36);//inside Aerial Cleft
-				 */
-		}
-		return 0;
 	}
 	
 	public final static boolean townHasCastleInSiege(int townId)
 	{
-		//int[] castleidarray = {0,0,0,0,0,0,0,1,2,3,4,0,5,0,0,6,0};
-		int[] castleidarray = {0,0,0,0,0,0,0,1,2,3,4,0,5,7,8,6,0,9,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0};
-		int castleIndex= castleidarray[townId] ;
+		int castleIndex = getTownCastle(townId);
 		
-		if ( castleIndex > 0 )
+		if (castleIndex > 0)
 		{
 			Castle castle = CastleManager.getInstance().getCastles().get(CastleManager.getInstance().getCastleIndex(castleIndex));
 			if (castle != null)
@@ -288,18 +64,8 @@ public class TownManager
 	
 	public final static boolean townHasCastleInSiege(int x, int y)
 	{
-		int curtown= (MapRegionTable.getInstance().getMapRegion(x, y));
-		//int[] castleidarray = {0,0,0,0,0,1,0,2,3,4,5,0,0,6,0,0,0,0};
-		int[] castleidarray = {0,0,0,0,0,1,0,2,3,4,5,0,0,6,8,7,9,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0};
-		//find an instance of the castle for this town.
-		int castleIndex = castleidarray[curtown];
-		if ( castleIndex > 0 )
-		{
-			Castle castle = CastleManager.getInstance().getCastles().get(CastleManager.getInstance().getCastleIndex(castleIndex));
-			if (castle != null)
-				return castle.getSiege().getIsInProgress();
-		}
-		return false;
+		int curtown = MapRegionManager.getInstance().getMapRegion(x, y).getLocId();
+		return townHasCastleInSiege(curtown);
 	}
 	
 	public final static L2TownZone getTown(int townId)

+ 27 - 6
L2J_Server_BETA/java/com/l2jserver/gameserver/instancemanager/ZoneManager.java

@@ -39,13 +39,14 @@ import com.l2jserver.gameserver.model.L2Object;
 import com.l2jserver.gameserver.model.L2World;
 import com.l2jserver.gameserver.model.L2WorldRegion;
 import com.l2jserver.gameserver.model.actor.L2Character;
-import com.l2jserver.gameserver.model.zone.L2SpawnZone;
+import com.l2jserver.gameserver.model.zone.L2ZoneRespawn;
 import com.l2jserver.gameserver.model.zone.L2ZoneType;
 import com.l2jserver.gameserver.model.zone.form.ZoneCuboid;
 import com.l2jserver.gameserver.model.zone.form.ZoneCylinder;
 import com.l2jserver.gameserver.model.zone.form.ZoneNPoly;
 import com.l2jserver.gameserver.model.zone.type.L2ArenaZone;
 import com.l2jserver.gameserver.model.zone.type.L2OlympiadStadiumZone;
+import com.l2jserver.gameserver.model.zone.type.L2RespawnZone;
 
 /**
  * This class manages the zones
@@ -334,18 +335,38 @@ public class ZoneManager
 										
 										temp.setParameter(name, val);
 									}
-									else if ("spawn".equalsIgnoreCase(cd.getNodeName()) && temp instanceof L2SpawnZone)
+									else if ("spawn".equalsIgnoreCase(cd.getNodeName()) && temp instanceof L2ZoneRespawn)
 									{
 										attrs = cd.getAttributes();
 										int spawnX = Integer.parseInt(attrs.getNamedItem("X").getNodeValue());
 										int spawnY = Integer.parseInt(attrs.getNamedItem("Y").getNodeValue());
 										int spawnZ = Integer.parseInt(attrs.getNamedItem("Z").getNodeValue());
 										
-										Node val = attrs.getNamedItem("isChaotic");
-										if (val != null && Boolean.parseBoolean(val.getNodeValue()))
-											((L2SpawnZone) temp).addChaoticSpawn(spawnX, spawnY, spawnZ);
+										Node val = attrs.getNamedItem("isOther");
+										boolean other = val != null && Boolean.parseBoolean(val.getNodeValue());
+										
+										val = attrs.getNamedItem("isChaotic");
+										boolean chaotic = val != null && Boolean.parseBoolean(val.getNodeValue());
+										
+										val = attrs.getNamedItem("isBanish");
+										boolean banish = val != null && Boolean.parseBoolean(val.getNodeValue());
+										
+										if (other)
+											((L2ZoneRespawn) temp).addOtherSpawn(spawnX, spawnY, spawnZ);
+										else if (chaotic)
+											((L2ZoneRespawn) temp).addChaoticSpawn(spawnX, spawnY, spawnZ);
+										else if (banish)
+											((L2ZoneRespawn) temp).addBanishSpawn(spawnX, spawnY, spawnZ);
 										else
-											((L2SpawnZone) temp).addSpawn(spawnX, spawnY, spawnZ);
+											((L2ZoneRespawn) temp).addSpawn(spawnX, spawnY, spawnZ);
+									}
+									else if ("race".equalsIgnoreCase(cd.getNodeName()) && temp instanceof L2RespawnZone)
+									{
+										attrs = cd.getAttributes();
+										String race = attrs.getNamedItem("name").getNodeValue();
+										String point = attrs.getNamedItem("point").getNodeValue();
+										
+										((L2RespawnZone) temp).addRaceRespawnPoint(race, point);
 									}
 								}
 								if (checkId(zoneId))

+ 2 - 2
L2J_Server_BETA/java/com/l2jserver/gameserver/model/AutoSpawnHandler.java

@@ -31,10 +31,10 @@ import com.l2jserver.Config;
 import com.l2jserver.L2DatabaseFactory;
 import com.l2jserver.gameserver.Announcements;
 import com.l2jserver.gameserver.ThreadPoolManager;
-import com.l2jserver.gameserver.datatables.MapRegionTable;
 import com.l2jserver.gameserver.datatables.NpcTable;
 import com.l2jserver.gameserver.datatables.SpawnTable;
 import com.l2jserver.gameserver.idfactory.IdFactory;
+import com.l2jserver.gameserver.instancemanager.MapRegionManager;
 import com.l2jserver.gameserver.model.actor.L2Npc;
 import com.l2jserver.gameserver.templates.chars.L2NpcTemplate;
 import com.l2jserver.util.Rnd;
@@ -531,7 +531,7 @@ public class AutoSpawnHandler
 					}
 				}
 				
-				String nearestTown = MapRegionTable.getInstance().getClosestTownName(npcInst);
+				String nearestTown = MapRegionManager.getInstance().getClosestTownName(npcInst);
 				
 				// Announce to all players that the spawn has taken place, with
 				// the nearest town location.

+ 200 - 0
L2J_Server_BETA/java/com/l2jserver/gameserver/model/L2MapRegion.java

@@ -0,0 +1,200 @@
+/*
+ * 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 com.l2jserver.gameserver.model;
+
+import java.util.ArrayList;
+import java.util.List;
+import java.util.Map;
+
+import javolution.util.FastMap;
+
+import com.l2jserver.Config;
+import com.l2jserver.gameserver.model.base.Race;
+import com.l2jserver.util.Rnd;
+
+/**
+ * @author Nyaran
+ */
+public class L2MapRegion
+{
+	private String _name = null;
+	private String _town = null;
+	private int _locId = -1;
+	private int _castle = -1;
+	private int _bbs = -1;
+	private List<int[]> _maps = null;
+	
+	private List<Location> _spawnLocs = null;
+	private List<Location> _otherSpawnLocs = null;
+	private List<Location> _chaoticSpawnLocs = null;
+	private List<Location> _banishSpawnLocs = null;
+	
+	private Map<Race, String> _bannedRace = new FastMap<Race, String>();
+	
+	public L2MapRegion(String name, String town, int locId, int castle, int bbs)
+	{
+		_name = name;
+		_town = town;
+		_locId = locId;
+		_castle = castle;
+		_bbs = bbs;
+	}
+	
+	public final String getName()
+	{
+		return _name;
+	}
+	
+	public final String getTown()
+	{
+		return _town;
+	}
+	
+	public final int getLocId()
+	{
+		return _locId;
+	}
+	
+	public final int getCastle()
+	{
+		return _castle;
+	}
+	
+	public final int getBbs()
+	{
+		return _bbs;
+	}
+	
+	public final void addMap(int x, int y)
+	{
+		if (_maps == null)
+			_maps = new ArrayList<int[]>();
+		
+		_maps.add(new int[] { x, y });
+	}
+	
+	public final List<int[]> getMaps()
+	{
+		return _maps;
+	}
+	
+	public final boolean isZoneInRegion(int x, int y)
+	{
+		if (_maps == null)
+			return false;
+		
+		for (int[] map : _maps)
+		{
+			if (map[0] == x && map[1] == y)
+				return true;
+		}
+		return false;
+	}
+	
+	// Respawn
+	public final void addSpawn(int x, int y, int z)
+	{
+		if (_spawnLocs == null)
+			_spawnLocs = new ArrayList<Location>();
+		
+		_spawnLocs.add(new Location(x, y, z));
+	}
+	
+	public final void addOtherSpawn(int x, int y, int z)
+	{
+		if (_otherSpawnLocs == null)
+			_otherSpawnLocs = new ArrayList<Location>();
+		
+		_otherSpawnLocs.add(new Location(x, y, z));
+	}
+	
+	public final void addChaoticSpawn(int x, int y, int z)
+	{
+		if (_chaoticSpawnLocs == null)
+			_chaoticSpawnLocs = new ArrayList<Location>();
+		
+		_chaoticSpawnLocs.add(new Location(x, y, z));
+	}
+	
+	public final void addBanishSpawn(int x, int y, int z)
+	{
+		if (_banishSpawnLocs == null)
+			_banishSpawnLocs = new ArrayList<Location>();
+		
+		_banishSpawnLocs.add(new Location(x, y, z));
+	}
+	
+	public final List<Location> getSpawns()
+	{
+		return _spawnLocs;
+	}
+	
+	public final Location getSpawnLoc()
+	{
+		if (Config.RANDOM_RESPAWN_IN_TOWN_ENABLED)
+			return _spawnLocs.get(Rnd.get(_spawnLocs.size()));
+		else
+			return _spawnLocs.get(0);
+	}
+	
+	public final Location getOtherSpawnLoc()
+	{
+		if (_otherSpawnLocs != null)
+		{
+			if (Config.RANDOM_RESPAWN_IN_TOWN_ENABLED)
+				return _otherSpawnLocs.get(Rnd.get(_otherSpawnLocs.size()));
+			else
+				return _otherSpawnLocs.get(0);
+		}
+		else
+			return getSpawnLoc();
+	}
+	
+	public final Location getChaoticSpawnLoc()
+	{
+		if (_chaoticSpawnLocs != null)
+		{
+			if (Config.RANDOM_RESPAWN_IN_TOWN_ENABLED)
+				return _chaoticSpawnLocs.get(Rnd.get(_chaoticSpawnLocs.size()));
+			else
+				return _chaoticSpawnLocs.get(0);
+		}
+		else
+			return getSpawnLoc();
+	}
+	
+	public final Location getBanishSpawnLoc()
+	{
+		if (_banishSpawnLocs != null)
+		{
+			if (Config.RANDOM_RESPAWN_IN_TOWN_ENABLED)
+				return _banishSpawnLocs.get(Rnd.get(_banishSpawnLocs.size()));
+			else
+				return _banishSpawnLocs.get(0);
+		}
+		else
+			return getSpawnLoc();
+	}
+	
+	public final void addBannedRace(String race, String point)
+	{
+		_bannedRace.put(Race.valueOf(race), point);
+	}
+	
+	public final Map<Race, String> getBannedRace()
+	{
+		return _bannedRace;
+	}
+}

+ 2 - 2
L2J_Server_BETA/java/com/l2jserver/gameserver/model/PartyMatchRoom.java

@@ -18,7 +18,7 @@ import java.util.List;
 
 import javolution.util.FastList;
 
-import com.l2jserver.gameserver.instancemanager.TownManager;
+import com.l2jserver.gameserver.instancemanager.MapRegionManager;
 import com.l2jserver.gameserver.model.actor.instance.L2PcInstance;
 import com.l2jserver.gameserver.network.SystemMessageId;
 import com.l2jserver.gameserver.network.serverpackets.ExManagePartyRoomMember;
@@ -44,7 +44,7 @@ public class PartyMatchRoom
 		_id = id;
 		_title = title;
 		_loot = loot;
-		_location = TownManager.getClosestLocation(owner);
+		_location = MapRegionManager.getInstance().getMapRegion(owner).getBbs();
 		_minlvl = minlvl;
 		_maxlvl = maxlvl;
 		_maxmem = maxmem;

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

@@ -40,13 +40,13 @@ import com.l2jserver.gameserver.ai.L2AttackableAI;
 import com.l2jserver.gameserver.ai.L2CharacterAI;
 import com.l2jserver.gameserver.datatables.DoorTable;
 import com.l2jserver.gameserver.datatables.ItemTable;
-import com.l2jserver.gameserver.datatables.MapRegionTable;
-import com.l2jserver.gameserver.datatables.MapRegionTable.TeleportWhereType;
 import com.l2jserver.gameserver.datatables.SkillTable;
 import com.l2jserver.gameserver.handler.ISkillHandler;
 import com.l2jserver.gameserver.handler.SkillHandler;
 import com.l2jserver.gameserver.instancemanager.DimensionalRiftManager;
 import com.l2jserver.gameserver.instancemanager.InstanceManager;
+import com.l2jserver.gameserver.instancemanager.MapRegionManager;
+import com.l2jserver.gameserver.instancemanager.MapRegionManager.TeleportWhereType;
 import com.l2jserver.gameserver.instancemanager.TerritoryWarManager;
 import com.l2jserver.gameserver.instancemanager.TownManager;
 import com.l2jserver.gameserver.model.ChanceSkillList;
@@ -618,7 +618,7 @@ public abstract class L2Character extends L2Object
 	 * <B><U> Overridden in </U> :</B><BR><BR>
 	 * <li> L2PcInstance</li><BR><BR>
 	 */
-	public void teleToLocation(int x, int y, int z, int heading, boolean allowRandomOffset)
+	public void teleToLocation(int x, int y, int z, int heading, int randomOffset)
 	{
 		// Stop movement
 		stopMove(null, false);
@@ -630,10 +630,10 @@ public abstract class L2Character extends L2Object
 		
 		getAI().setIntention(CtrlIntention.AI_INTENTION_ACTIVE);
 		
-		if (Config.OFFSET_ON_TELEPORT_ENABLED && allowRandomOffset)
+		if (Config.OFFSET_ON_TELEPORT_ENABLED && randomOffset > 0)
 		{
-			x += Rnd.get(-Config.MAX_OFFSET_ON_TELEPORT, Config.MAX_OFFSET_ON_TELEPORT);
-			y += Rnd.get(-Config.MAX_OFFSET_ON_TELEPORT, Config.MAX_OFFSET_ON_TELEPORT);
+			x += Rnd.get(-randomOffset, randomOffset);
+			y += Rnd.get(-randomOffset, randomOffset);
 		}
 		
 		z += 5;
@@ -662,11 +662,17 @@ public abstract class L2Character extends L2Object
 		revalidateZone(true);
 	}
 	
-	public void teleToLocation(int x, int y, int z) { teleToLocation(x, y, z, getHeading(), false); }
+	public void teleToLocation(int x, int y, int z)
+	{
+		teleToLocation(x, y, z, getHeading(), 0);
+	}
 	
-	public void teleToLocation(int x, int y, int z, boolean allowRandomOffset) { teleToLocation(x, y, z, getHeading(), allowRandomOffset); }
+	public void teleToLocation(int x, int y, int z, int randomOffset)
+	{
+		teleToLocation(x, y, z, getHeading(), randomOffset);
+	}
 	
-	public void teleToLocation(Location loc, boolean allowRandomOffset)
+	public void teleToLocation(Location loc, int randomOffset)
 	{
 		int x = loc.getX();
 		int y = loc.getY();
@@ -685,10 +691,37 @@ public abstract class L2Character extends L2Object
 			y = newCoords[1];
 			z = newCoords[2];
 		}
-		teleToLocation(x, y, z, getHeading(), allowRandomOffset);
+		teleToLocation(x, y, z, getHeading(), randomOffset);
+	}
+	
+	public void teleToLocation(TeleportWhereType teleportWhere)
+	{
+		teleToLocation(MapRegionManager.getInstance().getTeleToLocation(this, teleportWhere), true);
+	}
+	
+	public void teleToLocation(Location loc, boolean allowRandomOffset)
+	{
+		if (allowRandomOffset)
+			teleToLocation(loc, Config.MAX_OFFSET_ON_TELEPORT);
+		else
+			teleToLocation(loc, 0);
 	}
 	
-	public void teleToLocation(TeleportWhereType teleportWhere) { teleToLocation(MapRegionTable.getInstance().getTeleToLocation(this, teleportWhere), true); }
+	public void teleToLocation(int x, int y, int z, boolean allowRandomOffset)
+	{
+		if (allowRandomOffset)
+			teleToLocation(x, y, z, Config.MAX_OFFSET_ON_TELEPORT);
+		else
+			teleToLocation(x, y, z, 0);
+	}
+	
+	public void teleToLocation(int x, int y, int z, int heading, boolean allowRandomOffset)
+	{
+		if (allowRandomOffset)
+			teleToLocation(x, y, z, heading, Config.MAX_OFFSET_ON_TELEPORT);
+		else
+			teleToLocation(x, y, z, heading, 0);
+	}
 	
 	// =========================================================
 	// Method - Private

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

@@ -26,7 +26,7 @@ import com.l2jserver.gameserver.GameTimeController;
 import com.l2jserver.gameserver.ThreadPoolManager;
 import com.l2jserver.gameserver.ai.CtrlIntention;
 import com.l2jserver.gameserver.ai.L2CharacterAI;
-import com.l2jserver.gameserver.datatables.MapRegionTable;
+import com.l2jserver.gameserver.instancemanager.MapRegionManager;
 import com.l2jserver.gameserver.model.L2CharPosition;
 import com.l2jserver.gameserver.model.L2ItemInstance;
 import com.l2jserver.gameserver.model.L2World;
@@ -206,7 +206,7 @@ public abstract class L2Vehicle extends L2Character
 	
 	public Location getOustLoc()
 	{
-		return _oustLoc != null ? _oustLoc : MapRegionTable.getInstance().getTeleToLocation(this, MapRegionTable.TeleportWhereType.Town);
+		return _oustLoc != null ? _oustLoc : MapRegionManager.getInstance().getTeleToLocation(this, MapRegionManager.TeleportWhereType.Town);
 	}
 	
 	public void oustPlayers()

+ 10 - 10
L2J_Server_BETA/java/com/l2jserver/gameserver/model/actor/instance/L2AuctioneerInstance.java

@@ -25,9 +25,9 @@ import java.util.StringTokenizer;
 import javolution.util.FastMap;
 
 import com.l2jserver.Config;
-import com.l2jserver.gameserver.datatables.MapRegionTable;
 import com.l2jserver.gameserver.instancemanager.AuctionManager;
 import com.l2jserver.gameserver.instancemanager.ClanHallManager;
+import com.l2jserver.gameserver.instancemanager.MapRegionManager;
 import com.l2jserver.gameserver.model.L2Clan;
 import com.l2jserver.gameserver.model.actor.L2Npc;
 import com.l2jserver.gameserver.model.entity.Auction;
@@ -590,7 +590,7 @@ public final class L2AuctioneerInstance extends L2Npc
 			{
 				NpcHtmlMessage html = new NpcHtmlMessage(1);
 				html.setFile(player.getHtmlPrefix(), "data/html/auction/location.htm");
-				html.replace("%location%", MapRegionTable.getInstance().getClosestTownName(player));
+				html.replace("%location%", MapRegionManager.getInstance().getClosestTownName(player));
 				html.replace("%LOCATION%", getPictureName(player));
 				html.replace("%AGIT_LINK_BACK%", "bypass -h npc_"+getObjectId()+"_start");
 				player.sendPacket(html);
@@ -640,18 +640,18 @@ public final class L2AuctioneerInstance extends L2Npc
 	
 	private String getPictureName(L2PcInstance plyr)
 	{
-		int nearestTownId = MapRegionTable.getInstance().getMapRegion(plyr.getX(), plyr.getY());
+		int nearestTownId = MapRegionManager.getInstance().getMapRegion(plyr).getLocId();
 		String nearestTown;
 		
 		switch (nearestTownId)
 		{
-			case 5: nearestTown = "GLUDIO"; break;
-			case 6: nearestTown = "GLUDIN"; break;
-			case 7: nearestTown = "DION"; break;
-			case 8: nearestTown = "GIRAN"; break;
-			case 14: nearestTown = "RUNE"; break;
-			case 15: nearestTown = "GODARD"; break;
-			case 16: nearestTown = "SCHUTTGART"; break;
+			case 911: nearestTown = "GLUDIN"; break;
+			case 912: nearestTown = "GLUDIO"; break;
+			case 916: nearestTown = "DION"; break;
+			case 918: nearestTown = "GIRAN"; break;
+			case 1537: nearestTown = "RUNE"; break;
+			case 1538: nearestTown = "GODARD"; break;
+			case 1714: nearestTown = "SCHUTTGART"; break;
 			default: nearestTown = "ADEN"; break;
 		}
 		

+ 3 - 3
L2J_Server_BETA/java/com/l2jserver/gameserver/model/actor/instance/L2CastleTeleporterInstance.java

@@ -20,7 +20,7 @@ import java.util.logging.Level;
 import java.util.logging.Logger;
 
 import com.l2jserver.gameserver.ThreadPoolManager;
-import com.l2jserver.gameserver.datatables.MapRegionTable;
+import com.l2jserver.gameserver.instancemanager.MapRegionManager;
 import com.l2jserver.gameserver.model.L2World;
 import com.l2jserver.gameserver.model.actor.L2Npc;
 import com.l2jserver.gameserver.network.serverpackets.NpcHtmlMessage;
@@ -109,13 +109,13 @@ public final class L2CastleTeleporterInstance extends L2Npc
 			{
 				NpcSay cs = new NpcSay(getObjectId(), 1, getNpcId(), 1000443); // The defenders of $s1 castle will be teleported to the inner castle.
 				cs.addStringParameter(getCastle().getName());
-				int region = MapRegionTable.getInstance().getMapRegion(getX(), getY());
+				int region = MapRegionManager.getInstance().getMapRegionId(getX(), getY());
 				Collection<L2PcInstance> pls = L2World.getInstance().getAllPlayers().values();
 				//synchronized (L2World.getInstance().getAllPlayers())
 				{
 					for (L2PcInstance player : pls)
 					{
-						if (region == MapRegionTable.getInstance().getMapRegion(player.getX(),player.getY()))
+						if (region == MapRegionManager.getInstance().getMapRegionId(player.getX(), player.getY()))
 							player.sendPacket(cs);
 					}
 				}

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

@@ -68,7 +68,6 @@ import com.l2jserver.gameserver.datatables.FishTable;
 import com.l2jserver.gameserver.datatables.HennaTable;
 import com.l2jserver.gameserver.datatables.HeroSkillTable;
 import com.l2jserver.gameserver.datatables.ItemTable;
-import com.l2jserver.gameserver.datatables.MapRegionTable;
 import com.l2jserver.gameserver.datatables.NobleSkillTable;
 import com.l2jserver.gameserver.datatables.NpcTable;
 import com.l2jserver.gameserver.datatables.PetDataTable;
@@ -88,6 +87,7 @@ import com.l2jserver.gameserver.instancemanager.GrandBossManager;
 import com.l2jserver.gameserver.instancemanager.HandysBlockCheckerManager;
 import com.l2jserver.gameserver.instancemanager.InstanceManager;
 import com.l2jserver.gameserver.instancemanager.ItemsOnGroundManager;
+import com.l2jserver.gameserver.instancemanager.MapRegionManager;
 import com.l2jserver.gameserver.instancemanager.QuestManager;
 import com.l2jserver.gameserver.instancemanager.SiegeManager;
 import com.l2jserver.gameserver.instancemanager.TerritoryWarManager;
@@ -10785,7 +10785,7 @@ public final class L2PcInstance extends L2Playable
 		{
 			// if the rent of a wyvern expires while over a flying zone, tp to down before unmounting
 			if (checkLandingState() && getMountType()==2)
-				teleToLocation(MapRegionTable.TeleportWhereType.Town);
+				teleToLocation(MapRegionManager.TeleportWhereType.Town);
 			
 			if (this.dismount())  // this should always be true now, since we teleported already
 			{
@@ -10855,7 +10855,7 @@ public final class L2PcInstance extends L2Playable
 		{
 			if (!isGM() && isIn7sDungeon() && SevenSigns.getInstance().getPlayerCabal(getObjectId()) != SevenSigns.getInstance().getCabalHighestScore())
 			{
-				teleToLocation(MapRegionTable.TeleportWhereType.Town);
+				teleToLocation(MapRegionManager.TeleportWhereType.Town);
 				setIsIn7sDungeon(false);
 				sendMessage("You have been teleported to the nearest town due to the beginning of the Seal Validation period.");
 			}
@@ -10864,7 +10864,7 @@ public final class L2PcInstance extends L2Playable
 		{
 			if (!isGM() && isIn7sDungeon() && SevenSigns.getInstance().getPlayerCabal(getObjectId()) == SevenSigns.CABAL_NULL)
 			{
-				teleToLocation(MapRegionTable.TeleportWhereType.Town);
+				teleToLocation(MapRegionManager.TeleportWhereType.Town);
 				setIsIn7sDungeon(false);
 				sendMessage("You have been teleported to the nearest town because you have not signed for any cabal.");
 			}

+ 5 - 5
L2J_Server_BETA/java/com/l2jserver/gameserver/model/entity/Castle.java

@@ -55,8 +55,8 @@ import com.l2jserver.gameserver.model.actor.instance.L2ArtefactInstance;
 import com.l2jserver.gameserver.model.actor.instance.L2DoorInstance;
 import com.l2jserver.gameserver.model.actor.instance.L2PcInstance;
 import com.l2jserver.gameserver.model.itemcontainer.PcInventory;
-import com.l2jserver.gameserver.model.zone.type.L2CastleTeleportZone;
 import com.l2jserver.gameserver.model.zone.type.L2CastleZone;
+import com.l2jserver.gameserver.model.zone.type.L2ResidenceTeleportZone;
 import com.l2jserver.gameserver.model.zone.type.L2SiegeZone;
 import com.l2jserver.gameserver.network.serverpackets.PlaySound;
 import com.l2jserver.gameserver.network.serverpackets.PledgeShowInfoUpdate;
@@ -96,7 +96,7 @@ public class Castle
 	private boolean _showNpcCrest = false;
 	private L2SiegeZone _zone = null;
 	private L2CastleZone _castleZone = null;
-	private L2CastleTeleportZone _teleZone;
+	private L2ResidenceTeleportZone _teleZone;
 	private L2Clan _formerOwner = null;
 	private List<L2ArtefactInstance> _artefacts = new ArrayList<L2ArtefactInstance>(1);
 	private TIntIntHashMap _engrave = new TIntIntHashMap(1);
@@ -436,13 +436,13 @@ public class Castle
 		return _castleZone;
 	}
 	
-	public L2CastleTeleportZone getTeleZone()
+	public L2ResidenceTeleportZone getTeleZone()
 	{
 		if (_teleZone == null)
 		{
-			for (L2CastleTeleportZone zone : ZoneManager.getInstance().getAllZones(L2CastleTeleportZone.class))
+			for (L2ResidenceTeleportZone zone : ZoneManager.getInstance().getAllZones(L2ResidenceTeleportZone.class))
 			{
-				if (zone.getCastleId() == getCastleId())
+				if (zone.getResidenceId() == getCastleId())
 				{
 					_teleZone = zone;
 					break;

+ 8 - 0
L2J_Server_BETA/java/com/l2jserver/gameserver/model/entity/ClanHall.java

@@ -329,6 +329,14 @@ public class ClanHall
 		_zone = zone;
 	}
 	
+	/**
+	 * Return true if object is inside the zone
+	 */
+	public boolean checkIfInZone(int x, int y, int z)
+	{
+		return getZone().isInsideZone(x, y, z);
+	}
+	
 	/** Returns the zone of this clan hall */
 	public L2ClanHallZone getZone()
 	{

+ 3 - 3
L2J_Server_BETA/java/com/l2jserver/gameserver/model/entity/FortSiege.java

@@ -29,12 +29,12 @@ import com.l2jserver.Config;
 import com.l2jserver.L2DatabaseFactory;
 import com.l2jserver.gameserver.ThreadPoolManager;
 import com.l2jserver.gameserver.datatables.ClanTable;
-import com.l2jserver.gameserver.datatables.MapRegionTable;
 import com.l2jserver.gameserver.datatables.NpcTable;
 import com.l2jserver.gameserver.instancemanager.FortManager;
 import com.l2jserver.gameserver.instancemanager.FortSiegeGuardManager;
 import com.l2jserver.gameserver.instancemanager.FortSiegeManager;
 import com.l2jserver.gameserver.instancemanager.FortSiegeManager.SiegeSpawn;
+import com.l2jserver.gameserver.instancemanager.MapRegionManager;
 import com.l2jserver.gameserver.model.CombatFlag;
 import com.l2jserver.gameserver.model.L2Clan;
 import com.l2jserver.gameserver.model.L2Object;
@@ -294,7 +294,7 @@ public class FortSiege implements Siegable
 			
 			loadSiegeClan(); // Load siege clan from db
 			updatePlayerSiegeStateFlags(false);
-			teleportPlayer(FortSiege.TeleportWhoType.Attacker, MapRegionTable.TeleportWhereType.Town); // Teleport to the closest town
+			teleportPlayer(FortSiege.TeleportWhoType.Attacker, MapRegionManager.TeleportWhereType.Town); // Teleport to the closest town
 			
 			getFort().despawnNpcCommanders(); // Despawn NPC commanders
 			spawnCommanders(); // Spawn commanders
@@ -779,7 +779,7 @@ public class FortSiege implements Siegable
 	/**
 	 * Teleport players
 	 */
-	public void teleportPlayer(TeleportWhoType teleportWho, MapRegionTable.TeleportWhereType teleportWhere)
+	public void teleportPlayer(TeleportWhoType teleportWho, MapRegionManager.TeleportWhereType teleportWhere)
 	{
 		List<L2PcInstance> players;
 		switch (teleportWho)

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

@@ -22,10 +22,10 @@ import com.l2jserver.Config;
 import com.l2jserver.gameserver.Announcements;
 import com.l2jserver.gameserver.ThreadPoolManager;
 import com.l2jserver.gameserver.datatables.DoorTable;
-import com.l2jserver.gameserver.datatables.MapRegionTable;
 import com.l2jserver.gameserver.datatables.NpcTable;
 import com.l2jserver.gameserver.idfactory.IdFactory;
 import com.l2jserver.gameserver.instancemanager.InstanceManager;
+import com.l2jserver.gameserver.instancemanager.MapRegionManager;
 import com.l2jserver.gameserver.model.L2Spawn;
 import com.l2jserver.gameserver.model.L2World;
 import com.l2jserver.gameserver.model.L2WorldRegion;
@@ -206,7 +206,7 @@ public class Instance
 			if (getSpawnLoc()[0] != 0 && getSpawnLoc()[1] != 0 && getSpawnLoc()[2] != 0)
 				player.teleToLocation(getSpawnLoc()[0], getSpawnLoc()[1], getSpawnLoc()[2]);
 			else
-				player.teleToLocation(MapRegionTable.TeleportWhereType.Town);
+				player.teleToLocation(MapRegionManager.TeleportWhereType.Town);
 		}
 	}
 	
@@ -248,7 +248,7 @@ public class Instance
 		newdoor.setRange(temp.getXMin(), temp.getYMin(), temp.getZMin(), temp.getXMax(), temp.getYMax(), temp.getZMax());
 		try
 		{
-			newdoor.setMapRegion(MapRegionTable.getInstance().getMapRegion(temp.getX(), temp.getY()));
+			newdoor.setMapRegion(MapRegionManager.getInstance().getMapRegionId(temp));
 		}
 		catch (Exception e)
 		{

+ 8 - 8
L2J_Server_BETA/java/com/l2jserver/gameserver/model/entity/Siege.java

@@ -31,9 +31,9 @@ import com.l2jserver.gameserver.Announcements;
 import com.l2jserver.gameserver.SevenSigns;
 import com.l2jserver.gameserver.ThreadPoolManager;
 import com.l2jserver.gameserver.datatables.ClanTable;
-import com.l2jserver.gameserver.datatables.MapRegionTable;
 import com.l2jserver.gameserver.datatables.NpcTable;
 import com.l2jserver.gameserver.idfactory.IdFactory;
+import com.l2jserver.gameserver.instancemanager.MapRegionManager;
 import com.l2jserver.gameserver.instancemanager.MercTicketManager;
 import com.l2jserver.gameserver.instancemanager.SiegeGuardManager;
 import com.l2jserver.gameserver.instancemanager.SiegeManager;
@@ -291,9 +291,9 @@ public class Siege implements Siegable
 			
 			getCastle().updateClansReputation();
 			removeFlags(); // Removes all flags. Note: Remove flag before teleporting players
-			teleportPlayer(Siege.TeleportWhoType.Attacker, MapRegionTable.TeleportWhereType.Town); // Teleport to the second closest town
-			teleportPlayer(Siege.TeleportWhoType.DefenderNotOwner, MapRegionTable.TeleportWhereType.Town); // Teleport to the second closest town
-			teleportPlayer(Siege.TeleportWhoType.Spectator, MapRegionTable.TeleportWhereType.Town); // Teleport to the second closest town
+			teleportPlayer(Siege.TeleportWhoType.Attacker, MapRegionManager.TeleportWhereType.Town); // Teleport to the second closest town
+			teleportPlayer(Siege.TeleportWhoType.DefenderNotOwner, MapRegionManager.TeleportWhereType.Town); // Teleport to the second closest town
+			teleportPlayer(Siege.TeleportWhoType.Spectator, MapRegionManager.TeleportWhereType.Town); // Teleport to the second closest town
 			_isInProgress = false; // Flag so that siege instance can be started
 			updatePlayerSiegeStateFlags(true);
 			saveCastleSiege(); // Save castle specific data
@@ -418,8 +418,8 @@ public class Siege implements Siegable
 						}
 					}
 				}
-				teleportPlayer(Siege.TeleportWhoType.Attacker, MapRegionTable.TeleportWhereType.SiegeFlag); // Teleport to the second closest town
-				teleportPlayer(Siege.TeleportWhoType.Spectator, MapRegionTable.TeleportWhereType.Town); // Teleport to the second closest town
+				teleportPlayer(Siege.TeleportWhoType.Attacker, MapRegionManager.TeleportWhereType.SiegeFlag); // Teleport to the second closest town
+				teleportPlayer(Siege.TeleportWhoType.Spectator, MapRegionManager.TeleportWhereType.Town); // Teleport to the second closest town
 				
 				removeDefenderFlags(); // Removes defenders' flags
 				getCastle().removeUpgrade(); // Remove all castle upgrade
@@ -464,7 +464,7 @@ public class Siege implements Siegable
 			
 			loadSiegeClan(); // Load siege clan from db
 			updatePlayerSiegeStateFlags(false);
-			teleportPlayer(Siege.TeleportWhoType.Attacker, MapRegionTable.TeleportWhereType.Town); // Teleport to the closest town
+			teleportPlayer(Siege.TeleportWhoType.Attacker, MapRegionManager.TeleportWhereType.Town); // Teleport to the closest town
 			//teleportPlayer(Siege.TeleportWhoType.Spectator, MapRegionTable.TeleportWhereType.Town);      // Teleport to the second closest town
 			_controlTowerCount = 0;
 			_controlTowerMaxCount = 0;
@@ -949,7 +949,7 @@ public class Siege implements Siegable
 	/**
 	 * Teleport players
 	 */
-	public void teleportPlayer(TeleportWhoType teleportWho, MapRegionTable.TeleportWhereType teleportWhere)
+	public void teleportPlayer(TeleportWhoType teleportWho, MapRegionManager.TeleportWhereType teleportWhere)
 	{
 		List<L2PcInstance> players;
 		switch (teleportWho)

+ 2 - 0
L2J_Server_BETA/java/com/l2jserver/gameserver/model/zone/L2ZoneForm.java

@@ -53,4 +53,6 @@ public abstract class L2ZoneForm
 		item.spawnMe(x,y,z+5);
 		ZoneManager.getInstance().getDebugItems().add(item);
 	}
+	
+	public abstract int[] getRandomPoint();
 }

+ 56 - 7
L2J_Server_BETA/java/com/l2jserver/gameserver/model/zone/L2SpawnZone.java → L2J_Server_BETA/java/com/l2jserver/gameserver/model/zone/L2ZoneRespawn.java

@@ -23,15 +23,17 @@ import com.l2jserver.util.Rnd;
 
 /**
  * Abstract zone with spawn locations
- * @author DS
- *
+ * @author DS, Nyaran (rework 10/07/2011)
+ * 
  */
-public abstract class L2SpawnZone extends L2ZoneType
+public abstract class L2ZoneRespawn extends L2ZoneType
 {
 	private List<Location> _spawnLocs = null;
+	private List<Location> _otherSpawnLocs = null;
 	private List<Location> _chaoticSpawnLocs = null;
+	private List<Location> _banishSpawnLocs = null;
 	
-	public L2SpawnZone(int id)
+	protected L2ZoneRespawn(int id)
 	{
 		super(id);
 	}
@@ -44,6 +46,14 @@ public abstract class L2SpawnZone extends L2ZoneType
 		_spawnLocs.add(new Location(x, y, z));
 	}
 	
+	public final void addOtherSpawn(int x, int y, int z)
+	{
+		if (_otherSpawnLocs == null)
+			_otherSpawnLocs = new ArrayList<Location>();
+		
+		_otherSpawnLocs.add(new Location(x, y, z));
+	}
+	
 	public final void addChaoticSpawn(int x, int y, int z)
 	{
 		if (_chaoticSpawnLocs == null)
@@ -52,11 +62,19 @@ public abstract class L2SpawnZone extends L2ZoneType
 		_chaoticSpawnLocs.add(new Location(x, y, z));
 	}
 	
+	public final void addBanishSpawn(int x, int y, int z)
+	{
+		if (_banishSpawnLocs == null)
+			_banishSpawnLocs = new ArrayList<Location>();
+		
+		_banishSpawnLocs.add(new Location(x, y, z));
+	}
+	
 	public final List<Location> getSpawns()
 	{
 		return _spawnLocs;
 	}
-
+	
 	public final Location getSpawnLoc()
 	{
 		if (Config.RANDOM_RESPAWN_IN_TOWN_ENABLED)
@@ -65,11 +83,42 @@ public abstract class L2SpawnZone extends L2ZoneType
 			return _spawnLocs.get(0);
 	}
 	
+	public final Location getOtherSpawnLoc()
+	{
+		if (_otherSpawnLocs != null)
+		{
+			if (Config.RANDOM_RESPAWN_IN_TOWN_ENABLED)
+				return _otherSpawnLocs.get(Rnd.get(_otherSpawnLocs.size()));
+			else
+				return _otherSpawnLocs.get(0);
+		}
+		else
+			return getSpawnLoc();
+	}
+	
 	public final Location getChaoticSpawnLoc()
 	{
 		if (_chaoticSpawnLocs != null)
-			return _chaoticSpawnLocs.get(Rnd.get(_chaoticSpawnLocs.size()));
+		{
+			if (Config.RANDOM_RESPAWN_IN_TOWN_ENABLED)
+				return _chaoticSpawnLocs.get(Rnd.get(_chaoticSpawnLocs.size()));
+			else
+				return _chaoticSpawnLocs.get(0);
+		}
+		else
+			return getSpawnLoc();
+	}
+	
+	public final Location getBanishSpawnLoc()
+	{
+		if (_banishSpawnLocs != null)
+		{
+			if (Config.RANDOM_RESPAWN_IN_TOWN_ENABLED)
+				return _banishSpawnLocs.get(Rnd.get(_banishSpawnLocs.size()));
+			else
+				return _banishSpawnLocs.get(0);
+		}
 		else
 			return getSpawnLoc();
 	}
-}
+}

+ 11 - 0
L2J_Server_BETA/java/com/l2jserver/gameserver/model/zone/form/ZoneCuboid.java

@@ -14,7 +14,9 @@
  */
 package com.l2jserver.gameserver.model.zone.form;
 
+import com.l2jserver.gameserver.GeoEngine;
 import com.l2jserver.gameserver.model.zone.L2ZoneForm;
+import com.l2jserver.util.Rnd;
 
 /**
  * A primitive rectangular zone
@@ -159,5 +161,14 @@ public class ZoneCuboid extends L2ZoneForm
 			dropDebugItem(57, 1, _x2, y, z);
 		}
 	}
+	
+	@Override
+	public int[] getRandomPoint()
+	{
+		int x = Rnd.get(_x1, _x2);
+		int y = Rnd.get(_y1, _y2);
+		
+		return new int[] { x, y, GeoEngine.getInstance().getHeight(x, y, _z1) };
+	}
 }
 

+ 15 - 0
L2J_Server_BETA/java/com/l2jserver/gameserver/model/zone/form/ZoneCylinder.java

@@ -14,7 +14,9 @@
  */
 package com.l2jserver.gameserver.model.zone.form;
 
+import com.l2jserver.gameserver.GeoEngine;
 import com.l2jserver.gameserver.model.zone.L2ZoneForm;
+import com.l2jserver.util.Rnd;
 
 /**
  * A primitive circular zone
@@ -114,4 +116,17 @@ public class ZoneCylinder extends L2ZoneForm
 			dropDebugItem(57, 1, _x + x, _y + y, z);
 		}
 	}
+	
+	@Override
+	public int[] getRandomPoint()
+	{
+		double x, y, q, r;
+		
+		q = Rnd.get() * 2 * Math.PI;
+		r = Math.sqrt(Rnd.get());
+		x = _rad * r * Math.cos(q) + _x;
+		y = _rad * r * Math.sin(q) + _y;
+		
+		return new int[] { (int) x, (int) y, GeoEngine.getInstance().getHeight((int) x, (int) y, _z1) };
+	}
 }

+ 41 - 0
L2J_Server_BETA/java/com/l2jserver/gameserver/model/zone/form/ZoneNPoly.java

@@ -14,7 +14,10 @@
  */
 package com.l2jserver.gameserver.model.zone.form;
 
+import com.l2jserver.gameserver.GeoEngine;
+import com.l2jserver.gameserver.model.L2World;
 import com.l2jserver.gameserver.model.zone.L2ZoneForm;
+import com.l2jserver.util.Rnd;
 
 /**
  * A not so primitive npoly zone
@@ -28,6 +31,10 @@ public class ZoneNPoly extends L2ZoneForm
 	private int[] _y;
 	private int _z1;
 	private int _z2;
+	private int _minX = L2World.MAP_MAX_X;
+	private int _maxX = L2World.MAP_MIN_X;
+	private int _minY = L2World.MAP_MAX_Y;
+	private int _maxY = L2World.MAP_MIN_Y;
 	
 	public ZoneNPoly(int[] x, int[] y, int z1, int z2)
 	{
@@ -35,6 +42,21 @@ public class ZoneNPoly extends L2ZoneForm
 		_y = y;
 		_z1 = z1;
 		_z2 = z2;
+		
+		for (int i = 0; i < x.length; i++)
+		{
+			if (x[i] < _minX)
+				_minX = x[i];
+			if (x[i] > _maxX)
+				_maxX = x[i];
+		}
+		for (int i = 0; i < y.length; i++)
+		{
+			if (y[i] < _minY)
+				_minY = y[i];
+			if (y[i] > _maxY)
+				_maxY = y[i];
+		}
 	}
 	
 	@Override
@@ -143,4 +165,23 @@ public class ZoneNPoly extends L2ZoneForm
 			}
 		}
 	}
+	
+	@Override
+	public int[] getRandomPoint()
+	{
+		int x, y;
+		
+		x = Rnd.get(_minX, _maxX);
+		y = Rnd.get(_minY, _maxY);
+		
+		int antiBlocker = 0;
+		while (!isInsideZone(x, y, getHighZ()) && antiBlocker < 1000)
+		{
+			x = Rnd.get(_minX, _maxX);
+			y = Rnd.get(_minY, _maxY);
+			antiBlocker++;
+		}
+		
+		return new int[] { x, y, GeoEngine.getInstance().getHeight(x, y, _z1) };
+	}
 }

+ 2 - 2
L2J_Server_BETA/java/com/l2jserver/gameserver/model/zone/type/L2ArenaZone.java

@@ -16,7 +16,7 @@ package com.l2jserver.gameserver.model.zone.type;
 
 import com.l2jserver.gameserver.model.actor.L2Character;
 import com.l2jserver.gameserver.model.actor.instance.L2PcInstance;
-import com.l2jserver.gameserver.model.zone.L2SpawnZone;
+import com.l2jserver.gameserver.model.zone.L2ZoneType;
 import com.l2jserver.gameserver.network.SystemMessageId;
 import com.l2jserver.gameserver.network.serverpackets.SystemMessage;
 
@@ -25,7 +25,7 @@ import com.l2jserver.gameserver.network.serverpackets.SystemMessage;
  *
  * @author  durgus
  */
-public class L2ArenaZone extends L2SpawnZone
+public class L2ArenaZone extends L2ZoneType
 {
 	
 	public L2ArenaZone(int id)

+ 5 - 5
L2J_Server_BETA/java/com/l2jserver/gameserver/model/zone/type/L2BossZone.java

@@ -19,8 +19,8 @@ import java.util.Map;
 import javolution.util.FastMap;
 
 import com.l2jserver.gameserver.GameServer;
-import com.l2jserver.gameserver.datatables.MapRegionTable;
 import com.l2jserver.gameserver.instancemanager.GrandBossManager;
+import com.l2jserver.gameserver.instancemanager.MapRegionManager;
 import com.l2jserver.gameserver.model.actor.L2Attackable;
 import com.l2jserver.gameserver.model.actor.L2Character;
 import com.l2jserver.gameserver.model.actor.L2Npc;
@@ -142,7 +142,7 @@ public class L2BossZone extends L2ZoneType
 				if (_oustLoc[0] != 0 && _oustLoc[1] != 0 && _oustLoc[2] != 0)
 					player.teleToLocation(_oustLoc[0], _oustLoc[1], _oustLoc[2]);
 				else
-					player.teleToLocation(MapRegionTable.TeleportWhereType.Town);
+					player.teleToLocation(MapRegionManager.TeleportWhereType.Town);
 			}
 			else if (character instanceof L2Summon)
 			{
@@ -157,7 +157,7 @@ public class L2BossZone extends L2ZoneType
 					if (_oustLoc[0] != 0 && _oustLoc[1] != 0 && _oustLoc[2] != 0)
 						player.teleToLocation(_oustLoc[0], _oustLoc[1], _oustLoc[2]);
 					else
-						player.teleToLocation(MapRegionTable.TeleportWhereType.Town);
+						player.teleToLocation(MapRegionManager.TeleportWhereType.Town);
 				}
 				((L2Summon)character).unSummon(player);
 			}
@@ -264,7 +264,7 @@ public class L2BossZone extends L2ZoneType
 			if (_oustLoc[0] != 0 && _oustLoc[1] != 0 && _oustLoc[2] != 0)
 				player.teleToLocation(_oustLoc[0], _oustLoc[1], _oustLoc[2]);
 			else
-				player.teleToLocation(MapRegionTable.TeleportWhereType.Town);
+				player.teleToLocation(MapRegionManager.TeleportWhereType.Town);
 			return false;
 		}
 	}
@@ -318,7 +318,7 @@ public class L2BossZone extends L2ZoneType
 					if (_oustLoc[0] != 0 && _oustLoc[1] != 0 && _oustLoc[2] != 0)
 						player.teleToLocation(_oustLoc[0], _oustLoc[1], _oustLoc[2]);
 					else
-						player.teleToLocation(MapRegionTable.TeleportWhereType.Town);
+						player.teleToLocation(MapRegionManager.TeleportWhereType.Town);
 				}
 			}
 		}

+ 4 - 10
L2J_Server_BETA/java/com/l2jserver/gameserver/model/zone/type/L2CastleZone.java

@@ -14,19 +14,19 @@
  */
 package com.l2jserver.gameserver.model.zone.type;
 
-import com.l2jserver.gameserver.datatables.MapRegionTable;
 import com.l2jserver.gameserver.instancemanager.CastleManager;
+import com.l2jserver.gameserver.instancemanager.MapRegionManager;
 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.zone.L2SpawnZone;
+import com.l2jserver.gameserver.model.zone.L2ZoneRespawn;
 
 /**
  * A castle zone
  *
  * @author  durgus
  */
-public class L2CastleZone extends L2SpawnZone
+public class L2CastleZone extends L2ZoneRespawn
 {
 	private int _castleId;
 	private Castle _castle = null;
@@ -40,9 +40,7 @@ public class L2CastleZone extends L2SpawnZone
 	public void setParameter(String name, String value)
 	{
 		if (name.equals("castleId"))
-		{
 			_castleId = Integer.parseInt(value);
-		}
 		else
 			super.setParameter(name, value);
 	}
@@ -51,18 +49,14 @@ public class L2CastleZone extends L2SpawnZone
 	protected void onEnter(L2Character character)
 	{
 		if (getCastle() != null)
-		{
 			character.setInsideZone(L2Character.ZONE_CASTLE, true);
-		}
 	}
 	
 	@Override
 	protected void onExit(L2Character character)
 	{
 		if (getCastle() != null)
-		{
 			character.setInsideZone(L2Character.ZONE_CASTLE, false);
-		}
 	}
 	
 	@Override
@@ -88,7 +82,7 @@ public class L2CastleZone extends L2SpawnZone
 			if (((L2PcInstance) temp).getClanId() == owningClanId)
 				continue;
 			
-			((L2PcInstance) temp).teleToLocation(MapRegionTable.TeleportWhereType.Town);
+			((L2PcInstance) temp).teleToLocation(MapRegionManager.TeleportWhereType.Town);
 		}
 	}
 	

+ 4 - 4
L2J_Server_BETA/java/com/l2jserver/gameserver/model/zone/type/L2ClanHallZone.java

@@ -14,12 +14,12 @@
  */
 package com.l2jserver.gameserver.model.zone.type;
 
-import com.l2jserver.gameserver.datatables.MapRegionTable;
 import com.l2jserver.gameserver.instancemanager.ClanHallManager;
+import com.l2jserver.gameserver.instancemanager.MapRegionManager;
 import com.l2jserver.gameserver.model.actor.L2Character;
 import com.l2jserver.gameserver.model.actor.instance.L2PcInstance;
 import com.l2jserver.gameserver.model.entity.ClanHall;
-import com.l2jserver.gameserver.model.zone.L2SpawnZone;
+import com.l2jserver.gameserver.model.zone.L2ZoneRespawn;
 import com.l2jserver.gameserver.network.serverpackets.AgitDecoInfo;
 
 /**
@@ -27,7 +27,7 @@ import com.l2jserver.gameserver.network.serverpackets.AgitDecoInfo;
  *
  * @author  durgus
  */
-public class L2ClanHallZone extends L2SpawnZone
+public class L2ClanHallZone extends L2ZoneRespawn
 {
 	private int _clanHallId;
 	
@@ -102,7 +102,7 @@ public class L2ClanHallZone extends L2SpawnZone
 			if (((L2PcInstance) temp).getClanId() == owningClanId)
 				continue;
 			
-			((L2PcInstance) temp).teleToLocation(MapRegionTable.TeleportWhereType.Town);
+			((L2PcInstance) temp).teleToLocation(MapRegionManager.TeleportWhereType.ClanHall_banish);
 		}
 	}
 	

+ 2 - 10
L2J_Server_BETA/java/com/l2jserver/gameserver/model/zone/type/L2ConditionZone.java

@@ -16,12 +16,12 @@ package com.l2jserver.gameserver.model.zone.type;
 
 import com.l2jserver.gameserver.model.actor.L2Character;
 import com.l2jserver.gameserver.model.actor.instance.L2PcInstance;
-import com.l2jserver.gameserver.model.zone.L2SpawnZone;
+import com.l2jserver.gameserver.model.zone.L2ZoneType;
 
 /**
  * @author UnAfraid
  */
-public class L2ConditionZone extends L2SpawnZone
+public class L2ConditionZone extends L2ZoneType
 {
 	private boolean NO_ITEM_DROP = false;
 	private boolean NO_BOOKMARK = false;
@@ -48,13 +48,9 @@ public class L2ConditionZone extends L2SpawnZone
 		if (character instanceof L2PcInstance)
 		{
 			if (NO_BOOKMARK)
-			{
 				character.setInsideZone(L2Character.ZONE_NOBOOKMARK, true);
-			}
 			if (NO_ITEM_DROP)
-			{
 				character.setInsideZone(L2Character.ZONE_NOITEMDROP, true);
-			}
 		}
 	}
 	
@@ -65,13 +61,9 @@ public class L2ConditionZone extends L2SpawnZone
 		if (character instanceof L2PcInstance)
 		{
 			if (NO_BOOKMARK)
-			{
 				character.setInsideZone(L2Character.ZONE_NOBOOKMARK, false);
-			}
 			if (NO_ITEM_DROP)
-			{
 				character.setInsideZone(L2Character.ZONE_NOITEMDROP, false);
-			}
 		}
 	}
 	

+ 4 - 6
L2J_Server_BETA/java/com/l2jserver/gameserver/model/zone/type/L2FortZone.java

@@ -14,18 +14,18 @@
  */
 package com.l2jserver.gameserver.model.zone.type;
 
-import com.l2jserver.gameserver.datatables.MapRegionTable;
+import com.l2jserver.gameserver.instancemanager.MapRegionManager;
 import com.l2jserver.gameserver.model.L2Clan;
 import com.l2jserver.gameserver.model.actor.L2Character;
 import com.l2jserver.gameserver.model.actor.instance.L2PcInstance;
-import com.l2jserver.gameserver.model.zone.L2SpawnZone;
+import com.l2jserver.gameserver.model.zone.L2ZoneRespawn;
 
 /**
  * A castle zone
  *
  * @author  durgus
  */
-public class L2FortZone extends L2SpawnZone
+public class L2FortZone extends L2ZoneRespawn
 {
 	private int _fortId;
 	
@@ -38,9 +38,7 @@ public class L2FortZone extends L2SpawnZone
 	public void setParameter(String name, String value)
 	{
 		if (name.equals("fortId"))
-		{
 			_fortId = Integer.parseInt(value);
-		}
 		else
 			super.setParameter(name, value);
 	}
@@ -85,7 +83,7 @@ public class L2FortZone extends L2SpawnZone
 			if (((L2PcInstance) temp).getClan() == owningClan)
 				continue;
 			
-			((L2PcInstance) temp).teleToLocation(MapRegionTable.TeleportWhereType.Town); // TODO: shouldnt be town, its outside of fort
+			((L2PcInstance) temp).teleToLocation(MapRegionManager.TeleportWhereType.Fortress_banish);
 		}
 	}
 	

+ 4 - 4
L2J_Server_BETA/java/com/l2jserver/gameserver/model/zone/type/L2OlympiadStadiumZone.java

@@ -18,7 +18,7 @@ import java.util.ArrayList;
 import java.util.List;
 
 import com.l2jserver.gameserver.ThreadPoolManager;
-import com.l2jserver.gameserver.datatables.MapRegionTable;
+import com.l2jserver.gameserver.instancemanager.MapRegionManager;
 import com.l2jserver.gameserver.model.L2Spawn;
 import com.l2jserver.gameserver.model.actor.L2Character;
 import com.l2jserver.gameserver.model.actor.L2Playable;
@@ -27,7 +27,7 @@ import com.l2jserver.gameserver.model.actor.instance.L2DoorInstance;
 import com.l2jserver.gameserver.model.actor.instance.L2OlympiadManagerInstance;
 import com.l2jserver.gameserver.model.actor.instance.L2PcInstance;
 import com.l2jserver.gameserver.model.olympiad.OlympiadGameTask;
-import com.l2jserver.gameserver.model.zone.L2SpawnZone;
+import com.l2jserver.gameserver.model.zone.L2ZoneRespawn;
 import com.l2jserver.gameserver.network.SystemMessageId;
 import com.l2jserver.gameserver.network.serverpackets.ExOlympiadMatchEnd;
 import com.l2jserver.gameserver.network.serverpackets.ExOlympiadUserInfo;
@@ -39,7 +39,7 @@ import com.l2jserver.gameserver.network.serverpackets.SystemMessage;
  *
  * @author  durgus, DS
  */
-public class L2OlympiadStadiumZone extends L2SpawnZone
+public class L2OlympiadStadiumZone extends L2ZoneRespawn
 {
 	private final List<L2DoorInstance> _doors;
 	private final List<L2Spawn> _buffers;
@@ -255,7 +255,7 @@ public class L2OlympiadStadiumZone extends L2SpawnZone
 				if (summon != null)
 					summon.unSummon(_player);
 
-				_player.teleToLocation(MapRegionTable.TeleportWhereType.Town);
+				_player.teleToLocation(MapRegionManager.TeleportWhereType.Town);
 				_player = null;
 			}
 		}

+ 10 - 48
L2J_Server_BETA/java/com/l2jserver/gameserver/model/zone/type/L2CastleTeleportZone.java → L2J_Server_BETA/java/com/l2jserver/gameserver/model/zone/type/L2ResidenceTeleportZone.java

@@ -18,54 +18,25 @@ import javolution.util.FastList;
 
 import com.l2jserver.gameserver.model.actor.L2Character;
 import com.l2jserver.gameserver.model.actor.instance.L2PcInstance;
-import com.l2jserver.gameserver.model.zone.L2ZoneType;
-import com.l2jserver.util.Rnd;
+import com.l2jserver.gameserver.model.zone.L2ZoneRespawn;
 
 /**
- * A castle teleporter zone
- * used for Mass Gatekeepers
- *
- * @author  Kerberos
+ * @author Nyaran (based on Kerberos work for custom L2CastleTeleportZone)
  */
-public class L2CastleTeleportZone extends L2ZoneType
+public class L2ResidenceTeleportZone extends L2ZoneRespawn
 {
-	private int[] _spawnLoc;
-	private int _castleId;
+	private int _residenceId;
 	
-	public L2CastleTeleportZone(int id)
+	public L2ResidenceTeleportZone(int id)
 	{
 		super(id);
-		
-		_spawnLoc = new int[5];
 	}
 	
 	@Override
 	public void setParameter(String name, String value)
 	{
-		if (name.equals("castleId"))
-		{
-			_castleId = Integer.parseInt(value);
-		}
-		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);
-		}
+		if (name.equals("residenceId"))
+			_residenceId = Integer.parseInt(value);
 		else
 			super.setParameter(name, value);
 	}
@@ -123,22 +94,13 @@ public class L2CastleTeleportZone extends L2ZoneType
 			{
 				L2PcInstance player = (L2PcInstance) character;
 				if (player.isOnline())
-					player.teleToLocation(Rnd.get(_spawnLoc[0], _spawnLoc[1]), Rnd.get(_spawnLoc[2], _spawnLoc[3]), _spawnLoc[4]);
+					player.teleToLocation(getSpawnLoc(), 200);
 			}
 		}
 	}
 	
-	public int getCastleId()
-	{
-		return _castleId;
-	}
-	
-	/**
-	 * Get the spawn locations
-	 * @return
-	 */
-	public int[] getSpawn()
+	public int getResidenceId()
 	{
-		return _spawnLoc;
+		return _residenceId;
 	}
 }

+ 72 - 0
L2J_Server_BETA/java/com/l2jserver/gameserver/model/zone/type/L2RespawnZone.java

@@ -0,0 +1,72 @@
+/*
+ * 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 com.l2jserver.gameserver.model.zone.type;
+
+import java.util.Map;
+
+import javolution.util.FastMap;
+
+import com.l2jserver.gameserver.model.actor.L2Character;
+import com.l2jserver.gameserver.model.actor.instance.L2PcInstance;
+import com.l2jserver.gameserver.model.base.Race;
+import com.l2jserver.gameserver.model.zone.L2ZoneType;
+
+/**
+ * @author Nyaran
+ */
+public class L2RespawnZone extends L2ZoneType
+{
+	private Map<Race, String> _raceRespawnPoint = new FastMap<Race, String>();
+	
+	public L2RespawnZone(int id)
+	{
+		super(id);
+	}
+	
+	@Override
+	protected void onEnter(L2Character character)
+	{
+	}
+	
+	@Override
+	protected void onExit(L2Character character)
+	{
+	}
+	
+	@Override
+	public void onDieInside(L2Character character)
+	{
+	}
+	
+	@Override
+	public void onReviveInside(L2Character character)
+	{
+	}
+	
+	public void addRaceRespawnPoint(String race, String point)
+	{
+		_raceRespawnPoint.put(Race.valueOf(race), point);
+	}
+	
+	public Map<Race, String> getAll()
+	{
+		return _raceRespawnPoint;
+	} 
+	
+	public String getRespawnPoint(L2PcInstance activeChar)
+	{
+		return _raceRespawnPoint.get(activeChar.getRace());
+	}
+}

+ 2 - 2
L2J_Server_BETA/java/com/l2jserver/gameserver/model/zone/type/L2SiegeZone.java

@@ -17,10 +17,10 @@ package com.l2jserver.gameserver.model.zone.type;
 import javolution.util.FastList;
 
 import com.l2jserver.Config;
-import com.l2jserver.gameserver.datatables.MapRegionTable;
 import com.l2jserver.gameserver.datatables.SkillTable;
 import com.l2jserver.gameserver.instancemanager.FortManager;
 import com.l2jserver.gameserver.instancemanager.FortSiegeManager;
+import com.l2jserver.gameserver.instancemanager.MapRegionManager;
 import com.l2jserver.gameserver.model.L2Clan;
 import com.l2jserver.gameserver.model.L2Effect;
 import com.l2jserver.gameserver.model.L2Skill;
@@ -281,7 +281,7 @@ public class L2SiegeZone extends L2ZoneType
 			if (((L2PcInstance) temp).getClan() == owningClan || ((L2PcInstance) temp).isGM())
 				continue;
 			
-			((L2PcInstance) temp).teleToLocation(MapRegionTable.TeleportWhereType.Town);
+			((L2PcInstance) temp).teleToLocation(MapRegionManager.TeleportWhereType.Town);
 		}
 	}
 }

+ 2 - 8
L2J_Server_BETA/java/com/l2jserver/gameserver/model/zone/type/L2TownZone.java

@@ -17,14 +17,14 @@ package com.l2jserver.gameserver.model.zone.type;
 import com.l2jserver.Config;
 import com.l2jserver.gameserver.model.actor.L2Character;
 import com.l2jserver.gameserver.model.actor.instance.L2PcInstance;
-import com.l2jserver.gameserver.model.zone.L2SpawnZone;
+import com.l2jserver.gameserver.model.zone.L2ZoneType;
 
 /**
  * A Town zone
  *
  * @author  durgus
  */
-public class L2TownZone extends L2SpawnZone
+public class L2TownZone extends L2ZoneType
 {
 	private int _townId;
 	private int _taxById;
@@ -44,17 +44,11 @@ public class L2TownZone extends L2SpawnZone
 	public void setParameter(String name, String value)
 	{
 		if (name.equals("townId"))
-		{
 			_townId = Integer.parseInt(value);
-		}
 		else if (name.equals("taxById"))
-		{
 			_taxById = Integer.parseInt(value);
-		}
 		else if (name.equals("isPeaceZone"))
-		{
 			_isPeaceZone = Boolean.parseBoolean(value);
-		}
 		else
 			super.setParameter(name, value);
 	}

+ 7 - 7
L2J_Server_BETA/java/com/l2jserver/gameserver/network/SystemMessageId.java

@@ -5157,7 +5157,7 @@ public final class SystemMessageId
 	 * ID: 913<br>
 	 * Message: Current location : $s1, $s2, $s3 (Near the Neutral Zone)
 	 */
-	public static final SystemMessageId LOC_NETRAL_ZONE_S1_S2_S3;
+	public static final SystemMessageId LOC_NEUTRAL_ZONE_S1_S2_S3;
 	
 	/**
 	 * ID: 914<br>
@@ -13390,7 +13390,7 @@ public final class SystemMessageId
 	 * ID: 2293<br>
 	 * Message: Current location: $s1, $s2, $s3 (inside the Steel Citadel)
 	 */
-	public static final SystemMessageId LOC_STEEL_CITADEL_S1_S2_S3;
+	public static final SystemMessageId LOC_IN_STEEL_CITADEL_S1_S2_S3;
 	
 	/**
 	 * ID: 2296<br>
@@ -13400,9 +13400,9 @@ public final class SystemMessageId
 	
 	/**
 	 * ID: 2301<br>
-	 * Message: Current location: Steel Citadel Resistance
+	 * Message: Current location: Steel Citadel
 	 */
-	public static final SystemMessageId LOC_STEEL_CITADEL_RESISTANCE;
+	public static final SystemMessageId LOC_STEEL_CITADEL;
 	
 	/**
 	 * ID: 2302<br>
@@ -15599,7 +15599,7 @@ public final class SystemMessageId
 		LOC_TI_S1_S2_S3 = new SystemMessageId(910);
 		LOC_GLUDIN_S1_S2_S3 = new SystemMessageId(911);
 		LOC_GLUDIO_S1_S2_S3 = new SystemMessageId(912);
-		LOC_NETRAL_ZONE_S1_S2_S3 = new SystemMessageId(913);
+		LOC_NEUTRAL_ZONE_S1_S2_S3 = new SystemMessageId(913);
 		LOC_ELVEN_S1_S2_S3 = new SystemMessageId(914);
 		LOC_DARK_ELVEN_S1_S2_S3 = new SystemMessageId(915);
 		LOC_DION_S1_S2_S3 = new SystemMessageId(916);
@@ -16952,9 +16952,9 @@ public final class SystemMessageId
 		USE_SHORTCUT_CONFIRM = new SystemMessageId(2272);
 		SKILL_NOT_FOR_SUBCLASS = new SystemMessageId(2273);
 		NPCS_RECAPTURED_FORTRESS = new SystemMessageId(2276);
-		LOC_STEEL_CITADEL_S1_S2_S3 = new SystemMessageId(2293);
+		LOC_IN_STEEL_CITADEL_S1_S2_S3 = new SystemMessageId(2293);
 		GAINED_VITALITY_POINTS = new SystemMessageId(2296);
-		LOC_STEEL_CITADEL_RESISTANCE = new SystemMessageId(2301);
+		LOC_STEEL_CITADEL = new SystemMessageId(2301);
 		YOUR_VITAMIN_ITEM_HAS_ARRIVED = new SystemMessageId(2302);
 		S2_SECONDS_REMAINING_FOR_REUSE_S1 = new SystemMessageId(2303);
 		S2_MINUTES_S3_SECONDS_REMAINING_FOR_REUSE_S1 = new SystemMessageId(2304);

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

@@ -27,7 +27,6 @@ import com.l2jserver.gameserver.cache.HtmCache;
 import com.l2jserver.gameserver.communitybbs.Manager.RegionBBSManager;
 import com.l2jserver.gameserver.datatables.AdminCommandAccessRights;
 import com.l2jserver.gameserver.datatables.GMSkillTable;
-import com.l2jserver.gameserver.datatables.MapRegionTable;
 import com.l2jserver.gameserver.datatables.SkillTable;
 import com.l2jserver.gameserver.instancemanager.CastleManager;
 import com.l2jserver.gameserver.instancemanager.ClanHallManager;
@@ -38,6 +37,7 @@ import com.l2jserver.gameserver.instancemanager.FortManager;
 import com.l2jserver.gameserver.instancemanager.FortSiegeManager;
 import com.l2jserver.gameserver.instancemanager.InstanceManager;
 import com.l2jserver.gameserver.instancemanager.MailManager;
+import com.l2jserver.gameserver.instancemanager.MapRegionManager;
 import com.l2jserver.gameserver.instancemanager.PetitionManager;
 import com.l2jserver.gameserver.instancemanager.QuestManager;
 import com.l2jserver.gameserver.instancemanager.SiegeManager;
@@ -460,7 +460,7 @@ public class EnterWorld extends L2GameClientPacket
 				&& activeChar.isInsideZone(L2Character.ZONE_SIEGE)
 				// but non-participant or attacker
 				&& (!activeChar.isInSiege() || activeChar.getSiegeState() < 2))
-			activeChar.teleToLocation(MapRegionTable.TeleportWhereType.Town);
+			activeChar.teleToLocation(MapRegionManager.TeleportWhereType.Town);
 		
 		if (Config.ALLOW_MAIL)
 		{

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

@@ -17,10 +17,10 @@ package com.l2jserver.gameserver.network.clientpackets;
 import java.util.logging.Logger;
 
 import com.l2jserver.gameserver.ThreadPoolManager;
-import com.l2jserver.gameserver.datatables.MapRegionTable;
 import com.l2jserver.gameserver.instancemanager.CastleManager;
 import com.l2jserver.gameserver.instancemanager.ClanHallManager;
 import com.l2jserver.gameserver.instancemanager.FortManager;
+import com.l2jserver.gameserver.instancemanager.MapRegionManager;
 import com.l2jserver.gameserver.instancemanager.TerritoryWarManager;
 import com.l2jserver.gameserver.model.L2SiegeClan;
 import com.l2jserver.gameserver.model.Location;
@@ -85,7 +85,7 @@ public final class RequestRestartPoint extends L2GameClientPacket
 						_log.warning("Player ["+activeChar.getName()+"] called RestartPointPacket - To Clanhall and he doesn't have Clanhall!");
 						return;
 					}
-					loc = MapRegionTable.getInstance().getTeleToLocation(activeChar, MapRegionTable.TeleportWhereType.ClanHall);
+					loc = MapRegionManager.getInstance().getTeleToLocation(activeChar, MapRegionManager.TeleportWhereType.ClanHall);
 					
 					if (ClanHallManager.getInstance().getClanHallByOwner(activeChar.getClan())!= null &&
 							ClanHallManager.getInstance().getClanHallByOwner(activeChar.getClan()).getFunction(ClanHall.FUNC_RESTORE_EXP) != null)
@@ -101,10 +101,10 @@ public final class RequestRestartPoint extends L2GameClientPacket
 					{
 						// Siege in progress
 						if (castle.getSiege().checkIsDefender(activeChar.getClan()))
-							loc = MapRegionTable.getInstance().getTeleToLocation(activeChar, MapRegionTable.TeleportWhereType.Castle);
+							loc = MapRegionManager.getInstance().getTeleToLocation(activeChar, MapRegionManager.TeleportWhereType.Castle);
 						// Just in case you lost castle while being dead.. Port to nearest Town.
 						else if (castle.getSiege().checkIsAttacker(activeChar.getClan()))
-							loc = MapRegionTable.getInstance().getTeleToLocation(activeChar, MapRegionTable.TeleportWhereType.Town);
+							loc = MapRegionManager.getInstance().getTeleToLocation(activeChar, MapRegionManager.TeleportWhereType.Town);
 						else
 						{
 							_log.warning("Player ["+activeChar.getName()+"] called RestartPointPacket - To Castle and he doesn't have Castle!");
@@ -116,7 +116,7 @@ public final class RequestRestartPoint extends L2GameClientPacket
 						if (activeChar.getClan() == null || activeChar.getClan().getHasCastle() == 0)
 							return;
 						else
-							loc = MapRegionTable.getInstance().getTeleToLocation(activeChar, MapRegionTable.TeleportWhereType.Castle);
+							loc = MapRegionManager.getInstance().getTeleToLocation(activeChar, MapRegionManager.TeleportWhereType.Castle);
 					}
 					if (CastleManager.getInstance().getCastleByOwner(activeChar.getClan())!= null &&
 							CastleManager.getInstance().getCastleByOwner(activeChar.getClan()).getFunction(Castle.FUNC_RESTORE_EXP) != null)
@@ -133,7 +133,7 @@ public final class RequestRestartPoint extends L2GameClientPacket
 						_log.warning("Player ["+activeChar.getName()+"] called RestartPointPacket - To Fortress and he doesn't have Fortress!");
 						return;
 					}
-					loc = MapRegionTable.getInstance().getTeleToLocation(activeChar, MapRegionTable.TeleportWhereType.Fortress);
+					loc = MapRegionManager.getInstance().getTeleToLocation(activeChar, MapRegionManager.TeleportWhereType.Fortress);
 					if (FortManager.getInstance().getFortByOwner(activeChar.getClan())!= null &&
 							FortManager.getInstance().getFortByOwner(activeChar.getClan()).getFunction(Fort.FUNC_RESTORE_EXP) != null)
 					{
@@ -157,7 +157,7 @@ public final class RequestRestartPoint extends L2GameClientPacket
 						_log.warning("Player ["+activeChar.getName()+"] called RestartPointPacket - To Siege HQ and he doesn't have Siege HQ!");
 						return;
 					}
-					loc = MapRegionTable.getInstance().getTeleToLocation(activeChar, MapRegionTable.TeleportWhereType.SiegeFlag);
+					loc = MapRegionManager.getInstance().getTeleToLocation(activeChar, MapRegionManager.TeleportWhereType.SiegeFlag);
 					break;
 					
 				case 5: // Fixed or Player is a festival participant
@@ -177,7 +177,7 @@ public final class RequestRestartPoint extends L2GameClientPacket
 					break;
 					
 				default:
-					loc = MapRegionTable.getInstance().getTeleToLocation(activeChar, MapRegionTable.TeleportWhereType.Town);
+					loc = MapRegionManager.getInstance().getTeleToLocation(activeChar, MapRegionManager.TeleportWhereType.Town);
 					break;
 			}
 			

+ 3 - 1
L2J_Server_BETA/java/com/l2jserver/gameserver/network/serverpackets/Die.java

@@ -18,6 +18,7 @@ import com.l2jserver.gameserver.datatables.AccessLevels;
 import com.l2jserver.gameserver.instancemanager.CastleManager;
 import com.l2jserver.gameserver.instancemanager.FortManager;
 import com.l2jserver.gameserver.instancemanager.TerritoryWarManager;
+import com.l2jserver.gameserver.instancemanager.ZoneManager;
 import com.l2jserver.gameserver.model.L2AccessLevel;
 import com.l2jserver.gameserver.model.L2Clan;
 import com.l2jserver.gameserver.model.L2SiegeClan;
@@ -27,6 +28,7 @@ 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.zone.type.L2RespawnZone;
 
 /**
  * sample
@@ -84,7 +86,7 @@ public class Die extends L2GameServerPacket
 		// 6d 04 00 00 00 - FIXED
 		
 		writeD(_canTeleport ? 0x01 : 0);                                                   // 6d 00 00 00 00 - to nearest village
-		if (_canTeleport && _clan != null)
+		if (_canTeleport && _clan != null && ZoneManager.getInstance().getZone(_activeChar, L2RespawnZone.class) == null)
 		{
 			boolean isInCastleDefense = false;
 			boolean isInFortDefense = false;

+ 2 - 2
L2J_Server_BETA/java/com/l2jserver/gameserver/network/serverpackets/ExManagePartyRoomMember.java

@@ -14,7 +14,7 @@
  */
 package com.l2jserver.gameserver.network.serverpackets;
 
-import com.l2jserver.gameserver.instancemanager.TownManager;
+import com.l2jserver.gameserver.instancemanager.MapRegionManager;
 import com.l2jserver.gameserver.model.PartyMatchRoom;
 import com.l2jserver.gameserver.model.actor.instance.L2PcInstance;
 
@@ -49,7 +49,7 @@ public class ExManagePartyRoomMember extends L2GameServerPacket
 		writeS(_activeChar.getName());
 		writeD(_activeChar.getActiveClass());
 		writeD(_activeChar.getLevel());
-		writeD(TownManager.getClosestLocation(_activeChar));
+		writeD(MapRegionManager.getInstance().getMapRegion(_activeChar).getBbs());
 		if (_room.getOwner().equals(_activeChar))
 			writeD(1);
 		else

+ 2 - 2
L2J_Server_BETA/java/com/l2jserver/gameserver/network/serverpackets/ExPartyRoomMember.java

@@ -14,7 +14,7 @@
  */
 package com.l2jserver.gameserver.network.serverpackets;
 
-import com.l2jserver.gameserver.instancemanager.TownManager;
+import com.l2jserver.gameserver.instancemanager.MapRegionManager;
 import com.l2jserver.gameserver.model.PartyMatchRoom;
 import com.l2jserver.gameserver.model.actor.instance.L2PcInstance;
 
@@ -47,7 +47,7 @@ public class ExPartyRoomMember extends L2GameServerPacket
 			writeS(_member.getName());
 			writeD(_member.getActiveClass());
 			writeD(_member.getLevel());
-			writeD(TownManager.getClosestLocation(_member));
+			writeD(MapRegionManager.getInstance().getMapRegion(_member).getBbs());
 			if (_room.getOwner().equals(_member))
 				writeD(1);
 			else

+ 2 - 2
L2J_Server_BETA/java/com/l2jserver/gameserver/script/EngineInterface.java

@@ -22,13 +22,13 @@ import com.l2jserver.gameserver.datatables.CharTemplateTable;
 import com.l2jserver.gameserver.datatables.ClanTable;
 import com.l2jserver.gameserver.datatables.ItemTable;
 import com.l2jserver.gameserver.datatables.LevelUpData;
-import com.l2jserver.gameserver.datatables.MapRegionTable;
 import com.l2jserver.gameserver.datatables.NpcTable;
 import com.l2jserver.gameserver.datatables.SkillTable;
 import com.l2jserver.gameserver.datatables.SkillTreesData;
 import com.l2jserver.gameserver.datatables.SpawnTable;
 import com.l2jserver.gameserver.datatables.TeleportLocationTable;
 import com.l2jserver.gameserver.idfactory.IdFactory;
+import com.l2jserver.gameserver.instancemanager.MapRegionManager;
 import com.l2jserver.gameserver.model.L2World;
 
 /**
@@ -58,7 +58,7 @@ public interface EngineInterface
 	public SpawnTable spawnTable = SpawnTable.getInstance();
 	public GameTimeController gameTimeController = GameTimeController.getInstance();
 	public Announcements announcements = Announcements.getInstance();
-	public MapRegionTable mapRegions = MapRegionTable.getInstance();
+	public MapRegionManager mapRegions = MapRegionManager.getInstance();
 	
 	
 	

+ 5 - 5
L2J_Server_BETA/java/com/l2jserver/gameserver/skills/l2skills/L2SkillTeleport.java

@@ -16,8 +16,8 @@ package com.l2jserver.gameserver.skills.l2skills;
 
 import java.util.logging.Level;
 
-import com.l2jserver.gameserver.datatables.MapRegionTable;
 import com.l2jserver.gameserver.instancemanager.GrandBossManager;
+import com.l2jserver.gameserver.instancemanager.MapRegionManager;
 import com.l2jserver.gameserver.model.L2Object;
 import com.l2jserver.gameserver.model.L2Skill;
 import com.l2jserver.gameserver.model.Location;
@@ -148,13 +148,13 @@ public class L2SkillTeleport extends L2Skill
 				else
 				{
 					if (_recallType.equalsIgnoreCase("Castle"))
-						loc = MapRegionTable.getInstance().getTeleToLocation(target, MapRegionTable.TeleportWhereType.Castle);
+						loc = MapRegionManager.getInstance().getTeleToLocation(target, MapRegionManager.TeleportWhereType.Castle);
 					else if (_recallType.equalsIgnoreCase("ClanHall"))
-						loc = MapRegionTable.getInstance().getTeleToLocation(target, MapRegionTable.TeleportWhereType.ClanHall);
+						loc = MapRegionManager.getInstance().getTeleToLocation(target, MapRegionManager.TeleportWhereType.ClanHall);
 					else if (_recallType.equalsIgnoreCase("Fortress"))
-						loc = MapRegionTable.getInstance().getTeleToLocation(target, MapRegionTable.TeleportWhereType.Fortress);
+						loc = MapRegionManager.getInstance().getTeleToLocation(target, MapRegionManager.TeleportWhereType.Fortress);
 					else
-						loc = MapRegionTable.getInstance().getTeleToLocation(target, MapRegionTable.TeleportWhereType.Town);
+						loc = MapRegionManager.getInstance().getTeleToLocation(target, MapRegionManager.TeleportWhereType.Town);
 				}
 				if (loc != null)
 				{

+ 2 - 2
L2J_Server_BETA/launcher/L2 GameServer.launch

@@ -8,7 +8,7 @@
 </listAttribute>
 <booleanAttribute key="org.eclipse.debug.core.appendEnvironmentVariables" value="true"/>
 <stringAttribute key="org.eclipse.debug.core.source_locator_id" value="org.eclipse.jdt.launching.sourceLocator.JavaSourceLookupDirector"/>
-<stringAttribute key="org.eclipse.debug.core.source_locator_memento" value="&lt;?xml version=&quot;1.0&quot; encoding=&quot;UTF-8&quot; standalone=&quot;no&quot;?&gt;&#13;&#10;&lt;sourceLookupDirector&gt;&#13;&#10;&lt;sourceContainers duplicates=&quot;false&quot;&gt;&#13;&#10;&lt;container memento=&quot;&amp;lt;?xml version=&amp;quot;1.0&amp;quot; encoding=&amp;quot;UTF-8&amp;quot; standalone=&amp;quot;no&amp;quot;?&amp;gt;&amp;#13;&amp;#10;&amp;lt;javaProject name=&amp;quot;datapack_development&amp;quot;/&amp;gt;&amp;#13;&amp;#10;&quot; typeId=&quot;org.eclipse.jdt.launching.sourceContainer.javaProject&quot;/&gt;&#13;&#10;&lt;container memento=&quot;&amp;lt;?xml version=&amp;quot;1.0&amp;quot; encoding=&amp;quot;UTF-8&amp;quot; standalone=&amp;quot;no&amp;quot;?&amp;gt;&amp;#13;&amp;#10;&amp;lt;javaProject name=&amp;quot;L2J_Server_BETA&amp;quot;/&amp;gt;&amp;#13;&amp;#10;&quot; typeId=&quot;org.eclipse.jdt.launching.sourceContainer.javaProject&quot;/&gt;&#13;&#10;&lt;container memento=&quot;&amp;lt;?xml version=&amp;quot;1.0&amp;quot; encoding=&amp;quot;UTF-8&amp;quot; standalone=&amp;quot;no&amp;quot;?&amp;gt;&amp;#13;&amp;#10;&amp;lt;javaProject name=&amp;quot;MMOCore&amp;quot;/&amp;gt;&amp;#13;&amp;#10;&quot; typeId=&quot;org.eclipse.jdt.launching.sourceContainer.javaProject&quot;/&gt;&#13;&#10;&lt;/sourceContainers&gt;&#13;&#10;&lt;/sourceLookupDirector&gt;&#13;&#10;"/>
+<stringAttribute key="org.eclipse.debug.core.source_locator_memento" value="&lt;?xml version=&quot;1.0&quot; encoding=&quot;UTF-8&quot; standalone=&quot;no&quot;?&gt;&#13;&#10;&lt;sourceLookupDirector&gt;&#13;&#10;&lt;sourceContainers duplicates=&quot;false&quot;&gt;&#13;&#10;&lt;container memento=&quot;&amp;lt;?xml version=&amp;quot;1.0&amp;quot; encoding=&amp;quot;UTF-8&amp;quot; standalone=&amp;quot;no&amp;quot;?&amp;gt;&amp;#13;&amp;#10;&amp;lt;javaProject name=&amp;quot;L2J_DataPack_BETA&amp;quot;/&amp;gt;&amp;#13;&amp;#10;&quot; typeId=&quot;org.eclipse.jdt.launching.sourceContainer.javaProject&quot;/&gt;&#13;&#10;&lt;container memento=&quot;&amp;lt;?xml version=&amp;quot;1.0&amp;quot; encoding=&amp;quot;UTF-8&amp;quot; standalone=&amp;quot;no&amp;quot;?&amp;gt;&amp;#13;&amp;#10;&amp;lt;javaProject name=&amp;quot;L2J_Server_BETA&amp;quot;/&amp;gt;&amp;#13;&amp;#10;&quot; typeId=&quot;org.eclipse.jdt.launching.sourceContainer.javaProject&quot;/&gt;&#13;&#10;&lt;/sourceContainers&gt;&#13;&#10;&lt;/sourceLookupDirector&gt;&#13;&#10;"/>
 <listAttribute key="org.eclipse.debug.ui.favoriteGroups">
 <listEntry value="org.eclipse.debug.ui.launchGroup.debug"/>
 <listEntry value="org.eclipse.debug.ui.launchGroup.run"/>
@@ -36,7 +36,7 @@
 <stringAttribute key="org.eclipse.jdt.launching.MAIN_TYPE" value="com.l2jserver.gameserver.GameServer"/>
 <stringAttribute key="org.eclipse.jdt.launching.PROJECT_ATTR" value="L2J_Server_BETA"/>
 <stringAttribute key="org.eclipse.jdt.launching.VM_ARGUMENTS" value="-Djava.util.logging.manager=com.l2jserver.util.L2LogManager -Xmx1g"/>
-<stringAttribute key="org.eclipse.jdt.launching.WORKING_DIRECTORY" value="D:/_l2j/gameserver/"/>
+<stringAttribute key="org.eclipse.jdt.launching.WORKING_DIRECTORY" value="${project_loc}/../server/gameserver/"/>
 <booleanAttribute key="yk-capture-cpu-on-exit" value="false"/>
 <booleanAttribute key="yk-capture-memory-on-exit" value="false"/>
 <booleanAttribute key="yk-disable-alloc" value="false"/>