Browse Source

BETA: Object oriented Zone settings:
* This should allow safe reloading.
* [http://www.l2jserver.com/forum/viewtopic.php?f=69&t=25730 Forum thread: Safe zone reload]

Patch by: UnAfraid

Zoey76 12 years ago
parent
commit
6f887e4f82

+ 20 - 2
L2J_Server_BETA/java/com/l2jserver/gameserver/instancemanager/ZoneManager.java

@@ -24,7 +24,6 @@ import java.util.Iterator;
 import java.util.List;
 import java.util.List;
 import java.util.Map;
 import java.util.Map;
 import java.util.logging.Level;
 import java.util.logging.Level;
-import java.util.logging.Logger;
 
 
 import org.w3c.dom.NamedNodeMap;
 import org.w3c.dom.NamedNodeMap;
 import org.w3c.dom.Node;
 import org.w3c.dom.Node;
@@ -36,6 +35,7 @@ import com.l2jserver.gameserver.model.L2World;
 import com.l2jserver.gameserver.model.L2WorldRegion;
 import com.l2jserver.gameserver.model.L2WorldRegion;
 import com.l2jserver.gameserver.model.actor.L2Character;
 import com.l2jserver.gameserver.model.actor.L2Character;
 import com.l2jserver.gameserver.model.items.instance.L2ItemInstance;
 import com.l2jserver.gameserver.model.items.instance.L2ItemInstance;
+import com.l2jserver.gameserver.model.zone.AbstractZoneSettings;
 import com.l2jserver.gameserver.model.zone.L2ZoneRespawn;
 import com.l2jserver.gameserver.model.zone.L2ZoneRespawn;
 import com.l2jserver.gameserver.model.zone.L2ZoneType;
 import com.l2jserver.gameserver.model.zone.L2ZoneType;
 import com.l2jserver.gameserver.model.zone.form.ZoneCuboid;
 import com.l2jserver.gameserver.model.zone.form.ZoneCuboid;
@@ -51,7 +51,7 @@ import com.l2jserver.gameserver.model.zone.type.L2RespawnZone;
  */
  */
 public class ZoneManager extends DocumentParser
 public class ZoneManager extends DocumentParser
 {
 {
-	private static final Logger _log = Logger.getLogger(ZoneManager.class.getName());
+	private static final Map<String, AbstractZoneSettings> _settings = new HashMap<>();
 	
 	
 	private final Map<Class<? extends L2ZoneType>, Map<Integer, ? extends L2ZoneType>> _classZones = new HashMap<>();
 	private final Map<Class<? extends L2ZoneType>, Map<Integer, ? extends L2ZoneType>> _classZones = new HashMap<>();
 	private int _lastDynamicId = 300000;
 	private int _lastDynamicId = 300000;
@@ -75,6 +75,18 @@ public class ZoneManager extends DocumentParser
 		// Get the world regions
 		// Get the world regions
 		int count = 0;
 		int count = 0;
 		L2WorldRegion[][] worldRegions = L2World.getInstance().getAllWorldRegions();
 		L2WorldRegion[][] worldRegions = L2World.getInstance().getAllWorldRegions();
+		// Backup old zone settings
+		for (Map<Integer, ? extends L2ZoneType> map : _classZones.values())
+		{
+			for (L2ZoneType zone : map.values())
+			{
+				if (zone.getSettings() != null)
+				{
+					_settings.put(zone.getName(), zone.getSettings());
+				}
+			}
+		}
+		// Clear zones
 		for (int x = 0; x < worldRegions.length; x++)
 		for (int x = 0; x < worldRegions.length; x++)
 		{
 		{
 			for (int y = 0; y < worldRegions[x].length; y++)
 			for (int y = 0; y < worldRegions[x].length; y++)
@@ -89,6 +101,7 @@ public class ZoneManager extends DocumentParser
 		// Load the zones
 		// Load the zones
 		load();
 		load();
 		L2World.getInstance().forEachObject(new ForEachCharacterRevalidateZone());
 		L2World.getInstance().forEachObject(new ForEachCharacterRevalidateZone());
+		_settings.clear();
 	}
 	}
 	
 	
 	protected final class ForEachCharacterRevalidateZone implements TObjectProcedure<L2Object>
 	protected final class ForEachCharacterRevalidateZone implements TObjectProcedure<L2Object>
@@ -586,6 +599,11 @@ public class ZoneManager extends DocumentParser
 		}
 		}
 	}
 	}
 	
 	
