浏览代码

BETA: Continuing with [6249] rework:
* Adding method overload (just wrappers) to `L2Skill`.applyEffects(..) to avoid useless parameters.
* Suggested by: jurchiks
* Added a new parameter to `L2Skill`.applyEffects(..) to customize skill abnormal time upon casting.
* Changed the way we check if we can apply a buff (debuff, etc) to a character.
* Now all checks must be done on `AbstractEffect`#canStart(`BuffInfo`), this way we prevent executing `AbstractEffect`#onStart(`BuffInfo`) logic if the effect won't be added to the effect list.
* `AbstractEffect`#onStart(`BuffInfo`) is void now.
* Now `AbstractEffect`#onStart(`BuffInfo`) is called when the effect is already placed in the effect list, the old effect has been removed and we are sure the new effect should be activated.
* Reported by: nBd
* Suggested by: nBd
* Reworked the way effects are restored into characters (players, summons).
* Avoiding the restoration of instant effects.
* Reported by: nBd, UnAfraid, Nos
* Reusing `L2Skill`.applyEffects(..) code!
* Fixed effects flags not being computed for players (sleep, hide, etc not removed).
* Reported by: nBd, thorl2
* Suggested by: nBd
* Fixed many system messages:
* "$c1 has resisted your $s2" is not displayed when adding active skills or switching subclasses.
* Reported by: nBd, UnAfraid, Adry_85
* "$s1 has worn off" is not displayed for passive skills when they are removed.
* Fixing summons not getting buffed when master receives buffs.
* Reported by: nBd
* Fixed summons not getting Celestial Shield.
* Reported by: Zeldak

'''Note to developers:''' Instant effects should not override `AbstractEffect`#canStart(`BuffInfo`), all checks should be done `AbstractEffect`#onStart(`BuffInfo`).

Zoey76 11 年之前
父节点
当前提交
8a66d3bafe
共有 20 个文件被更改,包括 148 次插入166 次删除
  1. 1 1
      L2J_Server_BETA/java/com/l2jserver/gameserver/datatables/BotReportTable.java
  2. 6 8
      L2J_Server_BETA/java/com/l2jserver/gameserver/model/CharEffectList.java
  3. 10 6
      L2J_Server_BETA/java/com/l2jserver/gameserver/model/actor/L2Character.java
  4. 1 1
      L2J_Server_BETA/java/com/l2jserver/gameserver/model/actor/instance/L2ChestInstance.java
  5. 3 3
      L2J_Server_BETA/java/com/l2jserver/gameserver/model/actor/instance/L2CubicInstance.java
  6. 1 1
      L2J_Server_BETA/java/com/l2jserver/gameserver/model/actor/instance/L2NpcBufferInstance.java
  7. 4 40
      L2J_Server_BETA/java/com/l2jserver/gameserver/model/actor/instance/L2PcInstance.java
  8. 2 34
      L2J_Server_BETA/java/com/l2jserver/gameserver/model/actor/instance/L2PetInstance.java
  9. 1 1
      L2J_Server_BETA/java/com/l2jserver/gameserver/model/actor/instance/L2SepulcherMonsterInstance.java
  10. 2 34
      L2J_Server_BETA/java/com/l2jserver/gameserver/model/actor/instance/L2ServitorInstance.java
  11. 16 3
      L2J_Server_BETA/java/com/l2jserver/gameserver/model/effects/AbstractEffect.java
  12. 3 3
      L2J_Server_BETA/java/com/l2jserver/gameserver/model/entity/BlockCheckerEngine.java
  13. 2 2
      L2J_Server_BETA/java/com/l2jserver/gameserver/model/entity/TvTEvent.java
  14. 1 1
      L2J_Server_BETA/java/com/l2jserver/gameserver/model/items/L2Weapon.java
  15. 11 5
      L2J_Server_BETA/java/com/l2jserver/gameserver/model/skills/BuffInfo.java
  16. 77 16
      L2J_Server_BETA/java/com/l2jserver/gameserver/model/skills/L2Skill.java
  17. 3 3
      L2J_Server_BETA/java/com/l2jserver/gameserver/model/skills/SkillChannelizer.java
  18. 2 2
      L2J_Server_BETA/java/com/l2jserver/gameserver/model/zone/type/L2DynamicZone.java
  19. 1 1
      L2J_Server_BETA/java/com/l2jserver/gameserver/model/zone/type/L2EffectZone.java
  20. 1 1
      L2J_Server_BETA/java/com/l2jserver/gameserver/model/zone/type/L2SiegeZone.java

