diff --git a/src/main/java/randomeventhelper/RandomEventHelperPlugin.java b/src/main/java/randomeventhelper/RandomEventHelperPlugin.java index f9e56e5..85f963f 100644 --- a/src/main/java/randomeventhelper/RandomEventHelperPlugin.java +++ b/src/main/java/randomeventhelper/RandomEventHelperPlugin.java @@ -1,6 +1,8 @@ package randomeventhelper; +import com.google.common.collect.ImmutableMap; import com.google.inject.Provides; +import java.util.Map; import javax.inject.Inject; import lombok.extern.slf4j.Slf4j; import net.runelite.api.Actor; @@ -30,11 +32,11 @@ import net.runelite.client.plugins.Plugin; import net.runelite.client.plugins.PluginDescriptor; import net.runelite.client.ui.overlay.OverlayManager; +import randomeventhelper.pluginmodulesystem.PluginModule; import randomeventhelper.randomevents.beekeeper.BeekeeperHelper; import randomeventhelper.randomevents.drilldemon.DrillDemonHelper; import randomeventhelper.randomevents.freakyforester.FreakyForesterHelper; import randomeventhelper.randomevents.gravedigger.GravediggerHelper; -import randomeventhelper.randomevents.gravedigger.GravediggerOverlay; import randomeventhelper.randomevents.maze.MazeHelper; import randomeventhelper.randomevents.mime.MimeHelper; import randomeventhelper.randomevents.pinball.PinballHelper; @@ -70,90 +72,68 @@ public class RandomEventHelperPlugin extends Plugin @Inject private RandomEventHelperItemOverlay itemOverlay; - @Inject - private SurpriseExamHelper surpriseExamHelper; - @Inject private BeekeeperHelper beekeeperHelper; @Inject - private FreakyForesterHelper freakyForesterHelper; + private PirateHelper pirateHelper; @Inject - private PinballHelper pinballHelper; + private DrillDemonHelper drillDemonHelper; @Inject - private DrillDemonHelper drillDemonHelper; + private FreakyForesterHelper freakyForesterHelper; @Inject private GravediggerHelper gravediggerHelper; @Inject - private GravediggerOverlay gravediggerOverlay; + private MazeHelper mazeHelper; @Inject private MimeHelper mimeHelper; @Inject - private MazeHelper mazeHelper; + private PinballHelper pinballHelper; @Inject private SandwichLadyHelper sandwichLadyHelper; @Inject - private QuizMasterHelper quizMasterHelper; + private SurpriseExamHelper surpriseExamHelper; @Inject - private PirateHelper pirateHelper; + private QuizMasterHelper quizMasterHelper; + + // -> + private Map pluginModulesMap; @Override protected void startUp() throws Exception { this.overlayManager.add(overlay); this.overlayManager.add(itemOverlay); - if (config.isSurpriseExamEnabled()) - { - surpriseExamHelper.startUp(); - } - if (config.isBeekeeperEnabled()) - { - beekeeperHelper.startUp(); - } - if (config.isFreakyForesterEnabled()) - { - freakyForesterHelper.startUp(); - } - if (config.isPinballEnabled()) - { - pinballHelper.startUp(); - } - if (config.isDrillDemonEnabled()) - { - drillDemonHelper.startUp(); - } - if (config.isGravediggerEnabled()) - { - gravediggerHelper.startUp(gravediggerOverlay); - } - if (config.isMimeEnabled()) - { - mimeHelper.startUp(); - } - if (config.isMazeEnabled()) - { - mazeHelper.startUp(); - } - if (config.isSandwichLadyEnabled()) - { - sandwichLadyHelper.startUp(); - } - if (config.isQuizMasterEnabled()) - { - quizMasterHelper.startUp(); - } - if (config.isCaptArnavChestEnabled()) + + pluginModulesMap = ImmutableMap.builder() + .put("isBeekeeperEnabled", beekeeperHelper) + .put("isCaptArnavChestEnabled", pirateHelper) + .put("isDrillDemonEnabled", drillDemonHelper) + .put("isFreakyForesterEnabled", freakyForesterHelper) + .put("isGravediggerEnabled", gravediggerHelper) + .put("isMazeEnabled", mazeHelper) + .put("isMimeEnabled", mimeHelper) + .put("isPinballEnabled", pinballHelper) + .put("isSandwichLadyEnabled", sandwichLadyHelper) + .put("isSurpriseExamEnabled", surpriseExamHelper) + .put("isQuizMasterEnabled", quizMasterHelper) + .build(); + // Start only the enabled modules + for (PluginModule module : pluginModulesMap.values()) { - pirateHelper.startUp(); + if (module.isEnabled()) + { + module.startUp(); + } } } @@ -162,17 +142,11 @@ protected void shutDown() throws Exception { this.overlayManager.remove(overlay); this.overlayManager.remove(itemOverlay); - surpriseExamHelper.shutDown(); - beekeeperHelper.shutDown(); - freakyForesterHelper.shutDown(); - pinballHelper.shutDown(); - drillDemonHelper.shutDown(); - gravediggerHelper.shutDown(); - mimeHelper.shutDown(); - mazeHelper.shutDown(); - sandwichLadyHelper.shutDown(); - quizMasterHelper.shutDown(); - pirateHelper.shutDown(); + // Shutdown all modules regardless of their enabled state + for (PluginModule module : pluginModulesMap.values()) + { + module.shutdown(); + } } @Subscribe @@ -181,125 +155,17 @@ public void onConfigChanged(ConfigChanged configChanged) if (configChanged.getGroup().equals("randomeventhelper")) { log.debug("Config changed: {} | New value: {}", configChanged.getKey(), configChanged.getNewValue()); - if (configChanged.getKey().equals("isSurpriseExamEnabled")) - { - if (config.isSurpriseExamEnabled()) - { - surpriseExamHelper.startUp(); - } - else - { - surpriseExamHelper.shutDown(); - } - } - else if (configChanged.getKey().equals("isBeekeeperEnabled")) - { - if (config.isBeekeeperEnabled()) - { - beekeeperHelper.startUp(); - } - else - { - beekeeperHelper.shutDown(); - } - } - else if (configChanged.getKey().equals("isFreakyForesterEnabled")) - { - if (config.isFreakyForesterEnabled()) - { - freakyForesterHelper.startUp(); - } - else - { - freakyForesterHelper.shutDown(); - } - } - else if (configChanged.getKey().equals("isPinballEnabled")) - { - if (config.isPinballEnabled()) - { - pinballHelper.startUp(); - } - else - { - pinballHelper.shutDown(); - } - } - else if (configChanged.getKey().equals("isDrillDemonEnabled")) - { - if (config.isDrillDemonEnabled()) - { - drillDemonHelper.startUp(); - } - else - { - drillDemonHelper.shutDown(); - } - } - else if (configChanged.getKey().equals("isGravediggerEnabled")) - { - if (config.isGravediggerEnabled()) - { - gravediggerHelper.startUp(gravediggerOverlay); - } - else - { - gravediggerHelper.shutDown(); - } - } - else if (configChanged.getKey().equals("isMimeEnabled")) - { - if (config.isMimeEnabled()) - { - mimeHelper.startUp(); - } - else - { - mimeHelper.shutDown(); - } - } - else if (configChanged.getKey().equals("isMazeEnabled")) - { - if (config.isMazeEnabled()) - { - mazeHelper.startUp(); - } - else - { - mazeHelper.shutDown(); - } - } - else if (configChanged.getKey().equals("isSandwichLadyEnabled")) - { - if (config.isSandwichLadyEnabled()) - { - sandwichLadyHelper.startUp(); - } - else - { - sandwichLadyHelper.shutDown(); - } - } - else if (configChanged.getKey().equals("isQuizMasterEnabled")) - { - if (config.isQuizMasterEnabled()) - { - quizMasterHelper.startUp(); - } - else - { - quizMasterHelper.shutDown(); - } - } - else if (configChanged.getKey().equals("isCaptArnavChestEnabled")) + // Let's first handle plugin module updates - so lets first check to see if the changed config key is a mapped module + PluginModule module = pluginModulesMap.get(configChanged.getKey()); + if (module != null) { - if (config.isCaptArnavChestEnabled()) + if (module.isEnabled()) { - pirateHelper.startUp(); + module.startUp(); } else { - pirateHelper.shutDown(); + module.shutdown(); } } } diff --git a/src/main/java/randomeventhelper/pluginmodulesystem/PluginModule.java b/src/main/java/randomeventhelper/pluginmodulesystem/PluginModule.java new file mode 100644 index 0000000..49c9cd0 --- /dev/null +++ b/src/main/java/randomeventhelper/pluginmodulesystem/PluginModule.java @@ -0,0 +1,59 @@ +package randomeventhelper.pluginmodulesystem; + +import javax.inject.Inject; +import lombok.RequiredArgsConstructor; +import lombok.extern.slf4j.Slf4j; +import net.runelite.api.Client; +import net.runelite.api.GameState; +import net.runelite.client.eventbus.EventBus; +import net.runelite.client.ui.overlay.OverlayManager; +import net.runelite.client.util.GameEventManager; +import randomeventhelper.RandomEventHelperConfig; + +@Slf4j +// Thanks to Llemon for this - Since we are now relying on constructor injection, we will need a constructor followed by injecting it +// To keep it a little cleaner, you can still use lombok RAC and also pass in @Inject into it so that the constructor will be injected properly +// Also, keep in mind that we don't need to define final variables within the module classes themselves since they will be passed in via the constructor injection super call +@RequiredArgsConstructor(onConstructor = @__(@Inject)) +public abstract class PluginModule +{ + // It's fine to field inject these since we only need access to them here and not in the module classes themselves + @Inject + protected EventBus eventBus; + @Inject + protected GameEventManager gameEventManager; + protected final OverlayManager overlayManager; + protected final RandomEventHelperConfig config; + protected final Client client; + + public abstract void onStartUp(); + + public abstract void onShutdown(); + + public abstract boolean isEnabled(); + + public void startUp() + { + this.eventBus.register(this); + this.onStartUp(); + if (this.client.getGameState().getState() >= GameState.LOGGED_IN.getState()) + { + // Remember to pass in the instance (this) and not the class (#getClass) + // Re-posts NpcSpawned, PlayerSpawned, WallObjectSpawned, DecorativeObjectSpawned, GroundObjectSpawned, GameObjectSpawned, ItemSpawned, WorldEntitySpawned + this.gameEventManager.simulateGameEvents(this); + } + log.debug("Started the {} module", this.getClass().getSimpleName()); + } + + public void shutdown() + { + this.eventBus.unregister(this); + this.onShutdown(); + log.debug("Shutdown the {} module", this.getClass().getSimpleName()); + } + + public boolean isLoggedIn() + { + return this.client.getGameState().getState() >= GameState.LOGGED_IN.getState(); + } +} diff --git a/src/main/java/randomeventhelper/randomevents/beekeeper/BeekeeperHelper.java b/src/main/java/randomeventhelper/randomevents/beekeeper/BeekeeperHelper.java index 0275a72..7dadcf2 100644 --- a/src/main/java/randomeventhelper/randomevents/beekeeper/BeekeeperHelper.java +++ b/src/main/java/randomeventhelper/randomevents/beekeeper/BeekeeperHelper.java @@ -15,21 +15,15 @@ import net.runelite.api.gameval.NpcID; import net.runelite.api.widgets.Widget; import net.runelite.client.callback.ClientThread; -import net.runelite.client.eventbus.EventBus; import net.runelite.client.eventbus.Subscribe; -import net.runelite.client.plugins.Plugin; import net.runelite.client.ui.overlay.OverlayManager; +import randomeventhelper.RandomEventHelperConfig; +import randomeventhelper.pluginmodulesystem.PluginModule; @Slf4j @Singleton -public class BeekeeperHelper extends Plugin +public class BeekeeperHelper extends PluginModule { - @Inject - private EventBus eventBus; - - @Inject - private Client client; - @Inject private ClientThread clientThread; @@ -42,20 +36,44 @@ public class BeekeeperHelper extends Plugin @Getter private ImmutableList beehiveAnswerWidgets; - public void startUp() + @Inject + public BeekeeperHelper(OverlayManager overlayManager, RandomEventHelperConfig config, Client client) + { + super(overlayManager, config, client); + } + + @Override + public void onStartUp() { - this.eventBus.register(this); this.overlayManager.add(beekeeperOverlay); this.beehiveAnswerWidgets = null; + + if (this.isLoggedIn()) + { + this.clientThread.invokeLater(() -> { + if (this.client.getWidget(InterfaceID.Beehive.EXAMPLE) != null) + { + WidgetLoaded beehiveExampleWidgetLoaded = new WidgetLoaded(); + beehiveExampleWidgetLoaded.setGroupId(InterfaceID.BEEHIVE); + this.eventBus.post(beehiveExampleWidgetLoaded); + } + }); + } } - public void shutDown() + @Override + public void onShutdown() { - this.eventBus.unregister(this); this.overlayManager.remove(beekeeperOverlay); this.beehiveAnswerWidgets = null; } + @Override + public boolean isEnabled() + { + return this.config.isBeekeeperEnabled(); + } + @Subscribe public void onWidgetLoaded(WidgetLoaded widgetLoaded) { @@ -72,10 +90,10 @@ public void onWidgetLoaded(WidgetLoaded widgetLoaded) Widget destination4LayerWidget = this.client.getWidget(InterfaceID.Beehive.UNIVERSE_TEXT14); if (destination1LayerWidget != null && destination2LayerWidget != null && destination3LayerWidget != null && destination4LayerWidget != null) { - destination1LayerWidget.setText("1. " + destination1LayerWidget.getText()); - destination2LayerWidget.setText("2. " + destination2LayerWidget.getText()); - destination3LayerWidget.setText("3. " + destination3LayerWidget.getText()); - destination4LayerWidget.setText("4. " + destination4LayerWidget.getText()); + destination1LayerWidget.setText(destination1LayerWidget.getText().contains(".") ? destination1LayerWidget.getText() : "1. " + destination1LayerWidget.getText()); + destination2LayerWidget.setText(destination2LayerWidget.getText().contains(".") ? destination2LayerWidget.getText() : "2. " + destination2LayerWidget.getText()); + destination3LayerWidget.setText(destination3LayerWidget.getText().contains(".") ? destination3LayerWidget.getText() : "3. " + destination3LayerWidget.getText()); + destination4LayerWidget.setText(destination4LayerWidget.getText().contains(".") ? destination4LayerWidget.getText() : "4. " + destination4LayerWidget.getText()); } else { diff --git a/src/main/java/randomeventhelper/randomevents/drilldemon/DrillDemonHelper.java b/src/main/java/randomeventhelper/randomevents/drilldemon/DrillDemonHelper.java index 6735f44..ac8b44b 100644 --- a/src/main/java/randomeventhelper/randomevents/drilldemon/DrillDemonHelper.java +++ b/src/main/java/randomeventhelper/randomevents/drilldemon/DrillDemonHelper.java @@ -21,21 +21,20 @@ import net.runelite.api.gameval.NpcID; import net.runelite.api.gameval.ObjectID; import net.runelite.api.gameval.VarbitID; -import net.runelite.client.eventbus.EventBus; +import net.runelite.client.callback.ClientThread; import net.runelite.client.eventbus.Subscribe; import net.runelite.client.ui.overlay.OverlayManager; import net.runelite.client.util.Text; +import randomeventhelper.RandomEventHelperConfig; import randomeventhelper.RandomEventHelperPlugin; +import randomeventhelper.pluginmodulesystem.PluginModule; @Slf4j @Singleton -public class DrillDemonHelper +public class DrillDemonHelper extends PluginModule { @Inject - private EventBus eventBus; - - @Inject - private Client client; + private ClientThread clientThread; @Inject private OverlayManager overlayManager; @@ -52,38 +51,61 @@ public class DrillDemonHelper // private Multimap exerciseVarbitMatMultimap; - private boolean initialRun; - @Getter private NPC drillDemonNPC; @Getter private DrillExercise requestedExercise; - public void startUp() + @Inject + public DrillDemonHelper(OverlayManager overlayManager, RandomEventHelperConfig config, Client client) + { + super(overlayManager, config, client); + } + + @Override + public void onStartUp() { - this.eventBus.register(this); this.overlayManager.add(drillDemonOverlay); this.exerciseMatsAnswerList = Lists.newArrayListWithExpectedSize(4); this.exerciseMatsMultimap = HashMultimap.create(4, 2); this.exerciseVarbitMatMultimap = HashMultimap.create(4, 2); - this.initialRun = true; this.drillDemonNPC = null; this.requestedExercise = null; + + if (this.isLoggedIn()) { + this.clientThread.invokeLater(() -> + { + log.debug("Initializing varbits for Drill Demon exercise mappings in case plugin was enabled mid-event."); + for (int postVarbitID = VarbitID.MACRO_DRILLDEMON_POST_1; postVarbitID <= VarbitID.MACRO_DRILLDEMON_POST_4; postVarbitID++) + { + int postVarbitValue = client.getVarbitValue(postVarbitID); + VarbitChanged varbitChangedEvent = new VarbitChanged(); + varbitChangedEvent.setVarbitId(postVarbitID); + varbitChangedEvent.setValue(postVarbitValue); + this.onVarbitChanged(varbitChangedEvent); + } + }); + } } - public void shutDown() + @Override + public void onShutdown() { - this.eventBus.unregister(this); this.overlayManager.remove(drillDemonOverlay); this.exerciseMatsAnswerList = null; this.exerciseMatsMultimap = null; this.exerciseVarbitMatMultimap = null; - this.initialRun = true; this.drillDemonNPC = null; this.requestedExercise = null; } + @Override + public boolean isEnabled() + { + return this.config.isDrillDemonEnabled(); + } + @Subscribe public void onNpcSpawned(NpcSpawned npcSpawned) { @@ -92,19 +114,6 @@ public void onNpcSpawned(NpcSpawned npcSpawned) if (npcSpawned.getNpc().getId() == NpcID.MACRO_DRILLDEMON && this.isInDrillDemonLocalInstance() && (this.drillDemonNPC == null || isNPCInteractingWithPlayer)) { this.drillDemonNPC = npcSpawned.getNpc(); - if (this.initialRun) - { - log.debug("Initializing varbits for Drill Demon exercise mappings in case plugin was enabled mid-event."); - int post1Varbit = client.getVarbitValue(VarbitID.MACRO_DRILLDEMON_POST_1); - int post2Varbit = client.getVarbitValue(VarbitID.MACRO_DRILLDEMON_POST_2); - int post3Varbit = client.getVarbitValue(VarbitID.MACRO_DRILLDEMON_POST_3); - int post4Varbit = client.getVarbitValue(VarbitID.MACRO_DRILLDEMON_POST_4); - this.updateExerciseMappings(post1Varbit, 1); - this.updateExerciseMappings(post2Varbit, 2); - this.updateExerciseMappings(post3Varbit, 3); - this.updateExerciseMappings(post4Varbit, 4); - this.initialRun = false; - } } } @@ -117,7 +126,6 @@ public void onNpcDespawned(NpcDespawned npcDespawned) this.exerciseMatsAnswerList.clear(); this.exerciseMatsMultimap.clear(); this.exerciseVarbitMatMultimap.clear(); - this.initialRun = true; this.drillDemonNPC = null; this.requestedExercise = null; } @@ -188,27 +196,39 @@ public void onGroundObjectSpawned(GroundObjectSpawned groundObjectSpawned) { if (this.isInDrillDemonLocalInstance()) { + int addedPost = -1; switch (groundObjectSpawned.getGroundObject().getId()) { case ObjectID.BARRACK_MAT_1: exerciseMatsMultimap.put(1, groundObjectSpawned.getGroundObject()); log.debug("Added exercise mat with ID {} to post 1", groundObjectSpawned.getGroundObject().getId()); + addedPost = 1; break; case ObjectID.BARRACK_MAT_2: exerciseMatsMultimap.put(2, groundObjectSpawned.getGroundObject()); log.debug("Added exercise mat with ID {} to post 2", groundObjectSpawned.getGroundObject().getId()); + addedPost = 2; break; case ObjectID.BARRACK_MAT_3: exerciseMatsMultimap.put(3, groundObjectSpawned.getGroundObject()); log.debug("Added exercise mat with ID {} to post 3", groundObjectSpawned.getGroundObject().getId()); + addedPost = 3; break; case ObjectID.BARRACK_MAT_4: exerciseMatsMultimap.put(4, groundObjectSpawned.getGroundObject()); log.debug("Added exercise mat with ID {} to post 4", groundObjectSpawned.getGroundObject().getId()); + addedPost = 4; break; default: break; } + + if (addedPost != -1) + { + // Update the mappings in case the mats spawned after the varbits were set + int postVarbit = client.getVarbitValue(VarbitID.MACRO_DRILLDEMON_POST_1 + (addedPost - 1)); + this.updateExerciseMappings(postVarbit, addedPost); + } } } diff --git a/src/main/java/randomeventhelper/randomevents/freakyforester/FreakyForesterHelper.java b/src/main/java/randomeventhelper/randomevents/freakyforester/FreakyForesterHelper.java index 49b8554..6b5b75e 100644 --- a/src/main/java/randomeventhelper/randomevents/freakyforester/FreakyForesterHelper.java +++ b/src/main/java/randomeventhelper/randomevents/freakyforester/FreakyForesterHelper.java @@ -2,7 +2,6 @@ import com.google.common.collect.ImmutableMap; import com.google.common.collect.Sets; -import com.google.inject.Provides; import java.util.Map; import java.util.Set; import java.util.regex.Matcher; @@ -20,25 +19,18 @@ import net.runelite.api.events.NpcDespawned; import net.runelite.api.events.NpcSpawned; import net.runelite.api.gameval.NpcID; -import net.runelite.client.config.ConfigManager; -import net.runelite.client.eventbus.EventBus; import net.runelite.client.eventbus.Subscribe; import net.runelite.client.events.ConfigChanged; import net.runelite.client.ui.overlay.OverlayManager; import net.runelite.client.util.Text; import randomeventhelper.RandomEventHelperConfig; import randomeventhelper.RandomEventHelperPlugin; +import randomeventhelper.pluginmodulesystem.PluginModule; @Slf4j @Singleton -public class FreakyForesterHelper +public class FreakyForesterHelper extends PluginModule { - @Inject - private EventBus eventBus; - - @Inject - private Client client; - @Inject private OverlayManager overlayManager; @@ -69,8 +61,6 @@ public class FreakyForesterHelper @Getter private NPC freakyForesterNPC; - private boolean initialRun; - private final Map PHEASANT_TAIL_NPCID_MAP = ImmutableMap.builder() .put(1, NpcID.MACRO_PHEASANT_MODEL_1) .put(2, NpcID.MACRO_PHEASANT_MODEL_2) @@ -78,35 +68,39 @@ public class FreakyForesterHelper .put(4, NpcID.MACRO_PHEASANT_MODEL_4) .build(); - @Provides - RandomEventHelperConfig provideConfig(ConfigManager configManager) + @Inject + public FreakyForesterHelper(OverlayManager overlayManager, RandomEventHelperConfig config, Client client) { - return configManager.getConfig(RandomEventHelperConfig.class); + super(overlayManager, config, client); } - public void startUp() + @Override + public void onStartUp() { - this.eventBus.register(this); this.overlayManager.add(freakyForesterOverlay); this.pheasantHighlightMode = config.pheasantHighlightMode(); this.pheasantTailFeathers = 0; this.pheasantNPCSet = Sets.newHashSet(); - this.initialRun = true; this.freakyForesterNPC = null; } - public void shutDown() + @Override + public void onShutdown() { - this.eventBus.unregister(this); this.overlayManager.remove(freakyForesterOverlay); this.pheasantTailFeathers = 0; this.pheasantNPCSet = null; this.nearestPheasantNPC = null; this.specificPheasantNPC = null; - this.initialRun = true; this.freakyForesterNPC = null; } + @Override + public boolean isEnabled() + { + return this.config.isFreakyForesterEnabled(); + } + @Subscribe public void onConfigChanged(ConfigChanged configChanged) { @@ -215,12 +209,6 @@ else if (this.PHEASANT_TAIL_NPCID_MAP.containsValue(npcDespawned.getNpc().getId( @Subscribe public void onGameTick(GameTick gameTick) { - // In case the player is already in the Freaky Forester instance when the plugin is started - if (this.initialRun && this.isInFreakyForesterInstance() && this.pheasantNPCSet.isEmpty()) - { - this.initialRun = false; - this.client.getTopLevelWorldView().npcs().stream().filter(npc -> !npc.isDead()).forEach(npc -> this.onNpcSpawned(new NpcSpawned(npc))); - } if (this.pheasantHighlightMode == PheasantMode.NEAREST && !this.pheasantNPCSet.isEmpty()) { this.updateNearestPheasant(); diff --git a/src/main/java/randomeventhelper/randomevents/gravedigger/GravediggerHelper.java b/src/main/java/randomeventhelper/randomevents/gravedigger/GravediggerHelper.java index 2aa2d4a..fc5d047 100644 --- a/src/main/java/randomeventhelper/randomevents/gravedigger/GravediggerHelper.java +++ b/src/main/java/randomeventhelper/randomevents/gravedigger/GravediggerHelper.java @@ -18,34 +18,29 @@ import net.runelite.api.Client; import net.runelite.api.GameObject; import net.runelite.api.Item; -import net.runelite.api.NPC; -import net.runelite.api.Tile; import net.runelite.api.events.GameObjectSpawned; -import net.runelite.api.events.GameTick; import net.runelite.api.events.ItemContainerChanged; import net.runelite.api.events.MenuEntryAdded; import net.runelite.api.events.NpcDespawned; -import net.runelite.api.events.NpcSpawned; import net.runelite.api.events.VarbitChanged; import net.runelite.api.gameval.InventoryID; import net.runelite.api.gameval.NpcID; import net.runelite.api.gameval.VarbitID; -import net.runelite.client.eventbus.EventBus; +import net.runelite.client.callback.ClientThread; import net.runelite.client.eventbus.Subscribe; import net.runelite.client.game.ItemManager; import net.runelite.client.game.SpriteManager; import net.runelite.client.ui.overlay.OverlayManager; +import randomeventhelper.RandomEventHelperConfig; import randomeventhelper.RandomEventHelperPlugin; +import randomeventhelper.pluginmodulesystem.PluginModule; @Slf4j @Singleton -public class GravediggerHelper +public class GravediggerHelper extends PluginModule { @Inject - private EventBus eventBus; - - @Inject - private Client client; + private ClientThread clientThread; @Inject private ItemManager itemManager; @@ -54,15 +49,11 @@ public class GravediggerHelper private SpriteManager spriteManager; @Inject - private OverlayManager overlayManager; - private GravediggerOverlay gravediggerOverlay; @Inject private GravediggerItemOverlay gravediggerItemOverlay; - private boolean initiallyEnteredGraveDiggerArea; - // @Getter private Map graveMap; @@ -79,110 +70,80 @@ public class GravediggerHelper @Getter private Set coffinsInInventory; - public void startUp(GravediggerOverlay gravediggerOverlay) + @Inject + public GravediggerHelper(OverlayManager overlayManager, RandomEventHelperConfig config, Client client) + { + super(overlayManager, config, client); + } + + @Override + public void onStartUp() { - this.gravediggerOverlay = gravediggerOverlay; - this.eventBus.register(this); this.overlayManager.add(this.gravediggerOverlay); this.overlayManager.add(gravediggerItemOverlay); - this.initiallyEnteredGraveDiggerArea = true; this.graveMap = Maps.newHashMapWithExpectedSize(5); this.coffinItemImageMap = Maps.newHashMapWithExpectedSize(5); this.coffinSkillImageMap = Maps.newHashMapWithExpectedSize(5); this.previousInventory = HashMultiset.create(); this.currentInventoryItems = HashMultiset.create(); this.coffinsInInventory = Sets.newHashSetWithExpectedSize(5); - } - public void shutDown() - { - this.eventBus.unregister(this); - if (this.gravediggerOverlay != null) + if (this.isLoggedIn()) { - this.overlayManager.remove(gravediggerOverlay); - this.gravediggerOverlay = null; - } - this.overlayManager.remove(gravediggerItemOverlay); - this.initiallyEnteredGraveDiggerArea = true; - this.graveMap = null; - this.coffinItemImageMap = null; - this.coffinSkillImageMap = null; - this.previousInventory = null; - this.currentInventoryItems = null; - this.coffinsInInventory = null; - } - - @Subscribe - public void onGameTick(GameTick gameTick) - { - // There is an edgecase where when you're at the grave digger random event if a varb is still 0 then it won't fire. - // So lets handle this by checking to see if a player is in the grave digger random event area via NPC Leo spawn - // And by using a separate variable to make sure not to run this constantly every game tick - if (this.initiallyEnteredGraveDiggerArea) - { - if (this.currentInventoryItems.isEmpty()) - { + this.clientThread.invokeLater(() -> { ItemContainerChanged itemContainerChangedEvent = new ItemContainerChanged(InventoryID.INV, this.client.getItemContainer(InventoryID.INV)); this.onItemContainerChanged(itemContainerChangedEvent); - } - if (this.graveMap.isEmpty()) - { - Tile[][][] sceneTiles = this.client.getTopLevelWorldView().getScene().getTiles(); // [Plane][x][y] - Tile[][] tilesInZ = sceneTiles[this.client.getTopLevelWorldView().getPlane()]; // Tiles at [z] + for (GraveNumber graveNumber : GraveNumber.values()) + { + VarbitChanged graveTypeVarbitChangedEvent = new VarbitChanged(); + graveTypeVarbitChangedEvent.setVarbitId(graveNumber.getGraveTypeVarbitID()); + graveTypeVarbitChangedEvent.setValue(this.client.getVarbitValue(graveNumber.getGraveTypeVarbitID())); + VarbitChanged placedCoffinVarbitChangedEvent = new VarbitChanged(); + placedCoffinVarbitChangedEvent.setVarbitId(graveNumber.getPlacedCoffinVarbitID()); + placedCoffinVarbitChangedEvent.setValue(this.client.getVarbitValue(graveNumber.getPlacedCoffinVarbitID())); + // Use this#onVarbitChanged instead of EventBus#post because there is some CrowdsourcingVarbits exception due to us not having a proper VarpID (-1) + this.onVarbitChanged(graveTypeVarbitChangedEvent); + this.onVarbitChanged(placedCoffinVarbitChangedEvent); + } - for (Tile[] tilesInZX : tilesInZ) // Tiles at [z][x] + // Make sure we're fetching the sprites and item images on the client thread + if (this.coffinItemImageMap.isEmpty()) { - for (Tile tile : tilesInZX) // Tiles at [z][x][y] + for (Coffin coffin : Coffin.values()) { - if (tile != null && tile.getGameObjects() != null) - { - for (GameObject gameObject : tile.getGameObjects()) - { - // There seemed to be some case where the game object was null - if (gameObject == null) - { - continue; - } - GameObjectSpawned gameObjectSpawnedEvent = new GameObjectSpawned(); - gameObjectSpawnedEvent.setGameObject(gameObject); - this.onGameObjectSpawned(gameObjectSpawnedEvent); - } - } + this.coffinItemImageMap.put(coffin, coffin.getItemImage(this.itemManager)); } } - } - - for (GraveNumber graveNumber : GraveNumber.values()) - { - VarbitChanged graveTypeVarbitChangedEvent = new VarbitChanged(); - graveTypeVarbitChangedEvent.setVarbitId(graveNumber.getGraveTypeVarbitID()); - graveTypeVarbitChangedEvent.setValue(this.client.getVarbitValue(graveNumber.getGraveTypeVarbitID())); - VarbitChanged placedCoffinVarbitChangedEvent = new VarbitChanged(); - placedCoffinVarbitChangedEvent.setVarbitId(graveNumber.getPlacedCoffinVarbitID()); - placedCoffinVarbitChangedEvent.setValue(this.client.getVarbitValue(graveNumber.getPlacedCoffinVarbitID())); - this.onVarbitChanged(graveTypeVarbitChangedEvent); - this.onVarbitChanged(placedCoffinVarbitChangedEvent); - } - if (this.coffinItemImageMap.isEmpty()) - { - for (Coffin coffin : Coffin.values()) + if (this.coffinSkillImageMap.isEmpty()) { - this.coffinItemImageMap.put(coffin, coffin.getItemImage(this.itemManager)); + for (Coffin coffin : Coffin.values()) + { + this.coffinSkillImageMap.put(coffin, coffin.getSkillIconImage(this.spriteManager)); + } } - } + }); + } + } - if (this.coffinSkillImageMap.isEmpty()) - { - for (Coffin coffin : Coffin.values()) - { - this.coffinSkillImageMap.put(coffin, coffin.getSkillIconImage(this.spriteManager)); - } - } + @Override + public void onShutdown() + { + this.overlayManager.remove(gravediggerOverlay); + this.overlayManager.remove(gravediggerItemOverlay); + this.graveMap = null; + this.coffinItemImageMap = null; + this.coffinSkillImageMap = null; + this.previousInventory = null; + this.currentInventoryItems = null; + this.coffinsInInventory = null; + } - this.initiallyEnteredGraveDiggerArea = false; - } + @Override + public boolean isEnabled() + { + return this.config.isGravediggerEnabled(); } @Subscribe @@ -296,27 +257,12 @@ else if (GraveNumber.isFilledGraveObjectID(gameObject.getId())) } } - @Subscribe - public void onNpcSpawned(NpcSpawned npcSpawned) - { - NPC npc = npcSpawned.getNpc(); - if (RandomEventHelperPlugin.isInRandomEventLocalInstance(this.client)) - { - if (npc.getId() == NpcID.MACRO_GRAVEDIGGER) - { - log.debug("Grave Digger Leo NPC spawned in grave digger random event area."); - this.initiallyEnteredGraveDiggerArea = true; - } - } - } - @Subscribe public void onNpcDespawned(NpcDespawned npcDespawned) { if (npcDespawned.getNpc().getId() == NpcID.MACRO_GRAVEDIGGER) { log.debug("Grave Digger Leo NPC despawned, resetting grave digger area state."); - this.initiallyEnteredGraveDiggerArea = false; this.graveMap.clear(); this.coffinItemImageMap.clear(); this.previousInventory.clear(); diff --git a/src/main/java/randomeventhelper/randomevents/gravedigger/GravediggerOverlay.java b/src/main/java/randomeventhelper/randomevents/gravedigger/GravediggerOverlay.java index f976231..0f2b0d6 100644 --- a/src/main/java/randomeventhelper/randomevents/gravedigger/GravediggerOverlay.java +++ b/src/main/java/randomeventhelper/randomevents/gravedigger/GravediggerOverlay.java @@ -78,7 +78,13 @@ public Dimension render(Graphics2D graphics2D) Color placedCoffinTransparentColor = this.getTransparentColor(placedCoffin.getColor(), 50); // Renders the check or cross above the grave depending on if the correct coffin is placed - Point centeredSpritePoint = Perspective.getCanvasImageLocation(client, grave.getFilledGrave().getLocalLocation(), checkBufferedImage, 0); + GameObject graveObject = grave.getFilledGrave() != null ? grave.getFilledGrave() : grave.getEmptyGrave(); + if (graveObject == null) + { + continue; + } + + Point centeredSpritePoint = Perspective.getCanvasImageLocation(client, graveObject.getLocalLocation(), checkBufferedImage, 0); if (centeredSpritePoint != null) { if (placedCoffin != requiredCoffin) diff --git a/src/main/java/randomeventhelper/randomevents/maze/MazeHelper.java b/src/main/java/randomeventhelper/randomevents/maze/MazeHelper.java index eafb533..b9179f6 100644 --- a/src/main/java/randomeventhelper/randomevents/maze/MazeHelper.java +++ b/src/main/java/randomeventhelper/randomevents/maze/MazeHelper.java @@ -9,32 +9,25 @@ import lombok.extern.slf4j.Slf4j; import net.runelite.api.ChatMessageType; import net.runelite.api.Client; -import net.runelite.api.GameObject; -import net.runelite.api.Tile; import net.runelite.api.coords.LocalPoint; import net.runelite.api.coords.WorldPoint; import net.runelite.api.events.GameObjectDespawned; import net.runelite.api.events.GameObjectSpawned; -import net.runelite.api.events.GameTick; import net.runelite.api.gameval.ObjectID; import net.runelite.client.config.ConfigManager; -import net.runelite.client.eventbus.EventBus; import net.runelite.client.eventbus.Subscribe; import net.runelite.client.events.PluginMessage; import net.runelite.client.plugins.Plugin; import net.runelite.client.plugins.PluginManager; +import net.runelite.client.ui.overlay.OverlayManager; +import randomeventhelper.RandomEventHelperConfig; import randomeventhelper.RandomEventHelperPlugin; +import randomeventhelper.pluginmodulesystem.PluginModule; @Slf4j @Singleton -public class MazeHelper +public class MazeHelper extends PluginModule { - @Inject - private EventBus eventBus; - - @Inject - private Client client; - @Inject private PluginManager pluginManager; @@ -45,10 +38,14 @@ public class MazeHelper private static final String PLUGIN_MESSAGE_SHORTEST_PATH_PATH_KEY = "path"; private static final String PLUGIN_MESSAGE_SHORTEST_PATH_CLEAR_KEY = "clear"; - private boolean isFirstRun; - private GameObject mazeExitObject; // Only purpose this serves is to avoid unnecessary onGameTick + @Inject + public MazeHelper(OverlayManager overlayManager, RandomEventHelperConfig config, Client client) + { + super(overlayManager, config, client); + } - public void startUp() + @Override + public void onStartUp() { Optional shortestPathPlugin = pluginManager.getPlugins().stream().filter(plugin -> plugin.getName().equals("Shortest Path")).findAny(); @@ -74,29 +71,26 @@ public void startUp() }); // Remember to disable Maze config option as well this.configManager.setConfiguration("randomeventhelper", "isMazeEnabled", false); - return; } - this.eventBus.register(this); - this.isFirstRun = true; - this.mazeExitObject = null; } - public void shutDown() + @Override + public void onShutdown() { - this.eventBus.unregister(this); Optional shortestPathPlugin = pluginManager.getPlugins().stream().filter(plugin -> plugin.getName().equals("Shortest Path")).findAny(); if (shortestPathPlugin.isPresent()) { - if (!pluginManager.isPluginEnabled(shortestPathPlugin.get())) + if (pluginManager.isPluginEnabled(shortestPathPlugin.get())) { - if (this.isFirstRun) - { - this.sendShortestPathClear(); - } + this.sendShortestPathClear(); } } - this.isFirstRun = true; - this.mazeExitObject = null; + } + + @Override + public boolean isEnabled() + { + return this.config.isMazeEnabled(); } @Subscribe @@ -109,8 +103,6 @@ public void onGameObjectSpawned(GameObjectSpawned gameObjectSpawned) LocalPoint shrineLocalPoint = gameObjectSpawned.getGameObject().getLocalLocation(); WorldPoint instancedShrineWorldPoint = WorldPoint.fromLocalInstance(this.client, shrineLocalPoint); log.debug("Detected maze exit object spawn, setting shortest path to it"); - this.isFirstRun = false; - this.mazeExitObject = gameObjectSpawned.getGameObject(); this.sendShortestPathDestination(instancedShrineWorldPoint); } } @@ -122,49 +114,10 @@ public void onGameObjectDespawned(GameObjectDespawned gameObjectDespawned) if (gameObjectDespawned.getGameObject().getId() == ObjectID.MACRO_MAZE_COMPLETE) { log.debug("Detected maze exit object despawn, clearing shortest path"); - this.isFirstRun = false; - this.mazeExitObject = null; this.sendShortestPathClear(); } } - @Subscribe - public void onGameTick(GameTick gameTick) - { - if (this.isFirstRun && this.isInMazeLocalInstance() && this.mazeExitObject == null) - { - log.debug("Cold start detected in maze instance, searching for maze exit object"); - this.isFirstRun = false; - - Tile[][][] sceneTiles = this.client.getTopLevelWorldView().getScene().getTiles(); // [Plane][x][y] - Tile[][] tilesInZ = sceneTiles[this.client.getTopLevelWorldView().getPlane()]; // Tiles at [z] - for (Tile[] tilesInZX : tilesInZ) // Tiles at [z][x] - { - for (Tile tile : tilesInZX) // Tiles at [z][x][y] - { - if (tile != null && tile.getGameObjects() != null) - { - for (GameObject gameObject : tile.getGameObjects()) - { - // There seemed to be some case where the game object was null - if (gameObject == null) - { - continue; - } - GameObjectSpawned gameObjectSpawnedEvent = new GameObjectSpawned(); - gameObjectSpawnedEvent.setGameObject(gameObject); - this.onGameObjectSpawned(gameObjectSpawnedEvent); - if (this.mazeExitObject != null) - { - return; - } - } - } - } - } - } - } - private boolean sendShortestPathDestination(WorldPoint destinationWorldPoint) { if (destinationWorldPoint == null) @@ -187,17 +140,22 @@ private boolean sendShortestPathDestination(WorldPoint destinationWorldPoint) private Map generatePathPayload(WorldPoint destinationWorldPoint) { - WorldPoint startingWorldPoint = client.getLocalPlayer().getWorldLocation(); - if (startingWorldPoint == null) + LocalPoint startingLocalPoint = client.getLocalPlayer().getLocalLocation(); + + if (startingLocalPoint == null) { - log.warn("[#generatePathPayload-WorldPoint] Player's starting world point is null, cannot generate payload starting point"); + log.warn("[#generatePathPayload(WorldPoint)] Player's starting local point is null, cannot generate payload starting point"); return Map.of(); } - return this.generatePathPayload(startingWorldPoint, destinationWorldPoint); + + WorldPoint localInstanceStartingWorldPoint = WorldPoint.fromLocalInstance(this.client, startingLocalPoint); + log.debug("[#generatePathPayload(WorldPoint)] Converted player's local point {} to local instance world point {}", startingLocalPoint, localInstanceStartingWorldPoint); + return this.generatePathPayload(localInstanceStartingWorldPoint, destinationWorldPoint); } private Map generatePathPayload(WorldPoint startingWorldPoint, WorldPoint destinationWorldPoint) { + log.debug("[#generatePathPayload(WorldPoint, WorldPoint)] Generated path payload with starting point: {} and destination point: {}", startingWorldPoint, destinationWorldPoint); return Map.of( "start", startingWorldPoint, "target", destinationWorldPoint diff --git a/src/main/java/randomeventhelper/randomevents/mime/MimeHelper.java b/src/main/java/randomeventhelper/randomevents/mime/MimeHelper.java index e87425c..05fe7be 100644 --- a/src/main/java/randomeventhelper/randomevents/mime/MimeHelper.java +++ b/src/main/java/randomeventhelper/randomevents/mime/MimeHelper.java @@ -14,21 +14,16 @@ import net.runelite.api.gameval.NpcID; import net.runelite.api.widgets.Widget; import net.runelite.client.callback.ClientThread; -import net.runelite.client.eventbus.EventBus; import net.runelite.client.eventbus.Subscribe; import net.runelite.client.ui.overlay.OverlayManager; +import randomeventhelper.RandomEventHelperConfig; import randomeventhelper.RandomEventHelperPlugin; +import randomeventhelper.pluginmodulesystem.PluginModule; @Slf4j @Singleton -public class MimeHelper +public class MimeHelper extends PluginModule { - @Inject - private EventBus eventBus; - - @Inject - private Client client; - @Inject private ClientThread clientThread; @@ -49,24 +44,50 @@ public class MimeHelper private static final int MIME_RANDOM_EVENT_REGION_ID = 8010; - public void startUp() + @Inject + public MimeHelper(OverlayManager overlayManager, RandomEventHelperConfig config, Client client) + { + super(overlayManager, config, client); + } + + @Override + public void onStartUp() { - this.eventBus.register(this); this.overlayManager.add(mimeOverlay); this.mimeNPC = null; this.currentMimeEmote = null; this.mimeEmoteAnswerWidget = null; + + // Not really needed since we depend on AnimationChanged, so if the plugin is off, then we won't ever catch it + // And if we do catch the animation, then the widget always loads anyway afterward + if (this.isLoggedIn()) + { + this.clientThread.invokeLater(() -> { + if (this.client.getWidget(InterfaceID.MacroMimeEmotes.BUTTON_0) != null) + { + WidgetLoaded mimeEmoteButtonWidgetLoaded = new WidgetLoaded(); + mimeEmoteButtonWidgetLoaded.setGroupId(InterfaceID.MACRO_MIME_EMOTES); + this.eventBus.post(mimeEmoteButtonWidgetLoaded); + } + }); + } } - public void shutDown() + @Override + public void onShutdown() { - this.eventBus.unregister(this); this.overlayManager.remove(mimeOverlay); this.mimeNPC = null; this.currentMimeEmote = null; this.mimeEmoteAnswerWidget = null; } + @Override + public boolean isEnabled() + { + return this.config.isMimeEnabled(); + } + @Subscribe public void onAnimationChanged(AnimationChanged animationChanged) { @@ -83,19 +104,8 @@ public void onAnimationChanged(AnimationChanged animationChanged) { return; } - if (mime.getAnimation() != -1 && mime.getAnimation() != 858) - { - MimeEmote mimeEmote = MimeEmote.getMimeEmoteFromAnimationID(mime.getAnimation()); - this.currentMimeEmote = mimeEmote; - if (mimeEmote != null) - { - log.debug("Mime Animation Detected: {}", mimeEmote); - } - else - { - log.debug("Unknown Mime Animation Detected: Animation ID = {}", mime.getAnimation()); - } - } + + this.updateMimeAnimation(mime); } @Subscribe @@ -134,6 +144,9 @@ public void onNpcSpawned(NpcSpawned npcSpawned) { this.mimeNPC = npcSpawned.getNpc(); log.debug("Mime NPC Spawned, setting mimeNPC: {}", this.mimeNPC); + + // In case the Mime is already doing an emote (starting mid-event, etc.) + this.updateMimeAnimation(this.mimeNPC); } } @@ -148,4 +161,26 @@ public void onNpcDespawned(NpcDespawned npcDespawned) log.debug("Mime NPC Despawned, clearing Mime Random Event data"); } } + + private void updateMimeAnimation(NPC mimeNPC) + { + if (mimeNPC.getAnimation() != -1 && mimeNPC.getAnimation() != 858) + { + MimeEmote mimeEmote = MimeEmote.getMimeEmoteFromAnimationID(mimeNPC.getAnimation()); + if (mimeEmote == this.currentMimeEmote) + { + log.debug("Mime Animation unchanged: {}", mimeEmote); + return; + } + this.currentMimeEmote = mimeEmote; + if (mimeEmote != null) + { + log.debug("Mime Animation Detected: {}", mimeEmote); + } + else + { + log.debug("Unknown Mime Animation Detected: Animation ID = {}", mimeNPC.getAnimation()); + } + } + } } diff --git a/src/main/java/randomeventhelper/randomevents/mime/MimeOverlay.java b/src/main/java/randomeventhelper/randomevents/mime/MimeOverlay.java index faa85a5..4f3b297 100644 --- a/src/main/java/randomeventhelper/randomevents/mime/MimeOverlay.java +++ b/src/main/java/randomeventhelper/randomevents/mime/MimeOverlay.java @@ -42,10 +42,9 @@ public Dimension render(Graphics2D graphics2D) { OverlayUtil.renderPolygon(graphics2D, plugin.getMimeEmoteAnswerWidget().getBounds(), Color.GREEN); } - if (plugin.getMimeNPC() != null && plugin.getCurrentMimeEmote() != null) + if (plugin.getMimeNPC() != null) { - String mimeEmoteText = plugin.getCurrentMimeEmote().name(); - graphics2D.setFont(graphics2D.getFont().deriveFont(18f)); + String mimeEmoteText = plugin.getCurrentMimeEmote() != null ? plugin.getCurrentMimeEmote().name() : "Waiting for emote"; int mimeHeight = plugin.getMimeNPC().getLogicalHeight(); int mimeTextOffset = plugin.getMimeNPC().getAnimationHeightOffset(); Point textPoint = plugin.getMimeNPC().getCanvasTextLocation(graphics2D, mimeEmoteText, mimeHeight + mimeTextOffset); diff --git a/src/main/java/randomeventhelper/randomevents/pinball/PinballHelper.java b/src/main/java/randomeventhelper/randomevents/pinball/PinballHelper.java index 9871d08..fc09aa8 100644 --- a/src/main/java/randomeventhelper/randomevents/pinball/PinballHelper.java +++ b/src/main/java/randomeventhelper/randomevents/pinball/PinballHelper.java @@ -15,21 +15,20 @@ import net.runelite.api.events.VarbitChanged; import net.runelite.api.gameval.NpcID; import net.runelite.api.gameval.VarbitID; -import net.runelite.client.eventbus.EventBus; +import net.runelite.client.callback.ClientThread; import net.runelite.client.eventbus.Subscribe; import net.runelite.client.ui.overlay.OverlayManager; import net.runelite.client.util.Text; +import randomeventhelper.RandomEventHelperConfig; import randomeventhelper.RandomEventHelperPlugin; +import randomeventhelper.pluginmodulesystem.PluginModule; @Slf4j @Singleton -public class PinballHelper +public class PinballHelper extends PluginModule { @Inject - private EventBus eventBus; - - @Inject - private Client client; + private ClientThread clientThread; @Inject private OverlayManager overlayManager; @@ -43,24 +42,37 @@ public class PinballHelper // private Map pinballPostsMap; - private boolean initial = false; + @Inject + public PinballHelper(OverlayManager overlayManager, RandomEventHelperConfig config, Client client) + { + super(overlayManager, config, client); + } - public void startUp() + @Override + public void onStartUp() { - this.eventBus.register(this); this.overlayManager.add(pinballOverlay); this.activePinballPost = null; this.pinballPostsMap = Maps.newHashMap(); - this.initial = false; + + if (this.isLoggedIn()) + { + this.initiateActivePost(); + } } - public void shutDown() + @Override + public void onShutdown() { - this.eventBus.unregister(this); this.overlayManager.remove(pinballOverlay); this.activePinballPost = null; this.pinballPostsMap = null; - this.initial = false; + } + + @Override + public boolean isEnabled() + { + return this.config.isPinballEnabled(); } @Subscribe @@ -86,18 +98,9 @@ public void onGameObjectSpawned(GameObjectSpawned gameObjectSpawned) { log.debug("A pinball post has spawned: {}", pinballPost); this.pinballPostsMap.put(pinballPost.getVarbitValue(), gameObject); - - if (!this.initial) + if (this.activePinballPost == null) { - int currentPostVarbitValue = this.client.getVarbitValue(VarbitID.MACRO_PINBALL_CURRENT); - if (currentPostVarbitValue != 0) - { - VarbitChanged temp = new VarbitChanged(); - temp.setVarbitId(VarbitID.MACRO_PINBALL_CURRENT); - temp.setValue(currentPostVarbitValue); - this.onVarbitChanged(temp); - this.initial = true; - } + this.initiateActivePost(); } } } @@ -114,6 +117,10 @@ public void onVarbitChanged(VarbitChanged varbitChanged) { log.debug("The active pinball post has changed to: {}", pinballPost); this.activePinballPost = this.pinballPostsMap.get(value); + if (this.activePinballPost == null) + { + log.warn("The active pinball post game object is null for pinball post: {}", pinballPost); + } } else { @@ -134,8 +141,19 @@ public void onChatMessage(ChatMessage chatMessage) log.debug("Pinball game has ended so resetting active pinball post and pinball posts set."); this.activePinballPost = null; this.pinballPostsMap = Maps.newHashMap(); - this.initial = false; } } } + + private void initiateActivePost() + { + this.clientThread.invokeLater(() -> + { + int postVarbitValue = this.client.getVarbitValue(VarbitID.MACRO_PINBALL_CURRENT); + VarbitChanged varbitChangedEvent = new VarbitChanged(); + varbitChangedEvent.setVarbitId(VarbitID.MACRO_PINBALL_CURRENT); + varbitChangedEvent.setValue(postVarbitValue); + this.onVarbitChanged(varbitChangedEvent); + }); + } } diff --git a/src/main/java/randomeventhelper/randomevents/pirate/PirateChestSolver.java b/src/main/java/randomeventhelper/randomevents/pirate/PirateChestSolver.java index 9a0e3d8..b889aba 100644 --- a/src/main/java/randomeventhelper/randomevents/pirate/PirateChestSolver.java +++ b/src/main/java/randomeventhelper/randomevents/pirate/PirateChestSolver.java @@ -101,6 +101,7 @@ public boolean isChestCorrectlySet() log.debug("Pirate chest locks are correctly set."); return true; } + this.isSolved = false; log.debug("Pirate chest locks are not correctly set."); return false; } diff --git a/src/main/java/randomeventhelper/randomevents/pirate/PirateHelper.java b/src/main/java/randomeventhelper/randomevents/pirate/PirateHelper.java index dbffc01..3c168f3 100644 --- a/src/main/java/randomeventhelper/randomevents/pirate/PirateHelper.java +++ b/src/main/java/randomeventhelper/randomevents/pirate/PirateHelper.java @@ -14,22 +14,17 @@ import net.runelite.api.gameval.VarbitID; import net.runelite.api.widgets.Widget; import net.runelite.client.callback.ClientThread; -import net.runelite.client.eventbus.EventBus; import net.runelite.client.eventbus.Subscribe; import net.runelite.client.ui.overlay.OverlayManager; import net.runelite.client.util.Text; +import randomeventhelper.RandomEventHelperConfig; import randomeventhelper.RandomEventHelperPlugin; +import randomeventhelper.pluginmodulesystem.PluginModule; @Slf4j @Singleton -public class PirateHelper +public class PirateHelper extends PluginModule { - @Inject - private EventBus eventBus; - - @Inject - private Client client; - @Inject private ClientThread clientThread; @@ -49,24 +44,48 @@ public class PirateHelper @Getter private Map widgetMap; - public void startUp() + @Inject + public PirateHelper(OverlayManager overlayManager, RandomEventHelperConfig config, Client client) + { + super(overlayManager, config, client); + } + + @Override + public void onStartUp() { - this.eventBus.register(this); this.overlayManager.add(pirateOverlay); this.pirateChestSolver = new PirateChestSolver(); this.initiallyLoaded = false; this.widgetMap = Maps.newHashMap(); + + if (this.isLoggedIn()) + { + this.clientThread.invokeLater(() -> { + if (this.client.getWidget(this.CONFIRM_BUTTON_WIDGET_ID) != null) + { + WidgetLoaded chestConfirmButtonWidgetLoaded = new WidgetLoaded(); + chestConfirmButtonWidgetLoaded.setGroupId(InterfaceID.PIRATE_COMBILOCK); + this.eventBus.post(chestConfirmButtonWidgetLoaded); + } + }); + } } - public void shutDown() + @Override + public void onShutdown() { - this.eventBus.unregister(this); this.overlayManager.remove(pirateOverlay); this.pirateChestSolver = null; this.initiallyLoaded = false; this.widgetMap = null; } + @Override + public boolean isEnabled() + { + return this.config.isCaptArnavChestEnabled(); + } + @Subscribe public void onVarbitChanged(VarbitChanged varbitChanged) { diff --git a/src/main/java/randomeventhelper/randomevents/quizmaster/QuizMasterHelper.java b/src/main/java/randomeventhelper/randomevents/quizmaster/QuizMasterHelper.java index 61c2fbc..dab726e 100644 --- a/src/main/java/randomeventhelper/randomevents/quizmaster/QuizMasterHelper.java +++ b/src/main/java/randomeventhelper/randomevents/quizmaster/QuizMasterHelper.java @@ -17,20 +17,15 @@ import net.runelite.api.gameval.NpcID; import net.runelite.api.widgets.Widget; import net.runelite.client.callback.ClientThread; -import net.runelite.client.eventbus.EventBus; import net.runelite.client.eventbus.Subscribe; import net.runelite.client.ui.overlay.OverlayManager; +import randomeventhelper.RandomEventHelperConfig; +import randomeventhelper.pluginmodulesystem.PluginModule; @Slf4j @Singleton -public class QuizMasterHelper +public class QuizMasterHelper extends PluginModule { - @Inject - private EventBus eventBus; - - @Inject - private Client client; - @Inject private ClientThread clientThread; @@ -43,20 +38,44 @@ public class QuizMasterHelper @Getter private Widget quizAnswerWidget; - public void startUp() + @Inject + public QuizMasterHelper(OverlayManager overlayManager, RandomEventHelperConfig config, Client client) + { + super(overlayManager, config, client); + } + + @Override + public void onStartUp() { - this.eventBus.register(this); this.overlayManager.add(quizMasterOverlay); this.quizAnswerWidget = null; + + if (this.isLoggedIn()) + { + this.clientThread.invokeLater(() -> { + if (this.client.getWidget(InterfaceID.MacroQuizshow.BUTTONS) != null) + { + WidgetLoaded quizMasterButtonsWidgetLoaded = new WidgetLoaded(); + quizMasterButtonsWidgetLoaded.setGroupId(InterfaceID.MACRO_QUIZSHOW); + this.eventBus.post(quizMasterButtonsWidgetLoaded); + } + }); + } } - public void shutDown() + @Override + public void onShutdown() { - this.eventBus.unregister(this); this.overlayManager.remove(quizMasterOverlay); this.quizAnswerWidget = null; } + @Override + public boolean isEnabled() + { + return this.config.isQuizMasterEnabled(); + } + @Subscribe public void onWidgetLoaded(WidgetLoaded widgetLoaded) { diff --git a/src/main/java/randomeventhelper/randomevents/sandwichlady/SandwichLadyHelper.java b/src/main/java/randomeventhelper/randomevents/sandwichlady/SandwichLadyHelper.java index 4543a33..280c1df 100644 --- a/src/main/java/randomeventhelper/randomevents/sandwichlady/SandwichLadyHelper.java +++ b/src/main/java/randomeventhelper/randomevents/sandwichlady/SandwichLadyHelper.java @@ -12,21 +12,16 @@ import net.runelite.api.gameval.InterfaceID; import net.runelite.api.widgets.Widget; import net.runelite.client.callback.ClientThread; -import net.runelite.client.eventbus.EventBus; import net.runelite.client.eventbus.Subscribe; import net.runelite.client.ui.overlay.OverlayManager; import net.runelite.client.util.Text; +import randomeventhelper.RandomEventHelperConfig; +import randomeventhelper.pluginmodulesystem.PluginModule; @Slf4j @Singleton -public class SandwichLadyHelper +public class SandwichLadyHelper extends PluginModule { - @Inject - private EventBus eventBus; - - @Inject - private Client client; - @Inject private ClientThread clientThread; @@ -42,23 +37,45 @@ public class SandwichLadyHelper private final String SANDWICH_LADY_TRAY_REGEX = "Have a (?[\\w\\s]+) for free!"; private final Pattern SANDWICH_LADY_PATTERN = Pattern.compile(SANDWICH_LADY_TRAY_REGEX, Pattern.CASE_INSENSITIVE); - public void startUp() + @Inject + public SandwichLadyHelper(OverlayManager overlayManager, RandomEventHelperConfig config, Client client) + { + super(overlayManager, config, client); + } + + @Override + public void onStartUp() { - this.eventBus.register(this); this.overlayManager.add(sandwichLadyOverlay); this.trayFoodAnswerWidget = null; - WidgetLoaded temp = new WidgetLoaded(); - temp.setGroupId(InterfaceID.SANDWICH_TRAY); - onWidgetLoaded(temp); + + if (this.isLoggedIn()) + { + this.clientThread.invokeLater(() -> { + if (this.client.getWidget(InterfaceID.SandwichTray.SANDWHICH_REFRESHMENT_LAYER) != null) + { + WidgetLoaded sandwichLadyTrayRefreshmentWidgetLoaded = new WidgetLoaded(); + sandwichLadyTrayRefreshmentWidgetLoaded.setGroupId(InterfaceID.SANDWICH_TRAY); + this.eventBus.post(sandwichLadyTrayRefreshmentWidgetLoaded); + } + }); + } } - public void shutDown() + @Override + public void onShutdown() { this.eventBus.unregister(this); this.overlayManager.remove(sandwichLadyOverlay); this.trayFoodAnswerWidget = null; } + @Override + public boolean isEnabled() + { + return this.config.isSandwichLadyEnabled(); + } + @Subscribe public void onWidgetLoaded(WidgetLoaded widgetLoaded) { diff --git a/src/main/java/randomeventhelper/randomevents/surpriseexam/SurpriseExamHelper.java b/src/main/java/randomeventhelper/randomevents/surpriseexam/SurpriseExamHelper.java index dab2c2e..573f71c 100644 --- a/src/main/java/randomeventhelper/randomevents/surpriseexam/SurpriseExamHelper.java +++ b/src/main/java/randomeventhelper/randomevents/surpriseexam/SurpriseExamHelper.java @@ -23,20 +23,15 @@ import net.runelite.api.gameval.NpcID; import net.runelite.api.widgets.Widget; import net.runelite.client.callback.ClientThread; -import net.runelite.client.eventbus.EventBus; import net.runelite.client.eventbus.Subscribe; import net.runelite.client.ui.overlay.OverlayManager; +import randomeventhelper.RandomEventHelperConfig; +import randomeventhelper.pluginmodulesystem.PluginModule; @Slf4j @Singleton -public class SurpriseExamHelper +public class SurpriseExamHelper extends PluginModule { - @Inject - private EventBus eventBus; - - @Inject - private Client client; - @Inject private ClientThread clientThread; @@ -111,9 +106,15 @@ public class SurpriseExamHelper InterfaceID.PatternNext.SELECT_3 }; - public void startUp() + @Inject + public SurpriseExamHelper(OverlayManager overlayManager, RandomEventHelperConfig config, Client client) + { + super(overlayManager, config, client); + } + + @Override + public void onStartUp() { - this.eventBus.register(this); this.overlayManager.add(overlay); this.patternCardHint = null; this.patternCardAnswers = null; @@ -121,11 +122,29 @@ public void startUp() this.patternNextAnswer = null; this.patternNextAnswerWidget = null; this.relationshipSystem = new OSRSItemRelationshipSystem(); + + if (this.isLoggedIn()) + { + this.clientThread.invokeLater(() -> { + if (this.client.getWidget(InterfaceID.PatternCards.HINT) != null) + { + WidgetLoaded matchingCardsWidgetLoaded = new WidgetLoaded(); + matchingCardsWidgetLoaded.setGroupId(InterfaceID.PATTERN_CARDS); + this.eventBus.post(matchingCardsWidgetLoaded); + } + if (this.client.getWidget(InterfaceID.PatternNext.UNIVERSE_TEXT12) != null) + { + WidgetLoaded whatsNextWidgetLoaded = new WidgetLoaded(); + whatsNextWidgetLoaded.setGroupId(InterfaceID.PATTERN_NEXT); + this.eventBus.post(whatsNextWidgetLoaded); + } + }); + } } - public void shutDown() + @Override + public void onShutdown() { - this.eventBus.unregister(this); this.overlayManager.remove(overlay); this.patternCardHint = null; this.patternCardAnswers = null; @@ -135,6 +154,12 @@ public void shutDown() this.relationshipSystem = null; } + @Override + public boolean isEnabled() + { + return this.config.isSurpriseExamEnabled(); + } + @Subscribe public void onWidgetLoaded(WidgetLoaded widgetLoaded) {