Jump to content
  • 0

Buff-Steal Order


Gries

Question

Hello, i currently have this code:

public static List<L2Effect> calcCancelStealEffects(L2Character activeChar, L2Character target, L2Skill skill, double power)
{
  // Resists.
  int cancelMagicLvl = skill.getMagicLevel();
  int count = skill.getMaxNegatedEffects();
  final double vuln = target.calcStat(Stats.CANCEL_VULN, 0, target, null);
  final double prof = activeChar.calcStat(Stats.CANCEL_PROF, 0, target, null);
  double resMod = 1 + (((vuln + prof) * -1) / 100);
  double rate = power / resMod;
 
  if (activeChar.isDebug() || Config.DEVELOPER)
  {
   final StringBuilder stat = new StringBuilder(100);
   StringUtil.append(stat, skill.getName(), " Base Rate:", String.valueOf((int) power), " Magiclvl:", String.valueOf(cancelMagicLvl), " resMod:", String.format("%1.2f", resMod), "(", String.format("%1.2f", prof), "/", String.format("%1.2f", vuln), ") Rate:", String.valueOf(rate));
   final String result = stat.toString();
   if (activeChar.isDebug())
   {
    activeChar.sendDebugMessage(result);
   }
   if (Config.DEVELOPER)
   {
    _log.info(result);
   }
  }
 
  // Cancel for Abnormals.
  final L2Effect[] effects = target.getAllEffects();
  List<L2Effect> canceled = new ArrayList<>(count);
  if (skill.getNegateAbnormals() != null)
  {
   for (L2Effect eff : effects)
   {
    if (eff == null)
    {
     continue;
    }
   
    for (String negateAbnormalType : skill.getNegateAbnormals().keySet())
    {
     if (negateAbnormalType.equalsIgnoreCase(eff.getAbnormalType()) && (skill.getNegateAbnormals().get(negateAbnormalType) >= eff.getAbnormalLvl()))
     {
      if (calcCancelSuccess(eff, cancelMagicLvl, (int) rate, skill))
      {
       eff.exit();
      }
     }
    }
   }
  }
  // Common Cancel/Steal.
  else
  {
   // First Pass.
   int lastCanceledSkillId = 0;
   L2Effect effect;
   for (int i = effects.length; --i >= 0;) // reverse order
   {
    effect = effects[i];
    if (effect == null)
    {
     continue;
    }
   
    // remove effect if can't be stolen
    if (!effect.canBeStolen())
    {
     effects[i] = null;
     continue;
    }
   
    // if effect time is smaller than 5 seconds, will not be stolen, just to save CPU,
    // avoid synchronization(?) problems and NPEs
    if ((effect.getAbnormalTime() - effect.getTime()) < 5)
    {
     effects[i] = null;
     continue;
    }
   
    // Only Dances/Songs.
    if (!effect.getSkill().isDance())
    {
     continue;
    }
   
    if (!calcCancelSuccess(effect, cancelMagicLvl, (int) rate, skill))
    {
     continue;
    }
   
    if (effect.getSkill().getId() != lastCanceledSkillId)
    {
     lastCanceledSkillId = effect.getSkill().getId();
     count--;
    }
   
    canceled.add(effect);
    if (count == 0)
    {
     break;
    }
   }
   // Second Pass.
   if (count > 0)
   {
    lastCanceledSkillId = 0;
    for (int i = effects.length; --i >= 0;)
    {
     effect = effects[i];
     if (effect == null)
     {
      continue;
     }
    
     // All Except Dances/Songs.
     if (effect.getSkill().isDance())
     {
      continue;
     }
    
     if (!calcCancelSuccess(effect, cancelMagicLvl, (int) rate, skill))
     {
      continue;
     }
    
     if (effect.getSkill().getId() != lastCanceledSkillId)
     {
      lastCanceledSkillId = effect.getSkill().getId();
      count--;
     }
    
     canceled.add(effect);
     if (count == 0)
     {
      break;
     }
    }
   }
  }
  return canceled;
}