+ 1 - 1
L2J_Server_BETA/java/com/l2jserver/gameserver/datatables/BotReportTable.java

@@ -344,7 +344,7 @@ public final class BotReportTable
 	{
 		if (ph != null)
 		{
-			ph._punish.applyEffects(bot, null, bot, null, false, false);
+			ph._punish.applyEffects(bot, bot);
 			if (ph._systemMessageId > -1)
 			{
 				SystemMessageId id = SystemMessageId.getSystemMessageId(ph._systemMessageId);

+ 6 - 8
L2J_Server_BETA/java/com/l2jserver/gameserver/model/CharEffectList.java

@@ -1179,15 +1179,12 @@ public final class CharEffectList
 	 */
 	public void updateEffectIcons(boolean partyOnly)
 	{
-		if (!isEmpty())
+		if (partyOnly)
 		{
-			if (partyOnly)
-			{
-				_partyOnly = true;
-			}
-			// Update effect flags and icons.
-			updateEffectList(true);
+			_partyOnly = true;
 		}
+		// Update effect flags and icons.
+		updateEffectList(true);
 	}
 	
 	/**
@@ -1497,9 +1494,10 @@ public final class CharEffectList
 			return;
 		}
 		
+		updateEffectFlags();
+		
 		if (!_owner.isPlayable())
 		{
-			updateEffectFlags();
 			return;
 		}
 		

+ 10 - 6
L2J_Server_BETA/java/com/l2jserver/gameserver/model/actor/L2Character.java

@@ -1885,8 +1885,8 @@ public abstract class L2Character extends L2Object implements ISkillsHolder, IDe
 		// to the L2Character AND to all L2PcInstance in the _KnownPlayers of the L2Character
 		broadcastPacket(new MagicSkillUse(this, target, skill.getDisplayId(), skill.getDisplayLevel(), skillTime, reuseDelay));
 		
-		// Send a system message USE_S1 to the L2Character
-		if (isPlayer())
+		// Send a system message to the player.
+		if (isPlayer() && !skill.isAbnormalInstant())
 		{
 			SystemMessage sm = null;
 			switch (magicId)
@@ -4806,7 +4806,7 @@ public abstract class L2Character extends L2Object implements ISkillsHolder, IDe
 					abortAttack();
 					abortCast();
 					getAI().setIntention(CtrlIntention.AI_INTENTION_IDLE);
-					skill.applyEffects(target, null, this, null, false, false);
+					skill.applyEffects(target, this);
 				}
 				else
 				{
@@ -5270,7 +5270,11 @@ public abstract class L2Character extends L2Object implements ISkillsHolder, IDe
 			{
 				addChanceTrigger(newSkill);
 			}
-			newSkill.applyEffects(this, null, this, null, false, true);
+			
+			if (newSkill.isPassive())
+			{
+				newSkill.applyEffects(this, null, this, false, true, false, 0);
+			}
 		}
 		return oldSkill;
 	}
@@ -6007,7 +6011,7 @@ public abstract class L2Character extends L2Object implements ISkillsHolder, IDe
 								abortAttack();
 								abortCast();
 								getAI().setIntention(CtrlIntention.AI_INTENTION_IDLE);
-								tempSkill.applyEffects(target, null, this, null, false, false);
+								tempSkill.applyEffects(target, this);
 							}
 							else if (_log.isLoggable(Level.WARNING))
 							{
@@ -6022,7 +6026,7 @@ public abstract class L2Character extends L2Object implements ISkillsHolder, IDe
 								abortAttack();
 								abortCast();
 								getAI().setIntention(CtrlIntention.AI_INTENTION_IDLE);
-								tempSkill.applyEffects(target, null, this, null, false, false);
+								tempSkill.applyEffects(target, this);
 							}
 							else if (_log.isLoggable(Level.WARNING))
 							{

+ 1 - 1
L2J_Server_BETA/java/com/l2jserver/gameserver/model/actor/instance/L2ChestInstance.java

@@ -226,7 +226,7 @@ public final class L2ChestInstance extends L2MonsterInstance
 		
 		if (!player.isAffectedBySkill(skillId))
 		{
-			skill.applyEffects(this, null, player, null, false, false);
+			skill.applyEffects(this, player);
 			broadcastPacket(new MagicSkillUse(this, player, skillId, skillLevel, skill.getHitTime(), 0));
 			return true;
 		}

+ 3 - 3
L2J_Server_BETA/java/com/l2jserver/gameserver/model/actor/instance/L2CubicInstance.java

@@ -486,7 +486,7 @@ public final class L2CubicInstance implements IIdentifiable
 			}
 			
 			// Apply effects
-			skill.applyEffects(getOwner(), this, target, null, false, false);
+			skill.applyEffects(getOwner(), this, target, false, false, true, 0);
 			
 			// If this is a bad skill notify the duel manager, so it can be removed after the duel (player & target must be in the same duel).
 			if (target.isPlayer() && target.getActingPlayer().isInDuel() && skill.isBad() && (getOwner().getDuelId() == target.getActingPlayer().getDuelId()))
@@ -621,7 +621,7 @@ public final class L2CubicInstance implements IIdentifiable
 				if (Formulas.calcCubicSkillSuccess(this, target, skill, shld))
 				{
 					// Apply effects
-					skill.applyEffects(getOwner(), this, target, null, false, false);
+					skill.applyEffects(getOwner(), this, target, false, false, true, 0);
 					
 					// If this is a bad skill notify the duel manager, so it can be removed after the duel (player & target must be in the same duel).
 					if (target.isPlayer() && target.getActingPlayer().isInDuel() && skill.isBad() && (getOwner().getDuelId() == target.getActingPlayer().getDuelId()))
@@ -653,7 +653,7 @@ public final class L2CubicInstance implements IIdentifiable
 					}
 					
 					// Apply effects
-					skill.applyEffects(getOwner(), this, target, null, false, false);
+					skill.applyEffects(getOwner(), this, target, false, false, true, 0);
 					
 					if (Config.DEBUG)
 					{

+ 1 - 1
L2J_Server_BETA/java/com/l2jserver/gameserver/model/actor/instance/L2NpcBufferInstance.java

@@ -165,7 +165,7 @@ public class L2NpcBufferInstance extends L2Npc
 				final L2Skill skill = SkillTable.getInstance().getInfo(npcBuffGroupInfo.getSkill().getSkillId(), npcBuffGroupInfo.getSkill().getSkillLvl());
 				if (skill != null)
 				{
-					skill.applyEffects(player, null, target, null, false, false);
+					skill.applyEffects(player, target);
 				}
 			}
 			

+ 4 - 40
L2J_Server_BETA/java/com/l2jserver/gameserver/model/actor/instance/L2PcInstance.java

@@ -189,7 +189,6 @@ import com.l2jserver.gameserver.model.base.ClassId;
 import com.l2jserver.gameserver.model.base.ClassLevel;
 import com.l2jserver.gameserver.model.base.PlayerClass;
 import com.l2jserver.gameserver.model.base.SubClass;
-import com.l2jserver.gameserver.model.effects.AbstractEffect;
 import com.l2jserver.gameserver.model.effects.EffectFlag;
 import com.l2jserver.gameserver.model.effects.L2EffectType;
 import com.l2jserver.gameserver.model.entity.Castle;
@@ -239,7 +238,6 @@ import com.l2jserver.gameserver.model.skills.L2Skill;
 import com.l2jserver.gameserver.model.skills.L2SkillType;
 import com.l2jserver.gameserver.model.skills.l2skills.L2SkillSiegeFlag;
 import com.l2jserver.gameserver.model.skills.targets.L2TargetType;
-import com.l2jserver.gameserver.model.stats.Env;
 import com.l2jserver.gameserver.model.stats.Formulas;
 import com.l2jserver.gameserver.model.stats.Stats;
 import com.l2jserver.gameserver.model.variables.AccountVariables;
@@ -8171,49 +8169,15 @@ public final class L2PcInstance extends L2Playable
 						addTimeStamp(skill, reuseDelay, systime);
 					}
 					
-					/**
-					 * Restore Type 1 The remaning skills lost effect upon logout but were still under a high reuse delay.
-					 */
+					// Restore Type 1 The remaning skills lost effect upon logout but were still under a high reuse delay.
 					if (restoreType > 0)
 					{
 						continue;
 					}
 					
-					/**
-					 * Restore Type 0 These skill were still in effect on the character upon logout.<br>
-					 * Some of which were self casted and might still have had a long reuse delay which also is restored.
-					 */
-					if (skill.hasEffects())
-					{
-						final Env env = new Env();
-						env.setCharacter(this);
-						env.setTarget(this);
-						env.setSkill(skill);
-						
-						final BuffInfo info = new BuffInfo(env);
-						info.setAbnormalTime(remainingTime);
-						for (AbstractEffect effect : skill.getEffectTemplates())
-						{
-							if (effect != null)
-							{
-								if (effect.isInstant())
-								{
-									if (effect.calcSuccess(info))
-									{
-										effect.onStart(info);
-									}
-								}
-								else
-								{
-									if (effect.onStart(info))
-									{
-										info.addEffect(effect);
-									}
-								}
-							}
-						}
-						getEffectList().add(info);
-					}
+					// Restore Type 0 These skill were still in effect on the character upon logout.
+					// Some of which were self casted and might still have had a long reuse delay which also is restored.
+					skill.applyEffects(this, this, false, remainingTime);
 				}
 			}
 			// Remove previously restored skills

+ 2 - 34
L2J_Server_BETA/java/com/l2jserver/gameserver/model/actor/instance/L2PetInstance.java

@@ -58,7 +58,6 @@ import com.l2jserver.gameserver.model.actor.L2Character;
 import com.l2jserver.gameserver.model.actor.L2Summon;
 import com.l2jserver.gameserver.model.actor.stat.PetStat;
 import com.l2jserver.gameserver.model.actor.templates.L2NpcTemplate;
-import com.l2jserver.gameserver.model.effects.AbstractEffect;
 import com.l2jserver.gameserver.model.itemcontainer.Inventory;
 import com.l2jserver.gameserver.model.itemcontainer.PcInventory;
 import com.l2jserver.gameserver.model.itemcontainer.PetInventory;
@@ -69,7 +68,6 @@ import com.l2jserver.gameserver.model.items.type.L2EtcItemType;
 import com.l2jserver.gameserver.model.skills.AbnormalType;
 import com.l2jserver.gameserver.model.skills.BuffInfo;
 import com.l2jserver.gameserver.model.skills.L2Skill;
-import com.l2jserver.gameserver.model.stats.Env;
 import com.l2jserver.gameserver.model.zone.ZoneId;
 import com.l2jserver.gameserver.network.SystemMessageId;
 import com.l2jserver.gameserver.network.serverpackets.ActionFailed;
@@ -1180,39 +1178,9 @@ public class L2PetInstance extends L2Summon
 			
 			for (SummonEffect se : SummonEffectsTable.getInstance().getPetEffects().get(getControlObjectId()))
 			{
-				if ((se != null) && se.getSkill().hasEffects())
+				if (se != null)
 				{
-					if (se.getSkill().hasEffects())
-					{
-						final Env env = new Env();
-						env.setCharacter(this);
-						env.setTarget(this);
-						env.setSkill(se.getSkill());
-						
-						final BuffInfo info = new BuffInfo(env);
-						info.setAbnormalTime(se.getEffectCurTime());
-						for (AbstractEffect effect : se.getSkill().getEffectTemplates())
-						{
-							if (effect != null)
-							{
-								if (effect.isInstant())
-								{
-									if (effect.calcSuccess(info))
-									{
-										effect.onStart(info);
-									}
-								}
-								else
-								{
-									if (effect.onStart(info))
-									{
-										info.addEffect(effect);
-									}
-								}
-							}
-						}
-						getEffectList().add(info);
-					}
+					se.getSkill().applyEffects(this, this, false, se.getEffectCurTime());
 				}
 			}
 		}

