Browse Source

BETA: Abnormal visual effect rework:
* Moved abnormal visual effects from effect to skill.
* Added missing !JavaDocs.
* Removed unused `L2EffectType`.
* Removed `L2AbnormalZone`, instead use `L2EffectZone` with a custom skill.
* Added all missing abnormal visual effects.
* Fixed/removed all custom abnormal visual effects.
* Removed hardcoded abnormal visual effects, they must be present in skill or set to the character.
* Added fixed all values for abnormal visual effects.
* Thanks to: Nos
* Fixed abnormal visual effect admin menues.
* Added event abnormal visual effect menu, although they are not working yet.
* Removed multiple methods to start/stop abnormal visual effects.

Zoey76 11 năm trước cách đây
mục cha
commit
0b98ecc50b

+ 96 - 127
L2J_Server_BETA/java/com/l2jserver/gameserver/model/actor/L2Character.java

@@ -230,13 +230,21 @@ public abstract class L2Character extends L2Object implements ISkillsHolder, IDe
 	
 	private SkillChannelized _channelized = null;
 	
+	/** Map 32 bits, containing all abnormal visual effects in progress. */
+	private int _abnormalVisualEffects;
+	/** Map 32 bits, containing all special abnormal visual effects in progress. */
+	private int _abnormalVisualEffectsSpecial;
+	/** Map 32 bits, containing all event abnormal visual effects in progress. */
+	private int _abnormalVisualEffectsEvent;
+	
 	public final CharEffectList getEffectList()
 	{
 		return _effectList;
 	}
 	
 	/**
-	 * @return True if debugging is enabled for this L2Character
+	 * Verify if this character is under debug.
+	 * @return {@code true} if this character is under debug. {@code false} otherwise
 	 */
 	public boolean isDebug()
 	{
@@ -244,12 +252,12 @@ public abstract class L2Character extends L2Object implements ISkillsHolder, IDe
 	}
 	
 	/**
-	 * Sets L2Character instance, to which debug packets will be send
-	 * @param d
+	 * Sets character instance, to which debug packets will be send.
+	 * @param debugger the character debugging this character
 	 */
-	public void setDebug(L2Character d)
+	public void setDebug(L2Character debugger)
 	{
-		_debugger = d;
+		_debugger = debugger;
 	}
 	
 	/**
@@ -2863,45 +2871,107 @@ public abstract class L2Character extends L2Object implements ISkillsHolder, IDe
 		}
 	}
 	
-	// TODO: Abnormal Effect - NEED TO REMOVE ONCE L2CHARABNORMALEFFECT IS COMPLETE
-	/** Map 32 bits (0x0000) containing all abnormal effect in progress */
-	private int _AbnormalEffects;
+	/**
+	 * Gets the abnormal visual effects affecting this character.
+	 * @return a map of 32 bits containing all abnormal visual effects in progress for this character
+	 */
+	public int getAbnormaVisualEffect()
+	{
+		return _abnormalVisualEffects;
+	}
 	
-	private int _SpecialEffects;
+	/**
+	 * Gets the special abnormal visual effects affecting this character.
+	 * @return a map of 32 bits containing all special effect in progress for this character
+	 */
+	public int getAbnormalVisualEffectSpecial()
+	{
+		return _abnormalVisualEffectsSpecial;
+	}
 	
 	/**
-	 * Active abnormal effects flags in the binary mask and send Server->Client UserInfo/CharInfo packet.
-	 * @param mask
+	 * Gets the event abnormal visual effects affecting this character.
+	 * @return a map of 32 bits containing all event abnormal visual effects in progress for this character
 	 */
-	public final void startAbnormalEffect(AbnormalVisualEffect mask)
+	public int getAbnormalVisualEffectEvent()
 	{
-		_AbnormalEffects |= mask.getMask();
-		updateAbnormalEffect();
+		return _abnormalVisualEffectsEvent;
 	}
 	
 	/**
-	 * Active special effects flags in the binary mask and send Server->Client UserInfo/CharInfo packet.
-	 * @param mask
+	 * Verify if this creature is affected by the given abnormal visual effect.
+	 * @param ave the abnormal visual effect
+	 * @return {@code true} if the creature is affected by the abnormal visual effect, {@code false} otherwise
 	 */
-	public final void startSpecialEffect(AbnormalVisualEffect[] mask)
+	public boolean hasAbnormalVisualEffect(AbnormalVisualEffect ave)
 	{
-		for (AbnormalVisualEffect special : mask)
+		if (ave.isEvent())
 		{
-			_SpecialEffects |= special.getMask();
+			return (getAbnormalVisualEffectEvent() & ave.getMask()) == ave.getMask();
 		}
-		updateAbnormalEffect();
+		
+		if (ave.isSpecial())
+		{
+			return (getAbnormalVisualEffectSpecial() & ave.getMask()) == ave.getMask();
+		}
+		
+		return (getAbnormaVisualEffect() & ave.getMask()) == ave.getMask();
 	}
 	
-	public final void startAbnormalEffect(int mask)
+	/**
+	 * Adds the abnormal visual effect flags in the binary mask and send Server->Client UserInfo/CharInfo packet.
+	 * @param update if {@code true} update packets will be sent
+	 * @param aves the abnormal visual effects
+	 */
+	public final void startAbnormalVisualEffect(boolean update, AbnormalVisualEffect... aves)
 	{
-		_AbnormalEffects |= mask;
-		updateAbnormalEffect();
+		for (AbnormalVisualEffect ave : aves)
+		{
+			if (ave.isEvent())
+			{
+				_abnormalVisualEffectsEvent |= ave.getMask();
+			}
+			else if (ave.isSpecial())
+			{
+				_abnormalVisualEffectsSpecial |= ave.getMask();
+			}
+			else
+			{
+				_abnormalVisualEffects |= ave.getMask();
+			}
+		}
+		if (update)
+		{
+			updateAbnormalEffect();
+		}
 	}
 	
