Позволяет писать логику для скиллов в скриптах без правки 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 скилла:
Разовый эффект:
Постоянный бафф:
Периодический тик каждые 3 секунды, 10 раз:
Значение val в def name="handler" - это точное имя класса хендлера.
Базовый шаблон хендлера:
Переопределяй только нужные методы. Все методы по умолчанию - заглушки.
Пример 1 - разовый эффект
XML:
Хендлер:
Пример 2 - постоянный бафф
XML:
Хендлер:
Пример 3 - периодический тик
XML:
Хендлер:
Пример 4 - запрет наложения
Что доступно внутри хендлера
effect.getEffected() - цель эффекта (Creature)
effect.getEffector() - кто накладывает (Creature)
effect.getSkill() - объект скилла
effect.getSkill().getId() - ID скилла
effect.getSkill().getLevel() - уровень скилла
effect.calc() - значение val из XML эффекта
effect.getTimeLeft() - оставшееся время в секундах
Куда класть хендлеры:
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() - оставшееся время в секундах