GooD, Через триггер как не крути не получится, недостаточен функционал возможностей обработки триггеров в ядре. Да еще там сложность в том что при повторном наложении эффекта повышается уровень второго скилла. Базовыми возможностями сборки этого нельзя было сделать.
Реализовал так...
DP:
Код:
<skill id="11752" levels="8" name="Сила Воли">
<!--
В течение 15 сек. восстанавливает каждую секунду 172 HP.
Также увеличивает эффективность исцеляющих умений на 10%.
Дополнительно увеличивает эффективность восстанавливающих HP умений, используемых персонажем.
-->
<table name="#mpConsume2">53 48 50 52 54 56 57 57</table>
<table name="#hot">172 173 173 174 174 175 175 176</table>
<table name="#hpEff">1.10 1.13 1.16 1.19 1.22 1.25 1.28 1.30</table>
<table name="#magicLevel">85 87 89 91 93 95 97 99</table>
<table name="#abnormal_lv">30 31 32 33 34 35 36 37</table>
<set name="hitTime" val="500" />
<set name="castRange" val="600"/>
<set name="reuseDelay" val="1000" />
<set name="mpConsume2" val="#mpConsume2" />
<set name="magicLevel" val="#magicLevel" />
<set name="operateType" val="OP_ACTIVE"/>
<set name="skillType" val="BUFF"/>
<set name="target" val="TARGET_PARTY_ONE"/>
<for>
<effect count="15" name="HealOverTime" time="1" val="#hot" stackOrder="#abnormal_lv" stackTypes="ChantofLife">
<def name="ignoreHpEff" val="true" />
<def name="forceSkillId" val="11753" />
<mul order="0x40" stat="hpEff" val="#hpEff" />
</effect>
</for>
</skill>
<skill id="11753" levels="3" name="Сила Воли">
<table name="#hpEff">50 100 200</table>
<set name="target" val="TARGET_PARTY_ONE" />
<set name="skillType" val="BUFF" />
<set name="operateType" val="OP_ACTIVE" />
<for>
<effect count="1" name="Buff" time="15" val="0">
<add order="0x40" stat="healPower" val="#hpEff" />
</effect>
</for>
</skill>
EffectDamOverTime.java :
Код:
package l2next.gameserver.skills.effects;
import java.util.concurrent.ScheduledFuture;
import l2next.commons.collections.GArray;
import l2next.commons.threading.RunnableImpl;
import l2next.gameserver.ThreadPoolManager;
import l2next.gameserver.model.Creature;
import l2next.gameserver.model.Effect;
import l2next.gameserver.model.EffectList;
import l2next.gameserver.model.Player;
import l2next.gameserver.model.Skill;
import l2next.gameserver.network.serverpackets.ExRegenMax;
import l2next.gameserver.stats.Env;
import l2next.gameserver.stats.Stats;
import l2next.gameserver.tables.SkillTable;
/**
* @Optimized & correct: WoWan-SM
* @date: 07.01.2014
*/
public class EffectHealOverTime extends Effect
{
private final boolean _ignoreHpEff;
private int forceSkillId;
private ScheduledFuture<?> startEffectTask;
public EffectHealOverTime(final Env env, final EffectTemplate template)
{
super(env, template);
_ignoreHpEff = template.getParam().getBool("ignoreHpEff", false);
forceSkillId = template.getParam().getInteger("forceSkillId", -1);
}
@Override
public void onStart()
{
super.onStart();
// Контроллирующий скилл
if (forceSkillId > 0)
{
if (startEffectTask != null)
{
startEffectTask.cancel(false);
startEffectTask = null;
}
startEffectTask = ThreadPoolManager.getInstance().schedule(new RunnableImpl() {
@Override
public void runImpl() throws Exception
{
updateSkill();
}
}, 500);
}
final Creature effected = getEffected();
final int count = getCount();
final long period = getPeriod();
if (effected.isPlayer() && count > 0 && period > 0)
{
effected.sendPacket(new ExRegenMax(calc(), (int) ((count * period) / 1000), Math.round(period / 1000)));
}
}
@Override
public boolean onActionTime()
{
if (_effected.isHealBlocked())
{
return true;
}
double newHp = calc() * (!_ignoreHpEff ? _effected.calcStat(Stats.HEAL_EFFECTIVNESS, 100., _effector, getSkill()) : 100.) / 100.;
double addToHp = Math.max(0, Math.min(newHp, ((_effected.calcStat(Stats.HP_LIMIT, null, null) * _effected.getMaxHp()) / 100.) - _effected.getCurrentHp()));
if (addToHp > 0)
{
getEffected().setCurrentHp(_effected.getCurrentHp() + addToHp, false);
}
return true;
}
private void updateSkill()
{
final Player effector = getEffector().getPlayer();
final SkillTable skillTable = SkillTable.getInstance();
Skill forceSkill = skillTable.getInfo(forceSkillId, 1);
if (effector == null || forceSkill == null)
{
return;
}
final GArray<Creature> targets = forceSkill.getTargets(effector, getEffected(), false);
for (final Creature target : targets)
{
final EffectList effectList = target.getEffectList();
if (effectList.getEffectsBySkillId(11753) != null)
{
final int level = effectList.getEffectsBySkillId(11753).get(0).getDisplayLevel();
if (level < 3)
{
forceSkill = skillTable.getInfo(forceSkillId, level + 1);
}
else
{
forceSkill = skillTable.getInfo(forceSkillId, 3);
}
}
forceSkill.getEffects(effector, target, false, false);
}
}
}