

You can also start or stop scene looping via a dedicated key binding.
When you register functions through events, they are added as SceneActionRules.
Each rule is checked whenever a scene loads — ensuring your code only runs once per area, avoiding duplicate executions.
gymmed.scene_tester as mod namespace.
Here are provided all events you can subscribe to and listen:
gymmed.scene_tester fires event
FinishedSceneLoopAction with payload actionId. It
fires it after all action areas a looped and provided action code is executed.
actionId — the identifier you assigned when adding your action
(used to verify it’s your event).
ResourcesPrefabManager.Load patch to ensure Scene Tester is initialized before subscribing:
using OutwardModsCommunicator;
...
[HarmonyPatch(typeof(ResourcesPrefabManager), nameof(ResourcesPrefabManager.Load))]
public class ResourcesPrefabManager_Load
{
static void Postfix(ResourcesPrefabManager __instance)
{
EventBus.Subscribe("gymmed.scene_tester", "FinishedSceneLoopAction", OnFinish);
}
}
public static void OnFinish(EventPayload payload)
{
if (payload == null) return;
string actionId = payload.Get<string>("actionId", null);
if(string.IsNullOrEmpty(actionId))
{
Log.LogMessage($"MyMod@OnFinish didn't receive actionId variable!");
return;
}
...continue with execution...
}
gymmed.scene_tester_* as mod namespace.
Here are provided all events you can publish:
AddSceneLoopActionHashSet<AreaManager.AreaEnum> defining which areas to loop over.
using OutwardModsCommunicator;
...
HashSet<AreaManager.AreaEnum> areas = new HashSet<AreaManager.AreaEnum>();
areas.Add(AreaManager.AreaEnum.Abrassar);
areas.Add(AreaManager.AreaEnum.Emercar);
areas.Add(AreaManager.AreaEnum.HallowedMarsh);
Action function = () =>
{
string areaName = AreaManager.Instance.CurrentArea.GetName();
Log.LogMessage($"Current Area GetName:{areaName}");
};
var payload = new EventPayload
{
["actionId"] = actionId,
["action"] = function,
["hashSetOfAreas"] = areas,
};
EventBus.Publish("gymmed.scene_tester_*", "AddSceneLoopAction", payload);
RemoveSceneLoopAction with payload
actionId.actionId — the ID of the action you want to remove.
using OutwardModsCommunicator;
...
var payload = new EventPayload
{
["actionId"] = actionId,
};
EventBus.Publish("gymmed.scene_tester_*", "RemoveSceneLoopAction", payload);
To manually set up, do the following
Outward\BepInEx\plugins\OutwardSceneTester\.BepInEx\plugins\OutwardSceneTester\ directory you created.Outward\BepInEx\plugins\OutwardSceneTester\OutwardSceneTester.dll
Launch the game.