Merge remote-tracking branch 'runelite/master' into ihategitandihatethisihatemergingupstream

This commit is contained in:
sdburns1998
2019-06-29 01:08:56 +02:00
39 changed files with 472 additions and 97 deletions

View File

@@ -451,7 +451,7 @@ public interface ChatColorConfig extends Config
)
default Color transparentExamineHighlight()
{
return Color.decode("#0000FF");
return Color.GREEN;
}
@ConfigItem(

View File

@@ -110,6 +110,17 @@ public interface ChatCommandsConfig extends Config
@ConfigItem(
position = 7,
keyName = "duels",
name = "Duels Command",
description = "Configures whether the duel arena command is enabled<br> !duels"
)
default boolean duels()
{
return true;
}
@ConfigItem(
position = 8,
keyName = "clearShortcuts",
name = "Clear shortcuts",
description = "Enable shortcuts (ctrl+w and backspace) for clearing the chatbox"
@@ -118,4 +129,4 @@ public interface ChatCommandsConfig extends Config
{
return true;
}
}
}

View File

@@ -64,6 +64,7 @@ import net.runelite.client.plugins.PluginDescriptor;
import net.runelite.client.util.StackFormatter;
import static net.runelite.client.util.Text.sanitize;
import net.runelite.http.api.chat.ChatClient;
import net.runelite.http.api.chat.Duels;
import net.runelite.http.api.hiscore.HiscoreClient;
import net.runelite.http.api.hiscore.HiscoreEndpoint;
import net.runelite.http.api.hiscore.HiscoreResult;
@@ -89,6 +90,8 @@ public class ChatCommandsPlugin extends Plugin
private static final Pattern BARROWS_PATTERN = Pattern.compile("Your Barrows chest count is: <col=ff0000>(\\d+)</col>");
private static final Pattern KILL_DURATION_PATTERN = Pattern.compile("Fight duration: <col=ff0000>[0-9:]+</col>. Personal best: ([0-9:]+)");
private static final Pattern NEW_PB_PATTERN = Pattern.compile("Fight duration: <col=ff0000>([0-9:]+)</col> \\(new personal best\\)");
private static final Pattern DUEL_ARENA_WINS_PATTERN = Pattern.compile("You (were defeated|won)! You have(?: now)? won (\\d+) duels?");
private static final Pattern DUEL_ARENA_LOSSES_PATTERN = Pattern.compile("You have(?: now)? lost (\\d+) duels?");
private static final String TOTAL_LEVEL_COMMAND_STRING = "!total";
private static final String PRICE_COMMAND_STRING = "!price";
private static final String LEVEL_COMMAND_STRING = "!lvl";
@@ -98,6 +101,7 @@ public class ChatCommandsPlugin extends Plugin
private static final String QP_COMMAND_STRING = "!qp";
private static final String GC_COMMAND_STRING = "!gc";
private static final String PB_COMMAND = "!pb";
private static final String DUEL_ARENA_COMMAND = "!duels";
private final HiscoreClient hiscoreClient = new HiscoreClient();
private final ChatClient chatClient = new ChatClient();
@@ -148,6 +152,7 @@ public class ChatCommandsPlugin extends Plugin
chatCommandManager.registerCommandAsync(QP_COMMAND_STRING, this::questPointsLookup, this::questPointsSubmit);
chatCommandManager.registerCommandAsync(GC_COMMAND_STRING, this::gambleCountLookup, this::gambleCountSubmit);
chatCommandManager.registerCommandAsync(PB_COMMAND, this::personalBestLookup, this::personalBestSubmit);
chatCommandManager.registerCommandAsync(DUEL_ARENA_COMMAND, this::duelArenaLookup, this::duelArenaSubmit);
}
@Override
@@ -166,6 +171,7 @@ public class ChatCommandsPlugin extends Plugin
chatCommandManager.unregisterCommand(QP_COMMAND_STRING);
chatCommandManager.unregisterCommand(PB_COMMAND);
chatCommandManager.unregisterCommand(GC_COMMAND_STRING);
chatCommandManager.unregisterCommand(DUEL_ARENA_COMMAND);
}
@Provides
@@ -203,7 +209,9 @@ public class ChatCommandsPlugin extends Plugin
@Subscribe
public void onChatMessage(ChatMessage chatMessage)
{
if (chatMessage.getType() != ChatMessageType.GAMEMESSAGE && chatMessage.getType() != ChatMessageType.SPAM)
if (chatMessage.getType() != ChatMessageType.TRADE
&& chatMessage.getType() != ChatMessageType.GAMEMESSAGE
&& chatMessage.getType() != ChatMessageType.SPAM)
{
return;
}
@@ -239,6 +247,43 @@ public class ChatCommandsPlugin extends Plugin
return;
}
matcher = DUEL_ARENA_WINS_PATTERN.matcher(message);
if (matcher.find())
{
final int oldWins = getKc("Duel Arena Wins");
final int wins = Integer.parseInt(matcher.group(2));
final String result = matcher.group(1);
int winningStreak = getKc("Duel Arena Win Streak");
int losingStreak = getKc("Duel Arena Lose Streak");
if (result.equals("won") && wins > oldWins)
{
losingStreak = 0;
winningStreak += 1;
}
else if (result.equals("were defeated"))
{
losingStreak += 1;
winningStreak = 0;
}
else
{
log.warn("unrecognized duel streak chat message: {}", message);
}
setKc("Duel Arena Wins", wins);
setKc("Duel Arena Win Streak", winningStreak);
setKc("Duel Arena Lose Streak", losingStreak);
}
matcher = DUEL_ARENA_LOSSES_PATTERN.matcher(message);
if (matcher.find())
{
int losses = Integer.parseInt(matcher.group(1));
setKc("Duel Arena Losses", losses);
}
matcher = BARROWS_PATTERN.matcher(message);
if (matcher.find())
{
@@ -419,6 +464,96 @@ public class ChatCommandsPlugin extends Plugin
client.refreshChat();
}
private boolean duelArenaSubmit(ChatInput chatInput, String value)
{
final int wins = getKc("Duel Arena Wins");
final int losses = getKc("Duel Arena Losses");
final int winningStreak = getKc("Duel Arena Win Streak");
final int losingStreak = getKc("Duel Arena Lose Streak");
if (wins <= 0 && losses <= 0 && winningStreak <= 0 && losingStreak <= 0)
{
return false;
}
final String playerName = client.getLocalPlayer().getName();
executor.execute(() ->
{
try
{
chatClient.submitDuels(playerName, wins, losses, winningStreak, losingStreak);
}
catch (Exception ex)
{
log.warn("unable to submit duels", ex);
}
finally
{
chatInput.resume();
}
});
return true;
}
private void duelArenaLookup(ChatMessage chatMessage, String message)
{
if (!config.duels())
{
return;
}
ChatMessageType type = chatMessage.getType();
final String player;
if (type == ChatMessageType.PRIVATECHATOUT)
{
player = client.getLocalPlayer().getName();
}
else
{
player = sanitize(chatMessage.getName());
}
Duels duels;
try
{
duels = chatClient.getDuels(player);
}
catch (IOException ex)
{
log.debug("unable to lookup duels", ex);
return;
}
final int wins = duels.getWins();
final int losses = duels.getLosses();
final int winningStreak = duels.getWinningStreak();
final int losingStreak = duels.getLosingStreak();
String response = new ChatMessageBuilder()
.append(ChatColorType.NORMAL)
.append("Duel Arena wins: ")
.append(ChatColorType.HIGHLIGHT)
.append(Integer.toString(wins))
.append(ChatColorType.NORMAL)
.append(" losses: ")
.append(ChatColorType.HIGHLIGHT)
.append(Integer.toString(losses))
.append(ChatColorType.NORMAL)
.append(" streak: ")
.append(ChatColorType.HIGHLIGHT)
.append(Integer.toString((winningStreak != 0 ? winningStreak : -losingStreak)))
.build();
log.debug("Setting response {}", response);
final MessageNode messageNode = chatMessage.getMessageNode();
messageNode.setRuneLiteFormatMessage(response);
chatMessageManager.update(messageNode);
client.refreshChat();
}
private void questPointsLookup(ChatMessage chatMessage, String message)
{
if (!config.qp())
@@ -1231,4 +1366,4 @@ public class ChatCommandsPlugin extends Plugin
return WordUtils.capitalize(boss);
}
}
}
}

