

PunManager.UpdateStatRPC onto its own NetworkedEvent, so the old UpdateStatRPC postfix never fired. Detection now hooks PlayerUpgrade.SetLevel and ApplyUpgrade reflectively, which catches the new path on the host and every other client.UpdateStatRPC which moves the level number but doesn't invoke the upgrade's action. A shared Sprint Usage would show up in the recipient's stats panel but their stamina drain wouldn't change. Distribution now goes through REPOLib's own SetLevel, which writes the level and runs the action on the recipient.RepoLibInterop was using HarmonyLib.AccessTools.Property to look up REPOLib's PlayerUpgrade.UpgradeId and the lookup failing (which the surrounding code already handles) was making HarmonyX log a Could not find property warning on every cold start. Switched to vanilla Type.GetProperty with explicit BindingFlags so the lookup is silent.Dictionary to SortedDictionary), which is a binary break even though the mod's source did not need to changeplayerUpgrade*. If upgrades disappear or stand purchases don't sync, open an issue with your config and BepInEx logLateJoinSyncChance removed; SharedUpgradesChance now applies to both real-time sharing and late join sync