Skip to main content

Write your first C# resource

Server-side C# uses RAGE:MP's GTANetworkAPI (NAPI.*, Script, [Command], [ServerEvent], [RemoteEvent]). Your resource is a .NET class library that references the server's Bootstrapper.dll.

You need the .NET 8 SDK to build. The server itself brings its own .NET 8 runtime.

1. Create the resource folder​

server/dotnet/resources/MyFirstResource/
├─ meta.xml
├─ MyFirstResource.csproj
└─ Main.cs

meta.xml​

<meta>
<info name="MyFirstResource" type="script"/>
<script src="bin/Release/net8.0/MyFirstResource.dll"/>
</meta>

MyFirstResource.csproj​

<Project Sdk="Microsoft.NET.Sdk">
<PropertyGroup>
<TargetFramework>net8.0</TargetFramework>
<ImplicitUsings>enable</ImplicitUsings>
</PropertyGroup>
<ItemGroup>
<Reference Include="Bootstrapper">
<HintPath>..\..\runtime\Bootstrapper.dll</HintPath>
<Private>false</Private>
</Reference>
</ItemGroup>
</Project>

Private=false keeps Bootstrapper.dll out of your build folder; the server provides it. A gamemode built for RAGE:MP against netcoreapp3.1 also loads as-is.

2. Write the script​

using GTANetworkAPI;

namespace MyFirstResource
{
public class Main : Script
{
[ServerEvent(Event.ResourceStart)]
public void OnResourceStart()
{
NAPI.Util.ConsoleOutput("[MyFirstResource] started");
}

[ServerEvent(Event.PlayerConnected)]
public void OnPlayerConnected(Player player)
{
NAPI.Chat.SendChatMessageToAll($"~g~{player.Name} joined the server.");
}

[Command("heal")]
public void CmdHeal(Player player)
{
player.Health = 100;
player.Armor = 100;
player.SendChatMessage("~g~Healed.");
}

[RemoteEvent("myEvent")]
public void OnMyEvent(Player player, string text, int number)
{
NAPI.Util.ConsoleOutput($"{player.Name} sent {text} {number}");
}
}
}

[RemoteEvent] parameters are converted to their declared types (bool, int, uint, float, string, …), as on RAGE:MP. The client calls it with mp.events.callRemote('myEvent', 'hi', 5).

3. Build and run​

cd server\dotnet\resources\MyFirstResource
dotnet build -c Release

Make sure conf.json has "csharp": "enabled", then start the server. Every folder in dotnet/resources/ with a meta.xml is loaded automatically.

Full reference: the Server C# tab.