-	public final void startSpecialEffect(int mask)
+	/**
+	 * Removes the abnormal visual effect flags from the binary mask and send Server->Client UserInfo/CharInfo packet.
+	 * @param update if {@code true} update packets will be sent
+	 * @param aves the abnormal visual effects
+	 */
+	public final void stopAbnormalVisualEffect(boolean update, AbnormalVisualEffect... aves)
 	{
-		_SpecialEffects |= mask;
-		updateAbnormalEffect();
+		for (AbnormalVisualEffect ave : aves)
+		{
+			if (ave.isEvent())
+			{
+				_abnormalVisualEffectsEvent &= ~ave.getMask();
+			}
+			else if (ave.isSpecial())
+			{
+				_abnormalVisualEffectsSpecial &= ~ave.getMask();
+			}
+			else
+			{
+				_abnormalVisualEffects &= ~ave.getMask();
+			}
+		}
+		if (update)
+		{
+			updateAbnormalEffect();
+		}
 	}
 	
 	/**
@@ -2955,41 +3025,6 @@ public abstract class L2Character extends L2Object implements ISkillsHolder, IDe
 		getAI().notifyEvent(CtrlEvent.EVT_PARALYZED);
 	}
 	
-	/**
-	 * Modify the abnormal effect map according to the mask.
-	 * @param mask
-	 */
-	public final void stopAbnormalEffect(AbnormalVisualEffect mask)
-	{
-		_AbnormalEffects &= ~mask.getMask();
-		updateAbnormalEffect();
-	}
-	
-	/**
-	 * Modify the special effect map according to the mask.
-	 * @param mask
-	 */
-	public final void stopSpecialEffect(AbnormalVisualEffect[] mask)
-	{
-		for (AbnormalVisualEffect special : mask)
-		{
-			_SpecialEffects &= ~special.getMask();
-		}
-		updateAbnormalEffect();
-	}
-	
-	public final void stopAbnormalEffect(int mask)
-	{
-		_AbnormalEffects &= ~mask;
-		updateAbnormalEffect();
-	}
-	
-	public final void stopSpecialEffect(int mask)
-	{
-		_SpecialEffects &= ~mask;
-		updateAbnormalEffect();
-	}
-	
 	/**
 	 * Stop all active skills effects in progress on the L2Character.
 	 */
@@ -3150,72 +3185,6 @@ public abstract class L2Character extends L2Object implements ISkillsHolder, IDe
 		// overridden
 	}
 	
-	/**
-	 * <B><U>Concept</U>:</B><br>
-	 * In Server->Client packet, each effect is represented by 1 bit of the map (ex : BLEEDING = 0x0001 (bit 1), SLEEP = 0x0080 (bit 8)...). The map is calculated by applying a BINARY OR operation on each effect.<br>
-	 * <B><U>Example of use </U>:</B>
-	 * <ul>
-	 * <li>Server Packet : CharInfo, NpcInfo, NpcInfoPoly, UserInfo...</li>
-	 * </ul>
-	 * @return a map of 16 bits (0x0000) containing all abnormal effect in progress for this L2Character.
-	 */
-	public int getAbnormalEffect()
-	{
-		int ae = _AbnormalEffects;
-		if (!isFlying() && isStunned())
-		{
-			ae |= AbnormalVisualEffect.STUN.getMask();
-		}
-		if (!isFlying() && isRooted())
-		{
-			ae |= AbnormalVisualEffect.ROOT.getMask();
-		}
-		if (isSleeping())
-		{
-			ae |= AbnormalVisualEffect.SLEEP.getMask();
-		}
-		if (isConfused())
-		{
-			ae |= AbnormalVisualEffect.FEAR.getMask();
-		}
-		if (isMuted())
-		{
-			ae |= AbnormalVisualEffect.MUTED.getMask();
-		}
-		if (isPhysicalMuted())
-		{
-			ae |= AbnormalVisualEffect.MUTED.getMask();
-		}
-		if (isAfraid())
-		{
-			ae |= AbnormalVisualEffect.SKULL_FEAR.getMask();
-		}
-		return ae;
-	}
-	
-	/**
-	 * <B><U>Concept</U>:</B><br>
-	 * In Server->Client packet, each effect is represented by 1 bit of the map (ex : INVULNERABLE = 0x0001 (bit 1), PINK_AFFRO = 0x0020 (bit 6)...). The map is calculated by applying a BINARY OR operation on each effect.<br>
-	 * <B><U>Example of use </U>:</B>
-	 * <ul>
-	 * <li>Server Packet : CharInfo, UserInfo...</li>
-	 * </ul>
-	 * @return a map of 32 bits (0x00000000) containing all special effect in progress for this L2Character.
-	 */
-	public int getSpecialEffect()
-	{
-		int se = _SpecialEffects;
-		if (isFlying() && isStunned())
-		{
-			se |= AbnormalVisualEffect.S_AIR_STUN.getMask();
-		}
-		if (isFlying() && isRooted())
-		{
-			se |= AbnormalVisualEffect.S_AIR_ROOT.getMask();
-		}
-		return se;
-	}
-	
 	public boolean isAffectedBySkill(int skillId)
 	{
 		return _effectList.isAffectedBySkill(skillId);

+ 0 - 24
L2J_Server_BETA/java/com/l2jserver/gameserver/model/actor/instance/L2PcInstance.java

@@ -232,7 +232,6 @@ import com.l2jserver.gameserver.model.quest.Quest;
 import com.l2jserver.gameserver.model.quest.QuestState;
 import com.l2jserver.gameserver.model.quest.State;
 import com.l2jserver.gameserver.model.skills.AbnormalType;
-import com.l2jserver.gameserver.model.skills.AbnormalVisualEffect;
 import com.l2jserver.gameserver.model.skills.BuffInfo;
 import com.l2jserver.gameserver.model.skills.L2Skill;
 import com.l2jserver.gameserver.model.skills.L2SkillType;
@@ -521,7 +520,6 @@ public final class L2PcInstance extends L2Playable
 	private final Map<Integer, TeleportBookmark> _tpbookmarks = new FastMap<>();
 	
 	private boolean _canFeed;
-	private int _eventEffectId = 0;
 	private boolean _isInSiege;
 	private boolean _isInHideoutSiege = false;
 	
@@ -13180,28 +13178,6 @@ public final class L2PcInstance extends L2Playable
 		}
 	}
 	
