Перейти к содержанию
Авторизация  
BBMAXI

[manual] Добавление Функции Basemul Для Скиллов

Рекомендуемые сообщения

На некоторых ява сборках (в том числе и на L2JTeon) было замечено, что шанс критов при фулл баффе слишком завышен. Однако, все баффы в таблице скиллов прописаны правильно и по отдельности дают правильные статы. Однако, если делать 2 или более баффа на шанс крита, то эти баффы усиливают друг друга, чего быть не должно.

 

Немного теории, как должно быть:

Когда чар надевает на себя пушку, то значение крит рейта в этот момент (чар на селфах) является базовым. и все баффы должны увеличивать именно базовый шанс, а не общий.

 

Простой пример: пусть базовый шанс у нас 100. Есть 2 баффа: Фокус (+30% шанса) и сонг хантер (+100% шанса). Если в таблице скиллов стат прописан так:

 

<mul order="0x30" stat="rCrit" val="1.3"/> - фокус
<mul order="0x30" stat="rCrit" val="2"/> - хантер

 

То крит шанс рассчитается по формуле: 100*1,3*2 = 260

Однако должен увеличиваться только базовый шанс, а именно: 100 + 100*0,3 + 100 * 1 = 230

 

Как это исправить? В некоторых сборках для этого присутствует специальная функция basemul. Она как раз реализует эту функцию.

Для начала создаем ява файл, который будет реализовывать эту функцию, называем его FuncBaseMul.java, вписываем в него идущий ниже код и пихаем в папку ...\java\net\sf\l2j\gameserver\skills\funcs\

Текст класса

 

package net.sf.l2j.gameserver.skills.funcs;

import net.sf.l2j.gameserver.skills.Env;
import net.sf.l2j.gameserver.skills.Stats;



public class FuncBaseMul extends Func {
private final Lambda _lambda;
public FuncBaseMul(Stats pStat, int pOrder, Object owner, Lambda lambda) {
super(pStat, pOrder, owner);
_lambda = lambda;
}
@Override
public void calc(Env env)
{
if (cond == null || cond.test(env))
env.value += env.baseValue * _lambda.calc(env);
}
}

 

Далее, тут фигурирует новая переменная env.baseValue. Ее пока что у нас нет, значит переходим на каталог выше, открываем Env.java и добавляем после

 

public final class Env {

 

строчку

 

public double baseValue;

 

Теперь нам надо сказать ядру, что у него аж новая функция появилась. В той же папке открываем DocumentBase.java и ищем блок примерно такой

 

for (; n != null; n = n.getNextSibling())
{
if ("add".equalsIgnoreCase(n.getNodeName()))
attachFunc(n, template, "Add", condition);
else if ("sub".equalsIgnoreCase(n.getNodeName()))
attachFunc(n, template, "Sub", condition);
else if ("mul".equalsIgnoreCase(n.getNodeName()))
attachFunc(n, template, "Mul", condition);
else if ("div".equalsIgnoreCase(n.getNodeName()))
attachFunc(n, template, "Div", condition);
else if ("set".equalsIgnoreCase(n.getNodeName()))
attachFunc(n, template, "Set", condition);
else if ("enchant".equalsIgnoreCase(n.getNodeName()))
attachFunc(n, template, "Enchant", condition);
else if ("skill".equalsIgnoreCase(n.getNodeName()))
attachSkill(n, template, condition);
else if ("effect".equalsIgnoreCase(n.getNodeName()))
{
if (template instanceof EffectTemplate)
throw new RuntimeException("Nested effects");
attachEffect(n, template, condition);
}
}

 

По аналогии добавляем строчку

 

else if ("basemul".equalsIgnoreCase(n.getNodeName()))
attachFunc(n, template, "BaseMul", condition);

 

Сохраняем, закрываем. Остался пустяк - сказать ядру, чтобы он сохранял значение нашей новой переменной. Для этого лезем в g:\Sourse\trunk\L2JTeon\java\net\sf\l2j\gameserver \skills\Formulas.java, ищем строчку

 

static class FuncAtkCritical extends Func

 

Далее изменяем метод public void calc(Env env) в этом блоке на тот, что приведен ниже:

 

public void calc(Env env)
{
L2Character p = env.player;
if (p instanceof L2Summon)
env.value = 40;
else if (p instanceof L2PcInstance && p.getActiveWeaponInstance() == null)
env.value = 40;
else
{
env.value *= DEXbonus[p.getDEX()];
env.value *= 10;
if (env.value > Config.MAX_RCRIT)
env.value = Config.MAX_RCRIT;
}
env.baseValue = env.value; 
}

 

Сохраняем, закрываем. Можно компиллировать. Теперь, уже в таблице скиллов можно вместо mul писать basemul и тогда станет работать приведенная выше формула. Не забываем менять параметр value. Если изначально было 1,3, то теперь нам нужно ставить 0,3, так как мы не умножаем, а прибавляем.

Однако, basemul будет работать только с шансом критов. Для дополнительных нужд - меняйте файл Formulas.java по аналогии.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Для публикации сообщений создайте учётную запись или авторизуйтесь

Вы должны быть пользователем, чтобы оставить комментарий

Создать учетную запись

Зарегистрируйте новую учётную запись в нашем сообществе. Это очень просто!

Регистрация нового пользователя

Войти

Уже есть аккаунт? Войти в систему.

Войти
Авторизация  

  • Последние посетители   0 пользователей онлайн

    Ни одного зарегистрированного пользователя не просматривает данную страницу

×
×
  • Создать...