Skip to content

About

A Custom Mudlet Client for Duris by Arjinius

Resources

Stars

0 stars

Watchers

0 watching

Forks

 
 

Repository files navigation

New Duris — Arjinius Client: a Mudlet interface, illustrated with a bronze-lit fortress and an ancient map

Latest release Requires Mudlet 4.19.1 or newer Written in Lua Built with Geyser

Client-side UI package GMCP required Build with Python 3 Download the Mudlet package

New Duris · Arjinius Client

The world in view. Your adventure at the center.

A custom Mudlet interface for New 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.

Install · Features · Commands · How it works · Build and contribute

Install

You need Mudlet 4.19.1 or newer, a New Duris profile, and GMCP enabled in both the Mudlet profile and the game. Zone maps also need access to www.newduris.com over HTTPS.

  1. 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.
  2. Open your New Duris profile in Mudlet.
  3. Open Package Manager (Alt+O), choose Install New Package, and select the downloaded .mpackage. See the Mudlet Package Manager guide for details.
  4. 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.

Features

At a glance What the client provides
A cohesive interface A dark fantasy frame, percentage-based layout, central game console, and dedicated command input.
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 New 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, lists of mobs, items, and players, 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, repeat timers, stat reroller, and ship hotkeys. Each has its own auto <name> on switch.
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.

Commands

Type these into the Mudlet command input:

Command Purpose
ui on Initialize or rebuild the interface.
ui off Hide the interface and restore Mudlet's main console and command line.
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.
auto ArjAuto help: automation toggles (auto set, `auto on
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: keypad (numpad keys), chatTimestamps, damageTracker, scanFormat, alerts, and expTracker. All default to on and are saved to arjui_settings.json in your Mudlet profile folder.

Use the map's + / − controls to zoom. Click the active STATS, INV, EQ, WHO, or SHIP tab to send stat, inv, eq, who, or look contacts and refresh the corresponding information.

How it works

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: New 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.
    server["New Duris server"]
    wiki["New 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"]
        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
    end

    server --> gmcp
    server --> text
    wiki -->|"HTTPS zone layout JSON"| mapper

    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 script
    class panels,maps surface
    style mudlet fill:transparent,stroke:#8c6e46
    linkStyle default stroke:#8c6e46,stroke-width:1.5px
Loading

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://www.newduris.com/api/wiki/zones/{zoneId}/map-data and are cached in memory. The mapper listens to Room.Info and Room.Map directly.

Troubleshooting and current limits

  • Empty vitals or room panels: run ui debug, check that GMCP is enabled, then reconnect and enter the game. Initial character setup uses Char.Status on login.
  • Blank or stale zone map: run mapper status and mapper debug, check access to the New Duris website, then try mapper reload followed by look.
  • 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 on builds the interface again.

The SHIP tab lists contacts sorted by range and colored by side when the server sends Ship.Info/Ship.Contacts or when you look at contacts; it is a text panel, not a drawn radar. Quest-map rendering and the server's structured chat color runs are not implemented. Alignment coloring for other players in the room is limited by the fields the server supplies. The server study and implementation log records the protocol details, completed work, and remaining candidates.

Build and contribute

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.
.github/workflows/ CI build on every push; tag v* publishes a GitHub Release. 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.

Validation is limited: --check checks Lua syntax only and skips that check with a warning if luac is absent. A full build also validates the assembled XML. Neither verifies runtime behavior; import the package into Mudlet to check layout, GMCP updates, chat, maps, controls, and reconnect behavior. No automated runtime test suite exists in this repository.

Read AGENTS.md for repository guidance and the Duris implementation log for server field names. The Mudlet reference documents were copied from LuminariGUI and are background references; their project-specific architecture and MSDP instructions do not describe this package.

Credits and links

Originally created by Arjinius / Arjin. Maintained here in Community-Duris/duris-client.

New Duris · World map · Mudlet

About

A Custom Mudlet Client for Duris by Arjinius

Resources

Stars

0 stars

Watchers

0 watching

Forks

Releases

Packages

Contributors

Languages