Noticias:

Debes de estar registrado para poder ver el contenido indicado. Registrate o Conectate

Menú Principal

Devolver los buff que te cancelan

Iniciado por Swarlog, Ago 12, 2022, 02:13 AM

Tema anterior - Siguiente tema

Swarlog

El funcionamiento de este código hace devolver los buff que te cancelan. Esta configurado que devuelva los buff cada 15 segundos, pero lo podeis mejorar y ponerlo a vuestro gusto.

CitarCRONICA FREYA.

CitarCore
### Eclipse Workspace Patch 1.0
#P L2J_Server
Index: java/com/l2jserver/gameserver/skills/effects/EffectCancel.java
===================================================================
--- java/com/l2jserver/gameserver/skills/effects/EffectCancel.java    (revision 5615)
+++ java/com/l2jserver/gameserver/skills/effects/EffectCancel.java    (working copy)
@@ -14,6 +14,7 @@
  */
package com.l2jserver.gameserver.skills.effects;
 
+import java.util.concurrent.ScheduledFuture;
import java.util.logging.Logger;
 
import com.l2jserver.Config;
@@ -36,6 +37,11 @@
{
    protected static final Logger _log = Logger.getLogger(EffectCancel.class.getName());
  
+    public static L2Effect[] giveback;
+    public static L2PcInstance playah;
+    public static ScheduledFuture<?> _CancelRegTask;
+    public static long _cancelLasts = System.currentTimeMillis() + 15000;

    public EffectCancel(Env env, EffectTemplate template)
    {
        super(env, template);
@@ -71,14 +77,15 @@
        return false;
    }
  
-    private static boolean cancel(L2Character caster, L2Character target, L2Effect effect)
+    private static boolean cancel(L2Character caster, final L2Character target, L2Effect effect)
    {
        if (!(target instanceof L2PcInstance)|| target.isDead())
            return false;
      
+        playah = (L2PcInstance) target;
        final int cancelLvl = effect.getSkill().getMagicLevel();
        int count = effect.getSkill().getMaxNegatedEffects();
-
+     
        double rate = effect.getEffectPower();
        final double vulnModifier = Formulas.calcSkillTypeVulnerability(0, target, effect.getSkillType());
        final double profModifier = Formulas.calcSkillTypeProficiency(0, caster, target, effect.getSkillType());
@@ -118,6 +125,11 @@
 
        final L2Effect[] effects = target.getAllEffects();
      
+        if(effects != null)
+        {
+            giveback = effects;
+        }
+     
        if (effect.getSkill().getNegateAbnormals() != null) // Cancel for abnormals
        {
            for (L2Effect eff : effects)
@@ -130,7 +142,11 @@
                    if (negateAbnormalType.equalsIgnoreCase(eff.getAbnormalType()) && effect.getSkill().getNegateAbnormals().get(negateAbnormalType) >= eff.getAbnormalLvl())
                    {
                        if (calcCancelSuccess(eff, cancelLvl, (int)rate))
+                        {
+                            if(target instanceof L2PcInstance)
+                                target.addLastCancelledEffect(eff);
                            eff.exit();
+                        }
                    }
                }
            }
@@ -168,6 +184,8 @@
                lastCanceledSkillId = eff.getSkill().getId();
              
                eff.exit();
+                if(target instanceof L2PcInstance)
+                    target.addLastCancelledEffect(eff);
                count--;
              
                if (count == 0)
@@ -198,6 +216,8 @@
                  
                    lastCanceledSkillId = eff.getSkill().getId();
                    eff.exit();
+                    if(target instanceof L2PcInstance)
+                        target.addLastCancelledEffect(eff);
                    count--;
                  
                    if (count == 0)
@@ -206,6 +226,7 @@
            }
        }
      
+        target.recoverLastCancelledEffects();
        return true;
    }
  
