# Forge Framework **Forge** is a high-performance, production-ready framework for Arma 3 persistent game servers, built with Rust and Redis for optimal performance and reliability. ## Overview Forge provides a complete solution for managing persistent player data, organizations, and game state in Arma 3 multiplayer environments. It combines the performance of Rust with the flexibility of Redis to deliver sub-millisecond response times while maintaining data consistency across server restarts. ### Key Features - **๐Ÿš€ High Performance**: Sub-millisecond data access through intelligent caching - **๐Ÿ”’ Data Integrity**: Strict validation and type safety at every layer - **๐Ÿ—๏ธ Clean Architecture**: Layered design following SOLID principles - **๐Ÿ“ฆ Modular Design**: Easy to extend with new entities and features - **๐Ÿ”„ Real-time Sync**: Automatic state synchronization across all clients - **๐Ÿ’พ Persistent Storage**: Redis-backed storage with automatic failover - **๐Ÿงช Testable**: Mock-friendly architecture for comprehensive testing ## Architecture Forge follows a **layered architecture** pattern: ```mermaid graph TD Extension[Extension Layer
ArmA 3 Interface <---> Rust] Services[Services Layer
#40;Business Logic#41;] Repositories[Repositories Layer
#40;Data Persistence#41;] Models[Models Layer
#40;Data Structures & Validation#41;] Extension --> Services Services --> Repositories Repositories --> Models ``` **Communication Flow**: - **Clients** โ†’ Use events (`CBA_Events`) to communicate with server - **Server** โ†’ Calls Rust extension via `callExtension` - **Extension** โ†’ Manages Redis connection pool and data operations For detailed architecture information, see [Diagram](Architecture_Diagram.md). ## Project Structure ``` forge/ โ”œโ”€โ”€ arma/ โ”‚ โ”œโ”€โ”€ client/ # Client-side SQF mod โ”‚ โ”‚ โ”œโ”€โ”€ addons/ โ”‚ โ”‚ โ”‚ โ”œโ”€โ”€ main/ # Core initialization & config โ”‚ โ”‚ โ”‚ โ”œโ”€โ”€ common/ # Shared utilities & helpers โ”‚ โ”‚ โ”‚ โ”œโ”€โ”€ actor/ # Actor/player UI, class & events โ”‚ โ”‚ โ”‚ โ”œโ”€โ”€ org/ # Organization UI, class & events โ”‚ โ”‚ โ”‚ โ””โ”€โ”€ bank/ # Banking UI, class & events โ”‚ โ”‚ โ”œโ”€โ”€ include/ # Header files โ”‚ โ”‚ โ””โ”€โ”€ tools/ # Build tools โ”‚ โ”œโ”€โ”€ server/ โ”‚ โ”‚ โ”œโ”€โ”€ addons/ โ”‚ โ”‚ โ”‚ โ”œโ”€โ”€ main/ # Core initialization & config โ”‚ โ”‚ โ”‚ โ”œโ”€โ”€ common/ # Shared utilities & helpers โ”‚ โ”‚ โ”‚ โ”œโ”€โ”€ actor/ # Actor/player Registry, Store & events โ”‚ โ”‚ โ”‚ โ””โ”€โ”€ org/ # Organization Registry, Store & events โ”‚ โ”‚ โ”œโ”€โ”€ include/ # Header files โ”‚ โ”‚ โ”œโ”€โ”€ tools/ # Build tools โ”‚ โ”‚ โ””โ”€โ”€ extension/ # Rust extension (Arma 3 interface) โ”‚ โ”‚ โ”œโ”€โ”€ src/ โ”‚ โ”‚ โ”‚ โ”œโ”€โ”€ actor.rs # Actor/player commands โ”‚ โ”‚ โ”‚ โ”œโ”€โ”€ org.rs # Organization commands โ”‚ โ”‚ โ”‚ โ”œโ”€โ”€ redis/ # Redis operations module โ”‚ โ”‚ โ”‚ โ””โ”€โ”€ adapters/ # Repository adapters โ”‚ โ”‚ โ””โ”€โ”€ README.md โ”œโ”€โ”€ lib/ โ”‚ โ”œโ”€โ”€ models/ # Data structures & validation โ”‚ โ”œโ”€โ”€ repositories/ # Data persistence layer โ”‚ โ”œโ”€โ”€ services/ # Business logic layer โ”‚ โ”œโ”€โ”€ shared/ # Common utilities & traits โ”‚ โ””โ”€โ”€ README.md โ””โ”€โ”€ FORGE_Architecture_Diagram.md ``` ## Quick Start ### Prerequisites - Rust 1.70+ with `cargo` - Redis 6.0+ - HEMTT 1. Clone the repository from Gitea 2. Install HEMTT The latest version of HEMTT can be installed by running: ```cmd winget install hemtt ``` ### Coding Guidelines This mod follows the same coding guidelines as the ACE3 mod, which can be found [here](https://ace3.acemod.org/wiki/development/coding-guidelines). ### Building the Extension ```bash # Build for release cargo build --release # The compiled extension will be at: # target/release/forge_server.dll (Windows) # target/release/forge_server.so (Linux) ``` ### Configuration Create `@forge_server/config.toml`: ```toml [redis] host = "127.0.0.1" port = 6379 password = "" # Optional max_connections = 10 min_connections = 2 idle_timeout = 300 ``` ### SQF Usage ```sqf // Create an actor private _data = createHashMapFromArray [ ["name", "John Doe"], ["bank", 1000], ["level", 1] ]; private _result = "forge_server" callExtension ["actor:create", [getPlayerUID player, toJSON _data]]; // Get actor data private _result = "forge_server" callExtension ["actor:get", [getPlayerUID player]]; private _actorData = fromJSON (_result select 0); // Update actor private _update = createHashMapFromArray [["bank", 1500]]; "forge_server" callExtension ["actor:update", [getPlayerUID player, toJSON _update]]; ``` ## Core Modules ### Models Defines strict data structures with built-in validation: - `Actor`: Player data (stats, inventory, position) - `Org`: Organization/clan data (members, roles, metadata) [Documentation](lib/models/README.md) ### Repositories Manages data persistence with Redis: - Hash-based storage for structured data - Set-based storage for collections - Generic over Redis client implementations [Documentation](lib/repositories/README.md) ### Services Implements business logic and orchestration: - Get-or-create patterns - Data validation and transformation - Complex workflows [Documentation](lib/services/README.md) ### Extension Arma 3 interface layer: - Command routing and parsing - Session management - Error handling and logging [Documentation](arma/server/extension/README.md) ### Client Mod Client-side SQF addon that provides: - **UI Components**: Player interfaces for inventory, organizations, banking - **Event Handlers**: CBA event listeners for server communication - **Optimistic Caching**: Local data caching for instant UI updates - **State Management**: Client-side state synchronization - **Input Validation**: Client-side validation before server requests The client mod communicates with the server using **CBA Events**, ensuring: - No direct extension calls from clients (security) - Event-driven architecture for scalability - Automatic state synchronization across all clients - Reduced server load through client-side caching ## Available Commands ### Actor Commands | Command | Description | |---------|-------------| | `actor:get` | Retrieve actor data by UID | | `actor:create` | Create a new actor | | `actor:update` | Update actor fields | | `actor:exists` | Check if actor exists | | `actor:delete` | Delete actor data | ### Organization Commands | Command | Description | |---------|-------------| | `org:get` | Retrieve organization data | | `org:create` | Create a new organization | | `org:update` | Update organization fields | | `org:exists` | Check if organization exists | | `org:delete` | Delete organization | | `org:add_member` | Add member to organization | | `org:remove_member` | Remove member from organization | | `org:get_members` | Get all organization members | ### Redis Operations Direct Redis operations for advanced use cases: - **Common**: Key-value operations (set, get, incr, decr, del) - **Hash**: Structured data (hset, hget, hgetall, hdel) - **List**: Ordered collections (lpush, rpush, lrange, lpop, rpop) - **Set**: Unique collections (sadd, smembers, srem, sismember) [Documentation](arma/server/extension/src/redis/README.md) ## Performance - **Hot Cache (Server)**: < 1ms (HashMap lookup) - **Cold Storage (Redis)**: 1-5ms (Network + Redis query) - **Cache Hit Ratio**: ~95% for active players - **Memory Usage**: ~1KB per active player (server), ~2KB per player (Redis) ## Contributing We welcome contributions! Please see the contributing guides for each layer: - [Extension Contributing Guide](arma/server/extension/README.md#contributing) - [Services Contributing Guide](lib/services/README.md#contributing) - [Repositories Contributing Guide](lib/repositories/README.md#contributing) - [Models Contributing Guide](lib/models/README.md#contributing) - [Library Contributing Guide](lib/README.md#contributing) - [Adapter Contributing Guide](arma/server/extension/src/adapters/#contributing) ### Development Workflow 1. **Define Model**: Create data structure with validation 2. **Create Repository**: Implement persistence layer 3. **Build Service**: Add business logic 4. **Expose in Extension**: Create SQF-callable commands 5. **Test**: Verify each layer independently ## Error Handling All commands return consistent error messages: ```sqf private _result = "forge_server" callExtension ["actor:get", ["invalid_uid"]]; private _response = _result select 0; if (_response find "Error:" == 0) then { diag_log format ["Operation failed: %1", _response]; } else { private _data = fromJSON _response; // Use data }; ``` ## Logging Logs are automatically created in `@forge_server/logs/`: - `actor.log` - Actor operations - `org.log` - Organization operations - `redis.log` - Redis connection and operations - `debug.log` - General debug information ## License [Your License Here] ## Support - **Issues**: [Gitea Issues](https://gitea.innovativedevsolutions.org/IDSolutions/forge/issues) - **Documentation**: See individual module READMEs - **Architecture**: [FORGE_Architecture_Diagram.md](FORGE_Architecture_Diagram.md) ## Roadmap - [ ] Admin system - [ ] Arsenal system - [ ] Banking system - [ ] Economy system - [ ] Garage system - [ ] Locker system - [ ] Mission template --- Built using **Rust**, **Redis**, and **Arma 3**