Advertisement
elasticpwnz

Untitled

Nov 14th, 2015
108
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Java 9.01 KB | None | 0 0
  1. package core.gameserver.stats.formulas;
  2.  
  3. import core.commons.util.Rnd;
  4. import core.gameserver.Config;
  5. import core.gameserver.model.Creature;
  6. import core.gameserver.model.Skill;
  7. import core.gameserver.model.base.Element;
  8. import core.gameserver.model.base.SkillTrait;
  9. import core.gameserver.model.items.ItemInstance;
  10. import core.gameserver.mods.balancer.Balancer;
  11. import core.gameserver.stats.Env;
  12. import core.gameserver.stats.Stats;
  13.  
  14. import java.util.ArrayList;
  15.  
  16. public class DebuffFormulas
  17. {
  18.     public static boolean calcSkillSuccess(Env env, int spiritshot)
  19.     {
  20.         if((env != null && env.value == -1))
  21.             return true;
  22.  
  23.         if(env != null && env.target != null && env.target.isNpc() && env.target.isDamageBlocked())
  24.             return false;
  25.  
  26.         if(env != null && env.target != null && env.target.isDebuffImmune())
  27.             return false;
  28.  
  29.         if(CommonFormulas.calcIsImmune(env.target, env.skill))
  30.             return false;
  31.  
  32.         env.value = Math.max(Math.min(env.value, 100), 1);
  33.  
  34.         final Skill skill = env.skill;
  35.  
  36.         if(!skill.isOffensive())
  37.             return Rnd.chance(env.value);
  38.  
  39.         final Creature caster = env.character;
  40.         final Creature target = env.target;
  41.  
  42.         double activate_rate = env.value;
  43.         double rate = activate_rate;
  44.  
  45.         //Если offensive скил не имеет trait то и эффект к нему привязанный имеет статический шанс
  46.         if(skill.isActivateRateStatic())
  47.         {
  48.             rate += levelModifierCalculate(skill, caster.getLevel(), target, skill.getMagicLevel());
  49.             showDebuffChance(caster, target, skill, rate);
  50.             return Rnd.chance((int)rate);
  51.         }
  52.  
  53.         //Делим на модификатор стата, если есть
  54.         if(skill.getSaveVs() != null)
  55.             rate /= skill.getSaveVs().calcBonus(target);
  56.  
  57.         //Прибавляем левел мод
  58.         rate += levelModifierCalculate(skill, caster.getLevel(), target, skill.getMagicLevel());
  59.  
  60.         //Умножаем на траит мод, если есть треит
  61.         if(skill.getTraitType() != null || skill.getTraitType() != SkillTrait.NONE)
  62.             rate = debuffResistsModifierCalculate(skill, env, rate);
  63.  
  64.         //Умножаем на модификатор дебаф резиста
  65.         rate *= debuffResistsRate(target, caster, skill);
  66.  
  67.         //Умножаем на модификатор атрибута
  68.         rate *= elementModifierCalculate(skill, caster, target);
  69.  
  70.         //Считаем модификатор из м.атаки и м.дефа и умножаем на него шанс
  71.         double magic_attack_modifier = 1.;
  72.         if(skill.isMagic())
  73.         {
  74.             int magic_defence = Math.max(1, target.getMDef(target, skill));
  75.             double magic_attack;
  76.  
  77.             if(skill.getCubic() != null)
  78.             {
  79.                 magic_attack = skill.getCubic().getPower();
  80.             }
  81.             else
  82.                 magic_attack = caster.getMAtk(target, skill);
  83.  
  84.             if(skill.getCubic() == null)
  85.                 magic_attack *= getSSMod(skill, spiritshot);
  86.  
  87.             magic_attack_modifier = Config.SKILLS_CHANCE_MOD * Math.pow(magic_attack, Config.SKILLS_CHANCE_POW) / magic_defence;
  88.  
  89.             rate = rate * magic_attack_modifier;
  90.         }
  91.  
  92.         //Баланс модуль
  93.         rate *= debuffBalanceModifier(caster, skill);
  94.         rate *= balancerIncomeDebuffModifier(caster, target);
  95.  
  96.         //Применяем капы
  97.         rate = applyCaps(rate);
  98.  
  99.         //Показываем шанс
  100.         showDebuffChance(caster, target, skill, rate);
  101.  
  102.         return Rnd.chance((int)rate);
  103.     }
  104.  
  105.     private static int getSSMod(Skill skill, int spiritshot)
  106.     {
  107.         if(!skill.isSSPossible())
  108.             return 1;
  109.  
  110.         switch(spiritshot)
  111.         {
  112.             case ItemInstance.CHARGED_BLESSED_SPIRITSHOT:
  113.                 return 4;
  114.             case ItemInstance.CHARGED_SPIRITSHOT:
  115.                 return 2;
  116.             default:
  117.                 return 4;
  118.         }
  119.     }
  120.  
  121.     private static double debuffResistsModifierCalculate(Skill skill, Env env, double rate)
  122.     {
  123.         double trait_premod, attack_trait_bonus = 1, defence_trait_bonus = 1, trait_mod;
  124.         ArrayList<Double> resists, powers;
  125.  
  126.         if(skill.isIgnoreResists())
  127.             return rate;
  128.  
  129.         SkillTrait trait = skill.getTraitType();
  130.  
  131.         resists = trait.calcVulns(env);
  132.  
  133.         if(skill.isCubicCastingSkill())
  134.             powers = new ArrayList<>();
  135.         else
  136.             powers = trait.calcProfs(env);
  137.  
  138.         for(double d : resists)
  139.             defence_trait_bonus *= ((100 + d) / 100);
  140.  
  141.         for(double d : powers)
  142.             attack_trait_bonus *= ((100 + d) / 100);
  143.  
  144.         trait_premod = attack_trait_bonus - defence_trait_bonus;
  145.         trait_mod = 1 + trait_premod;
  146.  
  147.         if(trait_mod < 0.05)
  148.             trait_mod = 0.05;
  149.         else if(trait_mod > 1.95)
  150.             trait_mod = 1.95;
  151.  
  152.         return rate * trait_mod;
  153.     }
  154.  
  155.     private static double debuffResistsRate(Creature target, Creature caster, Skill skill)
  156.     {
  157.         return 1. + (target.calcStat(Stats.DEBUFF_POWER, caster, skill) - target.calcStat(Stats.DEBUFF_RESIST, caster, skill)) / 100;
  158.     }
  159.  
  160.     private static int levelModifierCalculate(Skill skill, int caster_level, Creature target, int magic_level)
  161.     {
  162.         int skill_level_depend = skill.getLevelModifier();
  163.  
  164.         if(skill_level_depend == 0)
  165.             return 0;
  166.  
  167.         int attack_level = magic_level > 0 ? magic_level : caster_level;
  168.         int delta = attack_level - target.getLevel();
  169.  
  170.         return delta * skill_level_depend;
  171.     }
  172.  
  173.     private static double elementModifierCalculate(Skill skill, Creature caster, Creature target)
  174.     {
  175.         double element_modifier = 1;
  176.         Element element = skill.getElement();
  177.  
  178.         if(element != Element.NONE && caster.getActiveWeaponInstance() != null)
  179.         {
  180.             Element attackElement = caster.getActiveWeaponInstance().getAttackElement();
  181.             double debuff_element_power = skill.getElementPower();
  182.             double attack_element_power = caster.calcStat(element.getAttack(), 0);
  183.             double defence_element_power = target.calcStat(element.getDefence(), 0);
  184.             attack_element_power = attackElement != element ? 0 : attack_element_power;
  185.             element_modifier = SimpleFormulas.getElementMod(debuff_element_power + attack_element_power, defence_element_power);
  186.         }
  187.  
  188.         return element_modifier;
  189.     }
  190.  
  191.     private static double applyCaps(double rate)
  192.     {
  193.         if(rate < Config.SKILLS_CHANCE_MIN)
  194.             rate = Config.SKILLS_CHANCE_MIN;
  195.         else if(rate > Config.SKILLS_CHANCE_CAP)
  196.             rate = Config.SKILLS_CHANCE_CAP;
  197.         return rate;
  198.     }
  199.  
  200.     private static void showDebuffChance(Creature caster, Creature target, Skill skill, double rate)
  201.     {
  202.         if(caster != null && caster.getPlayer() != null && (Config.SKILLS_CHANCE_SHOW || caster.getPlayer().isGM()))
  203.             caster.getPlayer().sendMessage(skill.getName() + " chance: " + (int)rate + "%");
  204.  
  205.         if(target != null && target.getPlayer() != null && (Config.SKILLS_CHANCE_SHOW || target.getPlayer().isGM()))
  206.             target.getPlayer().sendMessage("Enemy " + skill.getName() + " chance: " + (int)rate + "%");
  207.     }
  208.  
  209.     private static double balancerIncomeDebuffModifier(Creature attacker, Creature target)
  210.     {
  211.         double result = 1.;
  212.         if(attacker.getPlayer() == null || target.getPlayer() == null)
  213.             return result;
  214.  
  215.         int attacker_class_id = attacker.getPlayer().getClassId().getId();
  216.         int target_class_id = target.getPlayer().getClassId().getId();
  217.         boolean olympiad = target.getOlympiadGame() != null;
  218.  
  219.         result *= Balancer.incomeDebuffCalculate(attacker_class_id, target_class_id, olympiad);
  220.         result *= Balancer.incomeCommonDebuffCalculate(target_class_id, olympiad);
  221.  
  222.         return result;
  223.     }
  224.  
  225.     private static double debuffBalanceModifier(Creature caster, Skill skill)
  226.     {
  227.         if(caster == null || caster.getPlayer() == null)
  228.             return 1.;
  229.  
  230.         int classId = caster.getPlayer().getClassId().getId();
  231.         boolean isMagic = skill.isMagic();
  232.         boolean hasTrait = skill.getTraitType() != null;
  233.  
  234.         boolean olympiad = caster.getOlympiadGame() != null;
  235.  
  236.         if(isMagic && !hasTrait)
  237.             return Balancer.debuffMagicalModifierCalculate(classId, olympiad);
  238.         else if(isMagic && hasTrait)
  239.             return Balancer.debuffTraitMagicalModifierCalculate(classId, olympiad);
  240.         else if(!isMagic && hasTrait)
  241.             return Balancer.debuffTraitPhysicalModifierCalculate(classId, olympiad);
  242.         else
  243.             return Balancer.debuffPhysicalModifierCalculate(classId, olympiad);
  244.     }
  245.  
  246.     public static void showStepByStepDebug(Skill skill)
  247.     {
  248.  
  249.     }
  250. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement