Index: com/l2jserver/gameserver/model/CharEffectList.java =================================================================== --- com/l2jserver/gameserver/model/CharEffectList.java (revision 4888) +++ com/l2jserver/gameserver/model/CharEffectList.java (working copy) @@ -37,6 +37,7 @@ import com.l2jserver.gameserver.network.serverpackets.ExOlympiadSpelledInfo; import com.l2jserver.gameserver.network.serverpackets.PartySpelled; import com.l2jserver.gameserver.network.serverpackets.SystemMessage; +import com.l2jserver.gameserver.skills.StackType; import com.l2jserver.gameserver.templates.skills.L2EffectType; import com.l2jserver.gameserver.templates.skills.L2SkillType; @@ -72,7 +73,7 @@ private FastList _passives; // They bypass most of the actions, keep in mind that those arent included in getAllEffects() // The table containing the List of all stacked effect in progress for each Stack group Identifier - private Map> _stackedEffects; + private Map> _stackedEffects; private volatile boolean _hasBuffsRemovedOnAnyAction = false; private volatile boolean _hasBuffsRemovedOnDamage = false; @@ -287,11 +288,11 @@ return false; } - String stackType = checkSkill._effectTemplates[0].abnormalType; + StackType stackType = checkSkill._effectTemplates[0].abnormalType; for (L2Effect e : _buffs) { - if (e.getAbnormalType() != null && e.getAbnormalType().equals(stackType)) + if (e.getAbnormalType() != null && e.getAbnormalType() == stackType) { return true; } @@ -616,7 +617,7 @@ effectList = _buffs; } - if ("none".equals(effect.getAbnormalType())) + if (StackType.STACKTYPE_NONE == effect.getAbnormalType()) { // Remove Func added by this effect from the L2Character Calculator _owner.removeStatsOwner(effect); @@ -696,7 +697,7 @@ _passives = new FastList().shared(); // Passive effects dont need stack type - if ("none".equals(newEffect.getAbnormalType())) + if (StackType.STACKTYPE_NONE == newEffect.getAbnormalType()) { // Set this L2Effect to In Use if (newEffect.setInUse(true)) @@ -730,7 +731,7 @@ _debuffs = new FastList().shared(); for (L2Effect e : _debuffs) { - if (e != null && e.getSkill().getId() == newEffect.getSkill().getId() && e.getEffectType() == newEffect.getEffectType() && e.getAbnormalLvl() == newEffect.getAbnormalLvl() && e.getAbnormalType().equals(newEffect.getAbnormalType())) + if (e != null && e.getSkill().getId() == newEffect.getSkill().getId() && e.getEffectType() == newEffect.getEffectType() && e.getAbnormalLvl() == newEffect.getAbnormalLvl() && e.getAbnormalType() == newEffect.getAbnormalType()) { // Started scheduled timer needs to be canceled. newEffect.stopEffectTask(); @@ -746,7 +747,7 @@ for (L2Effect e : _buffs) { - if (e != null && e.getSkill().getId() == newEffect.getSkill().getId() && e.getEffectType() == newEffect.getEffectType() && e.getAbnormalLvl() == newEffect.getAbnormalLvl() && e.getAbnormalType().equals(newEffect.getAbnormalType())) + if (e != null && e.getSkill().getId() == newEffect.getSkill().getId() && e.getEffectType() == newEffect.getEffectType() && e.getAbnormalLvl() == newEffect.getAbnormalLvl() && e.getAbnormalType() == newEffect.getAbnormalType()) { e.exit(); // exit this } @@ -850,7 +851,7 @@ } // Check if a stack group is defined for this effect - if ("none".equals(newEffect.getAbnormalType())) + if (StackType.STACKTYPE_NONE == newEffect.getAbnormalType()) { // Set this L2Effect to In Use if (newEffect.setInUse(true)) @@ -864,7 +865,7 @@ L2Effect effectToAdd = null; L2Effect effectToRemove = null; if (_stackedEffects == null) - _stackedEffects = new FastMap>(); + _stackedEffects = new FastMap>(); // Get the list of all stacked effects corresponding to the stack type of the L2Effect to add stackQueue = _stackedEffects.get(newEffect.getAbnormalType()); Index: com/l2jserver/gameserver/model/L2Effect.java =================================================================== --- com/l2jserver/gameserver/model/L2Effect.java (revision 4888) +++ com/l2jserver/gameserver/model/L2Effect.java (working copy) @@ -35,6 +35,7 @@ import com.l2jserver.gameserver.network.serverpackets.SystemMessage; import com.l2jserver.gameserver.skills.AbnormalEffect; import com.l2jserver.gameserver.skills.Env; +import com.l2jserver.gameserver.skills.StackType; import com.l2jserver.gameserver.skills.funcs.Func; import com.l2jserver.gameserver.skills.funcs.FuncTemplate; import com.l2jserver.gameserver.skills.funcs.Lambda; @@ -134,7 +135,7 @@ private ScheduledFuture _currentFuture; /** The Identifier of the stack group */ - private final String _abnormalType; + private final StackType _abnormalType; /** The position of the effect in the stack group */ private final byte _abnormalLvl; @@ -305,7 +306,7 @@ return _startConditionsCorrect; } - public String getAbnormalType() + public StackType getAbnormalType() { return _abnormalType; } Index: com/l2jserver/gameserver/model/L2Skill.java =================================================================== --- com/l2jserver/gameserver/model/L2Skill.java (revision 4888) +++ com/l2jserver/gameserver/model/L2Skill.java (working copy) @@ -49,6 +49,7 @@ import com.l2jserver.gameserver.skills.BaseStats; import com.l2jserver.gameserver.skills.Env; import com.l2jserver.gameserver.skills.Formulas; +import com.l2jserver.gameserver.skills.StackType; import com.l2jserver.gameserver.skills.Stats; import com.l2jserver.gameserver.skills.conditions.Condition; import com.l2jserver.gameserver.skills.funcs.Func; @@ -173,7 +174,7 @@ private final int _negateLvl; // abnormalLvl is negated with negateLvl private final int[] _negateId; // cancels the effect of skill ID private final L2SkillType[] _negateStats; // lists the effect types that are canceled - private final Map _negateAbnormals; // lists the effect abnormal types with order below the presented that are canceled + private final Map _negateAbnormals; // lists the effect abnormal types with order below the presented that are canceled private final int _maxNegatedEffects; // maximum number of effects to negate private final boolean _stayAfterDeath; // skill should stay after death @@ -358,19 +359,19 @@ String negateAbnormals = set.getString("negateAbnormals", null); if (negateAbnormals != null && negateAbnormals != "") { - _negateAbnormals = new FastMap(); + _negateAbnormals = new FastMap(); for (String ngtStack : negateAbnormals.split(";")) { String[] ngt = ngtStack.split(","); if (ngt.length == 1) // Only abnormalType is present, without abnormalLvl { - _negateAbnormals.put(ngt[0], Byte.MAX_VALUE); + _negateAbnormals.put(StackType.getStackType(ngt[0]), Byte.MAX_VALUE); } else if (ngt.length == 2) // Both abnormalType and abnormalLvl are present { try { - _negateAbnormals.put(ngt[0], Byte.parseByte(ngt[1])); + _negateAbnormals.put(StackType.getStackType(ngt[0]), Byte.parseByte(ngt[1])); } catch (Exception e) { @@ -680,7 +681,7 @@ return _negateStats; } - public final Map getNegateAbnormals() + public final Map getNegateAbnormals() { return _negateAbnormals; } Index: com/l2jserver/gameserver/model/actor/instance/L2BabyPetInstance.java =================================================================== --- com/l2jserver/gameserver/model/actor/instance/L2BabyPetInstance.java (revision 4888) +++ com/l2jserver/gameserver/model/actor/instance/L2BabyPetInstance.java (working copy) @@ -317,7 +317,7 @@ // effect with same stacktype and greater or equal stackorder if (skill.hasEffects() && !"none".equals(skill.getEffectTemplates()[0].abnormalType) - && e.getAbnormalType().equals(skill.getEffectTemplates()[0].abnormalType) + && e.getAbnormalType() == skill.getEffectTemplates()[0].abnormalType && e.getAbnormalLvl() >= skill.getEffectTemplates()[0].abnormalLvl) { iter.remove(); Index: com/l2jserver/gameserver/skills/DocumentBase.java =================================================================== --- com/l2jserver/gameserver/skills/DocumentBase.java (revision 4888) +++ com/l2jserver/gameserver/skills/DocumentBase.java (working copy) @@ -320,10 +320,10 @@ event = AbnormalEffect.getByName(spc); } byte abnormalLvl = 0; - String abnormalType = "none"; + StackType abnormalType = StackType.STACKTYPE_NONE; if (attrs.getNamedItem("abnormalType") != null) { - abnormalType = attrs.getNamedItem("abnormalType").getNodeValue(); + abnormalType = StackType.getStackType(attrs.getNamedItem("abnormalType").getNodeValue()); } if (attrs.getNamedItem("abnormalLvl") != null) { Index: com/l2jserver/gameserver/skills/StackType.java =================================================================== --- com/l2jserver/gameserver/skills/StackType.java (revision 0) +++ com/l2jserver/gameserver/skills/StackType.java (revision 0) @@ -0,0 +1,50 @@ +/* + * 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 com.l2jserver.gameserver.skills; + +import javolution.util.FastMap; + +/** + * + * @author DrHouse + * + */ +public class StackType +{ + private static final FastMap _table = new FastMap(); + public static final StackType STACKTYPE_NONE = new StackType(); + + static + { + _table.put("none", STACKTYPE_NONE); + } + + private StackType() + { + super(); + } + + /** + * Make sure no concurrent access is done to this map. Usage is only meant while server is booting up + * + */ + public static StackType getStackType(String stacktype) + { + if (_table.containsKey(stacktype)) + return _table.get(stacktype); + + return _table.put(stacktype, new StackType()); + } +} \ No newline at end of file Index: com/l2jserver/gameserver/skills/effects/EffectCancel.java =================================================================== --- com/l2jserver/gameserver/skills/effects/EffectCancel.java (revision 4888) +++ com/l2jserver/gameserver/skills/effects/EffectCancel.java (working copy) @@ -22,6 +22,7 @@ import com.l2jserver.gameserver.model.actor.instance.L2PcInstance; import com.l2jserver.gameserver.skills.Env; import com.l2jserver.gameserver.skills.Formulas; +import com.l2jserver.gameserver.skills.StackType; import com.l2jserver.gameserver.templates.effects.EffectTemplate; import com.l2jserver.gameserver.templates.skills.L2EffectType; import com.l2jserver.util.Rnd; @@ -125,9 +126,9 @@ if (eff == null) continue; - for (String negateAbnormalType : effect.getSkill().getNegateAbnormals().keySet()) + for (StackType negateAbnormalType : effect.getSkill().getNegateAbnormals().keySet()) { - if (negateAbnormalType.equalsIgnoreCase(eff.getAbnormalType()) && effect.getSkill().getNegateAbnormals().get(negateAbnormalType) >= eff.getAbnormalLvl()) + if (negateAbnormalType == eff.getAbnormalType() && effect.getSkill().getNegateAbnormals().get(negateAbnormalType) >= eff.getAbnormalLvl()) { if (calcCancelSuccess(eff, cancelLvl, (int)rate)) eff.exit(); Index: com/l2jserver/gameserver/skills/effects/EffectNegate.java =================================================================== --- com/l2jserver/gameserver/skills/effects/EffectNegate.java (revision 4888) +++ com/l2jserver/gameserver/skills/effects/EffectNegate.java (working copy) @@ -17,6 +17,7 @@ import com.l2jserver.gameserver.model.L2Effect; import com.l2jserver.gameserver.model.L2Skill; import com.l2jserver.gameserver.skills.Env; +import com.l2jserver.gameserver.skills.StackType; import com.l2jserver.gameserver.templates.effects.EffectTemplate; import com.l2jserver.gameserver.templates.skills.L2EffectType; import com.l2jserver.gameserver.templates.skills.L2SkillType; @@ -59,9 +60,9 @@ if (effect == null) continue; - for (String negateAbnormalType : skill.getNegateAbnormals().keySet()) + for (StackType negateAbnormalType : skill.getNegateAbnormals().keySet()) { - if (negateAbnormalType.equalsIgnoreCase(effect.getAbnormalType()) && skill.getNegateAbnormals().get(negateAbnormalType) >= effect.getAbnormalLvl()) + if (negateAbnormalType == effect.getAbnormalType() && skill.getNegateAbnormals().get(negateAbnormalType) >= effect.getAbnormalLvl()) effect.exit(); } } Index: com/l2jserver/gameserver/templates/effects/EffectTemplate.java =================================================================== --- com/l2jserver/gameserver/templates/effects/EffectTemplate.java (revision 4888) +++ com/l2jserver/gameserver/templates/effects/EffectTemplate.java (working copy) @@ -23,6 +23,7 @@ import com.l2jserver.gameserver.model.L2Effect; import com.l2jserver.gameserver.skills.AbnormalEffect; import com.l2jserver.gameserver.skills.Env; +import com.l2jserver.gameserver.skills.StackType; import com.l2jserver.gameserver.skills.conditions.Condition; import com.l2jserver.gameserver.skills.funcs.FuncTemplate; import com.l2jserver.gameserver.skills.funcs.Lambda; @@ -49,7 +50,7 @@ public final AbnormalEffect[] specialEffect; public final AbnormalEffect eventEffect; public FuncTemplate[] funcTemplates; - public final String abnormalType; + public final StackType abnormalType; public final byte abnormalLvl; public final boolean icon; public final String funcName; @@ -64,7 +65,7 @@ public EffectTemplate(Condition pAttachCond, Condition pApplayCond, String func, Lambda pLambda, int pCounter, int pAbnormalTime, AbnormalEffect pAbnormalEffect, AbnormalEffect[] pSpecialEffect, - AbnormalEffect pEventEffect, String pAbnormalType, byte pAbnormalLvl, boolean showicon, + AbnormalEffect pEventEffect, StackType pAbnormalType, byte pAbnormalLvl, boolean showicon, double ePower, L2SkillType eType, int trigId, int trigLvl, ChanceCondition chanceCond, boolean passiveEff) { attachCond = pAttachCond;