Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
30 commits
Select commit Hold shift + click to select a range
f184ac8
feat(module): Created PluginModule class for modular plugin lifecycle
Infinitay Dec 20, 2025
035d976
refactor: Start refactoring RandomEventHelper to modular plugin lifec…
Infinitay Dec 21, 2025
62288ff
refactor(surpriseexam): Migrate SurpriseExamHelper to PluginModule li…
Infinitay Dec 22, 2025
7a2e972
feat(PluginModule): Add #isLoggedIn to check if the player is logged in
Infinitay Dec 22, 2025
a003bd0
feat(surpriseexam): Improve support for starting during active event
Infinitay Dec 22, 2025
2f8f9a3
refactor(captarnav): Migrate PirateHelper to PluginModule lifecycle
Infinitay Dec 22, 2025
9813fd4
refactor(mime): Migrate MimeHelper to PluginModule lifecycle
Infinitay Dec 24, 2025
f6cec61
feat(mime): Improve support for starting during active event, overlay…
Infinitay Dec 24, 2025
fd22c93
refactor(drilldemon): Migrate DrillDemonHelper to PluginModule lifecycle
Infinitay Dec 26, 2025
fbfb867
feat(drilldemon): Improve support for starting during active event
Infinitay Dec 26, 2025
e169c9e
refactor(beekeeper): Migrate BeekeeperHelper to PluginModule lifecycle
Infinitay Dec 27, 2025
be3121d
feat(beekeeper): Improve support for starting during active event
Infinitay Dec 27, 2025
7228d71
feat(captarnav): Improve support for starting during active event
Infinitay Dec 27, 2025
1a1059c
refactor(quizmaster): Migrate QuizMasterHelper to PluginModule lifecycle
Infinitay Dec 27, 2025
d8e3c50
feat(quizmaster): Improve support for starting during active event
Infinitay Dec 27, 2025
7652e0f
refactor(sandwich): Migrate SandwichLadyHelper to PluginModule lifecycle
Infinitay Dec 28, 2025
455aeeb
feat(sandwich): Improve support for starting during active event
Infinitay Dec 28, 2025
e5a228f
refactor(gravedigger): Migrate GravediggerHelper to PluginModule life…
Infinitay Dec 28, 2025
1e07981
feat(gravedigger): Improve support for starting during active event
Infinitay Dec 28, 2025
0b2e4f9
fix(gravedigger): Fix NPE when starting plugin with an empty grave
Infinitay Dec 28, 2025
d419870
refactor(maze): Migrate MazeHelper to PluginModule lifecycle
Infinitay Dec 29, 2025
4df7203
refactor(maze): Remove now redundant cold start handling
Infinitay Dec 29, 2025
18b64eb
fix(maze): Fix not clearing the current path when plugin is shutdown
Infinitay Dec 29, 2025
f3eec36
refactor(freakyforester): Migrate FreakyForesterHelper to PluginModul…
Infinitay Dec 31, 2025
21760aa
feat(freakyforester): Improve support for starting during active event
Infinitay Dec 31, 2025
5df78a3
fix(maze): Fix not showing path on restart, use instanced WorldPoint …
Infinitay Jan 5, 2026
f0d3ae7
refactor(pinball): Migrate PinballHelper to PluginModule lifecycle
Infinitay Jan 7, 2026
110ba96
feat(pinball): Improve support for starting during active event
Infinitay Jan 7, 2026
7b88f2b
fix(drilldemon): Use #invokeLater to fix possible race conditions
Infinitay Jan 7, 2026
7b9f85d
chore: Update plugin to v3.0.0
Infinitay Jan 16, 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
2 changes: 1 addition & 1 deletion build.gradle
Original file line number Diff line number Diff line change
Expand Up @@ -44,7 +44,7 @@ test {
}

group = 'randomeventhelper'
version = '2.7.1'
version = '3.0.0'

tasks.withType(JavaCompile).configureEach {
options.encoding = 'UTF-8'
Expand Down
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