-	/** End of section for mounted pets */
-	
-	/**
-	 * @return event effect id
-	 */
-	public int getEventEffectId()
-	{
-		return _eventEffectId;
-	}
-	
-	public void startEventEffect(AbnormalVisualEffect mask)
-	{
-		_eventEffectId |= mask.getMask();
-		broadcastUserInfo();
-	}
-	
-	public void stopEventEffect(AbnormalVisualEffect mask)
-	{
-		_eventEffectId &= ~mask.getMask();
-		broadcastUserInfo();
-	}
-	
 	public void setIsInSiege(boolean b)
 	{
 		_isInSiege = b;

+ 1 - 1
L2J_Server_BETA/java/com/l2jserver/gameserver/model/conditions/ConditionTargetAbnormal.java

@@ -40,6 +40,6 @@ public class ConditionTargetAbnormal extends Condition
 	@Override
 	public boolean testImpl(Env env)
 	{
-		return (env.getTarget().getAbnormalEffect() & _abnormalId) != 0;
+		return (env.getTarget().getAbnormaVisualEffect() & _abnormalId) != 0;
 	}
 }

+ 0 - 28
L2J_Server_BETA/java/com/l2jserver/gameserver/model/effects/AbstractEffect.java

@@ -30,7 +30,6 @@ import com.l2jserver.gameserver.model.ChanceCondition;
 import com.l2jserver.gameserver.model.StatsSet;
 import com.l2jserver.gameserver.model.conditions.Condition;
 import com.l2jserver.gameserver.model.interfaces.IChanceSkillTrigger;
-import com.l2jserver.gameserver.model.skills.AbnormalVisualEffect;
 import com.l2jserver.gameserver.model.skills.BuffInfo;
 import com.l2jserver.gameserver.model.skills.funcs.Func;
 import com.l2jserver.gameserver.model.skills.funcs.FuncTemplate;
@@ -50,10 +49,6 @@ public abstract class AbstractEffect implements IChanceSkillTrigger
 	// Conditions
 	private final Condition _attachCond;
 	// private final Condition _applyCond; // TODO: Use or cleanup.
-	// Abnormal visual effect
-	private final AbnormalVisualEffect _abnormalEffect;
-	private final AbnormalVisualEffect[] _specialEffect;
-	private final AbnormalVisualEffect _eventEffect;
 	private List<FuncTemplate> _funcTemplates;
 	private final String _name;
 	private final double _val;
@@ -80,14 +75,6 @@ public abstract class AbstractEffect implements IChanceSkillTrigger
 		_val = set.getDouble("val", 0);
 		_isSelfEffect = set.getInt("self", 0) == 1;
 		_ticks = set.getInt("ticks", 0);
-		_abnormalEffect = AbnormalVisualEffect.getByName(set.getString("abnormalVisualEffect", ""));
-		final String[] specialEffects = set.getString("special", "").split(",");
-		_specialEffect = new AbnormalVisualEffect[specialEffects.length];
-		for (int i = 0; i < specialEffects.length; i++)
-		{
-			_specialEffect[i] = AbnormalVisualEffect.getByName(specialEffects[i]);
-		}
-		_eventEffect = AbnormalVisualEffect.getByName(set.getString("event", ""));
 		_triggeredId = set.getInt("triggeredId", 0);
 		_triggeredLevel = set.getInt("triggeredLevel", 1);
 		_chanceCondition = ChanceCondition.parse(set.getString("chanceType", null), set.getInt("activationChance", -1), set.getInt("activationMinDamage", -1), set.getString("activationElements", null), set.getString("activationSkills", null), set.getBoolean("pvpChanceOnly", false));
@@ -186,21 +173,6 @@ public abstract class AbstractEffect implements IChanceSkillTrigger
 		return _ticks;
 	}
 	