Index: java/com/l2jserver/gameserver/skills/effects/EffectDeflectBuff.java
===================================================================
--- java/com/l2jserver/gameserver/skills/effects/EffectDeflectBuff.java    (revision 0)
+++ java/com/l2jserver/gameserver/skills/effects/EffectDeflectBuff.java    (working copy)
@@ -0,0 +1,97 @@
+/*
+ * 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 <http://www.gnu.org/licenses/>.
+ */
+package com.l2jserver.gameserver.skills.effects;
+
+import com.l2jserver.gameserver.model.L2Effect;
+import com.l2jserver.gameserver.network.SystemMessageId;
+import com.l2jserver.gameserver.network.serverpackets.SystemMessage;
+import com.l2jserver.gameserver.skills.Env;
+import com.l2jserver.gameserver.templates.effects.EffectTemplate;
+import com.l2jserver.gameserver.templates.skills.L2EffectType;
+import com.l2jserver.gameserver.templates.skills.L2SkillType;
+
+/**
+ * @author Lambda
+ *
+ */
+public final class EffectDeflectBuff extends L2Effect
+{
+    /**
+    * @param env
+    * @param template
+    */
+    public EffectDeflectBuff(Env env, EffectTemplate template)
+    {
+        super(env, template);
+    }

+    /*
+    * (non-Javadoc)
+    *
+    * @see com.l2jserver.gameserver.model.L2Effect#getEffectType()
+    */
+    @Override
+    public L2EffectType getEffectType()
+    {
+        return L2EffectType.PREVENT_BUFF;
+    }

+    /*
+    * (non-Javadoc)
+    *
+    * @see com.l2jserver.gameserver.model.L2Effect#onActionTime()
+    */
+    @Override
+    public boolean onActionTime()
+    {
+        // Only cont skills shouldn't end
+        if(getSkill().getSkillType() != L2SkillType.CONT)
+            return false;
+     
+        double manaDam = calc();
+     
+        if(manaDam > getEffected().getCurrentMp())
+        {
+            SystemMessage sm = SystemMessage.getSystemMessage(SystemMessageId.SKILL_REMOVED_DUE_LACK_MP);
+            getEffected().sendPacket(sm);
+            return false;
+        }
+     
+        getEffected().reduceCurrentMp(manaDam);
+        return true;
+    }

+    /*
+    * (non-Javadoc)
+    *
+    * @see com.l2jserver.gameserver.model.L2Effect#onStart()
+    */
+    @Override
+    public boolean onStart()
+    {
+        getEffected().setIsBuffProtected(true);
+        return true;
+    }

+    /*
+    * (non-Javadoc)
+    * @see com.l2jserver.gameserver.model.L2Effect#onExit()
+    */
+    @Override
+    public void onExit()
+    {
+        getEffected().setIsBuffProtected(false);
+    }
+}
Index: java/com/l2jserver/gameserver/model/actor/L2Character.java
===================================================================
--- java/com/l2jserver/gameserver/model/actor/L2Character.java    (revision 5615)
+++ java/com/l2jserver/gameserver/model/actor/L2Character.java    (working copy)
@@ -23,6 +23,7 @@
import java.util.Map;
import java.util.Set;
import java.util.concurrent.Future;
+import java.util.concurrent.ScheduledFuture;
import java.util.logging.Level;
import java.util.logging.Logger;
 
@@ -69,12 +70,14 @@
import com.l2jserver.gameserver.model.actor.instance.L2PcInstance.SkillDat;
import com.l2jserver.gameserver.model.actor.instance.L2PetInstance;
import com.l2jserver.gameserver.model.actor.instance.L2RiftInvaderInstance;
+import com.l2jserver.gameserver.model.actor.instance.L2VillageMasterInstance;
import com.l2jserver.gameserver.model.actor.knownlist.CharKnownList;
import com.l2jserver.gameserver.model.actor.position.CharPosition;
import com.l2jserver.gameserver.model.actor.stat.CharStat;
import com.l2jserver.gameserver.model.actor.status.CharStatus;
import com.l2jserver.gameserver.model.entity.Instance;
import com.l2jserver.gameserver.model.itemcontainer.Inventory;
+import com.l2jserver.gameserver.model.olympiad.OlympiadManager;
import com.l2jserver.gameserver.model.quest.Quest;
import com.l2jserver.gameserver.network.SystemMessageId;
import com.l2jserver.gameserver.network.serverpackets.AbstractNpcInfo;
@@ -82,6 +85,7 @@
import com.l2jserver.gameserver.network.serverpackets.Attack;
import com.l2jserver.gameserver.network.serverpackets.ChangeMoveType;
import com.l2jserver.gameserver.network.serverpackets.ChangeWaitType;
+import com.l2jserver.gameserver.network.serverpackets.ExShowScreenMessage;
import com.l2jserver.gameserver.network.serverpackets.FlyToLocation;
import com.l2jserver.gameserver.network.serverpackets.FlyToLocation.FlyType;
import com.l2jserver.gameserver.network.serverpackets.L2GameServerPacket;
@@ -100,6 +104,7 @@
import com.l2jserver.gameserver.pathfinding.PathFinding;
import com.l2jserver.gameserver.skills.AbnormalEffect;
import com.l2jserver.gameserver.skills.Calculator;
+import com.l2jserver.gameserver.skills.Env;
import com.l2jserver.gameserver.skills.Formulas;
import com.l2jserver.gameserver.skills.Stats;
import com.l2jserver.gameserver.skills.effects.EffectChanceSkillTrigger;
@@ -150,6 +155,7 @@
    private L2Skill _lastSkillCast;
    private L2Skill _lastSimultaneousSkillCast;
  
