SetNet.Equipment
1.2.0
dotnet add package SetNet.Equipment --version 1.2.0
NuGet\Install-Package SetNet.Equipment -Version 1.2.0
<PackageReference Include="SetNet.Equipment" Version="1.2.0" />
<PackageVersion Include="SetNet.Equipment" Version="1.2.0" />
<PackageReference Include="SetNet.Equipment" />
paket add SetNet.Equipment --version 1.2.0
#r "nuget: SetNet.Equipment, 1.2.0"
#:package SetNet.Equipment@1.2.0
#addin nuget:?package=SetNet.Equipment&version=1.2.0
#tool nuget:?package=SetNet.Equipment&version=1.2.0
<p align="center"> <img src="https://raw.githubusercontent.com/Povstalez/SetNet/master/assets/icon.png" alt="SetNet" width="96"> </p>
SetNet.Equipment
Server-authoritative equipment for SetNet.
Define your own slot layout — head, weapon, ring1/ring2, whatever — as a custom EquipmentSchema with per-slot accept rules, then equip and unequip items pulled straight from SetNet.Inventory. Each equipped item applies its SetNet.Stats modifiers to the wearer's StatSet (and removes them on unequip), so gear changes attack power, defense, speed, and so on. Clients equip/unequip and read the loadout; changes push. Added by composition — no base class.
Install
dotnet add package SetNet
dotnet add package SetNet.Equipment
Usage
Call EquipmentRuntime.Enable() once at startup on both ends.
Server — over the inventory hub, with your slot schema and item-stat mapping:
EquipmentRuntime.Enable();
var inventory = server.UseInventory();
var schema = EquipmentSchema.Create()
.Slot("weapon", accepts: id => id.StartsWith("weapon:"))
.Slot("head")
.Slot("ring1").Slot("ring2")
.Build();
var equipment = server.UseEquipment(inventory, new EquipmentOptions
{
Schema = schema,
ItemStats = itemId => Catalog.ModifiersFor(itemId), // item id -> stat modifiers while worn
StatsOf = playerKey => world.StatsOf(playerKey), // must be the wearer's StatSet
// PlayerKey must match the Inventory hub's key mapping
});
// server logic can equip directly, too:
var (ok, msg) = await equipment.EquipAsync(playerKey, "weapon", "weapon:sword");
Client — equip, unequip, and read the loadout:
EquipmentRuntime.Enable();
var equipment = client.UseEquipment();
equipment.Changed += loadout => Redraw(loadout); // slot -> item id
await equipment.EquipAsync("weapon", "weapon:sword");
await equipment.UnequipAsync("head");
var loadout = await equipment.GetAsync();
Notes
- Custom slots with accept rules.
EquipmentSchema.Create().Slot(id, accepts?)— the optional predicate gates which item ids a slot takes; unknown slots and rejected items fail with a reason. - Items live in exactly one place.
EquipAsyncatomically takes the item fromInventoryServer(viaTryRevokeAsync), swaps out and returns whatever was already in the slot, and updates stats;UnequipAsyncgrants the item back. No dupes. - Gear = stat modifiers.
EquipmentOptions.ItemStatsmaps an item id to theStatModifiers it grants; they're re-tagged per slot soRemoveBySourcestrips exactly that slot's bonuses on unequip or swap. ProvideStatsOfto reach the wearer'sStatSet(omit it for slots-only equipment with no stat effect). - Key parity.
EquipmentOptions.PlayerKeymust map a peer to the same stable key the Inventory hub uses, or items won't line up. Default is the connection id — override to the authenticated account id. - Pluggable store.
IEquipmentStoreholds each player's loadout (MemoryEquipmentStoredefault, in-process); implement it over Redis/SQL for durability. - Rides the unified SetNet.Protocol messaging layer on the
Channels.Equipmentchannel (all modules share one envelope wire type,65447) — no per-module wire ids to reserve. The control protocol is hand-framedbyte[].
Documentation & source
- 🐙 https://github.com/Povstalez/SetNet — full module catalog in docs/MODULES.md
License
MIT
| 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 was computed. 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. |
| .NET Core | netcoreapp3.0 was computed. netcoreapp3.1 was computed. |
| .NET Standard | netstandard2.1 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. |
-
.NETStandard 2.1
- SetNet (>= 1.2.0)
- SetNet.Inventory (>= 1.2.0)
- SetNet.Stats (>= 1.2.0)
NuGet packages
This package is not used by any NuGet packages.
GitHub repositories
This package is not used by any popular GitHub repositories.
| Version | Downloads | Last Updated |
|---|---|---|
| 1.2.0 | 111 | 8/5/2026 |