Skip to content
Draft
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
25 commits
Select commit Hold shift + click to select a range
8a8d6d2
Add Steam lobby and relay transport as an optional networking path
saint4626 Mar 29, 2026
2556cf3
Add Steam transport and networking changes
saint4626 Mar 30, 2026
c20d5a6
Merge remote-tracking branch 'upstream/developer' into integration/up…
saint4626 Mar 30, 2026
15688f5
Fix post-merge Steam transport and saved state compile issues
saint4626 Mar 30, 2026
9c0a8c2
Polish and cleanup
saint4626 Apr 4, 2026
ef921a7
CleanUp
saint4626 Apr 4, 2026
f900aff
Merge remote-tracking branch 'upstream/developer' into integration/up…
saint4626 May 10, 2026
1de9ef8
Drop unrelated bundle and spawn merge carryover
saint4626 May 10, 2026
69ed97f
Fix Unity package compile after Steam merge
saint4626 May 10, 2026
c3fda53
Implement upstream transport interface members for Steam
saint4626 May 10, 2026
2cea025
Restore packet reader helpers for Steam transport
saint4626 May 10, 2026
b51a098
Add packet reader default constructor
saint4626 May 10, 2026
18d4fba
Remove stale server merge carryover
saint4626 May 10, 2026
c88df28
Expose transport polling on NetManager
saint4626 May 10, 2026
58830fa
Update Steam UI username cache key
saint4626 May 10, 2026
8b6bf85
Widen Steam lobby panel layout
saint4626 May 10, 2026
e4d0533
Trim unrelated upstream integration changes
saint4626 May 10, 2026
4ad193e
Revert unrelated preload and spawn carryover
saint4626 May 10, 2026
bc7b3e8
Keep Steam dependencies inside transport package
saint4626 May 10, 2026
2c0132d
Use default Steam settings from package
saint4626 May 10, 2026
64c0361
Normalize Steam package Unity metadata
saint4626 May 10, 2026
a90631e
Align Steam transport with PR checklist
saint4626 May 10, 2026
617af83
Remove unrelated network guard carryover
saint4626 May 10, 2026
1fe57fd
Restore object sync driver formatting
saint4626 May 10, 2026
70f543d
Reference BasisDebug from Steam transport core
saint4626 May 10, 2026
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
6 changes: 6 additions & 0 deletions Basis/Assets/Basis/link.xml
Original file line number Diff line number Diff line change
Expand Up @@ -27,12 +27,16 @@
<assembly fullname="BasisSerializer.OdinSerializer" preserve="all" />
<assembly fullname="BasisSettings" preserve="all" />
<assembly fullname="BasisShims" preserve="all" />
<assembly fullname="BasisSteamTransport" preserve="all" />
<assembly fullname="BasisSteamTransportCore" preserve="all" />
<assembly fullname="BasisVehicles" preserve="all" />
<assembly fullname="BasisVehiclesNetwork" preserve="all" />
<assembly fullname="BouncyCastle.Cryptography" preserve="all" />
<assembly fullname="Cilbox" preserve="all" />
<assembly fullname="Crypto" preserve="all" />
<assembly fullname="Did" preserve="all" />
<assembly fullname="Facepunch.Steamworks.Win32" preserve="all" />
<assembly fullname="Facepunch.Steamworks.Win64" preserve="all" />
<assembly fullname="GPUUtilities" preserve="all" />
<assembly fullname="Generator.Equals" preserve="all" />
<assembly fullname="Generator.Equals.Runtime" preserve="all" />
Expand Down Expand Up @@ -129,6 +133,8 @@
<assembly fullname="opus" preserve="all" />
<assembly fullname="phonon" preserve="all" />
<assembly fullname="phonon_fmod" preserve="all" />
<assembly fullname="steam_api" preserve="all" />
<assembly fullname="steam_api64" preserve="all" />
<assembly fullname="ucrtbased" preserve="all" />

</linker>
2 changes: 2 additions & 0 deletions Basis/Packages/com.basis.eventdriver/BasisEventDriver.cs
Original file line number Diff line number Diff line change
Expand Up @@ -123,6 +123,7 @@ public partial class BasisEventDriver : MonoBehaviour
public static BasisEventDriver Instance;

public static bool StateOfOnRenderBefore = false;
public static Action OnUpdate;

private int _volumeFrameworkFrameCounter;

Expand Down Expand Up @@ -200,6 +201,7 @@ public void Update()
InputSystem.Update();
OSCAcquisitionServer.Simulate();
timeSinceLastUpdate += DeltaTime;
OnUpdate?.Invoke();
}

