The world in view. Your adventure at the center.
A custom Mudlet interface for Duris, with a bronze-and-charcoal frame, live character information, integrated maps, and organized chat. Its three-column layout keeps the game console central while room, group, and combat details stay within reach.
This Duris client is maintained by LuminariMUD in LuminariMUD/duris-client, originally created by Arjinius / Arjin.
Install · Features · Commands · How it works · Design · Build and contribute
You need Mudlet 4.19.1 or newer, a Duris profile, and GMCP enabled in both the Mudlet profile and the game. Zone maps also need access to duris.sbs over HTTPS.
- Download duris-client.mpackage from the latest release. Each release lists its changes and a SHA-256 checksum; you do not need to build it yourself.
- Open your Duris profile in Mudlet.
- Open Package Manager (
Alt+O), choose Install New Package, and select the downloaded.mpackage. See the Mudlet Package Manager guide for details. - Reconnect and enter the game so fresh character and room data can populate the interface.
The package is named Arjinius Client inside Mudlet. For updates, download the .mpackage from the latest release, replace your installed copy through Package Manager, and reconnect. See CHANGELOG.md for what changed.
| At a glance | What the client provides |
|---|---|
| A cohesive interface | A dark fantasy frame, percentage-based layout, central game console, and Mudlet's native command line. |
| Character and quests | HP, mana, movement, progress toward the next level, position, character identity, coins, and active bartender quest details. Non-mana classes show MP n/a. |
| Zone and wilderness maps | Zone layouts from the Duris map API and wilderness maps from GMCP, with zoom controls, room tooltips, and a current-position marker. |
| Room awareness | Clickable exits, distinct closed/locked exit styles, MOBS and ITEMS tabs in ROOM, a separate PLAYERS panel, plus NPC annotations showing whom they are fighting. |
| Combat and groups | Target health and position, a prompt-derived tank display, affects, a per-fight damage counter, group size/capacity, moves per member, the most hurt member highlighted, and dimmed AWAY markers for members outside your room. |
| Chat that stays organized | ALL / TELLS / NCHAT / ROOM / GUILD / GROUP, with timestamps, individual tell windows, contact history for the current session, and alignment-colored nchat/jchat senders. |
| Useful details nearby | Inventory, equipment, who-list, and ship panels; context menus for common actions; in-game time; links to the world map and current zone's wiki page. |
| Text intelligence | Aligned, color-coded scan output with a per-direction summary; +exp notices with a kills-to-level estimate; banners when sanctuary, rage, war cry, or stone skin drop, when you are disarmed or scryed, and when a skill improves. |
| Automation, off by default | Auto-stand, auto-group on consent, auto-rescue for a list of names, auto-assist, re-rage, re-wield after disarm, auto-loot, bard song restart, follower traps, stat reroller, and ship hotkeys use auto <name> on. Repeat timers have separate start/stop commands; type auto for help. |
| Utility aliases | Container, corpse, door, potion, bash-by-race, flee-stab, rebash-after-lag, hold-and-use wands, one-line identify, group casting, loot split by bidscore, ship orders and dock runs. Type auto for the list. |
| Numpad movement | 8/2/4/6 move, 7/9/1/3 diagonals, - up, + down, 5 look, / scan, 0 flee. Turn off with ui set keypad off. |
Guild gcc messages route to GUILD, group gsay to GROUP, and jchat to NCHAT. petition and wizmsg appear in ALL with distinct colors. Tell windows and their history are session-only.
Type these into the Mudlet command input:
| Command | Purpose |
|---|---|
ui on |
Show the interface, retaining its state and widgets. |
ui off |
Hide the interface and restore Mudlet's main output area; the native command line stays available. |
ui layout |
Show panel IDs and saved states. ui layout unlock enables title dragging and border resizing; ui layout lock prevents movement. |
ui layout reset |
Restore every dashboard panel and the default tabs without clearing game state or scrollback. The fixed Reset layout button does the same. |
ui panel <id> <action> |
Actions: show, hide, minimize, restore, maximize, dock, float, lock, unlock. Right-click a panel title or use the fixed Panels button for mouse controls. |
ui help |
List commands and numpad keys. |
ui debug |
Show which core GMCP data tables have arrived. |
ui damage |
Session damage report (total, hits, damage per second, current fight). ui damage reset clears it. Clicking the DMG counter in the target panel shows the same report. |
ui set |
List the toggles below. ui set <name> on or off changes one and remembers it. |
ui set compactHeader on / off |
Choose a quiet gradient (on) or the Stormwatch panorama (off, default). Both retain the slim frame and expanded panel workspace. |
auto |
ArjAuto help: automation toggles (auto set, auto <name> on|off), variables (vars), and the utility aliases. |
mapper |
Show mapper help. |
mapper on / mapper off |
Enable or pause mapper updates. |
mapper status |
Show the current map mode, room, zone, and cache statistics. |
mapper debug |
Inspect current room, exit, and cached zone data. |
mapper reload |
Clear cached zone layouts; move or use look to request fresh room data and reload the map. |
mapper size 14 |
Set zone room size; accepts integers from 8–20. |
/mapreload |
An additional shortcut to clear the map cache. |
Toggles for ui set: compactHeader (off by default), keypad (numpad keys), chatTimestamps, damageTracker, scanFormat, alerts, and expTracker (the latter six default to on). All are saved to arjui_settings.json in your Mudlet profile folder. Changing the presentation preserves your output history, selected tabs, and live state; the saved mode also applies after reopening Mudlet.
Panel IDs are map, room, output, character, players, chat,
vitals, tank, and target. Existing conversations also use tell:<name>.
Private windows share move/resize and minimize/maximize controls, retain drafts
and history through reset, and start closed after reset. Their geometry and
history remain session-only.
In CHARACTER, GEAR contains INV and EQ. SPELLS lists the character's spells and shows the spell command reported by Duris. A primary click on that command can start preparation. VITALS shows the estimated time remaining next to position on servers that publish spell preparation over GMCP.
Panels start locked in their named home positions. Unlock to move or resize them;
adjusting a panel makes it float. Dock returns it home. Only one panel can
maximize at a time; Restore returns its previous state. Game output cannot
be hidden or minimized independently. Dashboard choices are saved in
arjui_layout_v2.json in this profile and survive reconnects and restarts.
The original arjui_layout.json remains available if you roll back. A reset
restores defaults even while ui off, without turning the UI on.
Use the map's + / − controls to zoom. Click the active STATS, INV, EQ, WHO, or SHIP tab to send score, inv, eq, who, or look ship and refresh the corresponding information.
Three Lua scripts run inside Mudlet. ArjUI builds the Geyser interface and processes live game information. ArjMapper uses the map area provided by ArjUI, combining room data with downloaded zone layouts or the server's wilderness map. ArjAuto holds the automation toggles and utility aliases; it reads ArjUI's live state (combat, position, group, ship) to decide when to act.
flowchart TB
accTitle: Duris client data flow
accDescr: The server supplies GMCP and game text to ArjUI. ArjMapper combines room GMCP with zone layouts from the web API and renders maps inside ArjUI. ArjAuto reads live state and sends commands for enabled behaviors and invoked utility aliases.
server["Duris server"]
wiki["Duris web API"]
subgraph mudlet["Mudlet · Arjinius Client"]
direction TB
gmcp["GMCP events"]
text["Game text and prompts"]
ui["ArjUI.lua<br/>Interface and live state"]
mapper["ArjMapper.lua<br/>Zone cache and map rendering"]
auto["ArjAuto.lua<br/>Opt-in automation and utility aliases"]
panels["Console · vitals · room · group<br/>combat · chat · character tabs"]
maps["Zone and wilderness views<br/>inside ArjUI's map area"]
gmcp -->|"Character, room, combat, group, chat, quest"| ui
text -->|"Console, tank, time, inventory, equipment, who"| ui
gmcp -->|"Room.Info · Room.Map"| mapper
ui --> panels
ui -.->|"Provides map container"| mapper
mapper --> maps
ui -->|"Live state"| auto
end
server --> gmcp
server --> text
wiki -->|"HTTPS zone layout JSON"| mapper
auto -->|"Game commands"| server
classDef source fill:#211b14,stroke:#d4a855,color:#f0dfbf,stroke-width:2px
classDef transport fill:#14202a,stroke:#7090c0,color:#dce7f5
classDef script fill:#302519,stroke:#d4a855,color:#fff0d4,stroke-width:2px
classDef surface fill:#18241d,stroke:#7da68b,color:#e1f0e6
class server,wiki source
class gmcp,text transport
class ui,mapper,auto script
class panels,maps surface
style mudlet fill:transparent,stroke:#8c6e46
linkStyle default stroke:#8c6e46,stroke-width:1.5px
Most live panels use GMCP. Inventory, equipment, and who lists capture game text; tank and time displays also depend on text triggers. The damage counter reads Combat.Update.round when the server sends it and falls back to [Damage: N] display lines. Several display helpers were adapted from the community "lielz scripts" collection; see docs/ongoing-projects/lielz-port.md for what was taken and what was left out. Zone layouts come from https://duris.sbs/api/wiki/zones/{zoneId}/map-data and are cached in memory. The mapper listens to Room.Info and Room.Map directly.
See the design guide for panel proportions, visual conventions, interactions, data sources, and lifecycle behavior.
- Empty vitals or room panels: run
ui debug, check that GMCP is enabled, then reconnect and enter the game. Initial character setup usesChar.Statuson login. - Blank or stale zone map: run
mapper statusandmapper debug, check access to the Duris website, then trymapper reloadfollowed bylook. - Missing tank, inventory, equipment, who, or time information: these displays depend on recognized text and prompt formats. Custom prompts or changed server output can affect capture even when GMCP panels work.
- Need to restore the main console: use
ui off;ui onshows the existing interface again without rebuilding it.
The SHIP tab opens the Captain's Table: spatial armor/internal gauges, actual/ordered helm instruments, arc badges, a numbered manifest, crew watch and a contact bearing glass. Resize or maximize Character for the expanded composition. Narrow frames stack the sections; Plot expands the bearing glass locally. Details retains the complete selectable ledger, and Copy exports it. Your Bridge/Details preference is remembered. Ship data stays session-local.
Markers and badges inspect locally. Look ship, Look crew and Contacts each send their named reference command once. Timers are server counters; timer-ready does not mean a weapon can fire. The contact plot uses reported bearing/range, including altitude, with north at the top; X/Y remain tactical coordinates around our 50/50 reference. Updated servers supply weight/load, orders and richer slot/stamina/target facts. Older servers remain usable with unavailable facts shown as unknown. Quest-map rendering and structured chat color runs remain unimplemented. The Captain's Table plan records qualification and remaining limits.
Edit src/; build the package from those sources. The build uses Python 3's standard library. It also runs a Lua syntax check when a supported luac executable is on your PATH.
# Assemble the installable package at the repository root
python3 build.py
# Syntax-check the Lua scripts only (install luac to make this check effective)
python3 build.py --check
# Write the package to another location
python3 build.py -o /tmp/duris-client.mpackage| Path | Role |
|---|---|
src/scripts/ArjUI.lua |
UI construction, GMCP handlers, text capture, chat, and commands. |
src/scripts/ArjMapper.lua |
Zone layout downloads, caching, wilderness rendering, and map controls. |
src/scripts/ArjAuto.lua |
Automation toggles, variables, utility aliases, ship hotkeys, loot split. Settings persist in arjauto.json. |
src/package.xml |
Mudlet XML skeleton with @@SCRIPT:Name@@ placeholders. |
src/config.lua |
Package metadata. The build injects its version. |
src/assets/ |
Images copied into the package unchanged. |
VERSION |
Version source for packaged metadata and ArjUI.VERSION. |
build.py |
Injects Lua and version values, escapes script text, validates XML, and writes the package archive. |
duris-client.mpackage |
Committed build output; releases attach a copy built from the tag. |
CHANGELOG.md |
Release notes per version; the release workflow reads it. |
scripts/ and tests/mudlet/ |
Real Mudlet offline test controller, scenarios, fixtures, and review tooling. |
docs/DESIGN.md |
Interface layout, visual conventions, interactions, architecture, and state ownership. |
.github/workflows/ |
Pushes to master run build and offline runtime checks, then automatically publish any unreleased VERSION. See docs/RELEASING.md. |
When changing the package, bump VERSION (semantic versioning, see docs/RELEASING.md), rebuild, and include the generated .mpackage with the source change. Let the build insert version strings; do not hand-edit the archive. Use Mudlet/Geyser APIs without external Lua dependencies, and preserve the dark fantasy style and percentage-based layout.
Repository-only documentation changes do not require a package version bump or rebuild.
Validation has separate layers: --check checks Lua syntax only and skips that check with a warning if luac is absent. A full build also validates the assembled XML. For runtime changes, run python3 scripts/mudlet_suite.py with the Linux prerequisites, then inspect and record review of its screenshots and Errors view. The suite runs offline scenarios in real Mudlet 5.0+; a zero exit code establishes automated behavior, not visual approval. Live-server checks use a separate profile, and the declared 4.19.1 minimum needs separate manual verification.
Read AGENTS.md for repository guidance and the documentation index for design, testing, protocol fixtures, and implementation history. The imported Mudlet reference documents are background references from LuminariGUI; their project-specific architecture and MSDP instructions do not describe this package.
See CONTRIBUTING.md for the contribution workflow and SUPPORT.md for help and bug reports. Participation follows our Code of Conduct. Report security concerns through the private channel in SECURITY.md.
Originally created by Arjinius / Arjin. Development is maintained in LuminariMUD/duris-client. Additional display helpers and automation derive from the community lielz scripts archive, and the Mudlet reference documents come from LuminariGUI.
License status: the project has no declared license. Existing credits are preserved and no new license is introduced; see LICENSE.md.
