Сообщений: 234
Тем: 22
Зарегистрирован: Dec 2010
Репутация:
236
Уважаемые комрады. Пытаюсь я потихоньку вникнуть в яву. Для опытов взял l2p подобные исходы. Хроники - Epilogue. Вопрос собственно вот в чем. Тестеры, которые бегают на сервере все в 1 голос кричат, что не верная формула расчета прохождения всех дебафов (дизарм, Rush Impact, Sleep, Stun, etc...). Говорят, что все завышено. Естественно верить им бессмысленно. Решил сам проверить и заметил вот такую особенность. Допустим берем дебаф дизарм (или тот же раш импакт у берса. Эффекты естественно разные). Базовый шанс 70%. Берем 2 одинаковых персонажей с одинаковым эквипом. Что с бафом, что без бафа - шанс 50% пишет. Снимаем допустим весь сет Ы84 у чара, который пробрасывает дизарм, соответственно у нас меняются все базовые статы (str, con, int, etc). Но даже когда изменяются базовые статы (правда разница там не велика, str в сете = 42, без сета 41) шанс дизарма остается неизменным. Не меняется совершенно ничего. Как-будто при прохождении дебафов совсем не учитываются статы (естественно, когда падают базовые статы, изменяется и патк, матк, пдеф, мдеф и прочее) персонажа, который кидает дебаф. Если снять сет у чара, на которого пробрасываем дебаф, то разница в шанса 1-3%. Тесты проводились без эпика. Подскажите пожалуйста, в какой стороне искать формулу расчета дебафов? Я нашел только в formulas.java метод calcSkillSuccess. Но, как я понял, он не имеет отношения к расчету шанса прохождения дебафов. Прошу указать верный путь в темном, для меня, царстве
Сообщений: 151
Тем: 5
Зарегистрирован: Jun 2011
Репутация:
347
ну дизарм по-идеи резистится только показателем СТР цели и не зависит от м.атаки или п.атаки атакующего
C# разработчики ваще лютая армия. Сейчас допишу коммент и пойду писать на C# для iOS
Сообщений: 387
Тем: 15
Зарегистрирован: Oct 2009
Сообщений: 234
Тем: 22
Зарегистрирован: Dec 2010
Репутация:
236
Ну хорошо, допустим даже все верно стоит. Но вот где это увидеть? В упор не вижу расчет шанса прохождения скила/бафа/дебафа
Сообщений: 151
Тем: 5
Зарегистрирован: Jun 2011
Репутация:
347
return (Rnd.get(100) < rate);
перед этим идет расчет rate, который учитывает множество параметров(в зависимости от скила).
у l2jserver так
C# разработчики ваще лютая армия. Сейчас допишу коммент и пойду писать на C# для iOS
Сообщений: 387
Тем: 15
Зарегистрирован: Oct 2009
return Rnd.get(100) <= chance;
Сообщений: 234
Тем: 22
Зарегистрирован: Dec 2010
Репутация:
236
У меня такое чувство, что сейчас меня просто послали
Сообщений: 151
Тем: 5
Зарегистрирован: Jun 2011
Репутация:
347
l2jserver's calcSkillSuc
Код: public static boolean calcSkillSuccess(L2Character attacker, L2Character target, L2Skill skill, byte shld, boolean ss, boolean sps, boolean bss)
2103 {
2104 if (skill.getPower() == -1)
2105 {
2106 return true;
2107 }
2108
2109 final boolean isPvP = attacker.isPlayable() && target.isPlayable();
2110 final boolean isPvE = attacker.isPlayable() && target.isL2Attackable();
2111 if (skill.ignoreResists())
2112 {
2113 if (attacker.isDebug())
2114 {
2115 attacker.sendDebugMessage(skill.getName() + " ignoring resists");
2116 }
2117
2118 return (Rnd.get(100) < skill.getPower(isPvP, isPvE));
2119 }
2120 else if ((target.calcStat(Stats.DEBUFF_IMMUNITY, 0, null, skill) > 0) && skill.isDebuff())
2121 {
2122 return false;
2123 }
2124
2125 if (shld == SHIELD_DEFENSE_PERFECT_BLOCK) // perfect block
2126 {
2127 if (attacker.isDebug())
2128 {
2129 attacker.sendDebugMessage(skill.getName() + " blocked by shield");
2130 }
2131
2132 return false;
2133 }
2134
2135 int value = (int) skill.getPower(isPvP, isPvE);
2136 double statModifier = calcSkillStatModifier(skill, target);
2137
2138 // Calculate BaseRate.
2139 int rate = (int) (value * statModifier);
2140
2141 // Add Matk/Mdef Bonus
2142 double mAtkModifier = 0;
2143 int ssModifier = 0;
2144 if (skill.isMagic())
2145 {
2146 mAtkModifier = target.getMDef(target, skill);
2147 if (shld == SHIELD_DEFENSE_SUCCEED)
2148 {
2149 mAtkModifier += target.getShldDef();
2150 }
2151
2152 // Add Bonus for Sps/SS
2153 if (bss)
2154 {
2155 ssModifier = 4;
2156 }
2157 else if (sps)
2158 {
2159 ssModifier = 2;
2160 }
2161 else
2162 {
2163 ssModifier = 1;
2164 }
2165
2166 mAtkModifier = (14 * Math.sqrt(ssModifier * attacker.getMAtk(target, skill))) / mAtkModifier;
2167
2168 rate = (int) (rate * mAtkModifier);
2169 }
2170
2171 // Resists
2172 double vulnModifier = calcSkillVulnerability(attacker, target, skill);
2173 double profModifier = calcSkillProficiency(skill, attacker, target);
2174 double res = vulnModifier + profModifier;
2175 double resMod = 1;
2176 if (res != 0)
2177 {
2178 if (res < 0)
2179 {
2180 resMod = 1 - (0.075 * res);
2181 resMod = 1 / resMod;
2182 }
2183 else
2184 {
2185 resMod = 1 + (0.02 * res);
2186 }
2187
2188 rate *= resMod;
2189 }
2190
2191 int elementModifier = calcElementModifier(attacker, target, skill);
2192 rate += elementModifier;
2193
2194 // lvl modifier.
2195 int deltamod = calcLvlDependModifier(attacker, target, skill);
2196 rate += deltamod;
2197
2198 if (rate > skill.getMaxChance())
2199 {
2200 rate = skill.getMaxChance();
2201 }
2202 else if (rate < skill.getMinChance())
2203 {
2204 rate = skill.getMinChance();
2205 }
2206
2207 if (attacker.isDebug() || Config.DEVELOPER)
2208 {
2209 final StringBuilder stat = new StringBuilder(100);
2210 StringUtil.append(stat, skill.getName(), " type:", skill.getSkillType().toString(), " power:", String.valueOf(value), " stat:", String.format("%1.2f", statModifier), " res:", String.format("%1.2f", resMod), "(", String.format("%1.2f", profModifier), "/", String.format("%1.2f", vulnModifier), ") elem:", String.valueOf(elementModifier), " mAtk:", String.format("%1.2f", mAtkModifier), " ss:", String.valueOf(ssModifier), " lvl:", String.valueOf(deltamod), " total:", String.valueOf(rate));
2211 final String result = stat.toString();
2212 if (attacker.isDebug())
2213 {
2214 attacker.sendDebugMessage(result);
2215 }
2216 if (Config.DEVELOPER)
2217 {
2218 _log.info(result);
2219 }
2220 }
2221 return (Rnd.get(100) < rate);
2222 }
следим за rate
C# разработчики ваще лютая армия. Сейчас допишу коммент и пойду писать на C# для iOS
Сообщений: 5,863
Тем: 105
Зарегистрирован: Sep 2010
Репутация:
13,014
Sp1tfire, в l2j формулы неправильные.
2автор: смотрите оверов, там формулы значительно более правильны, чем на фениксах. Дам вам размышление: насколько я помню та же аркана протекшен не учитывается при расчете шанса, хотя она влияет. Можете потестить на птс гф.
Сообщений: 151
Тем: 5
Зарегистрирован: Jun 2011
Репутация:
347
Zubastic Написал:Sp1tfire, в l2j формулы неправильные.
2автор: смотрите оверов, там формулы значительно более правильны, чем на фениксах. Дам вам размышление: насколько я помню та же аркана протекшен не учитывается при расчете шанса, хотя она влияет. Можете потестить на птс гф.
Код: double vulnModifier = calcSkillVulnerability(attacker, target, skill);
calcSkillVuln
Код: public static double calcSkillVulnerability(L2Character attacker, L2Character target, L2Skill skill)
1729 {
1730 double multiplier = 0; // initialize...
1731
1732 // Get the skill type to calculate its effect in function of base stats
1733 // of the L2Character target
1734 if (skill != null)
1735 {
1736 // first, get the natural template vulnerability values for the target
1737 Stats stat = skill.getStat();
1738 if (stat != null)
1739 {
1740 switch (stat)
1741 {
1742 case AGGRESSION:
1743 multiplier = target.getTemplate().getBaseAggressionVuln();
1744 break;
1745 case BLEED:
1746 multiplier = target.getTemplate().getBaseBleedVuln();
1747 break;
1748 case POISON:
1749 multiplier = target.getTemplate().getBasePoisonVuln();
1750 break;
1751 case STUN:
1752 multiplier = target.getTemplate().getBaseStunVuln();
1753 break;
1754 case ROOT:
1755 multiplier = target.getTemplate().getBaseRootVuln();
1756 break;
1757 case MOVEMENT:
1758 multiplier = target.getTemplate().getBaseMovementVuln();
1759 break;
1760 case SLEEP:
1761 multiplier = target.getTemplate().getBaseSleepVuln();
1762 break;
1763 }
1764 }
1765
1766 // Finally, calculate skilltype vulnerabilities
1767 multiplier = [U]calcSkillTraitVulnerability[/U](multiplier, target, skill);
1768 }
1769 return multiplier;
1770 }
calcSkillTraitVuln
Код: public static double calcSkillTraitVulnerability(double multiplier, L2Character target, L2Skill skill)
1773 {
1774 if (skill == null)
1775 {
1776 return multiplier;
1777 }
1778
1779 final L2TraitType trait = skill.getTraitType();
1780 // First check if skill have trait set
1781 // If yes, use correct vuln
1782 if ((trait != null) && (trait != L2TraitType.NONE))
1783 {
1784 switch (trait)
1785 {
1786 case BLEED:
1787 multiplier = target.calcStat(Stats.BLEED_VULN, multiplier, target, null);
1788 break;
1789 case BOSS:
1790 multiplier = target.calcStat(Stats.BOSS_VULN, multiplier, target, null);
1791 break;
1792 // case DEATH:
1793 case DERANGEMENT:
1794 multiplier = target.calcStat(Stats.DERANGEMENT_VULN, multiplier, target, null);
1795 break;
1796 // case ETC:
1797 case GUST:
1798 multiplier = target.calcStat(Stats.GUST_VULN, multiplier, target, null);
1799 break;
1800 case HOLD:
1801 multiplier = target.calcStat(Stats.ROOT_VULN, multiplier, target, null);
1802 break;
1803 case PARALYZE:
1804 multiplier = target.calcStat(Stats.PARALYZE_VULN, multiplier, target, null);
1805 break;
1806 case PHYSICAL_BLOCKADE:
1807 multiplier = target.calcStat(Stats.PHYSICALBLOCKADE_VULN, multiplier, target, null);
1808 break;
1809 case POISON:
1810 multiplier = target.calcStat(Stats.POISON_VULN, multiplier, target, null);
1811 break;
1812 case SHOCK:
1813 multiplier = target.calcStat(Stats.STUN_VULN, multiplier, target, null);
1814 break;
1815 case SLEEP:
1816 multiplier = target.calcStat(Stats.SLEEP_VULN, multiplier, target, null);
1817 break;
1818 case VALAKAS:
1819 multiplier = target.calcStat(Stats.VALAKAS_VULN, multiplier, target, null);
1820 break;
1821 }
1822 }
1823 else
1824 {
1825 // Since not all traits are handled by trait parameter
1826 // rest is checked by skillType or isDebuff Boolean.
1827 final L2SkillType type = skill.getSkillType();
1828 if (type == L2SkillType.BUFF)
1829 {
1830 multiplier = target.calcStat(Stats.BUFF_VULN, multiplier, target, null);
1831 }
1832 else if ((type == L2SkillType.DEBUFF) || (skill.isDebuff()))
1833 {
1834 multiplier = target.calcStat(Stats.DEBUFF_VULN, multiplier, target, null);
1835 }
1836 else if (type == L2SkillType.STEAL_BUFF)
1837 {
1838 multiplier = target.calcStat(Stats.CANCEL_VULN, multiplier, target, null);
1839 }
1840 }
1841 return multiplier;
1842 }
в случае дизарма, arcane protection даст немного резиста
C# разработчики ваще лютая армия. Сейчас допишу коммент и пойду писать на C# для iOS
|