+	public static AbstractZoneSettings getSettings(String name)
+	{
+		return _settings.get(name);
+	}
+	
 	private static class SingletonHolder
 	private static class SingletonHolder
 	{
 	{
 		protected static final ZoneManager _instance = new ZoneManager();
 		protected static final ZoneManager _instance = new ZoneManager();

+ 4 - 4
L2J_Server_BETA/java/com/l2jserver/gameserver/model/L2Transformation.java

@@ -142,23 +142,23 @@ public abstract class L2Transformation implements Cloneable, Runnable
 	
 	
 	public void start()
 	public void start()
 	{
 	{
-		this.resume();
+		resume();
 	}
 	}
 	
 	
 	public void resume()
 	public void resume()
 	{
 	{
-		this.getPlayer().transform(this);
+		getPlayer().transform(this);
 	}
 	}
 	
 	
 	@Override
 	@Override
 	public void run()
 	public void run()
 	{
 	{
-		this.stop();
+		stop();
 	}
 	}
 	
 	
 	public void stop()
 	public void stop()
 	{
 	{
-		this.getPlayer().untransform();
+		getPlayer().untransform();
 	}
 	}
 	
 	
 	public L2Transformation createTransformationForPlayer(L2PcInstance player)
 	public L2Transformation createTransformationForPlayer(L2PcInstance player)

+ 27 - 0
L2J_Server_BETA/java/com/l2jserver/gameserver/model/zone/AbstractZoneSettings.java

@@ -0,0 +1,27 @@
+/*
+ * 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;
+
+/**
+ * Abstract class for Zone settings.
+ * @author UnAfraid
+ */
+public abstract class AbstractZoneSettings
+{
+	/**
+	 * Clear the Zone settings.
+	 */
+	public abstract void clear();
+}

+ 16 - 2
L2J_Server_BETA/java/com/l2jserver/gameserver/model/zone/L2ZoneType.java

@@ -33,7 +33,7 @@ import com.l2jserver.gameserver.model.quest.Quest.QuestEventType;
 import com.l2jserver.gameserver.network.serverpackets.L2GameServerPacket;
 import com.l2jserver.gameserver.network.serverpackets.L2GameServerPacket;
 
 
 /**
 /**
- * Abstract base class for any zone type Handles basic operations
+ * Abstract base class for any zone type handles basic operations.
  * @author durgus
  * @author durgus
  */
  */
 public abstract class L2ZoneType
 public abstract class L2ZoneType
@@ -46,7 +46,6 @@ public abstract class L2ZoneType
 	
 	
 	/** Parameters to affect specific characters */
 	/** Parameters to affect specific characters */
 	private boolean _checkAffected = false;
 	private boolean _checkAffected = false;
-	
 	private String _name = null;
 	private String _name = null;
 	private int _instanceId = -1;
 	private int _instanceId = -1;
 	private String _instanceTemplate = "";
 	private String _instanceTemplate = "";
@@ -58,6 +57,7 @@ public abstract class L2ZoneType
 	private Map<QuestEventType, List<Quest>> _questEvents;
 	private Map<QuestEventType, List<Quest>> _questEvents;
 	private InstanceType _target = InstanceType.L2Character; // default all chars
 	private InstanceType _target = InstanceType.L2Character; // default all chars
 	private boolean _allowStore;
 	private boolean _allowStore;
+	private AbstractZoneSettings _settings;
 	
 	
 	protected L2ZoneType(int id)
 	protected L2ZoneType(int id)
 	{
 	{
@@ -456,6 +456,20 @@ public abstract class L2ZoneType
 		return _characterList.containsKey(character.getObjectId());
 		return _characterList.containsKey(character.getObjectId());
 	}
 	}
 	
 	
+	public AbstractZoneSettings getSettings()
+	{
+		return _settings;
+	}
+	
+	public void setSettings(AbstractZoneSettings settings)
+	{
+		if (_settings != null)
+		{
+			_settings.clear();
+		}
+		_settings = settings;
+	}
+	
 	protected abstract void onEnter(L2Character character);
 	protected abstract void onEnter(L2Character character);
 	
 	
 	protected abstract void onExit(L2Character character);
 	protected abstract void onExit(L2Character character);

+ 53 - 0
L2J_Server_BETA/java/com/l2jserver/gameserver/model/zone/TaskZoneSettings.java

@@ -0,0 +1,53 @@
+/*
+ * 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;
+
+import java.util.concurrent.Future;
+
+/**
+ * Basic task zone settings implementation.
+ * @author UnAfraid
+ */
+public class TaskZoneSettings extends AbstractZoneSettings
+{
+	private Future<?> _task;
+	
+	/**
+	 * Gets the task.
+	 * @return the task
+	 */
+	public Future<?> getTask()
+	{
+		return _task;
+	}
+	
+	/**
+	 * Sets the task.
+	 * @param task the new task
+	 */
+	public void setTask(Future<?> task)
+	{
+		_task = task;
+	}
+	
+	@Override
+	public void clear()
+	{
+		if (_task != null)
+		{
+			_task.cancel(true);
+		}
+	}
+}

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

@@ -21,11 +21,13 @@ import javolution.util.FastMap;
 import com.l2jserver.gameserver.GameServer;
 import com.l2jserver.gameserver.GameServer;
 import com.l2jserver.gameserver.instancemanager.GrandBossManager;
 import com.l2jserver.gameserver.instancemanager.GrandBossManager;
 import com.l2jserver.gameserver.instancemanager.MapRegionManager;
 import com.l2jserver.gameserver.instancemanager.MapRegionManager;
+import com.l2jserver.gameserver.instancemanager.ZoneManager;
 import com.l2jserver.gameserver.model.actor.L2Attackable;
 import com.l2jserver.gameserver.model.actor.L2Attackable;
 import com.l2jserver.gameserver.model.actor.L2Character;
 import com.l2jserver.gameserver.model.actor.L2Character;
 import com.l2jserver.gameserver.model.actor.L2Npc;
 import com.l2jserver.gameserver.model.actor.L2Npc;
 import com.l2jserver.gameserver.model.actor.L2Summon;
 import com.l2jserver.gameserver.model.actor.L2Summon;
 import com.l2jserver.gameserver.model.actor.instance.L2PcInstance;
 import com.l2jserver.gameserver.model.actor.instance.L2PcInstance;
+import com.l2jserver.gameserver.model.zone.AbstractZoneSettings;
 import com.l2jserver.gameserver.model.zone.L2ZoneType;
 import com.l2jserver.gameserver.model.zone.L2ZoneType;
 import com.l2jserver.util.L2FastList;
 import com.l2jserver.util.L2FastList;
 
 
@@ -37,17 +39,6 @@ public class L2BossZone extends L2ZoneType
 	private int _timeInvade;
 	private int _timeInvade;
 	private boolean _enabled = true; // default value, unless overridden by xml...
 	private boolean _enabled = true; // default value, unless overridden by xml...
 	
 	
-	// track the times that players got disconnected. Players are allowed
-	// to log back into the zone as long as their log-out was within _timeInvade
-	// time...
-	// <player objectId, expiration time in milliseconds>
-	private FastMap<Integer, Long> _playerAllowedReEntryTimes;
-	
-	// track the players admitted to the zone who should be allowed back in
-	// after reboot/server downtime (outside of their control), within 30
-	// of server restart
-	private L2FastList<Integer> _playersAllowed;
-	
 	private int[] _oustLoc =
 	private int[] _oustLoc =
 	{
 	{
 		0,
 		0,
@@ -55,17 +46,69 @@ public class L2BossZone extends L2ZoneType
 		0
 		0
 	};
 	};
 	
 	
-	protected L2FastList<L2Character> _raidList = new L2FastList<>();
+	private final class Settings extends AbstractZoneSettings
+	{
+		// track the times that players got disconnected. Players are allowed
+		// to log back into the zone as long as their log-out was within _timeInvade time...
+		// <player objectId, expiration time in milliseconds>
+		private final FastMap<Integer, Long> _playerAllowedReEntryTimes;
+		
+		// track the players admitted to the zone who should be allowed back in
+		// after reboot/server downtime (outside of their control), within 30 of server restart
+		private final L2FastList<Integer> _playersAllowed;
+		
+		private final L2FastList<L2Character> _raidList;
+		
+		public Settings()
+		{
+			_playerAllowedReEntryTimes = new FastMap<>();
+			_playersAllowed = new L2FastList<>();
+			_raidList = new L2FastList<>();
+		}
+		
+		public FastMap<Integer, Long> getPlayerAllowedReEntryTimes()
+		{
+			return _playerAllowedReEntryTimes;
+		}
+		
+		public L2FastList<Integer> getPlayersAllowed()
+		{
+			return _playersAllowed;
+		}
+		
+		public L2FastList<L2Character> getRaidList()
+		{
+			return _raidList;
+		}
+		
+		@Override
+		public void clear()
+		{
+			_playerAllowedReEntryTimes.clear();
+			_playersAllowed.clear();
+			_raidList.clear();
+		}
+	}
 	
 	
 	public L2BossZone(int id)
 	public L2BossZone(int id)
 	{
 	{
 		super(id);
 		super(id);
-		_playerAllowedReEntryTimes = new FastMap<>();
-		_playersAllowed = new L2FastList<>();
 		_oustLoc = new int[3];
 		_oustLoc = new int[3];
+		AbstractZoneSettings settings = ZoneManager.getSettings(getName());
+		if (settings == null)
+		{
+			settings = new Settings();
+		}
+		setSettings(settings);
 		GrandBossManager.getInstance().addZone(this);
 		GrandBossManager.getInstance().addZone(this);
 	}
 	}
 	
 	
+	@Override
+	public Settings getSettings()
+	{
+		return (Settings) super.getSettings();
+	}
+	
 	@Override
 	@Override
 	public void setParameter(String name, String value)
 	public void setParameter(String name, String value)
 	{
 	{
@@ -96,11 +139,12 @@ public class L2BossZone extends L2ZoneType
 	}
 	}
 	
 	
 	/**
 	/**
-	 * Boss zones have special behaviors for player characters. 
-	 * Players are automatically teleported out when the attempt to enter these zones, except if the time at which they enter the zone is prior to the entry expiration time set for that player. 
-	 * Entry expiration times are set by any one of the following: 
-	 * 1) A player logs out while in a zone (Expiration gets set to logoutTime + _timeInvade) 
-	 * 2) An external source (such as a quest or AI of NPC) set up the player for entry. There exists one more case in which the player will be allowed to enter. 
+	 * Boss zones have special behaviors for player characters.<br>
+	 * Players are automatically teleported out when the attempt to enter these zones, except if the time at which they enter the zone is prior to the entry expiration time set for that player.<br>
+	 * Entry expiration times are set by any one of the following:<br>
+	 * 1) A player logs out while in a zone (Expiration gets set to logoutTime + _timeInvade)<br>
+	 * 2) An external source (such as a quest or AI of NPC) set up the player for entry.<br>
+	 * There exists one more case in which the player will be allowed to enter.<br>
 	 * That is if the server recently rebooted (boot-up time more recent than currentTime - _timeInvade) AND the player was in the zone prior to reboot.
 	 * That is if the server recently rebooted (boot-up time more recent than currentTime - _timeInvade) AND the player was in the zone prior to reboot.
 	 */
 	 */
 	@Override
 	@Override
@@ -115,11 +159,11 @@ public class L2BossZone extends L2ZoneType
 					return;
 					return;
 				// if player has been (previously) cleared by npc/ai for entry and the zone is
 				// if player has been (previously) cleared by npc/ai for entry and the zone is
 				// set to receive players (aka not waiting for boss to respawn)
 				// set to receive players (aka not waiting for boss to respawn)
-				if (_playersAllowed.contains(player.getObjectId()))
+				if (getSettings().getPlayersAllowed().contains(player.getObjectId()))
 				{
 				{
 					// Get the information about this player's last logout-exit from
 					// Get the information about this player's last logout-exit from
 					// this zone.
 					// this zone.
-					final Long expirationTime = _playerAllowedReEntryTimes.get(player.getObjectId());
+					final Long expirationTime = getSettings().getPlayerAllowedReEntryTimes().get(player.getObjectId());
 					
 					
 					// with legal entries, do nothing.
 					// with legal entries, do nothing.
 					if (expirationTime == null) // legal null expirationTime entries
 					if (expirationTime == null) // legal null expirationTime entries
@@ -133,13 +177,13 @@ public class L2BossZone extends L2ZoneType
 					else
 					else
 					{
 					{
 						// legal non-null logoutTime entries
 						// legal non-null logoutTime entries
-						_playerAllowedReEntryTimes.remove(player.getObjectId());
+						getSettings().getPlayerAllowedReEntryTimes().remove(player.getObjectId());
 						if (expirationTime.longValue() > System.currentTimeMillis())
 						if (expirationTime.longValue() > System.currentTimeMillis())
 						{
 						{
 							return;
 							return;
 						}
 						}
 					}
 					}
-					_playersAllowed.remove(_playersAllowed.indexOf(player.getObjectId()));
+					getSettings().getPlayersAllowed().remove(getSettings().getPlayersAllowed().indexOf(player.getObjectId()));
 				}
 				}
 				// teleport out all players who attempt "illegal" (re-)entry
 				// teleport out all players who attempt "illegal" (re-)entry
 				if (_oustLoc[0] != 0 && _oustLoc[1] != 0 && _oustLoc[2] != 0)
 				if (_oustLoc[0] != 0 && _oustLoc[1] != 0 && _oustLoc[2] != 0)
@@ -156,7 +200,7 @@ public class L2BossZone extends L2ZoneType
 				final L2PcInstance player = character.getActingPlayer();
 				final L2PcInstance player = character.getActingPlayer();
 				if (player != null)
 				if (player != null)
 				{
 				{
-					if (_playersAllowed.contains(player.getObjectId()) || player.isGM())
+					if (getSettings().getPlayersAllowed().contains(player.getObjectId()) || player.isGM())
 						return;
 						return;
 					
 					
 					// remove summon and teleport out owner
 					// remove summon and teleport out owner
@@ -190,25 +234,25 @@ public class L2BossZone extends L2ZoneType
 				// time so that
 				// time so that
 				// decisions can be made later about allowing or not the player
 				// decisions can be made later about allowing or not the player
 				// to log into the zone
 				// to log into the zone
-				if (!player.isOnline() && _playersAllowed.contains(player.getObjectId()))
+				if (!player.isOnline() && getSettings().getPlayersAllowed().contains(player.getObjectId()))
 				{
 				{
 					// mark the time that the player left the zone
 					// mark the time that the player left the zone
-					_playerAllowedReEntryTimes.put(player.getObjectId(), System.currentTimeMillis() + _timeInvade);
+					getSettings().getPlayerAllowedReEntryTimes().put(player.getObjectId(), System.currentTimeMillis() + _timeInvade);
 				}
 				}
 				else
 				else
 				{
 				{
-					if (_playersAllowed.contains(player.getObjectId()))
+					if (getSettings().getPlayersAllowed().contains(player.getObjectId()))
 					{
 					{
-						_playersAllowed.remove(_playersAllowed.indexOf(player.getObjectId()));
+						getSettings().getPlayersAllowed().remove(getSettings().getPlayersAllowed().indexOf(player.getObjectId()));
 					}
 					}
-					_playerAllowedReEntryTimes.remove(player.getObjectId());
+					getSettings().getPlayerAllowedReEntryTimes().remove(player.getObjectId());
 				}
 				}
 			}
 			}
 			if (character.isPlayable())
 			if (character.isPlayable())
 			{
 			{
 				if (getCharactersInside() != null && !getCharactersInside().isEmpty())
 				if (getCharactersInside() != null && !getCharactersInside().isEmpty())
 				{
 				{
-					_raidList.clear();
+					getSettings().getRaidList().clear();
 					int count = 0;
 					int count = 0;
 					for (L2Character obj : getCharactersInside())
 					for (L2Character obj : getCharactersInside())
 					{
 					{
@@ -222,15 +266,15 @@ public class L2BossZone extends L2ZoneType
 						}
 						}
 						else if (obj.isL2Attackable() && obj.isRaid())
 						else if (obj.isL2Attackable() && obj.isRaid())
 						{
 						{
-							_raidList.add(obj);
+							getSettings().getRaidList().add(obj);
 						}
 						}
 					}
 					}
 					// if inside zone isnt any player, force all boss instance return to its spawn points
 					// if inside zone isnt any player, force all boss instance return to its spawn points
-					if (count == 0 && !_raidList.isEmpty())
+					if (count == 0 && !getSettings().getRaidList().isEmpty())
 					{
 					{
-						for (int i = 0; i < _raidList.size(); i++)
+						for (int i = 0; i < getSettings().getRaidList().size(); i++)
 						{
 						{
-							L2Attackable raid = (L2Attackable) _raidList.get(i);
+							L2Attackable raid = (L2Attackable) getSettings().getRaidList().get(i);
 							if (raid == null || raid.getSpawn() == null || raid.isDead())
 							if (raid == null || raid.getSpawn() == null || raid.isDead())
 								continue;
 								continue;
 							if (!raid.isInsideRadius(raid.getSpawn().getLocx(), raid.getSpawn().getLocy(), 150, false))
 							if (!raid.isInsideRadius(raid.getSpawn().getLocx(), raid.getSpawn().getLocy(), 150, false))
@@ -262,12 +306,15 @@ public class L2BossZone extends L2ZoneType
 	public void setAllowedPlayers(L2FastList<Integer> players)
 	public void setAllowedPlayers(L2FastList<Integer> players)
 	{
 	{
 		if (players != null)
 		if (players != null)
-			_playersAllowed = players;
+		{
+			getSettings().getPlayersAllowed().clear();
+			getSettings().getPlayersAllowed().addAll(players);
+		}
 	}
 	}
 	
 	
 	public L2FastList<Integer> getAllowedPlayers()
 	public L2FastList<Integer> getAllowedPlayers()
 	{
 	{
-		return _playersAllowed;
+		return getSettings().getPlayersAllowed();
 	}
 	}
 	
 	
 	public boolean isPlayerAllowed(L2PcInstance player)
 	public boolean isPlayerAllowed(L2PcInstance player)
@@ -276,7 +323,7 @@ public class L2BossZone extends L2ZoneType
 		{
 		{
 			return true;
 			return true;
 		}
 		}
-		else if (_playersAllowed.contains(player.getObjectId()))
+		else if (getSettings().getPlayersAllowed().contains(player.getObjectId()))
 		{
 		{
 			return true;
 			return true;
 		}
 		}
@@ -345,8 +392,8 @@ public class L2BossZone extends L2ZoneType
 				}
 				}
 			}
 			}
 		}
 		}
-		_playerAllowedReEntryTimes.clear();
-		_playersAllowed.clear();
+		getSettings().getPlayerAllowedReEntryTimes().clear();
+		getSettings().getPlayersAllowed().clear();
 	}
 	}
 	
 	
 	/**
 	/**
@@ -358,11 +405,11 @@ public class L2BossZone extends L2ZoneType
 	{
 	{
 		if (!player.isGM())
 		if (!player.isGM())
 		{
 		{
-			if (!_playersAllowed.contains(player.getObjectId()))
+			if (!getSettings().getPlayersAllowed().contains(player.getObjectId()))
 			{
 			{
-				_playersAllowed.add(player.getObjectId());
+				getSettings().getPlayersAllowed().add(player.getObjectId());
 			}
 			}
-			_playerAllowedReEntryTimes.put(player.getObjectId(), System.currentTimeMillis() + durationInSec * 1000);
+			getSettings().getPlayerAllowedReEntryTimes().put(player.getObjectId(), System.currentTimeMillis() + durationInSec * 1000);
 		}
 		}
 	}
 	}
 	
 	
@@ -370,8 +417,8 @@ public class L2BossZone extends L2ZoneType
 	{
 	{
 		if (!player.isGM())
 		if (!player.isGM())
 		{
 		{
-			_playersAllowed.remove(Integer.valueOf(player.getObjectId()));
-			_playerAllowedReEntryTimes.remove(player.getObjectId());
+			getSettings().getPlayersAllowed().remove(Integer.valueOf(player.getObjectId()));
+			getSettings().getPlayerAllowedReEntryTimes().remove(player.getObjectId());
 		}
 		}
 	}
 	}
 	
 	

+ 22 - 11
L2J_Server_BETA/java/com/l2jserver/gameserver/model/zone/type/L2DamageZone.java

@@ -14,16 +14,17 @@
  */
  */
 package com.l2jserver.gameserver.model.zone.type;
 package com.l2jserver.gameserver.model.zone.type;
 
 
