Browse Source

BETA: Skill and effect system complete rework:
* Renamed `L2Effect` to `AbstractEffect`.
* No more dynamic creation of effects (Huge performance and memory boost!).
* Removed all traces or reflection on run time!
* Removed `EffectTemplate`, merged with `AbstractEffect`.
* Reworked and externalized all the logic from `AbstractEffect` that handled effect ticking.
* Reviewed all "over time" skills:
* `Flag` effect does not have ticks and doesn't need onActionTime() defined.
* '''Fixed DOT (damage over time), MDOT (mana damage over time), HOT (heal over time), MHOT (mana heal over time) skills.'''
* Reported by: Tavo22, Snip
* `FakeDeath` effect should only last forever (or while conditions are met) if it's a toggle skill.
* `Relax` effect should only last forever (or while conditions are met) if it's a toggle skill.
* Removed `EffectState` enumerated and the nasty switch associated to it!
* Removed "lambda" support from effects, the default attribute `val` is now double.
* Removed val="0", now `val`'s default value is zero, no need to declare it explicitely.
* '''Removed''' `noicon` '''attribute from effects, icon is not related to effects, but to the skill.''
* Renamed `AbnormalEffect` enumerated to `AbnormalVisualEffect`.
* Removed `EffectDurationHolder` DTO.
* Removed getFirstEffect(int), skills can be stoped by skill ID or `AbnormalType`.
* Reworked (again) `CharEffectList`:
* Using maps as underlying implementation, '''reduced drastically iterations''' (Hash tables offer 0(1) in most operations).
* Using Javolution's `FastMap`, due Java lacks a default implementation that is ordered by insert order, thread-safe and concurrent safe.
* Separated all kind of skills into buffs, triggers, dances, debuffs, passive.
* Using Double-locked checking, useless instantiation of maps is avoided.
* Improved buff counting operations (no more iterations over every effect every time you get a new one to know if you reached maximum count).
* Removed getEffects() and all temporary list/map creations.
* '''Reworked the way buffs are inserted preventing iterations and correcting exceptions while finding the correct index to insert the buff.'''
* Reworked `Formulas`#calcEffectAbnormalTime(Env env)
* Fixed `L2CubicInstance`#useCubic<Skill Type>(..), this methods are not static, then they don't need to recieve a `L2CubicInstance` as parameter.
* Implemented `BuffInfo`, modeled from retail's implementation with minor changes to fit our implementation.
* Complex DTO that holds all the information for a given buff (or debuff or dance/song) set of effects issued by an skill.
* Controls the logic of the buffs.
* Removed a few of `L2EffectType`.
* Improved a bit `L2BabyPetInstance` skill casting related logic, reduced iterations and simplified the code.
* Implemented `EffectTaskInfo`, DTO to hold the effect task (Maybe this will change later).
* Implemented `EffectTickTask` runnable task to control ticking logic.
* Removed "after effect" implementation, totally useless.
* Suggested by: UnAfraid
* Removed all the `L2Skill`#getEffects(..) methods replaced with L2Skill#applyEffects(..).
* Moved "can be stolen" logic to `L2Skill`, it isn't related to the effect, but to the skill.
* Added "Refresh" button on admin panel to check buffs easily.
* Added admin command "admin_getbuff_ps" to check effects from passive skills.
* Improved performance in `DispelBySlot` and `DispelBySlotProbability` effects.
* Fixed minor typo in `DispelBySlot` and `DispelBySlotProbability` effects, there are values over `Byte.MAX_VALUE`.
* '''Added retail support for Herbs, when a lesser buff is replaced by an herb, it becomes inactive, but it's timer continues, when the Herb buff finishes if the lesser buff has time it becomes active untill completes it's time.'''
* Time does not pause, it just continues in the background.
* Effects does not stack.
* Reported by: Nos
* '''Fixed Herbs, they shouldn't display gauge bar (casting bar) upon usage.'''
* Reported by: Nos
* '''Fixed Herbs not removing lesser effect icon, leading to players belive that buffs stack...'''
* Reported by: Tavo22, evets, u3games, pandragon
* '''Fixing instant effects being added to the effect list, and removing buffs present on the list.'''
* Reported by: Tavo22
* '''Fixed "Short Buff" slot (slot for healing potions).'''
* Statified reset packet (reduced object creation, a lot!).
* Removed task to reset `ShortBuffStatusUpdate`, let's use buff ending task for that.
* Moved logic to `CharEffectList` instead of `L2PcInstance` + `ItemSkillsTemplate`.
* Reported by: JMD, Gries, Cresceus
* Fixed `StealAbnormal` effect logic and `Formulas`#calcCancelStealEffects(..).
* Improved buffs doesn't stack anymore with normal (lesser) buffs.
* Now all effects are excecuted including instant effects (if they are successfuly applied).
* Reported by: Adry_85
* `BlockChat` effect shouldn't be instant!
* Fixed system messages related to skills (success, fail, removal, ending).
* Improved `AdminBuffs`, more information is displayed:
* Blocked abnormal skill types (if any)
* Total buff count.
* Hidden buff count.
* Inactive effects (in red)
* Skill level next to the name.
* '''Rewritten''' `EffectMasterHandler` '''to avoid reflection where it's useless.'''
* Since `L2EffectType` is scheduled to be removed:
* `AbstractEffect`#getEffectType() is not abstract anymore, now returns L2EffectType.NONE by default.
* '''Fixing debuffs working on "white players" with control.'''
* Patch by: nBd (minor changes by Zoey76)
* Reported by: plasan, jungla56, St3eT, Tavo22, Konstantinos, pandragon
* '''Fixed exploit on restore summon feature that allows players to dupe summons.'''
* Unhardcoding `canSummon` condition.
* Reported by: Janiko
* '''Fixed Arcane Shield getting stuck after being stolen.'''
* Reported by: valanths1990, nBd, freestyler, Gries
* '''Fixed triggered skills that got stacked within the same ID and different level.'''
* Reported by: nBd, lucan, blacksea, Gries

Tested by: Nos, Captain, Janiko, Konstantinos, Lucan, UnAfraid, Zoey76

'''Note to developers 1:''' Instant effects shouldn't override onExit(!BuffInfo).
'''Note to developers 2:''' Is not required to call super.onStart() or super.onExit() to add/remove abnormal visual effects anymore, it's done on an indepent method.
'''Note to developers 3:''' Do not add "steal constructor", such thing is not required anymore.

Zoey76 11 năm trước cách đây
mục cha
commit
cdfeacf82c
100 tập tin đã thay đổi với 1366 bổ sung1677 xóa
  1. 1 1
      L2J_DataPack_BETA/dist/game/data/scripts/ai/group_template/DenOfEvil.java
  2. 1 1
      L2J_DataPack_BETA/dist/game/data/scripts/ai/group_template/EvasGiftBoxes.java
  3. 1 1
      L2J_DataPack_BETA/dist/game/data/scripts/ai/group_template/FairyTrees.java
  4. 1 1
      L2J_DataPack_BETA/dist/game/data/scripts/ai/group_template/PlainsOfLizardman.java
  5. 5 5
      L2J_DataPack_BETA/dist/game/data/scripts/ai/group_template/PrisonGuards.java
  6. 1 1
      L2J_DataPack_BETA/dist/game/data/scripts/ai/group_template/SeedOfAnnihilation.java
  7. 6 6
      L2J_DataPack_BETA/dist/game/data/scripts/ai/individual/Amaskari.java
  8. 1 10
      L2J_DataPack_BETA/dist/game/data/scripts/ai/individual/Baium.java
  9. 1 1
      L2J_DataPack_BETA/dist/game/data/scripts/ai/individual/QueenAnt.java
  10. 5 5
      L2J_DataPack_BETA/dist/game/data/scripts/ai/individual/Valakas.java
  11. 11 27
      L2J_DataPack_BETA/dist/game/data/scripts/ai/individual/Zaken.java
  12. 4 4
      L2J_DataPack_BETA/dist/game/data/scripts/ai/npc/ForgeOfTheGods/TarBeetle.java
  13. 4 4
      L2J_DataPack_BETA/dist/game/data/scripts/ai/npc/NpcBuffers/NpcBufferAI.java
  14. 3 3
      L2J_DataPack_BETA/dist/game/data/scripts/ai/npc/NpcBuffers/impl/CabaleBuffer.java
  15. 1 1
      L2J_DataPack_BETA/dist/game/data/scripts/conquerablehalls/RainbowSpringsChateau/RainbowSpringsChateau.java
  16. 2 2
      L2J_DataPack_BETA/dist/game/data/scripts/custom/IOPRace/IOPRace.java
  17. 6 40
      L2J_DataPack_BETA/dist/game/data/scripts/handlers/EffectMasterHandler.java
  18. 69 44
      L2J_DataPack_BETA/dist/game/data/scripts/handlers/admincommandhandlers/AdminBuffs.java
  19. 10 10
      L2J_DataPack_BETA/dist/game/data/scripts/handlers/admincommandhandlers/AdminEffects.java
  20. 2 2
      L2J_DataPack_BETA/dist/game/data/scripts/handlers/bypasshandlers/OlympiadManagerLink.java
  21. 14 19
      L2J_DataPack_BETA/dist/game/data/scripts/handlers/effecthandlers/AddHate.java
  22. 19 31
      L2J_DataPack_BETA/dist/game/data/scripts/handlers/effecthandlers/AttackTrait.java
  23. 19 18
      L2J_DataPack_BETA/dist/game/data/scripts/handlers/effecthandlers/Backstab.java
  24. 13 12
      L2J_DataPack_BETA/dist/game/data/scripts/handlers/effecthandlers/Betray.java
  25. 12 11
      L2J_DataPack_BETA/dist/game/data/scripts/handlers/effecthandlers/BigHead.java
  26. 25 34
      L2J_DataPack_BETA/dist/game/data/scripts/handlers/effecthandlers/Blink.java
  27. 32 39
      L2J_DataPack_BETA/dist/game/data/scripts/handlers/effecthandlers/BlockAction.java
  28. 12 18
      L2J_DataPack_BETA/dist/game/data/scripts/handlers/effecthandlers/BlockBuffSlot.java
  29. 17 21
      L2J_DataPack_BETA/dist/game/data/scripts/handlers/effecthandlers/BlockChat.java
  30. 13 22
      L2J_DataPack_BETA/dist/game/data/scripts/handlers/effecthandlers/BlockParty.java
  31. 6 6
      L2J_DataPack_BETA/dist/game/data/scripts/handlers/effecthandlers/BlockResurrection.java
  32. 16 21
      L2J_DataPack_BETA/dist/game/data/scripts/handlers/effecthandlers/Bluff.java
  33. 9 19
      L2J_DataPack_BETA/dist/game/data/scripts/handlers/effecthandlers/Buff.java
  34. 13 21
      L2J_DataPack_BETA/dist/game/data/scripts/handlers/effecthandlers/CallParty.java
  35. 14 20
      L2J_DataPack_BETA/dist/game/data/scripts/handlers/effecthandlers/CallPc.java
  36. 20 20
      L2J_DataPack_BETA/dist/game/data/scripts/handlers/effecthandlers/ChameleonRest.java
  37. 18 61
      L2J_DataPack_BETA/dist/game/data/scripts/handlers/effecthandlers/ChanceSkillTrigger.java
  38. 11 17
      L2J_DataPack_BETA/dist/game/data/scripts/handlers/effecthandlers/ChangeFace.java
  39. 6 23
      L2J_DataPack_BETA/dist/game/data/scripts/handlers/effecthandlers/ChangeFishingMastery.java
  40. 11 17
      L2J_DataPack_BETA/dist/game/data/scripts/handlers/effecthandlers/ChangeHairColor.java
  41. 11 17
      L2J_DataPack_BETA/dist/game/data/scripts/handlers/effecthandlers/ChangeHairStyle.java
  42. 13 12
      L2J_DataPack_BETA/dist/game/data/scripts/handlers/effecthandlers/CharmOfCourage.java
  43. 9 8
      L2J_DataPack_BETA/dist/game/data/scripts/handlers/effecthandlers/CharmOfLuck.java
  44. 15 14
      L2J_DataPack_BETA/dist/game/data/scripts/handlers/effecthandlers/ClanGate.java
  45. 25 36
      L2J_DataPack_BETA/dist/game/data/scripts/handlers/effecthandlers/Confuse.java
  46. 10 16
      L2J_DataPack_BETA/dist/game/data/scripts/handlers/effecthandlers/ConsumeBody.java
  47. 10 16
      L2J_DataPack_BETA/dist/game/data/scripts/handlers/effecthandlers/ConvertItem.java
  48. 20 19
      L2J_DataPack_BETA/dist/game/data/scripts/handlers/effecthandlers/CpDamPercent.java
  49. 14 13
      L2J_DataPack_BETA/dist/game/data/scripts/handlers/effecthandlers/CpHeal.java
  50. 14 24
      L2J_DataPack_BETA/dist/game/data/scripts/handlers/effecthandlers/CpHealOverTime.java
  51. 10 9
      L2J_DataPack_BETA/dist/game/data/scripts/handlers/effecthandlers/CpHealPercent.java
  52. 12 18
      L2J_DataPack_BETA/dist/game/data/scripts/handlers/effecthandlers/CrystalGradeModify.java
  53. 11 10
      L2J_DataPack_BETA/dist/game/data/scripts/handlers/effecthandlers/CubicMastery.java
  54. 21 19
      L2J_DataPack_BETA/dist/game/data/scripts/handlers/effecthandlers/DamOverTime.java
  55. 20 19
      L2J_DataPack_BETA/dist/game/data/scripts/handlers/effecthandlers/DamOverTimePercent.java
  56. 21 20
      L2J_DataPack_BETA/dist/game/data/scripts/handlers/effecthandlers/DeathLink.java
  57. 6 6
      L2J_DataPack_BETA/dist/game/data/scripts/handlers/effecthandlers/Debuff.java
  58. 36 38
      L2J_DataPack_BETA/dist/game/data/scripts/handlers/effecthandlers/DefenceTrait.java
  59. 13 12
      L2J_DataPack_BETA/dist/game/data/scripts/handlers/effecthandlers/DeleteHate.java
  60. 14 13
      L2J_DataPack_BETA/dist/game/data/scripts/handlers/effecthandlers/DeleteHateOfMe.java
  61. 10 16
      L2J_DataPack_BETA/dist/game/data/scripts/handlers/effecthandlers/Disarm.java
  62. 9 8
      L2J_DataPack_BETA/dist/game/data/scripts/handlers/effecthandlers/DispelAll.java
  63. 15 14
      L2J_DataPack_BETA/dist/game/data/scripts/handlers/effecthandlers/DispelByCategory.java
  64. 29 27
      L2J_DataPack_BETA/dist/game/data/scripts/handlers/effecthandlers/DispelBySlot.java
  65. 36 18
      L2J_DataPack_BETA/dist/game/data/scripts/handlers/effecthandlers/DispelBySlotProbability.java
  66. 26 38
      L2J_DataPack_BETA/dist/game/data/scripts/handlers/effecthandlers/EnemyCharge.java
  67. 20 19
      L2J_DataPack_BETA/dist/game/data/scripts/handlers/effecthandlers/EnergyAttack.java
  68. 11 17
      L2J_DataPack_BETA/dist/game/data/scripts/handlers/effecthandlers/EnlargeAbnormalSlot.java
  69. 12 11
      L2J_DataPack_BETA/dist/game/data/scripts/handlers/effecthandlers/Escape.java
  70. 24 22
      L2J_DataPack_BETA/dist/game/data/scripts/handlers/effecthandlers/FakeDeath.java
  71. 19 18
      L2J_DataPack_BETA/dist/game/data/scripts/handlers/effecthandlers/FatalBlow.java
  72. 27 36
      L2J_DataPack_BETA/dist/game/data/scripts/handlers/effecthandlers/Fear.java
  73. 13 30
      L2J_DataPack_BETA/dist/game/data/scripts/handlers/effecthandlers/Flag.java
  74. 10 16
      L2J_DataPack_BETA/dist/game/data/scripts/handlers/effecthandlers/FocusEnergy.java
  75. 13 19
      L2J_DataPack_BETA/dist/game/data/scripts/handlers/effecthandlers/FocusMaxEnergy.java
  76. 11 17
      L2J_DataPack_BETA/dist/game/data/scripts/handlers/effecthandlers/FocusSouls.java
  77. 11 10
      L2J_DataPack_BETA/dist/game/data/scripts/handlers/effecthandlers/GetAgro.java
  78. 10 16
      L2J_DataPack_BETA/dist/game/data/scripts/handlers/effecthandlers/GiveSp.java
  79. 16 15
      L2J_DataPack_BETA/dist/game/data/scripts/handlers/effecthandlers/Grow.java
  80. 11 22
      L2J_DataPack_BETA/dist/game/data/scripts/handlers/effecthandlers/Harvesting.java
  81. 18 17
      L2J_DataPack_BETA/dist/game/data/scripts/handlers/effecthandlers/Heal.java
  82. 17 27
      L2J_DataPack_BETA/dist/game/data/scripts/handlers/effecthandlers/HealOverTime.java
  83. 12 11
      L2J_DataPack_BETA/dist/game/data/scripts/handlers/effecthandlers/HealPercent.java
  84. 16 27
      L2J_DataPack_BETA/dist/game/data/scripts/handlers/effecthandlers/Hide.java
  85. 11 17
      L2J_DataPack_BETA/dist/game/data/scripts/handlers/effecthandlers/HolythingPossess.java
  86. 14 13
      L2J_DataPack_BETA/dist/game/data/scripts/handlers/effecthandlers/HpByLevel.java
  87. 19 18
      L2J_DataPack_BETA/dist/game/data/scripts/handlers/effecthandlers/HpDrain.java
  88. 11 17
      L2J_DataPack_BETA/dist/game/data/scripts/handlers/effecthandlers/ImmobileBuff.java
  89. 12 19
      L2J_DataPack_BETA/dist/game/data/scripts/handlers/effecthandlers/ImmobilePetBuff.java
  90. 6 6
      L2J_DataPack_BETA/dist/game/data/scripts/handlers/effecthandlers/Invincible.java
  91. 16 15
      L2J_DataPack_BETA/dist/game/data/scripts/handlers/effecthandlers/Lethal.java
  92. 11 10
      L2J_DataPack_BETA/dist/game/data/scripts/handlers/effecthandlers/Lucky.java
  93. 22 21
      L2J_DataPack_BETA/dist/game/data/scripts/handlers/effecthandlers/MagicalAttack.java
  94. 18 17
      L2J_DataPack_BETA/dist/game/data/scripts/handlers/effecthandlers/MagicalAttackMp.java
  95. 23 22
      L2J_DataPack_BETA/dist/game/data/scripts/handlers/effecthandlers/MagicalSoulAttack.java
  96. 14 13
      L2J_DataPack_BETA/dist/game/data/scripts/handlers/effecthandlers/ManaDamOverTime.java
  97. 13 12
      L2J_DataPack_BETA/dist/game/data/scripts/handlers/effecthandlers/ManaHeal.java
  98. 14 13
      L2J_DataPack_BETA/dist/game/data/scripts/handlers/effecthandlers/ManaHealByLevel.java
  99. 14 24
      L2J_DataPack_BETA/dist/game/data/scripts/handlers/effecthandlers/ManaHealOverTime.java
  100. 12 11
      L2J_DataPack_BETA/dist/game/data/scripts/handlers/effecthandlers/ManaHealPercent.java

+ 1 - 1
L2J_DataPack_BETA/dist/game/data/scripts/ai/group_template/DenOfEvil.java

@@ -211,7 +211,7 @@ public class DenOfEvil extends AbstractNpcAI
 				if (character.isPlayable())
 				{
 					L2Skill skill = SkillTable.getInstance().getInfo(6149, 1);
-					skill.getEffects(character, character); // apply effect
+					skill.applyEffects(character, null, character, null, false, false); // apply effect
 				}
 				else
 				{

+ 1 - 1
L2J_DataPack_BETA/dist/game/data/scripts/ai/group_template/EvasGiftBoxes.java

@@ -61,7 +61,7 @@ public class EvasGiftBoxes extends AbstractNpcAI
 		if (npc.getId() == GIFTBOX)
 		{
 			int isKissOfEvaBuffed = 0;
-			if (killer.getFirstEffect(KISSOFEVA) != null)
+			if (killer.isAffectedBySkill(KISSOFEVA))
 			{
 				isKissOfEvaBuffed = 1;
 			}

+ 1 - 1
L2J_DataPack_BETA/dist/game/data/scripts/ai/group_template/FairyTrees.java

@@ -68,7 +68,7 @@ public class FairyTrees extends AbstractNpcAI
 					L2Skill skill = SkillTable.getInstance().getInfo(4243, 1);
 					if ((skill != null) && (originalKiller != null))
 					{
-						skill.getEffects(newNpc, originalKiller);
+						skill.applyEffects(newNpc, null, originalKiller, null, false, false);
 					}
 				}
 			}

+ 1 - 1
L2J_DataPack_BETA/dist/game/data/scripts/ai/group_template/PlainsOfLizardman.java

