Merge pull request #11094 from abextm/itemthreshold-explosive

grounditems: manually match item thresholds
This commit is contained in:
Adam
2020-03-27 11:17:58 -04:00
committed by GitHub
4 changed files with 105 additions and 23 deletions

View File

@@ -28,6 +28,7 @@ package net.runelite.client.plugins.grounditems;
import com.google.common.cache.CacheBuilder;
import com.google.common.cache.LoadingCache;
import com.google.common.collect.EvictingQueue;
import com.google.common.collect.ImmutableMap;
import com.google.inject.Provides;
import java.awt.Color;
import java.awt.Rectangle;
@@ -41,6 +42,7 @@ import java.util.List;
import java.util.Map;
import java.util.Queue;
import java.util.concurrent.CopyOnWriteArrayList;
import java.util.concurrent.ScheduledExecutorService;
import java.util.concurrent.TimeUnit;
import javax.inject.Inject;
import lombok.AccessLevel;
@@ -161,9 +163,12 @@ public class GroundItemsPlugin extends Plugin
@Inject
private Notifier notifier;
@Inject
private ScheduledExecutorService executor;
@Getter
private final Map<GroundItem.GroundItemKey, GroundItem> collectedGroundItems = new LinkedHashMap<>();
private final Map<Integer, Color> priceChecks = new LinkedHashMap<>();
private Map<Integer, Color> priceChecks = ImmutableMap.of();
private LoadingCache<NamedQuantity, Boolean> highlightedItems;
private LoadingCache<NamedQuantity, Boolean> hiddenItems;
private final Queue<Integer> droppedItemQueue = EvictingQueue.create(16); // recently dropped items
@@ -178,9 +183,9 @@ public class GroundItemsPlugin extends Plugin
protected void startUp()
{
overlayManager.add(overlay);
reset();
mouseManager.registerMouseListener(inputListener);
keyManager.registerKeyListener(inputListener);
executor.execute(this::reset);
}
@Override
@@ -203,7 +208,7 @@ public class GroundItemsPlugin extends Plugin
{
if (event.getGroup().equals("grounditems"))
{
reset();
executor.execute(this::reset);
}
}
@@ -429,32 +434,33 @@ public class GroundItemsPlugin extends Plugin
.build(new WildcardMatchLoader(hiddenItemList));
// Cache colors
priceChecks.clear();
ImmutableMap.Builder<Integer, Color> priceCheckBuilder = ImmutableMap.builder();
if (config.getHighlightOverValue() > 0)
{
priceChecks.put(config.getHighlightOverValue(), config.highlightedColor());
priceCheckBuilder.put(config.getHighlightOverValue(), config.highlightedColor());
}
if (config.insaneValuePrice() > 0)
{
priceChecks.put(config.insaneValuePrice(), config.insaneValueColor());
priceCheckBuilder.put(config.insaneValuePrice(), config.insaneValueColor());
}
if (config.highValuePrice() > 0)
{
priceChecks.put(config.highValuePrice(), config.highValueColor());
priceCheckBuilder.put(config.highValuePrice(), config.highValueColor());
}
if (config.mediumValuePrice() > 0)
{
priceChecks.put(config.mediumValuePrice(), config.mediumValueColor());
priceCheckBuilder.put(config.mediumValuePrice(), config.mediumValueColor());
}
if (config.lowValuePrice() > 0)
{
priceChecks.put(config.lowValuePrice(), config.lowValueColor());
priceCheckBuilder.put(config.lowValuePrice(), config.lowValueColor());
}
priceChecks = priceCheckBuilder.build();
}
@Subscribe

View File

