SkillEffectHandler - система хендлеров эффектов скиллов

Позволяет писать логику для скиллов в скриптах без правки core. Дальше вся кастомная логика - отдельные классы в scripts/handler/skills/.

Куда класть хендлеры:
scripts/handler/skills/MyHandler.java

Три типа эффектов:
i_call_handler - onStart. Разовые эффекты.
p_call_handler - onStart + onExit. Баффы с логикой при снятии.
t_call_handler - onStart + onExit + onActionTime. Периодические эффекты.


Подключение в XML скилла:
Разовый эффект:
Code:
<effect name="i_call_handler" time="0" val="0">
    <def name="handler" val="MyHandler"/>
</effect>

Постоянный бафф:
Code:
<effect name="p_call_handler" time="60" val="0">
    <def name="handler" val="MyHandler"/>
</effect>

Периодический тик каждые 3 секунды, 10 раз:
Code:
<effect name="t_call_handler" time="3" count="10" val="0">
    <def name="handler" val="MyHandler"/>
</effect>

Значение val в def name="handler" - это точное имя класса хендлера.

Базовый шаблон хендлера:

Code:
public class MyHandler extends AbstractSkillEffect
{
    @Override
    public void onStart(Effect effect)
    {
        Creature effected = effect.getEffected();
        Creature effector = effect.getEffector();

        // логика
    }
}

Переопределяй только нужные методы. Все методы по умолчанию - заглушки.


Пример 1 - разовый эффект

XML:
Code:
<effect name="i_call_handler" time="0" val="0">
    <def name="handler" val="SummonCubic"/>
</effect>

Хендлер:
Code:
public class SummonCubic extends AbstractSkillEffect
{
    @Override
    public void onStart(Effect effect)
    {
        Creature effected = effect.getEffected();

        if (effected == null || effected.isDead())
            return;

        // логика
    }
}

Пример 2 - постоянный бафф

XML:
Code:
<effect name="p_call_handler" time="60" val="0">
    <def name="handler" val="MyBuff"/>
</effect>

Хендлер:
Code:
public class MyBuff extends AbstractSkillEffect
{
    @Override
    public void onStart(Effect effect)
    {
        if (!effect.getEffected().isPlayer())
            return;

        // логика при наложении
    }

    @Override
    public void onExit(Effect effect)
    {
        if (!effect.getEffected().isPlayer())
            return;

        // откат при снятии
    }
}


Пример 3 - периодический тик

XML:
Code:
<effect name="t_call_handler" time="3" count="10" val="0">
    <def name="handler" val="MyDoT"/>
</effect>

Хендлер:
Code:
public class MyDoT extends AbstractSkillEffect
{
    @Override
    public boolean onActionTime(Effect effect)
    {
        if (effect.getEffected().isDead())
            return false; // false - завершить досрочно

        // периодическая логика

        return true; // true - продолжать тикать
    }

    @Override
    public void onExit(Effect effect)
    {
        // вызывается один раз при снятии
    }
}


Пример 4 - запрет наложения

Code:
@Override
public boolean checkCondition(Effect effect)
{
    if (!effect.getEffected().isPlayer())
        return false;

    if (effect.getEffected().isDead())
        return false;

    return true;
}


Что доступно внутри хендлера

effect.getEffected() - цель эффекта (Creature)
effect.getEffector() - кто накладывает (Creature)
effect.getSkill() - объект скилла
effect.getSkill().getId() - ID скилла
effect.getSkill().getLevel() - уровень скилла
effect.calc() - значение val из XML эффекта
effect.getTimeLeft() - оставшееся время в секундах
 
Back
Top