|
|
|
@ -23,9 +23,10 @@ import java.util.Collections;
|
|
|
|
|
import java.util.List;
|
|
|
|
|
import java.util.Map;
|
|
|
|
|
import java.util.Objects;
|
|
|
|
|
import java.util.Queue;
|
|
|
|
|
import java.util.Set;
|
|
|
|
|
import java.util.concurrent.ConcurrentHashMap;
|
|
|
|
|
import java.util.concurrent.CopyOnWriteArraySet;
|
|
|
|
|
import java.util.concurrent.ConcurrentLinkedQueue;
|
|
|
|
|
import java.util.concurrent.ScheduledFuture;
|
|
|
|
|
import java.util.concurrent.atomic.AtomicInteger;
|
|
|
|
|
import java.util.function.Consumer;
|
|
|
|
@ -64,18 +65,18 @@ import com.l2jserver.gameserver.network.serverpackets.ShortBuffStatusUpdate;
|
|
|
|
|
public final class CharEffectList
|
|
|
|
|
{
|
|
|
|
|
private static final Logger _log = Logger.getLogger(CharEffectList.class.getName());
|
|
|
|
|
/** Map containing all effects from buffs for this effect list. */
|
|
|
|
|
private volatile ConcurrentHashMap<Integer, BuffInfo> _buffs;
|
|
|
|
|
/** Map containing all triggered skills for this effect list. */
|
|
|
|
|
private volatile ConcurrentHashMap<Integer, BuffInfo> _triggered;
|
|
|
|
|
/** Map containing all dances/songs for this effect list. */
|
|
|
|
|
private volatile ConcurrentHashMap<Integer, BuffInfo> _dances;
|
|
|
|
|
/** Map containing all toggle for this effect list. */
|
|
|
|
|
private volatile ConcurrentHashMap<Integer, BuffInfo> _toggles;
|
|
|
|
|
/** Map containing all debuffs for this effect list. */
|
|
|
|
|
private volatile ConcurrentHashMap<Integer, BuffInfo> _debuffs;
|
|
|
|
|
/** Map containing all passives for this effect list. They bypass most of the actions and they are not included in most operations. */
|
|
|
|
|
private volatile ConcurrentHashMap<Integer, BuffInfo> _passives;
|
|
|
|
|
/** Queue containing all effects from buffs for this effect list. */
|
|
|
|
|
private volatile Queue<BuffInfo> _buffs;
|
|
|
|
|
/** Queue containing all triggered skills for this effect list. */
|
|
|
|
|
private volatile Queue<BuffInfo> _triggered;
|
|
|
|
|
/** Queue containing all dances/songs for this effect list. */
|
|
|
|
|
private volatile Queue<BuffInfo> _dances;
|
|
|
|
|
/** Queue containing all toggle for this effect list. */
|
|
|
|
|
private volatile Queue<BuffInfo> _toggles;
|
|
|
|
|
/** Queue containing all debuffs for this effect list. */
|
|
|
|
|
private volatile Queue<BuffInfo> _debuffs;
|
|
|
|
|
/** Queue containing all passives for this effect list. They bypass most of the actions and they are not included in most operations. */
|
|
|
|
|
private volatile Queue<BuffInfo> _passives;
|
|
|
|
|
/** Map containing the all stacked effect in progress for each abnormal type. */
|
|
|
|
|
private volatile Map<AbnormalType, BuffInfo> _stackedEffects;
|
|
|
|
|
/** Set containing all abnormal types that shouldn't be added to this creature effect list. */
|
|
|
|
@ -112,7 +113,7 @@ public final class CharEffectList
|
|
|
|
|
* Gets buff skills.
|
|
|
|
|
* @return the buff skills
|
|
|
|
|
*/
|
|
|
|
|
public Map<Integer, BuffInfo> getBuffs()
|
|
|
|
|
public Queue<BuffInfo> getBuffs()
|
|
|
|
|
{
|
|
|
|
|
if (_buffs == null)
|
|
|
|
|
{
|
|
|
|
@ -120,7 +121,7 @@ public final class CharEffectList
|
|
|
|
|
{
|
|
|
|
|
if (_buffs == null)
|
|
|
|
|
{
|
|
|
|
|
_buffs = new ConcurrentHashMap<>();
|
|
|
|
|
_buffs = new ConcurrentLinkedQueue<>();
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
@ -131,7 +132,7 @@ public final class CharEffectList
|
|
|
|
|
* Gets triggered skill skills.
|
|
|
|
|
* @return the triggered skill skills
|
|
|
|
|
*/
|
|
|
|
|
public Map<Integer, BuffInfo> getTriggered()
|
|
|
|
|
public Queue<BuffInfo> getTriggered()
|
|
|
|
|
{
|
|
|
|
|
if (_triggered == null)
|
|
|
|
|
{
|
|
|
|
@ -139,7 +140,7 @@ public final class CharEffectList
|
|
|
|
|
{
|
|
|
|
|
if (_triggered == null)
|
|
|
|
|
{
|
|
|
|
|
_triggered = new ConcurrentHashMap<>();
|
|
|
|
|
_triggered = new ConcurrentLinkedQueue<>();
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
@ -150,7 +151,7 @@ public final class CharEffectList
|
|
|
|
|
* Gets dance/song skills.
|
|
|
|
|
* @return the dance/song skills
|
|
|
|
|
*/
|
|
|
|
|
public Map<Integer, BuffInfo> getDances()
|
|
|
|
|
public Queue<BuffInfo> getDances()
|
|
|
|
|
{
|
|
|
|
|
if (_dances == null)
|
|
|
|
|
{
|
|
|
|
@ -158,7 +159,7 @@ public final class CharEffectList
|
|
|
|
|
{
|
|
|
|
|
if (_dances == null)
|
|
|
|
|
{
|
|
|
|
|
_dances = new ConcurrentHashMap<>();
|
|
|
|
|
_dances = new ConcurrentLinkedQueue<>();
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
@ -169,7 +170,7 @@ public final class CharEffectList
|
|
|
|
|
* Gets toggle skills.
|
|
|
|
|
* @return the toggle skills
|
|
|
|
|
*/
|
|
|
|
|
public Map<Integer, BuffInfo> getToggles()
|
|
|
|
|
public Queue<BuffInfo> getToggles()
|
|
|
|
|
{
|
|
|
|
|
if (_toggles == null)
|
|
|
|
|
{
|
|
|
|
@ -177,7 +178,7 @@ public final class CharEffectList
|
|
|
|
|
{
|
|
|
|
|
if (_toggles == null)
|
|
|
|
|
{
|
|
|
|
|
_toggles = new ConcurrentHashMap<>();
|
|
|
|
|
_toggles = new ConcurrentLinkedQueue<>();
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
@ -188,7 +189,7 @@ public final class CharEffectList
|
|
|
|
|
* Gets debuff skills.
|
|
|
|
|
* @return the debuff skills
|
|
|
|
|
*/
|
|
|
|
|
public Map<Integer, BuffInfo> getDebuffs()
|
|
|
|
|
public Queue<BuffInfo> getDebuffs()
|
|
|
|
|
{
|
|
|
|
|
if (_debuffs == null)
|
|
|
|
|
{
|
|
|
|
@ -196,7 +197,7 @@ public final class CharEffectList
|
|
|
|
|
{
|
|
|
|
|
if (_debuffs == null)
|
|
|
|
|
{
|
|
|
|
|
_debuffs = new ConcurrentHashMap<>();
|
|
|
|
|
_debuffs = new ConcurrentLinkedQueue<>();
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
@ -207,7 +208,7 @@ public final class CharEffectList
|
|
|
|
|
* Gets passive skills.
|
|
|
|
|
* @return the passive skills
|
|
|
|
|
*/
|
|
|
|
|
public Map<Integer, BuffInfo> getPassives()
|
|
|
|
|
public Queue<BuffInfo> getPassives()
|
|
|
|
|
{
|
|
|
|
|
if (_passives == null)
|
|
|
|
|
{
|
|
|
|
@ -215,7 +216,7 @@ public final class CharEffectList
|
|
|
|
|
{
|
|
|
|
|
if (_passives == null)
|
|
|
|
|
{
|
|
|
|
|
_passives = new ConcurrentHashMap<>();
|
|
|
|
|
_passives = new ConcurrentLinkedQueue<>();
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
@ -236,27 +237,27 @@ public final class CharEffectList
|
|
|
|
|
final List<BuffInfo> buffs = new ArrayList<>();
|
|
|
|
|
if (hasBuffs())
|
|
|
|
|
{
|
|
|
|
|
buffs.addAll(getBuffs().values());
|
|
|
|
|
buffs.addAll(getBuffs());
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
if (hasTriggered())
|
|
|
|
|
{
|
|
|
|
|
buffs.addAll(getTriggered().values());
|
|
|
|
|
buffs.addAll(getTriggered());
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
if (hasDances())
|
|
|
|
|
{
|
|
|
|
|
buffs.addAll(getDances().values());
|
|
|
|
|
buffs.addAll(getDances());
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
if (hasToggles())
|
|
|
|
|
{
|
|
|
|
|
buffs.addAll(getToggles().values());
|
|
|
|
|
buffs.addAll(getToggles());
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
if (hasDebuffs())
|
|
|
|
|
{
|
|
|
|
|
buffs.addAll(getDebuffs().values());
|
|
|
|
|
buffs.addAll(getDebuffs());
|
|
|
|
|
}
|
|
|
|
|
return buffs;
|
|
|
|
|
}
|
|
|
|
@ -266,14 +267,14 @@ public final class CharEffectList
|
|
|
|
|
* @param skill the skill
|
|
|
|
|
* @return the effect list
|
|
|
|
|
*/
|
|
|
|
|
private Map<Integer, BuffInfo> getEffectList(Skill skill)
|
|
|
|
|
private Queue<BuffInfo> getEffectList(Skill skill)
|
|
|
|
|
{
|
|
|
|
|
if (skill == null)
|
|
|
|
|
{
|
|
|
|
|
return null;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
final Map<Integer, BuffInfo> effects;
|
|
|
|
|
final Queue<BuffInfo> effects;
|
|
|
|
|
if (skill.isPassive())
|
|
|
|
|
{
|
|
|
|
|
effects = getPassives();
|
|
|
|
@ -312,7 +313,7 @@ public final class CharEffectList
|
|
|
|
|
{
|
|
|
|
|
if (hasBuffs())
|
|
|
|
|
{
|
|
|
|
|
for (BuffInfo info : getBuffs().values())
|
|
|
|
|
for (BuffInfo info : getBuffs())
|
|
|
|
|
{
|
|
|
|
|
if (info != null)
|
|
|
|
|
{
|
|
|
|
@ -329,7 +330,7 @@ public final class CharEffectList
|
|
|
|
|
|
|
|
|
|
if (hasTriggered())
|
|
|
|
|
{
|
|
|
|
|
for (BuffInfo info : getTriggered().values())
|
|
|
|
|
for (BuffInfo info : getTriggered())
|
|
|
|
|
{
|
|
|
|
|
if (info != null)
|
|
|
|
|
{
|
|
|
|
@ -346,7 +347,7 @@ public final class CharEffectList
|
|
|
|
|
|
|
|
|
|
if (hasDances())
|
|
|
|
|
{
|
|
|
|
|
for (BuffInfo info : getDances().values())
|
|
|
|
|
for (BuffInfo info : getDances())
|
|
|
|
|
{
|
|
|
|
|
if (info != null)
|
|
|
|
|
{
|
|
|
|
@ -363,7 +364,7 @@ public final class CharEffectList
|
|
|
|
|
|
|
|
|
|
if (hasToggles())
|
|
|
|
|
{
|
|
|
|
|
for (BuffInfo info : getToggles().values())
|
|
|
|
|
for (BuffInfo info : getToggles())
|
|
|
|
|
{
|
|
|
|
|
if (info != null)
|
|
|
|
|
{
|
|
|
|
@ -380,7 +381,7 @@ public final class CharEffectList
|
|
|
|
|
|
|
|
|
|
if (hasDebuffs())
|
|
|
|
|
{
|
|
|
|
|
for (BuffInfo info : getDebuffs().values())
|
|
|
|
|
for (BuffInfo info : getDebuffs())
|
|
|
|
|
{
|
|
|
|
|
if (info != null)
|
|
|
|
|
{
|
|
|
|
@ -417,29 +418,34 @@ public final class CharEffectList
|
|
|
|
|
public BuffInfo getBuffInfoBySkillId(int skillId)
|
|
|
|
|
{
|
|
|
|
|
BuffInfo info = null;
|
|
|
|
|
if (hasBuffs() && getBuffs().containsKey(skillId))
|
|
|
|
|
if (hasBuffs())
|
|
|
|
|
{
|
|
|
|
|
info = getBuffs().get(skillId);
|
|
|
|
|
info = getBuffs().stream().filter(b -> b.getSkill().getId() == skillId).findFirst().orElse(null);
|
|
|
|
|
}
|
|
|
|
|
else if (hasTriggered() && getTriggered().containsKey(skillId))
|
|
|
|
|
|
|
|
|
|
if (hasTriggered() && (info == null))
|
|
|
|
|
{
|
|
|
|
|
info = getTriggered().get(skillId);
|
|
|
|
|
info = getTriggered().stream().filter(b -> b.getSkill().getId() == skillId).findFirst().orElse(null);
|
|
|
|
|
}
|
|
|
|
|
else if (hasDances() && getDances().containsKey(skillId))
|
|
|
|
|
|
|
|
|
|
if (hasDances() && (info == null))
|
|
|
|
|
{
|
|
|
|
|
info = getDances().get(skillId);
|
|
|
|
|
info = getDances().stream().filter(b -> b.getSkill().getId() == skillId).findFirst().orElse(null);
|
|
|
|
|
}
|
|
|
|
|
else if (hasToggles() && getToggles().containsKey(skillId))
|
|
|
|
|
|
|
|
|
|
if (hasToggles() && (info == null))
|
|
|
|
|
{
|
|
|
|
|
info = getToggles().get(skillId);
|
|
|
|
|
info = getToggles().stream().filter(b -> b.getSkill().getId() == skillId).findFirst().orElse(null);
|
|
|
|
|
}
|
|
|
|
|
else if (hasDebuffs() && getDebuffs().containsKey(skillId))
|
|
|
|
|
|
|
|
|
|
if (hasDebuffs() && (info == null))
|
|
|
|
|
{
|
|
|
|
|
info = getDebuffs().get(skillId);
|
|
|
|
|
info = getDebuffs().stream().filter(b -> b.getSkill().getId() == skillId).findFirst().orElse(null);
|
|
|
|
|
}
|
|
|
|
|
else if (hasPassives() && getPassives().containsKey(skillId))
|
|
|
|
|
|
|
|
|
|
if (hasPassives() && (info == null))
|
|
|
|
|
{
|
|
|
|
|
info = getPassives().get(skillId);
|
|
|
|
|
info = getPassives().stream().filter(b -> b.getSkill().getId() == skillId).findFirst().orElse(null);
|
|
|
|
|
}
|
|
|
|
|
return info;
|
|
|
|
|
}
|
|
|
|
@ -467,7 +473,7 @@ public final class CharEffectList
|
|
|
|
|
{
|
|
|
|
|
if (_blockedBuffSlots == null)
|
|
|
|
|
{
|
|
|
|
|
_blockedBuffSlots = new CopyOnWriteArraySet<>();
|
|
|
|
|
_blockedBuffSlots = ConcurrentHashMap.newKeySet(blockedBuffSlots.size());
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
@ -539,13 +545,8 @@ public final class CharEffectList
|
|
|
|
|
return false;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
final Map<Integer, BuffInfo> effects = getEffectList(skill);
|
|
|
|
|
if ((effects == null) || effects.isEmpty())
|
|
|
|
|
{
|
|
|
|
|
return false;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
for (BuffInfo info : effects.values())
|
|
|
|
|
final Queue<BuffInfo> effects = getEffectList(skill);
|
|
|
|
|
for (BuffInfo info : effects)
|
|
|
|
|
{
|
|
|
|
|
if ((info != null) && (info.getSkill().getAbnormalType() == type))
|
|
|
|
|
{
|
|
|
|
@ -608,7 +609,7 @@ public final class CharEffectList
|
|
|
|
|
* @param info the buff info
|
|
|
|
|
* @param effects the effect list
|
|
|
|
|
*/
|
|
|
|
|
protected void stopAndRemove(BuffInfo info, Map<Integer, BuffInfo> effects)
|
|
|
|
|
protected void stopAndRemove(BuffInfo info, Queue<BuffInfo> effects)
|
|
|
|
|
{
|
|
|
|
|
stopAndRemove(true, info, effects);
|
|
|
|
|
}
|
|
|
|
@ -619,7 +620,7 @@ public final class CharEffectList
|
|
|
|
|
* @param info the buff info
|
|
|
|
|
* @param buffs the buff list
|
|
|
|
|
*/
|
|
|
|
|
private void stopAndRemove(boolean removed, BuffInfo info, Map<Integer, BuffInfo> buffs)
|
|
|
|
|
private void stopAndRemove(boolean removed, BuffInfo info, Queue<BuffInfo> buffs)
|
|
|
|
|
{
|
|
|
|
|
if (info == null)
|
|
|
|
|
{
|
|
|
|
@ -627,7 +628,7 @@ public final class CharEffectList
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
// Removes the buff from the given effect list.
|
|
|
|
|
buffs.remove(info.getSkill().getId());
|
|
|
|
|
buffs.remove(info);
|
|
|
|
|
// Stop the buff effects.
|
|
|
|
|
info.stopAllEffects(removed);
|
|
|
|
|
// If it's a hidden buff that ends, then decrease hidden buff count.
|
|
|
|
@ -644,7 +645,7 @@ public final class CharEffectList
|
|
|
|
|
// If it's an herb that ends, check if there are hidden buffs.
|
|
|
|
|
if (info.getSkill().isAbnormalInstant() && hasBuffs())
|
|
|
|
|
{
|
|
|
|
|
for (BuffInfo buff : getBuffs().values())
|
|
|
|
|
for (BuffInfo buff : getBuffs())
|
|
|
|
|
{
|
|
|
|
|
if ((buff != null) && (buff.getSkill().getAbnormalType() == info.getSkill().getAbnormalType()) && !buff.isInUse())
|
|
|
|
|
{
|
|
|
|
@ -702,31 +703,31 @@ public final class CharEffectList
|
|
|
|
|
boolean update = false;
|
|
|
|
|
if (hasBuffs())
|
|
|
|
|
{
|
|
|
|
|
getBuffs().values().stream().filter(info -> !info.getSkill().isStayAfterDeath()).forEach(info -> stopAndRemove(info, getBuffs()));
|
|
|
|
|
getBuffs().stream().filter(info -> !info.getSkill().isStayAfterDeath()).forEach(info -> stopAndRemove(info, getBuffs()));
|
|
|
|
|
update = true;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
if (hasTriggered())
|
|
|
|
|
{
|
|
|
|
|
getTriggered().values().stream().filter(info -> !info.getSkill().isStayAfterDeath()).forEach(info -> stopAndRemove(info, getTriggered()));
|
|
|
|
|
getTriggered().stream().filter(info -> !info.getSkill().isStayAfterDeath()).forEach(info -> stopAndRemove(info, getTriggered()));
|
|
|
|
|
update = true;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
if (hasDebuffs())
|
|
|
|
|
{
|
|
|
|
|
getDebuffs().values().stream().filter(info -> !info.getSkill().isStayAfterDeath()).forEach(info -> stopAndRemove(info, getDebuffs()));
|
|
|
|
|
getDebuffs().stream().filter(info -> !info.getSkill().isStayAfterDeath()).forEach(info -> stopAndRemove(info, getDebuffs()));
|
|
|
|
|
update = true;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
if (hasDances())
|
|
|
|
|
{
|
|
|
|
|
getDances().values().stream().filter(info -> !info.getSkill().isStayAfterDeath()).forEach(info -> stopAndRemove(info, getDances()));
|
|
|
|
|
getDances().stream().filter(info -> !info.getSkill().isStayAfterDeath()).forEach(info -> stopAndRemove(info, getDances()));
|
|
|
|
|
update = true;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
if (hasToggles())
|
|
|
|
|
{
|
|
|
|
|
getToggles().values().stream().filter(info -> !info.getSkill().isStayAfterDeath()).forEach(info -> stopAndRemove(info, getToggles()));
|
|
|
|
|
getToggles().stream().filter(info -> !info.getSkill().isStayAfterDeath()).forEach(info -> stopAndRemove(info, getToggles()));
|
|
|
|
|
update = true;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
@ -742,31 +743,31 @@ public final class CharEffectList
|
|
|
|
|
boolean update = false;
|
|
|
|
|
if (hasBuffs())
|
|
|
|
|
{
|
|
|
|
|
getBuffs().values().stream().filter(info -> !info.getSkill().isStayOnSubclassChange()).forEach(info -> stopAndRemove(info, getBuffs()));
|
|
|
|
|
getBuffs().stream().filter(info -> !info.getSkill().isStayOnSubclassChange()).forEach(info -> stopAndRemove(info, getBuffs()));
|
|
|
|
|
update = true;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
if (hasTriggered())
|
|
|
|
|
{
|
|
|
|
|
getTriggered().values().stream().filter(info -> !info.getSkill().isStayOnSubclassChange()).forEach(info -> stopAndRemove(info, getTriggered()));
|
|
|
|
|
getTriggered().stream().filter(info -> !info.getSkill().isStayOnSubclassChange()).forEach(info -> stopAndRemove(info, getTriggered()));
|
|
|
|
|
update = true;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
if (hasDebuffs())
|
|
|
|
|
{
|
|
|
|
|
getDebuffs().values().stream().filter(info -> !info.getSkill().isStayOnSubclassChange()).forEach(info -> stopAndRemove(info, getDebuffs()));
|
|
|
|
|
getDebuffs().stream().filter(info -> !info.getSkill().isStayOnSubclassChange()).forEach(info -> stopAndRemove(info, getDebuffs()));
|
|
|
|
|
update = true;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
if (hasDances())
|
|
|
|
|
{
|
|
|
|
|
getDances().values().stream().filter(info -> !info.getSkill().isStayOnSubclassChange()).forEach(info -> stopAndRemove(info, getDances()));
|
|
|
|
|
getDances().stream().filter(info -> !info.getSkill().isStayOnSubclassChange()).forEach(info -> stopAndRemove(info, getDances()));
|
|
|
|
|
update = true;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
if (hasToggles())
|
|
|
|
|
{
|
|
|
|
|
getToggles().values().stream().filter(info -> !info.getSkill().isStayOnSubclassChange()).forEach(info -> stopAndRemove(info, getToggles()));
|
|
|
|
|
getToggles().stream().filter(info -> !info.getSkill().isStayOnSubclassChange()).forEach(info -> stopAndRemove(info, getToggles()));
|
|
|
|
|
update = true;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
@ -783,12 +784,12 @@ public final class CharEffectList
|
|
|
|
|
{
|
|
|
|
|
if (hasBuffs())
|
|
|
|
|
{
|
|
|
|
|
getBuffs().forEach((k, info) -> stopAndRemove(info, getBuffs()));
|
|
|
|
|
getBuffs().forEach(b -> stopAndRemove(b, getBuffs()));
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
if (triggered && hasTriggered())
|
|
|
|
|
{
|
|
|
|
|
getTriggered().forEach((k, info) -> stopAndRemove(info, getTriggered()));
|
|
|
|
|
getTriggered().forEach(b -> stopAndRemove(b, getTriggered()));
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
// Update effect flags and icons.
|
|
|
|
@ -812,7 +813,7 @@ public final class CharEffectList
|
|
|
|
|
{
|
|
|
|
|
if (hasToggles())
|
|
|
|
|
{
|
|
|
|
|
getToggles().forEach((k, info) -> stopAndRemove(info, getToggles()));
|
|
|
|
|
getToggles().forEach(b -> stopAndRemove(b, getToggles()));
|
|
|
|
|
// Update effect flags and icons.
|
|
|
|
|
updateEffectList(update);
|
|
|
|
|
}
|
|
|
|
@ -826,7 +827,7 @@ public final class CharEffectList
|
|
|
|
|
{
|
|
|
|
|
if (hasDances())
|
|
|
|
|
{
|
|
|
|
|
getDances().forEach((k, info) -> stopAndRemove(info, getDances()));
|
|
|
|
|
getDances().forEach(b -> stopAndRemove(b, getDances()));
|
|
|
|
|
// Update effect flags and icons.
|
|
|
|
|
updateEffectList(update);
|
|
|
|
|
}
|
|
|
|
@ -840,7 +841,7 @@ public final class CharEffectList
|
|
|
|
|
{
|
|
|
|
|
if (hasDebuffs())
|
|
|
|
|
{
|
|
|
|
|
getDebuffs().forEach((k, info) -> stopAndRemove(info, getDebuffs()));
|
|
|
|
|
getDebuffs().forEach(b -> stopAndRemove(b, getDebuffs()));
|
|
|
|
|
// Update effect flags and icons.
|
|
|
|
|
updateEffectList(update);
|
|
|
|
|
}
|
|
|
|
@ -864,31 +865,31 @@ public final class CharEffectList
|
|
|
|
|
|
|
|
|
|
if (hasBuffs())
|
|
|
|
|
{
|
|
|
|
|
getBuffs().values().stream().filter(Objects::nonNull).forEach(action);
|
|
|
|
|
getBuffs().stream().filter(Objects::nonNull).forEach(action);
|
|
|
|
|
update = true;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
if (hasTriggered())
|
|
|
|
|
{
|
|
|
|
|
getTriggered().values().stream().filter(Objects::nonNull).forEach(action);
|
|
|
|
|
getTriggered().stream().filter(Objects::nonNull).forEach(action);
|
|
|
|
|
update = true;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
if (hasDances())
|
|
|
|
|
{
|
|
|
|
|
getDances().values().stream().filter(Objects::nonNull).forEach(action);
|
|
|
|
|
getDances().stream().filter(Objects::nonNull).forEach(action);
|
|
|
|
|
update = true;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
if (hasToggles())
|
|
|
|
|
{
|
|
|
|
|
getToggles().values().stream().filter(Objects::nonNull).forEach(action);
|
|
|
|
|
getToggles().stream().filter(Objects::nonNull).forEach(action);
|
|
|
|
|
update = true;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
if (hasDebuffs())
|
|
|
|
|
{
|
|
|
|
|
getDebuffs().values().stream().filter(Objects::nonNull).forEach(action);
|
|
|
|
|
getDebuffs().stream().filter(Objects::nonNull).forEach(action);
|
|
|
|
|
update = true;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
@ -912,7 +913,7 @@ public final class CharEffectList
|
|
|
|
|
final BuffInfo info = getBuffInfoBySkillId(skillId);
|
|
|
|
|
if (info != null)
|
|
|
|
|
{
|
|
|
|
|
stopSkillEffects(removed, info.getSkill());
|
|
|
|
|
remove(removed, info);
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
@ -929,15 +930,9 @@ public final class CharEffectList
|
|
|
|
|
*/
|
|
|
|
|
public void stopSkillEffects(boolean removed, Skill skill)
|
|
|
|
|
{
|
|
|
|
|
if ((skill == null) || !isAffectedBySkill(skill.getId()))
|
|
|
|
|
if (skill != null)
|
|
|
|
|
{
|
|
|
|
|
return;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
final Map<Integer, BuffInfo> effects = getEffectList(skill);
|
|
|
|
|
if (effects != null)
|
|
|
|
|
{
|
|
|
|
|
remove(removed, effects.get(skill.getId()));
|
|
|
|
|
stopSkillEffects(removed, skill.getId());
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
@ -976,31 +971,31 @@ public final class CharEffectList
|
|
|
|
|
boolean update = false;
|
|
|
|
|
if (hasBuffs())
|
|
|
|
|
{
|
|
|
|
|
getBuffs().values().stream().filter(info -> info.getSkill().isRemovedOnAnyActionExceptMove()).forEach(info -> stopAndRemove(info, getBuffs()));
|
|
|
|
|
getBuffs().stream().filter(info -> info.getSkill().isRemovedOnAnyActionExceptMove()).forEach(info -> stopAndRemove(info, getBuffs()));
|
|
|
|
|
update = true;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
if (hasTriggered())
|
|
|
|
|
{
|
|
|
|
|
getTriggered().values().stream().filter(info -> info.getSkill().isRemovedOnAnyActionExceptMove()).forEach(info -> stopAndRemove(info, getTriggered()));
|
|
|
|
|
getTriggered().stream().filter(info -> info.getSkill().isRemovedOnAnyActionExceptMove()).forEach(info -> stopAndRemove(info, getTriggered()));
|
|
|
|
|
update = true;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
if (hasDebuffs())
|
|
|
|
|
{
|
|
|
|
|
getDebuffs().values().stream().filter(info -> info.getSkill().isRemovedOnAnyActionExceptMove()).forEach(info -> stopAndRemove(info, getDebuffs()));
|
|
|
|
|
getDebuffs().stream().filter(info -> info.getSkill().isRemovedOnAnyActionExceptMove()).forEach(info -> stopAndRemove(info, getDebuffs()));
|
|
|
|
|
update = true;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
if (hasDances())
|
|
|
|
|
{
|
|
|
|
|
getDances().values().stream().filter(info -> info.getSkill().isRemovedOnAnyActionExceptMove()).forEach(info -> stopAndRemove(info, getDances()));
|
|
|
|
|
getDances().stream().filter(info -> info.getSkill().isRemovedOnAnyActionExceptMove()).forEach(info -> stopAndRemove(info, getDances()));
|
|
|
|
|
update = true;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
if (hasToggles())
|
|
|
|
|
{
|
|
|
|
|
getToggles().values().stream().filter(info -> info.getSkill().isRemovedOnAnyActionExceptMove()).forEach(info -> stopAndRemove(info, getToggles()));
|
|
|
|
|
getToggles().stream().filter(info -> info.getSkill().isRemovedOnAnyActionExceptMove()).forEach(info -> stopAndRemove(info, getToggles()));
|
|
|
|
|
update = true;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
@ -1018,25 +1013,25 @@ public final class CharEffectList
|
|
|
|
|
{
|
|
|
|
|
if (hasBuffs())
|
|
|
|
|
{
|
|
|
|
|
getBuffs().values().stream().filter(Objects::nonNull).filter(info -> info.getSkill().isRemovedOnDamage()).forEach(info -> stopAndRemove(info, getBuffs()));
|
|
|
|
|
getBuffs().stream().filter(Objects::nonNull).filter(info -> info.getSkill().isRemovedOnDamage()).forEach(info -> stopAndRemove(info, getBuffs()));
|
|
|
|
|
update = true;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
if (hasTriggered())
|
|
|
|
|
{
|
|
|
|
|
getTriggered().values().stream().filter(Objects::nonNull).filter(info -> info.getSkill().isRemovedOnDamage()).forEach(info -> stopAndRemove(info, getTriggered()));
|
|
|
|
|
getTriggered().stream().filter(Objects::nonNull).filter(info -> info.getSkill().isRemovedOnDamage()).forEach(info -> stopAndRemove(info, getTriggered()));
|
|
|
|
|
update = true;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
if (hasDances())
|
|
|
|
|
{
|
|
|
|
|
getDances().values().stream().filter(Objects::nonNull).filter(info -> info.getSkill().isRemovedOnDamage()).forEach(info -> stopAndRemove(info, getDances()));
|
|
|
|
|
getDances().stream().filter(Objects::nonNull).filter(info -> info.getSkill().isRemovedOnDamage()).forEach(info -> stopAndRemove(info, getDances()));
|
|
|
|
|
update = true;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
if (hasToggles())
|
|
|
|
|
{
|
|
|
|
|
getToggles().values().stream().filter(Objects::nonNull).filter(info -> info.getSkill().isRemovedOnDamage()).forEach(info -> stopAndRemove(info, getToggles()));
|
|
|
|
|
getToggles().stream().filter(Objects::nonNull).filter(info -> info.getSkill().isRemovedOnDamage()).forEach(info -> stopAndRemove(info, getToggles()));
|
|
|
|
|
update = true;
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
@ -1045,7 +1040,7 @@ public final class CharEffectList
|
|
|
|
|
{
|
|
|
|
|
if (hasDebuffs())
|
|
|
|
|
{
|
|
|
|
|
getDebuffs().values().stream().filter(Objects::nonNull).filter(info -> info.getSkill().isRemovedOnDamage()).forEach(info -> stopAndRemove(info, getDebuffs()));
|
|
|
|
|
getDebuffs().stream().filter(Objects::nonNull).filter(info -> info.getSkill().isRemovedOnDamage()).forEach(info -> stopAndRemove(info, getDebuffs()));
|
|
|
|
|
update = true;
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
@ -1148,7 +1143,7 @@ public final class CharEffectList
|
|
|
|
|
boolean update = false;
|
|
|
|
|
if (hasBuffs())
|
|
|
|
|
{
|
|
|
|
|
for (BuffInfo info : getBuffs().values())
|
|
|
|
|
for (BuffInfo info : getBuffs())
|
|
|
|
|
{
|
|
|
|
|
update |= function.apply(info);
|
|
|
|
|
}
|
|
|
|
@ -1156,7 +1151,7 @@ public final class CharEffectList
|
|
|
|
|
|
|
|
|
|
if (hasTriggered())
|
|
|
|
|
{
|
|
|
|
|
for (BuffInfo info : getTriggered().values())
|
|
|
|
|
for (BuffInfo info : getTriggered())
|
|
|
|
|
{
|
|
|
|
|
update |= function.apply(info);
|
|
|
|
|
}
|
|
|
|
@ -1164,7 +1159,7 @@ public final class CharEffectList
|
|
|
|
|
|
|
|
|
|
if (dances && hasDances())
|
|
|
|
|
{
|
|
|
|
|
for (BuffInfo info : getDances().values())
|
|
|
|
|
for (BuffInfo info : getDances())
|
|
|
|
|
{
|
|
|
|
|
update |= function.apply(info);
|
|
|
|
|
}
|
|
|
|
@ -1172,7 +1167,7 @@ public final class CharEffectList
|
|
|
|
|
|
|
|
|
|
if (hasToggles())
|
|
|
|
|
{
|
|
|
|
|
for (BuffInfo info : getToggles().values())
|
|
|
|
|
for (BuffInfo info : getToggles())
|
|
|
|
|
{
|
|
|
|
|
update |= function.apply(info);
|
|
|
|
|
}
|
|
|
|
@ -1180,7 +1175,7 @@ public final class CharEffectList
|
|
|
|
|
|
|
|
|
|
if (hasDebuffs())
|
|
|
|
|
{
|
|
|
|
|
for (BuffInfo info : getDebuffs().values())
|
|
|
|
|
for (BuffInfo info : getDebuffs())
|
|
|
|
|
{
|
|
|
|
|
update |= function.apply(info);
|
|
|
|
|
}
|
|
|
|
@ -1196,7 +1191,7 @@ public final class CharEffectList
|
|
|
|
|
*/
|
|
|
|
|
public void remove(boolean removed, BuffInfo info)
|
|
|
|
|
{
|
|
|
|
|
if ((info == null) || !isAffectedBySkill(info.getSkill().getId()))
|
|
|
|
|
if (info == null)
|
|
|
|
|
{
|
|
|
|
|
return;
|
|
|
|
|
}
|
|
|
|
@ -1241,13 +1236,15 @@ public final class CharEffectList
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
// Puts the effects in the list.
|
|
|
|
|
final BuffInfo infoToRemove = getPassives().put(skill.getId(), info);
|
|
|
|
|
if (infoToRemove != null)
|
|
|
|
|
getPassives().stream().filter(b -> b.getSkill().getId() == skill.getId()).forEach(b ->
|
|
|
|
|
{
|
|
|
|
|
// Removes the old stats from the creature if the skill was present.
|
|
|
|
|
infoToRemove.setInUse(false);
|
|
|
|
|
infoToRemove.removeStats();
|
|
|
|
|
}
|
|
|
|
|
b.setInUse(false);
|
|
|
|
|
b.removeStats();
|
|
|
|
|
getPassives().remove(b);
|
|
|
|
|
});
|
|
|
|
|
|
|
|
|
|
getPassives().add(info);
|
|
|
|
|
|
|
|
|
|
// Initialize effects.
|
|
|
|
|
info.initializeEffects();
|
|
|
|
@ -1327,7 +1324,7 @@ public final class CharEffectList
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
// Select the map that holds the effects related to this skill.
|
|
|
|
|
final Map<Integer, BuffInfo> effects = getEffectList(skill);
|
|
|
|
|
final Queue<BuffInfo> effects = getEffectList(skill);
|
|
|
|
|
// Remove first buff when buff list is full.
|
|
|
|
|
if (!skill.isDebuff() && !skill.isToggle() && !skill.is7Signs() && !doesStack(skill))
|
|
|
|
|
{
|
|
|
|
@ -1345,7 +1342,7 @@ public final class CharEffectList
|
|
|
|
|
buffsToRemove = getBuffCount() - _owner.getStat().getMaxBuffCount();
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
for (BuffInfo bi : effects.values())
|
|
|
|
|
for (BuffInfo bi : effects)
|
|
|
|
|
{
|
|
|
|
|
if (buffsToRemove < 0)
|
|
|
|
|
{
|
|
|
|
@ -1370,7 +1367,7 @@ public final class CharEffectList
|
|
|
|
|
|
|
|
|
|
// After removing old buff (same ID) or stacked buff (same abnormal type),
|
|
|
|
|
// Add the buff to the end of the effect list.
|
|
|
|
|
effects.put(skill.getId(), info);
|
|
|
|
|
effects.add(info);
|
|
|
|
|
// Initialize effects.
|
|
|
|
|
info.initializeEffects();
|
|
|
|
|
// Update effect flags and icons.
|
|
|
|
@ -1443,7 +1440,7 @@ public final class CharEffectList
|
|
|
|
|
// Buffs.
|
|
|
|
|
if (hasBuffs())
|
|
|
|
|
{
|
|
|
|
|
for (BuffInfo info : getBuffs().values())
|
|
|
|
|
for (BuffInfo info : getBuffs())
|
|
|
|
|
{
|
|
|
|
|
if (info.getSkill().isHealingPotionSkill())
|
|
|
|
|
{
|
|
|
|
@ -1459,7 +1456,7 @@ public final class CharEffectList
|
|
|
|
|
// Triggered buffs.
|
|
|
|
|
if (hasTriggered())
|
|
|
|
|
{
|
|
|
|
|
for (BuffInfo info : getTriggered().values())
|
|
|
|
|
for (BuffInfo info : getTriggered())
|
|
|
|
|
{
|
|
|
|
|
addIcon(info, asu, ps, psSummon, os, isSummon);
|
|
|
|
|
}
|
|
|
|
@ -1468,7 +1465,7 @@ public final class CharEffectList
|
|
|
|
|
// Songs and dances.
|
|
|
|
|
if (hasDances())
|
|
|
|
|
{
|
|
|
|
|
for (BuffInfo info : getDances().values())
|
|
|
|
|
for (BuffInfo info : getDances())
|
|
|
|
|
{
|
|
|
|
|
addIcon(info, asu, ps, psSummon, os, isSummon);
|
|
|
|
|
}
|
|
|
|
@ -1477,7 +1474,7 @@ public final class CharEffectList
|
|
|
|
|
// Toggles.
|
|
|
|
|
if (hasToggles())
|
|
|
|
|
{
|
|
|
|
|
for (BuffInfo info : getToggles().values())
|
|
|
|
|
for (BuffInfo info : getToggles())
|
|
|
|
|
{
|
|
|
|
|
addIcon(info, asu, ps, psSummon, os, isSummon);
|
|
|
|
|
}
|
|
|
|
@ -1486,7 +1483,7 @@ public final class CharEffectList
|
|
|
|
|
// Debuffs.
|
|
|
|
|
if (hasDebuffs())
|
|
|
|
|
{
|
|
|
|
|
for (BuffInfo info : getDebuffs().values())
|
|
|
|
|
for (BuffInfo info : getDebuffs())
|
|
|
|
|
{
|
|
|
|
|
addIcon(info, asu, ps, psSummon, os, isSummon);
|
|
|
|
|
}
|
|
|
|
@ -1606,7 +1603,7 @@ public final class CharEffectList
|
|
|
|
|
{
|
|
|
|
|
if (hasBuffs())
|
|
|
|
|
{
|
|
|
|
|
for (BuffInfo info : getBuffs().values())
|
|
|
|
|
for (BuffInfo info : getBuffs())
|
|
|
|
|
{
|
|
|
|
|
if (info == null)
|
|
|
|
|
{
|
|
|
|
@ -1627,7 +1624,7 @@ public final class CharEffectList
|
|
|
|
|
|
|
|
|
|
if (hasTriggered())
|
|
|
|
|
{
|
|
|
|
|
for (BuffInfo info : getTriggered().values())
|
|
|
|
|
for (BuffInfo info : getTriggered())
|
|
|
|
|
{
|
|
|
|
|
if (info == null)
|
|
|
|
|
{
|
|
|
|
@ -1648,7 +1645,7 @@ public final class CharEffectList
|
|
|
|
|
|
|
|
|
|
if (hasToggles())
|
|
|
|
|
{
|
|
|
|
|
for (BuffInfo info : getToggles().values())
|
|
|
|
|
for (BuffInfo info : getToggles())
|
|
|
|
|
{
|
|
|
|
|
if (info == null)
|
|
|
|
|
{
|
|
|
|
@ -1669,7 +1666,7 @@ public final class CharEffectList
|
|
|
|
|
|
|
|
|
|
if (hasDebuffs())
|
|
|
|
|
{
|
|
|
|
|
for (BuffInfo info : getDebuffs().values())
|
|
|
|
|
for (BuffInfo info : getDebuffs())
|
|
|
|
|
{
|
|
|
|
|
if ((info != null) && info.getSkill().isRemovedOnDamage())
|
|
|
|
|
{
|
|
|
|
@ -1688,7 +1685,7 @@ public final class CharEffectList
|
|
|
|
|
int flags = 0;
|
|
|
|
|
if (hasBuffs())
|
|
|
|
|
{
|
|
|
|
|
for (BuffInfo info : getBuffs().values())
|
|
|
|
|
for (BuffInfo info : getBuffs())
|
|
|
|
|
{
|
|
|
|
|
if (info != null)
|
|
|
|
|
{
|
|
|
|
@ -1702,7 +1699,7 @@ public final class CharEffectList
|
|
|
|
|
|
|
|
|
|
if (hasTriggered())
|
|
|
|
|
{
|
|
|
|
|
for (BuffInfo info : getTriggered().values())
|
|
|
|
|
for (BuffInfo info : getTriggered())
|
|
|
|
|
{
|
|
|
|
|
if (info != null)
|
|
|
|
|
{
|
|
|
|
@ -1716,7 +1713,7 @@ public final class CharEffectList
|
|
|
|
|
|
|
|
|
|
if (hasDebuffs())
|
|
|
|
|
{
|
|
|
|
|
for (BuffInfo info : getDebuffs().values())
|
|
|
|
|
for (BuffInfo info : getDebuffs())
|
|
|
|
|
{
|
|
|
|
|
if (info != null)
|
|
|
|
|
{
|
|
|
|
@ -1730,7 +1727,7 @@ public final class CharEffectList
|
|
|
|
|
|
|
|
|
|
if (hasDances())
|
|
|
|
|
{
|
|
|
|
|
for (BuffInfo info : getDances().values())
|
|
|
|
|
for (BuffInfo info : getDances())
|
|
|
|
|
{
|
|
|
|
|
if (info != null)
|
|
|
|
|
{
|
|
|
|
@ -1744,7 +1741,7 @@ public final class CharEffectList
|
|
|
|
|
|
|
|
|
|
if (hasToggles())
|
|
|
|
|
{
|
|
|
|
|
for (BuffInfo info : getToggles().values())
|
|
|
|
|
for (BuffInfo info : getToggles())
|
|
|
|
|
{
|
|
|
|
|
if (info != null)
|
|
|
|
|
{
|
|
|
|
|