Сообщений: 78
Тем: 16
Зарегистрирован: Mar 2013
Репутация:
143
Сборка L2Open, Ситуация:
Все скиллы использующие параметр:
Код: <add order="0x40" stat="reflectDam" val="N" />
На мобах работают, на персонажах нет. Т.е. если на мобе (РБ) скилл ID:4214 и его бьет персонаж - то возвращается 20% нанесенного урона обратно персонажу.
Если же на персонаже скилл или ДС с возвратом урона - когда бьют мобы этого персонажа, им урон не возвращается.
L2Character.java не трогал, там все как было еще с фениксов:
Код: if(skill != null && skill.isMagic())
value = target.calcStat(Stats.REFLECT_MSKILL_DAMAGE_PERCENT, 0, this, skill);
else if(skill != null && skill.getCastRange() <= 200)
value = target.calcStat(Stats.REFLECT_PSKILL_DAMAGE_PERCENT, 0, this, skill);
else if(skill == null && !bow)
value = target.calcStat(Stats.REFLECT_DAMAGE_PERCENT, 0, this, null);
if(value > 0)
applyReflectDamage(target, damage, value);
if(skill != null || bow)
return false;
public void applyReflectDamage(L2Character target, double damage, double reflect)
{
double rdmg = damage * reflect / 100.;
rdmg = Math.min(rdmg, target.getCurrentHp());
if(isPlayable() && !target.isNpc())
reduceCurrentHp(rdmg, this, null, true, true, false, false);
else
reduceCurrentHp(rdmg, target, null, true, true, false, false);
if(target.isPlayer() && rdmg >= 1.)
target.sendPacket(new SystemMessage(SystemMessage.C1_HAS_GIVEN_C2_DAMAGE_OF_S3).addName(target).addName(this).addNumber((long) rdmg));
}
Подскажите где копать? Может я где-то в датапаке косякнул?
Сообщений: 105
Тем: 22
Зарегистрирован: Mar 2010
Репутация:
279
if(isPlayable() && !target.isNpc())
и
reduceCurrentHp
можно разобрать? Или на уровне проверки не выполняется, или не тот обьект в ф-цию отправляется.
Сообщений: 78
Тем: 16
Зарегистрирован: Mar 2013
Репутация:
143
Опять повторюсь, я L2Character.java не трогал, там все так, как было и как работало. И в принципе этот парамерт скилла работает, но только на мобах, а на персонажах нет. Для чистоты эксперимента я даже кидал на себя скилл 4214.
Код: public void reduceCurrentHp(double i, L2Character attacker, L2Skill skill, boolean awake, boolean standUp, boolean directHp, boolean canReflect)
{
fireMethodInvoked(MethodCollection.ReduceCurrentHp, new Object[] { i, attacker, skill, awake, standUp, directHp, });
if(attacker == null || isDead() || attacker.isDead())
return;
if(isInvul() && attacker != this)
{
attacker.sendPacket(Msg.THE_ATTACK_HAS_BEEN_BLOCKED);
return;
}
// 5182 = Blessing of protection, работает если разница уровней больше 10 и не в зоне осады
if(attacker.isPlayer() && Math.abs(attacker.getLevel() - getLevel()) > 10)
{
// ПК не может нанести урон чару с блессингом
if(attacker.getKarma() > 0 && getEffectList().getEffectsBySkillId(5182) != null && !isInZone(ZoneType.Siege))
return;
// чар с блессингом не может нанести урон ПК
if(getKarma() > 0 && attacker.getEffectList().getEffectsBySkillId(5182) != null && !attacker.isInZone(ZoneType.Siege))
return;
}
if(awake && isSleeping())
getEffectList().stopEffects(EffectType.Sleep);
if(isMeditated() && attacker != this)
{
L2Effect effect = getEffectList().getEffectByType(EffectType.Meditation);
if(effect != null)
{
GArray<L2Effect> effects = getEffectList().getEffectsBySkill(effect.getSkill());
if(effects != null)
for(L2Effect ef : effects)
if(ef.getEffectType() != EffectType.Debuff)
ef.exit();
}
}
if(standUp && isPlayer())
{
standUp();
if(isFakeDeath())
{
L2Effect fakeDeath = getEffectList().getEffectByType(EffectType.FakeDeath);
if(fakeDeath == null)
stopFakeDeath();
else if(fakeDeath.getTime() > 2000)
getEffectList().stopEffects(EffectType.FakeDeath);
}
}
if(attacker != this)
{
startAttackStanceTask();
if(isInvisible() && getEffectList().getEffectByType(EffectType.Invisible) != null)
getEffectList().stopEffects(EffectType.Invisible);
}
if(canReflect && attacker.absorbAndReflect(this, skill, i))
return;
if(attacker.isPlayable())
{
L2Playable pAttacker = (L2Playable) attacker;
// Flag the attacker if it's a L2Player outside a PvP area
if(!isDead() && pAttacker.checkPvP(this, null))
pAttacker.startPvPFlag(this);
if(isMonster() && skill != null && skill.isOverhit())
{
// Calculate the over-hit damage
// Ex: mob had 10 HP left, over-hit skill did 50 damage total, over-hit damage is 40
double overhitDmg = (_currentHp - i) * -1;
if(overhitDmg <= 0)
{
setOverhitDamage(0);
setOverhitAttacker(null);
}
else
{
setOverhitDamage(overhitDmg);
setOverhitAttacker(attacker);
}
}
double ii;
if(!directHp && _currentCp > 0)
{
i = _currentCp - i;
ii = i;
if(ii < 0)
ii *= -1;
if(i < 0)
i = 0;
setCurrentCp(i);
}
else
ii = i;
if(_currentCp == 0 || directHp)
{
ii = _currentHp - ii;
if(ii < 0)
ii = 0;
if(isNpc())
pAttacker.addDamage((L2NpcInstance) this, (int) (_currentHp - ii));
if(!onDieTrigger && ii < 0.5 && _skillsOnAction != null)
{
onDieTrigger = true;
ConcurrentLinkedQueue<L2Skill> SkillsOnDie = _skillsOnAction.get(TriggerActionType.DIE);
if(SkillsOnDie != null)
for(L2Skill sk : SkillsOnDie)
if(Rnd.chance(sk.getChanceForAction(TriggerActionType.DIE)))
useActionSkill(sk, this, attacker);
onDieTrigger = false;
}
setCurrentHp(ii, false);
}
}
else
{
if(_currentHp - i < 0.5)
useActionSkill(null, this, this, TriggerActionType.DIE);
setCurrentHp(Math.max(_currentHp - i, 0), false);
}
if(isDead())
doDie(attacker);
}
Сообщений: 111
Тем: 8
Зарегистрирован: Aug 2014
Репутация:
181
05-21-2015, 08:06 PM
(Сообщение последний раз редактировалось: 05-21-2015, 09:17 PM i_am_kisly.)
ntking Написал:Опять повторюсь, я L2Character.java не трогал давно уже пора потрогать  поставь пару брекпоинтов и решишь проблему
Сообщений: 78
Тем: 16
Зарегистрирован: Mar 2013
Репутация:
143
05-27-2015, 04:14 PM
(Сообщение последний раз редактировалось: 05-27-2015, 04:56 PM ntking.)
i_am_kisly Написал:давно уже пора потрогать поставь пару брекпоинтов и решишь проблему Спасибо за совет, но я не настолько знаю язык, чтобы поставить брики в то место, где они нужны((
Меня, как PHP программера смущает условие:
Код: if(isPlayable() && !target.isNpc())
reduceCurrentHp(rdmg, this, null, true, true, false, false);
Возможно оно тупо не выполняется и из-за этого дамаг от игрока не возвращается, а вот игроку как раз возвращается, т.к. срабатывает else .
Возможно в !target.isNpc()) лишний восклицательный знак. Т.е. условие срабатывает только на других игроках, а на NPC - нет. Попробую в PVP, возвращается ли урон от игрока игроку.
Сообщений: 105
Тем: 22
Зарегистрирован: Mar 2010
Репутация:
279
Сообщений: 78
Тем: 16
Зарегистрирован: Mar 2013
Репутация:
143
Глянул код у лыж, там вообще никаких условий нет, кто кого дамажет:
Код: // Reduce HP of the target and calculate reflection damage to reduce HP of attacker if necessary
double reflectPercent = target.getStat().calcStat(Stats.REFLECT_DAMAGE_PERCENT, 0, null, null);
if (reflectPercent > 0)
{
reflectedDamage = (int) ((reflectPercent / 100.) * damage);
if (reflectedDamage > target.getMaxHp())
{
reflectedDamage = target.getMaxHp();
}
}
}
}
// reduce targets HP
target.reduceCurrentHp(damage, this, null);
target.notifyDamageReceived(damage, this, null, crit, false);
if (reflectedDamage > 0)
{
reduceCurrentHp(reflectedDamage, target, true, false, null);
notifyDamageReceived(reflectedDamage, target, null, crit, false);
}
Глянул исходники L2Emu - там рефлект закомментирован :eek:
Жесть какая-то))) Жаль, Diagod'a нет, он то свой код знает... хотя, код это фениксов, но всеравно, он же с ним работал.
Сообщений: 5,863
Тем: 105
Зарегистрирован: Sep 2010
Репутация:
13,014
Нужен код вот этого:
Цитата: else if(skill == null && !bow)
value = target.calcStat(Stats.REFLECT_DAMAGE_PERCENT, 0, this, null);
Скорее всего там return 0; из-за чего и не рефлектит. Вообще автор пишите в скайп Zubastic32. Вечером глянем.
Сообщений: 78
Тем: 16
Зарегистрирован: Mar 2013
Репутация:
143
Zubastic Написал:Нужен код вот этого:
Скорее всего там return 0; из-за чего и не рефлектит. Вообще автор пишите в скайп Zubastic32. Вечером глянем. Нее, тут то как раз все нормально, словами:
если не скилл и не лук, то высчитываем рефлект, взяв из статов.
Если бы это условие не работало, то от мобов не рефлектило бы.
Сообщений: 376
Тем: 12
Зарегистрирован: Jul 2012
Репутация:
1,000
PHP код: <?php
if(isPlayable() && !target.isNpc())
reduceCurrentHp(rdmg, this, null, true, true, false, false);
else
reduceCurrentHp(rdmg, target, null, true, true, false, false);
Ну условие должно смущать
вместо всего блога оставьте только это
reduceCurrentHp(rdmg, target, null, true, true, false, false);
хотя....
посмотрите, что в методе attacker.absorbAndReflect
PHP код: <?php
if(canReflect && attacker.absorbAndReflect(this, skill, i))
return;
я думаю там, нас ждет подсказка, в интересном приключении, l2j core
|