Skip to content

Commit

Permalink
Feat: container check improvements (#1976)
Browse files Browse the repository at this point in the history
* feat: Remove exclusiveToOneItem from ItemRequirement

This isn't used appropriately, and to have this behaviour one should really use ItemRequirements instead.

* feat: Simplified colour + tooltip logic on ItemRequirement

Rather than relying on bespoke checks for different containers with different colours, we now just use a single colour, currently white, for 'not on player'.

Tooltips now let you know which containers these will be in.

* feat: Update QuestRequirementsPanel to use new ItemRequirement logic

This also ensures there's always a tooltip option attached in the sidebar, as they can dynamically get new info on where to find them.

* feat: Added ItemRequirement/ItemRequirements test in BikeShedder

* feat: Changed tooltip text color in overlay

* feat: Added partial success color config

* fix: Fixed ItemRequirements functionality

Ensured ItemRequirements within ItemRequirements still work.

* cleanup: Added comments to ItemRequirement(s)

* fix: add missing getter
  • Loading branch information
Zoinkwiz authored Feb 22, 2025
1 parent f20a4a2 commit 06dc9ef
Show file tree
Hide file tree
Showing 13 changed files with 856 additions and 222 deletions.
11 changes: 11 additions & 0 deletions src/main/java/com/questhelper/QuestHelperConfig.java
Original file line number Diff line number Diff line change
Expand Up @@ -598,6 +598,17 @@ default Color failColour()
return Color.RED;
}

@ConfigItem(
keyName = "partialSuccessColour",
name = "Colour of partially passed requirements/checks",
description = "Change the colour that will indicate a check has partially passed (such as item is in your bank)",
section = colorSection
)
default Color partialSuccessColour()
{
return Color.WHITE;
}