+ 1 - 1
L2J_Server_BETA/java/com/l2jserver/gameserver/model/actor/instance/L2SepulcherMonsterInstance.java

@@ -512,7 +512,7 @@ public class L2SepulcherMonsterInstance extends L2MonsterInstance
 		public void run()
 		{
 			// Invulnerable by petrification
-			FAKE_PETRIFICATION.getSkill().applyEffects(activeChar, null, activeChar, null, false, false);
+			FAKE_PETRIFICATION.getSkill().applyEffects(activeChar, activeChar);
 		}
 	}
 	

+ 2 - 34
L2J_Server_BETA/java/com/l2jserver/gameserver/model/actor/instance/L2ServitorInstance.java

@@ -40,12 +40,10 @@ import com.l2jserver.gameserver.model.L2Object;
 import com.l2jserver.gameserver.model.actor.L2Character;
 import com.l2jserver.gameserver.model.actor.L2Summon;
 import com.l2jserver.gameserver.model.actor.templates.L2NpcTemplate;
-import com.l2jserver.gameserver.model.effects.AbstractEffect;
 import com.l2jserver.gameserver.model.skills.AbnormalType;
 import com.l2jserver.gameserver.model.skills.BuffInfo;
 import com.l2jserver.gameserver.model.skills.L2Skill;
 import com.l2jserver.gameserver.model.skills.l2skills.L2SkillSummon;
