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

Формула Расчёта Крит Урона

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

Всем добра, счастья и удачи ^^

 

Я пришел к вам опять со следующим вопросом - правильная ли формула в L2SkillChargeDmg где описано так "Если крит - умножаем урон на 2"?

 

Кто то может дать более точный расчёт крит урона?

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


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

Lucera 1.7

 

 

public void useSkill(L2Character activeChar, L2Character... targets)
{
if (activeChar.isAlikeDead() || !(activeChar instanceof L2PcInstance))
return;

L2PcInstance player = (L2PcInstance) activeChar;

double modifier = 0.8 + 0.201 * player.getCharges(); // thanks Diego Vargas of L2Guru: 70*((0.8+0.201*No.Charges) * (PATK+POWER)) / PDEF
if (getConsumeCharges())
player.decreaseCharges(getNeededCharges());

for (L2Character target : targets)
{
L2ItemInstance weapon = activeChar.getActiveWeaponInstance();
if (target.isAlikeDead())
continue;

byte shld = Formulas.calcShldUse(activeChar, target);
boolean crit = false;
if (getBaseCritRate() > 0)
crit = Formulas.calcCrit(getBaseCritRate() * 10 * Formulas.getSTRBonus(activeChar));

boolean soul = (weapon != null && weapon.getChargedSoulshot() == L2ItemInstance.CHARGED_SOULSHOT && weapon.getItemType() != L2WeaponType.DAGGER);

// damage calculation, crit is static 2x
int damage = (int) Formulas.calcPhysDam(activeChar, target, this, shld, false, false, soul);
if (crit)
damage *= 2;

boolean skillIsEvaded = Formulas.calcPhysicalSkillEvasion(target, this);
if (skillIsEvaded)
{
if (activeChar instanceof L2PcInstance)
{
SystemMessage sm = new SystemMessage(SystemMessageId.S1_DODGES_ATTACK);
sm.addCharName(target);
activeChar.sendPacket(sm);
}
if (target instanceof L2PcInstance)
{
SystemMessage sm = new SystemMessage(SystemMessageId.AVOIDED_S1_ATTACK);
sm.addCharName(activeChar);
target.sendPacket(sm);
}
}
else if (damage > 0)
{
double finalDamage = damage * modifier;
target.reduceCurrentHp(finalDamage, activeChar, this);

activeChar.sendDamageMessage(target, (int) finalDamage, false, crit, false);

if ((Formulas.calcSkillReflect(target, this) & Formulas.SKILL_REFLECT_VENGEANCE) != 0)
activeChar.reduceCurrentHp(damage, target, this);

if (soul && weapon != null)
weapon.setChargedSoulshot(L2ItemInstance.CHARGED_NONE,true);
}
else
activeChar.sendDamageMessage(target, 0, false, false, true);
} // effect self :]
L2Effect seffect = activeChar.getFirstEffect(getId());
if (seffect != null && seffect.isSelfEffect())
//Replace old effect with new one.
seffect.exit();
// cast self effect if any
getEffectsSelf(activeChar);
} 

 

aCis last rev

 