-	public AbnormalVisualEffect getAbnormalEffect()
-	{
-		return _abnormalEffect;
-	}
-	
-	public AbnormalVisualEffect[] getSpecialEffect()
-	{
-		return _specialEffect;
-	}
-	
-	public AbnormalVisualEffect getEventEffect()
-	{
-		return _eventEffect;
-	}
-	
 	public List<FuncTemplate> getFuncTemplates()
 	{
 		return _funcTemplates;

+ 0 - 3
L2J_Server_BETA/java/com/l2jserver/gameserver/model/effects/L2EffectType.java

@@ -57,7 +57,6 @@ public enum L2EffectType
 	MAGICAL_ATTACK,
 	MAGICAL_ATTACK_MP,
 	MANA_DMG_OVER_TIME,
-	MANA_HEAL_OVER_TIME,
 	MANAHEAL,
 	MANAHEAL_BY_LEVEL,
 	MANAHEAL_PERCENT,
@@ -65,12 +64,10 @@ public enum L2EffectType
 	NOBLESSE_BLESSING,
 	NONE,
 	PARALYZE,
-	PETRIFICATION,
 	PHOENIX_BLESSING,
 	PHYSICAL_ATTACK,
 	PHYSICAL_ATTACK_HP_LINK,
 	PHYSICAL_ATTACK_MUTE,
-	PHYSICAL_MUTE,
 	PROTECTION_BLESSING,
 	REBALANCE_HP,
 	REFUEL_AIRSHIP,

+ 83 - 84
L2J_Server_BETA/java/com/l2jserver/gameserver/model/skills/AbnormalVisualEffect.java

@@ -18,112 +18,111 @@
  */
 package com.l2jserver.gameserver.model.skills;
 
-import java.util.logging.Level;
-import java.util.logging.Logger;
-
 /**
  * Abnormal Visual Effect enumerated.
- * @author DrHouse
+ * @author DrHouse, Zoey76
  */
 public enum AbnormalVisualEffect
 {
-	NULL("null", 0x0),
-	BLEEDING("bleed", 0x000001),
-	POISON("poison", 0x000002),
-	REDCIRCLE("redcircle", 0x000004),
-	ICE("ice", 0x000008),
-	WIND("wind", 0x000010),
-	FEAR("fear", 0x000020),
-	STUN("stun", 0x000040),
-	SLEEP("sleep", 0x000080),
-	MUTED("mute", 0x000100),
-	ROOT("root", 0x000200),
-	HOLD_1("hold1", 0x000400),
-	HOLD_2("hold2", 0x000800),
-	UNKNOWN_13("unknown13", 0x001000),
-	BIG_HEAD("bighead", 0x002000),
-	FLAME("flame", 0x004000),
-	UNKNOWN_16("unknown16", 0x008000),
-	GROW("grow", 0x010000),
-	FLOATING_ROOT("floatroot", 0x020000),
-	DANCE_STUNNED("dancestun", 0x040000),
-	FIREROOT_STUN("firerootstun", 0x080000),
-	STEALTH("stealth", 0x100000),
-	IMPRISIONING_1("imprison1", 0x200000),
-	IMPRISIONING_2("imprison2", 0x400000),
-	MAGIC_CIRCLE("magiccircle", 0x800000),
-	ICE2("ice2", 0x1000000),
-	EARTHQUAKE("earthquake", 0x2000000),
-	UNKNOWN_27("unknown27", 0x4000000),
-	INVULNERABLE("invulnerable", 0x8000000),
-	VITALITY("vitality", 0x10000000),
-	REAL_TARGET("realtarget", 0x20000000),
-	DEATH_MARK("deathmark", 0x40000000),
-	SKULL_FEAR("skull_fear", 0x80000000),
-	// Special effects
-	S_INVINCIBLE("invincible", 0x000001),
-	S_AIR_STUN("airstun", 0x000002),
-	S_AIR_ROOT("airroot", 0x000004),
-	S_BAGUETTE_SWORD("baguettesword", 0x000008),
-	S_YELLOW_AFFRO("yellowafro", 0x000010),
-	S_PINK_AFFRO("pinkafro", 0x000020),
-	S_BLACK_AFFRO("blackafro", 0x000040),
-	S_UNKNOWN8("unknown8", 0x000080),
-	S_STIGMA_SHILIEN("stigmashilien", 0x000100),
-	S_STAKATOROOT("stakatoroot", 0x000200),
-	S_FREEZING("freezing", 0x000400),
-	S_VESPER_S("vesper_s", 0x000800),
-	S_VESPER_C("vesper_c", 0x001000),
-	S_VESPER_D("vesper_d", 0x002000),
-	ARCANE_SHIELD("arcane_shield", 0x008000),
-	// Event effects
-	E_AFRO_1("afrobaguette1", 0x000001),
-	E_AFRO_2("afrobaguette2", 0x000002),
-	E_AFRO_3("afrobaguette3", 0x000004),
-	E_EVASWRATH("evaswrath", 0x000008),
-	E_HEADPHONE("headphone", 0x000010),
-	E_VESPER_1("vesper1", 0x000020),
-	E_VESPER_2("vesper2", 0x000040),
-	E_VESPER_3("vesper3", 0x000080),
-	HUNTING_BONUS("hunting_bonus", 0x80000);
+	NONE(0x0000000, 0),
+	DOT_BLEEDING(0x00000001, 0),
+	DOT_POISON(0x00000002, 0),
+	DOT_FIRE(0x00000004, 0),
+	DOT_WATER(0x00000008, 0),
+	DOT_WIND(0x00000010, 0),
+	DOT_SOIL(0x00000020, 0),
+	STUN(0x00000040, 0),
+	SLEEP(0x00000080, 0),
+	SILENCE(0x00000100, 0),
+	ROOT(0x00000200, 0),
+	PARALYZE(0x00000400, 0),
+	FLESH_STONE(0x00000800, 0),
+	DOT_MP(0x00001000, 0),
+	BIG_HEAD(0x00002000, 0),
+	DOT_FIRE_AREA(0x00004000, 0),
+	CHANGE_TEXTURE(0x00008000, 0),
+	BIG_BODY(0x00010000, 0),
+	FLOATING_ROOT(0x00020000, 0),
+	DANCE_ROOT(0x00040000, 0),
+	GHOST_STUN(0x00080000, 0),
+	STEALTH(0x00100000, 0),
+	SEIZURE1(0x00200000, 0),
+	SEIZURE2(0x00400000, 0),
+	MAGIC_SQUARE(0x00800000, 0),
+	FREEZING(0x01000000, 0),
+	SHAKE(0x02000000, 0),
+	BLIND(0x04000000, 0),
+	ULTIMATE_DEFENCE(0x08000000, 0),
+	VP_UP(0x10000000, 0),
+	REAL_TARGET(0x20000000, 0),
+	DEATH_MARK(0x40000000, 0),
+	TURN_FLEE(0x80000000, 0),
+	VP_KEEP(0x10000000, 0), // TODO: Find.
+	// Special
+	INVINCIBILITY(0x000001, 1),
+	AIR_BATTLE_SLOW(0x000002, 1),
+	AIR_BATTLE_ROOT(0x000004, 1),
+	CHANGE_WP(0x000008, 1),
+	CHANGE_HAIR_G(0x000010, 1),
+	CHANGE_HAIR_P(0x000020, 1),
+	CHANGE_HAIR_B(0x000040, 1),
+	STIGMA_OF_SILEN(0x000100, 1),
+	SPEED_DOWN(0x000200, 1),
+	FROZEN_PILLAR(0x000400, 1),
+	CHANGE_VES_S(0x000800, 1),
+	CHANGE_VES_C(0x001000, 1),
+	CHANGE_VES_D(0x002000, 1),
+	TIME_BOMB(0x004000, 1), // High Five
+	MP_SHIELD(0x008000, 1), // High Five
+	NAVIT_ADVENT(0x080000, 1), // High Five
+	// Event
+	// TODO: Fix, currently not working.
+	BR_NONE(0x000000, 2),
+	BR_AFRO_NORMAL(0x000001, 2),
+	BR_AFRO_PINK(0x000002, 2),
+	BR_AFRO_GOLD(0x000004, 2),
+	BR_POWER_OF_EVA(0x000008, 2), // High Five
+	BR_HEADPHONE(0x000010, 2), // High Five
+	BR_VESPER1(0x000020, 2),
+	BR_VESPER2(0x000040, 2),
+	BR_VESPER3(0x000080, 2),
+	BR_SOUL_AVATAR(0x000100, 2); // High Five
 	
-	private static final Logger _log = Logger.getLogger(AbnormalVisualEffect.class.getName());
+	/** Int mask. */
 	private final int _mask;
-	private final String _name;
+	/** Type: 1 Normal, 2 Special, 3 Event. */
+	private final int _type;
 	
-	private AbnormalVisualEffect(String name, int mask)
+	private AbnormalVisualEffect(int mask, int type)
 	{
-		_name = name;
 		_mask = mask;
+		_type = type;
 	}
 	
+	/**
+	 * Gets the int bitmask for the abnormal visual effect.
+	 * @return the int bitmask
+	 */
 	public final int getMask()
 	{
 		return _mask;
 	}
 	
-	public final String getName()
+	/**
+	 * Verify if it's a special abnormal visual effect.
+	 * @return {@code true} it's a special abnormal visual effect, {@code false} otherwise
+	 */
+	public final boolean isSpecial()
 	{
-		return _name;
+		return _type == 1;
 	}
 	
 	/**
-	 * @param name the name of the abnormal visual effect to get
-	 * @return the found abnormal visual effect
+	 * Verify if it's an event abnormal visual effect.
+	 * @return {@code true} it's an event abnormal visual effect, {@code false} otherwise
 	 */
-	public static AbnormalVisualEffect getByName(String name)
+	public final boolean isEvent()
 	{
-		if ((name != null) && !name.isEmpty())
-		{
-			for (AbnormalVisualEffect eff : AbnormalVisualEffect.values())
-			{
-				if (eff.getName().equals(name))
-				{
-					return eff;
-				}
-			}
-			_log.log(Level.WARNING, AbnormalVisualEffect.class.getSimpleName() + ": Abnormal visual effect not found for name: " + name + "!");
-		}
-		return NULL;
+		return _type == 2;
 	}
 }

+ 40 - 26
L2J_Server_BETA/java/com/l2jserver/gameserver/model/skills/BuffInfo.java

@@ -270,11 +270,12 @@ public final class BuffInfo
 			_scheduledFutureTimeTask = ThreadPoolManager.getInstance().scheduleEffectAtFixedRate(_effectTimeTask, 0, 1000L);
 		}
 		
