12-22-2011, 09:28 PM
Маленькая шара от меня, так сказать подарочек на Новый Год
Многие наверное видели в сервере от l2jserver так называемые SkillHandlers, позволяющие без особого труда объявлять в датапаке новые обработчики скиллов и вызывать их когда зарегистрированный в них скилл использован.
Вобщем я реализовал нечто подобное и для серверов на базе феникса, но с небольшими отличиями: у l2jserver обрабатывается только useSkill и ничего более, у меня же дополнительно можно проверять условия для применения самого скилла, для старта эффекта в нем, делать какие-нибудь действия при старте и окончании эффекта, а так же действия с заданным периодом пока эффект работает.
Куда это все применить я пока даже хз - делал реализацию этого всего чисто ради интересу и руководствуясь принципом "потом может пригодится для чего нибудь"
Ладно, перейдем к делу, а конкретно к содержимому необходимых классов для ядра.
ISkillHandler.java:
SkillHandler.java:Многие наверное видели в сервере от l2jserver так называемые SkillHandlers, позволяющие без особого труда объявлять в датапаке новые обработчики скиллов и вызывать их когда зарегистрированный в них скилл использован.
Вобщем я реализовал нечто подобное и для серверов на базе феникса, но с небольшими отличиями: у l2jserver обрабатывается только useSkill и ничего более, у меня же дополнительно можно проверять условия для применения самого скилла, для старта эффекта в нем, делать какие-нибудь действия при старте и окончании эффекта, а так же действия с заданным периодом пока эффект работает.
Куда это все применить я пока даже хз - делал реализацию этого всего чисто ради интересу и руководствуясь принципом "потом может пригодится для чего нибудь"
Ладно, перейдем к делу, а конкретно к содержимому необходимых классов для ядра.
ISkillHandler.java:
PHP код:
<?php
package l2p.gameserver.handler;
import l2p.gameserver.model.L2Character;
import l2p.gameserver.model.L2Effect;
import l2p.gameserver.model.L2Skill;
import l2p.util.GArray;
/**
* Класс для обработки хэндлеров, прикрепляемых к скиллам и их эффектам.
* <br><br>
* Для того, чтобы вызывались методы checkCondition(L2Skill skill, ...), isUseAdditionalCheck(), isOffensive() и useSkill(L2Skill skill, ...),
* необходимо чтобы умение, к которому прикреплен хэндлер, имело тип HANDLER.
* <br><br>
* Для того, чтобы вызывались методы checkCondition(L2Effect effect, ...), onStart(L2Effect effect, ...), onExit(L2Effect effect, ...) и
* onActionTime(L2Effect effect, ...), необходимо чтобы в умении, к которому прикреплен хэндлер, имелся эффект с именем Handler.
*
* @author Gaikotsu
*/
public interface ISkillHandler
{
/**
* Проверка возможности использовать умение на заданную цель.
*
* @param skill - умение
* @param caster - персонаж, кастующий умение
* @param target - цель, на которую используется умение
* @param forceUse - форсированое использование умения (через Ctrl) или обычное
*
* @return - true - умение можно использовать, false - нельзя
* <br><br>
* Если метод isUseAdditionalCheck() хэндлера возвращает true, то после проверок в этом методе, дополнительно будет
* вызван одноименный метод и родительского класса (метод из L2Skill), который проведет дополнительно стандартные проверки на
* возможность использования умения на эту цель.
*/
public boolean checkCondition(L2Skill skill, L2Character caster, L2Character target, boolean forceUse);
/**
* Возвращает признак того, надо ли делать дополнительные проверки возможности использовать умение на заданную цель.
*
* @return - true - проверки проводить надо, false - дополнительные проверки не требуются
*/
public boolean isUseAdditionalCheck();
/**
* Возвращает признак того, является ли умение "плохим" (вызывающим PvP-флаг).
*
* @return - true - умение "плохое", false - умение "хорошее"
*/
public boolean isOffensive();
/**
* Использование умения на список целей.
*
* @param skill - умение
* @param caster - персонаж, кастующий умение
* @param targets - список целей, на которые используется умение
*/
public void useSkill(L2Skill skill, L2Character caster, GArray<L2Character> targets);
/**
* Проверка возможности использовать эффект на заданную цель.
*
* @param effect - эффект
* @param caster - персонаж, накладывающий эффект
* @param target - цель, на которую накладывается эффект
*
* @return - true - эффект можно использовать, false - нельзя
*/
public boolean checkCondition(L2Effect effect, L2Character caster, L2Character target);
/**
* Вызывается при начале работы эффекта.
*
* @param effect - эффект
* @param caster - персонаж, наложивший эффект
* @param target - цель, на которую действует эффект
*/
public void onStart(L2Effect effect, L2Character caster, L2Character target);
/**
* Вызывается при окончании работы эффекта.
*
* @param effect - эффект
* @param caster - персонаж, наложивший эффект
* @param target - цель, на которую действует эффект
*/
public void onExit(L2Effect effect, L2Character caster, L2Character target);
/**
* Вызывается периодически во время действия эффекта.<br>
* Количество и частота вызовов задается в самом описании эффекта в умении (параметры count и time).<br>
* Возвращает возможность дальнейшей работы эффекта.
*
* @param effect - эффект
* @param caster - персонаж, наложивший эффект
* @param target - цель, на которую действует эффект
*
* @return - true - эффект может работать дальше, false - работу эффекта необходимо прервать незамедлительно
*/
public boolean onActionTime(L2Effect effect, L2Character caster, L2Character target);
/**
* Возвращает список умений, на которые зарегистрирован хэндлер.
*
* @return - список умений в виде их идентификаторов
*/
public int[] getSkillIds();
}
PHP код:
<?php
package l2p.gameserver.handler;
import java.util.Map;
import java.util.TreeMap;
public class SkillHandler
{
private static SkillHandler _instance;
private Map<Integer, ISkillHandler> _datatable;
public static SkillHandler getInstance()
{
if (_instance == null)
_instance = new SkillHandler();
return _instance;
}
public int size()
{
return _datatable.size();
}
private SkillHandler()
{
_datatable = new TreeMap<Integer, ISkillHandler>();
}
public void registerSkillHandler(ISkillHandler handler)
{
int[] ids = handler.getSkillIds();
for (int element : ids)
_datatable.put(element, handler);
}
public ISkillHandler getSkillHandler(int skillId)
{
return _datatable.get(skillId);
}
public void clear()
{
_datatable.clear();
}
}