-import java.util.concurrent.Future;
-
 import com.l2jserver.gameserver.ThreadPoolManager;
 import com.l2jserver.gameserver.ThreadPoolManager;
 import com.l2jserver.gameserver.instancemanager.CastleManager;
 import com.l2jserver.gameserver.instancemanager.CastleManager;
+import com.l2jserver.gameserver.instancemanager.ZoneManager;
 import com.l2jserver.gameserver.model.L2Object.InstanceType;
 import com.l2jserver.gameserver.model.L2Object.InstanceType;
 import com.l2jserver.gameserver.model.actor.L2Character;
 import com.l2jserver.gameserver.model.actor.L2Character;
 import com.l2jserver.gameserver.model.actor.instance.L2PcInstance;
 import com.l2jserver.gameserver.model.actor.instance.L2PcInstance;
 import com.l2jserver.gameserver.model.entity.Castle;
 import com.l2jserver.gameserver.model.entity.Castle;
 import com.l2jserver.gameserver.model.stats.Stats;
 import com.l2jserver.gameserver.model.stats.Stats;
+import com.l2jserver.gameserver.model.zone.AbstractZoneSettings;
 import com.l2jserver.gameserver.model.zone.L2ZoneType;
 import com.l2jserver.gameserver.model.zone.L2ZoneType;
