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

Cristalix

Активный участник
Пользователь
Баллы
76
Имя в Minecraft
Test
Хочу понять узнать как создать свой эвент.
Он не относиться к Bukkit не как.
У меня есть собственная программа я хочу создать свой эвент такой же как в майнкрафте.
Но не знаю как.
В гугле лазил мало чего понял.
Может быть вы мне поможете? =)
 
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 Event> eventClass = (Class<? extends Event>) method.getParameterTypes()[0];
                final List<EventMethod> eventMethods = eventMap.getOrDefault(eventClass, new ArrayList<>());
                eventMethods.add(new EventMethod(eventListener, method));
                eventMap.put(eventClass, eventMethods);
            }
        }
    }

    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<EventMethod> remove = 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<EventMethod> eventMethods = 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 <T extends Event> T fire(EventManager eventManager) {
        if (eventManager == null) { cast(); }
        try {
            return cast(eventManager.fireEvent(this));
        } catch (Exception exc) {
            exc.printStackTrace();
            return cast();
        }
    }

    public <T extends Event> T cast() {
        return (T) this;
    }
}
 
Та лан не юзай это говно, это какое то подобие аоп. Учи аоп и AspectJ
 
Назад
Верх