-import com.l2jserver.gameserver.model.stats.Env;
 import com.l2jserver.gameserver.network.serverpackets.SetSummonRemainTime;
 
 import gnu.trove.map.hash.TIntObjectHashMap;
@@ -512,39 +510,9 @@ public class L2ServitorInstance extends L2Summon
 			
 			for (SummonEffect se : SummonEffectsTable.getInstance().getServitorEffects(getOwner()).get(getReferenceSkill()))
 			{
-				if ((se != null) && se.getSkill().hasEffects())
+				if (se != null)
 				{
-					if (se.getSkill().hasEffects())
-					{
-						final Env env = new Env();
-						env.setCharacter(this);
-						env.setTarget(this);
-						env.setSkill(se.getSkill());
-						
-						final BuffInfo info = new BuffInfo(env);
-						info.setAbnormalTime(se.getEffectCurTime());
-						for (AbstractEffect effect : se.getSkill().getEffectTemplates())
-						{
-							if (effect != null)
-							{
-								if (effect.isInstant())
-								{
-									if (effect.calcSuccess(info))
-									{
-										effect.onStart(info);
-									}
-								}
-								else
-								{
-									if (effect.onStart(info))
-									{
-										info.addEffect(effect);
-									}
-								}
-							}
-						}
-						getEffectList().add(info);
-					}
+					se.getSkill().applyEffects(this, this, false, se.getEffectCurTime());
 				}
 			}
 		}