+import com.l2jserver.gameserver.model.zone.TaskZoneSettings;
 
 
 /**
 /**
  * A damage zone
  * A damage zone
@@ -33,7 +34,6 @@ public class L2DamageZone extends L2ZoneType
 {
 {
 	private int _damageHPPerSec;
 	private int _damageHPPerSec;
 	private int _damageMPPerSec;
 	private int _damageMPPerSec;
-	private Future<?> _task;
 	
 	
 	private int _castleId;
 	private int _castleId;
 	private Castle _castle;
 	private Castle _castle;
@@ -63,6 +63,18 @@ public class L2DamageZone extends L2ZoneType
 		_enabled = true;
 		_enabled = true;
 		
 		
 		setTargetType(InstanceType.L2Playable); // default only playabale
 		setTargetType(InstanceType.L2Playable); // default only playabale
+		AbstractZoneSettings settings = ZoneManager.getSettings(getName());
+		if (settings == null)
+		{
+			settings = new TaskZoneSettings();
+		}
+		setSettings(settings);
+	}
+	
+	@Override
+	public TaskZoneSettings getSettings()
+	{
+		return (TaskZoneSettings) super.getSettings();
 	}
 	}
 	
 	
 	@Override
 	@Override
@@ -101,7 +113,7 @@ public class L2DamageZone extends L2ZoneType
 	@Override
 	@Override
 	protected void onEnter(L2Character character)
 	protected void onEnter(L2Character character)
 	{
 	{
-		if (_task == null && (_damageHPPerSec != 0 || _damageMPPerSec != 0))
+		if (getSettings().getTask() == null && (_damageHPPerSec != 0 || _damageMPPerSec != 0))
 		{
 		{
 			L2PcInstance player = character.getActingPlayer();
 			L2PcInstance player = character.getActingPlayer();
 			if (getCastle() != null) // Castle zone
 			if (getCastle() != null) // Castle zone
@@ -114,8 +126,8 @@ public class L2DamageZone extends L2ZoneType
 			
 			
 			synchronized (this)
 			synchronized (this)
 			{
 			{
-				if (_task == null)
-					_task = ThreadPoolManager.getInstance().scheduleGeneralAtFixedRate(new ApplyDamage(this), _startTask, _reuseTask);
+				if (getSettings().getTask()  == null)
+					getSettings().setTask(ThreadPoolManager.getInstance().scheduleGeneralAtFixedRate(new ApplyDamage(this), _startTask, _reuseTask));
 			}
 			}
 		}
 		}
 	}
 	}
@@ -123,7 +135,7 @@ public class L2DamageZone extends L2ZoneType
 	@Override
 	@Override
 	protected void onExit(L2Character character)
 	protected void onExit(L2Character character)
 	{
 	{
-		if (_characterList.isEmpty() && _task != null)
+		if (_characterList.isEmpty() && getSettings().getTask() != null)
 		{
 		{
 			stopTask();
 			stopTask();
 		}
 		}
@@ -141,10 +153,9 @@ public class L2DamageZone extends L2ZoneType
 	
 	
 	protected void stopTask()
 	protected void stopTask()
 	{
 	{
-		if (_task != null)
+		if (getSettings().getTask() != null)
 		{
 		{
-			_task.cancel(false);
-			_task = null;
+			getSettings().getTask().cancel(false);
 		}
 		}
 	}
 	}
 	
 	
@@ -169,7 +180,7 @@ public class L2DamageZone extends L2ZoneType
 		
 		
 		@Override
 		@Override
 		public void run()
 		public void run()
-		{	
+		{
 			if (!_enabled)
 			if (!_enabled)
 			{
 			{
 				return;
 				return;

+ 18 - 13
L2J_Server_BETA/java/com/l2jserver/gameserver/model/zone/type/L2DynamicZone.java

@@ -14,13 +14,14 @@
  */
  */
 package com.l2jserver.gameserver.model.zone.type;
 package com.l2jserver.gameserver.model.zone.type;
 
 