@Override
public void useSkill(L2Character caster, L2Object[] targets)
{
if (caster.isAlikeDead())
return;

double modifier = 0;

if (caster instanceof L2PcInstance)
modifier = 0.7 + 0.3 * ((L2PcInstance) caster).getCharges();

final boolean ss = caster.isChargedShot(ShotType.SOULSHOT);

for (L2Object obj : targets)
{
if (!(obj instanceof L2Character))
continue;

final L2Character target = ((L2Character) obj);
if (target.isAlikeDead())
continue;

// Calculate skill evasion
boolean skillIsEvaded = Formulas.calcPhysicalSkillEvasion(target, this);
if (skillIsEvaded)
{
if (caster instanceof L2PcInstance)
((L2PcInstance) caster).sendPacket(SystemMessage.getSystemMessage(SystemMessageId.S1_DODGES_ATTACK).addCharName(target));

if (target instanceof L2PcInstance)
((L2PcInstance) target).sendPacket(SystemMessage.getSystemMessage(SystemMessageId.AVOIDED_S1_ATTACK).addCharName(caster));

// no futher calculations needed.
continue;
}

byte shld = Formulas.calcShldUse(caster, target, this);
boolean crit = false;

if (getBaseCritRate() > 0)
crit = Formulas.calcCrit(getBaseCritRate() * 10 * Formulas.getSTRBonus(caster));

// damage calculation, crit is static 2x
double damage = Formulas.calcChargeSkillsDam(caster, target, this, shld, false, false, ss);
if (crit)
damage *= 2;

if (damage > 0)
{
byte reflect = Formulas.calcSkillReflect(target, this);
if (hasEffects())
{
if ((reflect & Formulas.SKILL_REFLECT_SUCCEED) != 0)
{
caster.stopSkillEffects(getId());
getEffects(target, caster);
SystemMessage sm = SystemMessage.getSystemMessage(SystemMessageId.YOU_FEEL_S1_EFFECT);
sm.addSkillName(this);
caster.sendPacket(sm);
}
else
{
// activate attacked effects, if any
target.stopSkillEffects(getId());
if (Formulas.calcSkillSuccess(caster, target, this, shld, false, false, true))
{
getEffects(caster, target, new Env(shld, false, false, false));

SystemMessage sm = SystemMessage.getSystemMessage(SystemMessageId.YOU_FEEL_S1_EFFECT);
sm.addSkillName(this);
target.sendPacket(sm);
}
else
{
SystemMessage sm = SystemMessage.getSystemMessage(SystemMessageId.S1_RESISTED_YOUR_S2);
sm.addCharName(target);
sm.addSkillName(this);
caster.sendPacket(sm);
}
}
}

double finalDamage = damage * modifier;
target.reduceCurrentHp(finalDamage, caster, this);

// vengeance reflected damage
if ((reflect & Formulas.SKILL_REFLECT_VENGEANCE) != 0)
caster.reduceCurrentHp(damage, target, this);

caster.sendDamageMessage(target, (int) finalDamage, false, crit, false);
}
else
caster.sendDamageMessage(target, 0, false, false, true);
}

if (hasSelfEffects())
{
final L2Effect effect = caster.getFirstEffect(getId());
if (effect != null && effect.isSelfEffect())
effect.exit();

getEffectsSelf(caster);
}

caster.setChargedShot(ShotType.SOULSHOT, isStaticReuse());
}

 

Silentium

 

 

 @Override
public void useSkill(L2Character caster, L2Object[] targets)
{
if (caster.isAlikeDead())
{
return;
}

double modifier = 0;

if (caster instanceof L2PcInstance)
{
modifier = 0.7 + (0.3 * ((L2PcInstance) caster).getCharges());
}

final boolean soul = caster.isSoulshotCharged(this);

for (L2Object obj : targets)
{
if (!(obj instanceof L2Character))
{
continue;
}

final L2Character target = ((L2Character) obj);
if (target.isAlikeDead())
{
continue;
}

// Calculate skill evasion
boolean skillIsEvaded = Formulas.calcPhysicalSkillEvasion(target, this);
if (skillIsEvaded)
{
SystemMessage sm;

if (caster instanceof L2PcInstance)
{
sm = SystemMessage.getSystemMessage(SystemMessageId.S1_DODGES_ATTACK).addCharName(target);
((L2PcInstance) caster).sendPacket(sm);
}
if (target instanceof L2PcInstance)
{
sm = SystemMessage.getSystemMessage(SystemMessageId.AVOIDED_S1_ATTACK).addCharName(caster);
((L2PcInstance) target).sendPacket(sm);
}

// no futher calculations needed.
continue;
}

byte shld = Formulas.calcShldUse(caster, target, this);
boolean crit = false;

if (getBaseCritRate() > 0)
{
crit = Formulas.calcCrit(getBaseCritRate() * 10 * Formulas.getSTRBonus(caster));
}

// damage calculation, crit is static 2x
double damage = Formulas.calcChargeSkillsDam(caster, target, this, shld, false, false, soul);
if (crit)
{
damage *= 2;
}

if (damage > 0)
{
byte reflect = Formulas.calcSkillReflect(target, this);
if (hasEffects())
{
if ((reflect & Formulas.SKILL_REFLECT_SUCCEED) != 0)
{
caster.stopSkillEffects(getId());
getEffects(target, caster);
SystemMessage sm = SystemMessage.getSystemMessage(SystemMessageId.YOU_FEEL_S1_EFFECT);
sm.addSkillName(this);
caster.sendPacket(sm);
}
else
{
// activate attacked effects, if any
target.stopSkillEffects(getId());
if (Formulas.calcSkillSuccess(caster, target, this, shld, false, false, true))
{
getEffects(caster, target, new Env(shld, false, false, false));

SystemMessage sm = SystemMessage.getSystemMessage(SystemMessageId.YOU_FEEL_S1_EFFECT);
sm.addSkillName(this);
target.sendPacket(sm);
}
else
{
SystemMessage sm = SystemMessage.getSystemMessage(SystemMessageId.S1_RESISTED_YOUR_S2);
sm.addCharName(target);
sm.addSkillName(this);
caster.sendPacket(sm);
}
}
}

double finalDamage = damage * modifier;
target.reduceCurrentHp(finalDamage, caster, this);

// vengeance reflected damage
if ((reflect & Formulas.SKILL_REFLECT_VENGEANCE) != 0)
{
caster.reduceCurrentHp(damage, target, this);
}

caster.sendDamageMessage(target, (int) finalDamage, false, crit, false);
}
else
{
caster.sendDamageMessage(target, 0, false, false, true);
}
}

if (hasSelfEffects())
{
final L2Effect effect = caster.getFirstEffect(getId());
if ((effect != null) && effect.isSelfEffect())
{
effect.exit();
}

getEffectsSelf(caster);
}

caster.ssUncharge(isStaticReuse());
}

 

 

 

