Register multiple events to one method

Discussion in 'Plugin Development' started by CrateMuncher, Oct 13, 2013.

Thread Status:
Not open for further replies.
  1. Offline

    CrateMuncher

    I'm making a "clone" of Python-Plugin-Loader, and I'm having trouble with event handling.

    I want to have one method, that handles many or all of the events at the same time. I don't want to sit and make methods for every single event that calls to one, I want it to work a year from now when other events have been added and I don't have to put it in.

    What I tried was making an EventExecutor object, and putting my code into the execute() method of that, then registering it with Bukkit.getPluginManager().registerEvent(Class<? extends Event>, Listener, EventPriority, EventExecutor, Plugin). That works, but the event is not called! I'm also not sure what the "listener" argument is for, as I don't have a Listener and don't seem to need one.

    Maybe I'm doing it entirely wrong, so can anyone help me on the right track?

    Here's some code bits:

    Code:java
    1.  
    2. private void registerEvent(PyObject func, Class<? extends Event> eventType, EventPriority priority) {
    3. PyEvent wrapper = new PyEvent(func, eventType, priority);
    4. events.add(wrapper);
    5. Bukkit.getPluginManager().registerEvent(eventType, wrapper, priority, wrapper, this.plugin);
    6. }
    7.  
    '

    Code:java
    1.  
    2. import org.bukkit.event.*;
    3. import org.bukkit.event.player.PlayerMoveEvent;
    4. import org.bukkit.plugin.EventExecutor;
    5. import org.python.core.Py;
    6. import org.python.core.PyObject;
    7.  
    8. public class PyEvent implements EventExecutor, Listener {
    9. public PyObject handler;
    10. public Class<? extends Event> eventType;
    11. public EventPriority priority;
    12.  
    13. public PyEvent(PyObject handler, Class<? extends Event> eventType, EventPriority priority) {
    14. this.handler = handler;
    15. this.eventType = eventType;
    16. this.priority = priority;
    17. }
    18.  
    19. public void execute(Listener listener, Event event) throws EventException {
    20. // This is supposed to be called, but isn't.
    21. handler.__call__(Py.java2py(event));
    22. }
    23. }
    24.  


    PyEvent is here a class, that extends EventExecutor.
     
  2. Offline

    MrSparkzz

    CrateMuncher
    I did something like this before, I'm not sure if it's exactly what you're looking for, but this is how I did it. I started by making a Manager class, then putting in this code
    Code:java
    1.  
    2. public void registerEvents(Listener listener, Plugin plugin) {
    3. Bukkit.getPluginManager().registerEvents(listener, plugin);
    4. }
    5.  
    6. static Manager instance = new Manager();
    7.  
    8. public static Manager getManager() {
    9. return instance;
    10. }
    11.  

    next I made an Event class which contained all the registers
    Code:java
    1.  
    2. Manager manager = Manager.getManager();
    3.  
    4. public void registerEvents(plugin) {
    5. manager.registerEvents(new ListenerClass(), Plugin plugin);
    6. }
    7.  
    8. static Events events = new Events();
    9.  
    10. public static Events getEvents() {
    11. return events;
    12. }
    13.  

    Then, in my onEnable method in my main class, I did this
    Code:java
    1.  
    2. Events events = Events.getEvents();
    3.  
    4. events.registerEvents(this);
    5.  

    I think that's it. I got really confused while writing this, so I might've made a mistake.
     
  3. You registered a custom event, that need to be fired in your code. I don't think this is what you wanted to do. Tried to write an EventHandler for Event? I never tried this, so I'm not sure if it works:
    Code:
    @EventHandler
    public void onEvent(Event args) {
      //...
    }
    Be sure that this handler is quite fast, as it will get any event that comes in, and thats a lot.
     
Thread Status:
Not open for further replies.

Share This Page