+		applyAbnormalVisualEffects();
+		
 		for (AbstractEffect effect : _effects)
 		{
 			if (effect.isInstant())
 			{
-				// TODO: Log, instant effects shouldn't be added.
 				continue;
 			}
 			
@@ -293,8 +294,6 @@ public final class BuffInfo
 			
 			// Add stats.
 			_env.getTarget().addStatFuncs(effect.getStatFuncs(_env));
-			
-			applyAbnormalVisualEffects(_env.getTarget(), effect);
 		}
 	}
 	
@@ -342,10 +341,10 @@ public final class BuffInfo
 	
 	public void finishEffects()
 	{
+		removeAbnormalVisualEffects();
+		
 		for (AbstractEffect effect : _effects)
 		{
-			removeAbnormalVisualEffects(_env.getTarget(), effect); // TODO: Implement correctly.
-			
 			// Instant effects shouldn't call onExit(..).
 			if ((effect != null) && !effect.isInstant())
 			{
@@ -392,52 +391,65 @@ public final class BuffInfo
 	
 	/**
 	 * Applies all the abnormal visual effects to the effected.<br>
-	 * TODO: Shouldn't be read from effect template, but from skill template.
-	 * @param effected the target of the skill
-	 * @param effect the effect
+	 * Prevents multiple updates.
 	 */
-	private static void applyAbnormalVisualEffects(L2Character effected, AbstractEffect effect)
+	private void applyAbnormalVisualEffects()
 	{
-		if (effect.getAbnormalEffect() != AbnormalVisualEffect.NULL)
+		if ((_env.getTarget() == null) || (_env.getSkill() == null))
 		{
-			effected.startAbnormalEffect(effect.getAbnormalEffect());
+			return;
 		}
 		
-		if (effect.getSpecialEffect() != null)
+		if (_env.getSkill().hasAbnormalVisualEffects())
 		{
-			effected.startSpecialEffect(effect.getSpecialEffect());
+			_env.getTarget().startAbnormalVisualEffect(false, _env.getSkill().getAbnormalVisualEffects());
 		}
 		
-		if ((effect.getEventEffect() != AbnormalVisualEffect.NULL) && effected.isPlayer())
+		if (_env.getTarget().isPlayer() && _env.getSkill().hasAbnormalVisualEffectsEvent())
 		{
-			effected.getActingPlayer().startEventEffect(effect.getEventEffect());
+			_env.getTarget().startAbnormalVisualEffect(false, _env.getSkill().getAbnormalVisualEffectsEvent());
 		}
+		
+		if (_env.getSkill().hasAbnormalVisualEffectsSpecial())
+		{
+			_env.getTarget().startAbnormalVisualEffect(false, _env.getSkill().getAbnormalVisualEffectsSpecial());
+		}
+		
+		_env.getTarget().updateAbnormalEffect();
 	}
 	
 	/**
 	 * Removes all the abnormal visual effects from the effected.<br>
-	 * TODO: Shouldn't be read from effect template, but from skill template.
-	 * @param effected the target of the skill
-	 * @param effect the effect
+	 * Prevents multiple updates.
 	 */
-	private static void removeAbnormalVisualEffects(L2Character effected, AbstractEffect effect)
+	private void removeAbnormalVisualEffects()
 	{
-		if (effect.getAbnormalEffect() != AbnormalVisualEffect.NULL)
+		if ((_env.getTarget() == null) || (_env.getSkill() == null))
 		{
-			effected.stopAbnormalEffect(effect.getAbnormalEffect());
+			return;
 		}
 		
-		if (effect.getSpecialEffect() != null)
+		if (_env.getSkill().hasAbnormalVisualEffects())
 		{
-			effected.stopSpecialEffect(effect.getSpecialEffect());
+			_env.getTarget().stopAbnormalVisualEffect(false, _env.getSkill().getAbnormalVisualEffects());
 		}
 		
-		if ((effect.getEventEffect() != AbnormalVisualEffect.NULL) && effected.isPlayer())
+		if (_env.getTarget().isPlayer() && _env.getSkill().hasAbnormalVisualEffectsEvent())
 		{
-			effected.getActingPlayer().stopEventEffect(effect.getEventEffect());
+			_env.getTarget().stopAbnormalVisualEffect(false, _env.getSkill().getAbnormalVisualEffectsEvent());
 		}
+		
+		if (_env.getSkill().hasAbnormalVisualEffectsSpecial())
+		{
+			_env.getTarget().stopAbnormalVisualEffect(false, _env.getSkill().getAbnormalVisualEffectsSpecial());
+		}
+		
+		_env.getTarget().updateAbnormalEffect();
 	}
 	
+	/**
+	 * Adds the buff stats.
+	 */
 	public void addStats()
 	{
 		for (AbstractEffect effect : _effects)
@@ -446,13 +458,15 @@ public final class BuffInfo
 		}
 	}
 	
+	/**
+	 * Removes the buff stats.
+	 */
 	public void removeStats()
 	{
 		for (AbstractEffect effect : _effects)
 		{
 			_env.getTarget().removeStatsOwner(effect);
 		}
-		// TODO: This should be removed when all effects are properly managed.
 		_env.getTarget().removeStatsOwner(_env.getSkill());
 	}
 	

+ 149 - 6
L2J_Server_BETA/java/com/l2jserver/gameserver/model/skills/L2Skill.java

@@ -82,7 +82,7 @@ public abstract class L2Skill implements IChanceSkillTrigger, IIdentifiable
 	public static final int SKILL_CARAVANS_SECRET_MEDICINE = 2341;
 	public static final int SKILL_NPC_RACE = 4416;
 	
-	/** Skill Id. */
+	/** Skill ID. */
 	private final int _id;
 	/** Skill level. */
 	private final int _level;
@@ -120,6 +120,12 @@ public abstract class L2Skill implements IChanceSkillTrigger, IIdentifiable
 	private final AbnormalType _abnormalType;
 	/** Abnormal time: global effect duration time. */
 	private final int _abnormalTime;
+	/** Abnormal visual effect: the visual effect displayed ingame. */
+	private AbnormalVisualEffect[] _abnormalVisualEffects = null;
+	/** Abnormal visual effect special: the visual effect displayed ingame. */
+	private AbnormalVisualEffect[] _abnormalVisualEffectsSpecial = null;
+	/** Abnormal visual effect event: the visual effect displayed ingame. */
+	private AbnormalVisualEffect[] _abnormalVisualEffectsEvent = null;
 	/** If {@code true} this skill's effect should stay after death. */
 	private final boolean _stayAfterDeath;
 	/** If {@code true} this skill's effect should stay after class-subclass change. */
@@ -228,7 +234,6 @@ public abstract class L2Skill implements IChanceSkillTrigger, IIdentifiable
 	
 	protected L2Skill(StatsSet set)
 	{
-		_isAbnormalInstant = set.getBoolean("abnormalInstant", false);
 		_id = set.getInt("skill_id");
 		_level = set.getInt("level");
 		_refId = set.getInt("referenceId", 0);
@@ -265,6 +270,9 @@ public abstract class L2Skill implements IChanceSkillTrigger, IIdentifiable
 		}
 		
 		_abnormalTime = abnormalTime;
+		_isAbnormalInstant = set.getBoolean("abnormalInstant", false);
+		parseAbnormalVisualEffect(set.getString("abnormalVisualEffect", null));
+		
 		_attribute = set.getString("attribute", "");
 		
 		_stayAfterDeath = set.getBoolean("stayAfterDeath", false);
@@ -466,6 +474,8 @@ public abstract class L2Skill implements IChanceSkillTrigger, IIdentifiable
 	}
 	
 	/**
+	 * Verify if this skill is abnormal instant.<br>
+	 * Herb buff skills yield {@code true} for this check.
 	 * @return {@code true} if the skill is abnormal instant, {@code false} otherwise
 	 */
 	public final boolean isAbnormalInstant()
@@ -473,21 +483,92 @@ public abstract class L2Skill implements IChanceSkillTrigger, IIdentifiable
 		return _isAbnormalInstant;
 	}
 	
