Merge pull request #3167 from open-osrs/upstream-2304

This commit is contained in:
Owain van Brakel
2022-04-23 08:30:37 +02:00
committed by GitHub
7 changed files with 28 additions and 164 deletions

View File

@@ -121,7 +121,7 @@ public class ChatCommandsPlugin extends Plugin
private static final Pattern HS_KC_FLOOR_PATTERN = Pattern.compile("You have completed Floor (\\d) of the Hallowed Sepulchre! Total completions: <col=ff0000>([0-9,]+)</col>\\.");
private static final Pattern HS_KC_GHC_PATTERN = Pattern.compile("You have opened the Grand Hallowed Coffin <col=ff0000>([0-9,]+)</col> times?!");
private static final Pattern COLLECTION_LOG_ITEM_PATTERN = Pattern.compile("New item added to your collection log: (.*)");
private static final Pattern GUARDIANS_OF_THE_RIFT_PATTERN = Pattern.compile("Amount of Rifts you have closed: <col=ff0000>([0-9,]+)</col>.");
private static final Pattern GUARDIANS_OF_THE_RIFT_PATTERN = Pattern.compile("Amount of Rifts you have closed: <col=ff0000>([0-9,]+)</col>.", Pattern.CASE_INSENSITIVE);
private static final String TOTAL_LEVEL_COMMAND_STRING = "!total";
private static final String PRICE_COMMAND_STRING = "!price";

View File

@@ -1,71 +0,0 @@
/*
* Copyright (c) 2017, 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.plugins.examine;
import java.util.Objects;
class CacheKey
{
private final ExamineType type;
private final int id;
public CacheKey(ExamineType type, int id)
{
this.type = type;
this.id = id;
}
@Override
public int hashCode()
{
int hash = 3;
hash = 23 * hash + Objects.hashCode(this.type);
hash = 23 * hash + this.id;
return hash;
}
@Override
public boolean equals(Object obj)
{
if (this == obj)
{
return true;
}
if (obj == null)
{
return false;
}
if (getClass() != obj.getClass())
{
return false;
}
final CacheKey other = (CacheKey) obj;
if (this.id != other.id)
{
return false;
}
return this.type == other.type;
}
}

View File

@@ -25,7 +25,6 @@
package net.runelite.client.plugins.examine;
import com.google.common.annotations.VisibleForTesting;
import java.time.Instant;
import java.util.ArrayDeque;
import java.util.Deque;
import javax.inject.Inject;
@@ -52,7 +51,6 @@ import net.runelite.client.game.ItemManager;
import net.runelite.client.plugins.Plugin;
import net.runelite.client.plugins.PluginDescriptor;
import net.runelite.client.util.QuantityFormatter;
import net.runelite.client.util.Text;
@PluginDescriptor(
name = "Examine",
@@ -82,18 +80,18 @@ public class ExaminePlugin extends Plugin
@Subscribe
public void onMenuOptionClicked(MenuOptionClicked event)
{
if (!Text.removeTags(event.getMenuOption()).equals("Examine"))
if (!event.getMenuOption().equals("Examine"))
{
return;
}
ExamineType type;
final ChatMessageType type;
int id, quantity = -1;
switch (event.getMenuAction())
{
case EXAMINE_ITEM:
{
type = ExamineType.ITEM;
type = ChatMessageType.ITEM_EXAMINE;
id = event.getId();
int widgetId = event.getParam1();
@@ -120,12 +118,12 @@ public class ExaminePlugin extends Plugin
break;
}
case EXAMINE_ITEM_GROUND:
type = ExamineType.ITEM;
type = ChatMessageType.ITEM_EXAMINE;
id = event.getId();
break;
case CC_OP_LOW_PRIORITY:
{
type = ExamineType.IF3_ITEM;
type = ChatMessageType.ITEM_EXAMINE; // these are spoofed by us from a [proc,examine_item] script edit
int[] qi = findItemFromWidget(event.getParam1(), event.getParam0());
if (qi == null)
{
@@ -136,77 +134,45 @@ public class ExaminePlugin extends Plugin
id = qi[1];
break;
}
case EXAMINE_OBJECT:
type = ExamineType.OBJECT;
id = event.getId();
break;
case EXAMINE_NPC:
type = ExamineType.NPC;
id = event.getId();
break;
default:
return;
}
PendingExamine pendingExamine = new PendingExamine();
pendingExamine.setType(type);
pendingExamine.setResponseType(type);
pendingExamine.setId(id);
pendingExamine.setQuantity(quantity);
pendingExamine.setCreated(Instant.now());
pending.push(pendingExamine);
}
@Subscribe
public void onChatMessage(ChatMessage event)
{
ExamineType type;
switch (event.getType())
{
case OBJECT_EXAMINE:
type = ExamineType.OBJECT;
break;
case NPC_EXAMINE:
type = ExamineType.NPC;
break;
case GAMEMESSAGE:
case ITEM_EXAMINE: // these are spoofed by us from a [proc,examine_item] script edit
type = ExamineType.IF3_ITEM;
break;
default:
return;
}
if (pending.isEmpty())
{
log.debug("Got examine without a pending examine?");
return;
}
PendingExamine pendingExamine = pending.pop();
if (pendingExamine.getType() != type)
PendingExamine pendingExamine = pending.poll();
if (pendingExamine.getResponseType() != event.getType())
{
log.debug("Type mismatch for pending examine: {} != {}", pendingExamine.getType(), type);
log.debug("Type mismatch for pending examine: {} != {}", pendingExamine.getResponseType(), event.getType());
pending.clear(); // eh
return;
}
log.debug("Got examine for {} {}: {}", pendingExamine.getType(), pendingExamine.getId(), event.getMessage());
log.debug("Got examine type {} {}: {}", pendingExamine.getResponseType(), pendingExamine.getId(), event.getMessage());
// If it is an item, show the price of it
if (pendingExamine.getType() == ExamineType.ITEM || pendingExamine.getType() == ExamineType.IF3_ITEM)
final int itemId = pendingExamine.getId();
final int itemQuantity = pendingExamine.getQuantity();
if (itemId == ItemID.COINS_995)
{
final int itemId = pendingExamine.getId();
final int itemQuantity = pendingExamine.getQuantity();
if (itemId == ItemID.COINS_995)
{
return;
}
final ItemComposition itemComposition = itemManager.getItemComposition(itemId);
getItemPrice(itemComposition.getId(), itemComposition, itemQuantity);
return;
}
final ItemComposition itemComposition = itemManager.getItemComposition(itemId);
getItemPrice(itemComposition.getId(), itemComposition, itemQuantity);
}
private int[] findItemFromWidget(int widgetId, int childIdx)

View File

@@ -1,33 +0,0 @@
/*
* Copyright (c) 2017, 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.plugins.examine;
enum ExamineType
{
ITEM,
IF3_ITEM,
NPC,
OBJECT;
}

View File

@@ -24,14 +24,13 @@
*/
package net.runelite.client.plugins.examine;
import java.time.Instant;
import lombok.Data;
import net.runelite.api.ChatMessageType;
@Data
class PendingExamine
{
private ExamineType type;
private ChatMessageType responseType;
private int id;
private int quantity;
private Instant created;
}