-import java.util.concurrent.Future;
-
 import com.l2jserver.gameserver.ThreadPoolManager;
 import com.l2jserver.gameserver.ThreadPoolManager;
+import com.l2jserver.gameserver.instancemanager.ZoneManager;
 import com.l2jserver.gameserver.model.L2WorldRegion;
 import com.l2jserver.gameserver.model.L2WorldRegion;
 import com.l2jserver.gameserver.model.actor.L2Character;
 import com.l2jserver.gameserver.model.actor.L2Character;
 import com.l2jserver.gameserver.model.skills.L2Skill;
 import com.l2jserver.gameserver.model.skills.L2Skill;
+import com.l2jserver.gameserver.model.zone.AbstractZoneSettings;
 import com.l2jserver.gameserver.model.zone.L2ZoneType;
 import com.l2jserver.gameserver.model.zone.L2ZoneType;
+import com.l2jserver.gameserver.model.zone.TaskZoneSettings;
 
 
 /**
 /**
  * A dynamic zone? Maybe use this for interlude skills like protection field :>
  * A dynamic zone? Maybe use this for interlude skills like protection field :>
@@ -30,21 +31,20 @@ public class L2DynamicZone extends L2ZoneType
 {
 {
 	private L2WorldRegion _region;
 	private L2WorldRegion _region;
 	private L2Character _owner;
 	private L2Character _owner;
-	private Future<?> _task;
 	private L2Skill _skill;
 	private L2Skill _skill;
 	
 	
-	protected void setTask(Future<?> task)
-	{
-		_task = task;
-	}
-	
 	public L2DynamicZone(L2WorldRegion region, L2Character owner, L2Skill skill)
 	public L2DynamicZone(L2WorldRegion region, L2Character owner, L2Skill skill)
 	{
 	{
 		super(-1);
 		super(-1);
 		_region = region;
 		_region = region;
 		_owner = owner;
 		_owner = owner;
 		_skill = skill;
 		_skill = skill;
-		
+		AbstractZoneSettings settings = ZoneManager.getSettings(getName());
+		if (settings == null)
+		{
+			settings = new TaskZoneSettings();
+		}
+		setSettings(settings);
 		Runnable r = new Runnable()
 		Runnable r = new Runnable()
 		{
 		{
 			@Override
 			@Override
@@ -53,7 +53,13 @@ public class L2DynamicZone extends L2ZoneType
 				remove();
 				remove();
 			}
 			}
 		};
 		};
-		setTask(ThreadPoolManager.getInstance().scheduleGeneral(r, skill.getBuffDuration()));
+		getSettings().setTask(ThreadPoolManager.getInstance().scheduleGeneral(r, skill.getBuffDuration()));
+	}
+	
+	@Override
+	public TaskZoneSettings getSettings()
+	{
+		return (TaskZoneSettings) super.getSettings();
 	}
 	}
 	
 	
 	@Override
 	@Override
@@ -88,11 +94,10 @@ public class L2DynamicZone extends L2ZoneType
 	
 	
 	protected void remove()
 	protected void remove()
 	{
 	{
-		if (_task == null || _skill == null)
+		if (getSettings().getTask() == null || _skill == null)
 			return;
 			return;
 		
 		
-		_task.cancel(false);
-		_task = null;
+		getSettings().getTask().cancel(false);
 		
 		
 		_region.removeZone(this);
 		_region.removeZone(this);
 		for (L2Character member : getCharactersInside())
 		for (L2Character member : getCharactersInside())

+ 22 - 9
L2J_Server_BETA/java/com/l2jserver/gameserver/model/zone/type/L2EffectZone.java

@@ -15,16 +15,18 @@
 package com.l2jserver.gameserver.model.zone.type;
 package com.l2jserver.gameserver.model.zone.type;
 
 
 import java.util.Map.Entry;
 import java.util.Map.Entry;
-import java.util.concurrent.Future;
 
 
 import javolution.util.FastMap;
 import javolution.util.FastMap;
 
 
 import com.l2jserver.gameserver.ThreadPoolManager;
 import com.l2jserver.gameserver.ThreadPoolManager;
 import com.l2jserver.gameserver.datatables.SkillTable;
 import com.l2jserver.gameserver.datatables.SkillTable;
+import com.l2jserver.gameserver.instancemanager.ZoneManager;
 import com.l2jserver.gameserver.model.L2Object.InstanceType;
 import com.l2jserver.gameserver.model.L2Object.InstanceType;
 import com.l2jserver.gameserver.model.actor.L2Character;
 import com.l2jserver.gameserver.model.actor.L2Character;
 import com.l2jserver.gameserver.model.skills.L2Skill;
 import com.l2jserver.gameserver.model.skills.L2Skill;
+import com.l2jserver.gameserver.model.zone.AbstractZoneSettings;
 import com.l2jserver.gameserver.model.zone.L2ZoneType;
 import com.l2jserver.gameserver.model.zone.L2ZoneType;
+import com.l2jserver.gameserver.model.zone.TaskZoneSettings;
 import com.l2jserver.gameserver.network.serverpackets.EtcStatusUpdate;
 import com.l2jserver.gameserver.network.serverpackets.EtcStatusUpdate;
 import com.l2jserver.util.Rnd;
 import com.l2jserver.util.Rnd;
 import com.l2jserver.util.StringUtil;
 import com.l2jserver.util.StringUtil;
@@ -41,8 +43,8 @@ public class L2EffectZone extends L2ZoneType
 	private boolean _enabled;
 	private boolean _enabled;
 	protected boolean _bypassConditions;
 	protected boolean _bypassConditions;
 	private boolean _isShowDangerIcon;
 	private boolean _isShowDangerIcon;
-	private volatile Future<?> _task;
-	protected volatile FastMap<Integer, Integer> _skills;
+	protected FastMap<Integer, Integer> _skills;
+
 	
 	
 	public L2EffectZone(int id)
 	public L2EffectZone(int id)
 	{
 	{
@@ -54,6 +56,18 @@ public class L2EffectZone extends L2ZoneType
 		setTargetType(InstanceType.L2Playable); // default only playabale
 		setTargetType(InstanceType.L2Playable); // default only playabale
 		_bypassConditions = false;
 		_bypassConditions = false;
 		_isShowDangerIcon = true;
 		_isShowDangerIcon = true;
+		AbstractZoneSettings settings = ZoneManager.getSettings(getName());
+		if (settings == null)
+		{
+			settings = new TaskZoneSettings();
+		}
+		setSettings(settings);
+	}
+	
+	@Override
+	public TaskZoneSettings getSettings()
+	{
+		return (TaskZoneSettings) super.getSettings();
 	}
 	}
 	
 	
 	@Override
 	@Override
@@ -121,12 +135,12 @@ public class L2EffectZone extends L2ZoneType
 	{
 	{
 		if (_skills != null)
 		if (_skills != null)
 		{
 		{
-			if (_task == null)
+			if (getSettings().getTask() == null)
 			{
 			{
 				synchronized (this)
 				synchronized (this)
 				{
 				{
-					if (_task == null)
-						_task = ThreadPoolManager.getInstance().scheduleGeneralAtFixedRate(new ApplySkill(), _initialDelay, _reuse);
+					if (getSettings().getTask() == null)
+						getSettings().setTask(ThreadPoolManager.getInstance().scheduleGeneralAtFixedRate(new ApplySkill(), _initialDelay, _reuse));
 				}
 				}
 			}
 			}
 		}
 		}
@@ -154,10 +168,9 @@ public class L2EffectZone extends L2ZoneType
 					character.sendPacket(new EtcStatusUpdate(character.getActingPlayer()));
 					character.sendPacket(new EtcStatusUpdate(character.getActingPlayer()));
 			}
 			}
 		}
 		}
-		if (_characterList.isEmpty() && _task != null)
+		if (_characterList.isEmpty() && getSettings().getTask() != null)
 		{
 		{
-			_task.cancel(true);
-			_task = null;
+			getSettings().clear();
 		}
 		}
 	}
 	}
 	
 	

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

@@ -20,6 +20,7 @@ import java.util.List;
 import com.l2jserver.gameserver.ThreadPoolManager;
 import com.l2jserver.gameserver.ThreadPoolManager;
 import com.l2jserver.gameserver.instancemanager.InstanceManager;
 import com.l2jserver.gameserver.instancemanager.InstanceManager;
 import com.l2jserver.gameserver.instancemanager.MapRegionManager;
 import com.l2jserver.gameserver.instancemanager.MapRegionManager;
+import com.l2jserver.gameserver.instancemanager.ZoneManager;
 import com.l2jserver.gameserver.model.L2Spawn;
 import com.l2jserver.gameserver.model.L2Spawn;
 import com.l2jserver.gameserver.model.actor.L2Character;
 import com.l2jserver.gameserver.model.actor.L2Character;
 import com.l2jserver.gameserver.model.actor.L2Summon;
 import com.l2jserver.gameserver.model.actor.L2Summon;
@@ -27,6 +28,7 @@ import com.l2jserver.gameserver.model.actor.instance.L2DoorInstance;
 import com.l2jserver.gameserver.model.actor.instance.L2OlympiadManagerInstance;
 import com.l2jserver.gameserver.model.actor.instance.L2OlympiadManagerInstance;
 import com.l2jserver.gameserver.model.actor.instance.L2PcInstance;
 import com.l2jserver.gameserver.model.actor.instance.L2PcInstance;
 import com.l2jserver.gameserver.model.olympiad.OlympiadGameTask;
 import com.l2jserver.gameserver.model.olympiad.OlympiadGameTask;
+import com.l2jserver.gameserver.model.zone.AbstractZoneSettings;
 import com.l2jserver.gameserver.model.zone.L2ZoneRespawn;
 import com.l2jserver.gameserver.model.zone.L2ZoneRespawn;
 import com.l2jserver.gameserver.network.SystemMessageId;
 import com.l2jserver.gameserver.network.SystemMessageId;
 import com.l2jserver.gameserver.network.serverpackets.ExOlympiadMatchEnd;
 import com.l2jserver.gameserver.network.serverpackets.ExOlympiadMatchEnd;
@@ -40,19 +42,61 @@ import com.l2jserver.gameserver.network.serverpackets.SystemMessage;
  */
  */
 public class L2OlympiadStadiumZone extends L2ZoneRespawn
 public class L2OlympiadStadiumZone extends L2ZoneRespawn
 {
 {
-	private final List<L2Spawn> _buffers;
-	
-	OlympiadGameTask _task = null;
 	
 	
 	public L2OlympiadStadiumZone(int id)
 	public L2OlympiadStadiumZone(int id)
 	{
 	{
 		super(id);
 		super(id);
-		_buffers = new ArrayList<>(2);
+		AbstractZoneSettings settings = ZoneManager.getSettings(getName());
+		if (settings == null)
+		{
+			settings = new Settings();
+		}
+		setSettings(settings);
+	}
+	
+	private final class Settings extends AbstractZoneSettings
+	{
+		private final List<L2Spawn> _buffers;
+		
+		private OlympiadGameTask _task = null;
+
+		public Settings()
+		{
+			_buffers = new ArrayList<>(2);
+		}
+		
+		public OlympiadGameTask getOlympiadTask()
+		{
+			return _task;
+		}
+		
+		protected void setTask(OlympiadGameTask task)
+		{
+			_task = task;
+		}
+		
+		public List<L2Spawn> getBuffers()
+		{
+			return _buffers;
+		}
+		
+		@Override
+		public void clear()
+		{
+			_task = null;
+			_buffers.clear();
+		}
+	}
+	
+	@Override
+	public Settings getSettings()
+	{
+		return (Settings) super.getSettings();
 	}
 	}
 	
 	
 	public final void registerTask(OlympiadGameTask task)
 	public final void registerTask(OlympiadGameTask task)
 	{
 	{
-		_task = task;
+		getSettings().setTask(task);
 	}
 	}
 	
 	
 	public final void openDoors()
 	public final void openDoors()
@@ -75,7 +119,7 @@ public class L2OlympiadStadiumZone extends L2ZoneRespawn
 	
 	
 	public final void spawnBuffers()
 	public final void spawnBuffers()
 	{
 	{
-		for (L2Spawn spawn : _buffers)
+		for (L2Spawn spawn : getSettings().getBuffers())
 		{
 		{
 			spawn.startRespawn();
 			spawn.startRespawn();
 			spawn.respawnNpc(spawn.getLastSpawn());
 			spawn.respawnNpc(spawn.getLastSpawn());
@@ -85,7 +129,7 @@ public class L2OlympiadStadiumZone extends L2ZoneRespawn
 	
 	
 	public final void deleteBuffers()
 	public final void deleteBuffers()
 	{
 	{
-		for (L2Spawn spawn : _buffers)
+		for (L2Spawn spawn : getSettings().getBuffers())
 		{
 		{
 			if (spawn.getLastSpawn().isVisible())
 			if (spawn.getLastSpawn().isVisible())
 				spawn.getLastSpawn().deleteMe();
 				spawn.getLastSpawn().deleteMe();
@@ -121,15 +165,15 @@ public class L2OlympiadStadiumZone extends L2ZoneRespawn
 	@Override
 	@Override
 	protected final void onEnter(L2Character character)
 	protected final void onEnter(L2Character character)
 	{
 	{
-		if (_task != null)
+		if (getSettings().getOlympiadTask() != null)
 		{
 		{
-			if (_task.isBattleStarted())
+			if (getSettings().getOlympiadTask().isBattleStarted())
 			{
 			{
 				character.setInsideZone(L2Character.ZONE_PVP, true);
 				character.setInsideZone(L2Character.ZONE_PVP, true);
 				if (character.isPlayer())
 				if (character.isPlayer())
 				{
 				{
 					character.sendPacket(SystemMessageId.ENTERED_COMBAT_ZONE);
 					character.sendPacket(SystemMessageId.ENTERED_COMBAT_ZONE);
-					_task.getGame().sendOlympiadInfo(character);
+					getSettings().getOlympiadTask().getGame().sendOlympiadInfo(character);
 				}
 				}
 			}
 			}
 		}
 		}
@@ -147,9 +191,9 @@ public class L2OlympiadStadiumZone extends L2ZoneRespawn
 		else if (character instanceof L2OlympiadManagerInstance)
 		else if (character instanceof L2OlympiadManagerInstance)
 		{
 		{
 			final L2Spawn spawn = ((L2OlympiadManagerInstance) character).getSpawn();
 			final L2Spawn spawn = ((L2OlympiadManagerInstance) character).getSpawn();
-			if (spawn != null && !_buffers.contains(spawn))
+			if (spawn != null && !getSettings().getBuffers().contains(spawn))
 			{
 			{
-				_buffers.add(spawn);
+				getSettings().getBuffers().add(spawn);
 				spawn.stopRespawn();
 				spawn.stopRespawn();
 				character.deleteMe();
 				character.deleteMe();
 			}
 			}
@@ -159,9 +203,9 @@ public class L2OlympiadStadiumZone extends L2ZoneRespawn
 	@Override
 	@Override
 	protected final void onExit(L2Character character)
 	protected final void onExit(L2Character character)
 	{
 	{
-		if (_task != null)
+		if (getSettings().getOlympiadTask() != null)
 		{
 		{
-			if (_task.isBattleStarted())
+			if (getSettings().getOlympiadTask().isBattleStarted())
 			{
 			{
 				character.setInsideZone(L2Character.ZONE_PVP, false);
 				character.setInsideZone(L2Character.ZONE_PVP, false);
 				if (character.isPlayer())
 				if (character.isPlayer())
@@ -175,10 +219,10 @@ public class L2OlympiadStadiumZone extends L2ZoneRespawn
 	
 	
 	public final void updateZoneStatusForCharactersInside()
 	public final void updateZoneStatusForCharactersInside()
 	{
 	{
-		if (_task == null)
+		if (getSettings().getOlympiadTask() == null)
 			return;
 			return;
 		
 		
-		final boolean battleStarted = _task.isBattleStarted();
+		final boolean battleStarted = getSettings().getOlympiadTask().isBattleStarted();
 		final SystemMessage sm;
 		final SystemMessage sm;
 		if (battleStarted)
 		if (battleStarted)
 			sm = SystemMessage.getSystemMessage(SystemMessageId.ENTERED_COMBAT_ZONE);
 			sm = SystemMessage.getSystemMessage(SystemMessageId.ENTERED_COMBAT_ZONE);

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

@@ -20,6 +20,7 @@ import com.l2jserver.gameserver.instancemanager.CHSiegeManager;
 import com.l2jserver.gameserver.instancemanager.FortManager;
 import com.l2jserver.gameserver.instancemanager.FortManager;
 import com.l2jserver.gameserver.instancemanager.FortSiegeManager;
 import com.l2jserver.gameserver.instancemanager.FortSiegeManager;
 import com.l2jserver.gameserver.instancemanager.MapRegionManager.TeleportWhereType;
 import com.l2jserver.gameserver.instancemanager.MapRegionManager.TeleportWhereType;
+import com.l2jserver.gameserver.instancemanager.ZoneManager;
 import com.l2jserver.gameserver.model.actor.L2Character;
 import com.l2jserver.gameserver.model.actor.L2Character;
 import com.l2jserver.gameserver.model.actor.instance.L2PcInstance;
 import com.l2jserver.gameserver.model.actor.instance.L2PcInstance;
 import com.l2jserver.gameserver.model.actor.instance.L2SiegeSummonInstance;
 import com.l2jserver.gameserver.model.actor.instance.L2SiegeSummonInstance;
@@ -29,6 +30,7 @@ import com.l2jserver.gameserver.model.entity.FortSiege;
 import com.l2jserver.gameserver.model.entity.Siegable;
 import com.l2jserver.gameserver.model.entity.Siegable;
 import com.l2jserver.gameserver.model.entity.clanhall.SiegableHall;
 import com.l2jserver.gameserver.model.entity.clanhall.SiegableHall;
 import com.l2jserver.gameserver.model.skills.L2Skill;
 import com.l2jserver.gameserver.model.skills.L2Skill;
+import com.l2jserver.gameserver.model.zone.AbstractZoneSettings;
 import com.l2jserver.gameserver.model.zone.L2ZoneType;
 import com.l2jserver.gameserver.model.zone.L2ZoneType;
 import com.l2jserver.gameserver.network.SystemMessageId;
 import com.l2jserver.gameserver.network.SystemMessageId;
 
 
@@ -38,14 +40,73 @@ import com.l2jserver.gameserver.network.SystemMessageId;
  */
  */
 public class L2SiegeZone extends L2ZoneType
 public class L2SiegeZone extends L2ZoneType
 {
 {
-	private int _siegableId = -1;
-	private Siegable _siege = null;
-	private boolean _isActiveSiege = false;
 	private static final int DISMOUNT_DELAY = 5;
 	private static final int DISMOUNT_DELAY = 5;
 	
 	
 	public L2SiegeZone(int id)
 	public L2SiegeZone(int id)
 	{
 	{
 		super(id);
 		super(id);
+		AbstractZoneSettings settings = ZoneManager.getSettings(getName());
+		if (settings == null)
+		{
+			settings = new Settings();
+		}
+		setSettings(settings);
+	}
+	
+
+	private final class Settings extends AbstractZoneSettings
+	{
+		private int _siegableId = -1;
+		private Siegable _siege = null;
+		private boolean _isActiveSiege = false;
+
+		public Settings()
+		{
+		}
+		
+		public int getSiegeableId()
+		{
+			return _siegableId;
+		}
+		
+		protected void setSiegeableId(int id)
+		{
+			_siegableId = id;
+		}
+		
+		public Siegable getSiege()
+		{
+			return _siege;
+		}
+		
+		public void setSiege(Siegable s)
+		{
+			_siege = s;
+		}
+		
+		public boolean isActiveSiege()
+		{
+			return _isActiveSiege;
+		}
+		
+		public void setActiveSiege(boolean val)
+		{
+			_isActiveSiege = val;
+		}
+		
+		@Override
+		public void clear()
+		{
+			_siegableId = -1;
+			_siege = null;
+			_isActiveSiege = false;
+		}
+	}
+	
+	@Override
+	public Settings getSettings()
+	{
+		return (Settings) super.getSettings();
 	}
 	}
 	
 	
 	@Override
 	@Override
@@ -53,28 +114,28 @@ public class L2SiegeZone extends L2ZoneType
 	{
 	{
 		if (name.equals("castleId"))
 		if (name.equals("castleId"))
 		{
 		{
-			if (_siegableId != -1)
+			if (getSettings().getSiegeableId() != -1)
 			{
 			{
 				throw new IllegalArgumentException("Siege object already defined!");
 				throw new IllegalArgumentException("Siege object already defined!");
 			}
 			}
-			_siegableId = Integer.parseInt(value);
+			getSettings().setSiegeableId(Integer.parseInt(value));
 		}
 		}
 		else if (name.equals("fortId"))
 		else if (name.equals("fortId"))
 		{
 		{
-			if (_siegableId != -1)
+			if (getSettings().getSiegeableId() != -1)
 			{
 			{
 				throw new IllegalArgumentException("Siege object already defined!");
 				throw new IllegalArgumentException("Siege object already defined!");
 			}
 			}
-			_siegableId = Integer.parseInt(value);
+			getSettings().setSiegeableId(Integer.parseInt(value));
 		}
 		}
 		else if (name.equals("clanHallId"))
 		else if (name.equals("clanHallId"))
 		{
 		{
-			if (_siegableId != -1)
+			if (getSettings().getSiegeableId() != -1)
 			{
 			{
 				throw new IllegalArgumentException("Siege object already defined!");
 				throw new IllegalArgumentException("Siege object already defined!");
 			}
 			}
-			_siegableId = Integer.parseInt(value);
-			SiegableHall hall = CHSiegeManager.getInstance().getConquerableHalls().get(_siegableId);
+			getSettings().setSiegeableId(Integer.parseInt(value));
+			SiegableHall hall = CHSiegeManager.getInstance().getConquerableHalls().get(getSettings().getSiegeableId());
 			if (hall == null)
 			if (hall == null)
 			{
 			{
 				_log.warning("L2SiegeZone: Siegable clan hall with id " + value + " does not exist!");
 				_log.warning("L2SiegeZone: Siegable clan hall with id " + value + " does not exist!");
@@ -93,7 +154,7 @@ public class L2SiegeZone extends L2ZoneType
 	@Override
 	@Override
 	protected void onEnter(L2Character character)
 	protected void onEnter(L2Character character)
 	{
 	{
-		if (_isActiveSiege)
+		if (getSettings().isActiveSiege())
 		{
 		{
 			character.setInsideZone(L2Character.ZONE_PVP, true);
 			character.setInsideZone(L2Character.ZONE_PVP, true);
 			character.setInsideZone(L2Character.ZONE_SIEGE, true);
 			character.setInsideZone(L2Character.ZONE_SIEGE, true);
@@ -102,12 +163,12 @@ public class L2SiegeZone extends L2ZoneType
 			if (character.isPlayer())
 			if (character.isPlayer())
 			{
 			{
 				L2PcInstance plyer = character.getActingPlayer();
 				L2PcInstance plyer = character.getActingPlayer();
-				if (plyer.isRegisteredOnThisSiegeField(_siegableId))
+				if (plyer.isRegisteredOnThisSiegeField(getSettings().getSiegeableId()))
 				{
 				{
 					plyer.setIsInSiege(true); // in siege
 					plyer.setIsInSiege(true); // in siege
-					if (_siege.giveFame() && _siege.getFameFrequency() > 0)
+					if (getSettings().getSiege().giveFame() && getSettings().getSiege().getFameFrequency() > 0)
 					{
 					{
-						plyer.startFameTask(_siege.getFameFrequency() * 1000, _siege.getFameAmount());
+						plyer.startFameTask(getSettings().getSiege().getFameFrequency() * 1000, getSettings().getSiege().getFameAmount());
 					}
 					}
 				}
 				}
 				
 				
@@ -127,7 +188,7 @@ public class L2SiegeZone extends L2ZoneType
 		character.setInsideZone(L2Character.ZONE_PVP, false);
 		character.setInsideZone(L2Character.ZONE_PVP, false);
 		character.setInsideZone(L2Character.ZONE_SIEGE, false);
 		character.setInsideZone(L2Character.ZONE_SIEGE, false);
 		character.setInsideZone(L2Character.ZONE_NOSUMMONFRIEND, false); // FIXME: Custom ?
 		character.setInsideZone(L2Character.ZONE_NOSUMMONFRIEND, false); // FIXME: Custom ?
-		if (_isActiveSiege)
+		if (getSettings().isActiveSiege())
 		{
 		{
 			if (character.isPlayer())
 			if (character.isPlayer())
 			{
 			{
@@ -150,10 +211,10 @@ public class L2SiegeZone extends L2ZoneType
 			activeChar.stopFameTask();
 			activeChar.stopFameTask();
 			activeChar.setIsInSiege(false);
 			activeChar.setIsInSiege(false);
 			
 			
-			if (_siege instanceof FortSiege && activeChar.getInventory().getItemByItemId(9819) != null)
+			if (getSettings().getSiege() instanceof FortSiege && activeChar.getInventory().getItemByItemId(9819) != null)
 			{
 			{
 				// drop combat flag
 				// drop combat flag
-				Fort fort = FortManager.getInstance().getFortById(_siegableId);
+				Fort fort = FortManager.getInstance().getFortById(getSettings().getSiegeableId());
 				if (fort != null)
 				if (fort != null)
 				{
 				{
 					FortSiegeManager.getInstance().dropCombatFlag(activeChar, fort.getFortId());
 					FortSiegeManager.getInstance().dropCombatFlag(activeChar, fort.getFortId());
@@ -176,10 +237,10 @@ public class L2SiegeZone extends L2ZoneType
 	@Override
 	@Override
 	public void onDieInside(L2Character character)
 	public void onDieInside(L2Character character)
 	{
 	{
-		if (_isActiveSiege)
+		if (getSettings().isActiveSiege())
 		{
 		{
 			// debuff participants only if they die inside siege zone
 			// debuff participants only if they die inside siege zone
-			if (character.isPlayer() && character.getActingPlayer().isRegisteredOnThisSiegeField(_siegableId))
+			if (character.isPlayer() && character.getActingPlayer().isRegisteredOnThisSiegeField(getSettings().getSiegeableId()))
 			{
 			{
 				int lvl = 1;
 				int lvl = 1;
 				final L2Effect e = character.getFirstEffect(5660);
 				final L2Effect e = character.getFirstEffect(5660);
@@ -202,7 +263,7 @@ public class L2SiegeZone extends L2ZoneType
 	
 	
 	public void updateZoneStatusForCharactersInside()
 	public void updateZoneStatusForCharactersInside()
 	{
 	{
-		if (_isActiveSiege)
+		if (getSettings().isActiveSiege())
 		{
 		{
 			for (L2Character character : getCharactersInside())
 			for (L2Character character : getCharactersInside())
 			{
 			{
@@ -256,22 +317,22 @@ public class L2SiegeZone extends L2ZoneType
 	
 	
 	public int getSiegeObjectId()
 	public int getSiegeObjectId()
 	{
 	{
-		return _siegableId;
+		return getSettings().getSiegeableId();
 	}
 	}
 	
 	
 	public boolean isActive()
 	public boolean isActive()
 	{
 	{
-		return _isActiveSiege;
+		return getSettings().isActiveSiege();
 	}
 	}
 	
 	
 	public void setIsActive(boolean val)
 	public void setIsActive(boolean val)
 	{
 	{
-		_isActiveSiege = val;
+		getSettings().setActiveSiege(val);
 	}
 	}
 	
 	
 	public void setSiegeInstance(Siegable siege)
 	public void setSiegeInstance(Siegable siege)
 	{
 	{
-		_siege = siege;
+		getSettings().setSiege(siege);
 	}
 	}
 	
 	
 	/**
 	/**