Merge remote-tracking branch 'runelite/master' into rl-upstream-16072020

# Conflicts:
#	cache/src/main/java/net/runelite/cache/util/XteaKeyManager.java
#	http-api/pom.xml
#	http-api/src/main/java/net/runelite/http/api/account/AccountClient.java
#	http-api/src/main/java/net/runelite/http/api/chat/ChatClient.java
#	http-api/src/main/java/net/runelite/http/api/item/ItemClient.java
#	http-api/src/main/java/net/runelite/http/api/osbuddy/OSBGrandExchangeClient.java
#	http-api/src/main/java/net/runelite/http/api/xtea/XteaClient.java
#	http-service/src/main/java/net/runelite/http/service/hiscore/HiscoreService.java
#	runelite-api/src/main/java/net/runelite/api/Client.java
#	runelite-api/src/main/java/net/runelite/api/EnumID.java
#	runelite-api/src/main/java/net/runelite/api/IndexDataBase.java
#	runelite-api/src/main/java/net/runelite/api/ItemComposition.java
#	runelite-api/src/main/java/net/runelite/api/PlayerComposition.java
#	runelite-api/src/main/java/net/runelite/api/ScriptID.java
#	runelite-api/src/main/java/net/runelite/api/VarbitComposition.java
#	runelite-api/src/main/java/net/runelite/api/events/ActorDeath.java
#	runelite-api/src/main/java/net/runelite/api/widgets/WidgetID.java
#	runelite-api/src/main/java/net/runelite/api/widgets/WidgetInfo.java
#	runelite-client/src/main/java/net/runelite/client/ClientSessionManager.java
#	runelite-client/src/main/java/net/runelite/client/RuneLite.java
#	runelite-client/src/main/java/net/runelite/client/RuneLiteModule.java
#	runelite-client/src/main/java/net/runelite/client/RuneLiteProperties.java
#	runelite-client/src/main/java/net/runelite/client/SessionClient.java
#	runelite-client/src/main/java/net/runelite/client/account/SessionManager.java
#	runelite-client/src/main/java/net/runelite/client/config/ConfigManager.java
#	runelite-client/src/main/java/net/runelite/client/externalplugins/ExternalPluginManager.java
#	runelite-client/src/main/java/net/runelite/client/game/ItemManager.java
#	runelite-client/src/main/java/net/runelite/client/game/WorldService.java
#	runelite-client/src/main/java/net/runelite/client/input/KeyListener.java
#	runelite-client/src/main/java/net/runelite/client/plugins/agility/AgilityConfig.java
#	runelite-client/src/main/java/net/runelite/client/plugins/agility/AgilityOverlay.java
#	runelite-client/src/main/java/net/runelite/client/plugins/agility/AgilityPlugin.java
#	runelite-client/src/main/java/net/runelite/client/plugins/agility/Obstacles.java
#	runelite-client/src/main/java/net/runelite/client/plugins/bank/BankPlugin.java
#	runelite-client/src/main/java/net/runelite/client/plugins/banktags/tabs/TabInterface.java
#	runelite-client/src/main/java/net/runelite/client/plugins/chatcommands/ChatCommandsPlugin.java
#	runelite-client/src/main/java/net/runelite/client/plugins/chatfilter/ChatFilterConfig.java
#	runelite-client/src/main/java/net/runelite/client/plugins/chatnotifications/ChatNotificationsConfig.java
#	runelite-client/src/main/java/net/runelite/client/plugins/chatnotifications/ChatNotificationsPlugin.java
#	runelite-client/src/main/java/net/runelite/client/plugins/cluescrolls/clues/CrypticClue.java
#	runelite-client/src/main/java/net/runelite/client/plugins/cluescrolls/clues/SkillChallengeClue.java
#	runelite-client/src/main/java/net/runelite/client/plugins/config/PluginListItem.java
#	runelite-client/src/main/java/net/runelite/client/plugins/config/PluginListPanel.java
#	runelite-client/src/main/java/net/runelite/client/plugins/devtools/VarInspector.java
#	runelite-client/src/main/java/net/runelite/client/plugins/discord/DiscordGameEventType.java
#	runelite-client/src/main/java/net/runelite/client/plugins/discord/DiscordPlugin.java
#	runelite-client/src/main/java/net/runelite/client/plugins/examine/ExaminePlugin.java
#	runelite-client/src/main/java/net/runelite/client/plugins/experiencedrop/XpDropPlugin.java
#	runelite-client/src/main/java/net/runelite/client/plugins/feed/FeedPanel.java
#	runelite-client/src/main/java/net/runelite/client/plugins/feed/FeedPlugin.java
#	runelite-client/src/main/java/net/runelite/client/plugins/grandexchange/GrandExchangeItemPanel.java
#	runelite-client/src/main/java/net/runelite/client/plugins/grandexchange/GrandExchangeOfferSlot.java
#	runelite-client/src/main/java/net/runelite/client/plugins/grandexchange/GrandExchangePlugin.java
#	runelite-client/src/main/java/net/runelite/client/plugins/grounditems/GroundItemsPlugin.java
#	runelite-client/src/main/java/net/runelite/client/plugins/hiscore/HiscorePanel.java
#	runelite-client/src/main/java/net/runelite/client/plugins/itemcharges/ItemChargeConfig.java
#	runelite-client/src/main/java/net/runelite/client/plugins/itemprices/ItemPricesOverlay.java
#	runelite-client/src/main/java/net/runelite/client/plugins/keyremapping/KeyRemappingListener.java
#	runelite-client/src/main/java/net/runelite/client/plugins/loginscreen/LoginScreenPlugin.java
#	runelite-client/src/main/java/net/runelite/client/plugins/loottracker/LootTrackerConfig.java
#	runelite-client/src/main/java/net/runelite/client/plugins/loottracker/LootTrackerPlugin.java
#	runelite-client/src/main/java/net/runelite/client/plugins/npchighlight/NpcIndicatorsConfig.java
#	runelite-client/src/main/java/net/runelite/client/plugins/npchighlight/NpcIndicatorsPlugin.java
#	runelite-client/src/main/java/net/runelite/client/plugins/raids/Raid.java
#	runelite-client/src/main/java/net/runelite/client/plugins/raids/RaidRoom.java
#	runelite-client/src/main/java/net/runelite/client/plugins/raids/RaidsConfig.java
#	runelite-client/src/main/java/net/runelite/client/plugins/raids/RaidsPlugin.java
#	runelite-client/src/main/java/net/runelite/client/plugins/raids/RoomType.java
#	runelite-client/src/main/java/net/runelite/client/plugins/randomevents/RandomEventConfig.java
#	runelite-client/src/main/java/net/runelite/client/plugins/randomevents/RandomEventPlugin.java
#	runelite-client/src/main/java/net/runelite/client/plugins/screenshot/ScreenshotPlugin.java
#	runelite-client/src/main/java/net/runelite/client/plugins/slayer/SlayerPlugin.java
#	runelite-client/src/main/java/net/runelite/client/plugins/timers/TimersPlugin.java
#	runelite-client/src/main/java/net/runelite/client/plugins/wiki/WikiSearchChatboxTextInput.java
#	runelite-client/src/main/java/net/runelite/client/plugins/worldmap/MinigameLocation.java
#	runelite-client/src/main/java/net/runelite/client/plugins/worldmap/MiningSiteLocation.java
#	runelite-client/src/main/java/net/runelite/client/plugins/worldmap/TeleportLocationData.java
#	runelite-client/src/main/java/net/runelite/client/plugins/worldmap/TransportationPointLocation.java
#	runelite-client/src/main/java/net/runelite/client/plugins/xptracker/XpTrackerPlugin.java
#	runelite-client/src/main/java/net/runelite/client/plugins/xpupdater/XpUpdaterPlugin.java
#	runelite-client/src/main/java/net/runelite/client/plugins/xtea/XteaPlugin.java
#	runelite-client/src/main/java/net/runelite/client/rs/ClientConfigLoader.java
#	runelite-client/src/main/java/net/runelite/client/rs/ClientLoader.java
#	runelite-client/src/main/resources/net/runelite/client/plugins/skillcalculator/skill_fletching.json
#	runelite-client/src/test/java/net/runelite/client/plugins/PluginManagerTest.java
#	runelite-client/src/test/java/net/runelite/client/plugins/bank/BankPluginTest.java
#	runelite-client/src/test/java/net/runelite/client/plugins/chatcommands/ChatCommandsPluginTest.java
#	runelite-client/src/test/java/net/runelite/client/plugins/examine/ExaminePluginTest.java
#	runelite-client/src/test/java/net/runelite/client/plugins/grandexchange/GrandExchangePluginTest.java
#	runelite-client/src/test/java/net/runelite/client/plugins/hiscore/HiscorePanelTest.java
#	runelite-client/src/test/java/net/runelite/client/plugins/keyremapping/KeyRemappingListenerTest.java
#	runelite-client/src/test/java/net/runelite/client/plugins/loottracker/LootTrackerPluginTest.java
#	runelite-client/src/test/java/net/runelite/client/plugins/npchighlight/NpcIndicatorsPluginTest.java
#	runelite-client/src/test/java/net/runelite/client/plugins/raids/RaidsPluginTest.java
#	runelite-client/src/test/java/net/runelite/client/plugins/slayer/SlayerPluginTest.java
#	runelite-client/src/test/java/net/runelite/client/plugins/xptracker/XpTrackerPluginTest.java
#	runelite-client/src/test/java/net/runelite/client/rs/ClientConfigLoaderTest.java
#	runelite-client/src/test/java/net/runelite/client/ui/overlay/infobox/InfoBoxManagerTest.java
This commit is contained in:
ThatGamerBlue
2020-07-16 17:50:30 +01:00
65 changed files with 549 additions and 311 deletions

