Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
The table of contents is too big for display.
Diff view
Diff view
  •  
  •  
  •  
117 changes: 111 additions & 6 deletions docs/entity-guides/movement.md

Large diffs are not rendered by default.

Original file line number Diff line number Diff line change
Expand Up @@ -8,16 +8,22 @@
# Use the quest-helper update scripts to manage synchronization.

# Current sync position - this is the last external commit that has been integrated
5539626281a502ba8c44fe59b8b57bce32fe4f16
ae1f441248b9742c1eaa667b18052785eb6ed058

# Sync metadata (for script reference)
# External repo HEAD at last check: 5539626281a502ba8c44fe59b8b57bce32fe4f16
# Last sync date: 2025-08-29
# Sync method: automated script with manual package transformation
# Integration branch: quest-helper-update-20250829_063754
# Local commit: cb416ef02a (quest-helper: polish Enakhras Lament)
# External repo HEAD at last check: ae1f441248b9742c1eaa667b18052785eb6ed058
# Last sync date: 2026-07-19
# Sync method: upstream source mirror with manual package transformation and Microbot hook preservation
# Integration branch: local workspace
# Local commit: pending

# Sync history log:
# 2026-07-19 - Complete sync to upstream ae1f4412 (Quest Helper 4.16.1 source)
# - Mirrored upstream src/main/java and src/main/resources into the Microbot package
# - Preserved Microbot QuestScript, custom quest logic, config toggles, and agent-server start hook
# - Package transformation: com.questhelper -> net.runelite.client.plugins.microbot.questhelper
# - Status: SUCCESS
#
# 2025-08-29 07:14:46 - Applied commit 55396262 (Polish enahkras lament #2294)
# - Enhanced EnakhrasLament.java with better code organization
# - Fixed Shadow Room brazier puzzle sequence and locations
Expand All @@ -43,9 +49,9 @@
# - Status: INITIALIZED

# Integration status
# Current external version: 4.10.0+
# Current external version: 4.16.1
# Integration health: HEALTHY
# Last validation: 2025-08-29
# Last validation: 2026-07-19
# Compilation status: SUCCESS
# Package transformation: COMPLETE
# Sync file location: CORRECT (moved from project root)
# Sync file location: CORRECT (moved from project root)
Original file line number Diff line number Diff line change
Expand Up @@ -46,6 +46,8 @@ public interface QuestHelperConfig extends Config
String QUEST_HELPER_GROUP = "questhelper";
String QUEST_BACKGROUND_GROUP = "questhelpervars";
String QUEST_HELPER_SIDEBAR_ORDER_KEY_START = "quest-sidebar-order-";
/** Per-helper persisted manual step skips (JSON map of stable slot id to true). */
String QUEST_HELPER_MANUAL_SKIPS_KEY_PREFIX = "manual-step-skips-";

enum QuestOrdering implements Comparator<QuestHelper>
{
Expand Down Expand Up @@ -237,32 +239,33 @@ enum InventoryItemHighlightStyle
}

@ConfigSection(
position = 0,
name = "Microbot",
description = "Microbot Options",
closedByDefault = false
position = 0,
name = "Microbot",
description = "Microbot Options",
closedByDefault = false
)
String microbotSection = "microbotSection";