@ConfigItem(
keyName = "boostColour",
name = "Colour of boostable skill",
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -104,7 +104,7 @@ public ArrayList<BankTabItems> getPluginBankTagItemsForSections(boolean onlyGetM
{
recommendedItems = recommendedItems.stream()
.filter(Objects::nonNull)
.filter(i -> (!onlyGetMissingItems || !i.checkWithAllContainers(plugin.getClient())) && i.shouldDisplayText(plugin.getClient()))
.filter(i -> (!onlyGetMissingItems || !i.checkWithAllContainers()) && i.shouldDisplayText(plugin.getClient()))
.collect(Collectors.toList());
}

Expand All @@ -131,7 +131,7 @@ public ArrayList<BankTabItems> getPluginBankTagItemsForSections(boolean onlyGetM
.filter(ItemRequirement.class::isInstance)
.map(ItemRequirement.class::cast)
.filter(i -> (!onlyGetMissingItems
|| !i.checkWithAllContainers(plugin.getClient()))
|| !i.checkWithAllContainers())
&& i.shouldDisplayText(plugin.getClient()))
.collect(Collectors.toList());
}
Expand All @@ -143,7 +143,7 @@ public ArrayList<BankTabItems> getPluginBankTagItemsForSections(boolean onlyGetM
.filter(ItemRequirement.class::isInstance)
.map(ItemRequirement.class::cast)
.filter(i -> (!onlyGetMissingItems
|| !i.checkWithAllContainers(plugin.getClient()))
|| !i.checkWithAllContainers())
&& i.shouldDisplayText(plugin.getClient()))
.collect(Collectors.toList());
}
Expand Down Expand Up @@ -182,7 +182,7 @@ private void getItemsFromRequirement(List<BankTabItem> pluginItems, ItemRequirem
else
{
ItemRequirement match = itemsWhichPassReq.stream()
.filter(r -> r.checkWithAllContainers(plugin.getClient()))
.filter(r -> r.checkWithAllContainers())
.findFirst()
.orElse(itemsWhichPassReq.get(0).named(itemRequirements.getName()));

Expand Down Expand Up @@ -217,6 +217,6 @@ private BankTabItem makeBankTabItem(ItemRequirement item)
public boolean hasItemInBankOrPotionStorage(int itemID)
{
ItemRequirement tmpReq = new ItemRequirement("tmp", itemID);
return tmpReq.checkWithAllContainers(client);
return tmpReq.checkWithAllContainers();
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -575,7 +575,6 @@ protected void setupRequirements()
.showConditioned(new SkillRequirement(Skill.MAGIC, 60));
elemental30 = new ItemRequirements(LogicType.OR, "Elemental runes", air30, water30, earth30, fire30);
elemental30.addAlternates(ItemID.FIRE_RUNE, ItemID.EARTH_RUNE, ItemID.AIR_RUNE);
elemental30.setExclusiveToOneItemType(true);

chargeOrbRunes = new ItemRequirements(LogicType.AND, "Runes for any charge orb spell you have the level to cast", cosmic3, elemental30);

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -181,7 +181,7 @@ public void onGameTick(GameTick event)
potOfVinegarNeeded.setQuantity(winesNeededQuantity.get());

int jugsNeeded = winesNeededQuantity.get();
jugsNeeded -= potOfVinegar.checkTotalMatchesInContainers(client, QuestContainerManager.getEquippedData(), QuestContainerManager.getInventoryData(), QuestContainerManager.getBankData());
jugsNeeded -= potOfVinegar.checkTotalMatchesInContainers(QuestContainerManager.getEquippedData(), QuestContainerManager.getInventoryData(), QuestContainerManager.getBankData());
potNeeded.setQuantity(jugsNeeded);
jugOfVinegarNeeded.setQuantity(jugsNeeded);

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -302,7 +302,7 @@ public void onGameTick(GameTick event)
potOfVinegarNeeded.setQuantity(winesNeededQuantity.get());

int jugsNeeded = winesNeededQuantity.get();
jugsNeeded -= potOfVinegar.checkTotalMatchesInContainers(client, QuestContainerManager.getEquippedData(), QuestContainerManager.getInventoryData(), QuestContainerManager.getBankData());
jugsNeeded -= potOfVinegar.checkTotalMatchesInContainers(QuestContainerManager.getEquippedData(), QuestContainerManager.getInventoryData(), QuestContainerManager.getBankData());
potNeeded.setQuantity(jugsNeeded);
jugOfVinegarNeeded.setQuantity(jugsNeeded);

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -659,7 +659,6 @@ protected void setupRequirements()
.showConditioned(new SkillRequirement(Skill.MAGIC, 60));
ItemRequirements elemental30 = new ItemRequirements(LogicType.OR, "Elemental runes", air30, water30, earth30, fire30);
elemental30.addAlternates(ItemID.FIRE_RUNE, ItemID.EARTH_RUNE, ItemID.AIR_RUNE);
elemental30.setExclusiveToOneItemType(true);

chargeOrbSpell = new ItemRequirements(LogicType.AND, "Runes for any charge orb spell you have the level to cast", cosmic3, elemental30);
combatGear = new ItemRequirement("Combat gear", -1, -1).isNotConsumed();
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -27,6 +27,8 @@
import com.questhelper.requirements.item.TrackedContainers;
import lombok.Getter;

import java.util.List;

public class QuestContainerManager
{
@Getter
Expand All @@ -43,4 +45,7 @@ public class QuestContainerManager

@Getter
private final static ItemAndLastUpdated groupStorageData = new ItemAndLastUpdated(TrackedContainers.GROUP_STORAGE);

@Getter
private final static List<ItemAndLastUpdated> orderedListOfContainers = List.of(equippedData, inventoryData, bankData, potionData, groupStorageData);
}
46 changes: 19 additions & 27 deletions src/main/java/com/questhelper/panel/QuestRequirementsPanel.java
Original file line number Diff line number Diff line change
Expand Up @@ -25,12 +25,14 @@
*/
package com.questhelper.panel;

import com.questhelper.QuestHelperConfig;
import com.questhelper.QuestHelperPlugin;
import com.questhelper.managers.QuestManager;
import com.questhelper.questhelpers.QuestHelper;
import com.questhelper.requirements.Requirement;
import com.questhelper.requirements.item.ItemRequirement;
import com.questhelper.requirements.item.NoItemRequirement;
import com.questhelper.requirements.item.TrackedContainers;
import com.questhelper.requirements.quest.QuestRequirement;
import com.questhelper.tools.Icon;
import com.questhelper.util.Fonts;
Expand Down Expand Up @@ -141,10 +143,7 @@ public void setRequirements(@Nullable Collection<? extends Requirement> requirem

panel.add(label, BorderLayout.CENTER);

if (requirement.getTooltip() != null)
{
tooltipButton = addButtonToPanel(panel, requirement.getTooltip());
}
tooltipButton = addButtonToPanel(panel, requirement.getTooltip());

var wikiUrl = requirement.getWikiUrl();
if (wikiUrl != null)
Expand Down Expand Up @@ -255,10 +254,6 @@ public void update(Client client, QuestHelperPlugin questHelperPlugin)
}

label.setVisible(true);
if (tooltipButton != null)
{
tooltipButton.setVisible(true);
}
numActive += 1;

var newText = req.getDisplayText();
Expand All @@ -280,31 +275,25 @@ public void update(Client client, QuestHelperPlugin questHelperPlugin)
}
else
{
newColor = itemRequirement.getColorConsideringBank(client, questHelperPlugin.getConfig());
newColor = itemRequirement.getColor(client, questHelperPlugin.getConfig());
String tooltip = itemRequirement.getTooltip();
if (tooltip != null && !tooltip.isEmpty())
{
label.setToolTipText(itemRequirement.getTooltip());
if (tooltipButton != null) tooltipButton.setVisible(true);
}
else
{
label.setToolTipText("");
if (tooltipButton != null) tooltipButton.setVisible(false);
}
}
}
else
{
newColor = req.getColor(client, questHelperPlugin.getConfig());
}

if (newColor == Color.WHITE)
{
label.setToolTipText("In bank");
}
else if (newColor == Color.ORANGE)
{
label.setToolTipText("On steel key ring");
}
else if (newColor == Color.LIGHT_GRAY)
{
label.setToolTipText("Possibly in Group Storage");
}
else
{
label.setToolTipText("");
}

label.setForeground(newColor);
}

