- ServUO Version
- Publish 58
- Ultima Expansion
- The Second Age
Mods, feel free to move this if it's in the wrong board — I wasn't sure where it belongs now that the Resource Manager is archived.
I know everyone's a bit sick of "look what I built" threads, so I'll keep the sales pitch short and get to the part I actually care about (a question for you all) at the bottom.
The short version: I've been having a lot of fun building a drop-in set of C# scripts that give ServUO NPCs a voice, a memory, and a small autonomous life, powered by a *local* OpenAI-compatible LLM (Ollama by default) with optional vector RAG over Qdrant. Essentially how can I generate dialog that feels real for the NPCs.
GitHub: GitHub - ZoltyMat/uo-llm-npc: LLM-driven NPCs for Ultima Online (ServUO): persistent identity, per-player memory, autonomous errands, NPC-to-NPC chatter, optional Qdrant RAG. Fail-open, LLM never in the sim loop. (MIT)
A peasant you greet remembers you next time. A blacksmith has opinions about the war and the town he hails from. Two townsfolk murmur to each other when you wander past. Design rules I stuck to:
- The LLM is NEVER in the simulation loop — world state advances deterministically, the model only generates words.
- Everything is fail-open: timeout + deterministic fallback on every call, so a dead/slow endpoint just degrades NPCs to ordinary ServUO NPCs, never errors.
- Off-screen NPCs cost nothing (player-centric heartbeat).
- Actions are a hardcoded allowlist (bow/wave/mime trade), never free text — the model picks from the menu, it can't touch game state.
Install is drop-in: Scripts/Custom/LLMNpc/, point the config at an endpoint, [LLMReload. Write-ups if you want the why/how:
- Technical: How LLM-driven NPCs work in Ultima Online (ServUO)
- The story version: When the peasant talks back: LLM NPCs in Ultima Online
The actual question: this whole thing started because I keep wanting to bolt "Stardew Valley"-style cozy/life-sim features onto classic UO — NPCs with routines and relationships, the world feeling lived-in rather than just a spawn grid. So I'm curious: what have you all done in that direction? Custom farming, NPC schedules, reputation systems, festivals, anything that makes a shard feel like a place people live instead of a place people grind? Would love to see what's out there and trade notes.
Also I used to play on Lake Superior shard a lifetime ago so if you recognize me say hi.
I know everyone's a bit sick of "look what I built" threads, so I'll keep the sales pitch short and get to the part I actually care about (a question for you all) at the bottom.
The short version: I've been having a lot of fun building a drop-in set of C# scripts that give ServUO NPCs a voice, a memory, and a small autonomous life, powered by a *local* OpenAI-compatible LLM (Ollama by default) with optional vector RAG over Qdrant. Essentially how can I generate dialog that feels real for the NPCs.
GitHub: GitHub - ZoltyMat/uo-llm-npc: LLM-driven NPCs for Ultima Online (ServUO): persistent identity, per-player memory, autonomous errands, NPC-to-NPC chatter, optional Qdrant RAG. Fail-open, LLM never in the sim loop. (MIT)
A peasant you greet remembers you next time. A blacksmith has opinions about the war and the town he hails from. Two townsfolk murmur to each other when you wander past. Design rules I stuck to:
- The LLM is NEVER in the simulation loop — world state advances deterministically, the model only generates words.
- Everything is fail-open: timeout + deterministic fallback on every call, so a dead/slow endpoint just degrades NPCs to ordinary ServUO NPCs, never errors.
- Off-screen NPCs cost nothing (player-centric heartbeat).
- Actions are a hardcoded allowlist (bow/wave/mime trade), never free text — the model picks from the menu, it can't touch game state.
Install is drop-in: Scripts/Custom/LLMNpc/, point the config at an endpoint, [LLMReload. Write-ups if you want the why/how:
- Technical: How LLM-driven NPCs work in Ultima Online (ServUO)
- The story version: When the peasant talks back: LLM NPCs in Ultima Online
The actual question: this whole thing started because I keep wanting to bolt "Stardew Valley"-style cozy/life-sim features onto classic UO — NPCs with routines and relationships, the world feeling lived-in rather than just a spawn grid. So I'm curious: what have you all done in that direction? Custom farming, NPC schedules, reputation systems, festivals, anything that makes a shard feel like a place people live instead of a place people grind? Would love to see what's out there and trade notes.
Also I used to play on Lake Superior shard a lifetime ago so if you recognize me say hi.