View File

@@ -37,6 +37,7 @@ class DevToolsButton extends JButton
{
super(title);
addActionListener((ev) -> setActive(!active));
this.setToolTipText(title);
}
void setActive(boolean active)

View File

@@ -62,4 +62,14 @@ public interface InterfaceStylesConfig extends Config
{
return false;
}
@ConfigItem(
keyName = "rsCrossSprites",
name = "RuneScape cross sprites",
description = "Replaces left-click cross sprites with the ones in RuneScape"
)
default boolean rsCrossSprites()
{
return false;
}
}

View File

@@ -31,11 +31,13 @@ import java.awt.image.BufferedImage;
import javax.inject.Inject;
import lombok.extern.slf4j.Slf4j;
import net.runelite.api.Client;
import net.runelite.api.GameState;
import net.runelite.api.HealthBar;
import net.runelite.api.SpriteID;
import net.runelite.api.Sprite;
import net.runelite.api.events.BeforeMenuRender;
import net.runelite.api.events.ConfigChanged;
import net.runelite.api.events.GameStateChanged;
import net.runelite.api.events.PostHealthBar;
import net.runelite.api.events.WidgetPositioned;
import net.runelite.api.widgets.Widget;
@@ -69,6 +71,8 @@ public class InterfaceStylesPlugin extends Plugin
@Inject
private SpriteManager spriteManager;
private Sprite[] defaultCrossSprites;
@Provides
InterfaceStylesConfig provideConfig(ConfigManager configManager)
{
@@ -89,6 +93,7 @@ public class InterfaceStylesPlugin extends Plugin
restoreWidgetDimensions();
removeGameframe();
restoreHealthBars();
restoreCrossSprites();
});
}
@@ -126,6 +131,22 @@ public class InterfaceStylesPlugin extends Plugin
}
}
@Subscribe
public void onGameStateChanged(GameStateChanged gameStateChanged)
{
if (gameStateChanged.getGameState() != GameState.LOGIN_SCREEN)
{
return;
}
/*
* The cross sprites aren't loaded yet when the initial config change event is received.
* So run the overriding for cross sprites when we reach the login screen,
* at which point the cross sprites will have been loaded.
*/
overrideCrossSprites();
}
private void updateAllOverrides()
{
removeGameframe();
@@ -134,6 +155,7 @@ public class InterfaceStylesPlugin extends Plugin
restoreWidgetDimensions();
adjustWidgetDimensions();
overrideHealthBars();
overrideCrossSprites();
}
@Subscribe
@@ -283,6 +305,62 @@ public class InterfaceStylesPlugin extends Plugin
clientThread.invokeLater(client::resetHealthBarCaches);
}
private void overrideCrossSprites()
{
if (config.rsCrossSprites())
{
// If we've already replaced them,
// we don't need to replace them again
if (defaultCrossSprites != null)
{
return;
}
Sprite[] crossSprites = client.getCrossSprites();
if (crossSprites == null)
{
return;
}
defaultCrossSprites = new Sprite[crossSprites.length];
System.arraycopy(crossSprites, 0, defaultCrossSprites, 0, defaultCrossSprites.length);
for (int i = 0; i < crossSprites.length; i++)
{
Sprite newSprite = getFileSpritePixels("rs3/cross_sprites/" + i + ".png");
if (newSprite == null)
{
continue;
}
crossSprites[i] = newSprite;
}
}
else
{
restoreCrossSprites();
}
}
private void restoreCrossSprites()
{
if (defaultCrossSprites == null)
{
return;
}
Sprite[] crossSprites = client.getCrossSprites();
if (crossSprites != null && defaultCrossSprites.length == crossSprites.length)
{
System.arraycopy(defaultCrossSprites, 0, crossSprites, 0, defaultCrossSprites.length);
}
defaultCrossSprites = null;
}
private void restoreWidgetDimensions()
{
for (WidgetOffset widgetOffset : WidgetOffset.values())

View File

@@ -118,33 +118,33 @@ enum WidgetOffset
FIXED_2005_INTERFACE_CONTAINER(Skin.AROUND_2005, WidgetInfo.FIXED_VIEWPORT_INTERFACE_CONTAINER, 7, null, null, null),
FIXED_2005_BANK_CONTAINER(Skin.AROUND_2005, WidgetInfo.FIXED_VIEWPORT_BANK_CONTAINER, 7, null, null, null),
FIXED_2005_COMBAT_HIGHLIGHT(Skin.AROUND_2005, WidgetInfo.FIXED_VIEWPORT_COMBAT_TAB, 19, 2, null, null),
FIXED_2005_COMBAT_ICON(Skin.AROUND_2005, WidgetInfo.FIXED_VIEWPORT_COMBAT_ICON, 26, null, null, null),
FIXED_2005_COMBAT_ICON(Skin.AROUND_2005, WidgetInfo.FIXED_VIEWPORT_COMBAT_ICON, 28, 1, null, null),
FIXED_2005_STATS_HIGHLIGHT(Skin.AROUND_2005, WidgetInfo.FIXED_VIEWPORT_STATS_TAB, 55, null, 30, null),
FIXED_2005_STATS_ICON(Skin.AROUND_2005, WidgetInfo.FIXED_VIEWPORT_STATS_ICON, 53, null, null, null),
FIXED_2005_STATS_ICON(Skin.AROUND_2005, WidgetInfo.FIXED_VIEWPORT_STATS_ICON, 51, null, null, null),
FIXED_2005_QUESTS_HIGHLIGHT(Skin.AROUND_2005, WidgetInfo.FIXED_VIEWPORT_QUESTS_TAB, 82, 1, 30, null),
FIXED_2005_QUESTS_ICON(Skin.AROUND_2005, WidgetInfo.FIXED_VIEWPORT_QUESTS_ICON, 81, null, null, null),
FIXED_2005_QUESTS_ICON(Skin.AROUND_2005, WidgetInfo.FIXED_VIEWPORT_QUESTS_ICON, 80, null, null, null),
FIXED_2005_INVENTORY_HIGHLIGHT(Skin.AROUND_2005, WidgetInfo.FIXED_VIEWPORT_INVENTORY_TAB, null, null, 45, null),
FIXED_2005_INVENTORY_ICON(Skin.AROUND_2005, WidgetInfo.FIXED_VIEWPORT_INVENTORY_ICON, 115, null, null, null),
FIXED_2005_INVENTORY_ICON(Skin.AROUND_2005, WidgetInfo.FIXED_VIEWPORT_INVENTORY_ICON, 113, 1, null, null),
FIXED_2005_EQUIPMENT_HIGHLIGHT(Skin.AROUND_2005, WidgetInfo.FIXED_VIEWPORT_EQUIPMENT_TAB, 153, 1, 30, null),
FIXED_2005_EQUIPMENT_ICON(Skin.AROUND_2005, WidgetInfo.FIXED_VIEWPORT_EQUIPMENT_ICON, 152, 4, null, null),
FIXED_2005_EQUIPMENT_ICON(Skin.AROUND_2005, WidgetInfo.FIXED_VIEWPORT_EQUIPMENT_ICON, 151, 4, null, null),
FIXED_2005_PRAYER_HIGHLIGHT(Skin.AROUND_2005, WidgetInfo.FIXED_VIEWPORT_PRAYER_TAB, 180, null, 32, null),
FIXED_2005_PRAYER_ICON(Skin.AROUND_2005, WidgetInfo.FIXED_VIEWPORT_PRAYER_ICON, 180, null, null, null),
FIXED_2005_PRAYER_ICON(Skin.AROUND_2005, WidgetInfo.FIXED_VIEWPORT_PRAYER_ICON, 178, null, null, null),
FIXED_2005_MAGIC_HIGHLIGHT(Skin.AROUND_2005, WidgetInfo.FIXED_VIEWPORT_MAGIC_TAB, 209, 1, 30, null),
FIXED_2005_MAGIC_ICON(Skin.AROUND_2005, WidgetInfo.FIXED_VIEWPORT_MAGIC_ICON, 206, 3, null, null),
FIXED_2005_MAGIC_ICON(Skin.AROUND_2005, WidgetInfo.FIXED_VIEWPORT_MAGIC_ICON, 206, 2, null, null),
FIXED_2005_CLAN_CHAT_HIGHLIGHT(Skin.AROUND_2005, WidgetInfo.FIXED_VIEWPORT_CLAN_CHAT_TAB, 15, null, null, null),
FIXED_2005_CLAN_CHAT_ICON(Skin.AROUND_2005, WidgetInfo.FIXED_VIEWPORT_CLAN_CHAT_ICON, 22, 0, null, null),
FIXED_2005_FRIENDS_HIGHLIGHT(Skin.AROUND_2005, WidgetInfo.FIXED_VIEWPORT_FRIENDS_TAB, 51, null, 30, null),
FIXED_2005_FRIENDS_ICON(Skin.AROUND_2005, WidgetInfo.FIXED_VIEWPORT_FRIENDS_ICON, 50, null, null, null),
FIXED_2005_FRIENDS_ICON(Skin.AROUND_2005, WidgetInfo.FIXED_VIEWPORT_FRIENDS_ICON, 49, -1, null, null),
FIXED_2005_IGNORES_HIGHLIGHT(Skin.AROUND_2005, WidgetInfo.FIXED_VIEWPORT_IGNORES_TAB, 79, null, 30, null),
FIXED_2005_IGNORES_ICON(Skin.AROUND_2005, WidgetInfo.FIXED_VIEWPORT_IGNORES_ICON, 78, null, null, null),
FIXED_2005_LOGOUT_HIGHLIGHT(Skin.AROUND_2005, WidgetInfo.FIXED_VIEWPORT_LOGOUT_TAB, 107, 1, 45, null),
FIXED_2005_LOGOUT_ICON(Skin.AROUND_2005, WidgetInfo.FIXED_VIEWPORT_LOGOUT_ICON, 114, 1, null, null),
FIXED_2005_LOGOUT_ICON(Skin.AROUND_2005, WidgetInfo.FIXED_VIEWPORT_LOGOUT_ICON, 112, null, null, null),
FIXED_2005_OPTIONS_HIGHLIGHT(Skin.AROUND_2005, WidgetInfo.FIXED_VIEWPORT_OPTIONS_TAB, 150, null, 30, null),
FIXED_2005_OPTIONS_ICON(Skin.AROUND_2005, WidgetInfo.FIXED_VIEWPORT_OPTIONS_ICON, 149, null, null, null),
FIXED_2005_OPTIONS_ICON(Skin.AROUND_2005, WidgetInfo.FIXED_VIEWPORT_OPTIONS_ICON, 148, -1, null, null),
FIXED_2005_EMOTES_HIGHLIGHT(Skin.AROUND_2005, WidgetInfo.FIXED_VIEWPORT_EMOTES_TAB, 178, null, 30, null),
FIXED_2005_EMOTES_ICON(Skin.AROUND_2005, WidgetInfo.FIXED_VIEWPORT_EMOTES_ICON, 179, null, null, null),
FIXED_2005_EMOTES_ICON(Skin.AROUND_2005, WidgetInfo.FIXED_VIEWPORT_EMOTES_ICON, 178, 1, null, null),
FIXED_2005_MUSIC_HIGHLIGHT(Skin.AROUND_2005, WidgetInfo.FIXED_VIEWPORT_MUSIC_TAB, 206, null, 30, null),
FIXED_2005_MUSIC_ICON(Skin.AROUND_2005, WidgetInfo.FIXED_VIEWPORT_MUSIC_ICON, 202, 5, null, null);
FIXED_2005_MUSIC_ICON(Skin.AROUND_2005, WidgetInfo.FIXED_VIEWPORT_MUSIC_ICON, 202, 2, null, null);
private Skin skin;
private WidgetInfo widgetInfo;

View File

@@ -129,9 +129,12 @@ public class LootTrackerPlugin extends Plugin
// Chest loot handling
private static final String CHEST_LOOTED_MESSAGE = "You find some treasure in the chest!";
private static final Pattern LARRAN_LOOTED_PATTERN = Pattern.compile("You have opened Larran's (big|small) chest .*");
private static final Map<Integer, String> CHEST_EVENT_TYPES = ImmutableMap.of(
5179, "Brimstone Chest",
11573, "Crystal Chest"
11573, "Crystal Chest",
12093, "Larran's big chest",
13113, "Larran's small chest"
);
private static final File LOOT_RECORDS_FILE = new File(RuneLite.RUNELITE_DIR, "lootRecords.json");
private static final Set<Integer> RESPAWN_REGIONS = ImmutableSet.of(
@@ -538,7 +541,7 @@ public class LootTrackerPlugin extends Plugin
final String message = event.getMessage();
if (message.equals(CHEST_LOOTED_MESSAGE))
if (message.equals(CHEST_LOOTED_MESSAGE) || LARRAN_LOOTED_PATTERN.matcher(message).matches())
{
final int regionID = client.getLocalPlayer().getWorldLocation().getRegionID();
if (!CHEST_EVENT_TYPES.containsKey(regionID))

View File

@@ -67,6 +67,7 @@ enum RareTreeLocation
new WorldPoint(1640, 3496, 0),
new WorldPoint(1613, 3494, 0),
new WorldPoint(1560, 3636, 0),
new WorldPoint(1646, 3590, 0),
// Miscellania
new WorldPoint(2550, 3869, 0),
@@ -109,9 +110,8 @@ enum RareTreeLocation
new WorldPoint(1353, 3731, 0),
new WorldPoint(1529, 3452, 0),
new WorldPoint(1591, 3421, 0),
new WorldPoint(1647, 3510, 0),
new WorldPoint(1632, 3509, 0),
new WorldPoint(1623, 3512, 0),
new WorldPoint(1647, 3508, 0),
new WorldPoint(1621, 3512, 0),
new WorldPoint(1593, 3491, 0),
new WorldPoint(1583, 3499, 0),
new WorldPoint(1696, 3554, 0),
@@ -119,6 +119,9 @@ enum RareTreeLocation
new WorldPoint(1625, 3669, 0),
new WorldPoint(1642, 3683, 0),
new WorldPoint(1642, 3663, 0),
new WorldPoint(1642, 3533, 0),
new WorldPoint(1671, 3657, 0),
new WorldPoint(1680, 3657, 0),
// Tirannwn
new WorldPoint(2217, 3141, 0),
@@ -187,8 +190,10 @@ enum RareTreeLocation
new WorldPoint(1389, 3821, 0),
new WorldPoint(1610, 3443, 0),
new WorldPoint(1578, 3488, 0),
new WorldPoint(1772, 3510, 0),
new WorldPoint(1685, 3740, 0),
new WorldPoint(1681, 3689, 0),
new WorldPoint(1751, 3564, 0),
new WorldPoint(1796, 3600, 0),
// Misthalin
new WorldPoint(3355, 3312, 0),