Сообщений: 115
Тем: 25
Зарегистрирован: Jun 2011
Репутация:
157
Добрый день ув.ЗГшники)
В общем столкнулся с этим:
При статусе нубла у нас ведь идет +4% dmg,
но в формулах я почему-то не могу это найти
пс. сурсы Rebellion(Region)
Куда смотреть или где найти? Буду благодарен за помощь
Сообщений: 278
Тем: 38
Зарегистрирован: Dec 2013
Репутация:
478
Когда игрок получает статус нюбла, эму идет бонус + 4% ?:
Если я правильно понял, смотри нюбл скилы все + проверь доп скилы у рангов.
Сообщений: 115
Тем: 25
Зарегистрирован: Jun 2011
Репутация:
157
nn03 Написал:Когда игрок получает статус нюбла, эму идет бонус + 4% ?:
Если я правильно понял, смотри нюбл скилы все + проверь доп скилы у рангов.
Вот как раз не в скилах это...
В сурсах L2EmuEnt,это находится банально в Formulas.java
Но в Rebellion(Region),это или отсутствует или заныкано,а куда я не знаю
Сообщений: 1,058
Тем: 129
Зарегистрирован: May 2009
Репутация:
11,626
Masone Написал:Вот как раз не в скилах это...
В сурсах L2EmuEnt,это находится банально в Formulas.java
Но в Rebellion(Region),это или отсутствует или заныкано,а куда я не знаю
В формулах нужно ввести проверку на нубла и соотвественно прибавить урон в нашем случае 4%.
Можно сделать и через отдельный стат, но как никрути, все равно - это будет в формулах.
методы calcPhysDam() / calcMagicDam/ calcBlowDam/ calcChargeSkillDam
if(attacker.isNoble())
damage *= 1.04;
Сообщений: 115
Тем: 25
Зарегистрирован: Jun 2011
Репутация:
157
finfan Написал:В формулах нужно ввести проверку на нубла и соотвественно прибавить урон в нашем случае 4%.
Можно сделать и через отдельный стат, но как никрути, все равно - это будет в формулах.
методы calcPhysDam() / calcMagicDam/ calcBlowDam/ calcChargeSkillDam
if(attacker.isNoble())
damage *= 1.04;
Правильно вроде? Нету возможности проверить в 2 окна
смотреть
Код: public static AttackInfo calcPhysDam(Creature attacker, Creature target,Player player, Skill skill, boolean dual, boolean blow, boolean ss, boolean onCrit)
{
target.doCounterAttack(skill, attacker);
AttackInfo info = new AttackInfo();
info.damage = attacker.getPAtk(target);
info.defence = target.getPDef(attacker);
info.crit_rcpt = 0.01 * target.calcStat(Stats.CRIT_DAMAGE_RECEPTIVE, attacker, skill);
info.crit_static = attacker.calcStat(Stats.CRITICAL_DAMAGE_STATIC, target, skill);
info.death_rcpt = 0.01 * target.calcStat(Stats.DEATH_RECEPTIVE, attacker, skill);
info.lethal1 = skill == null ? 0 : skill.getLethal1() * info.death_rcpt;
info.lethal2 = skill == null ? 0 : skill.getLethal2() * info.death_rcpt;
info.crit = Rnd.chance(calcCrit(attacker, target, skill, blow));
info.shld = ((skill == null) || !skill.getShieldIgnore()) && Formulas.calcShldUse(attacker, target);
info.lethal = false;
info.miss = false;
double nonBlowLethalDam = 0;
if (info.shld)
{
info.defence += target.getShldDef();
}
info.defence = Math.max(info.defence, 1);
if (skill != null)
{
if (!blow && !target.isLethalImmune())
{
// скиллов
if (Rnd.chance(info.lethal1))
{
if (target.isPlayer())
{
nonBlowLethalDam = target.getCurrentCp();
info.lethal = true;
}
else
{
nonBlowLethalDam = target.getCurrentHp() / 2;
}
attacker.sendPacket(Msg.LETHAL_STRIKE);
}
else if (Rnd.chance(info.lethal2))
{
if (target.isPlayer())
{
nonBlowLethalDam = (target.getCurrentHp() + target.getCurrentCp()) - 1;
target.sendPacket(Msg.LETHAL_STRIKE);
info.lethal = true;
}
else
{
nonBlowLethalDam = target.getCurrentHp() - 1;
}
attacker.sendPacket(Msg.YOUR_LETHAL_STRIKE_WAS_SUCCESSFUL);
}
}
if (skill.getPower() == 0)
{
info.damage = nonBlowLethalDam; // если скилл не имеет своей
// силы дальше идти бесполезно,
// можно сразу вернуть дамаг от
// летала
if (nonBlowLethalDam > 0)
{
attacker.sendPacket(new SystemMessage(SystemMessage.YOU_HIT_FOR_S1_DAMAGE).addNumber((int) info.damage));
}
return info;
}
if (blow && !skill.isBehind() && ss)
{
// на power
info.damage *= 2.04;
}
info.damage += Math.max(0., skill.getPower());
if (blow && skill.isBehind() && ss)
{
// но меньше множитель
info.damage *= 1.5;
}
info.damage *= 1 + (((Rnd.get() * attacker.getRandomDamage() * 2) - attacker.getRandomDamage()) / 100);
if (blow)
{
info.damage *= info.crit_rcpt;
info.damage *= 0.01 * attacker.calcStat(Stats.CRITICAL_DAMAGE, target, skill);
info.damage += 6.1 * info.crit_static;
}
if (skill.isChargeBoost())
{
info.damage *= 0.8 + (0.2 * attacker.getIncreasedForce());
}
if (skill.getSkillType() == SkillType.CHARGE)
{
info.damage *= 2;
}
if (info.crit)
{
info.damage = 2.0 * info.crit_rcpt * info.damage;
}
}
else
{
info.damage *= 1 + (((Rnd.get() * attacker.getRandomDamage() * 2) - attacker.getRandomDamage()) / 100);
if (dual)
{
info.damage /= 2.;
}
if (info.crit)
{
info.damage *= 2.0 * info.crit_rcpt;
info.damage *= 0.01 * attacker.calcStat(Stats.CRITICAL_DAMAGE, target, skill);
info.damage += info.crit_static;
}
}
switch (attacker.getDirectionTo(target, true))
{
case BEHIND:
info.damage *= 1.2;
break;
case SIDE:
info.damage *= 1.1;
break;
default:
break;
}
if (ss)
{
info.damage *= blow ? 1.0 : 2.0;
}
info.damage *= 70. / info.defence;
info.damage = attacker.calcStat(Stats.PHYSICAL_DAMAGE, info.damage, target, skill);
// In C5 summons make 10 % less dmg in PvP.
if (attacker.isSummon() && target.isPlayer())
{
info.damage *= 0.9;
}
/**
* Спасибка finfan 040714
* методы calcPhysDam() / calcMagicDam/ calcBlowDam/ calcChargeSkillDam
*/
if (player.isNoble())
{
info.damage *= 1.04;
}
if (info.shld && Rnd.chance(5))
{
info.damage = 1;
}
info.damage += nonBlowLethalDam; // леталы не от даггер скиллов
// добавляются после защиты
// Тут проверяем только если skill != null, т.к. L2Character.onHitTimer
// не обсчитывает дамаг.
if (skill != null)
{
if (info.shld)
{
if (info.damage == 1)
{
target.sendPacket(Msg.YOUR_EXCELLENT_SHIELD_DEFENSE_WAS_A_SUCCESS);
}
else
{
target.sendPacket(Msg.SHIELD_DEFENSE_HAS_SUCCEEDED);
}
}
// Уворот от физ скилов уводит атаку в 0
if (Rnd.chance(target.calcStat(Stats.PSKILL_EVASION, 0, attacker, skill)))
{
attacker.sendPacket(new SystemMessage(SystemMessage.MISSED_TARGET).addName(attacker));
target.sendPacket(new SystemMessage(SystemMessage.AVOIDED_S1S_ATTACK).addName(target).addName(attacker));
info.damage = 0;
}
if ((info.damage > 1) && skill.isDeathlink())
{
info.damage *= 1.8 * (1.0 - attacker.getCurrentHpRatio());
}
if (onCrit && !calcBlow(attacker, target, skill))
{
// типо промазали
info.miss = true;
info.damage = 0;
attacker.sendPacket(new SystemMessage(SystemMessage.MISSED_TARGET).addName(attacker));
}
if (blow)
{
if (Rnd.chance(info.lethal1))
{
if (target.isPlayer())
{
info.damage = Math.max(info.damage, target.getCurrentCp());
info.lethal = true;
}
else if (target.isLethalImmune())
{
info.damage *= 2;
}
else
{
info.damage = Math.max(info.damage, target.getCurrentHp() / 2);
}
attacker.sendPacket(Msg.LETHAL_STRIKE);
}
else if (Rnd.chance(info.lethal2))
{
if (target.isPlayer())
{
info.damage = Math.max(info.damage, (target.getCurrentHp() + target.getCurrentCp()) - 1);
target.sendPacket(Msg.LETHAL_STRIKE);
info.lethal = true;
}
else if (target.isLethalImmune())
{
info.damage *= 3;
}
else
{
info.damage = Math.max(info.damage, target.getCurrentHp() - 1);
}
attacker.sendPacket(Msg.YOUR_LETHAL_STRIKE_WAS_SUCCESSFUL);
}
}
if (info.damage > 0)
{
if (attacker instanceof Summon)
{
((Summon) attacker).displayHitMessage((int) info.damage, info.crit || blow, false);
}
else if (attacker.isPlayer())
{
if (info.crit || blow)
{
attacker.sendPacket(Msg.CRITICAL_HIT);
}
attacker.sendPacket(new SystemMessage(SystemMessage.YOU_HIT_FOR_S1_DAMAGE).addNumber((int) info.damage));
}
}
if (target.isStunned() && calcStunBreak(info.crit))
{
target.getEffectList().stopEffects(EffectType.Stun);
target.getEffectList().stopEffects(EffectType.Turner);
}
if (calcCastBreak(target, info.crit))
{
target.abortCast(false, false);
}
}
info.damage = Math.max(1., info.damage);
return info;
}
Сообщений: 1,058
Тем: 129
Зарегистрирован: May 2009
Репутация:
11,626
Masone Написал:Правильно вроде? Нету возможности проверить в 2 окна 
смотреть
Код: public static AttackInfo calcPhysDam(Creature attacker, Creature target,Player player, Skill skill, boolean dual, boolean blow, boolean ss, boolean onCrit)
{
target.doCounterAttack(skill, attacker);
AttackInfo info = new AttackInfo();
info.damage = attacker.getPAtk(target);
info.defence = target.getPDef(attacker);
info.crit_rcpt = 0.01 * target.calcStat(Stats.CRIT_DAMAGE_RECEPTIVE, attacker, skill);
info.crit_static = attacker.calcStat(Stats.CRITICAL_DAMAGE_STATIC, target, skill);
info.death_rcpt = 0.01 * target.calcStat(Stats.DEATH_RECEPTIVE, attacker, skill);
info.lethal1 = skill == null ? 0 : skill.getLethal1() * info.death_rcpt;
info.lethal2 = skill == null ? 0 : skill.getLethal2() * info.death_rcpt;
info.crit = Rnd.chance(calcCrit(attacker, target, skill, blow));
info.shld = ((skill == null) || !skill.getShieldIgnore()) && Formulas.calcShldUse(attacker, target);
info.lethal = false;
info.miss = false;
double nonBlowLethalDam = 0;
if (info.shld)
{
info.defence += target.getShldDef();
}
info.defence = Math.max(info.defence, 1);
if (skill != null)
{
if (!blow && !target.isLethalImmune())
{
// скиллов
if (Rnd.chance(info.lethal1))
{
if (target.isPlayer())
{
nonBlowLethalDam = target.getCurrentCp();
info.lethal = true;
}
else
{
nonBlowLethalDam = target.getCurrentHp() / 2;
}
attacker.sendPacket(Msg.LETHAL_STRIKE);
}
else if (Rnd.chance(info.lethal2))
{
if (target.isPlayer())
{
nonBlowLethalDam = (target.getCurrentHp() + target.getCurrentCp()) - 1;
target.sendPacket(Msg.LETHAL_STRIKE);
info.lethal = true;
}
else
{
nonBlowLethalDam = target.getCurrentHp() - 1;
}
attacker.sendPacket(Msg.YOUR_LETHAL_STRIKE_WAS_SUCCESSFUL);
}
}
if (skill.getPower() == 0)
{
info.damage = nonBlowLethalDam; // если скилл не имеет своей
// силы дальше идти бесполезно,
// можно сразу вернуть дамаг от
// летала
if (nonBlowLethalDam > 0)
{
attacker.sendPacket(new SystemMessage(SystemMessage.YOU_HIT_FOR_S1_DAMAGE).addNumber((int) info.damage));
}
return info;
}
if (blow && !skill.isBehind() && ss)
{
// на power
info.damage *= 2.04;
}
info.damage += Math.max(0., skill.getPower());
if (blow && skill.isBehind() && ss)
{
// но меньше множитель
info.damage *= 1.5;
}
info.damage *= 1 + (((Rnd.get() * attacker.getRandomDamage() * 2) - attacker.getRandomDamage()) / 100);
if (blow)
{
info.damage *= info.crit_rcpt;
info.damage *= 0.01 * attacker.calcStat(Stats.CRITICAL_DAMAGE, target, skill);
info.damage += 6.1 * info.crit_static;
}
if (skill.isChargeBoost())
{
info.damage *= 0.8 + (0.2 * attacker.getIncreasedForce());
}
if (skill.getSkillType() == SkillType.CHARGE)
{
info.damage *= 2;
}
if (info.crit)
{
info.damage = 2.0 * info.crit_rcpt * info.damage;
}
}
else
{
info.damage *= 1 + (((Rnd.get() * attacker.getRandomDamage() * 2) - attacker.getRandomDamage()) / 100);
if (dual)
{
info.damage /= 2.;
}
if (info.crit)
{
info.damage *= 2.0 * info.crit_rcpt;
info.damage *= 0.01 * attacker.calcStat(Stats.CRITICAL_DAMAGE, target, skill);
info.damage += info.crit_static;
}
}
switch (attacker.getDirectionTo(target, true))
{
case BEHIND:
info.damage *= 1.2;
break;
case SIDE:
info.damage *= 1.1;
break;
default:
break;
}
if (ss)
{
info.damage *= blow ? 1.0 : 2.0;
}
info.damage *= 70. / info.defence;
info.damage = attacker.calcStat(Stats.PHYSICAL_DAMAGE, info.damage, target, skill);
// In C5 summons make 10 % less dmg in PvP.
if (attacker.isSummon() && target.isPlayer())
{
info.damage *= 0.9;
}
/**
* Спасибка finfan 040714
* методы calcPhysDam() / calcMagicDam/ calcBlowDam/ calcChargeSkillDam
*/
if (player.isNoble())
{
info.damage *= 1.04;
}
if (info.shld && Rnd.chance(5))
{
info.damage = 1;
}
info.damage += nonBlowLethalDam; // леталы не от даггер скиллов
// добавляются после защиты
// Тут проверяем только если skill != null, т.к. L2Character.onHitTimer
// не обсчитывает дамаг.
if (skill != null)
{
if (info.shld)
{
if (info.damage == 1)
{
target.sendPacket(Msg.YOUR_EXCELLENT_SHIELD_DEFENSE_WAS_A_SUCCESS);
}
else
{
target.sendPacket(Msg.SHIELD_DEFENSE_HAS_SUCCEEDED);
}
}
// Уворот от физ скилов уводит атаку в 0
if (Rnd.chance(target.calcStat(Stats.PSKILL_EVASION, 0, attacker, skill)))
{
attacker.sendPacket(new SystemMessage(SystemMessage.MISSED_TARGET).addName(attacker));
target.sendPacket(new SystemMessage(SystemMessage.AVOIDED_S1S_ATTACK).addName(target).addName(attacker));
info.damage = 0;
}
if ((info.damage > 1) && skill.isDeathlink())
{
info.damage *= 1.8 * (1.0 - attacker.getCurrentHpRatio());
}
if (onCrit && !calcBlow(attacker, target, skill))
{
// типо промазали
info.miss = true;
info.damage = 0;
attacker.sendPacket(new SystemMessage(SystemMessage.MISSED_TARGET).addName(attacker));
}
if (blow)
{
if (Rnd.chance(info.lethal1))
{
if (target.isPlayer())
{
info.damage = Math.max(info.damage, target.getCurrentCp());
info.lethal = true;
}
else if (target.isLethalImmune())
{
info.damage *= 2;
}
else
{
info.damage = Math.max(info.damage, target.getCurrentHp() / 2);
}
attacker.sendPacket(Msg.LETHAL_STRIKE);
}
else if (Rnd.chance(info.lethal2))
{
if (target.isPlayer())
{
info.damage = Math.max(info.damage, (target.getCurrentHp() + target.getCurrentCp()) - 1);
target.sendPacket(Msg.LETHAL_STRIKE);
info.lethal = true;
}
else if (target.isLethalImmune())
{
info.damage *= 3;
}
else
{
info.damage = Math.max(info.damage, target.getCurrentHp() - 1);
}
attacker.sendPacket(Msg.YOUR_LETHAL_STRIKE_WAS_SUCCESSFUL);
}
}
if (info.damage > 0)
{
if (attacker instanceof Summon)
{
((Summon) attacker).displayHitMessage((int) info.damage, info.crit || blow, false);
}
else if (attacker.isPlayer())
{
if (info.crit || blow)
{
attacker.sendPacket(Msg.CRITICAL_HIT);
}
attacker.sendPacket(new SystemMessage(SystemMessage.YOU_HIT_FOR_S1_DAMAGE).addNumber((int) info.damage));
}
}
if (target.isStunned() && calcStunBreak(info.crit))
{
target.getEffectList().stopEffects(EffectType.Stun);
target.getEffectList().stopEffects(EffectType.Turner);
}
if (calcCastBreak(target, info.crit))
{
target.abortCast(false, false);
}
}
info.damage = Math.max(1., info.damage);
return info;
}
Чтобы удостовериться в правильности, 2-ое окно не пригодится.
Прологируйте дейстия внутри условия самый простой способ:
в вашем случае нужно будет узнать как называется переменная логирования (у меня написанно _log) в ребелионах может быть по человечески log и т.д.
if(attacker.isNoble())
{
double bonusedam = 1.04;
_log.info("bonus damage: " + bonusdamage);
damage *= bonusedam;
}
в гейм сервер окне высветится bonus damage: 1.04; если всё нормально и бонус учитывается.
Разумеется когда убедитесь что все нормально, просто верните damage *= 1.04;
P.s прост опример. В иных случаях без логирвоания поставьте damage*= 10;
и убедитесь при нанесении урона
Сообщений: 115
Тем: 25
Зарегистрирован: Jun 2011
Репутация:
157
Это ведь уже не идет как бонус в пвп? А будет считать просто как доп бонус дмг?
Сообщений: 1,058
Тем: 129
Зарегистрирован: May 2009
Репутация:
11,626
Masone Написал:Это ведь уже не идет как бонус в пвп? А будет считать просто как доп бонус дмг?
Верно, но в вопросе: При статусе нубла у нас ведь идет +4% dmg,
Я не вижу ничего о PvP  .
Если надо пвп то у вас там должно быть условие
[SRC="java"]if(isPvP)
{
//код...
if(attacker.isNoble())
damage *= 1.04;
}[/SRC]
Сообщений: 115
Тем: 25
Зарегистрирован: Jun 2011
Репутация:
157
finfan Написал:Верно, но в вопросе: При статусе нубла у нас ведь идет +4% dmg,
Я не вижу ничего о PvP .
Если надо пвп то у вас там должно быть условие
[SRC="java"]if(isPvP)
{
//код...
if(attacker.isNoble())
damage *= 1.04;
}[/SRC]
Можно ваши контакты?
Сообщений: 1,065
Тем: 20
Зарегистрирован: Mar 2010
Репутация:
3,855
Впервые слышу о таком бонусе от статуса нобла оО
|