Skip to content
This repository was archived by the owner on Jun 17, 2025. It is now read-only.
Merged
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
185 changes: 130 additions & 55 deletions README.md
Original file line number Diff line number Diff line change
@@ -1,101 +1,176 @@
# Prima - A Modern Ultima Online Server Implementation
# PrimaUO Server

![Docker Image Version (tag)](https://img.shields.io/docker/v/tgiachi/prima-server/latest)
[![GitHub Actions](https://github.com/tgiachi/prima/actions/workflows/docker_image.yml/badge.svg)](https://github.com/tgiachi/prima/actions/workflows/docker_image.yml)
[![License](https://img.shields.io/badge/license-MIT-red.svg)](LICENSE)

![Prima Logo](Assets/prima_logo.png)
![](./Assets/prima_logo.png)

![Build Status](https://img.shields.io/github/workflow/status/tgiachi/prima/CI)
PrimaUO is a modern Ultima Online server implementation written in C# (.NET 9.0). The project aims to provide a modern, extensible, and maintainable server alternative with support for the latest client versions.

## Features

## Overview

Prima is a modern, high-performance implementation of an Ultima Online server built with C# and .NET 9. This project aims to revive the classic Ultima Online experience while leveraging contemporary software development practices, extensible architecture, and improved performance.

## Vision
- ⚡ Modern C# (.NET 9.0) implementation
- 🔄 Event-driven architecture
- 🚀 High performance through optimized code and event loop system
- 🔌 Modular design with dependency injection
- 📦 Support for multiple client versions
- 🔒 Secure authentication using JWT
- 📈 Built-in metrics and diagnostics
- 🔧 Extensible through JavaScript scripting system
- 🌐 REST API for integration with external tools

## Scripting System

PrimaUO includes a powerful JavaScript scripting engine that allows you to extend and customize server functionality without modifying the core code. Scripts are loaded from the `scripts` directory and can interact with server systems through registered modules.

### Example Script

```javascript
// server_startup.js
// This script is executed when the server starts

// Import script modules
const events = require("events");
const commands = require("commands");
const timers = require("timers");
const scheduler = require("scheduler");

// Listen for server started event
events.OnStarted(() => {
console.log("Server has started successfully!");

// Register admin commands
commands.RegisterConsoleCommand(
"announce",
"Broadcasts a message to all players",
(args) => {
// Implementation of the announce command
const message = args.join(" ");
console.log(`Broadcasting message: ${message}`);
// Actual broadcast implementation would go here
return true;
},
["broadcast", "shout"],
"Console",
"Admin"
);

// Create a recurring task to run every 5 minutes
scheduler.ScheduleTask(
"cleanup",
300, // seconds
() => {
console.log("Running scheduled cleanup task...");
// Cleanup logic would go here
}
);

// Register an event handler for character creation
events.OnCharacterCreated((args) => {
console.log(`New character created: ${args.Name}`);

// Start a delayed welcome timer
timers.OneShot("welcome_message", 10, () => {
console.log(`Sending welcome message to ${args.Name}`);
// Actual welcome message code would go here
});
});
});
```

Ultima Online was a groundbreaking MMORPG that pioneered many concepts we take for granted in online gaming today. Prima builds upon this legacy by:
### Available Script Modules

- Reimagining the server architecture with modern design patterns
- Utilizing the latest .NET features for improved performance
- Creating a clean, extensible codebase that's easy to understand and modify
- Supporting both classic and modern UO clients
- Providing robust APIs for custom content creation
- **events**: Subscribe to server events
- **commands**: Register custom commands
- **timers**: Create one-time or repeating timers
- **scheduler**: Schedule tasks to run periodically
- **template**: Add variables for template rendering
- **files**: Include other script files

## Project Structure

- **Prima.Network**: Core networking components, packet definitions, serializers, and protocol implementations
- **Prima.Server**: Main server application handling game state, world simulation, and client connections
- **Prima.Tests**: Comprehensive test suite ensuring reliability and correctness

## Features

- **Modern C# Implementation**: Built with the latest C# features and .NET 9
- **High Performance**: Optimized for efficiency with modern hardware
- **Extensible Architecture**: Modular design allowing for easy customization
- **Protocol Compatibility**: Full support for the UO network protocol
- **Containerization Ready**: Docker support for easy deployment
- **Comprehensive Testing**: Thorough test coverage for reliability

## Development Status

Prima is currently in early development. The networking layer and packet structures are being implemented, with core game functionality to follow.
- **Prima.Core.Server**: Core server infrastructure
- **Prima.Network**: Network layer and packet handling
- **Prima.Server**: Main server application
- **Prima.UOData**: Ultima Online data structures and utilities
- **Prima.Tcp.Test**: TCP testing utilities

## Getting Started

### Prerequisites

- .NET 9 SDK
- Docker (optional, for containerized deployment)

### Building the Project

```bash
dotnet build
- .NET 9.0 SDK
- Ultima Online client files for data loading

### Configuration

Configuration is handled through YAML files located in the `configs` directory:

```yaml
Prima:
Server:
Shard:
Name: "Prima Shard"
UoDirectory: "/path/to/uo/files"
MaxPlayers: 1000
TcpServer:
Host: ""
LoginPort: 2593
GamePort: 2592
EnableWebServer: true
WebServerPort: 23000
LogPackets: true
```

### Running Tests
### Building from Source

```bash
dotnet test
git clone https://github.com/tgiachi/prima.git
cd prima
dotnet build
```

### Running the Server

```bash
dotnet run --project src/Prima.Server/Prima.Server.csproj
cd src/Prima.Server
dotnet run
```

### Docker Support

Build the Docker image:
A Dockerfile is provided to build and run the server in a container:

```bash
docker build -t prima-server -f src/Prima.Server/Dockerfile .
docker build -t primauo/server .
docker run -p 2593:2593 -p 2592:2592 -p 23000:23000 -v /path/to/uo/files:/app/data/client primauo/server
```

Run the container:
## API Documentation

```bash
docker run -p 2593:2593 prima-server
The server includes a Swagger UI for API documentation available at:

```
http://localhost:23000/swagger
```

## Contributing

Contributions are welcome! If you'd like to contribute, please:
Contributions are welcome! Please feel free to submit a Pull Request.

1. Fork the repository
2. Create a feature branch
3. Submit a pull request
2. Create your feature branch (`git checkout -b feature/amazing-feature`)
3. Commit your changes (`git commit -m 'Add some amazing feature'`)
4. Push to the branch (`git push origin feature/amazing-feature`)
5. Open a Pull Request

## License

This project is licensed under the MIT License - see the LICENSE file for details.

## Acknowledgments

- The Ultima Online team for creating a groundbreaking MMORPG
- The open-source community for their invaluable tools and libraries
- All contributors to the project

---

*Prima is not affiliated with Electronic Arts or the official Ultima Online game. This is a fan project created to explore modern game server implementations while honoring the legacy of Ultima Online.*
- The Ultima Online community
- [ModernUO](https://github.com/modernuo/modernuo) for inspiration and some utility code
- [Orion](https://github.com/tgiachi/orion) for the server foundation framework