diff --git a/L2J_Mobius_1.0_Ertheia/java/org/l2jmobius/gameserver/model/zone/TaskZoneSettings.java b/L2J_Mobius_1.0_Ertheia/java/org/l2jmobius/gameserver/model/zone/TaskZoneSettings.java
deleted file mode 100644
index facc7f731b..0000000000
--- a/L2J_Mobius_1.0_Ertheia/java/org/l2jmobius/gameserver/model/zone/TaskZoneSettings.java
+++ /dev/null
@@ -1,56 +0,0 @@
-/*
- * This file is part of the L2J Mobius project.
- *
- * 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 .
- */
-package org.l2jmobius.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);
- _task = null;
- }
- }
-}
diff --git a/L2J_Mobius_1.0_Ertheia/java/org/l2jmobius/gameserver/model/zone/type/DamageZone.java b/L2J_Mobius_1.0_Ertheia/java/org/l2jmobius/gameserver/model/zone/type/DamageZone.java
index 13b533a54f..ce5daa2ab3 100644
--- a/L2J_Mobius_1.0_Ertheia/java/org/l2jmobius/gameserver/model/zone/type/DamageZone.java
+++ b/L2J_Mobius_1.0_Ertheia/java/org/l2jmobius/gameserver/model/zone/type/DamageZone.java
@@ -16,16 +16,15 @@
*/
package org.l2jmobius.gameserver.model.zone.type;
+import java.util.concurrent.Future;
+
import org.l2jmobius.commons.concurrent.ThreadPool;
import org.l2jmobius.gameserver.enums.InstanceType;
import org.l2jmobius.gameserver.instancemanager.CastleManager;
-import org.l2jmobius.gameserver.instancemanager.ZoneManager;
import org.l2jmobius.gameserver.model.actor.Creature;
import org.l2jmobius.gameserver.model.actor.instance.PlayerInstance;
import org.l2jmobius.gameserver.model.siege.Castle;
import org.l2jmobius.gameserver.model.stats.Stat;
-import org.l2jmobius.gameserver.model.zone.AbstractZoneSettings;
-import org.l2jmobius.gameserver.model.zone.TaskZoneSettings;
import org.l2jmobius.gameserver.model.zone.ZoneType;
/**
@@ -42,6 +41,7 @@ public class DamageZone extends ZoneType
private int _startTask;
private int _reuseTask;
+ private volatile Future> _task;
public DamageZone(int id)
{
@@ -60,18 +60,6 @@ public class DamageZone extends ZoneType
_castle = null;
setTargetType(InstanceType.Playable); // 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
@@ -106,12 +94,14 @@ public class DamageZone extends ZoneType
@Override
protected void onEnter(Creature creature)
{
- if ((getSettings().getTask() == null) && ((_damageHPPerSec != 0) || (_damageMPPerSec != 0)))
+ Future> task = _task;
+ if ((task == null) && ((_damageHPPerSec != 0) || (_damageMPPerSec != 0)))
{
final PlayerInstance player = creature.getActingPlayer();
- if (getCastle() != null) // Castle zone
+ final Castle castle = getCastle();
+ if (castle != null) // Castle zone
{
- if (!(getCastle().getSiege().isInProgress() && (player != null) && (player.getSiegeState() != 2))) // Siege and no defender
+ if (!(castle.getSiege().isInProgress() && (player != null) && (player.getSiegeState() != 2))) // Siege and no defender
{
return;
}
@@ -119,9 +109,10 @@ public class DamageZone extends ZoneType
synchronized (this)
{
- if (getSettings().getTask() == null)
+ task = _task;
+ if (task == null)
{
- getSettings().setTask(ThreadPool.scheduleAtFixedRate(new ApplyDamage(this), _startTask, _reuseTask));
+ _task = task = ThreadPool.scheduleAtFixedRate(new ApplyDamage(), _startTask, _reuseTask);
}
}
}
@@ -130,9 +121,10 @@ public class DamageZone extends ZoneType
@Override
protected void onExit(Creature creature)
{
- if (getCharactersInside().isEmpty() && (getSettings().getTask() != null))
+ if (getCharactersInside().isEmpty() && (_task != null))
{
- getSettings().clear();
+ _task.cancel(true);
+ _task = null;
}
}
@@ -152,19 +144,16 @@ public class DamageZone extends ZoneType
{
_castle = CastleManager.getInstance().getCastleById(_castleId);
}
-
return _castle;
}
- private final class ApplyDamage implements Runnable
+ private class ApplyDamage implements Runnable
{
- private final DamageZone _dmgZone;
private final Castle _castle;
- protected ApplyDamage(DamageZone zone)
+ protected ApplyDamage()
{
- _dmgZone = zone;
- _castle = zone.getCastle();
+ _castle = getCastle();
}
@Override
@@ -175,6 +164,13 @@ public class DamageZone extends ZoneType
return;
}
+ if (getCharactersInside().isEmpty())
+ {
+ _task.cancel(false);
+ _task = null;
+ return;
+ }
+
boolean siege = false;
if (_castle != null)
@@ -183,34 +179,34 @@ public class DamageZone extends ZoneType
// castle zones active only during siege
if (!siege)
{
- _dmgZone.getSettings().clear();
+ _task.cancel(false);
+ _task = null;
return;
}
}
- for (Creature temp : _dmgZone.getCharactersInside())
+ for (Creature character : getCharactersInside())
{
- if ((temp != null) && !temp.isDead())
+ if ((character != null) && character.isPlayer() && !character.isDead())
{
if (siege)
{
// during siege defenders not affected
- final PlayerInstance player = temp.getActingPlayer();
+ final PlayerInstance player = character.getActingPlayer();
if ((player != null) && player.isInSiege() && (player.getSiegeState() == 2))
{
continue;
}
}
- final double multiplier = 1 + (temp.getStat().getValue(Stat.DAMAGE_ZONE_VULN, 0) / 100);
-
+ final double multiplier = 1 + (character.getStat().getValue(Stat.DAMAGE_ZONE_VULN, 0) / 100);
if (getHPDamagePerSecond() != 0)
{
- temp.reduceCurrentHp(_dmgZone.getHPDamagePerSecond() * multiplier, temp, null);
+ character.reduceCurrentHp(getHPDamagePerSecond() * multiplier, character, null);
}
if (getMPDamagePerSecond() != 0)
{
- temp.reduceCurrentMp(_dmgZone.getMPDamagePerSecond() * multiplier);
+ character.reduceCurrentMp(getMPDamagePerSecond() * multiplier);
}
}
}
diff --git a/L2J_Mobius_1.0_Ertheia/java/org/l2jmobius/gameserver/model/zone/type/EffectZone.java b/L2J_Mobius_1.0_Ertheia/java/org/l2jmobius/gameserver/model/zone/type/EffectZone.java
index 40257410ad..b179fcd242 100644
--- a/L2J_Mobius_1.0_Ertheia/java/org/l2jmobius/gameserver/model/zone/type/EffectZone.java
+++ b/L2J_Mobius_1.0_Ertheia/java/org/l2jmobius/gameserver/model/zone/type/EffectZone.java
@@ -19,22 +19,20 @@ package org.l2jmobius.gameserver.model.zone.type;
import java.util.Map;
import java.util.Map.Entry;
import java.util.concurrent.ConcurrentHashMap;
+import java.util.concurrent.Future;
import org.l2jmobius.commons.concurrent.ThreadPool;
import org.l2jmobius.commons.util.Rnd;
import org.l2jmobius.gameserver.data.xml.SkillData;
import org.l2jmobius.gameserver.enums.InstanceType;
-import org.l2jmobius.gameserver.instancemanager.ZoneManager;
import org.l2jmobius.gameserver.model.actor.Creature;
import org.l2jmobius.gameserver.model.skills.Skill;
-import org.l2jmobius.gameserver.model.zone.AbstractZoneSettings;
-import org.l2jmobius.gameserver.model.zone.TaskZoneSettings;
import org.l2jmobius.gameserver.model.zone.ZoneId;
import org.l2jmobius.gameserver.model.zone.ZoneType;
import org.l2jmobius.gameserver.network.serverpackets.EtcStatusUpdate;
/**
- * another type of damage zone with skills
+ * Another type of damage zone with skills.
* @author kerberos
*/
public class EffectZone extends ZoneType
@@ -45,6 +43,7 @@ public class EffectZone extends ZoneType
protected boolean _bypassConditions;
private boolean _isShowDangerIcon;
protected Map _skills;
+ private volatile Future> _task;
public EffectZone(int id)
{
@@ -55,18 +54,6 @@ public class EffectZone extends ZoneType
setTargetType(InstanceType.Playable); // default only playable
_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
@@ -144,13 +131,15 @@ public class EffectZone extends ZoneType
{
if (_skills != null)
{
- if (getSettings().getTask() == null)
+ Future> task = _task;
+ if (task == null)
{
synchronized (this)
{
- if (getSettings().getTask() == null)
+ task = _task;
+ if (task == null)
{
- getSettings().setTask(ThreadPool.scheduleAtFixedRate(new ApplySkill(), _initialDelay, _reuse));
+ _task = task = ThreadPool.scheduleAtFixedRate(new ApplySkill(), _initialDelay, _reuse);
}
}
}
@@ -183,9 +172,10 @@ public class EffectZone extends ZoneType
}
}
- if (getCharactersInside().isEmpty() && (getSettings().getTask() != null))
+ if (getCharactersInside().isEmpty() && (_task != null))
{
- getSettings().clear();
+ _task.cancel(true);
+ _task = null;
}
}
@@ -240,7 +230,7 @@ public class EffectZone extends ZoneType
return _skills.get(skillId);
}
- private final class ApplySkill implements Runnable
+ private class ApplySkill implements Runnable
{
protected ApplySkill()
{
@@ -253,25 +243,34 @@ public class EffectZone extends ZoneType
@Override
public void run()
{
- if (isEnabled())
+ if (!isEnabled())
{
- getCharactersInside().forEach(character ->
+ return;
+ }
+
+ if (getCharactersInside().isEmpty())
+ {
+ _task.cancel(false);
+ _task = null;
+ return;
+ }
+
+ for (Creature character : getCharactersInside())
+ {
+ if ((character != null) && character.isPlayer() && !character.isDead() && (Rnd.get(100) < _chance))
{
- if ((character != null) && !character.isDead() && (Rnd.get(100) < _chance))
+ for (Entry e : _skills.entrySet())
{
- for (Entry e : _skills.entrySet())
+ final Skill skill = SkillData.getInstance().getSkill(e.getKey().intValue(), e.getValue().intValue());
+ if ((skill != null) && (_bypassConditions || skill.checkCondition(character, character)))
{
- final Skill skill = SkillData.getInstance().getSkill(e.getKey(), e.getValue());
- if ((skill != null) && (_bypassConditions || skill.checkCondition(character, character)))
+ if (character.getAffectedSkillLevel(skill.getId()) < skill.getLevel())
{
- if (character.getAffectedSkillLevel(skill.getId()) < skill.getLevel())
- {
- skill.activateSkill(character, character);
- }
+ skill.activateSkill(character, character);
}
}
}
- });
+ }
}
}
}
diff --git a/L2J_Mobius_2.5_Underground/java/org/l2jmobius/gameserver/model/zone/TaskZoneSettings.java b/L2J_Mobius_2.5_Underground/java/org/l2jmobius/gameserver/model/zone/TaskZoneSettings.java
deleted file mode 100644
index facc7f731b..0000000000
--- a/L2J_Mobius_2.5_Underground/java/org/l2jmobius/gameserver/model/zone/TaskZoneSettings.java
+++ /dev/null
@@ -1,56 +0,0 @@
-/*
- * This file is part of the L2J Mobius project.
- *
- * 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 .
- */
-package org.l2jmobius.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);
- _task = null;
- }
- }
-}
diff --git a/L2J_Mobius_2.5_Underground/java/org/l2jmobius/gameserver/model/zone/type/DamageZone.java b/L2J_Mobius_2.5_Underground/java/org/l2jmobius/gameserver/model/zone/type/DamageZone.java
index 13b533a54f..ce5daa2ab3 100644
--- a/L2J_Mobius_2.5_Underground/java/org/l2jmobius/gameserver/model/zone/type/DamageZone.java
+++ b/L2J_Mobius_2.5_Underground/java/org/l2jmobius/gameserver/model/zone/type/DamageZone.java
@@ -16,16 +16,15 @@
*/
package org.l2jmobius.gameserver.model.zone.type;
+import java.util.concurrent.Future;
+
import org.l2jmobius.commons.concurrent.ThreadPool;
import org.l2jmobius.gameserver.enums.InstanceType;
import org.l2jmobius.gameserver.instancemanager.CastleManager;
-import org.l2jmobius.gameserver.instancemanager.ZoneManager;
import org.l2jmobius.gameserver.model.actor.Creature;
import org.l2jmobius.gameserver.model.actor.instance.PlayerInstance;
import org.l2jmobius.gameserver.model.siege.Castle;
import org.l2jmobius.gameserver.model.stats.Stat;
-import org.l2jmobius.gameserver.model.zone.AbstractZoneSettings;
-import org.l2jmobius.gameserver.model.zone.TaskZoneSettings;
import org.l2jmobius.gameserver.model.zone.ZoneType;
/**
@@ -42,6 +41,7 @@ public class DamageZone extends ZoneType
private int _startTask;
private int _reuseTask;
+ private volatile Future> _task;
public DamageZone(int id)
{
@@ -60,18 +60,6 @@ public class DamageZone extends ZoneType
_castle = null;
setTargetType(InstanceType.Playable); // 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
@@ -106,12 +94,14 @@ public class DamageZone extends ZoneType
@Override
protected void onEnter(Creature creature)
{
- if ((getSettings().getTask() == null) && ((_damageHPPerSec != 0) || (_damageMPPerSec != 0)))
+ Future> task = _task;
+ if ((task == null) && ((_damageHPPerSec != 0) || (_damageMPPerSec != 0)))
{
final PlayerInstance player = creature.getActingPlayer();
- if (getCastle() != null) // Castle zone
+ final Castle castle = getCastle();
+ if (castle != null) // Castle zone
{
- if (!(getCastle().getSiege().isInProgress() && (player != null) && (player.getSiegeState() != 2))) // Siege and no defender
+ if (!(castle.getSiege().isInProgress() && (player != null) && (player.getSiegeState() != 2))) // Siege and no defender
{
return;
}
@@ -119,9 +109,10 @@ public class DamageZone extends ZoneType
synchronized (this)
{
- if (getSettings().getTask() == null)
+ task = _task;
+ if (task == null)
{
- getSettings().setTask(ThreadPool.scheduleAtFixedRate(new ApplyDamage(this), _startTask, _reuseTask));
+ _task = task = ThreadPool.scheduleAtFixedRate(new ApplyDamage(), _startTask, _reuseTask);
}
}
}
@@ -130,9 +121,10 @@ public class DamageZone extends ZoneType
@Override
protected void onExit(Creature creature)
{
- if (getCharactersInside().isEmpty() && (getSettings().getTask() != null))
+ if (getCharactersInside().isEmpty() && (_task != null))
{
- getSettings().clear();
+ _task.cancel(true);
+ _task = null;
}
}
@@ -152,19 +144,16 @@ public class DamageZone extends ZoneType
{
_castle = CastleManager.getInstance().getCastleById(_castleId);
}
-
return _castle;
}
- private final class ApplyDamage implements Runnable
+ private class ApplyDamage implements Runnable
{
- private final DamageZone _dmgZone;
private final Castle _castle;
- protected ApplyDamage(DamageZone zone)
+ protected ApplyDamage()
{
- _dmgZone = zone;
- _castle = zone.getCastle();
+ _castle = getCastle();
}
@Override
@@ -175,6 +164,13 @@ public class DamageZone extends ZoneType
return;
}
+ if (getCharactersInside().isEmpty())
+ {
+ _task.cancel(false);
+ _task = null;
+ return;
+ }
+
boolean siege = false;
if (_castle != null)
@@ -183,34 +179,34 @@ public class DamageZone extends ZoneType
// castle zones active only during siege
if (!siege)
{
- _dmgZone.getSettings().clear();
+ _task.cancel(false);
+ _task = null;
return;
}
}
- for (Creature temp : _dmgZone.getCharactersInside())
+ for (Creature character : getCharactersInside())
{
- if ((temp != null) && !temp.isDead())
+ if ((character != null) && character.isPlayer() && !character.isDead())
{
if (siege)
{
// during siege defenders not affected
- final PlayerInstance player = temp.getActingPlayer();
+ final PlayerInstance player = character.getActingPlayer();
if ((player != null) && player.isInSiege() && (player.getSiegeState() == 2))
{
continue;
}
}
- final double multiplier = 1 + (temp.getStat().getValue(Stat.DAMAGE_ZONE_VULN, 0) / 100);
-
+ final double multiplier = 1 + (character.getStat().getValue(Stat.DAMAGE_ZONE_VULN, 0) / 100);
if (getHPDamagePerSecond() != 0)
{
- temp.reduceCurrentHp(_dmgZone.getHPDamagePerSecond() * multiplier, temp, null);
+ character.reduceCurrentHp(getHPDamagePerSecond() * multiplier, character, null);
}
if (getMPDamagePerSecond() != 0)
{
- temp.reduceCurrentMp(_dmgZone.getMPDamagePerSecond() * multiplier);
+ character.reduceCurrentMp(getMPDamagePerSecond() * multiplier);
}
}
}
diff --git a/L2J_Mobius_2.5_Underground/java/org/l2jmobius/gameserver/model/zone/type/EffectZone.java b/L2J_Mobius_2.5_Underground/java/org/l2jmobius/gameserver/model/zone/type/EffectZone.java
index 40257410ad..b179fcd242 100644
--- a/L2J_Mobius_2.5_Underground/java/org/l2jmobius/gameserver/model/zone/type/EffectZone.java
+++ b/L2J_Mobius_2.5_Underground/java/org/l2jmobius/gameserver/model/zone/type/EffectZone.java
@@ -19,22 +19,20 @@ package org.l2jmobius.gameserver.model.zone.type;
import java.util.Map;
import java.util.Map.Entry;
import java.util.concurrent.ConcurrentHashMap;
+import java.util.concurrent.Future;
import org.l2jmobius.commons.concurrent.ThreadPool;
import org.l2jmobius.commons.util.Rnd;
import org.l2jmobius.gameserver.data.xml.SkillData;
import org.l2jmobius.gameserver.enums.InstanceType;
-import org.l2jmobius.gameserver.instancemanager.ZoneManager;
import org.l2jmobius.gameserver.model.actor.Creature;
import org.l2jmobius.gameserver.model.skills.Skill;
-import org.l2jmobius.gameserver.model.zone.AbstractZoneSettings;
-import org.l2jmobius.gameserver.model.zone.TaskZoneSettings;
import org.l2jmobius.gameserver.model.zone.ZoneId;
import org.l2jmobius.gameserver.model.zone.ZoneType;
import org.l2jmobius.gameserver.network.serverpackets.EtcStatusUpdate;
/**
- * another type of damage zone with skills
+ * Another type of damage zone with skills.
* @author kerberos
*/
public class EffectZone extends ZoneType
@@ -45,6 +43,7 @@ public class EffectZone extends ZoneType
protected boolean _bypassConditions;
private boolean _isShowDangerIcon;
protected Map _skills;
+ private volatile Future> _task;
public EffectZone(int id)
{
@@ -55,18 +54,6 @@ public class EffectZone extends ZoneType
setTargetType(InstanceType.Playable); // default only playable
_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
@@ -144,13 +131,15 @@ public class EffectZone extends ZoneType
{
if (_skills != null)
{
- if (getSettings().getTask() == null)
+ Future> task = _task;
+ if (task == null)
{
synchronized (this)
{
- if (getSettings().getTask() == null)
+ task = _task;
+ if (task == null)
{
- getSettings().setTask(ThreadPool.scheduleAtFixedRate(new ApplySkill(), _initialDelay, _reuse));
+ _task = task = ThreadPool.scheduleAtFixedRate(new ApplySkill(), _initialDelay, _reuse);
}
}
}
@@ -183,9 +172,10 @@ public class EffectZone extends ZoneType
}
}
- if (getCharactersInside().isEmpty() && (getSettings().getTask() != null))
+ if (getCharactersInside().isEmpty() && (_task != null))
{
- getSettings().clear();
+ _task.cancel(true);
+ _task = null;
}
}
@@ -240,7 +230,7 @@ public class EffectZone extends ZoneType
return _skills.get(skillId);
}
- private final class ApplySkill implements Runnable
+ private class ApplySkill implements Runnable
{
protected ApplySkill()
{
@@ -253,25 +243,34 @@ public class EffectZone extends ZoneType
@Override
public void run()
{
- if (isEnabled())
+ if (!isEnabled())
{
- getCharactersInside().forEach(character ->
+ return;
+ }
+
+ if (getCharactersInside().isEmpty())
+ {
+ _task.cancel(false);
+ _task = null;
+ return;
+ }
+
+ for (Creature character : getCharactersInside())
+ {
+ if ((character != null) && character.isPlayer() && !character.isDead() && (Rnd.get(100) < _chance))
{
- if ((character != null) && !character.isDead() && (Rnd.get(100) < _chance))
+ for (Entry e : _skills.entrySet())
{
- for (Entry e : _skills.entrySet())
+ final Skill skill = SkillData.getInstance().getSkill(e.getKey().intValue(), e.getValue().intValue());
+ if ((skill != null) && (_bypassConditions || skill.checkCondition(character, character)))
{
- final Skill skill = SkillData.getInstance().getSkill(e.getKey(), e.getValue());
- if ((skill != null) && (_bypassConditions || skill.checkCondition(character, character)))
+ if (character.getAffectedSkillLevel(skill.getId()) < skill.getLevel())
{
- if (character.getAffectedSkillLevel(skill.getId()) < skill.getLevel())
- {
- skill.activateSkill(character, character);
- }
+ skill.activateSkill(character, character);
}
}
}
- });
+ }
}
}
}
diff --git a/L2J_Mobius_3.0_Helios/java/org/l2jmobius/gameserver/model/zone/TaskZoneSettings.java b/L2J_Mobius_3.0_Helios/java/org/l2jmobius/gameserver/model/zone/TaskZoneSettings.java
deleted file mode 100644
index facc7f731b..0000000000
--- a/L2J_Mobius_3.0_Helios/java/org/l2jmobius/gameserver/model/zone/TaskZoneSettings.java
+++ /dev/null
@@ -1,56 +0,0 @@
-/*
- * This file is part of the L2J Mobius project.
- *
- * 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 .
- */
-package org.l2jmobius.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);
- _task = null;
- }
- }
-}
diff --git a/L2J_Mobius_3.0_Helios/java/org/l2jmobius/gameserver/model/zone/type/DamageZone.java b/L2J_Mobius_3.0_Helios/java/org/l2jmobius/gameserver/model/zone/type/DamageZone.java
index 13b533a54f..ce5daa2ab3 100644
--- a/L2J_Mobius_3.0_Helios/java/org/l2jmobius/gameserver/model/zone/type/DamageZone.java
+++ b/L2J_Mobius_3.0_Helios/java/org/l2jmobius/gameserver/model/zone/type/DamageZone.java
@@ -16,16 +16,15 @@
*/
package org.l2jmobius.gameserver.model.zone.type;
+import java.util.concurrent.Future;
+
import org.l2jmobius.commons.concurrent.ThreadPool;
import org.l2jmobius.gameserver.enums.InstanceType;
import org.l2jmobius.gameserver.instancemanager.CastleManager;
-import org.l2jmobius.gameserver.instancemanager.ZoneManager;
import org.l2jmobius.gameserver.model.actor.Creature;
import org.l2jmobius.gameserver.model.actor.instance.PlayerInstance;
import org.l2jmobius.gameserver.model.siege.Castle;
import org.l2jmobius.gameserver.model.stats.Stat;
-import org.l2jmobius.gameserver.model.zone.AbstractZoneSettings;
-import org.l2jmobius.gameserver.model.zone.TaskZoneSettings;
import org.l2jmobius.gameserver.model.zone.ZoneType;
/**
@@ -42,6 +41,7 @@ public class DamageZone extends ZoneType
private int _startTask;
private int _reuseTask;
+ private volatile Future> _task;
public DamageZone(int id)
{
@@ -60,18 +60,6 @@ public class DamageZone extends ZoneType
_castle = null;
setTargetType(InstanceType.Playable); // 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
@@ -106,12 +94,14 @@ public class DamageZone extends ZoneType
@Override
protected void onEnter(Creature creature)
{
- if ((getSettings().getTask() == null) && ((_damageHPPerSec != 0) || (_damageMPPerSec != 0)))
+ Future> task = _task;
+ if ((task == null) && ((_damageHPPerSec != 0) || (_damageMPPerSec != 0)))
{
final PlayerInstance player = creature.getActingPlayer();
- if (getCastle() != null) // Castle zone
+ final Castle castle = getCastle();
+ if (castle != null) // Castle zone
{
- if (!(getCastle().getSiege().isInProgress() && (player != null) && (player.getSiegeState() != 2))) // Siege and no defender
+ if (!(castle.getSiege().isInProgress() && (player != null) && (player.getSiegeState() != 2))) // Siege and no defender
{
return;
}
@@ -119,9 +109,10 @@ public class DamageZone extends ZoneType
synchronized (this)
{
- if (getSettings().getTask() == null)
+ task = _task;
+ if (task == null)
{
- getSettings().setTask(ThreadPool.scheduleAtFixedRate(new ApplyDamage(this), _startTask, _reuseTask));
+ _task = task = ThreadPool.scheduleAtFixedRate(new ApplyDamage(), _startTask, _reuseTask);
}
}
}
@@ -130,9 +121,10 @@ public class DamageZone extends ZoneType
@Override
protected void onExit(Creature creature)
{
- if (getCharactersInside().isEmpty() && (getSettings().getTask() != null))
+ if (getCharactersInside().isEmpty() && (_task != null))
{
- getSettings().clear();
+ _task.cancel(true);
+ _task = null;
}
}
@@ -152,19 +144,16 @@ public class DamageZone extends ZoneType
{
_castle = CastleManager.getInstance().getCastleById(_castleId);
}
-
return _castle;
}
- private final class ApplyDamage implements Runnable
+ private class ApplyDamage implements Runnable
{
- private final DamageZone _dmgZone;
private final Castle _castle;
- protected ApplyDamage(DamageZone zone)
+ protected ApplyDamage()
{
- _dmgZone = zone;
- _castle = zone.getCastle();
+ _castle = getCastle();
}
@Override
@@ -175,6 +164,13 @@ public class DamageZone extends ZoneType
return;
}
+ if (getCharactersInside().isEmpty())
+ {
+ _task.cancel(false);
+ _task = null;
+ return;
+ }
+
boolean siege = false;
if (_castle != null)
@@ -183,34 +179,34 @@ public class DamageZone extends ZoneType
// castle zones active only during siege
if (!siege)
{
- _dmgZone.getSettings().clear();
+ _task.cancel(false);
+ _task = null;
return;
}
}
- for (Creature temp : _dmgZone.getCharactersInside())
+ for (Creature character : getCharactersInside())
{
- if ((temp != null) && !temp.isDead())
+ if ((character != null) && character.isPlayer() && !character.isDead())
{
if (siege)
{
// during siege defenders not affected
- final PlayerInstance player = temp.getActingPlayer();
+ final PlayerInstance player = character.getActingPlayer();
if ((player != null) && player.isInSiege() && (player.getSiegeState() == 2))
{
continue;
}
}
- final double multiplier = 1 + (temp.getStat().getValue(Stat.DAMAGE_ZONE_VULN, 0) / 100);
-
+ final double multiplier = 1 + (character.getStat().getValue(Stat.DAMAGE_ZONE_VULN, 0) / 100);
if (getHPDamagePerSecond() != 0)
{
- temp.reduceCurrentHp(_dmgZone.getHPDamagePerSecond() * multiplier, temp, null);
+ character.reduceCurrentHp(getHPDamagePerSecond() * multiplier, character, null);
}
if (getMPDamagePerSecond() != 0)
{
- temp.reduceCurrentMp(_dmgZone.getMPDamagePerSecond() * multiplier);
+ character.reduceCurrentMp(getMPDamagePerSecond() * multiplier);
}
}
}
diff --git a/L2J_Mobius_3.0_Helios/java/org/l2jmobius/gameserver/model/zone/type/EffectZone.java b/L2J_Mobius_3.0_Helios/java/org/l2jmobius/gameserver/model/zone/type/EffectZone.java
index 40257410ad..b179fcd242 100644
--- a/L2J_Mobius_3.0_Helios/java/org/l2jmobius/gameserver/model/zone/type/EffectZone.java
+++ b/L2J_Mobius_3.0_Helios/java/org/l2jmobius/gameserver/model/zone/type/EffectZone.java
@@ -19,22 +19,20 @@ package org.l2jmobius.gameserver.model.zone.type;
import java.util.Map;
import java.util.Map.Entry;
import java.util.concurrent.ConcurrentHashMap;
+import java.util.concurrent.Future;
import org.l2jmobius.commons.concurrent.ThreadPool;
import org.l2jmobius.commons.util.Rnd;
import org.l2jmobius.gameserver.data.xml.SkillData;
import org.l2jmobius.gameserver.enums.InstanceType;
-import org.l2jmobius.gameserver.instancemanager.ZoneManager;
import org.l2jmobius.gameserver.model.actor.Creature;
import org.l2jmobius.gameserver.model.skills.Skill;
-import org.l2jmobius.gameserver.model.zone.AbstractZoneSettings;
-import org.l2jmobius.gameserver.model.zone.TaskZoneSettings;
import org.l2jmobius.gameserver.model.zone.ZoneId;
import org.l2jmobius.gameserver.model.zone.ZoneType;
import org.l2jmobius.gameserver.network.serverpackets.EtcStatusUpdate;
/**
- * another type of damage zone with skills
+ * Another type of damage zone with skills.
* @author kerberos
*/
public class EffectZone extends ZoneType
@@ -45,6 +43,7 @@ public class EffectZone extends ZoneType
protected boolean _bypassConditions;
private boolean _isShowDangerIcon;
protected Map _skills;
+ private volatile Future> _task;
public EffectZone(int id)
{
@@ -55,18 +54,6 @@ public class EffectZone extends ZoneType
setTargetType(InstanceType.Playable); // default only playable
_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
@@ -144,13 +131,15 @@ public class EffectZone extends ZoneType
{
if (_skills != null)
{
- if (getSettings().getTask() == null)
+ Future> task = _task;
+ if (task == null)
{
synchronized (this)
{
- if (getSettings().getTask() == null)
+ task = _task;
+ if (task == null)
{
- getSettings().setTask(ThreadPool.scheduleAtFixedRate(new ApplySkill(), _initialDelay, _reuse));
+ _task = task = ThreadPool.scheduleAtFixedRate(new ApplySkill(), _initialDelay, _reuse);
}
}
}
@@ -183,9 +172,10 @@ public class EffectZone extends ZoneType
}
}
- if (getCharactersInside().isEmpty() && (getSettings().getTask() != null))
+ if (getCharactersInside().isEmpty() && (_task != null))
{
- getSettings().clear();
+ _task.cancel(true);
+ _task = null;
}
}
@@ -240,7 +230,7 @@ public class EffectZone extends ZoneType
return _skills.get(skillId);
}
- private final class ApplySkill implements Runnable
+ private class ApplySkill implements Runnable
{
protected ApplySkill()
{
@@ -253,25 +243,34 @@ public class EffectZone extends ZoneType
@Override
public void run()
{
- if (isEnabled())
+ if (!isEnabled())
{
- getCharactersInside().forEach(character ->
+ return;
+ }
+
+ if (getCharactersInside().isEmpty())
+ {
+ _task.cancel(false);
+ _task = null;
+ return;
+ }
+
+ for (Creature character : getCharactersInside())
+ {
+ if ((character != null) && character.isPlayer() && !character.isDead() && (Rnd.get(100) < _chance))
{
- if ((character != null) && !character.isDead() && (Rnd.get(100) < _chance))
+ for (Entry e : _skills.entrySet())
{
- for (Entry e : _skills.entrySet())
+ final Skill skill = SkillData.getInstance().getSkill(e.getKey().intValue(), e.getValue().intValue());
+ if ((skill != null) && (_bypassConditions || skill.checkCondition(character, character)))
{
- final Skill skill = SkillData.getInstance().getSkill(e.getKey(), e.getValue());
- if ((skill != null) && (_bypassConditions || skill.checkCondition(character, character)))
+ if (character.getAffectedSkillLevel(skill.getId()) < skill.getLevel())
{
- if (character.getAffectedSkillLevel(skill.getId()) < skill.getLevel())
- {
- skill.activateSkill(character, character);
- }
+ skill.activateSkill(character, character);
}
}
}
- });
+ }
}
}
}
diff --git a/L2J_Mobius_4.0_GrandCrusade/java/org/l2jmobius/gameserver/model/zone/TaskZoneSettings.java b/L2J_Mobius_4.0_GrandCrusade/java/org/l2jmobius/gameserver/model/zone/TaskZoneSettings.java
deleted file mode 100644
index facc7f731b..0000000000
--- a/L2J_Mobius_4.0_GrandCrusade/java/org/l2jmobius/gameserver/model/zone/TaskZoneSettings.java
+++ /dev/null
@@ -1,56 +0,0 @@
-/*
- * This file is part of the L2J Mobius project.
- *
- * 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 .
- */
-package org.l2jmobius.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);
- _task = null;
- }
- }
-}
diff --git a/L2J_Mobius_4.0_GrandCrusade/java/org/l2jmobius/gameserver/model/zone/type/DamageZone.java b/L2J_Mobius_4.0_GrandCrusade/java/org/l2jmobius/gameserver/model/zone/type/DamageZone.java
index 13b533a54f..ce5daa2ab3 100644
--- a/L2J_Mobius_4.0_GrandCrusade/java/org/l2jmobius/gameserver/model/zone/type/DamageZone.java
+++ b/L2J_Mobius_4.0_GrandCrusade/java/org/l2jmobius/gameserver/model/zone/type/DamageZone.java
@@ -16,16 +16,15 @@
*/
package org.l2jmobius.gameserver.model.zone.type;
+import java.util.concurrent.Future;
+
import org.l2jmobius.commons.concurrent.ThreadPool;
import org.l2jmobius.gameserver.enums.InstanceType;
import org.l2jmobius.gameserver.instancemanager.CastleManager;
-import org.l2jmobius.gameserver.instancemanager.ZoneManager;
import org.l2jmobius.gameserver.model.actor.Creature;
import org.l2jmobius.gameserver.model.actor.instance.PlayerInstance;
import org.l2jmobius.gameserver.model.siege.Castle;
import org.l2jmobius.gameserver.model.stats.Stat;
-import org.l2jmobius.gameserver.model.zone.AbstractZoneSettings;
-import org.l2jmobius.gameserver.model.zone.TaskZoneSettings;
import org.l2jmobius.gameserver.model.zone.ZoneType;
/**
@@ -42,6 +41,7 @@ public class DamageZone extends ZoneType
private int _startTask;
private int _reuseTask;
+ private volatile Future> _task;
public DamageZone(int id)
{
@@ -60,18 +60,6 @@ public class DamageZone extends ZoneType
_castle = null;
setTargetType(InstanceType.Playable); // 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
@@ -106,12 +94,14 @@ public class DamageZone extends ZoneType
@Override
protected void onEnter(Creature creature)
{
- if ((getSettings().getTask() == null) && ((_damageHPPerSec != 0) || (_damageMPPerSec != 0)))
+ Future> task = _task;
+ if ((task == null) && ((_damageHPPerSec != 0) || (_damageMPPerSec != 0)))
{
final PlayerInstance player = creature.getActingPlayer();
- if (getCastle() != null) // Castle zone
+ final Castle castle = getCastle();
+ if (castle != null) // Castle zone
{
- if (!(getCastle().getSiege().isInProgress() && (player != null) && (player.getSiegeState() != 2))) // Siege and no defender
+ if (!(castle.getSiege().isInProgress() && (player != null) && (player.getSiegeState() != 2))) // Siege and no defender
{
return;
}
@@ -119,9 +109,10 @@ public class DamageZone extends ZoneType
synchronized (this)
{
- if (getSettings().getTask() == null)
+ task = _task;
+ if (task == null)
{
- getSettings().setTask(ThreadPool.scheduleAtFixedRate(new ApplyDamage(this), _startTask, _reuseTask));
+ _task = task = ThreadPool.scheduleAtFixedRate(new ApplyDamage(), _startTask, _reuseTask);
}
}
}
@@ -130,9 +121,10 @@ public class DamageZone extends ZoneType
@Override
protected void onExit(Creature creature)
{
- if (getCharactersInside().isEmpty() && (getSettings().getTask() != null))
+ if (getCharactersInside().isEmpty() && (_task != null))
{
- getSettings().clear();
+ _task.cancel(true);
+ _task = null;
}
}
@@ -152,19 +144,16 @@ public class DamageZone extends ZoneType
{
_castle = CastleManager.getInstance().getCastleById(_castleId);
}
-
return _castle;
}
- private final class ApplyDamage implements Runnable
+ private class ApplyDamage implements Runnable
{
- private final DamageZone _dmgZone;
private final Castle _castle;
- protected ApplyDamage(DamageZone zone)
+ protected ApplyDamage()
{
- _dmgZone = zone;
- _castle = zone.getCastle();
+ _castle = getCastle();
}
@Override
@@ -175,6 +164,13 @@ public class DamageZone extends ZoneType
return;
}
+ if (getCharactersInside().isEmpty())
+ {
+ _task.cancel(false);
+ _task = null;
+ return;
+ }
+
boolean siege = false;
if (_castle != null)
@@ -183,34 +179,34 @@ public class DamageZone extends ZoneType
// castle zones active only during siege
if (!siege)
{
- _dmgZone.getSettings().clear();
+ _task.cancel(false);
+ _task = null;
return;
}
}
- for (Creature temp : _dmgZone.getCharactersInside())
+ for (Creature character : getCharactersInside())
{
- if ((temp != null) && !temp.isDead())
+ if ((character != null) && character.isPlayer() && !character.isDead())
{
if (siege)
{
// during siege defenders not affected
- final PlayerInstance player = temp.getActingPlayer();
+ final PlayerInstance player = character.getActingPlayer();
if ((player != null) && player.isInSiege() && (player.getSiegeState() == 2))
{
continue;
}
}
- final double multiplier = 1 + (temp.getStat().getValue(Stat.DAMAGE_ZONE_VULN, 0) / 100);
-
+ final double multiplier = 1 + (character.getStat().getValue(Stat.DAMAGE_ZONE_VULN, 0) / 100);
if (getHPDamagePerSecond() != 0)
{
- temp.reduceCurrentHp(_dmgZone.getHPDamagePerSecond() * multiplier, temp, null);
+ character.reduceCurrentHp(getHPDamagePerSecond() * multiplier, character, null);
}
if (getMPDamagePerSecond() != 0)
{
- temp.reduceCurrentMp(_dmgZone.getMPDamagePerSecond() * multiplier);
+ character.reduceCurrentMp(getMPDamagePerSecond() * multiplier);
}
}
}
diff --git a/L2J_Mobius_4.0_GrandCrusade/java/org/l2jmobius/gameserver/model/zone/type/EffectZone.java b/L2J_Mobius_4.0_GrandCrusade/java/org/l2jmobius/gameserver/model/zone/type/EffectZone.java
index 40257410ad..b179fcd242 100644
--- a/L2J_Mobius_4.0_GrandCrusade/java/org/l2jmobius/gameserver/model/zone/type/EffectZone.java
+++ b/L2J_Mobius_4.0_GrandCrusade/java/org/l2jmobius/gameserver/model/zone/type/EffectZone.java
@@ -19,22 +19,20 @@ package org.l2jmobius.gameserver.model.zone.type;
import java.util.Map;
import java.util.Map.Entry;
import java.util.concurrent.ConcurrentHashMap;
+import java.util.concurrent.Future;
import org.l2jmobius.commons.concurrent.ThreadPool;
import org.l2jmobius.commons.util.Rnd;
import org.l2jmobius.gameserver.data.xml.SkillData;
import org.l2jmobius.gameserver.enums.InstanceType;
-import org.l2jmobius.gameserver.instancemanager.ZoneManager;
import org.l2jmobius.gameserver.model.actor.Creature;
import org.l2jmobius.gameserver.model.skills.Skill;
-import org.l2jmobius.gameserver.model.zone.AbstractZoneSettings;
-import org.l2jmobius.gameserver.model.zone.TaskZoneSettings;
import org.l2jmobius.gameserver.model.zone.ZoneId;
import org.l2jmobius.gameserver.model.zone.ZoneType;
import org.l2jmobius.gameserver.network.serverpackets.EtcStatusUpdate;
/**
- * another type of damage zone with skills
+ * Another type of damage zone with skills.
* @author kerberos
*/
public class EffectZone extends ZoneType
@@ -45,6 +43,7 @@ public class EffectZone extends ZoneType
protected boolean _bypassConditions;
private boolean _isShowDangerIcon;
protected Map _skills;
+ private volatile Future> _task;
public EffectZone(int id)
{
@@ -55,18 +54,6 @@ public class EffectZone extends ZoneType
setTargetType(InstanceType.Playable); // default only playable
_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
@@ -144,13 +131,15 @@ public class EffectZone extends ZoneType
{
if (_skills != null)
{
- if (getSettings().getTask() == null)
+ Future> task = _task;
+ if (task == null)
{
synchronized (this)
{
- if (getSettings().getTask() == null)
+ task = _task;
+ if (task == null)
{
- getSettings().setTask(ThreadPool.scheduleAtFixedRate(new ApplySkill(), _initialDelay, _reuse));
+ _task = task = ThreadPool.scheduleAtFixedRate(new ApplySkill(), _initialDelay, _reuse);
}
}
}
@@ -183,9 +172,10 @@ public class EffectZone extends ZoneType
}
}
- if (getCharactersInside().isEmpty() && (getSettings().getTask() != null))
+ if (getCharactersInside().isEmpty() && (_task != null))
{
- getSettings().clear();
+ _task.cancel(true);
+ _task = null;
}
}
@@ -240,7 +230,7 @@ public class EffectZone extends ZoneType
return _skills.get(skillId);
}
- private final class ApplySkill implements Runnable
+ private class ApplySkill implements Runnable
{
protected ApplySkill()
{
@@ -253,25 +243,34 @@ public class EffectZone extends ZoneType
@Override
public void run()
{
- if (isEnabled())
+ if (!isEnabled())
{
- getCharactersInside().forEach(character ->
+ return;
+ }
+
+ if (getCharactersInside().isEmpty())
+ {
+ _task.cancel(false);
+ _task = null;
+ return;
+ }
+
+ for (Creature character : getCharactersInside())
+ {
+ if ((character != null) && character.isPlayer() && !character.isDead() && (Rnd.get(100) < _chance))
{
- if ((character != null) && !character.isDead() && (Rnd.get(100) < _chance))
+ for (Entry e : _skills.entrySet())
{
- for (Entry e : _skills.entrySet())
+ final Skill skill = SkillData.getInstance().getSkill(e.getKey().intValue(), e.getValue().intValue());
+ if ((skill != null) && (_bypassConditions || skill.checkCondition(character, character)))
{
- final Skill skill = SkillData.getInstance().getSkill(e.getKey(), e.getValue());
- if ((skill != null) && (_bypassConditions || skill.checkCondition(character, character)))
+ if (character.getAffectedSkillLevel(skill.getId()) < skill.getLevel())
{
- if (character.getAffectedSkillLevel(skill.getId()) < skill.getLevel())
- {
- skill.activateSkill(character, character);
- }
+ skill.activateSkill(character, character);
}
}
}
- });
+ }
}
}
}
diff --git a/L2J_Mobius_5.0_Salvation/java/org/l2jmobius/gameserver/model/zone/TaskZoneSettings.java b/L2J_Mobius_5.0_Salvation/java/org/l2jmobius/gameserver/model/zone/TaskZoneSettings.java
deleted file mode 100644
index facc7f731b..0000000000
--- a/L2J_Mobius_5.0_Salvation/java/org/l2jmobius/gameserver/model/zone/TaskZoneSettings.java
+++ /dev/null
@@ -1,56 +0,0 @@
-/*
- * This file is part of the L2J Mobius project.
- *
- * 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 .
- */
-package org.l2jmobius.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);
- _task = null;
- }
- }
-}
diff --git a/L2J_Mobius_5.0_Salvation/java/org/l2jmobius/gameserver/model/zone/type/DamageZone.java b/L2J_Mobius_5.0_Salvation/java/org/l2jmobius/gameserver/model/zone/type/DamageZone.java
index 13b533a54f..ce5daa2ab3 100644
--- a/L2J_Mobius_5.0_Salvation/java/org/l2jmobius/gameserver/model/zone/type/DamageZone.java
+++ b/L2J_Mobius_5.0_Salvation/java/org/l2jmobius/gameserver/model/zone/type/DamageZone.java
@@ -16,16 +16,15 @@
*/
package org.l2jmobius.gameserver.model.zone.type;
+import java.util.concurrent.Future;
+
import org.l2jmobius.commons.concurrent.ThreadPool;
import org.l2jmobius.gameserver.enums.InstanceType;
import org.l2jmobius.gameserver.instancemanager.CastleManager;
-import org.l2jmobius.gameserver.instancemanager.ZoneManager;
import org.l2jmobius.gameserver.model.actor.Creature;
import org.l2jmobius.gameserver.model.actor.instance.PlayerInstance;
import org.l2jmobius.gameserver.model.siege.Castle;
import org.l2jmobius.gameserver.model.stats.Stat;
-import org.l2jmobius.gameserver.model.zone.AbstractZoneSettings;
-import org.l2jmobius.gameserver.model.zone.TaskZoneSettings;
import org.l2jmobius.gameserver.model.zone.ZoneType;
/**
@@ -42,6 +41,7 @@ public class DamageZone extends ZoneType
private int _startTask;
private int _reuseTask;
+ private volatile Future> _task;
public DamageZone(int id)
{
@@ -60,18 +60,6 @@ public class DamageZone extends ZoneType
_castle = null;
setTargetType(InstanceType.Playable); // 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
@@ -106,12 +94,14 @@ public class DamageZone extends ZoneType
@Override
protected void onEnter(Creature creature)
{
- if ((getSettings().getTask() == null) && ((_damageHPPerSec != 0) || (_damageMPPerSec != 0)))
+ Future> task = _task;
+ if ((task == null) && ((_damageHPPerSec != 0) || (_damageMPPerSec != 0)))
{
final PlayerInstance player = creature.getActingPlayer();
- if (getCastle() != null) // Castle zone
+ final Castle castle = getCastle();
+ if (castle != null) // Castle zone
{
- if (!(getCastle().getSiege().isInProgress() && (player != null) && (player.getSiegeState() != 2))) // Siege and no defender
+ if (!(castle.getSiege().isInProgress() && (player != null) && (player.getSiegeState() != 2))) // Siege and no defender
{
return;
}
@@ -119,9 +109,10 @@ public class DamageZone extends ZoneType
synchronized (this)
{
- if (getSettings().getTask() == null)
+ task = _task;
+ if (task == null)
{
- getSettings().setTask(ThreadPool.scheduleAtFixedRate(new ApplyDamage(this), _startTask, _reuseTask));
+ _task = task = ThreadPool.scheduleAtFixedRate(new ApplyDamage(), _startTask, _reuseTask);
}
}
}
@@ -130,9 +121,10 @@ public class DamageZone extends ZoneType
@Override
protected void onExit(Creature creature)
{
- if (getCharactersInside().isEmpty() && (getSettings().getTask() != null))
+ if (getCharactersInside().isEmpty() && (_task != null))
{
- getSettings().clear();
+ _task.cancel(true);
+ _task = null;
}
}
@@ -152,19 +144,16 @@ public class DamageZone extends ZoneType
{
_castle = CastleManager.getInstance().getCastleById(_castleId);
}
-
return _castle;
}
- private final class ApplyDamage implements Runnable
+ private class ApplyDamage implements Runnable
{
- private final DamageZone _dmgZone;
private final Castle _castle;
- protected ApplyDamage(DamageZone zone)
+ protected ApplyDamage()
{
- _dmgZone = zone;
- _castle = zone.getCastle();
+ _castle = getCastle();
}
@Override
@@ -175,6 +164,13 @@ public class DamageZone extends ZoneType
return;
}
+ if (getCharactersInside().isEmpty())
+ {
+ _task.cancel(false);
+ _task = null;
+ return;
+ }
+
boolean siege = false;
if (_castle != null)
@@ -183,34 +179,34 @@ public class DamageZone extends ZoneType
// castle zones active only during siege
if (!siege)
{
- _dmgZone.getSettings().clear();
+ _task.cancel(false);
+ _task = null;
return;
}
}
- for (Creature temp : _dmgZone.getCharactersInside())
+ for (Creature character : getCharactersInside())
{
- if ((temp != null) && !temp.isDead())
+ if ((character != null) && character.isPlayer() && !character.isDead())
{
if (siege)
{
// during siege defenders not affected
- final PlayerInstance player = temp.getActingPlayer();
+ final PlayerInstance player = character.getActingPlayer();
if ((player != null) && player.isInSiege() && (player.getSiegeState() == 2))
{
continue;
}
}
- final double multiplier = 1 + (temp.getStat().getValue(Stat.DAMAGE_ZONE_VULN, 0) / 100);
-
+ final double multiplier = 1 + (character.getStat().getValue(Stat.DAMAGE_ZONE_VULN, 0) / 100);
if (getHPDamagePerSecond() != 0)
{
- temp.reduceCurrentHp(_dmgZone.getHPDamagePerSecond() * multiplier, temp, null);
+ character.reduceCurrentHp(getHPDamagePerSecond() * multiplier, character, null);
}
if (getMPDamagePerSecond() != 0)
{
- temp.reduceCurrentMp(_dmgZone.getMPDamagePerSecond() * multiplier);
+ character.reduceCurrentMp(getMPDamagePerSecond() * multiplier);
}
}
}
diff --git a/L2J_Mobius_5.0_Salvation/java/org/l2jmobius/gameserver/model/zone/type/EffectZone.java b/L2J_Mobius_5.0_Salvation/java/org/l2jmobius/gameserver/model/zone/type/EffectZone.java
index 40257410ad..b179fcd242 100644
--- a/L2J_Mobius_5.0_Salvation/java/org/l2jmobius/gameserver/model/zone/type/EffectZone.java
+++ b/L2J_Mobius_5.0_Salvation/java/org/l2jmobius/gameserver/model/zone/type/EffectZone.java
@@ -19,22 +19,20 @@ package org.l2jmobius.gameserver.model.zone.type;
import java.util.Map;
import java.util.Map.Entry;
import java.util.concurrent.ConcurrentHashMap;
+import java.util.concurrent.Future;
import org.l2jmobius.commons.concurrent.ThreadPool;
import org.l2jmobius.commons.util.Rnd;
import org.l2jmobius.gameserver.data.xml.SkillData;
import org.l2jmobius.gameserver.enums.InstanceType;
-import org.l2jmobius.gameserver.instancemanager.ZoneManager;
import org.l2jmobius.gameserver.model.actor.Creature;
import org.l2jmobius.gameserver.model.skills.Skill;
-import org.l2jmobius.gameserver.model.zone.AbstractZoneSettings;
-import org.l2jmobius.gameserver.model.zone.TaskZoneSettings;
import org.l2jmobius.gameserver.model.zone.ZoneId;
import org.l2jmobius.gameserver.model.zone.ZoneType;
import org.l2jmobius.gameserver.network.serverpackets.EtcStatusUpdate;
/**
- * another type of damage zone with skills
+ * Another type of damage zone with skills.
* @author kerberos
*/
public class EffectZone extends ZoneType
@@ -45,6 +43,7 @@ public class EffectZone extends ZoneType
protected boolean _bypassConditions;
private boolean _isShowDangerIcon;
protected Map _skills;
+ private volatile Future> _task;
public EffectZone(int id)
{
@@ -55,18 +54,6 @@ public class EffectZone extends ZoneType
setTargetType(InstanceType.Playable); // default only playable
_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
@@ -144,13 +131,15 @@ public class EffectZone extends ZoneType
{
if (_skills != null)
{
- if (getSettings().getTask() == null)
+ Future> task = _task;
+ if (task == null)
{
synchronized (this)
{
- if (getSettings().getTask() == null)
+ task = _task;
+ if (task == null)
{
- getSettings().setTask(ThreadPool.scheduleAtFixedRate(new ApplySkill(), _initialDelay, _reuse));
+ _task = task = ThreadPool.scheduleAtFixedRate(new ApplySkill(), _initialDelay, _reuse);
}
}
}
@@ -183,9 +172,10 @@ public class EffectZone extends ZoneType
}
}
- if (getCharactersInside().isEmpty() && (getSettings().getTask() != null))
+ if (getCharactersInside().isEmpty() && (_task != null))
{
- getSettings().clear();
+ _task.cancel(true);
+ _task = null;
}
}
@@ -240,7 +230,7 @@ public class EffectZone extends ZoneType
return _skills.get(skillId);
}
- private final class ApplySkill implements Runnable
+ private class ApplySkill implements Runnable
{
protected ApplySkill()
{
@@ -253,25 +243,34 @@ public class EffectZone extends ZoneType
@Override
public void run()
{
- if (isEnabled())
+ if (!isEnabled())
{
- getCharactersInside().forEach(character ->
+ return;
+ }
+
+ if (getCharactersInside().isEmpty())
+ {
+ _task.cancel(false);
+ _task = null;
+ return;
+ }
+
+ for (Creature character : getCharactersInside())
+ {
+ if ((character != null) && character.isPlayer() && !character.isDead() && (Rnd.get(100) < _chance))
{
- if ((character != null) && !character.isDead() && (Rnd.get(100) < _chance))
+ for (Entry e : _skills.entrySet())
{
- for (Entry e : _skills.entrySet())
+ final Skill skill = SkillData.getInstance().getSkill(e.getKey().intValue(), e.getValue().intValue());
+ if ((skill != null) && (_bypassConditions || skill.checkCondition(character, character)))
{
- final Skill skill = SkillData.getInstance().getSkill(e.getKey(), e.getValue());
- if ((skill != null) && (_bypassConditions || skill.checkCondition(character, character)))
+ if (character.getAffectedSkillLevel(skill.getId()) < skill.getLevel())
{
- if (character.getAffectedSkillLevel(skill.getId()) < skill.getLevel())
- {
- skill.activateSkill(character, character);
- }
+ skill.activateSkill(character, character);
}
}
}
- });
+ }
}
}
}
diff --git a/L2J_Mobius_5.5_EtinasFate/java/org/l2jmobius/gameserver/model/zone/TaskZoneSettings.java b/L2J_Mobius_5.5_EtinasFate/java/org/l2jmobius/gameserver/model/zone/TaskZoneSettings.java
deleted file mode 100644
index facc7f731b..0000000000
--- a/L2J_Mobius_5.5_EtinasFate/java/org/l2jmobius/gameserver/model/zone/TaskZoneSettings.java
+++ /dev/null
@@ -1,56 +0,0 @@
-/*
- * This file is part of the L2J Mobius project.
- *
- * 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 .
- */
-package org.l2jmobius.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);
- _task = null;
- }
- }
-}
diff --git a/L2J_Mobius_5.5_EtinasFate/java/org/l2jmobius/gameserver/model/zone/type/DamageZone.java b/L2J_Mobius_5.5_EtinasFate/java/org/l2jmobius/gameserver/model/zone/type/DamageZone.java
index 13b533a54f..ce5daa2ab3 100644
--- a/L2J_Mobius_5.5_EtinasFate/java/org/l2jmobius/gameserver/model/zone/type/DamageZone.java
+++ b/L2J_Mobius_5.5_EtinasFate/java/org/l2jmobius/gameserver/model/zone/type/DamageZone.java
@@ -16,16 +16,15 @@
*/
package org.l2jmobius.gameserver.model.zone.type;
+import java.util.concurrent.Future;
+
import org.l2jmobius.commons.concurrent.ThreadPool;
import org.l2jmobius.gameserver.enums.InstanceType;
import org.l2jmobius.gameserver.instancemanager.CastleManager;
-import org.l2jmobius.gameserver.instancemanager.ZoneManager;
import org.l2jmobius.gameserver.model.actor.Creature;
import org.l2jmobius.gameserver.model.actor.instance.PlayerInstance;
import org.l2jmobius.gameserver.model.siege.Castle;
import org.l2jmobius.gameserver.model.stats.Stat;
-import org.l2jmobius.gameserver.model.zone.AbstractZoneSettings;
-import org.l2jmobius.gameserver.model.zone.TaskZoneSettings;
import org.l2jmobius.gameserver.model.zone.ZoneType;
/**
@@ -42,6 +41,7 @@ public class DamageZone extends ZoneType
private int _startTask;
private int _reuseTask;
+ private volatile Future> _task;
public DamageZone(int id)
{
@@ -60,18 +60,6 @@ public class DamageZone extends ZoneType
_castle = null;
setTargetType(InstanceType.Playable); // 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
@@ -106,12 +94,14 @@ public class DamageZone extends ZoneType
@Override
protected void onEnter(Creature creature)
{
- if ((getSettings().getTask() == null) && ((_damageHPPerSec != 0) || (_damageMPPerSec != 0)))
+ Future> task = _task;
+ if ((task == null) && ((_damageHPPerSec != 0) || (_damageMPPerSec != 0)))
{
final PlayerInstance player = creature.getActingPlayer();
- if (getCastle() != null) // Castle zone
+ final Castle castle = getCastle();
+ if (castle != null) // Castle zone
{
- if (!(getCastle().getSiege().isInProgress() && (player != null) && (player.getSiegeState() != 2))) // Siege and no defender
+ if (!(castle.getSiege().isInProgress() && (player != null) && (player.getSiegeState() != 2))) // Siege and no defender
{
return;
}
@@ -119,9 +109,10 @@ public class DamageZone extends ZoneType
synchronized (this)
{
- if (getSettings().getTask() == null)
+ task = _task;
+ if (task == null)
{
- getSettings().setTask(ThreadPool.scheduleAtFixedRate(new ApplyDamage(this), _startTask, _reuseTask));
+ _task = task = ThreadPool.scheduleAtFixedRate(new ApplyDamage(), _startTask, _reuseTask);
}
}
}
@@ -130,9 +121,10 @@ public class DamageZone extends ZoneType
@Override
protected void onExit(Creature creature)
{
- if (getCharactersInside().isEmpty() && (getSettings().getTask() != null))
+ if (getCharactersInside().isEmpty() && (_task != null))
{
- getSettings().clear();
+ _task.cancel(true);
+ _task = null;
}
}
@@ -152,19 +144,16 @@ public class DamageZone extends ZoneType
{
_castle = CastleManager.getInstance().getCastleById(_castleId);
}
-
return _castle;
}
- private final class ApplyDamage implements Runnable
+ private class ApplyDamage implements Runnable
{
- private final DamageZone _dmgZone;
private final Castle _castle;
- protected ApplyDamage(DamageZone zone)
+ protected ApplyDamage()
{
- _dmgZone = zone;
- _castle = zone.getCastle();
+ _castle = getCastle();
}
@Override
@@ -175,6 +164,13 @@ public class DamageZone extends ZoneType
return;
}
+ if (getCharactersInside().isEmpty())
+ {
+ _task.cancel(false);
+ _task = null;
+ return;
+ }
+
boolean siege = false;
if (_castle != null)
@@ -183,34 +179,34 @@ public class DamageZone extends ZoneType
// castle zones active only during siege
if (!siege)
{
- _dmgZone.getSettings().clear();
+ _task.cancel(false);
+ _task = null;
return;
}
}
- for (Creature temp : _dmgZone.getCharactersInside())
+ for (Creature character : getCharactersInside())
{
- if ((temp != null) && !temp.isDead())
+ if ((character != null) && character.isPlayer() && !character.isDead())
{
if (siege)
{
// during siege defenders not affected
- final PlayerInstance player = temp.getActingPlayer();
+ final PlayerInstance player = character.getActingPlayer();
if ((player != null) && player.isInSiege() && (player.getSiegeState() == 2))
{
continue;
}
}
- final double multiplier = 1 + (temp.getStat().getValue(Stat.DAMAGE_ZONE_VULN, 0) / 100);
-
+ final double multiplier = 1 + (character.getStat().getValue(Stat.DAMAGE_ZONE_VULN, 0) / 100);
if (getHPDamagePerSecond() != 0)
{
- temp.reduceCurrentHp(_dmgZone.getHPDamagePerSecond() * multiplier, temp, null);
+ character.reduceCurrentHp(getHPDamagePerSecond() * multiplier, character, null);
}
if (getMPDamagePerSecond() != 0)
{
- temp.reduceCurrentMp(_dmgZone.getMPDamagePerSecond() * multiplier);
+ character.reduceCurrentMp(getMPDamagePerSecond() * multiplier);
}
}
}
diff --git a/L2J_Mobius_5.5_EtinasFate/java/org/l2jmobius/gameserver/model/zone/type/EffectZone.java b/L2J_Mobius_5.5_EtinasFate/java/org/l2jmobius/gameserver/model/zone/type/EffectZone.java
index 40257410ad..b179fcd242 100644
--- a/L2J_Mobius_5.5_EtinasFate/java/org/l2jmobius/gameserver/model/zone/type/EffectZone.java
+++ b/L2J_Mobius_5.5_EtinasFate/java/org/l2jmobius/gameserver/model/zone/type/EffectZone.java
@@ -19,22 +19,20 @@ package org.l2jmobius.gameserver.model.zone.type;
import java.util.Map;
import java.util.Map.Entry;
import java.util.concurrent.ConcurrentHashMap;
+import java.util.concurrent.Future;
import org.l2jmobius.commons.concurrent.ThreadPool;
import org.l2jmobius.commons.util.Rnd;
import org.l2jmobius.gameserver.data.xml.SkillData;
import org.l2jmobius.gameserver.enums.InstanceType;
-import org.l2jmobius.gameserver.instancemanager.ZoneManager;
import org.l2jmobius.gameserver.model.actor.Creature;
import org.l2jmobius.gameserver.model.skills.Skill;
-import org.l2jmobius.gameserver.model.zone.AbstractZoneSettings;
-import org.l2jmobius.gameserver.model.zone.TaskZoneSettings;
import org.l2jmobius.gameserver.model.zone.ZoneId;
import org.l2jmobius.gameserver.model.zone.ZoneType;
import org.l2jmobius.gameserver.network.serverpackets.EtcStatusUpdate;
/**
- * another type of damage zone with skills
+ * Another type of damage zone with skills.
* @author kerberos
*/
public class EffectZone extends ZoneType
@@ -45,6 +43,7 @@ public class EffectZone extends ZoneType
protected boolean _bypassConditions;
private boolean _isShowDangerIcon;
protected Map _skills;
+ private volatile Future> _task;
public EffectZone(int id)
{
@@ -55,18 +54,6 @@ public class EffectZone extends ZoneType
setTargetType(InstanceType.Playable); // default only playable
_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
@@ -144,13 +131,15 @@ public class EffectZone extends ZoneType
{
if (_skills != null)
{
- if (getSettings().getTask() == null)
+ Future> task = _task;
+ if (task == null)
{
synchronized (this)
{
- if (getSettings().getTask() == null)
+ task = _task;
+ if (task == null)
{
- getSettings().setTask(ThreadPool.scheduleAtFixedRate(new ApplySkill(), _initialDelay, _reuse));
+ _task = task = ThreadPool.scheduleAtFixedRate(new ApplySkill(), _initialDelay, _reuse);
}
}
}
@@ -183,9 +172,10 @@ public class EffectZone extends ZoneType
}
}
- if (getCharactersInside().isEmpty() && (getSettings().getTask() != null))
+ if (getCharactersInside().isEmpty() && (_task != null))
{
- getSettings().clear();
+ _task.cancel(true);
+ _task = null;
}
}
@@ -240,7 +230,7 @@ public class EffectZone extends ZoneType
return _skills.get(skillId);
}
- private final class ApplySkill implements Runnable
+ private class ApplySkill implements Runnable
{
protected ApplySkill()
{
@@ -253,25 +243,34 @@ public class EffectZone extends ZoneType
@Override
public void run()
{
- if (isEnabled())
+ if (!isEnabled())
{
- getCharactersInside().forEach(character ->
+ return;
+ }
+
+ if (getCharactersInside().isEmpty())
+ {
+ _task.cancel(false);
+ _task = null;
+ return;
+ }
+
+ for (Creature character : getCharactersInside())
+ {
+ if ((character != null) && character.isPlayer() && !character.isDead() && (Rnd.get(100) < _chance))
{
- if ((character != null) && !character.isDead() && (Rnd.get(100) < _chance))
+ for (Entry e : _skills.entrySet())
{
- for (Entry e : _skills.entrySet())
+ final Skill skill = SkillData.getInstance().getSkill(e.getKey().intValue(), e.getValue().intValue());
+ if ((skill != null) && (_bypassConditions || skill.checkCondition(character, character)))
{
- final Skill skill = SkillData.getInstance().getSkill(e.getKey(), e.getValue());
- if ((skill != null) && (_bypassConditions || skill.checkCondition(character, character)))
+ if (character.getAffectedSkillLevel(skill.getId()) < skill.getLevel())
{
- if (character.getAffectedSkillLevel(skill.getId()) < skill.getLevel())
- {
- skill.activateSkill(character, character);
- }
+ skill.activateSkill(character, character);
}
}
}
- });
+ }
}
}
}
diff --git a/L2J_Mobius_6.0_Fafurion/java/org/l2jmobius/gameserver/model/zone/TaskZoneSettings.java b/L2J_Mobius_6.0_Fafurion/java/org/l2jmobius/gameserver/model/zone/TaskZoneSettings.java
deleted file mode 100644
index facc7f731b..0000000000
--- a/L2J_Mobius_6.0_Fafurion/java/org/l2jmobius/gameserver/model/zone/TaskZoneSettings.java
+++ /dev/null
@@ -1,56 +0,0 @@
-/*
- * This file is part of the L2J Mobius project.
- *
- * 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 .
- */
-package org.l2jmobius.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);
- _task = null;
- }
- }
-}
diff --git a/L2J_Mobius_6.0_Fafurion/java/org/l2jmobius/gameserver/model/zone/type/DamageZone.java b/L2J_Mobius_6.0_Fafurion/java/org/l2jmobius/gameserver/model/zone/type/DamageZone.java
index 13b533a54f..ce5daa2ab3 100644
--- a/L2J_Mobius_6.0_Fafurion/java/org/l2jmobius/gameserver/model/zone/type/DamageZone.java
+++ b/L2J_Mobius_6.0_Fafurion/java/org/l2jmobius/gameserver/model/zone/type/DamageZone.java
@@ -16,16 +16,15 @@
*/
package org.l2jmobius.gameserver.model.zone.type;
+import java.util.concurrent.Future;
+
import org.l2jmobius.commons.concurrent.ThreadPool;
import org.l2jmobius.gameserver.enums.InstanceType;
import org.l2jmobius.gameserver.instancemanager.CastleManager;
-import org.l2jmobius.gameserver.instancemanager.ZoneManager;
import org.l2jmobius.gameserver.model.actor.Creature;
import org.l2jmobius.gameserver.model.actor.instance.PlayerInstance;
import org.l2jmobius.gameserver.model.siege.Castle;
import org.l2jmobius.gameserver.model.stats.Stat;
-import org.l2jmobius.gameserver.model.zone.AbstractZoneSettings;
-import org.l2jmobius.gameserver.model.zone.TaskZoneSettings;
import org.l2jmobius.gameserver.model.zone.ZoneType;
/**
@@ -42,6 +41,7 @@ public class DamageZone extends ZoneType
private int _startTask;
private int _reuseTask;
+ private volatile Future> _task;
public DamageZone(int id)
{
@@ -60,18 +60,6 @@ public class DamageZone extends ZoneType
_castle = null;
setTargetType(InstanceType.Playable); // 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
@@ -106,12 +94,14 @@ public class DamageZone extends ZoneType
@Override
protected void onEnter(Creature creature)
{
- if ((getSettings().getTask() == null) && ((_damageHPPerSec != 0) || (_damageMPPerSec != 0)))
+ Future> task = _task;
+ if ((task == null) && ((_damageHPPerSec != 0) || (_damageMPPerSec != 0)))
{
final PlayerInstance player = creature.getActingPlayer();
- if (getCastle() != null) // Castle zone
+ final Castle castle = getCastle();
+ if (castle != null) // Castle zone
{
- if (!(getCastle().getSiege().isInProgress() && (player != null) && (player.getSiegeState() != 2))) // Siege and no defender
+ if (!(castle.getSiege().isInProgress() && (player != null) && (player.getSiegeState() != 2))) // Siege and no defender
{
return;
}
@@ -119,9 +109,10 @@ public class DamageZone extends ZoneType
synchronized (this)
{
- if (getSettings().getTask() == null)
+ task = _task;
+ if (task == null)
{
- getSettings().setTask(ThreadPool.scheduleAtFixedRate(new ApplyDamage(this), _startTask, _reuseTask));
+ _task = task = ThreadPool.scheduleAtFixedRate(new ApplyDamage(), _startTask, _reuseTask);
}
}
}
@@ -130,9 +121,10 @@ public class DamageZone extends ZoneType
@Override
protected void onExit(Creature creature)
{
- if (getCharactersInside().isEmpty() && (getSettings().getTask() != null))
+ if (getCharactersInside().isEmpty() && (_task != null))
{
- getSettings().clear();
+ _task.cancel(true);
+ _task = null;
}
}
@@ -152,19 +144,16 @@ public class DamageZone extends ZoneType
{
_castle = CastleManager.getInstance().getCastleById(_castleId);
}
-
return _castle;
}
- private final class ApplyDamage implements Runnable
+ private class ApplyDamage implements Runnable
{
- private final DamageZone _dmgZone;
private final Castle _castle;
- protected ApplyDamage(DamageZone zone)
+ protected ApplyDamage()
{
- _dmgZone = zone;
- _castle = zone.getCastle();
+ _castle = getCastle();
}
@Override
@@ -175,6 +164,13 @@ public class DamageZone extends ZoneType
return;
}
+ if (getCharactersInside().isEmpty())
+ {
+ _task.cancel(false);
+ _task = null;
+ return;
+ }
+
boolean siege = false;
if (_castle != null)
@@ -183,34 +179,34 @@ public class DamageZone extends ZoneType
// castle zones active only during siege
if (!siege)
{
- _dmgZone.getSettings().clear();
+ _task.cancel(false);
+ _task = null;
return;
}
}
- for (Creature temp : _dmgZone.getCharactersInside())
+ for (Creature character : getCharactersInside())
{
- if ((temp != null) && !temp.isDead())
+ if ((character != null) && character.isPlayer() && !character.isDead())
{
if (siege)
{
// during siege defenders not affected
- final PlayerInstance player = temp.getActingPlayer();
+ final PlayerInstance player = character.getActingPlayer();
if ((player != null) && player.isInSiege() && (player.getSiegeState() == 2))
{
continue;
}
}
- final double multiplier = 1 + (temp.getStat().getValue(Stat.DAMAGE_ZONE_VULN, 0) / 100);
-
+ final double multiplier = 1 + (character.getStat().getValue(Stat.DAMAGE_ZONE_VULN, 0) / 100);
if (getHPDamagePerSecond() != 0)
{
- temp.reduceCurrentHp(_dmgZone.getHPDamagePerSecond() * multiplier, temp, null);
+ character.reduceCurrentHp(getHPDamagePerSecond() * multiplier, character, null);
}
if (getMPDamagePerSecond() != 0)
{
- temp.reduceCurrentMp(_dmgZone.getMPDamagePerSecond() * multiplier);
+ character.reduceCurrentMp(getMPDamagePerSecond() * multiplier);
}
}
}
diff --git a/L2J_Mobius_6.0_Fafurion/java/org/l2jmobius/gameserver/model/zone/type/EffectZone.java b/L2J_Mobius_6.0_Fafurion/java/org/l2jmobius/gameserver/model/zone/type/EffectZone.java
index 40257410ad..b179fcd242 100644
--- a/L2J_Mobius_6.0_Fafurion/java/org/l2jmobius/gameserver/model/zone/type/EffectZone.java
+++ b/L2J_Mobius_6.0_Fafurion/java/org/l2jmobius/gameserver/model/zone/type/EffectZone.java
@@ -19,22 +19,20 @@ package org.l2jmobius.gameserver.model.zone.type;
import java.util.Map;
import java.util.Map.Entry;
import java.util.concurrent.ConcurrentHashMap;
+import java.util.concurrent.Future;
import org.l2jmobius.commons.concurrent.ThreadPool;
import org.l2jmobius.commons.util.Rnd;
import org.l2jmobius.gameserver.data.xml.SkillData;
import org.l2jmobius.gameserver.enums.InstanceType;
-import org.l2jmobius.gameserver.instancemanager.ZoneManager;
import org.l2jmobius.gameserver.model.actor.Creature;
import org.l2jmobius.gameserver.model.skills.Skill;
-import org.l2jmobius.gameserver.model.zone.AbstractZoneSettings;
-import org.l2jmobius.gameserver.model.zone.TaskZoneSettings;
import org.l2jmobius.gameserver.model.zone.ZoneId;
import org.l2jmobius.gameserver.model.zone.ZoneType;
import org.l2jmobius.gameserver.network.serverpackets.EtcStatusUpdate;
/**
- * another type of damage zone with skills
+ * Another type of damage zone with skills.
* @author kerberos
*/
public class EffectZone extends ZoneType
@@ -45,6 +43,7 @@ public class EffectZone extends ZoneType
protected boolean _bypassConditions;
private boolean _isShowDangerIcon;
protected Map _skills;
+ private volatile Future> _task;
public EffectZone(int id)
{
@@ -55,18 +54,6 @@ public class EffectZone extends ZoneType
setTargetType(InstanceType.Playable); // default only playable
_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
@@ -144,13 +131,15 @@ public class EffectZone extends ZoneType
{
if (_skills != null)
{
- if (getSettings().getTask() == null)
+ Future> task = _task;
+ if (task == null)
{
synchronized (this)
{
- if (getSettings().getTask() == null)
+ task = _task;
+ if (task == null)
{
- getSettings().setTask(ThreadPool.scheduleAtFixedRate(new ApplySkill(), _initialDelay, _reuse));
+ _task = task = ThreadPool.scheduleAtFixedRate(new ApplySkill(), _initialDelay, _reuse);
}
}
}
@@ -183,9 +172,10 @@ public class EffectZone extends ZoneType
}
}
- if (getCharactersInside().isEmpty() && (getSettings().getTask() != null))
+ if (getCharactersInside().isEmpty() && (_task != null))
{
- getSettings().clear();
+ _task.cancel(true);
+ _task = null;
}
}
@@ -240,7 +230,7 @@ public class EffectZone extends ZoneType
return _skills.get(skillId);
}
- private final class ApplySkill implements Runnable
+ private class ApplySkill implements Runnable
{
protected ApplySkill()
{
@@ -253,25 +243,34 @@ public class EffectZone extends ZoneType
@Override
public void run()
{
- if (isEnabled())
+ if (!isEnabled())
{
- getCharactersInside().forEach(character ->
+ return;
+ }
+
+ if (getCharactersInside().isEmpty())
+ {
+ _task.cancel(false);
+ _task = null;
+ return;
+ }
+
+ for (Creature character : getCharactersInside())
+ {
+ if ((character != null) && character.isPlayer() && !character.isDead() && (Rnd.get(100) < _chance))
{
- if ((character != null) && !character.isDead() && (Rnd.get(100) < _chance))
+ for (Entry e : _skills.entrySet())
{
- for (Entry e : _skills.entrySet())
+ final Skill skill = SkillData.getInstance().getSkill(e.getKey().intValue(), e.getValue().intValue());
+ if ((skill != null) && (_bypassConditions || skill.checkCondition(character, character)))
{
- final Skill skill = SkillData.getInstance().getSkill(e.getKey(), e.getValue());
- if ((skill != null) && (_bypassConditions || skill.checkCondition(character, character)))
+ if (character.getAffectedSkillLevel(skill.getId()) < skill.getLevel())
{
- if (character.getAffectedSkillLevel(skill.getId()) < skill.getLevel())
- {
- skill.activateSkill(character, character);
- }
+ skill.activateSkill(character, character);
}
}
}
- });
+ }
}
}
}
diff --git a/L2J_Mobius_7.0_PreludeOfWar/java/org/l2jmobius/gameserver/model/zone/TaskZoneSettings.java b/L2J_Mobius_7.0_PreludeOfWar/java/org/l2jmobius/gameserver/model/zone/TaskZoneSettings.java
deleted file mode 100644
index facc7f731b..0000000000
--- a/L2J_Mobius_7.0_PreludeOfWar/java/org/l2jmobius/gameserver/model/zone/TaskZoneSettings.java
+++ /dev/null
@@ -1,56 +0,0 @@
-/*
- * This file is part of the L2J Mobius project.
- *
- * 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 .
- */
-package org.l2jmobius.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);
- _task = null;
- }
- }
-}
diff --git a/L2J_Mobius_7.0_PreludeOfWar/java/org/l2jmobius/gameserver/model/zone/type/DamageZone.java b/L2J_Mobius_7.0_PreludeOfWar/java/org/l2jmobius/gameserver/model/zone/type/DamageZone.java
index 13b533a54f..ce5daa2ab3 100644
--- a/L2J_Mobius_7.0_PreludeOfWar/java/org/l2jmobius/gameserver/model/zone/type/DamageZone.java
+++ b/L2J_Mobius_7.0_PreludeOfWar/java/org/l2jmobius/gameserver/model/zone/type/DamageZone.java
@@ -16,16 +16,15 @@
*/
package org.l2jmobius.gameserver.model.zone.type;
+import java.util.concurrent.Future;
+
import org.l2jmobius.commons.concurrent.ThreadPool;
import org.l2jmobius.gameserver.enums.InstanceType;
import org.l2jmobius.gameserver.instancemanager.CastleManager;
-import org.l2jmobius.gameserver.instancemanager.ZoneManager;
import org.l2jmobius.gameserver.model.actor.Creature;
import org.l2jmobius.gameserver.model.actor.instance.PlayerInstance;
import org.l2jmobius.gameserver.model.siege.Castle;
import org.l2jmobius.gameserver.model.stats.Stat;
-import org.l2jmobius.gameserver.model.zone.AbstractZoneSettings;
-import org.l2jmobius.gameserver.model.zone.TaskZoneSettings;
import org.l2jmobius.gameserver.model.zone.ZoneType;
/**
@@ -42,6 +41,7 @@ public class DamageZone extends ZoneType
private int _startTask;
private int _reuseTask;
+ private volatile Future> _task;
public DamageZone(int id)
{
@@ -60,18 +60,6 @@ public class DamageZone extends ZoneType
_castle = null;
setTargetType(InstanceType.Playable); // 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
@@ -106,12 +94,14 @@ public class DamageZone extends ZoneType
@Override
protected void onEnter(Creature creature)
{
- if ((getSettings().getTask() == null) && ((_damageHPPerSec != 0) || (_damageMPPerSec != 0)))
+ Future> task = _task;
+ if ((task == null) && ((_damageHPPerSec != 0) || (_damageMPPerSec != 0)))
{
final PlayerInstance player = creature.getActingPlayer();
- if (getCastle() != null) // Castle zone
+ final Castle castle = getCastle();
+ if (castle != null) // Castle zone
{
- if (!(getCastle().getSiege().isInProgress() && (player != null) && (player.getSiegeState() != 2))) // Siege and no defender
+ if (!(castle.getSiege().isInProgress() && (player != null) && (player.getSiegeState() != 2))) // Siege and no defender
{
return;
}
@@ -119,9 +109,10 @@ public class DamageZone extends ZoneType
synchronized (this)
{
- if (getSettings().getTask() == null)
+ task = _task;
+ if (task == null)
{
- getSettings().setTask(ThreadPool.scheduleAtFixedRate(new ApplyDamage(this), _startTask, _reuseTask));
+ _task = task = ThreadPool.scheduleAtFixedRate(new ApplyDamage(), _startTask, _reuseTask);
}
}
}
@@ -130,9 +121,10 @@ public class DamageZone extends ZoneType
@Override
protected void onExit(Creature creature)
{
- if (getCharactersInside().isEmpty() && (getSettings().getTask() != null))
+ if (getCharactersInside().isEmpty() && (_task != null))
{
- getSettings().clear();
+ _task.cancel(true);
+ _task = null;
}
}
@@ -152,19 +144,16 @@ public class DamageZone extends ZoneType
{
_castle = CastleManager.getInstance().getCastleById(_castleId);
}
-
return _castle;
}
- private final class ApplyDamage implements Runnable
+ private class ApplyDamage implements Runnable
{
- private final DamageZone _dmgZone;
private final Castle _castle;
- protected ApplyDamage(DamageZone zone)
+ protected ApplyDamage()
{
- _dmgZone = zone;
- _castle = zone.getCastle();
+ _castle = getCastle();
}
@Override
@@ -175,6 +164,13 @@ public class DamageZone extends ZoneType
return;
}
+ if (getCharactersInside().isEmpty())
+ {
+ _task.cancel(false);
+ _task = null;
+ return;
+ }
+
boolean siege = false;
if (_castle != null)
@@ -183,34 +179,34 @@ public class DamageZone extends ZoneType
// castle zones active only during siege
if (!siege)
{
- _dmgZone.getSettings().clear();
+ _task.cancel(false);
+ _task = null;
return;
}
}
- for (Creature temp : _dmgZone.getCharactersInside())
+ for (Creature character : getCharactersInside())
{
- if ((temp != null) && !temp.isDead())
+ if ((character != null) && character.isPlayer() && !character.isDead())
{
if (siege)
{
// during siege defenders not affected
- final PlayerInstance player = temp.getActingPlayer();
+ final PlayerInstance player = character.getActingPlayer();
if ((player != null) && player.isInSiege() && (player.getSiegeState() == 2))
{
continue;
}
}
- final double multiplier = 1 + (temp.getStat().getValue(Stat.DAMAGE_ZONE_VULN, 0) / 100);
-
+ final double multiplier = 1 + (character.getStat().getValue(Stat.DAMAGE_ZONE_VULN, 0) / 100);
if (getHPDamagePerSecond() != 0)
{
- temp.reduceCurrentHp(_dmgZone.getHPDamagePerSecond() * multiplier, temp, null);
+ character.reduceCurrentHp(getHPDamagePerSecond() * multiplier, character, null);
}
if (getMPDamagePerSecond() != 0)
{
- temp.reduceCurrentMp(_dmgZone.getMPDamagePerSecond() * multiplier);
+ character.reduceCurrentMp(getMPDamagePerSecond() * multiplier);
}
}
}
diff --git a/L2J_Mobius_7.0_PreludeOfWar/java/org/l2jmobius/gameserver/model/zone/type/EffectZone.java b/L2J_Mobius_7.0_PreludeOfWar/java/org/l2jmobius/gameserver/model/zone/type/EffectZone.java
index a5e920c17d..4abcf96eaf 100644
--- a/L2J_Mobius_7.0_PreludeOfWar/java/org/l2jmobius/gameserver/model/zone/type/EffectZone.java
+++ b/L2J_Mobius_7.0_PreludeOfWar/java/org/l2jmobius/gameserver/model/zone/type/EffectZone.java
@@ -19,22 +19,20 @@ package org.l2jmobius.gameserver.model.zone.type;
import java.util.Map;
import java.util.Map.Entry;
import java.util.concurrent.ConcurrentHashMap;
+import java.util.concurrent.Future;
import org.l2jmobius.commons.concurrent.ThreadPool;
import org.l2jmobius.commons.util.Rnd;
import org.l2jmobius.gameserver.data.xml.SkillData;
import org.l2jmobius.gameserver.enums.InstanceType;
-import org.l2jmobius.gameserver.instancemanager.ZoneManager;
import org.l2jmobius.gameserver.model.actor.Creature;
import org.l2jmobius.gameserver.model.skills.Skill;
-import org.l2jmobius.gameserver.model.zone.AbstractZoneSettings;
-import org.l2jmobius.gameserver.model.zone.TaskZoneSettings;
import org.l2jmobius.gameserver.model.zone.ZoneId;
import org.l2jmobius.gameserver.model.zone.ZoneType;
import org.l2jmobius.gameserver.network.serverpackets.EtcStatusUpdate;
/**
- * another type of damage zone with skills
+ * Another type of damage zone with skills.
* @author kerberos
*/
public class EffectZone extends ZoneType
@@ -45,6 +43,7 @@ public class EffectZone extends ZoneType
protected boolean _bypassConditions;
private boolean _isShowDangerIcon;
protected Map _skills;
+ private volatile Future> _task;
public EffectZone(int id)
{
@@ -55,18 +54,6 @@ public class EffectZone extends ZoneType
setTargetType(InstanceType.Playable); // default only playable
_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
@@ -144,13 +131,15 @@ public class EffectZone extends ZoneType
{
if (_skills != null)
{
- if (getSettings().getTask() == null)
+ Future> task = _task;
+ if (task == null)
{
synchronized (this)
{
- if (getSettings().getTask() == null)
+ task = _task;
+ if (task == null)
{
- getSettings().setTask(ThreadPool.scheduleAtFixedRate(new ApplySkill(), _initialDelay, _reuse));
+ _task = task = ThreadPool.scheduleAtFixedRate(new ApplySkill(), _initialDelay, _reuse);
}
}
}
@@ -183,9 +172,10 @@ public class EffectZone extends ZoneType
}
}
- if (getCharactersInside().isEmpty() && (getSettings().getTask() != null))
+ if (getCharactersInside().isEmpty() && (_task != null))
{
- getSettings().clear();
+ _task.cancel(true);
+ _task = null;
}
}
@@ -240,7 +230,7 @@ public class EffectZone extends ZoneType
return _skills.get(skillId);
}
- private final class ApplySkill implements Runnable
+ private class ApplySkill implements Runnable
{
protected ApplySkill()
{
@@ -253,25 +243,34 @@ public class EffectZone extends ZoneType
@Override
public void run()
{
- if (isEnabled())
+ if (!isEnabled())
{
- getCharactersInside().forEach(character ->
+ return;
+ }
+
+ if (getCharactersInside().isEmpty())
+ {
+ _task.cancel(false);
+ _task = null;
+ return;
+ }
+
+ for (Creature character : getCharactersInside())
+ {
+ if ((character != null) && character.isPlayer() && !character.isDead() && (Rnd.get(100) < _chance))
{
- if ((character != null) && !character.isDead() && (Rnd.get(100) < _chance))
+ for (Entry e : _skills.entrySet())
{
- for (Entry e : _skills.entrySet())
+ final Skill skill = SkillData.getInstance().getSkill(e.getKey().intValue(), e.getValue().intValue());
+ if ((skill != null) && (_bypassConditions || skill.checkCondition(character, character, false)))
{
- final Skill skill = SkillData.getInstance().getSkill(e.getKey(), e.getValue());
- if ((skill != null) && (_bypassConditions || skill.checkCondition(character, character, true)))
+ if (character.getAffectedSkillLevel(skill.getId()) < skill.getLevel())
{
- if (character.getAffectedSkillLevel(skill.getId()) < skill.getLevel())
- {
- skill.activateSkill(character, character);
- }
+ skill.activateSkill(character, character);
}
}
}
- });
+ }
}
}
}
diff --git a/L2J_Mobius_8.0_Homunculus/java/org/l2jmobius/gameserver/model/zone/TaskZoneSettings.java b/L2J_Mobius_8.0_Homunculus/java/org/l2jmobius/gameserver/model/zone/TaskZoneSettings.java
deleted file mode 100644
index facc7f731b..0000000000
--- a/L2J_Mobius_8.0_Homunculus/java/org/l2jmobius/gameserver/model/zone/TaskZoneSettings.java
+++ /dev/null
@@ -1,56 +0,0 @@
-/*
- * This file is part of the L2J Mobius project.
- *
- * 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 .
- */
-package org.l2jmobius.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);
- _task = null;
- }
- }
-}
diff --git a/L2J_Mobius_8.0_Homunculus/java/org/l2jmobius/gameserver/model/zone/type/DamageZone.java b/L2J_Mobius_8.0_Homunculus/java/org/l2jmobius/gameserver/model/zone/type/DamageZone.java
index 13b533a54f..ce5daa2ab3 100644
--- a/L2J_Mobius_8.0_Homunculus/java/org/l2jmobius/gameserver/model/zone/type/DamageZone.java
+++ b/L2J_Mobius_8.0_Homunculus/java/org/l2jmobius/gameserver/model/zone/type/DamageZone.java
@@ -16,16 +16,15 @@
*/
package org.l2jmobius.gameserver.model.zone.type;
+import java.util.concurrent.Future;
+
import org.l2jmobius.commons.concurrent.ThreadPool;
import org.l2jmobius.gameserver.enums.InstanceType;
import org.l2jmobius.gameserver.instancemanager.CastleManager;
-import org.l2jmobius.gameserver.instancemanager.ZoneManager;
import org.l2jmobius.gameserver.model.actor.Creature;
import org.l2jmobius.gameserver.model.actor.instance.PlayerInstance;
import org.l2jmobius.gameserver.model.siege.Castle;
import org.l2jmobius.gameserver.model.stats.Stat;
-import org.l2jmobius.gameserver.model.zone.AbstractZoneSettings;
-import org.l2jmobius.gameserver.model.zone.TaskZoneSettings;
import org.l2jmobius.gameserver.model.zone.ZoneType;
/**
@@ -42,6 +41,7 @@ public class DamageZone extends ZoneType
private int _startTask;
private int _reuseTask;
+ private volatile Future> _task;
public DamageZone(int id)
{
@@ -60,18 +60,6 @@ public class DamageZone extends ZoneType
_castle = null;
setTargetType(InstanceType.Playable); // 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
@@ -106,12 +94,14 @@ public class DamageZone extends ZoneType
@Override
protected void onEnter(Creature creature)
{
- if ((getSettings().getTask() == null) && ((_damageHPPerSec != 0) || (_damageMPPerSec != 0)))
+ Future> task = _task;
+ if ((task == null) && ((_damageHPPerSec != 0) || (_damageMPPerSec != 0)))
{
final PlayerInstance player = creature.getActingPlayer();
- if (getCastle() != null) // Castle zone
+ final Castle castle = getCastle();
+ if (castle != null) // Castle zone
{
- if (!(getCastle().getSiege().isInProgress() && (player != null) && (player.getSiegeState() != 2))) // Siege and no defender
+ if (!(castle.getSiege().isInProgress() && (player != null) && (player.getSiegeState() != 2))) // Siege and no defender
{
return;
}
@@ -119,9 +109,10 @@ public class DamageZone extends ZoneType
synchronized (this)
{
- if (getSettings().getTask() == null)
+ task = _task;
+ if (task == null)
{
- getSettings().setTask(ThreadPool.scheduleAtFixedRate(new ApplyDamage(this), _startTask, _reuseTask));
+ _task = task = ThreadPool.scheduleAtFixedRate(new ApplyDamage(), _startTask, _reuseTask);
}
}
}
@@ -130,9 +121,10 @@ public class DamageZone extends ZoneType
@Override
protected void onExit(Creature creature)
{
- if (getCharactersInside().isEmpty() && (getSettings().getTask() != null))
+ if (getCharactersInside().isEmpty() && (_task != null))
{
- getSettings().clear();
+ _task.cancel(true);
+ _task = null;
}
}
@@ -152,19 +144,16 @@ public class DamageZone extends ZoneType
{
_castle = CastleManager.getInstance().getCastleById(_castleId);
}
-
return _castle;
}
- private final class ApplyDamage implements Runnable
+ private class ApplyDamage implements Runnable
{
- private final DamageZone _dmgZone;
private final Castle _castle;
- protected ApplyDamage(DamageZone zone)
+ protected ApplyDamage()
{
- _dmgZone = zone;
- _castle = zone.getCastle();
+ _castle = getCastle();
}
@Override
@@ -175,6 +164,13 @@ public class DamageZone extends ZoneType
return;
}
+ if (getCharactersInside().isEmpty())
+ {
+ _task.cancel(false);
+ _task = null;
+ return;
+ }
+
boolean siege = false;
if (_castle != null)
@@ -183,34 +179,34 @@ public class DamageZone extends ZoneType
// castle zones active only during siege
if (!siege)
{
- _dmgZone.getSettings().clear();
+ _task.cancel(false);
+ _task = null;
return;
}
}
- for (Creature temp : _dmgZone.getCharactersInside())
+ for (Creature character : getCharactersInside())
{
- if ((temp != null) && !temp.isDead())
+ if ((character != null) && character.isPlayer() && !character.isDead())
{
if (siege)
{
// during siege defenders not affected
- final PlayerInstance player = temp.getActingPlayer();
+ final PlayerInstance player = character.getActingPlayer();
if ((player != null) && player.isInSiege() && (player.getSiegeState() == 2))
{
continue;
}
}
- final double multiplier = 1 + (temp.getStat().getValue(Stat.DAMAGE_ZONE_VULN, 0) / 100);
-
+ final double multiplier = 1 + (character.getStat().getValue(Stat.DAMAGE_ZONE_VULN, 0) / 100);
if (getHPDamagePerSecond() != 0)
{
- temp.reduceCurrentHp(_dmgZone.getHPDamagePerSecond() * multiplier, temp, null);
+ character.reduceCurrentHp(getHPDamagePerSecond() * multiplier, character, null);
}
if (getMPDamagePerSecond() != 0)
{
- temp.reduceCurrentMp(_dmgZone.getMPDamagePerSecond() * multiplier);
+ character.reduceCurrentMp(getMPDamagePerSecond() * multiplier);
}
}
}
diff --git a/L2J_Mobius_8.0_Homunculus/java/org/l2jmobius/gameserver/model/zone/type/EffectZone.java b/L2J_Mobius_8.0_Homunculus/java/org/l2jmobius/gameserver/model/zone/type/EffectZone.java
index a5e920c17d..4abcf96eaf 100644
--- a/L2J_Mobius_8.0_Homunculus/java/org/l2jmobius/gameserver/model/zone/type/EffectZone.java
+++ b/L2J_Mobius_8.0_Homunculus/java/org/l2jmobius/gameserver/model/zone/type/EffectZone.java
@@ -19,22 +19,20 @@ package org.l2jmobius.gameserver.model.zone.type;
import java.util.Map;
import java.util.Map.Entry;
import java.util.concurrent.ConcurrentHashMap;
+import java.util.concurrent.Future;
import org.l2jmobius.commons.concurrent.ThreadPool;
import org.l2jmobius.commons.util.Rnd;
import org.l2jmobius.gameserver.data.xml.SkillData;
import org.l2jmobius.gameserver.enums.InstanceType;
-import org.l2jmobius.gameserver.instancemanager.ZoneManager;
import org.l2jmobius.gameserver.model.actor.Creature;
import org.l2jmobius.gameserver.model.skills.Skill;
-import org.l2jmobius.gameserver.model.zone.AbstractZoneSettings;
-import org.l2jmobius.gameserver.model.zone.TaskZoneSettings;
import org.l2jmobius.gameserver.model.zone.ZoneId;
import org.l2jmobius.gameserver.model.zone.ZoneType;
import org.l2jmobius.gameserver.network.serverpackets.EtcStatusUpdate;
/**
- * another type of damage zone with skills
+ * Another type of damage zone with skills.
* @author kerberos
*/
public class EffectZone extends ZoneType
@@ -45,6 +43,7 @@ public class EffectZone extends ZoneType
protected boolean _bypassConditions;
private boolean _isShowDangerIcon;
protected Map _skills;
+ private volatile Future> _task;
public EffectZone(int id)
{
@@ -55,18 +54,6 @@ public class EffectZone extends ZoneType
setTargetType(InstanceType.Playable); // default only playable
_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
@@ -144,13 +131,15 @@ public class EffectZone extends ZoneType
{
if (_skills != null)
{
- if (getSettings().getTask() == null)
+ Future> task = _task;
+ if (task == null)
{
synchronized (this)
{
- if (getSettings().getTask() == null)
+ task = _task;
+ if (task == null)
{
- getSettings().setTask(ThreadPool.scheduleAtFixedRate(new ApplySkill(), _initialDelay, _reuse));
+ _task = task = ThreadPool.scheduleAtFixedRate(new ApplySkill(), _initialDelay, _reuse);
}
}
}
@@ -183,9 +172,10 @@ public class EffectZone extends ZoneType
}
}
- if (getCharactersInside().isEmpty() && (getSettings().getTask() != null))
+ if (getCharactersInside().isEmpty() && (_task != null))
{
- getSettings().clear();
+ _task.cancel(true);
+ _task = null;
}
}
@@ -240,7 +230,7 @@ public class EffectZone extends ZoneType
return _skills.get(skillId);
}
- private final class ApplySkill implements Runnable
+ private class ApplySkill implements Runnable
{
protected ApplySkill()
{
@@ -253,25 +243,34 @@ public class EffectZone extends ZoneType
@Override
public void run()
{
- if (isEnabled())
+ if (!isEnabled())
{
- getCharactersInside().forEach(character ->
+ return;
+ }
+
+ if (getCharactersInside().isEmpty())
+ {
+ _task.cancel(false);
+ _task = null;
+ return;
+ }
+
+ for (Creature character : getCharactersInside())
+ {
+ if ((character != null) && character.isPlayer() && !character.isDead() && (Rnd.get(100) < _chance))
{
- if ((character != null) && !character.isDead() && (Rnd.get(100) < _chance))
+ for (Entry e : _skills.entrySet())
{
- for (Entry e : _skills.entrySet())
+ final Skill skill = SkillData.getInstance().getSkill(e.getKey().intValue(), e.getValue().intValue());
+ if ((skill != null) && (_bypassConditions || skill.checkCondition(character, character, false)))
{
- final Skill skill = SkillData.getInstance().getSkill(e.getKey(), e.getValue());
- if ((skill != null) && (_bypassConditions || skill.checkCondition(character, character, true)))
+ if (character.getAffectedSkillLevel(skill.getId()) < skill.getLevel())
{
- if (character.getAffectedSkillLevel(skill.getId()) < skill.getLevel())
- {
- skill.activateSkill(character, character);
- }
+ skill.activateSkill(character, character);
}
}
}
- });
+ }
}
}
}
diff --git a/L2J_Mobius_9.0_ReturnOfTheQueenAnt/java/org/l2jmobius/gameserver/model/zone/TaskZoneSettings.java b/L2J_Mobius_9.0_ReturnOfTheQueenAnt/java/org/l2jmobius/gameserver/model/zone/TaskZoneSettings.java
deleted file mode 100644
index facc7f731b..0000000000
--- a/L2J_Mobius_9.0_ReturnOfTheQueenAnt/java/org/l2jmobius/gameserver/model/zone/TaskZoneSettings.java
+++ /dev/null
@@ -1,56 +0,0 @@
-/*
- * This file is part of the L2J Mobius project.
- *
- * 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 .
- */
-package org.l2jmobius.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);
- _task = null;
- }
- }
-}
diff --git a/L2J_Mobius_9.0_ReturnOfTheQueenAnt/java/org/l2jmobius/gameserver/model/zone/type/DamageZone.java b/L2J_Mobius_9.0_ReturnOfTheQueenAnt/java/org/l2jmobius/gameserver/model/zone/type/DamageZone.java
index 13b533a54f..ce5daa2ab3 100644
--- a/L2J_Mobius_9.0_ReturnOfTheQueenAnt/java/org/l2jmobius/gameserver/model/zone/type/DamageZone.java
+++ b/L2J_Mobius_9.0_ReturnOfTheQueenAnt/java/org/l2jmobius/gameserver/model/zone/type/DamageZone.java
@@ -16,16 +16,15 @@
*/
package org.l2jmobius.gameserver.model.zone.type;
+import java.util.concurrent.Future;
+
import org.l2jmobius.commons.concurrent.ThreadPool;
import org.l2jmobius.gameserver.enums.InstanceType;
import org.l2jmobius.gameserver.instancemanager.CastleManager;
-import org.l2jmobius.gameserver.instancemanager.ZoneManager;
import org.l2jmobius.gameserver.model.actor.Creature;
import org.l2jmobius.gameserver.model.actor.instance.PlayerInstance;
import org.l2jmobius.gameserver.model.siege.Castle;
import org.l2jmobius.gameserver.model.stats.Stat;
-import org.l2jmobius.gameserver.model.zone.AbstractZoneSettings;
-import org.l2jmobius.gameserver.model.zone.TaskZoneSettings;
import org.l2jmobius.gameserver.model.zone.ZoneType;
/**
@@ -42,6 +41,7 @@ public class DamageZone extends ZoneType
private int _startTask;
private int _reuseTask;
+ private volatile Future> _task;
public DamageZone(int id)
{
@@ -60,18 +60,6 @@ public class DamageZone extends ZoneType
_castle = null;
setTargetType(InstanceType.Playable); // 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
@@ -106,12 +94,14 @@ public class DamageZone extends ZoneType
@Override
protected void onEnter(Creature creature)
{
- if ((getSettings().getTask() == null) && ((_damageHPPerSec != 0) || (_damageMPPerSec != 0)))
+ Future> task = _task;
+ if ((task == null) && ((_damageHPPerSec != 0) || (_damageMPPerSec != 0)))
{
final PlayerInstance player = creature.getActingPlayer();
- if (getCastle() != null) // Castle zone
+ final Castle castle = getCastle();
+ if (castle != null) // Castle zone
{
- if (!(getCastle().getSiege().isInProgress() && (player != null) && (player.getSiegeState() != 2))) // Siege and no defender
+ if (!(castle.getSiege().isInProgress() && (player != null) && (player.getSiegeState() != 2))) // Siege and no defender
{
return;
}
@@ -119,9 +109,10 @@ public class DamageZone extends ZoneType
synchronized (this)
{
- if (getSettings().getTask() == null)
+ task = _task;
+ if (task == null)
{
- getSettings().setTask(ThreadPool.scheduleAtFixedRate(new ApplyDamage(this), _startTask, _reuseTask));
+ _task = task = ThreadPool.scheduleAtFixedRate(new ApplyDamage(), _startTask, _reuseTask);
}
}
}
@@ -130,9 +121,10 @@ public class DamageZone extends ZoneType
@Override
protected void onExit(Creature creature)
{
- if (getCharactersInside().isEmpty() && (getSettings().getTask() != null))
+ if (getCharactersInside().isEmpty() && (_task != null))
{
- getSettings().clear();
+ _task.cancel(true);
+ _task = null;
}
}
@@ -152,19 +144,16 @@ public class DamageZone extends ZoneType
{
_castle = CastleManager.getInstance().getCastleById(_castleId);
}
-
return _castle;
}
- private final class ApplyDamage implements Runnable
+ private class ApplyDamage implements Runnable
{
- private final DamageZone _dmgZone;
private final Castle _castle;
- protected ApplyDamage(DamageZone zone)
+ protected ApplyDamage()
{
- _dmgZone = zone;
- _castle = zone.getCastle();
+ _castle = getCastle();
}
@Override
@@ -175,6 +164,13 @@ public class DamageZone extends ZoneType
return;
}
+ if (getCharactersInside().isEmpty())
+ {
+ _task.cancel(false);
+ _task = null;
+ return;
+ }
+
boolean siege = false;
if (_castle != null)
@@ -183,34 +179,34 @@ public class DamageZone extends ZoneType
// castle zones active only during siege
if (!siege)
{
- _dmgZone.getSettings().clear();
+ _task.cancel(false);
+ _task = null;
return;
}
}
- for (Creature temp : _dmgZone.getCharactersInside())
+ for (Creature character : getCharactersInside())
{
- if ((temp != null) && !temp.isDead())
+ if ((character != null) && character.isPlayer() && !character.isDead())
{
if (siege)
{
// during siege defenders not affected
- final PlayerInstance player = temp.getActingPlayer();
+ final PlayerInstance player = character.getActingPlayer();
if ((player != null) && player.isInSiege() && (player.getSiegeState() == 2))
{
continue;
}
}
- final double multiplier = 1 + (temp.getStat().getValue(Stat.DAMAGE_ZONE_VULN, 0) / 100);
-
+ final double multiplier = 1 + (character.getStat().getValue(Stat.DAMAGE_ZONE_VULN, 0) / 100);
if (getHPDamagePerSecond() != 0)
{
- temp.reduceCurrentHp(_dmgZone.getHPDamagePerSecond() * multiplier, temp, null);
+ character.reduceCurrentHp(getHPDamagePerSecond() * multiplier, character, null);
}
if (getMPDamagePerSecond() != 0)
{
- temp.reduceCurrentMp(_dmgZone.getMPDamagePerSecond() * multiplier);
+ character.reduceCurrentMp(getMPDamagePerSecond() * multiplier);
}
}
}
diff --git a/L2J_Mobius_9.0_ReturnOfTheQueenAnt/java/org/l2jmobius/gameserver/model/zone/type/EffectZone.java b/L2J_Mobius_9.0_ReturnOfTheQueenAnt/java/org/l2jmobius/gameserver/model/zone/type/EffectZone.java
index a5e920c17d..4abcf96eaf 100644
--- a/L2J_Mobius_9.0_ReturnOfTheQueenAnt/java/org/l2jmobius/gameserver/model/zone/type/EffectZone.java
+++ b/L2J_Mobius_9.0_ReturnOfTheQueenAnt/java/org/l2jmobius/gameserver/model/zone/type/EffectZone.java
@@ -19,22 +19,20 @@ package org.l2jmobius.gameserver.model.zone.type;
import java.util.Map;
import java.util.Map.Entry;
import java.util.concurrent.ConcurrentHashMap;
+import java.util.concurrent.Future;
import org.l2jmobius.commons.concurrent.ThreadPool;
import org.l2jmobius.commons.util.Rnd;
import org.l2jmobius.gameserver.data.xml.SkillData;
import org.l2jmobius.gameserver.enums.InstanceType;
-import org.l2jmobius.gameserver.instancemanager.ZoneManager;
import org.l2jmobius.gameserver.model.actor.Creature;
import org.l2jmobius.gameserver.model.skills.Skill;
-import org.l2jmobius.gameserver.model.zone.AbstractZoneSettings;
-import org.l2jmobius.gameserver.model.zone.TaskZoneSettings;
import org.l2jmobius.gameserver.model.zone.ZoneId;
import org.l2jmobius.gameserver.model.zone.ZoneType;
import org.l2jmobius.gameserver.network.serverpackets.EtcStatusUpdate;
/**
- * another type of damage zone with skills
+ * Another type of damage zone with skills.
* @author kerberos
*/
public class EffectZone extends ZoneType
@@ -45,6 +43,7 @@ public class EffectZone extends ZoneType
protected boolean _bypassConditions;
private boolean _isShowDangerIcon;
protected Map _skills;
+ private volatile Future> _task;
public EffectZone(int id)
{
@@ -55,18 +54,6 @@ public class EffectZone extends ZoneType
setTargetType(InstanceType.Playable); // default only playable
_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
@@ -144,13 +131,15 @@ public class EffectZone extends ZoneType
{
if (_skills != null)
{
- if (getSettings().getTask() == null)
+ Future> task = _task;
+ if (task == null)
{
synchronized (this)
{
- if (getSettings().getTask() == null)
+ task = _task;
+ if (task == null)
{
- getSettings().setTask(ThreadPool.scheduleAtFixedRate(new ApplySkill(), _initialDelay, _reuse));
+ _task = task = ThreadPool.scheduleAtFixedRate(new ApplySkill(), _initialDelay, _reuse);
}
}
}
@@ -183,9 +172,10 @@ public class EffectZone extends ZoneType
}
}
- if (getCharactersInside().isEmpty() && (getSettings().getTask() != null))
+ if (getCharactersInside().isEmpty() && (_task != null))
{
- getSettings().clear();
+ _task.cancel(true);
+ _task = null;
}
}
@@ -240,7 +230,7 @@ public class EffectZone extends ZoneType
return _skills.get(skillId);
}
- private final class ApplySkill implements Runnable
+ private class ApplySkill implements Runnable
{
protected ApplySkill()
{
@@ -253,25 +243,34 @@ public class EffectZone extends ZoneType
@Override
public void run()
{
- if (isEnabled())
+ if (!isEnabled())
{
- getCharactersInside().forEach(character ->
+ return;
+ }
+
+ if (getCharactersInside().isEmpty())
+ {
+ _task.cancel(false);
+ _task = null;
+ return;
+ }
+
+ for (Creature character : getCharactersInside())
+ {
+ if ((character != null) && character.isPlayer() && !character.isDead() && (Rnd.get(100) < _chance))
{
- if ((character != null) && !character.isDead() && (Rnd.get(100) < _chance))
+ for (Entry e : _skills.entrySet())
{
- for (Entry e : _skills.entrySet())
+ final Skill skill = SkillData.getInstance().getSkill(e.getKey().intValue(), e.getValue().intValue());
+ if ((skill != null) && (_bypassConditions || skill.checkCondition(character, character, false)))
{
- final Skill skill = SkillData.getInstance().getSkill(e.getKey(), e.getValue());
- if ((skill != null) && (_bypassConditions || skill.checkCondition(character, character, true)))
+ if (character.getAffectedSkillLevel(skill.getId()) < skill.getLevel())
{
- if (character.getAffectedSkillLevel(skill.getId()) < skill.getLevel())
- {
- skill.activateSkill(character, character);
- }
+ skill.activateSkill(character, character);
}
}
}
- });
+ }
}
}
}
diff --git a/L2J_Mobius_C4_ScionsOfDestiny/java/org/l2jmobius/gameserver/model/zone/type/DamageZone.java b/L2J_Mobius_C4_ScionsOfDestiny/java/org/l2jmobius/gameserver/model/zone/type/DamageZone.java
index 55e01ac9ae..c7a5b03d86 100644
--- a/L2J_Mobius_C4_ScionsOfDestiny/java/org/l2jmobius/gameserver/model/zone/type/DamageZone.java
+++ b/L2J_Mobius_C4_ScionsOfDestiny/java/org/l2jmobius/gameserver/model/zone/type/DamageZone.java
@@ -20,7 +20,6 @@ import java.util.concurrent.Future;
import org.l2jmobius.commons.concurrent.ThreadPool;
import org.l2jmobius.gameserver.model.actor.Creature;
-import org.l2jmobius.gameserver.model.actor.instance.PlayerInstance;
import org.l2jmobius.gameserver.model.zone.ZoneType;
/**
@@ -30,7 +29,10 @@ import org.l2jmobius.gameserver.model.zone.ZoneType;
public class DamageZone extends ZoneType
{
private int _damagePerSec;
- private Future> _task;
+
+ private final int _startTask;
+ private final int _reuseTask;
+ private volatile Future> _task;
public DamageZone(int id)
{
@@ -38,6 +40,10 @@ public class DamageZone extends ZoneType
// Setup default damage
_damagePerSec = 100;
+
+ // Setup default start / reuse time
+ _startTask = 10;
+ _reuseTask = 5000;
}
@Override
@@ -56,16 +62,25 @@ public class DamageZone extends ZoneType
@Override
protected void onEnter(Creature creature)
{
- if (_task == null)
+ Future> task = _task;
+ if ((task == null) && (_damagePerSec != 0))
{
- _task = ThreadPool.scheduleAtFixedRate(new ApplyDamage(this), 10, 1000);
+
+ synchronized (this)
+ {
+ task = _task;
+ if (task == null)
+ {
+ _task = task = ThreadPool.scheduleAtFixedRate(new ApplyDamage(), _startTask, _reuseTask);
+ }
+ }
}
}
@Override
protected void onExit(Creature creature)
{
- if (getCharactersInside().isEmpty())
+ if (getCharactersInside().isEmpty() && (_task != null))
{
_task.cancel(true);
_task = null;
@@ -77,23 +92,27 @@ public class DamageZone extends ZoneType
return _damagePerSec;
}
- class ApplyDamage implements Runnable
+ private class ApplyDamage implements Runnable
{
- private final DamageZone _dmgZone;
-
- ApplyDamage(DamageZone zone)
+ protected ApplyDamage()
{
- _dmgZone = zone;
}
@Override
public void run()
{
- for (Creature temp : _dmgZone.getCharactersInside())
+ if (getCharactersInside().isEmpty())
{
- if ((temp != null) && !temp.isDead() && (temp instanceof PlayerInstance))
+ _task.cancel(false);
+ _task = null;
+ return;
+ }
+
+ for (Creature character : getCharactersInside())
+ {
+ if ((character != null) && character.isPlayer() && !character.isDead())
{
- temp.reduceCurrentHp(_dmgZone.getDamagePerSecond(), null);
+ character.reduceCurrentHp(getDamagePerSecond(), null);
}
}
}
diff --git a/L2J_Mobius_C4_ScionsOfDestiny/java/org/l2jmobius/gameserver/model/zone/type/EffectZone.java b/L2J_Mobius_C4_ScionsOfDestiny/java/org/l2jmobius/gameserver/model/zone/type/EffectZone.java
index 2dc1c9c98d..5b0d8ab290 100644
--- a/L2J_Mobius_C4_ScionsOfDestiny/java/org/l2jmobius/gameserver/model/zone/type/EffectZone.java
+++ b/L2J_Mobius_C4_ScionsOfDestiny/java/org/l2jmobius/gameserver/model/zone/type/EffectZone.java
@@ -24,17 +24,14 @@ import java.util.logging.Logger;
import org.l2jmobius.commons.concurrent.ThreadPool;
import org.l2jmobius.commons.util.Rnd;
-import org.l2jmobius.commons.util.StringUtil;
import org.l2jmobius.gameserver.data.SkillTable;
import org.l2jmobius.gameserver.model.Skill;
import org.l2jmobius.gameserver.model.actor.Creature;
-import org.l2jmobius.gameserver.model.actor.Playable;
-import org.l2jmobius.gameserver.model.actor.instance.PlayerInstance;
import org.l2jmobius.gameserver.model.zone.ZoneId;
import org.l2jmobius.gameserver.model.zone.ZoneType;
/**
- * another type of damage zone with skills
+ * Another type of damage zone with skills.
* @author kerberos
*/
public class EffectZone extends ZoneType
@@ -46,8 +43,8 @@ public class EffectZone extends ZoneType
private int _reuse;
boolean _enabled;
private boolean _isShowDangerIcon;
- private Future> _task;
protected Map _skills;
+ private volatile Future> _task;
public EffectZone(int id)
{
@@ -74,14 +71,19 @@ public class EffectZone extends ZoneType
_initialDelay = Integer.parseInt(value);
break;
}
+ case "reuse":
+ {
+ _reuse = Integer.parseInt(value);
+ break;
+ }
case "defaultStatus":
{
_enabled = Boolean.parseBoolean(value);
break;
}
- case "reuse":
+ case "showDangerIcon":
{
- _reuse = Integer.parseInt(value);
+ _isShowDangerIcon = Boolean.parseBoolean(value);
break;
}
case "skillIdLvl":
@@ -93,7 +95,7 @@ public class EffectZone extends ZoneType
final String[] skillSplit = skill.split("-");
if (skillSplit.length != 2)
{
- LOGGER.warning(StringUtil.concat(getClass().getSimpleName() + ": invalid config property -> skillsIdLvl \"", skill, "\""));
+ LOGGER.warning(getClass().getSimpleName() + ": invalid config property -> skillsIdLvl \"" + skill + "\"");
}
else
{
@@ -105,22 +107,16 @@ public class EffectZone extends ZoneType
{
if (!skill.isEmpty())
{
- LOGGER.warning(StringUtil.concat(getClass().getSimpleName() + ": invalid config property -> skillsIdLvl \"", skillSplit[0], "\"", skillSplit[1]));
+ LOGGER.warning(getClass().getSimpleName() + ": invalid config property -> skillsIdLvl \"" + skillSplit[0] + "\"" + skillSplit[1]);
}
}
}
}
break;
}
- case "showDangerIcon":
- {
- _isShowDangerIcon = Boolean.parseBoolean(value);
- break;
- }
default:
{
super.setParameter(name, value);
- break;
}
}
}
@@ -128,18 +124,23 @@ public class EffectZone extends ZoneType
@Override
protected void onEnter(Creature creature)
{
- if ((_skills != null) && (_task == null))
+ if (_skills != null)
{
- synchronized (this)
+ Future> task = _task;
+ if (task == null)
{
- if (_task == null)
+ synchronized (this)
{
- _task = ThreadPool.scheduleAtFixedRate(new ApplySkill(), _initialDelay, _reuse);
+ task = _task;
+ if (task == null)
+ {
+ _task = task = ThreadPool.scheduleAtFixedRate(new ApplySkill(), _initialDelay, _reuse);
+ }
}
}
}
- if ((creature instanceof PlayerInstance) && _isShowDangerIcon)
+ if (creature.isPlayer() && _isShowDangerIcon)
{
creature.setInsideZone(ZoneId.DANGER_AREA, true);
}
@@ -148,7 +149,7 @@ public class EffectZone extends ZoneType
@Override
protected void onExit(Creature creature)
{
- if ((creature instanceof PlayerInstance) && _isShowDangerIcon)
+ if (creature.isPlayer() && _isShowDangerIcon)
{
creature.setInsideZone(ZoneId.DANGER_AREA, false);
}
@@ -160,11 +161,6 @@ public class EffectZone extends ZoneType
}
}
- protected Skill getSkill(int skillId, int skillLevel)
- {
- return SkillTable.getInstance().getSkill(skillId, skillLevel);
- }
-
public int getChance()
{
return _chance;
@@ -226,9 +222,9 @@ public class EffectZone extends ZoneType
_enabled = value;
}
- class ApplySkill implements Runnable
+ private class ApplySkill implements Runnable
{
- ApplySkill()
+ protected ApplySkill()
{
if (_skills == null)
{
@@ -239,35 +235,30 @@ public class EffectZone extends ZoneType
@Override
public void run()
{
- if (_enabled)
+ if (!isEnabled())
{
- for (Creature temp : getCharactersInside())
+ return;
+ }
+
+ if (getCharactersInside().isEmpty())
+ {
+ _task.cancel(false);
+ _task = null;
+ return;
+ }
+
+ for (Creature character : getCharactersInside())
+ {
+ if ((character != null) && character.isPlayer() && !character.isDead() && (Rnd.get(100) < _chance))
{
- if ((temp != null) && !temp.isDead())
+ for (Entry e : _skills.entrySet())
{
- if (!(temp instanceof Playable))
+ final Skill skill = SkillTable.getInstance().getSkill(e.getKey().intValue(), e.getValue().intValue());
+ if ((skill != null) && skill.checkCondition(character, character, false))
{
- continue;
- }
-
- if (Rnd.get(100) < _chance)
- {
- for (Entry e : _skills.entrySet())
+ if (character.getFirstEffect(e.getKey()) == null)
{
- final Skill skill = getSkill(e.getKey(), e.getValue());
- if (skill == null)
- {
- LOGGER.warning("ATTENTION: Skill " + e.getKey() + " cannot be loaded.. Verify Skill definition into data/stats/skill folder...");
- continue;
- }
-
- if (skill.checkCondition(temp, temp, false))
- {
- if (temp.getFirstEffect(e.getKey()) == null)
- {
- skill.getEffects(temp, temp);
- }
- }
+ skill.getEffects(character, character);
}
}
}
diff --git a/L2J_Mobius_C6_Interlude/java/org/l2jmobius/gameserver/model/zone/type/DamageZone.java b/L2J_Mobius_C6_Interlude/java/org/l2jmobius/gameserver/model/zone/type/DamageZone.java
index 55e01ac9ae..c7a5b03d86 100644
--- a/L2J_Mobius_C6_Interlude/java/org/l2jmobius/gameserver/model/zone/type/DamageZone.java
+++ b/L2J_Mobius_C6_Interlude/java/org/l2jmobius/gameserver/model/zone/type/DamageZone.java
@@ -20,7 +20,6 @@ import java.util.concurrent.Future;
import org.l2jmobius.commons.concurrent.ThreadPool;
import org.l2jmobius.gameserver.model.actor.Creature;
-import org.l2jmobius.gameserver.model.actor.instance.PlayerInstance;
import org.l2jmobius.gameserver.model.zone.ZoneType;
/**
@@ -30,7 +29,10 @@ import org.l2jmobius.gameserver.model.zone.ZoneType;
public class DamageZone extends ZoneType
{
private int _damagePerSec;
- private Future> _task;
+
+ private final int _startTask;
+ private final int _reuseTask;
+ private volatile Future> _task;
public DamageZone(int id)
{
@@ -38,6 +40,10 @@ public class DamageZone extends ZoneType
// Setup default damage
_damagePerSec = 100;
+
+ // Setup default start / reuse time
+ _startTask = 10;
+ _reuseTask = 5000;
}
@Override
@@ -56,16 +62,25 @@ public class DamageZone extends ZoneType
@Override
protected void onEnter(Creature creature)
{
- if (_task == null)
+ Future> task = _task;
+ if ((task == null) && (_damagePerSec != 0))
{
- _task = ThreadPool.scheduleAtFixedRate(new ApplyDamage(this), 10, 1000);
+
+ synchronized (this)
+ {
+ task = _task;
+ if (task == null)
+ {
+ _task = task = ThreadPool.scheduleAtFixedRate(new ApplyDamage(), _startTask, _reuseTask);
+ }
+ }
}
}
@Override
protected void onExit(Creature creature)
{
- if (getCharactersInside().isEmpty())
+ if (getCharactersInside().isEmpty() && (_task != null))
{
_task.cancel(true);
_task = null;
@@ -77,23 +92,27 @@ public class DamageZone extends ZoneType
return _damagePerSec;
}
- class ApplyDamage implements Runnable
+ private class ApplyDamage implements Runnable
{
- private final DamageZone _dmgZone;
-
- ApplyDamage(DamageZone zone)
+ protected ApplyDamage()
{
- _dmgZone = zone;
}
@Override
public void run()
{
- for (Creature temp : _dmgZone.getCharactersInside())
+ if (getCharactersInside().isEmpty())
{
- if ((temp != null) && !temp.isDead() && (temp instanceof PlayerInstance))
+ _task.cancel(false);
+ _task = null;
+ return;
+ }
+
+ for (Creature character : getCharactersInside())
+ {
+ if ((character != null) && character.isPlayer() && !character.isDead())
{
- temp.reduceCurrentHp(_dmgZone.getDamagePerSecond(), null);
+ character.reduceCurrentHp(getDamagePerSecond(), null);
}
}
}
diff --git a/L2J_Mobius_C6_Interlude/java/org/l2jmobius/gameserver/model/zone/type/EffectZone.java b/L2J_Mobius_C6_Interlude/java/org/l2jmobius/gameserver/model/zone/type/EffectZone.java
index f9211974f3..8b450970c6 100644
--- a/L2J_Mobius_C6_Interlude/java/org/l2jmobius/gameserver/model/zone/type/EffectZone.java
+++ b/L2J_Mobius_C6_Interlude/java/org/l2jmobius/gameserver/model/zone/type/EffectZone.java
@@ -24,18 +24,15 @@ import java.util.logging.Logger;
import org.l2jmobius.commons.concurrent.ThreadPool;
import org.l2jmobius.commons.util.Rnd;
-import org.l2jmobius.commons.util.StringUtil;
import org.l2jmobius.gameserver.data.SkillTable;
import org.l2jmobius.gameserver.model.Skill;
import org.l2jmobius.gameserver.model.actor.Creature;
-import org.l2jmobius.gameserver.model.actor.Playable;
-import org.l2jmobius.gameserver.model.actor.instance.PlayerInstance;
import org.l2jmobius.gameserver.model.zone.ZoneId;
import org.l2jmobius.gameserver.model.zone.ZoneType;
import org.l2jmobius.gameserver.network.serverpackets.EtcStatusUpdate;
/**
- * another type of damage zone with skills
+ * Another type of damage zone with skills.
* @author kerberos
*/
public class EffectZone extends ZoneType
@@ -47,8 +44,8 @@ public class EffectZone extends ZoneType
private int _reuse;
boolean _enabled;
private boolean _isShowDangerIcon;
- private Future> _task;
protected Map _skills;
+ private volatile Future> _task;
public EffectZone(int id)
{
@@ -75,14 +72,19 @@ public class EffectZone extends ZoneType
_initialDelay = Integer.parseInt(value);
break;
}
+ case "reuse":
+ {
+ _reuse = Integer.parseInt(value);
+ break;
+ }
case "defaultStatus":
{
_enabled = Boolean.parseBoolean(value);
break;
}
- case "reuse":
+ case "showDangerIcon":
{
- _reuse = Integer.parseInt(value);
+ _isShowDangerIcon = Boolean.parseBoolean(value);
break;
}
case "skillIdLvl":
@@ -94,7 +96,7 @@ public class EffectZone extends ZoneType
final String[] skillSplit = skill.split("-");
if (skillSplit.length != 2)
{
- LOGGER.warning(StringUtil.concat(getClass().getSimpleName() + ": invalid config property -> skillsIdLvl \"", skill, "\""));
+ LOGGER.warning(getClass().getSimpleName() + ": invalid config property -> skillsIdLvl \"" + skill + "\"");
}
else
{
@@ -106,22 +108,16 @@ public class EffectZone extends ZoneType
{
if (!skill.isEmpty())
{
- LOGGER.warning(StringUtil.concat(getClass().getSimpleName() + ": invalid config property -> skillsIdLvl \"", skillSplit[0], "\"", skillSplit[1]));
+ LOGGER.warning(getClass().getSimpleName() + ": invalid config property -> skillsIdLvl \"" + skillSplit[0] + "\"" + skillSplit[1]);
}
}
}
}
break;
}
- case "showDangerIcon":
- {
- _isShowDangerIcon = Boolean.parseBoolean(value);
- break;
- }
default:
{
super.setParameter(name, value);
- break;
}
}
}
@@ -129,33 +125,38 @@ public class EffectZone extends ZoneType
@Override
protected void onEnter(Creature creature)
{
- if ((_skills != null) && (_task == null))
+ if (_skills != null)
{
- synchronized (this)
+ Future> task = _task;
+ if (task == null)
{
- if (_task == null)
+ synchronized (this)
{
- _task = ThreadPool.scheduleAtFixedRate(new ApplySkill(), _initialDelay, _reuse);
+ task = _task;
+ if (task == null)
+ {
+ _task = task = ThreadPool.scheduleAtFixedRate(new ApplySkill(), _initialDelay, _reuse);
+ }
}
}
}
- if ((creature instanceof PlayerInstance) && _isShowDangerIcon)
+ if (creature.isPlayer() && _isShowDangerIcon)
{
creature.setInsideZone(ZoneId.DANGER_AREA, true);
- creature.sendPacket(new EtcStatusUpdate((PlayerInstance) creature));
+ creature.sendPacket(new EtcStatusUpdate(creature.getActingPlayer()));
}
}
@Override
protected void onExit(Creature creature)
{
- if ((creature instanceof PlayerInstance) && _isShowDangerIcon)
+ if (creature.isPlayer() && _isShowDangerIcon)
{
creature.setInsideZone(ZoneId.DANGER_AREA, false);
if (!creature.isInsideZone(ZoneId.DANGER_AREA))
{
- creature.sendPacket(new EtcStatusUpdate((PlayerInstance) creature));
+ creature.sendPacket(new EtcStatusUpdate(creature.getActingPlayer()));
}
}
@@ -166,11 +167,6 @@ public class EffectZone extends ZoneType
}
}
- protected Skill getSkill(int skillId, int skillLevel)
- {
- return SkillTable.getInstance().getSkill(skillId, skillLevel);
- }
-
public int getChance()
{
return _chance;
@@ -232,9 +228,9 @@ public class EffectZone extends ZoneType
_enabled = value;
}
- class ApplySkill implements Runnable
+ private class ApplySkill implements Runnable
{
- ApplySkill()
+ protected ApplySkill()
{
if (_skills == null)
{
@@ -245,35 +241,30 @@ public class EffectZone extends ZoneType
@Override
public void run()
{
- if (_enabled)
+ if (!isEnabled())
{
- for (Creature temp : getCharactersInside())
+ return;
+ }
+
+ if (getCharactersInside().isEmpty())
+ {
+ _task.cancel(false);
+ _task = null;
+ return;
+ }
+
+ for (Creature character : getCharactersInside())
+ {
+ if ((character != null) && character.isPlayer() && !character.isDead() && (Rnd.get(100) < _chance))
{
- if ((temp != null) && !temp.isDead())
+ for (Entry e : _skills.entrySet())
{
- if (!(temp instanceof Playable))
+ final Skill skill = SkillTable.getInstance().getSkill(e.getKey().intValue(), e.getValue().intValue());
+ if ((skill != null) && skill.checkCondition(character, character, false))
{
- continue;
- }
-
- if (Rnd.get(100) < _chance)
- {
- for (Entry e : _skills.entrySet())
+ if (character.getFirstEffect(e.getKey()) == null)
{
- final Skill skill = getSkill(e.getKey(), e.getValue());
- if (skill == null)
- {
- LOGGER.warning("ATTENTION: Skill " + e.getKey() + " cannot be loaded.. Verify Skill definition into data/stats/skill folder...");
- continue;
- }
-
- if (skill.checkCondition(temp, temp, false))
- {
- if (temp.getFirstEffect(e.getKey()) == null)
- {
- skill.getEffects(temp, temp);
- }
- }
+ skill.getEffects(character, character);
}
}
}
diff --git a/L2J_Mobius_CT_2.4_Epilogue/java/org/l2jmobius/gameserver/model/zone/TaskZoneSettings.java b/L2J_Mobius_CT_2.4_Epilogue/java/org/l2jmobius/gameserver/model/zone/TaskZoneSettings.java
deleted file mode 100644
index facc7f731b..0000000000
--- a/L2J_Mobius_CT_2.4_Epilogue/java/org/l2jmobius/gameserver/model/zone/TaskZoneSettings.java
+++ /dev/null
@@ -1,56 +0,0 @@
-/*
- * This file is part of the L2J Mobius project.
- *
- * 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 .
- */
-package org.l2jmobius.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);
- _task = null;
- }
- }
-}
diff --git a/L2J_Mobius_CT_2.4_Epilogue/java/org/l2jmobius/gameserver/model/zone/type/DamageZone.java b/L2J_Mobius_CT_2.4_Epilogue/java/org/l2jmobius/gameserver/model/zone/type/DamageZone.java
index aa540023dc..8ac41e05ff 100644
--- a/L2J_Mobius_CT_2.4_Epilogue/java/org/l2jmobius/gameserver/model/zone/type/DamageZone.java
+++ b/L2J_Mobius_CT_2.4_Epilogue/java/org/l2jmobius/gameserver/model/zone/type/DamageZone.java
@@ -16,16 +16,15 @@
*/
package org.l2jmobius.gameserver.model.zone.type;
+import java.util.concurrent.Future;
+
import org.l2jmobius.commons.concurrent.ThreadPool;
import org.l2jmobius.gameserver.enums.InstanceType;
import org.l2jmobius.gameserver.instancemanager.CastleManager;
-import org.l2jmobius.gameserver.instancemanager.ZoneManager;
import org.l2jmobius.gameserver.model.actor.Creature;
import org.l2jmobius.gameserver.model.actor.instance.PlayerInstance;
import org.l2jmobius.gameserver.model.siege.Castle;
import org.l2jmobius.gameserver.model.stats.Stat;
-import org.l2jmobius.gameserver.model.zone.AbstractZoneSettings;
-import org.l2jmobius.gameserver.model.zone.TaskZoneSettings;
import org.l2jmobius.gameserver.model.zone.ZoneType;
/**
@@ -42,6 +41,7 @@ public class DamageZone extends ZoneType
private int _startTask;
private int _reuseTask;
+ private volatile Future> _task;
public DamageZone(int id)
{
@@ -58,19 +58,8 @@ public class DamageZone extends ZoneType
// no castle by default
_castleId = 0;
_castle = null;
+
setTargetType(InstanceType.Playable); // 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
@@ -105,22 +94,26 @@ public class DamageZone extends ZoneType
@Override
protected void onEnter(Creature creature)
{
- if ((getSettings().getTask() != null) || ((_damageHPPerSec == 0) && (_damageMPPerSec == 0)))
+ Future> task = _task;
+ if ((task == null) && ((_damageHPPerSec != 0) || (_damageMPPerSec != 0)))
{
- return;
- }
-
- final PlayerInstance player = creature.getActingPlayer();
- if ((getCastle() != null) && (!getCastle().getSiege().isInProgress() || (player == null) || (player.getSiegeState() == 2)))
- {
- return;
- }
-
- synchronized (this)
- {
- if (getSettings().getTask() == null)
+ final PlayerInstance player = creature.getActingPlayer();
+ final Castle castle = getCastle();
+ if (castle != null) // Castle zone
{
- getSettings().setTask(ThreadPool.scheduleAtFixedRate(new ApplyDamage(this), _startTask, _reuseTask));
+ if (!(castle.getSiege().isInProgress() && (player != null) && (player.getSiegeState() != 2))) // Siege and no defender
+ {
+ return;
+ }
+ }
+
+ synchronized (this)
+ {
+ task = _task;
+ if (task == null)
+ {
+ _task = task = ThreadPool.scheduleAtFixedRate(new ApplyDamage(), _startTask, _reuseTask);
+ }
}
}
}
@@ -128,9 +121,10 @@ public class DamageZone extends ZoneType
@Override
protected void onExit(Creature creature)
{
- if (getCharactersInside().isEmpty() && (getSettings().getTask() != null))
+ if (getCharactersInside().isEmpty() && (_task != null))
{
- getSettings().clear();
+ _task.cancel(true);
+ _task = null;
}
}
@@ -153,15 +147,13 @@ public class DamageZone extends ZoneType
return _castle;
}
- private final class ApplyDamage implements Runnable
+ private class ApplyDamage implements Runnable
{
- private final DamageZone _dmgZone;
private final Castle _castle;
- protected ApplyDamage(DamageZone zone)
+ protected ApplyDamage()
{
- _dmgZone = zone;
- _castle = zone.getCastle();
+ _castle = getCastle();
}
@Override
@@ -172,40 +164,49 @@ public class DamageZone extends ZoneType
return;
}
+ if (getCharactersInside().isEmpty())
+ {
+ _task.cancel(false);
+ _task = null;
+ return;
+ }
+
boolean siege = false;
+
if (_castle != null)
{
siege = _castle.getSiege().isInProgress();
// castle zones active only during siege
if (!siege)
{
- _dmgZone.getSettings().clear();
+ _task.cancel(false);
+ _task = null;
return;
}
}
- for (Creature temp : _dmgZone.getCharactersInside())
+ for (Creature character : getCharactersInside())
{
- if ((temp != null) && !temp.isDead())
+ if ((character != null) && character.isPlayer() && !character.isDead())
{
if (siege)
{
// during siege defenders not affected
- final PlayerInstance player = temp.getActingPlayer();
+ final PlayerInstance player = character.getActingPlayer();
if ((player != null) && player.isInSiege() && (player.getSiegeState() == 2))
{
continue;
}
}
- final double multiplier = 1 + (temp.calcStat(Stat.DAMAGE_ZONE_VULN, 0, null, null) / 100);
+ final double multiplier = 1 + (character.calcStat(Stat.DAMAGE_ZONE_VULN, 0, null, null) / 100);
if (getHPDamagePerSecond() != 0)
{
- temp.reduceCurrentHp(_dmgZone.getHPDamagePerSecond() * multiplier, temp, null);
+ character.reduceCurrentHp(getHPDamagePerSecond() * multiplier, character, null);
}
if (getMPDamagePerSecond() != 0)
{
- temp.reduceCurrentMp(_dmgZone.getMPDamagePerSecond() * multiplier);
+ character.reduceCurrentMp(getMPDamagePerSecond() * multiplier);
}
}
}
diff --git a/L2J_Mobius_CT_2.4_Epilogue/java/org/l2jmobius/gameserver/model/zone/type/EffectZone.java b/L2J_Mobius_CT_2.4_Epilogue/java/org/l2jmobius/gameserver/model/zone/type/EffectZone.java
index 4c746afaf4..56b89672fe 100644
--- a/L2J_Mobius_CT_2.4_Epilogue/java/org/l2jmobius/gameserver/model/zone/type/EffectZone.java
+++ b/L2J_Mobius_CT_2.4_Epilogue/java/org/l2jmobius/gameserver/model/zone/type/EffectZone.java
@@ -19,22 +19,20 @@ package org.l2jmobius.gameserver.model.zone.type;
import java.util.Map;
import java.util.Map.Entry;
import java.util.concurrent.ConcurrentHashMap;
+import java.util.concurrent.Future;
import org.l2jmobius.commons.concurrent.ThreadPool;
import org.l2jmobius.commons.util.Rnd;
import org.l2jmobius.gameserver.data.xml.SkillData;
import org.l2jmobius.gameserver.enums.InstanceType;
-import org.l2jmobius.gameserver.instancemanager.ZoneManager;
import org.l2jmobius.gameserver.model.actor.Creature;
import org.l2jmobius.gameserver.model.skills.Skill;
-import org.l2jmobius.gameserver.model.zone.AbstractZoneSettings;
-import org.l2jmobius.gameserver.model.zone.TaskZoneSettings;
import org.l2jmobius.gameserver.model.zone.ZoneId;
import org.l2jmobius.gameserver.model.zone.ZoneType;
import org.l2jmobius.gameserver.network.serverpackets.EtcStatusUpdate;
/**
- * another type of damage zone with skills
+ * Another type of damage zone with skills.
* @author kerberos
*/
public class EffectZone extends ZoneType
@@ -45,6 +43,7 @@ public class EffectZone extends ZoneType
protected boolean _bypassConditions;
private boolean _isShowDangerIcon;
protected Map _skills;
+ private volatile Future> _task;
public EffectZone(int id)
{
@@ -55,101 +54,106 @@ public class EffectZone extends ZoneType
setTargetType(InstanceType.Playable); // default only playable
_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
public void setParameter(String name, String value)
{
- if (name.equals("chance"))
+ switch (name)
{
- _chance = Integer.parseInt(value);
- }
- else if (name.equals("initialDelay"))
- {
- _initialDelay = Integer.parseInt(value);
- }
- else if (name.equals("reuse"))
- {
- _reuse = Integer.parseInt(value);
- }
- else if (name.equals("bypassSkillConditions"))
- {
- _bypassConditions = Boolean.parseBoolean(value);
- }
- else if (name.equals("maxDynamicSkillCount"))
- {
- _skills = new ConcurrentHashMap<>(Integer.parseInt(value));
- }
- else if (name.equals("skillIdLvl"))
- {
- final String[] propertySplit = value.split(";");
- _skills = new ConcurrentHashMap<>(propertySplit.length);
- for (String skill : propertySplit)
+ case "chance":
{
- final String[] skillSplit = skill.split("-");
- if (skillSplit.length != 2)
+ _chance = Integer.parseInt(value);
+ break;
+ }
+ case "initialDelay":
+ {
+ _initialDelay = Integer.parseInt(value);
+ break;
+ }
+ case "reuse":
+ {
+ _reuse = Integer.parseInt(value);
+ break;
+ }
+ case "bypassSkillConditions":
+ {
+ _bypassConditions = Boolean.parseBoolean(value);
+ break;
+ }
+ case "maxDynamicSkillCount":
+ {
+ _skills = new ConcurrentHashMap<>(Integer.parseInt(value));
+ break;
+ }
+ case "showDangerIcon":
+ {
+ _isShowDangerIcon = Boolean.parseBoolean(value);
+ break;
+ }
+ case "skillIdLvl":
+ {
+ final String[] propertySplit = value.split(";");
+ _skills = new ConcurrentHashMap<>(propertySplit.length);
+ for (String skill : propertySplit)
{
- LOGGER.warning(getClass().getSimpleName() + ": invalid config property -> skillsIdLvl \"" + skill + "\"");
- }
- else
- {
- try
+ final String[] skillSplit = skill.split("-");
+ if (skillSplit.length != 2)
{
- _skills.put(Integer.parseInt(skillSplit[0]), Integer.parseInt(skillSplit[1]));
+ LOGGER.warning(getClass().getSimpleName() + ": invalid config property -> skillsIdLvl \"" + skill + "\"");
}
- catch (NumberFormatException nfe)
+ else
{
- if (!skill.isEmpty())
+ try
{
- LOGGER.warning(getClass().getSimpleName() + ": invalid config property -> skillsIdLvl \"" + skillSplit[0] + "\"" + skillSplit[1]);
+ _skills.put(Integer.parseInt(skillSplit[0]), Integer.parseInt(skillSplit[1]));
+ }
+ catch (NumberFormatException nfe)
+ {
+ if (!skill.isEmpty())
+ {
+ LOGGER.warning(getClass().getSimpleName() + ": invalid config property -> skillsIdLvl \"" + skillSplit[0] + "\"" + skillSplit[1]);
+ }
}
}
}
+ break;
+ }
+ default:
+ {
+ super.setParameter(name, value);
}
- }
- else if (name.equals("showDangerIcon"))
- {
- _isShowDangerIcon = Boolean.parseBoolean(value);
- }
- else
- {
- super.setParameter(name, value);
}
}
@Override
protected void onEnter(Creature creature)
{
- if ((_skills != null) && (getSettings().getTask() == null))
+ if (_skills != null)
{
- synchronized (this)
+ Future> task = _task;
+ if (task == null)
{
- getSettings().setTask(ThreadPool.scheduleAtFixedRate(new ApplySkill(), _initialDelay, _reuse));
+ synchronized (this)
+ {
+ task = _task;
+ if (task == null)
+ {
+ _task = task = ThreadPool.scheduleAtFixedRate(new ApplySkill(), _initialDelay, _reuse);
+ }
+ }
}
}
- if (!creature.isPlayer())
+
+ if (creature.isPlayer())
{
- return;
+ creature.setInsideZone(ZoneId.ALTERED, true);
+ if (_isShowDangerIcon)
+ {
+ creature.setInsideZone(ZoneId.DANGER_AREA, true);
+ creature.sendPacket(new EtcStatusUpdate(creature.getActingPlayer()));
+ }
}
- creature.setInsideZone(ZoneId.ALTERED, true);
- if (!_isShowDangerIcon)
- {
- return;
- }
- creature.setInsideZone(ZoneId.DANGER_AREA, true);
- creature.sendPacket(new EtcStatusUpdate(creature.getActingPlayer()));
}
@Override
@@ -167,17 +171,14 @@ public class EffectZone extends ZoneType
}
}
}
- if (getCharactersInside().isEmpty() && (getSettings().getTask() != null))
+
+ if (getCharactersInside().isEmpty() && (_task != null))
{
- getSettings().clear();
+ _task.cancel(true);
+ _task = null;
}
}
- protected Skill getSkill(int skillId, int skillLevel)
- {
- return SkillData.getInstance().getSkill(skillId, skillLevel);
- }
-
public int getChance()
{
return _chance;
@@ -195,7 +196,10 @@ public class EffectZone extends ZoneType
{
synchronized (this)
{
- _skills = new ConcurrentHashMap<>(3);
+ if (_skills == null)
+ {
+ _skills = new ConcurrentHashMap<>(3);
+ }
}
}
_skills.put(skillId, skillLevel);
@@ -219,10 +223,14 @@ public class EffectZone extends ZoneType
public int getSkillLevel(int skillId)
{
- return (_skills == null) || !_skills.containsKey(skillId) ? 0 : _skills.get(skillId);
+ if ((_skills == null) || !_skills.containsKey(skillId))
+ {
+ return 0;
+ }
+ return _skills.get(skillId);
}
- private final class ApplySkill implements Runnable
+ private class ApplySkill implements Runnable
{
protected ApplySkill()
{
@@ -235,18 +243,30 @@ public class EffectZone extends ZoneType
@Override
public void run()
{
- if (isEnabled())
+ if (!isEnabled())
{
- for (Creature temp : getCharactersInside())
+ return;
+ }
+
+ if (getCharactersInside().isEmpty())
+ {
+ _task.cancel(false);
+ _task = null;
+ return;
+ }
+
+ for (Creature character : getCharactersInside())
+ {
+ if ((character != null) && character.isPlayer() && !character.isDead() && (Rnd.get(100) < _chance))
{
- if ((temp != null) && !temp.isDead() && (Rnd.get(100) < _chance))
+ for (Entry e : _skills.entrySet())
{
- for (Entry e : _skills.entrySet())
+ final Skill skill = SkillData.getInstance().getSkill(e.getKey().intValue(), e.getValue().intValue());
+ if ((skill != null) && (_bypassConditions || skill.checkCondition(character, character, false)))
{
- final Skill skill = getSkill(e.getKey(), e.getValue());
- if ((skill != null) && (_bypassConditions || skill.checkCondition(temp, temp, false)) && !temp.isAffectedBySkill(e.getKey()))
+ if (!character.isAffectedBySkill(skill.getId()))
{
- skill.applyEffects(temp, temp);
+ skill.applyEffects(character, character);
}
}
}
diff --git a/L2J_Mobius_CT_2.6_HighFive/java/org/l2jmobius/gameserver/model/zone/TaskZoneSettings.java b/L2J_Mobius_CT_2.6_HighFive/java/org/l2jmobius/gameserver/model/zone/TaskZoneSettings.java
deleted file mode 100644
index facc7f731b..0000000000
--- a/L2J_Mobius_CT_2.6_HighFive/java/org/l2jmobius/gameserver/model/zone/TaskZoneSettings.java
+++ /dev/null
@@ -1,56 +0,0 @@
-/*
- * This file is part of the L2J Mobius project.
- *
- * 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 .
- */
-package org.l2jmobius.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);
- _task = null;
- }
- }
-}
diff --git a/L2J_Mobius_CT_2.6_HighFive/java/org/l2jmobius/gameserver/model/zone/type/DamageZone.java b/L2J_Mobius_CT_2.6_HighFive/java/org/l2jmobius/gameserver/model/zone/type/DamageZone.java
index aa540023dc..8ac41e05ff 100644
--- a/L2J_Mobius_CT_2.6_HighFive/java/org/l2jmobius/gameserver/model/zone/type/DamageZone.java
+++ b/L2J_Mobius_CT_2.6_HighFive/java/org/l2jmobius/gameserver/model/zone/type/DamageZone.java
@@ -16,16 +16,15 @@
*/
package org.l2jmobius.gameserver.model.zone.type;
+import java.util.concurrent.Future;
+
import org.l2jmobius.commons.concurrent.ThreadPool;
import org.l2jmobius.gameserver.enums.InstanceType;
import org.l2jmobius.gameserver.instancemanager.CastleManager;
-import org.l2jmobius.gameserver.instancemanager.ZoneManager;
import org.l2jmobius.gameserver.model.actor.Creature;
import org.l2jmobius.gameserver.model.actor.instance.PlayerInstance;
import org.l2jmobius.gameserver.model.siege.Castle;
import org.l2jmobius.gameserver.model.stats.Stat;
-import org.l2jmobius.gameserver.model.zone.AbstractZoneSettings;
-import org.l2jmobius.gameserver.model.zone.TaskZoneSettings;
import org.l2jmobius.gameserver.model.zone.ZoneType;
/**
@@ -42,6 +41,7 @@ public class DamageZone extends ZoneType
private int _startTask;
private int _reuseTask;
+ private volatile Future> _task;
public DamageZone(int id)
{
@@ -58,19 +58,8 @@ public class DamageZone extends ZoneType
// no castle by default
_castleId = 0;
_castle = null;
+
setTargetType(InstanceType.Playable); // 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
@@ -105,22 +94,26 @@ public class DamageZone extends ZoneType
@Override
protected void onEnter(Creature creature)
{
- if ((getSettings().getTask() != null) || ((_damageHPPerSec == 0) && (_damageMPPerSec == 0)))
+ Future> task = _task;
+ if ((task == null) && ((_damageHPPerSec != 0) || (_damageMPPerSec != 0)))
{
- return;
- }
-
- final PlayerInstance player = creature.getActingPlayer();
- if ((getCastle() != null) && (!getCastle().getSiege().isInProgress() || (player == null) || (player.getSiegeState() == 2)))
- {
- return;
- }
-
- synchronized (this)
- {
- if (getSettings().getTask() == null)
+ final PlayerInstance player = creature.getActingPlayer();
+ final Castle castle = getCastle();
+ if (castle != null) // Castle zone
{
- getSettings().setTask(ThreadPool.scheduleAtFixedRate(new ApplyDamage(this), _startTask, _reuseTask));
+ if (!(castle.getSiege().isInProgress() && (player != null) && (player.getSiegeState() != 2))) // Siege and no defender
+ {
+ return;
+ }
+ }
+
+ synchronized (this)
+ {
+ task = _task;
+ if (task == null)
+ {
+ _task = task = ThreadPool.scheduleAtFixedRate(new ApplyDamage(), _startTask, _reuseTask);
+ }
}
}
}
@@ -128,9 +121,10 @@ public class DamageZone extends ZoneType
@Override
protected void onExit(Creature creature)
{
- if (getCharactersInside().isEmpty() && (getSettings().getTask() != null))
+ if (getCharactersInside().isEmpty() && (_task != null))
{
- getSettings().clear();
+ _task.cancel(true);
+ _task = null;
}
}
@@ -153,15 +147,13 @@ public class DamageZone extends ZoneType
return _castle;
}
- private final class ApplyDamage implements Runnable
+ private class ApplyDamage implements Runnable
{
- private final DamageZone _dmgZone;
private final Castle _castle;
- protected ApplyDamage(DamageZone zone)
+ protected ApplyDamage()
{
- _dmgZone = zone;
- _castle = zone.getCastle();
+ _castle = getCastle();
}
@Override
@@ -172,40 +164,49 @@ public class DamageZone extends ZoneType
return;
}
+ if (getCharactersInside().isEmpty())
+ {
+ _task.cancel(false);
+ _task = null;
+ return;
+ }
+
boolean siege = false;
+
if (_castle != null)
{
siege = _castle.getSiege().isInProgress();
// castle zones active only during siege
if (!siege)
{
- _dmgZone.getSettings().clear();
+ _task.cancel(false);
+ _task = null;
return;
}
}
- for (Creature temp : _dmgZone.getCharactersInside())
+ for (Creature character : getCharactersInside())
{
- if ((temp != null) && !temp.isDead())
+ if ((character != null) && character.isPlayer() && !character.isDead())
{
if (siege)
{
// during siege defenders not affected
- final PlayerInstance player = temp.getActingPlayer();
+ final PlayerInstance player = character.getActingPlayer();
if ((player != null) && player.isInSiege() && (player.getSiegeState() == 2))
{
continue;
}
}
- final double multiplier = 1 + (temp.calcStat(Stat.DAMAGE_ZONE_VULN, 0, null, null) / 100);
+ final double multiplier = 1 + (character.calcStat(Stat.DAMAGE_ZONE_VULN, 0, null, null) / 100);
if (getHPDamagePerSecond() != 0)
{
- temp.reduceCurrentHp(_dmgZone.getHPDamagePerSecond() * multiplier, temp, null);
+ character.reduceCurrentHp(getHPDamagePerSecond() * multiplier, character, null);
}
if (getMPDamagePerSecond() != 0)
{
- temp.reduceCurrentMp(_dmgZone.getMPDamagePerSecond() * multiplier);
+ character.reduceCurrentMp(getMPDamagePerSecond() * multiplier);
}
}
}
diff --git a/L2J_Mobius_CT_2.6_HighFive/java/org/l2jmobius/gameserver/model/zone/type/EffectZone.java b/L2J_Mobius_CT_2.6_HighFive/java/org/l2jmobius/gameserver/model/zone/type/EffectZone.java
index 4c746afaf4..56b89672fe 100644
--- a/L2J_Mobius_CT_2.6_HighFive/java/org/l2jmobius/gameserver/model/zone/type/EffectZone.java
+++ b/L2J_Mobius_CT_2.6_HighFive/java/org/l2jmobius/gameserver/model/zone/type/EffectZone.java
@@ -19,22 +19,20 @@ package org.l2jmobius.gameserver.model.zone.type;
import java.util.Map;
import java.util.Map.Entry;
import java.util.concurrent.ConcurrentHashMap;
+import java.util.concurrent.Future;
import org.l2jmobius.commons.concurrent.ThreadPool;
import org.l2jmobius.commons.util.Rnd;
import org.l2jmobius.gameserver.data.xml.SkillData;
import org.l2jmobius.gameserver.enums.InstanceType;
-import org.l2jmobius.gameserver.instancemanager.ZoneManager;
import org.l2jmobius.gameserver.model.actor.Creature;
import org.l2jmobius.gameserver.model.skills.Skill;
-import org.l2jmobius.gameserver.model.zone.AbstractZoneSettings;
-import org.l2jmobius.gameserver.model.zone.TaskZoneSettings;
import org.l2jmobius.gameserver.model.zone.ZoneId;
import org.l2jmobius.gameserver.model.zone.ZoneType;
import org.l2jmobius.gameserver.network.serverpackets.EtcStatusUpdate;
/**
- * another type of damage zone with skills
+ * Another type of damage zone with skills.
* @author kerberos
*/
public class EffectZone extends ZoneType
@@ -45,6 +43,7 @@ public class EffectZone extends ZoneType
protected boolean _bypassConditions;
private boolean _isShowDangerIcon;
protected Map _skills;
+ private volatile Future> _task;
public EffectZone(int id)
{
@@ -55,101 +54,106 @@ public class EffectZone extends ZoneType
setTargetType(InstanceType.Playable); // default only playable
_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
public void setParameter(String name, String value)
{
- if (name.equals("chance"))
+ switch (name)
{
- _chance = Integer.parseInt(value);
- }
- else if (name.equals("initialDelay"))
- {
- _initialDelay = Integer.parseInt(value);
- }
- else if (name.equals("reuse"))
- {
- _reuse = Integer.parseInt(value);
- }
- else if (name.equals("bypassSkillConditions"))
- {
- _bypassConditions = Boolean.parseBoolean(value);
- }
- else if (name.equals("maxDynamicSkillCount"))
- {
- _skills = new ConcurrentHashMap<>(Integer.parseInt(value));
- }
- else if (name.equals("skillIdLvl"))
- {
- final String[] propertySplit = value.split(";");
- _skills = new ConcurrentHashMap<>(propertySplit.length);
- for (String skill : propertySplit)
+ case "chance":
{
- final String[] skillSplit = skill.split("-");
- if (skillSplit.length != 2)
+ _chance = Integer.parseInt(value);
+ break;
+ }
+ case "initialDelay":
+ {
+ _initialDelay = Integer.parseInt(value);
+ break;
+ }
+ case "reuse":
+ {
+ _reuse = Integer.parseInt(value);
+ break;
+ }
+ case "bypassSkillConditions":
+ {
+ _bypassConditions = Boolean.parseBoolean(value);
+ break;
+ }
+ case "maxDynamicSkillCount":
+ {
+ _skills = new ConcurrentHashMap<>(Integer.parseInt(value));
+ break;
+ }
+ case "showDangerIcon":
+ {
+ _isShowDangerIcon = Boolean.parseBoolean(value);
+ break;
+ }
+ case "skillIdLvl":
+ {
+ final String[] propertySplit = value.split(";");
+ _skills = new ConcurrentHashMap<>(propertySplit.length);
+ for (String skill : propertySplit)
{
- LOGGER.warning(getClass().getSimpleName() + ": invalid config property -> skillsIdLvl \"" + skill + "\"");
- }
- else
- {
- try
+ final String[] skillSplit = skill.split("-");
+ if (skillSplit.length != 2)
{
- _skills.put(Integer.parseInt(skillSplit[0]), Integer.parseInt(skillSplit[1]));
+ LOGGER.warning(getClass().getSimpleName() + ": invalid config property -> skillsIdLvl \"" + skill + "\"");
}
- catch (NumberFormatException nfe)
+ else
{
- if (!skill.isEmpty())
+ try
{
- LOGGER.warning(getClass().getSimpleName() + ": invalid config property -> skillsIdLvl \"" + skillSplit[0] + "\"" + skillSplit[1]);
+ _skills.put(Integer.parseInt(skillSplit[0]), Integer.parseInt(skillSplit[1]));
+ }
+ catch (NumberFormatException nfe)
+ {
+ if (!skill.isEmpty())
+ {
+ LOGGER.warning(getClass().getSimpleName() + ": invalid config property -> skillsIdLvl \"" + skillSplit[0] + "\"" + skillSplit[1]);
+ }
}
}
}
+ break;
+ }
+ default:
+ {
+ super.setParameter(name, value);
}
- }
- else if (name.equals("showDangerIcon"))
- {
- _isShowDangerIcon = Boolean.parseBoolean(value);
- }
- else
- {
- super.setParameter(name, value);
}
}
@Override
protected void onEnter(Creature creature)
{
- if ((_skills != null) && (getSettings().getTask() == null))
+ if (_skills != null)
{
- synchronized (this)
+ Future> task = _task;
+ if (task == null)
{
- getSettings().setTask(ThreadPool.scheduleAtFixedRate(new ApplySkill(), _initialDelay, _reuse));
+ synchronized (this)
+ {
+ task = _task;
+ if (task == null)
+ {
+ _task = task = ThreadPool.scheduleAtFixedRate(new ApplySkill(), _initialDelay, _reuse);
+ }
+ }
}
}
- if (!creature.isPlayer())
+
+ if (creature.isPlayer())
{
- return;
+ creature.setInsideZone(ZoneId.ALTERED, true);
+ if (_isShowDangerIcon)
+ {
+ creature.setInsideZone(ZoneId.DANGER_AREA, true);
+ creature.sendPacket(new EtcStatusUpdate(creature.getActingPlayer()));
+ }
}
- creature.setInsideZone(ZoneId.ALTERED, true);
- if (!_isShowDangerIcon)
- {
- return;
- }
- creature.setInsideZone(ZoneId.DANGER_AREA, true);
- creature.sendPacket(new EtcStatusUpdate(creature.getActingPlayer()));
}
@Override
@@ -167,17 +171,14 @@ public class EffectZone extends ZoneType
}
}
}
- if (getCharactersInside().isEmpty() && (getSettings().getTask() != null))
+
+ if (getCharactersInside().isEmpty() && (_task != null))
{
- getSettings().clear();
+ _task.cancel(true);
+ _task = null;
}
}
- protected Skill getSkill(int skillId, int skillLevel)
- {
- return SkillData.getInstance().getSkill(skillId, skillLevel);
- }
-
public int getChance()
{
return _chance;
@@ -195,7 +196,10 @@ public class EffectZone extends ZoneType
{
synchronized (this)
{
- _skills = new ConcurrentHashMap<>(3);
+ if (_skills == null)
+ {
+ _skills = new ConcurrentHashMap<>(3);
+ }
}
}
_skills.put(skillId, skillLevel);
@@ -219,10 +223,14 @@ public class EffectZone extends ZoneType
public int getSkillLevel(int skillId)
{
- return (_skills == null) || !_skills.containsKey(skillId) ? 0 : _skills.get(skillId);
+ if ((_skills == null) || !_skills.containsKey(skillId))
+ {
+ return 0;
+ }
+ return _skills.get(skillId);
}
- private final class ApplySkill implements Runnable
+ private class ApplySkill implements Runnable
{
protected ApplySkill()
{
@@ -235,18 +243,30 @@ public class EffectZone extends ZoneType
@Override
public void run()
{
- if (isEnabled())
+ if (!isEnabled())
{
- for (Creature temp : getCharactersInside())
+ return;
+ }
+
+ if (getCharactersInside().isEmpty())
+ {
+ _task.cancel(false);
+ _task = null;
+ return;
+ }
+
+ for (Creature character : getCharactersInside())
+ {
+ if ((character != null) && character.isPlayer() && !character.isDead() && (Rnd.get(100) < _chance))
{
- if ((temp != null) && !temp.isDead() && (Rnd.get(100) < _chance))
+ for (Entry e : _skills.entrySet())
{
- for (Entry e : _skills.entrySet())
+ final Skill skill = SkillData.getInstance().getSkill(e.getKey().intValue(), e.getValue().intValue());
+ if ((skill != null) && (_bypassConditions || skill.checkCondition(character, character, false)))
{
- final Skill skill = getSkill(e.getKey(), e.getValue());
- if ((skill != null) && (_bypassConditions || skill.checkCondition(temp, temp, false)) && !temp.isAffectedBySkill(e.getKey()))
+ if (!character.isAffectedBySkill(skill.getId()))
{
- skill.applyEffects(temp, temp);
+ skill.applyEffects(character, character);
}
}
}
diff --git a/L2J_Mobius_Classic_2.0_Saviors/java/org/l2jmobius/gameserver/model/zone/TaskZoneSettings.java b/L2J_Mobius_Classic_2.0_Saviors/java/org/l2jmobius/gameserver/model/zone/TaskZoneSettings.java
deleted file mode 100644
index facc7f731b..0000000000
--- a/L2J_Mobius_Classic_2.0_Saviors/java/org/l2jmobius/gameserver/model/zone/TaskZoneSettings.java
+++ /dev/null
@@ -1,56 +0,0 @@
-/*
- * This file is part of the L2J Mobius project.
- *
- * 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 .
- */
-package org.l2jmobius.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);
- _task = null;
- }
- }
-}
diff --git a/L2J_Mobius_Classic_2.0_Saviors/java/org/l2jmobius/gameserver/model/zone/type/DamageZone.java b/L2J_Mobius_Classic_2.0_Saviors/java/org/l2jmobius/gameserver/model/zone/type/DamageZone.java
index 13b533a54f..ce5daa2ab3 100644
--- a/L2J_Mobius_Classic_2.0_Saviors/java/org/l2jmobius/gameserver/model/zone/type/DamageZone.java
+++ b/L2J_Mobius_Classic_2.0_Saviors/java/org/l2jmobius/gameserver/model/zone/type/DamageZone.java
@@ -16,16 +16,15 @@
*/
package org.l2jmobius.gameserver.model.zone.type;
+import java.util.concurrent.Future;
+
import org.l2jmobius.commons.concurrent.ThreadPool;
import org.l2jmobius.gameserver.enums.InstanceType;
import org.l2jmobius.gameserver.instancemanager.CastleManager;
-import org.l2jmobius.gameserver.instancemanager.ZoneManager;
import org.l2jmobius.gameserver.model.actor.Creature;
import org.l2jmobius.gameserver.model.actor.instance.PlayerInstance;
import org.l2jmobius.gameserver.model.siege.Castle;
import org.l2jmobius.gameserver.model.stats.Stat;
-import org.l2jmobius.gameserver.model.zone.AbstractZoneSettings;
-import org.l2jmobius.gameserver.model.zone.TaskZoneSettings;
import org.l2jmobius.gameserver.model.zone.ZoneType;
/**
@@ -42,6 +41,7 @@ public class DamageZone extends ZoneType
private int _startTask;
private int _reuseTask;
+ private volatile Future> _task;
public DamageZone(int id)
{
@@ -60,18 +60,6 @@ public class DamageZone extends ZoneType
_castle = null;
setTargetType(InstanceType.Playable); // 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
@@ -106,12 +94,14 @@ public class DamageZone extends ZoneType
@Override
protected void onEnter(Creature creature)
{
- if ((getSettings().getTask() == null) && ((_damageHPPerSec != 0) || (_damageMPPerSec != 0)))
+ Future> task = _task;
+ if ((task == null) && ((_damageHPPerSec != 0) || (_damageMPPerSec != 0)))
{
final PlayerInstance player = creature.getActingPlayer();
- if (getCastle() != null) // Castle zone
+ final Castle castle = getCastle();
+ if (castle != null) // Castle zone
{
- if (!(getCastle().getSiege().isInProgress() && (player != null) && (player.getSiegeState() != 2))) // Siege and no defender
+ if (!(castle.getSiege().isInProgress() && (player != null) && (player.getSiegeState() != 2))) // Siege and no defender
{
return;
}
@@ -119,9 +109,10 @@ public class DamageZone extends ZoneType
synchronized (this)
{
- if (getSettings().getTask() == null)
+ task = _task;
+ if (task == null)
{
- getSettings().setTask(ThreadPool.scheduleAtFixedRate(new ApplyDamage(this), _startTask, _reuseTask));
+ _task = task = ThreadPool.scheduleAtFixedRate(new ApplyDamage(), _startTask, _reuseTask);
}
}
}
@@ -130,9 +121,10 @@ public class DamageZone extends ZoneType
@Override
protected void onExit(Creature creature)
{
- if (getCharactersInside().isEmpty() && (getSettings().getTask() != null))
+ if (getCharactersInside().isEmpty() && (_task != null))
{
- getSettings().clear();
+ _task.cancel(true);
+ _task = null;
}
}
@@ -152,19 +144,16 @@ public class DamageZone extends ZoneType
{
_castle = CastleManager.getInstance().getCastleById(_castleId);
}
-
return _castle;
}
- private final class ApplyDamage implements Runnable
+ private class ApplyDamage implements Runnable
{
- private final DamageZone _dmgZone;
private final Castle _castle;
- protected ApplyDamage(DamageZone zone)
+ protected ApplyDamage()
{
- _dmgZone = zone;
- _castle = zone.getCastle();
+ _castle = getCastle();
}
@Override
@@ -175,6 +164,13 @@ public class DamageZone extends ZoneType
return;
}
+ if (getCharactersInside().isEmpty())
+ {
+ _task.cancel(false);
+ _task = null;
+ return;
+ }
+
boolean siege = false;
if (_castle != null)
@@ -183,34 +179,34 @@ public class DamageZone extends ZoneType
// castle zones active only during siege
if (!siege)
{
- _dmgZone.getSettings().clear();
+ _task.cancel(false);
+ _task = null;
return;
}
}
- for (Creature temp : _dmgZone.getCharactersInside())
+ for (Creature character : getCharactersInside())
{
- if ((temp != null) && !temp.isDead())
+ if ((character != null) && character.isPlayer() && !character.isDead())
{
if (siege)
{
// during siege defenders not affected
- final PlayerInstance player = temp.getActingPlayer();
+ final PlayerInstance player = character.getActingPlayer();
if ((player != null) && player.isInSiege() && (player.getSiegeState() == 2))
{
continue;
}
}
- final double multiplier = 1 + (temp.getStat().getValue(Stat.DAMAGE_ZONE_VULN, 0) / 100);
-
+ final double multiplier = 1 + (character.getStat().getValue(Stat.DAMAGE_ZONE_VULN, 0) / 100);
if (getHPDamagePerSecond() != 0)
{
- temp.reduceCurrentHp(_dmgZone.getHPDamagePerSecond() * multiplier, temp, null);
+ character.reduceCurrentHp(getHPDamagePerSecond() * multiplier, character, null);
}
if (getMPDamagePerSecond() != 0)
{
- temp.reduceCurrentMp(_dmgZone.getMPDamagePerSecond() * multiplier);
+ character.reduceCurrentMp(getMPDamagePerSecond() * multiplier);
}
}
}
diff --git a/L2J_Mobius_Classic_2.0_Saviors/java/org/l2jmobius/gameserver/model/zone/type/EffectZone.java b/L2J_Mobius_Classic_2.0_Saviors/java/org/l2jmobius/gameserver/model/zone/type/EffectZone.java
index 40257410ad..b179fcd242 100644
--- a/L2J_Mobius_Classic_2.0_Saviors/java/org/l2jmobius/gameserver/model/zone/type/EffectZone.java
+++ b/L2J_Mobius_Classic_2.0_Saviors/java/org/l2jmobius/gameserver/model/zone/type/EffectZone.java
@@ -19,22 +19,20 @@ package org.l2jmobius.gameserver.model.zone.type;
import java.util.Map;
import java.util.Map.Entry;
import java.util.concurrent.ConcurrentHashMap;
+import java.util.concurrent.Future;
import org.l2jmobius.commons.concurrent.ThreadPool;
import org.l2jmobius.commons.util.Rnd;
import org.l2jmobius.gameserver.data.xml.SkillData;
import org.l2jmobius.gameserver.enums.InstanceType;
-import org.l2jmobius.gameserver.instancemanager.ZoneManager;
import org.l2jmobius.gameserver.model.actor.Creature;
import org.l2jmobius.gameserver.model.skills.Skill;
-import org.l2jmobius.gameserver.model.zone.AbstractZoneSettings;
-import org.l2jmobius.gameserver.model.zone.TaskZoneSettings;
import org.l2jmobius.gameserver.model.zone.ZoneId;
import org.l2jmobius.gameserver.model.zone.ZoneType;
import org.l2jmobius.gameserver.network.serverpackets.EtcStatusUpdate;
/**
- * another type of damage zone with skills
+ * Another type of damage zone with skills.
* @author kerberos
*/
public class EffectZone extends ZoneType
@@ -45,6 +43,7 @@ public class EffectZone extends ZoneType
protected boolean _bypassConditions;
private boolean _isShowDangerIcon;
protected Map _skills;
+ private volatile Future> _task;
public EffectZone(int id)
{
@@ -55,18 +54,6 @@ public class EffectZone extends ZoneType
setTargetType(InstanceType.Playable); // default only playable
_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
@@ -144,13 +131,15 @@ public class EffectZone extends ZoneType
{
if (_skills != null)
{
- if (getSettings().getTask() == null)
+ Future> task = _task;
+ if (task == null)
{
synchronized (this)
{
- if (getSettings().getTask() == null)
+ task = _task;
+ if (task == null)
{
- getSettings().setTask(ThreadPool.scheduleAtFixedRate(new ApplySkill(), _initialDelay, _reuse));
+ _task = task = ThreadPool.scheduleAtFixedRate(new ApplySkill(), _initialDelay, _reuse);
}
}
}
@@ -183,9 +172,10 @@ public class EffectZone extends ZoneType
}
}
- if (getCharactersInside().isEmpty() && (getSettings().getTask() != null))
+ if (getCharactersInside().isEmpty() && (_task != null))
{
- getSettings().clear();
+ _task.cancel(true);
+ _task = null;
}
}
@@ -240,7 +230,7 @@ public class EffectZone extends ZoneType
return _skills.get(skillId);
}
- private final class ApplySkill implements Runnable
+ private class ApplySkill implements Runnable
{
protected ApplySkill()
{
@@ -253,25 +243,34 @@ public class EffectZone extends ZoneType
@Override
public void run()
{
- if (isEnabled())
+ if (!isEnabled())
{
- getCharactersInside().forEach(character ->
+ return;
+ }
+
+ if (getCharactersInside().isEmpty())
+ {
+ _task.cancel(false);
+ _task = null;
+ return;
+ }
+
+ for (Creature character : getCharactersInside())
+ {
+ if ((character != null) && character.isPlayer() && !character.isDead() && (Rnd.get(100) < _chance))
{
- if ((character != null) && !character.isDead() && (Rnd.get(100) < _chance))
+ for (Entry e : _skills.entrySet())
{
- for (Entry e : _skills.entrySet())
+ final Skill skill = SkillData.getInstance().getSkill(e.getKey().intValue(), e.getValue().intValue());
+ if ((skill != null) && (_bypassConditions || skill.checkCondition(character, character)))
{
- final Skill skill = SkillData.getInstance().getSkill(e.getKey(), e.getValue());
- if ((skill != null) && (_bypassConditions || skill.checkCondition(character, character)))
+ if (character.getAffectedSkillLevel(skill.getId()) < skill.getLevel())
{
- if (character.getAffectedSkillLevel(skill.getId()) < skill.getLevel())
- {
- skill.activateSkill(character, character);
- }
+ skill.activateSkill(character, character);
}
}
}
- });
+ }
}
}
}
diff --git a/L2J_Mobius_Classic_2.1_Zaken/java/org/l2jmobius/gameserver/model/zone/TaskZoneSettings.java b/L2J_Mobius_Classic_2.1_Zaken/java/org/l2jmobius/gameserver/model/zone/TaskZoneSettings.java
deleted file mode 100644
index facc7f731b..0000000000
--- a/L2J_Mobius_Classic_2.1_Zaken/java/org/l2jmobius/gameserver/model/zone/TaskZoneSettings.java
+++ /dev/null
@@ -1,56 +0,0 @@
-/*
- * This file is part of the L2J Mobius project.
- *
- * 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 .
- */
-package org.l2jmobius.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);
- _task = null;
- }
- }
-}
diff --git a/L2J_Mobius_Classic_2.1_Zaken/java/org/l2jmobius/gameserver/model/zone/type/DamageZone.java b/L2J_Mobius_Classic_2.1_Zaken/java/org/l2jmobius/gameserver/model/zone/type/DamageZone.java
index 13b533a54f..ce5daa2ab3 100644
--- a/L2J_Mobius_Classic_2.1_Zaken/java/org/l2jmobius/gameserver/model/zone/type/DamageZone.java
+++ b/L2J_Mobius_Classic_2.1_Zaken/java/org/l2jmobius/gameserver/model/zone/type/DamageZone.java
@@ -16,16 +16,15 @@
*/
package org.l2jmobius.gameserver.model.zone.type;
+import java.util.concurrent.Future;
+
import org.l2jmobius.commons.concurrent.ThreadPool;
import org.l2jmobius.gameserver.enums.InstanceType;
import org.l2jmobius.gameserver.instancemanager.CastleManager;
-import org.l2jmobius.gameserver.instancemanager.ZoneManager;
import org.l2jmobius.gameserver.model.actor.Creature;
import org.l2jmobius.gameserver.model.actor.instance.PlayerInstance;
import org.l2jmobius.gameserver.model.siege.Castle;
import org.l2jmobius.gameserver.model.stats.Stat;
-import org.l2jmobius.gameserver.model.zone.AbstractZoneSettings;
-import org.l2jmobius.gameserver.model.zone.TaskZoneSettings;
import org.l2jmobius.gameserver.model.zone.ZoneType;
/**
@@ -42,6 +41,7 @@ public class DamageZone extends ZoneType
private int _startTask;
private int _reuseTask;
+ private volatile Future> _task;
public DamageZone(int id)
{
@@ -60,18 +60,6 @@ public class DamageZone extends ZoneType
_castle = null;
setTargetType(InstanceType.Playable); // 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
@@ -106,12 +94,14 @@ public class DamageZone extends ZoneType
@Override
protected void onEnter(Creature creature)
{
- if ((getSettings().getTask() == null) && ((_damageHPPerSec != 0) || (_damageMPPerSec != 0)))
+ Future> task = _task;
+ if ((task == null) && ((_damageHPPerSec != 0) || (_damageMPPerSec != 0)))
{
final PlayerInstance player = creature.getActingPlayer();
- if (getCastle() != null) // Castle zone
+ final Castle castle = getCastle();
+ if (castle != null) // Castle zone
{
- if (!(getCastle().getSiege().isInProgress() && (player != null) && (player.getSiegeState() != 2))) // Siege and no defender
+ if (!(castle.getSiege().isInProgress() && (player != null) && (player.getSiegeState() != 2))) // Siege and no defender
{
return;
}
@@ -119,9 +109,10 @@ public class DamageZone extends ZoneType
synchronized (this)
{
- if (getSettings().getTask() == null)
+ task = _task;
+ if (task == null)
{
- getSettings().setTask(ThreadPool.scheduleAtFixedRate(new ApplyDamage(this), _startTask, _reuseTask));
+ _task = task = ThreadPool.scheduleAtFixedRate(new ApplyDamage(), _startTask, _reuseTask);
}
}
}
@@ -130,9 +121,10 @@ public class DamageZone extends ZoneType
@Override
protected void onExit(Creature creature)
{
- if (getCharactersInside().isEmpty() && (getSettings().getTask() != null))
+ if (getCharactersInside().isEmpty() && (_task != null))
{
- getSettings().clear();
+ _task.cancel(true);
+ _task = null;
}
}
@@ -152,19 +144,16 @@ public class DamageZone extends ZoneType
{
_castle = CastleManager.getInstance().getCastleById(_castleId);
}
-
return _castle;
}
- private final class ApplyDamage implements Runnable
+ private class ApplyDamage implements Runnable
{
- private final DamageZone _dmgZone;
private final Castle _castle;
- protected ApplyDamage(DamageZone zone)
+ protected ApplyDamage()
{
- _dmgZone = zone;
- _castle = zone.getCastle();
+ _castle = getCastle();
}
@Override
@@ -175,6 +164,13 @@ public class DamageZone extends ZoneType
return;
}
+ if (getCharactersInside().isEmpty())
+ {
+ _task.cancel(false);
+ _task = null;
+ return;
+ }
+
boolean siege = false;
if (_castle != null)
@@ -183,34 +179,34 @@ public class DamageZone extends ZoneType
// castle zones active only during siege
if (!siege)
{
- _dmgZone.getSettings().clear();
+ _task.cancel(false);
+ _task = null;
return;
}
}
- for (Creature temp : _dmgZone.getCharactersInside())
+ for (Creature character : getCharactersInside())
{
- if ((temp != null) && !temp.isDead())
+ if ((character != null) && character.isPlayer() && !character.isDead())
{
if (siege)
{
// during siege defenders not affected
- final PlayerInstance player = temp.getActingPlayer();
+ final PlayerInstance player = character.getActingPlayer();
if ((player != null) && player.isInSiege() && (player.getSiegeState() == 2))
{
continue;
}
}
- final double multiplier = 1 + (temp.getStat().getValue(Stat.DAMAGE_ZONE_VULN, 0) / 100);
-
+ final double multiplier = 1 + (character.getStat().getValue(Stat.DAMAGE_ZONE_VULN, 0) / 100);
if (getHPDamagePerSecond() != 0)
{
- temp.reduceCurrentHp(_dmgZone.getHPDamagePerSecond() * multiplier, temp, null);
+ character.reduceCurrentHp(getHPDamagePerSecond() * multiplier, character, null);
}
if (getMPDamagePerSecond() != 0)
{
- temp.reduceCurrentMp(_dmgZone.getMPDamagePerSecond() * multiplier);
+ character.reduceCurrentMp(getMPDamagePerSecond() * multiplier);
}
}
}
diff --git a/L2J_Mobius_Classic_2.1_Zaken/java/org/l2jmobius/gameserver/model/zone/type/EffectZone.java b/L2J_Mobius_Classic_2.1_Zaken/java/org/l2jmobius/gameserver/model/zone/type/EffectZone.java
index 40257410ad..b179fcd242 100644
--- a/L2J_Mobius_Classic_2.1_Zaken/java/org/l2jmobius/gameserver/model/zone/type/EffectZone.java
+++ b/L2J_Mobius_Classic_2.1_Zaken/java/org/l2jmobius/gameserver/model/zone/type/EffectZone.java
@@ -19,22 +19,20 @@ package org.l2jmobius.gameserver.model.zone.type;
import java.util.Map;
import java.util.Map.Entry;
import java.util.concurrent.ConcurrentHashMap;
+import java.util.concurrent.Future;
import org.l2jmobius.commons.concurrent.ThreadPool;
import org.l2jmobius.commons.util.Rnd;
import org.l2jmobius.gameserver.data.xml.SkillData;
import org.l2jmobius.gameserver.enums.InstanceType;
-import org.l2jmobius.gameserver.instancemanager.ZoneManager;
import org.l2jmobius.gameserver.model.actor.Creature;
import org.l2jmobius.gameserver.model.skills.Skill;
-import org.l2jmobius.gameserver.model.zone.AbstractZoneSettings;
-import org.l2jmobius.gameserver.model.zone.TaskZoneSettings;
import org.l2jmobius.gameserver.model.zone.ZoneId;
import org.l2jmobius.gameserver.model.zone.ZoneType;
import org.l2jmobius.gameserver.network.serverpackets.EtcStatusUpdate;
/**
- * another type of damage zone with skills
+ * Another type of damage zone with skills.
* @author kerberos
*/
public class EffectZone extends ZoneType
@@ -45,6 +43,7 @@ public class EffectZone extends ZoneType
protected boolean _bypassConditions;
private boolean _isShowDangerIcon;
protected Map _skills;
+ private volatile Future> _task;
public EffectZone(int id)
{
@@ -55,18 +54,6 @@ public class EffectZone extends ZoneType
setTargetType(InstanceType.Playable); // default only playable
_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
@@ -144,13 +131,15 @@ public class EffectZone extends ZoneType
{
if (_skills != null)
{
- if (getSettings().getTask() == null)
+ Future> task = _task;
+ if (task == null)
{
synchronized (this)
{
- if (getSettings().getTask() == null)
+ task = _task;
+ if (task == null)
{
- getSettings().setTask(ThreadPool.scheduleAtFixedRate(new ApplySkill(), _initialDelay, _reuse));
+ _task = task = ThreadPool.scheduleAtFixedRate(new ApplySkill(), _initialDelay, _reuse);
}
}
}
@@ -183,9 +172,10 @@ public class EffectZone extends ZoneType
}
}
- if (getCharactersInside().isEmpty() && (getSettings().getTask() != null))
+ if (getCharactersInside().isEmpty() && (_task != null))
{
- getSettings().clear();
+ _task.cancel(true);
+ _task = null;
}
}
@@ -240,7 +230,7 @@ public class EffectZone extends ZoneType
return _skills.get(skillId);
}
- private final class ApplySkill implements Runnable
+ private class ApplySkill implements Runnable
{
protected ApplySkill()
{
@@ -253,25 +243,34 @@ public class EffectZone extends ZoneType
@Override
public void run()
{
- if (isEnabled())
+ if (!isEnabled())
{
- getCharactersInside().forEach(character ->
+ return;
+ }
+
+ if (getCharactersInside().isEmpty())
+ {
+ _task.cancel(false);
+ _task = null;
+ return;
+ }
+
+ for (Creature character : getCharactersInside())
+ {
+ if ((character != null) && character.isPlayer() && !character.isDead() && (Rnd.get(100) < _chance))
{
- if ((character != null) && !character.isDead() && (Rnd.get(100) < _chance))
+ for (Entry e : _skills.entrySet())
{
- for (Entry e : _skills.entrySet())
+ final Skill skill = SkillData.getInstance().getSkill(e.getKey().intValue(), e.getValue().intValue());
+ if ((skill != null) && (_bypassConditions || skill.checkCondition(character, character)))
{
- final Skill skill = SkillData.getInstance().getSkill(e.getKey(), e.getValue());
- if ((skill != null) && (_bypassConditions || skill.checkCondition(character, character)))
+ if (character.getAffectedSkillLevel(skill.getId()) < skill.getLevel())
{
- if (character.getAffectedSkillLevel(skill.getId()) < skill.getLevel())
- {
- skill.activateSkill(character, character);
- }
+ skill.activateSkill(character, character);
}
}
}
- });
+ }
}
}
}
diff --git a/L2J_Mobius_Classic_2.2_Antharas/java/org/l2jmobius/gameserver/model/zone/TaskZoneSettings.java b/L2J_Mobius_Classic_2.2_Antharas/java/org/l2jmobius/gameserver/model/zone/TaskZoneSettings.java
deleted file mode 100644
index facc7f731b..0000000000
--- a/L2J_Mobius_Classic_2.2_Antharas/java/org/l2jmobius/gameserver/model/zone/TaskZoneSettings.java
+++ /dev/null
@@ -1,56 +0,0 @@
-/*
- * This file is part of the L2J Mobius project.
- *
- * 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 .
- */
-package org.l2jmobius.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);
- _task = null;
- }
- }
-}
diff --git a/L2J_Mobius_Classic_2.2_Antharas/java/org/l2jmobius/gameserver/model/zone/type/DamageZone.java b/L2J_Mobius_Classic_2.2_Antharas/java/org/l2jmobius/gameserver/model/zone/type/DamageZone.java
index 13b533a54f..ce5daa2ab3 100644
--- a/L2J_Mobius_Classic_2.2_Antharas/java/org/l2jmobius/gameserver/model/zone/type/DamageZone.java
+++ b/L2J_Mobius_Classic_2.2_Antharas/java/org/l2jmobius/gameserver/model/zone/type/DamageZone.java
@@ -16,16 +16,15 @@
*/
package org.l2jmobius.gameserver.model.zone.type;
+import java.util.concurrent.Future;
+
import org.l2jmobius.commons.concurrent.ThreadPool;
import org.l2jmobius.gameserver.enums.InstanceType;
import org.l2jmobius.gameserver.instancemanager.CastleManager;
-import org.l2jmobius.gameserver.instancemanager.ZoneManager;
import org.l2jmobius.gameserver.model.actor.Creature;
import org.l2jmobius.gameserver.model.actor.instance.PlayerInstance;
import org.l2jmobius.gameserver.model.siege.Castle;
import org.l2jmobius.gameserver.model.stats.Stat;
-import org.l2jmobius.gameserver.model.zone.AbstractZoneSettings;
-import org.l2jmobius.gameserver.model.zone.TaskZoneSettings;
import org.l2jmobius.gameserver.model.zone.ZoneType;
/**
@@ -42,6 +41,7 @@ public class DamageZone extends ZoneType
private int _startTask;
private int _reuseTask;
+ private volatile Future> _task;
public DamageZone(int id)
{
@@ -60,18 +60,6 @@ public class DamageZone extends ZoneType
_castle = null;
setTargetType(InstanceType.Playable); // 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
@@ -106,12 +94,14 @@ public class DamageZone extends ZoneType
@Override
protected void onEnter(Creature creature)
{
- if ((getSettings().getTask() == null) && ((_damageHPPerSec != 0) || (_damageMPPerSec != 0)))
+ Future> task = _task;
+ if ((task == null) && ((_damageHPPerSec != 0) || (_damageMPPerSec != 0)))
{
final PlayerInstance player = creature.getActingPlayer();
- if (getCastle() != null) // Castle zone
+ final Castle castle = getCastle();
+ if (castle != null) // Castle zone
{
- if (!(getCastle().getSiege().isInProgress() && (player != null) && (player.getSiegeState() != 2))) // Siege and no defender
+ if (!(castle.getSiege().isInProgress() && (player != null) && (player.getSiegeState() != 2))) // Siege and no defender
{
return;
}
@@ -119,9 +109,10 @@ public class DamageZone extends ZoneType
synchronized (this)
{
- if (getSettings().getTask() == null)
+ task = _task;
+ if (task == null)
{
- getSettings().setTask(ThreadPool.scheduleAtFixedRate(new ApplyDamage(this), _startTask, _reuseTask));
+ _task = task = ThreadPool.scheduleAtFixedRate(new ApplyDamage(), _startTask, _reuseTask);
}
}
}
@@ -130,9 +121,10 @@ public class DamageZone extends ZoneType
@Override
protected void onExit(Creature creature)
{
- if (getCharactersInside().isEmpty() && (getSettings().getTask() != null))
+ if (getCharactersInside().isEmpty() && (_task != null))
{
- getSettings().clear();
+ _task.cancel(true);
+ _task = null;
}
}
@@ -152,19 +144,16 @@ public class DamageZone extends ZoneType
{
_castle = CastleManager.getInstance().getCastleById(_castleId);
}
-
return _castle;
}
- private final class ApplyDamage implements Runnable
+ private class ApplyDamage implements Runnable
{
- private final DamageZone _dmgZone;
private final Castle _castle;
- protected ApplyDamage(DamageZone zone)
+ protected ApplyDamage()
{
- _dmgZone = zone;
- _castle = zone.getCastle();
+ _castle = getCastle();
}
@Override
@@ -175,6 +164,13 @@ public class DamageZone extends ZoneType
return;
}
+ if (getCharactersInside().isEmpty())
+ {
+ _task.cancel(false);
+ _task = null;
+ return;
+ }
+
boolean siege = false;
if (_castle != null)
@@ -183,34 +179,34 @@ public class DamageZone extends ZoneType
// castle zones active only during siege
if (!siege)
{
- _dmgZone.getSettings().clear();
+ _task.cancel(false);
+ _task = null;
return;
}
}
- for (Creature temp : _dmgZone.getCharactersInside())
+ for (Creature character : getCharactersInside())
{
- if ((temp != null) && !temp.isDead())
+ if ((character != null) && character.isPlayer() && !character.isDead())
{
if (siege)
{
// during siege defenders not affected
- final PlayerInstance player = temp.getActingPlayer();
+ final PlayerInstance player = character.getActingPlayer();
if ((player != null) && player.isInSiege() && (player.getSiegeState() == 2))
{
continue;
}
}
- final double multiplier = 1 + (temp.getStat().getValue(Stat.DAMAGE_ZONE_VULN, 0) / 100);
-
+ final double multiplier = 1 + (character.getStat().getValue(Stat.DAMAGE_ZONE_VULN, 0) / 100);
if (getHPDamagePerSecond() != 0)
{
- temp.reduceCurrentHp(_dmgZone.getHPDamagePerSecond() * multiplier, temp, null);
+ character.reduceCurrentHp(getHPDamagePerSecond() * multiplier, character, null);
}
if (getMPDamagePerSecond() != 0)
{
- temp.reduceCurrentMp(_dmgZone.getMPDamagePerSecond() * multiplier);
+ character.reduceCurrentMp(getMPDamagePerSecond() * multiplier);
}
}
}
diff --git a/L2J_Mobius_Classic_2.2_Antharas/java/org/l2jmobius/gameserver/model/zone/type/EffectZone.java b/L2J_Mobius_Classic_2.2_Antharas/java/org/l2jmobius/gameserver/model/zone/type/EffectZone.java
index 40257410ad..b179fcd242 100644
--- a/L2J_Mobius_Classic_2.2_Antharas/java/org/l2jmobius/gameserver/model/zone/type/EffectZone.java
+++ b/L2J_Mobius_Classic_2.2_Antharas/java/org/l2jmobius/gameserver/model/zone/type/EffectZone.java
@@ -19,22 +19,20 @@ package org.l2jmobius.gameserver.model.zone.type;
import java.util.Map;
import java.util.Map.Entry;
import java.util.concurrent.ConcurrentHashMap;
+import java.util.concurrent.Future;
import org.l2jmobius.commons.concurrent.ThreadPool;
import org.l2jmobius.commons.util.Rnd;
import org.l2jmobius.gameserver.data.xml.SkillData;
import org.l2jmobius.gameserver.enums.InstanceType;
-import org.l2jmobius.gameserver.instancemanager.ZoneManager;
import org.l2jmobius.gameserver.model.actor.Creature;
import org.l2jmobius.gameserver.model.skills.Skill;
-import org.l2jmobius.gameserver.model.zone.AbstractZoneSettings;
-import org.l2jmobius.gameserver.model.zone.TaskZoneSettings;
import org.l2jmobius.gameserver.model.zone.ZoneId;
import org.l2jmobius.gameserver.model.zone.ZoneType;
import org.l2jmobius.gameserver.network.serverpackets.EtcStatusUpdate;
/**
- * another type of damage zone with skills
+ * Another type of damage zone with skills.
* @author kerberos
*/
public class EffectZone extends ZoneType
@@ -45,6 +43,7 @@ public class EffectZone extends ZoneType
protected boolean _bypassConditions;
private boolean _isShowDangerIcon;
protected Map _skills;
+ private volatile Future> _task;
public EffectZone(int id)
{
@@ -55,18 +54,6 @@ public class EffectZone extends ZoneType
setTargetType(InstanceType.Playable); // default only playable
_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
@@ -144,13 +131,15 @@ public class EffectZone extends ZoneType
{
if (_skills != null)
{
- if (getSettings().getTask() == null)
+ Future> task = _task;
+ if (task == null)
{
synchronized (this)
{
- if (getSettings().getTask() == null)
+ task = _task;
+ if (task == null)
{
- getSettings().setTask(ThreadPool.scheduleAtFixedRate(new ApplySkill(), _initialDelay, _reuse));
+ _task = task = ThreadPool.scheduleAtFixedRate(new ApplySkill(), _initialDelay, _reuse);
}
}
}
@@ -183,9 +172,10 @@ public class EffectZone extends ZoneType
}
}
- if (getCharactersInside().isEmpty() && (getSettings().getTask() != null))
+ if (getCharactersInside().isEmpty() && (_task != null))
{
- getSettings().clear();
+ _task.cancel(true);
+ _task = null;
}
}
@@ -240,7 +230,7 @@ public class EffectZone extends ZoneType
return _skills.get(skillId);
}
- private final class ApplySkill implements Runnable
+ private class ApplySkill implements Runnable
{
protected ApplySkill()
{
@@ -253,25 +243,34 @@ public class EffectZone extends ZoneType
@Override
public void run()
{
- if (isEnabled())
+ if (!isEnabled())
{
- getCharactersInside().forEach(character ->
+ return;
+ }
+
+ if (getCharactersInside().isEmpty())
+ {
+ _task.cancel(false);
+ _task = null;
+ return;
+ }
+
+ for (Creature character : getCharactersInside())
+ {
+ if ((character != null) && character.isPlayer() && !character.isDead() && (Rnd.get(100) < _chance))
{
- if ((character != null) && !character.isDead() && (Rnd.get(100) < _chance))
+ for (Entry e : _skills.entrySet())
{
- for (Entry e : _skills.entrySet())
+ final Skill skill = SkillData.getInstance().getSkill(e.getKey().intValue(), e.getValue().intValue());
+ if ((skill != null) && (_bypassConditions || skill.checkCondition(character, character)))
{
- final Skill skill = SkillData.getInstance().getSkill(e.getKey(), e.getValue());
- if ((skill != null) && (_bypassConditions || skill.checkCondition(character, character)))
+ if (character.getAffectedSkillLevel(skill.getId()) < skill.getLevel())
{
- if (character.getAffectedSkillLevel(skill.getId()) < skill.getLevel())
- {
- skill.activateSkill(character, character);
- }
+ skill.activateSkill(character, character);
}
}
}
- });
+ }
}
}
}
diff --git a/L2J_Mobius_Classic_2.3_SevenSigns/java/org/l2jmobius/gameserver/model/zone/TaskZoneSettings.java b/L2J_Mobius_Classic_2.3_SevenSigns/java/org/l2jmobius/gameserver/model/zone/TaskZoneSettings.java
deleted file mode 100644
index facc7f731b..0000000000
--- a/L2J_Mobius_Classic_2.3_SevenSigns/java/org/l2jmobius/gameserver/model/zone/TaskZoneSettings.java
+++ /dev/null
@@ -1,56 +0,0 @@
-/*
- * This file is part of the L2J Mobius project.
- *
- * 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 .
- */
-package org.l2jmobius.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);
- _task = null;
- }
- }
-}
diff --git a/L2J_Mobius_Classic_2.3_SevenSigns/java/org/l2jmobius/gameserver/model/zone/type/DamageZone.java b/L2J_Mobius_Classic_2.3_SevenSigns/java/org/l2jmobius/gameserver/model/zone/type/DamageZone.java
index 13b533a54f..ce5daa2ab3 100644
--- a/L2J_Mobius_Classic_2.3_SevenSigns/java/org/l2jmobius/gameserver/model/zone/type/DamageZone.java
+++ b/L2J_Mobius_Classic_2.3_SevenSigns/java/org/l2jmobius/gameserver/model/zone/type/DamageZone.java
@@ -16,16 +16,15 @@
*/
package org.l2jmobius.gameserver.model.zone.type;
+import java.util.concurrent.Future;
+
import org.l2jmobius.commons.concurrent.ThreadPool;
import org.l2jmobius.gameserver.enums.InstanceType;
import org.l2jmobius.gameserver.instancemanager.CastleManager;
-import org.l2jmobius.gameserver.instancemanager.ZoneManager;
import org.l2jmobius.gameserver.model.actor.Creature;
import org.l2jmobius.gameserver.model.actor.instance.PlayerInstance;
import org.l2jmobius.gameserver.model.siege.Castle;
import org.l2jmobius.gameserver.model.stats.Stat;
-import org.l2jmobius.gameserver.model.zone.AbstractZoneSettings;
-import org.l2jmobius.gameserver.model.zone.TaskZoneSettings;
import org.l2jmobius.gameserver.model.zone.ZoneType;
/**
@@ -42,6 +41,7 @@ public class DamageZone extends ZoneType
private int _startTask;
private int _reuseTask;
+ private volatile Future> _task;
public DamageZone(int id)
{
@@ -60,18 +60,6 @@ public class DamageZone extends ZoneType
_castle = null;
setTargetType(InstanceType.Playable); // 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
@@ -106,12 +94,14 @@ public class DamageZone extends ZoneType
@Override
protected void onEnter(Creature creature)
{
- if ((getSettings().getTask() == null) && ((_damageHPPerSec != 0) || (_damageMPPerSec != 0)))
+ Future> task = _task;
+ if ((task == null) && ((_damageHPPerSec != 0) || (_damageMPPerSec != 0)))
{
final PlayerInstance player = creature.getActingPlayer();
- if (getCastle() != null) // Castle zone
+ final Castle castle = getCastle();
+ if (castle != null) // Castle zone
{
- if (!(getCastle().getSiege().isInProgress() && (player != null) && (player.getSiegeState() != 2))) // Siege and no defender
+ if (!(castle.getSiege().isInProgress() && (player != null) && (player.getSiegeState() != 2))) // Siege and no defender
{
return;
}
@@ -119,9 +109,10 @@ public class DamageZone extends ZoneType
synchronized (this)
{
- if (getSettings().getTask() == null)
+ task = _task;
+ if (task == null)
{
- getSettings().setTask(ThreadPool.scheduleAtFixedRate(new ApplyDamage(this), _startTask, _reuseTask));
+ _task = task = ThreadPool.scheduleAtFixedRate(new ApplyDamage(), _startTask, _reuseTask);
}
}
}
@@ -130,9 +121,10 @@ public class DamageZone extends ZoneType
@Override
protected void onExit(Creature creature)
{
- if (getCharactersInside().isEmpty() && (getSettings().getTask() != null))
+ if (getCharactersInside().isEmpty() && (_task != null))
{
- getSettings().clear();
+ _task.cancel(true);
+ _task = null;
}
}
@@ -152,19 +144,16 @@ public class DamageZone extends ZoneType
{
_castle = CastleManager.getInstance().getCastleById(_castleId);
}
-
return _castle;
}
- private final class ApplyDamage implements Runnable
+ private class ApplyDamage implements Runnable
{
- private final DamageZone _dmgZone;
private final Castle _castle;
- protected ApplyDamage(DamageZone zone)
+ protected ApplyDamage()
{
- _dmgZone = zone;
- _castle = zone.getCastle();
+ _castle = getCastle();
}
@Override
@@ -175,6 +164,13 @@ public class DamageZone extends ZoneType
return;
}
+ if (getCharactersInside().isEmpty())
+ {
+ _task.cancel(false);
+ _task = null;
+ return;
+ }
+
boolean siege = false;
if (_castle != null)
@@ -183,34 +179,34 @@ public class DamageZone extends ZoneType
// castle zones active only during siege
if (!siege)
{
- _dmgZone.getSettings().clear();
+ _task.cancel(false);
+ _task = null;
return;
}
}
- for (Creature temp : _dmgZone.getCharactersInside())
+ for (Creature character : getCharactersInside())
{
- if ((temp != null) && !temp.isDead())
+ if ((character != null) && character.isPlayer() && !character.isDead())
{
if (siege)
{
// during siege defenders not affected
- final PlayerInstance player = temp.getActingPlayer();
+ final PlayerInstance player = character.getActingPlayer();
if ((player != null) && player.isInSiege() && (player.getSiegeState() == 2))
{
continue;
}
}
- final double multiplier = 1 + (temp.getStat().getValue(Stat.DAMAGE_ZONE_VULN, 0) / 100);
-
+ final double multiplier = 1 + (character.getStat().getValue(Stat.DAMAGE_ZONE_VULN, 0) / 100);
if (getHPDamagePerSecond() != 0)
{
- temp.reduceCurrentHp(_dmgZone.getHPDamagePerSecond() * multiplier, temp, null);
+ character.reduceCurrentHp(getHPDamagePerSecond() * multiplier, character, null);
}
if (getMPDamagePerSecond() != 0)
{
- temp.reduceCurrentMp(_dmgZone.getMPDamagePerSecond() * multiplier);
+ character.reduceCurrentMp(getMPDamagePerSecond() * multiplier);
}
}
}
diff --git a/L2J_Mobius_Classic_2.3_SevenSigns/java/org/l2jmobius/gameserver/model/zone/type/EffectZone.java b/L2J_Mobius_Classic_2.3_SevenSigns/java/org/l2jmobius/gameserver/model/zone/type/EffectZone.java
index 40257410ad..b179fcd242 100644
--- a/L2J_Mobius_Classic_2.3_SevenSigns/java/org/l2jmobius/gameserver/model/zone/type/EffectZone.java
+++ b/L2J_Mobius_Classic_2.3_SevenSigns/java/org/l2jmobius/gameserver/model/zone/type/EffectZone.java
@@ -19,22 +19,20 @@ package org.l2jmobius.gameserver.model.zone.type;
import java.util.Map;
import java.util.Map.Entry;
import java.util.concurrent.ConcurrentHashMap;
+import java.util.concurrent.Future;
import org.l2jmobius.commons.concurrent.ThreadPool;
import org.l2jmobius.commons.util.Rnd;
import org.l2jmobius.gameserver.data.xml.SkillData;
import org.l2jmobius.gameserver.enums.InstanceType;
-import org.l2jmobius.gameserver.instancemanager.ZoneManager;
import org.l2jmobius.gameserver.model.actor.Creature;
import org.l2jmobius.gameserver.model.skills.Skill;
-import org.l2jmobius.gameserver.model.zone.AbstractZoneSettings;
-import org.l2jmobius.gameserver.model.zone.TaskZoneSettings;
import org.l2jmobius.gameserver.model.zone.ZoneId;
import org.l2jmobius.gameserver.model.zone.ZoneType;
import org.l2jmobius.gameserver.network.serverpackets.EtcStatusUpdate;
/**
- * another type of damage zone with skills
+ * Another type of damage zone with skills.
* @author kerberos
*/
public class EffectZone extends ZoneType
@@ -45,6 +43,7 @@ public class EffectZone extends ZoneType
protected boolean _bypassConditions;
private boolean _isShowDangerIcon;
protected Map _skills;
+ private volatile Future> _task;
public EffectZone(int id)
{
@@ -55,18 +54,6 @@ public class EffectZone extends ZoneType
setTargetType(InstanceType.Playable); // default only playable
_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
@@ -144,13 +131,15 @@ public class EffectZone extends ZoneType
{
if (_skills != null)
{
- if (getSettings().getTask() == null)
+ Future> task = _task;
+ if (task == null)
{
synchronized (this)
{
- if (getSettings().getTask() == null)
+ task = _task;
+ if (task == null)
{
- getSettings().setTask(ThreadPool.scheduleAtFixedRate(new ApplySkill(), _initialDelay, _reuse));
+ _task = task = ThreadPool.scheduleAtFixedRate(new ApplySkill(), _initialDelay, _reuse);
}
}
}
@@ -183,9 +172,10 @@ public class EffectZone extends ZoneType
}
}
- if (getCharactersInside().isEmpty() && (getSettings().getTask() != null))
+ if (getCharactersInside().isEmpty() && (_task != null))
{
- getSettings().clear();
+ _task.cancel(true);
+ _task = null;
}
}
@@ -240,7 +230,7 @@ public class EffectZone extends ZoneType
return _skills.get(skillId);
}
- private final class ApplySkill implements Runnable
+ private class ApplySkill implements Runnable
{
protected ApplySkill()
{
@@ -253,25 +243,34 @@ public class EffectZone extends ZoneType
@Override
public void run()
{
- if (isEnabled())
+ if (!isEnabled())
{
- getCharactersInside().forEach(character ->
+ return;
+ }
+
+ if (getCharactersInside().isEmpty())
+ {
+ _task.cancel(false);
+ _task = null;
+ return;
+ }
+
+ for (Creature character : getCharactersInside())
+ {
+ if ((character != null) && character.isPlayer() && !character.isDead() && (Rnd.get(100) < _chance))
{
- if ((character != null) && !character.isDead() && (Rnd.get(100) < _chance))
+ for (Entry e : _skills.entrySet())
{
- for (Entry e : _skills.entrySet())
+ final Skill skill = SkillData.getInstance().getSkill(e.getKey().intValue(), e.getValue().intValue());
+ if ((skill != null) && (_bypassConditions || skill.checkCondition(character, character)))
{
- final Skill skill = SkillData.getInstance().getSkill(e.getKey(), e.getValue());
- if ((skill != null) && (_bypassConditions || skill.checkCondition(character, character)))
+ if (character.getAffectedSkillLevel(skill.getId()) < skill.getLevel())
{
- if (character.getAffectedSkillLevel(skill.getId()) < skill.getLevel())
- {
- skill.activateSkill(character, character);
- }
+ skill.activateSkill(character, character);
}
}
}
- });
+ }
}
}
}
diff --git a/L2J_Mobius_Classic_2.4_SecretOfEmpire/java/org/l2jmobius/gameserver/model/zone/TaskZoneSettings.java b/L2J_Mobius_Classic_2.4_SecretOfEmpire/java/org/l2jmobius/gameserver/model/zone/TaskZoneSettings.java
deleted file mode 100644
index facc7f731b..0000000000
--- a/L2J_Mobius_Classic_2.4_SecretOfEmpire/java/org/l2jmobius/gameserver/model/zone/TaskZoneSettings.java
+++ /dev/null
@@ -1,56 +0,0 @@
-/*
- * This file is part of the L2J Mobius project.
- *
- * 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 .
- */
-package org.l2jmobius.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);
- _task = null;
- }
- }
-}
diff --git a/L2J_Mobius_Classic_2.4_SecretOfEmpire/java/org/l2jmobius/gameserver/model/zone/type/DamageZone.java b/L2J_Mobius_Classic_2.4_SecretOfEmpire/java/org/l2jmobius/gameserver/model/zone/type/DamageZone.java
index 13b533a54f..ce5daa2ab3 100644
--- a/L2J_Mobius_Classic_2.4_SecretOfEmpire/java/org/l2jmobius/gameserver/model/zone/type/DamageZone.java
+++ b/L2J_Mobius_Classic_2.4_SecretOfEmpire/java/org/l2jmobius/gameserver/model/zone/type/DamageZone.java
@@ -16,16 +16,15 @@
*/
package org.l2jmobius.gameserver.model.zone.type;
+import java.util.concurrent.Future;
+
import org.l2jmobius.commons.concurrent.ThreadPool;
import org.l2jmobius.gameserver.enums.InstanceType;
import org.l2jmobius.gameserver.instancemanager.CastleManager;
-import org.l2jmobius.gameserver.instancemanager.ZoneManager;
import org.l2jmobius.gameserver.model.actor.Creature;
import org.l2jmobius.gameserver.model.actor.instance.PlayerInstance;
import org.l2jmobius.gameserver.model.siege.Castle;
import org.l2jmobius.gameserver.model.stats.Stat;
-import org.l2jmobius.gameserver.model.zone.AbstractZoneSettings;
-import org.l2jmobius.gameserver.model.zone.TaskZoneSettings;
import org.l2jmobius.gameserver.model.zone.ZoneType;
/**
@@ -42,6 +41,7 @@ public class DamageZone extends ZoneType
private int _startTask;
private int _reuseTask;
+ private volatile Future> _task;
public DamageZone(int id)
{
@@ -60,18 +60,6 @@ public class DamageZone extends ZoneType
_castle = null;
setTargetType(InstanceType.Playable); // 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
@@ -106,12 +94,14 @@ public class DamageZone extends ZoneType
@Override
protected void onEnter(Creature creature)
{
- if ((getSettings().getTask() == null) && ((_damageHPPerSec != 0) || (_damageMPPerSec != 0)))
+ Future> task = _task;
+ if ((task == null) && ((_damageHPPerSec != 0) || (_damageMPPerSec != 0)))
{
final PlayerInstance player = creature.getActingPlayer();
- if (getCastle() != null) // Castle zone
+ final Castle castle = getCastle();
+ if (castle != null) // Castle zone
{
- if (!(getCastle().getSiege().isInProgress() && (player != null) && (player.getSiegeState() != 2))) // Siege and no defender
+ if (!(castle.getSiege().isInProgress() && (player != null) && (player.getSiegeState() != 2))) // Siege and no defender
{
return;
}
@@ -119,9 +109,10 @@ public class DamageZone extends ZoneType
synchronized (this)
{
- if (getSettings().getTask() == null)
+ task = _task;
+ if (task == null)
{
- getSettings().setTask(ThreadPool.scheduleAtFixedRate(new ApplyDamage(this), _startTask, _reuseTask));
+ _task = task = ThreadPool.scheduleAtFixedRate(new ApplyDamage(), _startTask, _reuseTask);
}
}
}
@@ -130,9 +121,10 @@ public class DamageZone extends ZoneType
@Override
protected void onExit(Creature creature)
{
- if (getCharactersInside().isEmpty() && (getSettings().getTask() != null))
+ if (getCharactersInside().isEmpty() && (_task != null))
{
- getSettings().clear();
+ _task.cancel(true);
+ _task = null;
}
}
@@ -152,19 +144,16 @@ public class DamageZone extends ZoneType
{
_castle = CastleManager.getInstance().getCastleById(_castleId);
}
-
return _castle;
}
- private final class ApplyDamage implements Runnable
+ private class ApplyDamage implements Runnable
{
- private final DamageZone _dmgZone;
private final Castle _castle;
- protected ApplyDamage(DamageZone zone)
+ protected ApplyDamage()
{
- _dmgZone = zone;
- _castle = zone.getCastle();
+ _castle = getCastle();
}
@Override
@@ -175,6 +164,13 @@ public class DamageZone extends ZoneType
return;
}
+ if (getCharactersInside().isEmpty())
+ {
+ _task.cancel(false);
+ _task = null;
+ return;
+ }
+
boolean siege = false;
if (_castle != null)
@@ -183,34 +179,34 @@ public class DamageZone extends ZoneType
// castle zones active only during siege
if (!siege)
{
- _dmgZone.getSettings().clear();
+ _task.cancel(false);
+ _task = null;
return;
}
}
- for (Creature temp : _dmgZone.getCharactersInside())
+ for (Creature character : getCharactersInside())
{
- if ((temp != null) && !temp.isDead())
+ if ((character != null) && character.isPlayer() && !character.isDead())
{
if (siege)
{
// during siege defenders not affected
- final PlayerInstance player = temp.getActingPlayer();
+ final PlayerInstance player = character.getActingPlayer();
if ((player != null) && player.isInSiege() && (player.getSiegeState() == 2))
{
continue;
}
}
- final double multiplier = 1 + (temp.getStat().getValue(Stat.DAMAGE_ZONE_VULN, 0) / 100);
-
+ final double multiplier = 1 + (character.getStat().getValue(Stat.DAMAGE_ZONE_VULN, 0) / 100);
if (getHPDamagePerSecond() != 0)
{
- temp.reduceCurrentHp(_dmgZone.getHPDamagePerSecond() * multiplier, temp, null);
+ character.reduceCurrentHp(getHPDamagePerSecond() * multiplier, character, null);
}
if (getMPDamagePerSecond() != 0)
{
- temp.reduceCurrentMp(_dmgZone.getMPDamagePerSecond() * multiplier);
+ character.reduceCurrentMp(getMPDamagePerSecond() * multiplier);
}
}
}
diff --git a/L2J_Mobius_Classic_2.4_SecretOfEmpire/java/org/l2jmobius/gameserver/model/zone/type/EffectZone.java b/L2J_Mobius_Classic_2.4_SecretOfEmpire/java/org/l2jmobius/gameserver/model/zone/type/EffectZone.java
index 40257410ad..b179fcd242 100644
--- a/L2J_Mobius_Classic_2.4_SecretOfEmpire/java/org/l2jmobius/gameserver/model/zone/type/EffectZone.java
+++ b/L2J_Mobius_Classic_2.4_SecretOfEmpire/java/org/l2jmobius/gameserver/model/zone/type/EffectZone.java
@@ -19,22 +19,20 @@ package org.l2jmobius.gameserver.model.zone.type;
import java.util.Map;
import java.util.Map.Entry;
import java.util.concurrent.ConcurrentHashMap;
+import java.util.concurrent.Future;
import org.l2jmobius.commons.concurrent.ThreadPool;
import org.l2jmobius.commons.util.Rnd;
import org.l2jmobius.gameserver.data.xml.SkillData;
import org.l2jmobius.gameserver.enums.InstanceType;
-import org.l2jmobius.gameserver.instancemanager.ZoneManager;
import org.l2jmobius.gameserver.model.actor.Creature;
import org.l2jmobius.gameserver.model.skills.Skill;
-import org.l2jmobius.gameserver.model.zone.AbstractZoneSettings;
-import org.l2jmobius.gameserver.model.zone.TaskZoneSettings;
import org.l2jmobius.gameserver.model.zone.ZoneId;
import org.l2jmobius.gameserver.model.zone.ZoneType;
import org.l2jmobius.gameserver.network.serverpackets.EtcStatusUpdate;
/**
- * another type of damage zone with skills
+ * Another type of damage zone with skills.
* @author kerberos
*/
public class EffectZone extends ZoneType
@@ -45,6 +43,7 @@ public class EffectZone extends ZoneType
protected boolean _bypassConditions;
private boolean _isShowDangerIcon;
protected Map _skills;
+ private volatile Future> _task;
public EffectZone(int id)
{
@@ -55,18 +54,6 @@ public class EffectZone extends ZoneType
setTargetType(InstanceType.Playable); // default only playable
_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
@@ -144,13 +131,15 @@ public class EffectZone extends ZoneType
{
if (_skills != null)
{
- if (getSettings().getTask() == null)
+ Future> task = _task;
+ if (task == null)
{
synchronized (this)
{
- if (getSettings().getTask() == null)
+ task = _task;
+ if (task == null)
{
- getSettings().setTask(ThreadPool.scheduleAtFixedRate(new ApplySkill(), _initialDelay, _reuse));
+ _task = task = ThreadPool.scheduleAtFixedRate(new ApplySkill(), _initialDelay, _reuse);
}
}
}
@@ -183,9 +172,10 @@ public class EffectZone extends ZoneType
}
}
- if (getCharactersInside().isEmpty() && (getSettings().getTask() != null))
+ if (getCharactersInside().isEmpty() && (_task != null))
{
- getSettings().clear();
+ _task.cancel(true);
+ _task = null;
}
}
@@ -240,7 +230,7 @@ public class EffectZone extends ZoneType
return _skills.get(skillId);
}
- private final class ApplySkill implements Runnable
+ private class ApplySkill implements Runnable
{
protected ApplySkill()
{
@@ -253,25 +243,34 @@ public class EffectZone extends ZoneType
@Override
public void run()
{
- if (isEnabled())
+ if (!isEnabled())
{
- getCharactersInside().forEach(character ->
+ return;
+ }
+
+ if (getCharactersInside().isEmpty())
+ {
+ _task.cancel(false);
+ _task = null;
+ return;
+ }
+
+ for (Creature character : getCharactersInside())
+ {
+ if ((character != null) && character.isPlayer() && !character.isDead() && (Rnd.get(100) < _chance))
{
- if ((character != null) && !character.isDead() && (Rnd.get(100) < _chance))
+ for (Entry e : _skills.entrySet())
{
- for (Entry e : _skills.entrySet())
+ final Skill skill = SkillData.getInstance().getSkill(e.getKey().intValue(), e.getValue().intValue());
+ if ((skill != null) && (_bypassConditions || skill.checkCondition(character, character)))
{
- final Skill skill = SkillData.getInstance().getSkill(e.getKey(), e.getValue());
- if ((skill != null) && (_bypassConditions || skill.checkCondition(character, character)))
+ if (character.getAffectedSkillLevel(skill.getId()) < skill.getLevel())
{
- if (character.getAffectedSkillLevel(skill.getId()) < skill.getLevel())
- {
- skill.activateSkill(character, character);
- }
+ skill.activateSkill(character, character);
}
}
}
- });
+ }
}
}
}
diff --git a/L2J_Mobius_Classic_3.0_TheKamael/java/org/l2jmobius/gameserver/model/zone/TaskZoneSettings.java b/L2J_Mobius_Classic_3.0_TheKamael/java/org/l2jmobius/gameserver/model/zone/TaskZoneSettings.java
deleted file mode 100644
index facc7f731b..0000000000
--- a/L2J_Mobius_Classic_3.0_TheKamael/java/org/l2jmobius/gameserver/model/zone/TaskZoneSettings.java
+++ /dev/null
@@ -1,56 +0,0 @@
-/*
- * This file is part of the L2J Mobius project.
- *
- * 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 .
- */
-package org.l2jmobius.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);
- _task = null;
- }
- }
-}
diff --git a/L2J_Mobius_Classic_3.0_TheKamael/java/org/l2jmobius/gameserver/model/zone/type/DamageZone.java b/L2J_Mobius_Classic_3.0_TheKamael/java/org/l2jmobius/gameserver/model/zone/type/DamageZone.java
index 13b533a54f..ce5daa2ab3 100644
--- a/L2J_Mobius_Classic_3.0_TheKamael/java/org/l2jmobius/gameserver/model/zone/type/DamageZone.java
+++ b/L2J_Mobius_Classic_3.0_TheKamael/java/org/l2jmobius/gameserver/model/zone/type/DamageZone.java
@@ -16,16 +16,15 @@
*/
package org.l2jmobius.gameserver.model.zone.type;
+import java.util.concurrent.Future;
+
import org.l2jmobius.commons.concurrent.ThreadPool;
import org.l2jmobius.gameserver.enums.InstanceType;
import org.l2jmobius.gameserver.instancemanager.CastleManager;
-import org.l2jmobius.gameserver.instancemanager.ZoneManager;
import org.l2jmobius.gameserver.model.actor.Creature;
import org.l2jmobius.gameserver.model.actor.instance.PlayerInstance;
import org.l2jmobius.gameserver.model.siege.Castle;
import org.l2jmobius.gameserver.model.stats.Stat;
-import org.l2jmobius.gameserver.model.zone.AbstractZoneSettings;
-import org.l2jmobius.gameserver.model.zone.TaskZoneSettings;
import org.l2jmobius.gameserver.model.zone.ZoneType;
/**
@@ -42,6 +41,7 @@ public class DamageZone extends ZoneType
private int _startTask;
private int _reuseTask;
+ private volatile Future> _task;
public DamageZone(int id)
{
@@ -60,18 +60,6 @@ public class DamageZone extends ZoneType
_castle = null;
setTargetType(InstanceType.Playable); // 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
@@ -106,12 +94,14 @@ public class DamageZone extends ZoneType
@Override
protected void onEnter(Creature creature)
{
- if ((getSettings().getTask() == null) && ((_damageHPPerSec != 0) || (_damageMPPerSec != 0)))
+ Future> task = _task;
+ if ((task == null) && ((_damageHPPerSec != 0) || (_damageMPPerSec != 0)))
{
final PlayerInstance player = creature.getActingPlayer();
- if (getCastle() != null) // Castle zone
+ final Castle castle = getCastle();
+ if (castle != null) // Castle zone
{
- if (!(getCastle().getSiege().isInProgress() && (player != null) && (player.getSiegeState() != 2))) // Siege and no defender
+ if (!(castle.getSiege().isInProgress() && (player != null) && (player.getSiegeState() != 2))) // Siege and no defender
{
return;
}
@@ -119,9 +109,10 @@ public class DamageZone extends ZoneType
synchronized (this)
{
- if (getSettings().getTask() == null)
+ task = _task;
+ if (task == null)
{
- getSettings().setTask(ThreadPool.scheduleAtFixedRate(new ApplyDamage(this), _startTask, _reuseTask));
+ _task = task = ThreadPool.scheduleAtFixedRate(new ApplyDamage(), _startTask, _reuseTask);
}
}
}
@@ -130,9 +121,10 @@ public class DamageZone extends ZoneType
@Override
protected void onExit(Creature creature)
{
- if (getCharactersInside().isEmpty() && (getSettings().getTask() != null))
+ if (getCharactersInside().isEmpty() && (_task != null))
{
- getSettings().clear();
+ _task.cancel(true);
+ _task = null;
}
}
@@ -152,19 +144,16 @@ public class DamageZone extends ZoneType
{
_castle = CastleManager.getInstance().getCastleById(_castleId);
}
-
return _castle;
}
- private final class ApplyDamage implements Runnable
+ private class ApplyDamage implements Runnable
{
- private final DamageZone _dmgZone;
private final Castle _castle;
- protected ApplyDamage(DamageZone zone)
+ protected ApplyDamage()
{
- _dmgZone = zone;
- _castle = zone.getCastle();
+ _castle = getCastle();
}
@Override
@@ -175,6 +164,13 @@ public class DamageZone extends ZoneType
return;
}
+ if (getCharactersInside().isEmpty())
+ {
+ _task.cancel(false);
+ _task = null;
+ return;
+ }
+
boolean siege = false;
if (_castle != null)
@@ -183,34 +179,34 @@ public class DamageZone extends ZoneType
// castle zones active only during siege
if (!siege)
{
- _dmgZone.getSettings().clear();
+ _task.cancel(false);
+ _task = null;
return;
}
}
- for (Creature temp : _dmgZone.getCharactersInside())
+ for (Creature character : getCharactersInside())
{
- if ((temp != null) && !temp.isDead())
+ if ((character != null) && character.isPlayer() && !character.isDead())
{
if (siege)
{
// during siege defenders not affected
- final PlayerInstance player = temp.getActingPlayer();
+ final PlayerInstance player = character.getActingPlayer();
if ((player != null) && player.isInSiege() && (player.getSiegeState() == 2))
{
continue;
}
}
- final double multiplier = 1 + (temp.getStat().getValue(Stat.DAMAGE_ZONE_VULN, 0) / 100);
-
+ final double multiplier = 1 + (character.getStat().getValue(Stat.DAMAGE_ZONE_VULN, 0) / 100);
if (getHPDamagePerSecond() != 0)
{
- temp.reduceCurrentHp(_dmgZone.getHPDamagePerSecond() * multiplier, temp, null);
+ character.reduceCurrentHp(getHPDamagePerSecond() * multiplier, character, null);
}
if (getMPDamagePerSecond() != 0)
{
- temp.reduceCurrentMp(_dmgZone.getMPDamagePerSecond() * multiplier);
+ character.reduceCurrentMp(getMPDamagePerSecond() * multiplier);
}
}
}
diff --git a/L2J_Mobius_Classic_3.0_TheKamael/java/org/l2jmobius/gameserver/model/zone/type/EffectZone.java b/L2J_Mobius_Classic_3.0_TheKamael/java/org/l2jmobius/gameserver/model/zone/type/EffectZone.java
index a5e920c17d..4abcf96eaf 100644
--- a/L2J_Mobius_Classic_3.0_TheKamael/java/org/l2jmobius/gameserver/model/zone/type/EffectZone.java
+++ b/L2J_Mobius_Classic_3.0_TheKamael/java/org/l2jmobius/gameserver/model/zone/type/EffectZone.java
@@ -19,22 +19,20 @@ package org.l2jmobius.gameserver.model.zone.type;
import java.util.Map;
import java.util.Map.Entry;
import java.util.concurrent.ConcurrentHashMap;
+import java.util.concurrent.Future;
import org.l2jmobius.commons.concurrent.ThreadPool;
import org.l2jmobius.commons.util.Rnd;
import org.l2jmobius.gameserver.data.xml.SkillData;
import org.l2jmobius.gameserver.enums.InstanceType;
-import org.l2jmobius.gameserver.instancemanager.ZoneManager;
import org.l2jmobius.gameserver.model.actor.Creature;
import org.l2jmobius.gameserver.model.skills.Skill;
-import org.l2jmobius.gameserver.model.zone.AbstractZoneSettings;
-import org.l2jmobius.gameserver.model.zone.TaskZoneSettings;
import org.l2jmobius.gameserver.model.zone.ZoneId;
import org.l2jmobius.gameserver.model.zone.ZoneType;
import org.l2jmobius.gameserver.network.serverpackets.EtcStatusUpdate;
/**
- * another type of damage zone with skills
+ * Another type of damage zone with skills.
* @author kerberos
*/
public class EffectZone extends ZoneType
@@ -45,6 +43,7 @@ public class EffectZone extends ZoneType
protected boolean _bypassConditions;
private boolean _isShowDangerIcon;
protected Map _skills;
+ private volatile Future> _task;
public EffectZone(int id)
{
@@ -55,18 +54,6 @@ public class EffectZone extends ZoneType
setTargetType(InstanceType.Playable); // default only playable
_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
@@ -144,13 +131,15 @@ public class EffectZone extends ZoneType
{
if (_skills != null)
{
- if (getSettings().getTask() == null)
+ Future> task = _task;
+ if (task == null)
{
synchronized (this)
{
- if (getSettings().getTask() == null)
+ task = _task;
+ if (task == null)
{
- getSettings().setTask(ThreadPool.scheduleAtFixedRate(new ApplySkill(), _initialDelay, _reuse));
+ _task = task = ThreadPool.scheduleAtFixedRate(new ApplySkill(), _initialDelay, _reuse);
}
}
}
@@ -183,9 +172,10 @@ public class EffectZone extends ZoneType
}
}
- if (getCharactersInside().isEmpty() && (getSettings().getTask() != null))
+ if (getCharactersInside().isEmpty() && (_task != null))
{
- getSettings().clear();
+ _task.cancel(true);
+ _task = null;
}
}
@@ -240,7 +230,7 @@ public class EffectZone extends ZoneType
return _skills.get(skillId);
}
- private final class ApplySkill implements Runnable
+ private class ApplySkill implements Runnable
{
protected ApplySkill()
{
@@ -253,25 +243,34 @@ public class EffectZone extends ZoneType
@Override
public void run()
{
- if (isEnabled())
+ if (!isEnabled())
{
- getCharactersInside().forEach(character ->
+ return;
+ }
+
+ if (getCharactersInside().isEmpty())
+ {
+ _task.cancel(false);
+ _task = null;
+ return;
+ }
+
+ for (Creature character : getCharactersInside())
+ {
+ if ((character != null) && character.isPlayer() && !character.isDead() && (Rnd.get(100) < _chance))
{
- if ((character != null) && !character.isDead() && (Rnd.get(100) < _chance))
+ for (Entry e : _skills.entrySet())
{
- for (Entry e : _skills.entrySet())
+ final Skill skill = SkillData.getInstance().getSkill(e.getKey().intValue(), e.getValue().intValue());
+ if ((skill != null) && (_bypassConditions || skill.checkCondition(character, character, false)))
{
- final Skill skill = SkillData.getInstance().getSkill(e.getKey(), e.getValue());
- if ((skill != null) && (_bypassConditions || skill.checkCondition(character, character, true)))
+ if (character.getAffectedSkillLevel(skill.getId()) < skill.getLevel())
{
- if (character.getAffectedSkillLevel(skill.getId()) < skill.getLevel())
- {
- skill.activateSkill(character, character);
- }
+ skill.activateSkill(character, character);
}
}
}
- });
+ }
}
}
}
diff --git a/L2J_Mobius_Classic_Interlude/java/org/l2jmobius/gameserver/model/zone/TaskZoneSettings.java b/L2J_Mobius_Classic_Interlude/java/org/l2jmobius/gameserver/model/zone/TaskZoneSettings.java
deleted file mode 100644
index facc7f731b..0000000000
--- a/L2J_Mobius_Classic_Interlude/java/org/l2jmobius/gameserver/model/zone/TaskZoneSettings.java
+++ /dev/null
@@ -1,56 +0,0 @@
-/*
- * This file is part of the L2J Mobius project.
- *
- * 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 .
- */
-package org.l2jmobius.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);
- _task = null;
- }
- }
-}
diff --git a/L2J_Mobius_Classic_Interlude/java/org/l2jmobius/gameserver/model/zone/type/DamageZone.java b/L2J_Mobius_Classic_Interlude/java/org/l2jmobius/gameserver/model/zone/type/DamageZone.java
index 13b533a54f..ce5daa2ab3 100644
--- a/L2J_Mobius_Classic_Interlude/java/org/l2jmobius/gameserver/model/zone/type/DamageZone.java
+++ b/L2J_Mobius_Classic_Interlude/java/org/l2jmobius/gameserver/model/zone/type/DamageZone.java
@@ -16,16 +16,15 @@
*/
package org.l2jmobius.gameserver.model.zone.type;
+import java.util.concurrent.Future;
+
import org.l2jmobius.commons.concurrent.ThreadPool;
import org.l2jmobius.gameserver.enums.InstanceType;
import org.l2jmobius.gameserver.instancemanager.CastleManager;
-import org.l2jmobius.gameserver.instancemanager.ZoneManager;
import org.l2jmobius.gameserver.model.actor.Creature;
import org.l2jmobius.gameserver.model.actor.instance.PlayerInstance;
import org.l2jmobius.gameserver.model.siege.Castle;
import org.l2jmobius.gameserver.model.stats.Stat;
-import org.l2jmobius.gameserver.model.zone.AbstractZoneSettings;
-import org.l2jmobius.gameserver.model.zone.TaskZoneSettings;
import org.l2jmobius.gameserver.model.zone.ZoneType;
/**
@@ -42,6 +41,7 @@ public class DamageZone extends ZoneType
private int _startTask;
private int _reuseTask;
+ private volatile Future> _task;
public DamageZone(int id)
{
@@ -60,18 +60,6 @@ public class DamageZone extends ZoneType
_castle = null;
setTargetType(InstanceType.Playable); // 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
@@ -106,12 +94,14 @@ public class DamageZone extends ZoneType
@Override
protected void onEnter(Creature creature)
{
- if ((getSettings().getTask() == null) && ((_damageHPPerSec != 0) || (_damageMPPerSec != 0)))
+ Future> task = _task;
+ if ((task == null) && ((_damageHPPerSec != 0) || (_damageMPPerSec != 0)))
{
final PlayerInstance player = creature.getActingPlayer();
- if (getCastle() != null) // Castle zone
+ final Castle castle = getCastle();
+ if (castle != null) // Castle zone
{
- if (!(getCastle().getSiege().isInProgress() && (player != null) && (player.getSiegeState() != 2))) // Siege and no defender
+ if (!(castle.getSiege().isInProgress() && (player != null) && (player.getSiegeState() != 2))) // Siege and no defender
{
return;
}
@@ -119,9 +109,10 @@ public class DamageZone extends ZoneType
synchronized (this)
{
- if (getSettings().getTask() == null)
+ task = _task;
+ if (task == null)
{
- getSettings().setTask(ThreadPool.scheduleAtFixedRate(new ApplyDamage(this), _startTask, _reuseTask));
+ _task = task = ThreadPool.scheduleAtFixedRate(new ApplyDamage(), _startTask, _reuseTask);
}
}
}
@@ -130,9 +121,10 @@ public class DamageZone extends ZoneType
@Override
protected void onExit(Creature creature)
{
- if (getCharactersInside().isEmpty() && (getSettings().getTask() != null))
+ if (getCharactersInside().isEmpty() && (_task != null))
{
- getSettings().clear();
+ _task.cancel(true);
+ _task = null;
}
}
@@ -152,19 +144,16 @@ public class DamageZone extends ZoneType
{
_castle = CastleManager.getInstance().getCastleById(_castleId);
}
-
return _castle;
}
- private final class ApplyDamage implements Runnable
+ private class ApplyDamage implements Runnable
{
- private final DamageZone _dmgZone;
private final Castle _castle;
- protected ApplyDamage(DamageZone zone)
+ protected ApplyDamage()
{
- _dmgZone = zone;
- _castle = zone.getCastle();
+ _castle = getCastle();
}
@Override
@@ -175,6 +164,13 @@ public class DamageZone extends ZoneType
return;
}
+ if (getCharactersInside().isEmpty())
+ {
+ _task.cancel(false);
+ _task = null;
+ return;
+ }
+
boolean siege = false;
if (_castle != null)
@@ -183,34 +179,34 @@ public class DamageZone extends ZoneType
// castle zones active only during siege
if (!siege)
{
- _dmgZone.getSettings().clear();
+ _task.cancel(false);
+ _task = null;
return;
}
}
- for (Creature temp : _dmgZone.getCharactersInside())
+ for (Creature character : getCharactersInside())
{
- if ((temp != null) && !temp.isDead())
+ if ((character != null) && character.isPlayer() && !character.isDead())
{
if (siege)
{
// during siege defenders not affected
- final PlayerInstance player = temp.getActingPlayer();
+ final PlayerInstance player = character.getActingPlayer();
if ((player != null) && player.isInSiege() && (player.getSiegeState() == 2))
{
continue;
}
}
- final double multiplier = 1 + (temp.getStat().getValue(Stat.DAMAGE_ZONE_VULN, 0) / 100);
-
+ final double multiplier = 1 + (character.getStat().getValue(Stat.DAMAGE_ZONE_VULN, 0) / 100);
if (getHPDamagePerSecond() != 0)
{
- temp.reduceCurrentHp(_dmgZone.getHPDamagePerSecond() * multiplier, temp, null);
+ character.reduceCurrentHp(getHPDamagePerSecond() * multiplier, character, null);
}
if (getMPDamagePerSecond() != 0)
{
- temp.reduceCurrentMp(_dmgZone.getMPDamagePerSecond() * multiplier);
+ character.reduceCurrentMp(getMPDamagePerSecond() * multiplier);
}
}
}
diff --git a/L2J_Mobius_Classic_Interlude/java/org/l2jmobius/gameserver/model/zone/type/EffectZone.java b/L2J_Mobius_Classic_Interlude/java/org/l2jmobius/gameserver/model/zone/type/EffectZone.java
index 40257410ad..b179fcd242 100644
--- a/L2J_Mobius_Classic_Interlude/java/org/l2jmobius/gameserver/model/zone/type/EffectZone.java
+++ b/L2J_Mobius_Classic_Interlude/java/org/l2jmobius/gameserver/model/zone/type/EffectZone.java
@@ -19,22 +19,20 @@ package org.l2jmobius.gameserver.model.zone.type;
import java.util.Map;
import java.util.Map.Entry;
import java.util.concurrent.ConcurrentHashMap;
+import java.util.concurrent.Future;
import org.l2jmobius.commons.concurrent.ThreadPool;
import org.l2jmobius.commons.util.Rnd;
import org.l2jmobius.gameserver.data.xml.SkillData;
import org.l2jmobius.gameserver.enums.InstanceType;
-import org.l2jmobius.gameserver.instancemanager.ZoneManager;
import org.l2jmobius.gameserver.model.actor.Creature;
import org.l2jmobius.gameserver.model.skills.Skill;
-import org.l2jmobius.gameserver.model.zone.AbstractZoneSettings;
-import org.l2jmobius.gameserver.model.zone.TaskZoneSettings;
import org.l2jmobius.gameserver.model.zone.ZoneId;
import org.l2jmobius.gameserver.model.zone.ZoneType;
import org.l2jmobius.gameserver.network.serverpackets.EtcStatusUpdate;
/**
- * another type of damage zone with skills
+ * Another type of damage zone with skills.
* @author kerberos
*/
public class EffectZone extends ZoneType
@@ -45,6 +43,7 @@ public class EffectZone extends ZoneType
protected boolean _bypassConditions;
private boolean _isShowDangerIcon;
protected Map _skills;
+ private volatile Future> _task;
public EffectZone(int id)
{
@@ -55,18 +54,6 @@ public class EffectZone extends ZoneType
setTargetType(InstanceType.Playable); // default only playable
_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
@@ -144,13 +131,15 @@ public class EffectZone extends ZoneType
{
if (_skills != null)
{
- if (getSettings().getTask() == null)
+ Future> task = _task;
+ if (task == null)
{
synchronized (this)
{
- if (getSettings().getTask() == null)
+ task = _task;
+ if (task == null)
{
- getSettings().setTask(ThreadPool.scheduleAtFixedRate(new ApplySkill(), _initialDelay, _reuse));
+ _task = task = ThreadPool.scheduleAtFixedRate(new ApplySkill(), _initialDelay, _reuse);
}
}
}
@@ -183,9 +172,10 @@ public class EffectZone extends ZoneType
}
}
- if (getCharactersInside().isEmpty() && (getSettings().getTask() != null))
+ if (getCharactersInside().isEmpty() && (_task != null))
{
- getSettings().clear();
+ _task.cancel(true);
+ _task = null;
}
}
@@ -240,7 +230,7 @@ public class EffectZone extends ZoneType
return _skills.get(skillId);
}
- private final class ApplySkill implements Runnable
+ private class ApplySkill implements Runnable
{
protected ApplySkill()
{
@@ -253,25 +243,34 @@ public class EffectZone extends ZoneType
@Override
public void run()
{
- if (isEnabled())
+ if (!isEnabled())
{
- getCharactersInside().forEach(character ->
+ return;
+ }
+
+ if (getCharactersInside().isEmpty())
+ {
+ _task.cancel(false);
+ _task = null;
+ return;
+ }
+
+ for (Creature character : getCharactersInside())
+ {
+ if ((character != null) && character.isPlayer() && !character.isDead() && (Rnd.get(100) < _chance))
{
- if ((character != null) && !character.isDead() && (Rnd.get(100) < _chance))
+ for (Entry e : _skills.entrySet())
{
- for (Entry e : _skills.entrySet())
+ final Skill skill = SkillData.getInstance().getSkill(e.getKey().intValue(), e.getValue().intValue());
+ if ((skill != null) && (_bypassConditions || skill.checkCondition(character, character)))
{
- final Skill skill = SkillData.getInstance().getSkill(e.getKey(), e.getValue());
- if ((skill != null) && (_bypassConditions || skill.checkCondition(character, character)))
+ if (character.getAffectedSkillLevel(skill.getId()) < skill.getLevel())
{
- if (character.getAffectedSkillLevel(skill.getId()) < skill.getLevel())
- {
- skill.activateSkill(character, character);
- }
+ skill.activateSkill(character, character);
}
}
}
- });
+ }
}
}
}
diff --git a/L2J_Mobius_Essence_4.0_DwellingOfSpirits/java/org/l2jmobius/gameserver/model/zone/TaskZoneSettings.java b/L2J_Mobius_Essence_4.0_DwellingOfSpirits/java/org/l2jmobius/gameserver/model/zone/TaskZoneSettings.java
deleted file mode 100644
index facc7f731b..0000000000
--- a/L2J_Mobius_Essence_4.0_DwellingOfSpirits/java/org/l2jmobius/gameserver/model/zone/TaskZoneSettings.java
+++ /dev/null
@@ -1,56 +0,0 @@
-/*
- * This file is part of the L2J Mobius project.
- *
- * 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 .
- */
-package org.l2jmobius.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);
- _task = null;
- }
- }
-}
diff --git a/L2J_Mobius_Essence_4.0_DwellingOfSpirits/java/org/l2jmobius/gameserver/model/zone/type/DamageZone.java b/L2J_Mobius_Essence_4.0_DwellingOfSpirits/java/org/l2jmobius/gameserver/model/zone/type/DamageZone.java
index 13b533a54f..ce5daa2ab3 100644
--- a/L2J_Mobius_Essence_4.0_DwellingOfSpirits/java/org/l2jmobius/gameserver/model/zone/type/DamageZone.java
+++ b/L2J_Mobius_Essence_4.0_DwellingOfSpirits/java/org/l2jmobius/gameserver/model/zone/type/DamageZone.java
@@ -16,16 +16,15 @@
*/
package org.l2jmobius.gameserver.model.zone.type;
+import java.util.concurrent.Future;
+
import org.l2jmobius.commons.concurrent.ThreadPool;
import org.l2jmobius.gameserver.enums.InstanceType;
import org.l2jmobius.gameserver.instancemanager.CastleManager;
-import org.l2jmobius.gameserver.instancemanager.ZoneManager;
import org.l2jmobius.gameserver.model.actor.Creature;
import org.l2jmobius.gameserver.model.actor.instance.PlayerInstance;
import org.l2jmobius.gameserver.model.siege.Castle;
import org.l2jmobius.gameserver.model.stats.Stat;
-import org.l2jmobius.gameserver.model.zone.AbstractZoneSettings;
-import org.l2jmobius.gameserver.model.zone.TaskZoneSettings;
import org.l2jmobius.gameserver.model.zone.ZoneType;
/**
@@ -42,6 +41,7 @@ public class DamageZone extends ZoneType
private int _startTask;
private int _reuseTask;
+ private volatile Future> _task;
public DamageZone(int id)
{
@@ -60,18 +60,6 @@ public class DamageZone extends ZoneType
_castle = null;
setTargetType(InstanceType.Playable); // 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
@@ -106,12 +94,14 @@ public class DamageZone extends ZoneType
@Override
protected void onEnter(Creature creature)
{
- if ((getSettings().getTask() == null) && ((_damageHPPerSec != 0) || (_damageMPPerSec != 0)))
+ Future> task = _task;
+ if ((task == null) && ((_damageHPPerSec != 0) || (_damageMPPerSec != 0)))
{
final PlayerInstance player = creature.getActingPlayer();
- if (getCastle() != null) // Castle zone
+ final Castle castle = getCastle();
+ if (castle != null) // Castle zone
{
- if (!(getCastle().getSiege().isInProgress() && (player != null) && (player.getSiegeState() != 2))) // Siege and no defender
+ if (!(castle.getSiege().isInProgress() && (player != null) && (player.getSiegeState() != 2))) // Siege and no defender
{
return;
}
@@ -119,9 +109,10 @@ public class DamageZone extends ZoneType
synchronized (this)
{
- if (getSettings().getTask() == null)
+ task = _task;
+ if (task == null)
{
- getSettings().setTask(ThreadPool.scheduleAtFixedRate(new ApplyDamage(this), _startTask, _reuseTask));
+ _task = task = ThreadPool.scheduleAtFixedRate(new ApplyDamage(), _startTask, _reuseTask);
}
}
}
@@ -130,9 +121,10 @@ public class DamageZone extends ZoneType
@Override
protected void onExit(Creature creature)
{
- if (getCharactersInside().isEmpty() && (getSettings().getTask() != null))
+ if (getCharactersInside().isEmpty() && (_task != null))
{
- getSettings().clear();
+ _task.cancel(true);
+ _task = null;
}
}
@@ -152,19 +144,16 @@ public class DamageZone extends ZoneType
{
_castle = CastleManager.getInstance().getCastleById(_castleId);
}
-
return _castle;
}
- private final class ApplyDamage implements Runnable
+ private class ApplyDamage implements Runnable
{
- private final DamageZone _dmgZone;
private final Castle _castle;
- protected ApplyDamage(DamageZone zone)
+ protected ApplyDamage()
{
- _dmgZone = zone;
- _castle = zone.getCastle();
+ _castle = getCastle();
}
@Override
@@ -175,6 +164,13 @@ public class DamageZone extends ZoneType
return;
}
+ if (getCharactersInside().isEmpty())
+ {
+ _task.cancel(false);
+ _task = null;
+ return;
+ }
+
boolean siege = false;
if (_castle != null)
@@ -183,34 +179,34 @@ public class DamageZone extends ZoneType
// castle zones active only during siege
if (!siege)
{
- _dmgZone.getSettings().clear();
+ _task.cancel(false);
+ _task = null;
return;
}
}
- for (Creature temp : _dmgZone.getCharactersInside())
+ for (Creature character : getCharactersInside())
{
- if ((temp != null) && !temp.isDead())
+ if ((character != null) && character.isPlayer() && !character.isDead())
{
if (siege)
{
// during siege defenders not affected
- final PlayerInstance player = temp.getActingPlayer();
+ final PlayerInstance player = character.getActingPlayer();
if ((player != null) && player.isInSiege() && (player.getSiegeState() == 2))
{
continue;
}
}
- final double multiplier = 1 + (temp.getStat().getValue(Stat.DAMAGE_ZONE_VULN, 0) / 100);
-
+ final double multiplier = 1 + (character.getStat().getValue(Stat.DAMAGE_ZONE_VULN, 0) / 100);
if (getHPDamagePerSecond() != 0)
{
- temp.reduceCurrentHp(_dmgZone.getHPDamagePerSecond() * multiplier, temp, null);
+ character.reduceCurrentHp(getHPDamagePerSecond() * multiplier, character, null);
}
if (getMPDamagePerSecond() != 0)
{
- temp.reduceCurrentMp(_dmgZone.getMPDamagePerSecond() * multiplier);
+ character.reduceCurrentMp(getMPDamagePerSecond() * multiplier);
}
}
}
diff --git a/L2J_Mobius_Essence_4.0_DwellingOfSpirits/java/org/l2jmobius/gameserver/model/zone/type/EffectZone.java b/L2J_Mobius_Essence_4.0_DwellingOfSpirits/java/org/l2jmobius/gameserver/model/zone/type/EffectZone.java
index a5e920c17d..4abcf96eaf 100644
--- a/L2J_Mobius_Essence_4.0_DwellingOfSpirits/java/org/l2jmobius/gameserver/model/zone/type/EffectZone.java
+++ b/L2J_Mobius_Essence_4.0_DwellingOfSpirits/java/org/l2jmobius/gameserver/model/zone/type/EffectZone.java
@@ -19,22 +19,20 @@ package org.l2jmobius.gameserver.model.zone.type;
import java.util.Map;
import java.util.Map.Entry;
import java.util.concurrent.ConcurrentHashMap;
+import java.util.concurrent.Future;
import org.l2jmobius.commons.concurrent.ThreadPool;
import org.l2jmobius.commons.util.Rnd;
import org.l2jmobius.gameserver.data.xml.SkillData;
import org.l2jmobius.gameserver.enums.InstanceType;
-import org.l2jmobius.gameserver.instancemanager.ZoneManager;
import org.l2jmobius.gameserver.model.actor.Creature;
import org.l2jmobius.gameserver.model.skills.Skill;
-import org.l2jmobius.gameserver.model.zone.AbstractZoneSettings;
-import org.l2jmobius.gameserver.model.zone.TaskZoneSettings;
import org.l2jmobius.gameserver.model.zone.ZoneId;
import org.l2jmobius.gameserver.model.zone.ZoneType;
import org.l2jmobius.gameserver.network.serverpackets.EtcStatusUpdate;
/**
- * another type of damage zone with skills
+ * Another type of damage zone with skills.
* @author kerberos
*/
public class EffectZone extends ZoneType
@@ -45,6 +43,7 @@ public class EffectZone extends ZoneType
protected boolean _bypassConditions;
private boolean _isShowDangerIcon;
protected Map _skills;
+ private volatile Future> _task;
public EffectZone(int id)
{
@@ -55,18 +54,6 @@ public class EffectZone extends ZoneType
setTargetType(InstanceType.Playable); // default only playable
_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
@@ -144,13 +131,15 @@ public class EffectZone extends ZoneType
{
if (_skills != null)
{
- if (getSettings().getTask() == null)
+ Future> task = _task;
+ if (task == null)
{
synchronized (this)
{
- if (getSettings().getTask() == null)
+ task = _task;
+ if (task == null)
{
- getSettings().setTask(ThreadPool.scheduleAtFixedRate(new ApplySkill(), _initialDelay, _reuse));
+ _task = task = ThreadPool.scheduleAtFixedRate(new ApplySkill(), _initialDelay, _reuse);
}
}
}
@@ -183,9 +172,10 @@ public class EffectZone extends ZoneType
}
}
- if (getCharactersInside().isEmpty() && (getSettings().getTask() != null))
+ if (getCharactersInside().isEmpty() && (_task != null))
{
- getSettings().clear();
+ _task.cancel(true);
+ _task = null;
}
}
@@ -240,7 +230,7 @@ public class EffectZone extends ZoneType
return _skills.get(skillId);
}
- private final class ApplySkill implements Runnable
+ private class ApplySkill implements Runnable
{
protected ApplySkill()
{
@@ -253,25 +243,34 @@ public class EffectZone extends ZoneType
@Override
public void run()
{
- if (isEnabled())
+ if (!isEnabled())
{
- getCharactersInside().forEach(character ->
+ return;
+ }
+
+ if (getCharactersInside().isEmpty())
+ {
+ _task.cancel(false);
+ _task = null;
+ return;
+ }
+
+ for (Creature character : getCharactersInside())
+ {
+ if ((character != null) && character.isPlayer() && !character.isDead() && (Rnd.get(100) < _chance))
{
- if ((character != null) && !character.isDead() && (Rnd.get(100) < _chance))
+ for (Entry e : _skills.entrySet())
{
- for (Entry e : _skills.entrySet())
+ final Skill skill = SkillData.getInstance().getSkill(e.getKey().intValue(), e.getValue().intValue());
+ if ((skill != null) && (_bypassConditions || skill.checkCondition(character, character, false)))
{
- final Skill skill = SkillData.getInstance().getSkill(e.getKey(), e.getValue());
- if ((skill != null) && (_bypassConditions || skill.checkCondition(character, character, true)))
+ if (character.getAffectedSkillLevel(skill.getId()) < skill.getLevel())
{
- if (character.getAffectedSkillLevel(skill.getId()) < skill.getLevel())
- {
- skill.activateSkill(character, character);
- }
+ skill.activateSkill(character, character);
}
}
}
- });
+ }
}
}
}
diff --git a/L2J_Mobius_Essence_5.0_Sylph/java/org/l2jmobius/gameserver/model/zone/TaskZoneSettings.java b/L2J_Mobius_Essence_5.0_Sylph/java/org/l2jmobius/gameserver/model/zone/TaskZoneSettings.java
deleted file mode 100644
index facc7f731b..0000000000
--- a/L2J_Mobius_Essence_5.0_Sylph/java/org/l2jmobius/gameserver/model/zone/TaskZoneSettings.java
+++ /dev/null
@@ -1,56 +0,0 @@
-/*
- * This file is part of the L2J Mobius project.
- *
- * 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 .
- */
-package org.l2jmobius.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);
- _task = null;
- }
- }
-}
diff --git a/L2J_Mobius_Essence_5.0_Sylph/java/org/l2jmobius/gameserver/model/zone/type/DamageZone.java b/L2J_Mobius_Essence_5.0_Sylph/java/org/l2jmobius/gameserver/model/zone/type/DamageZone.java
index 13b533a54f..ce5daa2ab3 100644
--- a/L2J_Mobius_Essence_5.0_Sylph/java/org/l2jmobius/gameserver/model/zone/type/DamageZone.java
+++ b/L2J_Mobius_Essence_5.0_Sylph/java/org/l2jmobius/gameserver/model/zone/type/DamageZone.java
@@ -16,16 +16,15 @@
*/
package org.l2jmobius.gameserver.model.zone.type;
+import java.util.concurrent.Future;
+
import org.l2jmobius.commons.concurrent.ThreadPool;
import org.l2jmobius.gameserver.enums.InstanceType;
import org.l2jmobius.gameserver.instancemanager.CastleManager;
-import org.l2jmobius.gameserver.instancemanager.ZoneManager;
import org.l2jmobius.gameserver.model.actor.Creature;
import org.l2jmobius.gameserver.model.actor.instance.PlayerInstance;
import org.l2jmobius.gameserver.model.siege.Castle;
import org.l2jmobius.gameserver.model.stats.Stat;
-import org.l2jmobius.gameserver.model.zone.AbstractZoneSettings;
-import org.l2jmobius.gameserver.model.zone.TaskZoneSettings;
import org.l2jmobius.gameserver.model.zone.ZoneType;
/**
@@ -42,6 +41,7 @@ public class DamageZone extends ZoneType
private int _startTask;
private int _reuseTask;
+ private volatile Future> _task;
public DamageZone(int id)
{
@@ -60,18 +60,6 @@ public class DamageZone extends ZoneType
_castle = null;
setTargetType(InstanceType.Playable); // 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
@@ -106,12 +94,14 @@ public class DamageZone extends ZoneType
@Override
protected void onEnter(Creature creature)
{
- if ((getSettings().getTask() == null) && ((_damageHPPerSec != 0) || (_damageMPPerSec != 0)))
+ Future> task = _task;
+ if ((task == null) && ((_damageHPPerSec != 0) || (_damageMPPerSec != 0)))
{
final PlayerInstance player = creature.getActingPlayer();
- if (getCastle() != null) // Castle zone
+ final Castle castle = getCastle();
+ if (castle != null) // Castle zone
{
- if (!(getCastle().getSiege().isInProgress() && (player != null) && (player.getSiegeState() != 2))) // Siege and no defender
+ if (!(castle.getSiege().isInProgress() && (player != null) && (player.getSiegeState() != 2))) // Siege and no defender
{
return;
}
@@ -119,9 +109,10 @@ public class DamageZone extends ZoneType
synchronized (this)
{
- if (getSettings().getTask() == null)
+ task = _task;
+ if (task == null)
{
- getSettings().setTask(ThreadPool.scheduleAtFixedRate(new ApplyDamage(this), _startTask, _reuseTask));
+ _task = task = ThreadPool.scheduleAtFixedRate(new ApplyDamage(), _startTask, _reuseTask);
}
}
}
@@ -130,9 +121,10 @@ public class DamageZone extends ZoneType
@Override
protected void onExit(Creature creature)
{
- if (getCharactersInside().isEmpty() && (getSettings().getTask() != null))
+ if (getCharactersInside().isEmpty() && (_task != null))
{
- getSettings().clear();
+ _task.cancel(true);
+ _task = null;
}
}
@@ -152,19 +144,16 @@ public class DamageZone extends ZoneType
{
_castle = CastleManager.getInstance().getCastleById(_castleId);
}
-
return _castle;
}
- private final class ApplyDamage implements Runnable
+ private class ApplyDamage implements Runnable
{
- private final DamageZone _dmgZone;
private final Castle _castle;
- protected ApplyDamage(DamageZone zone)
+ protected ApplyDamage()
{
- _dmgZone = zone;
- _castle = zone.getCastle();
+ _castle = getCastle();
}
@Override
@@ -175,6 +164,13 @@ public class DamageZone extends ZoneType
return;
}
+ if (getCharactersInside().isEmpty())
+ {
+ _task.cancel(false);
+ _task = null;
+ return;
+ }
+
boolean siege = false;
if (_castle != null)
@@ -183,34 +179,34 @@ public class DamageZone extends ZoneType
// castle zones active only during siege
if (!siege)
{
- _dmgZone.getSettings().clear();
+ _task.cancel(false);
+ _task = null;
return;
}
}
- for (Creature temp : _dmgZone.getCharactersInside())
+ for (Creature character : getCharactersInside())
{
- if ((temp != null) && !temp.isDead())
+ if ((character != null) && character.isPlayer() && !character.isDead())
{
if (siege)
{
// during siege defenders not affected
- final PlayerInstance player = temp.getActingPlayer();
+ final PlayerInstance player = character.getActingPlayer();
if ((player != null) && player.isInSiege() && (player.getSiegeState() == 2))
{
continue;
}
}
- final double multiplier = 1 + (temp.getStat().getValue(Stat.DAMAGE_ZONE_VULN, 0) / 100);
-
+ final double multiplier = 1 + (character.getStat().getValue(Stat.DAMAGE_ZONE_VULN, 0) / 100);
if (getHPDamagePerSecond() != 0)
{
- temp.reduceCurrentHp(_dmgZone.getHPDamagePerSecond() * multiplier, temp, null);
+ character.reduceCurrentHp(getHPDamagePerSecond() * multiplier, character, null);
}
if (getMPDamagePerSecond() != 0)
{
- temp.reduceCurrentMp(_dmgZone.getMPDamagePerSecond() * multiplier);
+ character.reduceCurrentMp(getMPDamagePerSecond() * multiplier);
}
}
}
diff --git a/L2J_Mobius_Essence_5.0_Sylph/java/org/l2jmobius/gameserver/model/zone/type/EffectZone.java b/L2J_Mobius_Essence_5.0_Sylph/java/org/l2jmobius/gameserver/model/zone/type/EffectZone.java
index a5e920c17d..4abcf96eaf 100644
--- a/L2J_Mobius_Essence_5.0_Sylph/java/org/l2jmobius/gameserver/model/zone/type/EffectZone.java
+++ b/L2J_Mobius_Essence_5.0_Sylph/java/org/l2jmobius/gameserver/model/zone/type/EffectZone.java
@@ -19,22 +19,20 @@ package org.l2jmobius.gameserver.model.zone.type;
import java.util.Map;
import java.util.Map.Entry;
import java.util.concurrent.ConcurrentHashMap;
+import java.util.concurrent.Future;
import org.l2jmobius.commons.concurrent.ThreadPool;
import org.l2jmobius.commons.util.Rnd;
import org.l2jmobius.gameserver.data.xml.SkillData;
import org.l2jmobius.gameserver.enums.InstanceType;
-import org.l2jmobius.gameserver.instancemanager.ZoneManager;
import org.l2jmobius.gameserver.model.actor.Creature;
import org.l2jmobius.gameserver.model.skills.Skill;
-import org.l2jmobius.gameserver.model.zone.AbstractZoneSettings;
-import org.l2jmobius.gameserver.model.zone.TaskZoneSettings;
import org.l2jmobius.gameserver.model.zone.ZoneId;
import org.l2jmobius.gameserver.model.zone.ZoneType;
import org.l2jmobius.gameserver.network.serverpackets.EtcStatusUpdate;
/**
- * another type of damage zone with skills
+ * Another type of damage zone with skills.
* @author kerberos
*/
public class EffectZone extends ZoneType
@@ -45,6 +43,7 @@ public class EffectZone extends ZoneType
protected boolean _bypassConditions;
private boolean _isShowDangerIcon;
protected Map _skills;
+ private volatile Future> _task;
public EffectZone(int id)
{
@@ -55,18 +54,6 @@ public class EffectZone extends ZoneType
setTargetType(InstanceType.Playable); // default only playable
_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
@@ -144,13 +131,15 @@ public class EffectZone extends ZoneType
{
if (_skills != null)
{
- if (getSettings().getTask() == null)
+ Future> task = _task;
+ if (task == null)
{
synchronized (this)
{
- if (getSettings().getTask() == null)
+ task = _task;
+ if (task == null)
{
- getSettings().setTask(ThreadPool.scheduleAtFixedRate(new ApplySkill(), _initialDelay, _reuse));
+ _task = task = ThreadPool.scheduleAtFixedRate(new ApplySkill(), _initialDelay, _reuse);
}
}
}
@@ -183,9 +172,10 @@ public class EffectZone extends ZoneType
}
}
- if (getCharactersInside().isEmpty() && (getSettings().getTask() != null))
+ if (getCharactersInside().isEmpty() && (_task != null))
{
- getSettings().clear();
+ _task.cancel(true);
+ _task = null;
}
}
@@ -240,7 +230,7 @@ public class EffectZone extends ZoneType
return _skills.get(skillId);
}
- private final class ApplySkill implements Runnable
+ private class ApplySkill implements Runnable
{
protected ApplySkill()
{
@@ -253,25 +243,34 @@ public class EffectZone extends ZoneType
@Override
public void run()
{
- if (isEnabled())
+ if (!isEnabled())
{
- getCharactersInside().forEach(character ->
+ return;
+ }
+
+ if (getCharactersInside().isEmpty())
+ {
+ _task.cancel(false);
+ _task = null;
+ return;
+ }
+
+ for (Creature character : getCharactersInside())
+ {
+ if ((character != null) && character.isPlayer() && !character.isDead() && (Rnd.get(100) < _chance))
{
- if ((character != null) && !character.isDead() && (Rnd.get(100) < _chance))
+ for (Entry e : _skills.entrySet())
{
- for (Entry e : _skills.entrySet())
+ final Skill skill = SkillData.getInstance().getSkill(e.getKey().intValue(), e.getValue().intValue());
+ if ((skill != null) && (_bypassConditions || skill.checkCondition(character, character, false)))
{
- final Skill skill = SkillData.getInstance().getSkill(e.getKey(), e.getValue());
- if ((skill != null) && (_bypassConditions || skill.checkCondition(character, character, true)))
+ if (character.getAffectedSkillLevel(skill.getId()) < skill.getLevel())
{
- if (character.getAffectedSkillLevel(skill.getId()) < skill.getLevel())
- {
- skill.activateSkill(character, character);
- }
+ skill.activateSkill(character, character);
}
}
}
- });
+ }
}
}
}