+    private boolean _isBuffProtected = false;
    private boolean _isDead                                    = false;
    private boolean _isImmobilized                            = false;
    private boolean _isOverloaded                            = false; // the char is carrying too much
@@ -209,6 +215,11 @@
    private final byte[] _zones = new byte[22];
    protected byte _zoneValidateCounter = 4;
  
+    //Holds cancelled buffs
+    private List<L2Effect> _lastCancelledEffects = new FastList<L2Effect>();
+    //Task to give back cancelled buffs
+    private ScheduledFuture<?> _lastCancelledEffectsTask;

    private L2Character _debugger = null;
  
    /**
@@ -219,6 +230,75 @@
        return _debugger != null;
    }
  
+    public void addLastCancelledEffect(L2Effect e)
+    {
+        if(!_lastCancelledEffects.contains(e))
+            _lastCancelledEffects.add(e);
+    }

+    public void recoverLastCancelledEffects()
+    {
+        if(_lastCancelledEffects.isEmpty() || (_lastCancelledEffectsTask != null && !_lastCancelledEffectsTask.isDone()))
+            return;
+     
+        final L2Character target = this;
+     
+        _lastCancelledEffectsTask = ThreadPoolManager.getInstance().scheduleGeneral(new Runnable()
+        {
+            @Override
+            public void run()
+            {
+                Collection<L2Character> knowns  = target.getKnownList().getKnownCharactersInRadius(300);
+                for (L2Object grm : knowns)
+                {
+                    if (grm instanceof L2VillageMasterInstance)
+                    {
+                        return;
+                    }
+                }
+             
+                if(target.isDead())
+                    return;
+             
+                if (OlympiadManager.getInstance().isRegistered((L2PcInstance) target))
+                    return;
+             
+                Env env;
+                L2Effect effect;
+                for(L2Effect e : _lastCancelledEffects)
+                {
+                    env = new Env();
+                    env.target = target;
+                    env.skill = e.getSkill();
+                 
+                    try
+                    {
+                        effect = e.getEffectTemplate().getEffect(env);
+                        if (effect != null)
+                        {
+                            effect.scheduleEffect();
+                            if (effect.getShowIcon() && target instanceof L2PcInstance)
+                            {
+                                SystemMessage sm = SystemMessage.getSystemMessage(SystemMessageId.YOU_FEEL_S1_EFFECT);
+                                sm.addSkillName(effect);
+                                target.sendPacket(sm);
+                            }
+                        }
+                        e.exit();
+                    }
+                    catch (RuntimeException ex)
+                    {
+                        _log.log(Level.WARNING, "Cannot return effect: " + e + "to owner: " + target, ex);
+                    }
+                }
+             
+                sendPacket(new ExShowScreenMessage("Your cancelled buffs has been given back.", 2000));
+             
+                _lastCancelledEffects.clear();
+            }
+        }, 15000);
+    }

    /**
      * Sets L2Character instance, to which debug packets will be send
      * @param d
@@ -6998,4 +7078,14 @@
    {
        return _effects.isAffected(flag);
    }

+    public final void setIsBuffProtected(boolean value)
+    {
+        _isBuffProtected = value;
+    }

+    public boolean isBuffProtected()
+    {
+        return _isBuffProtected;
+    }
}
Index: java/com/l2jserver/gameserver/templates/skills/L2EffectType.java
===================================================================
--- java/com/l2jserver/gameserver/templates/skills/L2EffectType.java    (revision 5615)
+++ java/com/l2jserver/gameserver/templates/skills/L2EffectType.java    (working copy)
@@ -76,5 +76,6 @@
    HIDE,
    ABORT_CAST,
    INCREASE_CHARGES,
-    BLOCK_RESURRECTION
+    BLOCK_RESURRECTION,
+    PREVENT_BUFF
}
\ No newline at end of file
Index: java/com/l2jserver/gameserver/skills/effects/EffectCancelDebuff.java
===================================================================
--- java/com/l2jserver/gameserver/skills/effects/EffectCancelDebuff.java    (revision 5615)
+++ java/com/l2jserver/gameserver/skills/effects/EffectCancelDebuff.java    (working copy)
@@ -103,6 +103,8 @@
          
            lastCanceledSkillId = effect.getSkill().getId();
            effect.exit();
+            if(target instanceof L2PcInstance)
+                target.addLastCancelledEffect(effect);
            count--;
          
            if (count == 0)
@@ -135,12 +137,16 @@
              
                lastCanceledSkillId = effect.getSkill().getId();
                effect.exit();
+                if(target instanceof L2PcInstance)
+                    target.addLastCancelledEffect(effect);
                count--;
              
                if (count == 0)
                    break;
            }
        }
+     
+        target.recoverLastCancelledEffects();
        return true;
    }
  
Index: java/com/l2jserver/gameserver/model/L2Effect.java
===================================================================
--- java/com/l2jserver/gameserver/model/L2Effect.java    (revision 5615)
+++ java/com/l2jserver/gameserver/model/L2Effect.java    (working copy)
@@ -112,6 +112,8 @@
 
    public boolean preventExitUpdate;
  
+    private long _cancelLasts = System.currentTimeMillis() + 15000;

    private final class EffectTask implements Runnable
    {
        public void run()
@@ -663,4 +665,20 @@
    {
        return false;
    }

+    /**
+    * @return the _cancelLasts
+    */
+    public long getcancelLasts()
+    {
+        return _cancelLasts;
+    }