View File

@@ -34,6 +34,7 @@ import lombok.extern.slf4j.Slf4j;
import net.runelite.client.eventbus.EventBus;
import net.runelite.client.events.ClientShutdown;
import net.runelite.client.task.Schedule;
import okhttp3.OkHttpClient;
@Singleton
@Slf4j
@@ -44,9 +45,10 @@ public class ClientSessionManager
@Inject
ClientSessionManager(EventBus eventBus)
ClientSessionManager(EventBus eventBus,
OkHttpClient okHttpClient)
{
this.sessionClient = new SessionClient();
this.sessionClient = new SessionClient(okHttpClient);
eventBus.subscribe(ClientShutdown.class, this, (e) ->
{

View File

@@ -214,6 +214,28 @@ public class Notifier
FlashNotification flashNotification = runeLiteConfig.flashNotification();
if (Instant.now().minusMillis(MINIMUM_FLASH_DURATION_MILLIS).isAfter(flashStart))
{
switch (flashNotification)
{
case FLASH_TWO_SECONDS:
case SOLID_TWO_SECONDS:
flashStart = null;
return;
case SOLID_UNTIL_CANCELLED:
case FLASH_UNTIL_CANCELLED:
// Any interaction with the client since the notification started will cancel it after the minimum duration
if ((client.getMouseIdleTicks() < MINIMUM_FLASH_DURATION_TICKS
|| client.getKeyboardIdleTicks() < MINIMUM_FLASH_DURATION_TICKS
|| client.getMouseLastPressedMillis() > mouseLastPressedMillis) && clientUI.isFocused())
{
flashStart = null;
return;
}
break;
}
}
if (client.getGameCycle() % 40 >= 20
// For solid colour, fall through every time.
&& (flashNotification == FlashNotification.FLASH_TWO_SECONDS
@@ -226,29 +248,6 @@ public class Notifier
graphics.setColor(FLASH_COLOR);
graphics.fill(new Rectangle(client.getCanvas().getSize()));
graphics.setColor(color);
if (!Instant.now().minusMillis(MINIMUM_FLASH_DURATION_MILLIS).isAfter(flashStart))
{
return;
}
switch (flashNotification)
{
case FLASH_TWO_SECONDS:
case SOLID_TWO_SECONDS:
flashStart = null;
break;
case SOLID_UNTIL_CANCELLED:
case FLASH_UNTIL_CANCELLED:
// Any interaction with the client since the notification started will cancel it after the minimum duration
if ((client.getMouseIdleTicks() < MINIMUM_FLASH_DURATION_TICKS
|| client.getKeyboardIdleTicks() < MINIMUM_FLASH_DURATION_TICKS
|| client.getMouseLastPressedMillis() > mouseLastPressedMillis) && clientUI.isFocused())
{
flashStart = null;
}
break;
}
}
private void sendNotification(

View File

@@ -102,8 +102,11 @@ import net.runelite.client.ui.overlay.worldmap.WorldMapOverlay;
import net.runelite.client.util.Groups;
import net.runelite.client.util.WorldUtil;
import net.runelite.client.ws.PartyService;
import net.runelite.http.api.RuneLiteAPI;
import net.runelite.http.api.worlds.World;
import net.runelite.http.api.worlds.WorldResult;
import okhttp3.Cache;
import okhttp3.OkHttpClient;
import org.slf4j.LoggerFactory;
@Singleton
@@ -118,12 +121,13 @@ public class RuneLite
public static final File EXTERNALPLUGIN_DIR = new File(RUNELITE_DIR, "externalmanager");
public static final File SCREENSHOT_DIR = new File(RUNELITE_DIR, "screenshots");
public static final File LOGS_DIR = new File(RUNELITE_DIR, "logs");
public static final File PLUGINS_DIR = new File(RUNELITE_DIR, "plugins");
public static final File DEFAULT_CONFIG_FILE = new File(RUNELITE_DIR, "runeliteplus.properties");
public static final Locale SYSTEM_LOCALE = Locale.getDefault();
public static boolean allowPrivateServer = false;
public static String uuid = UUID.randomUUID().toString();
private static final int MAX_OKHTTP_CACHE_SIZE = 20 * 1024 * 1024; // 20mb
@Getter
private static Injector injector;
@@ -239,6 +243,8 @@ public class RuneLite
parser.accepts("debug", "Show extra debugging output");
parser.accepts("safe-mode", "Disables external plugins and the GPU plugin");
parser.accepts("no-splash", "Do not show the splash screen");
parser.accepts("insecure-skip-tls-verification", "Disables TLS verification");
final ArgumentAcceptingOptionSpec<String> proxyInfo = parser
.accepts("proxy")
.withRequiredArg().ofType(String.class);
@@ -366,7 +372,11 @@ public class RuneLite
log.error("Unable to load settings", ex);
}
final ClientLoader clientLoader = new ClientLoader(options.valueOf(updateMode));
final OkHttpClient okHttpClient = RuneLiteAPI.CLIENT.newBuilder()
.cache(new Cache(new File(CACHE_DIR, "okhttp"), MAX_OKHTTP_CACHE_SIZE))
.build();
final ClientLoader clientLoader = new ClientLoader(okHttpClient, options.valueOf(updateMode));
Completable.fromAction(clientLoader::get)
.subscribeOn(Schedulers.computation())
.subscribe();
@@ -401,6 +411,7 @@ public class RuneLite
final long start = System.currentTimeMillis();
injector = Guice.createInjector(new RuneLiteModule(
okHttpClient,
clientLoader,
options.has("safe-mode"),
configFile));

View File

@@ -58,8 +58,7 @@ import net.runelite.client.task.Scheduler;
import net.runelite.client.util.DeferredEventBus;
import net.runelite.client.util.ExecutorServiceExceptionLogger;
import net.runelite.client.util.NonScheduledExecutorServiceExceptionLogger;
import net.runelite.http.api.RuneLiteAPI;
import okhttp3.Cache;
import net.runelite.http.api.chat.ChatClient;
import okhttp3.OkHttpClient;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
@@ -67,8 +66,7 @@ import org.slf4j.LoggerFactory;
@AllArgsConstructor
public class RuneLiteModule extends AbstractModule
{
private static final int MAX_OKHTTP_CACHE_SIZE = 20 * 1024 * 1024; // 20mb
private final OkHttpClient okHttpClient;
private final Supplier<Applet> clientLoader;
private final boolean safeMode;
private final File config;
@@ -78,9 +76,7 @@ public class RuneLiteModule extends AbstractModule
{
bindConstant().annotatedWith(Names.named("safeMode")).to(safeMode);
bind(File.class).annotatedWith(Names.named("config")).toInstance(config);
bind(OkHttpClient.class).toInstance(RuneLiteAPI.CLIENT.newBuilder()
.cache(new Cache(new File(RuneLite.CACHE_DIR, "okhttp"), MAX_OKHTTP_CACHE_SIZE))
.build());
bind(OkHttpClient.class).toInstance(okHttpClient);
bind(MenuManager.class);
bind(ChatMessageManager.class);
bind(ItemManager.class);
@@ -169,4 +165,11 @@ public class RuneLiteModule extends AbstractModule
return new NonScheduledExecutorServiceExceptionLogger(executor);
}
@Provides
@Singleton
ChatClient provideChatClient(OkHttpClient okHttpClient)
{
return new ChatClient(okHttpClient);
}
}

View File

@@ -28,13 +28,18 @@ import io.reactivex.rxjava3.core.Completable;
import io.reactivex.rxjava3.core.Observable;
import java.io.IOException;
import java.util.UUID;
import lombok.AllArgsConstructor;
import net.runelite.http.api.RuneLiteAPI;
import okhttp3.HttpUrl;
import okhttp3.OkHttpClient;
import okhttp3.Request;
import okhttp3.Response;
@AllArgsConstructor
class SessionClient
{
private final OkHttpClient okHttpClient;
Observable<UUID> openSession()
{
final HttpUrl url = RuneLiteAPI.getSessionBase().newBuilder()
@@ -47,7 +52,7 @@ class SessionClient
.url(url)
.build();
try (Response response = RuneLiteAPI.CLIENT.newCall(request).execute())
try (Response response = okHttpClient.newCall(request).execute())
{
return RuneLiteAPI.GSON.fromJson(response.body().string(), UUID.class);
}
@@ -67,11 +72,11 @@ class SessionClient
.url(url)
.build();
try (Response response = RuneLiteAPI.CLIENT.newCall(request).execute())
try (Response response = okHttpClient.newCall(request).execute())
{
if (!response.isSuccessful())
{
throw new IOException("Unsuccesful ping");
throw new IOException("Unsuccessful ping");
}
}
});
@@ -90,7 +95,7 @@ class SessionClient
.url(url)
.build();
RuneLiteAPI.CLIENT.newCall(request).execute().close();
okHttpClient.newCall(request).execute().close();
});
}
}
}