Expand All @@ -315,7 +304,10 @@ private JButton addButtonToPanel(JPanel panel, String tooltipText)
{
JButton b = new JButton(INFO_ICON);
b.setPreferredSize(new Dimension(10, 10));
b.setToolTipText(tooltipText);
if (tooltipText != null)
{
b.setToolTipText(tooltipText);
}
b.setBorderPainted(false);
b.setFocusPainted(false);
b.setBorderPainted(false);
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -30,7 +30,10 @@
import com.questhelper.panel.PanelDetails;
import com.questhelper.questhelpers.BasicQuestHelper;
import com.questhelper.requirements.item.ItemRequirement;
import com.questhelper.requirements.item.ItemRequirements;
import com.questhelper.requirements.player.SkillRequirement;
import com.questhelper.requirements.player.SpellbookRequirement;
import com.questhelper.requirements.util.LogicType;
import com.questhelper.requirements.util.Spellbook;
import com.questhelper.requirements.widget.WidgetTextRequirement;
import com.questhelper.requirements.zone.Zone;
Expand All @@ -41,10 +44,7 @@
import com.questhelper.steps.ObjectStep;
import com.questhelper.steps.QuestStep;
import com.questhelper.steps.widget.NormalSpells;
import net.runelite.api.ItemID;
import net.runelite.api.NpcID;
import net.runelite.api.NullObjectID;
import net.runelite.api.ObjectID;
import net.runelite.api.*;
import net.runelite.api.coords.WorldPoint;
import net.runelite.api.widgets.ComponentID;
import java.util.ArrayList;
Expand Down Expand Up @@ -83,7 +83,10 @@ public class BikeShedder extends BasicQuestHelper
private WidgetTextRequirement lookAtCooksAssistantTextRequirement;
private ZoneRequirement byStaircaseInSunrisePalace;
private ObjectStep goDownstairsInSunrisePalace;
private DetailedQuestStep haveRunes;
private ItemRequirement lightbearer;
private ItemRequirement elemental30Unique;
private ItemRequirement elemental30;

@Override
public Map<Integer, QuestStep> loadSteps()
Expand All @@ -94,6 +97,7 @@ public Map<Integer, QuestStep> loadSteps()
var steps = new ConditionalStep(this, confuseHans);
steps.addStep(byStaircaseInSunrisePalace, goDownstairsInSunrisePalace);
steps.addStep(outsideLumbridge, moveToLumbridge);
steps.addStep(new ZoneRequirement(new WorldPoint(3224, 3218, 0)), haveRunes);
steps.addStep(new ZoneRequirement(new WorldPoint(3222, 3218, 0)), equipLightbearer);
steps.addStep(new ZoneRequirement(new WorldPoint(3223, 3218, 0)), useLogOnBush);
steps.addStep(new ZoneRequirement(new WorldPoint(3222, 3217, 0)), useCoinOnBush);
Expand All @@ -119,6 +123,7 @@ protected void setupRequirements()
equipLightbearer = new DetailedQuestStep(this, "Equip a Lightbearer", lightbearer.equipped());

anyLog = new ItemRequirement("Any log", ItemCollections.LOGS_FOR_FIRE).highlighted();

useLogOnBush = new ObjectStep(this, NullObjectID.NULL_10778, new WorldPoint(3223, 3217, 0), "Use log on bush", anyLog);
useLogOnBush.addIcon(ItemID.LOGS);

Expand Down Expand Up @@ -162,11 +167,27 @@ protected void setupRequirements()
var upstairsInSunrisePalace = new Zone(new WorldPoint(1684, 3162, 1), new WorldPoint(1691, 3168, 1));
byStaircaseInSunrisePalace = new ZoneRequirement(upstairsInSunrisePalace);
goDownstairsInSunrisePalace = new ObjectStep(getQuest().getQuestHelper(), ObjectID.STAIRCASE_52627, new WorldPoint(1690, 3164, 1), "Climb downstairs, ensure stairs are well highlighted!");


var fire30 = new ItemRequirement("Fire runes", ItemID.FIRE_RUNE, 30)
.showConditioned(new SkillRequirement(Skill.MAGIC, 63));
var air30 = new ItemRequirement("Air runes", ItemID.AIR_RUNE, 30)
.showConditioned(new SkillRequirement(Skill.MAGIC, 66));
var water30 = new ItemRequirement("Water runes", ItemID.WATER_RUNE, 30)
.showConditioned(new SkillRequirement(Skill.MAGIC, 56));
var earth30 = new ItemRequirement("Earth runes", ItemID.EARTH_RUNE, 30)
.showConditioned(new SkillRequirement(Skill.MAGIC, 60));
elemental30Unique = new ItemRequirements(LogicType.OR, "Elemental runes as ItemRequirements OR", air30, water30, earth30, fire30);
elemental30Unique.addAlternates(ItemID.FIRE_RUNE, ItemID.EARTH_RUNE, ItemID.AIR_RUNE);
elemental30 = new ItemRequirement("Elemental rune as ItemRequirement", List.of(ItemID.AIR_RUNE, ItemID.EARTH_RUNE, ItemID.WATER_RUNE,
ItemID.FIRE_RUNE), 30);
elemental30.setTooltip("You have potato");
haveRunes = new DetailedQuestStep(this, "Compare rune checks for ItemRequirement and ItemRequirements with OR.", elemental30, elemental30Unique);
}

@Override
public List<ItemRequirement> getItemRecommended() {
return Arrays.asList(varrockTeleport, ardougneTeleport, faladorTeleport);
return Arrays.asList(varrockTeleport, ardougneTeleport, faladorTeleport, elemental30, elemental30Unique);
}

@Override
Expand Down
Loading

0 comments on commit 06dc9ef

Please sign in to comment.