View File

@@ -43,9 +43,11 @@ import net.runelite.api.TileObject;
import net.runelite.api.WallObject;
import net.runelite.api.events.GameStateChanged;
import net.runelite.api.events.GameTick;
import net.runelite.api.events.InteractingChanged;
import net.runelite.api.events.MenuOptionClicked;
import net.runelite.api.events.NpcDespawned;
import net.runelite.api.events.InteractingChanged;
import net.runelite.api.widgets.WidgetID;
import net.runelite.api.widgets.WidgetInfo;
import net.runelite.client.config.ConfigManager;
import net.runelite.client.eventbus.Subscribe;
import net.runelite.client.plugins.Plugin;
@@ -168,7 +170,8 @@ public class InteractHighlightPlugin extends Plugin
int id = menuOptionClicked.getId();
interactedObject = null;
interactedNpc = findNpc(id);
attacked = menuOptionClicked.getMenuAction() == MenuAction.NPC_SECOND_OPTION || menuOptionClicked.getMenuAction() == MenuAction.WIDGET_TARGET_ON_NPC;
attacked = menuOptionClicked.getMenuAction() == MenuAction.NPC_SECOND_OPTION ||
menuOptionClicked.getMenuAction() == MenuAction.WIDGET_TARGET_ON_NPC && WidgetInfo.TO_GROUP(client.getSelectedWidget().getId()) == WidgetID.SPELLBOOK_GROUP_ID;
clickTick = client.getTickCount();
gameCycle = client.getGameCycle();
break;

View File

@@ -1144,9 +1144,9 @@ public class ChatCommandsPluginTest
@Test
public void testGuardiansOfTheRift()
{
ChatMessage chatMessage = new ChatMessage(null, GAMEMESSAGE, "", "Amount of Rifts you have closed: <col=ff0000>7</col>.", null, 0);
ChatMessage chatMessage = new ChatMessage(null, GAMEMESSAGE, "", "Amount of rifts you have closed: <col=ff0000>167</col>.", null, 0);
chatCommandsPlugin.onChatMessage(chatMessage);
verify(configManager).setRSProfileConfiguration("killcount", "guardians of the rift", 7);
verify(configManager).setRSProfileConfiguration("killcount", "guardians of the rift", 167);
}
}