1. Вы находитесь в сообществе Rubukkit. Мы - администраторы серверов Minecraft, разрабатываем собственные плагины и переводим на различные языки плагины наших коллег из других стран.
    Скрыть объявление
Скрыть объявление
В преддверии глобального обновления, мы проводим исследования, которые помогут нам сделать опыт пользования форумом ещё удобнее. Помогите нам, примите участие!

Помогите Как создать свой Event

Тема в разделе "Разработка плагинов для новичков", создана пользователем Cristalix, 19 янв 2018.

  1. Автор темы
    Cristalix

    Cristalix Активный участник Пользователь

    Баллы:
    76
    Имя в Minecraft:
    Test
    Хочу понять узнать как создать свой эвент.
    Он не относиться к Bukkit не как.
    У меня есть собственная программа я хочу создать свой эвент такой же как в майнкрафте.
    Но не знаю как.
    В гугле лазил мало чего понял.
    Может быть вы мне поможете? =)
     
  2. xDark

    xDark Активный участник Пользователь

    Баллы:
    96
    EventManager:
    PHP:
    private final Map<Class<? extends Event>, List<EventMethod>> eventMap Maps.newHashMap();

        public 
    void addListener(final Object eventListener) {
            for (final 
    Method method eventListener.getClass().getDeclaredMethods()) {
                if (
    method.isAnnotationPresent(EventHandler.class) && method.getParameterTypes().length == 1) {
                    if (!
    method.isAccessible()) { method.setAccessible(true); }
                    final Class<? extends 
    EventeventClass = (Class<? extends Event>) method.getParameterTypes()[0];
                    final List<
    EventMethodeventMethods eventMap.getOrDefault(eventClass, new ArrayList<>());
                    
    eventMethods.add(new EventMethod(eventListenermethod));
                    
    eventMap.put(eventClasseventMethods);
                }
            }
        }

        public 
    void removeListener(final Object object) {
            final 
    HashMap<Class<? extends Event>, List<EventMethod>> toRemove = new HashMap<>();
            for (final 
    Entry<Class<? extends Event>, List<EventMethod>> entry eventMap.entrySet()) {
                List<
    EventMethodremove = new ArrayList<>();
                for (
    EventMethod eventMethod entry.getValue())
                    if (
    eventMethod.getEventListener() == object) { remove.add(eventMethod); }
                
    entry.getValue().removeAll(remove);
                
    remove.clear();
            }
        }

        public 
    Event fireEvent(final Event event) {
        if (
    event == null) { return null; }
            final List<
    EventMethodeventMethods eventMap.getOrDefault(event.getClass(), null);
            if (
    eventMethods == null) { return event; }
            
    eventMethods.forEach(eventMethod ->
                {
                    try {
                        
    eventMethod.getMethod().invoke(eventMethod.getEventListener(), event);
                    } catch (
    IllegalAccessException InvocationTargetException e) {
                        
    e.printStackTrace();
                    }
                });
            return 
    event;
        }
    EventMethod:
    PHP:
    public class EventMethod {

        private final 
    Object eventListener;
        private final 
    Method method;

        public 
    EventMethod(final Object eventListener, final Method method) {
            
    this.eventListener eventListener;
            
    this.method method;
        }

        public 
    Object getEventListener() {
            return 
    eventListener;
        }

        public 
    Method getMethod() {
            return 
    method;
        }
    }
    Event:
    PHP:
    public class Event {

        public <
    extends EventT fire(EventManager eventManager) {
            if (
    eventManager == null) { cast(); }
            try {
                return 
    cast(eventManager.fireEvent(this));
            } catch (
    Exception exc) {
                
    exc.printStackTrace();
                return 
    cast();
            }
        }

        public <
    extends EventT cast() {
            return (
    Tthis;
        }
    }
     
  3. alexandrage

    alexandrage Старожил Пользователь

    Баллы:
    173
  4. hyndorik

    hyndorik Активный участник Пользователь

    Баллы:
    98
    Имя в Minecraft:
    hyndo
    Та лан не юзай это говно, это какое то подобие аоп. Учи аоп и AspectJ
     
  5. alexandrage

    alexandrage Старожил Пользователь

    Баллы:
    173
    Код над моим яб тож не юзал, кек.
     

Поделиться этой страницей