@ConfigItem(
keyName = "TurnOn",
name = "Enable QuestHelper",
description = "Enable the quest helper that will automatically help with quests.",
section = microbotSection
keyName = "TurnOn",
name = "Enable QuestHelper",
description = "Enable the quest helper that will automatically help with quests.",
section = microbotSection
)
default boolean startStopQuestHelper() {
default boolean startStopQuestHelper()
{
return true;
}

@ConfigItem(
keyName = "obtainMissingItems",
name = "Obtain Missing Items",
description = "Controls whether the quest helper automatically obtains missing items from the bank and Grand Exchange. 'Ask' will prompt you the first time items are needed.",
section = microbotSection,
position = 1
keyName = "obtainMissingItems",
name = "Obtain Missing Items",
description = "Controls whether the quest helper automatically obtains missing items from the bank and Grand Exchange. 'Ask' will prompt you the first time items are needed.",
section = microbotSection,
position = 1
)
default ObtainMissingItemsOption obtainMissingItems() {
default ObtainMissingItemsOption obtainMissingItems()
{
return ObtainMissingItemsOption.ASK;
}

Expand Down Expand Up @@ -332,14 +335,15 @@ public String toString()
}

@ConfigItem(
keyName = "valeTotemsWoodType",
name = "Vale Totems wood type",
description = "Which wood type the quester should gather for the Vale Totems miniquest. " +
"Must match the wood you used to build the totem. " +
"Leave on 'Ask me' to be prompted the first time the quest runs.",
section = microbotSection
keyName = "valeTotemsWoodType",
name = "Vale Totems wood type",
description = "Which wood type the quester should gather for the Vale Totems miniquest. " +
"Must match the wood you used to build the totem. " +
"Leave on 'Ask me' to be prompted the first time the quest runs.",
section = microbotSection
)
default ValeTotemsWoodType valeTotemsWoodType() {
default ValeTotemsWoodType valeTotemsWoodType()
{
return ValeTotemsWoodType.ASK;
}

Expand Down Expand Up @@ -791,6 +795,25 @@ default boolean showCompletedQuests()
return false;
}

enum RegionFilterVisibility
{
AUTO,
SHOW,
HIDE
}

@ConfigItem(
keyName = "regionFilterVisibility",
name = "Region filtering",
description = "Controls when the league region filter is shown. Auto shows it only on league worlds.",
position = 5,
section = filterSection
)
default RegionFilterVisibility regionFilterVisibility()
{
return RegionFilterVisibility.AUTO;
}

@ConfigSection(
position = 5,
name = "Development",
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -29,16 +29,17 @@
import com.google.inject.Injector;
import com.google.inject.Module;
import com.google.inject.Provides;
import net.runelite.client.plugins.microbot.Microbot;
import net.runelite.client.plugins.microbot.questhelper.bank.banktab.BankTabItems;
import net.runelite.client.plugins.microbot.questhelper.bank.banktab.PotionStorage;
import net.runelite.client.plugins.microbot.questhelper.bank.banktab.QuestBankTabInterface;
import net.runelite.client.plugins.microbot.questhelper.managers.*;
import net.runelite.client.plugins.microbot.questhelper.panel.QuestHelperPanel;
import net.runelite.client.plugins.microbot.questhelper.questhelpers.QuestHelper;
import net.runelite.client.plugins.microbot.questhelper.questinfo.QuestHelperQuest;
import net.runelite.client.plugins.microbot.questhelper.requirements.item.ItemRequirement;
import net.runelite.client.plugins.microbot.questhelper.runeliteobjects.Cheerer;
import net.runelite.client.plugins.microbot.questhelper.runeliteobjects.GlobalFakeObjects;
import net.runelite.client.plugins.microbot.questhelper.runeliteobjects.RuneliteConfigSetter;
import net.runelite.client.plugins.microbot.questhelper.runeliteobjects.extendedruneliteobjects.RuneliteObjectManager;
import net.runelite.client.plugins.microbot.questhelper.statemanagement.PlayerStateManager;
import net.runelite.client.plugins.microbot.questhelper.tools.Icon;
Expand All @@ -49,7 +50,7 @@
import net.runelite.api.events.*;
import net.runelite.api.gameval.InventoryID;
import net.runelite.api.gameval.VarPlayerID;
import net.runelite.client.RuneLite;
import net.runelite.api.gameval.VarbitID;
import net.runelite.client.callback.ClientThread;
import net.runelite.client.chat.ChatMessageManager;
import net.runelite.client.config.ConfigManager;
Expand All @@ -60,9 +61,11 @@
import net.runelite.client.events.RuneScapeProfileChanged;
import net.runelite.client.game.ItemManager;
import net.runelite.client.game.SkillIconManager;
import net.runelite.client.game.SpriteManager;
import net.runelite.client.plugins.Plugin;
import net.runelite.client.plugins.PluginDescriptor;
import net.runelite.client.plugins.bank.BankSearch;
import net.runelite.client.plugins.microbot.Microbot;
import net.runelite.client.ui.ClientToolbar;
import net.runelite.client.ui.NavigationButton;
import net.runelite.client.ui.components.colorpicker.ColorPickerManager;
Expand Down Expand Up @@ -101,6 +104,7 @@ public class QuestHelperPlugin extends Plugin
@Inject
private ClientThread clientThread;

@Getter
@Inject
private EventBus eventBus;

Expand Down Expand Up @@ -162,6 +166,17 @@ public class QuestHelperPlugin extends Plugin
@Inject
public SkillIconManager skillIconManager;

@Inject
public SpriteManager spriteManager;

@Inject
private QuestBankTabInterface questBankTabInterface;

public boolean fullCrate;

@Inject
QuestScript questScript;

private QuestHelperPanel panel;

private NavigationButton navButton;
Expand All @@ -170,9 +185,9 @@ public class QuestHelperPlugin extends Plugin

private final Collection<String> configEvents = Arrays.asList("orderListBy", "filterListBy", "questDifficulty", "showCompletedQuests");
private final Collection<String> configItemEvents = Arrays.asList("highlightNeededQuestItems", "highlightNeededMiniquestItems", "highlightNeededAchievementDiaryItems");
public boolean fullCrate;
@Inject
QuestScript questScript;

@Getter
private boolean inCutscene = false;

@Provides
QuestHelperConfig getConfig(ConfigManager configManager)
Expand Down Expand Up @@ -234,6 +249,7 @@ protected void startUp() throws IOException
@Override
protected void shutDown()
{
questScript.shutdown();
runeliteObjectManager.shutDown();

eventBus.unregister(playerStateManager);
Expand All @@ -260,6 +276,7 @@ protected void shutDown()
public void onGameTick(GameTick event)
{
questBankManager.loadInitialStateFromConfig(client);
playerStateManager.loadInitialStateFromConfig();
questManager.updateQuestState();
}

Expand Down Expand Up @@ -314,6 +331,7 @@ public void onGameStateChanged(final GameStateChanged event)
questBankManager.saveBankToConfig();
SwingUtilities.invokeLater(() -> panel.refresh(Collections.emptyList(), true, new HashMap<>()));
questBankManager.emptyState();
playerStateManager.emptyState();
questManager.shutDownQuest(true);
profileChanged = true;
}
Expand All @@ -325,7 +343,10 @@ public void onGameStateChanged(final GameStateChanged event)
GlobalFakeObjects.createNpcs(client, runeliteObjectManager, configManager, config);
newVersionManager.updateChatWithNotificationIfNewVersion();
questBankManager.setUnknownInitialState();
playerStateManager.setUnknownInitialState();
potionStorage.updateCachedPotions = true;
boolean isLeague = client.getWorldType().contains(WorldType.SEASONAL);
SwingUtilities.invokeLater(() -> panel.updateRegionFilterVisibility(isLeague));
clientThread.invokeAtTickEnd(() -> {
questManager.setupRequirements();
questManager.setupOnLogin();
Expand All @@ -342,6 +363,11 @@ private void onRuneScapeProfileChanged(RuneScapeProfileChanged ev)
@Subscribe
public void onVarbitChanged(VarbitChanged event)
{
if (event.getVarbitId() == VarbitID.CUTSCENE_STATUS)
{
this.inCutscene = event.getValue() == 1;
}

if (!(client.getGameState() == GameState.LOGGED_IN))
{
return;
Expand Down Expand Up @@ -376,6 +402,12 @@ public void onConfigChanged(ConfigChanged event)
return;
}

if ("regionFilterVisibility".equals(event.getKey()))
{
boolean isLeague = client.getWorldType().contains(WorldType.SEASONAL);
SwingUtilities.invokeLater(() -> panel.updateRegionFilterVisibility(isLeague));
}

if (configEvents.contains(event.getKey()) || event.getKey().contains("skillfilter"))
{
clientThread.invokeLater(questManager::updateQuestList);
Expand Down Expand Up @@ -452,6 +484,37 @@ else if (developerMode && commandExecuted.getCommand().equals("qh-inv"))
}
log.debug(String.valueOf(inv));
}
else if (developerMode && commandExecuted.getCommand().equals("qh"))
{
var args = commandExecuted.getArguments();
if (args.length == 0)
{
return;
}
var subCommand = args[0];
if (subCommand.equals("container"))
{
if (args.length < 2)
{
return;
}
var container = args[1];
switch (container)
{
case "keyring":
var keyringItems = QuestContainerManager.getKeyRingData().getItems();
for (var item : keyringItems)
{
log.debug("Key ring item: {}", item);
}
break;
}
}
else if (subCommand.equals("cheer"))
{
addCheerer();
}
}
}

@Subscribe(priority = 100)
Expand All @@ -470,6 +533,11 @@ public List<BankTabItems> getPluginBankTagItemsForSections()
return questBankManager.getBankTagService().getPluginBankTagItemsForSections(false);
}

public boolean isBankTabOpen()
{
return questBankTabInterface.isQuestTabActive();
}

public @Nullable QuestHelper getSelectedQuest()
{
return questManager.getSelectedQuest();
Expand Down Expand Up @@ -530,7 +598,8 @@ public void onMenuEntryAdded(MenuEntryAdded event)
@Subscribe
public void onChatMessage(ChatMessage chatMessage)
{
if (chatMessage.getMessage().equals("The crate is full of bananas.")) {
if (chatMessage.getMessage().equals("The crate is full of bananas."))
{
fullCrate = true;
}
if (config.showFan() && chatMessage.getType() == ChatMessageType.GAMEMESSAGE)
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -34,10 +34,12 @@
import lombok.extern.slf4j.Slf4j;
import net.runelite.api.*;
import net.runelite.api.events.*;
import net.runelite.api.gameval.*;
import net.runelite.api.gameval.InterfaceID;
import net.runelite.api.gameval.InventoryID;
import net.runelite.api.gameval.ItemID;
import net.runelite.api.gameval.SpriteID;
import net.runelite.api.gameval.VarClientID;
import net.runelite.api.gameval.VarbitID;
import net.runelite.api.widgets.ItemQuantityMode;
import net.runelite.api.widgets.JavaScriptCallback;
import net.runelite.api.widgets.Widget;
Expand All @@ -55,13 +57,15 @@

import javax.inject.Inject;
import javax.inject.Singleton;
import java.awt.*;
import java.awt.Point;
import java.util.*;
import java.awt.*;
import java.util.List;
import java.util.*;
import java.util.stream.Collectors;
import java.util.stream.Stream;

import static net.runelite.client.plugins.microbot.questhelper.bank.banktab.PotionStorage.COMPONENTS_PER_POTION;
import static net.runelite.client.plugins.microbot.questhelper.bank.banktab.PotionStorage.VIAL_IDX;
import static net.runelite.client.plugins.banktags.BankTagsPlugin.*;

@Singleton
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -132,10 +132,6 @@ public void handleClick(MenuOptionClicked event)
return;
}
String menuOption = event.getMenuOption();
if (menuOption == null)
{
return;
}

// If click a base tab, close
boolean clickedTabTag = menuOption.startsWith("View tab") && !event.getMenuTarget().equals("quest-helper");
Expand Down
Loading
Loading