diff --git a/runelite-client/src/main/java/net/runelite/client/callback/Hooks.java b/runelite-client/src/main/java/net/runelite/client/callback/Hooks.java index 9242384bf8..714064a6b3 100644 --- a/runelite-client/src/main/java/net/runelite/client/callback/Hooks.java +++ b/runelite-client/src/main/java/net/runelite/client/callback/Hooks.java @@ -68,6 +68,7 @@ import net.runelite.client.task.Scheduler; import net.runelite.client.ui.overlay.OverlayLayer; import net.runelite.client.ui.overlay.OverlayRenderer; import net.runelite.client.ui.overlay.infobox.InfoBoxManager; +import net.runelite.client.util.DeferredEventBus; import org.slf4j.Logger; import org.slf4j.LoggerFactory; @@ -80,7 +81,9 @@ public class Hooks private static final Injector injector = RuneLite.getInjector(); private static final Client client = injector.getInstance(Client.class); - public static final EventBus eventBus = injector.getInstance(EventBus.class); + public static final EventBus eventBus = injector.getInstance(EventBus.class); // symbol must match mixin Hook + private static final DeferredEventBus _deferredEventBus = injector.getInstance(DeferredEventBus.class); + public static final EventBus deferredEventBus = _deferredEventBus; // symbol must match mixin Hook private static final Scheduler scheduler = injector.getInstance(Scheduler.class); private static final InfoBoxManager infoBoxManager = injector.getInstance(InfoBoxManager.class); private static final ChatMessageManager chatMessageManager = injector.getInstance(ChatMessageManager.class); @@ -102,6 +105,9 @@ public class Hooks if (shouldProcessGameTick) { shouldProcessGameTick = false; + + _deferredEventBus.replay(); + eventBus.post(tick); } diff --git a/runelite-client/src/main/java/net/runelite/client/util/DeferredEventBus.java b/runelite-client/src/main/java/net/runelite/client/util/DeferredEventBus.java new file mode 100644 index 0000000000..8890c65871 --- /dev/null +++ b/runelite-client/src/main/java/net/runelite/client/util/DeferredEventBus.java @@ -0,0 +1,72 @@ +/* + * Copyright (c) 2018, Adam + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + * + * 1. Redistributions of source code must retain the above copyright notice, this + * list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright notice, + * this list of conditions and the following disclaimer in the documentation + * and/or other materials provided with the distribution. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED + * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR + * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES + * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; + * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND + * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ +package net.runelite.client.util; + +import com.google.common.eventbus.EventBus; +import java.util.Queue; +import java.util.concurrent.ConcurrentLinkedQueue; +import javax.inject.Inject; +import javax.inject.Singleton; + +@Singleton +public class DeferredEventBus extends EventBus +{ + private final EventBus eventBus; + private final Queue pendingEvents = new ConcurrentLinkedQueue<>(); + + @Inject + private DeferredEventBus(EventBus eventBus) + { + this.eventBus = eventBus; + } + + @Override + public void register(Object object) + { + eventBus.register(object); + } + + @Override + public void unregister(Object object) + { + eventBus.unregister(object); + } + + @Override + public void post(Object object) + { + pendingEvents.add(object); + } + + public void replay() + { + int size = pendingEvents.size(); + while (size-- > 0) + { + Object object = pendingEvents.poll(); + eventBus.post(object); + } + } +} diff --git a/runelite-mixins/src/main/java/net/runelite/client/callback/Hooks.java b/runelite-mixins/src/main/java/net/runelite/client/callback/Hooks.java index 0e5978b363..cf90c14151 100644 --- a/runelite-mixins/src/main/java/net/runelite/client/callback/Hooks.java +++ b/runelite-mixins/src/main/java/net/runelite/client/callback/Hooks.java @@ -42,6 +42,7 @@ public class Hooks public static Logger log; public static EventBus eventBus; + public static EventBus deferredEventBus; public static void draw(MainBufferProvider mainBufferProvider, Graphics graphics, int x, int y) {