Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
29 commits
Select commit Hold shift + click to select a range
b4bb557
feat(module): Created PluginModule class for modular plugin lifecycle
Infinitay Dec 20, 2025
c471c4b
refactor: Start refactoring RandomEventHelper to modular plugin lifec…
Infinitay Dec 21, 2025
191c2b6
refactor(surpriseexam): Migrate SurpriseExamHelper to PluginModule li…
Infinitay Dec 22, 2025
1720251
feat(PluginModule): Add #isLoggedIn to check if the player is logged in
Infinitay Dec 22, 2025
751e080
feat(surpriseexam): Improve support for starting during active event
Infinitay Dec 22, 2025
78101ce
refactor(captarnav): Migrate PirateHelper to PluginModule lifecycle
Infinitay Dec 22, 2025
b0d167b
refactor(mime): Migrate MimeHelper to PluginModule lifecycle
Infinitay Dec 24, 2025
36f21ee
feat(mime): Improve support for starting during active event, overlay…
Infinitay Dec 24, 2025
efc92e9
refactor(drilldemon): Migrate DrillDemonHelper to PluginModule lifecycle
Infinitay Dec 26, 2025
773da8d
feat(drilldemon): Improve support for starting during active event
Infinitay Dec 26, 2025
3bfbc05
refactor(beekeeper): Migrate BeekeeperHelper to PluginModule lifecycle
Infinitay Dec 27, 2025
84470ec
feat(beekeeper): Improve support for starting during active event
Infinitay Dec 27, 2025
4037443
feat(captarnav): Improve support for starting during active event
Infinitay Dec 27, 2025
289a0ea
refactor(quizmaster): Migrate QuizMasterHelper to PluginModule lifecycle
Infinitay Dec 27, 2025
ae37e9e
feat(quizmaster): Improve support for starting during active event
Infinitay Dec 27, 2025
40a2f71
refactor(sandwich): Migrate SandwichLadyHelper to PluginModule lifecycle
Infinitay Dec 28, 2025
f1f4377
feat(sandwich): Improve support for starting during active event
Infinitay Dec 28, 2025
c3d6883
refactor(gravedigger): Migrate GravediggerHelper to PluginModule life…
Infinitay Dec 28, 2025
8b65c1f
feat(gravedigger): Improve support for starting during active event
Infinitay Dec 28, 2025
a9fbc97
fix(gravedigger): Fix NPE when starting plugin with an empty grave
Infinitay Dec 28, 2025
6d78225
refactor(maze): Migrate MazeHelper to PluginModule lifecycle
Infinitay Dec 29, 2025
7252604
refactor(maze): Remove now redundant cold start handling
Infinitay Dec 29, 2025
330b569
fix(maze): Fix not clearing the current path when plugin is shutdown
Infinitay Dec 29, 2025
027fe3c
refactor(freakyforester): Migrate FreakyForesterHelper to PluginModul…
Infinitay Dec 31, 2025
c98b52f
feat(freakyforester): Improve support for starting during active event
Infinitay Dec 31, 2025
7b9d492
fix(maze): Fix not showing path on restart, use instanced WorldPoint …
Infinitay Jan 5, 2026
40ebf1c
refactor(pinball): Migrate PinballHelper to PluginModule lifecycle
Infinitay Jan 7, 2026
5f3efba
feat(pinball): Improve support for starting during active event
Infinitay Jan 7, 2026
e63d8e7
fix(drilldemon): Use #invokeLater to fix possible race conditions
Infinitay Jan 7, 2026
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
222 changes: 44 additions & 178 deletions src/main/java/randomeventhelper/RandomEventHelperPlugin.java
Original file line number Diff line number Diff line change
@@ -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;
Expand Down Expand Up @@ -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;
Expand Down Expand Up @@ -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;

// <String, PluginModule> -> <configKeyForIsEnabled, PluginModuleInstance>
private Map<String, PluginModule> 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.<String, PluginModule>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();
}
}
}

Expand All @@ -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
Expand All @@ -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();
}
}
}
Expand Down
Original file line number Diff line number Diff line change
@@ -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();
}
}
Loading