diff --git a/L2J_Mobius_1.0_Ertheia/dist/game/data/scripts/handlers/EffectMasterHandler.java b/L2J_Mobius_1.0_Ertheia/dist/game/data/scripts/handlers/EffectMasterHandler.java
index 94445cf000..a70ba55319 100644
--- a/L2J_Mobius_1.0_Ertheia/dist/game/data/scripts/handlers/EffectMasterHandler.java
+++ b/L2J_Mobius_1.0_Ertheia/dist/game/data/scripts/handlers/EffectMasterHandler.java
@@ -364,6 +364,7 @@ public class EffectMasterHandler
EffectHandler.getInstance().registerHandler("Transformation", Transformation::new);
EffectHandler.getInstance().registerHandler("TrapDetect", TrapDetect::new);
EffectHandler.getInstance().registerHandler("TrapRemove", TrapRemove::new);
+ EffectHandler.getInstance().registerHandler("TriggerSkill", TriggerSkill::new);
EffectHandler.getInstance().registerHandler("TriggerSkillByAttack", TriggerSkillByAttack::new);
EffectHandler.getInstance().registerHandler("TriggerSkillByAvoid", TriggerSkillByAvoid::new);
EffectHandler.getInstance().registerHandler("TriggerSkillByDamage", TriggerSkillByDamage::new);
diff --git a/L2J_Mobius_1.0_Ertheia/dist/game/data/scripts/handlers/effecthandlers/TriggerSkill.java b/L2J_Mobius_1.0_Ertheia/dist/game/data/scripts/handlers/effecthandlers/TriggerSkill.java
new file mode 100644
index 0000000000..1fe23aaf20
--- /dev/null
+++ b/L2J_Mobius_1.0_Ertheia/dist/game/data/scripts/handlers/effecthandlers/TriggerSkill.java
@@ -0,0 +1,95 @@
+/*
+ * This file is part of the L2J Mobius project.
+ *
+ * This program is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program. If not, see .
+ */
+package handlers.effecthandlers;
+
+import org.l2jmobius.commons.concurrent.ThreadPool;
+import org.l2jmobius.gameserver.data.xml.SkillData;
+import org.l2jmobius.gameserver.handler.TargetHandler;
+import org.l2jmobius.gameserver.model.StatSet;
+import org.l2jmobius.gameserver.model.WorldObject;
+import org.l2jmobius.gameserver.model.actor.Creature;
+import org.l2jmobius.gameserver.model.effects.AbstractEffect;
+import org.l2jmobius.gameserver.model.holders.SkillHolder;
+import org.l2jmobius.gameserver.model.holders.SkillUseHolder;
+import org.l2jmobius.gameserver.model.items.instance.ItemInstance;
+import org.l2jmobius.gameserver.model.skills.Skill;
+import org.l2jmobius.gameserver.model.skills.targets.TargetType;
+
+/**
+ * Trigger Skill effect implementation.
+ * @author Mobius
+ */
+public class TriggerSkill extends AbstractEffect
+{
+ private final SkillHolder _skill;
+ private final TargetType _targetType;
+ private final boolean _adjustLevel;
+
+ public TriggerSkill(StatSet params)
+ {
+ _skill = new SkillHolder(params.getInt("skillId"), params.getInt("skillLevel", 1));
+ _targetType = params.getEnum("targetType", TargetType.class, TargetType.TARGET);
+ _adjustLevel = params.getBoolean("adjustLevel", false);
+ }
+
+ @Override
+ public boolean isInstant()
+ {
+ return true;
+ }
+
+ @Override
+ public void instant(Creature effector, Creature effected, Skill skill, ItemInstance item)
+ {
+ if ((effected == null) || !effected.isCreature() || !effector.isPlayer())
+ {
+ return;
+ }
+
+ final Skill triggerSkill = _adjustLevel ? SkillData.getInstance().getSkill(_skill.getSkillId(), skill.getLevel()) : _skill.getSkill();
+ if (triggerSkill == null)
+ {
+ return;
+ }
+
+ WorldObject target = null;
+ try
+ {
+ target = TargetHandler.getInstance().getHandler(_targetType).getTarget(effector, effected, triggerSkill, false, false, false);
+ }
+ catch (Exception e)
+ {
+ LOGGER.warning("Exception in ITargetTypeHandler.getTarget(): " + e.getMessage());
+ }
+
+ if ((target == null) || !target.isCreature())
+ {
+ return;
+ }
+
+ final SkillUseHolder queuedSkill = effector.getActingPlayer().getQueuedSkill();
+ if (queuedSkill != null)
+ {
+ ThreadPool.schedule(() ->
+ {
+ effector.getActingPlayer().setQueuedSkill(queuedSkill.getSkill(), queuedSkill.getItem(), queuedSkill.isCtrlPressed(), queuedSkill.isShiftPressed());
+ }, 10);
+ }
+
+ effector.getActingPlayer().setQueuedSkill(triggerSkill, null, false, false);
+ }
+}
diff --git a/L2J_Mobius_1.0_Ertheia/dist/game/data/stats/skills/documentation.txt b/L2J_Mobius_1.0_Ertheia/dist/game/data/stats/skills/documentation.txt
index effaaf887c..2b90899468 100644
--- a/L2J_Mobius_1.0_Ertheia/dist/game/data/stats/skills/documentation.txt
+++ b/L2J_Mobius_1.0_Ertheia/dist/game/data/stats/skills/documentation.txt
@@ -332,6 +332,7 @@ TransferHate: Transfers Npc's hate from you to your target.
Transformation: Transforms into the specified transformation id and gives its template skills.
TrapDetect: Detects a hidden trap.
TrapRemove: Removes a trap.
+TriggerSkill: Triggers a specified skill. (l2jmobius)
TriggerSkillByAttack: Triggers a specified skill when you deal damage.
TriggerSkillByAvoid: Triggers a specified skill when you avoid autoattack damage.
TriggerSkillByDamage: Triggers a specified skill when you receive damage.
diff --git a/L2J_Mobius_2.5_Underground/dist/game/data/scripts/handlers/EffectMasterHandler.java b/L2J_Mobius_2.5_Underground/dist/game/data/scripts/handlers/EffectMasterHandler.java
index 94445cf000..a70ba55319 100644
--- a/L2J_Mobius_2.5_Underground/dist/game/data/scripts/handlers/EffectMasterHandler.java
+++ b/L2J_Mobius_2.5_Underground/dist/game/data/scripts/handlers/EffectMasterHandler.java
@@ -364,6 +364,7 @@ public class EffectMasterHandler
EffectHandler.getInstance().registerHandler("Transformation", Transformation::new);
EffectHandler.getInstance().registerHandler("TrapDetect", TrapDetect::new);
EffectHandler.getInstance().registerHandler("TrapRemove", TrapRemove::new);
+ EffectHandler.getInstance().registerHandler("TriggerSkill", TriggerSkill::new);
EffectHandler.getInstance().registerHandler("TriggerSkillByAttack", TriggerSkillByAttack::new);
EffectHandler.getInstance().registerHandler("TriggerSkillByAvoid", TriggerSkillByAvoid::new);
EffectHandler.getInstance().registerHandler("TriggerSkillByDamage", TriggerSkillByDamage::new);
diff --git a/L2J_Mobius_2.5_Underground/dist/game/data/scripts/handlers/effecthandlers/TriggerSkill.java b/L2J_Mobius_2.5_Underground/dist/game/data/scripts/handlers/effecthandlers/TriggerSkill.java
new file mode 100644
index 0000000000..1fe23aaf20
--- /dev/null
+++ b/L2J_Mobius_2.5_Underground/dist/game/data/scripts/handlers/effecthandlers/TriggerSkill.java
@@ -0,0 +1,95 @@
+/*
+ * This file is part of the L2J Mobius project.
+ *
+ * This program is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program. If not, see .
+ */
+package handlers.effecthandlers;
+
+import org.l2jmobius.commons.concurrent.ThreadPool;
+import org.l2jmobius.gameserver.data.xml.SkillData;
+import org.l2jmobius.gameserver.handler.TargetHandler;
+import org.l2jmobius.gameserver.model.StatSet;
+import org.l2jmobius.gameserver.model.WorldObject;
+import org.l2jmobius.gameserver.model.actor.Creature;
+import org.l2jmobius.gameserver.model.effects.AbstractEffect;
+import org.l2jmobius.gameserver.model.holders.SkillHolder;
+import org.l2jmobius.gameserver.model.holders.SkillUseHolder;
+import org.l2jmobius.gameserver.model.items.instance.ItemInstance;
+import org.l2jmobius.gameserver.model.skills.Skill;
+import org.l2jmobius.gameserver.model.skills.targets.TargetType;
+
+/**
+ * Trigger Skill effect implementation.
+ * @author Mobius
+ */
+public class TriggerSkill extends AbstractEffect
+{
+ private final SkillHolder _skill;
+ private final TargetType _targetType;
+ private final boolean _adjustLevel;
+
+ public TriggerSkill(StatSet params)
+ {
+ _skill = new SkillHolder(params.getInt("skillId"), params.getInt("skillLevel", 1));
+ _targetType = params.getEnum("targetType", TargetType.class, TargetType.TARGET);
+ _adjustLevel = params.getBoolean("adjustLevel", false);
+ }
+
+ @Override
+ public boolean isInstant()
+ {
+ return true;
+ }
+
+ @Override
+ public void instant(Creature effector, Creature effected, Skill skill, ItemInstance item)
+ {
+ if ((effected == null) || !effected.isCreature() || !effector.isPlayer())
+ {
+ return;
+ }
+
+ final Skill triggerSkill = _adjustLevel ? SkillData.getInstance().getSkill(_skill.getSkillId(), skill.getLevel()) : _skill.getSkill();
+ if (triggerSkill == null)
+ {
+ return;
+ }
+
+ WorldObject target = null;
+ try
+ {
+ target = TargetHandler.getInstance().getHandler(_targetType).getTarget(effector, effected, triggerSkill, false, false, false);
+ }
+ catch (Exception e)
+ {
+ LOGGER.warning("Exception in ITargetTypeHandler.getTarget(): " + e.getMessage());
+ }
+
+ if ((target == null) || !target.isCreature())
+ {
+ return;
+ }
+
+ final SkillUseHolder queuedSkill = effector.getActingPlayer().getQueuedSkill();
+ if (queuedSkill != null)
+ {
+ ThreadPool.schedule(() ->
+ {
+ effector.getActingPlayer().setQueuedSkill(queuedSkill.getSkill(), queuedSkill.getItem(), queuedSkill.isCtrlPressed(), queuedSkill.isShiftPressed());
+ }, 10);
+ }
+
+ effector.getActingPlayer().setQueuedSkill(triggerSkill, null, false, false);
+ }
+}
diff --git a/L2J_Mobius_2.5_Underground/dist/game/data/stats/skills/documentation.txt b/L2J_Mobius_2.5_Underground/dist/game/data/stats/skills/documentation.txt
index effaaf887c..2b90899468 100644
--- a/L2J_Mobius_2.5_Underground/dist/game/data/stats/skills/documentation.txt
+++ b/L2J_Mobius_2.5_Underground/dist/game/data/stats/skills/documentation.txt
@@ -332,6 +332,7 @@ TransferHate: Transfers Npc's hate from you to your target.
Transformation: Transforms into the specified transformation id and gives its template skills.
TrapDetect: Detects a hidden trap.
TrapRemove: Removes a trap.
+TriggerSkill: Triggers a specified skill. (l2jmobius)
TriggerSkillByAttack: Triggers a specified skill when you deal damage.
TriggerSkillByAvoid: Triggers a specified skill when you avoid autoattack damage.
TriggerSkillByDamage: Triggers a specified skill when you receive damage.
diff --git a/L2J_Mobius_3.0_Helios/dist/game/data/scripts/handlers/EffectMasterHandler.java b/L2J_Mobius_3.0_Helios/dist/game/data/scripts/handlers/EffectMasterHandler.java
index 94445cf000..a70ba55319 100644
--- a/L2J_Mobius_3.0_Helios/dist/game/data/scripts/handlers/EffectMasterHandler.java
+++ b/L2J_Mobius_3.0_Helios/dist/game/data/scripts/handlers/EffectMasterHandler.java
@@ -364,6 +364,7 @@ public class EffectMasterHandler
EffectHandler.getInstance().registerHandler("Transformation", Transformation::new);
EffectHandler.getInstance().registerHandler("TrapDetect", TrapDetect::new);
EffectHandler.getInstance().registerHandler("TrapRemove", TrapRemove::new);
+ EffectHandler.getInstance().registerHandler("TriggerSkill", TriggerSkill::new);
EffectHandler.getInstance().registerHandler("TriggerSkillByAttack", TriggerSkillByAttack::new);
EffectHandler.getInstance().registerHandler("TriggerSkillByAvoid", TriggerSkillByAvoid::new);
EffectHandler.getInstance().registerHandler("TriggerSkillByDamage", TriggerSkillByDamage::new);
diff --git a/L2J_Mobius_3.0_Helios/dist/game/data/scripts/handlers/effecthandlers/TriggerSkill.java b/L2J_Mobius_3.0_Helios/dist/game/data/scripts/handlers/effecthandlers/TriggerSkill.java
new file mode 100644
index 0000000000..1fe23aaf20
--- /dev/null
+++ b/L2J_Mobius_3.0_Helios/dist/game/data/scripts/handlers/effecthandlers/TriggerSkill.java
@@ -0,0 +1,95 @@
+/*
+ * This file is part of the L2J Mobius project.
+ *
+ * This program is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program. If not, see .
+ */
+package handlers.effecthandlers;
+
+import org.l2jmobius.commons.concurrent.ThreadPool;
+import org.l2jmobius.gameserver.data.xml.SkillData;
+import org.l2jmobius.gameserver.handler.TargetHandler;
+import org.l2jmobius.gameserver.model.StatSet;
+import org.l2jmobius.gameserver.model.WorldObject;
+import org.l2jmobius.gameserver.model.actor.Creature;
+import org.l2jmobius.gameserver.model.effects.AbstractEffect;
+import org.l2jmobius.gameserver.model.holders.SkillHolder;
+import org.l2jmobius.gameserver.model.holders.SkillUseHolder;
+import org.l2jmobius.gameserver.model.items.instance.ItemInstance;
+import org.l2jmobius.gameserver.model.skills.Skill;
+import org.l2jmobius.gameserver.model.skills.targets.TargetType;
+
+/**
+ * Trigger Skill effect implementation.
+ * @author Mobius
+ */
+public class TriggerSkill extends AbstractEffect
+{
+ private final SkillHolder _skill;
+ private final TargetType _targetType;
+ private final boolean _adjustLevel;
+
+ public TriggerSkill(StatSet params)
+ {
+ _skill = new SkillHolder(params.getInt("skillId"), params.getInt("skillLevel", 1));
+ _targetType = params.getEnum("targetType", TargetType.class, TargetType.TARGET);
+ _adjustLevel = params.getBoolean("adjustLevel", false);
+ }
+
+ @Override
+ public boolean isInstant()
+ {
+ return true;
+ }
+
+ @Override
+ public void instant(Creature effector, Creature effected, Skill skill, ItemInstance item)
+ {
+ if ((effected == null) || !effected.isCreature() || !effector.isPlayer())
+ {
+ return;
+ }
+
+ final Skill triggerSkill = _adjustLevel ? SkillData.getInstance().getSkill(_skill.getSkillId(), skill.getLevel()) : _skill.getSkill();
+ if (triggerSkill == null)
+ {
+ return;
+ }
+
+ WorldObject target = null;
+ try
+ {
+ target = TargetHandler.getInstance().getHandler(_targetType).getTarget(effector, effected, triggerSkill, false, false, false);
+ }
+ catch (Exception e)
+ {
+ LOGGER.warning("Exception in ITargetTypeHandler.getTarget(): " + e.getMessage());
+ }
+
+ if ((target == null) || !target.isCreature())
+ {
+ return;
+ }
+
+ final SkillUseHolder queuedSkill = effector.getActingPlayer().getQueuedSkill();
+ if (queuedSkill != null)
+ {
+ ThreadPool.schedule(() ->
+ {
+ effector.getActingPlayer().setQueuedSkill(queuedSkill.getSkill(), queuedSkill.getItem(), queuedSkill.isCtrlPressed(), queuedSkill.isShiftPressed());
+ }, 10);
+ }
+
+ effector.getActingPlayer().setQueuedSkill(triggerSkill, null, false, false);
+ }
+}
diff --git a/L2J_Mobius_3.0_Helios/dist/game/data/stats/skills/documentation.txt b/L2J_Mobius_3.0_Helios/dist/game/data/stats/skills/documentation.txt
index effaaf887c..2b90899468 100644
--- a/L2J_Mobius_3.0_Helios/dist/game/data/stats/skills/documentation.txt
+++ b/L2J_Mobius_3.0_Helios/dist/game/data/stats/skills/documentation.txt
@@ -332,6 +332,7 @@ TransferHate: Transfers Npc's hate from you to your target.
Transformation: Transforms into the specified transformation id and gives its template skills.
TrapDetect: Detects a hidden trap.
TrapRemove: Removes a trap.
+TriggerSkill: Triggers a specified skill. (l2jmobius)
TriggerSkillByAttack: Triggers a specified skill when you deal damage.
TriggerSkillByAvoid: Triggers a specified skill when you avoid autoattack damage.
TriggerSkillByDamage: Triggers a specified skill when you receive damage.
diff --git a/L2J_Mobius_4.0_GrandCrusade/dist/game/data/scripts/handlers/EffectMasterHandler.java b/L2J_Mobius_4.0_GrandCrusade/dist/game/data/scripts/handlers/EffectMasterHandler.java
index 85906025d9..90980ea193 100644
--- a/L2J_Mobius_4.0_GrandCrusade/dist/game/data/scripts/handlers/EffectMasterHandler.java
+++ b/L2J_Mobius_4.0_GrandCrusade/dist/game/data/scripts/handlers/EffectMasterHandler.java
@@ -369,6 +369,7 @@ public class EffectMasterHandler
EffectHandler.getInstance().registerHandler("Transformation", Transformation::new);
EffectHandler.getInstance().registerHandler("TrapDetect", TrapDetect::new);
EffectHandler.getInstance().registerHandler("TrapRemove", TrapRemove::new);
+ EffectHandler.getInstance().registerHandler("TriggerSkill", TriggerSkill::new);
EffectHandler.getInstance().registerHandler("TriggerSkillByAttack", TriggerSkillByAttack::new);
EffectHandler.getInstance().registerHandler("TriggerSkillByAvoid", TriggerSkillByAvoid::new);
EffectHandler.getInstance().registerHandler("TriggerSkillByDamage", TriggerSkillByDamage::new);
diff --git a/L2J_Mobius_4.0_GrandCrusade/dist/game/data/scripts/handlers/effecthandlers/TriggerSkill.java b/L2J_Mobius_4.0_GrandCrusade/dist/game/data/scripts/handlers/effecthandlers/TriggerSkill.java
new file mode 100644
index 0000000000..1fe23aaf20
--- /dev/null
+++ b/L2J_Mobius_4.0_GrandCrusade/dist/game/data/scripts/handlers/effecthandlers/TriggerSkill.java
@@ -0,0 +1,95 @@
+/*
+ * This file is part of the L2J Mobius project.
+ *
+ * This program is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program. If not, see .
+ */
+package handlers.effecthandlers;
+
+import org.l2jmobius.commons.concurrent.ThreadPool;
+import org.l2jmobius.gameserver.data.xml.SkillData;
+import org.l2jmobius.gameserver.handler.TargetHandler;
+import org.l2jmobius.gameserver.model.StatSet;
+import org.l2jmobius.gameserver.model.WorldObject;
+import org.l2jmobius.gameserver.model.actor.Creature;
+import org.l2jmobius.gameserver.model.effects.AbstractEffect;
+import org.l2jmobius.gameserver.model.holders.SkillHolder;
+import org.l2jmobius.gameserver.model.holders.SkillUseHolder;
+import org.l2jmobius.gameserver.model.items.instance.ItemInstance;
+import org.l2jmobius.gameserver.model.skills.Skill;
+import org.l2jmobius.gameserver.model.skills.targets.TargetType;
+
+/**
+ * Trigger Skill effect implementation.
+ * @author Mobius
+ */
+public class TriggerSkill extends AbstractEffect
+{
+ private final SkillHolder _skill;
+ private final TargetType _targetType;
+ private final boolean _adjustLevel;
+
+ public TriggerSkill(StatSet params)
+ {
+ _skill = new SkillHolder(params.getInt("skillId"), params.getInt("skillLevel", 1));
+ _targetType = params.getEnum("targetType", TargetType.class, TargetType.TARGET);
+ _adjustLevel = params.getBoolean("adjustLevel", false);
+ }
+
+ @Override
+ public boolean isInstant()
+ {
+ return true;
+ }
+
+ @Override
+ public void instant(Creature effector, Creature effected, Skill skill, ItemInstance item)
+ {
+ if ((effected == null) || !effected.isCreature() || !effector.isPlayer())
+ {
+ return;
+ }
+
+ final Skill triggerSkill = _adjustLevel ? SkillData.getInstance().getSkill(_skill.getSkillId(), skill.getLevel()) : _skill.getSkill();
+ if (triggerSkill == null)
+ {
+ return;
+ }
+
+ WorldObject target = null;
+ try
+ {
+ target = TargetHandler.getInstance().getHandler(_targetType).getTarget(effector, effected, triggerSkill, false, false, false);
+ }
+ catch (Exception e)
+ {
+ LOGGER.warning("Exception in ITargetTypeHandler.getTarget(): " + e.getMessage());
+ }
+
+ if ((target == null) || !target.isCreature())
+ {
+ return;
+ }
+
+ final SkillUseHolder queuedSkill = effector.getActingPlayer().getQueuedSkill();
+ if (queuedSkill != null)
+ {
+ ThreadPool.schedule(() ->
+ {
+ effector.getActingPlayer().setQueuedSkill(queuedSkill.getSkill(), queuedSkill.getItem(), queuedSkill.isCtrlPressed(), queuedSkill.isShiftPressed());
+ }, 10);
+ }
+
+ effector.getActingPlayer().setQueuedSkill(triggerSkill, null, false, false);
+ }
+}
diff --git a/L2J_Mobius_4.0_GrandCrusade/dist/game/data/stats/skills/documentation.txt b/L2J_Mobius_4.0_GrandCrusade/dist/game/data/stats/skills/documentation.txt
index bc4d0e4022..43ba17fbe2 100644
--- a/L2J_Mobius_4.0_GrandCrusade/dist/game/data/stats/skills/documentation.txt
+++ b/L2J_Mobius_4.0_GrandCrusade/dist/game/data/stats/skills/documentation.txt
@@ -337,6 +337,7 @@ TransferHate: Transfers Npc's hate from you to your target.
Transformation: Transforms into the specified transformation id and gives its template skills.
TrapDetect: Detects a hidden trap.
TrapRemove: Removes a trap.
+TriggerSkill: Triggers a specified skill. (l2jmobius)
TriggerSkillByAttack: Triggers a specified skill when you deal damage.
TriggerSkillByAvoid: Triggers a specified skill when you avoid autoattack damage.
TriggerSkillByDamage: Triggers a specified skill when you receive damage.
diff --git a/L2J_Mobius_5.0_Salvation/dist/game/data/scripts/handlers/EffectMasterHandler.java b/L2J_Mobius_5.0_Salvation/dist/game/data/scripts/handlers/EffectMasterHandler.java
index 75cf066f4f..43ebd4968b 100644
--- a/L2J_Mobius_5.0_Salvation/dist/game/data/scripts/handlers/EffectMasterHandler.java
+++ b/L2J_Mobius_5.0_Salvation/dist/game/data/scripts/handlers/EffectMasterHandler.java
@@ -374,6 +374,7 @@ public class EffectMasterHandler
EffectHandler.getInstance().registerHandler("Transformation", Transformation::new);
EffectHandler.getInstance().registerHandler("TrapDetect", TrapDetect::new);
EffectHandler.getInstance().registerHandler("TrapRemove", TrapRemove::new);
+ EffectHandler.getInstance().registerHandler("TriggerSkill", TriggerSkill::new);
EffectHandler.getInstance().registerHandler("TriggerSkillByAttack", TriggerSkillByAttack::new);
EffectHandler.getInstance().registerHandler("TriggerSkillByAvoid", TriggerSkillByAvoid::new);
EffectHandler.getInstance().registerHandler("TriggerSkillByDamage", TriggerSkillByDamage::new);
diff --git a/L2J_Mobius_5.0_Salvation/dist/game/data/scripts/handlers/effecthandlers/TriggerSkill.java b/L2J_Mobius_5.0_Salvation/dist/game/data/scripts/handlers/effecthandlers/TriggerSkill.java
new file mode 100644
index 0000000000..1fe23aaf20
--- /dev/null
+++ b/L2J_Mobius_5.0_Salvation/dist/game/data/scripts/handlers/effecthandlers/TriggerSkill.java
@@ -0,0 +1,95 @@
+/*
+ * This file is part of the L2J Mobius project.
+ *
+ * This program is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program. If not, see .
+ */
+package handlers.effecthandlers;
+
+import org.l2jmobius.commons.concurrent.ThreadPool;
+import org.l2jmobius.gameserver.data.xml.SkillData;
+import org.l2jmobius.gameserver.handler.TargetHandler;
+import org.l2jmobius.gameserver.model.StatSet;
+import org.l2jmobius.gameserver.model.WorldObject;
+import org.l2jmobius.gameserver.model.actor.Creature;
+import org.l2jmobius.gameserver.model.effects.AbstractEffect;
+import org.l2jmobius.gameserver.model.holders.SkillHolder;
+import org.l2jmobius.gameserver.model.holders.SkillUseHolder;
+import org.l2jmobius.gameserver.model.items.instance.ItemInstance;
+import org.l2jmobius.gameserver.model.skills.Skill;
+import org.l2jmobius.gameserver.model.skills.targets.TargetType;
+
+/**
+ * Trigger Skill effect implementation.
+ * @author Mobius
+ */
+public class TriggerSkill extends AbstractEffect
+{
+ private final SkillHolder _skill;
+ private final TargetType _targetType;
+ private final boolean _adjustLevel;
+
+ public TriggerSkill(StatSet params)
+ {
+ _skill = new SkillHolder(params.getInt("skillId"), params.getInt("skillLevel", 1));
+ _targetType = params.getEnum("targetType", TargetType.class, TargetType.TARGET);
+ _adjustLevel = params.getBoolean("adjustLevel", false);
+ }
+
+ @Override
+ public boolean isInstant()
+ {
+ return true;
+ }
+
+ @Override
+ public void instant(Creature effector, Creature effected, Skill skill, ItemInstance item)
+ {
+ if ((effected == null) || !effected.isCreature() || !effector.isPlayer())
+ {
+ return;
+ }
+
+ final Skill triggerSkill = _adjustLevel ? SkillData.getInstance().getSkill(_skill.getSkillId(), skill.getLevel()) : _skill.getSkill();
+ if (triggerSkill == null)
+ {
+ return;
+ }
+
+ WorldObject target = null;
+ try
+ {
+ target = TargetHandler.getInstance().getHandler(_targetType).getTarget(effector, effected, triggerSkill, false, false, false);
+ }
+ catch (Exception e)
+ {
+ LOGGER.warning("Exception in ITargetTypeHandler.getTarget(): " + e.getMessage());
+ }
+
+ if ((target == null) || !target.isCreature())
+ {
+ return;
+ }
+
+ final SkillUseHolder queuedSkill = effector.getActingPlayer().getQueuedSkill();
+ if (queuedSkill != null)
+ {
+ ThreadPool.schedule(() ->
+ {
+ effector.getActingPlayer().setQueuedSkill(queuedSkill.getSkill(), queuedSkill.getItem(), queuedSkill.isCtrlPressed(), queuedSkill.isShiftPressed());
+ }, 10);
+ }
+
+ effector.getActingPlayer().setQueuedSkill(triggerSkill, null, false, false);
+ }
+}
diff --git a/L2J_Mobius_5.0_Salvation/dist/game/data/stats/skills/documentation.txt b/L2J_Mobius_5.0_Salvation/dist/game/data/stats/skills/documentation.txt
index 7f6460201a..619dfbde53 100644
--- a/L2J_Mobius_5.0_Salvation/dist/game/data/stats/skills/documentation.txt
+++ b/L2J_Mobius_5.0_Salvation/dist/game/data/stats/skills/documentation.txt
@@ -342,6 +342,7 @@ TransferHate: Transfers Npc's hate from you to your target.
Transformation: Transforms into the specified transformation id and gives its template skills.
TrapDetect: Detects a hidden trap.
TrapRemove: Removes a trap.
+TriggerSkill: Triggers a specified skill. (l2jmobius)
TriggerSkillByAttack: Triggers a specified skill when you deal damage.
TriggerSkillByAvoid: Triggers a specified skill when you avoid autoattack damage.
TriggerSkillByDamage: Triggers a specified skill when you receive damage.
diff --git a/L2J_Mobius_5.5_EtinasFate/dist/game/data/scripts/handlers/EffectMasterHandler.java b/L2J_Mobius_5.5_EtinasFate/dist/game/data/scripts/handlers/EffectMasterHandler.java
index 05bb5b4387..5530ef8da1 100644
--- a/L2J_Mobius_5.5_EtinasFate/dist/game/data/scripts/handlers/EffectMasterHandler.java
+++ b/L2J_Mobius_5.5_EtinasFate/dist/game/data/scripts/handlers/EffectMasterHandler.java
@@ -375,6 +375,7 @@ public class EffectMasterHandler
EffectHandler.getInstance().registerHandler("Transformation", Transformation::new);
EffectHandler.getInstance().registerHandler("TrapDetect", TrapDetect::new);
EffectHandler.getInstance().registerHandler("TrapRemove", TrapRemove::new);
+ EffectHandler.getInstance().registerHandler("TriggerSkill", TriggerSkill::new);
EffectHandler.getInstance().registerHandler("TriggerSkillByAttack", TriggerSkillByAttack::new);
EffectHandler.getInstance().registerHandler("TriggerSkillByAvoid", TriggerSkillByAvoid::new);
EffectHandler.getInstance().registerHandler("TriggerSkillByDamage", TriggerSkillByDamage::new);
diff --git a/L2J_Mobius_5.5_EtinasFate/dist/game/data/scripts/handlers/effecthandlers/TriggerSkill.java b/L2J_Mobius_5.5_EtinasFate/dist/game/data/scripts/handlers/effecthandlers/TriggerSkill.java
new file mode 100644
index 0000000000..1fe23aaf20
--- /dev/null
+++ b/L2J_Mobius_5.5_EtinasFate/dist/game/data/scripts/handlers/effecthandlers/TriggerSkill.java
@@ -0,0 +1,95 @@
+/*
+ * This file is part of the L2J Mobius project.
+ *
+ * This program is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program. If not, see .
+ */
+package handlers.effecthandlers;
+
+import org.l2jmobius.commons.concurrent.ThreadPool;
+import org.l2jmobius.gameserver.data.xml.SkillData;
+import org.l2jmobius.gameserver.handler.TargetHandler;
+import org.l2jmobius.gameserver.model.StatSet;
+import org.l2jmobius.gameserver.model.WorldObject;
+import org.l2jmobius.gameserver.model.actor.Creature;
+import org.l2jmobius.gameserver.model.effects.AbstractEffect;
+import org.l2jmobius.gameserver.model.holders.SkillHolder;
+import org.l2jmobius.gameserver.model.holders.SkillUseHolder;
+import org.l2jmobius.gameserver.model.items.instance.ItemInstance;
+import org.l2jmobius.gameserver.model.skills.Skill;
+import org.l2jmobius.gameserver.model.skills.targets.TargetType;
+
+/**
+ * Trigger Skill effect implementation.
+ * @author Mobius
+ */
+public class TriggerSkill extends AbstractEffect
+{
+ private final SkillHolder _skill;
+ private final TargetType _targetType;
+ private final boolean _adjustLevel;
+
+ public TriggerSkill(StatSet params)
+ {
+ _skill = new SkillHolder(params.getInt("skillId"), params.getInt("skillLevel", 1));
+ _targetType = params.getEnum("targetType", TargetType.class, TargetType.TARGET);
+ _adjustLevel = params.getBoolean("adjustLevel", false);
+ }
+
+ @Override
+ public boolean isInstant()
+ {
+ return true;
+ }
+
+ @Override
+ public void instant(Creature effector, Creature effected, Skill skill, ItemInstance item)
+ {
+ if ((effected == null) || !effected.isCreature() || !effector.isPlayer())
+ {
+ return;
+ }
+
+ final Skill triggerSkill = _adjustLevel ? SkillData.getInstance().getSkill(_skill.getSkillId(), skill.getLevel()) : _skill.getSkill();
+ if (triggerSkill == null)
+ {
+ return;
+ }
+
+ WorldObject target = null;
+ try
+ {
+ target = TargetHandler.getInstance().getHandler(_targetType).getTarget(effector, effected, triggerSkill, false, false, false);
+ }
+ catch (Exception e)
+ {
+ LOGGER.warning("Exception in ITargetTypeHandler.getTarget(): " + e.getMessage());
+ }
+
+ if ((target == null) || !target.isCreature())
+ {
+ return;
+ }
+
+ final SkillUseHolder queuedSkill = effector.getActingPlayer().getQueuedSkill();
+ if (queuedSkill != null)
+ {
+ ThreadPool.schedule(() ->
+ {
+ effector.getActingPlayer().setQueuedSkill(queuedSkill.getSkill(), queuedSkill.getItem(), queuedSkill.isCtrlPressed(), queuedSkill.isShiftPressed());
+ }, 10);
+ }
+
+ effector.getActingPlayer().setQueuedSkill(triggerSkill, null, false, false);
+ }
+}
diff --git a/L2J_Mobius_5.5_EtinasFate/dist/game/data/stats/skills/documentation.txt b/L2J_Mobius_5.5_EtinasFate/dist/game/data/stats/skills/documentation.txt
index cfc4b8176d..130b688b37 100644
--- a/L2J_Mobius_5.5_EtinasFate/dist/game/data/stats/skills/documentation.txt
+++ b/L2J_Mobius_5.5_EtinasFate/dist/game/data/stats/skills/documentation.txt
@@ -343,6 +343,7 @@ TransferHate: Transfers Npc's hate from you to your target.
Transformation: Transforms into the specified transformation id and gives its template skills.
TrapDetect: Detects a hidden trap.
TrapRemove: Removes a trap.
+TriggerSkill: Triggers a specified skill. (l2jmobius)
TriggerSkillByAttack: Triggers a specified skill when you deal damage.
TriggerSkillByAvoid: Triggers a specified skill when you avoid autoattack damage.
TriggerSkillByDamage: Triggers a specified skill when you receive damage.
diff --git a/L2J_Mobius_6.0_Fafurion/dist/game/data/scripts/handlers/EffectMasterHandler.java b/L2J_Mobius_6.0_Fafurion/dist/game/data/scripts/handlers/EffectMasterHandler.java
index 05bb5b4387..5530ef8da1 100644
--- a/L2J_Mobius_6.0_Fafurion/dist/game/data/scripts/handlers/EffectMasterHandler.java
+++ b/L2J_Mobius_6.0_Fafurion/dist/game/data/scripts/handlers/EffectMasterHandler.java
@@ -375,6 +375,7 @@ public class EffectMasterHandler
EffectHandler.getInstance().registerHandler("Transformation", Transformation::new);
EffectHandler.getInstance().registerHandler("TrapDetect", TrapDetect::new);
EffectHandler.getInstance().registerHandler("TrapRemove", TrapRemove::new);
+ EffectHandler.getInstance().registerHandler("TriggerSkill", TriggerSkill::new);
EffectHandler.getInstance().registerHandler("TriggerSkillByAttack", TriggerSkillByAttack::new);
EffectHandler.getInstance().registerHandler("TriggerSkillByAvoid", TriggerSkillByAvoid::new);
EffectHandler.getInstance().registerHandler("TriggerSkillByDamage", TriggerSkillByDamage::new);
diff --git a/L2J_Mobius_6.0_Fafurion/dist/game/data/scripts/handlers/effecthandlers/TriggerSkill.java b/L2J_Mobius_6.0_Fafurion/dist/game/data/scripts/handlers/effecthandlers/TriggerSkill.java
new file mode 100644
index 0000000000..1fe23aaf20
--- /dev/null
+++ b/L2J_Mobius_6.0_Fafurion/dist/game/data/scripts/handlers/effecthandlers/TriggerSkill.java
@@ -0,0 +1,95 @@
+/*
+ * This file is part of the L2J Mobius project.
+ *
+ * This program is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program. If not, see .
+ */
+package handlers.effecthandlers;
+
+import org.l2jmobius.commons.concurrent.ThreadPool;
+import org.l2jmobius.gameserver.data.xml.SkillData;
+import org.l2jmobius.gameserver.handler.TargetHandler;
+import org.l2jmobius.gameserver.model.StatSet;
+import org.l2jmobius.gameserver.model.WorldObject;
+import org.l2jmobius.gameserver.model.actor.Creature;
+import org.l2jmobius.gameserver.model.effects.AbstractEffect;
+import org.l2jmobius.gameserver.model.holders.SkillHolder;
+import org.l2jmobius.gameserver.model.holders.SkillUseHolder;
+import org.l2jmobius.gameserver.model.items.instance.ItemInstance;
+import org.l2jmobius.gameserver.model.skills.Skill;
+import org.l2jmobius.gameserver.model.skills.targets.TargetType;
+
+/**
+ * Trigger Skill effect implementation.
+ * @author Mobius
+ */
+public class TriggerSkill extends AbstractEffect
+{
+ private final SkillHolder _skill;
+ private final TargetType _targetType;
+ private final boolean _adjustLevel;
+
+ public TriggerSkill(StatSet params)
+ {
+ _skill = new SkillHolder(params.getInt("skillId"), params.getInt("skillLevel", 1));
+ _targetType = params.getEnum("targetType", TargetType.class, TargetType.TARGET);
+ _adjustLevel = params.getBoolean("adjustLevel", false);
+ }
+
+ @Override
+ public boolean isInstant()
+ {
+ return true;
+ }
+
+ @Override
+ public void instant(Creature effector, Creature effected, Skill skill, ItemInstance item)
+ {
+ if ((effected == null) || !effected.isCreature() || !effector.isPlayer())
+ {
+ return;
+ }
+
+ final Skill triggerSkill = _adjustLevel ? SkillData.getInstance().getSkill(_skill.getSkillId(), skill.getLevel()) : _skill.getSkill();
+ if (triggerSkill == null)
+ {
+ return;
+ }
+
+ WorldObject target = null;
+ try
+ {
+ target = TargetHandler.getInstance().getHandler(_targetType).getTarget(effector, effected, triggerSkill, false, false, false);
+ }
+ catch (Exception e)
+ {
+ LOGGER.warning("Exception in ITargetTypeHandler.getTarget(): " + e.getMessage());
+ }
+
+ if ((target == null) || !target.isCreature())
+ {
+ return;
+ }
+
+ final SkillUseHolder queuedSkill = effector.getActingPlayer().getQueuedSkill();
+ if (queuedSkill != null)
+ {
+ ThreadPool.schedule(() ->
+ {
+ effector.getActingPlayer().setQueuedSkill(queuedSkill.getSkill(), queuedSkill.getItem(), queuedSkill.isCtrlPressed(), queuedSkill.isShiftPressed());
+ }, 10);
+ }
+
+ effector.getActingPlayer().setQueuedSkill(triggerSkill, null, false, false);
+ }
+}
diff --git a/L2J_Mobius_6.0_Fafurion/dist/game/data/stats/skills/documentation.txt b/L2J_Mobius_6.0_Fafurion/dist/game/data/stats/skills/documentation.txt
index cfc4b8176d..130b688b37 100644
--- a/L2J_Mobius_6.0_Fafurion/dist/game/data/stats/skills/documentation.txt
+++ b/L2J_Mobius_6.0_Fafurion/dist/game/data/stats/skills/documentation.txt
@@ -343,6 +343,7 @@ TransferHate: Transfers Npc's hate from you to your target.
Transformation: Transforms into the specified transformation id and gives its template skills.
TrapDetect: Detects a hidden trap.
TrapRemove: Removes a trap.
+TriggerSkill: Triggers a specified skill. (l2jmobius)
TriggerSkillByAttack: Triggers a specified skill when you deal damage.
TriggerSkillByAvoid: Triggers a specified skill when you avoid autoattack damage.
TriggerSkillByDamage: Triggers a specified skill when you receive damage.
diff --git a/L2J_Mobius_7.0_PreludeOfWar/dist/game/data/scripts/handlers/EffectMasterHandler.java b/L2J_Mobius_7.0_PreludeOfWar/dist/game/data/scripts/handlers/EffectMasterHandler.java
index ea8bed1855..b21b4d92c3 100644
--- a/L2J_Mobius_7.0_PreludeOfWar/dist/game/data/scripts/handlers/EffectMasterHandler.java
+++ b/L2J_Mobius_7.0_PreludeOfWar/dist/game/data/scripts/handlers/EffectMasterHandler.java
@@ -375,6 +375,7 @@ public class EffectMasterHandler
EffectHandler.getInstance().registerHandler("Transformation", Transformation::new);
EffectHandler.getInstance().registerHandler("TrapDetect", TrapDetect::new);
EffectHandler.getInstance().registerHandler("TrapRemove", TrapRemove::new);
+ EffectHandler.getInstance().registerHandler("TriggerSkill", TriggerSkill::new);
EffectHandler.getInstance().registerHandler("TriggerSkillByAttack", TriggerSkillByAttack::new);
EffectHandler.getInstance().registerHandler("TriggerSkillByAvoid", TriggerSkillByAvoid::new);
EffectHandler.getInstance().registerHandler("TriggerSkillByDamage", TriggerSkillByDamage::new);
diff --git a/L2J_Mobius_7.0_PreludeOfWar/dist/game/data/scripts/handlers/effecthandlers/TriggerSkill.java b/L2J_Mobius_7.0_PreludeOfWar/dist/game/data/scripts/handlers/effecthandlers/TriggerSkill.java
new file mode 100644
index 0000000000..1fe23aaf20
--- /dev/null
+++ b/L2J_Mobius_7.0_PreludeOfWar/dist/game/data/scripts/handlers/effecthandlers/TriggerSkill.java
@@ -0,0 +1,95 @@
+/*
+ * This file is part of the L2J Mobius project.
+ *
+ * This program is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program. If not, see .
+ */
+package handlers.effecthandlers;
+
+import org.l2jmobius.commons.concurrent.ThreadPool;
+import org.l2jmobius.gameserver.data.xml.SkillData;
+import org.l2jmobius.gameserver.handler.TargetHandler;
+import org.l2jmobius.gameserver.model.StatSet;
+import org.l2jmobius.gameserver.model.WorldObject;
+import org.l2jmobius.gameserver.model.actor.Creature;
+import org.l2jmobius.gameserver.model.effects.AbstractEffect;
+import org.l2jmobius.gameserver.model.holders.SkillHolder;
+import org.l2jmobius.gameserver.model.holders.SkillUseHolder;
+import org.l2jmobius.gameserver.model.items.instance.ItemInstance;
+import org.l2jmobius.gameserver.model.skills.Skill;
+import org.l2jmobius.gameserver.model.skills.targets.TargetType;
+
+/**
+ * Trigger Skill effect implementation.
+ * @author Mobius
+ */
+public class TriggerSkill extends AbstractEffect
+{
+ private final SkillHolder _skill;
+ private final TargetType _targetType;
+ private final boolean _adjustLevel;
+
+ public TriggerSkill(StatSet params)
+ {
+ _skill = new SkillHolder(params.getInt("skillId"), params.getInt("skillLevel", 1));
+ _targetType = params.getEnum("targetType", TargetType.class, TargetType.TARGET);
+ _adjustLevel = params.getBoolean("adjustLevel", false);
+ }
+
+ @Override
+ public boolean isInstant()
+ {
+ return true;
+ }
+
+ @Override
+ public void instant(Creature effector, Creature effected, Skill skill, ItemInstance item)
+ {
+ if ((effected == null) || !effected.isCreature() || !effector.isPlayer())
+ {
+ return;
+ }
+
+ final Skill triggerSkill = _adjustLevel ? SkillData.getInstance().getSkill(_skill.getSkillId(), skill.getLevel()) : _skill.getSkill();
+ if (triggerSkill == null)
+ {
+ return;
+ }
+
+ WorldObject target = null;
+ try
+ {
+ target = TargetHandler.getInstance().getHandler(_targetType).getTarget(effector, effected, triggerSkill, false, false, false);
+ }
+ catch (Exception e)
+ {
+ LOGGER.warning("Exception in ITargetTypeHandler.getTarget(): " + e.getMessage());
+ }
+
+ if ((target == null) || !target.isCreature())
+ {
+ return;
+ }
+
+ final SkillUseHolder queuedSkill = effector.getActingPlayer().getQueuedSkill();
+ if (queuedSkill != null)
+ {
+ ThreadPool.schedule(() ->
+ {
+ effector.getActingPlayer().setQueuedSkill(queuedSkill.getSkill(), queuedSkill.getItem(), queuedSkill.isCtrlPressed(), queuedSkill.isShiftPressed());
+ }, 10);
+ }
+
+ effector.getActingPlayer().setQueuedSkill(triggerSkill, null, false, false);
+ }
+}
diff --git a/L2J_Mobius_7.0_PreludeOfWar/dist/game/data/stats/skills/documentation.txt b/L2J_Mobius_7.0_PreludeOfWar/dist/game/data/stats/skills/documentation.txt
index 7ea51889ea..8ad58d0f8a 100644
--- a/L2J_Mobius_7.0_PreludeOfWar/dist/game/data/stats/skills/documentation.txt
+++ b/L2J_Mobius_7.0_PreludeOfWar/dist/game/data/stats/skills/documentation.txt
@@ -342,6 +342,7 @@ TransferHate: Transfers Npc's hate from you to your target.
Transformation: Transforms into the specified transformation id and gives its template skills.
TrapDetect: Detects a hidden trap.
TrapRemove: Removes a trap.
+TriggerSkill: Triggers a specified skill. (l2jmobius)
TriggerSkillByAttack: Triggers a specified skill when you deal damage.
TriggerSkillByAvoid: Triggers a specified skill when you avoid autoattack damage.
TriggerSkillByDamage: Triggers a specified skill when you receive damage.
diff --git a/L2J_Mobius_8.0_Homunculus/dist/game/data/scripts/handlers/EffectMasterHandler.java b/L2J_Mobius_8.0_Homunculus/dist/game/data/scripts/handlers/EffectMasterHandler.java
index 9fa5a16e8e..41ac762926 100644
--- a/L2J_Mobius_8.0_Homunculus/dist/game/data/scripts/handlers/EffectMasterHandler.java
+++ b/L2J_Mobius_8.0_Homunculus/dist/game/data/scripts/handlers/EffectMasterHandler.java
@@ -376,6 +376,7 @@ public class EffectMasterHandler
EffectHandler.getInstance().registerHandler("Transformation", Transformation::new);
EffectHandler.getInstance().registerHandler("TrapDetect", TrapDetect::new);
EffectHandler.getInstance().registerHandler("TrapRemove", TrapRemove::new);
+ EffectHandler.getInstance().registerHandler("TriggerSkill", TriggerSkill::new);
EffectHandler.getInstance().registerHandler("TriggerSkillByAttack", TriggerSkillByAttack::new);
EffectHandler.getInstance().registerHandler("TriggerSkillByAvoid", TriggerSkillByAvoid::new);
EffectHandler.getInstance().registerHandler("TriggerSkillByDamage", TriggerSkillByDamage::new);
diff --git a/L2J_Mobius_8.0_Homunculus/dist/game/data/scripts/handlers/effecthandlers/TriggerSkill.java b/L2J_Mobius_8.0_Homunculus/dist/game/data/scripts/handlers/effecthandlers/TriggerSkill.java
new file mode 100644
index 0000000000..1fe23aaf20
--- /dev/null
+++ b/L2J_Mobius_8.0_Homunculus/dist/game/data/scripts/handlers/effecthandlers/TriggerSkill.java
@@ -0,0 +1,95 @@
+/*
+ * This file is part of the L2J Mobius project.
+ *
+ * This program is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program. If not, see .
+ */
+package handlers.effecthandlers;
+
+import org.l2jmobius.commons.concurrent.ThreadPool;
+import org.l2jmobius.gameserver.data.xml.SkillData;
+import org.l2jmobius.gameserver.handler.TargetHandler;
+import org.l2jmobius.gameserver.model.StatSet;
+import org.l2jmobius.gameserver.model.WorldObject;
+import org.l2jmobius.gameserver.model.actor.Creature;
+import org.l2jmobius.gameserver.model.effects.AbstractEffect;
+import org.l2jmobius.gameserver.model.holders.SkillHolder;
+import org.l2jmobius.gameserver.model.holders.SkillUseHolder;
+import org.l2jmobius.gameserver.model.items.instance.ItemInstance;
+import org.l2jmobius.gameserver.model.skills.Skill;
+import org.l2jmobius.gameserver.model.skills.targets.TargetType;
+
+/**
+ * Trigger Skill effect implementation.
+ * @author Mobius
+ */
+public class TriggerSkill extends AbstractEffect
+{
+ private final SkillHolder _skill;
+ private final TargetType _targetType;
+ private final boolean _adjustLevel;
+
+ public TriggerSkill(StatSet params)
+ {
+ _skill = new SkillHolder(params.getInt("skillId"), params.getInt("skillLevel", 1));
+ _targetType = params.getEnum("targetType", TargetType.class, TargetType.TARGET);
+ _adjustLevel = params.getBoolean("adjustLevel", false);
+ }
+
+ @Override
+ public boolean isInstant()
+ {
+ return true;
+ }
+
+ @Override
+ public void instant(Creature effector, Creature effected, Skill skill, ItemInstance item)
+ {
+ if ((effected == null) || !effected.isCreature() || !effector.isPlayer())
+ {
+ return;
+ }
+
+ final Skill triggerSkill = _adjustLevel ? SkillData.getInstance().getSkill(_skill.getSkillId(), skill.getLevel()) : _skill.getSkill();
+ if (triggerSkill == null)
+ {
+ return;
+ }
+
+ WorldObject target = null;
+ try
+ {
+ target = TargetHandler.getInstance().getHandler(_targetType).getTarget(effector, effected, triggerSkill, false, false, false);
+ }
+ catch (Exception e)
+ {
+ LOGGER.warning("Exception in ITargetTypeHandler.getTarget(): " + e.getMessage());
+ }
+
+ if ((target == null) || !target.isCreature())
+ {
+ return;
+ }
+
+ final SkillUseHolder queuedSkill = effector.getActingPlayer().getQueuedSkill();
+ if (queuedSkill != null)
+ {
+ ThreadPool.schedule(() ->
+ {
+ effector.getActingPlayer().setQueuedSkill(queuedSkill.getSkill(), queuedSkill.getItem(), queuedSkill.isCtrlPressed(), queuedSkill.isShiftPressed());
+ }, 10);
+ }
+
+ effector.getActingPlayer().setQueuedSkill(triggerSkill, null, false, false);
+ }
+}
diff --git a/L2J_Mobius_8.0_Homunculus/dist/game/data/stats/skills/documentation.txt b/L2J_Mobius_8.0_Homunculus/dist/game/data/stats/skills/documentation.txt
index f13bdc7b42..739004dd72 100644
--- a/L2J_Mobius_8.0_Homunculus/dist/game/data/stats/skills/documentation.txt
+++ b/L2J_Mobius_8.0_Homunculus/dist/game/data/stats/skills/documentation.txt
@@ -343,6 +343,7 @@ TransferHate: Transfers Npc's hate from you to your target.
Transformation: Transforms into the specified transformation id and gives its template skills.
TrapDetect: Detects a hidden trap.
TrapRemove: Removes a trap.
+TriggerSkill: Triggers a specified skill. (l2jmobius)
TriggerSkillByAttack: Triggers a specified skill when you deal damage.
TriggerSkillByAvoid: Triggers a specified skill when you avoid autoattack damage.
TriggerSkillByDamage: Triggers a specified skill when you receive damage.
diff --git a/L2J_Mobius_9.0_ReturnOfTheQueenAnt/dist/game/data/scripts/handlers/EffectMasterHandler.java b/L2J_Mobius_9.0_ReturnOfTheQueenAnt/dist/game/data/scripts/handlers/EffectMasterHandler.java
index 9fa5a16e8e..41ac762926 100644
--- a/L2J_Mobius_9.0_ReturnOfTheQueenAnt/dist/game/data/scripts/handlers/EffectMasterHandler.java
+++ b/L2J_Mobius_9.0_ReturnOfTheQueenAnt/dist/game/data/scripts/handlers/EffectMasterHandler.java
@@ -376,6 +376,7 @@ public class EffectMasterHandler
EffectHandler.getInstance().registerHandler("Transformation", Transformation::new);
EffectHandler.getInstance().registerHandler("TrapDetect", TrapDetect::new);
EffectHandler.getInstance().registerHandler("TrapRemove", TrapRemove::new);
+ EffectHandler.getInstance().registerHandler("TriggerSkill", TriggerSkill::new);
EffectHandler.getInstance().registerHandler("TriggerSkillByAttack", TriggerSkillByAttack::new);
EffectHandler.getInstance().registerHandler("TriggerSkillByAvoid", TriggerSkillByAvoid::new);
EffectHandler.getInstance().registerHandler("TriggerSkillByDamage", TriggerSkillByDamage::new);
diff --git a/L2J_Mobius_9.0_ReturnOfTheQueenAnt/dist/game/data/scripts/handlers/effecthandlers/TriggerSkill.java b/L2J_Mobius_9.0_ReturnOfTheQueenAnt/dist/game/data/scripts/handlers/effecthandlers/TriggerSkill.java
new file mode 100644
index 0000000000..1fe23aaf20
--- /dev/null
+++ b/L2J_Mobius_9.0_ReturnOfTheQueenAnt/dist/game/data/scripts/handlers/effecthandlers/TriggerSkill.java
@@ -0,0 +1,95 @@
+/*
+ * This file is part of the L2J Mobius project.
+ *
+ * This program is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program. If not, see .
+ */
+package handlers.effecthandlers;
+
+import org.l2jmobius.commons.concurrent.ThreadPool;
+import org.l2jmobius.gameserver.data.xml.SkillData;
+import org.l2jmobius.gameserver.handler.TargetHandler;
+import org.l2jmobius.gameserver.model.StatSet;
+import org.l2jmobius.gameserver.model.WorldObject;
+import org.l2jmobius.gameserver.model.actor.Creature;
+import org.l2jmobius.gameserver.model.effects.AbstractEffect;
+import org.l2jmobius.gameserver.model.holders.SkillHolder;
+import org.l2jmobius.gameserver.model.holders.SkillUseHolder;
+import org.l2jmobius.gameserver.model.items.instance.ItemInstance;
+import org.l2jmobius.gameserver.model.skills.Skill;
+import org.l2jmobius.gameserver.model.skills.targets.TargetType;
+
+/**
+ * Trigger Skill effect implementation.
+ * @author Mobius
+ */
+public class TriggerSkill extends AbstractEffect
+{
+ private final SkillHolder _skill;
+ private final TargetType _targetType;
+ private final boolean _adjustLevel;
+
+ public TriggerSkill(StatSet params)
+ {
+ _skill = new SkillHolder(params.getInt("skillId"), params.getInt("skillLevel", 1));
+ _targetType = params.getEnum("targetType", TargetType.class, TargetType.TARGET);
+ _adjustLevel = params.getBoolean("adjustLevel", false);
+ }
+
+ @Override
+ public boolean isInstant()
+ {
+ return true;
+ }
+
+ @Override
+ public void instant(Creature effector, Creature effected, Skill skill, ItemInstance item)
+ {
+ if ((effected == null) || !effected.isCreature() || !effector.isPlayer())
+ {
+ return;
+ }
+
+ final Skill triggerSkill = _adjustLevel ? SkillData.getInstance().getSkill(_skill.getSkillId(), skill.getLevel()) : _skill.getSkill();
+ if (triggerSkill == null)
+ {
+ return;
+ }
+
+ WorldObject target = null;
+ try
+ {
+ target = TargetHandler.getInstance().getHandler(_targetType).getTarget(effector, effected, triggerSkill, false, false, false);
+ }
+ catch (Exception e)
+ {
+ LOGGER.warning("Exception in ITargetTypeHandler.getTarget(): " + e.getMessage());
+ }
+
+ if ((target == null) || !target.isCreature())
+ {
+ return;
+ }
+
+ final SkillUseHolder queuedSkill = effector.getActingPlayer().getQueuedSkill();
+ if (queuedSkill != null)
+ {
+ ThreadPool.schedule(() ->
+ {
+ effector.getActingPlayer().setQueuedSkill(queuedSkill.getSkill(), queuedSkill.getItem(), queuedSkill.isCtrlPressed(), queuedSkill.isShiftPressed());
+ }, 10);
+ }
+
+ effector.getActingPlayer().setQueuedSkill(triggerSkill, null, false, false);
+ }
+}
diff --git a/L2J_Mobius_9.0_ReturnOfTheQueenAnt/dist/game/data/stats/skills/documentation.txt b/L2J_Mobius_9.0_ReturnOfTheQueenAnt/dist/game/data/stats/skills/documentation.txt
index f13bdc7b42..739004dd72 100644
--- a/L2J_Mobius_9.0_ReturnOfTheQueenAnt/dist/game/data/stats/skills/documentation.txt
+++ b/L2J_Mobius_9.0_ReturnOfTheQueenAnt/dist/game/data/stats/skills/documentation.txt
@@ -343,6 +343,7 @@ TransferHate: Transfers Npc's hate from you to your target.
Transformation: Transforms into the specified transformation id and gives its template skills.
TrapDetect: Detects a hidden trap.
TrapRemove: Removes a trap.
+TriggerSkill: Triggers a specified skill. (l2jmobius)
TriggerSkillByAttack: Triggers a specified skill when you deal damage.
TriggerSkillByAvoid: Triggers a specified skill when you avoid autoattack damage.
TriggerSkillByDamage: Triggers a specified skill when you receive damage.
diff --git a/L2J_Mobius_Classic_2.0_Saviors/dist/game/data/scripts/handlers/EffectMasterHandler.java b/L2J_Mobius_Classic_2.0_Saviors/dist/game/data/scripts/handlers/EffectMasterHandler.java
index aa14a7da76..86b06303c2 100644
--- a/L2J_Mobius_Classic_2.0_Saviors/dist/game/data/scripts/handlers/EffectMasterHandler.java
+++ b/L2J_Mobius_Classic_2.0_Saviors/dist/game/data/scripts/handlers/EffectMasterHandler.java
@@ -360,6 +360,7 @@ public class EffectMasterHandler
EffectHandler.getInstance().registerHandler("Transformation", Transformation::new);
EffectHandler.getInstance().registerHandler("TrapDetect", TrapDetect::new);
EffectHandler.getInstance().registerHandler("TrapRemove", TrapRemove::new);
+ EffectHandler.getInstance().registerHandler("TriggerSkill", TriggerSkill::new);
EffectHandler.getInstance().registerHandler("TriggerSkillByAttack", TriggerSkillByAttack::new);
EffectHandler.getInstance().registerHandler("TriggerSkillByAvoid", TriggerSkillByAvoid::new);
EffectHandler.getInstance().registerHandler("TriggerSkillByDamage", TriggerSkillByDamage::new);
diff --git a/L2J_Mobius_Classic_2.0_Saviors/dist/game/data/scripts/handlers/effecthandlers/TriggerSkill.java b/L2J_Mobius_Classic_2.0_Saviors/dist/game/data/scripts/handlers/effecthandlers/TriggerSkill.java
new file mode 100644
index 0000000000..1fe23aaf20
--- /dev/null
+++ b/L2J_Mobius_Classic_2.0_Saviors/dist/game/data/scripts/handlers/effecthandlers/TriggerSkill.java
@@ -0,0 +1,95 @@
+/*
+ * This file is part of the L2J Mobius project.
+ *
+ * This program is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program. If not, see .
+ */
+package handlers.effecthandlers;
+
+import org.l2jmobius.commons.concurrent.ThreadPool;
+import org.l2jmobius.gameserver.data.xml.SkillData;
+import org.l2jmobius.gameserver.handler.TargetHandler;
+import org.l2jmobius.gameserver.model.StatSet;
+import org.l2jmobius.gameserver.model.WorldObject;
+import org.l2jmobius.gameserver.model.actor.Creature;
+import org.l2jmobius.gameserver.model.effects.AbstractEffect;
+import org.l2jmobius.gameserver.model.holders.SkillHolder;
+import org.l2jmobius.gameserver.model.holders.SkillUseHolder;
+import org.l2jmobius.gameserver.model.items.instance.ItemInstance;
+import org.l2jmobius.gameserver.model.skills.Skill;
+import org.l2jmobius.gameserver.model.skills.targets.TargetType;
+
+/**
+ * Trigger Skill effect implementation.
+ * @author Mobius
+ */
+public class TriggerSkill extends AbstractEffect
+{
+ private final SkillHolder _skill;
+ private final TargetType _targetType;
+ private final boolean _adjustLevel;
+
+ public TriggerSkill(StatSet params)
+ {
+ _skill = new SkillHolder(params.getInt("skillId"), params.getInt("skillLevel", 1));
+ _targetType = params.getEnum("targetType", TargetType.class, TargetType.TARGET);
+ _adjustLevel = params.getBoolean("adjustLevel", false);
+ }
+
+ @Override
+ public boolean isInstant()
+ {
+ return true;
+ }
+
+ @Override
+ public void instant(Creature effector, Creature effected, Skill skill, ItemInstance item)
+ {
+ if ((effected == null) || !effected.isCreature() || !effector.isPlayer())
+ {
+ return;
+ }
+
+ final Skill triggerSkill = _adjustLevel ? SkillData.getInstance().getSkill(_skill.getSkillId(), skill.getLevel()) : _skill.getSkill();
+ if (triggerSkill == null)
+ {
+ return;
+ }
+
+ WorldObject target = null;
+ try
+ {
+ target = TargetHandler.getInstance().getHandler(_targetType).getTarget(effector, effected, triggerSkill, false, false, false);
+ }
+ catch (Exception e)
+ {
+ LOGGER.warning("Exception in ITargetTypeHandler.getTarget(): " + e.getMessage());
+ }
+
+ if ((target == null) || !target.isCreature())
+ {
+ return;
+ }
+
+ final SkillUseHolder queuedSkill = effector.getActingPlayer().getQueuedSkill();
+ if (queuedSkill != null)
+ {
+ ThreadPool.schedule(() ->
+ {
+ effector.getActingPlayer().setQueuedSkill(queuedSkill.getSkill(), queuedSkill.getItem(), queuedSkill.isCtrlPressed(), queuedSkill.isShiftPressed());
+ }, 10);
+ }
+
+ effector.getActingPlayer().setQueuedSkill(triggerSkill, null, false, false);
+ }
+}
diff --git a/L2J_Mobius_Classic_2.0_Saviors/dist/game/data/stats/skills/documentation.txt b/L2J_Mobius_Classic_2.0_Saviors/dist/game/data/stats/skills/documentation.txt
index 732ad6a34e..1f4d879ef5 100644
--- a/L2J_Mobius_Classic_2.0_Saviors/dist/game/data/stats/skills/documentation.txt
+++ b/L2J_Mobius_Classic_2.0_Saviors/dist/game/data/stats/skills/documentation.txt
@@ -328,6 +328,7 @@ TransferHate: Transfers Npc's hate from you to your target.
Transformation: Transforms into the specified transformation id and gives its template skills.
TrapDetect: Detects a hidden trap.
TrapRemove: Removes a trap.
+TriggerSkill: Triggers a specified skill. (l2jmobius)
TriggerSkillByAttack: Triggers a specified skill when you deal damage.
TriggerSkillByAvoid: Triggers a specified skill when you avoid autoattack damage.
TriggerSkillByDamage: Triggers a specified skill when you receive damage.
diff --git a/L2J_Mobius_Classic_2.1_Zaken/dist/game/data/scripts/handlers/EffectMasterHandler.java b/L2J_Mobius_Classic_2.1_Zaken/dist/game/data/scripts/handlers/EffectMasterHandler.java
index aa14a7da76..86b06303c2 100644
--- a/L2J_Mobius_Classic_2.1_Zaken/dist/game/data/scripts/handlers/EffectMasterHandler.java
+++ b/L2J_Mobius_Classic_2.1_Zaken/dist/game/data/scripts/handlers/EffectMasterHandler.java
@@ -360,6 +360,7 @@ public class EffectMasterHandler
EffectHandler.getInstance().registerHandler("Transformation", Transformation::new);
EffectHandler.getInstance().registerHandler("TrapDetect", TrapDetect::new);
EffectHandler.getInstance().registerHandler("TrapRemove", TrapRemove::new);
+ EffectHandler.getInstance().registerHandler("TriggerSkill", TriggerSkill::new);
EffectHandler.getInstance().registerHandler("TriggerSkillByAttack", TriggerSkillByAttack::new);
EffectHandler.getInstance().registerHandler("TriggerSkillByAvoid", TriggerSkillByAvoid::new);
EffectHandler.getInstance().registerHandler("TriggerSkillByDamage", TriggerSkillByDamage::new);
diff --git a/L2J_Mobius_Classic_2.1_Zaken/dist/game/data/scripts/handlers/effecthandlers/TriggerSkill.java b/L2J_Mobius_Classic_2.1_Zaken/dist/game/data/scripts/handlers/effecthandlers/TriggerSkill.java
new file mode 100644
index 0000000000..1fe23aaf20
--- /dev/null
+++ b/L2J_Mobius_Classic_2.1_Zaken/dist/game/data/scripts/handlers/effecthandlers/TriggerSkill.java
@@ -0,0 +1,95 @@
+/*
+ * This file is part of the L2J Mobius project.
+ *
+ * This program is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program. If not, see .
+ */
+package handlers.effecthandlers;
+
+import org.l2jmobius.commons.concurrent.ThreadPool;
+import org.l2jmobius.gameserver.data.xml.SkillData;
+import org.l2jmobius.gameserver.handler.TargetHandler;
+import org.l2jmobius.gameserver.model.StatSet;
+import org.l2jmobius.gameserver.model.WorldObject;
+import org.l2jmobius.gameserver.model.actor.Creature;
+import org.l2jmobius.gameserver.model.effects.AbstractEffect;
+import org.l2jmobius.gameserver.model.holders.SkillHolder;
+import org.l2jmobius.gameserver.model.holders.SkillUseHolder;
+import org.l2jmobius.gameserver.model.items.instance.ItemInstance;
+import org.l2jmobius.gameserver.model.skills.Skill;
+import org.l2jmobius.gameserver.model.skills.targets.TargetType;
+
+/**
+ * Trigger Skill effect implementation.
+ * @author Mobius
+ */
+public class TriggerSkill extends AbstractEffect
+{
+ private final SkillHolder _skill;
+ private final TargetType _targetType;
+ private final boolean _adjustLevel;
+
+ public TriggerSkill(StatSet params)
+ {
+ _skill = new SkillHolder(params.getInt("skillId"), params.getInt("skillLevel", 1));
+ _targetType = params.getEnum("targetType", TargetType.class, TargetType.TARGET);
+ _adjustLevel = params.getBoolean("adjustLevel", false);
+ }
+
+ @Override
+ public boolean isInstant()
+ {
+ return true;
+ }
+
+ @Override
+ public void instant(Creature effector, Creature effected, Skill skill, ItemInstance item)
+ {
+ if ((effected == null) || !effected.isCreature() || !effector.isPlayer())
+ {
+ return;
+ }
+
+ final Skill triggerSkill = _adjustLevel ? SkillData.getInstance().getSkill(_skill.getSkillId(), skill.getLevel()) : _skill.getSkill();
+ if (triggerSkill == null)
+ {
+ return;
+ }
+
+ WorldObject target = null;
+ try
+ {
+ target = TargetHandler.getInstance().getHandler(_targetType).getTarget(effector, effected, triggerSkill, false, false, false);
+ }
+ catch (Exception e)
+ {
+ LOGGER.warning("Exception in ITargetTypeHandler.getTarget(): " + e.getMessage());
+ }
+
+ if ((target == null) || !target.isCreature())
+ {
+ return;
+ }
+
+ final SkillUseHolder queuedSkill = effector.getActingPlayer().getQueuedSkill();
+ if (queuedSkill != null)
+ {
+ ThreadPool.schedule(() ->
+ {
+ effector.getActingPlayer().setQueuedSkill(queuedSkill.getSkill(), queuedSkill.getItem(), queuedSkill.isCtrlPressed(), queuedSkill.isShiftPressed());
+ }, 10);
+ }
+
+ effector.getActingPlayer().setQueuedSkill(triggerSkill, null, false, false);
+ }
+}
diff --git a/L2J_Mobius_Classic_2.1_Zaken/dist/game/data/stats/skills/documentation.txt b/L2J_Mobius_Classic_2.1_Zaken/dist/game/data/stats/skills/documentation.txt
index 732ad6a34e..1f4d879ef5 100644
--- a/L2J_Mobius_Classic_2.1_Zaken/dist/game/data/stats/skills/documentation.txt
+++ b/L2J_Mobius_Classic_2.1_Zaken/dist/game/data/stats/skills/documentation.txt
@@ -328,6 +328,7 @@ TransferHate: Transfers Npc's hate from you to your target.
Transformation: Transforms into the specified transformation id and gives its template skills.
TrapDetect: Detects a hidden trap.
TrapRemove: Removes a trap.
+TriggerSkill: Triggers a specified skill. (l2jmobius)
TriggerSkillByAttack: Triggers a specified skill when you deal damage.
TriggerSkillByAvoid: Triggers a specified skill when you avoid autoattack damage.
TriggerSkillByDamage: Triggers a specified skill when you receive damage.
diff --git a/L2J_Mobius_Classic_2.2_Antharas/dist/game/data/scripts/handlers/EffectMasterHandler.java b/L2J_Mobius_Classic_2.2_Antharas/dist/game/data/scripts/handlers/EffectMasterHandler.java
index 45c2b835f6..8430a4c68a 100644
--- a/L2J_Mobius_Classic_2.2_Antharas/dist/game/data/scripts/handlers/EffectMasterHandler.java
+++ b/L2J_Mobius_Classic_2.2_Antharas/dist/game/data/scripts/handlers/EffectMasterHandler.java
@@ -361,6 +361,7 @@ public class EffectMasterHandler
EffectHandler.getInstance().registerHandler("Transformation", Transformation::new);
EffectHandler.getInstance().registerHandler("TrapDetect", TrapDetect::new);
EffectHandler.getInstance().registerHandler("TrapRemove", TrapRemove::new);
+ EffectHandler.getInstance().registerHandler("TriggerSkill", TriggerSkill::new);
EffectHandler.getInstance().registerHandler("TriggerSkillByAttack", TriggerSkillByAttack::new);
EffectHandler.getInstance().registerHandler("TriggerSkillByAvoid", TriggerSkillByAvoid::new);
EffectHandler.getInstance().registerHandler("TriggerSkillByDamage", TriggerSkillByDamage::new);
diff --git a/L2J_Mobius_Classic_2.2_Antharas/dist/game/data/scripts/handlers/effecthandlers/TriggerSkill.java b/L2J_Mobius_Classic_2.2_Antharas/dist/game/data/scripts/handlers/effecthandlers/TriggerSkill.java
new file mode 100644
index 0000000000..1fe23aaf20
--- /dev/null
+++ b/L2J_Mobius_Classic_2.2_Antharas/dist/game/data/scripts/handlers/effecthandlers/TriggerSkill.java
@@ -0,0 +1,95 @@
+/*
+ * This file is part of the L2J Mobius project.
+ *
+ * This program is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program. If not, see .
+ */
+package handlers.effecthandlers;
+
+import org.l2jmobius.commons.concurrent.ThreadPool;
+import org.l2jmobius.gameserver.data.xml.SkillData;
+import org.l2jmobius.gameserver.handler.TargetHandler;
+import org.l2jmobius.gameserver.model.StatSet;
+import org.l2jmobius.gameserver.model.WorldObject;
+import org.l2jmobius.gameserver.model.actor.Creature;
+import org.l2jmobius.gameserver.model.effects.AbstractEffect;
+import org.l2jmobius.gameserver.model.holders.SkillHolder;
+import org.l2jmobius.gameserver.model.holders.SkillUseHolder;
+import org.l2jmobius.gameserver.model.items.instance.ItemInstance;
+import org.l2jmobius.gameserver.model.skills.Skill;
+import org.l2jmobius.gameserver.model.skills.targets.TargetType;
+
+/**
+ * Trigger Skill effect implementation.
+ * @author Mobius
+ */
+public class TriggerSkill extends AbstractEffect
+{
+ private final SkillHolder _skill;
+ private final TargetType _targetType;
+ private final boolean _adjustLevel;
+
+ public TriggerSkill(StatSet params)
+ {
+ _skill = new SkillHolder(params.getInt("skillId"), params.getInt("skillLevel", 1));
+ _targetType = params.getEnum("targetType", TargetType.class, TargetType.TARGET);
+ _adjustLevel = params.getBoolean("adjustLevel", false);
+ }
+
+ @Override
+ public boolean isInstant()
+ {
+ return true;
+ }
+
+ @Override
+ public void instant(Creature effector, Creature effected, Skill skill, ItemInstance item)
+ {
+ if ((effected == null) || !effected.isCreature() || !effector.isPlayer())
+ {
+ return;
+ }
+
+ final Skill triggerSkill = _adjustLevel ? SkillData.getInstance().getSkill(_skill.getSkillId(), skill.getLevel()) : _skill.getSkill();
+ if (triggerSkill == null)
+ {
+ return;
+ }
+
+ WorldObject target = null;
+ try
+ {
+ target = TargetHandler.getInstance().getHandler(_targetType).getTarget(effector, effected, triggerSkill, false, false, false);
+ }
+ catch (Exception e)
+ {
+ LOGGER.warning("Exception in ITargetTypeHandler.getTarget(): " + e.getMessage());
+ }
+
+ if ((target == null) || !target.isCreature())
+ {
+ return;
+ }
+
+ final SkillUseHolder queuedSkill = effector.getActingPlayer().getQueuedSkill();
+ if (queuedSkill != null)
+ {
+ ThreadPool.schedule(() ->
+ {
+ effector.getActingPlayer().setQueuedSkill(queuedSkill.getSkill(), queuedSkill.getItem(), queuedSkill.isCtrlPressed(), queuedSkill.isShiftPressed());
+ }, 10);
+ }
+
+ effector.getActingPlayer().setQueuedSkill(triggerSkill, null, false, false);
+ }
+}
diff --git a/L2J_Mobius_Classic_2.2_Antharas/dist/game/data/stats/skills/documentation.txt b/L2J_Mobius_Classic_2.2_Antharas/dist/game/data/stats/skills/documentation.txt
index 86299a7319..2e36c5bd0c 100644
--- a/L2J_Mobius_Classic_2.2_Antharas/dist/game/data/stats/skills/documentation.txt
+++ b/L2J_Mobius_Classic_2.2_Antharas/dist/game/data/stats/skills/documentation.txt
@@ -329,6 +329,7 @@ TransferHate: Transfers Npc's hate from you to your target.
Transformation: Transforms into the specified transformation id and gives its template skills.
TrapDetect: Detects a hidden trap.
TrapRemove: Removes a trap.
+TriggerSkill: Triggers a specified skill. (l2jmobius)
TriggerSkillByAttack: Triggers a specified skill when you deal damage.
TriggerSkillByAvoid: Triggers a specified skill when you avoid autoattack damage.
TriggerSkillByDamage: Triggers a specified skill when you receive damage.
diff --git a/L2J_Mobius_Classic_2.3_SevenSigns/dist/game/data/scripts/handlers/EffectMasterHandler.java b/L2J_Mobius_Classic_2.3_SevenSigns/dist/game/data/scripts/handlers/EffectMasterHandler.java
index ea78426d30..fcf2e9b815 100644
--- a/L2J_Mobius_Classic_2.3_SevenSigns/dist/game/data/scripts/handlers/EffectMasterHandler.java
+++ b/L2J_Mobius_Classic_2.3_SevenSigns/dist/game/data/scripts/handlers/EffectMasterHandler.java
@@ -365,6 +365,7 @@ public class EffectMasterHandler
EffectHandler.getInstance().registerHandler("Transformation", Transformation::new);
EffectHandler.getInstance().registerHandler("TrapDetect", TrapDetect::new);
EffectHandler.getInstance().registerHandler("TrapRemove", TrapRemove::new);
+ EffectHandler.getInstance().registerHandler("TriggerSkill", TriggerSkill::new);
EffectHandler.getInstance().registerHandler("TriggerSkillByAttack", TriggerSkillByAttack::new);
EffectHandler.getInstance().registerHandler("TriggerSkillByAvoid", TriggerSkillByAvoid::new);
EffectHandler.getInstance().registerHandler("TriggerSkillByDamage", TriggerSkillByDamage::new);
diff --git a/L2J_Mobius_Classic_2.3_SevenSigns/dist/game/data/scripts/handlers/effecthandlers/TriggerSkill.java b/L2J_Mobius_Classic_2.3_SevenSigns/dist/game/data/scripts/handlers/effecthandlers/TriggerSkill.java
new file mode 100644
index 0000000000..1fe23aaf20
--- /dev/null
+++ b/L2J_Mobius_Classic_2.3_SevenSigns/dist/game/data/scripts/handlers/effecthandlers/TriggerSkill.java
@@ -0,0 +1,95 @@
+/*
+ * This file is part of the L2J Mobius project.
+ *
+ * This program is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program. If not, see .
+ */
+package handlers.effecthandlers;
+
+import org.l2jmobius.commons.concurrent.ThreadPool;
+import org.l2jmobius.gameserver.data.xml.SkillData;
+import org.l2jmobius.gameserver.handler.TargetHandler;
+import org.l2jmobius.gameserver.model.StatSet;
+import org.l2jmobius.gameserver.model.WorldObject;
+import org.l2jmobius.gameserver.model.actor.Creature;
+import org.l2jmobius.gameserver.model.effects.AbstractEffect;
+import org.l2jmobius.gameserver.model.holders.SkillHolder;
+import org.l2jmobius.gameserver.model.holders.SkillUseHolder;
+import org.l2jmobius.gameserver.model.items.instance.ItemInstance;
+import org.l2jmobius.gameserver.model.skills.Skill;
+import org.l2jmobius.gameserver.model.skills.targets.TargetType;
+
+/**
+ * Trigger Skill effect implementation.
+ * @author Mobius
+ */
+public class TriggerSkill extends AbstractEffect
+{
+ private final SkillHolder _skill;
+ private final TargetType _targetType;
+ private final boolean _adjustLevel;
+
+ public TriggerSkill(StatSet params)
+ {
+ _skill = new SkillHolder(params.getInt("skillId"), params.getInt("skillLevel", 1));
+ _targetType = params.getEnum("targetType", TargetType.class, TargetType.TARGET);
+ _adjustLevel = params.getBoolean("adjustLevel", false);
+ }
+
+ @Override
+ public boolean isInstant()
+ {
+ return true;
+ }
+
+ @Override
+ public void instant(Creature effector, Creature effected, Skill skill, ItemInstance item)
+ {
+ if ((effected == null) || !effected.isCreature() || !effector.isPlayer())
+ {
+ return;
+ }
+
+ final Skill triggerSkill = _adjustLevel ? SkillData.getInstance().getSkill(_skill.getSkillId(), skill.getLevel()) : _skill.getSkill();
+ if (triggerSkill == null)
+ {
+ return;
+ }
+
+ WorldObject target = null;
+ try
+ {
+ target = TargetHandler.getInstance().getHandler(_targetType).getTarget(effector, effected, triggerSkill, false, false, false);
+ }
+ catch (Exception e)
+ {
+ LOGGER.warning("Exception in ITargetTypeHandler.getTarget(): " + e.getMessage());
+ }
+
+ if ((target == null) || !target.isCreature())
+ {
+ return;
+ }
+
+ final SkillUseHolder queuedSkill = effector.getActingPlayer().getQueuedSkill();
+ if (queuedSkill != null)
+ {
+ ThreadPool.schedule(() ->
+ {
+ effector.getActingPlayer().setQueuedSkill(queuedSkill.getSkill(), queuedSkill.getItem(), queuedSkill.isCtrlPressed(), queuedSkill.isShiftPressed());
+ }, 10);
+ }
+
+ effector.getActingPlayer().setQueuedSkill(triggerSkill, null, false, false);
+ }
+}
diff --git a/L2J_Mobius_Classic_2.3_SevenSigns/dist/game/data/stats/skills/documentation.txt b/L2J_Mobius_Classic_2.3_SevenSigns/dist/game/data/stats/skills/documentation.txt
index accf61f799..adebacae1b 100644
--- a/L2J_Mobius_Classic_2.3_SevenSigns/dist/game/data/stats/skills/documentation.txt
+++ b/L2J_Mobius_Classic_2.3_SevenSigns/dist/game/data/stats/skills/documentation.txt
@@ -333,6 +333,7 @@ TransferHate: Transfers Npc's hate from you to your target.
Transformation: Transforms into the specified transformation id and gives its template skills.
TrapDetect: Detects a hidden trap.
TrapRemove: Removes a trap.
+TriggerSkill: Triggers a specified skill. (l2jmobius)
TriggerSkillByAttack: Triggers a specified skill when you deal damage.
TriggerSkillByAvoid: Triggers a specified skill when you avoid autoattack damage.
TriggerSkillByDamage: Triggers a specified skill when you receive damage.
diff --git a/L2J_Mobius_Classic_2.4_SecretOfEmpire/dist/game/data/scripts/handlers/EffectMasterHandler.java b/L2J_Mobius_Classic_2.4_SecretOfEmpire/dist/game/data/scripts/handlers/EffectMasterHandler.java
index ea78426d30..fcf2e9b815 100644
--- a/L2J_Mobius_Classic_2.4_SecretOfEmpire/dist/game/data/scripts/handlers/EffectMasterHandler.java
+++ b/L2J_Mobius_Classic_2.4_SecretOfEmpire/dist/game/data/scripts/handlers/EffectMasterHandler.java
@@ -365,6 +365,7 @@ public class EffectMasterHandler
EffectHandler.getInstance().registerHandler("Transformation", Transformation::new);
EffectHandler.getInstance().registerHandler("TrapDetect", TrapDetect::new);
EffectHandler.getInstance().registerHandler("TrapRemove", TrapRemove::new);
+ EffectHandler.getInstance().registerHandler("TriggerSkill", TriggerSkill::new);
EffectHandler.getInstance().registerHandler("TriggerSkillByAttack", TriggerSkillByAttack::new);
EffectHandler.getInstance().registerHandler("TriggerSkillByAvoid", TriggerSkillByAvoid::new);
EffectHandler.getInstance().registerHandler("TriggerSkillByDamage", TriggerSkillByDamage::new);
diff --git a/L2J_Mobius_Classic_2.4_SecretOfEmpire/dist/game/data/scripts/handlers/effecthandlers/TriggerSkill.java b/L2J_Mobius_Classic_2.4_SecretOfEmpire/dist/game/data/scripts/handlers/effecthandlers/TriggerSkill.java
new file mode 100644
index 0000000000..1fe23aaf20
--- /dev/null
+++ b/L2J_Mobius_Classic_2.4_SecretOfEmpire/dist/game/data/scripts/handlers/effecthandlers/TriggerSkill.java
@@ -0,0 +1,95 @@
+/*
+ * This file is part of the L2J Mobius project.
+ *
+ * This program is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program. If not, see .
+ */
+package handlers.effecthandlers;
+
+import org.l2jmobius.commons.concurrent.ThreadPool;
+import org.l2jmobius.gameserver.data.xml.SkillData;
+import org.l2jmobius.gameserver.handler.TargetHandler;
+import org.l2jmobius.gameserver.model.StatSet;
+import org.l2jmobius.gameserver.model.WorldObject;
+import org.l2jmobius.gameserver.model.actor.Creature;
+import org.l2jmobius.gameserver.model.effects.AbstractEffect;
+import org.l2jmobius.gameserver.model.holders.SkillHolder;
+import org.l2jmobius.gameserver.model.holders.SkillUseHolder;
+import org.l2jmobius.gameserver.model.items.instance.ItemInstance;
+import org.l2jmobius.gameserver.model.skills.Skill;
+import org.l2jmobius.gameserver.model.skills.targets.TargetType;
+
+/**
+ * Trigger Skill effect implementation.
+ * @author Mobius
+ */
+public class TriggerSkill extends AbstractEffect
+{
+ private final SkillHolder _skill;
+ private final TargetType _targetType;
+ private final boolean _adjustLevel;
+
+ public TriggerSkill(StatSet params)
+ {
+ _skill = new SkillHolder(params.getInt("skillId"), params.getInt("skillLevel", 1));
+ _targetType = params.getEnum("targetType", TargetType.class, TargetType.TARGET);
+ _adjustLevel = params.getBoolean("adjustLevel", false);
+ }
+
+ @Override
+ public boolean isInstant()
+ {
+ return true;
+ }
+
+ @Override
+ public void instant(Creature effector, Creature effected, Skill skill, ItemInstance item)
+ {
+ if ((effected == null) || !effected.isCreature() || !effector.isPlayer())
+ {
+ return;
+ }
+
+ final Skill triggerSkill = _adjustLevel ? SkillData.getInstance().getSkill(_skill.getSkillId(), skill.getLevel()) : _skill.getSkill();
+ if (triggerSkill == null)
+ {
+ return;
+ }
+
+ WorldObject target = null;
+ try
+ {
+ target = TargetHandler.getInstance().getHandler(_targetType).getTarget(effector, effected, triggerSkill, false, false, false);
+ }
+ catch (Exception e)
+ {
+ LOGGER.warning("Exception in ITargetTypeHandler.getTarget(): " + e.getMessage());
+ }
+
+ if ((target == null) || !target.isCreature())
+ {
+ return;
+ }
+
+ final SkillUseHolder queuedSkill = effector.getActingPlayer().getQueuedSkill();
+ if (queuedSkill != null)
+ {
+ ThreadPool.schedule(() ->
+ {
+ effector.getActingPlayer().setQueuedSkill(queuedSkill.getSkill(), queuedSkill.getItem(), queuedSkill.isCtrlPressed(), queuedSkill.isShiftPressed());
+ }, 10);
+ }
+
+ effector.getActingPlayer().setQueuedSkill(triggerSkill, null, false, false);
+ }
+}
diff --git a/L2J_Mobius_Classic_2.4_SecretOfEmpire/dist/game/data/stats/skills/documentation.txt b/L2J_Mobius_Classic_2.4_SecretOfEmpire/dist/game/data/stats/skills/documentation.txt
index accf61f799..adebacae1b 100644
--- a/L2J_Mobius_Classic_2.4_SecretOfEmpire/dist/game/data/stats/skills/documentation.txt
+++ b/L2J_Mobius_Classic_2.4_SecretOfEmpire/dist/game/data/stats/skills/documentation.txt
@@ -333,6 +333,7 @@ TransferHate: Transfers Npc's hate from you to your target.
Transformation: Transforms into the specified transformation id and gives its template skills.
TrapDetect: Detects a hidden trap.
TrapRemove: Removes a trap.
+TriggerSkill: Triggers a specified skill. (l2jmobius)
TriggerSkillByAttack: Triggers a specified skill when you deal damage.
TriggerSkillByAvoid: Triggers a specified skill when you avoid autoattack damage.
TriggerSkillByDamage: Triggers a specified skill when you receive damage.
diff --git a/L2J_Mobius_Classic_3.0_TheKamael/dist/game/data/scripts/handlers/EffectMasterHandler.java b/L2J_Mobius_Classic_3.0_TheKamael/dist/game/data/scripts/handlers/EffectMasterHandler.java
index 83fc72e9a5..1154cf3494 100644
--- a/L2J_Mobius_Classic_3.0_TheKamael/dist/game/data/scripts/handlers/EffectMasterHandler.java
+++ b/L2J_Mobius_Classic_3.0_TheKamael/dist/game/data/scripts/handlers/EffectMasterHandler.java
@@ -367,6 +367,7 @@ public class EffectMasterHandler
EffectHandler.getInstance().registerHandler("Transformation", Transformation::new);
EffectHandler.getInstance().registerHandler("TrapDetect", TrapDetect::new);
EffectHandler.getInstance().registerHandler("TrapRemove", TrapRemove::new);
+ EffectHandler.getInstance().registerHandler("TriggerSkill", TriggerSkill::new);
EffectHandler.getInstance().registerHandler("TriggerSkillByAttack", TriggerSkillByAttack::new);
EffectHandler.getInstance().registerHandler("TriggerSkillByAvoid", TriggerSkillByAvoid::new);
EffectHandler.getInstance().registerHandler("TriggerSkillByDamage", TriggerSkillByDamage::new);
diff --git a/L2J_Mobius_Classic_3.0_TheKamael/dist/game/data/scripts/handlers/effecthandlers/TriggerSkill.java b/L2J_Mobius_Classic_3.0_TheKamael/dist/game/data/scripts/handlers/effecthandlers/TriggerSkill.java
new file mode 100644
index 0000000000..1fe23aaf20
--- /dev/null
+++ b/L2J_Mobius_Classic_3.0_TheKamael/dist/game/data/scripts/handlers/effecthandlers/TriggerSkill.java
@@ -0,0 +1,95 @@
+/*
+ * This file is part of the L2J Mobius project.
+ *
+ * This program is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program. If not, see .
+ */
+package handlers.effecthandlers;
+
+import org.l2jmobius.commons.concurrent.ThreadPool;
+import org.l2jmobius.gameserver.data.xml.SkillData;
+import org.l2jmobius.gameserver.handler.TargetHandler;
+import org.l2jmobius.gameserver.model.StatSet;
+import org.l2jmobius.gameserver.model.WorldObject;
+import org.l2jmobius.gameserver.model.actor.Creature;
+import org.l2jmobius.gameserver.model.effects.AbstractEffect;
+import org.l2jmobius.gameserver.model.holders.SkillHolder;
+import org.l2jmobius.gameserver.model.holders.SkillUseHolder;
+import org.l2jmobius.gameserver.model.items.instance.ItemInstance;
+import org.l2jmobius.gameserver.model.skills.Skill;
+import org.l2jmobius.gameserver.model.skills.targets.TargetType;
+
+/**
+ * Trigger Skill effect implementation.
+ * @author Mobius
+ */
+public class TriggerSkill extends AbstractEffect
+{
+ private final SkillHolder _skill;
+ private final TargetType _targetType;
+ private final boolean _adjustLevel;
+
+ public TriggerSkill(StatSet params)
+ {
+ _skill = new SkillHolder(params.getInt("skillId"), params.getInt("skillLevel", 1));
+ _targetType = params.getEnum("targetType", TargetType.class, TargetType.TARGET);
+ _adjustLevel = params.getBoolean("adjustLevel", false);
+ }
+
+ @Override
+ public boolean isInstant()
+ {
+ return true;
+ }
+
+ @Override
+ public void instant(Creature effector, Creature effected, Skill skill, ItemInstance item)
+ {
+ if ((effected == null) || !effected.isCreature() || !effector.isPlayer())
+ {
+ return;
+ }
+
+ final Skill triggerSkill = _adjustLevel ? SkillData.getInstance().getSkill(_skill.getSkillId(), skill.getLevel()) : _skill.getSkill();
+ if (triggerSkill == null)
+ {
+ return;
+ }
+
+ WorldObject target = null;
+ try
+ {
+ target = TargetHandler.getInstance().getHandler(_targetType).getTarget(effector, effected, triggerSkill, false, false, false);
+ }
+ catch (Exception e)
+ {
+ LOGGER.warning("Exception in ITargetTypeHandler.getTarget(): " + e.getMessage());
+ }
+
+ if ((target == null) || !target.isCreature())
+ {
+ return;
+ }
+
+ final SkillUseHolder queuedSkill = effector.getActingPlayer().getQueuedSkill();
+ if (queuedSkill != null)
+ {
+ ThreadPool.schedule(() ->
+ {
+ effector.getActingPlayer().setQueuedSkill(queuedSkill.getSkill(), queuedSkill.getItem(), queuedSkill.isCtrlPressed(), queuedSkill.isShiftPressed());
+ }, 10);
+ }
+
+ effector.getActingPlayer().setQueuedSkill(triggerSkill, null, false, false);
+ }
+}
diff --git a/L2J_Mobius_Classic_3.0_TheKamael/dist/game/data/stats/skills/documentation.txt b/L2J_Mobius_Classic_3.0_TheKamael/dist/game/data/stats/skills/documentation.txt
index 62f5dbac69..a583d3f6e9 100644
--- a/L2J_Mobius_Classic_3.0_TheKamael/dist/game/data/stats/skills/documentation.txt
+++ b/L2J_Mobius_Classic_3.0_TheKamael/dist/game/data/stats/skills/documentation.txt
@@ -335,6 +335,7 @@ TransferHate: Transfers Npc's hate from you to your target.
Transformation: Transforms into the specified transformation id and gives its template skills.
TrapDetect: Detects a hidden trap.
TrapRemove: Removes a trap.
+TriggerSkill: Triggers a specified skill. (l2jmobius)
TriggerSkillByAttack: Triggers a specified skill when you deal damage.
TriggerSkillByAvoid: Triggers a specified skill when you avoid autoattack damage.
TriggerSkillByDamage: Triggers a specified skill when you receive damage.
diff --git a/L2J_Mobius_Classic_Interlude/dist/game/data/scripts/handlers/EffectMasterHandler.java b/L2J_Mobius_Classic_Interlude/dist/game/data/scripts/handlers/EffectMasterHandler.java
index 3e1772fe4e..13e2f150e4 100644
--- a/L2J_Mobius_Classic_Interlude/dist/game/data/scripts/handlers/EffectMasterHandler.java
+++ b/L2J_Mobius_Classic_Interlude/dist/game/data/scripts/handlers/EffectMasterHandler.java
@@ -363,6 +363,7 @@ public class EffectMasterHandler
EffectHandler.getInstance().registerHandler("Transformation", Transformation::new);
EffectHandler.getInstance().registerHandler("TrapDetect", TrapDetect::new);
EffectHandler.getInstance().registerHandler("TrapRemove", TrapRemove::new);
+ EffectHandler.getInstance().registerHandler("TriggerSkill", TriggerSkill::new);
EffectHandler.getInstance().registerHandler("TriggerSkillByAttack", TriggerSkillByAttack::new);
EffectHandler.getInstance().registerHandler("TriggerSkillByAvoid", TriggerSkillByAvoid::new);
EffectHandler.getInstance().registerHandler("TriggerSkillByDamage", TriggerSkillByDamage::new);
diff --git a/L2J_Mobius_Classic_Interlude/dist/game/data/scripts/handlers/effecthandlers/TriggerSkill.java b/L2J_Mobius_Classic_Interlude/dist/game/data/scripts/handlers/effecthandlers/TriggerSkill.java
new file mode 100644
index 0000000000..1fe23aaf20
--- /dev/null
+++ b/L2J_Mobius_Classic_Interlude/dist/game/data/scripts/handlers/effecthandlers/TriggerSkill.java
@@ -0,0 +1,95 @@
+/*
+ * This file is part of the L2J Mobius project.
+ *
+ * This program is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program. If not, see .
+ */
+package handlers.effecthandlers;
+
+import org.l2jmobius.commons.concurrent.ThreadPool;
+import org.l2jmobius.gameserver.data.xml.SkillData;
+import org.l2jmobius.gameserver.handler.TargetHandler;
+import org.l2jmobius.gameserver.model.StatSet;
+import org.l2jmobius.gameserver.model.WorldObject;
+import org.l2jmobius.gameserver.model.actor.Creature;
+import org.l2jmobius.gameserver.model.effects.AbstractEffect;
+import org.l2jmobius.gameserver.model.holders.SkillHolder;
+import org.l2jmobius.gameserver.model.holders.SkillUseHolder;
+import org.l2jmobius.gameserver.model.items.instance.ItemInstance;
+import org.l2jmobius.gameserver.model.skills.Skill;
+import org.l2jmobius.gameserver.model.skills.targets.TargetType;
+
+/**
+ * Trigger Skill effect implementation.
+ * @author Mobius
+ */
+public class TriggerSkill extends AbstractEffect
+{
+ private final SkillHolder _skill;
+ private final TargetType _targetType;
+ private final boolean _adjustLevel;
+
+ public TriggerSkill(StatSet params)
+ {
+ _skill = new SkillHolder(params.getInt("skillId"), params.getInt("skillLevel", 1));
+ _targetType = params.getEnum("targetType", TargetType.class, TargetType.TARGET);
+ _adjustLevel = params.getBoolean("adjustLevel", false);
+ }
+
+ @Override
+ public boolean isInstant()
+ {
+ return true;
+ }
+
+ @Override
+ public void instant(Creature effector, Creature effected, Skill skill, ItemInstance item)
+ {
+ if ((effected == null) || !effected.isCreature() || !effector.isPlayer())
+ {
+ return;
+ }
+
+ final Skill triggerSkill = _adjustLevel ? SkillData.getInstance().getSkill(_skill.getSkillId(), skill.getLevel()) : _skill.getSkill();
+ if (triggerSkill == null)
+ {
+ return;
+ }
+
+ WorldObject target = null;
+ try
+ {
+ target = TargetHandler.getInstance().getHandler(_targetType).getTarget(effector, effected, triggerSkill, false, false, false);
+ }
+ catch (Exception e)
+ {
+ LOGGER.warning("Exception in ITargetTypeHandler.getTarget(): " + e.getMessage());
+ }
+
+ if ((target == null) || !target.isCreature())
+ {
+ return;
+ }
+
+ final SkillUseHolder queuedSkill = effector.getActingPlayer().getQueuedSkill();
+ if (queuedSkill != null)
+ {
+ ThreadPool.schedule(() ->
+ {
+ effector.getActingPlayer().setQueuedSkill(queuedSkill.getSkill(), queuedSkill.getItem(), queuedSkill.isCtrlPressed(), queuedSkill.isShiftPressed());
+ }, 10);
+ }
+
+ effector.getActingPlayer().setQueuedSkill(triggerSkill, null, false, false);
+ }
+}
diff --git a/L2J_Mobius_Classic_Interlude/dist/game/data/stats/skills/documentation.txt b/L2J_Mobius_Classic_Interlude/dist/game/data/stats/skills/documentation.txt
index 46ebf80d44..f3f7215ac7 100644
--- a/L2J_Mobius_Classic_Interlude/dist/game/data/stats/skills/documentation.txt
+++ b/L2J_Mobius_Classic_Interlude/dist/game/data/stats/skills/documentation.txt
@@ -330,6 +330,7 @@ TransferHate: Transfers Npc's hate from you to your target.
Transformation: Transforms into the specified transformation id and gives its template skills.
TrapDetect: Detects a hidden trap.
TrapRemove: Removes a trap.
+TriggerSkill: Triggers a specified skill. (l2jmobius)
TriggerSkillByAttack: Triggers a specified skill when you deal damage.
TriggerSkillByAvoid: Triggers a specified skill when you avoid autoattack damage.
TriggerSkillByDamage: Triggers a specified skill when you receive damage.
diff --git a/L2J_Mobius_Essence_4.0_DwellingOfSpirits/dist/game/data/scripts/handlers/EffectMasterHandler.java b/L2J_Mobius_Essence_4.0_DwellingOfSpirits/dist/game/data/scripts/handlers/EffectMasterHandler.java
index c7f33a08d3..4a1960117f 100644
--- a/L2J_Mobius_Essence_4.0_DwellingOfSpirits/dist/game/data/scripts/handlers/EffectMasterHandler.java
+++ b/L2J_Mobius_Essence_4.0_DwellingOfSpirits/dist/game/data/scripts/handlers/EffectMasterHandler.java
@@ -373,6 +373,7 @@ public class EffectMasterHandler
EffectHandler.getInstance().registerHandler("Transformation", Transformation::new);
EffectHandler.getInstance().registerHandler("TrapDetect", TrapDetect::new);
EffectHandler.getInstance().registerHandler("TrapRemove", TrapRemove::new);
+ EffectHandler.getInstance().registerHandler("TriggerSkill", TriggerSkill::new);
EffectHandler.getInstance().registerHandler("TriggerSkillByAttack", TriggerSkillByAttack::new);
EffectHandler.getInstance().registerHandler("TriggerSkillByAvoid", TriggerSkillByAvoid::new);
EffectHandler.getInstance().registerHandler("TriggerSkillByDamage", TriggerSkillByDamage::new);
diff --git a/L2J_Mobius_Essence_4.0_DwellingOfSpirits/dist/game/data/scripts/handlers/effecthandlers/TriggerSkill.java b/L2J_Mobius_Essence_4.0_DwellingOfSpirits/dist/game/data/scripts/handlers/effecthandlers/TriggerSkill.java
new file mode 100644
index 0000000000..1fe23aaf20
--- /dev/null
+++ b/L2J_Mobius_Essence_4.0_DwellingOfSpirits/dist/game/data/scripts/handlers/effecthandlers/TriggerSkill.java
@@ -0,0 +1,95 @@
+/*
+ * This file is part of the L2J Mobius project.
+ *
+ * This program is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program. If not, see .
+ */
+package handlers.effecthandlers;
+
+import org.l2jmobius.commons.concurrent.ThreadPool;
+import org.l2jmobius.gameserver.data.xml.SkillData;
+import org.l2jmobius.gameserver.handler.TargetHandler;
+import org.l2jmobius.gameserver.model.StatSet;
+import org.l2jmobius.gameserver.model.WorldObject;
+import org.l2jmobius.gameserver.model.actor.Creature;
+import org.l2jmobius.gameserver.model.effects.AbstractEffect;
+import org.l2jmobius.gameserver.model.holders.SkillHolder;
+import org.l2jmobius.gameserver.model.holders.SkillUseHolder;
+import org.l2jmobius.gameserver.model.items.instance.ItemInstance;
+import org.l2jmobius.gameserver.model.skills.Skill;
+import org.l2jmobius.gameserver.model.skills.targets.TargetType;
+
+/**
+ * Trigger Skill effect implementation.
+ * @author Mobius
+ */
+public class TriggerSkill extends AbstractEffect
+{
+ private final SkillHolder _skill;
+ private final TargetType _targetType;
+ private final boolean _adjustLevel;
+
+ public TriggerSkill(StatSet params)
+ {
+ _skill = new SkillHolder(params.getInt("skillId"), params.getInt("skillLevel", 1));
+ _targetType = params.getEnum("targetType", TargetType.class, TargetType.TARGET);
+ _adjustLevel = params.getBoolean("adjustLevel", false);
+ }
+
+ @Override
+ public boolean isInstant()
+ {
+ return true;
+ }
+
+ @Override
+ public void instant(Creature effector, Creature effected, Skill skill, ItemInstance item)
+ {
+ if ((effected == null) || !effected.isCreature() || !effector.isPlayer())
+ {
+ return;
+ }
+
+ final Skill triggerSkill = _adjustLevel ? SkillData.getInstance().getSkill(_skill.getSkillId(), skill.getLevel()) : _skill.getSkill();
+ if (triggerSkill == null)
+ {
+ return;
+ }
+
+ WorldObject target = null;
+ try
+ {
+ target = TargetHandler.getInstance().getHandler(_targetType).getTarget(effector, effected, triggerSkill, false, false, false);
+ }
+ catch (Exception e)
+ {
+ LOGGER.warning("Exception in ITargetTypeHandler.getTarget(): " + e.getMessage());
+ }
+
+ if ((target == null) || !target.isCreature())
+ {
+ return;
+ }
+
+ final SkillUseHolder queuedSkill = effector.getActingPlayer().getQueuedSkill();
+ if (queuedSkill != null)
+ {
+ ThreadPool.schedule(() ->
+ {
+ effector.getActingPlayer().setQueuedSkill(queuedSkill.getSkill(), queuedSkill.getItem(), queuedSkill.isCtrlPressed(), queuedSkill.isShiftPressed());
+ }, 10);
+ }
+
+ effector.getActingPlayer().setQueuedSkill(triggerSkill, null, false, false);
+ }
+}
diff --git a/L2J_Mobius_Essence_4.0_DwellingOfSpirits/dist/game/data/stats/skills/documentation.txt b/L2J_Mobius_Essence_4.0_DwellingOfSpirits/dist/game/data/stats/skills/documentation.txt
index 775ba7d93b..8c499d9fa6 100644
--- a/L2J_Mobius_Essence_4.0_DwellingOfSpirits/dist/game/data/stats/skills/documentation.txt
+++ b/L2J_Mobius_Essence_4.0_DwellingOfSpirits/dist/game/data/stats/skills/documentation.txt
@@ -341,6 +341,7 @@ TransferHate: Transfers Npc's hate from you to your target.
Transformation: Transforms into the specified transformation id and gives its template skills.
TrapDetect: Detects a hidden trap.
TrapRemove: Removes a trap.
+TriggerSkill: Triggers a specified skill. (l2jmobius)
TriggerSkillByAttack: Triggers a specified skill when you deal damage.
TriggerSkillByAvoid: Triggers a specified skill when you avoid autoattack damage.
TriggerSkillByDamage: Triggers a specified skill when you receive damage.
diff --git a/L2J_Mobius_Essence_4.0_DwellingOfSpirits/dist/game/data/xsd/skills.xsd b/L2J_Mobius_Essence_4.0_DwellingOfSpirits/dist/game/data/xsd/skills.xsd
index 7356764995..f330625541 100644
--- a/L2J_Mobius_Essence_4.0_DwellingOfSpirits/dist/game/data/xsd/skills.xsd
+++ b/L2J_Mobius_Essence_4.0_DwellingOfSpirits/dist/game/data/xsd/skills.xsd
@@ -754,6 +754,7 @@
+
diff --git a/L2J_Mobius_Essence_5.0_Sylph/dist/game/data/scripts/handlers/EffectMasterHandler.java b/L2J_Mobius_Essence_5.0_Sylph/dist/game/data/scripts/handlers/EffectMasterHandler.java
index c7f33a08d3..4a1960117f 100644
--- a/L2J_Mobius_Essence_5.0_Sylph/dist/game/data/scripts/handlers/EffectMasterHandler.java
+++ b/L2J_Mobius_Essence_5.0_Sylph/dist/game/data/scripts/handlers/EffectMasterHandler.java
@@ -373,6 +373,7 @@ public class EffectMasterHandler
EffectHandler.getInstance().registerHandler("Transformation", Transformation::new);
EffectHandler.getInstance().registerHandler("TrapDetect", TrapDetect::new);
EffectHandler.getInstance().registerHandler("TrapRemove", TrapRemove::new);
+ EffectHandler.getInstance().registerHandler("TriggerSkill", TriggerSkill::new);
EffectHandler.getInstance().registerHandler("TriggerSkillByAttack", TriggerSkillByAttack::new);
EffectHandler.getInstance().registerHandler("TriggerSkillByAvoid", TriggerSkillByAvoid::new);
EffectHandler.getInstance().registerHandler("TriggerSkillByDamage", TriggerSkillByDamage::new);
diff --git a/L2J_Mobius_Essence_5.0_Sylph/dist/game/data/scripts/handlers/effecthandlers/TriggerSkill.java b/L2J_Mobius_Essence_5.0_Sylph/dist/game/data/scripts/handlers/effecthandlers/TriggerSkill.java
new file mode 100644
index 0000000000..1fe23aaf20
--- /dev/null
+++ b/L2J_Mobius_Essence_5.0_Sylph/dist/game/data/scripts/handlers/effecthandlers/TriggerSkill.java
@@ -0,0 +1,95 @@
+/*
+ * This file is part of the L2J Mobius project.
+ *
+ * This program is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program. If not, see .
+ */
+package handlers.effecthandlers;
+
+import org.l2jmobius.commons.concurrent.ThreadPool;
+import org.l2jmobius.gameserver.data.xml.SkillData;
+import org.l2jmobius.gameserver.handler.TargetHandler;
+import org.l2jmobius.gameserver.model.StatSet;
+import org.l2jmobius.gameserver.model.WorldObject;
+import org.l2jmobius.gameserver.model.actor.Creature;
+import org.l2jmobius.gameserver.model.effects.AbstractEffect;
+import org.l2jmobius.gameserver.model.holders.SkillHolder;
+import org.l2jmobius.gameserver.model.holders.SkillUseHolder;
+import org.l2jmobius.gameserver.model.items.instance.ItemInstance;
+import org.l2jmobius.gameserver.model.skills.Skill;
+import org.l2jmobius.gameserver.model.skills.targets.TargetType;
+
+/**
+ * Trigger Skill effect implementation.
+ * @author Mobius
+ */
+public class TriggerSkill extends AbstractEffect
+{
+ private final SkillHolder _skill;
+ private final TargetType _targetType;
+ private final boolean _adjustLevel;
+
+ public TriggerSkill(StatSet params)
+ {
+ _skill = new SkillHolder(params.getInt("skillId"), params.getInt("skillLevel", 1));
+ _targetType = params.getEnum("targetType", TargetType.class, TargetType.TARGET);
+ _adjustLevel = params.getBoolean("adjustLevel", false);
+ }
+
+ @Override
+ public boolean isInstant()
+ {
+ return true;
+ }
+
+ @Override
+ public void instant(Creature effector, Creature effected, Skill skill, ItemInstance item)
+ {
+ if ((effected == null) || !effected.isCreature() || !effector.isPlayer())
+ {
+ return;
+ }
+
+ final Skill triggerSkill = _adjustLevel ? SkillData.getInstance().getSkill(_skill.getSkillId(), skill.getLevel()) : _skill.getSkill();
+ if (triggerSkill == null)
+ {
+ return;
+ }
+
+ WorldObject target = null;
+ try
+ {
+ target = TargetHandler.getInstance().getHandler(_targetType).getTarget(effector, effected, triggerSkill, false, false, false);
+ }
+ catch (Exception e)
+ {
+ LOGGER.warning("Exception in ITargetTypeHandler.getTarget(): " + e.getMessage());
+ }
+
+ if ((target == null) || !target.isCreature())
+ {
+ return;
+ }
+
+ final SkillUseHolder queuedSkill = effector.getActingPlayer().getQueuedSkill();
+ if (queuedSkill != null)
+ {
+ ThreadPool.schedule(() ->
+ {
+ effector.getActingPlayer().setQueuedSkill(queuedSkill.getSkill(), queuedSkill.getItem(), queuedSkill.isCtrlPressed(), queuedSkill.isShiftPressed());
+ }, 10);
+ }
+
+ effector.getActingPlayer().setQueuedSkill(triggerSkill, null, false, false);
+ }
+}
diff --git a/L2J_Mobius_Essence_5.0_Sylph/dist/game/data/stats/skills/documentation.txt b/L2J_Mobius_Essence_5.0_Sylph/dist/game/data/stats/skills/documentation.txt
index 775ba7d93b..8c499d9fa6 100644
--- a/L2J_Mobius_Essence_5.0_Sylph/dist/game/data/stats/skills/documentation.txt
+++ b/L2J_Mobius_Essence_5.0_Sylph/dist/game/data/stats/skills/documentation.txt
@@ -341,6 +341,7 @@ TransferHate: Transfers Npc's hate from you to your target.
Transformation: Transforms into the specified transformation id and gives its template skills.
TrapDetect: Detects a hidden trap.
TrapRemove: Removes a trap.
+TriggerSkill: Triggers a specified skill. (l2jmobius)
TriggerSkillByAttack: Triggers a specified skill when you deal damage.
TriggerSkillByAvoid: Triggers a specified skill when you avoid autoattack damage.
TriggerSkillByDamage: Triggers a specified skill when you receive damage.
diff --git a/L2J_Mobius_Essence_5.0_Sylph/dist/game/data/xsd/skills.xsd b/L2J_Mobius_Essence_5.0_Sylph/dist/game/data/xsd/skills.xsd
index 7356764995..f330625541 100644
--- a/L2J_Mobius_Essence_5.0_Sylph/dist/game/data/xsd/skills.xsd
+++ b/L2J_Mobius_Essence_5.0_Sylph/dist/game/data/xsd/skills.xsd
@@ -754,6 +754,7 @@
+