/// <summary>
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -3,6 +3,7 @@
using Basis.Scripts.Device_Management.Devices.Desktop;
using Basis.Scripts.Drivers;
using Basis.Scripts.Networking;
using Basis.Network.Core;
using System;
using System.Collections.Generic;
using System.Threading;
Expand Down Expand Up @@ -739,6 +740,9 @@ public static async Task PerformConnectionAsync(SavedServerEntry entry, string u
BasisNetworkManagement.Instance.Ip = entry.Address;
BasisNetworkManagement.Instance.Password = entry.HasPassword ? entry.Password : string.Empty;
BasisNetworkManagement.Instance.IsHostMode = isHostMode;
BasisNetworkManagement.Instance.Transport = NetworkTransportType.LiteNetLib;
BasisNetworkManagement.Instance.ClearPendingSteamWorld();
BasisNetworkManagement.Instance.ClearSteamLobbyState();

ReportConnectionProgress(60f, BasisLocalization.Get("menu.servers.status.loadingBundle"));
await LoadDefaultAssetBundleAsync();
Expand Down
141 changes: 124 additions & 17 deletions Basis/Packages/com.basis.framework/Networking/BasisNetworkConnection.cs
Original file line number Diff line number Diff line change
@@ -1,5 +1,5 @@
using Basis.BasisUI;
using Basis.Network.Core;
using Basis.BasisUI;
using Basis.Scripts.BasisSdk.Players;
using Basis.Scripts.Device_Management;
using Basis.Scripts.Drivers;
Expand All @@ -16,34 +16,118 @@

namespace Basis.Scripts.Networking
{
/// <summary>
/// Connection/session management, server runner, time utilities, and send helpers.
/// </summary>
public static class BasisNetworkConnection
{
private static readonly object BnlSubscriptionLock = new object();
public static NetPeer LocalPlayerPeer { get; set; }
public static NetworkClient NetworkClient { get; set; } = new NetworkClient();
public static bool LocalPlayerIsConnected { get; set; }
public static bool SuppressNextDisconnectUi { get; set; }
public static event Action<NetPeer> OnConnectedToServer;
public static event Action<NetPeer, DisconnectInfo> OnDisconnectedFromServer;
public static BasisNetworkServerRunner BasisNetworkServerRunner = null;
#if UNITY_SERVER
public static bool HeadlessReconnectSuppressed { get; set; }
public static Action<DisconnectInfo> OnDisconnectedAfterReboot;
#endif
private static bool HasRegisteredBnlLogging;
private static void LogErrorOutput(string msg) => BasisDebug.LogError(msg, BasisDebug.LogTag.Networking);
private static void LogWarningOutput(string msg) => BasisDebug.LogWarning(msg);
private static void LogOutput(string msg) => BasisDebug.Log(msg, BasisDebug.LogTag.Networking);
private static void EnsureBnlLoggingRegistered()
{
if (HasRegisteredBnlLogging)
{
return;
}

lock (BnlSubscriptionLock)
{
if (HasRegisteredBnlLogging)
{
return;
}

BNL.LogOutput += LogOutput;
BNL.LogWarningOutput += LogWarningOutput;
BNL.LogErrorOutput += LogErrorOutput;
HasRegisteredBnlLogging = true;
}
}
public static bool TryGetLocalPlayerID(out ushort localId)
{
localId = 0;
if (LocalPlayerPeer == null) return false;
localId = (ushort)LocalPlayerPeer.RemoteId;
return true;
}
public static void Connect(BasisNetworkManagement networkManagement)
{
if (networkManagement == null)
{
BasisDebug.LogError("Missing BasisNetworkManagement during connect.", BasisDebug.LogTag.Networking);
return;
}

Connect(
networkManagement.Port,
networkManagement.Ip,
networkManagement.Password,
networkManagement.IsHostMode,
networkManagement.Transport,
networkManagement.UseSteamRelay,
networkManagement.CurrentSteamLobbyId,
networkManagement.CurrentHostSteamId,
networkManagement.CurrentSteamVirtualPort
);
}
public static bool HasActiveClient() => NetworkClient != null && NetworkClient.HasActiveClient;
public static void DisconnectActiveClient()
{
NetworkClient?.Disconnect();
LocalPlayerPeer = null;
LocalPlayerIsConnected = false;
}
public static async Task ResetConnectionStateAsync(BasisNetworkManagement management)
{
if (!LocalPlayerIsConnected && !HasActiveClient())
{
return;
}

if (management == null)
{
SuppressNextDisconnectUi = true;
DisconnectActiveClient();
return;
}

if (!LocalPlayerIsConnected)
{
SuppressNextDisconnectUi = true;
DisconnectActiveClient();
return;
}

using var cts = new CancellationTokenSource();
Task rebootWait = WaitForRebootCompleteAsync(cts.Token);

SuppressNextDisconnectUi = true;
NetworkClient?.Disconnect();
await rebootWait;

if (management != null)
{
BasisNetworkLifeCycle.Initalize(management);
}
}
public static void Connect(ushort port, string ipString, string primitivePassword, bool isHostMode)
{
BNL.LogOutput += LogOutput;
BNL.LogWarningOutput += LogWarningOutput;
BNL.LogErrorOutput += LogErrorOutput;
Connect(port, ipString, primitivePassword, isHostMode, NetworkTransportType.LiteNetLib, true, 0, 0, 0);
}
public static void Connect(ushort port, string ipString, string primitivePassword, bool isHostMode, NetworkTransportType transportType, bool useSteamRelay, ulong steamLobbyId, ulong steamHostSteamId, int steamVirtualPort)
{
EnsureBnlLoggingRegistered();

var uuid = BasisDIDAuthIdentityClient.GetOrSaveDID();

Expand All @@ -59,8 +143,14 @@ public static void Connect(ushort port, string ipString, string primitivePasswor
UseAuthIdentity = true,
UseAuth = true,
Password = primitivePassword,
EnableStatistics = BasisSettingsDefaults.EnableStatistics.RawValue
EnableStatistics = BasisSettingsDefaults.EnableStatistics.RawValue,
TransportType = transportType,
UseSteamRelay = useSteamRelay,
SteamLobbyId = steamLobbyId,
SteamHostSteamId = steamHostSteamId,
SteamVirtualPort = steamVirtualPort
};
BasisDebug.Log($"Initializing host server with transport {transportType} relay={useSteamRelay} virtualPort={steamVirtualPort}", BasisDebug.LogTag.Networking);
BasisNetworkServerRunner.Initalize(serverConfig, string.Empty, uuid);
}

Expand Down Expand Up @@ -92,7 +182,7 @@ public static void Connect(ushort port, string ipString, string primitivePasswor

BasisDebug.Log("Network Starting Client");

_ = Task.Run(() =>
void StartClientConnection()
{
try
{
Expand All @@ -104,17 +194,21 @@ public static void Connect(ushort port, string ipString, string primitivePasswor
UseAuthIdentity = true,
UseAuth = true,
Password = primitivePassword,
EnableStatistics = BasisSettingsDefaults.EnableStatistics.RawValue
EnableStatistics = BasisSettingsDefaults.EnableStatistics.RawValue,
TransportType = transportType,
UseSteamRelay = useSteamRelay,
SteamLobbyId = steamLobbyId,
SteamHostSteamId = steamHostSteamId,
SteamVirtualPort = steamVirtualPort
};
// Pass the token into anything that supports cancellation
NetworkClient.OnPeerConnected = PeerConnectedEvent;
NetworkClient.OnPeerDisconnected = BasisNetworkConnection.HandleDisconnection;
NetworkClient.OnNetworkReceive = BasisNetworkEvents.NetworkReceiveEvent;

LocalPlayerPeer = NetworkClient.StartClient(
ipString, port, readyMessage,
Encoding.UTF8.GetBytes(primitivePassword), serverConfig);

NetworkClient.listener.PeerConnectedEvent += PeerConnectedEvent;
NetworkClient.listener.PeerDisconnectedEvent += BasisNetworkConnection.HandleDisconnection;
NetworkClient.listener.NetworkReceiveEvent += BasisNetworkEvents.NetworkReceiveEvent;

if (LocalPlayerPeer != null)
{
BasisDebug.Log("Network Client Started " + LocalPlayerPeer.RemoteId);
Expand All @@ -136,7 +230,16 @@ public static void Connect(ushort port, string ipString, string primitivePasswor
Reason = DisconnectReason.UnknownHost
});
}
});
}

if (transportType == NetworkTransportType.Steam)
{
StartClientConnection();
}
else
{
_ = Task.Run(StartClientConnection);
}
}
public static void OnDestroy()
{
Expand Down Expand Up @@ -190,6 +293,7 @@ private static void PeerConnectedEvent(NetPeer peer)

LocalPlayerIsConnected = true;

OnConnectedToServer?.Invoke(peer);
BasisNetworkPlayer.OnLocalPlayerJoined?.Invoke(transmitter, BasisLocalPlayer.Instance);
BasisNetworkPlayer.OnPlayerJoined?.Invoke(transmitter);
}
Expand All @@ -204,6 +308,7 @@ public static void HandleDisconnection(NetPeer peer, DisconnectInfo disconnectIn
{
BasisDeviceManagement.EnqueueOnMainThread(async () =>
{
OnDisconnectedFromServer?.Invoke(peer, disconnectInfo);
#if UNITY_SERVER
if (disconnectInfo.Reason == DisconnectReason.Timeout)
{
Expand All @@ -213,7 +318,9 @@ public static void HandleDisconnection(NetPeer peer, DisconnectInfo disconnectIn
Basis.Scripts.Device_Management.Devices.Headless.BasisHeadlessInput.Instance?.StopMovement();
#endif
BasisNetworkAvatarCompressor.Dispose();
await BasisNetworkLifeCycle.RebootManagement(BasisNetworkManagement.Instance, true, peer, disconnectInfo);
bool displayReason = !SuppressNextDisconnectUi;
SuppressNextDisconnectUi = false;
await BasisNetworkLifeCycle.RebootManagement(BasisNetworkManagement.Instance, displayReason, peer, disconnectInfo);
#if UNITY_SERVER
if (!HeadlessReconnectSuppressed)
{
Expand Down
Loading