From 5c8ed9f11ab4673f13b0cd7af3676313d41f4125 Mon Sep 17 00:00:00 2001 From: Alex Date: Wed, 10 Nov 2021 11:53:33 -0800 Subject: [PATCH 1/6] ground items: Fix despawn timer in clan hall (#14358) --- .../client/plugins/grounditems/GroundItemsOverlay.java | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/runelite-client/src/main/java/net/runelite/client/plugins/grounditems/GroundItemsOverlay.java b/runelite-client/src/main/java/net/runelite/client/plugins/grounditems/GroundItemsOverlay.java index 9fb512c688..8fb08840af 100644 --- a/runelite-client/src/main/java/net/runelite/client/plugins/grounditems/GroundItemsOverlay.java +++ b/runelite-client/src/main/java/net/runelite/client/plugins/grounditems/GroundItemsOverlay.java @@ -78,6 +78,7 @@ public class GroundItemsOverlay extends Overlay private static final Duration DESPAWN_TIME_DROP = Duration.ofMinutes(3); private static final Duration DESPAWN_TIME_TABLE = Duration.ofMinutes(10); private static final int KRAKEN_REGION = 9116; + private static final int CLAN_HALL_REGION = 6997; private static final int KBD_NMZ_REGION = 9033; private static final int ZILYANA_REGION = 11602; private static final int GRAARDOR_REGION = 11347; @@ -456,7 +457,8 @@ public class GroundItemsOverlay extends Overlay } else if (playerRegionID == ZILYANA_REGION || playerRegionID == GRAARDOR_REGION || playerRegionID == KRIL_TSUTSAROTH_REGION || playerRegionID == KREEARRA_REGION || - playerRegionID == NIGHTMARE_REGION || playerRegionID == TEMPOROSS_REGION) + playerRegionID == NIGHTMARE_REGION || playerRegionID == TEMPOROSS_REGION || + playerRegionID == CLAN_HALL_REGION) { // GWD, Nightmare, and Tempoross instances use the normal despawn timers despawnTime = spawnTime.plus(groundItem.getLootType() == LootType.DROPPED From f71397f3f1608512eab04cf46753edc8985e98b2 Mon Sep 17 00:00:00 2001 From: Adam Date: Wed, 10 Nov 2021 15:50:04 -0500 Subject: [PATCH 2/6] banktags: remove extra space in chatbox prompt --- .../net/runelite/client/plugins/banktags/tabs/TabInterface.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/runelite-client/src/main/java/net/runelite/client/plugins/banktags/tabs/TabInterface.java b/runelite-client/src/main/java/net/runelite/client/plugins/banktags/tabs/TabInterface.java index 7d8736a41e..0716ef747c 100644 --- a/runelite-client/src/main/java/net/runelite/client/plugins/banktags/tabs/TabInterface.java +++ b/runelite-client/src/main/java/net/runelite/client/plugins/banktags/tabs/TabInterface.java @@ -316,7 +316,7 @@ public class TabInterface return; } - chatboxPanelManager.openTextInput((inventory ? "Inventory " : "Equipment ") + " tags:") + chatboxPanelManager.openTextInput((inventory ? "Inventory" : "Equipment") + " tags:") .addCharValidator(FILTERED_CHARS) .onDone((Consumer) (newTags) -> clientThread.invoke(() -> From c8ec004b7af874ab670b6494b9ba61a37db77502 Mon Sep 17 00:00:00 2001 From: Adam Date: Wed, 10 Nov 2021 15:50:27 -0500 Subject: [PATCH 3/6] banktags: improve bank scrollbar updates With tag tab tab or "Remove tab separators", the scrollbar height needs to be adjusted to account for either many tag tabs (which requires scrolling to see) or the hiding of the tab separators. This is because we artifically filter the bank results without keeping the bank in searching mode, causing the vanilla code which usually computes the scroll height to be incorrect. The existing code does this by manually invoking [proc,update_scrollbar] later with the recomputed scroll height. Now that invokeLater runs next tick and not next frame, this leaves several frames with the scrollbar the incorrect size. The desired scroll height is passed to [proc,bankmain_finishbuilding] in argument int12, so instead we recompute the scroll height and overwrite the script argument prior to execution. --- .../plugins/banktags/BankTagsPlugin.java | 59 +++++++++---------- .../src/main/scripts/BankSearchFilter.rs2asm | 2 +- .../src/main/scripts/BankSearchLayout.rs2asm | 4 +- 3 files changed, 30 insertions(+), 35 deletions(-) diff --git a/runelite-client/src/main/java/net/runelite/client/plugins/banktags/BankTagsPlugin.java b/runelite-client/src/main/java/net/runelite/client/plugins/banktags/BankTagsPlugin.java index 052270570e..c4158abd6a 100644 --- a/runelite-client/src/main/java/net/runelite/client/plugins/banktags/BankTagsPlugin.java +++ b/runelite-client/src/main/java/net/runelite/client/plugins/banktags/BankTagsPlugin.java @@ -477,6 +477,32 @@ public class BankTagsPlugin extends Plugin implements MouseWheelListener Widget bankTitle = client.getWidget(WidgetInfo.BANK_TITLE_BAR); bankTitle.setText("Tag tab " + activeTab.getTag() + ""); } + + // Recompute scroll size. Only required for tag tab tab and with remove separators, to remove the + // space that the separators took. + if (tabInterface.isTagTabActive() || (tabInterface.isActive() && config.removeSeparators())) + { + Widget itemContainer = client.getWidget(WidgetInfo.BANK_ITEM_CONTAINER); + Widget[] children = itemContainer.getChildren(); + int items = 0; + for (Widget child : children) + { + if (child != null && child.getItemId() != -1 && !child.isHidden()) + { + ++items; + } + } + + // New scroll height for if_setscrollsize + final int adjustedScrollHeight = (Math.max(0, items - 1) / ITEMS_PER_ROW) * ITEM_VERTICAL_SPACING + + ITEM_VERTICAL_SPACING + ITEM_CONTAINER_BOTTOM_PADDING; + + // This is prior to bankmain_finishbuilding running, so the arguments are still on the stack. Overwrite + // argument int12 (7 from the end) which is the height passed to if_setscrollsize + final int[] intStack = client.getIntStack(); + final int intStackSize = client.getIntStackSize(); + intStack[intStackSize - 7] = adjustedScrollHeight; + } } else if (scriptId == ScriptID.BANKMAIN_SEARCH_TOGGLE) { @@ -510,15 +536,6 @@ public class BankTagsPlugin extends Plugin implements MouseWheelListener return; } - if (tabInterface.isTagTabActive()) - { - int numTabs = (int) Arrays.stream(itemContainer.getDynamicChildren()) - .filter(child -> child.getItemId() != -1 && !child.isHidden()) - .count(); - updateBankContainerScrollHeight(numTabs); - return; - } - if (!tabInterface.isActive() || !config.removeSeparators()) { return; @@ -540,14 +557,9 @@ public class BankTagsPlugin extends Plugin implements MouseWheelListener int adjYOffset = (items / ITEMS_PER_ROW) * ITEM_VERTICAL_SPACING; int adjXOffset = (items % ITEMS_PER_ROW) * ITEM_HORIZONTAL_SPACING + ITEM_ROW_START; - if (child.getOriginalY() != adjYOffset) + if (child.getOriginalY() != adjYOffset || child.getOriginalX() != adjXOffset) { child.setOriginalY(adjYOffset); - child.revalidate(); - } - - if (child.getOriginalX() != adjXOffset) - { child.setOriginalX(adjXOffset); child.revalidate(); } @@ -562,23 +574,6 @@ public class BankTagsPlugin extends Plugin implements MouseWheelListener child.setHidden(true); } } - - updateBankContainerScrollHeight(items); - } - - private void updateBankContainerScrollHeight(int items) - { - Widget bankItemContainer = client.getWidget(WidgetInfo.BANK_ITEM_CONTAINER); - int itemContainerHeight = bankItemContainer.getHeight(); - final int adjustedScrollHeight = (Math.max(0, items - 1) / ITEMS_PER_ROW) * ITEM_VERTICAL_SPACING + ITEM_VERTICAL_SPACING + ITEM_CONTAINER_BOTTOM_PADDING; - bankItemContainer.setScrollHeight(Math.max(adjustedScrollHeight, itemContainerHeight)); - - final int itemContainerScroll = bankItemContainer.getScrollY(); - clientThread.invokeLater(() -> - client.runScript(ScriptID.UPDATE_SCROLLBAR, - WidgetInfo.BANK_SCROLLBAR.getId(), - WidgetInfo.BANK_ITEM_CONTAINER.getId(), - itemContainerScroll)); } @Subscribe diff --git a/runelite-client/src/main/scripts/BankSearchFilter.rs2asm b/runelite-client/src/main/scripts/BankSearchFilter.rs2asm index 0555737bdb..0c809b35e3 100644 --- a/runelite-client/src/main/scripts/BankSearchFilter.rs2asm +++ b/runelite-client/src/main/scripts/BankSearchFilter.rs2asm @@ -1,4 +1,4 @@ -.id 279 +.id 279 ; [proc,bankmain_filteritem] .int_stack_count 1 .string_stack_count 0 .int_var_count 2 ; +1 for storage of search filter result diff --git a/runelite-client/src/main/scripts/BankSearchLayout.rs2asm b/runelite-client/src/main/scripts/BankSearchLayout.rs2asm index f67c6a9bfe..4550aba6d1 100644 --- a/runelite-client/src/main/scripts/BankSearchLayout.rs2asm +++ b/runelite-client/src/main/scripts/BankSearchLayout.rs2asm @@ -1,4 +1,4 @@ -.id 277 +.id 277 ; [proc,bankmain_build] .int_stack_count 17 .string_stack_count 0 .int_var_count 36 @@ -842,7 +842,7 @@ LABEL729: iload 14 iload 15 iload 16 - invoke 505 + invoke 505 ; [proc,bankmain_finishbuilding] return LABEL750: invoke 514 From 70d916af520a13b82bd5c10ce88e906f2707d95d Mon Sep 17 00:00:00 2001 From: Adam Date: Wed, 10 Nov 2021 17:37:56 -0500 Subject: [PATCH 4/6] banktags: remove setBankScroll event This hasn't worked in awhile since it was assining the scroll value to the wrong variable. Now we are computing the scroll in onScriptPreFixed for [proc,bankmain_finishbuilding], so it is no longer necessary here. --- .../client/plugins/banktags/tabs/TabInterface.java | 7 ++----- runelite-client/src/main/scripts/BankSearchLayout.rs2asm | 8 +++----- 2 files changed, 5 insertions(+), 10 deletions(-) diff --git a/runelite-client/src/main/java/net/runelite/client/plugins/banktags/tabs/TabInterface.java b/runelite-client/src/main/java/net/runelite/client/plugins/banktags/tabs/TabInterface.java index 0716ef747c..04c41c9d1b 100644 --- a/runelite-client/src/main/java/net/runelite/client/plugins/banktags/tabs/TabInterface.java +++ b/runelite-client/src/main/java/net/runelite/client/plugins/banktags/tabs/TabInterface.java @@ -573,7 +573,7 @@ public class TabInterface switch (eventName) { - case "setBankScroll": + case "skipBankLayout": if (!isTabMenuActive()) { setTabMenuVisible(false); @@ -582,11 +582,8 @@ public class TabInterface setTabMenuVisible(true); - // scroll height - intStack[intStackSize - 3] = (((tabManager.getTabs().size() - 1) / BANK_ITEMS_PER_ROW) + 1) * (BANK_ITEM_HEIGHT + BANK_ITEM_Y_PADDING); - // skip normal bank layout - intStack[intStackSize - 2] = 1; + intStack[intStackSize - 1] = 1; break; case "beforeBankLayout": setTabMenuVisible(false); diff --git a/runelite-client/src/main/scripts/BankSearchLayout.rs2asm b/runelite-client/src/main/scripts/BankSearchLayout.rs2asm index 4550aba6d1..ea13a99a47 100644 --- a/runelite-client/src/main/scripts/BankSearchLayout.rs2asm +++ b/runelite-client/src/main/scripts/BankSearchLayout.rs2asm @@ -7,8 +7,8 @@ ; Fired before the bank starts its layout ; Used by the TabInterface to hide fake bank items for tag tabs ; -; callback "setBankScroll" -; Fired before bank is calculated +; callback "skipBankLayout" +; Fired before bank is built ; Used by the TabInterface to show fake bank items for tag tabs sconst "beforeBankLayout" runelite_callback @@ -403,13 +403,11 @@ LABEL348: sub istore 30 LABEL352: - iconst 0 ; Scroll height variable iconst 0 ; Compare variable iconst 0 ; - sconst "setBankScroll" ; Show fake bank items for tag tabs + sconst "skipBankLayout" ; Show fake bank items for tag tabs runelite_callback ; If tag tab menu search isn't active if_icmpeq CONTINUE_SEARCH ; continue to normal bank search - istore 27 ; Load scroll height into variable jump GetTabRange ; Skip normal bank layout CONTINUE_SEARCH: iload 31 From 685ec4524e3e1509c73cbc8b750279106442dbfe Mon Sep 17 00:00:00 2001 From: andmcadams Date: Thu, 11 Nov 2021 02:20:25 -0500 Subject: [PATCH 5/6] crowdsourcing: Add varbit crowdsourcing (#13212) --- .../crowdsourcing/CrowdsourcingPlugin.java | 8 + .../varbits/CrowdsourcingVarbits.java | 190 ++++++++++++++++++ .../crowdsourcing/varbits/VarData.java | 42 ++++ 3 files changed, 240 insertions(+) create mode 100644 runelite-client/src/main/java/net/runelite/client/plugins/crowdsourcing/varbits/CrowdsourcingVarbits.java create mode 100644 runelite-client/src/main/java/net/runelite/client/plugins/crowdsourcing/varbits/VarData.java diff --git a/runelite-client/src/main/java/net/runelite/client/plugins/crowdsourcing/CrowdsourcingPlugin.java b/runelite-client/src/main/java/net/runelite/client/plugins/crowdsourcing/CrowdsourcingPlugin.java index 84fa9bb01f..20f04726e2 100644 --- a/runelite-client/src/main/java/net/runelite/client/plugins/crowdsourcing/CrowdsourcingPlugin.java +++ b/runelite-client/src/main/java/net/runelite/client/plugins/crowdsourcing/CrowdsourcingPlugin.java @@ -35,6 +35,7 @@ import net.runelite.client.plugins.crowdsourcing.dialogue.CrowdsourcingDialogue; import net.runelite.client.plugins.crowdsourcing.movement.CrowdsourcingMovement; import net.runelite.client.plugins.crowdsourcing.music.CrowdsourcingMusic; import net.runelite.client.plugins.crowdsourcing.thieving.CrowdsourcingThieving; +import net.runelite.client.plugins.crowdsourcing.varbits.CrowdsourcingVarbits; import net.runelite.client.plugins.crowdsourcing.woodcutting.CrowdsourcingWoodcutting; import net.runelite.client.plugins.crowdsourcing.zmi.CrowdsourcingZMI; import net.runelite.client.task.Schedule; @@ -69,6 +70,9 @@ public class CrowdsourcingPlugin extends Plugin @Inject private CrowdsourcingThieving thieving; + @Inject + private CrowdsourcingVarbits varbits; + @Inject private CrowdsourcingWoodcutting woodcutting; @@ -83,8 +87,10 @@ public class CrowdsourcingPlugin extends Plugin eventBus.register(movement); eventBus.register(music); eventBus.register(thieving); + eventBus.register(varbits); eventBus.register(woodcutting); eventBus.register(zmi); + varbits.startUp(); } @Override @@ -95,8 +101,10 @@ public class CrowdsourcingPlugin extends Plugin eventBus.unregister(movement); eventBus.unregister(music); eventBus.unregister(thieving); + eventBus.unregister(varbits); eventBus.unregister(woodcutting); eventBus.unregister(zmi); + varbits.shutDown(); } @Schedule( diff --git a/runelite-client/src/main/java/net/runelite/client/plugins/crowdsourcing/varbits/CrowdsourcingVarbits.java b/runelite-client/src/main/java/net/runelite/client/plugins/crowdsourcing/varbits/CrowdsourcingVarbits.java new file mode 100644 index 0000000000..aad4f46685 --- /dev/null +++ b/runelite-client/src/main/java/net/runelite/client/plugins/crowdsourcing/varbits/CrowdsourcingVarbits.java @@ -0,0 +1,190 @@ +/* + * Copyright (c) 2018 Abex + * Copyright (c) 2021 andmcadams + * 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.crowdsourcing.varbits; + +import com.google.common.collect.ImmutableSet; +import net.runelite.client.plugins.crowdsourcing.CrowdsourcingManager; +import com.google.common.collect.HashMultimap; +import com.google.common.collect.Multimap; +import javax.inject.Inject; +import lombok.extern.slf4j.Slf4j; +import net.runelite.api.Client; +import net.runelite.api.GameState; +import net.runelite.api.IndexDataBase; +import net.runelite.api.VarbitComposition; +import net.runelite.api.coords.LocalPoint; +import net.runelite.api.coords.WorldPoint; +import net.runelite.api.events.GameStateChanged; +import net.runelite.api.events.VarbitChanged; +import net.runelite.client.callback.ClientThread; +import net.runelite.client.eventbus.Subscribe; + +@Slf4j +public class CrowdsourcingVarbits +{ + + @Inject + private Client client; + + @Inject + private CrowdsourcingManager crowdsourcingManager; + + @Inject + private ClientThread clientThread; + + private static final int VARBITS_ARCHIVE_ID = 14; + private static final int VARBIT = 0; + private static final int VARPLAYER = 1; + + private int[] oldVarps = null; + private int[] oldVarps2 = null; + private Multimap varbits; + + private int initializingTick = 0; + + /* Blacklist certain common varbs that give us little useful data. + * 357 - Equipped weapon type + * 5983 - Dialogue option appear/disappear + */ + private static final ImmutableSet BLACKLIST = ImmutableSet.of(357, 5983); + + public void startUp() + { + + varbits = HashMultimap.create(); + + if (oldVarps == null) + { + oldVarps = new int[client.getVarps().length]; + oldVarps2 = new int[client.getVarps().length]; + } + + // Set oldVarps to be the current varps + System.arraycopy(client.getVarps(), 0, oldVarps, 0, oldVarps.length); + System.arraycopy(client.getVarps(), 0, oldVarps2, 0, oldVarps2.length); + + // For all varbits, add their ids to the multimap with the varp index as their key + clientThread.invoke(() -> + { + if (client.getIndexConfig() == null) + { + return false; + } + if (client.getGameState() == GameState.STARTING || client.getGameState() == GameState.UNKNOWN) + { + return false; + } + IndexDataBase indexVarbits = client.getIndexConfig(); + final int[] varbitIds = indexVarbits.getFileIds(VARBITS_ARCHIVE_ID); + for (int id : varbitIds) + { + VarbitComposition varbit = client.getVarbit(id); + if (varbit != null) + { + varbits.put(varbit.getIndex(), id); + } + } + return true; + }); + } + + public void shutDown() + { + varbits = null; + oldVarps = null; + oldVarps2 = null; + } + + @Subscribe + public void onGameStateChanged(GameStateChanged gameStateChanged) + { + if (gameStateChanged.getGameState().equals(GameState.HOPPING) + || gameStateChanged.getGameState().equals(GameState.LOGGING_IN)) + { + initializingTick = client.getTickCount(); + shutDown(); + startUp(); + } + } + + private void pushVarChange(int varType, int varIndex, int oldValue, int newValue, int tick) + { + /* Queues up varbit or varplayer changes to be pushed out to the crowdsourcing manager during the next client + * tick. + */ + clientThread.invokeLater(() -> + { + LocalPoint local = LocalPoint.fromWorld(client, client.getLocalPlayer().getWorldLocation()); + WorldPoint location = WorldPoint.fromLocalInstance(client, local); + boolean isInInstance = client.isInInstancedRegion(); + + log.debug(String.format("Storing VarData (tick %d): %d, %d, %d->%d", tick, varType, varIndex, oldValue, newValue)); + VarData varbitData = new VarData(varType, varIndex, oldValue, newValue, tick, isInInstance, location); + crowdsourcingManager.storeEvent(varbitData); + }); + } + + @Subscribe + public void onVarbitChanged(VarbitChanged varbitChanged) + { + int tick = client.getTickCount(); + + // Whenever a varbit is changed, record it and pass the info off to be submitted. + int index = varbitChanged.getIndex(); + int[] varps = client.getVarps(); + + for (int i : varbits.get(index)) + { + int oldValue = client.getVarbitValue(oldVarps, i); + int newValue = client.getVarbitValue(varps, i); + + if (oldValue != newValue) + { + // Set oldVarps2 so it doesn't pick up varbit changes + client.setVarbitValue(oldVarps2, i, newValue); + + // If the varbit is being changed on an initializing tick (when logging in), don't push out a change + if (tick != initializingTick && !BLACKLIST.contains(i)) + { + pushVarChange(VARBIT, i, oldValue, newValue, tick); + } + } + } + + int oldValue = oldVarps2[index]; + int newValue = varps[index]; + + // Push out varp changes + if (oldValue != newValue && tick != initializingTick) + { + pushVarChange(VARPLAYER, index, oldValue, newValue, tick); + } + + oldVarps[index] = varps[index]; + oldVarps2[index] = varps[index]; + } + +} diff --git a/runelite-client/src/main/java/net/runelite/client/plugins/crowdsourcing/varbits/VarData.java b/runelite-client/src/main/java/net/runelite/client/plugins/crowdsourcing/varbits/VarData.java new file mode 100644 index 0000000000..2799f2eb81 --- /dev/null +++ b/runelite-client/src/main/java/net/runelite/client/plugins/crowdsourcing/varbits/VarData.java @@ -0,0 +1,42 @@ +/* + * Copyright (c) 2020 andmcadams + * 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.crowdsourcing.varbits; + +import lombok.AllArgsConstructor; +import lombok.Data; +import net.runelite.api.coords.WorldPoint; + +@Data +@AllArgsConstructor +public class VarData +{ + private final int varType; + private final int varbitNumber; + private final int oldValue; + private final int newValue; + private final int tick; + private final boolean isInInstance; + private final WorldPoint location; +} From 020d26ce7fae174b1249f267c20ad2a34698da12 Mon Sep 17 00:00:00 2001 From: Adam Date: Thu, 11 Nov 2021 10:00:59 -0500 Subject: [PATCH 6/6] Revert "crowdsourcing: Add varbit crowdsourcing (#13212)" This reverts commit 685ec4524e3e1509c73cbc8b750279106442dbfe. --- .../crowdsourcing/CrowdsourcingPlugin.java | 8 - .../varbits/CrowdsourcingVarbits.java | 190 ------------------ .../crowdsourcing/varbits/VarData.java | 42 ---- 3 files changed, 240 deletions(-) delete mode 100644 runelite-client/src/main/java/net/runelite/client/plugins/crowdsourcing/varbits/CrowdsourcingVarbits.java delete mode 100644 runelite-client/src/main/java/net/runelite/client/plugins/crowdsourcing/varbits/VarData.java diff --git a/runelite-client/src/main/java/net/runelite/client/plugins/crowdsourcing/CrowdsourcingPlugin.java b/runelite-client/src/main/java/net/runelite/client/plugins/crowdsourcing/CrowdsourcingPlugin.java index 20f04726e2..84fa9bb01f 100644 --- a/runelite-client/src/main/java/net/runelite/client/plugins/crowdsourcing/CrowdsourcingPlugin.java +++ b/runelite-client/src/main/java/net/runelite/client/plugins/crowdsourcing/CrowdsourcingPlugin.java @@ -35,7 +35,6 @@ import net.runelite.client.plugins.crowdsourcing.dialogue.CrowdsourcingDialogue; import net.runelite.client.plugins.crowdsourcing.movement.CrowdsourcingMovement; import net.runelite.client.plugins.crowdsourcing.music.CrowdsourcingMusic; import net.runelite.client.plugins.crowdsourcing.thieving.CrowdsourcingThieving; -import net.runelite.client.plugins.crowdsourcing.varbits.CrowdsourcingVarbits; import net.runelite.client.plugins.crowdsourcing.woodcutting.CrowdsourcingWoodcutting; import net.runelite.client.plugins.crowdsourcing.zmi.CrowdsourcingZMI; import net.runelite.client.task.Schedule; @@ -70,9 +69,6 @@ public class CrowdsourcingPlugin extends Plugin @Inject private CrowdsourcingThieving thieving; - @Inject - private CrowdsourcingVarbits varbits; - @Inject private CrowdsourcingWoodcutting woodcutting; @@ -87,10 +83,8 @@ public class CrowdsourcingPlugin extends Plugin eventBus.register(movement); eventBus.register(music); eventBus.register(thieving); - eventBus.register(varbits); eventBus.register(woodcutting); eventBus.register(zmi); - varbits.startUp(); } @Override @@ -101,10 +95,8 @@ public class CrowdsourcingPlugin extends Plugin eventBus.unregister(movement); eventBus.unregister(music); eventBus.unregister(thieving); - eventBus.unregister(varbits); eventBus.unregister(woodcutting); eventBus.unregister(zmi); - varbits.shutDown(); } @Schedule( diff --git a/runelite-client/src/main/java/net/runelite/client/plugins/crowdsourcing/varbits/CrowdsourcingVarbits.java b/runelite-client/src/main/java/net/runelite/client/plugins/crowdsourcing/varbits/CrowdsourcingVarbits.java deleted file mode 100644 index aad4f46685..0000000000 --- a/runelite-client/src/main/java/net/runelite/client/plugins/crowdsourcing/varbits/CrowdsourcingVarbits.java +++ /dev/null @@ -1,190 +0,0 @@ -/* - * Copyright (c) 2018 Abex - * Copyright (c) 2021 andmcadams - * 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.crowdsourcing.varbits; - -import com.google.common.collect.ImmutableSet; -import net.runelite.client.plugins.crowdsourcing.CrowdsourcingManager; -import com.google.common.collect.HashMultimap; -import com.google.common.collect.Multimap; -import javax.inject.Inject; -import lombok.extern.slf4j.Slf4j; -import net.runelite.api.Client; -import net.runelite.api.GameState; -import net.runelite.api.IndexDataBase; -import net.runelite.api.VarbitComposition; -import net.runelite.api.coords.LocalPoint; -import net.runelite.api.coords.WorldPoint; -import net.runelite.api.events.GameStateChanged; -import net.runelite.api.events.VarbitChanged; -import net.runelite.client.callback.ClientThread; -import net.runelite.client.eventbus.Subscribe; - -@Slf4j -public class CrowdsourcingVarbits -{ - - @Inject - private Client client; - - @Inject - private CrowdsourcingManager crowdsourcingManager; - - @Inject - private ClientThread clientThread; - - private static final int VARBITS_ARCHIVE_ID = 14; - private static final int VARBIT = 0; - private static final int VARPLAYER = 1; - - private int[] oldVarps = null; - private int[] oldVarps2 = null; - private Multimap varbits; - - private int initializingTick = 0; - - /* Blacklist certain common varbs that give us little useful data. - * 357 - Equipped weapon type - * 5983 - Dialogue option appear/disappear - */ - private static final ImmutableSet BLACKLIST = ImmutableSet.of(357, 5983); - - public void startUp() - { - - varbits = HashMultimap.create(); - - if (oldVarps == null) - { - oldVarps = new int[client.getVarps().length]; - oldVarps2 = new int[client.getVarps().length]; - } - - // Set oldVarps to be the current varps - System.arraycopy(client.getVarps(), 0, oldVarps, 0, oldVarps.length); - System.arraycopy(client.getVarps(), 0, oldVarps2, 0, oldVarps2.length); - - // For all varbits, add their ids to the multimap with the varp index as their key - clientThread.invoke(() -> - { - if (client.getIndexConfig() == null) - { - return false; - } - if (client.getGameState() == GameState.STARTING || client.getGameState() == GameState.UNKNOWN) - { - return false; - } - IndexDataBase indexVarbits = client.getIndexConfig(); - final int[] varbitIds = indexVarbits.getFileIds(VARBITS_ARCHIVE_ID); - for (int id : varbitIds) - { - VarbitComposition varbit = client.getVarbit(id); - if (varbit != null) - { - varbits.put(varbit.getIndex(), id); - } - } - return true; - }); - } - - public void shutDown() - { - varbits = null; - oldVarps = null; - oldVarps2 = null; - } - - @Subscribe - public void onGameStateChanged(GameStateChanged gameStateChanged) - { - if (gameStateChanged.getGameState().equals(GameState.HOPPING) - || gameStateChanged.getGameState().equals(GameState.LOGGING_IN)) - { - initializingTick = client.getTickCount(); - shutDown(); - startUp(); - } - } - - private void pushVarChange(int varType, int varIndex, int oldValue, int newValue, int tick) - { - /* Queues up varbit or varplayer changes to be pushed out to the crowdsourcing manager during the next client - * tick. - */ - clientThread.invokeLater(() -> - { - LocalPoint local = LocalPoint.fromWorld(client, client.getLocalPlayer().getWorldLocation()); - WorldPoint location = WorldPoint.fromLocalInstance(client, local); - boolean isInInstance = client.isInInstancedRegion(); - - log.debug(String.format("Storing VarData (tick %d): %d, %d, %d->%d", tick, varType, varIndex, oldValue, newValue)); - VarData varbitData = new VarData(varType, varIndex, oldValue, newValue, tick, isInInstance, location); - crowdsourcingManager.storeEvent(varbitData); - }); - } - - @Subscribe - public void onVarbitChanged(VarbitChanged varbitChanged) - { - int tick = client.getTickCount(); - - // Whenever a varbit is changed, record it and pass the info off to be submitted. - int index = varbitChanged.getIndex(); - int[] varps = client.getVarps(); - - for (int i : varbits.get(index)) - { - int oldValue = client.getVarbitValue(oldVarps, i); - int newValue = client.getVarbitValue(varps, i); - - if (oldValue != newValue) - { - // Set oldVarps2 so it doesn't pick up varbit changes - client.setVarbitValue(oldVarps2, i, newValue); - - // If the varbit is being changed on an initializing tick (when logging in), don't push out a change - if (tick != initializingTick && !BLACKLIST.contains(i)) - { - pushVarChange(VARBIT, i, oldValue, newValue, tick); - } - } - } - - int oldValue = oldVarps2[index]; - int newValue = varps[index]; - - // Push out varp changes - if (oldValue != newValue && tick != initializingTick) - { - pushVarChange(VARPLAYER, index, oldValue, newValue, tick); - } - - oldVarps[index] = varps[index]; - oldVarps2[index] = varps[index]; - } - -} diff --git a/runelite-client/src/main/java/net/runelite/client/plugins/crowdsourcing/varbits/VarData.java b/runelite-client/src/main/java/net/runelite/client/plugins/crowdsourcing/varbits/VarData.java deleted file mode 100644 index 2799f2eb81..0000000000 --- a/runelite-client/src/main/java/net/runelite/client/plugins/crowdsourcing/varbits/VarData.java +++ /dev/null @@ -1,42 +0,0 @@ -/* - * Copyright (c) 2020 andmcadams - * 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.crowdsourcing.varbits; - -import lombok.AllArgsConstructor; -import lombok.Data; -import net.runelite.api.coords.WorldPoint; - -@Data -@AllArgsConstructor -public class VarData -{ - private final int varType; - private final int varbitNumber; - private final int oldValue; - private final int newValue; - private final int tick; - private final boolean isInInstance; - private final WorldPoint location; -}