Noticias:

No tienes permiso para ver los enlaces. Para poder verlos Registrate o Conectate.

Menú Principal

Cancel/Steal Return.

Iniciado por JMD, Jul 25, 2025, 12:18 AM

Tema anterior - Siguiente tema

JMD

Basado en el código No tienes permiso para ver los enlaces. Para poder verlos Registrate o Conectate.

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