View File

@@ -47,6 +47,7 @@ import net.runelite.client.ws.WSClient;
import net.runelite.http.api.account.AccountClient;
import net.runelite.http.api.account.OAuthResponse;
import net.runelite.http.api.ws.messages.LoginResponse;
import okhttp3.OkHttpClient;
@Singleton
@Slf4j
@@ -59,12 +60,17 @@ public class SessionManager
private final EventBus eventBus;
private final WSClient wsClient;
private final AccountClient accountClient;
@Inject
private SessionManager(EventBus eventBus, WSClient wsClient)
private SessionManager(
EventBus eventBus,
WSClient wsClient,
OkHttpClient okHttpClient)
{
this.eventBus = eventBus;
this.wsClient = wsClient;
this.accountClient = new AccountClient(okHttpClient);
this.eventBus.subscribe(LoginResponse.class, this, this::onLoginResponse);
}
@@ -92,7 +98,7 @@ public class SessionManager
}
// Check if session is still valid
AccountClient accountClient = new AccountClient(session.getUuid());
accountClient.setUuid(session.getUuid());
accountClient.sessionCheck()
.subscribeOn(Schedulers.io())
.subscribe(b ->
@@ -169,10 +175,10 @@ public class SessionManager
log.debug("Logging out of account {}", accountSession.getUsername());
AccountClient client = new AccountClient(accountSession.getUuid());
accountClient.setUuid(accountSession.getUuid());
try
{
client.logout();
accountClient.logout();
}
catch (IOException ex)
{
@@ -188,13 +194,13 @@ public class SessionManager
{
// If a session is already open, use that id. Otherwise generate a new id.
UUID uuid = wsClient.getSessionId() != null ? wsClient.getSessionId() : UUID.randomUUID();
AccountClient loginClient = new AccountClient(uuid);
accountClient.setUuid(uuid);
final OAuthResponse login;
try
{
login = loginClient.login();
login = accountClient.login();
}
catch (IOException ex)
{

View File

@@ -33,11 +33,10 @@ import javax.inject.Inject;
import javax.inject.Singleton;
import lombok.AllArgsConstructor;
import lombok.Data;
import net.runelite.api.Client;
import net.runelite.client.callback.ClientThread;
import net.runelite.http.api.hiscore.HiscoreClient;
import net.runelite.http.api.hiscore.HiscoreEndpoint;
import net.runelite.http.api.hiscore.HiscoreResult;
import okhttp3.OkHttpClient;
@Singleton
public class HiscoreManager
@@ -53,12 +52,13 @@ public class HiscoreManager
static final HiscoreResult EMPTY = new HiscoreResult();
static final HiscoreResult NONE = new HiscoreResult();
private final HiscoreClient hiscoreClient = new HiscoreClient();
private final LoadingCache<HiscoreKey, HiscoreResult> hiscoreCache;
private final HiscoreClient hiscoreClient;
@Inject
public HiscoreManager(Client client, ScheduledExecutorService executor, ClientThread clientThread)
public HiscoreManager(ScheduledExecutorService executor, OkHttpClient okHttpClient)
{
hiscoreClient = new HiscoreClient(okHttpClient);
hiscoreCache = CacheBuilder.newBuilder()
.maximumSize(128L)
.expireAfterWrite(1, TimeUnit.HOURS)

View File

@@ -63,11 +63,38 @@ import net.runelite.http.api.item.ItemClient;
import net.runelite.http.api.item.ItemPrice;
import net.runelite.http.api.item.ItemStats;
import org.jetbrains.annotations.NotNull;
import okhttp3.OkHttpClient;
@Singleton
@Slf4j
public class ItemManager
{
@Value
private static class ImageKey
{
private final int itemId;
private final int itemQuantity;
private final boolean stackable;
}
@Value
private static class OutlineKey
{
private final int itemId;
private final int itemQuantity;
private final Color outlineColor;
}
private final Client client;
private final ClientThread clientThread;
private final ItemClient itemClient;
private Map<Integer, ItemPrice> itemPrices = Collections.emptyMap();
private Map<Integer, ItemStats> itemStats = Collections.emptyMap();
private final LoadingCache<ImageKey, AsyncBufferedImage> itemImages;
private final LoadingCache<Integer, ItemDefinition> itemDefinitions;
private final LoadingCache<OutlineKey, BufferedImage> itemOutlines;
// Worn items with weight reducing property have a different worn and inventory ItemID
private static final ImmutableMap<Integer, Integer> WORN_ITEMS = ImmutableMap.<Integer, Integer>builder().
put(BOOTS_OF_LIGHTNESS_89, BOOTS_OF_LIGHTNESS).
@@ -136,14 +163,6 @@ public class ItemManager
put(AGILITY_CAPET_13341, AGILITY_CAPET).
put(AGILITY_CAPE_13340, AGILITY_CAPE).
build();
private final Client client;
private final ClientThread clientThread;
private final ItemClient itemClient;
private final LoadingCache<ImageKey, AsyncBufferedImage> itemImages;
private final LoadingCache<Integer, ItemDefinition> itemDefinitions;
private final LoadingCache<OutlineKey, BufferedImage> itemOutlines;
private Map<Integer, ItemPrice> itemPrices = Collections.emptyMap();
private Map<Integer, ItemStats> itemStats = Map.of();
@Inject
public ItemManager(
@@ -151,12 +170,11 @@ public class ItemManager
ScheduledExecutorService executor,
ClientThread clientThread,
EventBus eventbus,
ItemClient itemClient
)
OkHttpClient okHttpClient)
{
this.client = client;
this.clientThread = clientThread;
this.itemClient = itemClient;
this.itemClient = new ItemClient(okHttpClient);
executor.scheduleWithFixedDelay(this::loadPrices, 0, 30, TimeUnit.MINUTES);
executor.submit(this::loadStats);
@@ -533,20 +551,4 @@ public class ItemManager
return null;
}
}
@Value
private static class ImageKey
{
private final int itemId;
private final int itemQuantity;
private final boolean stackable;
}
@Value
private static class OutlineKey
{
private final int itemId;
private final int itemQuantity;
private final Color outlineColor;
}
}

View File

@@ -34,13 +34,14 @@ import net.runelite.http.api.hiscore.HiscoreClient;
import net.runelite.http.api.hiscore.HiscoreResult;
import net.runelite.http.api.item.ItemEquipmentStats;
import net.runelite.http.api.item.ItemStats;
import okhttp3.OkHttpClient;
@Singleton
@Slf4j
@SuppressWarnings("unused")
public class PlayerManager
{
private static final HiscoreClient HISCORE_CLIENT = new HiscoreClient();
private final HiscoreClient hiscoreClient;
private final Client client;
private final ItemManager itemManager;
private final EventBus eventBus;
@@ -54,13 +55,16 @@ public class PlayerManager
final Client client,
final EventBus eventBus,
final ItemManager itemManager,
final FriendChatManager friendChatManager
final FriendChatManager friendChatManager,
final OkHttpClient okHttpClient
)
{
this.client = client;
this.itemManager = itemManager;
this.eventBus = eventBus;
this.friendChatManager = friendChatManager;
this.hiscoreClient = new HiscoreClient(okHttpClient);
eventBus.subscribe(PlayerDespawned.class, this, this::onPlayerDespawned);
eventBus.subscribe(AnimationChanged.class, this, this::onAnimationChanged);
eventBus.subscribe(PlayerAppearanceChanged.class, this, this::onAppearenceChanged);
@@ -174,7 +178,7 @@ public class PlayerManager
{
try
{
result = HISCORE_CLIENT.lookup(player.getName());
result = hiscoreClient.lookup(player.getName());
}
catch (IOException ex)
{

View File

@@ -43,6 +43,7 @@ import net.runelite.client.util.RunnableExceptionLogger;
import net.runelite.http.api.worlds.World;
import net.runelite.http.api.worlds.WorldClient;
import net.runelite.http.api.worlds.WorldResult;
import okhttp3.OkHttpClient;
@Singleton
@Slf4j
@@ -59,12 +60,15 @@ public class WorldService
private WorldResult worlds;
@Inject
private WorldService(Client client, ScheduledExecutorService scheduledExecutorService, WorldClient worldClient,
EventBus eventBus)
private WorldService(
Client client,
ScheduledExecutorService scheduledExecutorService,
OkHttpClient okHttpClient,
EventBus eventBus)
{
this.client = client;
this.scheduledExecutorService = scheduledExecutorService;
this.worldClient = worldClient;
this.worldClient = new WorldClient(okHttpClient);
this.eventBus = eventBus;
scheduledExecutorService.scheduleWithFixedDelay(RunnableExceptionLogger.wrap(this::tick), 0, WORLD_FETCH_TIMER, TimeUnit.MINUTES);

View File

@@ -184,6 +184,11 @@ public class ChatboxItemSearch extends ChatboxTextInput
@Override
public void keyPressed(KeyEvent ev)
{
if (!chatboxPanelManager.shouldTakeInput())
{
return;
}
switch (ev.getKeyCode())
{
case KeyEvent.VK_ENTER:

View File

@@ -200,4 +200,12 @@ public class ChatboxPanelManager
{
return client.getWidget(WidgetInfo.CHATBOX_CONTAINER);
}
public boolean shouldTakeInput()
{
// the search box on the world map can be focused, and chat input goes there, even
// though the chatbox still has its key listener.
Widget worldMapSearch = client.getWidget(WidgetInfo.WORLD_MAP_SEARCH);
return worldMapSearch == null || client.getVar(VarClientInt.WORLD_MAP_SEARCH_FOCUSED) != 1;
}
}

View File

@@ -609,6 +609,11 @@ public class ChatboxTextInput extends ChatboxInput implements KeyListener, Mouse
@Override
public void keyTyped(KeyEvent e)
{
if (!chatboxPanelManager.shouldTakeInput())
{
return;
}
char c = e.getKeyChar();
if (charValidator.test(c))
{
@@ -628,6 +633,11 @@ public class ChatboxTextInput extends ChatboxInput implements KeyListener, Mouse
@Override
public void keyPressed(KeyEvent ev)
{
if (!chatboxPanelManager.shouldTakeInput())
{
return;
}
int code = ev.getKeyCode();
if (ev.isControlDown())
{

View File

@@ -178,6 +178,11 @@ public class ChatboxTextMenuInput extends ChatboxInput implements KeyListener
@Override
public void keyTyped(KeyEvent e)
{
if (!chatboxPanelManager.shouldTakeInput())
{
return;
}
char c = e.getKeyChar();
if (c == '\033')
@@ -198,6 +203,11 @@ public class ChatboxTextMenuInput extends ChatboxInput implements KeyListener
@Override
public void keyPressed(KeyEvent e)
{
if (!chatboxPanelManager.shouldTakeInput())
{
return;
}
if (e.getKeyCode() == KeyEvent.VK_ESCAPE)
{
e.consume();

View File

@@ -24,4 +24,10 @@
*/
package net.runelite.client.input;
public interface KeyListener extends java.awt.event.KeyListener {}
public interface KeyListener extends java.awt.event.KeyListener
{
default boolean isEnabledOnLoginScreen()
{
return false;
}
}

View File

@@ -32,7 +32,6 @@ import javax.inject.Inject;
import javax.inject.Singleton;
import net.runelite.api.Client;
import net.runelite.api.GameState;
import net.runelite.client.util.HotkeyListener;
@Singleton
public class KeyManager
@@ -133,18 +132,13 @@ public class KeyManager
return true;
}
if (!(keyListener instanceof HotkeyListener))
final GameState gameState = client.getGameState();
if (gameState == GameState.LOGIN_SCREEN || gameState == GameState.LOGIN_SCREEN_AUTHENTICATOR)
{
return true;
return keyListener.isEnabledOnLoginScreen();
}
final HotkeyListener hotkeyListener = (HotkeyListener) keyListener;
if (hotkeyListener.isEnabledOnLogin())
{
return true;
}
return client.getGameState() != GameState.LOGIN_SCREEN;
return true;
}
}

View File

@@ -619,7 +619,6 @@ public class PluginManager
binder.install(plugin);
};
Injector pluginInjector = parent.createChildInjector(pluginModule);
pluginInjector.injectMembers(plugin);
plugin.injector = pluginInjector;
}
catch (CreationException ex)

View File

@@ -27,6 +27,7 @@ package net.runelite.client.plugins.xtea;
import java.io.IOException;
import java.util.HashMap;
import com.google.inject.Provides;
import javax.inject.Inject;
import lombok.extern.slf4j.Slf4j;
import net.runelite.api.Client;
@@ -37,6 +38,7 @@ import net.runelite.client.plugins.Plugin;
import net.runelite.client.plugins.PluginDescriptor;
import net.runelite.http.api.xtea.XteaClient;
import org.apache.commons.lang3.ArrayUtils;
import okhttp3.OkHttpClient;
@PluginDescriptor(
name = "Xtea",
@@ -45,13 +47,16 @@ import org.apache.commons.lang3.ArrayUtils;
@Slf4j
public class XteaPlugin extends Plugin
{
private final XteaClient xteaClient = new XteaClient();
@Inject
private XteaClient xteaClient;
@Inject
private Client client;
private HashMap<Integer, Integer[]> xteas;
@Override
public void startUp()
{
try
{
@@ -63,6 +68,12 @@ public class XteaPlugin extends Plugin
}
}
@Provides
XteaClient provideXteaClient(OkHttpClient okHttpClient)
{
return new XteaClient(okHttpClient);
}
@Subscribe
private void onGameStateChanged(GameStateChanged gameStateChanged)
{

View File

@@ -28,19 +28,18 @@ package net.runelite.client.rs;
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.concurrent.TimeUnit;
import lombok.AllArgsConstructor;
import okhttp3.HttpUrl;
import okhttp3.OkHttpClient;
import okhttp3.Request;
import okhttp3.Response;
@AllArgsConstructor
class ClientConfigLoader
{
private ClientConfigLoader()
{
}
private final OkHttpClient okHttpClient;
static RSConfig fetch(HttpUrl url) throws IOException
RSConfig fetch(HttpUrl url) throws IOException
{
final Request request = new Request.Builder()
.url(url)
@@ -48,10 +47,6 @@ class ClientConfigLoader
final RSConfig config = new RSConfig();
OkHttpClient okHttpClient = new OkHttpClient.Builder()
.connectTimeout(2000, TimeUnit.MILLISECONDS)
.build();
try (final Response response = okHttpClient.newCall(request).execute())
{
if (!response.isSuccessful())

View File

@@ -40,23 +40,27 @@ import net.runelite.client.RuneLite;
import net.runelite.client.ui.RuneLiteSplashScreen;
import net.runelite.http.api.worlds.World;
import okhttp3.HttpUrl;
import okhttp3.OkHttpClient;
@Slf4j
public class ClientLoader implements Supplier<Applet>
{
private static final String CONFIG_URL = "https://oldschool.runescape.com/jav_config.ws";
private static final String BACKUP_CONFIG_URL = "https://raw.githubusercontent.com/open-osrs/hosting/master/jav_config.ws";
private static final int NUM_ATTEMPTS = 10;
private final ClientUpdateCheckMode updateCheckMode;
private Object client = null;
private WorldSupplier worldSupplier = new WorldSupplier();
private final ClientConfigLoader clientConfigLoader;
private final ClientUpdateCheckMode updateCheckMode;
private final WorldSupplier worldSupplier;
private Object client;
private RSConfig config;
public ClientLoader(ClientUpdateCheckMode updateCheckMode)
public ClientLoader(OkHttpClient okHttpClient, ClientUpdateCheckMode updateCheckMode)
{
this.clientConfigLoader = new ClientConfigLoader(okHttpClient);
this.updateCheckMode = updateCheckMode;
this.worldSupplier = new WorldSupplier(okHttpClient);
}
private static Applet loadRLPlus(final RSConfig config)
@@ -178,7 +182,7 @@ public class ClientLoader implements Supplier<Applet>
RuneLiteSplashScreen.stage(.0, "Connecting with gameserver (try " + (attempt + 1) + "/" + NUM_ATTEMPTS + ")");
try
{
config = ClientConfigLoader.fetch(url);
config = clientConfigLoader.fetch(url);
if (Strings.isNullOrEmpty(config.getCodeBase()) || Strings.isNullOrEmpty(config.getInitialJar()) || Strings.isNullOrEmpty(config.getInitialClass()))
{
@@ -200,7 +204,7 @@ public class ClientLoader implements Supplier<Applet>
try
{
RSConfig backupConfig = ClientConfigLoader.fetch(HttpUrl.parse(BACKUP_CONFIG_URL));
RSConfig backupConfig = clientConfigLoader.fetch(HttpUrl.parse(BACKUP_CONFIG_URL));
if (Strings.isNullOrEmpty(backupConfig.getCodeBase()) || Strings.isNullOrEmpty(backupConfig.getInitialJar())
|| Strings.isNullOrEmpty(backupConfig.getInitialClass()) || Strings.isNullOrEmpty(backupConfig.getRuneLiteWorldParam()))

View File

@@ -33,15 +33,18 @@ import java.util.Queue;
import java.util.Random;
import java.util.function.Supplier;
import java.util.stream.Collectors;
import lombok.RequiredArgsConstructor;
import lombok.extern.slf4j.Slf4j;
import net.runelite.http.api.RuneLiteAPI;
import net.runelite.http.api.worlds.World;
import net.runelite.http.api.worlds.WorldClient;
import net.runelite.http.api.worlds.WorldType;
import okhttp3.OkHttpClient;
@Slf4j
@RequiredArgsConstructor
class WorldSupplier implements Supplier<World>
{
private final OkHttpClient okHttpClient;
private final Random random = new Random(System.nanoTime());
private Queue<World> worlds = new ArrayDeque<>();
@@ -55,7 +58,7 @@ class WorldSupplier implements Supplier<World>
try
{
List<World> newWorlds = new WorldClient(RuneLiteAPI.CLIENT)
List<World> newWorlds = new WorldClient(okHttpClient)
.lookupWorlds()
.getWorlds()
.stream()

View File

@@ -402,7 +402,7 @@ public class ClientUI
toggleSidebar();
}
};
sidebarListener.setEnabledOnLogin(true);
sidebarListener.setEnabledOnLoginScreen(true);
keyManager.registerKeyListener(sidebarListener);
final HotkeyListener pluginPanelListener = new HotkeyListener(config::panelToggleKey)
@@ -413,7 +413,7 @@ public class ClientUI
togglePluginPanel();
}
};
pluginPanelListener.setEnabledOnLogin(true);
pluginPanelListener.setEnabledOnLoginScreen(true);
keyManager.registerKeyListener(pluginPanelListener);
// Add mouse listener

View File

@@ -61,7 +61,7 @@ public class ThinProgressBar extends JPanel
public void setForeground(Color color)
{
super.setForeground(color);
setBackground(color.darker());
setBackground(color.darker().darker());
}
public void setMaximumValue(int maximumValue)

View File

@@ -63,6 +63,7 @@ public class WidgetOverlay extends Overlay
.put(WidgetInfo.LMS_KDA, OverlayPosition.TOP_RIGHT)
.put(WidgetInfo.THEATRE_OF_BLOOD_HEALTH_ORBS, OverlayPosition.TOP_LEFT)
.put(WidgetInfo.GAUNTLET_TIMER_CONTAINER, OverlayPosition.TOP_LEFT)
.put(WidgetInfo.HEALTH_OVERLAY_BAR, OverlayPosition.TOP_CENTER)
.build();
public static Collection<WidgetOverlay> createOverlays(final Client client)

View File

@@ -28,6 +28,7 @@ import com.google.common.collect.ComparisonChain;
import java.awt.Graphics;
import java.awt.image.BufferedImage;
import java.util.Collections;
import java.util.Comparator;
import java.util.List;
import java.util.concurrent.CopyOnWriteArrayList;
import java.util.Objects;
@@ -72,12 +73,12 @@ public class InfoBoxManager
synchronized (this)
{
int idx = Collections.binarySearch(infoBoxes, infoBox, (b1, b2) -> ComparisonChain
int idx = findInsertionIndex(infoBoxes, infoBox, (b1, b2) -> ComparisonChain
.start()
.compare(b1.getPriority(), b2.getPriority())
.compare(b1.getPlugin().getName(), b2.getPlugin().getName())
.result());
infoBoxes.add(idx < 0 ? -idx - 1 : idx, infoBox);
infoBoxes.add(idx, infoBox);
}
BufferedImage image = infoBox.getImage();
@@ -150,4 +151,38 @@ public class InfoBoxManager
}
infoBox.setScaledImage(resultImage);
}
/**
* Find insertion point for the given key into the given sorted list. If key already exists in the list,
* return the index after the last occurrence.
* @param list
* @param key
* @param c
* @param <T>
* @return
*/
private static <T> int findInsertionIndex(List<? extends T> list, T key, Comparator<? super T> c)
{
int idx = Collections.binarySearch(list, key, c);
if (idx < 0)
{
// key isn't found in the list
return -idx - 1;
}
// list(idx) is equal to key, so it is not necessary to recheck it
for (int i = idx + 1; i < list.size(); ++i)
{
T cur = list.get(i);
int cmp = c.compare(cur, key);
if (cmp > 0)
{
// this is the first element which is greater
return i;
}
}
return list.size();
}
}

View File

@@ -39,6 +39,7 @@ import net.runelite.client.ui.overlay.OverlayLayer;
import net.runelite.client.ui.overlay.OverlayPosition;
import net.runelite.client.ui.overlay.OverlayPriority;
import net.runelite.client.ui.overlay.components.LayoutableRenderableEntity;
import net.runelite.client.ui.overlay.components.PanelComponent;
import net.runelite.client.ui.overlay.components.TooltipComponent;
@Singleton
@@ -103,12 +104,17 @@ public class TooltipOverlay extends Overlay
if (tooltip.getComponent() != null)
{
entity = tooltip.getComponent();
if (entity instanceof PanelComponent)
{
((PanelComponent) entity).setBackgroundColor(runeLiteConfig.overlayBackgroundColor());
}
}
else
{
final TooltipComponent tooltipComponent = new TooltipComponent();
tooltipComponent.setModIcons(client.getModIcons());
tooltipComponent.setText(tooltip.getText());
tooltipComponent.setBackgroundColor(runeLiteConfig.overlayBackgroundColor());
entity = tooltipComponent;
}

View File

@@ -26,7 +26,6 @@ package net.runelite.client.util;
import java.awt.event.KeyEvent;
import java.util.function.Supplier;
import lombok.Getter;
import lombok.RequiredArgsConstructor;
import lombok.Setter;
import net.runelite.client.config.Keybind;
@@ -42,8 +41,13 @@ public abstract class HotkeyListener implements KeyListener
private boolean isConsumingTyped = false;
@Setter
@Getter
private boolean isEnabledOnLogin = false;
private boolean enabledOnLoginScreen;
@Override
public boolean isEnabledOnLoginScreen()
{
return enabledOnLoginScreen;
}
@Override
public void keyTyped(KeyEvent e)

View File

@@ -58,6 +58,7 @@ import okhttp3.Call;
import okhttp3.Callback;
import okhttp3.HttpUrl;
import okhttp3.MediaType;
import okhttp3.OkHttpClient;
import okhttp3.Request;
import okhttp3.RequestBody;
import okhttp3.Response;
@@ -76,6 +77,9 @@ public class ImageCapture
@Inject
private Notifier notifier;
@Inject
private OkHttpClient okHttpClient;
/**
* Saves a screenshot of the client window to the screenshot folder as a PNG,
* and optionally uploads it to an image-hosting service.
@@ -197,7 +201,7 @@ public class ImageCapture
.post(RequestBody.create(JSON, json))
.build();
RuneLiteAPI.CLIENT.newCall(request).enqueue(new Callback()
okHttpClient.newCall(request).enqueue(new Callback()
{
@Override
public void onFailure(Call call, IOException ex)

View File

@@ -40,6 +40,7 @@ import net.runelite.http.api.ws.WebsocketGsonFactory;
import net.runelite.http.api.ws.WebsocketMessage;
import net.runelite.http.api.ws.messages.Handshake;
import net.runelite.http.api.ws.messages.party.PartyMessage;
import okhttp3.OkHttpClient;
import okhttp3.Request;
import okhttp3.Response;
import okhttp3.WebSocket;
@@ -50,6 +51,7 @@ import okhttp3.WebSocketListener;
public class WSClient extends WebSocketListener implements AutoCloseable
{
private final EventBus eventBus;
private final OkHttpClient okHttpClient;
private final Collection<Class<? extends WebsocketMessage>> messages = new HashSet<>();
private volatile Gson gson;
@@ -58,9 +60,10 @@ public class WSClient extends WebSocketListener implements AutoCloseable
private WebSocket webSocket;
@Inject
private WSClient(EventBus eventBus)
private WSClient(EventBus eventBus, OkHttpClient okHttpClient)
{
this.eventBus = eventBus;
this.okHttpClient = okHttpClient;
this.gson = WebsocketGsonFactory.build(WebsocketGsonFactory.factory(messages));
}
@@ -101,7 +104,7 @@ public class WSClient extends WebSocketListener implements AutoCloseable
.url(RuneLiteAPI.getWsEndpoint())
.build();
webSocket = RuneLiteAPI.CLIENT.newWebSocket(request, this);
webSocket = okHttpClient.newWebSocket(request, this);
Handshake handshake = new Handshake();
handshake.setSession(sessionId);