RobloxBridge 1.0.1
dotnet add package RobloxBridge --version 1.0.1
NuGet\Install-Package RobloxBridge -Version 1.0.1
<PackageReference Include="RobloxBridge" Version="1.0.1" />
<PackageVersion Include="RobloxBridge" Version="1.0.1" />
<PackageReference Include="RobloxBridge" />
paket add RobloxBridge --version 1.0.1
#r "nuget: RobloxBridge, 1.0.1"
#:package RobloxBridge@1.0.1
#addin nuget:?package=RobloxBridge&version=1.0.1
#tool nuget:?package=RobloxBridge&version=1.0.1
RobloxBridge
A .NET 8 memory SDK for Roblox externals on Windows x64.
RobloxBridge is a focused library for building Roblox external tools in C#. It handles process attach, offset loading, live pointer resolution, session monitoring across teleports and server hops, and the universal game APIs most externals need — players, characters, world-to-screen, camera control, and Win32 window projection.
Game-specific logic (custom ESP paths, mob lists, etc.) stays in your app. RobloxBridge provides the shared foundation.
Features
- Process attach — finds
RobloxPlayerBeta(and fallbacks), opens memory, downloads version-matched offsets - Live pointers — re-resolves VisualEngine, DataModel, Workspace, Players, and LocalPlayer instead of caching stale addresses
- Session monitor — tracks menu vs in-game, detects server switches (
JobIdchanges), refreshes caches on teleport - Auto-recovery — optionally re-attaches when Roblox restarts without manual intervention
- Universal APIs — players, characters, view matrix, world-to-screen, camera subject, game context (
PlaceId,GameId,JobId) - Win32 projection — maps 3D positions to screen coordinates relative to the Roblox client window
- Thread-safe connection —
BridgeConnection.TryWithClientfor safe access from UI and background threads
Requirements
| Requirement | Details |
|---|---|
| OS | Windows 10/11 x64 |
| Runtime | .NET 8.0+ |
| Target | RobloxPlayerBeta (desktop client) |
| Permissions | Run your app as the same user as Roblox (standard external setup) |
Installation
dotnet add package RobloxBridge
Or in your .csproj:
<PackageReference Include="RobloxBridge" Version="1.0.0" />
Quick start
using RobloxBridge.Session;
using RobloxBridge.Roblox.Characters;
using RobloxBridge.Roblox.Players;
using RobloxBridge.Roblox.Rendering;
await using var connection = new BridgeConnection(new BridgeConnectionOptions
{
AutoRecoverProcess = true,
Logger = myLogger // optional ILogger implementation
});
connection.SessionChanged += (_, e) =>
Console.WriteLine($"Phase: {e.Phase} JobId: {e.JobId ?? "(none)"}");
await connection.AttachAsync();
if (connection.TryWithClient(client =>
{
foreach (var player in PlayerService.GetPlayers(client))
{
if (player.Humanoid is { } hum
&& CharacterReader.TryGetHealth(hum, out var hp, out var maxHp))
Console.WriteLine($"{player.Name} {hp:F0}/{maxHp:F0}");
else
Console.WriteLine(player.Name);
}
if (VisualEngineReader.TryGetViewData(client, out var view))
Console.WriteLine($"Viewport: {view.Dimensions.X}×{view.Dimensions.Y}");
}, out _))
{
// success
}
API reference
RobloxBridge.Core
Low-level attach and client access.
| Type | Description |
|---|---|
ProcessAttach |
AttachAsync() — finds Roblox, loads offsets, returns BridgeAttachResult |
BridgeClient |
Main handle: Memory, DataModel, Workspace, Players, LocalPlayer |
BridgeClientOptions |
ProcessName, ProcessNames[], ValidateOffsets, Logger |
BridgeContext |
Shared memory, offset manager, string caches |
BridgeAttachResult |
Success, Client, FailureReason, Message |
Direct attach (no session monitor):
using var client = BridgeClient.Attach();
var workspace = client.Workspace;
With session monitor (recommended):
await using var connection = new BridgeConnection();
await connection.AttachAsync();
connection.TryWithClient(c => { /* use c */ }, out _);
RobloxBridge.Session
High-level connection with monitoring and recovery.
| Type | Description |
|---|---|
BridgeConnection |
Attach, detach, events, TryWithClient, IsMemoryReady |
BridgeConnectionOptions |
AutoRecoverProcess, MonitorInterval (default 250ms), RecoveryRetryDelay |
BridgeSessionPhase |
Detached, Attached, InMenu, InGame, Switching |
BridgeDetachReason |
User, Shutdown, ProcessLost |
Session phases
| Phase | Meaning |
|---|---|
Detached |
Not connected to a Roblox process |
Attached |
Process open, offsets loaded, not yet classified |
InMenu |
Main menu (LuaApp DataModel) |
InGame |
Active server session with a valid JobId |
Switching |
Teleport or server hop in progress — pause overlays / reads |
Subscribe to SessionChanged to react to teleports. Use IsMemoryReady before per-frame reads (true only when InGame and not mid-refresh).
Events
| Event | When |
|---|---|
Attached |
Successfully connected to Roblox |
Detaching / Detached |
Connection closing (user, shutdown, or process lost) |
SessionChanged |
Phase or JobId changed |
connection.SessionChanged += (_, e) =>
{
switch (e.Phase)
{
case BridgeSessionPhase.Switching:
overlay.Hide();
break;
case BridgeSessionPhase.InGame:
overlay.Show();
break;
}
};
RobloxBridge.Roblox.Pointers
Live resolution — prefer these over cached addresses after teleports.
| Method | Returns |
|---|---|
ResolveDataModel / ResolveDataModelAddress |
Current DataModel |
ResolveVisualEngineAddress |
VisualEngine pointer |
ResolveWorkspace |
Workspace service |
ResolvePlayers |
Players service |
ResolveLocalPlayer |
Local Player instance |
ResolveCurrentCamera |
Workspace camera |
RobloxBridge.Roblox.Game
Universal session context from the DataModel.
| Method | Description |
|---|---|
TryRead |
Full GameContext (JobId, PlaceId, GameId, menu flag) |
IsInGameSession |
Quick check + JobId out param |
IsMainMenu |
LuaApp DataModel detection |
TryGetPlaceId |
Current PlaceId |
if (GameContextReader.TryRead(client, out var ctx))
{
Console.WriteLine($"Place: {ctx.PlaceId} Game: {ctx.GameId} Menu: {ctx.IsMenu}");
}
RobloxBridge.Roblox.Players
| Method | Description |
|---|---|
GetPlayers |
All players as PlayerSnapshot list (local player first) |
TryGetLocalPlayer |
Local player snapshot |
TryGetByName |
Lookup by username |
PlayerSnapshot includes Name, UserId, DisplayName, IsLocal, HasCharacter, and live BridgeInstance refs for Player, Character, Humanoid.
RobloxBridge.Roblox.Characters
| Method | Description |
|---|---|
TryResolve |
Head, HumanoidRootPart, tag part, ESP position |
TryReadTagPosition |
World position above character for name tags |
TryGetHealth |
Current / max health from Humanoid |
RobloxBridge.Roblox.Rendering
| Type | Description |
|---|---|
VisualEngineReader.TryGetViewData |
View matrix + viewport dimensions |
WorldToScreen.Project |
3D world point → 2D screen (with depth) |
ViewData |
Matrix4x4 + Vector2 dimensions |
if (VisualEngineReader.TryGetViewData(client, out var view)
&& WorldToScreen.Project(worldPos, view, out var screen, out var depth)
&& depth > 0)
{
DrawAt(screen.X, screen.Y);
}
RobloxBridge.Roblox.Camera
| Method | Description |
|---|---|
GetCurrent |
Workspace Camera instance |
TrySetSubject |
Point camera at a Humanoid |
TrySetSubjectToLocalPlayer |
Spectate-style local player camera |
RobloxBridge.Platform.Windows
| Method | Description |
|---|---|
FindRobloxWindow |
HWND for the Roblox client |
TryGetClientBounds |
Client area size and screen origin |
ProjectToScreen |
World position → absolute screen pixels |
Use with VisualEngineReader for overlay windows aligned to the Roblox client.
RobloxBridge.Roblox — BridgeInstance
Represents any Roblox instance in memory.
var part = workspace.FindFirstChild("SomePart");
if (part.TryGetProperty("Position", out Vector3 pos))
Console.WriteLine(pos);
foreach (var child in workspace.GetChildren())
Console.WriteLine($"{child.Name} ({child.ClassName})");
Common members: Name, ClassName, Parent, GetChildren(), FindFirstChild(), IsA(), typed properties (Position, Health, Character, etc.).
RobloxBridge.Utilities
| Type | Description |
|---|---|
ILogger |
LogDebug, LogInformation, LogWarning, LogError |
LogFormatter |
Safe formatting for named placeholders like {ProcessId} |
NullLogger |
No-op default |
Implement ILogger in your app to pipe library logs into your UI or file.
Example: ESP overlay loop
while (running)
{
if (!connection.IsMemoryReady)
{
await Task.Delay(50);
continue;
}
connection.TryWithClient(client =>
{
if (!VisualEngineReader.TryGetViewData(client, out var view))
return;
foreach (var player in PlayerService.GetPlayers(client))
{
if (player.IsLocal || player.Character is null)
continue;
if (!CharacterReader.TryResolve(player.Character, out var snap)
|| snap.TagPosition is not { } pos)
continue;
if (WindowProjection.ProjectToScreen(client, pos, out var screen))
overlay.DrawLabel(screen, player.Name);
}
});
await Task.Delay(16);
}
Building locally
dotnet build -c Release
dotnet pack -c Release -o ./packages
Project structure
RobloxBridge/
├── Core/ BridgeClient, BridgeContext, ProcessAttach
├── Session/ BridgeConnection, session monitor
├── Memory/ Process memory read/write
├── Offsets/ Offset download, validation, caching
├── Roblox/
│ ├── Pointers/ Live pointer resolution
│ ├── Game/ GameContext, menu detection
│ ├── Players/ Player roster
│ ├── Characters/ Character / ESP helpers
│ ├── Rendering/ View matrix, world-to-screen
│ └── Camera/ Camera control
├── Platform/Windows/ Win32 window projection
├── Models/ Vector2/3, Matrix4x4, CFrame
└── Utilities/ Logging, guards, formatting
License
| Product | Versions Compatible and additional computed target framework versions. |
|---|---|
| .NET | net8.0 is compatible. net8.0-android was computed. net8.0-browser was computed. net8.0-ios was computed. net8.0-maccatalyst was computed. net8.0-macos was computed. net8.0-tvos was computed. net8.0-windows was computed. net9.0 was computed. net9.0-android was computed. net9.0-browser was computed. net9.0-ios was computed. net9.0-maccatalyst was computed. net9.0-macos was computed. net9.0-tvos was computed. net9.0-windows was computed. net10.0 was computed. net10.0-android was computed. net10.0-browser was computed. net10.0-ios was computed. net10.0-maccatalyst was computed. net10.0-macos was computed. net10.0-tvos was computed. net10.0-windows was computed. |
-
net8.0
- No dependencies.
NuGet packages
This package is not used by any NuGet packages.
GitHub repositories
This package is not used by any popular GitHub repositories.
1.0.1: NuGet readme fix (plain markdown, no HTML header).