Basado en el código https://www.united-extreme.com/u3games/foro/index.php?topic=1064.0
Puedes configurar en el código cuántos segundos deben pasar antes de que se devuelvan las mejoras. Preferí esto al de xban1x porque era más simple.
Lo probé y funciona para cancelar y robar divinidad por ahora. Sin embargo, no estoy seguro de si es una buena manera de hacerlo ni de si afecta a la fuente actual.
diff --git a/.settings/org.eclipse.buildship.core.prefs b/.settings/org.eclipse.buildship.core.prefs
index 6ef22de..8e2d48b 100644
--- a/.settings/org.eclipse.buildship.core.prefs
+++ b/.settings/org.eclipse.buildship.core.prefs
@@ -3,7 +3,7 @@
connection.gradle.distribution=GRADLE_DISTRIBUTION(WRAPPER)
connection.java.home=null
connection.jvm.arguments=
-connection.project.dir=..\\L2J_DataPack
+connection.project.dir=../l2j_datapack
containers=org.eclipse.jdt.launching.JRE_CONTAINER/org.eclipse.jdt.internal.debug.ui.launcher.StandardVMType/JavaSE-1.8/
derived.resources=.gradle,build
eclipse.preferences.version=1
diff --git a/src/main/java/com/l2jserver/gameserver/model/actor/instance/L2PcInstance.java b/src/main/java/com/l2jserver/gameserver/model/actor/instance/L2PcInstance.java
index 793af63..731c3a0 100644
--- a/src/main/java/com/l2jserver/gameserver/model/actor/instance/L2PcInstance.java
+++ b/src/main/java/com/l2jserver/gameserver/model/actor/instance/L2PcInstance.java
@@ -13377,4 +13377,44 @@
{
_dwarvenRecipeBook.clear();
}
+
+ // Custom Return Buffs
+ public void returnBuffs(List<BuffInfo> buffs, int time)
+ {
+ ThreadPoolManager.getInstance().scheduleGeneral(new ReturnCanceledBuffs(this, buffs), time * 1000);
+ }
+
+ private class ReturnCanceledBuffs implements Runnable
+ {
+ private L2PcInstance _player = null;
+ private List<BuffInfo> _buffs = null;
+
+ public ReturnCanceledBuffs(L2PcInstance _player1, List<BuffInfo> _buffs1)
+ {
+ this._player = _player1;
+ this._buffs = _buffs1;
+ }
+
+ @Override
+ public void run()
+ {
+ if ((_player == null) || (_player.isDead() && _player.isPlayer()))
+ {
+ return;
+ }
+
+ for (BuffInfo buff : _buffs)
+ {
+ try
+ {
+ SkillData.getInstance().getSkill(buff.getSkill().getId(), buff.getSkill().getLevel()).applyEffects(_player, _player);
+ }
+ catch (RuntimeException e)
+ {
+ // _log.log(Level.WARNING, "Cannot give back: " + buff.getSkill().getName() + " to player: " + _player.getName(), e);
+ }
+ }
+ }
+ }
+
}
diff --git a/dist/game/data/scripts/handlers/effecthandlers/DispelByCategory.java b/dist/game/data/scripts/handlers/effecthandlers/DispelByCategory.java
index 8b0e5db..bde29e6 100644
--- a/dist/game/data/scripts/handlers/effecthandlers/DispelByCategory.java
+++ b/dist/game/data/scripts/handlers/effecthandlers/DispelByCategory.java
@@ -22,6 +22,7 @@
import com.l2jserver.gameserver.enums.DispelCategory;
import com.l2jserver.gameserver.model.StatsSet;
+import com.l2jserver.gameserver.model.actor.instance.L2PcInstance;
import com.l2jserver.gameserver.model.conditions.Condition;
import com.l2jserver.gameserver.model.effects.AbstractEffect;
import com.l2jserver.gameserver.model.effects.L2EffectType;
@@ -67,10 +68,23 @@
return;
}
+ // These are the canceled stolen/buffs
final List<BuffInfo> canceled = Formulas.calcCancelEffects(info.getEffector(), info.getEffected(), info.getSkill(), _slot, _rate, _max);
for (BuffInfo can : canceled)
{
info.getEffected().getEffectList().stopSkillEffects(true, can.getSkill());
}
+
+ // so we put them back (this is the new code below)
+ if (canceled.size() > 0)
+ {
+ L2PcInstance target = (L2PcInstance) info.getEffected();
+
+ // Give player stolen buffs back after x seconds if he is not in olympiad
+ if (!target.isInOlympiadMode())
+ {
+ target.returnBuffs(canceled, 10);
+ }
+ }
}
}
\ No newline at end of file
diff --git a/dist/game/data/scripts/handlers/effecthandlers/StealAbnormal.java b/dist/game/data/scripts/handlers/effecthandlers/StealAbnormal.java
index c5aa36b..ca757a4 100644
--- a/dist/game/data/scripts/handlers/effecthandlers/StealAbnormal.java
+++ b/dist/game/data/scripts/handlers/effecthandlers/StealAbnormal.java
@@ -22,6 +22,7 @@
import com.l2jserver.gameserver.enums.DispelCategory;
import com.l2jserver.gameserver.model.StatsSet;
+import com.l2jserver.gameserver.model.actor.instance.L2PcInstance;
import com.l2jserver.gameserver.model.conditions.Condition;
import com.l2jserver.gameserver.model.effects.AbstractEffect;
import com.l2jserver.gameserver.model.effects.L2EffectType;
@@ -81,6 +82,18 @@
info.getEffected().getEffectList().remove(true, infoToSteal);
info.getEffector().getEffectList().add(stolen);
}
+
+ // so we put them back
+ if (toSteal.size() > 0)
+ {
+ L2PcInstance target = (L2PcInstance) info.getEffected();
+
+ // Give player stolen buffs back after x seconds if he is not in olympiad
+ if (!target.isInOlympiadMode())
+ {
+ target.returnBuffs(toSteal, 10);
+ }
+ }
}
}
}
\ No newline at end of file