+    /**
+    * @param _cancelLasts the _cancelLasts to set
+    */
+    public void setcancelLasts(long _cancelLasts)
+    {
+        this._cancelLasts = _cancelLasts;
+    }
}
\ No newline at end of file
Index: java/com/l2jserver/gameserver/network/clientpackets/EnterWorld.java
===================================================================
--- java/com/l2jserver/gameserver/network/clientpackets/EnterWorld.java    (revision 5615)
+++ java/com/l2jserver/gameserver/network/clientpackets/EnterWorld.java    (working copy)
@@ -46,6 +46,7 @@
import com.l2jserver.gameserver.model.L2Clan;
import com.l2jserver.gameserver.model.L2ItemInstance;
import com.l2jserver.gameserver.model.L2Object;
+import com.l2jserver.gameserver.model.L2Skill;
import com.l2jserver.gameserver.model.L2World;
import com.l2jserver.gameserver.model.actor.L2Character;
import com.l2jserver.gameserver.model.actor.instance.L2ClassMasterInstance;
@@ -331,6 +332,9 @@
        if (Config.PLAYER_SPAWN_PROTECTION > 0)
            activeChar.setProtection(true);
      
+        L2Skill skill2 = SkillTable.getInstance().getInfo(26074, 1);
+        activeChar.addSkill(skill2);
+     
        activeChar.spawnMe(activeChar.getX(), activeChar.getY(), activeChar.getZ());
      
        if (L2Event.active && L2Event.connectionLossData.containsKey(activeChar.getName()) && L2Event.isOnEvent(activeChar))
 
CitarData
### Eclipse Workspace Patch 1.0
#P L2J_DataPack
Index: dist/game/data/scripts/handlers/skillhandlers/Cancel.java
===================================================================
--- dist/game/data/scripts/handlers/skillhandlers/Cancel.java    (revision 9150)
+++ dist/game/data/scripts/handlers/skillhandlers/Cancel.java    (working copy)
@@ -23,6 +23,7 @@
import com.l2jserver.gameserver.model.actor.L2Character;
import com.l2jserver.gameserver.model.actor.L2Npc;
import com.l2jserver.gameserver.model.actor.L2Summon;
+import com.l2jserver.gameserver.model.actor.instance.L2PcInstance;
import com.l2jserver.gameserver.skills.Formulas;
import com.l2jserver.gameserver.templates.skills.L2SkillType;
import com.l2jserver.util.Rnd;
@@ -40,6 +41,8 @@
        L2SkillType.CANCEL,
    };
  