public static boolean calcCancelSuccess(L2Effect eff, int cancelMagicLvl, int rate, L2Skill skill)
{
  // Lvl Bonus Modifier.
  rate *= (eff.getSkill().getMagicLevel() > 0) ? (cancelMagicLvl / eff.getSkill().getMagicLevel()) : 1;
 
  // Check the Rate Limits.
  rate = Math.min(Math.max(rate, skill.getMinChance()), skill.getMaxChance());
 
  return Rnd.get(100) < rate;
}
}

to calculate the amount of stolen debuffs based on the character resists, however it appears that songs and dances are not being removed as first when a steal skill type is used.

Link to comment
Share on other sites

7 answers to this question

Recommended Posts

Join the conversation

You can post now and register later. If you have an account, sign in now to post with your account.
Note: Your post will require moderator approval before it will be visible.

Guest
Answer this question...

×   Pasted as rich text.   Paste as plain text instead

  Only 75 emoji are allowed.

×   Your link has been automatically embedded.   Display as a link instead

×   Your previous content has been restored.   Clear editor

×   You cannot paste images directly. Upload or insert images from URL.



  • Posts

    • DISCORD : utchiha_market telegram : https://t.me/utchiha_market SELLIX STORE : https://utchihamkt.mysellix.io/ Join our server for more products : https://discord.gg/hood-services https://campsite.bio/utchihaamkt  
    • Server Rates: » Xp 500x. » Sp 500x. » Aden 500x. » Drop 1x. » PartyXp 2x. » PartySp 2x. » Starting character level -61. Enchant rates: » Safe enchant +4. » Blessed and simple scrolls max enchant (+16). » Crystal scrolls max enchant (+20). » Simple enchant scrolls chance – 65%. » Blessed enchant scrolls chance – 100%. » Crystal enchant scrolls chance – 50% Augmentations: » Mid life stone skill chance – 5%. » High life stone skill chance – 10%. » Top life stone skill chance – 20%. » Augments 1+1 Unique features: » Main town – Giran » Automatic-Manual Potions. » Working 2 castle sieges. (Giran-Aden) » SPS cancel lasts 10 seconds and than buffs come back. » Stackable scrolls, lifestones, book of giants. » Unique pvp zone » More then 11 active raid bosses. » Wedding system. » Unique farming areas. » Npc skill enchanter. » Full npc buffer with auto buff. » Max count of buffs – 55. » Max subclasses – 4. » Free and no quest class change. » Free and no quest sub class. » Raid boss drop nobless item. » No weight limit. » Unique protection anti-hwy armor for archers/daggers etc. » Ingame password change. » Top pvp/pk/online ranks NPC. » Unique monsters & NPC. » Interlude retail skills. » Server up-time [24/7] [99]%. » Perfect class balance (all class can kill all class depending on players skill and setup knowledge,gear,augmentations). » Announcements on double kills triple kills etc. » Announcements on Grand Boss death , with the name of the killer as well as clan name of the player. » Information Npc in game with all servers infromations. Custom server gear : 1). Titanium Armor Lv.1 2). Epic Armor Lv.2 3). Epic Weapons-Kamikaze-Black S grade (Same Stats) 4). Demonic-Angelic Wings-Baium Hair-Custom Accessories (SameStats) 5). Custom Fighter/Mage tattoo Lv1-Lv2-Lv3 6). Shirt (STR,CON,INT +1) 7). Custom Shields Server Commands: .tvtjoin .tvtleave – Join or leave tvt event. .ctfjoin .ctfleave – Join or leave ctf event. .dmjoin .dmleave – Join of leave dm event. .online – current online players count. .repair – repairs stuck character in world. .menu – opens online menu panel. .exit – PVP zone exit in case you are bullied. .changepassword - Opens online menu then u can change ur password in game. .farm - Enable/disable autofarm Event system: » TVT event » CTF event » DM event » Tournament Event » Party Zone » Unique event shop. Olympiad game: » Retail olympiad game. » Competition period [1] week. » Olympiad start time [18:00] end [00:00] GMT+2. » New Heroes every Sunday.
    • Tomorrow grand opening lests go 🙂 
  • Topics

×
×
  • Create New...