LibreMetaverse 3.2.0
Prefix Reserveddotnet add package LibreMetaverse --version 3.2.0
NuGet\Install-Package LibreMetaverse -Version 3.2.0
<PackageReference Include="LibreMetaverse" Version="3.2.0" />
<PackageVersion Include="LibreMetaverse" Version="3.2.0" />
<PackageReference Include="LibreMetaverse" />
paket add LibreMetaverse --version 3.2.0
#r "nuget: LibreMetaverse, 3.2.0"
#:package LibreMetaverse@3.2.0
#addin nuget:?package=LibreMetaverse&version=3.2.0
#tool nuget:?package=LibreMetaverse&version=3.2.0
▗▖ ▄ ▗▖ ▄▄▄ ▗▞▀▚▖▗▖ ▗▖▗▞▀▚▖ ■ ▗▞▀▜▌▄ ▄ ▗▞▀▚▖ ▄▄▄ ▄▄▄ ▗▞▀▚▖
▐▌ ▄ ▐▌ █ ▐▛▀▀▘▐▛▚▞▜▌▐▛▀▀▘▗▄▟▙▄▖▝▚▄▟▌█ █ ▐▛▀▀▘█ ▀▄▄ ▐▛▀▀▘
▐▌ █ ▐▛▀▚▖█ ▝▚▄▄▖▐▌ ▐▌▝▚▄▄▖ ▐▌ ▀▄▀ ▝▚▄▄▖█ ▄▄▄▀ ▝▚▄▄▖
▐▙▄▄▖█ ▐▙▄▞▘ ▐▌ ▐▌ ▐▌
▐▌
LibreMetaverse
A .NET client library for Second Life and OpenSimulator (and compatible worlds). Log in as an avatar, look around, move, chat, build, trade, and manage inventory, groups and land, with an asynchronous API, events for everything the simulator tells you, and Microsoft.Extensions logging and dependency injection throughout. It is a fork of libOpenMetaverse, which came from libSecondLife, kept current with the grids it talks to.
Archiving · Utilities · Voice.Vivox · Voice.WebRTC
│ built on the client
[LibreMetaverse] the client: login, managers, inventory
│
Transport UDP socket, reliable circuit, throttle
│
Protocol packets and capability messages
│
Assets the offline data model
├── ModelFormats · Rendering.MeshFoundry · Rendering.Simple
│
StructuredData · Imaging.Abstractions
│
Types UUID, vectors, quaternions, colors
on their own: PrimMesher · Imaging.Skia · RLV · LslTools
A name in brackets is this package. Packages use the ones beneath them; the Depends on section below is exact.
Getting started
using LibreMetaverse;
var client = new GridClient();
client.Self.IM += (sender, e) => Console.WriteLine($"{e.IM.FromAgentName}: {e.IM.Message}");
var login = client.Network.DefaultLoginParams("First", "Last", "password", "MyApp", "1.0.0");
using var timeout = new CancellationTokenSource(TimeSpan.FromSeconds(30));
if (!await client.Network.LoginAsync(login, timeout.Token))
{
Console.WriteLine($"Login failed: {client.Network.LoginMessage}");
return;
}
Console.WriteLine($"In {client.Network.CurrentSim?.Name} at {client.Self.SimPosition}");
client.Network.Logout();
With dependency injection, services.AddGridClient(settings => settings.Logging.LogResends = false) registers the client as a singleton, and as IGridClient for testing.
What the client gives you
GridClient is the front door. Everything hangs off it:
| Property | Does |
|---|---|
Network |
login, logout, the circuit to each simulator |
Self |
your own avatar: position, movement, teleports, chat, instant messages, animations, money, mutes |
Avatars |
other avatars: names, profiles, picks, classifieds, interests |
Objects |
prims in view: updates, selection, editing, rezzing, materials, media |
Inventory |
folders and items, uploads of textures, meshes and materials |
Assets |
downloading and uploading assets, with a cache |
Appearance |
what the avatar wears, baking, outfits |
Parcels, Grid, Terrain |
land, the world map and regions, the heightfield |
Groups, Friends, Directory |
groups and their rosters, the friends list, search |
Sound, Environment, Animesh, Marketplace, InterestList |
sound triggers, sky and water settings, animated meshes, merchant tools, which object updates the simulator sends |
Calls that go out and come back are async and take a CancellationToken. What the simulator pushes arrives as events on the manager it concerns. client.Settings holds the timing, connection, packet, texture-pipeline, asset-cache, security and logging options.
The packages around it
The client is the top of a stack of smaller packages, and it brings the lower ones with it: LibreMetaverse.Types, StructuredData, Imaging.Abstractions, Assets, Protocol and Transport. Their types are still in the LibreMetaverse namespace and are forwarded from this assembly, so code written against 3.1 keeps working. You can also reference a lower package on its own when you do not need a login.
Separate packages, not pulled in automatically:
| Package | For |
|---|---|
LibreMetaverse.ModelFormats |
loading Collada, glTF and OBJ models for upload; exporting meshes |
LibreMetaverse.Archiving |
reading and writing OpenSim region archives (OAR) |
LibreMetaverse.Utilities |
persistent login, staying in a region, typed-out chat |
LibreMetaverse.Voice.WebRTC, LibreMetaverse.Voice.Vivox |
voice chat |
LibreMetaverse.RLV |
RestrainedLove command handling |
LibreMetaverse.Rendering.MeshFoundry, .Simple, LibreMetaverse.PrimMesher |
turning prims, sculpts and meshes into geometry |
LibreMetaverse.Imaging.Skia |
an image codec for PNG, JPEG and BMP |
Examples
The repository has small, complete programs: SimpleBot (answers instant messages), PrimInspector (looks at the objects around it) and InventoryExplorer (browses and exports inventory).
Depends on
.NET Standard 2.1, .NET Framework 4.8.1, and .NET 8, 9 and 10. Besides the LibreMetaverse packages it uses Microsoft.Extensions.Logging and DependencyInjection.Abstractions, MessagePack, CoreJ2K and a handful of System.* backports.
Install
dotnet add package LibreMetaverse
Upgrading from 3.1? Types that moved to the lower packages are forwarded, so most code only needs a rebuild; the migration guide lists the few members that changed.
More
- Source, issues and discussion: https://github.com/cinderblocks/libremetaverse
- Moving from 3.1: the migration guide
- License: BSD-3-Clause
| Product | Versions Compatible and additional computed target framework versions. |
|---|---|
| .NET | net5.0 was computed. net5.0-windows was computed. net6.0 was computed. net6.0-android was computed. net6.0-ios was computed. net6.0-maccatalyst was computed. net6.0-macos was computed. net6.0-tvos was computed. net6.0-windows was computed. net7.0 was computed. net7.0-android was computed. net7.0-ios was computed. net7.0-maccatalyst was computed. net7.0-macos was computed. net7.0-tvos was computed. net7.0-windows was computed. 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 is compatible. 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 is compatible. 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. |
| .NET Core | netcoreapp3.0 was computed. netcoreapp3.1 was computed. |
| .NET Standard | netstandard2.1 is compatible. |
| .NET Framework | net481 is compatible. |
| MonoAndroid | monoandroid was computed. |
| MonoMac | monomac was computed. |
| MonoTouch | monotouch was computed. |
| Tizen | tizen60 was computed. |
| Xamarin.iOS | xamarinios was computed. |
| Xamarin.Mac | xamarinmac was computed. |
| Xamarin.TVOS | xamarintvos was computed. |
| Xamarin.WatchOS | xamarinwatchos was computed. |
-
.NETFramework 4.8.1
- CoreJ2K (>= 2.4.1)
- LibreMetaverse.Assets (>= 3.2.0)
- LibreMetaverse.Imaging.Abstractions (>= 3.2.0)
- LibreMetaverse.Protocol (>= 3.2.0)
- LibreMetaverse.StructuredData (>= 3.2.0)
- LibreMetaverse.Transport (>= 3.2.0)
- LibreMetaverse.Types (>= 3.2.0)
- MessagePack (>= 3.1.8)
- Microsoft.Bcl.AsyncInterfaces (>= 10.0.12)
- Microsoft.Bcl.TimeProvider (>= 10.0.12)
- Microsoft.Extensions.DependencyInjection.Abstractions (>= 10.0.12)
- Microsoft.Extensions.Logging (>= 10.0.12)
- Microsoft.Extensions.Logging.Console (>= 10.0.12)
- Microsoft.Extensions.ObjectPool (>= 10.0.12)
- System.Collections.Immutable (>= 10.0.12)
- System.Net.Http.WinHttpHandler (>= 10.0.12)
- System.Threading.Channels (>= 10.0.12)
- System.Threading.RateLimiting (>= 10.0.12)
-
.NETStandard 2.1
- CoreJ2K (>= 2.4.1)
- LibreMetaverse.Assets (>= 3.2.0)
- LibreMetaverse.Imaging.Abstractions (>= 3.2.0)
- LibreMetaverse.Protocol (>= 3.2.0)
- LibreMetaverse.StructuredData (>= 3.2.0)
- LibreMetaverse.Transport (>= 3.2.0)
- LibreMetaverse.Types (>= 3.2.0)
- MessagePack (>= 3.1.8)
- Microsoft.Bcl.TimeProvider (>= 10.0.12)
- Microsoft.Extensions.DependencyInjection.Abstractions (>= 10.0.12)
- Microsoft.Extensions.Logging (>= 10.0.12)
- Microsoft.Extensions.Logging.Console (>= 10.0.12)
- Microsoft.Extensions.ObjectPool (>= 10.0.12)
- System.Collections.Immutable (>= 10.0.12)
- System.Threading.Channels (>= 10.0.12)
- System.Threading.RateLimiting (>= 10.0.12)
-
net10.0
- CoreJ2K (>= 2.4.1)
- LibreMetaverse.Assets (>= 3.2.0)
- LibreMetaverse.Imaging.Abstractions (>= 3.2.0)
- LibreMetaverse.Protocol (>= 3.2.0)
- LibreMetaverse.StructuredData (>= 3.2.0)
- LibreMetaverse.Transport (>= 3.2.0)
- LibreMetaverse.Types (>= 3.2.0)
- MessagePack (>= 3.1.8)
- Microsoft.Extensions.DependencyInjection.Abstractions (>= 10.0.12)
- Microsoft.Extensions.Logging (>= 10.0.12)
- Microsoft.Extensions.Logging.Console (>= 10.0.12)
- Microsoft.Extensions.ObjectPool (>= 10.0.12)
- System.Threading.RateLimiting (>= 10.0.12)
-
net8.0
- CoreJ2K (>= 2.4.1)
- LibreMetaverse.Assets (>= 3.2.0)
- LibreMetaverse.Imaging.Abstractions (>= 3.2.0)
- LibreMetaverse.Protocol (>= 3.2.0)
- LibreMetaverse.StructuredData (>= 3.2.0)
- LibreMetaverse.Transport (>= 3.2.0)
- LibreMetaverse.Types (>= 3.2.0)
- MessagePack (>= 3.1.8)
- Microsoft.Extensions.DependencyInjection.Abstractions (>= 10.0.12)
- Microsoft.Extensions.Logging (>= 10.0.12)
- Microsoft.Extensions.Logging.Console (>= 10.0.12)
- Microsoft.Extensions.ObjectPool (>= 10.0.12)
- System.Collections.Immutable (>= 10.0.12)
- System.Threading.Channels (>= 10.0.12)
- System.Threading.RateLimiting (>= 10.0.12)
-
net9.0
- CoreJ2K (>= 2.4.1)
- LibreMetaverse.Assets (>= 3.2.0)
- LibreMetaverse.Imaging.Abstractions (>= 3.2.0)
- LibreMetaverse.Protocol (>= 3.2.0)
- LibreMetaverse.StructuredData (>= 3.2.0)
- LibreMetaverse.Transport (>= 3.2.0)
- LibreMetaverse.Types (>= 3.2.0)
- MessagePack (>= 3.1.8)
- Microsoft.Extensions.DependencyInjection.Abstractions (>= 10.0.12)
- Microsoft.Extensions.Logging (>= 10.0.12)
- Microsoft.Extensions.Logging.Console (>= 10.0.12)
- Microsoft.Extensions.ObjectPool (>= 10.0.12)
- System.Collections.Immutable (>= 10.0.12)
- System.Threading.Channels (>= 10.0.12)
- System.Threading.RateLimiting (>= 10.0.12)
NuGet packages (7)
Showing the top 5 NuGet packages that depend on LibreMetaverse:
| Package | Downloads |
|---|---|
|
LibreMetaverse.Rendering.Meshmerizer
Advanced mesh rendering library for LibreMetaverse that uses the Meshmerizer engine to generate renderable geometry from Second Life prims, sculpts, and mesh assets. |
|
|
LibreMetaverse.Utilities
Helpers on top of the LibreMetaverse client for bots and unattended agents: a persistent login that retries through grid outages, a monitor that keeps an avatar in a region, and typed-out chat with the typing animation. |
|
|
LibreMetaverse.GUI
GUI library for LibreMetaverse |
|
|
LibreMetaverse.Voice.Vivox
Vivox voice chat integration library for LibreMetaverse, enabling connection and communication with the Vivox voice service used by Second Life and other virtual worlds. |
|
|
LibreMetaverse.Voice
Library interface for Vivox voice client |
GitHub repositories
This package is not used by any popular GitHub repositories.
| Version | Downloads | Last Updated |
|---|---|---|
| 3.2.0 | 97 | 10/13/2026 |
| 3.1.8 | 452 | 10/6/2026 |
| 3.1.7 | 314 | 10/4/2026 |
| 3.1.6 | 3,295 | 9/14/2026 |
| 3.1.5 | 1,065 | 9/3/2026 |
| 3.1.4 | 385 | 8/26/2026 |
| 3.1.3 | 2,051 | 7/24/2026 |
| 3.1.2 | 390 | 7/21/2026 |
| 3.1.1 | 537 | 7/14/2026 |
| 3.1.0 | 580 | 7/11/2026 |
| 3.0.4 | 438 | 7/9/2026 |
| 3.0.3 | 545 | 7/3/2026 |
| 3.0.2 | 377 | 6/29/2026 |
| 3.0.1 | 374 | 6/27/2026 |
| 3.0.0 | 600 | 6/23/2026 |
| 2.6.10 | 668 | 6/20/2026 |
| 2.6.9 | 520 | 6/8/2026 |
| 2.6.8 | 421 | 6/7/2026 |
| 2.6.7 | 655 | 5/14/2026 |
| 2.6.6 | 713 | 4/12/2026 |