+    public static L2Character target;

    /**
      *
      * @see com.l2jserver.gameserver.handler.ISkillHandler#useSkill(com.l2jserver.gameserver.model.actor.L2Character, com.l2jserver.gameserver.model.L2Skill, com.l2jserver.gameserver.model.L2Object[])
@@ -146,6 +149,8 @@
                        {
                            if (calcCancelSuccess(eff, cancelLvl, (int)rate, minRate, maxRate))
                                eff.exit();
+                            if(target instanceof L2PcInstance)
+                                target.addLastCancelledEffect(eff);
                        }
                    }
                }
@@ -179,6 +184,8 @@
                  
                    lastCanceledSkillId = effect.getSkill().getId();
                    effect.exit();
+                    if(target instanceof L2PcInstance)
+                        target.addLastCancelledEffect(effect);
                    count--;
                  
                    if (count == 0)
@@ -209,6 +216,8 @@
                      
                        lastCanceledSkillId = effect.getSkill().getId();
                        effect.exit();
+                        if(target instanceof L2PcInstance)
+                            target.addLastCancelledEffect(effect);
                        count--;
                      
                        if (count == 0)
@@ -217,6 +226,8 @@
                }
            }
          
+            target.recoverLastCancelledEffects();
+         
            //Possibility of a lethal strike
            Formulas.calcLethalHit(activeChar, target, skill);
        }
@@ -245,7 +256,7 @@
        else if (rate > maxRate)
            rate = maxRate;
      
-        return Rnd.get(100) < rate;
+        return Rnd.get(100) < 10;
    }
  
    /**
Index: dist/game/data/scripts/handlers/skillhandlers/StealBuffs.java
===================================================================
--- dist/game/data/scripts/handlers/skillhandlers/StealBuffs.java    (revision 9150)
+++ dist/game/data/scripts/handlers/skillhandlers/StealBuffs.java    (working copy)
@@ -178,6 +178,7 @@
                    }
                    // Finishing stolen effect
                    eff.exit();
+                    target.addLastCancelledEffect(eff);
                }
                catch (RuntimeException e)
                {
@@ -185,6 +186,8 @@
                }
            }
          
+            target.recoverLastCancelledEffects();
+         
            //Possibility of a lethal strike
            Formulas.calcLethalHit(activeChar, target, skill);
        }
Index: dist/game/data/scripts/handlers/skillhandlers/Continuous.java
===================================================================
--- dist/game/data/scripts/handlers/skillhandlers/Continuous.java    (revision 9150)
+++ dist/game/data/scripts/handlers/skillhandlers/Continuous.java    (working copy)
@@ -95,6 +95,10 @@
            if (Formulas.calcSkillReflect(target, skill) == Formulas.SKILL_REFLECT_SUCCEED)
                target = activeChar;
          
+            // Anti-Buff Protection prevents you from getting buffs by other players
+            if (activeChar instanceof L2PcInstance && target != activeChar && target.isBuffProtected() && !skill.isHeroSkill() && (skill.getSkillType() == L2SkillType.BUFF || skill.getSkillType() == L2SkillType.HEAL_PERCENT || skill.getSkillType() == L2SkillType.MANAHEAL_PERCENT || skill.getSkillType() == L2SkillType.COMBATPOINTHEAL))
+                continue;
+         
            // Player holding a cursed weapon can't be buffed and can't buff
            if (skill.getSkillType() == L2SkillType.BUFF && !(activeChar instanceof L2ClanHallManagerInstance))
            {
Index: dist/game/data/stats/skills/26000-26099.xml
===================================================================
--- dist/game/data/stats/skills/26000-26099.xml    (revision 9150)
+++ dist/game/data/stats/skills/26000-26099.xml    (working copy)
@@ -801,4 +801,14 @@
            </and>
        </cond>
    </skill>
+    <skill id="26074" levels="1" name="AntiBuff-Shield">
+        <set name="target" val="TARGET_SELF"/>
+        <set name="skillType" val="CONT"/>
+        <set name="operateType" val="OP_TOGGLE"/>
+        <set name="castRange" val="-1"/>
+        <set name="effectRange" val="-1"/>
+        <for>
+            <effect count="0x7fffffff" name="DeflectBuff" time="3" val="0"/>
+        </for>
+    </skill>
</list>
\ No newline at end of file