+ 16 - 3
L2J_Server_BETA/java/com/l2jserver/gameserver/model/effects/AbstractEffect.java

@@ -37,7 +37,10 @@ import com.l2jserver.gameserver.model.skills.funcs.FuncTemplate;
 import com.l2jserver.gameserver.model.stats.Env;
 
 /**
- * Abstract effect implementation.
+ * Abstract effect implementation.<br>
+ * Instant effects should not override {@link #onExit(BuffInfo)}.<br>
+ * Instant effects should not override {@link #canStart(BuffInfo)}, all checks should be done {@link #onStart(BuffInfo)}. Do not call super class methods {@link #onStart(BuffInfo)} nor {@link #onExit(BuffInfo)}.<br>
+ * @since <a href="http://trac.l2jserver.com/changeset/6249">Changeset 6249</a> the "effect steal constructor" is deprecated.
  * @author Zoey76
  */
 public abstract class AbstractEffect implements IChanceSkillTrigger
@@ -263,15 +266,25 @@ public abstract class AbstractEffect implements IChanceSkillTrigger
 	}
 	
 	/**
-	 * Called on effect start.
+	 * Verify if the buff can start.<br>
+	 * Used for continuous effects.
 	 * @param info the buff info
 	 * @return {@code true} if all the start conditions are meet, {@code false} otherwise
 	 */
-	public boolean onStart(BuffInfo info)
+	public boolean canStart(BuffInfo info)
 	{
 		return true;
 	}
 	
