La2Bash 87 Опубликовано 3 мая, 2013 Всем добра, счастья и удачи ^^ Я пришел к вам опять со следующим вопросом - правильная ли формула в L2SkillChargeDmg где описано так "Если крит - умножаем урон на 2"? Кто то может дать более точный расчёт крит урона? Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты
Shkaf 26 Опубликовано 3 мая, 2013 (изменено) 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 Изменено 3 мая, 2013 пользователем Shkaf Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты
La2Bash 87 Опубликовано 3 мая, 2013 ещё такой вопрос по поводу фрозенов у них я вижу какой то непонятный код в 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); } Из за этого кода игроки могут телепортироваться в любое место используя скилл с таргет типом аура (если не установлена геодата). Даже проверка которая стоит на таргет тип не помогает. Вопрос - сильное значение придаёт эта проверка, она же кроме того как обновлении позиции не за что не отвечает. Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты
genokk22 174 Опубликовано 3 мая, 2013 ещё такой вопрос по поводу фрозенов у них я вижу какой то непонятный код в 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); } Из за этого кода игроки могут телепортироваться в любое место используя скилл с таргет типом аура (если не установлена геодата). Даже проверка которая стоит на таргет тип не помогает. Вопрос - сильное значение придаёт эта проверка, она же кроме того как обновлении позиции не за что не отвечает. метод куда тп делать Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты
La2Bash 87 Опубликовано 3 мая, 2013 (изменено) эм, что? короче поставлю вопрос другим образом - если убрать эту проверку то могут быть серьёзные последствия? Например даже в l2j нету её... Изменено 3 мая, 2013 пользователем Mister Coder Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты
Shkaf 26 Опубликовано 3 мая, 2013 ещё такой вопрос по поводу фрозенов у них я вижу какой то непонятный код в 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, когда ТХ юзает скил и оказывается позади таргета и бьёт в спину, думаю так Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты
La2Bash 87 Опубликовано 3 мая, 2013 это интерлюд... Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты
Shkaf 26 Опубликовано 3 мая, 2013 это интерлюд... Я вкурсе что фрозен интерлюд Но ты походу не вкурсе что у фрозен говнокод Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты
La2Bash 87 Опубликовано 3 мая, 2013 (изменено) вкурсе Но до сих пор не понятно - за что эта проверка отвечает, что она делает тут вообще? Если перевести, то можно прикинуть что это якобы обновляет направление игрока после использования скилла. Изменено 3 мая, 2013 пользователем Mister Coder Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты
Shkaf 26 Опубликовано 3 мая, 2013 вкурсе Кстати эта часть кода может отвечать за скилы НПЦ которые телепортируют к себе, например мобы в крума товер Точно не имею понятия, не ковырялся во фрозен Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты
La2Bash 87 Опубликовано 3 мая, 2013 транслейт комента: Поворачивать местного игрока в целевом направлении Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты
TpaMjkee 128 Опубликовано 3 мая, 2013 У фрозенов вроде нормальный код, не жалуюсь. Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты
Shkaf 26 Опубликовано 3 мая, 2013 (изменено) У фрозенов вроде нормальный код, не жалуюсь. Сравни самый банальный PcInstance с другими, убедишься сколько там лишнего говна создаёт нагрузку И ключевое слово в твоем посте "ВРОДЕ" Изменено 3 мая, 2013 пользователем Shkaf Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты
Silentium 592 Опубликовано 3 мая, 2013 У фрозенов вроде нормальный код, не жалуюсь. Он никогда не был нормальным. :] Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты
La2Bash 87 Опубликовано 3 мая, 2013 Удалил этот код, скиллы юз норм. Телепорта нет, других ошибок не заметил. Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты