RxJava 'eventbus'

This commit is contained in:
Owain van Brakel
2019-07-13 07:19:52 +02:00
parent aa0014f5df
commit 3de05dec64
42 changed files with 775 additions and 596 deletions

View File

@@ -300,6 +300,16 @@
<artifactId>httpmime</artifactId> <artifactId>httpmime</artifactId>
<version>4.5.9</version> <version>4.5.9</version>
</dependency> </dependency>
<dependency>
<groupId>io.reactivex.rxjava2</groupId>
<artifactId>rxjava</artifactId>
<version>2.2.10</version>
</dependency>
<dependency>
<groupId>com.jakewharton.rxrelay2</groupId>
<artifactId>rxrelay</artifactId>
<version>2.1.0</version>
</dependency>
</dependencies> </dependencies>
<build> <build>

View File

@@ -48,16 +48,9 @@ import lombok.extern.slf4j.Slf4j;
import net.runelite.api.Client; import net.runelite.api.Client;
import net.runelite.client.account.SessionManager; import net.runelite.client.account.SessionManager;
import net.runelite.client.chat.ChatMessageManager; import net.runelite.client.chat.ChatMessageManager;
import net.runelite.client.chat.CommandManager;
import net.runelite.client.config.ConfigManager; import net.runelite.client.config.ConfigManager;
import net.runelite.client.discord.DiscordService; import net.runelite.client.discord.DiscordService;
import net.runelite.client.eventbus.EventBus;
import net.runelite.client.game.ClanManager;
import net.runelite.client.game.ItemManager;
import net.runelite.client.game.LootManager;
import net.runelite.client.game.chatbox.ChatboxPanelManager;
import net.runelite.client.graphics.ModelOutlineRenderer; import net.runelite.client.graphics.ModelOutlineRenderer;
import net.runelite.client.menus.MenuManager;
import net.runelite.client.plugins.Plugin; import net.runelite.client.plugins.Plugin;
import net.runelite.client.plugins.PluginInstantiationException; import net.runelite.client.plugins.PluginInstantiationException;
import net.runelite.client.plugins.PluginManager; import net.runelite.client.plugins.PluginManager;
@@ -65,18 +58,14 @@ import net.runelite.client.rs.ClientLoader;
import net.runelite.client.rs.ClientUpdateCheckMode; import net.runelite.client.rs.ClientUpdateCheckMode;
import net.runelite.client.task.Scheduler; import net.runelite.client.task.Scheduler;
import net.runelite.client.ui.ClientUI; import net.runelite.client.ui.ClientUI;
import net.runelite.client.ui.DrawManager;
import net.runelite.client.ui.RuneLiteSplashScreen; import net.runelite.client.ui.RuneLiteSplashScreen;
import net.runelite.client.ui.overlay.OverlayManager; import net.runelite.client.ui.overlay.OverlayManager;
import net.runelite.client.ui.overlay.OverlayRenderer;
import net.runelite.client.ui.overlay.WidgetOverlay; import net.runelite.client.ui.overlay.WidgetOverlay;
import net.runelite.client.ui.overlay.arrow.ArrowMinimapOverlay; import net.runelite.client.ui.overlay.arrow.ArrowMinimapOverlay;
import net.runelite.client.ui.overlay.arrow.ArrowWorldOverlay; import net.runelite.client.ui.overlay.arrow.ArrowWorldOverlay;
import net.runelite.client.ui.overlay.infobox.InfoBoxManager;
import net.runelite.client.ui.overlay.infobox.InfoBoxOverlay; import net.runelite.client.ui.overlay.infobox.InfoBoxOverlay;
import net.runelite.client.ui.overlay.tooltip.TooltipOverlay; import net.runelite.client.ui.overlay.tooltip.TooltipOverlay;
import net.runelite.client.ui.overlay.worldmap.WorldMapOverlay; import net.runelite.client.ui.overlay.worldmap.WorldMapOverlay;
import net.runelite.client.ws.PartyService;
import org.slf4j.LoggerFactory; import org.slf4j.LoggerFactory;
@Singleton @Singleton
@@ -97,15 +86,9 @@ public class RuneLite
@Inject @Inject
private PluginManager pluginManager; private PluginManager pluginManager;
@Inject
private EventBus eventBus;
@Inject @Inject
private ConfigManager configManager; private ConfigManager configManager;
@Inject
private DrawManager drawManager;
@Inject @Inject
private SessionManager sessionManager; private SessionManager sessionManager;
@@ -118,33 +101,12 @@ public class RuneLite
@Inject @Inject
private ClientUI clientUI; private ClientUI clientUI;
@Inject
private InfoBoxManager infoBoxManager;
@Inject @Inject
private OverlayManager overlayManager; private OverlayManager overlayManager;
@Inject
private PartyService partyService;
@Inject
private Provider<ItemManager> itemManager;
@Inject
private Provider<OverlayRenderer> overlayRenderer;
@Inject
private Provider<ClanManager> clanManager;
@Inject @Inject
private Provider<ChatMessageManager> chatMessageManager; private Provider<ChatMessageManager> chatMessageManager;
@Inject
private Provider<MenuManager> menuManager;
@Inject
private Provider<CommandManager> commandManager;
@Inject @Inject
private Provider<InfoBoxOverlay> infoBoxOverlay; private Provider<InfoBoxOverlay> infoBoxOverlay;
@@ -160,12 +122,6 @@ public class RuneLite
@Inject @Inject
private Provider<ArrowMinimapOverlay> arrowMinimapOverlay; private Provider<ArrowMinimapOverlay> arrowMinimapOverlay;
@Inject
private Provider<LootManager> lootManager;
@Inject
private Provider<ChatboxPanelManager> chatboxPanelManager;
@Inject @Inject
@Nullable @Nullable
private Client client; private Client client;
@@ -351,28 +307,11 @@ public class RuneLite
// Close the splash screen // Close the splash screen
splashScreen.close(); splashScreen.close();
// Register event listeners
eventBus.register(clientUI);
eventBus.register(pluginManager);
eventBus.register(overlayManager);
eventBus.register(drawManager);
eventBus.register(infoBoxManager);
eventBus.register(partyService);
if (!isOutdated) if (!isOutdated)
{ {
// Initialize chat colors // Initialize chat colors
chatMessageManager.get().loadColors(); chatMessageManager.get().loadColors();
eventBus.register(overlayRenderer.get());
eventBus.register(clanManager.get());
eventBus.register(itemManager.get());
eventBus.register(menuManager.get());
eventBus.register(chatMessageManager.get());
eventBus.register(commandManager.get());
eventBus.register(lootManager.get());
eventBus.register(chatboxPanelManager.get());
// Add core overlays // Add core overlays
WidgetOverlay.createOverlays(client).forEach(overlayManager::add); WidgetOverlay.createOverlays(client).forEach(overlayManager::add);
overlayManager.add(infoBoxOverlay.get()); overlayManager.add(infoBoxOverlay.get());

View File

@@ -42,6 +42,7 @@ import net.runelite.client.config.ConfigManager;
import net.runelite.client.config.RuneLiteConfig; import net.runelite.client.config.RuneLiteConfig;
import net.runelite.client.config.RuneLitePlusConfig; import net.runelite.client.config.RuneLitePlusConfig;
import net.runelite.client.eventbus.EventBus; import net.runelite.client.eventbus.EventBus;
import net.runelite.client.eventbus.EventBusImplementation;
import net.runelite.client.game.ItemManager; import net.runelite.client.game.ItemManager;
import net.runelite.client.menus.MenuManager; import net.runelite.client.menus.MenuManager;
import net.runelite.client.plugins.PluginManager; import net.runelite.client.plugins.PluginManager;
@@ -84,7 +85,7 @@ public class RuneLiteModule extends AbstractModule
bind(Callbacks.class).to(Hooks.class); bind(Callbacks.class).to(Hooks.class);
bind(EventBus.class) bind(EventBus.class)
.toInstance(new EventBus()); .toInstance(new EventBusImplementation());
bind(EventBus.class) bind(EventBus.class)
.annotatedWith(Names.named("Deferred EventBus")) .annotatedWith(Names.named("Deferred EventBus"))

View File

@@ -25,6 +25,7 @@
package net.runelite.client.account; package net.runelite.client.account;
import com.google.gson.Gson; import com.google.gson.Gson;
import io.reactivex.disposables.Disposable;
import java.io.File; import java.io.File;
import java.io.FileInputStream; import java.io.FileInputStream;
import java.io.FileWriter; import java.io.FileWriter;
@@ -39,7 +40,7 @@ import lombok.extern.slf4j.Slf4j;
import net.runelite.client.RuneLite; import net.runelite.client.RuneLite;
import net.runelite.client.config.ConfigManager; import net.runelite.client.config.ConfigManager;
import net.runelite.client.eventbus.EventBus; import net.runelite.client.eventbus.EventBus;
import net.runelite.client.eventbus.Subscribe; import net.runelite.client.eventbus.EventBusImplementation;
import net.runelite.client.events.SessionClose; import net.runelite.client.events.SessionClose;
import net.runelite.client.events.SessionOpen; import net.runelite.client.events.SessionOpen;
import net.runelite.client.util.LinkBrowser; import net.runelite.client.util.LinkBrowser;
@@ -57,17 +58,20 @@ public class SessionManager
@Getter @Getter
private AccountSession accountSession; private AccountSession accountSession;
private final EventBus eventBus; private final EventBusImplementation eventBus;
private final ConfigManager configManager; private final ConfigManager configManager;
private final WSClient wsClient; private final WSClient wsClient;
@Inject @Inject
private SessionManager(ConfigManager configManager, EventBus eventBus, WSClient wsClient) private SessionManager(ConfigManager configManager, EventBusImplementation eventBus, WSClient wsClient)
{ {
this.configManager = configManager; this.configManager = configManager;
this.eventBus = eventBus; this.eventBus = eventBus;
this.wsClient = wsClient; this.wsClient = wsClient;
eventBus.register(this);
this.eventBus
.observableOfType(LoginResponse.class)
.subscribe(this::onLoginResponse);
} }
public void loadSession() public void loadSession()
@@ -207,8 +211,7 @@ public class SessionManager
LinkBrowser.browse(login.getOauthUrl()); LinkBrowser.browse(login.getOauthUrl());
} }
@Subscribe private void onLoginResponse(LoginResponse loginResponse)
public void onLoginResponse(LoginResponse loginResponse)
{ {
log.debug("Now logged in as {}", loginResponse.getUsername()); log.debug("Now logged in as {}", loginResponse.getUsername());

View File

@@ -60,6 +60,7 @@ import net.runelite.client.Notifier;
import net.runelite.client.RuneLite; import net.runelite.client.RuneLite;
import net.runelite.client.chat.ChatMessageManager; import net.runelite.client.chat.ChatMessageManager;
import net.runelite.client.eventbus.EventBus; import net.runelite.client.eventbus.EventBus;
import net.runelite.client.eventbus.EventBusImplementation;
import net.runelite.client.input.KeyManager; import net.runelite.client.input.KeyManager;
import net.runelite.client.input.MouseManager; import net.runelite.client.input.MouseManager;
import net.runelite.client.task.Scheduler; import net.runelite.client.task.Scheduler;
@@ -88,7 +89,7 @@ public class Hooks implements Callbacks
private static final OverlayManager overlayManager = injector.getInstance(OverlayManager.class); private static final OverlayManager overlayManager = injector.getInstance(OverlayManager.class);
@Inject @Inject
private EventBus eventBus; private EventBusImplementation eventBus;
@Inject @Inject
private DeferredEventBus deferredEventBus; private DeferredEventBus deferredEventBus;

View File

@@ -35,7 +35,7 @@ import net.runelite.api.Client;
import net.runelite.api.GameState; import net.runelite.api.GameState;
import net.runelite.api.events.ChatMessage; import net.runelite.api.events.ChatMessage;
import net.runelite.client.eventbus.EventBus; import net.runelite.client.eventbus.EventBus;
import net.runelite.client.eventbus.Subscribe; import net.runelite.client.eventbus.EventBusImplementation;
import net.runelite.client.events.ChatInput; import net.runelite.client.events.ChatInput;
import net.runelite.client.events.ChatboxInput; import net.runelite.client.events.ChatboxInput;
import net.runelite.client.events.PrivateMessageInput; import net.runelite.client.events.PrivateMessageInput;
@@ -49,12 +49,15 @@ public class ChatCommandManager implements ChatboxInputListener
private final ScheduledExecutorService scheduledExecutorService; private final ScheduledExecutorService scheduledExecutorService;
@Inject @Inject
private ChatCommandManager(EventBus eventBus, CommandManager commandManager, Client client, ScheduledExecutorService scheduledExecutorService) private ChatCommandManager(EventBusImplementation eventBus, CommandManager commandManager, Client client, ScheduledExecutorService scheduledExecutorService)
{ {
this.client = client; this.client = client;
this.scheduledExecutorService = scheduledExecutorService; this.scheduledExecutorService = scheduledExecutorService;
eventBus.register(this); // eventBus.register(this);
commandManager.register(this); commandManager.register(this);
eventBus.observableOfType(ChatMessage.class)
.subscribe(this::onChatMessage);
} }
public void registerCommand(String command, BiConsumer<ChatMessage, String> execute) public void registerCommand(String command, BiConsumer<ChatMessage, String> execute)
@@ -82,8 +85,7 @@ public class ChatCommandManager implements ChatboxInputListener
commands.remove(command.toLowerCase()); commands.remove(command.toLowerCase());
} }
@Subscribe private void onChatMessage(ChatMessage chatMessage)
public void onChatMessage(ChatMessage chatMessage)
{ {
if (client.getGameState() != GameState.LOGGED_IN) if (client.getGameState() != GameState.LOGGED_IN)
{ {

View File

@@ -52,7 +52,7 @@ import net.runelite.api.events.ScriptCallbackEvent;
import net.runelite.api.events.VarbitChanged; import net.runelite.api.events.VarbitChanged;
import net.runelite.client.callback.ClientThread; import net.runelite.client.callback.ClientThread;
import net.runelite.client.config.ChatColorConfig; import net.runelite.client.config.ChatColorConfig;
import net.runelite.client.eventbus.Subscribe; import net.runelite.client.eventbus.EventBusImplementation;
import net.runelite.client.ui.JagexColors; import net.runelite.client.ui.JagexColors;
import net.runelite.client.util.ColorUtil; import net.runelite.client.util.ColorUtil;
@@ -70,17 +70,32 @@ public class ChatMessageManager
@Inject @Inject
private ChatMessageManager( private ChatMessageManager(
Client client, final Client client,
ChatColorConfig chatColorConfig, final ChatColorConfig chatColorConfig,
ClientThread clientThread) final ClientThread clientThread,
final EventBusImplementation eventbus)
{ {
this.client = client; this.client = client;
this.chatColorConfig = chatColorConfig; this.chatColorConfig = chatColorConfig;
this.clientThread = clientThread; this.clientThread = clientThread;
eventbus.observableOfType(VarbitChanged.class)
.subscribe(this::onVarbitChanged);
eventbus.observableOfType(ResizeableChanged.class)
.subscribe(this::onResizeableChanged);
eventbus.observableOfType(ConfigChanged.class)
.subscribe(this::onConfigChanged);
eventbus.observableOfType(ChatMessage.class)
.subscribe(this::onChatMessage);
eventbus.observableOfType(ScriptCallbackEvent.class)
.subscribe(this::onScriptCallbackEvent);
} }
@Subscribe private void onVarbitChanged(VarbitChanged event)
public void onVarbitChanged(VarbitChanged event)
{ {
int setting = client.getVar(Varbits.TRANSPARENT_CHATBOX); int setting = client.getVar(Varbits.TRANSPARENT_CHATBOX);
@@ -91,14 +106,12 @@ public class ChatMessageManager
} }
} }
@Subscribe private void onResizeableChanged(ResizeableChanged event)
public void onResizeableChanged(ResizeableChanged event)
{ {
refreshAll(); refreshAll();
} }
@Subscribe private void onConfigChanged(ConfigChanged event)
public void onConfigChanged(ConfigChanged event)
{ {
if (event.getGroup().equals("textrecolor")) if (event.getGroup().equals("textrecolor"))
{ {
@@ -107,8 +120,7 @@ public class ChatMessageManager
} }
} }
@Subscribe private void onChatMessage(ChatMessage chatMessage)
public void onChatMessage(ChatMessage chatMessage)
{ {
MessageNode messageNode = chatMessage.getMessageNode(); MessageNode messageNode = chatMessage.getMessageNode();
ChatMessageType chatMessageType = chatMessage.getType(); ChatMessageType chatMessageType = chatMessage.getType();
@@ -173,8 +185,7 @@ public class ChatMessageManager
} }
} }
@Subscribe private void onScriptCallbackEvent(ScriptCallbackEvent scriptCallbackEvent)
public void onScriptCallbackEvent(ScriptCallbackEvent scriptCallbackEvent)
{ {
final String eventName = scriptCallbackEvent.getEventName(); final String eventName = scriptCallbackEvent.getEventName();

View File

@@ -37,8 +37,7 @@ import net.runelite.api.VarClientStr;
import net.runelite.api.events.CommandExecuted; import net.runelite.api.events.CommandExecuted;
import net.runelite.api.events.ScriptCallbackEvent; import net.runelite.api.events.ScriptCallbackEvent;
import net.runelite.client.callback.ClientThread; import net.runelite.client.callback.ClientThread;
import net.runelite.client.eventbus.EventBus; import net.runelite.client.eventbus.EventBusImplementation;
import net.runelite.client.eventbus.Subscribe;
import net.runelite.client.events.ChatboxInput; import net.runelite.client.events.ChatboxInput;
import net.runelite.client.events.PrivateMessageInput; import net.runelite.client.events.PrivateMessageInput;
@@ -51,18 +50,25 @@ public class CommandManager
private static final String PRIVMATE_MESSAGE = "privateMessage"; private static final String PRIVMATE_MESSAGE = "privateMessage";
private final Client client; private final Client client;
private final EventBus eventBus; private final EventBusImplementation eventBus;
private final ClientThread clientThread; private final ClientThread clientThread;
private boolean sending; private boolean sending;
private final List<ChatboxInputListener> chatboxInputListenerList = new ArrayList<>(); private final List<ChatboxInputListener> chatboxInputListenerList = new ArrayList<>();
@Inject @Inject
private CommandManager(Client client, EventBus eventBus, ClientThread clientThread) private CommandManager(
final Client client,
final EventBusImplementation eventBus,
final ClientThread clientThread
)
{ {
this.client = client; this.client = client;
this.eventBus = eventBus; this.eventBus = eventBus;
this.clientThread = clientThread; this.clientThread = clientThread;
eventBus.observableOfType(ScriptCallbackEvent.class)
.subscribe(this::onScriptCallbackEvent);
} }
public void register(ChatboxInputListener chatboxInputListener) public void register(ChatboxInputListener chatboxInputListener)
@@ -75,7 +81,6 @@ public class CommandManager
chatboxInputListenerList.remove(chatboxInputListener); chatboxInputListenerList.remove(chatboxInputListener);
} }
@Subscribe
private void onScriptCallbackEvent(ScriptCallbackEvent event) private void onScriptCallbackEvent(ScriptCallbackEvent event)
{ {
if (sending) if (sending)

View File

@@ -66,6 +66,7 @@ import net.runelite.api.events.ConfigChanged;
import net.runelite.client.RuneLite; import net.runelite.client.RuneLite;
import static net.runelite.client.RuneLite.PROFILES_DIR; import static net.runelite.client.RuneLite.PROFILES_DIR;
import net.runelite.client.eventbus.EventBus; import net.runelite.client.eventbus.EventBus;
import net.runelite.client.eventbus.EventBusImplementation;
import net.runelite.client.util.ColorUtil; import net.runelite.client.util.ColorUtil;
import net.runelite.client.ui.FontManager; import net.runelite.client.ui.FontManager;
@@ -79,7 +80,7 @@ public class ConfigManager
private static final File STANDARD_SETTINGS_FILE = new File(RuneLite.RUNELITE_DIR, STANDARD_SETTINGS_FILE_NAME); private static final File STANDARD_SETTINGS_FILE = new File(RuneLite.RUNELITE_DIR, STANDARD_SETTINGS_FILE_NAME);
@Inject @Inject
EventBus eventBus; EventBusImplementation eventBus;
private final ConfigInvocationHandler handler = new ConfigInvocationHandler(this); private final ConfigInvocationHandler handler = new ConfigInvocationHandler(this);
private final Properties properties = new Properties(); private final Properties properties = new Properties();

View File

@@ -39,6 +39,7 @@ import net.runelite.client.discord.events.DiscordJoinRequest;
import net.runelite.client.discord.events.DiscordReady; import net.runelite.client.discord.events.DiscordReady;
import net.runelite.client.discord.events.DiscordSpectateGame; import net.runelite.client.discord.events.DiscordSpectateGame;
import net.runelite.client.eventbus.EventBus; import net.runelite.client.eventbus.EventBus;
import net.runelite.client.eventbus.EventBusImplementation;
import net.runelite.discord.DiscordEventHandlers; import net.runelite.discord.DiscordEventHandlers;
import net.runelite.discord.DiscordRPC; import net.runelite.discord.DiscordRPC;
import net.runelite.discord.DiscordRichPresence; import net.runelite.discord.DiscordRichPresence;
@@ -48,7 +49,7 @@ import net.runelite.discord.DiscordUser;
@Slf4j @Slf4j
public class DiscordService implements AutoCloseable public class DiscordService implements AutoCloseable
{ {
private final EventBus eventBus; private final EventBusImplementation eventBus;
private final RuneLiteProperties runeLiteProperties; private final RuneLiteProperties runeLiteProperties;
private final ScheduledExecutorService executorService; private final ScheduledExecutorService executorService;
private final DiscordRPC discordRPC; private final DiscordRPC discordRPC;
@@ -61,7 +62,7 @@ public class DiscordService implements AutoCloseable
@Inject @Inject
private DiscordService( private DiscordService(
final EventBus eventBus, final EventBusImplementation eventBus,
final RuneLiteProperties runeLiteProperties, final RuneLiteProperties runeLiteProperties,
final ScheduledExecutorService executorService) final ScheduledExecutorService executorService)
{ {

View File

@@ -25,225 +25,14 @@
*/ */
package net.runelite.client.eventbus; package net.runelite.client.eventbus;
import com.google.common.base.Preconditions; import io.reactivex.Observable;
import com.google.common.collect.HashMultimap; import java.util.List;
import com.google.common.collect.ImmutableMultimap;
import com.google.common.collect.Multimap;
import java.lang.invoke.CallSite;
import java.lang.invoke.LambdaMetafactory;
import java.lang.invoke.MethodHandle;
import java.lang.invoke.MethodHandles;
import java.lang.invoke.MethodType;
import java.lang.reflect.Field;
import java.lang.reflect.InvocationTargetException;
import java.lang.reflect.Method;
import java.lang.reflect.Modifier;
import java.util.function.Consumer;
import javax.annotation.Nonnull;
import javax.annotation.concurrent.ThreadSafe;
import lombok.EqualsAndHashCode;
import lombok.RequiredArgsConstructor;
import lombok.Value;
import lombok.extern.slf4j.Slf4j;
@Slf4j public interface EventBus
@RequiredArgsConstructor
@ThreadSafe
public class EventBus
{ {
@FunctionalInterface void post(Object event);
public interface SubscriberMethod
{
void invoke(Object event);
}
@Value <T> Observable<T> observableOfType(Class<T> eventClass);
private static class Subscriber
{
private final Object object;
private final Method method;
@EqualsAndHashCode.Exclude
private final SubscriberMethod lamda;
void invoke(final Object arg) throws Exception <T> Observable<Object> observableOfTypes(List<Class<T>> eventClasses);
{
if (lamda != null)
{
lamda.invoke(arg);
}
else
{
method.invoke(object, arg);
}
}
}
private final Consumer<Throwable> exceptionHandler;
private ImmutableMultimap<Class, Subscriber> subscribers = ImmutableMultimap.of();
/**
* Instantiates EventBus with default exception handler
*/
public EventBus()
{
this((e) -> log.warn("Uncaught exception in event subscriber", e));
}
/**
* Registers subscriber to EventBus. All methods in subscriber and it's parent classes are checked for
* {@link Subscribe} annotation and then added to map of subscriptions.
*
* @param object subscriber to register
* @throws IllegalArgumentException in case subscriber method name is wrong (correct format is 'on' + EventName
*/
public synchronized void register(@Nonnull final Object object)
{
final ImmutableMultimap.Builder<Class, Subscriber> builder = ImmutableMultimap.builder();
if (subscribers != null)
{
builder.putAll(subscribers);
}
for (Class<?> clazz = object.getClass(); clazz != null; clazz = clazz.getSuperclass())
{
for (final Method method : clazz.getDeclaredMethods())
{
final Subscribe sub = method.getAnnotation(Subscribe.class);
if (sub == null)
{
continue;
}
Preconditions.checkArgument(method.getReturnType() == Void.TYPE, "@Subscribed method \"" + method + "\" cannot return a value");
Preconditions.checkArgument(method.getParameterCount() == 1, "@Subscribed method \"" + method + "\" must take exactly 1 argument");
Preconditions.checkArgument(!Modifier.isStatic(method.getModifiers()), "@Subscribed method \"" + method + "\" cannot be static");
final Class<?> parameterClazz = method.getParameterTypes()[0];
Preconditions.checkArgument(!parameterClazz.isPrimitive(), "@Subscribed method \"" + method + "\" cannot subscribe to primitives");
Preconditions.checkArgument((parameterClazz.getModifiers() & (Modifier.ABSTRACT | Modifier.INTERFACE)) == 0, "@Subscribed method \"" + method + "\" cannot subscribe to polymorphic classes");
for (Class<?> psc = parameterClazz.getSuperclass(); psc != null; psc = psc.getSuperclass())
{
if (subscribers.containsKey(psc))
{
throw new IllegalArgumentException("@Subscribed method \"" + method + "\" cannot subscribe to class which inherits from subscribed class \"" + psc + "\"");
}
}
final String preferredName = "on" + parameterClazz.getSimpleName();
Preconditions.checkArgument(method.getName().equals(preferredName), "Subscribed method " + method + " should be named " + preferredName);
method.setAccessible(true);
SubscriberMethod lambda = null;
try
{
final MethodHandles.Lookup caller = privateLookupIn(clazz);
final MethodType subscription = MethodType.methodType(void.class, parameterClazz);
final MethodHandle target = caller.findVirtual(clazz, method.getName(), subscription);
final CallSite site = LambdaMetafactory.metafactory(
caller,
"invoke",
MethodType.methodType(SubscriberMethod.class, clazz),
subscription.changeParameterType(0, Object.class),
target,
subscription);
final MethodHandle factory = site.getTarget();
lambda = (SubscriberMethod) factory.bindTo(object).invokeExact();
}
catch (Throwable e)
{
log.warn("Unable to create lambda for method {}", method, e);
}
final Subscriber subscriber = new Subscriber(object, method, lambda);
builder.put(parameterClazz, subscriber);
log.debug("Registering {} - {}", parameterClazz, subscriber);
}
}
subscribers = builder.build();
}
/**
* Unregisters all subscribed methods from provided subscriber object.
*
* @param object object to unsubscribe from
*/
public synchronized void unregister(@Nonnull final Object object)
{
if (subscribers == null)
{
return;
}
final Multimap<Class, Subscriber> map = HashMultimap.create();
map.putAll(subscribers);
for (Class<?> clazz = object.getClass(); clazz != null; clazz = clazz.getSuperclass())
{
for (final Method method : clazz.getDeclaredMethods())
{
final Subscribe sub = method.getAnnotation(Subscribe.class);
if (sub == null)
{
continue;
}
final Class<?> parameterClazz = method.getParameterTypes()[0];
map.remove(parameterClazz, new Subscriber(object, method, null));
}
}
subscribers = ImmutableMultimap.copyOf(map);
}
/**
* Posts provided event to all registered subscribers. Subscriber calls are invoked immediately and in order
* in which subscribers were registered.
*
* @param event event to post
*/
public void post(@Nonnull final Object event)
{
for (final Subscriber subscriber : subscribers.get(event.getClass()))
{
try
{
subscriber.invoke(event);
}
catch (Exception e)
{
exceptionHandler.accept(e);
}
}
}
private static MethodHandles.Lookup privateLookupIn(Class clazz) throws IllegalAccessException, NoSuchFieldException, InvocationTargetException
{
try
{
// Java 9+ has privateLookupIn method on MethodHandles, but since we are shipping and using Java 8
// we need to access it via reflection. This is preferred way because it's Java 9+ public api and is
// likely to not change
final Method privateLookupIn = MethodHandles.class.getMethod("privateLookupIn", Class.class, MethodHandles.Lookup.class);
return (MethodHandles.Lookup) privateLookupIn.invoke(null, clazz, MethodHandles.lookup());
}
catch (NoSuchMethodException e)
{
// In Java 8 we first do standard lookupIn class
final MethodHandles.Lookup lookupIn = MethodHandles.lookup().in(clazz);
// and then we mark it as trusted for private lookup via reflection on private field
final Field modes = MethodHandles.Lookup.class.getDeclaredField("allowedModes");
modes.setAccessible(true);
modes.setInt(lookupIn, -1); // -1 == TRUSTED
return lookupIn;
}
}
} }

View File

@@ -0,0 +1,50 @@
package net.runelite.client.eventbus;
import com.jakewharton.rxrelay2.PublishRelay;
import com.jakewharton.rxrelay2.Relay;
import io.reactivex.Observable;
import java.util.List;
import java.util.Objects;
import javax.inject.Singleton;
@Singleton
public class EventBusImplementation implements EventBus
{
private final Relay<Object> bus = PublishRelay.create().toSerialized();
@Override
public void post(Object event)
{
if (this.bus.hasObservers())
{
this.bus.accept(event);
}
}
@Override
public <T> Observable<T> observableOfType(Class<T> eventClass)
{
return this.bus
.filter(Objects::nonNull) // Filter out null objects, better safe than sorry
.filter(eventClass::isInstance) // We're only interested in a specific event class
.cast(eventClass); // Cast it for easier usage
}
@Override
public <T> Observable<Object> observableOfTypes(List<Class<T>> eventClasses)
{
return this.bus
.filter(Objects::nonNull) // Filter out null objects, better safe than sorry
.filter(event -> {
for (Class eventClass : eventClasses)
{
if (eventClass.isInstance(event))
{
return true;
}
}
return false;
}); // We're only interested in a specific event classes
}
}

View File

@@ -1,41 +0,0 @@
/*
* Copyright (c) 2018, Abex
* 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.eventbus;
import java.lang.annotation.Documented;
import java.lang.annotation.ElementType;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;
/**
* Marks a method as an event subscriber.
*/
@Retention(RetentionPolicy.RUNTIME)
@Target(ElementType.METHOD)
@Documented
public @interface Subscribe
{
}

View File

@@ -44,7 +44,7 @@ import net.runelite.api.IndexedSprite;
import net.runelite.api.SpriteID; import net.runelite.api.SpriteID;
import net.runelite.api.events.ClanChanged; import net.runelite.api.events.ClanChanged;
import net.runelite.api.events.GameStateChanged; import net.runelite.api.events.GameStateChanged;
import net.runelite.client.eventbus.Subscribe; import net.runelite.client.eventbus.EventBusImplementation;
import net.runelite.client.util.ImageUtil; import net.runelite.client.util.ImageUtil;
import net.runelite.client.util.Text; import net.runelite.client.util.Text;
@@ -97,10 +97,20 @@ public class ClanManager
private int modIconsLength; private int modIconsLength;
@Inject @Inject
private ClanManager(Client client, SpriteManager spriteManager) private ClanManager(
final Client client,
final SpriteManager spriteManager,
final EventBusImplementation eventbus
)
{ {
this.client = client; this.client = client;
this.spriteManager = spriteManager; this.spriteManager = spriteManager;
eventbus.observableOfType(GameStateChanged.class)
.subscribe(this::onGameStateChanged);
eventbus.observableOfType(ClanChanged.class)
.subscribe(this::onClanChanged);
} }
public ClanMemberRank getRank(String playerName) public ClanMemberRank getRank(String playerName)
@@ -123,8 +133,7 @@ public class ClanManager
return modIconsLength - CLANCHAT_IMAGES.length + clanMemberRank.ordinal() - 1; return modIconsLength - CLANCHAT_IMAGES.length + clanMemberRank.ordinal() - 1;
} }
@Subscribe private void onGameStateChanged(GameStateChanged gameStateChanged)
public void onGameStateChanged(GameStateChanged gameStateChanged)
{ {
if (gameStateChanged.getGameState() == GameState.LOGGED_IN if (gameStateChanged.getGameState() == GameState.LOGGED_IN
&& modIconsLength == 0) && modIconsLength == 0)
@@ -133,8 +142,7 @@ public class ClanManager
} }
} }
@Subscribe private void onClanChanged(ClanChanged clanChanged)
public void onClanChanged(ClanChanged clanChanged)
{ {
clanRanksCache.invalidateAll(); clanRanksCache.invalidateAll();
} }

View File

@@ -164,7 +164,7 @@ import net.runelite.api.Sprite;
import net.runelite.api.events.GameStateChanged; import net.runelite.api.events.GameStateChanged;
import net.runelite.api.events.PostItemDefinition; import net.runelite.api.events.PostItemDefinition;
import net.runelite.client.callback.ClientThread; import net.runelite.client.callback.ClientThread;
import net.runelite.client.eventbus.Subscribe; import net.runelite.client.eventbus.EventBusImplementation;
import net.runelite.http.api.item.ItemClient; import net.runelite.http.api.item.ItemClient;
import net.runelite.http.api.item.ItemPrice; import net.runelite.http.api.item.ItemPrice;
import net.runelite.http.api.item.ItemStats; import net.runelite.http.api.item.ItemStats;
@@ -265,7 +265,12 @@ public class ItemManager
build(); build();
@Inject @Inject
public ItemManager(Client client, ScheduledExecutorService executor, ClientThread clientThread) public ItemManager(
Client client,
ScheduledExecutorService executor,
ClientThread clientThread,
EventBusImplementation eventbus
)
{ {
this.client = client; this.client = client;
this.scheduledExecutorService = executor; this.scheduledExecutorService = executor;
@@ -309,6 +314,12 @@ public class ItemManager
return loadItemOutline(key.itemId, key.itemQuantity, key.outlineColor); return loadItemOutline(key.itemId, key.itemQuantity, key.outlineColor);
} }
}); });
eventbus.observableOfType(GameStateChanged.class)
.subscribe(this::onGameStateChanged);
eventbus.observableOfType(PostItemDefinition.class)
.subscribe(this::onPostItemDefinition);
} }
private void loadPrices() private void loadPrices()
@@ -352,9 +363,7 @@ public class ItemManager
} }
} }
private void onGameStateChanged(final GameStateChanged event)
@Subscribe
public void onGameStateChanged(final GameStateChanged event)
{ {
if (event.getGameState() == GameState.HOPPING || event.getGameState() == GameState.LOGIN_SCREEN) if (event.getGameState() == GameState.HOPPING || event.getGameState() == GameState.LOGIN_SCREEN)
{ {
@@ -362,8 +371,7 @@ public class ItemManager
} }
} }
@Subscribe private void onPostItemDefinition(PostItemDefinition event)
public void onPostItemDefinition(PostItemDefinition event)
{ {
itemDefinitions.put(event.getItemDefinition().getId(), event.getItemDefinition()); itemDefinitions.put(event.getItemDefinition().getId(), event.getItemDefinition());
} }

View File

@@ -53,8 +53,7 @@ import net.runelite.api.events.ItemQuantityChanged;
import net.runelite.api.events.ItemSpawned; import net.runelite.api.events.ItemSpawned;
import net.runelite.api.events.NpcDespawned; import net.runelite.api.events.NpcDespawned;
import net.runelite.api.events.PlayerDespawned; import net.runelite.api.events.PlayerDespawned;
import net.runelite.client.eventbus.EventBus; import net.runelite.client.eventbus.EventBusImplementation;
import net.runelite.client.eventbus.Subscribe;
import net.runelite.client.events.NpcLootReceived; import net.runelite.client.events.NpcLootReceived;
import net.runelite.client.events.PlayerLootReceived; import net.runelite.client.events.PlayerLootReceived;
@@ -66,7 +65,7 @@ public class LootManager
NpcID.CAVE_KRAKEN, AnimationID.CAVE_KRAKEN_DEATH NpcID.CAVE_KRAKEN, AnimationID.CAVE_KRAKEN_DEATH
); );
private final EventBus eventBus; private final EventBusImplementation eventBus;
private final Client client; private final Client client;
private final ListMultimap<Integer, ItemStack> itemSpawns = ArrayListMultimap.create(); private final ListMultimap<Integer, ItemStack> itemSpawns = ArrayListMultimap.create();
private final Set<LocalPoint> killPoints = new HashSet<>(); private final Set<LocalPoint> killPoints = new HashSet<>();
@@ -74,14 +73,37 @@ public class LootManager
private WorldPoint krakenPlayerLocation; private WorldPoint krakenPlayerLocation;
@Inject @Inject
private LootManager(EventBus eventBus, Client client) private LootManager(
final EventBusImplementation eventBus,
final Client client
)
{ {
this.eventBus = eventBus; this.eventBus = eventBus;
this.client = client; this.client = client;
eventBus.observableOfType(GameTick.class)
.subscribe(this::onGameTick);
eventBus.observableOfType(NpcDespawned.class)
.subscribe(this::onNpcDespawned);
eventBus.observableOfType(PlayerDespawned.class)
.subscribe(this::onPlayerDespawned);
eventBus.observableOfType(ItemSpawned.class)
.subscribe(this::onItemSpawned);
eventBus.observableOfType(ItemDespawned.class)
.subscribe(this::onItemDespawned);
eventBus.observableOfType(ItemQuantityChanged.class)
.subscribe(this::onItemQuantityChanged);
eventBus.observableOfType(AnimationChanged.class)
.subscribe(this::onAnimationChanged);
} }
@Subscribe private void onNpcDespawned(NpcDespawned npcDespawned)
public void onNpcDespawned(NpcDespawned npcDespawned)
{ {
final NPC npc = npcDespawned.getNpc(); final NPC npc = npcDespawned.getNpc();
if (!npc.isDead()) if (!npc.isDead())
@@ -123,8 +145,7 @@ public class LootManager
processNpcLoot(npc); processNpcLoot(npc);
} }
@Subscribe private void onPlayerDespawned(PlayerDespawned playerDespawned)
public void onPlayerDespawned(PlayerDespawned playerDespawned)
{ {
final Player player = playerDespawned.getPlayer(); final Player player = playerDespawned.getPlayer();
// Only care about dead Players // Only care about dead Players
@@ -153,8 +174,7 @@ public class LootManager
eventBus.post(new PlayerLootReceived(player, items)); eventBus.post(new PlayerLootReceived(player, items));
} }
@Subscribe private void onItemSpawned(ItemSpawned itemSpawned)
public void onItemSpawned(ItemSpawned itemSpawned)
{ {
final Item item = itemSpawned.getItem(); final Item item = itemSpawned.getItem();
final Tile tile = itemSpawned.getTile(); final Tile tile = itemSpawned.getTile();
@@ -164,16 +184,14 @@ public class LootManager
log.debug("Item spawn {} ({}) location {},{}", item.getId(), item.getQuantity(), location); log.debug("Item spawn {} ({}) location {},{}", item.getId(), item.getQuantity(), location);
} }
@Subscribe private void onItemDespawned(ItemDespawned itemDespawned)
public void onItemDespawned(ItemDespawned itemDespawned)
{ {
final Item item = itemDespawned.getItem(); final Item item = itemDespawned.getItem();
final LocalPoint location = itemDespawned.getTile().getLocalLocation(); final LocalPoint location = itemDespawned.getTile().getLocalLocation();
log.debug("Item despawn {} ({}) location {},{}", item.getId(), item.getQuantity(), location); log.debug("Item despawn {} ({}) location {},{}", item.getId(), item.getQuantity(), location);
} }
@Subscribe private void onItemQuantityChanged(ItemQuantityChanged itemQuantityChanged)
public void onItemQuantityChanged(ItemQuantityChanged itemQuantityChanged)
{ {
final Item item = itemQuantityChanged.getItem(); final Item item = itemQuantityChanged.getItem();
final Tile tile = itemQuantityChanged.getTile(); final Tile tile = itemQuantityChanged.getTile();
@@ -189,8 +207,7 @@ public class LootManager
itemSpawns.put(packed, new ItemStack(item.getId(), diff, location)); itemSpawns.put(packed, new ItemStack(item.getId(), diff, location));
} }
@Subscribe private void onAnimationChanged(AnimationChanged e)
public void onAnimationChanged(AnimationChanged e)
{ {
if (!(e.getActor() instanceof NPC)) if (!(e.getActor() instanceof NPC))
{ {
@@ -219,8 +236,7 @@ public class LootManager
} }
} }
@Subscribe private void onGameTick(GameTick gameTick)
public void onGameTick(GameTick gameTick)
{ {
playerLocationLastTick = client.getLocalPlayer().getWorldLocation(); playerLocationLastTick = client.getLocalPlayer().getWorldLocation();
itemSpawns.clear(); itemSpawns.clear();

View File

@@ -40,8 +40,7 @@ import net.runelite.api.widgets.JavaScriptCallback;
import net.runelite.api.widgets.Widget; import net.runelite.api.widgets.Widget;
import net.runelite.api.widgets.WidgetInfo; import net.runelite.api.widgets.WidgetInfo;
import net.runelite.client.callback.ClientThread; import net.runelite.client.callback.ClientThread;
import net.runelite.client.eventbus.EventBus; import net.runelite.client.eventbus.EventBusImplementation;
import net.runelite.client.eventbus.Subscribe;
import net.runelite.client.input.KeyListener; import net.runelite.client.input.KeyListener;
import net.runelite.client.input.KeyManager; import net.runelite.client.input.KeyManager;
import net.runelite.client.input.MouseListener; import net.runelite.client.input.MouseListener;
@@ -54,7 +53,7 @@ public class ChatboxPanelManager
{ {
private final Client client; private final Client client;
private final ClientThread clientThread; private final ClientThread clientThread;
private final EventBus eventBus; private final EventBusImplementation eventBus;
private final KeyManager keyManager; private final KeyManager keyManager;
private final MouseManager mouseManager; private final MouseManager mouseManager;
@@ -66,7 +65,7 @@ public class ChatboxPanelManager
private ChatboxInput currentInput = null; private ChatboxInput currentInput = null;
@Inject @Inject
private ChatboxPanelManager(EventBus eventBus, Client client, ClientThread clientThread, private ChatboxPanelManager(EventBusImplementation eventBus, Client client, ClientThread clientThread,
KeyManager keyManager, MouseManager mouseManager, KeyManager keyManager, MouseManager mouseManager,
Provider<ChatboxTextMenuInput> chatboxTextMenuInputProvider, Provider<ChatboxTextInput> chatboxTextInputProvider) Provider<ChatboxTextMenuInput> chatboxTextMenuInputProvider, Provider<ChatboxTextInput> chatboxTextInputProvider)
{ {
@@ -79,6 +78,12 @@ public class ChatboxPanelManager
this.chatboxTextMenuInputProvider = chatboxTextMenuInputProvider; this.chatboxTextMenuInputProvider = chatboxTextMenuInputProvider;
this.chatboxTextInputProvider = chatboxTextInputProvider; this.chatboxTextInputProvider = chatboxTextInputProvider;
eventBus.observableOfType(ScriptCallbackEvent.class)
.subscribe(this::onScriptCallbackEvent);
eventBus.observableOfType(GameStateChanged.class)
.subscribe(this::onGameStateChanged);
} }
public void close() public void close()
@@ -103,7 +108,7 @@ public class ChatboxPanelManager
{ {
client.runScript(ScriptID.CLEAR_CHATBOX_PANEL); client.runScript(ScriptID.CLEAR_CHATBOX_PANEL);
eventBus.register(input); // eventBus.register(input);
if (input instanceof KeyListener) if (input instanceof KeyListener)
{ {
keyManager.registerKeyListener((KeyListener) input); keyManager.registerKeyListener((KeyListener) input);
@@ -150,8 +155,7 @@ public class ChatboxPanelManager
.prompt(prompt); .prompt(prompt);
} }
@Subscribe private void onScriptCallbackEvent(ScriptCallbackEvent ev)
public void onScriptCallbackEvent(ScriptCallbackEvent ev)
{ {
if (currentInput != null && "resetChatboxInput".equals(ev.getEventName())) if (currentInput != null && "resetChatboxInput".equals(ev.getEventName()))
{ {
@@ -159,7 +163,6 @@ public class ChatboxPanelManager
} }
} }
@Subscribe
private void onGameStateChanged(GameStateChanged ev) private void onGameStateChanged(GameStateChanged ev)
{ {
if (currentInput != null && ev.getGameState() == GameState.LOGIN_SCREEN) if (currentInput != null && ev.getGameState() == GameState.LOGIN_SCREEN)
@@ -179,7 +182,7 @@ public class ChatboxPanelManager
log.warn("Exception closing {}", currentInput.getClass(), e); log.warn("Exception closing {}", currentInput.getClass(), e);
} }
eventBus.unregister(currentInput); // eventBus.unregister(currentInput);
if (currentInput instanceof KeyListener) if (currentInput instanceof KeyListener)
{ {
keyManager.unregisterKeyListener((KeyListener) currentInput); keyManager.unregisterKeyListener((KeyListener) currentInput);

View File

@@ -65,8 +65,7 @@ import net.runelite.api.events.PlayerMenuOptionsChanged;
import net.runelite.api.events.WidgetMenuOptionClicked; import net.runelite.api.events.WidgetMenuOptionClicked;
import net.runelite.api.events.WidgetPressed; import net.runelite.api.events.WidgetPressed;
import net.runelite.api.widgets.WidgetInfo; import net.runelite.api.widgets.WidgetInfo;
import net.runelite.client.eventbus.EventBus; import net.runelite.client.eventbus.EventBusImplementation;
import net.runelite.client.eventbus.Subscribe;
import net.runelite.client.util.Text; import net.runelite.client.util.Text;
@Singleton @Singleton
@@ -81,7 +80,7 @@ public class MenuManager
static final Pattern LEVEL_PATTERN = Pattern.compile("\\(level-[0-9]*\\)"); static final Pattern LEVEL_PATTERN = Pattern.compile("\\(level-[0-9]*\\)");
private final Client client; private final Client client;
private final EventBus eventBus; private final EventBusImplementation eventBus;
//Maps the indexes that are being used to the menu option. //Maps the indexes that are being used to the menu option.
private final Map<Integer, String> playerMenuIndexMap = new HashMap<>(); private final Map<Integer, String> playerMenuIndexMap = new HashMap<>();
@@ -102,10 +101,31 @@ public class MenuManager
private MenuEntry firstEntry = null; private MenuEntry firstEntry = null;
@Inject @Inject
private MenuManager(Client client, EventBus eventBus) private MenuManager(Client client, EventBusImplementation eventBus)
{ {
this.client = client; this.client = client;
this.eventBus = eventBus; this.eventBus = eventBus;
eventBus.observableOfType(MenuOpened.class)
.subscribe(this::onMenuOpened);
eventBus.observableOfType(MenuEntryAdded.class)
.subscribe(this::onMenuEntryAdded);
eventBus.observableOfType(BeforeRender.class)
.subscribe(this::onBeforeRender);
eventBus.observableOfType(PlayerMenuOptionsChanged.class)
.subscribe(this::onPlayerMenuOptionsChanged);
eventBus.observableOfType(NpcActionChanged.class)
.subscribe(this::onNpcActionChanged);
eventBus.observableOfType(WidgetPressed.class)
.subscribe(this::onWidgetPressed);
eventBus.observableOfType(MenuOptionClicked.class)
.subscribe(this::onMenuOptionClicked);
} }
/** /**
@@ -145,8 +165,7 @@ public class MenuManager
return false; return false;
} }
@Subscribe private void onMenuOpened(MenuOpened event)
public void onMenuOpened(MenuOpened event)
{ {
currentPriorityEntries.clear(); currentPriorityEntries.clear();
@@ -256,8 +275,7 @@ public class MenuManager
client.setMenuEntries(arrayEntries); client.setMenuEntries(arrayEntries);
} }
@Subscribe private void onMenuEntryAdded(MenuEntryAdded event)
public void onMenuEntryAdded(MenuEntryAdded event)
{ {
int widgetId = event.getActionParam1(); int widgetId = event.getActionParam1();
Collection<WidgetMenuOption> options = managedMenuOptions.get(widgetId); Collection<WidgetMenuOption> options = managedMenuOptions.get(widgetId);
@@ -280,8 +298,7 @@ public class MenuManager
} }
} }
@Subscribe private void onBeforeRender(BeforeRender event)
public void onBeforeRender(BeforeRender event)
{ {
rebuildLeftClickMenu(); rebuildLeftClickMenu();
} }
@@ -364,8 +381,7 @@ public class MenuManager
} }
} }
@Subscribe private void onPlayerMenuOptionsChanged(PlayerMenuOptionsChanged event)
public void onPlayerMenuOptionsChanged(PlayerMenuOptionsChanged event)
{ {
int idx = event.getIndex(); int idx = event.getIndex();
@@ -389,8 +405,7 @@ public class MenuManager
addPlayerMenuItem(newIdx, menuText); addPlayerMenuItem(newIdx, menuText);
} }
@Subscribe private void onNpcActionChanged(NpcActionChanged event)
public void onNpcActionChanged(NpcActionChanged event)
{ {
NPCDefinition composition = event.getNpcDefinition(); NPCDefinition composition = event.getNpcDefinition();
for (String npcOption : npcMenuOptions) for (String npcOption : npcMenuOptions)
@@ -439,14 +454,12 @@ public class MenuManager
} }
} }
@Subscribe private void onWidgetPressed(WidgetPressed event)
public void onWidgetPressed(WidgetPressed event)
{ {
leftClickEntry = rebuildLeftClickMenu(); leftClickEntry = rebuildLeftClickMenu();
} }
@Subscribe private void onMenuOptionClicked(MenuOptionClicked event)
public void onMenuOptionClicked(MenuOptionClicked event)
{ {
if (!client.isMenuOpen() && event.isAuthentic()) if (!client.isMenuOpen() && event.isAuthentic())
{ {

View File

@@ -27,7 +27,10 @@ package net.runelite.client.plugins;
import com.google.inject.Binder; import com.google.inject.Binder;
import com.google.inject.Injector; import com.google.inject.Injector;
import com.google.inject.Module; import com.google.inject.Module;
import io.reactivex.disposables.Disposable;
import java.io.File; import java.io.File;
import java.util.ArrayList;
import java.util.List;
public abstract class Plugin implements Module public abstract class Plugin implements Module
{ {
@@ -35,6 +38,7 @@ public abstract class Plugin implements Module
public File file; public File file;
public PluginClassLoader loader; public PluginClassLoader loader;
private List<Disposable> disposables = new ArrayList<>();
@Override @Override
public void configure(Binder binder) public void configure(Binder binder)
@@ -47,6 +51,12 @@ public abstract class Plugin implements Module
protected void shutDown() throws Exception protected void shutDown() throws Exception
{ {
this.disposables.forEach(Disposable::dispose);
}
protected void addSubscription(Disposable disposable)
{
this.disposables.add(disposable);
} }
public final Injector getInjector() public final Injector getInjector()

View File

@@ -67,8 +67,7 @@ import net.runelite.client.config.Config;
import net.runelite.client.config.ConfigGroup; import net.runelite.client.config.ConfigGroup;
import net.runelite.client.config.ConfigManager; import net.runelite.client.config.ConfigManager;
import net.runelite.client.config.RuneLiteConfig; import net.runelite.client.config.RuneLiteConfig;
import net.runelite.client.eventbus.EventBus; import net.runelite.client.eventbus.EventBusImplementation;
import net.runelite.client.eventbus.Subscribe;
import net.runelite.client.events.PluginChanged; import net.runelite.client.events.PluginChanged;
import net.runelite.client.events.SessionClose; import net.runelite.client.events.SessionClose;
import net.runelite.client.events.SessionOpen; import net.runelite.client.events.SessionOpen;
@@ -87,7 +86,7 @@ public class PluginManager
private static final String PLUGIN_PACKAGE = "net.runelite.client.plugins"; private static final String PLUGIN_PACKAGE = "net.runelite.client.plugins";
private final boolean developerMode; private final boolean developerMode;
private final EventBus eventBus; private final EventBusImplementation eventBus;
private final Scheduler scheduler; private final Scheduler scheduler;
private final ConfigManager configManager; private final ConfigManager configManager;
private final ScheduledExecutorService executor; private final ScheduledExecutorService executor;
@@ -107,7 +106,7 @@ public class PluginManager
@VisibleForTesting @VisibleForTesting
PluginManager( PluginManager(
@Named("developerMode") final boolean developerMode, @Named("developerMode") final boolean developerMode,
final EventBus eventBus, final EventBusImplementation eventBus,
final Scheduler scheduler, final Scheduler scheduler,
final ConfigManager configManager, final ConfigManager configManager,
final ScheduledExecutorService executor, final ScheduledExecutorService executor,
@@ -119,6 +118,12 @@ public class PluginManager
this.configManager = configManager; this.configManager = configManager;
this.executor = executor; this.executor = executor;
this.sceneTileManager = sceneTileManager; this.sceneTileManager = sceneTileManager;
eventBus.observableOfType(SessionOpen.class)
.subscribe(this::onSessionOpen);
eventBus.observableOfType(SessionClose.class)
.subscribe(this::onSessionClose);
} }
public void watch() public void watch()
@@ -126,14 +131,12 @@ public class PluginManager
pluginWatcher.start(); pluginWatcher.start();
} }
@Subscribe private void onSessionOpen(SessionOpen event)
public void onSessionOpen(SessionOpen event)
{ {
refreshPlugins(); refreshPlugins();
} }
@Subscribe private void onSessionClose(SessionClose event)
public void onSessionClose(SessionClose event)
{ {
refreshPlugins(); refreshPlugins();
} }
@@ -368,7 +371,7 @@ public class PluginManager
} }
} }
eventBus.register(plugin); // eventBus.register(plugin);
schedule(plugin); schedule(plugin);
eventBus.post(new PluginChanged(plugin, true)); eventBus.post(new PluginChanged(plugin, true));
} }
@@ -392,7 +395,7 @@ public class PluginManager
try try
{ {
unschedule(plugin); unschedule(plugin);
eventBus.unregister(plugin); // eventBus.unregister(plugin);
// plugins always stop in the event thread // plugins always stop in the event thread
SwingUtilities.invokeAndWait(() -> SwingUtilities.invokeAndWait(() ->

View File

@@ -59,7 +59,7 @@ import net.runelite.api.events.GameTick;
import net.runelite.api.events.ProjectileMoved; import net.runelite.api.events.ProjectileMoved;
import net.runelite.client.Notifier; import net.runelite.client.Notifier;
import net.runelite.client.config.ConfigManager; import net.runelite.client.config.ConfigManager;
import net.runelite.client.eventbus.Subscribe; import net.runelite.client.eventbus.EventBusImplementation;
import net.runelite.client.plugins.Plugin; import net.runelite.client.plugins.Plugin;
import net.runelite.client.plugins.PluginDescriptor; import net.runelite.client.plugins.PluginDescriptor;
import net.runelite.client.plugins.PluginType; import net.runelite.client.plugins.PluginType;
@@ -92,6 +92,8 @@ public class AoeWarningPlugin extends Plugin
private BombOverlay bombOverlay; private BombOverlay bombOverlay;
@Inject @Inject
private Client client; private Client client;
@Inject
private EventBusImplementation eventbus;
@Getter(AccessLevel.PACKAGE) @Getter(AccessLevel.PACKAGE)
private List<WorldPoint> LightningTrail = new ArrayList<>(); private List<WorldPoint> LightningTrail = new ArrayList<>();
@Getter(AccessLevel.PACKAGE) @Getter(AccessLevel.PACKAGE)
@@ -170,6 +172,7 @@ public class AoeWarningPlugin extends Plugin
protected void startUp() throws Exception protected void startUp() throws Exception
{ {
updateConfig(); updateConfig();
addSubscriptions();
overlayManager.add(coreOverlay); overlayManager.add(coreOverlay);
overlayManager.add(bombOverlay); overlayManager.add(bombOverlay);
@@ -179,13 +182,53 @@ public class AoeWarningPlugin extends Plugin
@Override @Override
protected void shutDown() throws Exception protected void shutDown() throws Exception
{ {
super.shutDown();
overlayManager.remove(coreOverlay); overlayManager.remove(coreOverlay);
overlayManager.remove(bombOverlay); overlayManager.remove(bombOverlay);
reset(); reset();
} }
@Subscribe private void addSubscriptions()
public void onConfigChanged(ConfigChanged event) {
this.addSubscription(
this.eventbus
.observableOfType(ConfigChanged.class)
.subscribe(this::onConfigChanged)
);
this.addSubscription(
this.eventbus
.observableOfType(ProjectileMoved.class)
.subscribe(this::onProjectileMoved)
);
this.addSubscription(
this.eventbus
.observableOfType(GameObjectSpawned.class)
.subscribe(this::onGameObjectSpawned)
);
this.addSubscription(
this.eventbus
.observableOfType(GameObjectDespawned.class)
.subscribe(this::onGameObjectDespawned)
);
this.addSubscription(
this.eventbus
.observableOfType(GameStateChanged.class)
.subscribe(this::onGameStateChanged)
);
this.addSubscription(
this.eventbus
.observableOfType(GameTick.class)
.subscribe(this::onGameTick)
);
}
private void onConfigChanged(ConfigChanged event)
{ {
if (!event.getGroup().equals("aoe")) if (!event.getGroup().equals("aoe"))
{ {
@@ -195,8 +238,7 @@ public class AoeWarningPlugin extends Plugin
updateConfig(); updateConfig();
} }
@Subscribe private void onProjectileMoved(ProjectileMoved event)
public void onProjectileMoved(ProjectileMoved event)
{ {
Projectile projectile = event.getProjectile(); Projectile projectile = event.getProjectile();
@@ -223,8 +265,7 @@ public class AoeWarningPlugin extends Plugin
} }
} }
@Subscribe private void onGameObjectSpawned(GameObjectSpawned event)
public void onGameObjectSpawned(GameObjectSpawned event)
{ {
final GameObject gameObject = event.getGameObject(); final GameObject gameObject = event.getGameObject();
final WorldPoint wp = gameObject.getWorldLocation(); final WorldPoint wp = gameObject.getWorldLocation();
@@ -260,8 +301,7 @@ public class AoeWarningPlugin extends Plugin
} }
} }
@Subscribe private void onGameObjectDespawned(GameObjectDespawned event)
public void onGameObjectDespawned(GameObjectDespawned event)
{ {
GameObject gameObject = event.getGameObject(); GameObject gameObject = event.getGameObject();
WorldPoint wp = gameObject.getWorldLocation(); WorldPoint wp = gameObject.getWorldLocation();
@@ -286,8 +326,7 @@ public class AoeWarningPlugin extends Plugin
} }
} }
@Subscribe private void onGameStateChanged(GameStateChanged delta)
public void onGameStateChanged(GameStateChanged delta)
{ {
if (client.getGameState() == GameState.LOGGED_IN) if (client.getGameState() == GameState.LOGGED_IN)
{ {
@@ -295,8 +334,7 @@ public class AoeWarningPlugin extends Plugin
} }
} }
@Subscribe private void onGameTick(GameTick event)
public void onGameTick(GameTick event)
{ {
if (this.configLightningTrail) if (this.configLightningTrail)
{ {

View File

@@ -33,7 +33,6 @@ import lombok.AccessLevel;
import lombok.Getter; import lombok.Getter;
import net.runelite.api.events.ChatMessage; import net.runelite.api.events.ChatMessage;
import net.runelite.client.chat.ChatMessageBuilder; import net.runelite.client.chat.ChatMessageBuilder;
import net.runelite.client.eventbus.Subscribe;
@Getter(AccessLevel.PACKAGE) @Getter(AccessLevel.PACKAGE)

View File

@@ -56,7 +56,7 @@ import net.runelite.api.events.ProjectileMoved;
import net.runelite.client.Notifier; import net.runelite.client.Notifier;
import net.runelite.client.callback.ClientThread; import net.runelite.client.callback.ClientThread;
import net.runelite.client.config.ConfigManager; import net.runelite.client.config.ConfigManager;
import net.runelite.client.eventbus.Subscribe; import net.runelite.client.eventbus.EventBusImplementation;
import net.runelite.client.game.ItemManager; import net.runelite.client.game.ItemManager;
import net.runelite.client.plugins.Plugin; import net.runelite.client.plugins.Plugin;
import net.runelite.client.plugins.PluginDescriptor; import net.runelite.client.plugins.PluginDescriptor;
@@ -123,6 +123,9 @@ public class CannonPlugin extends Plugin
@Inject @Inject
private ClientThread clientThread; private ClientThread clientThread;
@Inject
private EventBusImplementation eventbus;
private boolean lock; private boolean lock;
private boolean showEmptyCannonNotification; private boolean showEmptyCannonNotification;
@@ -146,6 +149,7 @@ public class CannonPlugin extends Plugin
protected void startUp() throws Exception protected void startUp() throws Exception
{ {
updateConfig(); updateConfig();
addSubscriptions();
overlayManager.add(cannonOverlay); overlayManager.add(cannonOverlay);
overlayManager.add(cannonSpotOverlay); overlayManager.add(cannonSpotOverlay);
@@ -155,6 +159,8 @@ public class CannonPlugin extends Plugin
@Override @Override
protected void shutDown() throws Exception protected void shutDown() throws Exception
{ {
super.shutDown();
cannonSpotOverlay.setHidden(true); cannonSpotOverlay.setHidden(true);
overlayManager.remove(cannonOverlay); overlayManager.remove(cannonOverlay);
overlayManager.remove(cannonSpotOverlay); overlayManager.remove(cannonSpotOverlay);
@@ -167,8 +173,46 @@ public class CannonPlugin extends Plugin
spotPoints.clear(); spotPoints.clear();
} }
@Subscribe private void addSubscriptions()
public void onItemContainerChanged(ItemContainerChanged event) {
this.addSubscription(
this.eventbus
.observableOfType(ItemContainerChanged.class)
.subscribe(this::onItemContainerChanged)
);
this.addSubscription(
this.eventbus
.observableOfType(ConfigChanged.class)
.subscribe(this::onConfigChanged)
);
this.addSubscription(
this.eventbus
.observableOfType(GameObjectSpawned.class)
.subscribe(this::onGameObjectSpawned)
);
this.addSubscription(
this.eventbus
.observableOfType(ProjectileMoved.class)
.subscribe(this::onProjectileMoved)
);
this.addSubscription(
this.eventbus
.observableOfType(ChatMessage.class)
.subscribe(this::onChatMessage)
);
this.addSubscription(
this.eventbus
.observableOfType(GameTick.class)
.subscribe(this::onGameTick)
);
}
private void onItemContainerChanged(ItemContainerChanged event)
{ {
if (event.getItemContainer() != client.getItemContainer(InventoryID.INVENTORY)) if (event.getItemContainer() != client.getItemContainer(InventoryID.INVENTORY))
{ {
@@ -178,8 +222,7 @@ public class CannonPlugin extends Plugin
cannonSpotOverlay.setHidden(!ItemUtil.containsAllItemIds(event.getItemContainer().getItems(), CANNON_PARTS)); cannonSpotOverlay.setHidden(!ItemUtil.containsAllItemIds(event.getItemContainer().getItems(), CANNON_PARTS));
} }
@Subscribe private void onConfigChanged(ConfigChanged event)
public void onConfigChanged(ConfigChanged event)
{ {
if (event.getGroup().equals("cannon")) if (event.getGroup().equals("cannon"))
{ {
@@ -223,8 +266,7 @@ public class CannonPlugin extends Plugin
} }
} }
@Subscribe private void onGameObjectSpawned(GameObjectSpawned event)
public void onGameObjectSpawned(GameObjectSpawned event)
{ {
GameObject gameObject = event.getGameObject(); GameObject gameObject = event.getGameObject();
@@ -238,8 +280,7 @@ public class CannonPlugin extends Plugin
} }
} }
@Subscribe private void onProjectileMoved(ProjectileMoved event)
public void onProjectileMoved(ProjectileMoved event)
{ {
Projectile projectile = event.getProjectile(); Projectile projectile = event.getProjectile();
@@ -261,8 +302,7 @@ public class CannonPlugin extends Plugin
} }
} }
@Subscribe private void onChatMessage(ChatMessage event)
public void onChatMessage(ChatMessage event)
{ {
if (event.getType() != ChatMessageType.SPAM && event.getType() != ChatMessageType.GAMEMESSAGE) if (event.getType() != ChatMessageType.SPAM && event.getType() != ChatMessageType.GAMEMESSAGE)
{ {
@@ -345,8 +385,7 @@ public class CannonPlugin extends Plugin
} }
} }
@Subscribe private void onGameTick(GameTick event)
public void onGameTick(GameTick event)
{ {
skipProjectileCheckThisTick = false; skipProjectileCheckThisTick = false;
} }

View File

@@ -56,6 +56,7 @@ import net.runelite.api.events.VarClientIntChanged;
import net.runelite.api.events.VarClientStrChanged; import net.runelite.api.events.VarClientStrChanged;
import net.runelite.api.events.VarbitChanged; import net.runelite.api.events.VarbitChanged;
import net.runelite.client.eventbus.EventBus; import net.runelite.client.eventbus.EventBus;
import net.runelite.client.eventbus.EventBusImplementation;
import net.runelite.client.eventbus.Subscribe; import net.runelite.client.eventbus.Subscribe;
import net.runelite.client.ui.ClientUI; import net.runelite.client.ui.ClientUI;
import net.runelite.client.ui.ColorScheme; import net.runelite.client.ui.ColorScheme;
@@ -86,7 +87,7 @@ class VarInspector extends JFrame
private final static int MAX_LOG_ENTRIES = 10_000; private final static int MAX_LOG_ENTRIES = 10_000;
private final Client client; private final Client client;
private final EventBus eventBus; private final EventBusImplementation eventBus;
private final JPanel tracker = new JPanel(); private final JPanel tracker = new JPanel();
@@ -99,7 +100,7 @@ class VarInspector extends JFrame
private Map<Integer, Object> varcs = null; private Map<Integer, Object> varcs = null;
@Inject @Inject
VarInspector(Client client, EventBus eventBus, DevToolsPlugin plugin) VarInspector(Client client, EventBusImplementation eventBus, DevToolsPlugin plugin)
{ {
this.eventBus = eventBus; this.eventBus = eventBus;
this.client = client; this.client = client;
@@ -348,7 +349,7 @@ class VarInspector extends JFrame
System.arraycopy(client.getVarps(), 0, oldVarps2, 0, oldVarps2.length); System.arraycopy(client.getVarps(), 0, oldVarps2, 0, oldVarps2.length);
varcs = new HashMap<>(client.getVarcMap()); varcs = new HashMap<>(client.getVarcMap());
eventBus.register(this); // eventBus.register(this);
setVisible(true); setVisible(true);
toFront(); toFront();
repaint(); repaint();
@@ -357,7 +358,7 @@ class VarInspector extends JFrame
public void close() public void close()
{ {
tracker.removeAll(); tracker.removeAll();
eventBus.unregister(this); // eventBus.unregister(this);
setVisible(false); setVisible(false);
} }
} }

View File

@@ -66,12 +66,17 @@ import net.runelite.api.SceneTileModel;
import net.runelite.api.SceneTilePaint; import net.runelite.api.SceneTilePaint;
import net.runelite.api.Texture; import net.runelite.api.Texture;
import net.runelite.api.TextureProvider; import net.runelite.api.TextureProvider;
import net.runelite.api.events.ChatMessage;
import net.runelite.api.events.ConfigChanged; import net.runelite.api.events.ConfigChanged;
import net.runelite.api.events.GameObjectSpawned;
import net.runelite.api.events.GameStateChanged; import net.runelite.api.events.GameStateChanged;
import net.runelite.api.events.GameTick;
import net.runelite.api.events.ItemContainerChanged;
import net.runelite.api.events.ProjectileMoved;
import net.runelite.api.hooks.DrawCallbacks; import net.runelite.api.hooks.DrawCallbacks;
import net.runelite.client.callback.ClientThread; import net.runelite.client.callback.ClientThread;
import net.runelite.client.config.ConfigManager; import net.runelite.client.config.ConfigManager;
import net.runelite.client.eventbus.Subscribe; import net.runelite.client.eventbus.EventBusImplementation;
import net.runelite.client.plugins.Plugin; import net.runelite.client.plugins.Plugin;
import net.runelite.client.plugins.PluginDescriptor; import net.runelite.client.plugins.PluginDescriptor;
import net.runelite.client.plugins.PluginInstantiationException; import net.runelite.client.plugins.PluginInstantiationException;
@@ -121,6 +126,9 @@ public class GpuPlugin extends Plugin implements DrawCallbacks
@Inject @Inject
private PluginManager pluginManager; private PluginManager pluginManager;
@Inject
private EventBusImplementation eventbus;
private Canvas canvas; private Canvas canvas;
private JAWTWindow jawtWindow; private JAWTWindow jawtWindow;
private GL4 gl; private GL4 gl;
@@ -238,8 +246,7 @@ public class GpuPlugin extends Plugin implements DrawCallbacks
private int fogCircularity; private int fogCircularity;
private int fogDensity; private int fogDensity;
@Subscribe private void onConfigChanged(ConfigChanged event)
public void onConfigChanged(ConfigChanged event)
{ {
if (event.getGroup().equals("gpu")) if (event.getGroup().equals("gpu"))
{ {
@@ -259,9 +266,11 @@ public class GpuPlugin extends Plugin implements DrawCallbacks
} }
@Override @Override
protected void startUp() protected void startUp() throws Exception
{ {
updateConfig(); updateConfig();
addSubscriptions();
clientThread.invoke(() -> clientThread.invoke(() ->
{ {
try try
@@ -353,15 +362,23 @@ public class GpuPlugin extends Plugin implements DrawCallbacks
log.error("error stopping plugin", ex); log.error("error stopping plugin", ex);
} }
shutDown(); try
{
shutDown();
}
catch (Exception ex)
{
}
} }
}); });
} }
@Override @Override
protected void shutDown() protected void shutDown() throws Exception
{ {
super.shutDown();
clientThread.invoke(() -> clientThread.invoke(() ->
{ {
client.setGpu(false); client.setGpu(false);
@@ -431,6 +448,21 @@ public class GpuPlugin extends Plugin implements DrawCallbacks
}); });
} }
private void addSubscriptions()
{
this.addSubscription(
this.eventbus
.observableOfType(GameStateChanged.class)
.subscribe(this::onGameStateChanged)
);
this.addSubscription(
this.eventbus
.observableOfType(ConfigChanged.class)
.subscribe(this::onConfigChanged)
);
}
@Provides @Provides
GpuPluginConfig provideConfig(ConfigManager configManager) GpuPluginConfig provideConfig(ConfigManager configManager)
{ {
@@ -800,8 +832,14 @@ public class GpuPlugin extends Plugin implements DrawCallbacks
// We inject code in the game engine mixin to prevent the client from doing canvas replacement, // We inject code in the game engine mixin to prevent the client from doing canvas replacement,
// so this should not ever be hit // so this should not ever be hit
log.warn("Canvas invalidated!"); log.warn("Canvas invalidated!");
shutDown(); try
startUp(); {
shutDown();
startUp();
}
catch (Exception e)
{
}
return; return;
} }
@@ -1282,8 +1320,7 @@ public class GpuPlugin extends Plugin implements DrawCallbacks
textureManager.animate(texture, diff); textureManager.animate(texture, diff);
} }
@Subscribe private void onGameStateChanged(GameStateChanged gameStateChanged)
public void onGameStateChanged(GameStateChanged gameStateChanged)
{ {
if (gameStateChanged.getGameState() != GameState.LOGGED_IN) if (gameStateChanged.getGameState() != GameState.LOGGED_IN)
{ {

View File

@@ -52,8 +52,7 @@ import static net.runelite.client.RuneLite.LOGS_DIR;
import net.runelite.client.RuneLiteProperties; import net.runelite.client.RuneLiteProperties;
import net.runelite.client.account.SessionManager; import net.runelite.client.account.SessionManager;
import net.runelite.client.config.ConfigManager; import net.runelite.client.config.ConfigManager;
import net.runelite.client.eventbus.EventBus; import net.runelite.client.eventbus.EventBusImplementation;
import net.runelite.client.eventbus.Subscribe;
import net.runelite.client.events.SessionClose; import net.runelite.client.events.SessionClose;
import net.runelite.client.events.SessionOpen; import net.runelite.client.events.SessionOpen;
import net.runelite.client.ui.ColorScheme; import net.runelite.client.ui.ColorScheme;
@@ -87,7 +86,7 @@ public class InfoPanel extends PluginPanel
private RuneLiteProperties runeLiteProperties; private RuneLiteProperties runeLiteProperties;
@Inject @Inject
private EventBus eventBus; private EventBusImplementation eventBus;
@Inject @Inject
private SessionManager sessionManager; private SessionManager sessionManager;
@@ -187,7 +186,7 @@ public class InfoPanel extends PluginPanel
add(actionsContainer, BorderLayout.CENTER); add(actionsContainer, BorderLayout.CENTER);
updateLoggedIn(); updateLoggedIn();
eventBus.register(this); // eventBus.register(this);
} }
/** /**
@@ -316,13 +315,11 @@ public class InfoPanel extends PluginPanel
return "<html><body style = 'color:#a5a5a5'>" + key + "<span style = 'color:white'>" + value + "</span></body></html>"; return "<html><body style = 'color:#a5a5a5'>" + key + "<span style = 'color:white'>" + value + "</span></body></html>";
} }
@Subscribe
public void onSessionOpen(SessionOpen sessionOpen) public void onSessionOpen(SessionOpen sessionOpen)
{ {
updateLoggedIn(); updateLoggedIn();
} }
@Subscribe
public void onSessionClose(SessionClose e) public void onSessionClose(SessionClose e)
{ {
updateLoggedIn(); updateLoggedIn();

View File

@@ -27,6 +27,11 @@ package net.runelite.client.plugins.info;
import java.awt.image.BufferedImage; import java.awt.image.BufferedImage;
import javax.inject.Inject; import javax.inject.Inject;
import javax.inject.Singleton; import javax.inject.Singleton;
import net.runelite.api.events.ConfigChanged;
import net.runelite.api.events.ItemContainerChanged;
import net.runelite.client.eventbus.EventBusImplementation;
import net.runelite.client.events.SessionClose;
import net.runelite.client.events.SessionOpen;
import net.runelite.client.plugins.Plugin; import net.runelite.client.plugins.Plugin;
import net.runelite.client.plugins.PluginDescriptor; import net.runelite.client.plugins.PluginDescriptor;
import net.runelite.client.ui.ClientToolbar; import net.runelite.client.ui.ClientToolbar;
@@ -44,12 +49,18 @@ public class InfoPlugin extends Plugin
@Inject @Inject
private ClientToolbar clientToolbar; private ClientToolbar clientToolbar;
@Inject
private EventBusImplementation eventbus;
private NavigationButton navButton; private NavigationButton navButton;
private InfoPanel panel;
@Override @Override
protected void startUp() throws Exception protected void startUp() throws Exception
{ {
final InfoPanel panel = injector.getInstance(InfoPanel.class); panel = injector.getInstance(InfoPanel.class);
panel.init(); panel.init();
final BufferedImage icon = ImageUtil.getResourceStreamFromClass(getClass(), "info_icon.png"); final BufferedImage icon = ImageUtil.getResourceStreamFromClass(getClass(), "info_icon.png");
@@ -62,11 +73,30 @@ public class InfoPlugin extends Plugin
.build(); .build();
clientToolbar.addNavigation(navButton); clientToolbar.addNavigation(navButton);
addSubscriptions();
} }
@Override @Override
protected void shutDown() protected void shutDown() throws Exception
{ {
super.shutDown();
clientToolbar.removeNavigation(navButton); clientToolbar.removeNavigation(navButton);
} }
private void addSubscriptions()
{
this.addSubscription(
this.eventbus
.observableOfType(SessionOpen.class)
.subscribe(panel::onSessionOpen)
);
this.addSubscription(
this.eventbus
.observableOfType(SessionClose.class)
.subscribe(panel::onSessionClose)
);
}
} }

View File

@@ -31,6 +31,7 @@ import lombok.AccessLevel;
import lombok.Getter; import lombok.Getter;
import net.runelite.client.config.ConfigManager; import net.runelite.client.config.ConfigManager;
import net.runelite.client.eventbus.EventBus; import net.runelite.client.eventbus.EventBus;
import net.runelite.client.eventbus.EventBusImplementation;
import net.runelite.client.plugins.Plugin; import net.runelite.client.plugins.Plugin;
import net.runelite.client.plugins.PluginDescriptor; import net.runelite.client.plugins.PluginDescriptor;
import net.runelite.client.plugins.mta.alchemy.AlchemyRoom; import net.runelite.client.plugins.mta.alchemy.AlchemyRoom;
@@ -60,7 +61,7 @@ public class MTAPlugin extends Plugin
private EnchantmentRoom enchantmentRoom; private EnchantmentRoom enchantmentRoom;
@Inject @Inject
private EventBus eventBus; private EventBusImplementation eventBus;
@Inject @Inject
private MTASceneOverlay sceneOverlay; private MTASceneOverlay sceneOverlay;
@Inject @Inject
@@ -85,7 +86,7 @@ public class MTAPlugin extends Plugin
for (MTARoom room : rooms) for (MTARoom room : rooms)
{ {
eventBus.register(room); // eventBus.register(room);
} }
} }
@@ -97,7 +98,7 @@ public class MTAPlugin extends Plugin
for (MTARoom room : rooms) for (MTARoom room : rooms)
{ {
eventBus.unregister(room); // eventBus.unregister(room);
} }
telekineticRoom.resetRoom(); telekineticRoom.resetRoom();

View File

@@ -66,7 +66,7 @@ import net.runelite.api.events.NpcDespawned;
import net.runelite.api.events.NpcSpawned; import net.runelite.api.events.NpcSpawned;
import net.runelite.client.callback.ClientThread; import net.runelite.client.callback.ClientThread;
import net.runelite.client.config.ConfigManager; import net.runelite.client.config.ConfigManager;
import net.runelite.client.eventbus.Subscribe; import net.runelite.client.eventbus.EventBusImplementation;
import net.runelite.client.input.KeyManager; import net.runelite.client.input.KeyManager;
import net.runelite.client.plugins.Plugin; import net.runelite.client.plugins.Plugin;
import net.runelite.client.plugins.PluginDescriptor; import net.runelite.client.plugins.PluginDescriptor;
@@ -116,6 +116,9 @@ public class NpcIndicatorsPlugin extends Plugin
@Inject @Inject
private ClientThread clientThread; private ClientThread clientThread;
@Inject
private EventBusImplementation eventbus;
@Setter(AccessLevel.PACKAGE) @Setter(AccessLevel.PACKAGE)
private boolean hotKeyPressed = false; private boolean hotKeyPressed = false;
@@ -207,6 +210,7 @@ public class NpcIndicatorsPlugin extends Plugin
protected void startUp() throws Exception protected void startUp() throws Exception
{ {
updateConfig(); updateConfig();
addSubscriptions();
overlayManager.add(npcSceneOverlay); overlayManager.add(npcSceneOverlay);
overlayManager.add(npcMinimapOverlay); overlayManager.add(npcMinimapOverlay);
@@ -222,6 +226,8 @@ public class NpcIndicatorsPlugin extends Plugin
@Override @Override
protected void shutDown() throws Exception protected void shutDown() throws Exception
{ {
super.shutDown();
overlayManager.remove(npcSceneOverlay); overlayManager.remove(npcSceneOverlay);
overlayManager.remove(npcMinimapOverlay); overlayManager.remove(npcMinimapOverlay);
deadNpcsToDisplay.clear(); deadNpcsToDisplay.clear();
@@ -234,8 +240,70 @@ public class NpcIndicatorsPlugin extends Plugin
keyManager.unregisterKeyListener(inputListener); keyManager.unregisterKeyListener(inputListener);
} }
@Subscribe private void addSubscriptions()
public void onGameStateChanged(GameStateChanged event) {
this.addSubscription(
this.eventbus
.observableOfType(GameStateChanged.class)
.subscribe(this::onGameStateChanged)
);
this.addSubscription(
this.eventbus
.observableOfType(ConfigChanged.class)
.subscribe(this::onConfigChanged)
);
this.addSubscription(
this.eventbus
.observableOfType(FocusChanged.class)
.subscribe(this::onFocusChanged)
);
this.addSubscription(
this.eventbus
.observableOfType(MenuEntryAdded.class)
.subscribe(this::onMenuEntryAdded)
);
this.addSubscription(
this.eventbus
.observableOfType(MenuOptionClicked.class)
.subscribe(this::onMenuOptionClicked)
);
this.addSubscription(
this.eventbus
.observableOfType(NpcSpawned.class)
.subscribe(this::onNpcSpawned)
);
this.addSubscription(
this.eventbus
.observableOfType(NpcDefinitionChanged.class)
.subscribe(this::onNpcDefinitionChanged)
);
this.addSubscription(
this.eventbus
.observableOfType(NpcDespawned.class)
.subscribe(this::onNpcDespawned)
);
this.addSubscription(
this.eventbus
.observableOfType(GraphicsObjectCreated.class)
.subscribe(this::onGraphicsObjectCreated)
);
this.addSubscription(
this.eventbus
.observableOfType(GameTick.class)
.subscribe(this::onGameTick)
);
}
private void onGameStateChanged(GameStateChanged event)
{ {
if (event.getGameState() == GameState.LOGIN_SCREEN || if (event.getGameState() == GameState.LOGIN_SCREEN ||
event.getGameState() == GameState.HOPPING) event.getGameState() == GameState.HOPPING)
@@ -248,8 +316,7 @@ public class NpcIndicatorsPlugin extends Plugin
} }
} }
@Subscribe private void onConfigChanged(ConfigChanged configChanged)
public void onConfigChanged(ConfigChanged configChanged)
{ {
if (!configChanged.getGroup().equals("npcindicators")) if (!configChanged.getGroup().equals("npcindicators"))
{ {
@@ -262,8 +329,7 @@ public class NpcIndicatorsPlugin extends Plugin
rebuildAllNpcs(); rebuildAllNpcs();
} }
@Subscribe private void onFocusChanged(FocusChanged focusChanged)
public void onFocusChanged(FocusChanged focusChanged)
{ {
if (!focusChanged.isFocused()) if (!focusChanged.isFocused())
{ {
@@ -271,8 +337,7 @@ public class NpcIndicatorsPlugin extends Plugin
} }
} }
@Subscribe private void onMenuEntryAdded(MenuEntryAdded event)
public void onMenuEntryAdded(MenuEntryAdded event)
{ {
MenuEntry[] menuEntries = client.getMenuEntries(); MenuEntry[] menuEntries = client.getMenuEntries();
String target = event.getTarget(); String target = event.getTarget();
@@ -306,8 +371,7 @@ public class NpcIndicatorsPlugin extends Plugin
} }
} }
@Subscribe private void onMenuOptionClicked(MenuOptionClicked click)
public void onMenuOptionClicked(MenuOptionClicked click)
{ {
if (click.getMenuAction() != MenuAction.RUNELITE if (click.getMenuAction() != MenuAction.RUNELITE
|| (!click.getOption().equals(TAG) || (!click.getOption().equals(TAG)
@@ -344,8 +408,7 @@ public class NpcIndicatorsPlugin extends Plugin
click.consume(); click.consume();
} }
@Subscribe private void onNpcSpawned(NpcSpawned npcSpawned)
public void onNpcSpawned(NpcSpawned npcSpawned)
{ {
NPC npc = npcSpawned.getNpc(); NPC npc = npcSpawned.getNpc();
highlightNpcIfMatch(npc); highlightNpcIfMatch(npc);
@@ -356,8 +419,7 @@ public class NpcIndicatorsPlugin extends Plugin
} }
} }
@Subscribe private void onNpcDefinitionChanged(NpcDefinitionChanged event)
public void onNpcDefinitionChanged(NpcDefinitionChanged event)
{ {
NPC npc = event.getNpc(); NPC npc = event.getNpc();
highlightNpcIfMatch(npc); highlightNpcIfMatch(npc);
@@ -373,8 +435,7 @@ public class NpcIndicatorsPlugin extends Plugin
} }
} }
@Subscribe private void onNpcDespawned(NpcDespawned npcDespawned)
public void onNpcDespawned(NpcDespawned npcDespawned)
{ {
final NPC npc = npcDespawned.getNpc(); final NPC npc = npcDespawned.getNpc();
@@ -386,8 +447,7 @@ public class NpcIndicatorsPlugin extends Plugin
highlightedNpcs.remove(npc); highlightedNpcs.remove(npc);
} }
@Subscribe private void onGraphicsObjectCreated(GraphicsObjectCreated event)
public void onGraphicsObjectCreated(GraphicsObjectCreated event)
{ {
final GraphicsObject go = event.getGraphicsObject(); final GraphicsObject go = event.getGraphicsObject();
@@ -397,8 +457,7 @@ public class NpcIndicatorsPlugin extends Plugin
} }
} }
@Subscribe private void onGameTick(GameTick event)
public void onGameTick(GameTick event)
{ {
removeOldHighlightedRespawns(); removeOldHighlightedRespawns();
validateSpawnedNpcs(); validateSpawnedNpcs();

View File

@@ -64,7 +64,7 @@ import net.runelite.api.events.GameStateChanged;
import net.runelite.api.events.MenuEntryAdded; import net.runelite.api.events.MenuEntryAdded;
import net.runelite.api.events.MenuOptionClicked; import net.runelite.api.events.MenuOptionClicked;
import net.runelite.client.config.ConfigManager; import net.runelite.client.config.ConfigManager;
import net.runelite.client.eventbus.Subscribe; import net.runelite.client.eventbus.EventBusImplementation;
import net.runelite.client.input.KeyListener; import net.runelite.client.input.KeyListener;
import net.runelite.client.input.KeyManager; import net.runelite.client.input.KeyManager;
import net.runelite.client.plugins.Plugin; import net.runelite.client.plugins.Plugin;
@@ -108,6 +108,9 @@ public class ObjectIndicatorsPlugin extends Plugin implements KeyListener
@Inject @Inject
private KeyManager keyManager; private KeyManager keyManager;
@Inject
private EventBusImplementation eventbus;
@Getter(AccessLevel.PACKAGE) @Getter(AccessLevel.PACKAGE)
private RenderStyle objectMarkerRenderStyle; private RenderStyle objectMarkerRenderStyle;
@Getter(AccessLevel.PACKAGE) @Getter(AccessLevel.PACKAGE)
@@ -127,6 +130,7 @@ public class ObjectIndicatorsPlugin extends Plugin implements KeyListener
protected void startUp() protected void startUp()
{ {
updateConfig(); updateConfig();
addSubscriptions();
overlayManager.add(overlay); overlayManager.add(overlay);
keyManager.registerKeyListener(this); keyManager.registerKeyListener(this);
@@ -135,6 +139,14 @@ public class ObjectIndicatorsPlugin extends Plugin implements KeyListener
@Override @Override
protected void shutDown() protected void shutDown()
{ {
try
{
super.shutDown();
}
catch (Exception e)
{
}
overlayManager.remove(overlay); overlayManager.remove(overlay);
keyManager.unregisterKeyListener(this); keyManager.unregisterKeyListener(this);
points.clear(); points.clear();
@@ -142,6 +154,69 @@ public class ObjectIndicatorsPlugin extends Plugin implements KeyListener
hotKeyPressed = false; hotKeyPressed = false;
} }
private void addSubscriptions()
{
this.addSubscription(
this.eventbus
.observableOfType(FocusChanged.class)
.subscribe(this::onFocusChanged)
);
this.addSubscription(
this.eventbus
.observableOfType(GameObjectSpawned.class)
.subscribe(this::onGameObjectSpawned)
);
this.addSubscription(
this.eventbus
.observableOfType(DecorativeObjectSpawned.class)
.subscribe(this::onDecorativeObjectSpawned)
);
this.addSubscription(
this.eventbus
.observableOfType(GameObjectDespawned.class)
.subscribe(this::onGameObjectDespawned)
);
this.addSubscription(
this.eventbus
.observableOfType(DecorativeObjectDespawned.class)
.subscribe(this::onDecorativeObjectDespawned)
);
this.addSubscription(
this.eventbus
.observableOfType(GameStateChanged.class)
.subscribe(this::onGameStateChanged)
);
this.addSubscription(
this.eventbus
.observableOfType(MenuOptionClicked.class)
.subscribe(this::onMenuOptionClicked)
);
this.addSubscription(
this.eventbus
.observableOfType(GameStateChanged.class)
.subscribe(this::onGameStateChanged)
);
this.addSubscription(
this.eventbus
.observableOfType(MenuEntryAdded.class)
.subscribe(this::onMenuEntryAdded)
);
this.addSubscription(
this.eventbus
.observableOfType(ConfigChanged.class)
.subscribe(this::onConfigChanged)
);
}
@Override @Override
public void keyTyped(KeyEvent e) public void keyTyped(KeyEvent e)
{ {
@@ -166,8 +241,7 @@ public class ObjectIndicatorsPlugin extends Plugin implements KeyListener
} }
} }
@Subscribe private void onFocusChanged(final FocusChanged event)
public void onFocusChanged(final FocusChanged event)
{ {
if (!event.isFocused()) if (!event.isFocused())
{ {
@@ -175,34 +249,29 @@ public class ObjectIndicatorsPlugin extends Plugin implements KeyListener
} }
} }
@Subscribe private void onGameObjectSpawned(GameObjectSpawned event)
public void onGameObjectSpawned(GameObjectSpawned event)
{ {
final GameObject eventObject = event.getGameObject(); final GameObject eventObject = event.getGameObject();
checkObjectPoints(eventObject); checkObjectPoints(eventObject);
} }
@Subscribe private void onDecorativeObjectSpawned(DecorativeObjectSpawned event)
public void onDecorativeObjectSpawned(DecorativeObjectSpawned event)
{ {
final DecorativeObject eventObject = event.getDecorativeObject(); final DecorativeObject eventObject = event.getDecorativeObject();
checkObjectPoints(eventObject); checkObjectPoints(eventObject);
} }
@Subscribe private void onGameObjectDespawned(GameObjectDespawned event)
public void onGameObjectDespawned(GameObjectDespawned event)
{ {
objects.remove(event.getGameObject()); objects.remove(event.getGameObject());
} }
@Subscribe private void onDecorativeObjectDespawned(DecorativeObjectDespawned event)
public void onDecorativeObjectDespawned(DecorativeObjectDespawned event)
{ {
objects.remove(event.getDecorativeObject()); objects.remove(event.getDecorativeObject());
} }
@Subscribe private void onGameStateChanged(GameStateChanged gameStateChanged)
public void onGameStateChanged(GameStateChanged gameStateChanged)
{ {
GameState gameState = gameStateChanged.getGameState(); GameState gameState = gameStateChanged.getGameState();
if (gameState == GameState.LOADING) if (gameState == GameState.LOADING)
@@ -227,8 +296,7 @@ public class ObjectIndicatorsPlugin extends Plugin implements KeyListener
} }
} }
@Subscribe private void onMenuEntryAdded(MenuEntryAdded event)
public void onMenuEntryAdded(MenuEntryAdded event)
{ {
if (!hotKeyPressed || event.getType() != MenuAction.EXAMINE_OBJECT.getId()) if (!hotKeyPressed || event.getType() != MenuAction.EXAMINE_OBJECT.getId())
{ {
@@ -284,8 +352,7 @@ public class ObjectIndicatorsPlugin extends Plugin implements KeyListener
client.setMenuEntries(menuEntries); client.setMenuEntries(menuEntries);
} }
@Subscribe private void onMenuOptionClicked(MenuOptionClicked event)
public void onMenuOptionClicked(MenuOptionClicked event)
{ {
if (event.getMenuAction() != MenuAction.RUNELITE if (event.getMenuAction() != MenuAction.RUNELITE
|| (!event.getOption().equals(MARK) || (!event.getOption().equals(MARK)
@@ -443,8 +510,7 @@ public class ObjectIndicatorsPlugin extends Plugin implements KeyListener
}.getType()); }.getType());
} }
@Subscribe private void onConfigChanged(ConfigChanged event)
public void onConfigChanged(ConfigChanged event)
{ {
if (!event.getGroup().equals("objectindicators")) if (!event.getGroup().equals("objectindicators"))
{ {

View File

@@ -39,7 +39,7 @@ import static net.runelite.api.widgets.WidgetInfo.*;
import net.runelite.client.callback.ClientThread; import net.runelite.client.callback.ClientThread;
import net.runelite.client.config.RuneLitePlusConfig; import net.runelite.client.config.RuneLitePlusConfig;
import net.runelite.client.discord.DiscordService; import net.runelite.client.discord.DiscordService;
import net.runelite.client.eventbus.Subscribe; import net.runelite.client.eventbus.EventBusImplementation;
import net.runelite.client.input.KeyListener; import net.runelite.client.input.KeyListener;
import net.runelite.client.input.KeyManager; import net.runelite.client.input.KeyManager;
import net.runelite.client.plugins.Plugin; import net.runelite.client.plugins.Plugin;
@@ -105,6 +105,9 @@ public class RuneLitePlusPlugin extends Plugin
@Inject @Inject
private ClientThread clientThread; private ClientThread clientThread;
@Inject
private EventBusImplementation eventbus;
private final RuneLitePlusKeyListener keyListener = new RuneLitePlusKeyListener(); private final RuneLitePlusKeyListener keyListener = new RuneLitePlusKeyListener();
private int entered = -1; private int entered = -1;
private int enterIdx; private int enterIdx;
@@ -113,6 +116,8 @@ public class RuneLitePlusPlugin extends Plugin
@Override @Override
protected void startUp() throws Exception protected void startUp() throws Exception
{ {
addSubscriptions();
if (config.customPresence()) if (config.customPresence())
{ {
ClientUI.currentPresenceName = ("RuneLitePlus"); ClientUI.currentPresenceName = ("RuneLitePlus");
@@ -127,8 +132,7 @@ public class RuneLitePlusPlugin extends Plugin
expectInput = false; expectInput = false;
} }
@Subscribe private void onConfigChanged(ConfigChanged event)
protected void onConfigChanged(ConfigChanged event)
{ {
if (!event.getGroup().equals("runeliteplus")) if (!event.getGroup().equals("runeliteplus"))
{ {
@@ -165,13 +169,29 @@ public class RuneLitePlusPlugin extends Plugin
@Override @Override
protected void shutDown() throws Exception protected void shutDown() throws Exception
{ {
super.shutDown();
entered = 0; entered = 0;
enterIdx = 0; enterIdx = 0;
expectInput = false; expectInput = false;
keyManager.unregisterKeyListener(keyListener); keyManager.unregisterKeyListener(keyListener);
} }
@Subscribe private void addSubscriptions()
{
this.addSubscription(
this.eventbus
.observableOfType(ConfigChanged.class)
.subscribe(this::onConfigChanged)
);
this.addSubscription(
this.eventbus
.observableOfType(ScriptCallbackEvent.class)
.subscribe(this::onScriptCallbackEvent)
);
}
private void onScriptCallbackEvent(ScriptCallbackEvent e) private void onScriptCallbackEvent(ScriptCallbackEvent e)
{ {
if (!config.keyboardPin()) if (!config.keyboardPin())

View File

@@ -41,6 +41,7 @@ import javax.inject.Singleton;
import lombok.extern.slf4j.Slf4j; import lombok.extern.slf4j.Slf4j;
import static net.runelite.client.RuneLite.RUNELITE_DIR; import static net.runelite.client.RuneLite.RUNELITE_DIR;
import net.runelite.client.eventbus.EventBus; import net.runelite.client.eventbus.EventBus;
import net.runelite.client.eventbus.EventBusImplementation;
import net.runelite.client.plugins.stonedloottracker.data.events.LootTrackerNameChange; import net.runelite.client.plugins.stonedloottracker.data.events.LootTrackerNameChange;
import net.runelite.client.plugins.stonedloottracker.data.events.LootTrackerRecordStored; import net.runelite.client.plugins.stonedloottracker.data.events.LootTrackerRecordStored;
import net.runelite.http.api.RuneLiteAPI; import net.runelite.http.api.RuneLiteAPI;
@@ -55,10 +56,10 @@ public class LootRecordWriter
// Data is stored in a folder with the players in-game username // Data is stored in a folder with the players in-game username
private File playerFolder = LOOT_RECORD_DIR; private File playerFolder = LOOT_RECORD_DIR;
private final EventBus bus; private final EventBusImplementation bus;
@Inject @Inject
public LootRecordWriter(EventBus bus) public LootRecordWriter(EventBusImplementation bus)
{ {
this.bus = bus; this.bus = bus;
playerFolder.mkdir(); playerFolder.mkdir();

View File

@@ -54,7 +54,7 @@ import net.runelite.api.events.VarbitChanged;
import net.runelite.client.Notifier; import net.runelite.client.Notifier;
import net.runelite.client.chat.ChatMessageManager; import net.runelite.client.chat.ChatMessageManager;
import net.runelite.client.config.ConfigManager; import net.runelite.client.config.ConfigManager;
import net.runelite.client.eventbus.Subscribe; import net.runelite.client.eventbus.EventBusImplementation;
import net.runelite.client.plugins.Plugin; import net.runelite.client.plugins.Plugin;
import net.runelite.client.plugins.PluginDescriptor; import net.runelite.client.plugins.PluginDescriptor;
import net.runelite.client.plugins.wintertodt.config.WintertodtNotifyMode; import net.runelite.client.plugins.wintertodt.config.WintertodtNotifyMode;
@@ -93,6 +93,9 @@ public class WintertodtPlugin extends Plugin
@Inject @Inject
private ChatMessageManager chatMessageManager; private ChatMessageManager chatMessageManager;
@Inject
private EventBusImplementation eventbus;
@Getter(AccessLevel.PACKAGE) @Getter(AccessLevel.PACKAGE)
private WintertodtActivity currentActivity = WintertodtActivity.IDLE; private WintertodtActivity currentActivity = WintertodtActivity.IDLE;
@@ -123,6 +126,8 @@ public class WintertodtPlugin extends Plugin
this.notifyCondition = config.notifyCondition(); this.notifyCondition = config.notifyCondition();
this.damageNotificationColor = config.damageNotificationColor(); this.damageNotificationColor = config.damageNotificationColor();
addSubscriptions();
reset(); reset();
overlayManager.add(overlay); overlayManager.add(overlay);
} }
@@ -130,12 +135,52 @@ public class WintertodtPlugin extends Plugin
@Override @Override
protected void shutDown() throws Exception protected void shutDown() throws Exception
{ {
super.shutDown();
overlayManager.remove(overlay); overlayManager.remove(overlay);
reset(); reset();
} }
@Subscribe private void addSubscriptions()
public void onConfigChanged(ConfigChanged event) {
this.addSubscription(
this.eventbus
.observableOfType(ConfigChanged.class)
.subscribe(this::onConfigChanged)
);
this.addSubscription(
this.eventbus
.observableOfType(GameTick.class)
.subscribe(this::onGameTick)
);
this.addSubscription(
this.eventbus
.observableOfType(VarbitChanged.class)
.subscribe(this::onVarbitChanged)
);
this.addSubscription(
this.eventbus
.observableOfType(ChatMessage.class)
.subscribe(this::onChatMessage)
);
this.addSubscription(
this.eventbus
.observableOfType(AnimationChanged.class)
.subscribe(this::onAnimationChanged)
);
this.addSubscription(
this.eventbus
.observableOfType(ItemContainerChanged.class)
.subscribe(this::onItemContainerChanged)
);
}
private void onConfigChanged(ConfigChanged event)
{ {
if (!event.getGroup().equals("wintertodt")) if (!event.getGroup().equals("wintertodt"))
{ {
@@ -164,8 +209,7 @@ public class WintertodtPlugin extends Plugin
return false; return false;
} }
@Subscribe private void onGameTick(GameTick gameTick)
public void onGameTick(GameTick gameTick)
{ {
if (!isInWintertodtRegion()) if (!isInWintertodtRegion())
{ {
@@ -189,8 +233,7 @@ public class WintertodtPlugin extends Plugin
checkActionTimeout(); checkActionTimeout();
} }
@Subscribe private void onVarbitChanged(VarbitChanged varbitChanged)
public void onVarbitChanged(VarbitChanged varbitChanged)
{ {
int timerValue = client.getVar(Varbits.WINTERTODT_TIMER); int timerValue = client.getVar(Varbits.WINTERTODT_TIMER);
if (timerValue != previousTimerValue) if (timerValue != previousTimerValue)
@@ -236,8 +279,7 @@ public class WintertodtPlugin extends Plugin
} }
} }
@Subscribe private void onChatMessage(ChatMessage chatMessage)
public void onChatMessage(ChatMessage chatMessage)
{ {
if (!isInWintertodt) if (!isInWintertodt)
{ {
@@ -380,8 +422,7 @@ public class WintertodtPlugin extends Plugin
notifier.notify(notification); notifier.notify(notification);
} }
@Subscribe private void onAnimationChanged(final AnimationChanged event)
public void onAnimationChanged(final AnimationChanged event)
{ {
if (!isInWintertodt) if (!isInWintertodt)
{ {
@@ -429,8 +470,7 @@ public class WintertodtPlugin extends Plugin
} }
} }
@Subscribe private void onItemContainerChanged(ItemContainerChanged event)
public void onItemContainerChanged(ItemContainerChanged event)
{ {
final ItemContainer container = event.getItemContainer(); final ItemContainer container = event.getItemContainer();

View File

@@ -29,6 +29,7 @@ import java.util.Set;
import javax.inject.Inject; import javax.inject.Inject;
import javax.inject.Singleton; import javax.inject.Singleton;
import net.runelite.client.eventbus.EventBus; import net.runelite.client.eventbus.EventBus;
import net.runelite.client.eventbus.EventBusImplementation;
import net.runelite.client.events.NavigationButtonAdded; import net.runelite.client.events.NavigationButtonAdded;
import net.runelite.client.events.NavigationButtonRemoved; import net.runelite.client.events.NavigationButtonRemoved;
@@ -38,11 +39,11 @@ import net.runelite.client.events.NavigationButtonRemoved;
@Singleton @Singleton
public class ClientToolbar public class ClientToolbar
{ {
private final EventBus eventBus; private final EventBusImplementation eventBus;
private final Set<NavigationButton> buttons = new HashSet<>(); private final Set<NavigationButton> buttons = new HashSet<>();
@Inject @Inject
private ClientToolbar(final EventBus eventBus) private ClientToolbar(final EventBusImplementation eventBus)
{ {
this.eventBus = eventBus; this.eventBus = eventBus;
} }

View File

@@ -84,7 +84,7 @@ import net.runelite.client.config.ExpandResizeType;
import net.runelite.client.config.Keybind; import net.runelite.client.config.Keybind;
import net.runelite.client.config.RuneLiteConfig; import net.runelite.client.config.RuneLiteConfig;
import net.runelite.client.config.WarningOnExit; import net.runelite.client.config.WarningOnExit;
import net.runelite.client.eventbus.Subscribe; import net.runelite.client.eventbus.EventBusImplementation;
import net.runelite.client.events.NavigationButtonAdded; import net.runelite.client.events.NavigationButtonAdded;
import net.runelite.client.events.NavigationButtonRemoved; import net.runelite.client.events.NavigationButtonRemoved;
import net.runelite.client.input.KeyManager; import net.runelite.client.input.KeyManager;
@@ -158,7 +158,8 @@ public class ClientUI
MouseManager mouseManager, MouseManager mouseManager,
@Nullable Applet client, @Nullable Applet client,
ConfigManager configManager, ConfigManager configManager,
Provider<ClientThread> clientThreadProvider) Provider<ClientThread> clientThreadProvider,
EventBusImplementation eventbus)
{ {
this.properties = properties; this.properties = properties;
this.config = config; this.config = config;
@@ -167,10 +168,21 @@ public class ClientUI
this.client = client; this.client = client;
this.configManager = configManager; this.configManager = configManager;
this.clientThreadProvider = clientThreadProvider; this.clientThreadProvider = clientThreadProvider;
eventbus.observableOfType(ConfigChanged.class)
.subscribe(this::onConfigChanged);
eventbus.observableOfType(NavigationButtonAdded.class)
.subscribe(this::onNavigationButtonAdded);
eventbus.observableOfType(NavigationButtonRemoved.class)
.subscribe(this::onNavigationButtonRemoved);
eventbus.observableOfType(GameStateChanged.class)
.subscribe(this::onGameStateChanged);
} }
@Subscribe private void onConfigChanged(ConfigChanged event)
public void onConfigChanged(ConfigChanged event)
{ {
if (!event.getGroup().equals(CONFIG_GROUP) if (!event.getGroup().equals(CONFIG_GROUP)
&& !(event.getGroup().equals(PLUS_CONFIG_GROUP) && !(event.getGroup().equals(PLUS_CONFIG_GROUP)
@@ -185,8 +197,7 @@ public class ClientUI
SwingUtilities.invokeLater(() -> updateFrameConfig(event.getKey().equals("lockWindowSize"))); SwingUtilities.invokeLater(() -> updateFrameConfig(event.getKey().equals("lockWindowSize")));
} }
@Subscribe private void onNavigationButtonAdded(final NavigationButtonAdded event)
public void onNavigationButtonAdded(final NavigationButtonAdded event)
{ {
SwingUtilities.invokeLater(() -> SwingUtilities.invokeLater(() ->
{ {
@@ -252,8 +263,7 @@ public class ClientUI
}); });
} }
@Subscribe private void onNavigationButtonRemoved(final NavigationButtonRemoved event)
public void onNavigationButtonRemoved(final NavigationButtonRemoved event)
{ {
SwingUtilities.invokeLater(() -> SwingUtilities.invokeLater(() ->
{ {
@@ -270,8 +280,7 @@ public class ClientUI
}); });
} }
@Subscribe private void onGameStateChanged(final GameStateChanged event)
public void onGameStateChanged(final GameStateChanged event)
{ {
if (event.getGameState() != GameState.LOGGED_IN || !(client instanceof Client) || !config.usernameInTitle()) if (event.getGameState() != GameState.LOGGED_IN || !(client instanceof Client) || !config.usernameInTitle())
{ {

View File

@@ -47,7 +47,7 @@ import net.runelite.client.config.ConfigGroup;
import net.runelite.client.config.ConfigManager; import net.runelite.client.config.ConfigManager;
import net.runelite.client.config.RuneLiteConfig; import net.runelite.client.config.RuneLiteConfig;
import net.runelite.client.eventbus.EventBus; import net.runelite.client.eventbus.EventBus;
import net.runelite.client.eventbus.Subscribe; import net.runelite.client.eventbus.EventBusImplementation;
import net.runelite.client.events.OverlayMenuClicked; import net.runelite.client.events.OverlayMenuClicked;
import net.runelite.client.events.PluginChanged; import net.runelite.client.events.PluginChanged;
@@ -104,24 +104,28 @@ public class OverlayManager
private final Map<OverlayLayer, List<Overlay>> overlayLayers = new EnumMap<>(OverlayLayer.class); private final Map<OverlayLayer, List<Overlay>> overlayLayers = new EnumMap<>(OverlayLayer.class);
private final ConfigManager configManager; private final ConfigManager configManager;
private final EventBus eventBus; private final EventBusImplementation eventBus;
@Inject @Inject
private OverlayManager(final ConfigManager configManager, final EventBus eventBus) private OverlayManager(final ConfigManager configManager, final EventBusImplementation eventBus)
{ {
this.configManager = configManager; this.configManager = configManager;
this.eventBus = eventBus; this.eventBus = eventBus;
eventBus.observableOfType(PluginChanged.class)
.subscribe(this::onPluginChanged);
eventBus.observableOfType(MenuOptionClicked.class)
.subscribe(this::onMenuOptionClicked);
} }
@Subscribe private void onPluginChanged(final PluginChanged event)
public void onPluginChanged(final PluginChanged event)
{ {
overlays.forEach(this::loadOverlay); overlays.forEach(this::loadOverlay);
rebuildOverlayLayers(); rebuildOverlayLayers();
} }
@Subscribe private void onMenuOptionClicked(MenuOptionClicked event)
public void onMenuOptionClicked(MenuOptionClicked event)
{ {
if (event.getMenuAction() != MenuAction.RUNELITE_OVERLAY) if (event.getMenuAction() != MenuAction.RUNELITE_OVERLAY)
{ {

View File

@@ -50,7 +50,7 @@ import net.runelite.api.events.FocusChanged;
import net.runelite.api.widgets.Widget; import net.runelite.api.widgets.Widget;
import net.runelite.api.widgets.WidgetInfo; import net.runelite.api.widgets.WidgetInfo;
import net.runelite.client.config.RuneLiteConfig; import net.runelite.client.config.RuneLiteConfig;
import net.runelite.client.eventbus.Subscribe; import net.runelite.client.eventbus.EventBusImplementation;
import net.runelite.client.input.KeyListener; import net.runelite.client.input.KeyListener;
import net.runelite.client.input.KeyManager; import net.runelite.client.input.KeyManager;
import net.runelite.client.input.MouseAdapter; import net.runelite.client.input.MouseAdapter;
@@ -59,6 +59,7 @@ import net.runelite.client.ui.JagexColors;
import net.runelite.client.util.ColorUtil; import net.runelite.client.util.ColorUtil;
import net.runelite.client.ui.FontManager; import net.runelite.client.ui.FontManager;
import net.runelite.client.util.MiscUtils; import net.runelite.client.util.MiscUtils;
import net.runelite.http.api.ws.messages.party.UserPart;
@Singleton @Singleton
public class OverlayRenderer extends MouseAdapter implements KeyListener public class OverlayRenderer extends MouseAdapter implements KeyListener
@@ -101,7 +102,8 @@ public class OverlayRenderer extends MouseAdapter implements KeyListener
final OverlayManager overlayManager, final OverlayManager overlayManager,
final RuneLiteConfig runeLiteConfig, final RuneLiteConfig runeLiteConfig,
final MouseManager mouseManager, final MouseManager mouseManager,
final KeyManager keyManager) final KeyManager keyManager,
final EventBusImplementation eventbus)
{ {
this.client = client; this.client = client;
this.overlayManager = overlayManager; this.overlayManager = overlayManager;
@@ -109,6 +111,18 @@ public class OverlayRenderer extends MouseAdapter implements KeyListener
this.updateConfig(); this.updateConfig();
keyManager.registerKeyListener(this); keyManager.registerKeyListener(this);
mouseManager.registerMouseListener(this); mouseManager.registerMouseListener(this);
eventbus.observableOfType(ConfigChanged.class)
.subscribe(this::onConfigChanged);
eventbus.observableOfType(FocusChanged.class)
.subscribe(this::onFocusChanged);
eventbus.observableOfType(ClientTick.class)
.subscribe(this::onClientTick);
eventbus.observableOfType(BeforeRender.class)
.subscribe(this::onBeforeRender);
} }
private void updateConfig() private void updateConfig()
@@ -120,8 +134,7 @@ public class OverlayRenderer extends MouseAdapter implements KeyListener
this.interfaceFont = FontManager.getFontFromType(clientFont, runeLiteConfig.interfaceFontType()); this.interfaceFont = FontManager.getFontFromType(clientFont, runeLiteConfig.interfaceFontType());
} }
@Subscribe private void onConfigChanged(ConfigChanged event)
public void onConfigChanged(ConfigChanged event)
{ {
if (event.getGroup().equals("runelite")) if (event.getGroup().equals("runelite"))
{ {
@@ -129,8 +142,7 @@ public class OverlayRenderer extends MouseAdapter implements KeyListener
} }
} }
@Subscribe private void onFocusChanged(FocusChanged event)
public void onFocusChanged(FocusChanged event)
{ {
if (!event.isFocused()) if (!event.isFocused())
{ {
@@ -140,7 +152,6 @@ public class OverlayRenderer extends MouseAdapter implements KeyListener
} }
} }
@Subscribe
protected void onClientTick(ClientTick t) protected void onClientTick(ClientTick t)
{ {
if (menuEntries == null) if (menuEntries == null)
@@ -167,8 +178,7 @@ public class OverlayRenderer extends MouseAdapter implements KeyListener
client.setMenuEntries(newEntries); client.setMenuEntries(newEntries);
} }
@Subscribe private void onBeforeRender(BeforeRender event)
public void onBeforeRender(BeforeRender event)
{ {
menuEntries = null; menuEntries = null;
} }

View File

@@ -39,7 +39,7 @@ import javax.inject.Singleton;
import lombok.extern.slf4j.Slf4j; import lombok.extern.slf4j.Slf4j;
import net.runelite.api.events.ConfigChanged; import net.runelite.api.events.ConfigChanged;
import net.runelite.client.config.RuneLiteConfig; import net.runelite.client.config.RuneLiteConfig;
import net.runelite.client.eventbus.Subscribe; import net.runelite.client.eventbus.EventBusImplementation;
import net.runelite.client.plugins.PluginDescriptor; import net.runelite.client.plugins.PluginDescriptor;
@Singleton @Singleton
@@ -50,13 +50,14 @@ public class InfoBoxManager
private final RuneLiteConfig runeLiteConfig; private final RuneLiteConfig runeLiteConfig;
@Inject @Inject
private InfoBoxManager(final RuneLiteConfig runeLiteConfig) private InfoBoxManager(final RuneLiteConfig runeLiteConfig, final EventBusImplementation eventbus)
{ {
this.runeLiteConfig = runeLiteConfig; this.runeLiteConfig = runeLiteConfig;
eventbus.observableOfType(ConfigChanged.class)
.subscribe(this::onConfigChanged);
} }
@Subscribe private void onConfigChanged(ConfigChanged event)
public void onConfigChanged(ConfigChanged event)
{ {
if (event.getGroup().equals("runelite") && event.getKey().equals("infoBoxSize")) if (event.getGroup().equals("runelite") && event.getKey().equals("infoBoxSize"))
{ {

View File

@@ -28,35 +28,22 @@ import java.util.Queue;
import java.util.concurrent.ConcurrentLinkedQueue; import java.util.concurrent.ConcurrentLinkedQueue;
import javax.inject.Inject; import javax.inject.Inject;
import javax.inject.Singleton; import javax.inject.Singleton;
import net.runelite.client.eventbus.EventBus; import net.runelite.client.eventbus.EventBusImplementation;
import org.jetbrains.annotations.NotNull;
@Singleton @Singleton
public class DeferredEventBus extends EventBus public class DeferredEventBus extends EventBusImplementation
{ {
private final EventBus eventBus; private final EventBusImplementation eventBus;
private final Queue<Object> pendingEvents = new ConcurrentLinkedQueue<>(); private final Queue<Object> pendingEvents = new ConcurrentLinkedQueue<>();
@Inject @Inject
private DeferredEventBus(EventBus eventBus) private DeferredEventBus(EventBusImplementation eventBus)
{ {
this.eventBus = eventBus; this.eventBus = eventBus;
} }
@Override @Override
public void register(@NotNull Object object) public void post(Object object)
{
eventBus.register(object);
}
@Override
public void unregister(@NotNull Object object)
{
eventBus.unregister(object);
}
@Override
public void post(@NotNull Object object)
{ {
pendingEvents.add(object); pendingEvents.add(object);
} }

View File

@@ -51,11 +51,12 @@ import net.runelite.api.events.PlayerSpawned;
import net.runelite.api.events.WallObjectSpawned; import net.runelite.api.events.WallObjectSpawned;
import net.runelite.client.callback.ClientThread; import net.runelite.client.callback.ClientThread;
import net.runelite.client.eventbus.EventBus; import net.runelite.client.eventbus.EventBus;
import net.runelite.client.eventbus.EventBusImplementation;
@Singleton @Singleton
public class GameEventManager public class GameEventManager
{ {
private final EventBus eventBus = new EventBus(); private final EventBusImplementation eventBus = new EventBusImplementation();
private final Client client; private final Client client;
private final ClientThread clientThread; private final ClientThread clientThread;
@@ -110,7 +111,7 @@ public class GameEventManager
clientThread.invoke(() -> clientThread.invoke(() ->
{ {
eventBus.register(subscriber); // eventBus.register(subscriber);
for (final InventoryID inventory : InventoryID.values()) for (final InventoryID inventory : InventoryID.values())
{ {
@@ -192,7 +193,7 @@ public class GameEventManager
}); });
}); });
eventBus.unregister(subscriber); // eventBus.unregister(subscriber);
}); });
} }
} }

View File

@@ -33,10 +33,10 @@ import javax.inject.Singleton;
import lombok.Getter; import lombok.Getter;
import lombok.Setter; import lombok.Setter;
import lombok.extern.slf4j.Slf4j; import lombok.extern.slf4j.Slf4j;
import net.runelite.api.events.GameStateChanged;
import net.runelite.client.account.AccountSession; import net.runelite.client.account.AccountSession;
import net.runelite.client.account.SessionManager; import net.runelite.client.account.SessionManager;
import net.runelite.client.eventbus.EventBus; import net.runelite.client.eventbus.EventBusImplementation;
import net.runelite.client.eventbus.Subscribe;
import net.runelite.client.events.PartyChanged; import net.runelite.client.events.PartyChanged;
import net.runelite.http.api.ws.messages.party.Join; import net.runelite.http.api.ws.messages.party.Join;
import net.runelite.http.api.ws.messages.party.Part; import net.runelite.http.api.ws.messages.party.Part;
@@ -52,7 +52,7 @@ public class PartyService
private final WSClient wsClient; private final WSClient wsClient;
private final SessionManager sessionManager; private final SessionManager sessionManager;
private final EventBus eventBus; private final EventBusImplementation eventBus;
private final List<PartyMember> members = new ArrayList<>(); private final List<PartyMember> members = new ArrayList<>();
@Getter @Getter
@@ -65,11 +65,17 @@ public class PartyService
private String username; private String username;
@Inject @Inject
private PartyService(final WSClient wsClient, final SessionManager sessionManager, final EventBus eventBus) private PartyService(final WSClient wsClient, final SessionManager sessionManager, final EventBusImplementation eventBus)
{ {
this.wsClient = wsClient; this.wsClient = wsClient;
this.sessionManager = sessionManager; this.sessionManager = sessionManager;
this.eventBus = eventBus; this.eventBus = eventBus;
eventBus.observableOfType(UserJoin.class)
.subscribe(this::onUserJoin);
eventBus.observableOfType(UserPart.class)
.subscribe(this::onUserPart);
} }
public void changeParty(UUID newParty) public void changeParty(UUID newParty)
@@ -111,8 +117,7 @@ public class PartyService
wsClient.send(new Join(partyId, username)); wsClient.send(new Join(partyId, username));
} }
@Subscribe private void onUserJoin(final UserJoin message)
public void onUserJoin(final UserJoin message)
{ {
if (!partyId.equals(message.getPartyId())) if (!partyId.equals(message.getPartyId()))
{ {
@@ -135,8 +140,7 @@ public class PartyService
} }
} }
@Subscribe private void onUserPart(final UserPart message)
public void onUserPart(final UserPart message)
{ {
members.removeIf(member -> member.getMemberId().equals(message.getMemberId())); members.removeIf(member -> member.getMemberId().equals(message.getMemberId()));
} }

View File

@@ -35,6 +35,7 @@ import javax.inject.Singleton;
import lombok.Getter; import lombok.Getter;
import lombok.extern.slf4j.Slf4j; import lombok.extern.slf4j.Slf4j;
import net.runelite.client.eventbus.EventBus; import net.runelite.client.eventbus.EventBus;
import net.runelite.client.eventbus.EventBusImplementation;
import net.runelite.http.api.RuneLiteAPI; import net.runelite.http.api.RuneLiteAPI;
import net.runelite.http.api.ws.WebsocketGsonFactory; import net.runelite.http.api.ws.WebsocketGsonFactory;
import net.runelite.http.api.ws.WebsocketMessage; import net.runelite.http.api.ws.WebsocketMessage;
@@ -49,7 +50,7 @@ import okhttp3.WebSocketListener;
@Singleton @Singleton
public class WSClient extends WebSocketListener implements AutoCloseable public class WSClient extends WebSocketListener implements AutoCloseable
{ {
private final EventBus eventBus; private final EventBusImplementation eventBus;
private final Collection<Class<? extends WebsocketMessage>> messages = new HashSet<>(); private final Collection<Class<? extends WebsocketMessage>> messages = new HashSet<>();
private volatile Gson gson; private volatile Gson gson;
@@ -58,7 +59,7 @@ public class WSClient extends WebSocketListener implements AutoCloseable
private WebSocket webSocket; private WebSocket webSocket;
@Inject @Inject
private WSClient(EventBus eventBus) private WSClient(EventBusImplementation eventBus)
{ {
this.eventBus = eventBus; this.eventBus = eventBus;
this.gson = WebsocketGsonFactory.build(WebsocketGsonFactory.factory(messages)); this.gson = WebsocketGsonFactory.build(WebsocketGsonFactory.factory(messages));