@@ -25,8 +25,6 @@
package net.runelite.client.plugins.grounditems;
import com.google.common.base.Strings;
import java.util.regex.Matcher;
import java.util.regex.Pattern;
import lombok.Value;
@Value
@@ -38,8 +36,6 @@ class ItemThreshold
MORE_THAN
}
private static final Pattern QUANTITY_THRESHOLD_PATTERN = Pattern.compile("(.+)(<|>)\\s*(\\d+)");
private final String itemName;
private final int quantity;
private final Inequality inequality;
@@ -51,19 +47,40 @@ class ItemThreshold
return null;
}
Matcher matcher = QUANTITY_THRESHOLD_PATTERN.matcher(entry);
Inequality operator = Inequality.MORE_THAN;
int qty = 0;
if (matcher.find())
for (int i = entry.length() - 1; i >= 0; i--)
{
String name = matcher.group(1).trim();
String sign = matcher.group(2);
int quantity = Integer.parseInt(matcher.group(3));
Inequality inequality = sign.equals("<") ? Inequality.LESS_THAN : Inequality.MORE_THAN;
return new ItemThreshold(name, quantity, inequality);
char c = entry.charAt(i);
if (c >= '0' && c <= '9' || Character.isWhitespace(c))
{
continue;
}
switch (c)
{
case '<':
operator = Inequality.LESS_THAN;
// fallthrough
case '>':
if (i + 1 < entry.length())
{
try
{
qty = Integer.parseInt(entry.substring(i + 1).trim());
}
catch (NumberFormatException e)
{
qty = 0;
operator = Inequality.MORE_THAN;
}
entry = entry.substring(0, i);
}
}
break;
}
return new ItemThreshold(entry, 0, Inequality.MORE_THAN);
return new ItemThreshold(entry.trim(), qty, operator);
}
boolean quantityHolds(int itemCount)

View File

@@ -0,0 +1,49 @@
/*
* Copyright (c) 2020 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.plugins.grounditems;
import joptsimple.internal.Strings;
import org.junit.Assert;
import static net.runelite.client.plugins.grounditems.ItemThreshold.Inequality.*;
import org.junit.Test;
public class ItemThresholdTest
{
@Test
public void test()
{
Assert.assertEquals(ItemThreshold.fromConfigEntry("Dharok's platebody 100"), new ItemThreshold("Dharok's platebody 100", 0, MORE_THAN));
Assert.assertEquals(ItemThreshold.fromConfigEntry("Dharok's platebody 100<100"), new ItemThreshold("Dharok's platebody 100", 100, LESS_THAN));
Assert.assertEquals(ItemThreshold.fromConfigEntry("Dharok's platebody > 100"), new ItemThreshold("Dharok's platebody", 100, MORE_THAN));
Assert.assertEquals(ItemThreshold.fromConfigEntry("Dharok's platebody < 10 0"), new ItemThreshold("Dharok's platebody", 0, MORE_THAN));
}
@Test(timeout = 100)
public void testExplosive()
{
String name = "archer" + Strings.repeat('e', 50000) + "s ring";
Assert.assertEquals(ItemThreshold.fromConfigEntry(name + " < 387"), new ItemThreshold(name, 387, LESS_THAN));
}
}

View File

@@ -25,6 +25,7 @@
package net.runelite.client.plugins.grounditems;
import java.util.Arrays;
import joptsimple.internal.Strings;
import static org.junit.Assert.assertFalse;
import static org.junit.Assert.assertTrue;
import org.junit.Test;
@@ -53,4 +54,13 @@ public class WildcardMatchLoaderTest
assertFalse(loader.load(new NamedQuantity("Abyssal dagger", 1)));
assertTrue(loader.load(new NamedQuantity("Rune Longsword", 2)));
}
@Test(timeout = 1000)
public void testExplosive()
{
String name = "archer" + Strings.repeat('e', 50000) + "s ring";
WildcardMatchLoader loader = new WildcardMatchLoader(Arrays.asList(name + "* < 100"));
assertTrue(loader.load(new NamedQuantity(name, 50)));
assertFalse(loader.load(new NamedQuantity(name, 150)));
}
}