+	/**
+	 * Called on effect start.
+	 * @param info the buff info
+	 */
+	public void onStart(BuffInfo info)
+	{
+		
+	}
+	
 	/**
 	 * Called on each tick.<br>
 	 * If the abnormal time is lesser than zero it will last forever.

+ 3 - 3
L2J_Server_BETA/java/com/l2jserver/gameserver/model/entity/BlockCheckerEngine.java

@@ -395,15 +395,15 @@ public final class BlockCheckerEngine
 				
 				// Give the player start up effects
 				// Freeze
-				_freeze.applyEffects(player, null, player, null, false, false);
+				_freeze.applyEffects(player, player);
 				// Transformation
 				if (_holder.getPlayerTeam(player) == 0)
 				{
-					_transformationRed.applyEffects(player, null, player, null, false, false);
+					_transformationRed.applyEffects(player, player);
 				}
 				else
 				{
-					_transformationBlue.applyEffects(player, null, player, null, false, false);
+					_transformationBlue.applyEffects(player, player);
 				}
 				// Set the current player arena
 				player.setBlockCheckerArena((byte) _arena);

+ 2 - 2
L2J_Server_BETA/java/com/l2jserver/gameserver/model/entity/TvTEvent.java

@@ -1000,7 +1000,7 @@ public class TvTEvent
 					L2Skill skill = SkillTable.getInstance().getInfo(e.getKey(), e.getValue());
 					if (skill != null)
 					{
-						skill.applyEffects(playerInstance, null, playerInstance, null, false, false);
+						skill.applyEffects(playerInstance, playerInstance);
 					}
 				}
 			}
@@ -1014,7 +1014,7 @@ public class TvTEvent
 					L2Skill skill = SkillTable.getInstance().getInfo(e.getKey(), e.getValue());
 					if (skill != null)
 					{
-						skill.applyEffects(playerInstance, null, playerInstance, null, false, false);
+						skill.applyEffects(playerInstance, playerInstance);
 					}
 				}
 			}

+ 1 - 1
L2J_Server_BETA/java/com/l2jserver/gameserver/model/items/L2Weapon.java

@@ -360,7 +360,7 @@ public final class L2Weapon extends L2Item
 			target.stopSkillEffects(false, onCritSkill.getId());
 		}
 		
-		onCritSkill.applyEffects(caster, null, target, new Env(shld, false, false, false), crit, crit);
+		onCritSkill.applyEffects(caster, target);
 	}
 	
 	/**

+ 11 - 5
L2J_Server_BETA/java/com/l2jserver/gameserver/model/skills/BuffInfo.java

@@ -278,6 +278,9 @@ public final class BuffInfo
 				continue;
 			}
 			
+			// Call on start.
+			effect.onStart(this);
+			
 			// If it's a continuous effect, if has ticks schedule a task with period, otherwise schedule a simple task to end it.
 			if (effect.getTicks() > 0)
 			{
@@ -360,7 +363,7 @@ public final class BuffInfo
 		}
 		
 		// Sends the proper system message.
-		final SystemMessageId smId;
+		SystemMessageId smId = null;
 		if (_env.getSkill().isToggle())
 		{
 			smId = SystemMessageId.S1_HAS_BEEN_ABORTED;
@@ -369,14 +372,17 @@ public final class BuffInfo
 		{
 			smId = SystemMessageId.EFFECT_S1_HAS_BEEN_REMOVED;
 		}
-		else
+		else if (!_env.getSkill().isPassive())
 		{
 			smId = SystemMessageId.S1_HAS_WORN_OFF;
 		}
 		
-		final SystemMessage sm = SystemMessage.getSystemMessage(smId);
-		sm.addSkillName(_env.getSkill());
-		_env.getTarget().sendPacket(sm);
+		if (smId != null)
+		{
+			final SystemMessage sm = SystemMessage.getSystemMessage(smId);
+			sm.addSkillName(_env.getSkill());
+			_env.getTarget().sendPacket(sm);
+		}
 		
 		if (this == _env.getTarget().getEffectList().getShortBuff())
 		{

+ 77 - 16
L2J_Server_BETA/java/com/l2jserver/gameserver/model/skills/L2Skill.java

@@ -1233,16 +1233,41 @@ public abstract class L2Skill implements IChanceSkillTrigger, IIdentifiable
 		return (_effectChanneling != null) && !_effectChanneling.isEmpty();
 	}
 	
+	/**
+	 * Method overload for {@link L2Skill#applyEffects(L2Character, L2CubicInstance, L2Character, boolean, boolean, boolean, int)}.<br>
+	 * Simplify the calls.
+	 * @param effector the caster of the skill
+	 * @param effected the target of the effect
+	 */
+	public void applyEffects(L2Character effector, L2Character effected)
+	{
+		applyEffects(effector, null, effected, false, false, true, 0);
+	}
+	
+	/**
+	 * Method overload for {@link L2Skill#applyEffects(L2Character, L2CubicInstance, L2Character, boolean, boolean, boolean, int)}.<br>
+	 * Simplify the calls, allowing abnormal time time customization.
+	 * @param effector the caster of the skill
+	 * @param effected the target of the effect
+	 * @param instant if {@code true} instant effects will be applied to the effected
+	 * @param abnormalTime custom abnormal time, if equal or lesser than zero will be ignored
+	 */
+	public void applyEffects(L2Character effector, L2Character effected, boolean instant, int abnormalTime)
+	{
+		applyEffects(effector, null, effected, false, false, instant, abnormalTime);
+	}
+	
 	/**
 	 * Applies the effects from this skill to the target.
 	 * @param effector the caster of the skill
 	 * @param cubic the cubic that cast the skill, can be {@code null}
 	 * @param effected the target of the effect
-	 * @param env
 	 * @param self if {@code true} self-effects will be casted on the caster
-	 * @param passive if {@code true} passive effects will be applied to the caster
+	 * @param passive if {@code true} passive effects will be applied to the effector
+	 * @param instant if {@code true} instant effects will be applied to the effected
+	 * @param abnormalTime custom abnormal time, if equal or lesser than zero will be ignored
 	 */
