Ejemplo n.º 1
0
  public boolean post(
      Event spongeEvent,
      net.minecraftforge.fml.common.eventhandler.Event forgeEvent,
      IEventListener[] listeners) {
    checkNotNull(forgeEvent, "forgeEvent");

    if (spongeEvent == null) { // Fired by Forge
      spongeEvent = ((IMixinEvent) forgeEvent).createSpongeEvent();
    }
    RegisteredListener.Cache listenerCache = getHandlerCache(spongeEvent);
    // Fire events to plugins before modifications
    for (Order order : Order.values()) {
      post(spongeEvent, listenerCache.getListenersByOrder(order), true, false);
    }

    // If there are no forge listeners for event, skip sync
    if (listeners.length > 0) {
      // sync plugin data for Mods
      ((IMixinEvent) forgeEvent).syncDataToForge(spongeEvent);

      for (IEventListener listener : listeners) {
        try {
          listener.invoke(forgeEvent);
        } catch (Throwable throwable) {
          SpongeImpl.getLogger().catching(throwable);
        }
      }

      // sync Forge data for Plugins
      ((IMixinEvent) spongeEvent).syncDataToSponge(forgeEvent);
    }

    // Fire events to plugins after modifications (default)
    for (Order order : Order.values()) {
      post(spongeEvent, listenerCache.getListenersByOrder(order), false, false);
    }

    // sync plugin data for Forge
    ((IMixinEvent) forgeEvent).syncDataToForge(spongeEvent);

    if (spongeEvent instanceof Cancellable) {
      if (((Cancellable) spongeEvent).isCancelled()) {
        forgeEvent.setCanceled(true);
      }
    }
    return forgeEvent.isCancelable() && forgeEvent.isCanceled();
  }