Highly Performant & Scalable Ultima Online Server Emulator
https://www.modernuo.com
c-sharpcsharpcsharp-coredotnetdotnet-coreemulatorgplgplv3mmommo-enginemmorpgmmorpg-serveronlinerpgrunuoserverservuoultimaultima-onlineuo
## Summary Fixes three bugs in `GuardedRegion.CallGuards`: - **Operator precedence bug**: The condition `!m.Region.IsPartOf(this) && !m_GuardCandidates.ContainsKey(m)` was inverted from intent. Replaced with explicit split: dictionary members are targeted regardless of region; permanent candidates (reds/AlwaysMurderer) must be inside the region. - **Premature `break`**: Only the first guard candidate was ever processed per "guards" call. Removed the `break` so all valid candidates in range get a guard spawned. - **Misleading message for permanent reds**: "Guards can no longer be called on you." (502276) was sent to permanent reds, but guards can *always* be called on them. Now only sent to temporary criminals whose guard window is actually consumed. Also extracts `IsAlwaysGuardCandidate()` helper and simplifies `IsGuardCandidate()`. ## Edge cases verified (by analysis) - **Multiple players call guards on same red**: `BaseGuard.Spawn` dedup (scans 15 tiles for existing guard with same `Focus`) prevents duplicate guards. Message suppression eliminates spam. - **Red fights spawned guard → criminal → guards called again**: Same dedup prevents infinite guard spawns. Existing guard already has `Focus == red`. ## Test plan - [ ] Temporary criminal in guarded region → guard spawns, receives "Guards can no longer be called on you." - [ ] Permanent red (5+ kills) in guarded region → guard spawns, does NOT receive the message - [ ] Multiple players call "guards" on same red → only 1 guard spawns - [ ] Criminal outside region but in dictionary → still targeted by guards call from inside region - [ ] Red outside guarded region → NOT targeted by guards call (must be inside region) |
||
|---|---|---|
| .config | ||
| .github | ||
| dev-docs | ||
| Distribution/Data | ||
| docs | ||
| Projects | ||
| .cursorrules | ||
| .editorconfig | ||
| .gitattributes | ||
| .gitignore | ||
| AGENTS.md | ||
| azure-pipelines.yml | ||
| CLAUDE.md | ||
| CODE_OF_CONDUCT.md | ||
| CONTRIBUTING.md | ||
| Directory.Build.props | ||
| FAQ.md | ||
| GEMINI.md | ||
| global.json | ||
| LICENSE | ||
| mkdocs.yml | ||
| ModernUO.sln | ||
| publish.cmd | ||
| publish.sh | ||
| README.md | ||
| rider-settings.zip | ||
| Rules.ruleset | ||
| SPONSORS.md | ||
| stylecop.json | ||
| THIRD-PARTY-NOTICES | ||
| version.json | ||
ModernUO

Ultima Online Server Emulator for the modern era!
Requirements
Supported Operating Systems
Required Frameworks
All Operating Systems
Windows
Development
Supported IDEs
Getting Started
- Install prerequisite requirements
- Clone this repository (or download the latest):
git clone https://github.com/modernuo/ModernUO.git
- Open
ModernUO.slnto start developing
Building/Publishing
- Run
./publish.cmd [release|debug (default: release)] [os] [arch (default: x64)]os- Supported operating systemsarchx64- Intel/AMD 64-bitarm64- ARM 64-bit (Windows not supported)
Linux Prerequisites
Fedora, CentOS, RHEL, etc
dnf upgrade --refresh -y
# CentOS does not come with EPEL enabled
dnf install -y epel-release epel-next-release
dnf install -y findutils libicu libdeflate-devel zstd libargon2-devel liburing-devel
Ubuntu, Debian, etc
apt-get update -y
apt-get install -y libicu-dev libdeflate-dev zstd libargon2-dev liburing-dev
OSX Requirements
brew install icu4c libdeflate zstd argon2
Running the Server
- Follow the publish instructions
- Run
ModernUO.exeordotnet ModernUO.dllfrom theDistributiondirectory
Troubleshooting / FAQ
- See FAQ
Want to sponsor?
Thank you for supporting us! You can find out how by visiting the sponsors page.
Collaborators
Thanks
- RunUO Team & Community
- Voxpire, the ServUO Team & Community
- Karasho, Jaedan and the ClassicUO Community