@@ -121,7 +121,7 @@ public final class PlainsOfLizardman extends AbstractNpcAI
 		switch (npc.getId())
 		{
 			case TANTA_SUMMONER:
-				if (npc.getFirstEffect(DEMOTIVATION_HEX.getSkillId()) == null)
+				if (!npc.isAffectedBySkill(DEMOTIVATION_HEX.getSkillId()))
 				{
 					npc.doCast(DEMOTIVATION_HEX.getSkill());
 				}

+ 5 - 5
L2J_DataPack_BETA/dist/game/data/scripts/ai/group_template/PrisonGuards.java

@@ -137,9 +137,9 @@ public class PrisonGuards extends AbstractNpcAI
 		
 		if (npc.getId() == GUARD2)
 		{
-			if (_firstAttacked && (caster.getFirstEffect(SKILL_EVENT_TIMER) == null))
+			if (_firstAttacked && !caster.isAffectedBySkill(SKILL_EVENT_TIMER))
 			{
-				if (caster.getFirstEffect(SKILL_SILENCE) == null)
+				if (!caster.isAffectedBySkill(SKILL_SILENCE))
 				{
 					castDebuff(npc, caster, SKILL_SILENCE, isSummon, false, true);
 				}
@@ -156,7 +156,7 @@ public class PrisonGuards extends AbstractNpcAI
 		
 		if (npc.getId() == GUARD2)
 		{
-			if (target.getFirstEffect(SKILL_EVENT_TIMER) != null)
+			if (target.isAffectedBySkill(SKILL_EVENT_TIMER))
 			{
 				cancelQuestTimer("attackEnd", null, null);
 				startQuestTimer("attackEnd", 180000, npc, null);
@@ -190,9 +190,9 @@ public class PrisonGuards extends AbstractNpcAI
 		
 		_firstAttacked = true;
 		
-		if (attacker.getFirstEffect(SKILL_EVENT_TIMER) == null)
+		if (!attacker.isAffectedBySkill(SKILL_EVENT_TIMER))
 		{
-			if (attacker.getFirstEffect(SKILL_PERTIFICATION) == null)
+			if (!attacker.isAffectedBySkill(SKILL_PERTIFICATION))
 			{
 				castDebuff(npc, attacker, SKILL_PERTIFICATION, isSummon, true, false);
 			}

+ 1 - 1
L2J_DataPack_BETA/dist/game/data/scripts/ai/group_template/SeedOfAnnihilation.java

@@ -344,7 +344,7 @@ public class SeedOfAnnihilation extends AbstractNpcAI
 		}
 		else if (event.equalsIgnoreCase("transform"))
 		{
-			if (player.getFirstEffect(6408) != null)
+			if (player.isAffectedBySkill(6408))
 			{
 				npc.showChatWindow(player, 2);
 			}

+ 6 - 6
L2J_DataPack_BETA/dist/game/data/scripts/ai/individual/Amaskari.java

@@ -25,8 +25,8 @@ import com.l2jserver.gameserver.instancemanager.HellboundManager;
 import com.l2jserver.gameserver.model.actor.L2Npc;
 import com.l2jserver.gameserver.model.actor.instance.L2MonsterInstance;
 import com.l2jserver.gameserver.model.actor.instance.L2PcInstance;
-import com.l2jserver.gameserver.model.effects.L2Effect;
 import com.l2jserver.gameserver.model.holders.SkillHolder;
+import com.l2jserver.gameserver.model.skills.BuffInfo;
 import com.l2jserver.gameserver.model.skills.L2Skill;
 import com.l2jserver.gameserver.network.NpcStringId;
 import com.l2jserver.gameserver.network.clientpackets.Say2;
@@ -128,8 +128,8 @@ public class Amaskari extends AbstractNpcAI
 			if ((master != null) && !master.isDead())
 			{
 				master.broadcastPacket(new NpcSay(master.getObjectId(), Say2.NPC_ALL, master.getId(), AMASKARI_NPCSTRING_ID[1]));
-				final L2Effect e = master.getFirstEffect(BUFF_ID);
-				if ((e != null) && (e.getSkill().getAbnormalLvl() == 3) && master.isInvul())
+				final BuffInfo info = master.getEffectList().getBuffInfoBySkillId(BUFF_ID);
+				if ((info != null) && (info.getSkill().getAbnormalLvl() == 3) && master.isInvul())
 				{
 					master.setCurrentHp(master.getCurrentHp() + (master.getCurrentHp() / 5));
 				}
@@ -137,13 +137,13 @@ public class Amaskari extends AbstractNpcAI
 				{
 					master.clearAggroList();
 					master.getAI().setIntention(CtrlIntention.AI_INTENTION_ACTIVE);
-					if (e == null)
+					if (info == null)
 					{
 						master.doCast(BUFF[0].getSkill());
 					}
-					else if (e.getSkill().getAbnormalLvl() < 3)
+					else if (info.getSkill().getAbnormalLvl() < 3)
 					{
-						master.doCast(BUFF[e.getSkill().getAbnormalLvl()].getSkill());
+						master.doCast(BUFF[info.getSkill().getAbnormalLvl()].getSkill());
 					}
 					else
 					{

+ 1 - 10
L2J_DataPack_BETA/dist/game/data/scripts/ai/individual/Baium.java

@@ -42,7 +42,6 @@ import com.l2jserver.gameserver.model.actor.L2Npc;
 import com.l2jserver.gameserver.model.actor.instance.L2DecoyInstance;
 import com.l2jserver.gameserver.model.actor.instance.L2GrandBossInstance;
 import com.l2jserver.gameserver.model.actor.instance.L2PcInstance;
-import com.l2jserver.gameserver.model.effects.L2Effect;
 import com.l2jserver.gameserver.model.holders.SkillHolder;
 import com.l2jserver.gameserver.model.quest.QuestTimer;
 import com.l2jserver.gameserver.model.skills.L2Skill;
@@ -412,15 +411,7 @@ public class Baium extends AbstractNpcAI
 		
 		if (attacker.getMountType() == MountType.STRIDER)
 		{
-			boolean hasStriderDebuff = false;
-			for (L2Effect e : attacker.getAllEffects())
-			{
-				if (e.getSkill().getId() == HINDER_STRIDER.getSkillId())
-				{
-					hasStriderDebuff = true;
-				}
-			}
-			if (!hasStriderDebuff)
+			if (!attacker.isAffectedBySkill(HINDER_STRIDER.getSkillId()))
 			{
 				npc.setTarget(attacker);
 				if (npc.isMuted())

+ 1 - 1
L2J_DataPack_BETA/dist/game/data/scripts/ai/individual/QueenAnt.java

@@ -316,7 +316,7 @@ public class QueenAnt extends AbstractNpcAI
 			if (curse != null)
 			{
 				npc.broadcastPacket(new MagicSkillUse(npc, character, curse.getId(), curse.getLevel(), 300, 0));
-				curse.getEffects(npc, character);
+				curse.applyEffects(npc, null, character, null, false, false);
 			}
 			
 			((L2Attackable) npc).stopHating(character); // for calling again

+ 5 - 5
L2J_DataPack_BETA/dist/game/data/scripts/ai/individual/Valakas.java

@@ -36,8 +36,8 @@ import com.l2jserver.gameserver.model.actor.L2Npc;
 import com.l2jserver.gameserver.model.actor.L2Playable;
 import com.l2jserver.gameserver.model.actor.instance.L2GrandBossInstance;
 import com.l2jserver.gameserver.model.actor.instance.L2PcInstance;
-import com.l2jserver.gameserver.model.effects.L2Effect;
 import com.l2jserver.gameserver.model.holders.SkillHolder;
+import com.l2jserver.gameserver.model.skills.BuffInfo;
 import com.l2jserver.gameserver.model.skills.L2Skill;
 import com.l2jserver.gameserver.model.zone.type.L2BossZone;
 import com.l2jserver.gameserver.network.serverpackets.PlaySound;
@@ -244,8 +244,8 @@ public class Valakas extends AbstractNpcAI
 				}
 				
 				// Verify if "Valakas Regeneration" skill is active.
-				final L2Effect e = npc.getFirstEffect(VALAKAS_REGENERATION);
-				final int lvl = e != null ? e.getSkill().getLevel() : 0;
+				final BuffInfo info = npc.getEffectList().getBuffInfoBySkillId(VALAKAS_REGENERATION);
+				final int lvl = info != null ? info.getSkill().getLevel() : 0;
 				
 				// Current HPs are inferior to 25% ; apply lvl 4 of regen skill.
 				if ((npc.getCurrentHp() < (npc.getMaxHp() / 4)) && (lvl != 4))
@@ -409,7 +409,7 @@ public class Valakas extends AbstractNpcAI
 		if (attacker.getMountType() == MountType.STRIDER)
 		{
 			final L2Skill skill = SkillTable.getInstance().getInfo(4258, 1);
-			if (attacker.getFirstEffect(skill) == null)
+			if (!attacker.isAffectedBySkill(4258))
 			{
 				npc.setTarget(attacker);
 				npc.doCast(skill);
@@ -522,7 +522,7 @@ public class Valakas extends AbstractNpcAI
 		final int hpRatio = (int) ((npc.getCurrentHp() / npc.getMaxHp()) * 100);
 		
 		// Valakas Lava Skin has priority.
-		if ((hpRatio < 75) && (getRandom(150) == 0) && (npc.getFirstEffect(VALAKAS_LAVA_SKIN.getSkillId()) == null))
+		if ((hpRatio < 75) && (getRandom(150) == 0) && !npc.isAffectedBySkill(VALAKAS_LAVA_SKIN.getSkillId()))
 		{
 			return VALAKAS_LAVA_SKIN;
 		}

+ 11 - 27
L2J_DataPack_BETA/dist/game/data/scripts/ai/individual/Zaken.java

@@ -36,7 +36,6 @@ import com.l2jserver.gameserver.model.actor.L2Character;
 import com.l2jserver.gameserver.model.actor.L2Npc;
 import com.l2jserver.gameserver.model.actor.instance.L2GrandBossInstance;
 import com.l2jserver.gameserver.model.actor.instance.L2PcInstance;
-import com.l2jserver.gameserver.model.effects.L2Effect;
 import com.l2jserver.gameserver.model.skills.L2Skill;
 import com.l2jserver.gameserver.model.zone.type.L2BossZone;
 import com.l2jserver.gameserver.network.serverpackets.PlaySound;
@@ -256,28 +255,18 @@ public class Zaken extends AbstractNpcAI
 				_1001 = 0;
 				cancelQuestTimer("1001", npc, null);
 			}
-			int sk_4223 = 0;
-			int sk_4227 = 0;
-			for (L2Effect e : npc.getAllEffects())
-			{
-				if (e.getSkill().getId() == 4227)
-				{
-					sk_4227 = 1;
-				}
-				if (e.getSkill().getId() == 4223)
-				{
-					sk_4223 = 1;
-				}
-			}
+			
+			boolean sk_4223 = npc.isAffectedBySkill(4223);
+			boolean sk_4227 = npc.isAffectedBySkill(4227);
 			if (getTimeHour() < 5)
 			{
-				if (sk_4223 == 1) // use night face if zaken have day face
+				if (sk_4223) // use night face if zaken have day face
 				{
 					npc.setTarget(npc);
 					npc.doCast(SkillTable.getInstance().getInfo(4224, 1));
 					_loc.setLocation(npc.getLocation());
 				}
-				if (sk_4227 == 0) // use zaken regeneration
+				if (!sk_4227) // use zaken regeneration
 				{
 					npc.setTarget(npc);
 					npc.doCast(SkillTable.getInstance().getInfo(4227, 1));
@@ -450,17 +439,19 @@ public class Zaken extends AbstractNpcAI
 					_quest1 = 0;
 				}
 			}
-			else if (sk_4223 == 0) // use day face if not night time
+			else if (!sk_4223) // use day face if not night time
 			{
 				npc.setTarget(npc);
 				npc.doCast(SkillTable.getInstance().getInfo(4223, 1));
 				_quest2 = 3;
 			}
-			if (sk_4227 == 1) // when switching to day time, cancel zaken night regen
+			
+			if (sk_4227) // when switching to day time, cancel zaken night regen
 			{
 				npc.setTarget(npc);
 				npc.doCast(SkillTable.getInstance().getInfo(4242, 1));
 			}
+			
 			if (getRandom(40) < 1)
 			{
 				int i2 = getRandom(15);
@@ -776,15 +767,8 @@ public class Zaken extends AbstractNpcAI
 		{
 			if (attacker.getMountType() == MountType.STRIDER)
 			{
-				int sk_4258 = 0;
-				for (L2Effect e : attacker.getAllEffects())
-				{
-					if (e.getSkill().getId() == 4258)
-					{
-						sk_4258 = 1;
-					}
-				}
-				if (sk_4258 == 0)
+				boolean sk_4258 = attacker.isAffectedBySkill(4258);
+				if (!sk_4258)
 				{
 					npc.setTarget(attacker);
 					npc.doCast(SkillTable.getInstance().getInfo(4258, 1));

+ 4 - 4
L2J_DataPack_BETA/dist/game/data/scripts/ai/npc/ForgeOfTheGods/TarBeetle.java

@@ -22,8 +22,8 @@ import ai.npc.AbstractNpcAI;
 
 import com.l2jserver.gameserver.model.actor.L2Npc;
 import com.l2jserver.gameserver.model.actor.instance.L2PcInstance;
-import com.l2jserver.gameserver.model.effects.L2Effect;
 import com.l2jserver.gameserver.model.holders.SkillHolder;
+import com.l2jserver.gameserver.model.skills.BuffInfo;
 import com.l2jserver.gameserver.model.skills.L2Skill;
 
 /**
@@ -52,10 +52,10 @@ public class TarBeetle extends AbstractNpcAI
 		if ((spawn.getBeetle(npc).getScriptValue() > 0) && canCastSkill(npc))
 		{
 			int level = 0;
-			final L2Effect effect = player.getFirstEffect(SKILL_ID);
-			if (effect != null)
+			final BuffInfo info = player.getEffectList().getBuffInfoBySkillId(SKILL_ID);
+			if (info != null)
 			{
-				level = effect.getSkill().getAbnormalLvl();
+				level = info.getSkill().getAbnormalLvl();
 			}
 			if (level < 3)
 			{

+ 4 - 4
L2J_DataPack_BETA/dist/game/data/scripts/ai/npc/NpcBuffers/NpcBufferAI.java

@@ -63,7 +63,7 @@ public class NpcBufferAI implements Runnable
 				{
 					if (Util.checkIfInRange(Config.ALT_PARTY_RANGE, _npc, player, true))
 					{
-						skill.getEffects(player, player);
+						skill.applyEffects(player, null, player, null, false, false);
 					}
 				}
 				else
@@ -72,7 +72,7 @@ public class NpcBufferAI implements Runnable
 					{
 						if (Util.checkIfInRange(Config.ALT_PARTY_RANGE, _npc, member, true))
 						{
-							skill.getEffects(player, member);
+							skill.applyEffects(player, null, member, null, false, false);
 						}
 					}
 				}
@@ -88,7 +88,7 @@ public class NpcBufferAI implements Runnable
 						{
 							if (isFriendly(player, target))
 							{
-								skill.getEffects(target, target);
+								skill.applyEffects(target, null, target, null, false, false);
 							}
 							break;
 						}
@@ -96,7 +96,7 @@ public class NpcBufferAI implements Runnable
 						{
 							if (!isFriendly(player, target))
 							{
-								skill.getEffects(target, target);
+								skill.applyEffects(target, null, target, null, false, false);
 							}
 							break;
 						}

+ 3 - 3
L2J_DataPack_BETA/dist/game/data/scripts/ai/npc/NpcBuffers/impl/CabaleBuffer.java

@@ -27,7 +27,7 @@ import com.l2jserver.gameserver.ThreadPoolManager;
 import com.l2jserver.gameserver.datatables.SkillTable;
 import com.l2jserver.gameserver.model.actor.L2Npc;
 import com.l2jserver.gameserver.model.actor.instance.L2PcInstance;
-import com.l2jserver.gameserver.model.effects.L2Effect;
+import com.l2jserver.gameserver.model.skills.BuffInfo;
 import com.l2jserver.gameserver.model.skills.L2Skill;
 import com.l2jserver.gameserver.network.NpcStringId;
 import com.l2jserver.gameserver.network.clientpackets.Say2;
@@ -292,8 +292,8 @@ public class CabaleBuffer extends AbstractNpcAI
 	
 	public int getAbnormalLvl(L2PcInstance player, int skillId)
 	{
-		final L2Effect effect = player.getFirstEffect(skillId);
-		return (effect != null) ? effect.getSkill().getAbnormalLvl() : 0;
+		final BuffInfo info = player.getEffectList().getBuffInfoBySkillId(skillId);
+		return (info != null) ? info.getSkill().getAbnormalLvl() : 0;
 	}
 	
 	public static void main(String[] args)

+ 1 - 1
L2J_DataPack_BETA/dist/game/data/scripts/conquerablehalls/RainbowSpringsChateau/RainbowSpringsChateau.java

@@ -792,7 +792,7 @@ public class RainbowSpringsChateau extends Quest
 				{
 					for (L2Skill sk : DEBUFFS)
 					{
-						sk.getEffects(chr, chr);
+						sk.applyEffects(chr, null, chr, null, false, false);
 					}
 				}
 			}

+ 2 - 2
L2J_DataPack_BETA/dist/game/data/scripts/custom/IOPRace/IOPRace.java

@@ -98,10 +98,10 @@ public class IOPRace extends Quest
 			L2Skill skill = SkillTable.getInstance().getInfo(5239, 5);
 			if (skill != null)
 			{
-				skill.getEffects(npc, player);
+				skill.applyEffects(npc, null, player, null, false, false);
 				if (player.hasSummon())
 				{
-					skill.getEffects(npc, player.getSummon());
+					skill.applyEffects(npc, null, player.getSummon(), null, false, false);
 				}
 			}
 			

+ 6 - 40
L2J_DataPack_BETA/dist/game/data/scripts/handlers/EffectMasterHandler.java

@@ -18,24 +18,22 @@
  */
 package handlers;
 
-import java.lang.reflect.Method;
 import java.util.logging.Level;
 import java.util.logging.Logger;
 
 import com.l2jserver.gameserver.handler.EffectHandler;
+import com.l2jserver.gameserver.model.effects.AbstractEffect;
 
 import handlers.effecthandlers.*;
 
 /**
  * Effect Master handler.
- * @author BiggBoss
+ * @author BiggBoss, Zoey76
  */
 public final class EffectMasterHandler
 {
 	private static final Logger _log = Logger.getLogger(EffectMasterHandler.class.getName());
 	
-	private static final Class<?> LOAD_INSTANCES = EffectHandler.class;
-	
 	private static final Class<?>[] EFFECTS =
 	{
 		AddHate.class,
@@ -175,58 +173,26 @@ public final class EffectMasterHandler
 		VitalityPointUp.class,
 	};
 	
+	@SuppressWarnings("unchecked")
 	public static void main(String[] args)
 	{
-		Object loadInstance = null;
-		Method method = null;
-		
-		try
-		{
-			method = LOAD_INSTANCES.getMethod("getInstance");
-			loadInstance = method.invoke(LOAD_INSTANCES);
-		}
-		catch (Exception e)
-		{
-			_log.log(Level.WARNING, "Failed invoking getInstance method for handler: " + LOAD_INSTANCES.getSimpleName(), e);
-			return;
-		}
-		
-		method = null; // Releasing variable for next method
-		
 		for (Class<?> c : EFFECTS)
 		{
 			if (c == null)
 			{
 				continue; // Disabled handler
 			}
-			
-			try
-			{
-				if (method == null)
-				{
-					method = loadInstance.getClass().getMethod("registerHandler", Class.class);
-				}
-				
-				method.invoke(loadInstance, c);
-				
-			}
-			catch (Exception e)
-			{
-				_log.log(Level.WARNING, "Failed loading effect handler: " + c.getSimpleName(), e);
-				continue;
-			}
+			EffectHandler.getInstance().registerHandler((Class<? extends AbstractEffect>) c);
 		}
 		
 		// And lets try get size
 		try
 		{
-			method = loadInstance.getClass().getMethod("size");
-			Object returnVal = method.invoke(loadInstance);
-			_log.log(Level.INFO, loadInstance.getClass().getSimpleName() + ": Loaded " + returnVal + " Handlers");
+			_log.log(Level.INFO, EffectMasterHandler.class.getSimpleName() + ": Loaded " + EffectHandler.getInstance().size() + " effect handlers.");
 		}
 		catch (Exception e)
 		{
-			_log.log(Level.WARNING, "Failed invoking size method for handler: " + loadInstance.getClass().getSimpleName(), e);
+			_log.log(Level.WARNING, "Failed invoking size method for handler: " + EffectMasterHandler.class.getSimpleName(), e);
 		}
 	}
 }

+ 69 - 44
L2J_DataPack_BETA/dist/game/data/scripts/handlers/admincommandhandlers/AdminBuffs.java

@@ -18,6 +18,7 @@
  */
 package handlers.admincommandhandlers;
 
+import java.util.ArrayList;
 import java.util.Collection;
 import java.util.List;
 import java.util.StringTokenizer;
@@ -28,7 +29,9 @@ import com.l2jserver.gameserver.handler.IAdminCommandHandler;
 import com.l2jserver.gameserver.model.L2World;
 import com.l2jserver.gameserver.model.actor.L2Character;
 import com.l2jserver.gameserver.model.actor.instance.L2PcInstance;
-import com.l2jserver.gameserver.model.effects.L2Effect;
+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.network.SystemMessageId;
 import com.l2jserver.gameserver.network.serverpackets.NpcHtmlMessage;
@@ -43,35 +46,28 @@ public class AdminBuffs implements IAdminCommandHandler
 	private static final String[] ADMIN_COMMANDS =
 	{
 		"admin_getbuffs",
+		"admin_getbuffs_ps",
 		"admin_stopbuff",
 		"admin_stopallbuffs",
 		"admin_areacancel",
 		"admin_removereuse",
 		"admin_switch_gm_buffs"
 	};
+	// Misc
+	private static final String FONT_RED1 = "<font color=\"FF0000\">";
+	private static final String FONT_RED2 = "</font>";
 	
 	@Override
 	public boolean useAdminCommand(String command, L2PcInstance activeChar)
 	{
-		
 		if (command.startsWith("admin_getbuffs"))
 		{
-			StringTokenizer st = new StringTokenizer(command, " ");
+			final StringTokenizer st = new StringTokenizer(command, " ");
 			command = st.nextToken();
-			
 			if (st.hasMoreTokens())
 			{
-				L2PcInstance player = null;
-				String playername = st.nextToken();
-				
-				try
-				{
-					player = L2World.getInstance().getPlayer(playername);
-				}
-				catch (Exception e)
-				{
-				}
-				
+				final String playername = st.nextToken();
+				L2PcInstance player = L2World.getInstance().getPlayer(playername);
 				if (player != null)
 				{
 					int page = 1;
@@ -79,15 +75,15 @@ public class AdminBuffs implements IAdminCommandHandler
 					{
 						page = Integer.parseInt(st.nextToken());
 					}
-					showBuffs(activeChar, player, page);
+					showBuffs(activeChar, player, page, command.endsWith("_ps"));
 					return true;
 				}
 				activeChar.sendMessage("The player " + playername + " is not online.");
 				return false;
 			}
-			else if ((activeChar.getTarget() != null) && (activeChar.getTarget() instanceof L2Character))
+			else if ((activeChar.getTarget() != null) && activeChar.getTarget().isCharacter())
 			{
-				showBuffs(activeChar, (L2Character) activeChar.getTarget(), 1);
+				showBuffs(activeChar, (L2Character) activeChar.getTarget(), 1, command.endsWith("_ps"));
 				return true;
 			}
 			else
@@ -219,10 +215,7 @@ public class AdminBuffs implements IAdminCommandHandler
 			activeChar.sendMessage("There is nothing to switch.");
 			return false;
 		}
-		else
-		{
-			return true;
-		}
+		return true;
 	}
 	
 	/**
@@ -245,9 +238,18 @@ public class AdminBuffs implements IAdminCommandHandler
 		return ADMIN_COMMANDS;
 	}
 	
-	public static void showBuffs(L2PcInstance activeChar, L2Character target, int page)
+	public static void showBuffs(L2PcInstance activeChar, L2Character target, int page, boolean passive)
 	{
-		final List<L2Effect> effects = target.getAllEffects();
+		final List<BuffInfo> effects = new ArrayList<>();
+		if (!passive)
+		{
+			effects.addAll(target.getEffectList().getEffects());
+		}
+		else
+		{
+			effects.addAll(target.getEffectList().getPassives().values());
+		}
+		
 		if ((page > ((effects.size() / PAGE_LIMIT) + 1)) || (page < 1))
 		{
 			return;
@@ -259,17 +261,21 @@ public class AdminBuffs implements IAdminCommandHandler
 			max++;
 		}
 		
-		final StringBuilder html = StringUtil.startAppend(500 + (effects.size() * 200), "<html><table width=\"100%\"><tr><td width=45><button value=\"Main\" action=\"bypass -h admin_admin\" width=45 height=21 back=\"L2UI_ct1.button_df\" fore=\"L2UI_ct1.button_df\"></td><td width=180><center><font color=\"LEVEL\">Effects of ", target.getName(), "</font></td><td width=45><button value=\"Back\" action=\"bypass -h admin_current_player\" width=45 height=21 back=\"L2UI_ct1.button_df\" fore=\"L2UI_ct1.button_df\"></td></tr></table><br><table width=\"100%\"><tr><td width=200>Skill</td><td width=30>Rem. Time</td><td width=70>Action</td><td>In use</td></tr>");
+		final StringBuilder html = StringUtil.startAppend(500 + (effects.size() * 200), "<html><table width=\"100%\"><tr><td width=45><button value=\"Main\" action=\"bypass -h admin_admin\" width=45 height=21 back=\"L2UI_ct1.button_df\" fore=\"L2UI_ct1.button_df\"></td><td width=180><center><font color=\"LEVEL\">Effects of ", target.getName(), "</font></td><td width=45><button value=\"Back\" action=\"bypass -h admin_current_player\" width=45 height=21 back=\"L2UI_ct1.button_df\" fore=\"L2UI_ct1.button_df\"></td></tr></table><br><table width=\"100%\"><tr><td width=200>Skill</td><td width=30>Rem. Time</td><td width=70>Action</td></tr>");
 		int start = ((page - 1) * PAGE_LIMIT);
 		int end = Math.min(((page - 1) * PAGE_LIMIT) + PAGE_LIMIT, effects.size());
-		for (int i = start; i < end; i++)
+		int count = 0;
+		for (BuffInfo info : effects)
 		{
-			L2Effect e = effects.get(i);
-			if (e != null)
+			if ((count >= start) && (count < end))
 			{
-				final L2Skill skill = e.getSkill();
-				StringUtil.append(html, "<tr><td>", skill.getName(), "(", e.getClass().getSimpleName(), ")", "</td><td>", skill.isToggle() ? "T (" + e.getTickCount() + ")" : skill.isPassive() ? "P" : e.getTimeLeft() + "s", "</td><td><button value=\"X\" action=\"bypass -h admin_stopbuff ", Integer.toString(target.getObjectId()), " ", String.valueOf(skill.getId()), "\" width=30 height=21 back=\"L2UI_ct1.button_df\" fore=\"L2UI_ct1.button_df\"></td><td>" + e.isInUse() + "</td></tr>");
+				final L2Skill skill = info.getSkill();
+				for (AbstractEffect effect : info.getEffects())
+				{
+					StringUtil.append(html, "<tr><td>", (!info.isInUse() ? FONT_RED1 : "") + skill.getName(), " Lv ", String.valueOf(skill.getLevel()), " (", effect.getClass().getSimpleName(), ")" + (!info.isInUse() ? FONT_RED2 : ""), "</td><td>", skill.isToggle() ? "T (" + info.getTickCount(effect) + ")" : skill.isPassive() ? "P" : info.getTime() + "s", "</td><td><button value=\"X\" action=\"bypass -h admin_stopbuff ", Integer.toString(target.getObjectId()), " ", String.valueOf(skill.getId()), "\" width=30 height=21 back=\"L2UI_ct1.button_df\" fore=\"L2UI_ct1.button_df\"></td></tr>");
+				}
 			}
+			count++;
 		}
 		
 		html.append("</table><table width=300 bgcolor=444444><tr>");
@@ -284,7 +290,7 @@ public class AdminBuffs implements IAdminCommandHandler
 			}
 			else
 			{
-				html.append("<td><a action=\"bypass -h admin_getbuffs ");
+				html.append("<td><a action=\"bypass -h admin_getbuffs" + (passive ? "_ps " : " "));
 				html.append(target.getName());
 				html.append(" ");
 				html.append(x + 1);
@@ -296,11 +302,32 @@ public class AdminBuffs implements IAdminCommandHandler
 		
 		html.append("</tr></table>");
 		
-		StringUtil.append(html, "<br><center><button value=\"Remove All\" action=\"bypass -h admin_stopallbuffs ", Integer.toString(target.getObjectId()), "\" width=80 height=21 back=\"L2UI_ct1.button_df\" fore=\"L2UI_ct1.button_df\"></html>");
-		
-		final NpcHtmlMessage ms = new NpcHtmlMessage();
-		ms.setHtml(html.toString());
-		activeChar.sendPacket(ms);
+		// Buttons
+		StringUtil.append(html, "<br><center><button value=\"Refresh\" action=\"bypass -h admin_getbuffs", (passive ? "_ps " : " "), target.getName(), "\" width=80 height=21 back=\"L2UI_ct1.button_df\" fore=\"L2UI_ct1.button_df\">");
+		StringUtil.append(html, "<button value=\"Remove All\" action=\"bypass -h admin_stopallbuffs ", Integer.toString(target.getObjectId()), "\" width=80 height=21 back=\"L2UI_ct1.button_df\" fore=\"L2UI_ct1.button_df\"><br>");
+		// Legend
+		if (!passive)
+		{
+			StringUtil.append(html, FONT_RED1, "Inactive buffs: ", String.valueOf(target.getEffectList().getHiddenBuffsCount()), FONT_RED2, "<br>");
+		}
+		StringUtil.append(html, "Total", passive ? " passive" : "", " buff count: ", String.valueOf(effects.size()));
+		if ((target.getEffectList().getAllBlockedBuffSlots() != null) && !target.getEffectList().getAllBlockedBuffSlots().isEmpty())
+		{
+			StringUtil.append(html, "<br>Blocked buff slots: ");
+			String slots = "";
+			for (AbnormalType slot : target.getEffectList().getAllBlockedBuffSlots())
+			{
+				slots += slot.toString() + ", ";
+			}
+			
+			if (!slots.isEmpty() && (slots.length() > 3))
+			{
+				StringUtil.append(html, slots.substring(0, slots.length() - 2));
+			}
+		}
+		StringUtil.append(html, "</html>");
+		// Send the packet
+		activeChar.sendPacket(new NpcHtmlMessage(html.toString()));
 		
 		if (Config.GMAUDIT)
 		{
@@ -321,15 +348,13 @@ public class AdminBuffs implements IAdminCommandHandler
 		
 		if ((target != null) && (skillId > 0))
 		{
-			for (L2Effect e : target.getAllEffects())
+			if (target.isAffectedBySkill(skillId))
 			{
-				if ((e != null) && (e.getSkill().getId() == skillId))
-				{
-					e.exit();
-					activeChar.sendMessage("Removed " + e.getSkill().getName() + " level " + e.getSkill().getLevel() + " from " + target.getName() + " (" + objId + ")");
-				}
+				target.stopSkillEffects(true, skillId);
+				activeChar.sendMessage("Removed skill ID: " + skillId + " effects from " + target.getName() + " (" + objId + ").");
 			}
-			showBuffs(activeChar, target, 1);
+			
+			showBuffs(activeChar, target, 1, false);
 			if (Config.GMAUDIT)
 			{
 				GMAudit.auditGMAction(activeChar.getName() + " [" + activeChar.getObjectId() + "]", "stopbuff", target.getName() + " (" + objId + ")", Integer.toString(skillId));
@@ -352,7 +377,7 @@ public class AdminBuffs implements IAdminCommandHandler
 		{
 			target.stopAllEffects();
 			activeChar.sendMessage("Removed all effects from " + target.getName() + " (" + objId + ")");
-			showBuffs(activeChar, target, 1);
+			showBuffs(activeChar, target, 1, false);
 			if (Config.GMAUDIT)
 			{
 				GMAudit.auditGMAction(activeChar.getName() + " [" + activeChar.getObjectId() + "]", "stopallbuffs", target.getName() + " (" + objId + ")", "");

+ 10 - 10
L2J_DataPack_BETA/dist/game/data/scripts/handlers/admincommandhandlers/AdminEffects.java

@@ -31,7 +31,7 @@ import com.l2jserver.gameserver.model.actor.L2Character;
 import com.l2jserver.gameserver.model.actor.L2Npc;
 import com.l2jserver.gameserver.model.actor.instance.L2ChestInstance;
 import com.l2jserver.gameserver.model.actor.instance.L2PcInstance;
-import com.l2jserver.gameserver.model.effects.AbnormalEffect;
+import com.l2jserver.gameserver.model.skills.AbnormalVisualEffect;
 import com.l2jserver.gameserver.model.skills.L2Skill;
 import com.l2jserver.gameserver.network.SystemMessageId;
 import com.l2jserver.gameserver.network.serverpackets.CharInfo;
@@ -204,7 +204,7 @@ public class AdminEffects implements IAdminCommandHandler
 				{
 					if (!player.isGM())
 					{
-						player.startAbnormalEffect(AbnormalEffect.HOLD_1);
+						player.startAbnormalEffect(AbnormalVisualEffect.HOLD_1);
 						player.setIsParalyzed(true);
 						player.startParalyze();
 					}
@@ -221,7 +221,7 @@ public class AdminEffects implements IAdminCommandHandler
 				Collection<L2PcInstance> plrs = activeChar.getKnownList().getKnownPlayers().values();
 				for (L2PcInstance player : plrs)
 				{
-					player.stopAbnormalEffect(AbnormalEffect.HOLD_1);
+					player.stopAbnormalEffect(AbnormalVisualEffect.HOLD_1);
 					player.setIsParalyzed(false);
 				}
 			}
@@ -248,11 +248,11 @@ public class AdminEffects implements IAdminCommandHandler
 					player = (L2Character) target;
 					if (type.equals("1"))
 					{
-						player.startAbnormalEffect(AbnormalEffect.HOLD_1);
+						player.startAbnormalEffect(AbnormalVisualEffect.HOLD_1);
 					}
 					else
 					{
-						player.startAbnormalEffect(AbnormalEffect.HOLD_2);
+						player.startAbnormalEffect(AbnormalVisualEffect.HOLD_2);
 					}
 					player.setIsParalyzed(true);
 					player.startParalyze();
@@ -281,11 +281,11 @@ public class AdminEffects implements IAdminCommandHandler
 					player = (L2Character) target;
 					if (type.equals("1"))
 					{
-						player.stopAbnormalEffect(AbnormalEffect.HOLD_1);
+						player.stopAbnormalEffect(AbnormalVisualEffect.HOLD_1);
 					}
 					else
 					{
-						player.stopAbnormalEffect(AbnormalEffect.HOLD_2);
+						player.stopAbnormalEffect(AbnormalVisualEffect.HOLD_2);
 					}
 					player.setIsParalyzed(false);
 				}
@@ -303,7 +303,7 @@ public class AdminEffects implements IAdminCommandHandler
 				if (target instanceof L2Character)
 				{
 					player = (L2Character) target;
-					player.startAbnormalEffect(AbnormalEffect.BIG_HEAD);
+					player.startAbnormalEffect(AbnormalVisualEffect.BIG_HEAD);
 				}
 			}
 			catch (Exception e)
@@ -319,7 +319,7 @@ public class AdminEffects implements IAdminCommandHandler
 				if (target instanceof L2Character)
 				{
 					player = (L2Character) target;
-					player.stopAbnormalEffect(AbnormalEffect.BIG_HEAD);
+					player.stopAbnormalEffect(AbnormalVisualEffect.BIG_HEAD);
 				}
 			}
 			catch (Exception e)
@@ -331,7 +331,7 @@ public class AdminEffects implements IAdminCommandHandler
 			try
 			{
 				int val = Integer.parseInt(st.nextToken());
-				boolean sendMessage = activeChar.getFirstEffect(7029) != null;
+				boolean sendMessage = activeChar.isAffectedBySkill(7029);
 				activeChar.stopSkillEffects((val == 0) && sendMessage, 7029);
 				if ((val >= 1) && (val <= 4))
 				{

+ 2 - 2
L2J_DataPack_BETA/dist/game/data/scripts/handlers/bypasshandlers/OlympiadManagerLink.java

@@ -260,12 +260,12 @@ public class OlympiadManagerLink implements IBypassHandler
 					{
 						activeChar.olyBuff--;
 						target.broadcastPacket(new MagicSkillUse(target, activeChar, skill.getId(), skill.getLevel(), 0, 0));
-						skill.getEffects(activeChar, activeChar);
+						skill.applyEffects(activeChar, null, activeChar, null, false, false);
 						L2Summon summon = activeChar.getSummon();
 						if (summon != null)
 						{
 							target.broadcastPacket(new MagicSkillUse(target, summon, skill.getId(), skill.getLevel(), 0, 0));
-							skill.getEffects(summon, summon);
+							skill.applyEffects(summon, null, summon, null, false, false);
 						}
 					}
 				}

+ 14 - 19
L2J_DataPack_BETA/dist/game/data/scripts/handlers/effecthandlers/AddHate.java

@@ -18,27 +18,21 @@
  */
 package handlers.effecthandlers;
 
+import com.l2jserver.gameserver.model.StatsSet;
 import com.l2jserver.gameserver.model.actor.L2Attackable;
-import com.l2jserver.gameserver.model.effects.EffectTemplate;
-import com.l2jserver.gameserver.model.effects.L2Effect;
-import com.l2jserver.gameserver.model.effects.L2EffectType;
-import com.l2jserver.gameserver.model.stats.Env;
+import com.l2jserver.gameserver.model.conditions.Condition;
+import com.l2jserver.gameserver.model.effects.AbstractEffect;
+import com.l2jserver.gameserver.model.skills.BuffInfo;
 
 /**
  * Add Hate effect implementation.
  * @author Adry_85
  */
-public class AddHate extends L2Effect
+public final class AddHate extends AbstractEffect
 {
-	public AddHate(Env env, EffectTemplate template)
+	public AddHate(Condition attachCond, Condition applyCond, StatsSet set, StatsSet params)
 	{
-		super(env, template);
-	}
-	
-	@Override
-	public L2EffectType getEffectType()
-	{
-		return L2EffectType.NONE;
+		super(attachCond, applyCond, set, params);
 	}
 	
 	@Override
@@ -48,20 +42,21 @@ public class AddHate extends L2Effect
 	}
 	
 	@Override
-	public boolean onStart()
+	public boolean onStart(BuffInfo info)
 	{
-		if (!getEffected().isL2Attackable())
+		if (!info.getEffected().isL2Attackable())
 		{
 			return false;
 		}
 		
-		if (calc() > 0)
+		final double val = getValue();
+		if (val > 0)
 		{
-			((L2Attackable) getEffected()).addDamageHate(getEffector(), 0, (int) calc());
+			((L2Attackable) info.getEffected()).addDamageHate(info.getEffector(), 0, (int) val);
 		}
-		else if (calc() < 0)
+		else if (val < 0)
 		{
-			((L2Attackable) getEffected()).reduceHate(getEffector(), (int) -calc());
+			((L2Attackable) info.getEffected()).reduceHate(info.getEffector(), (int) -val);
 		}
 		return true;
 	}

+ 19 - 31
L2J_DataPack_BETA/dist/game/data/scripts/handlers/effecthandlers/AttackTrait.java

@@ -21,35 +21,29 @@ package handlers.effecthandlers;
 import java.util.HashMap;
 import java.util.Map;
 import java.util.Map.Entry;
-import java.util.logging.Logger;
 
+import com.l2jserver.gameserver.model.StatsSet;
 import com.l2jserver.gameserver.model.actor.stat.CharStat;
-import com.l2jserver.gameserver.model.effects.EffectTemplate;
-import com.l2jserver.gameserver.model.effects.L2Effect;
-import com.l2jserver.gameserver.model.effects.L2EffectType;
-import com.l2jserver.gameserver.model.stats.Env;
+import com.l2jserver.gameserver.model.conditions.Condition;
+import com.l2jserver.gameserver.model.effects.AbstractEffect;
+import com.l2jserver.gameserver.model.skills.BuffInfo;
 import com.l2jserver.gameserver.model.stats.TraitType;
 
 /**
  * Attack Trait effect implementation
  * @author Nos
  */
-public class AttackTrait extends L2Effect
+public final class AttackTrait extends AbstractEffect
 {
-	private static final Logger _log = Logger.getLogger(AttackTrait.class.getName());
-	
 	private final Map<TraitType, Float> _attackTraits = new HashMap<>();
 	
-	/**
-	 * @param env
-	 * @param template
-	 */
-	public AttackTrait(Env env, EffectTemplate template)
+	public AttackTrait(Condition attachCond, Condition applyCond, StatsSet set, StatsSet params)
 	{
-		super(env, template);
-		if (template.hasParameters())
+		super(attachCond, applyCond, set, params);
+		
+		if (hasParameters())
 		{
-			for (Entry<String, Object> param : template.getParameters().getSet().entrySet())
+			for (Entry<String, Object> param : getParameters().getSet().entrySet())
 			{
 				try
 				{
@@ -74,37 +68,31 @@ public class AttackTrait extends L2Effect
 	}
 	
 	@Override
-	public L2EffectType getEffectType()
-	{
-		return L2EffectType.NONE;
-	}
-	
-	@Override
-	public boolean onStart()
+	public void onExit(BuffInfo info)
 	{
-		final CharStat charStat = getEffected().getStat();
+		final CharStat charStat = info.getEffected().getStat();
 		synchronized (charStat.getAttackTraits())
 		{
 			for (Entry<TraitType, Float> trait : _attackTraits.entrySet())
 			{
-				charStat.getAttackTraits()[trait.getKey().getId()] *= trait.getValue();
-				charStat.getAttackTraitsCount()[trait.getKey().getId()]++;
+				charStat.getAttackTraits()[trait.getKey().getId()] /= trait.getValue();
+				charStat.getAttackTraitsCount()[trait.getKey().getId()]--;
 			}
 		}
-		return true;
 	}
 	
 	@Override
-	public void onExit()
+	public boolean onStart(BuffInfo info)
 	{
-		final CharStat charStat = getEffected().getStat();
+		final CharStat charStat = info.getEffected().getStat();
 		synchronized (charStat.getAttackTraits())
 		{
 			for (Entry<TraitType, Float> trait : _attackTraits.entrySet())
 			{
-				charStat.getAttackTraits()[trait.getKey().getId()] /= trait.getValue();
-				charStat.getAttackTraitsCount()[trait.getKey().getId()]--;
+				charStat.getAttackTraits()[trait.getKey().getId()] *= trait.getValue();
+				charStat.getAttackTraitsCount()[trait.getKey().getId()]++;
 			}
 		}
+		return true;
 	}
 }

+ 19 - 18
L2J_DataPack_BETA/dist/game/data/scripts/handlers/effecthandlers/Backstab.java

@@ -19,30 +19,31 @@
 package handlers.effecthandlers;
 
 import com.l2jserver.gameserver.enums.ShotType;
+import com.l2jserver.gameserver.model.StatsSet;
 import com.l2jserver.gameserver.model.actor.L2Character;
 import com.l2jserver.gameserver.model.actor.instance.L2PcInstance;
-import com.l2jserver.gameserver.model.effects.EffectTemplate;
-import com.l2jserver.gameserver.model.effects.L2Effect;
+import com.l2jserver.gameserver.model.conditions.Condition;
+import com.l2jserver.gameserver.model.effects.AbstractEffect;
 import com.l2jserver.gameserver.model.effects.L2EffectType;
+import com.l2jserver.gameserver.model.skills.BuffInfo;
 import com.l2jserver.gameserver.model.stats.BaseStats;
-import com.l2jserver.gameserver.model.stats.Env;
 import com.l2jserver.gameserver.model.stats.Formulas;
 
 /**
  * Backstab effect implementation.
  * @author Adry_85
  */
-public class Backstab extends L2Effect
+public final class Backstab extends AbstractEffect
 {
-	public Backstab(Env env, EffectTemplate template)
+	public Backstab(Condition attachCond, Condition applyCond, StatsSet set, StatsSet params)
 	{
-		super(env, template);
+		super(attachCond, applyCond, set, params);
 	}
 	
 	@Override
-	public boolean calcSuccess()
+	public boolean calcSuccess(BuffInfo info)
 	{
-		return getEffector().isBehindTarget() && !Formulas.calcPhysicalSkillEvasion(getEffector(), getEffected(), getSkill()) && Formulas.calcBlowSuccess(getEffector(), getEffected(), getSkill());
+		return info.getEffector().isBehindTarget() && !Formulas.calcPhysicalSkillEvasion(info.getEffector(), info.getEffected(), info.getSkill()) && Formulas.calcBlowSuccess(info.getEffector(), info.getEffected(), info.getSkill());
 	}
 	
 	@Override
@@ -58,28 +59,28 @@ public class Backstab extends L2Effect
 	}
 	
 	@Override
-	public boolean onStart()
+	public boolean onStart(BuffInfo info)
 	{
-		L2Character target = getEffected();
-		L2Character activeChar = getEffector();
+		L2Character target = info.getEffected();
+		L2Character activeChar = info.getEffector();
 		
 		if (activeChar.isAlikeDead())
 		{
 			return false;
 		}
 		
-		boolean ss = getSkill().useSoulShot() && activeChar.isChargedShot(ShotType.SOULSHOTS);
-		byte shld = Formulas.calcShldUse(activeChar, target, getSkill());
-		double damage = (int) Formulas.calcBackstabDamage(activeChar, target, getSkill(), shld, ss);
+		boolean ss = info.getSkill().useSoulShot() && activeChar.isChargedShot(ShotType.SOULSHOTS);
+		byte shld = Formulas.calcShldUse(activeChar, target, info.getSkill());
+		double damage = (int) Formulas.calcBackstabDamage(activeChar, target, info.getSkill(), shld, ss);
 		
 		// Crit rate base crit rate for skill, modified with STR bonus
-		if (Formulas.calcCrit(getSkill().getBaseCritRate() * 10 * BaseStats.STR.calcBonus(activeChar), true, target))
+		if (Formulas.calcCrit(info.getSkill().getBaseCritRate() * 10 * BaseStats.STR.calcBonus(activeChar), true, target))
 		{
 			damage *= 2;
 		}
 		
-		target.reduceCurrentHp(damage, activeChar, getSkill());
-		target.notifyDamageReceived(damage, getEffector(), getSkill(), true);
+		target.reduceCurrentHp(damage, activeChar, info.getSkill());
+		target.notifyDamageReceived(damage, activeChar, info.getSkill(), true);
 		
 		// Manage attack or cast break of the target (calculating rate, sending message...)
 		if (!target.isRaid() && Formulas.calcAtkBreak(target, damage))
@@ -95,7 +96,7 @@ public class Backstab extends L2Effect
 		}
 		
 		// Check if damage should be reflected
-		Formulas.calcDamageReflected(activeChar, target, getSkill(), true);
+		Formulas.calcDamageReflected(activeChar, target, info.getSkill(), true);
 		
 		return true;
 	}

+ 13 - 12
L2J_DataPack_BETA/dist/game/data/scripts/handlers/effecthandlers/Betray.java

@@ -19,22 +19,23 @@
 package handlers.effecthandlers;
 
 import com.l2jserver.gameserver.ai.CtrlIntention;
+import com.l2jserver.gameserver.model.StatsSet;
 import com.l2jserver.gameserver.model.actor.instance.L2PcInstance;
+import com.l2jserver.gameserver.model.conditions.Condition;
+import com.l2jserver.gameserver.model.effects.AbstractEffect;
 import com.l2jserver.gameserver.model.effects.EffectFlag;
-import com.l2jserver.gameserver.model.effects.EffectTemplate;
-import com.l2jserver.gameserver.model.effects.L2Effect;
 import com.l2jserver.gameserver.model.effects.L2EffectType;
-import com.l2jserver.gameserver.model.stats.Env;
+import com.l2jserver.gameserver.model.skills.BuffInfo;
 
 /**
  * Betray effect implementation.
  * @author decad
  */
-public class Betray extends L2Effect
+public final class Betray extends AbstractEffect
 {
-	public Betray(Env env, EffectTemplate template)
+	public Betray(Condition attachCond, Condition applyCond, StatsSet set, StatsSet params)
 	{
-		super(env, template);
+		super(attachCond, applyCond, set, params);
 	}
 	
 	@Override
@@ -50,18 +51,18 @@ public class Betray extends L2Effect
 	}
 	
 	@Override
-	public void onExit()
+	public void onExit(BuffInfo info)
 	{
-		getEffected().getAI().setIntention(CtrlIntention.AI_INTENTION_IDLE);
+		info.getEffected().getAI().setIntention(CtrlIntention.AI_INTENTION_IDLE);
 	}
 	
 	@Override
-	public boolean onStart()
+	public boolean onStart(BuffInfo info)
 	{
-		if (getEffector().isPlayer() && getEffected().isSummon())
+		if (info.getEffector().isPlayer() && info.getEffected().isSummon())
 		{
-			L2PcInstance targetOwner = getEffected().getActingPlayer();
-			getEffected().getAI().setIntention(CtrlIntention.AI_INTENTION_ATTACK, targetOwner);
+			L2PcInstance targetOwner = info.getEffected().getActingPlayer();
+			info.getEffected().getAI().setIntention(CtrlIntention.AI_INTENTION_ATTACK, targetOwner);
 			return true;
 		}
 		return false;

+ 12 - 11
L2J_DataPack_BETA/dist/game/data/scripts/handlers/effecthandlers/BigHead.java

@@ -18,21 +18,22 @@
  */
 package handlers.effecthandlers;
 
-import com.l2jserver.gameserver.model.effects.AbnormalEffect;
-import com.l2jserver.gameserver.model.effects.EffectTemplate;
-import com.l2jserver.gameserver.model.effects.L2Effect;
+import com.l2jserver.gameserver.model.StatsSet;
+import com.l2jserver.gameserver.model.conditions.Condition;
+import com.l2jserver.gameserver.model.effects.AbstractEffect;
 import com.l2jserver.gameserver.model.effects.L2EffectType;
-import com.l2jserver.gameserver.model.stats.Env;
+import com.l2jserver.gameserver.model.skills.AbnormalVisualEffect;
+import com.l2jserver.gameserver.model.skills.BuffInfo;
 
 /**
  * Big Head effect implementation.
  * @author LBaldi
  */
-public class BigHead extends L2Effect
+public final class BigHead extends AbstractEffect
 {
-	public BigHead(Env env, EffectTemplate template)
+	public BigHead(Condition attachCond, Condition applyCond, StatsSet set, StatsSet params)
 	{
-		super(env, template);
+		super(attachCond, applyCond, set, params);
 	}
 	
 	@Override
@@ -42,15 +43,15 @@ public class BigHead extends L2Effect
 	}
 	
 	@Override
-	public void onExit()
+	public void onExit(BuffInfo info)
 	{
-		getEffected().stopAbnormalEffect(AbnormalEffect.BIG_HEAD);
+		info.getEffected().stopAbnormalEffect(AbnormalVisualEffect.BIG_HEAD);
 	}
 	
 	@Override
-	public boolean onStart()
+	public boolean onStart(BuffInfo info)
 	{
-		getEffected().startAbnormalEffect(AbnormalEffect.BIG_HEAD);
+		info.getEffected().startAbnormalEffect(AbnormalVisualEffect.BIG_HEAD);
 		return true;
 	}
 }

+ 25 - 34
L2J_DataPack_BETA/dist/game/data/scripts/handlers/effecthandlers/Blink.java

@@ -22,11 +22,11 @@ import com.l2jserver.Config;
 import com.l2jserver.gameserver.GeoData;
 import com.l2jserver.gameserver.ai.CtrlIntention;
 import com.l2jserver.gameserver.model.Location;
+import com.l2jserver.gameserver.model.StatsSet;
 import com.l2jserver.gameserver.model.actor.L2Character;
-import com.l2jserver.gameserver.model.effects.EffectTemplate;
-import com.l2jserver.gameserver.model.effects.L2Effect;
-import com.l2jserver.gameserver.model.effects.L2EffectType;
-import com.l2jserver.gameserver.model.stats.Env;
+import com.l2jserver.gameserver.model.conditions.Condition;
+import com.l2jserver.gameserver.model.effects.AbstractEffect;
+import com.l2jserver.gameserver.model.skills.BuffInfo;
 import com.l2jserver.gameserver.network.serverpackets.FlyToLocation;
 import com.l2jserver.gameserver.network.serverpackets.FlyToLocation.FlyType;
 import com.l2jserver.gameserver.network.serverpackets.ValidateLocation;
@@ -45,20 +45,11 @@ import com.l2jserver.gameserver.util.Util;
  * <br>
  * @author House
  */
-public class Blink extends L2Effect
+public final class Blink extends AbstractEffect
 {
-	private L2Character _actor;
-	private int x, y, z;
-	
-	public Blink(Env env, EffectTemplate template)
-	{
-		super(env, template);
-	}
-	
-	@Override
-	public L2EffectType getEffectType()
+	public Blink(Condition attachCond, Condition applyCond, StatsSet set, StatsSet params)
 	{
-		return L2EffectType.NONE;
+		super(attachCond, applyCond, set, params);
 	}
 	
 	@Override
@@ -68,35 +59,35 @@ public class Blink extends L2Effect
 	}
 	
 	@Override
-	public boolean onStart()
+	public boolean onStart(BuffInfo info)
 	{
-		_actor = isSelfEffect() ? getEffector() : getEffected();
-		int _radius = getSkill().getFlyRadius();
-		double angle = Util.convertHeadingToDegree(_actor.getHeading());
-		double radian = Math.toRadians(angle);
-		double course = Math.toRadians(getSkill().getFlyCourse());
-		int x1 = (int) (Math.cos(Math.PI + radian + course) * _radius);
-		int y1 = (int) (Math.sin(Math.PI + radian + course) * _radius);
+		final L2Character effected = isSelfEffect() ? info.getEffector() : info.getEffected();
+		final int radius = info.getSkill().getFlyRadius();
+		final double angle = Util.convertHeadingToDegree(effected.getHeading());
+		final double radian = Math.toRadians(angle);
+		final double course = Math.toRadians(info.getSkill().getFlyCourse());
+		final int x1 = (int) (Math.cos(Math.PI + radian + course) * radius);
+		final int y1 = (int) (Math.sin(Math.PI + radian + course) * radius);
 		
-		x = _actor.getX() + x1;
-		y = _actor.getY() + y1;
-		z = _actor.getZ();
+		int x = effected.getX() + x1;
+		int y = effected.getY() + y1;
+		int z = effected.getZ();
 		
 		if (Config.GEODATA > 0)
 		{
-			Location destiny = GeoData.getInstance().moveCheck(_actor.getX(), _actor.getY(), _actor.getZ(), x, y, z, _actor.getInstanceId());
+			final Location destiny = GeoData.getInstance().moveCheck(effected.getX(), effected.getY(), effected.getZ(), x, y, z, effected.getInstanceId());
 			x = destiny.getX();
 			y = destiny.getY();
 			z = destiny.getZ();
 		}
 		
 		// TODO: check if this AI intention is retail-like. This stops player's previous movement
-		_actor.getAI().setIntention(CtrlIntention.AI_INTENTION_IDLE);
-		_actor.broadcastPacket(new FlyToLocation(_actor, x, y, z, FlyType.DUMMY));
-		_actor.abortAttack();
-		_actor.abortCast();
-		_actor.setXYZ(x, y, z);
-		_actor.broadcastPacket(new ValidateLocation(_actor));
+		effected.getAI().setIntention(CtrlIntention.AI_INTENTION_IDLE);
+		effected.broadcastPacket(new FlyToLocation(effected, x, y, z, FlyType.DUMMY));
+		effected.abortAttack();
+		effected.abortCast();
+		effected.setXYZ(x, y, z);
+		effected.broadcastPacket(new ValidateLocation(effected));
 		return true;
 	}
 }

+ 32 - 39
L2J_DataPack_BETA/dist/game/data/scripts/handlers/effecthandlers/BlockAction.java

@@ -19,32 +19,31 @@
 package handlers.effecthandlers;
 
 import java.util.ArrayList;
+import java.util.List;
 
 import com.l2jserver.gameserver.datatables.BotReportTable;
 import com.l2jserver.gameserver.instancemanager.PunishmentManager;
-import com.l2jserver.gameserver.model.effects.EffectTemplate;
-import com.l2jserver.gameserver.model.effects.L2Effect;
-import com.l2jserver.gameserver.model.effects.L2EffectType;
+import com.l2jserver.gameserver.model.StatsSet;
+import com.l2jserver.gameserver.model.conditions.Condition;
+import com.l2jserver.gameserver.model.effects.AbstractEffect;
 import com.l2jserver.gameserver.model.punishment.PunishmentAffect;
 import com.l2jserver.gameserver.model.punishment.PunishmentTask;
 import com.l2jserver.gameserver.model.punishment.PunishmentType;
-import com.l2jserver.gameserver.model.stats.Env;
+import com.l2jserver.gameserver.model.skills.BuffInfo;
 
 /**
+ * Block Action effect implementation.
  * @author BiggBoss
  */
-public final class BlockAction extends L2Effect
+public final class BlockAction extends AbstractEffect
 {
-	private final ArrayList<Integer> _blockedActions;
+	private final List<Integer> _blockedActions;
 	
-	/**
-	 * @param env
-	 * @param template
-	 */
-	public BlockAction(Env env, EffectTemplate template)
+	public BlockAction(Condition attachCond, Condition applyCond, StatsSet set, StatsSet params)
 	{
-		super(env, template);
-		String[] rawActions = template.getParameters().getString("blockedActions").split(",");
+		super(attachCond, applyCond, set, params);
+		
+		String[] rawActions = getParameters().getString("blockedActions").split(",");
 		_blockedActions = new ArrayList<>(rawActions.length);
 		for (String act : rawActions)
 		{
@@ -61,48 +60,42 @@ public final class BlockAction extends L2Effect
 	}
 	
 	@Override
-	public boolean onStart()
+	public boolean checkCondition(Object id)
+	{
+		return !_blockedActions.contains(id);
+	}
+	
+	@Override
+	public void onExit(BuffInfo info)
 	{
-		if ((getEffected() == null) || !getEffected().isPlayer())
-		{
-			return false;
-		}
-		
 		if (_blockedActions.contains(BotReportTable.PARTY_ACTION_BLOCK_ID))
 		{
-			PunishmentManager.getInstance().startPunishment(new PunishmentTask(0, getEffected().getObjectId(), PunishmentAffect.CHARACTER, PunishmentType.PARTY_BAN, 0, "block action debuff", "system", true));
+			PunishmentManager.getInstance().stopPunishment(info.getEffected().getObjectId(), PunishmentAffect.CHARACTER, PunishmentType.PARTY_BAN);
 		}
-		
 		if (_blockedActions.contains(BotReportTable.CHAT_BLOCK_ID))
 		{
-			PunishmentManager.getInstance().startPunishment(new PunishmentTask(0, getEffected().getObjectId(), PunishmentAffect.CHARACTER, PunishmentType.CHAT_BAN, 0, "block action debuff", "system", true));
+			PunishmentManager.getInstance().stopPunishment(info.getEffected().getObjectId(), PunishmentAffect.CHARACTER, PunishmentType.CHAT_BAN);
 		}
-		
-		return true;
 	}
 	
 	@Override
-	public void onExit()
+	public boolean onStart(BuffInfo info)
 	{
+		if ((info.getEffected() == null) || !info.getEffected().isPlayer())
+		{
+			return false;
+		}
+		
 		if (_blockedActions.contains(BotReportTable.PARTY_ACTION_BLOCK_ID))
 		{
-			PunishmentManager.getInstance().stopPunishment(getEffected().getObjectId(), PunishmentAffect.CHARACTER, PunishmentType.PARTY_BAN);
+			PunishmentManager.getInstance().startPunishment(new PunishmentTask(0, info.getEffected().getObjectId(), PunishmentAffect.CHARACTER, PunishmentType.PARTY_BAN, 0, "block action debuff", "system", true));
 		}
+		
 		if (_blockedActions.contains(BotReportTable.CHAT_BLOCK_ID))
 		{
-			PunishmentManager.getInstance().stopPunishment(getEffected().getObjectId(), PunishmentAffect.CHARACTER, PunishmentType.CHAT_BAN);
+			PunishmentManager.getInstance().startPunishment(new PunishmentTask(0, info.getEffected().getObjectId(), PunishmentAffect.CHARACTER, PunishmentType.CHAT_BAN, 0, "block action debuff", "system", true));
 		}
-	}
-	
-	@Override
-	public boolean checkCondition(Object id)
-	{
-		return !_blockedActions.contains(id);
-	}
-	
-	@Override
-	public L2EffectType getEffectType()
-	{
-		return L2EffectType.ACTION_BLOCK;
+		
+		return true;
 	}
 }

+ 12 - 18
L2J_DataPack_BETA/dist/game/data/scripts/handlers/effecthandlers/BlockBuffSlot.java

@@ -22,25 +22,25 @@ import java.util.Collections;
 import java.util.HashSet;
 import java.util.Set;
 
-import com.l2jserver.gameserver.model.effects.EffectTemplate;
-import com.l2jserver.gameserver.model.effects.L2Effect;
-import com.l2jserver.gameserver.model.effects.L2EffectType;
+import com.l2jserver.gameserver.model.StatsSet;
+import com.l2jserver.gameserver.model.conditions.Condition;
+import com.l2jserver.gameserver.model.effects.AbstractEffect;
 import com.l2jserver.gameserver.model.skills.AbnormalType;
-import com.l2jserver.gameserver.model.stats.Env;
+import com.l2jserver.gameserver.model.skills.BuffInfo;
 
 /**
  * Block Buff Slot effect implementation.
  * @author Zoey76
  */
-public class BlockBuffSlot extends L2Effect
+public final class BlockBuffSlot extends AbstractEffect
 {
 	private final Set<AbnormalType> _blockBuffSlots;
 	
-	public BlockBuffSlot(Env env, EffectTemplate template)
+	public BlockBuffSlot(Condition attachCond, Condition applyCond, StatsSet set, StatsSet params)
 	{
-		super(env, template);
+		super(attachCond, applyCond, set, params);
 		
-		String blockBuffSlots = template.hasParameters() ? template.getParameters().getString("slot", null) : null;
+		String blockBuffSlots = hasParameters() ? getParameters().getString("slot", null) : null;
 		if ((blockBuffSlots != null) && !blockBuffSlots.isEmpty())
 		{
 			_blockBuffSlots = new HashSet<>();
@@ -56,26 +56,20 @@ public class BlockBuffSlot extends L2Effect
 	}
 	
 	@Override
-	public L2EffectType getEffectType()
+	public void onExit(BuffInfo info)
 	{
-		return L2EffectType.NONE;
+		info.getEffected().getEffectList().removeBlockedBuffSlots(_blockBuffSlots);
 	}
 	
 	@Override
-	public void onExit()
-	{
-		getEffected().getEffectList().removeBlockedBuffSlots(_blockBuffSlots);
-	}
-	
-	@Override
-	public boolean onStart()
+	public boolean onStart(BuffInfo info)
 	{
 		if (_blockBuffSlots.isEmpty())
 		{
 			return false;
 		}
 		
-		getEffected().getEffectList().addBlockedBuffSlots(_blockBuffSlots);
+		info.getEffected().getEffectList().addBlockedBuffSlots(_blockBuffSlots);
 		
 		return true;
 	}

+ 17 - 21
L2J_DataPack_BETA/dist/game/data/scripts/handlers/effecthandlers/BlockChat.java

@@ -19,22 +19,24 @@
 package handlers.effecthandlers;
 
 import com.l2jserver.gameserver.instancemanager.PunishmentManager;
-import com.l2jserver.gameserver.model.effects.EffectTemplate;
-import com.l2jserver.gameserver.model.effects.L2Effect;
+import com.l2jserver.gameserver.model.StatsSet;
+import com.l2jserver.gameserver.model.conditions.Condition;
+import com.l2jserver.gameserver.model.effects.AbstractEffect;
 import com.l2jserver.gameserver.model.effects.L2EffectType;
 import com.l2jserver.gameserver.model.punishment.PunishmentAffect;
 import com.l2jserver.gameserver.model.punishment.PunishmentTask;
 import com.l2jserver.gameserver.model.punishment.PunishmentType;
-import com.l2jserver.gameserver.model.stats.Env;
+import com.l2jserver.gameserver.model.skills.BuffInfo;
 
 /**
+ * Block Chat effect implementation.
  * @author BiggBoss
  */
-public final class BlockChat extends L2Effect
+public final class BlockChat extends AbstractEffect
 {
-	public BlockChat(Env env, EffectTemplate template)
+	public BlockChat(Condition attachCond, Condition applyCond, StatsSet set, StatsSet params)
 	{
-		super(env, template);
+		super(attachCond, applyCond, set, params);
 	}
 	
 	@Override
@@ -44,26 +46,20 @@ public final class BlockChat extends L2Effect
 	}
 	
 	@Override
-	public boolean onStart()
+	public void onExit(BuffInfo info)
 	{
-		if ((getEffected() == null) || !getEffected().isPlayer())
-		{
-			return false;
-		}
-		
-		PunishmentManager.getInstance().startPunishment(new PunishmentTask(0, getEffected().getObjectId(), PunishmentAffect.CHARACTER, PunishmentType.CHAT_BAN, 0, "Chat banned bot report", "system", true));
-		return true;
+		PunishmentManager.getInstance().stopPunishment(info.getEffected().getObjectId(), PunishmentAffect.CHARACTER, PunishmentType.CHAT_BAN);
 	}
 	
 	@Override
-	public void onExit()
-	{
-		PunishmentManager.getInstance().stopPunishment(getEffected().getObjectId(), PunishmentAffect.CHARACTER, PunishmentType.CHAT_BAN);
-	}
-	
-	@Override
-	public boolean isInstant()
+	public boolean onStart(BuffInfo info)
 	{
+		if ((info.getEffected() == null) || !info.getEffected().isPlayer())
+		{
+			return false;
+		}
+		
+		PunishmentManager.getInstance().startPunishment(new PunishmentTask(0, info.getEffected().getObjectId(), PunishmentAffect.CHARACTER, PunishmentType.CHAT_BAN, 0, "Chat banned bot report", "system", true));
 		return true;
 	}
 }

+ 13 - 22
L2J_DataPack_BETA/dist/game/data/scripts/handlers/effecthandlers/BlockParty.java

@@ -19,49 +19,40 @@
 package handlers.effecthandlers;
 
 import com.l2jserver.gameserver.instancemanager.PunishmentManager;
-import com.l2jserver.gameserver.model.effects.EffectTemplate;
-import com.l2jserver.gameserver.model.effects.L2Effect;
-import com.l2jserver.gameserver.model.effects.L2EffectType;
+import com.l2jserver.gameserver.model.StatsSet;
+import com.l2jserver.gameserver.model.conditions.Condition;
+import com.l2jserver.gameserver.model.effects.AbstractEffect;
 import com.l2jserver.gameserver.model.punishment.PunishmentAffect;
 import com.l2jserver.gameserver.model.punishment.PunishmentTask;
 import com.l2jserver.gameserver.model.punishment.PunishmentType;
-import com.l2jserver.gameserver.model.stats.Env;
+import com.l2jserver.gameserver.model.skills.BuffInfo;
 
 /**
+ * Block Party effect implementation.
  * @author BiggBoss
  */
-public final class BlockParty extends L2Effect
+public final class BlockParty extends AbstractEffect
 {
-	/**
-	 * @param env
-	 * @param template
-	 */
-	public BlockParty(Env env, EffectTemplate template)
+	public BlockParty(Condition attachCond, Condition applyCond, StatsSet set, StatsSet params)
 	{
-		super(env, template);
+		super(attachCond, applyCond, set, params);
 	}
 	
 	@Override
-	public L2EffectType getEffectType()
+	public void onExit(BuffInfo info)
 	{
-		return L2EffectType.NONE;
+		PunishmentManager.getInstance().stopPunishment(info.getEffected().getObjectId(), PunishmentAffect.CHARACTER, PunishmentType.PARTY_BAN);
 	}
 	
 	@Override
-	public boolean onStart()
+	public boolean onStart(BuffInfo info)
 	{
-		if ((getEffected() == null) || !getEffected().isPlayer())
+		if ((info.getEffected() == null) || !info.getEffected().isPlayer())
 		{
 			return false;
 		}
 		
-		PunishmentManager.getInstance().startPunishment(new PunishmentTask(0, getEffected().getObjectId(), PunishmentAffect.CHARACTER, PunishmentType.PARTY_BAN, 0, "Party banned by bot report", "system", true));
+		PunishmentManager.getInstance().startPunishment(new PunishmentTask(0, info.getEffected().getObjectId(), PunishmentAffect.CHARACTER, PunishmentType.PARTY_BAN, 0, "Party banned by bot report", "system", true));
 		return true;
 	}
-	
-	@Override
-	public void onExit()
-	{
-		PunishmentManager.getInstance().stopPunishment(getEffected().getObjectId(), PunishmentAffect.CHARACTER, PunishmentType.PARTY_BAN);
-	}
 }

+ 6 - 6
L2J_DataPack_BETA/dist/game/data/scripts/handlers/effecthandlers/BlockResurrection.java

@@ -18,21 +18,21 @@
  */
 package handlers.effecthandlers;
 
+import com.l2jserver.gameserver.model.StatsSet;
+import com.l2jserver.gameserver.model.conditions.Condition;
+import com.l2jserver.gameserver.model.effects.AbstractEffect;
 import com.l2jserver.gameserver.model.effects.EffectFlag;
-import com.l2jserver.gameserver.model.effects.EffectTemplate;
-import com.l2jserver.gameserver.model.effects.L2Effect;
 import com.l2jserver.gameserver.model.effects.L2EffectType;
-import com.l2jserver.gameserver.model.stats.Env;
 
 /**
  * Block Resurrection effect implementation.
  * @author UnAfraid
  */
-public class BlockResurrection extends L2Effect
+public final class BlockResurrection extends AbstractEffect
 {
-	public BlockResurrection(Env env, EffectTemplate template)
+	public BlockResurrection(Condition attachCond, Condition applyCond, StatsSet set, StatsSet params)
 	{
-		super(env, template);
+		super(attachCond, applyCond, set, params);
 	}
 	
 	@Override

+ 16 - 21
L2J_DataPack_BETA/dist/game/data/scripts/handlers/effecthandlers/Bluff.java

@@ -18,12 +18,12 @@
  */
 package handlers.effecthandlers;
 
+import com.l2jserver.gameserver.model.StatsSet;
 import com.l2jserver.gameserver.model.actor.instance.L2NpcInstance;
 import com.l2jserver.gameserver.model.actor.instance.L2SiegeSummonInstance;
-import com.l2jserver.gameserver.model.effects.EffectTemplate;
-import com.l2jserver.gameserver.model.effects.L2Effect;
-import com.l2jserver.gameserver.model.effects.L2EffectType;
-import com.l2jserver.gameserver.model.stats.Env;
+import com.l2jserver.gameserver.model.conditions.Condition;
+import com.l2jserver.gameserver.model.effects.AbstractEffect;
+import com.l2jserver.gameserver.model.skills.BuffInfo;
 import com.l2jserver.gameserver.model.stats.Formulas;
 import com.l2jserver.gameserver.network.serverpackets.StartRotation;
 import com.l2jserver.gameserver.network.serverpackets.StopRotation;
@@ -32,26 +32,21 @@ import com.l2jserver.gameserver.network.serverpackets.StopRotation;
  * Bluff effect implementation.
  * @author decad
  */
-public class Bluff extends L2Effect
+public final class Bluff extends AbstractEffect
 {
 	private final int _chance;
 	
-	public Bluff(Env env, EffectTemplate template)
+	public Bluff(Condition attachCond, Condition applyCond, StatsSet set, StatsSet params)
 	{
-		super(env, template);
-		_chance = template.hasParameters() ? template.getParameters().getInt("chance", 100) : 100;
-	}
-	
-	@Override
-	public boolean calcSuccess()
-	{
-		return Formulas.calcProbability(_chance, getEffector(), getEffected(), getSkill());
+		super(attachCond, applyCond, set, params);
+		
+		_chance = hasParameters() ? getParameters().getInt("chance", 100) : 100;
 	}
 	
 	@Override
-	public L2EffectType getEffectType()
+	public boolean calcSuccess(BuffInfo info)
 	{
-		return L2EffectType.NONE;
+		return Formulas.calcProbability(_chance, info.getEffector(), info.getEffected(), info.getSkill());
 	}
 	
 	@Override
@@ -61,16 +56,16 @@ public class Bluff extends L2Effect
 	}
 	
 	@Override
-	public boolean onStart()
+	public boolean onStart(BuffInfo info)
 	{
-		if ((getEffected() instanceof L2NpcInstance) || ((getEffected().isNpc()) && (getEffected().getId() == 35062)) || (getEffected() instanceof L2SiegeSummonInstance))
+		if ((info.getEffected() instanceof L2NpcInstance) || ((info.getEffected().isNpc()) && (info.getEffected().getId() == 35062)) || (info.getEffected() instanceof L2SiegeSummonInstance))
 		{
 			return false;
 		}
 		
-		getEffected().broadcastPacket(new StartRotation(getEffected().getObjectId(), getEffected().getHeading(), 1, 65535));
-		getEffected().broadcastPacket(new StopRotation(getEffected().getObjectId(), getEffector().getHeading(), 65535));
-		getEffected().setHeading(getEffector().getHeading());
+		info.getEffected().broadcastPacket(new StartRotation(info.getEffected().getObjectId(), info.getEffected().getHeading(), 1, 65535));
+		info.getEffected().broadcastPacket(new StopRotation(info.getEffected().getObjectId(), info.getEffector().getHeading(), 65535));
+		info.getEffected().setHeading(info.getEffector().getHeading());
 		return true;
 	}
 }

+ 9 - 19
L2J_DataPack_BETA/dist/game/data/scripts/handlers/effecthandlers/Buff.java

@@ -18,31 +18,21 @@
  */
 package handlers.effecthandlers;
 
-import com.l2jserver.gameserver.model.effects.EffectTemplate;
-import com.l2jserver.gameserver.model.effects.L2Effect;
+import com.l2jserver.gameserver.model.StatsSet;
+import com.l2jserver.gameserver.model.conditions.Condition;
+import com.l2jserver.gameserver.model.effects.AbstractEffect;
 import com.l2jserver.gameserver.model.effects.L2EffectType;
-import com.l2jserver.gameserver.model.stats.Env;
+import com.l2jserver.gameserver.model.skills.BuffInfo;
 
 /**
  * Buff effect implementation.
  * @author mkizub
  */
-public class Buff extends L2Effect
+public class Buff extends AbstractEffect
 {
-	public Buff(Env env, EffectTemplate template)
+	public Buff(Condition attachCond, Condition applyCond, StatsSet set, StatsSet params)
 	{
-		super(env, template);
-	}
-	
-	public Buff(Env env, L2Effect effect)
-	{
-		super(env, effect);
-	}
-	
-	@Override
-	public boolean canBeStolen()
-	{
-		return !getSkill().isPassive();
+		super(attachCond, applyCond, set, params);
 	}
 	
 	@Override
@@ -52,8 +42,8 @@ public class Buff extends L2Effect
 	}
 	
 	@Override
-	public boolean onActionTime()
+	public boolean onActionTime(BuffInfo info)
 	{
-		return getSkill().isPassive() || getSkill().isToggle();
+		return info.getSkill().isPassive() || info.getSkill().isToggle();
 	}
 }

+ 13 - 21
L2J_DataPack_BETA/dist/game/data/scripts/handlers/effecthandlers/CallParty.java

@@ -18,28 +18,21 @@
  */
 package handlers.effecthandlers;
 
-import com.l2jserver.gameserver.model.L2Party;
+import com.l2jserver.gameserver.model.StatsSet;
 import com.l2jserver.gameserver.model.actor.instance.L2PcInstance;
-import com.l2jserver.gameserver.model.effects.EffectTemplate;
-import com.l2jserver.gameserver.model.effects.L2Effect;
-import com.l2jserver.gameserver.model.effects.L2EffectType;
-import com.l2jserver.gameserver.model.stats.Env;
+import com.l2jserver.gameserver.model.conditions.Condition;
+import com.l2jserver.gameserver.model.effects.AbstractEffect;
+import com.l2jserver.gameserver.model.skills.BuffInfo;
 
 /**
  * Call Party effect implementation.
  * @author Adry_85
  */
-public class CallParty extends L2Effect
+public final class CallParty extends AbstractEffect
 {
-	public CallParty(Env env, EffectTemplate template)
+	public CallParty(Condition attachCond, Condition applyCond, StatsSet set, StatsSet params)
 	{
-		super(env, template);
-	}
-	
-	@Override
-	public L2EffectType getEffectType()
-	{
-		return L2EffectType.NONE;
+		super(attachCond, applyCond, set, params);
 	}
 	
 	@Override
@@ -49,18 +42,17 @@ public class CallParty extends L2Effect
 	}
 	
 	@Override
-	public boolean onStart()
+	public boolean onStart(BuffInfo info)
 	{
-		L2Party party = getEffector().getParty();
-		if (party != null)
+		if (info.getEffector().isInParty())
 		{
-			for (L2PcInstance partyMember : party.getMembers())
+			for (L2PcInstance partyMember : info.getEffector().getParty().getMembers())
 			{
-				if (CallPc.checkSummonTargetStatus(partyMember, getEffector().getActingPlayer()))
+				if (CallPc.checkSummonTargetStatus(partyMember, info.getEffector().getActingPlayer()))
 				{
-					if (getEffector() != partyMember)
+					if (info.getEffector() != partyMember)
 					{
-						partyMember.teleToLocation(getEffector().getLocation(), true);
+						partyMember.teleToLocation(info.getEffector().getLocation(), true);
 					}
 				}
 			}

+ 14 - 20
L2J_DataPack_BETA/dist/game/data/scripts/handlers/effecthandlers/CallPc.java

@@ -21,14 +21,14 @@ package handlers.effecthandlers;
 import com.l2jserver.Config;
 import com.l2jserver.gameserver.SevenSigns;
 import com.l2jserver.gameserver.instancemanager.InstanceManager;
+import com.l2jserver.gameserver.model.StatsSet;
 import com.l2jserver.gameserver.model.actor.instance.L2PcInstance;
-import com.l2jserver.gameserver.model.effects.EffectTemplate;
-import com.l2jserver.gameserver.model.effects.L2Effect;
-import com.l2jserver.gameserver.model.effects.L2EffectType;
+import com.l2jserver.gameserver.model.conditions.Condition;
+import com.l2jserver.gameserver.model.effects.AbstractEffect;
 import com.l2jserver.gameserver.model.entity.Instance;
 import com.l2jserver.gameserver.model.entity.TvTEvent;
 import com.l2jserver.gameserver.model.holders.SummonRequestHolder;
-import com.l2jserver.gameserver.model.stats.Env;
+import com.l2jserver.gameserver.model.skills.BuffInfo;
 import com.l2jserver.gameserver.model.zone.ZoneId;
 import com.l2jserver.gameserver.network.SystemMessageId;
 import com.l2jserver.gameserver.network.serverpackets.ConfirmDlg;
@@ -38,22 +38,16 @@ import com.l2jserver.gameserver.network.serverpackets.SystemMessage;
  * Call Pc effect implementation.
  * @author Adry_85
  */
-public class CallPc extends L2Effect
+public final class CallPc extends AbstractEffect
 {
 	private static int _itemId;
 	private static int _itemCount;
 	
-	public CallPc(Env env, EffectTemplate template)
+	public CallPc(Condition attachCond, Condition applyCond, StatsSet set, StatsSet params)
 	{
-		super(env, template);
-		_itemId = template.getParameters().getInt("itemId", 0);
-		_itemCount = template.getParameters().getInt("itemCount", 0);
-	}
-	
-	@Override
-	public L2EffectType getEffectType()
-	{
-		return L2EffectType.NONE;
+		super(attachCond, applyCond, set, params);
+		_itemId = getParameters().getInt("itemId", 0);
+		_itemCount = getParameters().getInt("itemCount", 0);
 	}
 	
 	@Override
@@ -63,15 +57,15 @@ public class CallPc extends L2Effect
 	}
 	
 	@Override
-	public boolean onStart()
+	public boolean onStart(BuffInfo info)
 	{
-		if (getEffected() == getEffector())
+		if (info.getEffected() == info.getEffector())
 		{
 			return false;
 		}
 		
-		L2PcInstance target = getEffected().getActingPlayer();
-		L2PcInstance activeChar = getEffector().getActingPlayer();
+		L2PcInstance target = info.getEffected().getActingPlayer();
+		L2PcInstance activeChar = info.getEffector().getActingPlayer();
 		if (checkSummonTargetStatus(target, activeChar))
 		{
 			if ((_itemId != 0) && (_itemCount != 0))
@@ -89,7 +83,7 @@ public class CallPc extends L2Effect
 				target.sendPacket(sm);
 			}
 			
-			target.addScript(new SummonRequestHolder(activeChar, getSkill()));
+			target.addScript(new SummonRequestHolder(activeChar, info.getSkill()));
 			final ConfirmDlg confirm = new ConfirmDlg(SystemMessageId.C1_WISHES_TO_SUMMON_YOU_FROM_S2_DO_YOU_ACCEPT.getId());
 			confirm.addCharName(activeChar);
 			confirm.addZoneName(activeChar.getX(), activeChar.getY(), activeChar.getZ());

+ 20 - 20
L2J_DataPack_BETA/dist/game/data/scripts/handlers/effecthandlers/ChameleonRest.java

@@ -19,21 +19,22 @@
 package handlers.effecthandlers;
 
 import com.l2jserver.gameserver.ai.CtrlIntention;
+import com.l2jserver.gameserver.model.StatsSet;
+import com.l2jserver.gameserver.model.conditions.Condition;
+import com.l2jserver.gameserver.model.effects.AbstractEffect;
 import com.l2jserver.gameserver.model.effects.EffectFlag;
-import com.l2jserver.gameserver.model.effects.EffectTemplate;
-import com.l2jserver.gameserver.model.effects.L2Effect;
 import com.l2jserver.gameserver.model.effects.L2EffectType;
-import com.l2jserver.gameserver.model.stats.Env;
+import com.l2jserver.gameserver.model.skills.BuffInfo;
 import com.l2jserver.gameserver.network.SystemMessageId;
 
 /**
  * Chameleon Rest effect implementation.
  */
-public class ChameleonRest extends L2Effect
+public final class ChameleonRest extends AbstractEffect
 {
-	public ChameleonRest(Env env, EffectTemplate template)
+	public ChameleonRest(Condition attachCond, Condition applyCond, StatsSet set, StatsSet params)
 	{
-		super(env, template);
+		super(attachCond, applyCond, set, params);
 	}
 	
 	@Override
@@ -49,44 +50,43 @@ public class ChameleonRest extends L2Effect
 	}
 	
 	@Override
-	public boolean onActionTime()
+	public boolean onActionTime(BuffInfo info)
 	{
-		if (getEffected().isDead())
+		if (info.getEffected().isDead())
 		{
 			return false;
 		}
 		
-		if (getEffected().isPlayer())
+		if (info.getEffected().isPlayer())
 		{
-			if (!getEffected().getActingPlayer().isSitting())
+			if (!info.getEffected().getActingPlayer().isSitting())
 			{
 				return false;
 			}
 		}
 		
-		double manaDam = calc();
-		
-		if (manaDam > getEffected().getCurrentMp())
+		double manaDam = getValue();
+		if (manaDam > info.getEffected().getCurrentMp())
 		{
-			getEffected().sendPacket(SystemMessageId.SKILL_REMOVED_DUE_LACK_MP);
+			info.getEffected().sendPacket(SystemMessageId.SKILL_REMOVED_DUE_LACK_MP);
 			return false;
 		}
 		
-		getEffected().reduceCurrentMp(manaDam);
+		info.getEffected().reduceCurrentMp(manaDam);
 		return false;
 	}
 	
 	@Override
-	public boolean onStart()
+	public boolean onStart(BuffInfo info)
 	{
-		if (getEffected().isPlayer())
+		if (info.getEffected().isPlayer())
 		{
-			getEffected().getActingPlayer().sitDown(false);
+			info.getEffected().getActingPlayer().sitDown(false);
 		}
 		else
 		{
-			getEffected().getAI().setIntention(CtrlIntention.AI_INTENTION_REST);
+			info.getEffected().getAI().setIntention(CtrlIntention.AI_INTENTION_REST);
 		}
-		return super.onStart();
+		return true;
 	}
 }

+ 18 - 61
L2J_DataPack_BETA/dist/game/data/scripts/handlers/effecthandlers/ChanceSkillTrigger.java

@@ -18,87 +18,44 @@
  */
 package handlers.effecthandlers;
 
-import com.l2jserver.gameserver.model.ChanceCondition;
-import com.l2jserver.gameserver.model.effects.EffectTemplate;
-import com.l2jserver.gameserver.model.effects.L2Effect;
-import com.l2jserver.gameserver.model.effects.L2EffectType;
-import com.l2jserver.gameserver.model.stats.Env;
+import com.l2jserver.gameserver.model.StatsSet;
+import com.l2jserver.gameserver.model.conditions.Condition;
+import com.l2jserver.gameserver.model.effects.AbstractEffect;
+import com.l2jserver.gameserver.model.skills.BuffInfo;
 
 /**
  * Chance Skill Trigger effect implementation.
  */
-public class ChanceSkillTrigger extends L2Effect
+public final class ChanceSkillTrigger extends AbstractEffect
 {
-	public ChanceSkillTrigger(Env env, EffectTemplate template)
+	public ChanceSkillTrigger(Condition attachCond, Condition applyCond, StatsSet set, StatsSet params)
 	{
-		super(env, template);
-	}
-	
-	public ChanceSkillTrigger(Env env, L2Effect effect)
-	{
-		super(env, effect);
-	}
-	
-	@Override
-	public boolean canBeStolen()
-	{
-		return true;
+		super(attachCond, applyCond, set, params);
 	}
 	
 	@Override
-	public L2EffectType getEffectType()
+	public boolean onActionTime(BuffInfo info)
 	{
-		return L2EffectType.NONE;
+		info.getEffected().onActionTimeChanceEffect(info.getSkill().getElement());
+		return info.getSkill().isPassive();
 	}
 	
 	@Override
-	public ChanceCondition getTriggeredChanceCondition()
-	{
-		return getEffectTemplate().getChanceCondition();
-	}
-	
-	@Override
-	public int getTriggeredChanceId()
-	{
-		return getEffectTemplate().getTriggeredId();
-	}
-	
-	@Override
-	public int getTriggeredChanceLevel()
-	{
-		return getEffectTemplate().getTriggeredLevel();
-	}
-	
-	@Override
-	public boolean onActionTime()
-	{
-		getEffected().onActionTimeChanceEffect(getSkill().getElement());
-		return getSkill().isPassive();
-	}
-	
-	@Override
-	public void onExit()
+	public void onExit(BuffInfo info)
 	{
 		// trigger only if effect in use and successfully ticked to the end
-		if (isInUse() && (getTickCount() >= getEffectTemplate().getTotalTickCount()))
+		if (info.getTickCount(this) >= getTicks())
 		{
-			getEffected().onExitChanceEffect(getSkill().getElement());
+			info.getEffected().onExitChanceEffect(info.getSkill().getElement());
 		}
-		getEffected().removeChanceEffect(this);
-		super.onExit();
+		info.getEffected().removeChanceEffect(this);
 	}
 	
 	@Override
-	public boolean onStart()
+	public boolean onStart(BuffInfo info)
 	{
-		getEffected().addChanceTrigger(this);
-		getEffected().onStartChanceEffect(getSkill().getElement());
-		return super.onStart();
-	}
-	
-	@Override
-	public boolean triggersChanceSkill()
-	{
-		return getEffectTemplate().getTriggeredId() > 1;
+		info.getEffected().addChanceTrigger(this);
+		info.getEffected().onStartChanceEffect(info.getSkill().getElement());
+		return true;
 	}
 }

+ 11 - 17
L2J_DataPack_BETA/dist/game/data/scripts/handlers/effecthandlers/ChangeFace.java

@@ -18,27 +18,21 @@
  */
 package handlers.effecthandlers;
 
+import com.l2jserver.gameserver.model.StatsSet;
 import com.l2jserver.gameserver.model.actor.instance.L2PcInstance;
-import com.l2jserver.gameserver.model.effects.EffectTemplate;
-import com.l2jserver.gameserver.model.effects.L2Effect;
-import com.l2jserver.gameserver.model.effects.L2EffectType;
-import com.l2jserver.gameserver.model.stats.Env;
+import com.l2jserver.gameserver.model.conditions.Condition;
+import com.l2jserver.gameserver.model.effects.AbstractEffect;
+import com.l2jserver.gameserver.model.skills.BuffInfo;
 
 /**
  * Change Face effect implementation.
  * @author Zoey76
  */
-public class ChangeFace extends L2Effect
+public final class ChangeFace extends AbstractEffect
 {
-	public ChangeFace(Env env, EffectTemplate template)
+	public ChangeFace(Condition attachCond, Condition applyCond, StatsSet set, StatsSet params)
 	{
-		super(env, template);
-	}
-	
-	@Override
-	public L2EffectType getEffectType()
-	{
-		return L2EffectType.NONE;
+		super(attachCond, applyCond, set, params);
 	}
 	
 	@Override
@@ -48,15 +42,15 @@ public class ChangeFace extends L2Effect
 	}
 	
 	@Override
-	public boolean onStart()
+	public boolean onStart(BuffInfo info)
 	{
-		if ((getEffector() == null) || (getEffected() == null) || !getEffector().isPlayer() || !getEffected().isPlayer() || getEffected().isAlikeDead())
+		if ((info.getEffector() == null) || (info.getEffected() == null) || !info.getEffector().isPlayer() || !info.getEffected().isPlayer() || info.getEffected().isAlikeDead())
 		{
 			return false;
 		}
 		
-		final L2PcInstance player = getEffector().getActingPlayer();
-		player.getAppearance().setFace((int) calc());
+		final L2PcInstance player = info.getEffector().getActingPlayer();
+		player.getAppearance().setFace((int) getValue());
 		player.broadcastUserInfo();
 		return true;
 	}

+ 6 - 23
L2J_DataPack_BETA/dist/game/data/scripts/handlers/effecthandlers/ChangeFishingMastery.java

@@ -1,35 +1,18 @@
 package handlers.effecthandlers;
 
-import com.l2jserver.gameserver.model.effects.EffectTemplate;
-import com.l2jserver.gameserver.model.effects.L2Effect;
-import com.l2jserver.gameserver.model.effects.L2EffectType;
-import com.l2jserver.gameserver.model.stats.Env;
+import com.l2jserver.gameserver.model.StatsSet;
+import com.l2jserver.gameserver.model.conditions.Condition;
+import com.l2jserver.gameserver.model.effects.AbstractEffect;
 
 /**
  * Change Fishing Mastery dummy effect implementation.
  * @author Zoey76
  */
-public class ChangeFishingMastery extends L2Effect
+public final class ChangeFishingMastery extends AbstractEffect
 {
-	public ChangeFishingMastery(Env env, EffectTemplate template)
-	{
-		super(env, template);
-	}
-	
-	public ChangeFishingMastery(Env env, L2Effect effect)
-	{
-		super(env, effect);
-	}
-	
-	@Override
-	public boolean canBeStolen()
-	{
-		return true;
-	}
 	
-	@Override
-	public L2EffectType getEffectType()
+	public ChangeFishingMastery(Condition attachCond, Condition applyCond, StatsSet set, StatsSet params)
 	{
-		return L2EffectType.NONE;
+		super(attachCond, applyCond, set, params);
 	}
 }

+ 11 - 17
L2J_DataPack_BETA/dist/game/data/scripts/handlers/effecthandlers/ChangeHairColor.java

@@ -18,27 +18,21 @@
  */
 package handlers.effecthandlers;
 
+import com.l2jserver.gameserver.model.StatsSet;
 import com.l2jserver.gameserver.model.actor.instance.L2PcInstance;
-import com.l2jserver.gameserver.model.effects.EffectTemplate;
-import com.l2jserver.gameserver.model.effects.L2Effect;
-import com.l2jserver.gameserver.model.effects.L2EffectType;
-import com.l2jserver.gameserver.model.stats.Env;
+import com.l2jserver.gameserver.model.conditions.Condition;
+import com.l2jserver.gameserver.model.effects.AbstractEffect;
+import com.l2jserver.gameserver.model.skills.BuffInfo;
 
 /**
  * Change Hair Color effect implementation.
  * @author Zoey76
  */
-public class ChangeHairColor extends L2Effect
+public final class ChangeHairColor extends AbstractEffect
 {
-	public ChangeHairColor(Env env, EffectTemplate template)
+	public ChangeHairColor(Condition attachCond, Condition applyCond, StatsSet set, StatsSet params)
 	{
-		super(env, template);
-	}
-	
-	@Override
-	public L2EffectType getEffectType()
-	{
-		return L2EffectType.NONE;
+		super(attachCond, applyCond, set, params);
 	}
 	
 	@Override
@@ -48,15 +42,15 @@ public class ChangeHairColor extends L2Effect
 	}
 	
 	@Override
-	public boolean onStart()
+	public boolean onStart(BuffInfo info)
 	{
-		if ((getEffector() == null) || (getEffected() == null) || !getEffector().isPlayer() || !getEffected().isPlayer() || getEffected().isAlikeDead())
+		if ((info.getEffector() == null) || (info.getEffected() == null) || !info.getEffector().isPlayer() || !info.getEffected().isPlayer() || info.getEffected().isAlikeDead())
 		{
 			return false;
 		}
 		
-		final L2PcInstance player = getEffector().getActingPlayer();
-		player.getAppearance().setHairColor((int) calc());
+		final L2PcInstance player = info.getEffector().getActingPlayer();
+		player.getAppearance().setHairColor((int) getValue());
 		player.broadcastUserInfo();
 		return true;
 	}

+ 11 - 17
L2J_DataPack_BETA/dist/game/data/scripts/handlers/effecthandlers/ChangeHairStyle.java

@@ -18,27 +18,21 @@
  */
 package handlers.effecthandlers;
 
+import com.l2jserver.gameserver.model.StatsSet;
 import com.l2jserver.gameserver.model.actor.instance.L2PcInstance;
-import com.l2jserver.gameserver.model.effects.EffectTemplate;
-import com.l2jserver.gameserver.model.effects.L2Effect;
-import com.l2jserver.gameserver.model.effects.L2EffectType;
-import com.l2jserver.gameserver.model.stats.Env;
+import com.l2jserver.gameserver.model.conditions.Condition;
+import com.l2jserver.gameserver.model.effects.AbstractEffect;
+import com.l2jserver.gameserver.model.skills.BuffInfo;
 
 /**
  * Change Hair Style effect implementation.
  * @author Zoey76
  */
-public class ChangeHairStyle extends L2Effect
+public final class ChangeHairStyle extends AbstractEffect
 {
-	public ChangeHairStyle(Env env, EffectTemplate template)
+	public ChangeHairStyle(Condition attachCond, Condition applyCond, StatsSet set, StatsSet params)
 	{
-		super(env, template);
-	}
-	
-	@Override
-	public L2EffectType getEffectType()
-	{
-		return L2EffectType.NONE;
+		super(attachCond, applyCond, set, params);
 	}
 	
 	@Override
@@ -48,15 +42,15 @@ public class ChangeHairStyle extends L2Effect
 	}
 	
 	@Override
-	public boolean onStart()
+	public boolean onStart(BuffInfo info)
 	{
-		if ((getEffector() == null) || (getEffected() == null) || !getEffector().isPlayer() || !getEffected().isPlayer() || getEffected().isAlikeDead())
+		if ((info.getEffector() == null) || (info.getEffected() == null) || !info.getEffector().isPlayer() || !info.getEffected().isPlayer() || info.getEffected().isAlikeDead())
 		{
 			return false;
 		}
 		
-		final L2PcInstance player = getEffector().getActingPlayer();
-		player.getAppearance().setHairStyle((int) calc());
+		final L2PcInstance player = info.getEffector().getActingPlayer();
+		player.getAppearance().setHairStyle((int) getValue());
 		player.broadcastUserInfo();
 		return true;
 	}

+ 13 - 12
L2J_DataPack_BETA/dist/game/data/scripts/handlers/effecthandlers/CharmOfCourage.java

@@ -18,22 +18,23 @@
  */
 package handlers.effecthandlers;
 
+import com.l2jserver.gameserver.model.StatsSet;
+import com.l2jserver.gameserver.model.conditions.Condition;
+import com.l2jserver.gameserver.model.effects.AbstractEffect;
 import com.l2jserver.gameserver.model.effects.EffectFlag;
-import com.l2jserver.gameserver.model.effects.EffectTemplate;
-import com.l2jserver.gameserver.model.effects.L2Effect;
 import com.l2jserver.gameserver.model.effects.L2EffectType;
-import com.l2jserver.gameserver.model.stats.Env;
+import com.l2jserver.gameserver.model.skills.BuffInfo;
 import com.l2jserver.gameserver.network.serverpackets.EtcStatusUpdate;
 
 /**
  * Charm Of Courage effect implementation.
  * @author nBd
  */
-public class CharmOfCourage extends L2Effect
+public final class CharmOfCourage extends AbstractEffect
 {
-	public CharmOfCourage(Env env, EffectTemplate template)
+	public CharmOfCourage(Condition attachCond, Condition applyCond, StatsSet set, StatsSet params)
 	{
-		super(env, template);
+		super(attachCond, applyCond, set, params);
 	}
 	
 	@Override
@@ -49,20 +50,20 @@ public class CharmOfCourage extends L2Effect
 	}
 	
 	@Override
-	public void onExit()
+	public void onExit(BuffInfo info)
 	{
-		if (getEffected().isPlayer())
+		if (info.getEffected().isPlayer())
 		{
-			getEffected().broadcastPacket(new EtcStatusUpdate(getEffected().getActingPlayer()));
+			info.getEffected().broadcastPacket(new EtcStatusUpdate(info.getEffected().getActingPlayer()));
 		}
 	}
 	
 	@Override
-	public boolean onStart()
+	public boolean onStart(BuffInfo info)
 	{
-		if (getEffected().isPlayer())
+		if (info.getEffected().isPlayer())
 		{
-			getEffected().broadcastPacket(new EtcStatusUpdate(getEffected().getActingPlayer()));
+			info.getEffected().broadcastPacket(new EtcStatusUpdate(info.getEffected().getActingPlayer()));
 			return true;
 		}
 		return false;

+ 9 - 8
L2J_DataPack_BETA/dist/game/data/scripts/handlers/effecthandlers/CharmOfLuck.java

@@ -18,21 +18,22 @@
  */
 package handlers.effecthandlers;
 
+import com.l2jserver.gameserver.model.StatsSet;
+import com.l2jserver.gameserver.model.conditions.Condition;
+import com.l2jserver.gameserver.model.effects.AbstractEffect;
 import com.l2jserver.gameserver.model.effects.EffectFlag;
-import com.l2jserver.gameserver.model.effects.EffectTemplate;
-import com.l2jserver.gameserver.model.effects.L2Effect;
 import com.l2jserver.gameserver.model.effects.L2EffectType;
-import com.l2jserver.gameserver.model.stats.Env;
+import com.l2jserver.gameserver.model.skills.BuffInfo;
 
 /**
  * Charm Of Luck effect implementation.
  * @author kerberos_20
  */
-public class CharmOfLuck extends L2Effect
+public final class CharmOfLuck extends AbstractEffect
 {
-	public CharmOfLuck(Env env, EffectTemplate template)
+	public CharmOfLuck(Condition attachCond, Condition applyCond, StatsSet set, StatsSet params)
 	{
-		super(env, template);
+		super(attachCond, applyCond, set, params);
 	}
 	
 	@Override
@@ -48,8 +49,8 @@ public class CharmOfLuck extends L2Effect
 	}
 	
 	@Override
-	public boolean onStart()
+	public boolean onStart(BuffInfo info)
 	{
-		return (getEffector() != null) && (getEffected() != null) && getEffected().isPlayer();
+		return (info.getEffector() != null) && (info.getEffected() != null) && info.getEffected().isPlayer();
 	}
 }

+ 15 - 14
L2J_DataPack_BETA/dist/game/data/scripts/handlers/effecthandlers/ClanGate.java

@@ -19,11 +19,12 @@
 package handlers.effecthandlers;
 
 import com.l2jserver.gameserver.model.L2Clan;
-import com.l2jserver.gameserver.model.effects.AbnormalEffect;
-import com.l2jserver.gameserver.model.effects.EffectTemplate;
-import com.l2jserver.gameserver.model.effects.L2Effect;
+import com.l2jserver.gameserver.model.StatsSet;
+import com.l2jserver.gameserver.model.conditions.Condition;
+import com.l2jserver.gameserver.model.effects.AbstractEffect;
 import com.l2jserver.gameserver.model.effects.L2EffectType;
-import com.l2jserver.gameserver.model.stats.Env;
+import com.l2jserver.gameserver.model.skills.AbnormalVisualEffect;
+import com.l2jserver.gameserver.model.skills.BuffInfo;
 import com.l2jserver.gameserver.network.SystemMessageId;
 import com.l2jserver.gameserver.network.serverpackets.SystemMessage;
 
@@ -31,11 +32,11 @@ import com.l2jserver.gameserver.network.serverpackets.SystemMessage;
  * Clan Gate effect implementation.
  * @author ZaKaX
  */
-public class ClanGate extends L2Effect
+public final class ClanGate extends AbstractEffect
 {
-	public ClanGate(Env env, EffectTemplate template)
+	public ClanGate(Condition attachCond, Condition applyCond, StatsSet set, StatsSet params)
 	{
-		super(env, template);
+		super(attachCond, applyCond, set, params);
 	}
 	
 	@Override
@@ -45,22 +46,22 @@ public class ClanGate extends L2Effect
 	}
 	
 	@Override
-	public void onExit()
+	public void onExit(BuffInfo info)
 	{
-		getEffected().stopAbnormalEffect(AbnormalEffect.MAGIC_CIRCLE);
+		info.getEffected().stopAbnormalEffect(AbnormalVisualEffect.MAGIC_CIRCLE);
 	}
 	
 	@Override
-	public boolean onStart()
+	public boolean onStart(BuffInfo info)
 	{
-		getEffected().startAbnormalEffect(AbnormalEffect.MAGIC_CIRCLE);
-		if (getEffected().isPlayer())
+		info.getEffected().startAbnormalEffect(AbnormalVisualEffect.MAGIC_CIRCLE);
+		if (info.getEffected().isPlayer())
 		{
-			L2Clan clan = getEffected().getActingPlayer().getClan();
+			L2Clan clan = info.getEffected().getActingPlayer().getClan();
 			if (clan != null)
 			{
 				SystemMessage msg = SystemMessage.getSystemMessage(SystemMessageId.COURT_MAGICIAN_CREATED_PORTAL);
-				clan.broadcastToOtherOnlineMembers(msg, getEffected().getActingPlayer());
+				clan.broadcastToOtherOnlineMembers(msg, info.getEffected().getActingPlayer());
 			}
 		}
 		return true;

+ 25 - 36
L2J_DataPack_BETA/dist/game/data/scripts/handlers/effecthandlers/Confuse.java

@@ -24,12 +24,12 @@ import java.util.List;
 import com.l2jserver.gameserver.ai.CtrlEvent;
 import com.l2jserver.gameserver.ai.CtrlIntention;
 import com.l2jserver.gameserver.model.L2Object;
+import com.l2jserver.gameserver.model.StatsSet;
 import com.l2jserver.gameserver.model.actor.L2Character;
+import com.l2jserver.gameserver.model.conditions.Condition;
+import com.l2jserver.gameserver.model.effects.AbstractEffect;
 import com.l2jserver.gameserver.model.effects.EffectFlag;
-import com.l2jserver.gameserver.model.effects.EffectTemplate;
-import com.l2jserver.gameserver.model.effects.L2Effect;
-import com.l2jserver.gameserver.model.effects.L2EffectType;
-import com.l2jserver.gameserver.model.stats.Env;
+import com.l2jserver.gameserver.model.skills.BuffInfo;
 import com.l2jserver.gameserver.model.stats.Formulas;
 import com.l2jserver.util.Rnd;
 
@@ -37,20 +37,20 @@ import com.l2jserver.util.Rnd;
  * Confuse effect implementation.
  * @author littlecrow
  */
-public class Confuse extends L2Effect
+public final class Confuse extends AbstractEffect
 {
 	private final int _chance;
 	
-	public Confuse(Env env, EffectTemplate template)
+	public Confuse(Condition attachCond, Condition applyCond, StatsSet set, StatsSet params)
 	{
-		super(env, template);
-		_chance = template.hasParameters() ? template.getParameters().getInt("chance", 100) : 100;
+		super(attachCond, applyCond, set, params);
+		_chance = hasParameters() ? getParameters().getInt("chance", 100) : 100;
 	}
 	
 	@Override
-	public boolean calcSuccess()
+	public boolean calcSuccess(BuffInfo info)
 	{
-		return Formulas.calcProbability(_chance, getEffector(), getEffected(), getSkill());
+		return Formulas.calcProbability(_chance, info.getEffector(), info.getEffected(), info.getSkill());
 	}
 	
 	@Override
@@ -60,55 +60,44 @@ public class Confuse extends L2Effect
 	}
 	
 	@Override
-	public L2EffectType getEffectType()
+	public boolean isInstant()
 	{
-		return L2EffectType.NONE;
+		return true;
 	}
 	
 	@Override
-	public boolean isInstant()
+	public void onExit(BuffInfo info)
 	{
-		return true;
+		if (!info.getEffected().isPlayer())
+		{
+			info.getEffected().getAI().notifyEvent(CtrlEvent.EVT_THINK);
+		}
 	}
 	
 	@Override
-	public boolean onActionTime()
+	public boolean onStart(BuffInfo info)
 	{
+		info.getEffected().getAI().notifyEvent(CtrlEvent.EVT_CONFUSED);
+		
 		final List<L2Character> targetList = new ArrayList<>();
 		// Getting the possible targets
-		for (L2Object obj : getEffected().getKnownList().getKnownObjects().values())
+		for (L2Object obj : info.getEffected().getKnownList().getKnownObjects().values())
 		{
-			if (((getEffected().isMonster() && obj.isL2Attackable()) || (obj instanceof L2Character)) && (obj != getEffected()))
+			if (((info.getEffected().isMonster() && obj.isL2Attackable()) || (obj instanceof L2Character)) && (obj != info.getEffected()))
 			{
 				targetList.add((L2Character) obj);
 			}
 		}
+		
 		// if there is no target, exit function
 		if (!targetList.isEmpty())
 		{
 			// Choosing randomly a new target
 			final L2Character target = targetList.get(Rnd.nextInt(targetList.size()));
 			// Attacking the target
-			getEffected().setTarget(target);
-			getEffected().getAI().setIntention(CtrlIntention.AI_INTENTION_ATTACK, target);
-			return true;
-		}
-		return false;
-	}
-	
-	@Override
-	public void onExit()
-	{
-		if (!getEffected().isPlayer())
-		{
-			getEffected().getAI().notifyEvent(CtrlEvent.EVT_THINK);
+			info.getEffected().setTarget(target);
+			info.getEffected().getAI().setIntention(CtrlIntention.AI_INTENTION_ATTACK, target);
 		}
-	}
-	
-	@Override
-	public boolean onStart()
-	{
-		getEffected().getAI().notifyEvent(CtrlEvent.EVT_CONFUSED);
 		return true;
 	}
 }

+ 10 - 16
L2J_DataPack_BETA/dist/game/data/scripts/handlers/effecthandlers/ConsumeBody.java

@@ -18,27 +18,21 @@
  */
 package handlers.effecthandlers;
 
+import com.l2jserver.gameserver.model.StatsSet;
 import com.l2jserver.gameserver.model.actor.L2Npc;
-import com.l2jserver.gameserver.model.effects.EffectTemplate;
-import com.l2jserver.gameserver.model.effects.L2Effect;
-import com.l2jserver.gameserver.model.effects.L2EffectType;
-import com.l2jserver.gameserver.model.stats.Env;
+import com.l2jserver.gameserver.model.conditions.Condition;
+import com.l2jserver.gameserver.model.effects.AbstractEffect;
+import com.l2jserver.gameserver.model.skills.BuffInfo;
 
 /**
  * Consume Body effect implementation.
  * @author Zoey76
  */
-public class ConsumeBody extends L2Effect
+public final class ConsumeBody extends AbstractEffect
 {
-	public ConsumeBody(Env env, EffectTemplate template)
+	public ConsumeBody(Condition attachCond, Condition applyCond, StatsSet set, StatsSet params)
 	{
-		super(env, template);
-	}
-	
-	@Override
-	public L2EffectType getEffectType()
-	{
-		return L2EffectType.NONE;
+		super(attachCond, applyCond, set, params);
 	}
 	
 	@Override
@@ -48,13 +42,13 @@ public class ConsumeBody extends L2Effect
 	}
 	
 	@Override
-	public boolean onStart()
+	public boolean onStart(BuffInfo info)
 	{
-		if ((getEffector() == null) || (getEffected() == null) || !getEffected().isNpc())
+		if ((info.getEffector() == null) || (info.getEffected() == null) || !info.getEffected().isNpc())
 		{
 			return false;
 		}
-		((L2Npc) getEffected()).endDecayTask();
+		((L2Npc) info.getEffected()).endDecayTask();
 		return true;
 	}
 }

+ 10 - 16
L2J_DataPack_BETA/dist/game/data/scripts/handlers/effecthandlers/ConvertItem.java

@@ -19,14 +19,14 @@
 package handlers.effecthandlers;
 
 import com.l2jserver.gameserver.model.Elementals;
+import com.l2jserver.gameserver.model.StatsSet;
 import com.l2jserver.gameserver.model.actor.instance.L2PcInstance;
-import com.l2jserver.gameserver.model.effects.EffectTemplate;
-import com.l2jserver.gameserver.model.effects.L2Effect;
-import com.l2jserver.gameserver.model.effects.L2EffectType;
+import com.l2jserver.gameserver.model.conditions.Condition;
+import com.l2jserver.gameserver.model.effects.AbstractEffect;
 import com.l2jserver.gameserver.model.itemcontainer.Inventory;
 import com.l2jserver.gameserver.model.items.L2Weapon;
 import com.l2jserver.gameserver.model.items.instance.L2ItemInstance;
-import com.l2jserver.gameserver.model.stats.Env;
+import com.l2jserver.gameserver.model.skills.BuffInfo;
 import com.l2jserver.gameserver.network.SystemMessageId;
 import com.l2jserver.gameserver.network.serverpackets.InventoryUpdate;
 import com.l2jserver.gameserver.network.serverpackets.SystemMessage;
@@ -35,17 +35,11 @@ import com.l2jserver.gameserver.network.serverpackets.SystemMessage;
  * Convert Item effect implementation.
  * @author Zoey76
  */
-public class ConvertItem extends L2Effect
+public final class ConvertItem extends AbstractEffect
 {
-	public ConvertItem(Env env, EffectTemplate template)
+	public ConvertItem(Condition attachCond, Condition applyCond, StatsSet set, StatsSet params)
 	{
-		super(env, template);
-	}
-	
-	@Override
-	public L2EffectType getEffectType()
-	{
-		return L2EffectType.NONE;
+		super(attachCond, applyCond, set, params);
 	}
 	
 	@Override
@@ -55,14 +49,14 @@ public class ConvertItem extends L2Effect
 	}
 	
 	@Override
-	public boolean onStart()
+	public boolean onStart(BuffInfo info)
 	{
-		if ((getEffector() == null) || (getEffected() == null) || getEffected().isAlikeDead() || !getEffected().isPlayer())
+		if ((info.getEffector() == null) || (info.getEffected() == null) || info.getEffected().isAlikeDead() || !info.getEffected().isPlayer())
 		{
 			return false;
 		}
 		
-		final L2PcInstance player = getEffected().getActingPlayer();
+		final L2PcInstance player = info.getEffected().getActingPlayer();
 		if (player.isEnchanting())
 		{
 			return false;

+ 20 - 19
L2J_DataPack_BETA/dist/game/data/scripts/handlers/effecthandlers/CpDamPercent.java

@@ -18,21 +18,22 @@
  */
 package handlers.effecthandlers;
 
-import com.l2jserver.gameserver.model.effects.EffectTemplate;
-import com.l2jserver.gameserver.model.effects.L2Effect;
+import com.l2jserver.gameserver.model.StatsSet;
+import com.l2jserver.gameserver.model.conditions.Condition;
+import com.l2jserver.gameserver.model.effects.AbstractEffect;
 import com.l2jserver.gameserver.model.effects.L2EffectType;
-import com.l2jserver.gameserver.model.stats.Env;
+import com.l2jserver.gameserver.model.skills.BuffInfo;
 import com.l2jserver.gameserver.model.stats.Formulas;
 
 /**
  * CP Damage Percent effect implementation.
  * @author Zoey76, Adry_85
  */
-public class CpDamPercent extends L2Effect
+public final class CpDamPercent extends AbstractEffect
 {
-	public CpDamPercent(Env env, EffectTemplate template)
+	public CpDamPercent(Condition attachCond, Condition applyCond, StatsSet set, StatsSet params)
 	{
-		super(env, template);
+		super(attachCond, applyCond, set, params);
 	}
 	
 	@Override
@@ -48,34 +49,34 @@ public class CpDamPercent extends L2Effect
 	}
 	
 	@Override
-	public boolean onStart()
+	public boolean onStart(BuffInfo info)
 	{
-		if (getEffected().isPlayer())
+		if (info.getEffected().isPlayer())
 		{
-			if (getEffected().isPlayer() && getEffected().getActingPlayer().isFakeDeath())
+			if (info.getEffected().isPlayer() && info.getEffected().getActingPlayer().isFakeDeath())
 			{
-				getEffected().stopFakeDeath(true);
+				info.getEffected().stopFakeDeath(true);
 			}
 			
-			int damage = (int) ((getEffected().getCurrentCp() * calc()) / 100);
+			int damage = (int) ((info.getEffected().getCurrentCp() * getValue()) / 100);
 			// Manage attack or cast break of the target (calculating rate, sending message)
-			if (!getEffected().isRaid() && Formulas.calcAtkBreak(getEffected(), damage))
+			if (!info.getEffected().isRaid() && Formulas.calcAtkBreak(info.getEffected(), damage))
 			{
-				getEffected().breakAttack();
-				getEffected().breakCast();
+				info.getEffected().breakAttack();
+				info.getEffected().breakCast();
 			}
 			
 			if (damage > 0)
 			{
-				getEffected().setCurrentCp(getEffected().getCurrentCp() - damage);
-				if (getEffected() != getEffector())
+				info.getEffected().setCurrentCp(info.getEffected().getCurrentCp() - damage);
+				if (info.getEffected() != info.getEffector())
 				{
-					getEffector().sendDamageMessage(getEffected(), damage, false, false, false);
-					getEffected().notifyDamageReceived(damage, getEffector(), getSkill(), false);
+					info.getEffector().sendDamageMessage(info.getEffected(), damage, false, false, false);
+					info.getEffected().notifyDamageReceived(damage, info.getEffector(), info.getSkill(), false);
 				}
 			}
 			// Check if damage should be reflected
-			Formulas.calcDamageReflected(getEffector(), getEffected(), getSkill(), false);
+			Formulas.calcDamageReflected(info.getEffector(), info.getEffected(), info.getSkill(), false);
 			return true;
 		}
 		return false;

+ 14 - 13
L2J_DataPack_BETA/dist/game/data/scripts/handlers/effecthandlers/CpHeal.java

@@ -18,11 +18,12 @@
  */
 package handlers.effecthandlers;
 
+import com.l2jserver.gameserver.model.StatsSet;
 import com.l2jserver.gameserver.model.actor.L2Character;
-import com.l2jserver.gameserver.model.effects.EffectTemplate;
-import com.l2jserver.gameserver.model.effects.L2Effect;
+import com.l2jserver.gameserver.model.conditions.Condition;
+import com.l2jserver.gameserver.model.effects.AbstractEffect;
 import com.l2jserver.gameserver.model.effects.L2EffectType;
-import com.l2jserver.gameserver.model.stats.Env;
+import com.l2jserver.gameserver.model.skills.BuffInfo;
 import com.l2jserver.gameserver.network.SystemMessageId;
 import com.l2jserver.gameserver.network.serverpackets.SystemMessage;
 
@@ -30,35 +31,35 @@ import com.l2jserver.gameserver.network.serverpackets.SystemMessage;
  * Cp Heal effect implementation.
  * @author UnAfraid
  */
-public class CpHeal extends L2Effect
+public final class CpHeal extends AbstractEffect
 {
-	public CpHeal(Env env, EffectTemplate template)
+	public CpHeal(Condition attachCond, Condition applyCond, StatsSet set, StatsSet params)
 	{
-		super(env, template);
+		super(attachCond, applyCond, set, params);
 	}
 	
 	@Override
-	public boolean isInstant()
+	public L2EffectType getEffectType()
 	{
-		return true;
+		return L2EffectType.CPHEAL;
 	}
 	
 	@Override
-	public L2EffectType getEffectType()
+	public boolean isInstant()
 	{
-		return L2EffectType.CPHEAL;
+		return true;
 	}
 	
 	@Override
-	public boolean onStart()
+	public boolean onStart(BuffInfo info)
 	{
-		L2Character target = getEffected();
+		L2Character target = info.getEffected();
 		if ((target == null) || target.isDead() || target.isDoor())
 		{
 			return false;
 		}
 		
-		double amount = calc();
+		double amount = getValue();
 		
 		// Prevents overheal and negative amount
 		amount = Math.max(Math.min(amount, target.getMaxRecoverableCp() - target.getCurrentCp()), 0);

+ 14 - 24
L2J_DataPack_BETA/dist/game/data/scripts/handlers/effecthandlers/CpHealOverTime.java

@@ -18,30 +18,20 @@
  */
 package handlers.effecthandlers;
 
-import com.l2jserver.gameserver.model.effects.EffectTemplate;
-import com.l2jserver.gameserver.model.effects.L2Effect;
+import com.l2jserver.gameserver.model.StatsSet;
+import com.l2jserver.gameserver.model.conditions.Condition;
+import com.l2jserver.gameserver.model.effects.AbstractEffect;
 import com.l2jserver.gameserver.model.effects.L2EffectType;
-import com.l2jserver.gameserver.model.stats.Env;
+import com.l2jserver.gameserver.model.skills.BuffInfo;
 
 /**
  * Cp Heal Over Time effect implementation.
  */
-public class CpHealOverTime extends L2Effect
+public final class CpHealOverTime extends AbstractEffect
 {
-	public CpHealOverTime(Env env, EffectTemplate template)
+	public CpHealOverTime(Condition attachCond, Condition applyCond, StatsSet set, StatsSet params)
 	{
-		super(env, template);
-	}
-	
-	public CpHealOverTime(Env env, L2Effect effect)
-	{
-		super(env, effect);
-	}
-	
-	@Override
-	public boolean canBeStolen()
-	{
-		return true;
+		super(attachCond, applyCond, set, params);
 	}
 	
 	@Override
@@ -51,15 +41,15 @@ public class CpHealOverTime extends L2Effect
 	}
 	
 	@Override
-	public boolean onActionTime()
+	public boolean onActionTime(BuffInfo info)
 	{
-		if (getEffected().isDead())
+		if (info.getEffected().isDead())
 		{
 			return false;
 		}
 		
-		double cp = getEffected().getCurrentCp();
-		double maxcp = getEffected().getMaxRecoverableCp();
+		double cp = info.getEffected().getCurrentCp();
+		double maxcp = info.getEffected().getMaxRecoverableCp();
 		
 		// Not needed to set the CP and send update packet if player is already at max CP
 		if (cp >= maxcp)
@@ -67,9 +57,9 @@ public class CpHealOverTime extends L2Effect
 			return false;
 		}
 		
-		cp += calc() * getEffectTemplate().getTotalTickCount();
+		cp += getValue() * getTicks();
 		cp = Math.min(cp, maxcp);
-		getEffected().setCurrentCp(cp);
-		return getSkill().isToggle();
+		info.getEffected().setCurrentCp(cp);
+		return true;
 	}
 }

+ 10 - 9
L2J_DataPack_BETA/dist/game/data/scripts/handlers/effecthandlers/CpHealPercent.java

@@ -18,11 +18,12 @@
  */
 package handlers.effecthandlers;
 
+import com.l2jserver.gameserver.model.StatsSet;
 import com.l2jserver.gameserver.model.actor.L2Character;
-import com.l2jserver.gameserver.model.effects.EffectTemplate;
-import com.l2jserver.gameserver.model.effects.L2Effect;
+import com.l2jserver.gameserver.model.conditions.Condition;
+import com.l2jserver.gameserver.model.effects.AbstractEffect;
 import com.l2jserver.gameserver.model.effects.L2EffectType;
-import com.l2jserver.gameserver.model.stats.Env;
+import com.l2jserver.gameserver.model.skills.BuffInfo;
 import com.l2jserver.gameserver.network.SystemMessageId;
 import com.l2jserver.gameserver.network.serverpackets.SystemMessage;
 
@@ -30,11 +31,11 @@ import com.l2jserver.gameserver.network.serverpackets.SystemMessage;
  * Cp Heal Percent effect implementation.
  * @author UnAfraid
  */
-public class CpHealPercent extends L2Effect
+public final class CpHealPercent extends AbstractEffect
 {
-	public CpHealPercent(Env env, EffectTemplate template)
+	public CpHealPercent(Condition attachCond, Condition applyCond, StatsSet set, StatsSet params)
 	{
-		super(env, template);
+		super(attachCond, applyCond, set, params);
 	}
 	
 	@Override
@@ -50,16 +51,16 @@ public class CpHealPercent extends L2Effect
 	}
 	
 	@Override
-	public boolean onStart()
+	public boolean onStart(BuffInfo info)
 	{
-		L2Character target = getEffected();
+		L2Character target = info.getEffected();
 		if ((target == null) || target.isDead() || target.isDoor())
 		{
 			return false;
 		}
 		
 		double amount = 0;
-		double power = calc();
+		double power = getValue();
 		boolean full = (power == 100.0);
 		
 		amount = full ? target.getMaxCp() : (target.getMaxCp() * power) / 100.0;

+ 12 - 18
L2J_DataPack_BETA/dist/game/data/scripts/handlers/effecthandlers/CrystalGradeModify.java

@@ -18,33 +18,27 @@
  */
 package handlers.effecthandlers;
 
+import com.l2jserver.gameserver.model.StatsSet;
 import com.l2jserver.gameserver.model.actor.instance.L2PcInstance;
-import com.l2jserver.gameserver.model.effects.EffectTemplate;
-import com.l2jserver.gameserver.model.effects.L2Effect;
-import com.l2jserver.gameserver.model.effects.L2EffectType;
-import com.l2jserver.gameserver.model.stats.Env;
+import com.l2jserver.gameserver.model.conditions.Condition;
+import com.l2jserver.gameserver.model.effects.AbstractEffect;
+import com.l2jserver.gameserver.model.skills.BuffInfo;
 
 /**
  * Crystal Grade Modify effect implementation.
  * @author Zoey76
  */
-public class CrystalGradeModify extends L2Effect
+public final class CrystalGradeModify extends AbstractEffect
 {
-	public CrystalGradeModify(Env env, EffectTemplate template)
+	public CrystalGradeModify(Condition attachCond, Condition applyCond, StatsSet set, StatsSet params)
 	{
-		super(env, template);
+		super(attachCond, applyCond, set, params);
 	}
 	
 	@Override
-	public L2EffectType getEffectType()
+	public void onExit(BuffInfo info)
 	{
-		return L2EffectType.NONE;
-	}
-	
-	@Override
-	public void onExit()
-	{
-		final L2PcInstance player = getEffected().getActingPlayer();
+		final L2PcInstance player = info.getEffected().getActingPlayer();
 		if (player != null)
 		{
 			player.setExpertisePenaltyBonus(0);
@@ -52,12 +46,12 @@ public class CrystalGradeModify extends L2Effect
 	}
 	
 	@Override
-	public boolean onStart()
+	public boolean onStart(BuffInfo info)
 	{
-		final L2PcInstance player = getEffected().getActingPlayer();
+		final L2PcInstance player = info.getEffected().getActingPlayer();
 		if (player != null)
 		{
-			player.setExpertisePenaltyBonus((int) calc());
+			player.setExpertisePenaltyBonus((int) getValue());
 			return true;
 		}
 		return false;

+ 11 - 10
L2J_DataPack_BETA/dist/game/data/scripts/handlers/effecthandlers/CubicMastery.java

@@ -1,19 +1,20 @@
 package handlers.effecthandlers;
 
-import com.l2jserver.gameserver.model.effects.EffectTemplate;
-import com.l2jserver.gameserver.model.effects.L2Effect;
+import com.l2jserver.gameserver.model.StatsSet;
+import com.l2jserver.gameserver.model.conditions.Condition;
+import com.l2jserver.gameserver.model.effects.AbstractEffect;
 import com.l2jserver.gameserver.model.effects.L2EffectType;
-import com.l2jserver.gameserver.model.stats.Env;
+import com.l2jserver.gameserver.model.skills.BuffInfo;
 
 /**
  * Cubic Mastery effect implementation.
  * @author Zoey76
  */
-public class CubicMastery extends L2Effect
+public final class CubicMastery extends AbstractEffect
 {
-	public CubicMastery(Env env, EffectTemplate template)
+	public CubicMastery(Condition attachCond, Condition applyCond, StatsSet set, StatsSet params)
 	{
-		super(env, template);
+		super(attachCond, applyCond, set, params);
 	}
 	
 	@Override
@@ -23,14 +24,14 @@ public class CubicMastery extends L2Effect
 	}
 	
 	@Override
-	public boolean onActionTime()
+	public boolean onActionTime(BuffInfo info)
 	{
-		return getSkill().isPassive();
+		return info.getSkill().isPassive();
 	}
 	
 	@Override
-	public boolean onStart()
+	public boolean onStart(BuffInfo info)
 	{
-		return (getEffector() != null) && (getEffected() != null) && getEffected().isPlayer();
+		return (info.getEffector() != null) && (info.getEffected() != null) && info.getEffected().isPlayer();
 	}
 }

+ 21 - 19
L2J_DataPack_BETA/dist/game/data/scripts/handlers/effecthandlers/DamOverTime.java

@@ -18,23 +18,24 @@
  */
 package handlers.effecthandlers;
 
-import com.l2jserver.gameserver.model.effects.EffectTemplate;
-import com.l2jserver.gameserver.model.effects.L2Effect;
+import com.l2jserver.gameserver.model.StatsSet;
+import com.l2jserver.gameserver.model.conditions.Condition;
+import com.l2jserver.gameserver.model.effects.AbstractEffect;
 import com.l2jserver.gameserver.model.effects.L2EffectType;
-import com.l2jserver.gameserver.model.stats.Env;
+import com.l2jserver.gameserver.model.skills.BuffInfo;
 import com.l2jserver.gameserver.network.SystemMessageId;
 
 /**
  * Dam Over Time effect implementation.
  */
-public class DamOverTime extends L2Effect
+public final class DamOverTime extends AbstractEffect
 {
 	private final boolean _canKill;
 	
-	public DamOverTime(Env env, EffectTemplate template)
+	public DamOverTime(Condition attachCond, Condition applyCond, StatsSet set, StatsSet params)
 	{
-		super(env, template);
-		_canKill = template.hasParameters() && template.getParameters().getBoolean("canKill", false);
+		super(attachCond, applyCond, set, params);
+		_canKill = hasParameters() && getParameters().getBoolean("canKill", false);
 	}
 	
 	@Override
@@ -44,19 +45,19 @@ public class DamOverTime extends L2Effect
 	}
 	
 	@Override
-	public boolean onActionTime()
+	public boolean onActionTime(BuffInfo info)
 	{
-		if (getEffected().isDead())
+		if (info.getEffected().isDead())
 		{
 			return false;
 		}
 		
-		double damage = calc() * getEffectTemplate().getTotalTickCount();
-		if (damage >= (getEffected().getCurrentHp() - 1))
+		double damage = getValue() * getTicks();
+		if (damage >= (info.getEffected().getCurrentHp() - 1))
 		{
-			if (getSkill().isToggle())
+			if (info.getSkill().isToggle())
 			{
-				getEffected().sendPacket(SystemMessageId.SKILL_REMOVED_DUE_LACK_HP);
+				info.getEffected().sendPacket(SystemMessageId.SKILL_REMOVED_DUE_LACK_HP);
 				return false;
 			}
 			
@@ -64,15 +65,16 @@ public class DamOverTime extends L2Effect
 			if (!_canKill)
 			{
 				// Fix for players dying by DOTs if HP < 1 since reduceCurrentHP method will kill them
-				if (getEffected().getCurrentHp() <= 1)
+				if (info.getEffected().getCurrentHp() <= 1)
 				{
-					return true;
+					return info.getSkill().isToggle();
 				}
-				damage = getEffected().getCurrentHp() - 1;
+				damage = info.getEffected().getCurrentHp() - 1;
 			}
 		}
-		getEffected().reduceCurrentHpByDOT(damage, getEffector(), getSkill());
-		getEffected().notifyDamageReceived(damage, getEffector(), getSkill(), false);
-		return getSkill().isToggle();
+		
+		info.getEffected().reduceCurrentHpByDOT(damage, info.getEffector(), info.getSkill());
+		info.getEffected().notifyDamageReceived(damage, info.getEffector(), info.getSkill(), false);
+		return info.getSkill().isToggle();
 	}
 }

+ 20 - 19
L2J_DataPack_BETA/dist/game/data/scripts/handlers/effecthandlers/DamOverTimePercent.java

@@ -18,24 +18,25 @@
  */
 package handlers.effecthandlers;
 
-import com.l2jserver.gameserver.model.effects.EffectTemplate;
-import com.l2jserver.gameserver.model.effects.L2Effect;
+import com.l2jserver.gameserver.model.StatsSet;
+import com.l2jserver.gameserver.model.conditions.Condition;
+import com.l2jserver.gameserver.model.effects.AbstractEffect;
 import com.l2jserver.gameserver.model.effects.L2EffectType;
-import com.l2jserver.gameserver.model.stats.Env;
+import com.l2jserver.gameserver.model.skills.BuffInfo;
 import com.l2jserver.gameserver.network.SystemMessageId;
 
 /**
  * Dam Over Time Percent effect implementation.
  * @author Adry_85
  */
-public class DamOverTimePercent extends L2Effect
+public final class DamOverTimePercent extends AbstractEffect
 {
 	private final boolean _canKill;
 	
-	public DamOverTimePercent(Env env, EffectTemplate template)
+	public DamOverTimePercent(Condition attachCond, Condition applyCond, StatsSet set, StatsSet params)
 	{
-		super(env, template);
-		_canKill = template.hasParameters() && template.getParameters().getBoolean("canKill", false);
+		super(attachCond, applyCond, set, params);
+		_canKill = hasParameters() && getParameters().getBoolean("canKill", false);
 	}
 	
 	@Override
@@ -45,19 +46,19 @@ public class DamOverTimePercent extends L2Effect
 	}
 	
 	@Override
-	public boolean onActionTime()
+	public boolean onActionTime(BuffInfo info)
 	{
-		if (getEffected().isDead())
+		if (info.getEffected().isDead())
 		{
 			return false;
 		}
 		
-		double damage = getEffected().getCurrentHp() * calc() * getEffectTemplate().getTotalTickCount();
-		if (damage >= (getEffected().getCurrentHp() - 1))
+		double damage = info.getEffected().getCurrentHp() * getValue() * getTicks();
+		if (damage >= (info.getEffected().getCurrentHp() - 1))
 		{
-			if (getSkill().isToggle())
+			if (info.getSkill().isToggle())
 			{
-				getEffected().sendPacket(SystemMessageId.SKILL_REMOVED_DUE_LACK_HP);
+				info.getEffected().sendPacket(SystemMessageId.SKILL_REMOVED_DUE_LACK_HP);
 				return false;
 			}
 			
@@ -65,17 +66,17 @@ public class DamOverTimePercent extends L2Effect
 			if (!_canKill)
 			{
 				// Fix for players dying by DOTs if HP < 1 since reduceCurrentHP method will kill them
-				if (getEffected().getCurrentHp() <= 1)
+				if (info.getEffected().getCurrentHp() <= 1)
 				{
-					return getSkill().isToggle();
+					return info.getSkill().isToggle();
 				}
 				
-				damage = getEffected().getCurrentHp() - 1;
+				damage = info.getEffected().getCurrentHp() - 1;
 			}
 		}
-		getEffected().reduceCurrentHpByDOT(damage, getEffector(), getSkill());
-		getEffected().notifyDamageReceived(damage, getEffector(), getSkill(), false);
+		info.getEffected().reduceCurrentHpByDOT(damage, info.getEffector(), info.getSkill());
+		info.getEffected().notifyDamageReceived(damage, info.getEffector(), info.getSkill(), false);
 		
-		return getSkill().isToggle();
+		return info.getSkill().isToggle();
 	}
 }

+ 21 - 20
L2J_DataPack_BETA/dist/game/data/scripts/handlers/effecthandlers/DeathLink.java

@@ -19,11 +19,12 @@
 package handlers.effecthandlers;
 
 import com.l2jserver.gameserver.enums.ShotType;
+import com.l2jserver.gameserver.model.StatsSet;
 import com.l2jserver.gameserver.model.actor.L2Character;
-import com.l2jserver.gameserver.model.effects.EffectTemplate;
-import com.l2jserver.gameserver.model.effects.L2Effect;
+import com.l2jserver.gameserver.model.conditions.Condition;
+import com.l2jserver.gameserver.model.effects.AbstractEffect;
 import com.l2jserver.gameserver.model.effects.L2EffectType;
-import com.l2jserver.gameserver.model.stats.Env;
+import com.l2jserver.gameserver.model.skills.BuffInfo;
 import com.l2jserver.gameserver.model.stats.Formulas;
 import com.l2jserver.gameserver.model.stats.Stats;
 import com.l2jserver.util.Rnd;
@@ -32,11 +33,11 @@ import com.l2jserver.util.Rnd;
  * Death Link effect implementation.
  * @author Adry_85
  */
-public class DeathLink extends L2Effect
+public final class DeathLink extends AbstractEffect
 {
-	public DeathLink(Env env, EffectTemplate template)
+	public DeathLink(Condition attachCond, Condition applyCond, StatsSet set, StatsSet params)
 	{
-		super(env, template);
+		super(attachCond, applyCond, set, params);
 	}
 	
 	@Override
@@ -52,27 +53,27 @@ public class DeathLink extends L2Effect
 	}
 	
 	@Override
-	public boolean onStart()
+	public boolean onStart(BuffInfo info)
 	{
-		L2Character target = getEffected();
-		L2Character activeChar = getEffector();
+		L2Character target = info.getEffected();
+		L2Character activeChar = info.getEffector();
 		
 		if (activeChar.isAlikeDead())
 		{
 			return false;
 		}
 		
-		boolean sps = getSkill().useSpiritShot() && activeChar.isChargedShot(ShotType.SPIRITSHOTS);
-		boolean bss = getSkill().useSpiritShot() && activeChar.isChargedShot(ShotType.BLESSED_SPIRITSHOTS);
+		boolean sps = info.getSkill().useSpiritShot() && activeChar.isChargedShot(ShotType.SPIRITSHOTS);
+		boolean bss = info.getSkill().useSpiritShot() && activeChar.isChargedShot(ShotType.BLESSED_SPIRITSHOTS);
 		
 		if (target.isPlayer() && target.getActingPlayer().isFakeDeath())
 		{
 			target.stopFakeDeath(true);
 		}
 		
-		final boolean mcrit = Formulas.calcMCrit(activeChar.getMCriticalHit(target, getSkill()));
-		final byte shld = Formulas.calcShldUse(activeChar, target, getSkill());
-		int damage = (int) Formulas.calcMagicDam(activeChar, target, getSkill(), shld, sps, bss, mcrit);
+		final boolean mcrit = Formulas.calcMCrit(activeChar.getMCriticalHit(target, info.getSkill()));
+		final byte shld = Formulas.calcShldUse(activeChar, target, info.getSkill());
+		int damage = (int) Formulas.calcMagicDam(activeChar, target, info.getSkill(), shld, sps, bss, mcrit);
 		
 		if (damage > 0)
 		{
@@ -84,20 +85,20 @@ public class DeathLink extends L2Effect
 			}
 			
 			// Shield Deflect Magic: Reflect all damage on caster.
-			if (target.getStat().calcStat(Stats.VENGEANCE_SKILL_MAGIC_DAMAGE, 0, target, getSkill()) > Rnd.get(100))
+			if (target.getStat().calcStat(Stats.VENGEANCE_SKILL_MAGIC_DAMAGE, 0, target, info.getSkill()) > Rnd.get(100))
 			{
-				activeChar.reduceCurrentHp(damage, target, getSkill());
-				activeChar.notifyDamageReceived(damage, target, getSkill(), mcrit);
+				activeChar.reduceCurrentHp(damage, target, info.getSkill());
+				activeChar.notifyDamageReceived(damage, target, info.getSkill(), mcrit);
 			}
 			else
 			{
-				target.reduceCurrentHp(damage, activeChar, getSkill());
-				target.notifyDamageReceived(damage, activeChar, getSkill(), mcrit);
+				target.reduceCurrentHp(damage, activeChar, info.getSkill());
+				target.notifyDamageReceived(damage, activeChar, info.getSkill(), mcrit);
 				activeChar.sendDamageMessage(target, damage, mcrit, false, false);
 			}
 		}
 		
-		if (getSkill().isSuicideAttack())
+		if (info.getSkill().isSuicideAttack())
 		{
 			activeChar.doDie(activeChar);
 		}

+ 6 - 6
L2J_DataPack_BETA/dist/game/data/scripts/handlers/effecthandlers/Debuff.java

@@ -18,19 +18,19 @@
  */
 package handlers.effecthandlers;
 
-import com.l2jserver.gameserver.model.effects.EffectTemplate;
-import com.l2jserver.gameserver.model.effects.L2Effect;
+import com.l2jserver.gameserver.model.StatsSet;
+import com.l2jserver.gameserver.model.conditions.Condition;
+import com.l2jserver.gameserver.model.effects.AbstractEffect;
 import com.l2jserver.gameserver.model.effects.L2EffectType;
-import com.l2jserver.gameserver.model.stats.Env;
 
 /**
  * Debuff effect implementation.
  */
-public class Debuff extends L2Effect
+public final class Debuff extends AbstractEffect
 {
-	public Debuff(Env env, EffectTemplate template)
+	public Debuff(Condition attachCond, Condition applyCond, StatsSet set, StatsSet params)
 	{
-		super(env, template);
+		super(attachCond, applyCond, set, params);
 	}
 	
 	@Override

+ 36 - 38
L2J_DataPack_BETA/dist/game/data/scripts/handlers/effecthandlers/DefenceTrait.java

@@ -21,35 +21,35 @@ package handlers.effecthandlers;
 import java.util.HashMap;
 import java.util.Map;
 import java.util.Map.Entry;
-import java.util.logging.Logger;
 
+import com.l2jserver.gameserver.model.StatsSet;
 import com.l2jserver.gameserver.model.actor.stat.CharStat;
-import com.l2jserver.gameserver.model.effects.EffectTemplate;
-import com.l2jserver.gameserver.model.effects.L2Effect;
-import com.l2jserver.gameserver.model.effects.L2EffectType;
-import com.l2jserver.gameserver.model.stats.Env;
+import com.l2jserver.gameserver.model.conditions.Condition;
+import com.l2jserver.gameserver.model.effects.AbstractEffect;
+import com.l2jserver.gameserver.model.skills.BuffInfo;
 import com.l2jserver.gameserver.model.stats.TraitType;
 
 /**
- * Defence Trait effect implementation
+ * Defence Trait effect implementation.
  * @author Nos
  */
-public class DefenceTrait extends L2Effect
+public final class DefenceTrait extends AbstractEffect
 {
-	private static final Logger _log = Logger.getLogger(DefenceTrait.class.getName());
-	
 	private final Map<TraitType, Float> _defenceTraits = new HashMap<>();
 	
-	/**
-	 * @param env
-	 * @param template
-	 */
-	public DefenceTrait(Env env, EffectTemplate template)
+	public DefenceTrait(Condition attachCond, Condition applyCond, StatsSet set, StatsSet params)
 	{
-		super(env, template);
-		if (template.hasParameters())
+		super(attachCond, applyCond, set, params);
+		
+		if (!hasParameters())
+		{
+			_log.warning(getClass().getSimpleName() + ": must have parameters.");
+			return;
+		}
+		
+		for (Entry<String, Object> param : getParameters().getSet().entrySet())
 		{
-			for (Entry<String, Object> param : template.getParameters().getSet().entrySet())
+			try
 			{
 				try
 				{
@@ -70,59 +70,57 @@ public class DefenceTrait extends L2Effect
 					_log.warning(getClass().getSimpleName() + ": value of L2TraitType enum required but found: " + param.getValue());
 				}
 			}
+			catch (NumberFormatException e)
+			{
+				_log.warning(getClass().getSimpleName() + ": value of " + param.getKey() + " enum must be int value " + param.getValue() + " found.");
+			}
+			catch (Exception e)
+			{
+				_log.warning(getClass().getSimpleName() + ": value of L2TraitType enum required but found: " + param.getValue());
+			}
 		}
-		else
-		{
-			_log.warning(getClass().getSimpleName() + ": must have parameters.");
-		}
-	}
-	
-	@Override
-	public L2EffectType getEffectType()
-	{
-		return L2EffectType.NONE;
 	}
 	
 	@Override
-	public boolean onStart()
+	public void onExit(BuffInfo info)
 	{
-		final CharStat charStat = getEffected().getStat();
+		final CharStat charStat = info.getEffected().getStat();
 		synchronized (charStat.getDefenceTraits())
 		{
 			for (Entry<TraitType, Float> trait : _defenceTraits.entrySet())
 			{
 				if (trait.getValue() < 2.0f)
 				{
-					charStat.getDefenceTraits()[trait.getKey().getId()] *= trait.getValue();
-					charStat.getDefenceTraitsCount()[trait.getKey().getId()]++;
+					charStat.getDefenceTraits()[trait.getKey().getId()] /= trait.getValue();
+					charStat.getDefenceTraitsCount()[trait.getKey().getId()]--;
 				}
 				else
 				{
-					charStat.getTraitsInvul()[trait.getKey().getId()]++;
+					charStat.getTraitsInvul()[trait.getKey().getId()]--;
 				}
 			}
 		}
-		return true;
 	}
 	
 	@Override
-	public void onExit()
+	public boolean onStart(BuffInfo info)
 	{
-		final CharStat charStat = getEffected().getStat();
+		final CharStat charStat = info.getEffected().getStat();
 		synchronized (charStat.getDefenceTraits())
 		{
 			for (Entry<TraitType, Float> trait : _defenceTraits.entrySet())
 			{
 				if (trait.getValue() < 2.0f)
 				{
-					charStat.getDefenceTraits()[trait.getKey().getId()] /= trait.getValue();
-					charStat.getDefenceTraitsCount()[trait.getKey().getId()]--;
+					charStat.getDefenceTraits()[trait.getKey().getId()] *= trait.getValue();
+					charStat.getDefenceTraitsCount()[trait.getKey().getId()]++;
 				}
 				else
 				{
-					charStat.getTraitsInvul()[trait.getKey().getId()]--;
+					charStat.getTraitsInvul()[trait.getKey().getId()]++;
 				}
 			}
 		}
+		return true;
 	}
 }

+ 13 - 12
L2J_DataPack_BETA/dist/game/data/scripts/handlers/effecthandlers/DeleteHate.java

@@ -19,31 +19,32 @@
 package handlers.effecthandlers;
 
 import com.l2jserver.gameserver.ai.CtrlIntention;
+import com.l2jserver.gameserver.model.StatsSet;
 import com.l2jserver.gameserver.model.actor.L2Attackable;
-import com.l2jserver.gameserver.model.effects.EffectTemplate;
-import com.l2jserver.gameserver.model.effects.L2Effect;
+import com.l2jserver.gameserver.model.conditions.Condition;
+import com.l2jserver.gameserver.model.effects.AbstractEffect;
 import com.l2jserver.gameserver.model.effects.L2EffectType;
-import com.l2jserver.gameserver.model.stats.Env;
+import com.l2jserver.gameserver.model.skills.BuffInfo;
 import com.l2jserver.gameserver.model.stats.Formulas;
 
 /**
  * Delete Hate effect implementation.
  * @author Adry_85
  */
-public class DeleteHate extends L2Effect
+public final class DeleteHate extends AbstractEffect
 {
 	private final int _chance;
 	
-	public DeleteHate(Env env, EffectTemplate template)
+	public DeleteHate(Condition attachCond, Condition applyCond, StatsSet set, StatsSet params)
 	{
-		super(env, template);
-		_chance = template.hasParameters() ? template.getParameters().getInt("chance", 100) : 100;
+		super(attachCond, applyCond, set, params);
+		_chance = hasParameters() ? getParameters().getInt("chance", 100) : 100;
 	}
 	
 	@Override
-	public boolean calcSuccess()
+	public boolean calcSuccess(BuffInfo info)
 	{
-		return Formulas.calcProbability(_chance, getEffector(), getEffected(), getSkill());
+		return Formulas.calcProbability(_chance, info.getEffector(), info.getEffected(), info.getSkill());
 	}
 	
 	@Override
@@ -59,14 +60,14 @@ public class DeleteHate extends L2Effect
 	}
 	
 	@Override
-	public boolean onStart()
+	public boolean onStart(BuffInfo info)
 	{
-		if (!getEffected().isL2Attackable())
+		if (!info.getEffected().isL2Attackable())
 		{
 			return false;
 		}
 		
-		L2Attackable target = (L2Attackable) getEffected();
+		L2Attackable target = (L2Attackable) info.getEffected();
 		target.clearAggroList();
 		target.setWalking();
 		target.getAI().setIntention(CtrlIntention.AI_INTENTION_ACTIVE);

+ 14 - 13
L2J_DataPack_BETA/dist/game/data/scripts/handlers/effecthandlers/DeleteHateOfMe.java

@@ -19,31 +19,32 @@
 package handlers.effecthandlers;
 
 import com.l2jserver.gameserver.ai.CtrlIntention;
+import com.l2jserver.gameserver.model.StatsSet;
 import com.l2jserver.gameserver.model.actor.L2Attackable;
-import com.l2jserver.gameserver.model.effects.EffectTemplate;
-import com.l2jserver.gameserver.model.effects.L2Effect;
+import com.l2jserver.gameserver.model.conditions.Condition;
+import com.l2jserver.gameserver.model.effects.AbstractEffect;
 import com.l2jserver.gameserver.model.effects.L2EffectType;
-import com.l2jserver.gameserver.model.stats.Env;
+import com.l2jserver.gameserver.model.skills.BuffInfo;
 import com.l2jserver.gameserver.model.stats.Formulas;
 
 /**
  * Delete Hate Of Me effect implementation.
  * @author Adry_85
  */
-public class DeleteHateOfMe extends L2Effect
+public final class DeleteHateOfMe extends AbstractEffect
 {
 	private final int _chance;
 	
-	public DeleteHateOfMe(Env env, EffectTemplate template)
+	public DeleteHateOfMe(Condition attachCond, Condition applyCond, StatsSet set, StatsSet params)
 	{
-		super(env, template);
-		_chance = template.hasParameters() ? template.getParameters().getInt("chance", 100) : 100;
+		super(attachCond, applyCond, set, params);
+		_chance = hasParameters() ? getParameters().getInt("chance", 100) : 100;
 	}
 	
 	@Override
-	public boolean calcSuccess()
+	public boolean calcSuccess(BuffInfo info)
 	{
-		return Formulas.calcProbability(_chance, getEffector(), getEffected(), getSkill());
+		return Formulas.calcProbability(_chance, info.getEffector(), info.getEffected(), info.getSkill());
 	}
 	
 	@Override
@@ -59,15 +60,15 @@ public class DeleteHateOfMe extends L2Effect
 	}
 	
 	@Override
-	public boolean onStart()
+	public boolean onStart(BuffInfo info)
 	{
-		if (!getEffected().isL2Attackable())
+		if (!info.getEffected().isL2Attackable())
 		{
 			return false;
 		}
 		
-		L2Attackable target = (L2Attackable) getEffected();
-		target.stopHating(getEffector());
+		L2Attackable target = (L2Attackable) info.getEffected();
+		target.stopHating(info.getEffector());
 		target.setWalking();
 		target.getAI().setIntention(CtrlIntention.AI_INTENTION_ACTIVE);
 		return true;

+ 10 - 16
L2J_DataPack_BETA/dist/game/data/scripts/handlers/effecthandlers/Disarm.java

@@ -18,21 +18,21 @@
  */
 package handlers.effecthandlers;
 
+import com.l2jserver.gameserver.model.StatsSet;
+import com.l2jserver.gameserver.model.conditions.Condition;
+import com.l2jserver.gameserver.model.effects.AbstractEffect;
 import com.l2jserver.gameserver.model.effects.EffectFlag;
-import com.l2jserver.gameserver.model.effects.EffectTemplate;
-import com.l2jserver.gameserver.model.effects.L2Effect;
-import com.l2jserver.gameserver.model.effects.L2EffectType;
-import com.l2jserver.gameserver.model.stats.Env;
+import com.l2jserver.gameserver.model.skills.BuffInfo;
 
 /**
  * Disarm effect implementation.
  * @author nBd
  */
-public class Disarm extends L2Effect
+public final class Disarm extends AbstractEffect
 {
-	public Disarm(Env env, EffectTemplate template)
+	public Disarm(Condition attachCond, Condition applyCond, StatsSet set, StatsSet params)
 	{
-		super(env, template);
+		super(attachCond, applyCond, set, params);
 	}
 	
 	@Override
@@ -42,20 +42,14 @@ public class Disarm extends L2Effect
 	}
 	
 	@Override
-	public L2EffectType getEffectType()
+	public boolean onStart(BuffInfo info)
 	{
-		return L2EffectType.NONE;
-	}
-	
-	@Override
-	public boolean onStart()
-	{
-		if (!getEffected().isPlayer())
+		if (!info.getEffected().isPlayer())
 		{
 			return false;
 		}
 		
-		getEffected().getActingPlayer().disarmWeapons();
+		info.getEffected().getActingPlayer().disarmWeapons();
 		return true;
 	}
 }

+ 9 - 8
L2J_DataPack_BETA/dist/game/data/scripts/handlers/effecthandlers/DispelAll.java

@@ -18,20 +18,21 @@
  */
 package handlers.effecthandlers;
 
-import com.l2jserver.gameserver.model.effects.EffectTemplate;
-import com.l2jserver.gameserver.model.effects.L2Effect;
+import com.l2jserver.gameserver.model.StatsSet;
+import com.l2jserver.gameserver.model.conditions.Condition;
+import com.l2jserver.gameserver.model.effects.AbstractEffect;
 import com.l2jserver.gameserver.model.effects.L2EffectType;
-import com.l2jserver.gameserver.model.stats.Env;
+import com.l2jserver.gameserver.model.skills.BuffInfo;
 
 /**
  * Dispel All effect implementation.
  * @author UnAfraid
  */
-public class DispelAll extends L2Effect
+public final class DispelAll extends AbstractEffect
 {
-	public DispelAll(Env env, EffectTemplate template)
+	public DispelAll(Condition attachCond, Condition applyCond, StatsSet set, StatsSet params)
 	{
-		super(env, template);
+		super(attachCond, applyCond, set, params);
 	}
 	
 	@Override
@@ -47,9 +48,9 @@ public class DispelAll extends L2Effect
 	}
 	
 	@Override
-	public boolean onStart()
+	public boolean onStart(BuffInfo info)
 	{
-		getEffected().stopAllEffects();
+		info.getEffected().stopAllEffects();
 		return true;
 	}
 }

+ 15 - 14
L2J_DataPack_BETA/dist/game/data/scripts/handlers/effecthandlers/DispelByCategory.java

@@ -20,28 +20,29 @@ package handlers.effecthandlers;
 
 import java.util.List;
 
-import com.l2jserver.gameserver.model.effects.EffectTemplate;
-import com.l2jserver.gameserver.model.effects.L2Effect;
+import com.l2jserver.gameserver.model.StatsSet;
+import com.l2jserver.gameserver.model.conditions.Condition;
+import com.l2jserver.gameserver.model.effects.AbstractEffect;
 import com.l2jserver.gameserver.model.effects.L2EffectType;
-import com.l2jserver.gameserver.model.stats.Env;
+import com.l2jserver.gameserver.model.skills.BuffInfo;
 import com.l2jserver.gameserver.model.stats.Formulas;
 
 /**
  * Dispel By Category effect implementation.
  * @author DS, Adry_85
  */
-public class DispelByCategory extends L2Effect
+public final class DispelByCategory extends AbstractEffect
 {
 	private final String _slot;
 	private final int _rate;
 	private final int _max;
 	
-	public DispelByCategory(Env env, EffectTemplate template)
+	public DispelByCategory(Condition attachCond, Condition applyCond, StatsSet set, StatsSet params)
 	{
-		super(env, template);
-		_slot = template.getParameters().getString("slot", null);
-		_rate = template.getParameters().getInt("rate", 0);
-		_max = template.getParameters().getInt("max", 0);
+		super(attachCond, applyCond, set, params);
+		_slot = getParameters().getString("slot", null);
+		_rate = getParameters().getInt("rate", 0);
+		_max = getParameters().getInt("max", 0);
 	}
 	
 	@Override
@@ -57,17 +58,17 @@ public class DispelByCategory extends L2Effect
 	}
 	
 	@Override
-	public boolean onStart()
+	public boolean onStart(BuffInfo info)
 	{
-		if (getEffected().isDead())
+		if (info.getEffected().isDead())
 		{
 			return false;
 		}
 		
-		final List<L2Effect> canceled = Formulas.calcCancelStealEffects(getEffector(), getEffected(), getSkill(), _slot, _rate, _max);
-		for (L2Effect eff : canceled)
+		final List<BuffInfo> canceled = Formulas.calcCancelStealEffects(info.getEffector(), info.getEffected(), info.getSkill(), _slot, _rate, _max);
+		for (BuffInfo can : canceled)
 		{
-			eff.exit();
+			info.getEffected().getEffectList().stopSkillEffects(true, can.getSkill());
 		}
 		return true;
 	}

+ 29 - 27
L2J_DataPack_BETA/dist/game/data/scripts/handlers/effecthandlers/DispelBySlot.java

@@ -23,25 +23,28 @@ import java.util.EnumMap;
 import java.util.Map;
 import java.util.Map.Entry;
 
-import com.l2jserver.gameserver.model.effects.EffectTemplate;
-import com.l2jserver.gameserver.model.effects.L2Effect;
+import com.l2jserver.gameserver.model.CharEffectList;
+import com.l2jserver.gameserver.model.StatsSet;
+import com.l2jserver.gameserver.model.actor.L2Character;
+import com.l2jserver.gameserver.model.conditions.Condition;
+import com.l2jserver.gameserver.model.effects.AbstractEffect;
 import com.l2jserver.gameserver.model.effects.L2EffectType;
 import com.l2jserver.gameserver.model.skills.AbnormalType;
-import com.l2jserver.gameserver.model.stats.Env;
+import com.l2jserver.gameserver.model.skills.BuffInfo;
 
 /**
  * Dispel By Slot effect implementation.
  * @author Gnacik, Zoey76, Adry_85
  */
-public class DispelBySlot extends L2Effect
+public final class DispelBySlot extends AbstractEffect
 {
 	private final String _dispel;
-	private final Map<AbnormalType, Byte> _dispelAbnormals;
+	private final Map<AbnormalType, Short> _dispelAbnormals;
 	
-	public DispelBySlot(Env env, EffectTemplate template)
+	public DispelBySlot(Condition attachCond, Condition applyCond, StatsSet set, StatsSet params)
 	{
-		super(env, template);
-		_dispel = template.getParameters().getString("dispel", null);
+		super(attachCond, applyCond, set, params);
+		_dispel = getParameters().getString("dispel", null);
 		if ((_dispel != null) && !_dispel.isEmpty())
 		{
 			_dispelAbnormals = new EnumMap<>(AbnormalType.class);
@@ -49,12 +52,12 @@ public class DispelBySlot extends L2Effect
 			{
 				String[] ngt = ngtStack.split(",");
 				final AbnormalType type = AbnormalType.getAbnormalType(ngt[0]);
-				_dispelAbnormals.put(type, Byte.parseByte(ngt[1]));
+				_dispelAbnormals.put(type, Short.parseShort(ngt[1]));
 			}
 		}
 		else
 		{
-			_dispelAbnormals = Collections.<AbnormalType, Byte> emptyMap();
+			_dispelAbnormals = Collections.<AbnormalType, Short> emptyMap();
 		}
 	}
 	
@@ -71,40 +74,39 @@ public class DispelBySlot extends L2Effect
 	}
 	
 	@Override
-	public boolean onStart()
+	public boolean onStart(BuffInfo info)
 	{
 		if (_dispelAbnormals.isEmpty())
 		{
 			return false;
 		}
 		
-		for (L2Effect effect : getEffected().getAllEffects())
+		final L2Character effected = info.getEffected();
+		final CharEffectList effectList = effected.getEffectList();
+		// There is no need to iterate over all buffs,
+		// Just iterate once over all slots to dispel and get the buff with that abnormal if exists,
+		// Operation of O(n) for the amount of slots to dispel (which is usually small) and O(1) to get the buff.
+		for (Entry<AbnormalType, Short> entry : _dispelAbnormals.entrySet())
 		{
-			if (effect == null)
+			final BuffInfo toDispel = effectList.getBuffInfoByAbnormalType(entry.getKey());
+			if (toDispel == null)
 			{
 				continue;
 			}
 			
-			for (Entry<AbnormalType, Byte> dispel : _dispelAbnormals.entrySet())
+			// Dispel transformations (buff and by GM)
+			if ((entry.getKey() == AbnormalType.TRANSFORM))
 			{
-				if ((effect.getSkill().getAbnormalType() == AbnormalType.TRANSFORM) && ((dispel.getValue() == getEffected().getActingPlayer().getTransformationId()) || (dispel.getValue() < 0)))
+				if (effected.isTransformed() || (effected.isPlayer() || (entry.getValue() == effected.getActingPlayer().getTransformationId()) || (entry.getValue() < 0)))
 				{
-					getEffected().stopTransformation(true);
+					info.getEffected().stopTransformation(true);
 					continue;
 				}
-				else if ((effect.getSkill().getAbnormalType() == dispel.getKey()) && (dispel.getValue() >= effect.getSkill().getAbnormalLvl()))
-				{
-					effect.exit();
-				}
 			}
-		}
-		
-		// Stop transformed by GM.
-		for (Entry<AbnormalType, Byte> dispel : _dispelAbnormals.entrySet())
-		{
-			if ((dispel.getKey() == AbnormalType.TRANSFORM) && getEffected().isTransformed())
+			
+			if ((entry.getKey() == toDispel.getSkill().getAbnormalType()) && (entry.getValue() >= toDispel.getSkill().getAbnormalLvl()))
 			{
-				getEffected().stopTransformation(false);
+				effectList.stopSkillEffects(true, entry.getKey());
 			}
 		}
 		return true;

+ 36 - 18
L2J_DataPack_BETA/dist/game/data/scripts/handlers/effecthandlers/DispelBySlotProbability.java

@@ -23,28 +23,31 @@ import java.util.EnumMap;
 import java.util.Map;
 import java.util.Map.Entry;
 
-import com.l2jserver.gameserver.model.effects.EffectTemplate;
-import com.l2jserver.gameserver.model.effects.L2Effect;
+import com.l2jserver.gameserver.model.CharEffectList;
+import com.l2jserver.gameserver.model.StatsSet;
+import com.l2jserver.gameserver.model.actor.L2Character;
+import com.l2jserver.gameserver.model.conditions.Condition;
+import com.l2jserver.gameserver.model.effects.AbstractEffect;
 import com.l2jserver.gameserver.model.effects.L2EffectType;
 import com.l2jserver.gameserver.model.skills.AbnormalType;
-import com.l2jserver.gameserver.model.stats.Env;
+import com.l2jserver.gameserver.model.skills.BuffInfo;
 import com.l2jserver.util.Rnd;
 
 /**
  * Dispel By Slot Probability effect implementation.
- * @author Adry_85
+ * @author Adry_85, Zoey76
  */
-public class DispelBySlotProbability extends L2Effect
+public final class DispelBySlotProbability extends AbstractEffect
 {
 	private final String _dispel;
-	private final Map<AbnormalType, Byte> _dispelAbnormals;
+	private final Map<AbnormalType, Short> _dispelAbnormals;
 	private final int _rate;
 	
-	public DispelBySlotProbability(Env env, EffectTemplate template)
+	public DispelBySlotProbability(Condition attachCond, Condition applyCond, StatsSet set, StatsSet params)
 	{
-		super(env, template);
-		_dispel = template.getParameters().getString("dispel", null);
-		_rate = template.getParameters().getInt("rate", 0);
+		super(attachCond, applyCond, set, params);
+		_dispel = getParameters().getString("dispel", null);
+		_rate = getParameters().getInt("rate", 0);
 		if ((_dispel != null) && !_dispel.isEmpty())
 		{
 			_dispelAbnormals = new EnumMap<>(AbnormalType.class);
@@ -52,12 +55,12 @@ public class DispelBySlotProbability extends L2Effect
 			{
 				String[] ngt = ngtStack.split(",");
 				final AbnormalType type = AbnormalType.getAbnormalType(ngt[0]);
-				_dispelAbnormals.put(type, Byte.MAX_VALUE);
+				_dispelAbnormals.put(type, Short.MAX_VALUE);
 			}
 		}
 		else
 		{
-			_dispelAbnormals = Collections.<AbnormalType, Byte> emptyMap();
+			_dispelAbnormals = Collections.<AbnormalType, Short> emptyMap();
 		}
 	}
 	
@@ -74,25 +77,40 @@ public class DispelBySlotProbability extends L2Effect
 	}
 	
 	@Override
-	public boolean onStart()
+	public boolean onStart(BuffInfo info)
 	{
 		if (_dispelAbnormals.isEmpty())
 		{
 			return false;
 		}
 		
-		for (L2Effect effect : getEffected().getAllEffects())
+		final L2Character effected = info.getEffected();
+		final CharEffectList effectList = effected.getEffectList();
+		// There is no need to iterate over all buffs,
+		// Just iterate once over all slots to dispel and get the buff with that abnormal if exists,
+		// Operation of O(n) for the amount of slots to dispel (which is usually small) and O(1) to get the buff.
+		for (Entry<AbnormalType, Short> entry : _dispelAbnormals.entrySet())
 		{
-			if (effect == null)
+			final BuffInfo toDispel = effectList.getBuffInfoByAbnormalType(entry.getKey());
+			if (toDispel == null)
 			{
 				continue;
 			}
 			
-			for (Entry<AbnormalType, Byte> negate : _dispelAbnormals.entrySet())
+			if ((Rnd.get(100) < _rate))
 			{
-				if ((effect.getSkill().getAbnormalType() == negate.getKey()) && (Rnd.get(100) < _rate))
+				// Dispel transformations (buff and by GM)
+				if ((entry.getKey() == AbnormalType.TRANSFORM))
 				{
-					effect.exit();
+					if (effected.isTransformed() || (effected.isPlayer() || (entry.getValue() == effected.getActingPlayer().getTransformationId()) || (entry.getValue() < 0)))
+					{
+						info.getEffected().stopTransformation(true);
+					}
+				}
+				
+				if ((toDispel.getSkill().getAbnormalType() == entry.getKey()) && (entry.getValue() >= toDispel.getSkill().getAbnormalLvl()))
+				{
+					effectList.stopSkillEffects(true, entry.getKey());
 				}
 			}
 		}

+ 26 - 38
L2J_DataPack_BETA/dist/game/data/scripts/handlers/effecthandlers/EnemyCharge.java

@@ -18,34 +18,22 @@
  */
 package handlers.effecthandlers;
 
-import java.util.logging.Logger;
-
 import com.l2jserver.Config;
 import com.l2jserver.gameserver.GeoData;
 import com.l2jserver.gameserver.model.Location;
-import com.l2jserver.gameserver.model.effects.EffectTemplate;
-import com.l2jserver.gameserver.model.effects.L2Effect;
-import com.l2jserver.gameserver.model.effects.L2EffectType;
-import com.l2jserver.gameserver.model.stats.Env;
+import com.l2jserver.gameserver.model.StatsSet;
+import com.l2jserver.gameserver.model.conditions.Condition;
+import com.l2jserver.gameserver.model.effects.AbstractEffect;
+import com.l2jserver.gameserver.model.skills.BuffInfo;
 import com.l2jserver.gameserver.network.serverpackets.FlyToLocation;
 import com.l2jserver.gameserver.network.serverpackets.FlyToLocation.FlyType;
 import com.l2jserver.gameserver.network.serverpackets.ValidateLocation;
 
-public class EnemyCharge extends L2Effect
+public final class EnemyCharge extends AbstractEffect
 {
-	static final Logger _log = Logger.getLogger(EnemyCharge.class.getName());
-	
-	private int _x, _y, _z;
-	
-	public EnemyCharge(Env env, EffectTemplate template)
-	{
-		super(env, template);
-	}
-	
-	@Override
-	public L2EffectType getEffectType()
+	public EnemyCharge(Condition attachCond, Condition applyCond, StatsSet set, StatsSet params)
 	{
-		return L2EffectType.NONE;
+		super(attachCond, applyCond, set, params);
 	}
 	
 	@Override
@@ -55,29 +43,29 @@ public class EnemyCharge extends L2Effect
 	}
 	
 	@Override
-	public boolean onStart()
+	public boolean onStart(BuffInfo info)
 	{
-		if (getEffected().isMovementDisabled())
+		if (info.getEffected().isMovementDisabled())
 		{
 			return false;
 		}
 		
 		// Get current position of the L2Character
-		final int curX = getEffector().getX();
-		final int curY = getEffector().getY();
-		final int curZ = getEffector().getZ();
+		final int curX = info.getEffector().getX();
+		final int curY = info.getEffector().getY();
+		final int curZ = info.getEffector().getZ();
 		
 		// Calculate distance (dx,dy) between current position and destination
-		double dx = getEffected().getX() - curX;
-		double dy = getEffected().getY() - curY;
-		double dz = getEffected().getZ() - curZ;
+		double dx = info.getEffected().getX() - curX;
+		double dy = info.getEffected().getY() - curY;
+		double dz = info.getEffected().getZ() - curZ;
 		double distance = Math.sqrt((dx * dx) + (dy * dy));
 		if (distance > 2000)
 		{
-			_log.info("EffectEnemyCharge was going to use invalid coordinates for characters, getEffector: " + curX + "," + curY + " and getEffected: " + getEffected().getX() + "," + getEffected().getY());
+			_log.info("EffectEnemyCharge was going to use invalid coordinates for characters, getEffector: " + curX + "," + curY + " and getEffected: " + info.getEffected().getX() + "," + info.getEffected().getY());
 			return false;
 		}
-		int offset = Math.max((int) distance - getSkill().getFlyRadius(), 30);
+		int offset = Math.max((int) distance - info.getSkill().getFlyRadius(), 30);
 		
 		double cos;
 		double sin;
@@ -101,21 +89,21 @@ public class EnemyCharge extends L2Effect
 		cos = dx / distance;
 		
 		// Calculate the new destination with offset included
-		_x = curX + (int) ((distance - offset) * cos);
-		_y = curY + (int) ((distance - offset) * sin);
-		_z = getEffected().getZ();
+		int x = curX + (int) ((distance - offset) * cos);
+		int y = curY + (int) ((distance - offset) * sin);
+		int z = info.getEffected().getZ();
 		
 		if (Config.GEODATA > 0)
 		{
-			Location destiny = GeoData.getInstance().moveCheck(getEffector().getX(), getEffector().getY(), getEffector().getZ(), _x, _y, _z, getEffector().getInstanceId());
-			_x = destiny.getX();
-			_y = destiny.getY();
+			Location destiny = GeoData.getInstance().moveCheck(info.getEffector().getX(), info.getEffector().getY(), info.getEffector().getZ(), x, y, z, info.getEffector().getInstanceId());
+			x = destiny.getX();
+			y = destiny.getY();
 		}
-		getEffector().broadcastPacket(new FlyToLocation(getEffector(), _x, _y, _z, FlyType.CHARGE));
+		info.getEffector().broadcastPacket(new FlyToLocation(info.getEffector(), x, y, z, FlyType.CHARGE));
 		
 		// maybe is need force set X,Y,Z
-		getEffector().setXYZ(_x, _y, _z);
-		getEffector().broadcastPacket(new ValidateLocation(getEffector()));
+		info.getEffector().setXYZ(x, y, z);
+		info.getEffector().broadcastPacket(new ValidateLocation(info.getEffector()));
 		
 		return true;
 	}

+ 20 - 19
L2J_DataPack_BETA/dist/game/data/scripts/handlers/effecthandlers/EnergyAttack.java

@@ -19,12 +19,13 @@
 package handlers.effecthandlers;
 
 import com.l2jserver.gameserver.enums.ShotType;
+import com.l2jserver.gameserver.model.StatsSet;
 import com.l2jserver.gameserver.model.actor.L2Character;
-import com.l2jserver.gameserver.model.effects.EffectTemplate;
-import com.l2jserver.gameserver.model.effects.L2Effect;
+import com.l2jserver.gameserver.model.conditions.Condition;
+import com.l2jserver.gameserver.model.effects.AbstractEffect;
 import com.l2jserver.gameserver.model.effects.L2EffectType;
+import com.l2jserver.gameserver.model.skills.BuffInfo;
 import com.l2jserver.gameserver.model.stats.BaseStats;
-import com.l2jserver.gameserver.model.stats.Env;
 import com.l2jserver.gameserver.model.stats.Formulas;
 import com.l2jserver.gameserver.network.SystemMessageId;
 
@@ -32,17 +33,17 @@ import com.l2jserver.gameserver.network.SystemMessageId;
  * Energy Attack effect implementation.
  * @author Adry_85
  */
-public class EnergyAttack extends L2Effect
+public final class EnergyAttack extends AbstractEffect
 {
-	public EnergyAttack(Env env, EffectTemplate template)
+	public EnergyAttack(Condition attachCond, Condition applyCond, StatsSet set, StatsSet params)
 	{
-		super(env, template);
+		super(attachCond, applyCond, set, params);
 	}
 	
 	@Override
-	public boolean calcSuccess()
+	public boolean calcSuccess(BuffInfo info)
 	{
-		return !Formulas.calcPhysicalSkillEvasion(getEffector(), getEffected(), getSkill());
+		return !Formulas.calcPhysicalSkillEvasion(info.getEffector(), info.getEffected(), info.getSkill());
 	}
 	
 	@Override
@@ -58,24 +59,24 @@ public class EnergyAttack extends L2Effect
 	}
 	
 	@Override
-	public boolean onStart()
+	public boolean onStart(BuffInfo info)
 	{
-		L2Character target = getEffected();
-		L2Character activeChar = getEffector();
+		L2Character target = info.getEffected();
+		L2Character activeChar = info.getEffector();
 		if (activeChar.isAlikeDead())
 		{
 			return false;
 		}
 		
-		boolean ss = getSkill().isPhysical() && activeChar.isChargedShot(ShotType.SOULSHOTS);
-		byte shld = Formulas.calcShldUse(activeChar, target, getSkill());
+		boolean ss = info.getSkill().isPhysical() && activeChar.isChargedShot(ShotType.SOULSHOTS);
+		byte shld = Formulas.calcShldUse(activeChar, target, info.getSkill());
 		boolean crit = false;
-		if (getSkill().getBaseCritRate() > 0)
+		if (info.getSkill().getBaseCritRate() > 0)
 		{
-			crit = Formulas.calcCrit(getSkill().getBaseCritRate() * 10 * BaseStats.STR.calcBonus(activeChar), true, target);
+			crit = Formulas.calcCrit(info.getSkill().getBaseCritRate() * 10 * BaseStats.STR.calcBonus(activeChar), true, target);
 		}
 		// damage calculation
-		double damage = Formulas.calcPhysDam(activeChar, target, getSkill(), shld, false, ss);
+		double damage = Formulas.calcPhysDam(activeChar, target, info.getSkill(), shld, false, ss);
 		
 		double modifier = 0;
 		if (activeChar.isPlayer())
@@ -91,11 +92,11 @@ public class EnergyAttack extends L2Effect
 		if (damage > 0)
 		{
 			double finalDamage = damage * modifier;
-			target.reduceCurrentHp(finalDamage, activeChar, getSkill());
-			target.notifyDamageReceived(damage, activeChar, getSkill(), crit);
+			target.reduceCurrentHp(finalDamage, activeChar, info.getSkill());
+			target.notifyDamageReceived(damage, activeChar, info.getSkill(), crit);
 			activeChar.sendDamageMessage(target, (int) finalDamage, false, crit, false);
 			// Check if damage should be reflected
-			Formulas.calcDamageReflected(activeChar, target, getSkill(), crit);
+			Formulas.calcDamageReflected(activeChar, target, info.getSkill(), crit);
 		}
 		else
 		{

+ 11 - 17
L2J_DataPack_BETA/dist/game/data/scripts/handlers/effecthandlers/EnlargeAbnormalSlot.java

@@ -18,37 +18,31 @@
  */
 package handlers.effecthandlers;
 
-import com.l2jserver.gameserver.model.effects.EffectTemplate;
-import com.l2jserver.gameserver.model.effects.L2Effect;
-import com.l2jserver.gameserver.model.effects.L2EffectType;
-import com.l2jserver.gameserver.model.stats.Env;
+import com.l2jserver.gameserver.model.StatsSet;
+import com.l2jserver.gameserver.model.conditions.Condition;
+import com.l2jserver.gameserver.model.effects.AbstractEffect;
+import com.l2jserver.gameserver.model.skills.BuffInfo;
 
 /**
  * Enlarge Abnormal Slot effect implementation.
  * @author Zoey76
  */
-public class EnlargeAbnormalSlot extends L2Effect
+public final class EnlargeAbnormalSlot extends AbstractEffect
 {
-	public EnlargeAbnormalSlot(Env env, EffectTemplate template)
+	public EnlargeAbnormalSlot(Condition attachCond, Condition applyCond, StatsSet set, StatsSet params)
 	{
-		super(env, template);
+		super(attachCond, applyCond, set, params);
 	}
 	
 	@Override
-	public L2EffectType getEffectType()
+	public boolean onActionTime(BuffInfo info)
 	{
-		return L2EffectType.ENLARGE_ABNORMAL_SLOT;
+		return info.getSkill().isPassive();
 	}
 	
 	@Override
-	public boolean onActionTime()
+	public boolean onStart(BuffInfo info)
 	{
-		return getSkill().isPassive();
-	}
-	
-	@Override
-	public boolean onStart()
-	{
-		return (getEffector() != null) && (getEffected() != null) && getEffected().isPlayer();
+		return (info.getEffector() != null) && (info.getEffected() != null) && info.getEffected().isPlayer();
 	}
 }

+ 12 - 11
L2J_DataPack_BETA/dist/game/data/scripts/handlers/effecthandlers/Escape.java

@@ -19,24 +19,25 @@
 package handlers.effecthandlers;
 
 import com.l2jserver.gameserver.instancemanager.MapRegionManager;
+import com.l2jserver.gameserver.model.StatsSet;
 import com.l2jserver.gameserver.model.TeleportWhereType;
-import com.l2jserver.gameserver.model.effects.EffectTemplate;
-import com.l2jserver.gameserver.model.effects.L2Effect;
+import com.l2jserver.gameserver.model.conditions.Condition;
+import com.l2jserver.gameserver.model.effects.AbstractEffect;
 import com.l2jserver.gameserver.model.effects.L2EffectType;
-import com.l2jserver.gameserver.model.stats.Env;
+import com.l2jserver.gameserver.model.skills.BuffInfo;
 
 /**
  * Escape effect implementation.
  * @author Adry_85
  */
-public class Escape extends L2Effect
+public final class Escape extends AbstractEffect
 {
 	private final TeleportWhereType _escapeType;
 	
-	public Escape(Env env, EffectTemplate template)
+	public Escape(Condition attachCond, Condition applyCond, StatsSet set, StatsSet params)
 	{
-		super(env, template);
-		_escapeType = template.getParameters().getEnum("escapeType", TeleportWhereType.class, null);
+		super(attachCond, applyCond, set, params);
+		_escapeType = getParameters().getEnum("escapeType", TeleportWhereType.class, null);
 	}
 	
 	@Override
@@ -52,15 +53,15 @@ public class Escape extends L2Effect
 	}
 	
 	@Override
-	public boolean onStart()
+	public boolean onStart(BuffInfo info)
 	{
 		if (_escapeType == null)
 		{
 			return false;
 		}
-		getEffected().teleToLocation(MapRegionManager.getInstance().getTeleToLocation(getEffected(), _escapeType), true);
-		getEffected().getActingPlayer().setIsIn7sDungeon(false);
-		getEffected().setInstanceId(0);
+		info.getEffected().teleToLocation(MapRegionManager.getInstance().getTeleToLocation(info.getEffected(), _escapeType), true);
+		info.getEffected().getActingPlayer().setIsIn7sDungeon(false);
+		info.getEffected().setInstanceId(0);
 		return true;
 	}
 }

+ 24 - 22
L2J_DataPack_BETA/dist/game/data/scripts/handlers/effecthandlers/FakeDeath.java

@@ -18,10 +18,11 @@
  */
 package handlers.effecthandlers;
 
-import com.l2jserver.gameserver.model.effects.EffectTemplate;
-import com.l2jserver.gameserver.model.effects.L2Effect;
+import com.l2jserver.gameserver.model.StatsSet;
+import com.l2jserver.gameserver.model.conditions.Condition;
+import com.l2jserver.gameserver.model.effects.AbstractEffect;
 import com.l2jserver.gameserver.model.effects.L2EffectType;
-import com.l2jserver.gameserver.model.stats.Env;
+import com.l2jserver.gameserver.model.skills.BuffInfo;
 import com.l2jserver.gameserver.network.SystemMessageId;
 import com.l2jserver.gameserver.network.serverpackets.ChangeWaitType;
 import com.l2jserver.gameserver.network.serverpackets.Revive;
@@ -30,11 +31,11 @@ import com.l2jserver.gameserver.network.serverpackets.Revive;
  * Fake Death effect implementation.
  * @author mkizub
  */
-public class FakeDeath extends L2Effect
+public final class FakeDeath extends AbstractEffect
 {
-	public FakeDeath(Env env, EffectTemplate template)
+	public FakeDeath(Condition attachCond, Condition applyCond, StatsSet set, StatsSet params)
 	{
-		super(env, template);
+		super(attachCond, applyCond, set, params);
 	}
 	
 	@Override
@@ -44,44 +45,45 @@ public class FakeDeath extends L2Effect
 	}
 	
 	@Override
-	public boolean onActionTime()
+	public boolean onActionTime(BuffInfo info)
 	{
-		if (getEffected().isDead())
+		if (info.getEffected().isDead())
 		{
 			return false;
 		}
 		
-		final double manaDam = calc() * getEffectTemplate().getTotalTickCount();
-		if (manaDam > getEffected().getCurrentMp())
+		final double manaDam = getValue() * getTicks();
+		if (manaDam > info.getEffected().getCurrentMp())
 		{
-			if (getSkill().isToggle())
+			if (info.getSkill().isToggle())
 			{
-				getEffected().sendPacket(SystemMessageId.SKILL_REMOVED_DUE_LACK_MP);
+				info.getEffected().sendPacket(SystemMessageId.SKILL_REMOVED_DUE_LACK_MP);
 				return false;
 			}
 		}
 		
-		getEffected().reduceCurrentMp(manaDam);
-		return true;
+		info.getEffected().reduceCurrentMp(manaDam);
+		
+		return info.getSkill().isToggle();
 	}
 	
 	@Override
-	public void onExit()
+	public void onExit(BuffInfo info)
 	{
-		if (getEffected().isPlayer())
+		if (info.getEffected().isPlayer())
 		{
-			getEffected().getActingPlayer().setIsFakeDeath(false);
-			getEffected().getActingPlayer().setRecentFakeDeath(true);
+			info.getEffected().getActingPlayer().setIsFakeDeath(false);
+			info.getEffected().getActingPlayer().setRecentFakeDeath(true);
 		}
 		
-		getEffected().broadcastPacket(new ChangeWaitType(getEffected(), ChangeWaitType.WT_STOP_FAKEDEATH));
-		getEffected().broadcastPacket(new Revive(getEffected()));
+		info.getEffected().broadcastPacket(new ChangeWaitType(info.getEffected(), ChangeWaitType.WT_STOP_FAKEDEATH));
+		info.getEffected().broadcastPacket(new Revive(info.getEffected()));
 	}
 	
 	@Override
-	public boolean onStart()
+	public boolean onStart(BuffInfo info)
 	{
-		getEffected().startFakeDeath();
+		info.getEffected().startFakeDeath();
 		return true;
 	}
 }

+ 19 - 18
L2J_DataPack_BETA/dist/game/data/scripts/handlers/effecthandlers/FatalBlow.java

@@ -19,30 +19,31 @@
 package handlers.effecthandlers;
 
 import com.l2jserver.gameserver.enums.ShotType;
+import com.l2jserver.gameserver.model.StatsSet;
 import com.l2jserver.gameserver.model.actor.L2Character;
 import com.l2jserver.gameserver.model.actor.instance.L2PcInstance;
-import com.l2jserver.gameserver.model.effects.EffectTemplate;
-import com.l2jserver.gameserver.model.effects.L2Effect;
+import com.l2jserver.gameserver.model.conditions.Condition;
+import com.l2jserver.gameserver.model.effects.AbstractEffect;
 import com.l2jserver.gameserver.model.effects.L2EffectType;
+import com.l2jserver.gameserver.model.skills.BuffInfo;
 import com.l2jserver.gameserver.model.stats.BaseStats;
-import com.l2jserver.gameserver.model.stats.Env;
 import com.l2jserver.gameserver.model.stats.Formulas;
 
 /**
  * Fatal Blow effect implementation.
  * @author Adry_85
  */
-public class FatalBlow extends L2Effect
+public final class FatalBlow extends AbstractEffect
 {
-	public FatalBlow(Env env, EffectTemplate template)
+	public FatalBlow(Condition attachCond, Condition applyCond, StatsSet set, StatsSet params)
 	{
-		super(env, template);
+		super(attachCond, applyCond, set, params);
 	}
 	
 	@Override
-	public boolean calcSuccess()
+	public boolean calcSuccess(BuffInfo info)
 	{
-		return !Formulas.calcPhysicalSkillEvasion(getEffector(), getEffected(), getSkill()) && Formulas.calcBlowSuccess(getEffector(), getEffected(), getSkill());
+		return !Formulas.calcPhysicalSkillEvasion(info.getEffector(), info.getEffected(), info.getSkill()) && Formulas.calcBlowSuccess(info.getEffector(), info.getEffected(), info.getSkill());
 	}
 	
 	@Override
@@ -58,29 +59,29 @@ public class FatalBlow extends L2Effect
 	}
 	
 	@Override
-	public boolean onStart()
+	public boolean onStart(BuffInfo info)
 	{
-		L2Character target = getEffected();
-		L2Character activeChar = getEffector();
+		L2Character target = info.getEffected();
+		L2Character activeChar = info.getEffector();
 		
 		if (activeChar.isAlikeDead())
 		{
 			return false;
 		}
 		
-		boolean ss = getSkill().useSoulShot() && activeChar.isChargedShot(ShotType.SOULSHOTS);
-		byte shld = Formulas.calcShldUse(activeChar, target, getSkill());
-		double damage = (int) Formulas.calcBlowDamage(activeChar, target, getSkill(), shld, ss);
+		boolean ss = info.getSkill().useSoulShot() && activeChar.isChargedShot(ShotType.SOULSHOTS);
+		byte shld = Formulas.calcShldUse(activeChar, target, info.getSkill());
+		double damage = (int) Formulas.calcBlowDamage(activeChar, target, info.getSkill(), shld, ss);
 		
 		// Crit rate base crit rate for skill, modified with STR bonus
-		boolean crit = Formulas.calcCrit(getSkill().getBaseCritRate() * 10 * BaseStats.STR.calcBonus(activeChar), true, target);
+		boolean crit = Formulas.calcCrit(info.getSkill().getBaseCritRate() * 10 * BaseStats.STR.calcBonus(activeChar), true, target);
 		if (crit)
 		{
 			damage *= 2;
 		}
 		
-		target.reduceCurrentHp(damage, activeChar, getSkill());
-		target.notifyDamageReceived(damage, activeChar, getSkill(), crit);
+		target.reduceCurrentHp(damage, activeChar, info.getSkill());
+		target.notifyDamageReceived(damage, activeChar, info.getSkill(), crit);
 		
 		// Manage attack or cast break of the target (calculating rate, sending message...)
 		if (!target.isRaid() && Formulas.calcAtkBreak(target, damage))
@@ -96,7 +97,7 @@ public class FatalBlow extends L2Effect
 		}
 		
 		// Check if damage should be reflected
-		Formulas.calcDamageReflected(activeChar, target, getSkill(), true);
+		Formulas.calcDamageReflected(activeChar, target, info.getSkill(), true);
 		return true;
 	}
 }

+ 27 - 36
L2J_DataPack_BETA/dist/game/data/scripts/handlers/effecthandlers/Fear.java

@@ -23,31 +23,29 @@ import com.l2jserver.gameserver.GeoData;
 import com.l2jserver.gameserver.ai.CtrlEvent;
 import com.l2jserver.gameserver.ai.CtrlIntention;
 import com.l2jserver.gameserver.model.Location;
+import com.l2jserver.gameserver.model.StatsSet;
 import com.l2jserver.gameserver.model.actor.instance.L2DefenderInstance;
 import com.l2jserver.gameserver.model.actor.instance.L2FortCommanderInstance;
 import com.l2jserver.gameserver.model.actor.instance.L2NpcInstance;
 import com.l2jserver.gameserver.model.actor.instance.L2SiegeFlagInstance;
 import com.l2jserver.gameserver.model.actor.instance.L2SiegeSummonInstance;
+import com.l2jserver.gameserver.model.conditions.Condition;
+import com.l2jserver.gameserver.model.effects.AbstractEffect;
 import com.l2jserver.gameserver.model.effects.EffectFlag;
-import com.l2jserver.gameserver.model.effects.EffectTemplate;
-import com.l2jserver.gameserver.model.effects.L2Effect;
 import com.l2jserver.gameserver.model.effects.L2EffectType;
-import com.l2jserver.gameserver.model.stats.Env;
+import com.l2jserver.gameserver.model.skills.BuffInfo;
 
 /**
  * Fear effect implementation.
  * @author littlecrow
  */
-public class Fear extends L2Effect
+public final class Fear extends AbstractEffect
 {
 	public static final int FEAR_RANGE = 500;
 	
-	private int _dX = -1;
-	private int _dY = -1;
-	
-	public Fear(Env env, EffectTemplate template)
+	public Fear(Condition attachCond, Condition applyCond, StatsSet set, StatsSet params)
 	{
-		super(env, template);
+		super(attachCond, applyCond, set, params);
 	}
 	
 	@Override
@@ -63,18 +61,20 @@ public class Fear extends L2Effect
 	}
 	
 	@Override
-	public boolean onActionTime()
+	public boolean onActionTime(BuffInfo info)
 	{
-		int posX = getEffected().getX();
-		int posY = getEffected().getY();
-		int posZ = getEffected().getZ();
+		int posX = info.getEffected().getX();
+		int posY = info.getEffected().getY();
+		int posZ = info.getEffected().getZ();
 		
-		if (getEffected().getX() > getEffector().getX())
+		int _dX = -1;
+		int _dY = -1;
+		if (info.getEffected().getX() > info.getEffector().getX())
 		{
 			_dX = 1;
 		}
 		
-		if (getEffected().getY() > getEffector().getY())
+		if (info.getEffected().getY() > info.getEffector().getY())
 		{
 			_dY = 1;
 		}
@@ -84,49 +84,40 @@ public class Fear extends L2Effect
 		
 		if (Config.GEODATA > 0)
 		{
-			Location destiny = GeoData.getInstance().moveCheck(getEffected().getX(), getEffected().getY(), getEffected().getZ(), posX, posY, posZ, getEffected().getInstanceId());
+			Location destiny = GeoData.getInstance().moveCheck(info.getEffected().getX(), info.getEffected().getY(), info.getEffected().getZ(), posX, posY, posZ, info.getEffected().getInstanceId());
 			posX = destiny.getX();
 			posY = destiny.getY();
 		}
 		
-		if (!getEffected().isPet())
+		if (!info.getEffected().isPet())
 		{
-			getEffected().setRunning();
+			info.getEffected().setRunning();
 		}
 		
-		getEffected().getAI().setIntention(CtrlIntention.AI_INTENTION_MOVE_TO, new Location(posX, posY, posZ));
+		info.getEffected().getAI().setIntention(CtrlIntention.AI_INTENTION_MOVE_TO, new Location(posX, posY, posZ));
 		return false;
 	}
 	
 	@Override
-	public boolean onStart()
+	public boolean onStart(BuffInfo info)
 	{
-		if ((getEffected() instanceof L2NpcInstance) || (getEffected() instanceof L2DefenderInstance) || (getEffected() instanceof L2FortCommanderInstance) || (getEffected() instanceof L2SiegeFlagInstance) || (getEffected() instanceof L2SiegeSummonInstance))
+		if ((info.getEffected() instanceof L2NpcInstance) || (info.getEffected() instanceof L2DefenderInstance) || (info.getEffected() instanceof L2FortCommanderInstance) || (info.getEffected() instanceof L2SiegeFlagInstance) || (info.getEffected() instanceof L2SiegeSummonInstance))
 		{
 			return false;
 		}
 		
-		if (getEffected().isAfraid())
+		if (info.getEffected().isAfraid())
 		{
 			return false;
 		}
 		
-		if (getEffected().isCastingNow() && getEffected().canAbortCast())
-		{
-			getEffected().abortCast();
-		}
-		
-		if (getEffected().getX() > getEffector().getX())
+		if (info.getEffected().isCastingNow() && info.getEffected().canAbortCast())
 		{
-			_dX = 1;
-		}
-		if (getEffected().getY() > getEffector().getY())
-		{
-			_dY = 1;
+			info.getEffected().abortCast();
 		}
 		
-		getEffected().getAI().notifyEvent(CtrlEvent.EVT_AFRAID);
-		onActionTime();
-		return super.onStart();
+		info.getEffected().getAI().notifyEvent(CtrlEvent.EVT_AFRAID);
+		onActionTime(info);
+		return true;
 	}
 }

+ 13 - 30
L2J_DataPack_BETA/dist/game/data/scripts/handlers/effecthandlers/Flag.java

@@ -18,55 +18,38 @@
  */
 package handlers.effecthandlers;
 
-import com.l2jserver.gameserver.model.effects.EffectTemplate;
-import com.l2jserver.gameserver.model.effects.L2Effect;
-import com.l2jserver.gameserver.model.effects.L2EffectType;
-import com.l2jserver.gameserver.model.stats.Env;
+import com.l2jserver.gameserver.model.StatsSet;
+import com.l2jserver.gameserver.model.conditions.Condition;
+import com.l2jserver.gameserver.model.effects.AbstractEffect;
+import com.l2jserver.gameserver.model.skills.BuffInfo;
 
 /**
+ * Flag effect implementation.
  * @author BiggBoss
  */
-public final class Flag extends L2Effect
+public final class Flag extends AbstractEffect
 {
-	/**
-	 * @param env
-	 * @param template
-	 */
-	public Flag(Env env, EffectTemplate template)
+	public Flag(Condition attachCond, Condition applyCond, StatsSet set, StatsSet params)
 	{
-		super(env, template);
+		super(attachCond, applyCond, set, params);
 	}
 	
 	@Override
-	public L2EffectType getEffectType()
+	public void onExit(BuffInfo info)
 	{
-		return L2EffectType.NONE;
+		info.getEffected().getActingPlayer().updatePvPFlag(0);
 	}
 	
 	@Override
-	public boolean onStart()
+	public boolean onStart(BuffInfo info)
 	{
-		if ((getEffected() == null) || !getEffected().isPlayer())
+		if ((info.getEffected() == null) || !info.getEffected().isPlayer())
 		{
 			return false;
 		}
 		
-		getEffected().updatePvPFlag(1);
+		info.getEffected().updatePvPFlag(1);
 		
 		return true;
 	}
-	
-	@Override
-	public boolean onActionTime()
-	{
-		getEffected().updatePvPFlag(1);
-		
-		return super.onActionTime();
-	}
-	
-	@Override
-	public void onExit()
-	{
-		getEffected().getActingPlayer().updatePvPFlag(0);
-	}
 }

+ 10 - 16
L2J_DataPack_BETA/dist/game/data/scripts/handlers/effecthandlers/FocusEnergy.java

@@ -18,26 +18,20 @@
  */
 package handlers.effecthandlers;
 
-import com.l2jserver.gameserver.model.effects.EffectTemplate;
-import com.l2jserver.gameserver.model.effects.L2Effect;
-import com.l2jserver.gameserver.model.effects.L2EffectType;
-import com.l2jserver.gameserver.model.stats.Env;
+import com.l2jserver.gameserver.model.StatsSet;
+import com.l2jserver.gameserver.model.conditions.Condition;
+import com.l2jserver.gameserver.model.effects.AbstractEffect;
+import com.l2jserver.gameserver.model.skills.BuffInfo;
 
 /**
  * Focus Energy effect implementation.
  * @author DS
  */
-public class FocusEnergy extends L2Effect
+public final class FocusEnergy extends AbstractEffect
 {
-	public FocusEnergy(Env env, EffectTemplate template)
+	public FocusEnergy(Condition attachCond, Condition applyCond, StatsSet set, StatsSet params)
 	{
-		super(env, template);
-	}
-	
-	@Override
-	public L2EffectType getEffectType()
-	{
-		return L2EffectType.NONE;
+		super(attachCond, applyCond, set, params);
 	}
 	
 	@Override
@@ -47,13 +41,13 @@ public class FocusEnergy extends L2Effect
 	}
 	
 	@Override
-	public boolean onStart()
+	public boolean onStart(BuffInfo info)
 	{
-		if (!getEffected().isPlayer())
+		if (!info.getEffected().isPlayer())
 		{
 			return false;
 		}
-		getEffected().getActingPlayer().increaseCharges(1, (int) calc());
+		info.getEffected().getActingPlayer().increaseCharges(1, (int) getValue());
 		return true;
 	}
 }

+ 13 - 19
L2J_DataPack_BETA/dist/game/data/scripts/handlers/effecthandlers/FocusMaxEnergy.java

@@ -18,27 +18,21 @@
  */
 package handlers.effecthandlers;
 
-import com.l2jserver.gameserver.model.effects.EffectTemplate;
-import com.l2jserver.gameserver.model.effects.L2Effect;
-import com.l2jserver.gameserver.model.effects.L2EffectType;
+import com.l2jserver.gameserver.model.StatsSet;
+import com.l2jserver.gameserver.model.conditions.Condition;
+import com.l2jserver.gameserver.model.effects.AbstractEffect;
+import com.l2jserver.gameserver.model.skills.BuffInfo;
 import com.l2jserver.gameserver.model.skills.L2Skill;
-import com.l2jserver.gameserver.model.stats.Env;
 
 /**
  * Focus Max Energy effect implementation.
  * @author Adry_85
  */
-public class FocusMaxEnergy extends L2Effect
+public final class FocusMaxEnergy extends AbstractEffect
 {
-	public FocusMaxEnergy(Env env, EffectTemplate template)
+	public FocusMaxEnergy(Condition attachCond, Condition applyCond, StatsSet set, StatsSet params)
 	{
-		super(env, template);
-	}
-	
-	@Override
-	public L2EffectType getEffectType()
-	{
-		return L2EffectType.NONE;
+		super(attachCond, applyCond, set, params);
 	}
 	
 	@Override
@@ -48,17 +42,17 @@ public class FocusMaxEnergy extends L2Effect
 	}
 	
 	@Override
-	public boolean onStart()
+	public boolean onStart(BuffInfo info)
 	{
-		if (getEffected().isPlayer())
+		if (info.getEffected().isPlayer())
 		{
-			final L2Skill sonicMastery = getEffected().getSkills().get(992);
-			final L2Skill focusMastery = getEffected().getSkills().get(993);
+			final L2Skill sonicMastery = info.getEffected().getSkills().get(992);
+			final L2Skill focusMastery = info.getEffected().getSkills().get(993);
 			int maxCharge = (sonicMastery != null) ? sonicMastery.getLevel() : (focusMastery != null) ? focusMastery.getLevel() : 0;
 			if (maxCharge != 0)
 			{
-				int count = maxCharge - getEffected().getActingPlayer().getCharges();
-				getEffected().getActingPlayer().increaseCharges(count, maxCharge);
+				int count = maxCharge - info.getEffected().getActingPlayer().getCharges();
+				info.getEffected().getActingPlayer().increaseCharges(count, maxCharge);
 				return true;
 			}
 		}

+ 11 - 17
L2J_DataPack_BETA/dist/game/data/scripts/handlers/effecthandlers/FocusSouls.java

@@ -18,11 +18,11 @@
  */
 package handlers.effecthandlers;
 
+import com.l2jserver.gameserver.model.StatsSet;
 import com.l2jserver.gameserver.model.actor.instance.L2PcInstance;
-import com.l2jserver.gameserver.model.effects.EffectTemplate;
-import com.l2jserver.gameserver.model.effects.L2Effect;
-import com.l2jserver.gameserver.model.effects.L2EffectType;
-import com.l2jserver.gameserver.model.stats.Env;
+import com.l2jserver.gameserver.model.conditions.Condition;
+import com.l2jserver.gameserver.model.effects.AbstractEffect;
+import com.l2jserver.gameserver.model.skills.BuffInfo;
 import com.l2jserver.gameserver.model.stats.Stats;
 import com.l2jserver.gameserver.network.SystemMessageId;
 
@@ -30,17 +30,11 @@ import com.l2jserver.gameserver.network.SystemMessageId;
  * Focus Souls effect implementation.
  * @author nBd, Adry_85
  */
-public class FocusSouls extends L2Effect
+public final class FocusSouls extends AbstractEffect
 {
-	public FocusSouls(Env env, EffectTemplate template)
+	public FocusSouls(Condition attachCond, Condition applyCond, StatsSet set, StatsSet params)
 	{
-		super(env, template);
-	}
-	
-	@Override
-	public L2EffectType getEffectType()
-	{
-		return L2EffectType.NONE;
+		super(attachCond, applyCond, set, params);
 	}
 	
 	@Override
@@ -50,18 +44,18 @@ public class FocusSouls extends L2Effect
 	}
 	
 	@Override
-	public boolean onStart()
+	public boolean onStart(BuffInfo info)
 	{
-		if (!getEffected().isPlayer() || getEffected().isAlikeDead())
+		if (!info.getEffected().isPlayer() || info.getEffected().isAlikeDead())
 		{
 			return false;
 		}
 		
-		final L2PcInstance target = getEffected().getActingPlayer();
+		final L2PcInstance target = info.getEffected().getActingPlayer();
 		final int maxSouls = (int) target.calcStat(Stats.MAX_SOULS, 0, null, null);
 		if (maxSouls > 0)
 		{
-			int amount = (int) calc();
+			int amount = (int) getValue();
 			if ((target.getChargedSouls() < maxSouls))
 			{
 				int count = ((target.getChargedSouls() + amount) <= maxSouls) ? amount : (maxSouls - target.getChargedSouls());

+ 11 - 10
L2J_DataPack_BETA/dist/game/data/scripts/handlers/effecthandlers/GetAgro.java

@@ -19,21 +19,22 @@
 package handlers.effecthandlers;
 
 import com.l2jserver.gameserver.ai.CtrlIntention;
+import com.l2jserver.gameserver.model.StatsSet;
 import com.l2jserver.gameserver.model.actor.instance.L2NpcInstance;
-import com.l2jserver.gameserver.model.effects.EffectTemplate;
-import com.l2jserver.gameserver.model.effects.L2Effect;
+import com.l2jserver.gameserver.model.conditions.Condition;
+import com.l2jserver.gameserver.model.effects.AbstractEffect;
 import com.l2jserver.gameserver.model.effects.L2EffectType;
-import com.l2jserver.gameserver.model.stats.Env;
+import com.l2jserver.gameserver.model.skills.BuffInfo;
 
 /**
  * Get Agro effect implementation.
  * @author Adry_85
  */
-public class GetAgro extends L2Effect
+public final class GetAgro extends AbstractEffect
 {
-	public GetAgro(Env env, EffectTemplate template)
+	public GetAgro(Condition attachCond, Condition applyCond, StatsSet set, StatsSet params)
 	{
-		super(env, template);
+		super(attachCond, applyCond, set, params);
 	}
 	
 	@Override
@@ -49,15 +50,15 @@ public class GetAgro extends L2Effect
 	}
 	
 	@Override
-	public boolean onStart()
+	public boolean onStart(BuffInfo info)
 	{
-		if (getEffected() instanceof L2NpcInstance)
+		if (info.getEffected() instanceof L2NpcInstance)
 		{
 			return false;
 		}
 		
-		CtrlIntention intention = (getEffected().isInCombat() || getEffected().isL2Attackable()) ? CtrlIntention.AI_INTENTION_ATTACK : CtrlIntention.AI_INTENTION_FOLLOW;
-		getEffected().getAI().setIntention(intention, getEffector());
+		CtrlIntention intention = (info.getEffected().isInCombat() || info.getEffected().isL2Attackable()) ? CtrlIntention.AI_INTENTION_ATTACK : CtrlIntention.AI_INTENTION_FOLLOW;
+		info.getEffected().getAI().setIntention(intention, info.getEffector());
 		return true;
 	}
 }

+ 10 - 16
L2J_DataPack_BETA/dist/game/data/scripts/handlers/effecthandlers/GiveSp.java

@@ -18,26 +18,20 @@
  */
 package handlers.effecthandlers;
 
-import com.l2jserver.gameserver.model.effects.EffectTemplate;
-import com.l2jserver.gameserver.model.effects.L2Effect;
-import com.l2jserver.gameserver.model.effects.L2EffectType;
-import com.l2jserver.gameserver.model.stats.Env;
+import com.l2jserver.gameserver.model.StatsSet;
+import com.l2jserver.gameserver.model.conditions.Condition;
+import com.l2jserver.gameserver.model.effects.AbstractEffect;
+import com.l2jserver.gameserver.model.skills.BuffInfo;
 
 /**
  * Give SP effect implementation.
  * @author Adry_85
  */
-public class GiveSp extends L2Effect
+public final class GiveSp extends AbstractEffect
 {
-	public GiveSp(Env env, EffectTemplate template)
+	public GiveSp(Condition attachCond, Condition applyCond, StatsSet set, StatsSet params)
 	{
-		super(env, template);
-	}
-	
-	@Override
-	public L2EffectType getEffectType()
-	{
-		return L2EffectType.NONE;
+		super(attachCond, applyCond, set, params);
 	}
 	
 	@Override
@@ -47,14 +41,14 @@ public class GiveSp extends L2Effect
 	}
 	
 	@Override
-	public boolean onStart()
+	public boolean onStart(BuffInfo info)
 	{
-		if ((getEffector() == null) || (getEffected() == null) || !getEffector().isPlayer() || !getEffected().isPlayer() || getEffected().isAlikeDead())
+		if ((info.getEffector() == null) || (info.getEffected() == null) || !info.getEffector().isPlayer() || !info.getEffected().isPlayer() || info.getEffected().isAlikeDead())
 		{
 			return false;
 		}
 		
-		getEffector().getActingPlayer().addExpAndSp(0, (int) calc());
+		info.getEffector().getActingPlayer().addExpAndSp(0, (int) getValue());
 		return true;
 	}
 }

+ 16 - 15
L2J_DataPack_BETA/dist/game/data/scripts/handlers/effecthandlers/Grow.java

@@ -18,21 +18,22 @@
  */
 package handlers.effecthandlers;
 
+import com.l2jserver.gameserver.model.StatsSet;
 import com.l2jserver.gameserver.model.actor.L2Npc;
-import com.l2jserver.gameserver.model.effects.AbnormalEffect;
-import com.l2jserver.gameserver.model.effects.EffectTemplate;
-import com.l2jserver.gameserver.model.effects.L2Effect;
+import com.l2jserver.gameserver.model.conditions.Condition;
+import com.l2jserver.gameserver.model.effects.AbstractEffect;
 import com.l2jserver.gameserver.model.effects.L2EffectType;
-import com.l2jserver.gameserver.model.stats.Env;
+import com.l2jserver.gameserver.model.skills.AbnormalVisualEffect;
+import com.l2jserver.gameserver.model.skills.BuffInfo;
 
 /**
  * Grow effect implementation.
  */
-public class Grow extends L2Effect
+public final class Grow extends AbstractEffect
 {
-	public Grow(Env env, EffectTemplate template)
+	public Grow(Condition attachCond, Condition applyCond, StatsSet set, StatsSet params)
 	{
-		super(env, template);
+		super(attachCond, applyCond, set, params);
 	}
 	
 	@Override
@@ -42,30 +43,30 @@ public class Grow extends L2Effect
 	}
 	
 	@Override
-	public void onExit()
+	public void onExit(BuffInfo info)
 	{
-		if (getEffected().isNpc())
+		if (info.getEffected().isNpc())
 		{
-			L2Npc npc = (L2Npc) getEffected();
+			L2Npc npc = (L2Npc) info.getEffected();
 			// TODO: Uncomment line when fix for mobs falling underground is found
 			// npc.setCollisionHeight(npc.getTemplate().collisionHeight);
 			npc.setCollisionRadius(npc.getTemplate().getfCollisionRadius());
 			
-			getEffected().stopAbnormalEffect(AbnormalEffect.GROW);
+			info.getEffected().stopAbnormalEffect(AbnormalVisualEffect.GROW);
 		}
 	}
 	
 	@Override
-	public boolean onStart()
+	public boolean onStart(BuffInfo info)
 	{
-		if (getEffected().isNpc())
+		if (info.getEffected().isNpc())
 		{
-			L2Npc npc = (L2Npc) getEffected();
+			L2Npc npc = (L2Npc) info.getEffected();
 			// TODO: Uncomment line when fix for mobs falling underground is found
 			// npc.setCollisionHeight((int) (npc.getCollisionHeight() * 1.24));
 			npc.setCollisionRadius((npc.getCollisionRadius() * 1.19));
 			
-			getEffected().startAbnormalEffect(AbnormalEffect.GROW);
+			info.getEffected().startAbnormalEffect(AbnormalVisualEffect.GROW);
 			return true;
 		}
 		return false;

+ 11 - 22
L2J_DataPack_BETA/dist/game/data/scripts/handlers/effecthandlers/Harvesting.java

@@ -20,13 +20,13 @@ package handlers.effecthandlers;
 
 import com.l2jserver.Config;
 import com.l2jserver.gameserver.model.L2Object;
+import com.l2jserver.gameserver.model.StatsSet;
 import com.l2jserver.gameserver.model.actor.instance.L2MonsterInstance;
 import com.l2jserver.gameserver.model.actor.instance.L2PcInstance;
-import com.l2jserver.gameserver.model.effects.EffectTemplate;
-import com.l2jserver.gameserver.model.effects.L2Effect;
-import com.l2jserver.gameserver.model.effects.L2EffectType;
+import com.l2jserver.gameserver.model.conditions.Condition;
+import com.l2jserver.gameserver.model.effects.AbstractEffect;
 import com.l2jserver.gameserver.model.holders.ItemHolder;
-import com.l2jserver.gameserver.model.stats.Env;
+import com.l2jserver.gameserver.model.skills.BuffInfo;
 import com.l2jserver.gameserver.network.SystemMessageId;
 import com.l2jserver.gameserver.network.serverpackets.InventoryUpdate;
 import com.l2jserver.gameserver.network.serverpackets.ItemList;
@@ -37,18 +37,13 @@ import com.l2jserver.util.Rnd;
  * Harvesting effect implementation.
  * @author l3x, Zoey76
  */
-public class Harvesting extends L2Effect
+public final class Harvesting extends AbstractEffect
 {
-	public Harvesting(Env env, EffectTemplate template)
+	public Harvesting(Condition attachCond, Condition applyCond, StatsSet set, StatsSet params)
 	{
-		super(env, template);
+		super(attachCond, applyCond, set, params);
 	}
 	
-	/**
-	 * @param activeChar
-	 * @param target
-	 * @return
-	 */
 	private boolean calcSuccess(L2PcInstance activeChar, L2MonsterInstance target)
 	{
 		int basicSuccess = 100;
@@ -76,12 +71,6 @@ public class Harvesting extends L2Effect
 		return Rnd.nextInt(99) < basicSuccess;
 	}
 	
-	@Override
-	public L2EffectType getEffectType()
-	{
-		return L2EffectType.NONE;
-	}
-	
 	@Override
 	public boolean isInstant()
 	{
@@ -89,15 +78,15 @@ public class Harvesting extends L2Effect
 	}
 	
 	@Override
-	public boolean onStart()
+	public boolean onStart(BuffInfo info)
 	{
-		if ((getEffector() == null) || (getEffected() == null) || !getEffector().isPlayer() || !getEffected().isNpc() || !getEffected().isDead())
+		if ((info.getEffector() == null) || (info.getEffected() == null) || !info.getEffector().isPlayer() || !info.getEffected().isNpc() || !info.getEffected().isDead())
 		{
 			return false;
 		}
 		
-		final L2PcInstance player = getEffector().getActingPlayer();
-		final L2Object[] targets = getSkill().getTargetList(player, false, getEffected());
+		final L2PcInstance player = info.getEffector().getActingPlayer();
+		final L2Object[] targets = info.getSkill().getTargetList(player, false, info.getEffected());
 		if ((targets == null) || (targets.length == 0))
 		{
 			return false;

+ 18 - 17
L2J_DataPack_BETA/dist/game/data/scripts/handlers/effecthandlers/Heal.java

@@ -19,13 +19,14 @@
 package handlers.effecthandlers;
 
 import com.l2jserver.gameserver.enums.ShotType;
+import com.l2jserver.gameserver.model.StatsSet;
 import com.l2jserver.gameserver.model.actor.L2Character;
-import com.l2jserver.gameserver.model.effects.EffectTemplate;
-import com.l2jserver.gameserver.model.effects.L2Effect;
+import com.l2jserver.gameserver.model.conditions.Condition;
+import com.l2jserver.gameserver.model.effects.AbstractEffect;
 import com.l2jserver.gameserver.model.effects.L2EffectType;
 import com.l2jserver.gameserver.model.items.L2Item;
 import com.l2jserver.gameserver.model.items.instance.L2ItemInstance;
-import com.l2jserver.gameserver.model.stats.Env;
+import com.l2jserver.gameserver.model.skills.BuffInfo;
 import com.l2jserver.gameserver.model.stats.Formulas;
 import com.l2jserver.gameserver.model.stats.Stats;
 import com.l2jserver.gameserver.network.SystemMessageId;
@@ -35,11 +36,11 @@ import com.l2jserver.gameserver.network.serverpackets.SystemMessage;
  * Heal effect implementation.
  * @author UnAfraid
  */
-public class Heal extends L2Effect
+public final class Heal extends AbstractEffect
 {
-	public Heal(Env env, EffectTemplate template)
+	public Heal(Condition attachCond, Condition applyCond, StatsSet set, StatsSet params)
 	{
-		super(env, template);
+		super(attachCond, applyCond, set, params);
 	}
 	
 	@Override
@@ -55,30 +56,30 @@ public class Heal extends L2Effect
 	}
 	
 	@Override
-	public boolean onStart()
+	public boolean onStart(BuffInfo info)
 	{
-		L2Character target = getEffected();
-		L2Character activeChar = getEffector();
+		L2Character target = info.getEffected();
+		L2Character activeChar = info.getEffector();
 		if ((target == null) || target.isDead() || target.isDoor())
 		{
 			return false;
 		}
 		
-		double amount = calc();
+		double amount = getValue();
 		double staticShotBonus = 0;
 		int mAtkMul = 1;
-		boolean sps = getSkill().isMagic() && activeChar.isChargedShot(ShotType.SPIRITSHOTS);
-		boolean bss = getSkill().isMagic() && activeChar.isChargedShot(ShotType.BLESSED_SPIRITSHOTS);
+		boolean sps = info.getSkill().isMagic() && activeChar.isChargedShot(ShotType.SPIRITSHOTS);
+		boolean bss = info.getSkill().isMagic() && activeChar.isChargedShot(ShotType.BLESSED_SPIRITSHOTS);
 		
 		if (((sps || bss) && (activeChar.isPlayer() && activeChar.getActingPlayer().isMageClass())) || activeChar.isSummon())
 		{
-			staticShotBonus = getSkill().getMpConsume(); // static bonus for spiritshots
+			staticShotBonus = info.getSkill().getMpConsume(); // static bonus for spiritshots
 			mAtkMul = bss ? 4 : 2;
 			staticShotBonus *= bss ? 2.4 : 1.0;
 		}
 		else if ((sps || bss) && activeChar.isNpc())
 		{
-			staticShotBonus = 2.4 * getSkill().getMpConsume(); // always blessed spiritshots
+			staticShotBonus = 2.4 * info.getSkill().getMpConsume(); // always blessed spiritshots
 			mAtkMul = 4;
 		}
 		else
@@ -94,12 +95,12 @@ public class Heal extends L2Effect
 			mAtkMul = bss ? mAtkMul * 4 : mAtkMul + 1;
 		}
 		
-		if (!getSkill().isStatic())
+		if (!info.getSkill().isStatic())
 		{
 			amount += staticShotBonus + Math.sqrt(mAtkMul * activeChar.getMAtk(activeChar, null));
 			amount = target.calcStat(Stats.HEAL_EFFECT, amount, null, null);
 			// Heal critic, since CT2.3 Gracia Final
-			if (getSkill().isMagic() && Formulas.calcMCrit(activeChar.getMCriticalHit(target, getSkill())))
+			if (info.getSkill().isMagic() && Formulas.calcMCrit(activeChar.getMCriticalHit(target, info.getSkill())))
 			{
 				amount *= 3;
 			}
@@ -114,7 +115,7 @@ public class Heal extends L2Effect
 		
 		if (target.isPlayer())
 		{
-			if (getSkill().getId() == 4051)
+			if (info.getSkill().getId() == 4051)
 			{
 				target.sendPacket(SystemMessageId.REJUVENATING_HP);
 			}

+ 17 - 27
L2J_DataPack_BETA/dist/game/data/scripts/handlers/effecthandlers/HealOverTime.java

@@ -18,31 +18,21 @@
  */
 package handlers.effecthandlers;
 
-import com.l2jserver.gameserver.model.effects.EffectTemplate;
-import com.l2jserver.gameserver.model.effects.L2Effect;
+import com.l2jserver.gameserver.model.StatsSet;
+import com.l2jserver.gameserver.model.conditions.Condition;
+import com.l2jserver.gameserver.model.effects.AbstractEffect;
 import com.l2jserver.gameserver.model.effects.L2EffectType;
-import com.l2jserver.gameserver.model.stats.Env;
+import com.l2jserver.gameserver.model.skills.BuffInfo;
 import com.l2jserver.gameserver.network.serverpackets.ExRegMax;
 
 /**
  * Heal Over Time effect implementation.
  */
-public class HealOverTime extends L2Effect
+public final class HealOverTime extends AbstractEffect
 {
-	public HealOverTime(Env env, EffectTemplate template)
+	public HealOverTime(Condition attachCond, Condition applyCond, StatsSet set, StatsSet params)
 	{
-		super(env, template);
-	}
-	
-	public HealOverTime(Env env, L2Effect effect)
-	{
-		super(env, effect);
-	}
-	
-	@Override
-	public boolean canBeStolen()
-	{
-		return true;
+		super(attachCond, applyCond, set, params);
 	}
 	
 	@Override
@@ -52,15 +42,15 @@ public class HealOverTime extends L2Effect
 	}
 	
 	@Override
-	public boolean onActionTime()
+	public boolean onActionTime(BuffInfo info)
 	{
-		if (getEffected().isDead() || getEffected().isDoor())
+		if (info.getEffected().isDead() || info.getEffected().isDoor())
 		{
 			return false;
 		}
 		
-		double hp = getEffected().getCurrentHp();
-		double maxhp = getEffected().getMaxRecoverableHp();
+		double hp = info.getEffected().getCurrentHp();
+		double maxhp = info.getEffected().getMaxRecoverableHp();
 		
 		// Not needed to set the HP and send update packet if player is already at max HP
 		if (hp >= maxhp)
@@ -68,18 +58,18 @@ public class HealOverTime extends L2Effect
 			return false;
 		}
 		
-		hp += calc() * getEffectTemplate().getTotalTickCount();
+		hp += getValue() * getTicks();
 		hp = Math.min(hp, maxhp);
-		getEffected().setCurrentHp(hp);
-		return getSkill().isToggle();
+		info.getEffected().setCurrentHp(hp);
+		return info.getSkill().isToggle();
 	}
 	
 	@Override
-	public boolean onStart()
+	public boolean onStart(BuffInfo info)
 	{
-		if (getEffected().isPlayer() && (getEffectTemplate().getTotalTickCount() > 0))
+		if (info.getEffected().isPlayer() && (getTicks() > 0))
 		{
-			getEffected().sendPacket(new ExRegMax(calc(), getAbnormalTime(), getAbnormalTime() / getEffectTemplate().getTotalTickCount()));
+			info.getEffected().sendPacket(new ExRegMax(getValue(), info.getAbnormalTime(), info.getAbnormalTime() / getTicks()));
 		}
 		return true;
 	}

+ 12 - 11
L2J_DataPack_BETA/dist/game/data/scripts/handlers/effecthandlers/HealPercent.java

@@ -18,11 +18,12 @@
  */
 package handlers.effecthandlers;
 
+import com.l2jserver.gameserver.model.StatsSet;
 import com.l2jserver.gameserver.model.actor.L2Character;
-import com.l2jserver.gameserver.model.effects.EffectTemplate;
-import com.l2jserver.gameserver.model.effects.L2Effect;
+import com.l2jserver.gameserver.model.conditions.Condition;
+import com.l2jserver.gameserver.model.effects.AbstractEffect;
 import com.l2jserver.gameserver.model.effects.L2EffectType;
-import com.l2jserver.gameserver.model.stats.Env;
+import com.l2jserver.gameserver.model.skills.BuffInfo;
 import com.l2jserver.gameserver.network.SystemMessageId;
 import com.l2jserver.gameserver.network.serverpackets.SystemMessage;
 
@@ -30,11 +31,11 @@ import com.l2jserver.gameserver.network.serverpackets.SystemMessage;
  * Heal Percent effect implementation.
  * @author UnAfraid
  */
-public class HealPercent extends L2Effect
+public final class HealPercent extends AbstractEffect
 {
-	public HealPercent(Env env, EffectTemplate template)
+	public HealPercent(Condition attachCond, Condition applyCond, StatsSet set, StatsSet params)
 	{
-		super(env, template);
+		super(attachCond, applyCond, set, params);
 	}
 	
 	@Override
@@ -50,16 +51,16 @@ public class HealPercent extends L2Effect
 	}
 	
 	@Override
-	public boolean onStart()
+	public boolean onStart(BuffInfo info)
 	{
-		L2Character target = getEffected();
+		L2Character target = info.getEffected();
 		if ((target == null) || target.isDead() || target.isDoor())
 		{
 			return false;
 		}
 		
 		double amount = 0;
-		double power = calc();
+		double power = getValue();
 		boolean full = (power == 100.0);
 		
 		amount = full ? target.getMaxHp() : (target.getMaxHp() * power) / 100.0;
@@ -70,10 +71,10 @@ public class HealPercent extends L2Effect
 			target.setCurrentHp(amount + target.getCurrentHp());
 		}
 		SystemMessage sm;
-		if (getEffector().getObjectId() != target.getObjectId())
+		if (info.getEffector().getObjectId() != target.getObjectId())
 		{
 			sm = SystemMessage.getSystemMessage(SystemMessageId.S2_HP_RESTORED_BY_C1);
-			sm.addCharName(getEffector());
+			sm.addCharName(info.getEffector());
 		}
 		else
 		{

+ 16 - 27
L2J_DataPack_BETA/dist/game/data/scripts/handlers/effecthandlers/Hide.java

@@ -19,13 +19,13 @@
 package handlers.effecthandlers;
 
 import com.l2jserver.gameserver.ai.CtrlIntention;
+import com.l2jserver.gameserver.model.StatsSet;
 import com.l2jserver.gameserver.model.actor.L2Character;
 import com.l2jserver.gameserver.model.actor.instance.L2PcInstance;
-import com.l2jserver.gameserver.model.effects.AbnormalEffect;
-import com.l2jserver.gameserver.model.effects.EffectTemplate;
-import com.l2jserver.gameserver.model.effects.L2Effect;
-import com.l2jserver.gameserver.model.effects.L2EffectType;
-import com.l2jserver.gameserver.model.stats.Env;
+import com.l2jserver.gameserver.model.conditions.Condition;
+import com.l2jserver.gameserver.model.effects.AbstractEffect;
+import com.l2jserver.gameserver.model.skills.AbnormalVisualEffect;
+import com.l2jserver.gameserver.model.skills.BuffInfo;
 import com.l2jserver.gameserver.network.serverpackets.DeleteObject;
 import com.l2jserver.gameserver.network.serverpackets.L2GameServerPacket;
 
@@ -33,46 +33,35 @@ import com.l2jserver.gameserver.network.serverpackets.L2GameServerPacket;
  * Hide effect implementation.
  * @author ZaKaX, nBd
  */
-public class Hide extends L2Effect
+public final class Hide extends AbstractEffect
 {
-	public Hide(Env env, EffectTemplate template)
+	public Hide(Condition attachCond, Condition applyCond, StatsSet set, StatsSet params)
 	{
-		super(env, template);
-	}
-	
-	public Hide(Env env, L2Effect effect)
-	{
-		super(env, effect);
-	}
-	
-	@Override
-	public L2EffectType getEffectType()
-	{
-		return L2EffectType.HIDE;
+		super(attachCond, applyCond, set, params);
 	}
 	
 	@Override
-	public void onExit()
+	public void onExit(BuffInfo info)
 	{
-		if (getEffected().isPlayer())
+		if (info.getEffected().isPlayer())
 		{
-			L2PcInstance activeChar = getEffected().getActingPlayer();
+			L2PcInstance activeChar = info.getEffected().getActingPlayer();
 			if (!activeChar.inObserverMode())
 			{
 				activeChar.getAppearance().setVisible();
 			}
-			activeChar.stopAbnormalEffect(AbnormalEffect.STEALTH);
+			activeChar.stopAbnormalEffect(AbnormalVisualEffect.STEALTH);
 		}
 	}
 	
 	@Override
-	public boolean onStart()
+	public boolean onStart(BuffInfo info)
 	{
-		if (getEffected().isPlayer())
+		if (info.getEffected().isPlayer())
 		{
-			L2PcInstance activeChar = getEffected().getActingPlayer();
+			L2PcInstance activeChar = info.getEffected().getActingPlayer();
 			activeChar.getAppearance().setInvisible();
-			activeChar.startAbnormalEffect(AbnormalEffect.STEALTH);
+			activeChar.startAbnormalEffect(AbnormalVisualEffect.STEALTH);
 			
 			if ((activeChar.getAI().getNextIntention() != null) && (activeChar.getAI().getNextIntention().getCtrlIntention() == CtrlIntention.AI_INTENTION_ATTACK))
 			{

+ 11 - 17
L2J_DataPack_BETA/dist/game/data/scripts/handlers/effecthandlers/HolythingPossess.java

@@ -19,11 +19,11 @@
 package handlers.effecthandlers;
 
 import com.l2jserver.gameserver.instancemanager.CastleManager;
-import com.l2jserver.gameserver.model.effects.EffectTemplate;
-import com.l2jserver.gameserver.model.effects.L2Effect;
-import com.l2jserver.gameserver.model.effects.L2EffectType;
+import com.l2jserver.gameserver.model.StatsSet;
+import com.l2jserver.gameserver.model.conditions.Condition;
+import com.l2jserver.gameserver.model.effects.AbstractEffect;
 import com.l2jserver.gameserver.model.entity.Castle;
-import com.l2jserver.gameserver.model.stats.Env;
+import com.l2jserver.gameserver.model.skills.BuffInfo;
 import com.l2jserver.gameserver.network.SystemMessageId;
 import com.l2jserver.gameserver.network.serverpackets.SystemMessage;
 
@@ -31,17 +31,11 @@ import com.l2jserver.gameserver.network.serverpackets.SystemMessage;
  * Holything Possess effect implementation.
  * @author Adry_85
  */
-public class HolythingPossess extends L2Effect
+public final class HolythingPossess extends AbstractEffect
 {
-	public HolythingPossess(Env env, EffectTemplate template)
+	public HolythingPossess(Condition attachCond, Condition applyCond, StatsSet set, StatsSet params)
 	{
-		super(env, template);
-	}
-	
-	@Override
-	public L2EffectType getEffectType()
-	{
-		return L2EffectType.NONE;
+		super(attachCond, applyCond, set, params);
 	}
 	
 	@Override
@@ -51,15 +45,15 @@ public class HolythingPossess extends L2Effect
 	}
 	
 	@Override
-	public boolean onStart()
+	public boolean onStart(BuffInfo info)
 	{
-		if (!getEffector().isPlayer())
+		if (!info.getEffector().isPlayer())
 		{
 			return false;
 		}
 		
-		Castle castle = CastleManager.getInstance().getCastle(getEffector());
-		castle.engrave(getEffector().getActingPlayer().getClan(), getEffected());
+		Castle castle = CastleManager.getInstance().getCastle(info.getEffector());
+		castle.engrave(info.getEffector().getActingPlayer().getClan(), info.getEffected());
 		castle.getSiege().announceToPlayer(SystemMessage.getSystemMessage(SystemMessageId.OPPONENT_STARTED_ENGRAVING), false);
 		return true;
 	}

+ 14 - 13
L2J_DataPack_BETA/dist/game/data/scripts/handlers/effecthandlers/HpByLevel.java

@@ -18,10 +18,11 @@
  */
 package handlers.effecthandlers;
 
-import com.l2jserver.gameserver.model.effects.EffectTemplate;
-import com.l2jserver.gameserver.model.effects.L2Effect;
+import com.l2jserver.gameserver.model.StatsSet;
+import com.l2jserver.gameserver.model.conditions.Condition;
+import com.l2jserver.gameserver.model.effects.AbstractEffect;
 import com.l2jserver.gameserver.model.effects.L2EffectType;
-import com.l2jserver.gameserver.model.stats.Env;
+import com.l2jserver.gameserver.model.skills.BuffInfo;
 import com.l2jserver.gameserver.network.SystemMessageId;
 import com.l2jserver.gameserver.network.serverpackets.SystemMessage;
 
@@ -29,11 +30,11 @@ import com.l2jserver.gameserver.network.serverpackets.SystemMessage;
  * Hp By Level effect implementation..
  * @author Zoey76
  */
-public class HpByLevel extends L2Effect
+public final class HpByLevel extends AbstractEffect
 {
-	public HpByLevel(Env env, EffectTemplate template)
+	public HpByLevel(Condition attachCond, Condition applyCond, StatsSet set, StatsSet params)
 	{
-		super(env, template);
+		super(attachCond, applyCond, set, params);
 	}
 	
 	@Override
@@ -49,21 +50,21 @@ public class HpByLevel extends L2Effect
 	}
 	
 	@Override
-	public boolean onStart()
+	public boolean onStart(BuffInfo info)
 	{
-		if (getEffector() == null)
+		if (info.getEffector() == null)
 		{
 			return false;
 		}
 		// Calculation
-		final int abs = (int) calc();
-		final double absorb = ((getEffector().getCurrentHp() + abs) > getEffector().getMaxHp() ? getEffector().getMaxHp() : (getEffector().getCurrentHp() + abs));
-		final int restored = (int) (absorb - getEffector().getCurrentHp());
-		getEffector().setCurrentHp(absorb);
+		final int abs = (int) getValue();
+		final double absorb = ((info.getEffector().getCurrentHp() + abs) > info.getEffector().getMaxHp() ? info.getEffector().getMaxHp() : (info.getEffector().getCurrentHp() + abs));
+		final int restored = (int) (absorb - info.getEffector().getCurrentHp());
+		info.getEffector().setCurrentHp(absorb);
 		// System message
 		final SystemMessage sm = SystemMessage.getSystemMessage(SystemMessageId.S1_HP_RESTORED);
 		sm.addNumber(restored);
-		getEffector().sendPacket(sm);
+		info.getEffector().sendPacket(sm);
 		return true;
 	}
 }

+ 19 - 18
L2J_DataPack_BETA/dist/game/data/scripts/handlers/effecthandlers/HpDrain.java

@@ -19,22 +19,23 @@
 package handlers.effecthandlers;
 
 import com.l2jserver.gameserver.enums.ShotType;
+import com.l2jserver.gameserver.model.StatsSet;
 import com.l2jserver.gameserver.model.actor.L2Character;
-import com.l2jserver.gameserver.model.effects.EffectTemplate;
-import com.l2jserver.gameserver.model.effects.L2Effect;
+import com.l2jserver.gameserver.model.conditions.Condition;
+import com.l2jserver.gameserver.model.effects.AbstractEffect;
 import com.l2jserver.gameserver.model.effects.L2EffectType;
-import com.l2jserver.gameserver.model.stats.Env;
+import com.l2jserver.gameserver.model.skills.BuffInfo;
 import com.l2jserver.gameserver.model.stats.Formulas;
 
 /**
  * HP Drain effect implementation.
  * @author Adry_85
  */
-public class HpDrain extends L2Effect
+public final class HpDrain extends AbstractEffect
 {
-	public HpDrain(Env env, EffectTemplate template)
+	public HpDrain(Condition attachCond, Condition applyCond, StatsSet set, StatsSet params)
 	{
-		super(env, template);
+		super(attachCond, applyCond, set, params);
 	}
 	
 	@Override
@@ -50,22 +51,22 @@ public class HpDrain extends L2Effect
 	}
 	
 	@Override
-	public boolean onStart()
+	public boolean onStart(BuffInfo info)
 	{
-		L2Character target = getEffected();
-		L2Character activeChar = getEffector();
+		L2Character target = info.getEffected();
+		L2Character activeChar = info.getEffector();
 		
 		// TODO: Unhardcode Cubic Skill to avoid double damage
-		if (activeChar.isAlikeDead() || (getSkill().getId() == 4050))
+		if (activeChar.isAlikeDead() || (info.getSkill().getId() == 4050))
 		{
 			return false;
 		}
 		
-		boolean sps = getSkill().useSpiritShot() && activeChar.isChargedShot(ShotType.SPIRITSHOTS);
-		boolean bss = getSkill().useSpiritShot() && activeChar.isChargedShot(ShotType.BLESSED_SPIRITSHOTS);
-		boolean mcrit = Formulas.calcMCrit(activeChar.getMCriticalHit(target, getSkill()));
-		byte shld = Formulas.calcShldUse(activeChar, target, getSkill());
-		int damage = (int) Formulas.calcMagicDam(activeChar, target, getSkill(), shld, sps, bss, mcrit);
+		boolean sps = info.getSkill().useSpiritShot() && activeChar.isChargedShot(ShotType.SPIRITSHOTS);
+		boolean bss = info.getSkill().useSpiritShot() && activeChar.isChargedShot(ShotType.BLESSED_SPIRITSHOTS);
+		boolean mcrit = Formulas.calcMCrit(activeChar.getMCriticalHit(target, info.getSkill()));
+		byte shld = Formulas.calcShldUse(activeChar, target, info.getSkill());
+		int damage = (int) Formulas.calcMagicDam(activeChar, target, info.getSkill(), shld, sps, bss, mcrit);
 		
 		int drain = 0;
 		int cp = (int) target.getCurrentCp();
@@ -84,7 +85,7 @@ public class HpDrain extends L2Effect
 			drain = damage;
 		}
 		
-		double hpAdd = (calc() * drain);
+		double hpAdd = (getValue() * drain);
 		double hpFinal = ((activeChar.getCurrentHp() + hpAdd) > activeChar.getMaxHp() ? activeChar.getMaxHp() : (activeChar.getCurrentHp() + hpAdd));
 		activeChar.setCurrentHp(hpFinal);
 		
@@ -97,8 +98,8 @@ public class HpDrain extends L2Effect
 				target.breakCast();
 			}
 			activeChar.sendDamageMessage(target, damage, mcrit, false, false);
-			target.reduceCurrentHp(damage, activeChar, getSkill());
-			target.notifyDamageReceived(damage, activeChar, getSkill(), mcrit);
+			target.reduceCurrentHp(damage, activeChar, info.getSkill());
+			target.notifyDamageReceived(damage, activeChar, info.getSkill(), mcrit);
 		}
 		return true;
 	}

+ 11 - 17
L2J_DataPack_BETA/dist/game/data/scripts/handlers/effecthandlers/ImmobileBuff.java

@@ -18,25 +18,20 @@
  */
 package handlers.effecthandlers;
 
-import com.l2jserver.gameserver.model.effects.EffectTemplate;
-import com.l2jserver.gameserver.model.effects.L2Effect;
+import com.l2jserver.gameserver.model.StatsSet;
+import com.l2jserver.gameserver.model.conditions.Condition;
 import com.l2jserver.gameserver.model.effects.L2EffectType;
-import com.l2jserver.gameserver.model.stats.Env;
+import com.l2jserver.gameserver.model.skills.BuffInfo;
 
 /**
  * Immobile Buff effect implementation.
  * @author mkizub
  */
-public class ImmobileBuff extends Buff
+public final class ImmobileBuff extends Buff
 {
-	public ImmobileBuff(Env env, EffectTemplate template)
+	public ImmobileBuff(Condition attachCond, Condition applyCond, StatsSet set, StatsSet params)
 	{
-		super(env, template);
-	}
-	
-	public ImmobileBuff(Env env, L2Effect effect)
-	{
-		super(env, effect);
+		super(attachCond, applyCond, set, params);
 	}
 	
 	@Override
@@ -46,16 +41,15 @@ public class ImmobileBuff extends Buff
 	}
 	
 	@Override
-	public void onExit()
+	public void onExit(BuffInfo info)
 	{
-		getEffected().setIsImmobilized(false);
-		super.onExit();
+		info.getEffected().setIsImmobilized(false);
 	}
 	
 	@Override
-	public boolean onStart()
+	public boolean onStart(BuffInfo info)
 	{
-		getEffected().setIsImmobilized(true);
-		return super.onStart();
+		info.getEffected().setIsImmobilized(true);
+		return true;
 	}
 }

+ 12 - 19
L2J_DataPack_BETA/dist/game/data/scripts/handlers/effecthandlers/ImmobilePetBuff.java

@@ -18,23 +18,22 @@
  */
 package handlers.effecthandlers;
 
+import com.l2jserver.gameserver.model.StatsSet;
 import com.l2jserver.gameserver.model.actor.L2Summon;
-import com.l2jserver.gameserver.model.effects.EffectTemplate;
-import com.l2jserver.gameserver.model.effects.L2Effect;
+import com.l2jserver.gameserver.model.conditions.Condition;
+import com.l2jserver.gameserver.model.effects.AbstractEffect;
 import com.l2jserver.gameserver.model.effects.L2EffectType;
-import com.l2jserver.gameserver.model.stats.Env;
+import com.l2jserver.gameserver.model.skills.BuffInfo;
 
 /**
  * Immobile Pet Buff effect implementation.
  * @author demonia
  */
-public class ImmobilePetBuff extends L2Effect
+public final class ImmobilePetBuff extends AbstractEffect
 {
-	private L2Summon _pet;
-	
-	public ImmobilePetBuff(Env env, EffectTemplate template)
+	public ImmobilePetBuff(Condition attachCond, Condition applyCond, StatsSet set, StatsSet params)
 	{
-		super(env, template);
+		super(attachCond, applyCond, set, params);
 	}
 	
 	@Override
@@ -44,23 +43,17 @@ public class ImmobilePetBuff extends L2Effect
 	}
 	
 	@Override
-	public void onExit()
+	public void onExit(BuffInfo info)
 	{
-		if (_pet != null)
-		{
-			_pet.setIsImmobilized(false);
-		}
+		info.getEffected().setIsImmobilized(false);
 	}
 	
 	@Override
-	public boolean onStart()
+	public boolean onStart(BuffInfo info)
 	{
-		_pet = null;
-		
-		if (getEffected().isSummon() && getEffector().isPlayer() && (((L2Summon) getEffected()).getOwner() == getEffector()))
+		if (info.getEffected().isSummon() && info.getEffector().isPlayer() && (((L2Summon) info.getEffected()).getOwner() == info.getEffector()))
 		{
-			_pet = (L2Summon) getEffected();
-			_pet.setIsImmobilized(true);
+			info.getEffected().setIsImmobilized(true);
 			return true;
 		}
 		return false;

+ 6 - 6
L2J_DataPack_BETA/dist/game/data/scripts/handlers/effecthandlers/Invincible.java

@@ -18,20 +18,20 @@
  */
 package handlers.effecthandlers;
 
+import com.l2jserver.gameserver.model.StatsSet;
+import com.l2jserver.gameserver.model.conditions.Condition;
+import com.l2jserver.gameserver.model.effects.AbstractEffect;
 import com.l2jserver.gameserver.model.effects.EffectFlag;
-import com.l2jserver.gameserver.model.effects.EffectTemplate;
-import com.l2jserver.gameserver.model.effects.L2Effect;
 import com.l2jserver.gameserver.model.effects.L2EffectType;
-import com.l2jserver.gameserver.model.stats.Env;
 
 /**
  * Invincible effect implementation.
  */
-public class Invincible extends L2Effect
+public final class Invincible extends AbstractEffect
 {
-	public Invincible(Env env, EffectTemplate template)
+	public Invincible(Condition attachCond, Condition applyCond, StatsSet set, StatsSet params)
 	{
-		super(env, template);
+		super(attachCond, applyCond, set, params);
 	}
 	
 	@Override

+ 16 - 15
L2J_DataPack_BETA/dist/game/data/scripts/handlers/effecthandlers/Lethal.java

@@ -18,11 +18,12 @@
  */
 package handlers.effecthandlers;
 
+import com.l2jserver.gameserver.model.StatsSet;
 import com.l2jserver.gameserver.model.actor.L2Character;
-import com.l2jserver.gameserver.model.effects.EffectTemplate;
-import com.l2jserver.gameserver.model.effects.L2Effect;
+import com.l2jserver.gameserver.model.conditions.Condition;
+import com.l2jserver.gameserver.model.effects.AbstractEffect;
 import com.l2jserver.gameserver.model.effects.L2EffectType;
-import com.l2jserver.gameserver.model.stats.Env;
+import com.l2jserver.gameserver.model.skills.BuffInfo;
 import com.l2jserver.gameserver.model.stats.Formulas;
 import com.l2jserver.gameserver.network.SystemMessageId;
 import com.l2jserver.util.Rnd;
@@ -31,16 +32,16 @@ import com.l2jserver.util.Rnd;
  * Lethal effect implementation.
  * @author Adry_85
  */
-public class Lethal extends L2Effect
+public final class Lethal extends AbstractEffect
 {
 	private final int _fullLethal;
 	private final int _halfLethal;
 	
-	public Lethal(Env env, EffectTemplate template)
+	public Lethal(Condition attachCond, Condition applyCond, StatsSet set, StatsSet params)
 	{
-		super(env, template);
-		_fullLethal = template.getParameters().getInt("fullLethal", 0);
-		_halfLethal = template.getParameters().getInt("halfLethal", 0);
+		super(attachCond, applyCond, set, params);
+		_fullLethal = getParameters().getInt("fullLethal", 0);
+		_halfLethal = getParameters().getInt("halfLethal", 0);
 	}
 	
 	@Override
@@ -56,10 +57,10 @@ public class Lethal extends L2Effect
 	}
 	
 	@Override
-	public boolean onStart()
+	public boolean onStart(BuffInfo info)
 	{
-		L2Character target = getEffected();
-		L2Character activeChar = getEffector();
+		L2Character target = info.getEffected();
+		L2Character activeChar = info.getEffector();
 		if (activeChar.isPlayer() && !activeChar.getAccessLevel().canGiveDamage())
 		{
 			return false;
@@ -70,14 +71,14 @@ public class Lethal extends L2Effect
 			return false;
 		}
 		
-		double levelBonus = Formulas.calcLvlBonusMod(activeChar, target, getSkill());
+		double levelBonus = Formulas.calcLvlBonusMod(activeChar, target, info.getSkill());
 		// Lethal Strike
 		if (Rnd.get(100) < (_fullLethal * levelBonus))
 		{
 			// for Players CP and HP is set to 1.
 			if (target.isPlayer())
 			{
-				target.notifyDamageReceived(target.getCurrentHp() - 1, getEffector(), getSkill(), true);
+				target.notifyDamageReceived(target.getCurrentHp() - 1, info.getEffector(), info.getSkill(), true);
 				target.setCurrentCp(1);
 				target.setCurrentHp(1);
 				target.sendPacket(SystemMessageId.LETHAL_STRIKE);
@@ -85,7 +86,7 @@ public class Lethal extends L2Effect
 			// for Monsters HP is set to 1.
 			else if (target.isMonster() || target.isSummon())
 			{
-				target.notifyDamageReceived(target.getCurrentHp() - 1, getEffector(), getSkill(), true);
+				target.notifyDamageReceived(target.getCurrentHp() - 1, info.getEffector(), info.getSkill(), true);
 				target.setCurrentHp(1);
 			}
 			activeChar.sendPacket(SystemMessageId.LETHAL_STRIKE_SUCCESSFUL);
@@ -103,7 +104,7 @@ public class Lethal extends L2Effect
 			// for Monsters HP is set to 50%.
 			else if (target.isMonster() || target.isSummon())
 			{
-				target.notifyDamageReceived(target.getCurrentHp() * 0.5, getEffector(), getSkill(), true);
+				target.notifyDamageReceived(target.getCurrentHp() * 0.5, info.getEffector(), info.getSkill(), true);
 				target.setCurrentHp(target.getCurrentHp() * 0.5);
 			}
 			activeChar.sendPacket(SystemMessageId.HALF_KILL);

+ 11 - 10
L2J_DataPack_BETA/dist/game/data/scripts/handlers/effecthandlers/Lucky.java

@@ -18,20 +18,21 @@
  */
 package handlers.effecthandlers;
 
-import com.l2jserver.gameserver.model.effects.EffectTemplate;
-import com.l2jserver.gameserver.model.effects.L2Effect;
+import com.l2jserver.gameserver.model.StatsSet;
+import com.l2jserver.gameserver.model.conditions.Condition;
+import com.l2jserver.gameserver.model.effects.AbstractEffect;
 import com.l2jserver.gameserver.model.effects.L2EffectType;
-import com.l2jserver.gameserver.model.stats.Env;
+import com.l2jserver.gameserver.model.skills.BuffInfo;
 
 /**
  * Lucky effect implementation.
  * @author Zoey76
  */
-public class Lucky extends L2Effect
+public final class Lucky extends AbstractEffect
 {
-	public Lucky(Env env, EffectTemplate template)
+	public Lucky(Condition attachCond, Condition applyCond, StatsSet set, StatsSet params)
 	{
-		super(env, template);
+		super(attachCond, applyCond, set, params);
 	}
 	
 	@Override
@@ -41,14 +42,14 @@ public class Lucky extends L2Effect
 	}
 	
 	@Override
-	public boolean onActionTime()
+	public boolean onActionTime(BuffInfo info)
 	{
-		return getSkill().isPassive();
+		return info.getSkill().isPassive();
 	}
 	
 	@Override
-	public boolean onStart()
+	public boolean onStart(BuffInfo info)
 	{
-		return (getEffector() != null) && (getEffected() != null) && getEffected().isPlayer();
+		return (info.getEffector() != null) && (info.getEffected() != null) && info.getEffected().isPlayer();
 	}
 }

+ 22 - 21
L2J_DataPack_BETA/dist/game/data/scripts/handlers/effecthandlers/MagicalAttack.java

@@ -19,11 +19,12 @@
 package handlers.effecthandlers;
 
 import com.l2jserver.gameserver.enums.ShotType;
+import com.l2jserver.gameserver.model.StatsSet;
 import com.l2jserver.gameserver.model.actor.L2Character;
-import com.l2jserver.gameserver.model.effects.EffectTemplate;
-import com.l2jserver.gameserver.model.effects.L2Effect;
+import com.l2jserver.gameserver.model.conditions.Condition;
+import com.l2jserver.gameserver.model.effects.AbstractEffect;
 import com.l2jserver.gameserver.model.effects.L2EffectType;
-import com.l2jserver.gameserver.model.stats.Env;
+import com.l2jserver.gameserver.model.skills.BuffInfo;
 import com.l2jserver.gameserver.model.stats.Formulas;
 import com.l2jserver.gameserver.model.stats.Stats;
 import com.l2jserver.util.Rnd;
@@ -32,11 +33,11 @@ import com.l2jserver.util.Rnd;
  * Magical Attack effect implementation.
  * @author Adry_85
  */
-public class MagicalAttack extends L2Effect
+public final class MagicalAttack extends AbstractEffect
 {
-	public MagicalAttack(Env env, EffectTemplate template)
+	public MagicalAttack(Condition attachCond, Condition applyCond, StatsSet set, StatsSet params)
 	{
-		super(env, template);
+		super(attachCond, applyCond, set, params);
 	}
 	
 	@Override
@@ -52,13 +53,13 @@ public class MagicalAttack extends L2Effect
 	}
 	
 	@Override
-	public boolean onStart()
+	public boolean onStart(BuffInfo info)
 	{
-		L2Character target = getEffected();
-		L2Character activeChar = getEffector();
+		L2Character target = info.getEffected();
+		L2Character activeChar = info.getEffector();
 		
 		// TODO: Unhardcode Cubic Skill to avoid double damage
-		if (activeChar.isAlikeDead() || (getSkill().getId() == 4049))
+		if (activeChar.isAlikeDead() || (info.getSkill().getId() == 4049))
 		{
 			return false;
 		}
@@ -68,11 +69,11 @@ public class MagicalAttack extends L2Effect
 			target.stopFakeDeath(true);
 		}
 		
-		boolean sps = getSkill().useSpiritShot() && activeChar.isChargedShot(ShotType.SPIRITSHOTS);
-		boolean bss = getSkill().useSpiritShot() && activeChar.isChargedShot(ShotType.BLESSED_SPIRITSHOTS);
-		final boolean mcrit = Formulas.calcMCrit(activeChar.getMCriticalHit(target, getSkill()));
-		final byte shld = Formulas.calcShldUse(activeChar, target, getSkill());
-		int damage = (int) Formulas.calcMagicDam(activeChar, target, getSkill(), shld, sps, bss, mcrit);
+		boolean sps = info.getSkill().useSpiritShot() && activeChar.isChargedShot(ShotType.SPIRITSHOTS);
+		boolean bss = info.getSkill().useSpiritShot() && activeChar.isChargedShot(ShotType.BLESSED_SPIRITSHOTS);
+		final boolean mcrit = Formulas.calcMCrit(activeChar.getMCriticalHit(target, info.getSkill()));
+		final byte shld = Formulas.calcShldUse(activeChar, target, info.getSkill());
+		int damage = (int) Formulas.calcMagicDam(activeChar, target, info.getSkill(), shld, sps, bss, mcrit);
 		
 		if (damage > 0)
 		{
@@ -84,20 +85,20 @@ public class MagicalAttack extends L2Effect
 			}
 			
 			// Shield Deflect Magic: Reflect all damage on caster.
-			if (target.getStat().calcStat(Stats.VENGEANCE_SKILL_MAGIC_DAMAGE, 0, target, getSkill()) > Rnd.get(100))
+			if (target.getStat().calcStat(Stats.VENGEANCE_SKILL_MAGIC_DAMAGE, 0, target, info.getSkill()) > Rnd.get(100))
 			{
-				activeChar.reduceCurrentHp(damage, target, getSkill());
-				activeChar.notifyDamageReceived(damage, target, getSkill(), mcrit);
+				activeChar.reduceCurrentHp(damage, target, info.getSkill());
+				activeChar.notifyDamageReceived(damage, target, info.getSkill(), mcrit);
 			}
 			else
 			{
-				target.reduceCurrentHp(damage, activeChar, getSkill());
-				target.notifyDamageReceived(damage, activeChar, getSkill(), mcrit);
+				target.reduceCurrentHp(damage, activeChar, info.getSkill());
+				target.notifyDamageReceived(damage, activeChar, info.getSkill(), mcrit);
 				activeChar.sendDamageMessage(target, damage, mcrit, false, false);
 			}
 		}
 		
-		if (getSkill().isSuicideAttack())
+		if (info.getSkill().isSuicideAttack())
 		{
 			activeChar.doDie(activeChar);
 		}

+ 18 - 17
L2J_DataPack_BETA/dist/game/data/scripts/handlers/effecthandlers/MagicalAttackMp.java

@@ -19,11 +19,12 @@
 package handlers.effecthandlers;
 
 import com.l2jserver.gameserver.enums.ShotType;
+import com.l2jserver.gameserver.model.StatsSet;
 import com.l2jserver.gameserver.model.actor.L2Character;
-import com.l2jserver.gameserver.model.effects.EffectTemplate;
-import com.l2jserver.gameserver.model.effects.L2Effect;
+import com.l2jserver.gameserver.model.conditions.Condition;
+import com.l2jserver.gameserver.model.effects.AbstractEffect;
 import com.l2jserver.gameserver.model.effects.L2EffectType;
-import com.l2jserver.gameserver.model.stats.Env;
+import com.l2jserver.gameserver.model.skills.BuffInfo;
 import com.l2jserver.gameserver.model.stats.Formulas;
 import com.l2jserver.gameserver.network.SystemMessageId;
 import com.l2jserver.gameserver.network.serverpackets.SystemMessage;
@@ -32,19 +33,19 @@ import com.l2jserver.gameserver.network.serverpackets.SystemMessage;
  * Magical Attack MP effect.
  * @author Adry_85
  */
-public class MagicalAttackMp extends L2Effect
+public final class MagicalAttackMp extends AbstractEffect
 {
-	public MagicalAttackMp(Env env, EffectTemplate template)
+	public MagicalAttackMp(Condition attachCond, Condition applyCond, StatsSet set, StatsSet params)
 	{
-		super(env, template);
+		super(attachCond, applyCond, set, params);
 	}
 	
 	@Override
-	public boolean calcSuccess()
+	public boolean calcSuccess(BuffInfo info)
 	{
-		if (getEffected().isInvul() || !Formulas.calcMagicAffected(getEffector(), getEffected(), getSkill()))
+		if (info.getEffected().isInvul() || !Formulas.calcMagicAffected(info.getEffector(), info.getEffected(), info.getSkill()))
 		{
-			getEffector().sendPacket(SystemMessageId.MISSED_TARGET);
+			info.getEffector().sendPacket(SystemMessageId.MISSED_TARGET);
 			return false;
 		}
 		return true;
@@ -63,21 +64,21 @@ public class MagicalAttackMp extends L2Effect
 	}
 	
 	@Override
-	public boolean onStart()
+	public boolean onStart(BuffInfo info)
 	{
-		L2Character target = getEffected();
-		L2Character activeChar = getEffector();
+		L2Character target = info.getEffected();
+		L2Character activeChar = info.getEffector();
 		
 		if (activeChar.isAlikeDead())
 		{
 			return false;
 		}
 		
-		boolean sps = getSkill().useSpiritShot() && activeChar.isChargedShot(ShotType.SPIRITSHOTS);
-		boolean bss = getSkill().useSpiritShot() && activeChar.isChargedShot(ShotType.BLESSED_SPIRITSHOTS);
-		final byte shld = Formulas.calcShldUse(activeChar, target, getSkill());
-		final boolean mcrit = Formulas.calcMCrit(activeChar.getMCriticalHit(target, getSkill()));
-		double damage = Formulas.calcManaDam(activeChar, target, getSkill(), shld, sps, bss, mcrit);
+		boolean sps = info.getSkill().useSpiritShot() && activeChar.isChargedShot(ShotType.SPIRITSHOTS);
+		boolean bss = info.getSkill().useSpiritShot() && activeChar.isChargedShot(ShotType.BLESSED_SPIRITSHOTS);
+		final byte shld = Formulas.calcShldUse(activeChar, target, info.getSkill());
+		final boolean mcrit = Formulas.calcMCrit(activeChar.getMCriticalHit(target, info.getSkill()));
+		double damage = Formulas.calcManaDam(activeChar, target, info.getSkill(), shld, sps, bss, mcrit);
 		double mp = (damage > target.getCurrentMp() ? target.getCurrentMp() : damage);
 		
 		if (damage > 0)

+ 23 - 22
L2J_DataPack_BETA/dist/game/data/scripts/handlers/effecthandlers/MagicalSoulAttack.java

@@ -19,11 +19,12 @@
 package handlers.effecthandlers;
 
 import com.l2jserver.gameserver.enums.ShotType;
+import com.l2jserver.gameserver.model.StatsSet;
 import com.l2jserver.gameserver.model.actor.L2Character;
-import com.l2jserver.gameserver.model.effects.EffectTemplate;
-import com.l2jserver.gameserver.model.effects.L2Effect;
+import com.l2jserver.gameserver.model.conditions.Condition;
+import com.l2jserver.gameserver.model.effects.AbstractEffect;
 import com.l2jserver.gameserver.model.effects.L2EffectType;
-import com.l2jserver.gameserver.model.stats.Env;
+import com.l2jserver.gameserver.model.skills.BuffInfo;
 import com.l2jserver.gameserver.model.stats.Formulas;
 import com.l2jserver.gameserver.model.stats.Stats;
 import com.l2jserver.util.Rnd;
@@ -32,11 +33,11 @@ import com.l2jserver.util.Rnd;
  * Magical Soul Attack effect implementation.
  * @author Adry_85
  */
-public class MagicalSoulAttack extends L2Effect
+public final class MagicalSoulAttack extends AbstractEffect
 {
-	public MagicalSoulAttack(Env env, EffectTemplate template)
+	public MagicalSoulAttack(Condition attachCond, Condition applyCond, StatsSet set, StatsSet params)
 	{
-		super(env, template);
+		super(attachCond, applyCond, set, params);
 	}
 	
 	@Override
@@ -52,10 +53,10 @@ public class MagicalSoulAttack extends L2Effect
 	}
 	
 	@Override
-	public boolean onStart()
+	public boolean onStart(BuffInfo info)
 	{
-		L2Character target = getEffected();
-		L2Character activeChar = getEffector();
+		L2Character target = info.getEffected();
+		L2Character activeChar = info.getEffector();
 		
 		if (activeChar.isAlikeDead())
 		{
@@ -67,22 +68,22 @@ public class MagicalSoulAttack extends L2Effect
 			target.stopFakeDeath(true);
 		}
 		
-		boolean sps = getSkill().useSpiritShot() && activeChar.isChargedShot(ShotType.SPIRITSHOTS);
-		boolean bss = getSkill().useSpiritShot() && activeChar.isChargedShot(ShotType.BLESSED_SPIRITSHOTS);
-		final boolean mcrit = Formulas.calcMCrit(activeChar.getMCriticalHit(target, getSkill()));
-		final byte shld = Formulas.calcShldUse(activeChar, target, getSkill());
-		int damage = (int) Formulas.calcMagicDam(activeChar, target, getSkill(), shld, sps, bss, mcrit);
+		boolean sps = info.getSkill().useSpiritShot() && activeChar.isChargedShot(ShotType.SPIRITSHOTS);
+		boolean bss = info.getSkill().useSpiritShot() && activeChar.isChargedShot(ShotType.BLESSED_SPIRITSHOTS);
+		final boolean mcrit = Formulas.calcMCrit(activeChar.getMCriticalHit(target, info.getSkill()));
+		final byte shld = Formulas.calcShldUse(activeChar, target, info.getSkill());
+		int damage = (int) Formulas.calcMagicDam(activeChar, target, info.getSkill(), shld, sps, bss, mcrit);
 		
 		// Curse of Divinity Formula (each buff increase +30%)
-		if (getSkill().getDependOnTargetBuff())
+		if (info.getSkill().getDependOnTargetBuff())
 		{
 			damage *= (((target.getBuffCount() * 0.3) + 1.3) / 4);
 		}
 		
-		if ((getSkill().getMaxSoulConsumeCount() > 0) && activeChar.isPlayer())
+		if ((info.getSkill().getMaxSoulConsumeCount() > 0) && activeChar.isPlayer())
 		{
 			// Souls Formula (each soul increase +4%)
-			int chargedSouls = (activeChar.getActingPlayer().getChargedSouls() <= getSkill().getMaxSoulConsumeCount()) ? activeChar.getActingPlayer().getChargedSouls() : getSkill().getMaxSoulConsumeCount();
+			int chargedSouls = (activeChar.getActingPlayer().getChargedSouls() <= info.getSkill().getMaxSoulConsumeCount()) ? activeChar.getActingPlayer().getChargedSouls() : info.getSkill().getMaxSoulConsumeCount();
 			damage *= 1 + (chargedSouls * 0.04);
 		}
 		
@@ -96,15 +97,15 @@ public class MagicalSoulAttack extends L2Effect
 			}
 			
 			// Shield Deflect Magic: Reflect all damage on caster.
-			if (target.getStat().calcStat(Stats.VENGEANCE_SKILL_MAGIC_DAMAGE, 0, target, getSkill()) > Rnd.get(100))
+			if (target.getStat().calcStat(Stats.VENGEANCE_SKILL_MAGIC_DAMAGE, 0, target, info.getSkill()) > Rnd.get(100))
 			{
-				activeChar.reduceCurrentHp(damage, target, getSkill());
-				activeChar.notifyDamageReceived(damage, target, getSkill(), mcrit);
+				activeChar.reduceCurrentHp(damage, target, info.getSkill());
+				activeChar.notifyDamageReceived(damage, target, info.getSkill(), mcrit);
 			}
 			else
 			{
-				target.reduceCurrentHp(damage, activeChar, getSkill());
-				target.notifyDamageReceived(damage, activeChar, getSkill(), mcrit);
+				target.reduceCurrentHp(damage, activeChar, info.getSkill());
+				target.notifyDamageReceived(damage, activeChar, info.getSkill(), mcrit);
 				activeChar.sendDamageMessage(target, damage, mcrit, false, false);
 			}
 		}

+ 14 - 13
L2J_DataPack_BETA/dist/game/data/scripts/handlers/effecthandlers/ManaDamOverTime.java

@@ -18,20 +18,21 @@
  */
 package handlers.effecthandlers;
 
-import com.l2jserver.gameserver.model.effects.EffectTemplate;
-import com.l2jserver.gameserver.model.effects.L2Effect;
+import com.l2jserver.gameserver.model.StatsSet;
+import com.l2jserver.gameserver.model.conditions.Condition;
+import com.l2jserver.gameserver.model.effects.AbstractEffect;
 import com.l2jserver.gameserver.model.effects.L2EffectType;
-import com.l2jserver.gameserver.model.stats.Env;
+import com.l2jserver.gameserver.model.skills.BuffInfo;
 import com.l2jserver.gameserver.network.SystemMessageId;
 
 /**
  * Mana Dam Over Time effect implementation.
  */
-public class ManaDamOverTime extends L2Effect
+public final class ManaDamOverTime extends AbstractEffect
 {
-	public ManaDamOverTime(Env env, EffectTemplate template)
+	public ManaDamOverTime(Condition attachCond, Condition applyCond, StatsSet set, StatsSet params)
 	{
-		super(env, template);
+		super(attachCond, applyCond, set, params);
 	}
 	
 	@Override
@@ -41,21 +42,21 @@ public class ManaDamOverTime extends L2Effect
 	}
 	
 	@Override
-	public boolean onActionTime()
+	public boolean onActionTime(BuffInfo info)
 	{
-		if (getEffected().isDead())
+		if (info.getEffected().isDead())
 		{
 			return false;
 		}
 		
-		final double manaDam = calc() * getEffectTemplate().getTotalTickCount();
-		if ((manaDam > getEffected().getCurrentMp()) && getSkill().isToggle())
+		final double manaDam = getValue() * getTicks();
+		if ((manaDam > info.getEffected().getCurrentMp()) && info.getSkill().isToggle())
 		{
-			getEffected().sendPacket(SystemMessageId.SKILL_REMOVED_DUE_LACK_MP);
+			info.getEffected().sendPacket(SystemMessageId.SKILL_REMOVED_DUE_LACK_MP);
 			return false;
 		}
 		
-		getEffected().reduceCurrentMp(manaDam);
-		return getSkill().isToggle();
+		info.getEffected().reduceCurrentMp(manaDam);
+		return info.getSkill().isToggle();
 	}
 }

+ 13 - 12
L2J_DataPack_BETA/dist/game/data/scripts/handlers/effecthandlers/ManaHeal.java

@@ -18,11 +18,12 @@
  */
 package handlers.effecthandlers;
 
+import com.l2jserver.gameserver.model.StatsSet;
 import com.l2jserver.gameserver.model.actor.L2Character;
-import com.l2jserver.gameserver.model.effects.EffectTemplate;
-import com.l2jserver.gameserver.model.effects.L2Effect;
+import com.l2jserver.gameserver.model.conditions.Condition;
+import com.l2jserver.gameserver.model.effects.AbstractEffect;
 import com.l2jserver.gameserver.model.effects.L2EffectType;
-import com.l2jserver.gameserver.model.stats.Env;
+import com.l2jserver.gameserver.model.skills.BuffInfo;
 import com.l2jserver.gameserver.model.stats.Stats;
 import com.l2jserver.gameserver.network.SystemMessageId;
 import com.l2jserver.gameserver.network.serverpackets.SystemMessage;
@@ -31,11 +32,11 @@ import com.l2jserver.gameserver.network.serverpackets.SystemMessage;
  * Mana Heal effect implementation.
  * @author UnAfraid
  */
-public class ManaHeal extends L2Effect
+public final class ManaHeal extends AbstractEffect
 {
-	public ManaHeal(Env env, EffectTemplate template)
+	public ManaHeal(Condition attachCond, Condition applyCond, StatsSet set, StatsSet params)
 	{
-		super(env, template);
+		super(attachCond, applyCond, set, params);
 	}
 	
 	@Override
@@ -51,17 +52,17 @@ public class ManaHeal extends L2Effect
 	}
 	
 	@Override
-	public boolean onStart()
+	public boolean onStart(BuffInfo info)
 	{
-		L2Character target = getEffected();
+		L2Character target = info.getEffected();
 		if ((target == null) || target.isDead() || target.isDoor())
 		{
 			return false;
 		}
 		
-		double amount = calc();
+		double amount = getValue();
 		
-		if (!getSkill().isStatic())
+		if (!info.getSkill().isStatic())
 		{
 			amount = target.calcStat(Stats.MANA_CHARGE, amount, null, null);
 		}
@@ -73,10 +74,10 @@ public class ManaHeal extends L2Effect
 			target.setCurrentMp(amount + target.getCurrentMp());
 		}
 		SystemMessage sm;
-		if (getEffector().getObjectId() != target.getObjectId())
+		if (info.getEffector().getObjectId() != target.getObjectId())
 		{
 			sm = SystemMessage.getSystemMessage(SystemMessageId.S2_MP_RESTORED_BY_C1);
-			sm.addCharName(getEffector());
+			sm.addCharName(info.getEffector());
 		}
 		else
 		{

+ 14 - 13
L2J_DataPack_BETA/dist/game/data/scripts/handlers/effecthandlers/ManaHealByLevel.java

@@ -18,11 +18,12 @@
  */
 package handlers.effecthandlers;
 
+import com.l2jserver.gameserver.model.StatsSet;
 import com.l2jserver.gameserver.model.actor.L2Character;
-import com.l2jserver.gameserver.model.effects.EffectTemplate;
-import com.l2jserver.gameserver.model.effects.L2Effect;
+import com.l2jserver.gameserver.model.conditions.Condition;
+import com.l2jserver.gameserver.model.effects.AbstractEffect;
 import com.l2jserver.gameserver.model.effects.L2EffectType;
-import com.l2jserver.gameserver.model.stats.Env;
+import com.l2jserver.gameserver.model.skills.BuffInfo;
 import com.l2jserver.gameserver.model.stats.Stats;
 import com.l2jserver.gameserver.network.SystemMessageId;
 import com.l2jserver.gameserver.network.serverpackets.SystemMessage;
@@ -31,11 +32,11 @@ import com.l2jserver.gameserver.network.serverpackets.SystemMessage;
  * Mana Heal By Level effect implementation.
  * @author UnAfraid
  */
-public class ManaHealByLevel extends L2Effect
+public final class ManaHealByLevel extends AbstractEffect
 {
-	public ManaHealByLevel(Env env, EffectTemplate template)
+	public ManaHealByLevel(Condition attachCond, Condition applyCond, StatsSet set, StatsSet params)
 	{
-		super(env, template);
+		super(attachCond, applyCond, set, params);
 	}
 	
 	@Override
@@ -51,22 +52,22 @@ public class ManaHealByLevel extends L2Effect
 	}
 	
 	@Override
-	public boolean onStart()
+	public boolean onStart(BuffInfo info)
 	{
-		L2Character target = getEffected();
+		L2Character target = info.getEffected();
 		if ((target == null) || target.isDead() || target.isDoor() || target.isInvul())
 		{
 			return false;
 		}
 		
-		double amount = calc();
+		double amount = getValue();
 		
 		// recharged mp influenced by difference between target level and skill level
 		// if target is within 5 levels or lower then skill level there's no penalty.
 		amount = target.calcStat(Stats.MANA_CHARGE, amount, null, null);
-		if (target.getLevel() > getSkill().getMagicLevel())
+		if (target.getLevel() > info.getSkill().getMagicLevel())
 		{
-			int lvlDiff = target.getLevel() - getSkill().getMagicLevel();
+			int lvlDiff = target.getLevel() - info.getSkill().getMagicLevel();
 			// if target is too high compared to skill level, the amount of recharged mp gradually decreases.
 			if (lvlDiff == 6)
 			{
@@ -117,10 +118,10 @@ public class ManaHealByLevel extends L2Effect
 			target.setCurrentMp(amount + target.getCurrentMp());
 		}
 		SystemMessage sm;
-		if (getEffector().getObjectId() != target.getObjectId())
+		if (info.getEffector().getObjectId() != target.getObjectId())
 		{
 			sm = SystemMessage.getSystemMessage(SystemMessageId.S2_MP_RESTORED_BY_C1);
-			sm.addCharName(getEffector());
+			sm.addCharName(info.getEffector());
 		}
 		else
 		{

+ 14 - 24
L2J_DataPack_BETA/dist/game/data/scripts/handlers/effecthandlers/ManaHealOverTime.java

@@ -18,30 +18,20 @@
  */
 package handlers.effecthandlers;
 
-import com.l2jserver.gameserver.model.effects.EffectTemplate;
-import com.l2jserver.gameserver.model.effects.L2Effect;
+import com.l2jserver.gameserver.model.StatsSet;
+import com.l2jserver.gameserver.model.conditions.Condition;
+import com.l2jserver.gameserver.model.effects.AbstractEffect;
 import com.l2jserver.gameserver.model.effects.L2EffectType;
-import com.l2jserver.gameserver.model.stats.Env;
+import com.l2jserver.gameserver.model.skills.BuffInfo;
 
 /**
  * Mana Heal Over Time effect implementation.
  */
-public class ManaHealOverTime extends L2Effect
+public final class ManaHealOverTime extends AbstractEffect
 {
-	public ManaHealOverTime(Env env, EffectTemplate template)
+	public ManaHealOverTime(Condition attachCond, Condition applyCond, StatsSet set, StatsSet params)
 	{
-		super(env, template);
-	}
-	
-	public ManaHealOverTime(Env env, L2Effect effect)
-	{
-		super(env, effect);
-	}
-	
-	@Override
-	public boolean canBeStolen()
-	{
-		return true;
+		super(attachCond, applyCond, set, params);
 	}
 	
 	@Override
@@ -51,15 +41,15 @@ public class ManaHealOverTime extends L2Effect
 	}
 	
 	@Override
-	public boolean onActionTime()
+	public boolean onActionTime(BuffInfo info)
 	{
-		if (getEffected().isDead())
+		if (info.getEffected().isDead())
 		{
 			return false;
 		}
 		
-		double mp = getEffected().getCurrentMp();
-		double maxmp = getEffected().getMaxRecoverableMp();
+		double mp = info.getEffected().getCurrentMp();
+		double maxmp = info.getEffected().getMaxRecoverableMp();
 		
 		// Not needed to set the MP and send update packet if player is already at max MP
 		if (mp >= maxmp)
@@ -67,9 +57,9 @@ public class ManaHealOverTime extends L2Effect
 			return true;
 		}
 		
-		mp += calc() * getEffectTemplate().getTotalTickCount();
+		mp += getValue() * getTicks();
 		mp = Math.min(mp, maxmp);
-		getEffected().setCurrentMp(mp);
-		return getSkill().isToggle();
+		info.getEffected().setCurrentMp(mp);
+		return info.getSkill().isToggle();
 	}
 }

+ 12 - 11
L2J_DataPack_BETA/dist/game/data/scripts/handlers/effecthandlers/ManaHealPercent.java

@@ -18,11 +18,12 @@
  */
 package handlers.effecthandlers;
 
+import com.l2jserver.gameserver.model.StatsSet;
 import com.l2jserver.gameserver.model.actor.L2Character;
-import com.l2jserver.gameserver.model.effects.EffectTemplate;
-import com.l2jserver.gameserver.model.effects.L2Effect;
+import com.l2jserver.gameserver.model.conditions.Condition;
+import com.l2jserver.gameserver.model.effects.AbstractEffect;
 import com.l2jserver.gameserver.model.effects.L2EffectType;
-import com.l2jserver.gameserver.model.stats.Env;
+import com.l2jserver.gameserver.model.skills.BuffInfo;
 import com.l2jserver.gameserver.network.SystemMessageId;
 import com.l2jserver.gameserver.network.serverpackets.SystemMessage;
 
@@ -30,11 +31,11 @@ import com.l2jserver.gameserver.network.serverpackets.SystemMessage;
  * Mana Heal Percent effect implementation.
  * @author UnAfraid
  */
-public class ManaHealPercent extends L2Effect
+public final class ManaHealPercent extends AbstractEffect
 {
-	public ManaHealPercent(Env env, EffectTemplate template)
+	public ManaHealPercent(Condition attachCond, Condition applyCond, StatsSet set, StatsSet params)
 	{
-		super(env, template);
+		super(attachCond, applyCond, set, params);
 	}
 	
 	@Override
@@ -50,16 +51,16 @@ public class ManaHealPercent extends L2Effect
 	}
 	
 	@Override
-	public boolean onStart()
+	public boolean onStart(BuffInfo info)
 	{
-		L2Character target = getEffected();
+		L2Character target = info.getEffected();
 		if ((target == null) || target.isDead() || target.isDoor())
 		{
 			return false;
 		}
 		
 		double amount = 0;
-		double power = calc();
+		double power = getValue();
 		boolean full = (power == 100.0);
 		
 		amount = full ? target.getMaxMp() : (target.getMaxMp() * power) / 100.0;
@@ -70,10 +71,10 @@ public class ManaHealPercent extends L2Effect
 			target.setCurrentMp(amount + target.getCurrentMp());
 		}
 		SystemMessage sm;
-		if (getEffector().getObjectId() != target.getObjectId())
+		if (info.getEffector().getObjectId() != target.getObjectId())
 		{
 			sm = SystemMessage.getSystemMessage(SystemMessageId.S2_MP_RESTORED_BY_C1);
-			sm.addCharName(getEffector());
+			sm.addCharName(info.getEffector());
 		}
 		else
 		{

Một số tệp đã không được hiển thị bởi vì quá nhiều tập tin thay đổi trong này khác