-	public final void applyEffects(L2Character effector, L2CubicInstance cubic, L2Character effected, Env env, boolean self, boolean passive)
+	public void applyEffects(L2Character effector, L2CubicInstance cubic, L2Character effected, boolean self, boolean passive, boolean instant, int abnormalTime)
 	{
 		// Null targets, doors and siege flags cannot receive any effects.
 		if ((effected == null) || effected.isDoor() || (effected instanceof L2SiegeFlagInstance))
@@ -1256,34 +1281,35 @@ public abstract class L2Skill implements IChanceSkillTrigger, IIdentifiable
 			return;
 		}
 		
-		if (env == null)
-		{
-			env = new Env();
-		}
+		final Env env = new Env();
 		env.setSkillMastery(Formulas.calcSkillMastery(effector, this));
 		env.setCharacter(effector);
 		env.setCubic(cubic);
 		env.setTarget(effected);
 		env.setSkill(this);
-		final boolean addContinuousEffects = _operateType.isToggle() || (_operateType.isContinuous() && Formulas.calcEffectSuccess(env));
-		
+		final boolean addContinuousEffects = !passive && (_operateType.isToggle() || (_operateType.isContinuous() && Formulas.calcEffectSuccess(env)));
 		if (!self && !passive && hasEffects())
 		{
 			final BuffInfo info = new BuffInfo(env);
+			if (addContinuousEffects && (abnormalTime > 0))
+			{
+				info.setAbnormalTime(abnormalTime);
+			}
+			
 			for (AbstractEffect effect : _effects)
 			{
 				if (effect != null)
 				{
 					if (effect.isInstant())
 					{
-						if (effect.calcSuccess(info))
+						if (instant && effect.calcSuccess(info))
 						{
 							effect.onStart(info);
 						}
 					}
 					else if (addContinuousEffects)
 					{
-						if (effect.onStart(info))
+						if (effect.canStart(info))
 						{
 							info.addEffect(effect);
 						}
@@ -1291,26 +1317,37 @@ public abstract class L2Skill implements IChanceSkillTrigger, IIdentifiable
 				}
 			}
 			effected.getEffectList().add(info);
+			
+			// Support for buff sharing feature.
+			if (addContinuousEffects && effected.isPlayer() && effected.hasSummon() && isContinuous() && !isDebuff())
+			{
+				applyEffects(effector, effected.getSummon(), false, 0);
+			}
 		}
 		
 		if (self && hasSelfEffects())
 		{
 			env.setTarget(effector);
 			final BuffInfo info = new BuffInfo(env);
+			if (addContinuousEffects && (abnormalTime > 0))
+			{
+				info.setAbnormalTime(abnormalTime);
+			}
+			
 			for (AbstractEffect effect : _effectSelf)
 			{
 				if (effect != null)
 				{
 					if (effect.isInstant())
 					{
-						if (effect.calcSuccess(info))
+						if (instant && effect.calcSuccess(info))
 						{
 							effect.onStart(info);
 						}
 					}
 					else if (addContinuousEffects)
 					{
-						if (effect.onStart(info))
+						if (effect.canStart(info))
 						{
 							info.addEffect(effect);
 						}
@@ -1318,6 +1355,12 @@ public abstract class L2Skill implements IChanceSkillTrigger, IIdentifiable
 				}
 			}
 			effector.getEffectList().add(info);
+			
+			// Support for buff sharing feature.
+			if (addContinuousEffects && effected.isPlayer() && effected.hasSummon() && isContinuous() && !isDebuff())
+			{
+				applyEffects(effector, effected.getSummon(), false, 0);
+			}
 		}
 		
 		if (passive && hasPassiveEffects())
@@ -1328,7 +1371,7 @@ public abstract class L2Skill implements IChanceSkillTrigger, IIdentifiable
 			{
 				if (effect != null)
 				{
-					if (effect.onStart(info))
+					if (effect.canStart(info))
 					{
 						info.addEffect(effect);
 					}
@@ -1341,13 +1384,25 @@ public abstract class L2Skill implements IChanceSkillTrigger, IIdentifiable
 		{
 			env.setTarget(effected);
 			final BuffInfo info = new BuffInfo(env);
+			if (addContinuousEffects && (abnormalTime > 0))
+			{
+				info.setAbnormalTime(abnormalTime);
+			}
+			
 			for (AbstractEffect effect : _effectChanneling)
 			{
 				if (effect != null)
 				{
-					if ((effect.isInstant() && effect.calcSuccess(info)) || (!effect.isInstant() && addContinuousEffects))
+					if (effect.isInstant())
+					{
+						if (instant && effect.calcSuccess(info))
+						{
+							effect.onStart(info);
+						}
+					}
+					else if (addContinuousEffects)
 					{
-						if (effect.onStart(info))
+						if (effect.canStart(info))
 						{
 							info.addEffect(effect);
 						}
@@ -1355,6 +1410,12 @@ public abstract class L2Skill implements IChanceSkillTrigger, IIdentifiable
 				}
 			}
 			effector.getEffectList().add(info);
+			
+			// Support for buff sharing feature.
+			if (addContinuousEffects && effected.isPlayer() && effected.hasSummon() && isContinuous() && !isDebuff())
+			{
+				applyEffects(effector, effected.getSummon(), false, 0);
+			}
 		}
 	}
 	

+ 3 - 3
L2J_Server_BETA/java/com/l2jserver/gameserver/model/skills/SkillChannelizer.java

@@ -185,7 +185,7 @@ public class SkillChannelizer implements Runnable
 				if ((info == null) || (info.getSkill().getLevel() < skillLevel))
 				{
 					final L2Skill skill = SkillTable.getInstance().getInfo(_skill.getChannelingSkillId(), skillLevel);
-					skill.applyEffects(getChannelizer(), null, _channelized, null, false, false);
+					skill.applyEffects(getChannelizer(), _channelized);
 				}
 				_channelizer.broadcastPacket(new MagicSkillLaunched(_channelizer, _skill.getId(), _skill.getLevel(), _channelized));
 			}
@@ -209,7 +209,7 @@ public class SkillChannelizer implements Runnable
 					if (_channelizer.isPlayable() && _channelizer.getActingPlayer().canAttackCharacter(target))
 					{
 						// Apply channeling skill effects on the target.
-						_skill.applyEffects(_channelizer, null, _channelizer, null, false, false);
+						_skill.applyEffects(_channelizer, _channelizer);
 						// Update the pvp flag of the caster.
 						_channelizer.getActingPlayer().updatePvPStatus(target);
 					}
@@ -221,7 +221,7 @@ public class SkillChannelizer implements Runnable
 				else
 				{
 					// Apply channeling skill effects on the target.
-					_skill.applyEffects(_channelizer, null, _channelizer, null, false, false);
+					_skill.applyEffects(_channelizer, _channelizer);
 				}
 			}
 			

+ 2 - 2
L2J_Server_BETA/java/com/l2jserver/gameserver/model/zone/type/L2DynamicZone.java

@@ -75,7 +75,7 @@ public class L2DynamicZone extends L2ZoneType
 		}
 		if (_owner != null)
 		{
-			_skill.applyEffects(_owner, null, character, null, false, false);
+			_skill.applyEffects(_owner, character);
 		}
 	}
 	
@@ -130,6 +130,6 @@ public class L2DynamicZone extends L2ZoneType
 	@Override
 	public void onReviveInside(L2Character character)
 	{
-		_skill.applyEffects(_owner, null, character, null, false, false);
+		_skill.applyEffects(_owner, character);
 	}
 }

+ 1 - 1
L2J_Server_BETA/java/com/l2jserver/gameserver/model/zone/type/L2EffectZone.java

@@ -263,7 +263,7 @@ public class L2EffectZone extends L2ZoneType
 								{
 									if (!temp.isAffectedBySkill(e.getKey()))
 									{
-										skill.applyEffects(temp, null, temp, null, false, false);
+										skill.applyEffects(temp, temp);
 									}
 								}
 							}

+ 1 - 1
L2J_Server_BETA/java/com/l2jserver/gameserver/model/zone/type/L2SiegeZone.java

@@ -257,7 +257,7 @@ public class L2SiegeZone extends L2ZoneType
 				final L2Skill skill = SkillTable.getInstance().getInfo(5660, lvl);
 				if (skill != null)
 				{
-					skill.applyEffects(character, null, character, null, false, false);
+					skill.applyEffects(character, character);
 				}
 			}
 		}