Merge remote-tracking branch 'runelite/master'

This commit is contained in:
Owain van Brakel
2021-09-03 20:42:14 +02:00
20 changed files with 304 additions and 20 deletions

View File

@@ -44,12 +44,16 @@ import lombok.RequiredArgsConstructor;
import lombok.Value;
import lombok.extern.slf4j.Slf4j;
import net.runelite.client.util.ReflectUtil;
import org.slf4j.Marker;
import org.slf4j.MarkerFactory;
@Slf4j
@RequiredArgsConstructor
@ThreadSafe
public class EventBus
{
private static final Marker DEDUPLICATE = MarkerFactory.getMarker("DEDUPLICATE");
@Value
public static class Subscriber
{
@@ -82,7 +86,7 @@ public class EventBus
*/
public EventBus()
{
this((e) -> log.warn("Uncaught exception in event subscriber", e));
this((e) -> log.warn(DEDUPLICATE, "Uncaught exception in event subscriber", e));
}
/**

View File

@@ -196,6 +196,7 @@ public enum ItemMapping
ITEM_SANGUINESTI_STAFF(SANGUINESTI_STAFF_UNCHARGED, SANGUINESTI_STAFF, HOLY_SANGUINESTI_STAFF_UNCHARGED, HOLY_SANGUINESTI_STAFF),
ITEM_SCYTHE_OF_VITUR(SCYTHE_OF_VITUR_UNCHARGED, SCYTHE_OF_VITUR, HOLY_SCYTHE_OF_VITUR_UNCHARGED, HOLY_SCYTHE_OF_VITUR, SANGUINE_SCYTHE_OF_VITUR_UNCHARGED, SANGUINE_SCYTHE_OF_VITUR),
ITEM_TOME_OF_FIRE(TOME_OF_FIRE_EMPTY, TOME_OF_FIRE),
ITEM_TOME_OF_WATER(TOME_OF_WATER_EMPTY, TOME_OF_WATER),
ITEM_CRAWS_BOW(CRAWS_BOW_U, CRAWS_BOW),
ITEM_VIGGORAS_CHAINMACE(VIGGORAS_CHAINMACE_U, VIGGORAS_CHAINMACE),
ITEM_THAMMARONS_SCEPTRE(THAMMARONS_SCEPTRE_U, THAMMARONS_SCEPTRE),
@@ -255,6 +256,7 @@ public enum ItemMapping
ITEM_VOLATILE_ORB(VOLATILE_ORB, VOLATILE_NIGHTMARE_STAFF),
ITEM_NIGHTMARE_STAFF(NIGHTMARE_STAFF, ELDRITCH_NIGHTMARE_STAFF, HARMONISED_NIGHTMARE_STAFF, VOLATILE_NIGHTMARE_STAFF),
ITEM_GHARZI_RAPIER(GHRAZI_RAPIER, HOLY_GHRAZI_RAPIER),
ITEM_MASTER_SCROLL_BOOK(MASTER_SCROLL_BOOK_EMPTY, MASTER_SCROLL_BOOK),
// Trouver Parchment
ITEM_TROUVER_PARCHMENT(

View File

@@ -50,6 +50,7 @@ import javax.swing.SwingConstants;
import javax.swing.border.EmptyBorder;
import lombok.AccessLevel;
import lombok.Getter;
import net.runelite.api.ItemID;
import net.runelite.client.game.ItemManager;
import net.runelite.client.ui.ColorScheme;
import net.runelite.client.ui.FontManager;
@@ -375,8 +376,32 @@ class LootTrackerBox extends JPanel
final long gePrice = item.getTotalGePrice();
final long haPrice = item.getTotalHaPrice();
final String ignoredLabel = item.isIgnored() ? " - Ignored" : "";
return "<html>" + name + " x " + quantity + ignoredLabel
+ "<br>GE: " + QuantityFormatter.quantityToStackSize(gePrice)
+ "<br>HA: " + QuantityFormatter.quantityToStackSize(haPrice) + "</html>";
final StringBuilder sb = new StringBuilder("<html>");
sb.append(name).append(" x ").append(QuantityFormatter.formatNumber(quantity)).append(ignoredLabel);
if (item.getId() == ItemID.COINS_995)
{
sb.append("</html>");
return sb.toString();
}
sb.append("<br>GE: ").append(QuantityFormatter.quantityToStackSize(gePrice));
if (quantity > 1)
{
sb.append(" (").append(QuantityFormatter.quantityToStackSize(item.getGePrice())).append(" ea)");
}
if (item.getId() == ItemID.PLATINUM_TOKEN)
{
sb.append("</html>");
return sb.toString();
}
sb.append("<br>HA: ").append(QuantityFormatter.quantityToStackSize(haPrice));
if (quantity > 1)
{
sb.append(" (").append(QuantityFormatter.quantityToStackSize(item.getHaPrice())).append(" ea)");
}
sb.append("</html>");
return sb.toString();
}
}

View File

@@ -74,6 +74,7 @@ import net.runelite.api.ObjectID;
import net.runelite.api.Player;
import net.runelite.api.Skill;
import net.runelite.api.SpriteID;
import net.runelite.api.WorldType;
import net.runelite.api.coords.WorldPoint;
import net.runelite.api.events.ChatMessage;
import net.runelite.api.events.GameStateChanged;
@@ -479,7 +480,7 @@ public class LootTrackerPlugin extends Plugin
if (config.saveLoot())
{
LootRecord lootRecord = new LootRecord(name, type, metadata, toGameItems(items), Instant.now());
LootRecord lootRecord = new LootRecord(name, type, metadata, toGameItems(items), Instant.now(), getLootWorldId());
synchronized (queuedLoots)
{
queuedLoots.add(lootRecord);
@@ -489,6 +490,12 @@ public class LootTrackerPlugin extends Plugin
eventBus.post(new LootReceived(name, combatLevel, type, items));
}
private Integer getLootWorldId()
{
// For the wiki to determine drop rates based on dmm brackets
return client.getWorldType().contains(WorldType.SEASONAL) ? client.getWorld() : null;
}
@Subscribe
public void onNpcLootReceived(final NpcLootReceived npcLootReceived)
{

View File

@@ -50,6 +50,10 @@ import static net.runelite.api.ObjectID.ORE_VEIN_26661;
import static net.runelite.api.ObjectID.ORE_VEIN_26662;
import static net.runelite.api.ObjectID.ORE_VEIN_26663;
import static net.runelite.api.ObjectID.ORE_VEIN_26664;
import static net.runelite.api.ObjectID.ROCKS_41547;
import static net.runelite.api.ObjectID.ROCKS_41548;
import static net.runelite.api.ObjectID.ROCKS_41549;
import static net.runelite.api.ObjectID.ROCKS_41550;
import net.runelite.api.Player;
import net.runelite.api.WallObject;
import net.runelite.api.coords.WorldPoint;
@@ -79,12 +83,12 @@ import net.runelite.client.ui.overlay.OverlayMenuEntry;
@PluginDependency(XpTrackerPlugin.class)
public class MiningPlugin extends Plugin
{
private static final Pattern MINING_PATERN = Pattern.compile(
private static final Pattern MINING_PATTERN = Pattern.compile(
"You " +
"(?:manage to|just)" +
" (?:mined?|quarry) " +
"(?:some|an?) " +
"(?:copper|tin|clay|iron|silver|coal|gold|mithril|adamantite|runeite|amethyst|sandstone|granite|Opal|piece of Jade|Red Topaz|Emerald|Sapphire|Ruby|Diamond)" +
"(?:copper|tin|clay|iron|silver|coal|gold|mithril|adamantite|runeite|amethyst|sandstone|granite|barronite shards|barronite deposit|Opal|piece of Jade|Red Topaz|Emerald|Sapphire|Ruby|Diamond)" +
"(?:\\.|!)");
@Inject
@@ -343,10 +347,20 @@ public class MiningPlugin extends Plugin
respawns.add(rockRespawn);
break;
}
case ROCKS_41549: // Depleted barronite vein
case ROCKS_41550: // Depleted barronite vein
{
Rock rock = Rock.BARRONITE;
RockRespawn rockRespawn = new RockRespawn(rock, object.getWorldLocation(), Instant.now(), (int) rock.getRespawnTime(region).toMillis(), rock.getZOffset());
respawns.add(rockRespawn);
break;
}
case ORE_VEIN_26661: // Motherlode vein
case ORE_VEIN_26662: // Motherlode vein
case ORE_VEIN_26663: // Motherlode vein
case ORE_VEIN_26664: // Motherlode vein
case ROCKS_41547: // Barronite vein
case ROCKS_41548: // Barronite vein
{
// If the vein respawns before the timer is up, remove it
final WorldPoint point = object.getWorldLocation();
@@ -361,7 +375,7 @@ public class MiningPlugin extends Plugin
{
if (event.getType() == ChatMessageType.SPAM || event.getType() == ChatMessageType.GAMEMESSAGE)
{
if (MINING_PATERN.matcher(event.getMessage()).matches())
if (MINING_PATTERN.matcher(event.getMessage()).matches())
{
if (session == null)
{

View File

@@ -97,7 +97,8 @@ enum Rock
EFH_SALT(Duration.of(9, GAME_TICKS), 0, ROCKS_33255),
TE_SALT(Duration.of(9, GAME_TICKS), 0, ROCKS_33256),
BASALT(Duration.of(9, GAME_TICKS), 0, ROCKS_33257),
DAEYALT_ESSENCE(Duration.of(MiningRocksOverlay.DAEYALT_MAX_RESPAWN_TIME, GAME_TICKS), 0, DAEYALT_ESSENCE_39095);
DAEYALT_ESSENCE(Duration.of(MiningRocksOverlay.DAEYALT_MAX_RESPAWN_TIME, GAME_TICKS), 0, DAEYALT_ESSENCE_39095),
BARRONITE(Duration.of(89, GAME_TICKS), 140);
private static final int WILDERNESS_RESOURCE_AREA = 12605;
private static final int MISCELLANIA = 10044;

View File

@@ -46,6 +46,7 @@ import static net.runelite.api.Constants.ROOF_FLAG_HOVERED;
import static net.runelite.api.Constants.ROOF_FLAG_POSITION;
import net.runelite.api.GameState;
import net.runelite.api.Tile;
import net.runelite.api.coords.WorldPoint;
import net.runelite.api.events.GameStateChanged;
import net.runelite.client.callback.ClientThread;
import net.runelite.client.config.ConfigManager;
@@ -246,14 +247,17 @@ public class RoofRemovalPlugin extends Plugin
continue;
}
int regionID = tile.getWorldLocation().getRegionID() << 2 | z;
// Properly account for instances shifting worldpoints around
final WorldPoint wp = WorldPoint.fromLocalInstance(client, tile.getLocalLocation(), tile.getPlane());
int regionID = wp.getRegionID() << 2 | z;
if (!overrides.containsKey(regionID))
{
continue;
}
int rx = tile.getWorldLocation().getRegionX();
int ry = tile.getWorldLocation().getRegionY();
int rx = wp.getRegionX();
int ry = wp.getRegionY();
long[] region = overrides.get(regionID);
if ((region[ry] & (1L << rx)) != 0)
{

View File

@@ -61,6 +61,8 @@ enum MiningSiteLocation
BLAST_MINE_WEST(new WorldPoint(1471, 3865, 0), new Rock(22, Ore.HARD_ROCK)),
BRIMHAVEN_NORTH(new WorldPoint(2732, 3225, 0), new Rock(10, Ore.GOLD)),
BRIMHAVEN_SOUTH_(new WorldPoint(2743, 3150, 0), new Rock(6, Ore.GOLD)),
CAMDOZAAL_MINES_EAST(new WorldPoint(2934, 5811, 0), new Rock(8, Ore.BARRONITE), new Rock(1, Ore.CLAY), new Rock(2, Ore.TIN), new Rock(1, Ore.COPPER)),
CAMDOZAAL_MINES_WEST(new WorldPoint(2914, 5811, 0), new Rock(10, Ore.BARRONITE), new Rock(2, Ore.COPPER), new Rock(2, Ore.CLAY), new Rock(1, Ore.TIN)),
CENTRAL_FREMENIK_ISLES(new WorldPoint(2374, 3850, 0), new Rock(7, Ore.COAL), new Rock(1, Ore.RUNITE)),
CITHAREDE_ABBEY(new WorldPoint(3400, 3170, 0), new Rock(3, Ore.IRON), new Rock (3, Ore.COAL)),
COAL_TRUCKS(new WorldPoint(2580, 3484, 0), new Rock(18, Ore.COAL)),
@@ -238,6 +240,7 @@ enum MiningSiteLocation
TIN("Tin"),
LIMESTONE("Limestone"),
BLURITE("Blurite"),
BARRONITE("Barronite"),
IRON("Iron"),
ELEMENTAL("Elemental"),
SILVER("Silver"),

View File

@@ -63,6 +63,7 @@ public class XpGlobesOverlay extends Overlay
private static final int MINIMUM_STEP = 10;
private static final int PROGRESS_RADIUS_START = 90;
private static final int PROGRESS_RADIUS_REMAINDER = 0;
private static final int PROGRESS_BACKGROUND_SIZE = 5;
private static final int TOOLTIP_RECT_SIZE_X = 150;
private static final Color DARK_OVERLAY_COLOR = new Color(0, 0, 0, 180);
static final String FLIP_ACTION = "Flip";
@@ -108,31 +109,34 @@ public class XpGlobesOverlay extends Overlay
return null;
}
int curDrawPosition = 0;
// The progress arc is drawn either side of the perimeter of the background. This value accounts for that
// when calculating draw positions and overall size of the overlay
final int progressArcOffset = (int) Math.ceil(Math.max(PROGRESS_BACKGROUND_SIZE, config.progressArcStrokeWidth()) / 2.0);
int curDrawPosition = progressArcOffset;
for (final XpGlobe xpGlobe : xpGlobes)
{
int startXp = xpTrackerService.getStartGoalXp(xpGlobe.getSkill());
int goalXp = xpTrackerService.getEndGoalXp(xpGlobe.getSkill());
if (config.alignOrbsVertically())
{
renderProgressCircle(graphics, xpGlobe, startXp, goalXp, 0, curDrawPosition, getBounds());
renderProgressCircle(graphics, xpGlobe, startXp, goalXp, progressArcOffset, curDrawPosition, getBounds());
}
else
{
renderProgressCircle(graphics, xpGlobe, startXp, goalXp, curDrawPosition, 0, getBounds());
renderProgressCircle(graphics, xpGlobe, startXp, goalXp, curDrawPosition, progressArcOffset, getBounds());
}
curDrawPosition += MINIMUM_STEP + config.xpOrbSize();
}
// Get length of markers
final int markersLength = (queueSize * (config.xpOrbSize())) + ((MINIMUM_STEP) * (queueSize - 1));
final int markersLength = (queueSize * (config.xpOrbSize() + progressArcOffset)) + ((MINIMUM_STEP) * (queueSize - 1));
if (config.alignOrbsVertically())
{
return new Dimension(config.xpOrbSize(), markersLength);
return new Dimension(config.xpOrbSize() + progressArcOffset * 2, markersLength);
}
else
{
return new Dimension(markersLength, config.xpOrbSize());
return new Dimension(markersLength, config.xpOrbSize() + progressArcOffset * 2);
}
}
@@ -184,7 +188,7 @@ public class XpGlobesOverlay extends Overlay
x, y,
config.xpOrbSize(), config.xpOrbSize(),
PROGRESS_RADIUS_REMAINDER, radiusToGoalXp,
5,
PROGRESS_BACKGROUND_SIZE,
config.progressOrbOutLineColor()
);
drawProgressArc(

View File

@@ -69,11 +69,14 @@ import net.runelite.client.ui.JagexColors;
import net.runelite.client.ui.overlay.tooltip.Tooltip;
import net.runelite.client.ui.overlay.tooltip.TooltipManager;
import net.runelite.client.util.ColorUtil;
import org.slf4j.Marker;
import org.slf4j.MarkerFactory;
@Singleton
@Slf4j
public class OverlayRenderer extends MouseAdapter implements KeyListener
{
private static final Marker DEDUPLICATE = MarkerFactory.getMarker("DEDUPLICATE");
private static final int BORDER = 5;
private static final int BORDER_TOP = BORDER + 15;
private static final int PADDING = 2;
@@ -786,7 +789,7 @@ public class OverlayRenderer extends MouseAdapter implements KeyListener
}
catch (Exception ex)
{
log.warn("Error during overlay rendering", ex);
log.warn(DEDUPLICATE, "Error during overlay rendering", ex);
return;
}

View File

@@ -0,0 +1,96 @@
/*
* Copyright (c) 2021, Adam <Adam@sigterm.info>
* All rights reserved.
*
* Redistribution and use in source and binary forms, with or without
* modification, are permitted provided that the following conditions are met:
*
* 1. Redistributions of source code must retain the above copyright notice, this
* list of conditions and the following disclaimer.
* 2. Redistributions in binary form must reproduce the above copyright notice,
* this list of conditions and the following disclaimer in the documentation
* and/or other materials provided with the distribution.
*
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND
* ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
* WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
* DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR
* ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
* (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
* LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
* ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
* SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
*/
package net.runelite.client.util;
import ch.qos.logback.classic.Level;
import ch.qos.logback.classic.Logger;
import ch.qos.logback.classic.turbo.TurboFilter;
import ch.qos.logback.core.spi.FilterReply;
import java.util.Deque;
import java.util.concurrent.ConcurrentLinkedDeque;
import lombok.EqualsAndHashCode;
import lombok.RequiredArgsConstructor;
import org.slf4j.Marker;
import org.slf4j.MarkerFactory;
public class DeduplicationFilter extends TurboFilter
{
private static final Marker deduplicateMarker = MarkerFactory.getMarker("DEDUPLICATE");
private static final int CACHE_SIZE = 8;
private static final int DUPLICATE_LOG_COUNT = 1000;
@RequiredArgsConstructor
@EqualsAndHashCode(exclude = {"count"})
private static class LogException
{
private final String message;
private final StackTraceElement[] stackTraceElements;
private volatile int count;
}
private final Deque<LogException> cache = new ConcurrentLinkedDeque<>();
@Override
public void stop()
{
cache.clear();
super.stop();
}
@Override
public FilterReply decide(Marker marker, Logger logger, Level level, String s, Object[] objects, Throwable throwable)
{
if (marker != deduplicateMarker || logger.isDebugEnabled() || throwable == null)
{
return FilterReply.NEUTRAL;
}
LogException logException = new LogException(s, throwable.getStackTrace());
for (LogException e : cache)
{
if (logException.equals(e))
{
// this iinc is not atomic, but doesn't matter in practice
if (++e.count % DUPLICATE_LOG_COUNT == 0)
{
logger.warn("following log message logged " + DUPLICATE_LOG_COUNT + " times!");
return FilterReply.NEUTRAL;
}
return FilterReply.DENY;
}
}
synchronized (cache)
{
if (cache.size() >= CACHE_SIZE)
{
cache.pop();
}
cache.push(logException);
}
return FilterReply.NEUTRAL;
}
}