StoryKit
Add an NPC to Outward as plain data: StoryKit builds the character, spawns it at a fixed spot, wires its dialogue, and compiles a trainer skill tree that sells from the vanilla Trainer UI. Requires Si
About this mod Author’s original text
StoryKit — add an NPC, trainer, and skill tree
📖 Full documentation: StoryKit wiki page
A BepInEx library plugin for Outward (Definitive Edition, Mono branch) that lets a mod add an
NPC: a standing character in the world with a dialogue graph and, if it's a trainer, a full
in-game skill tree the vanilla Trainer window sells from. A consuming mod describes the NPC as
plain data; StoryKit builds the character, spawns it at a fixed spot, wires its conversation, and
compiles its skill tree — no custom UI, no NodeCanvas hand-editing.
StoryKit covers NPCs, trainers, and dialogue. A quest/story-event engine is not part of the
kit — there is no quest-authoring API. (It does ship read-only recon tooling over the vanilla
QuestEventManager — the qevent* dev verbs below — but that is diagnostics, not an authoring
surface, and it's off unless [Recon] EnableStoryRecon is turned on.)
Requires: BepInEx 5 (Outward's Mono branch — see Compatibility), ForgeKit, and
SideLoader present at runtime.
Installing (for players)
You don't install or interact with StoryKit directly. It arrives as a dependency of a mod that
adds an NPC — for example Beastwhispering, whose animal-taming trainer is a StoryKit NPC that
sells the mod's pet-skill tree. The NPC and its dialogue are what you actually meet in-game;
StoryKit is the plumbing behind it. A mod manager installs it automatically alongside whatever
mod declares it as a dependency.
Consuming the kit
A consumer calls NpcRegistry.Register(NpcSpec) in Awake, describing the NPC's placement,
appearance, dialogue tree, and (if it's a trainer) the skills it sells. NpcDirector spawns the
registered NPC at player-ready on every scene load (built to be master-only in co-op and
duplicate-safe — that guard has not been live-verified on a two-machine session), and
DialogueBuilder compiles the described conversation into a real NodeCanvas graph reusing
SideLoader's own trainer dialogue nodes. See the wiki page for the full NpcSpec/SkillTreeDef
shape and worked examples.
Mobile, combat-capable and merchant NPCs
Since 2026-08-22 a spec can also describe a walking NPC with an AI, combat stats, a faction, a
backpack and a vanilla shop (the road-merchant wave; first consumer: DangerousRoads). All of it
is opt-in on the same NpcSpec; a spec that sets none of these fields builds the classic pinned
talker exactly as before.
NpcRegistry.Register(new NpcSpec
{
Id = "mymod.pedlar", Name = "Orrin the Pedlar",
Mobile = true, // SideLoader melee AI + NavMeshAgent; no pin/NoFall/snap
LookFollowEnabled = false, // the agent owns yaw on a mobile body
Faction = "Merchants", // Character.Factions by NAME
BackpackName = "Mefino's Trade Backpack", // display name; ' and ’ both match
Ai = new AiSpec { WanderSpeed = 1.1f, CanWanderFar = false, ChanceToAttack = 40f },
Combat = new CombatSpec { Health = 900f, Protection = 20f, DamageBonusMult = 0.25f,
TargetableFactions = new List { "Bandits" } },
// MerchantSpec requires Mobile = true — the Merchant graft rides the mobile rig, and a
// static merchant is refused by SpecValidation rather than spawning without a shop.
Merchant = new MerchantSpec { StockTableNameContains = "MerchantCaravanTrader",
FallbackItemNames = new List { "Bandages", "Makeshift Torch" },
RefreshRateGameHours = 72f },
Dialogue = new DialogueSpec
{
Greetings = { "Care to lighten my pack?" },
Choices = { Choice.Shop("shop", "Let's see what you're carrying."),
Choice.Reply("road", "Where to?", "Wherever pays.") },
},
});
Character body = NpcRegistry.SpawnAtAndGet("mymod.pedlar", pos, yaw); // drive its AISWander yourself
NpcRegistry.ReplaceGreetings("mymod.pedlar", new { "You saved my hide back there." }); // live swap
NpcRegistry.Unregister("mymod.pedlar"); // done with him: despawn if live, drop the SL template + entry
A consumer that mints a fresh spec id per event (SideLoader refuses a second template per UID, so a
respawn needs a new id) must Unregister the old one when it is finished, or the
Install & use Install: BepInEx plugin
- The archive from playbuff is the mod itself — usually a BepInEx plugin (a .dll or a plugin folder once unzipped).
- Recommended: use a community mod manager (such as r2modman) — pick this game, import the mod, and the manager sets up BepInEx and its dependencies for you.
- Manual route: install the BepInEx loader in the game folder, then drop the unzipped .dll or plugin folder into BepInEx/plugins/.
- Launch the game — the BepInEx console logs every plugin it loads; seeing this mod in the log means it is installed.
Mods with listed dependencies need those installed too, or they will not load. Options are usually changed in-game or in the plugin's config file.
Install these first, or the mod will not work: