A high-performance C# server-side development framework for FiveM.
Explore the docs »
Report Bug
·
Request Feature
Table of Contents
Aero Framework is a high-performance C# development framework for FiveM server resources, built by Vertex Tools. Designed to overcome standard C# FiveM limitations, it features a dedicated, low-overhead event dispatcher system, dynamic plugin loading, and robust abstraction drivers.
Key Features:
- Circular-Buffer Event Dispatcher: Optimized for processing native and custom events with high stability and extremely low memory footprint.
- Dynamic Plugin Loader: Scan, load, and manage assemblies dynamically from your
plugins/directory. Compatible framework verification prevents outdated plugins from loading. - Driver Abstraction System: Ready-to-use abstract interfaces for Databases, Players, Vehicles, and Objects.
- Zero-Touch Registration: Automatically scans and registers commands (
ICommand) and events (IEvent) within your custom plugin assemblies upon loading.
To get a local copy up and running, follow these steps.
- .NET SDK 4.7.2
- Rider, Visual Studio, or VS Code
- A FiveM Server environment
- From the release install the installer from github.
- Restart the server and enjoy the framework!
- Install all DLL's from the release on github.
- Put all the DLL's in the resource folder in the FiveM server.
- Build the manifest.lua to link everything.
- Restart the server and enjoy the framework!
Aero Framework makes it extremely simple to extend your server functionality with modular plugins. To create a plugin, reference Aero.API in your project.
Create a class that inherits from Plugin<TConfig>, where TConfig represents your configuration class.
using Aero.API;
using Aero.API.Interfaces;
public class MyPluginConfig : IConfig
{
public bool Enabled { get; set; } = true;
public string GreetingMessage { get; set; } = "Hello from Aero Plugin!";
}
public class MyPlugin : Plugin<MyPluginConfig>
{
public override string Name => "MyPlugin";
public override string Author => "Vertex Tools";
public override string Description => "An example plugin demonstrating Aero.Framework features.";
public override System.Version Version => new System.Version(1, 0, 0);
public override System.Version RequiredFramework => new System.Version(1, 0, 0);
// This property is automatically populated by Aero Framework
public static MyPluginConfig Config { get; set; }
public override void OnLoad()
{
Log.Info($"{Name} Loaded! Greeting: {Config.GreetingMessage}");
}
public override void OnUnload()
{
Log.Warn($"{Name} Unloaded.");
}
}Plugin configurations are automatically written and read from the plugin's folder using standard YAML. When your plugin is initialized, a config file named <PluginName>.yml will be generated/loaded automatically.
Any class inside your plugin assembly implementing the ICommand interface will be automatically detected and registered to FiveM's command list when the plugin loads.
using Aero.API.Interfaces;
using Aero.API.Features;
public class HelloCommand : ICommand
{
public string Name => "hello";
public string Description => "Greets the server.";
public string Permission => "user";
public void Execute(int source, string[] args)
{
Log.Success($"Hello command executed by source player {source}!");
}
}The framework automatically scans and registers event handlers using the [AeroEvent] attribute. You don't need to manually implement interfaces or register listeners.
using Aero.Events;
using Aero.API.Events.Network;
using Aero.API.Features;
public class PlayerEventHandler
{
// 🏷️ The framework will automatically detect this attribute on startup
[AeroEvent(typeof(PlayerEnteringEvent))]
public void OnPlayerEntering(PlayerEnteringEvent e)
{
// 🎨 Your color-coded logs work natively here!
Log.Success($"Player {e.PlayerName} (ID: {e.PlayerId}) is entering the server! ^2✓");
}
}Aero Framework features a centralized driver manager. You can retrieve driver instances to safely interact with core services like Databases, Players, Vehicles, and Objects.
using Aero.Drivers.Registry;
using Aero.API.Interfaces;
// Accessing the Database Driver
var db = DriverRegistry.Singleton.Get<IDataBaseDriver>();
await db.ExecuteAsync("INSERT INTO audit_logs (message) VALUES (@msg)", new { msg = "Server start" });
// Accessing the Player Driver
var playerDriver = DriverRegistry.Singleton.Get<IPlayerDriver>();Full documentation in https://aeroframework.net/docs
- Circular Buffer Event Dispatcher
- YAML Injected Plugin Configurations
- Command Permission Middleware
- Hot Reloading for Plugins
- Direct Database ORM integration
See the open issues for a full list of proposed features (and known issues).
Contributions are what make the open source community such an amazing place to learn, inspire, and create. Any contributions you make are greatly appreciated.
If you have a suggestion that would make this better, please fork the repo and create a pull request. You can also simply open an issue with the tag "enhancement". Don't forget to give the project a star! Thanks again!
- Fork the Project
- Create your Feature Branch (
git checkout -b feature/AmazingFeature) - Commit your Changes (
git commit -m 'Add some AmazingFeature') - Push to the Branch (
git push origin feature/AmazingFeature) - Open a Pull Request
Distributed under the MIT License. See LICENSE for more information.
Vertex Tools - @Vertex-Tools
Project Link: https://github.com/Vertex-Tools/Aero.Framework
- Cfx - CitizenFX.Core.Server: Thanks for its native API and communication FiveM - C#
- Jnewkirk, Bradwilson - xunitv3: Thanks for their system to test all our systems in Aero.Tests
- Antoine Aubry - YamlDotNet: Thanks for building our ConfigBuilder which is essential for our core
- Microsoft - System: C# Native System
- Vertex Tools - Avian: Essential for our Event system
- Vertex Tools - pyro.Avian: Useful for packaging all the dependencies in one dll