L2jServer
Interlude
Доброго времени суток.
Сотворил добротный скилл, который позволяет пробивать Invul состояние у цели. Создал скилу особую переменную, благодаря которой планировал сделать проверку. Но внезапно - штопорнулся.
Где находится основная проверка на isInvul, которая блокирует входящий урон?
Господин Рут подсказал, что скорее всего данная проверка заложена в методе reduceHp. Отправился туда и действительно увидел проверку на атакующего и состояние Invul
Свернуть ↑
public void reduceHp(double value, L2Character attacker, boolean awake, boolean isDOT, boolean isHPConsumption)
{
if (getActiveChar().isDead())
return;
// invul handling
if (getActiveChar().isInvul())
{
// other chars can't damage
if (attacker != getActiveChar())
return;
// only DOT and HP consumption allowed for damage self
if (!isDOT && !isHPConsumption)
return;
}
if (attacker != null)
{
final L2PcInstance attackerPlayer = attacker.getActingPlayer();
if (attackerPlayer != null && attackerPlayer.isGM() && !attackerPlayer.getAccessLevel().canGiveDamage())
return;
}
if (!isDOT && !isHPConsumption)
{
getActiveChar().stopEffectsOnDamage(awake);
//if character have effectType = ULTIMATE_STUN, damage don't stop them time
if (getActiveChar().isStunned() && Rnd.get(10) == 0)
{
if(getActiveChar().getFirstEffect(L2EffectType.ULTIMATE_STUN) == null)
getActiveChar().stopStunning(true);
else
getActiveChar().stopStunning(false);
}
if (getActiveChar().isImmobileUntilAttacked())
getActiveChar().stopImmobileUntilAttacked(null);
}
if (!isHPConsumption)
{
getActiveChar().stopEffectsOnDamage(awake);
if (getActiveChar().isDisoriented())
getActiveChar().stopDisorientation(null);
}
if (value > 0) // Reduce Hp if any
setCurrentHp(Math.max(getCurrentHp() - value, 0));
// Die if character is mortal
if (getActiveChar().getCurrentHp() < 0.5 && getActiveChar().isMortal())
{
getActiveChar().abortAttack();
getActiveChar().abortCast();
getActiveChar().doDie(attacker);
}
}Code: Java
Свернуть ↑Развернуть ↓
Но вот вопрос, переменная скила имеет название isPenetrate(), и верно ли будет создание ещё одного метода с reduceHp?
как пример:
public void reduceHp(double value, L2Character attacker, boolean awake, boolean isDOT, boolean isHPConsumption, boolean penetrating)
{
reduceHp(value, attacker, awake, isDOT, false);
}Code: Java
Соответственно с последующим его вызовом в:
Свернуть ↑
public void reduceCurrentHp(double i, L2Character attacker, boolean awake, boolean isDOT, L2Skill skill)
{
if (Config.CHAMPION_ENABLE && isChampion() && Config.CHAMPION_HP != 0)
getStatus().reduceHp(i / Config.CHAMPION_HP, attacker, awake, isDOT, false);
else
getStatus().reduceHp(i, attacker, awake, isDOT, false, skill.isPenetrate());
}Code: Java
Свернуть ↑Развернуть ↓
Который в свою очередь вызывается в хэндлерах PDAM и т.д. - и т.д.
Спасибо.