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); } } } - }); + } } } }