-	public final int getAbnormalLvl()
+	/**
+	 * Gets the skill abnormal type.
+	 * @return the abnormal type
+	 */
+	public final AbnormalType getAbnormalType()
 	{
-		return _abnormalLvl;
+		return _abnormalType;
 	}
 	
-	public final AbnormalType getAbnormalType()
+	/**
+	 * Gets the skill abnormal level.
+	 * @return the skill abnormal level
+	 */
+	public final int getAbnormalLvl()
 	{
-		return _abnormalType;
+		return _abnormalLvl;
 	}
 	
+	/**
+	 * Gets the skill abnormal time.<br>
+	 * Is the base to calculate the duration of the continuous effects of this skill.
+	 * @return the abnormal time
+	 */
 	public final int getAbnormalTime()
 	{
 		return _abnormalTime;
 	}
 	
+	/**
+	 * Gets the skill abnormal visual effect.
+	 * @return the abnormal visual effect
+	 */
+	public AbnormalVisualEffect[] getAbnormalVisualEffects()
+	{
+		return _abnormalVisualEffects;
+	}
+	
+	/**
+	 * Verify if the skill has abnormal visual effects.
+	 * @return {@code true} if the skill has abnormal visual effects, {@code false} otherwise
+	 */
+	public boolean hasAbnormalVisualEffects()
+	{
+		return (_abnormalVisualEffects != null) && (_abnormalVisualEffects.length > 0);
+	}
+	
+	/**
+	 * Gets the skill special abnormal visual effect.
+	 * @return the abnormal visual effect
+	 */
+	public AbnormalVisualEffect[] getAbnormalVisualEffectsSpecial()
+	{
+		return _abnormalVisualEffectsSpecial;
+	}
+	
+	/**
+	 * Verify if the skill has special abnormal visual effects.
+	 * @return {@code true} if the skill has special abnormal visual effects, {@code false} otherwise
+	 */
+	public boolean hasAbnormalVisualEffectsSpecial()
+	{
+		return (_abnormalVisualEffectsSpecial != null) && (_abnormalVisualEffectsSpecial.length > 0);
+	}
+	
+	/**
+	 * Gets the skill event abnormal visual effect.
+	 * @return the abnormal visual effect
+	 */
+	public AbnormalVisualEffect[] getAbnormalVisualEffectsEvent()
+	{
+		return _abnormalVisualEffectsEvent;
+	}
+	
+	/**
+	 * Verify if the skill has event abnormal visual effects.
+	 * @return {@code true} if the skill has event abnormal visual effects, {@code false} otherwise
+	 */
+	public boolean hasAbnormalVisualEffectsEvent()
+	{
+		return (_abnormalVisualEffectsEvent != null) && (_abnormalVisualEffectsEvent.length > 0);
+	}
+	
+	/**
+	 * Gets the skill magic level.
+	 * @return the skill magic level
+	 */
 	public final int getMagicLevel()
 	{
 		return _magicLevel;
@@ -1637,6 +1718,68 @@ public abstract class L2Skill implements IChanceSkillTrigger, IIdentifiable
 		return new L2ExtractableSkill(SkillTable.getSkillHashCode(skillId, skillLvl), products);
 	}
 	
