2
0
Эх сурвалжийг харах

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 жил өмнө
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.Map;
 import java.util.logging.Level;
-import java.util.logging.Logger;
 
 import org.w3c.dom.NamedNodeMap;
 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.actor.L2Character;
 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.L2ZoneType;
 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
 {
-	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 int _lastDynamicId = 300000;
@@ -75,6 +75,18 @@ public class ZoneManager extends DocumentParser
 		// Get the world regions
 		int count = 0;
 		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 y = 0; y < worldRegions[x].length; y++)
@@ -89,6 +101,7 @@ public class ZoneManager extends DocumentParser
 		// Load the zones
 		load();
 		L2World.getInstance().forEachObject(new ForEachCharacterRevalidateZone());
+		_settings.clear();
 	}
 	
 	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
 	{
 		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()
 	{
-		this.resume();
+		resume();
 	}
 	
 	public void resume()
 	{
-		this.getPlayer().transform(this);
+		getPlayer().transform(this);
 	}
 	
 	@Override
 	public void run()
 	{
-		this.stop();
+		stop();
 	}
 	
 	public void stop()
 	{
-		this.getPlayer().untransform();
+		getPlayer().untransform();
 	}
 	
 	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;
 
 /**
- * Abstract base class for any zone type Handles basic operations
+ * Abstract base class for any zone type handles basic operations.
  * @author durgus
  */
 public abstract class L2ZoneType
@@ -46,7 +46,6 @@ public abstract class L2ZoneType
 	
 	/** Parameters to affect specific characters */
 	private boolean _checkAffected = false;
-	
 	private String _name = null;
 	private int _instanceId = -1;
 	private String _instanceTemplate = "";
@@ -58,6 +57,7 @@ public abstract class L2ZoneType
 	private Map<QuestEventType, List<Quest>> _questEvents;
 	private InstanceType _target = InstanceType.L2Character; // default all chars
 	private boolean _allowStore;
+	private AbstractZoneSettings _settings;
 	
 	protected L2ZoneType(int id)
 	{
@@ -456,6 +456,20 @@ public abstract class L2ZoneType
 		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 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.instancemanager.GrandBossManager;
 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.L2Character;
 import com.l2jserver.gameserver.model.actor.L2Npc;
 import com.l2jserver.gameserver.model.actor.L2Summon;
 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.util.L2FastList;
 
@@ -37,17 +39,6 @@ public class L2BossZone extends L2ZoneType
 	private int _timeInvade;
 	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 =
 	{
 		0,
@@ -55,17 +46,69 @@ public class L2BossZone extends L2ZoneType
 		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)
 	{
 		super(id);
-		_playerAllowedReEntryTimes = new FastMap<>();
-		_playersAllowed = new L2FastList<>();
 		_oustLoc = new int[3];
+		AbstractZoneSettings settings = ZoneManager.getSettings(getName());
+		if (settings == null)
+		{
+			settings = new Settings();
+		}
+		setSettings(settings);
 		GrandBossManager.getInstance().addZone(this);
 	}
 	
+	@Override
+	public Settings getSettings()
+	{
+		return (Settings) super.getSettings();
+	}
+	
 	@Override
 	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.
 	 */
 	@Override
@@ -115,11 +159,11 @@ public class L2BossZone extends L2ZoneType
 					return;
 				// 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)
-				if (_playersAllowed.contains(player.getObjectId()))
+				if (getSettings().getPlayersAllowed().contains(player.getObjectId()))
 				{
 					// Get the information about this player's last logout-exit from
 					// this zone.
-					final Long expirationTime = _playerAllowedReEntryTimes.get(player.getObjectId());
+					final Long expirationTime = getSettings().getPlayerAllowedReEntryTimes().get(player.getObjectId());
 					
 					// with legal entries, do nothing.
 					if (expirationTime == null) // legal null expirationTime entries
@@ -133,13 +177,13 @@ public class L2BossZone extends L2ZoneType
 					else
 					{
 						// legal non-null logoutTime entries
-						_playerAllowedReEntryTimes.remove(player.getObjectId());
+						getSettings().getPlayerAllowedReEntryTimes().remove(player.getObjectId());
 						if (expirationTime.longValue() > System.currentTimeMillis())
 						{
 							return;
 						}
 					}
-					_playersAllowed.remove(_playersAllowed.indexOf(player.getObjectId()));
+					getSettings().getPlayersAllowed().remove(getSettings().getPlayersAllowed().indexOf(player.getObjectId()));
 				}
 				// teleport out all players who attempt "illegal" (re-)entry
 				if (_oustLoc[0] != 0 && _oustLoc[1] != 0 && _oustLoc[2] != 0)
@@ -156,7 +200,7 @@ public class L2BossZone extends L2ZoneType
 				final L2PcInstance player = character.getActingPlayer();
 				if (player != null)
 				{
-					if (_playersAllowed.contains(player.getObjectId()) || player.isGM())
+					if (getSettings().getPlayersAllowed().contains(player.getObjectId()) || player.isGM())
 						return;
 					
 					// remove summon and teleport out owner
@@ -190,25 +234,25 @@ public class L2BossZone extends L2ZoneType
 				// time so that
 				// decisions can be made later about allowing or not the player
 				// 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
-					_playerAllowedReEntryTimes.put(player.getObjectId(), System.currentTimeMillis() + _timeInvade);
+					getSettings().getPlayerAllowedReEntryTimes().put(player.getObjectId(), System.currentTimeMillis() + _timeInvade);
 				}
 				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 (getCharactersInside() != null && !getCharactersInside().isEmpty())
 				{
-					_raidList.clear();
+					getSettings().getRaidList().clear();
 					int count = 0;
 					for (L2Character obj : getCharactersInside())
 					{
@@ -222,15 +266,15 @@ public class L2BossZone extends L2ZoneType
 						}
 						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 (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())
 								continue;
 							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)
 	{
 		if (players != null)
-			_playersAllowed = players;
+		{
+			getSettings().getPlayersAllowed().clear();
+			getSettings().getPlayersAllowed().addAll(players);
+		}
 	}
 	
 	public L2FastList<Integer> getAllowedPlayers()
 	{
-		return _playersAllowed;
+		return getSettings().getPlayersAllowed();
 	}
 	
 	public boolean isPlayerAllowed(L2PcInstance player)
@@ -276,7 +323,7 @@ public class L2BossZone extends L2ZoneType
 		{
 			return true;
 		}
-		else if (_playersAllowed.contains(player.getObjectId()))
+		else if (getSettings().getPlayersAllowed().contains(player.getObjectId()))
 		{
 			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 (!_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())
 		{
-			_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;
 
-import java.util.concurrent.Future;
-
 import com.l2jserver.gameserver.ThreadPoolManager;
 import com.l2jserver.gameserver.instancemanager.CastleManager;
+import com.l2jserver.gameserver.instancemanager.ZoneManager;
 import com.l2jserver.gameserver.model.L2Object.InstanceType;
 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.stats.Stats;
+import com.l2jserver.gameserver.model.zone.AbstractZoneSettings;
 import com.l2jserver.gameserver.model.zone.L2ZoneType;
+import com.l2jserver.gameserver.model.zone.TaskZoneSettings;
 
 /**
  * A damage zone
@@ -33,7 +34,6 @@ public class L2DamageZone extends L2ZoneType
 {
 	private int _damageHPPerSec;
 	private int _damageMPPerSec;
-	private Future<?> _task;
 	
 	private int _castleId;
 	private Castle _castle;
@@ -63,6 +63,18 @@ public class L2DamageZone extends L2ZoneType
 		_enabled = true;
 		
 		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
@@ -101,7 +113,7 @@ public class L2DamageZone extends L2ZoneType
 	@Override
 	protected void onEnter(L2Character character)
 	{
-		if (_task == null && (_damageHPPerSec != 0 || _damageMPPerSec != 0))
+		if (getSettings().getTask() == null && (_damageHPPerSec != 0 || _damageMPPerSec != 0))
 		{
 			L2PcInstance player = character.getActingPlayer();
 			if (getCastle() != null) // Castle zone
@@ -114,8 +126,8 @@ public class L2DamageZone extends L2ZoneType
 			
 			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
 	protected void onExit(L2Character character)
 	{
-		if (_characterList.isEmpty() && _task != null)
+		if (_characterList.isEmpty() && getSettings().getTask() != null)
 		{
 			stopTask();
 		}
@@ -141,10 +153,9 @@ public class L2DamageZone extends L2ZoneType
 	
 	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
 		public void run()
-		{	
+		{
 			if (!_enabled)
 			{
 				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;
 
-import java.util.concurrent.Future;
-
 import com.l2jserver.gameserver.ThreadPoolManager;
+import com.l2jserver.gameserver.instancemanager.ZoneManager;
 import com.l2jserver.gameserver.model.L2WorldRegion;
 import com.l2jserver.gameserver.model.actor.L2Character;
 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.TaskZoneSettings;
 
 /**
  * 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 L2Character _owner;
-	private Future<?> _task;
 	private L2Skill _skill;
 	
-	protected void setTask(Future<?> task)
-	{
-		_task = task;
-	}
-	
 	public L2DynamicZone(L2WorldRegion region, L2Character owner, L2Skill skill)
 	{
 		super(-1);
 		_region = region;
 		_owner = owner;
 		_skill = skill;
-		
+		AbstractZoneSettings settings = ZoneManager.getSettings(getName());
+		if (settings == null)
+		{
+			settings = new TaskZoneSettings();
+		}
+		setSettings(settings);
 		Runnable r = new Runnable()
 		{
 			@Override
@@ -53,7 +53,13 @@ public class L2DynamicZone extends L2ZoneType
 				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
@@ -88,11 +94,10 @@ public class L2DynamicZone extends L2ZoneType
 	
 	protected void remove()
 	{
-		if (_task == null || _skill == null)
+		if (getSettings().getTask() == null || _skill == null)
 			return;
 		
-		_task.cancel(false);
-		_task = null;
+		getSettings().getTask().cancel(false);
 		
 		_region.removeZone(this);
 		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;
 
 import java.util.Map.Entry;
-import java.util.concurrent.Future;
 
 import javolution.util.FastMap;
 
 import com.l2jserver.gameserver.ThreadPoolManager;
 import com.l2jserver.gameserver.datatables.SkillTable;
+import com.l2jserver.gameserver.instancemanager.ZoneManager;
 import com.l2jserver.gameserver.model.L2Object.InstanceType;
 import com.l2jserver.gameserver.model.actor.L2Character;
 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.TaskZoneSettings;
 import com.l2jserver.gameserver.network.serverpackets.EtcStatusUpdate;
 import com.l2jserver.util.Rnd;
 import com.l2jserver.util.StringUtil;
@@ -41,8 +43,8 @@ public class L2EffectZone extends L2ZoneType
 	private boolean _enabled;
 	protected boolean _bypassConditions;
 	private boolean _isShowDangerIcon;
-	private volatile Future<?> _task;
-	protected volatile FastMap<Integer, Integer> _skills;
+	protected FastMap<Integer, Integer> _skills;
+
 	
 	public L2EffectZone(int id)
 	{
@@ -54,6 +56,18 @@ public class L2EffectZone extends L2ZoneType
 		setTargetType(InstanceType.L2Playable); // default only playabale
 		_bypassConditions = false;
 		_isShowDangerIcon = true;
+		AbstractZoneSettings settings = ZoneManager.getSettings(getName());
+		if (settings == null)
+		{
+			settings = new TaskZoneSettings();
+		}
+		setSettings(settings);
+	}
+	
+	@Override
+	public TaskZoneSettings getSettings()
+	{
+		return (TaskZoneSettings) super.getSettings();
 	}
 	
 	@Override
@@ -121,12 +135,12 @@ public class L2EffectZone extends L2ZoneType
 	{
 		if (_skills != null)
 		{
-			if (_task == null)
+			if (getSettings().getTask() == null)
 			{
 				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()));
 			}
 		}
-		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.instancemanager.InstanceManager;
 import com.l2jserver.gameserver.instancemanager.MapRegionManager;
+import com.l2jserver.gameserver.instancemanager.ZoneManager;
 import com.l2jserver.gameserver.model.L2Spawn;
 import com.l2jserver.gameserver.model.actor.L2Character;
 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.L2PcInstance;
 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.network.SystemMessageId;
 import com.l2jserver.gameserver.network.serverpackets.ExOlympiadMatchEnd;
@@ -40,19 +42,61 @@ import com.l2jserver.gameserver.network.serverpackets.SystemMessage;
  */
 public class L2OlympiadStadiumZone extends L2ZoneRespawn
 {
-	private final List<L2Spawn> _buffers;
-	
-	OlympiadGameTask _task = null;
 	
 	public L2OlympiadStadiumZone(int 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)
 	{
-		_task = task;
+		getSettings().setTask(task);
 	}
 	
 	public final void openDoors()
@@ -75,7 +119,7 @@ public class L2OlympiadStadiumZone extends L2ZoneRespawn
 	
 	public final void spawnBuffers()
 	{
-		for (L2Spawn spawn : _buffers)
+		for (L2Spawn spawn : getSettings().getBuffers())
 		{
 			spawn.startRespawn();
 			spawn.respawnNpc(spawn.getLastSpawn());
@@ -85,7 +129,7 @@ public class L2OlympiadStadiumZone extends L2ZoneRespawn
 	
 	public final void deleteBuffers()
 	{
-		for (L2Spawn spawn : _buffers)
+		for (L2Spawn spawn : getSettings().getBuffers())
 		{
 			if (spawn.getLastSpawn().isVisible())
 				spawn.getLastSpawn().deleteMe();
@@ -121,15 +165,15 @@ public class L2OlympiadStadiumZone extends L2ZoneRespawn
 	@Override
 	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);
 				if (character.isPlayer())
 				{
 					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)
 		{
 			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();
 				character.deleteMe();
 			}
@@ -159,9 +203,9 @@ public class L2OlympiadStadiumZone extends L2ZoneRespawn
 	@Override
 	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);
 				if (character.isPlayer())
@@ -175,10 +219,10 @@ public class L2OlympiadStadiumZone extends L2ZoneRespawn
 	
 	public final void updateZoneStatusForCharactersInside()
 	{
-		if (_task == null)
+		if (getSettings().getOlympiadTask() == null)
 			return;
 		
-		final boolean battleStarted = _task.isBattleStarted();
+		final boolean battleStarted = getSettings().getOlympiadTask().isBattleStarted();
 		final SystemMessage sm;
 		if (battleStarted)
 			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.FortSiegeManager;
 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.instance.L2PcInstance;
 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.clanhall.SiegableHall;
 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.network.SystemMessageId;
 
@@ -38,14 +40,73 @@ import com.l2jserver.gameserver.network.SystemMessageId;
  */
 public class L2SiegeZone extends L2ZoneType
 {
-	private int _siegableId = -1;
-	private Siegable _siege = null;
-	private boolean _isActiveSiege = false;
 	private static final int DISMOUNT_DELAY = 5;
 	
 	public L2SiegeZone(int 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
@@ -53,28 +114,28 @@ public class L2SiegeZone extends L2ZoneType
 	{
 		if (name.equals("castleId"))
 		{
-			if (_siegableId != -1)
+			if (getSettings().getSiegeableId() != -1)
 			{
 				throw new IllegalArgumentException("Siege object already defined!");
 			}
-			_siegableId = Integer.parseInt(value);
+			getSettings().setSiegeableId(Integer.parseInt(value));
 		}
 		else if (name.equals("fortId"))
 		{
-			if (_siegableId != -1)
+			if (getSettings().getSiegeableId() != -1)
 			{
 				throw new IllegalArgumentException("Siege object already defined!");
 			}
-			_siegableId = Integer.parseInt(value);
+			getSettings().setSiegeableId(Integer.parseInt(value));
 		}
 		else if (name.equals("clanHallId"))
 		{
-			if (_siegableId != -1)
+			if (getSettings().getSiegeableId() != -1)
 			{
 				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)
 			{
 				_log.warning("L2SiegeZone: Siegable clan hall with id " + value + " does not exist!");
@@ -93,7 +154,7 @@ public class L2SiegeZone extends L2ZoneType
 	@Override
 	protected void onEnter(L2Character character)
 	{
-		if (_isActiveSiege)
+		if (getSettings().isActiveSiege())
 		{
 			character.setInsideZone(L2Character.ZONE_PVP, true);
 			character.setInsideZone(L2Character.ZONE_SIEGE, true);
@@ -102,12 +163,12 @@ public class L2SiegeZone extends L2ZoneType
 			if (character.isPlayer())
 			{
 				L2PcInstance plyer = character.getActingPlayer();
-				if (plyer.isRegisteredOnThisSiegeField(_siegableId))
+				if (plyer.isRegisteredOnThisSiegeField(getSettings().getSiegeableId()))
 				{
 					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_SIEGE, false);
 		character.setInsideZone(L2Character.ZONE_NOSUMMONFRIEND, false); // FIXME: Custom ?
-		if (_isActiveSiege)
+		if (getSettings().isActiveSiege())
 		{
 			if (character.isPlayer())
 			{
@@ -150,10 +211,10 @@ public class L2SiegeZone extends L2ZoneType
 			activeChar.stopFameTask();
 			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
-				Fort fort = FortManager.getInstance().getFortById(_siegableId);
+				Fort fort = FortManager.getInstance().getFortById(getSettings().getSiegeableId());
 				if (fort != null)
 				{
 					FortSiegeManager.getInstance().dropCombatFlag(activeChar, fort.getFortId());
@@ -176,10 +237,10 @@ public class L2SiegeZone extends L2ZoneType
 	@Override
 	public void onDieInside(L2Character character)
 	{
-		if (_isActiveSiege)
+		if (getSettings().isActiveSiege())
 		{
 			// 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;
 				final L2Effect e = character.getFirstEffect(5660);
@@ -202,7 +263,7 @@ public class L2SiegeZone extends L2ZoneType
 	
 	public void updateZoneStatusForCharactersInside()
 	{
-		if (_isActiveSiege)
+		if (getSettings().isActiveSiege())
 		{
 			for (L2Character character : getCharactersInside())
 			{
@@ -256,22 +317,22 @@ public class L2SiegeZone extends L2ZoneType
 	
 	public int getSiegeObjectId()
 	{
-		return _siegableId;
+		return getSettings().getSiegeableId();
 	}
 	
 	public boolean isActive()
 	{
-		return _isActiveSiege;
+		return getSettings().isActiveSiege();
 	}
 	
 	public void setIsActive(boolean val)
 	{
-		_isActiveSiege = val;
+		getSettings().setActiveSiege(val);
 	}
 	
 	public void setSiegeInstance(Siegable siege)
 	{
-		_siege = siege;
+		getSettings().setSiege(siege);
 	}
 	
 	/**