В люцере более тщательно просчитываеться, в расчет идёт отражение скилов, возможность уклонения от них

А по поводу самого крита, всегда было х2

Изменено пользователем Shkaf

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


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

ещё такой вопрос по поводу фрозенов

у них я вижу какой то непонятный код в doCast (L2Character) который обновляет позицию при использовании скилла, вопрос - зачем?

// To turn local player in target direction
if(skill.isOffensive() && skill.getTargetType() != SkillTargetType.TARGET_AURA && target.isBehind(this))
{
moveToLocation(target.getX(), target.getY(), target.getZ(), 0);
stopMove(null);
}

 

Из за этого кода игроки могут телепортироваться в любое место используя скилл с таргет типом аура (если не установлена геодата).

Даже проверка которая стоит на таргет тип не помогает. Вопрос - сильное значение придаёт эта проверка, она же кроме того как обновлении позиции не за что не отвечает.

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


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

ещё такой вопрос по поводу фрозенов

у них я вижу какой то непонятный код в doCast (L2Character) который обновляет позицию при использовании скилла, вопрос - зачем?

// To turn local player in target direction
if(skill.isOffensive() && skill.getTargetType() != SkillTargetType.TARGET_AURA && target.isBehind(this))
{
moveToLocation(target.getX(), target.getY(), target.getZ(), 0);
stopMove(null);
}

 

Из за этого кода игроки могут телепортироваться в любое место используя скилл с таргет типом аура (если не установлена геодата).

Даже проверка которая стоит на таргет тип не помогает. Вопрос - сильное значение придаёт эта проверка, она же кроме того как обновлении позиции не за что не отвечает.

метод куда тп делать

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


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

эм, что?

короче поставлю вопрос другим образом - если убрать эту проверку то могут быть серьёзные последствия? Например даже в l2j нету её...

Изменено пользователем Mister Coder

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


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

ещё такой вопрос по поводу фрозенов

у них я вижу какой то непонятный код в doCast (L2Character) который обновляет позицию при использовании скилла, вопрос - зачем?

// To turn local player in target direction
if(skill.isOffensive() && skill.getTargetType() != SkillTargetType.TARGET_AURA && target.isBehind(this))
{
moveToLocation(target.getX(), target.getY(), target.getZ(), 0);
stopMove(null);
}

 

Из за этого кода игроки могут телепортироваться в любое место используя скилл с таргет типом аура (если не установлена геодата).

Даже проверка которая стоит на таргет тип не помогает. Вопрос - сильное значение придаёт эта проверка, она же кроме того как обновлении позиции не за что не отвечает.

Это часть кода для скила на Эпилоге или хз как там дальше называеться л2, когда ТХ юзает скил и оказывается позади таргета и бьёт в спину, думаю так

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


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

это интерлюд...

Я вкурсе что фрозен интерлюд

Но ты походу не вкурсе что у фрозен говнокод

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


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

вкурсе :(

Но до сих пор не понятно - за что эта проверка отвечает, что она делает тут вообще? Если перевести, то можно прикинуть что это якобы обновляет направление игрока после использования скилла.

Изменено пользователем Mister Coder

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


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

вкурсе :(

Кстати эта часть кода может отвечать за скилы НПЦ которые телепортируют к себе, например мобы в крума товер

Точно не имею понятия, не ковырялся во фрозен

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


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

транслейт комента: Поворачивать местного игрока в целевом направлении

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


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

У фрозенов вроде нормальный код, не жалуюсь.

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


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

У фрозенов вроде нормальный код, не жалуюсь.

Сравни самый банальный PcInstance с другими, убедишься сколько там лишнего говна создаёт нагрузку

И ключевое слово в твоем посте "ВРОДЕ"

Изменено пользователем Shkaf

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


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

У фрозенов вроде нормальный код, не жалуюсь.

Он никогда не был нормальным. :]

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


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

Удалил этот код, скиллы юз норм. Телепорта нет, других ошибок не заметил.

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


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

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

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

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

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

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

Войти

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

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

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

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

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