+	/**
+	 * Parses all the abnormal visual effects.
+	 * @param abnormalVisualEffects the abnormal visual effects list
+	 */
+	private void parseAbnormalVisualEffect(String abnormalVisualEffects)
+	{
+		if (abnormalVisualEffects != null)
+		{
+			final String[] data = abnormalVisualEffects.split(";");
+			List<AbnormalVisualEffect> avesEvent = null;
+			List<AbnormalVisualEffect> avesSpecial = null;
+			List<AbnormalVisualEffect> aves = null;
+			for (String ave2 : data)
+			{
+				final AbnormalVisualEffect ave = AbnormalVisualEffect.valueOf(ave2);
+				if (ave != null)
+				{
+					if (ave.isEvent())
+					{
+						if (avesEvent == null)
+						{
+							avesEvent = new ArrayList<>(1);
+						}
+						avesEvent.add(ave);
+						continue;
+					}
+					
+					if (ave.isSpecial())
+					{
+						if (avesSpecial == null)
+						{
+							avesSpecial = new ArrayList<>(1);
+						}
+						avesSpecial.add(ave);
+						continue;
+					}
+					
+					if (aves == null)
+					{
+						aves = new ArrayList<>(1);
+					}
+					aves.add(ave);
+				}
+			}
+			
+			if (avesEvent != null)
+			{
+				_abnormalVisualEffectsEvent = avesEvent.toArray(new AbnormalVisualEffect[avesEvent.size()]);
+			}
+			
+			if (avesSpecial != null)
+			{
+				_abnormalVisualEffectsSpecial = avesSpecial.toArray(new AbnormalVisualEffect[avesSpecial.size()]);
+			}
+			
+			if (aves != null)
+			{
+				_abnormalVisualEffects = aves.toArray(new AbnormalVisualEffect[aves.size()]);
+			}
+		}
+	}
+	
 	public L2ExtractableSkill getExtractableSkill()
 	{
 		return _extractableItems;

+ 0 - 81
L2J_Server_BETA/java/com/l2jserver/gameserver/model/zone/type/L2AbnormalZone.java

@@ -1,81 +0,0 @@
-/*
- * Copyright (C) 2004-2013 L2J Server
- * 
- * This file is part of L2J Server.
- * 
- * L2J Server 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.
- * 
- * L2J Server is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
- * General Public License for more details.
- * 
- * You should have received a copy of the GNU General Public License
- * along with this program. If not, see <http://www.gnu.org/licenses/>.
- */
-package com.l2jserver.gameserver.model.zone.type;
-
-import com.l2jserver.gameserver.model.actor.L2Character;
-import com.l2jserver.gameserver.model.skills.AbnormalVisualEffect;
-import com.l2jserver.gameserver.model.zone.L2ZoneType;
-
-/**
- * L2AbnormalZone zones give entering players abnormal effects Default effect is big head
- * @author durgus
- */
-public class L2AbnormalZone extends L2ZoneType
-{
-	private int abnormal = AbnormalVisualEffect.BIG_HEAD.getMask();
-	private int special = 0;
-	
-	public L2AbnormalZone(int id)
-	{
-		super(id);
-	}
-	
-	@Override
-	public void setParameter(String name, String value)
-	{
-		if (name.equals("AbnormalMask"))
-		{
-			abnormal = Integer.parseInt(value);
-		}
-		else if (name.equals("SpecialMask"))
-		{
-			special = Integer.parseInt(value);
-		}
-		else
-		{
-			super.setParameter(name, value);
-		}
-	}
-	
-	@Override
-	protected void onEnter(L2Character character)
-	{
-		character.startAbnormalEffect(abnormal);
-		character.startSpecialEffect(special);
-	}
-	
-	@Override
-	protected void onExit(L2Character character)
-	{
-		character.stopAbnormalEffect(abnormal);
-		character.stopSpecialEffect(special);
-	}
-	
-	@Override
-	public void onDieInside(L2Character character)
-	{
-		onExit(character);
-	}
-	
-	@Override
-	public void onReviveInside(L2Character character)
-	{
-		onEnter(character);
-	}
-}

+ 5 - 5
L2J_Server_BETA/java/com/l2jserver/gameserver/network/serverpackets/AbstractNpcInfo.java

@@ -182,7 +182,7 @@ public abstract class AbstractNpcInfo extends L2GameServerPacket
 			writeD(0x00); // pvp flag
 			writeD(0x00); // karma
 			
-			writeD(_npc.getAbnormalEffect()); // C2
+			writeD(_npc.getAbnormaVisualEffect()); // C2
 			writeD(_clanId); // clan id
 			writeD(_clanCrest); // crest id
 			writeD(_allyId); // ally id
@@ -199,7 +199,7 @@ public abstract class AbstractNpcInfo extends L2GameServerPacket
 			writeD(_npc.getColorEffect()); // CT1.5 Pet form and skills, Color effect
 			writeC(_npc.isTargetable() ? 0x01 : 0x00);
 			writeC(_npc.isShowName() ? 0x01 : 0x00);
-			writeD(_npc.getSpecialEffect());
+			writeD(_npc.getAbnormalVisualEffectSpecial());
 			writeD(_displayEffect);
 		}
 	}
@@ -269,7 +269,7 @@ public abstract class AbstractNpcInfo extends L2GameServerPacket
 			writeD(_trap.getPvpFlag());
 			writeD(_trap.getKarma());
 			
-			writeD(_trap.getAbnormalEffect()); // C2
+			writeD(_trap.getAbnormaVisualEffect()); // C2
 			writeD(0x00); // clan id
 			writeD(0x00); // crest id
 			writeD(0000); // C2
@@ -409,7 +409,7 @@ public abstract class AbstractNpcInfo extends L2GameServerPacket
 			writeD(_summon.getPvpFlag());
 			writeD(_summon.getKarma());
 			
-			writeD(gmSeeInvis ? _summon.getAbnormalEffect() | AbnormalVisualEffect.STEALTH.getMask() : _summon.getAbnormalEffect());
+			writeD(gmSeeInvis ? _summon.getAbnormaVisualEffect() | AbnormalVisualEffect.STEALTH.getMask() : _summon.getAbnormaVisualEffect());
 			
 			writeD(0x00); // clan id
 			writeD(0x00); // crest id
@@ -427,7 +427,7 @@ public abstract class AbstractNpcInfo extends L2GameServerPacket
 			writeD(_form); // CT1.5 Pet form and skills
 			writeC(0x01);
 			writeC(0x01);
-			writeD(_summon.getSpecialEffect());
+			writeD(_summon.getAbnormalVisualEffectSpecial());
 		}
 	}
 }

+ 4 - 4
L2J_Server_BETA/java/com/l2jserver/gameserver/network/serverpackets/CharInfo.java

