Static table of Workshop clothing package idents (shirts, pants, shoes, hats, accessories) plus a MountAll helper. MountAll fetches and mounts each package once per session, logs how many mounted, then calls CharacterRules.ForgetClothing and bumps ClothingVersion so the character creator redraws with the newly available clothes.
namespace HorizonRP;
/// <summary>
/// Les paquets du Workshop qui ne sont pas des armes (vêtements surtout), montés au démarrage sur
/// chaque machine. Le projet les déclare (PackageReferences du .sbproj) et l'éditeur les monte
/// tous, mais un client qui rejoint le serveur ne reçoit que ceux que le jeu monte lui-même : au
/// premier essai à deux (29/10/2026), ces vêtements n'avaient pas de vignette dans la création du
/// personnage et ne pouvaient pas s'afficher. Le serveur en a besoin aussi : il relit les tenues.
/// Liste tirée du .sbproj (hors armes, déjà dans WeaponSystem.Packages, et hors carte) : à
/// compléter quand on ajoute un paquet.
/// </summary>
public static class WorkshopPackages
{
public static readonly string[] Idents =
{
"ducksworkshop.mobbosstop",
"y9j.coat",
"y9j.coatv2",
"facepunch.turtleneck_white",
"luke.varsityjacket",
"raf.lumberjackshirt",
"ducksworkshop.whitetanktop",
"ducksworkshop.vacationshirtcreamnavystripe",
"ducksworkshop.vacationshirtgraygreencheck",
"ducksworkshop.vacationshirtespressostripe",
"ducksworkshop.vacationshirtbluewhitecheck",
"ducksworkshop.raincoatcapnavycheck",
"ducksworkshop.greenrainjacketwithcap",
"stinnnaler.clerkshirt",
"gbonnsclothing.security_shirt",
"igorrxpretx.racerhoodie",
"l3d.blackpuffyjacket",
"l3d.designersweatshirt",
"y9j.sportsjacketv1",
"y9j.sportsjacketv2",
"daemoncast.tracktop",
"l3d.blacktracksuit",
"lies.pufferjacket_v2",
"a3d.jacketpuffer04",
"ximikworkshop.turtlenecksweater",
"voodooworks.stripedsweater",
"saandy.striped_jumper",
"ducksworkshop.greenskaterhoodiedirty",
"igorr.ogtshirt",
"lostick.bomber_zip",
"ducksworkshop.ribbedwomenstanktopblack",
"joyjoy.leather_top_black",
"glitchworkshop.highvisvest",
"y9j.worksuit",
"y9j.tie",
"ducksworkshop.mobbosspants",
"yuri.skinnyjeans",
"l3d.blacktracksuitpants",
"gbonnsclothing.officetrousersbrown",
"gbonnsclothing.officetrousersblue",
"gbonnsclothing.office_trousers",
"ducksworkshop.looseblackpants",
"ducksworkshop.loosebrownpants",
"spydr.baggytrousers",
"voodooworks.joggers",
"l3d.designersweatpants",
"doubletrouble.denimshorts",
"glitchworkshop.cargo_pants",
"igorr.streetshortsblack",
"y9j.militarytrousersblack",
"joyjoy.leather_skirt",
"shaft1337.sailorskirt2",
"igorr.ogpantsblack",
"ducksworkshop.mobbossshoes",
"voodooworks.specialforcesbootsblack",
"vitaljobs.hightopsneakersblack",
"microfivetwotwo.classicbasketballsneakers",
"gbonnsclothing.dark_derby_shoes",
"igorrxpretx.cowboyboots",
"pretxandbururik.crocodileleathershoes",
"artforge.sneakerscreamrunner",
"igorr.sandals",
"yuri.vintagekicks",
"shaft1337.sailorshoes2",
"gbonnsclothing.maryjane_shoes",
"ma1.kirzaboots",
"bugulma.aviatorsunglasses",
"y9j.readingglasses",
"newg.office_glasses",
"vitaljobs.baseballcapblack",
"igorr.fisherman_cap",
"glitchworkshop.basic_beanie_black",
"accept.panama",
"ximikworkshop.mafiahat",
"zontax.homberg_hat",
"raf.highrollerwatch1",
"theorg9000.gold_watch",
"pretx.smartwatchgreen",
"lies.swagchain",
"glitchworkshop.goldearrings",
"a3d.scarf",
"gbonnsclothing.leatherdrivinggloves",
};
static bool started;
/// <summary>Monte tous les paquets, une fois par partie (hors éditeur, qui les a déjà).</summary>
public static async Task MountAll()
{
if ( started )
return;
started = true;
var mounted = 0;
foreach ( var ident in Idents )
{
try
{
var package = await Package.Fetch( ident, false );
if ( package is null )
continue;
await package.MountAsync();
mounted++;
}
catch ( Exception e )
{
Log.Warning( $"[Horizon] Paquet {ident} : {e.Message}" );
}
}
Log.Info( $"[Horizon] {mounted}/{Idents.Length} paquet(s) du Workshop monté(s)" );
// Les listes de vêtements ont été lues avant : on les relit, et chaque corps se rhabille.
CharacterRules.ForgetClothing();
ClothingVersion++;
}
/// <summary>Augmente quand les paquets sont montés : la création du personnage se redessine.</summary>
public static int ClothingVersion { get; private set; }
}