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 60b44a0757..8e93bb3469 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
@@ -285,6 +285,7 @@ public final class EffectMasterHandler
EffectHandler.getInstance().registerHandler("RefuelAirship", RefuelAirship::new);
EffectHandler.getInstance().registerHandler("Relax", Relax::new);
EffectHandler.getInstance().registerHandler("RemoveEquipPenalty", RemoveEquipPenalty::new);
+ EffectHandler.getInstance().registerHandler("ReplaceSkillBySkill", ReplaceSkillBySkill::new);
EffectHandler.getInstance().registerHandler("ResetInstanceEntry", ResetInstanceEntry::new);
EffectHandler.getInstance().registerHandler("ResistAbnormalByCategory", ResistAbnormalByCategory::new);
EffectHandler.getInstance().registerHandler("ResistDDMagic", ResistDDMagic::new);
diff --git a/L2J_Mobius_5.0_Salvation/dist/game/data/scripts/handlers/effecthandlers/ReplaceSkillBySkill.java b/L2J_Mobius_5.0_Salvation/dist/game/data/scripts/handlers/effecthandlers/ReplaceSkillBySkill.java
new file mode 100644
index 0000000000..8abc6f37a6
--- /dev/null
+++ b/L2J_Mobius_5.0_Salvation/dist/game/data/scripts/handlers/effecthandlers/ReplaceSkillBySkill.java
@@ -0,0 +1,117 @@
+/*
+ * 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.impl.SkillData;
+import org.l2jmobius.gameserver.enums.ShortcutType;
+import org.l2jmobius.gameserver.model.Shortcut;
+import org.l2jmobius.gameserver.model.StatsSet;
+import org.l2jmobius.gameserver.model.actor.Creature;
+import org.l2jmobius.gameserver.model.actor.instance.PlayerInstance;
+import org.l2jmobius.gameserver.model.effects.AbstractEffect;
+import org.l2jmobius.gameserver.model.holders.SkillHolder;
+import org.l2jmobius.gameserver.model.items.instance.ItemInstance;
+import org.l2jmobius.gameserver.model.skills.Skill;
+import org.l2jmobius.gameserver.network.serverpackets.ShortCutInit;
+import org.l2jmobius.gameserver.network.serverpackets.ShortCutRegister;
+
+/**
+ * @author Mobius
+ */
+public class ReplaceSkillBySkill extends AbstractEffect
+{
+ private final SkillHolder _existingSkill;
+ private final SkillHolder _replacementSkill;
+
+ public ReplaceSkillBySkill(StatsSet params)
+ {
+ _existingSkill = new SkillHolder(params.getInt("existingSkillId"), params.getInt("existingSkillLevel", -1));
+ _replacementSkill = new SkillHolder(params.getInt("replacementSkillId"), params.getInt("replacementSkillLevel", -1));
+ }
+
+ @Override
+ public void onStart(Creature effector, Creature effected, Skill skill, ItemInstance item)
+ {
+ if (effected.isPlayer())
+ {
+ final PlayerInstance player = effected.getActingPlayer();
+ final Skill knownSkill = player.getKnownSkill(_existingSkill.getSkillId());
+ if ((knownSkill == null) || (knownSkill.getLevel() < _existingSkill.getSkillLevel()))
+ {
+ return;
+ }
+
+ final Skill addedSkill = SkillData.getInstance().getSkill(_replacementSkill.getSkillId(), _replacementSkill.getSkillLevel() < 1 ? knownSkill.getLevel() : _replacementSkill.getSkillLevel(), knownSkill.getSubLevel());
+ player.addSkill(addedSkill, false);
+ for (Shortcut shortcut : player.getAllShortCuts())
+ {
+ if ((shortcut.getType() == ShortcutType.SKILL) && (shortcut.getId() == knownSkill.getId()) && (shortcut.getLevel() == knownSkill.getLevel()))
+ {
+ final int slot = shortcut.getSlot();
+ final int page = shortcut.getPage();
+ final int characterType = shortcut.getCharacterType();
+ player.deleteShortCut(slot, page);
+ final Shortcut newShortcut = new Shortcut(slot, page, ShortcutType.SKILL, addedSkill.getId(), addedSkill.getLevel(), addedSkill.getSubLevel(), characterType);
+ player.registerShortCut(newShortcut);
+ player.sendPacket(new ShortCutRegister(newShortcut));
+ }
+ }
+
+ player.removeSkill(knownSkill, false);
+ player.sendSkillList();
+ ThreadPool.schedule(() ->
+ {
+ player.sendPacket(new ShortCutInit(player));
+ }, 1100);
+ }
+ }
+
+ @Override
+ public void onExit(Creature effector, Creature effected, Skill skill)
+ {
+ final PlayerInstance player = effected.getActingPlayer();
+ final Skill knownSkill = player.getKnownSkill(_replacementSkill.getSkillId());
+ if (knownSkill == null)
+ {
+ return;
+ }
+
+ final Skill addedSkill = SkillData.getInstance().getSkill(_existingSkill.getSkillId(), _existingSkill.getSkillLevel() < 1 ? knownSkill.getLevel() : _existingSkill.getSkillLevel(), knownSkill.getSubLevel());
+ player.addSkill(addedSkill, false);
+ for (Shortcut shortcut : player.getAllShortCuts())
+ {
+ if ((shortcut.getType() == ShortcutType.SKILL) && (shortcut.getId() == knownSkill.getId()) && (shortcut.getLevel() == knownSkill.getLevel()))
+ {
+ final int slot = shortcut.getSlot();
+ final int page = shortcut.getPage();
+ final int characterType = shortcut.getCharacterType();
+ player.deleteShortCut(slot, page);
+ final Shortcut newShortcut = new Shortcut(slot, page, ShortcutType.SKILL, addedSkill.getId(), addedSkill.getLevel(), addedSkill.getSubLevel(), characterType);
+ player.registerShortCut(newShortcut);
+ player.sendPacket(new ShortCutRegister(newShortcut));
+ }
+ }
+
+ player.removeSkill(knownSkill, false);
+ player.sendSkillList();
+ ThreadPool.schedule(() ->
+ {
+ player.sendPacket(new ShortCutInit(player));
+ }, 1100);
+ }
+}
diff --git a/L2J_Mobius_5.0_Salvation/dist/game/data/stats/skills/19400-19499.xml b/L2J_Mobius_5.0_Salvation/dist/game/data/stats/skills/19400-19499.xml
index a393fb2493..e1df78e775 100644
--- a/L2J_Mobius_5.0_Salvation/dist/game/data/stats/skills/19400-19499.xml
+++ b/L2J_Mobius_5.0_Salvation/dist/game/data/stats/skills/19400-19499.xml
@@ -1034,6 +1034,14 @@
SELF
SINGLE
+
+ 11509
+ 11513
+
+
+ 11510
+ 11514
+
300
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 c044f24971..7813f8768c 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
@@ -254,6 +254,7 @@ ReflectSkill: Deflects physical/magical debuffs back to the attacker.
RefuelAirship: Increases Airship's fuel.
Relax: Sits down and increases HP regeneration until full.
RemoveEquipPenalty: Removes equipment grade penalty. Its the base effect for the grade penalty mechanics.
+ReplaceSkillBySkill: While active replaces a skill with an alternative skill. (l2jmobius)
ResetInstanceEntry: Resets instance re-entry time. (l2jmobius)
ResistAbnormalByCategory: Buff/debuff resist stat.
ResistDDMagic: Magic resist stat (magic attack 50% effective or 1 damage)
diff --git a/L2J_Mobius_5.0_Salvation/dist/game/data/xsd/skills.xsd b/L2J_Mobius_5.0_Salvation/dist/game/data/xsd/skills.xsd
index 581a24af54..569340f596 100644
--- a/L2J_Mobius_5.0_Salvation/dist/game/data/xsd/skills.xsd
+++ b/L2J_Mobius_5.0_Salvation/dist/game/data/xsd/skills.xsd
@@ -2068,6 +2068,8 @@
+
+
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 cf771c12ce..fc94687daa 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
@@ -286,6 +286,7 @@ public final class EffectMasterHandler
EffectHandler.getInstance().registerHandler("RefuelAirship", RefuelAirship::new);
EffectHandler.getInstance().registerHandler("Relax", Relax::new);
EffectHandler.getInstance().registerHandler("RemoveEquipPenalty", RemoveEquipPenalty::new);
+ EffectHandler.getInstance().registerHandler("ReplaceSkillBySkill", ReplaceSkillBySkill::new);
EffectHandler.getInstance().registerHandler("ResetInstanceEntry", ResetInstanceEntry::new);
EffectHandler.getInstance().registerHandler("ResistAbnormalByCategory", ResistAbnormalByCategory::new);
EffectHandler.getInstance().registerHandler("ResistDDMagic", ResistDDMagic::new);
diff --git a/L2J_Mobius_5.5_EtinasFate/dist/game/data/scripts/handlers/effecthandlers/ReplaceSkillBySkill.java b/L2J_Mobius_5.5_EtinasFate/dist/game/data/scripts/handlers/effecthandlers/ReplaceSkillBySkill.java
new file mode 100644
index 0000000000..8abc6f37a6
--- /dev/null
+++ b/L2J_Mobius_5.5_EtinasFate/dist/game/data/scripts/handlers/effecthandlers/ReplaceSkillBySkill.java
@@ -0,0 +1,117 @@
+/*
+ * 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.impl.SkillData;
+import org.l2jmobius.gameserver.enums.ShortcutType;
+import org.l2jmobius.gameserver.model.Shortcut;
+import org.l2jmobius.gameserver.model.StatsSet;
+import org.l2jmobius.gameserver.model.actor.Creature;
+import org.l2jmobius.gameserver.model.actor.instance.PlayerInstance;
+import org.l2jmobius.gameserver.model.effects.AbstractEffect;
+import org.l2jmobius.gameserver.model.holders.SkillHolder;
+import org.l2jmobius.gameserver.model.items.instance.ItemInstance;
+import org.l2jmobius.gameserver.model.skills.Skill;
+import org.l2jmobius.gameserver.network.serverpackets.ShortCutInit;
+import org.l2jmobius.gameserver.network.serverpackets.ShortCutRegister;
+
+/**
+ * @author Mobius
+ */
+public class ReplaceSkillBySkill extends AbstractEffect
+{
+ private final SkillHolder _existingSkill;
+ private final SkillHolder _replacementSkill;
+
+ public ReplaceSkillBySkill(StatsSet params)
+ {
+ _existingSkill = new SkillHolder(params.getInt("existingSkillId"), params.getInt("existingSkillLevel", -1));
+ _replacementSkill = new SkillHolder(params.getInt("replacementSkillId"), params.getInt("replacementSkillLevel", -1));
+ }
+
+ @Override
+ public void onStart(Creature effector, Creature effected, Skill skill, ItemInstance item)
+ {
+ if (effected.isPlayer())
+ {
+ final PlayerInstance player = effected.getActingPlayer();
+ final Skill knownSkill = player.getKnownSkill(_existingSkill.getSkillId());
+ if ((knownSkill == null) || (knownSkill.getLevel() < _existingSkill.getSkillLevel()))
+ {
+ return;
+ }
+
+ final Skill addedSkill = SkillData.getInstance().getSkill(_replacementSkill.getSkillId(), _replacementSkill.getSkillLevel() < 1 ? knownSkill.getLevel() : _replacementSkill.getSkillLevel(), knownSkill.getSubLevel());
+ player.addSkill(addedSkill, false);
+ for (Shortcut shortcut : player.getAllShortCuts())
+ {
+ if ((shortcut.getType() == ShortcutType.SKILL) && (shortcut.getId() == knownSkill.getId()) && (shortcut.getLevel() == knownSkill.getLevel()))
+ {
+ final int slot = shortcut.getSlot();
+ final int page = shortcut.getPage();
+ final int characterType = shortcut.getCharacterType();
+ player.deleteShortCut(slot, page);
+ final Shortcut newShortcut = new Shortcut(slot, page, ShortcutType.SKILL, addedSkill.getId(), addedSkill.getLevel(), addedSkill.getSubLevel(), characterType);
+ player.registerShortCut(newShortcut);
+ player.sendPacket(new ShortCutRegister(newShortcut));
+ }
+ }
+
+ player.removeSkill(knownSkill, false);
+ player.sendSkillList();
+ ThreadPool.schedule(() ->
+ {
+ player.sendPacket(new ShortCutInit(player));
+ }, 1100);
+ }
+ }
+
+ @Override
+ public void onExit(Creature effector, Creature effected, Skill skill)
+ {
+ final PlayerInstance player = effected.getActingPlayer();
+ final Skill knownSkill = player.getKnownSkill(_replacementSkill.getSkillId());
+ if (knownSkill == null)
+ {
+ return;
+ }
+
+ final Skill addedSkill = SkillData.getInstance().getSkill(_existingSkill.getSkillId(), _existingSkill.getSkillLevel() < 1 ? knownSkill.getLevel() : _existingSkill.getSkillLevel(), knownSkill.getSubLevel());
+ player.addSkill(addedSkill, false);
+ for (Shortcut shortcut : player.getAllShortCuts())
+ {
+ if ((shortcut.getType() == ShortcutType.SKILL) && (shortcut.getId() == knownSkill.getId()) && (shortcut.getLevel() == knownSkill.getLevel()))
+ {
+ final int slot = shortcut.getSlot();
+ final int page = shortcut.getPage();
+ final int characterType = shortcut.getCharacterType();
+ player.deleteShortCut(slot, page);
+ final Shortcut newShortcut = new Shortcut(slot, page, ShortcutType.SKILL, addedSkill.getId(), addedSkill.getLevel(), addedSkill.getSubLevel(), characterType);
+ player.registerShortCut(newShortcut);
+ player.sendPacket(new ShortCutRegister(newShortcut));
+ }
+ }
+
+ player.removeSkill(knownSkill, false);
+ player.sendSkillList();
+ ThreadPool.schedule(() ->
+ {
+ player.sendPacket(new ShortCutInit(player));
+ }, 1100);
+ }
+}
diff --git a/L2J_Mobius_5.5_EtinasFate/dist/game/data/stats/skills/11500-11599.xml b/L2J_Mobius_5.5_EtinasFate/dist/game/data/stats/skills/11500-11599.xml
index 51dc017561..e8d757a44f 100644
--- a/L2J_Mobius_5.5_EtinasFate/dist/game/data/stats/skills/11500-11599.xml
+++ b/L2J_Mobius_5.5_EtinasFate/dist/game/data/stats/skills/11500-11599.xml
@@ -389,15 +389,15 @@
-
+
icon.skill11513
1
3
STUN
STUN
- 150
- {base + base / 100 * subIndex}
+ 150
+ {base + (base / 100 * subIndex)}
NONE
ATTACK
@@ -413,10 +413,12 @@
49
51
53
+ 55
+ 57
- 600
- {base + 10 * subIndex}
+ 600
+ {base + (10 * subIndex)}
800
200
@@ -432,6 +434,8 @@
-712
-712
-712
+ -712
+ -712
5
800
@@ -445,6 +449,8 @@
101
102
105
+ 107
+ 109
SHOCK
ENEMY
@@ -460,8 +466,8 @@
- 200
- {base - (3 * subIndex)}
+ 200
+ {base - (3 * subIndex)}
diff --git a/L2J_Mobius_5.5_EtinasFate/dist/game/data/stats/skills/19400-19499.xml b/L2J_Mobius_5.5_EtinasFate/dist/game/data/stats/skills/19400-19499.xml
index 43ea37bef3..ed965a1244 100644
--- a/L2J_Mobius_5.5_EtinasFate/dist/game/data/stats/skills/19400-19499.xml
+++ b/L2J_Mobius_5.5_EtinasFate/dist/game/data/stats/skills/19400-19499.xml
@@ -1038,6 +1038,14 @@
SELF
SINGLE
+
+ 11509
+ 11513
+
+
+ 11510
+ 11514
+
300
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 01f2f0bf2d..68296e7795 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
@@ -255,6 +255,7 @@ ReflectSkill: Deflects physical/magical debuffs back to the attacker.
RefuelAirship: Increases Airship's fuel.
Relax: Sits down and increases HP regeneration until full.
RemoveEquipPenalty: Removes equipment grade penalty. Its the base effect for the grade penalty mechanics.
+ReplaceSkillBySkill: While active replaces a skill with an alternative skill. (l2jmobius)
ResetInstanceEntry: Resets instance re-entry time. (l2jmobius)
ResistAbnormalByCategory: Buff/debuff resist stat.
ResistDDMagic: Magic resist stat (magic attack 50% effective or 1 damage)
diff --git a/L2J_Mobius_5.5_EtinasFate/dist/game/data/xsd/skills.xsd b/L2J_Mobius_5.5_EtinasFate/dist/game/data/xsd/skills.xsd
index 581a24af54..569340f596 100644
--- a/L2J_Mobius_5.5_EtinasFate/dist/game/data/xsd/skills.xsd
+++ b/L2J_Mobius_5.5_EtinasFate/dist/game/data/xsd/skills.xsd
@@ -2068,6 +2068,8 @@
+
+
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 cf771c12ce..fc94687daa 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
@@ -286,6 +286,7 @@ public final class EffectMasterHandler
EffectHandler.getInstance().registerHandler("RefuelAirship", RefuelAirship::new);
EffectHandler.getInstance().registerHandler("Relax", Relax::new);
EffectHandler.getInstance().registerHandler("RemoveEquipPenalty", RemoveEquipPenalty::new);
+ EffectHandler.getInstance().registerHandler("ReplaceSkillBySkill", ReplaceSkillBySkill::new);
EffectHandler.getInstance().registerHandler("ResetInstanceEntry", ResetInstanceEntry::new);
EffectHandler.getInstance().registerHandler("ResistAbnormalByCategory", ResistAbnormalByCategory::new);
EffectHandler.getInstance().registerHandler("ResistDDMagic", ResistDDMagic::new);
diff --git a/L2J_Mobius_6.0_Fafurion/dist/game/data/scripts/handlers/effecthandlers/ReplaceSkillBySkill.java b/L2J_Mobius_6.0_Fafurion/dist/game/data/scripts/handlers/effecthandlers/ReplaceSkillBySkill.java
new file mode 100644
index 0000000000..8abc6f37a6
--- /dev/null
+++ b/L2J_Mobius_6.0_Fafurion/dist/game/data/scripts/handlers/effecthandlers/ReplaceSkillBySkill.java
@@ -0,0 +1,117 @@
+/*
+ * 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.impl.SkillData;
+import org.l2jmobius.gameserver.enums.ShortcutType;
+import org.l2jmobius.gameserver.model.Shortcut;
+import org.l2jmobius.gameserver.model.StatsSet;
+import org.l2jmobius.gameserver.model.actor.Creature;
+import org.l2jmobius.gameserver.model.actor.instance.PlayerInstance;
+import org.l2jmobius.gameserver.model.effects.AbstractEffect;
+import org.l2jmobius.gameserver.model.holders.SkillHolder;
+import org.l2jmobius.gameserver.model.items.instance.ItemInstance;
+import org.l2jmobius.gameserver.model.skills.Skill;
+import org.l2jmobius.gameserver.network.serverpackets.ShortCutInit;
+import org.l2jmobius.gameserver.network.serverpackets.ShortCutRegister;
+
+/**
+ * @author Mobius
+ */
+public class ReplaceSkillBySkill extends AbstractEffect
+{
+ private final SkillHolder _existingSkill;
+ private final SkillHolder _replacementSkill;
+
+ public ReplaceSkillBySkill(StatsSet params)
+ {
+ _existingSkill = new SkillHolder(params.getInt("existingSkillId"), params.getInt("existingSkillLevel", -1));
+ _replacementSkill = new SkillHolder(params.getInt("replacementSkillId"), params.getInt("replacementSkillLevel", -1));
+ }
+
+ @Override
+ public void onStart(Creature effector, Creature effected, Skill skill, ItemInstance item)
+ {
+ if (effected.isPlayer())
+ {
+ final PlayerInstance player = effected.getActingPlayer();
+ final Skill knownSkill = player.getKnownSkill(_existingSkill.getSkillId());
+ if ((knownSkill == null) || (knownSkill.getLevel() < _existingSkill.getSkillLevel()))
+ {
+ return;
+ }
+
+ final Skill addedSkill = SkillData.getInstance().getSkill(_replacementSkill.getSkillId(), _replacementSkill.getSkillLevel() < 1 ? knownSkill.getLevel() : _replacementSkill.getSkillLevel(), knownSkill.getSubLevel());
+ player.addSkill(addedSkill, false);
+ for (Shortcut shortcut : player.getAllShortCuts())
+ {
+ if ((shortcut.getType() == ShortcutType.SKILL) && (shortcut.getId() == knownSkill.getId()) && (shortcut.getLevel() == knownSkill.getLevel()))
+ {
+ final int slot = shortcut.getSlot();
+ final int page = shortcut.getPage();
+ final int characterType = shortcut.getCharacterType();
+ player.deleteShortCut(slot, page);
+ final Shortcut newShortcut = new Shortcut(slot, page, ShortcutType.SKILL, addedSkill.getId(), addedSkill.getLevel(), addedSkill.getSubLevel(), characterType);
+ player.registerShortCut(newShortcut);
+ player.sendPacket(new ShortCutRegister(newShortcut));
+ }
+ }
+
+ player.removeSkill(knownSkill, false);
+ player.sendSkillList();
+ ThreadPool.schedule(() ->
+ {
+ player.sendPacket(new ShortCutInit(player));
+ }, 1100);
+ }
+ }
+
+ @Override
+ public void onExit(Creature effector, Creature effected, Skill skill)
+ {
+ final PlayerInstance player = effected.getActingPlayer();
+ final Skill knownSkill = player.getKnownSkill(_replacementSkill.getSkillId());
+ if (knownSkill == null)
+ {
+ return;
+ }
+
+ final Skill addedSkill = SkillData.getInstance().getSkill(_existingSkill.getSkillId(), _existingSkill.getSkillLevel() < 1 ? knownSkill.getLevel() : _existingSkill.getSkillLevel(), knownSkill.getSubLevel());
+ player.addSkill(addedSkill, false);
+ for (Shortcut shortcut : player.getAllShortCuts())
+ {
+ if ((shortcut.getType() == ShortcutType.SKILL) && (shortcut.getId() == knownSkill.getId()) && (shortcut.getLevel() == knownSkill.getLevel()))
+ {
+ final int slot = shortcut.getSlot();
+ final int page = shortcut.getPage();
+ final int characterType = shortcut.getCharacterType();
+ player.deleteShortCut(slot, page);
+ final Shortcut newShortcut = new Shortcut(slot, page, ShortcutType.SKILL, addedSkill.getId(), addedSkill.getLevel(), addedSkill.getSubLevel(), characterType);
+ player.registerShortCut(newShortcut);
+ player.sendPacket(new ShortCutRegister(newShortcut));
+ }
+ }
+
+ player.removeSkill(knownSkill, false);
+ player.sendSkillList();
+ ThreadPool.schedule(() ->
+ {
+ player.sendPacket(new ShortCutInit(player));
+ }, 1100);
+ }
+}
diff --git a/L2J_Mobius_6.0_Fafurion/dist/game/data/stats/skills/11500-11599.xml b/L2J_Mobius_6.0_Fafurion/dist/game/data/stats/skills/11500-11599.xml
index ba39afa479..181145b733 100644
--- a/L2J_Mobius_6.0_Fafurion/dist/game/data/stats/skills/11500-11599.xml
+++ b/L2J_Mobius_6.0_Fafurion/dist/game/data/stats/skills/11500-11599.xml
@@ -883,15 +883,15 @@
-
+
icon.skill11514
5
20
ULTIMATE_DEBUFF
- 99
- {base + (base / 100 * subIndex)}
+ 99
+ {base + (base / 100 * subIndex)}
5-12
200
@@ -910,6 +910,8 @@
101
103
105
+ 107
+ 109
130
@@ -923,6 +925,8 @@
164
168
172
+ 176
+ 180
ATTACK
A2
@@ -939,6 +943,8 @@
-712
-712
-712
+ -712
+ -712
NONE
5
@@ -971,13 +977,15 @@
19113
20045
20977
- {base + (base / 100 * subIndex)}
+ 21964
+ 22952
+ {base + (base / 100 * subIndex)}
true
5
- 1
- {0.99 - 0.006 * (subIndex - 1)}
+ 1
+ {0.99 - 0.006 * (subIndex - 1)}
@@ -1001,15 +1009,15 @@
-
+
icon.skill11509
5
20
CRITICAL_PROB_DOWN
- 99
- {base + (base / 100 * subIndex)}
+ 99
+ {base + (base / 100 * subIndex)}
5-12
200
@@ -1028,6 +1036,8 @@
101
103
105
+ 107
+ 109
146
@@ -1041,6 +1051,8 @@
188
194
200
+ 204
+ 208
ATTACK
A2
@@ -1057,6 +1069,8 @@
-712
-712
-712
+ -712
+ -712
NONE
5
@@ -1089,13 +1103,15 @@
21340
22380
23420
- {base + (base / 100 * subIndex)}
+ 24522
+ 25624
+ {base + (base / 100 * subIndex)}
true
5
- 1
- {0.99 - 0.006 * (subIndex - 1)}
+ 1
+ {0.99 - 0.006 * (subIndex - 1)}
diff --git a/L2J_Mobius_6.0_Fafurion/dist/game/data/stats/skills/19400-19499.xml b/L2J_Mobius_6.0_Fafurion/dist/game/data/stats/skills/19400-19499.xml
index 41b766e727..0450f090df 100644
--- a/L2J_Mobius_6.0_Fafurion/dist/game/data/stats/skills/19400-19499.xml
+++ b/L2J_Mobius_6.0_Fafurion/dist/game/data/stats/skills/19400-19499.xml
@@ -1058,6 +1058,14 @@
SELF
SINGLE
+
+ 11509
+ 11513
+
+
+ 11510
+ 11514
+
300
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 01f2f0bf2d..68296e7795 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
@@ -255,6 +255,7 @@ ReflectSkill: Deflects physical/magical debuffs back to the attacker.
RefuelAirship: Increases Airship's fuel.
Relax: Sits down and increases HP regeneration until full.
RemoveEquipPenalty: Removes equipment grade penalty. Its the base effect for the grade penalty mechanics.
+ReplaceSkillBySkill: While active replaces a skill with an alternative skill. (l2jmobius)
ResetInstanceEntry: Resets instance re-entry time. (l2jmobius)
ResistAbnormalByCategory: Buff/debuff resist stat.
ResistDDMagic: Magic resist stat (magic attack 50% effective or 1 damage)
diff --git a/L2J_Mobius_6.0_Fafurion/dist/game/data/xsd/skills.xsd b/L2J_Mobius_6.0_Fafurion/dist/game/data/xsd/skills.xsd
index 581a24af54..569340f596 100644
--- a/L2J_Mobius_6.0_Fafurion/dist/game/data/xsd/skills.xsd
+++ b/L2J_Mobius_6.0_Fafurion/dist/game/data/xsd/skills.xsd
@@ -2068,6 +2068,8 @@
+
+