@@ -172,7 +172,7 @@ public class CharInfo extends L2GameServerPacket
 			writeD(_activeChar.getPvpFlag()); // pvp flag
 			writeD(_activeChar.getKarma()); // karma ??
 			
-			writeD(gmSeeInvis ? (_activeChar.getAbnormalEffect() | AbnormalVisualEffect.STEALTH.getMask()) : _activeChar.getAbnormalEffect()); // C2
+			writeD(gmSeeInvis ? (_activeChar.getAbnormaVisualEffect() | AbnormalVisualEffect.STEALTH.getMask()) : _activeChar.getAbnormaVisualEffect()); // C2
 			
 			writeD(_activeChar.getClanId()); // clan id
 			writeD(_activeChar.getClanCrestId()); // crest id
@@ -193,7 +193,7 @@ public class CharInfo extends L2GameServerPacket
 			writeD(0x00); // CT1.5 Pet form and skills, Color effect
 			writeC(template.getAIDataStatic().isTargetable() ? 0x01 : 0x00); // targetable
 			writeC(template.getAIDataStatic().showName() ? 0x01 : 0x00); // show name
-			writeC(_activeChar.getSpecialEffect());
+			writeC(_activeChar.getAbnormalVisualEffectSpecial());
 			writeD(0x00);
 		}
 		else
@@ -284,7 +284,7 @@ public class CharInfo extends L2GameServerPacket
 			
 			writeC(_activeChar.isInPartyMatchRoom() ? 1 : 0);
 			
-			writeD(gmSeeInvis ? (_activeChar.getAbnormalEffect() | AbnormalVisualEffect.STEALTH.getMask()) : _activeChar.getAbnormalEffect());
+			writeD(gmSeeInvis ? (_activeChar.getAbnormaVisualEffect() | AbnormalVisualEffect.STEALTH.getMask()) : _activeChar.getAbnormaVisualEffect());
 			
 			writeC(_activeChar.isFlyingMounted() ? 2 : 0);
 			
@@ -326,7 +326,7 @@ public class CharInfo extends L2GameServerPacket
 			writeD(0x01);
 			
 			// T2.3
-			writeD(_activeChar.getSpecialEffect());
+			writeD(_activeChar.getAbnormalVisualEffectSpecial());
 		}
 	}
 	

+ 12 - 8
L2J_Server_BETA/java/com/l2jserver/gameserver/network/serverpackets/ExBrExtraUserInfo.java

@@ -21,29 +21,33 @@ package com.l2jserver.gameserver.network.serverpackets;
 import com.l2jserver.gameserver.model.actor.instance.L2PcInstance;
 
 /**
- * @author Kerberos
+ * ExBrExtraUserInfo server packet implementation.
+ * @author Kerberos, Zoey76
  */
 public class ExBrExtraUserInfo extends L2GameServerPacket
 {
+	/** Player object ID. */
 	private final int _charObjId;
-	private final int _val;
+	/** Event abnormal visual effects map. */
+	private final int _abnormalVisualEffectsEvent;
+	/** Lecture mark. */
+	private final int _lectureMark;
 	
 	public ExBrExtraUserInfo(L2PcInstance player)
 	{
 		_charObjId = player.getObjectId();
-		_val = player.getEventEffectId();
+		_abnormalVisualEffectsEvent = player.getAbnormalVisualEffectEvent();
+		_lectureMark = 1; // TODO: Implement.
 		_invisible = player.getAppearance().getInvisible();
 	}
 	
 	@Override
 	protected final void writeImpl()
 	{
-		
 		writeC(0xFE);
 		writeH(0xDA);
-		writeD(_charObjId); // object ID of Player
-		writeD(_val); // event effect id
-		// writeC(0x00); // Event flag, added only if event is active
-		
+		writeD(_charObjId);
+		writeD(_abnormalVisualEffectsEvent);
+		writeC(_lectureMark);
 	}
 }

+ 2 - 2
L2J_Server_BETA/java/com/l2jserver/gameserver/network/serverpackets/PetInfo.java

@@ -157,7 +157,7 @@ public class PetInfo extends L2GameServerPacket
 		writeD(_summon.getPAtkSpd());// atkspeed
 		writeD(_summon.getMAtkSpd());// casting speed
 		
-		writeD(_summon.getAbnormalEffect());// c2 abnormal visual effect... bleed=1; poison=2; poison & bleed=3; flame=4;
+		writeD(_summon.getAbnormaVisualEffect());// c2 abnormal visual effect... bleed=1; poison=2; poison & bleed=3; flame=4;
 		writeH(_summon.isMountable() ? 1 : 0);// c2 ride button
 		
 		writeC(0); // c2
@@ -201,6 +201,6 @@ public class PetInfo extends L2GameServerPacket
 			}
 		}
 		writeD(form);// CT1.5 Pet form and skills
-		writeD(_summon.getSpecialEffect());
+		writeD(_summon.getAbnormalVisualEffectSpecial());
 	}
 }

+ 2 - 2
L2J_Server_BETA/java/com/l2jserver/gameserver/network/serverpackets/UserInfo.java

@@ -208,7 +208,7 @@ public final class UserInfo extends L2GameServerPacket
 		
 		writeC(_activeChar.isInPartyMatchRoom() ? 1 : 0);
 		
-		writeD(_activeChar.getAppearance().getInvisible() && _activeChar.isGM() ? _activeChar.getAbnormalEffect() | AbnormalVisualEffect.STEALTH.getMask() : _activeChar.getAbnormalEffect());
+		writeD(_activeChar.getAppearance().getInvisible() && _activeChar.isGM() ? _activeChar.getAbnormaVisualEffect() | AbnormalVisualEffect.STEALTH.getMask() : _activeChar.getAbnormaVisualEffect());
 		writeC(_activeChar.isFlyingMounted() ? 2 : 0);
 		
 		writeD(_activeChar.getClanPrivileges());
@@ -265,7 +265,7 @@ public final class UserInfo extends L2GameServerPacket
 		writeD(_activeChar.getFame()); // Fame
 		writeD(_activeChar.isMinimapAllowed() ? 1 : 0); // Minimap on Hellbound
 		writeD(_activeChar.getVitalityPoints()); // Vitality Points
-		writeD(_activeChar.getSpecialEffect());
+		writeD(_activeChar.getAbnormalVisualEffectSpecial());
 		// writeD(_territoryId); // CT2.3
 		// writeD((_isDisguised ? 0x01: 0x00)); // CT2.3
 		// writeD(_territoryId); // CT2.3