2020-12-04 22:15:41 +00:00
using OWML.Logging ;
2020-12-02 18:40:38 +00:00
using System ;
using System.Collections.Generic ;
using System.Net ;
using UnityEngine ;
using UnityEngine.Networking ;
using UnityEngine.Networking.Match ;
using UnityEngine.Networking.Types ;
using UnityEngine.SceneManagement ;
2020-12-04 22:14:53 +00:00
namespace QuantumUNET
2020-12-02 18:40:38 +00:00
{
public class QSBNetworkManagerUNET : MonoBehaviour
{
public int networkPort
{
get
{
return m_NetworkPort ;
}
set
{
m_NetworkPort = value ;
}
}
public bool serverBindToIP
{
get
{
return m_ServerBindToIP ;
}
set
{
m_ServerBindToIP = value ;
}
}
public string serverBindAddress
{
get
{
return m_ServerBindAddress ;
}
set
{
m_ServerBindAddress = value ;
}
}
public string networkAddress
{
get
{
return m_NetworkAddress ;
}
set
{
m_NetworkAddress = value ;
}
}
public bool dontDestroyOnLoad
{
get
{
return m_DontDestroyOnLoad ;
}
set
{
m_DontDestroyOnLoad = value ;
}
}
public bool runInBackground
{
get
{
return m_RunInBackground ;
}
set
{
m_RunInBackground = value ;
}
}
public bool scriptCRCCheck
{
get
{
return m_ScriptCRCCheck ;
}
set
{
m_ScriptCRCCheck = value ;
}
}
[Obsolete("moved to NetworkMigrationManager")]
public bool sendPeerInfo
{
get
{
return false ;
}
set
{
}
}
public float maxDelay
{
get
{
return m_MaxDelay ;
}
set
{
m_MaxDelay = value ;
}
}
public LogFilter . FilterLevel logLevel
{
get
{
return m_LogLevel ;
}
set
{
m_LogLevel = value ;
LogFilter . currentLogLevel = ( int ) value ;
}
}
public GameObject playerPrefab
{
get
{
return m_PlayerPrefab ;
}
set
{
m_PlayerPrefab = value ;
}
}
public bool autoCreatePlayer
{
get
{
return m_AutoCreatePlayer ;
}
set
{
m_AutoCreatePlayer = value ;
}
}
public PlayerSpawnMethod playerSpawnMethod
{
get
{
return m_PlayerSpawnMethod ;
}
set
{
m_PlayerSpawnMethod = value ;
}
}
public string offlineScene
{
get
{
return m_OfflineScene ;
}
set
{
m_OfflineScene = value ;
}
}
public string onlineScene
{
get
{
return m_OnlineScene ;
}
set
{
m_OnlineScene = value ;
}
}
public List < GameObject > spawnPrefabs
{
get
{
return m_SpawnPrefabs ;
}
}
public List < Transform > startPositions
{
get
{
return s_StartPositions ;
}
}
public bool customConfig
{
get
{
return m_CustomConfig ;
}
set
{
m_CustomConfig = value ;
}
}
public ConnectionConfig connectionConfig
{
get
{
if ( m_ConnectionConfig = = null )
{
m_ConnectionConfig = new ConnectionConfig ( ) ;
}
return m_ConnectionConfig ;
}
}
public GlobalConfig globalConfig
{
get
{
if ( m_GlobalConfig = = null )
{
m_GlobalConfig = new GlobalConfig ( ) ;
}
return m_GlobalConfig ;
}
}
public int maxConnections
{
get
{
return m_MaxConnections ;
}
set
{
m_MaxConnections = value ;
}
}
public List < QosType > channels
{
get
{
return m_Channels ;
}
}
public EndPoint secureTunnelEndpoint
{
get
{
return m_EndPoint ;
}
set
{
m_EndPoint = value ;
}
}
public bool useWebSockets
{
get
{
return m_UseWebSockets ;
}
set
{
m_UseWebSockets = value ;
}
}
public bool useSimulator
{
get
{
return m_UseSimulator ;
}
set
{
m_UseSimulator = value ;
}
}
public int simulatedLatency
{
get
{
return m_SimulatedLatency ;
}
set
{
m_SimulatedLatency = value ;
}
}
public float packetLossPercentage
{
get
{
return m_PacketLossPercentage ;
}
set
{
m_PacketLossPercentage = value ;
}
}
public string matchHost
{
get
{
return m_MatchHost ;
}
set
{
m_MatchHost = value ;
}
}
public int matchPort
{
get
{
return m_MatchPort ;
}
set
{
m_MatchPort = value ;
}
}
public bool clientLoadedScene
{
get
{
return m_ClientLoadedScene ;
}
set
{
m_ClientLoadedScene = value ;
}
}
public QSBNetworkMigrationManager migrationManager
{
get
{
return m_MigrationManager ;
}
}
public int numPlayers
{
get
{
int num = 0 ;
for ( int i = 0 ; i < QSBNetworkServer . connections . Count ; i + + )
{
QSBNetworkConnection networkConnection = QSBNetworkServer . connections [ i ] ;
if ( networkConnection ! = null )
{
for ( int j = 0 ; j < networkConnection . PlayerControllers . Count ; j + + )
{
if ( networkConnection . PlayerControllers [ j ] . IsValid )
{
num + + ;
}
}
}
}
return num ;
}
}
private void Awake ( )
{
InitializeSingleton ( ) ;
}
private void InitializeSingleton ( )
{
if ( ! ( singleton ! = null ) | | ! ( singleton = = this ) )
{
int logLevel = ( int ) m_LogLevel ;
if ( logLevel ! = - 1 )
{
LogFilter . currentLogLevel = logLevel ;
}
if ( m_DontDestroyOnLoad )
{
if ( singleton ! = null )
{
Debug . Log ( "Multiple NetworkManagers detected in the scene. Only one NetworkManager can exist at a time. The duplicate NetworkManager will not be used." ) ;
Destroy ( base . gameObject ) ;
return ;
}
Debug . Log ( "NetworkManager created singleton (DontDestroyOnLoad)" ) ;
singleton = this ;
if ( Application . isPlaying )
{
DontDestroyOnLoad ( base . gameObject ) ;
}
}
else
{
Debug . Log ( "NetworkManager created singleton (ForScene)" ) ;
singleton = this ;
}
if ( m_NetworkAddress ! = "" )
{
s_Address = m_NetworkAddress ;
}
else if ( s_Address ! = "" )
{
m_NetworkAddress = s_Address ;
}
}
}
private void OnValidate ( )
{
if ( m_SimulatedLatency < 1 )
{
m_SimulatedLatency = 1 ;
}
if ( m_SimulatedLatency > 500 )
{
m_SimulatedLatency = 500 ;
}
if ( m_PacketLossPercentage < 0f )
{
m_PacketLossPercentage = 0f ;
}
if ( m_PacketLossPercentage > 99f )
{
m_PacketLossPercentage = 99f ;
}
if ( m_MaxConnections < = 0 )
{
m_MaxConnections = 1 ;
}
if ( m_MaxConnections > 32000 )
{
m_MaxConnections = 32000 ;
}
if ( m_MaxBufferedPackets < = 0 )
{
m_MaxBufferedPackets = 0 ;
}
if ( m_MaxBufferedPackets > 512 )
{
m_MaxBufferedPackets = 512 ;
if ( LogFilter . logError )
{
Debug . LogError ( "NetworkManager - MaxBufferedPackets cannot be more than " + 512 ) ;
}
}
if ( m_PlayerPrefab ! = null & & m_PlayerPrefab . GetComponent < NetworkIdentity > ( ) = = null )
{
if ( LogFilter . logError )
{
Debug . LogError ( "NetworkManager - playerPrefab must have a NetworkIdentity." ) ;
}
m_PlayerPrefab = null ;
}
if ( m_ConnectionConfig ! = null & & m_ConnectionConfig . MinUpdateTimeout < = 0 U )
{
if ( LogFilter . logError )
{
Debug . LogError ( "NetworkManager MinUpdateTimeout cannot be zero or less. The value will be reset to 1 millisecond" ) ;
}
m_ConnectionConfig . MinUpdateTimeout = 1 U ;
}
if ( m_GlobalConfig ! = null )
{
if ( m_GlobalConfig . ThreadAwakeTimeout < = 0 U )
{
if ( LogFilter . logError )
{
Debug . LogError ( "NetworkManager ThreadAwakeTimeout cannot be zero or less. The value will be reset to 1 millisecond" ) ;
}
m_GlobalConfig . ThreadAwakeTimeout = 1 U ;
}
}
}
internal void RegisterServerMessages ( )
{
QSBNetworkServer . RegisterHandler ( 32 , new QSBNetworkMessageDelegate ( OnServerConnectInternal ) ) ;
QSBNetworkServer . RegisterHandler ( 33 , new QSBNetworkMessageDelegate ( OnServerDisconnectInternal ) ) ;
QSBNetworkServer . RegisterHandler ( 35 , new QSBNetworkMessageDelegate ( OnServerReadyMessageInternal ) ) ;
QSBNetworkServer . RegisterHandler ( 37 , new QSBNetworkMessageDelegate ( OnServerAddPlayerMessageInternal ) ) ;
QSBNetworkServer . RegisterHandler ( 38 , new QSBNetworkMessageDelegate ( OnServerRemovePlayerMessageInternal ) ) ;
QSBNetworkServer . RegisterHandler ( 34 , new QSBNetworkMessageDelegate ( OnServerErrorInternal ) ) ;
}
public void SetupMigrationManager ( QSBNetworkMigrationManager man )
{
m_MigrationManager = man ;
}
public bool StartServer ( ConnectionConfig config , int maxConnections )
{
return StartServer ( null , config , maxConnections ) ;
}
public bool StartServer ( )
{
return StartServer ( null ) ;
}
public bool StartServer ( MatchInfo info )
{
return StartServer ( info , null , - 1 ) ;
}
private bool StartServer ( MatchInfo info , ConnectionConfig config , int maxConnections )
{
InitializeSingleton ( ) ;
OnStartServer ( ) ;
if ( m_RunInBackground )
{
Application . runInBackground = true ;
}
QSBNetworkCRC . scriptCRCCheck = scriptCRCCheck ;
QSBNetworkServer . useWebSockets = m_UseWebSockets ;
if ( m_GlobalConfig ! = null )
{
NetworkTransport . Init ( m_GlobalConfig ) ;
}
if ( m_CustomConfig & & m_ConnectionConfig ! = null & & config = = null )
{
m_ConnectionConfig . Channels . Clear ( ) ;
for ( int i = 0 ; i < m_Channels . Count ; i + + )
{
m_ConnectionConfig . AddChannel ( m_Channels [ i ] ) ;
}
QSBNetworkServer . Configure ( m_ConnectionConfig , m_MaxConnections ) ;
}
if ( config ! = null )
{
QSBNetworkServer . Configure ( config , maxConnections ) ;
}
if ( info ! = null )
{
if ( ! QSBNetworkServer . Listen ( info , m_NetworkPort ) )
{
if ( LogFilter . logError )
{
Debug . LogError ( "StartServer listen failed." ) ;
}
return false ;
}
}
else if ( m_ServerBindToIP & & ! string . IsNullOrEmpty ( m_ServerBindAddress ) )
{
if ( ! QSBNetworkServer . Listen ( m_ServerBindAddress , m_NetworkPort ) )
{
if ( LogFilter . logError )
{
Debug . LogError ( "StartServer listen on " + m_ServerBindAddress + " failed." ) ;
}
return false ;
}
}
else if ( ! QSBNetworkServer . Listen ( m_NetworkPort ) )
{
if ( LogFilter . logError )
{
Debug . LogError ( "StartServer listen failed." ) ;
}
return false ;
}
RegisterServerMessages ( ) ;
if ( LogFilter . logDebug )
{
Debug . Log ( "NetworkManager StartServer port:" + m_NetworkPort ) ;
}
isNetworkActive = true ;
string name = SceneManager . GetSceneAt ( 0 ) . name ;
if ( ! string . IsNullOrEmpty ( m_OnlineScene ) & & m_OnlineScene ! = name & & m_OnlineScene ! = m_OfflineScene )
{
ServerChangeScene ( m_OnlineScene ) ;
}
else
{
QSBNetworkServer . SpawnObjects ( ) ;
}
return true ;
}
internal void RegisterClientMessages ( QSBNetworkClient client )
{
client . RegisterHandler ( 32 , new QSBNetworkMessageDelegate ( OnClientConnectInternal ) ) ;
client . RegisterHandler ( 33 , new QSBNetworkMessageDelegate ( OnClientDisconnectInternal ) ) ;
client . RegisterHandler ( 36 , new QSBNetworkMessageDelegate ( OnClientNotReadyMessageInternal ) ) ;
client . RegisterHandler ( 34 , new QSBNetworkMessageDelegate ( OnClientErrorInternal ) ) ;
client . RegisterHandler ( 39 , new QSBNetworkMessageDelegate ( OnClientSceneInternal ) ) ;
if ( m_PlayerPrefab ! = null )
{
2020-12-02 20:43:16 +00:00
QSBClientScene . RegisterPrefab ( m_PlayerPrefab ) ;
2020-12-02 18:40:38 +00:00
}
for ( int i = 0 ; i < m_SpawnPrefabs . Count ; i + + )
{
GameObject gameObject = m_SpawnPrefabs [ i ] ;
if ( gameObject ! = null )
{
2020-12-02 20:43:16 +00:00
QSBClientScene . RegisterPrefab ( gameObject ) ;
2020-12-02 18:40:38 +00:00
}
}
}
public void UseExternalClient ( QSBNetworkClient externalClient )
{
if ( m_RunInBackground )
{
Application . runInBackground = true ;
}
if ( externalClient ! = null )
{
client = externalClient ;
isNetworkActive = true ;
this . RegisterClientMessages ( client ) ;
this . OnStartClient ( client ) ;
}
else
{
OnStopClient ( ) ;
QSBClientScene . DestroyAllClientObjects ( ) ;
QSBClientScene . HandleClientDisconnect ( client . connection ) ;
client = null ;
if ( ! string . IsNullOrEmpty ( m_OfflineScene ) )
{
ClientChangeScene ( m_OfflineScene , false ) ;
}
}
s_Address = m_NetworkAddress ;
}
public QSBNetworkClient StartClient ( MatchInfo info , ConnectionConfig config , int hostPort )
{
InitializeSingleton ( ) ;
matchInfo = info ;
if ( m_RunInBackground )
{
Application . runInBackground = true ;
}
isNetworkActive = true ;
if ( m_GlobalConfig ! = null )
{
NetworkTransport . Init ( m_GlobalConfig ) ;
}
client = new QSBNetworkClient ( ) ;
client . hostPort = hostPort ;
if ( config ! = null )
{
if ( config . UsePlatformSpecificProtocols & & Application . platform ! = RuntimePlatform . PS4 & & Application . platform ! = RuntimePlatform . PSP2 )
{
throw new ArgumentOutOfRangeException ( "Platform specific protocols are not supported on this platform" ) ;
}
client . Configure ( config , 1 ) ;
}
else if ( m_CustomConfig & & m_ConnectionConfig ! = null )
{
m_ConnectionConfig . Channels . Clear ( ) ;
for ( int i = 0 ; i < m_Channels . Count ; i + + )
{
m_ConnectionConfig . AddChannel ( m_Channels [ i ] ) ;
}
if ( m_ConnectionConfig . UsePlatformSpecificProtocols & & Application . platform ! = RuntimePlatform . PS4 & & Application . platform ! = RuntimePlatform . PSP2 )
{
throw new ArgumentOutOfRangeException ( "Platform specific protocols are not supported on this platform" ) ;
}
client . Configure ( m_ConnectionConfig , m_MaxConnections ) ;
}
this . RegisterClientMessages ( client ) ;
if ( matchInfo ! = null )
{
2020-12-04 22:14:53 +00:00
ModConsole . OwmlConsole . WriteLine ( "NetworkManager StartClient match: " + matchInfo ) ;
2020-12-02 18:40:38 +00:00
client . Connect ( matchInfo ) ;
}
else if ( m_EndPoint ! = null )
{
2020-12-04 22:14:53 +00:00
ModConsole . OwmlConsole . WriteLine ( "NetworkManager StartClient using provided SecureTunnel" ) ;
2020-12-02 18:40:38 +00:00
client . Connect ( m_EndPoint ) ;
}
else
{
if ( string . IsNullOrEmpty ( m_NetworkAddress ) )
{
2020-12-04 22:14:53 +00:00
ModConsole . OwmlConsole . WriteLine ( "Must set the Network Address field in the manager" ) ;
2020-12-02 18:40:38 +00:00
return null ;
}
2020-12-04 22:14:53 +00:00
ModConsole . OwmlConsole . WriteLine ( string . Concat ( new object [ ]
2020-12-02 18:40:38 +00:00
{
"NetworkManager StartClient address:" ,
m_NetworkAddress ,
" port:" ,
m_NetworkPort
} ) ) ;
if ( m_UseSimulator )
{
2020-12-04 22:14:53 +00:00
ModConsole . OwmlConsole . WriteLine ( "connecting with simulator" ) ;
2020-12-02 18:40:38 +00:00
client . ConnectWithSimulator ( m_NetworkAddress , m_NetworkPort , m_SimulatedLatency , m_PacketLossPercentage ) ;
}
else
{
2020-12-04 22:14:53 +00:00
ModConsole . OwmlConsole . WriteLine ( "connecting" ) ;
2020-12-02 18:40:38 +00:00
client . Connect ( m_NetworkAddress , m_NetworkPort ) ;
}
}
if ( m_MigrationManager ! = null )
{
m_MigrationManager . Initialize ( client , matchInfo ) ;
}
this . OnStartClient ( client ) ;
s_Address = m_NetworkAddress ;
return client ;
}
public QSBNetworkClient StartClient ( MatchInfo matchInfo )
{
return StartClient ( matchInfo , null ) ;
}
public QSBNetworkClient StartClient ( )
{
return StartClient ( null , null ) ;
}
public QSBNetworkClient StartClient ( MatchInfo info , ConnectionConfig config )
{
return StartClient ( info , config , 0 ) ;
}
public virtual QSBNetworkClient StartHost ( ConnectionConfig config , int maxConnections )
{
OnStartHost ( ) ;
QSBNetworkClient result ;
if ( StartServer ( config , maxConnections ) )
{
QSBNetworkClient networkClient = ConnectLocalClient ( ) ;
OnServerConnect ( networkClient . connection ) ;
OnStartClient ( networkClient ) ;
result = networkClient ;
}
else
{
result = null ;
}
return result ;
}
public virtual QSBNetworkClient StartHost ( MatchInfo info )
{
OnStartHost ( ) ;
matchInfo = info ;
QSBNetworkClient result ;
if ( StartServer ( info ) )
{
QSBNetworkClient networkClient = ConnectLocalClient ( ) ;
OnStartClient ( networkClient ) ;
result = networkClient ;
}
else
{
result = null ;
}
return result ;
}
public virtual QSBNetworkClient StartHost ( )
{
OnStartHost ( ) ;
QSBNetworkClient result ;
if ( StartServer ( ) )
{
QSBNetworkClient networkClient = ConnectLocalClient ( ) ;
OnStartClient ( networkClient ) ;
result = networkClient ;
}
else
{
result = null ;
}
return result ;
}
private QSBNetworkClient ConnectLocalClient ( )
{
if ( LogFilter . logDebug )
{
Debug . Log ( "NetworkManager StartHost port:" + m_NetworkPort ) ;
}
m_NetworkAddress = "localhost" ;
client = QSBClientScene . ConnectLocalServer ( ) ;
this . RegisterClientMessages ( client ) ;
if ( m_MigrationManager ! = null )
{
m_MigrationManager . Initialize ( client , matchInfo ) ;
}
return client ;
}
public void StopHost ( )
{
bool active = QSBNetworkServer . active ;
OnStopHost ( ) ;
StopServer ( ) ;
StopClient ( ) ;
if ( m_MigrationManager ! = null )
{
if ( active )
{
m_MigrationManager . LostHostOnHost ( ) ;
}
}
}
public void StopServer ( )
{
if ( QSBNetworkServer . active )
{
OnStopServer ( ) ;
if ( LogFilter . logDebug )
{
Debug . Log ( "NetworkManager StopServer" ) ;
}
isNetworkActive = false ;
QSBNetworkServer . Shutdown ( ) ;
StopMatchMaker ( ) ;
if ( ! string . IsNullOrEmpty ( m_OfflineScene ) )
{
ServerChangeScene ( m_OfflineScene ) ;
}
CleanupNetworkIdentities ( ) ;
}
}
public void StopClient ( )
{
OnStopClient ( ) ;
if ( LogFilter . logDebug )
{
Debug . Log ( "NetworkManager StopClient" ) ;
}
isNetworkActive = false ;
if ( client ! = null )
{
client . Disconnect ( ) ;
client . Shutdown ( ) ;
client = null ;
}
StopMatchMaker ( ) ;
2020-12-05 13:39:40 +00:00
QSBClientScene . DestroyAllClientObjects ( ) ;
2020-12-02 18:40:38 +00:00
if ( ! string . IsNullOrEmpty ( m_OfflineScene ) )
{
ClientChangeScene ( m_OfflineScene , false ) ;
}
CleanupNetworkIdentities ( ) ;
}
public virtual void ServerChangeScene ( string newSceneName )
{
if ( string . IsNullOrEmpty ( newSceneName ) )
{
if ( LogFilter . logError )
{
Debug . LogError ( "ServerChangeScene empty scene name" ) ;
}
}
else
{
if ( LogFilter . logDebug )
{
Debug . Log ( "ServerChangeScene " + newSceneName ) ;
}
QSBNetworkServer . SetAllClientsNotReady ( ) ;
networkSceneName = newSceneName ;
s_LoadingSceneAsync = SceneManager . LoadSceneAsync ( newSceneName ) ;
2020-12-04 09:23:27 +00:00
QSBStringMessage msg = new QSBStringMessage ( networkSceneName ) ;
2020-12-02 18:40:38 +00:00
QSBNetworkServer . SendToAll ( 39 , msg ) ;
s_StartPositionIndex = 0 ;
s_StartPositions . Clear ( ) ;
}
}
private void CleanupNetworkIdentities ( )
{
foreach ( QSBNetworkIdentity networkIdentity in Resources . FindObjectsOfTypeAll < QSBNetworkIdentity > ( ) )
{
networkIdentity . MarkForReset ( ) ;
}
}
internal void ClientChangeScene ( string newSceneName , bool forceReload )
{
if ( string . IsNullOrEmpty ( newSceneName ) )
{
if ( LogFilter . logError )
{
Debug . LogError ( "ClientChangeScene empty scene name" ) ;
}
}
else
{
if ( LogFilter . logDebug )
{
Debug . Log ( "ClientChangeScene newSceneName:" + newSceneName + " networkSceneName:" + networkSceneName ) ;
}
if ( newSceneName = = networkSceneName )
{
if ( m_MigrationManager ! = null )
{
FinishLoadScene ( ) ;
return ;
}
if ( ! forceReload )
{
FinishLoadScene ( ) ;
return ;
}
}
s_LoadingSceneAsync = SceneManager . LoadSceneAsync ( newSceneName ) ;
networkSceneName = newSceneName ;
}
}
private void FinishLoadScene ( )
{
if ( client ! = null )
{
if ( s_ClientReadyConnection ! = null )
{
m_ClientLoadedScene = true ;
this . OnClientConnect ( s_ClientReadyConnection ) ;
s_ClientReadyConnection = null ;
}
}
else
{
Debug . Log ( "FinishLoadScene client is null" ) ;
}
if ( QSBNetworkServer . active )
{
QSBNetworkServer . SpawnObjects ( ) ;
OnServerSceneChanged ( networkSceneName ) ;
}
if ( IsClientConnected ( ) & & client ! = null )
{
this . RegisterClientMessages ( client ) ;
this . OnClientSceneChanged ( client . connection ) ;
}
}
internal static void UpdateScene ( )
{
if ( ! ( singleton = = null ) )
{
if ( s_LoadingSceneAsync ! = null )
{
if ( s_LoadingSceneAsync . isDone )
{
2020-12-04 22:14:53 +00:00
ModConsole . OwmlConsole . WriteLine ( "ClientChangeScene done readyCon:" + s_ClientReadyConnection ) ;
2020-12-02 18:40:38 +00:00
singleton . FinishLoadScene ( ) ;
s_LoadingSceneAsync . allowSceneActivation = true ;
s_LoadingSceneAsync = null ;
}
}
}
}
private void OnDestroy ( )
{
Debug . Log ( "NetworkManager destroyed" ) ;
}
public static void RegisterStartPosition ( Transform start )
{
if ( LogFilter . logDebug )
{
Debug . Log ( string . Concat ( new object [ ]
{
"RegisterStartPosition: (" ,
start . gameObject . name ,
") " ,
start . position
} ) ) ;
}
s_StartPositions . Add ( start ) ;
}
public static void UnRegisterStartPosition ( Transform start )
{
if ( LogFilter . logDebug )
{
Debug . Log ( string . Concat ( new object [ ]
{
"UnRegisterStartPosition: (" ,
start . gameObject . name ,
") " ,
start . position
} ) ) ;
}
s_StartPositions . Remove ( start ) ;
}
public bool IsClientConnected ( )
{
return client ! = null & & client . isConnected ;
}
public static void Shutdown ( )
{
if ( ! ( singleton = = null ) )
{
s_StartPositions . Clear ( ) ;
s_StartPositionIndex = 0 ;
s_ClientReadyConnection = null ;
singleton . StopHost ( ) ;
singleton = null ;
}
}
internal void OnServerConnectInternal ( QSBNetworkMessage netMsg )
{
if ( LogFilter . logDebug )
{
Debug . Log ( "NetworkManager:OnServerConnectInternal" ) ;
}
2020-12-03 11:56:32 +00:00
netMsg . Connection . SetMaxDelay ( m_MaxDelay ) ;
2020-12-02 18:40:38 +00:00
if ( m_MaxBufferedPackets ! = 512 )
{
for ( int i = 0 ; i < QSBNetworkServer . numChannels ; i + + )
{
2020-12-03 11:56:32 +00:00
netMsg . Connection . SetChannelOption ( i , ChannelOption . MaxPendingBuffers , m_MaxBufferedPackets ) ;
2020-12-02 18:40:38 +00:00
}
}
if ( ! m_AllowFragmentation )
{
for ( int j = 0 ; j < QSBNetworkServer . numChannels ; j + + )
{
2020-12-03 11:56:32 +00:00
netMsg . Connection . SetChannelOption ( j , ChannelOption . AllowFragmentation , 0 ) ;
2020-12-02 18:40:38 +00:00
}
}
if ( networkSceneName ! = "" & & networkSceneName ! = m_OfflineScene )
{
2020-12-04 09:23:27 +00:00
QSBStringMessage msg = new QSBStringMessage ( networkSceneName ) ;
2020-12-03 11:56:32 +00:00
netMsg . Connection . Send ( 39 , msg ) ;
2020-12-02 18:40:38 +00:00
}
if ( m_MigrationManager ! = null )
{
m_MigrationManager . SendPeerInfo ( ) ;
}
2020-12-03 11:56:32 +00:00
OnServerConnect ( netMsg . Connection ) ;
2020-12-02 18:40:38 +00:00
}
internal void OnServerDisconnectInternal ( QSBNetworkMessage netMsg )
{
if ( LogFilter . logDebug )
{
Debug . Log ( "NetworkManager:OnServerDisconnectInternal" ) ;
}
if ( m_MigrationManager ! = null )
{
m_MigrationManager . SendPeerInfo ( ) ;
}
2020-12-03 11:56:32 +00:00
OnServerDisconnect ( netMsg . Connection ) ;
2020-12-02 18:40:38 +00:00
}
internal void OnServerReadyMessageInternal ( QSBNetworkMessage netMsg )
{
if ( LogFilter . logDebug )
{
Debug . Log ( "NetworkManager:OnServerReadyMessageInternal" ) ;
}
2020-12-03 11:56:32 +00:00
OnServerReady ( netMsg . Connection ) ;
2020-12-02 18:40:38 +00:00
}
internal void OnServerAddPlayerMessageInternal ( QSBNetworkMessage netMsg )
{
if ( LogFilter . logDebug )
{
Debug . Log ( "NetworkManager:OnServerAddPlayerMessageInternal" ) ;
}
2020-12-04 09:23:27 +00:00
netMsg . ReadMessage < QSBAddPlayerMessage > ( s_AddPlayerMessage ) ;
2020-12-02 18:40:38 +00:00
if ( s_AddPlayerMessage . msgSize ! = 0 )
{
NetworkReader extraMessageReader = new NetworkReader ( s_AddPlayerMessage . msgData ) ;
2020-12-03 11:56:32 +00:00
this . OnServerAddPlayer ( netMsg . Connection , s_AddPlayerMessage . playerControllerId , extraMessageReader ) ;
2020-12-02 18:40:38 +00:00
}
else
{
2020-12-03 11:56:32 +00:00
this . OnServerAddPlayer ( netMsg . Connection , s_AddPlayerMessage . playerControllerId ) ;
2020-12-02 18:40:38 +00:00
}
if ( m_MigrationManager ! = null )
{
m_MigrationManager . SendPeerInfo ( ) ;
}
}
internal void OnServerRemovePlayerMessageInternal ( QSBNetworkMessage netMsg )
{
if ( LogFilter . logDebug )
{
Debug . Log ( "NetworkManager:OnServerRemovePlayerMessageInternal" ) ;
}
2020-12-04 09:23:27 +00:00
netMsg . ReadMessage < QSBRemovePlayerMessage > ( s_RemovePlayerMessage ) ;
2020-12-02 18:40:38 +00:00
QSBPlayerController player ;
2020-12-04 09:23:27 +00:00
netMsg . Connection . GetPlayerController ( s_RemovePlayerMessage . PlayerControllerId , out player ) ;
2020-12-03 11:56:32 +00:00
OnServerRemovePlayer ( netMsg . Connection , player ) ;
2020-12-04 09:23:27 +00:00
netMsg . Connection . RemovePlayerController ( s_RemovePlayerMessage . PlayerControllerId ) ;
2020-12-02 18:40:38 +00:00
if ( m_MigrationManager ! = null )
{
m_MigrationManager . SendPeerInfo ( ) ;
}
}
internal void OnServerErrorInternal ( QSBNetworkMessage netMsg )
{
if ( LogFilter . logDebug )
{
Debug . Log ( "NetworkManager:OnServerErrorInternal" ) ;
}
2020-12-04 09:23:27 +00:00
netMsg . ReadMessage < QSBErrorMessage > ( s_ErrorMessage ) ;
2020-12-03 11:56:32 +00:00
this . OnServerError ( netMsg . Connection , s_ErrorMessage . errorCode ) ;
2020-12-02 18:40:38 +00:00
}
internal void OnClientConnectInternal ( QSBNetworkMessage netMsg )
{
if ( LogFilter . logDebug )
{
Debug . Log ( "NetworkManager:OnClientConnectInternal" ) ;
}
2020-12-03 11:56:32 +00:00
netMsg . Connection . SetMaxDelay ( m_MaxDelay ) ;
2020-12-02 18:40:38 +00:00
string name = SceneManager . GetSceneAt ( 0 ) . name ;
if ( string . IsNullOrEmpty ( m_OnlineScene ) | | m_OnlineScene = = m_OfflineScene | | name = = m_OnlineScene )
{
m_ClientLoadedScene = false ;
2020-12-03 11:56:32 +00:00
OnClientConnect ( netMsg . Connection ) ;
2020-12-02 18:40:38 +00:00
}
else
{
2020-12-03 11:56:32 +00:00
s_ClientReadyConnection = netMsg . Connection ;
2020-12-02 18:40:38 +00:00
}
}
internal void OnClientDisconnectInternal ( QSBNetworkMessage netMsg )
{
if ( LogFilter . logDebug )
{
Debug . Log ( "NetworkManager:OnClientDisconnectInternal" ) ;
}
if ( m_MigrationManager ! = null )
{
2020-12-03 11:56:32 +00:00
if ( m_MigrationManager . LostHostOnClient ( netMsg . Connection ) )
2020-12-02 18:40:38 +00:00
{
return ;
}
}
if ( ! string . IsNullOrEmpty ( m_OfflineScene ) )
{
ClientChangeScene ( m_OfflineScene , false ) ;
}
if ( matchMaker ! = null & & matchInfo ! = null & & matchInfo . networkId ! = NetworkID . Invalid & & matchInfo . nodeId ! = NodeID . Invalid )
{
matchMaker . DropConnection ( matchInfo . networkId , matchInfo . nodeId , matchInfo . domain , new NetworkMatch . BasicResponseDelegate ( OnDropConnection ) ) ;
}
2020-12-03 11:56:32 +00:00
OnClientDisconnect ( netMsg . Connection ) ;
2020-12-02 18:40:38 +00:00
}
internal void OnClientNotReadyMessageInternal ( QSBNetworkMessage netMsg )
{
if ( LogFilter . logDebug )
{
Debug . Log ( "NetworkManager:OnClientNotReadyMessageInternal" ) ;
}
QSBClientScene . SetNotReady ( ) ;
2020-12-03 11:56:32 +00:00
OnClientNotReady ( netMsg . Connection ) ;
2020-12-02 18:40:38 +00:00
}
internal void OnClientErrorInternal ( QSBNetworkMessage netMsg )
{
if ( LogFilter . logDebug )
{
Debug . Log ( "NetworkManager:OnClientErrorInternal" ) ;
}
2020-12-04 09:23:27 +00:00
netMsg . ReadMessage < QSBErrorMessage > ( s_ErrorMessage ) ;
2020-12-03 11:56:32 +00:00
this . OnClientError ( netMsg . Connection , s_ErrorMessage . errorCode ) ;
2020-12-02 18:40:38 +00:00
}
internal void OnClientSceneInternal ( QSBNetworkMessage netMsg )
{
if ( LogFilter . logDebug )
{
Debug . Log ( "NetworkManager:OnClientSceneInternal" ) ;
}
2020-12-03 11:56:32 +00:00
string newSceneName = netMsg . Reader . ReadString ( ) ;
2020-12-02 18:40:38 +00:00
if ( IsClientConnected ( ) & & ! QSBNetworkServer . active )
{
ClientChangeScene ( newSceneName , true ) ;
}
}
public virtual void OnServerConnect ( QSBNetworkConnection conn )
{
}
public virtual void OnServerDisconnect ( QSBNetworkConnection conn )
{
QSBNetworkServer . DestroyPlayersForConnection ( conn ) ;
if ( conn . LastError ! = NetworkError . Ok )
{
if ( LogFilter . logError )
{
Debug . LogError ( "ServerDisconnected due to error: " + conn . LastError ) ;
}
}
}
public virtual void OnServerReady ( QSBNetworkConnection conn )
{
if ( conn . PlayerControllers . Count = = 0 )
{
if ( LogFilter . logDebug )
{
Debug . Log ( "Ready with no player object" ) ;
}
}
QSBNetworkServer . SetClientReady ( conn ) ;
}
public virtual void OnServerAddPlayer ( QSBNetworkConnection conn , short playerControllerId , NetworkReader extraMessageReader )
{
OnServerAddPlayerInternal ( conn , playerControllerId ) ;
}
public virtual void OnServerAddPlayer ( QSBNetworkConnection conn , short playerControllerId )
{
OnServerAddPlayerInternal ( conn , playerControllerId ) ;
}
private void OnServerAddPlayerInternal ( QSBNetworkConnection conn , short playerControllerId )
{
if ( m_PlayerPrefab = = null )
{
if ( LogFilter . logError )
{
2020-12-04 22:14:53 +00:00
ModConsole . OwmlConsole . WriteLine ( "Error - The PlayerPrefab is empty on the QSBNetworkManager. Please setup a PlayerPrefab object." ) ;
2020-12-02 18:40:38 +00:00
}
}
else if ( m_PlayerPrefab . GetComponent < QSBNetworkIdentity > ( ) = = null )
{
if ( LogFilter . logError )
{
2020-12-04 22:14:53 +00:00
ModConsole . OwmlConsole . WriteLine ( "Error - The PlayerPrefab does not have a QSBNetworkIdentity. Please add a QSBNetworkIdentity to the player prefab." ) ;
2020-12-02 18:40:38 +00:00
}
}
2020-12-03 11:56:32 +00:00
else if ( ( int ) playerControllerId < conn . PlayerControllers . Count & & conn . PlayerControllers [ ( int ) playerControllerId ] . IsValid & & conn . PlayerControllers [ ( int ) playerControllerId ] . Gameobject ! = null )
2020-12-02 18:40:38 +00:00
{
if ( LogFilter . logError )
{
2020-12-04 22:14:53 +00:00
ModConsole . OwmlConsole . WriteLine ( "Warning - There is already a player at that playerControllerId for this connections." ) ;
2020-12-02 18:40:38 +00:00
}
}
else
{
Transform startPosition = GetStartPosition ( ) ;
GameObject player ;
if ( startPosition ! = null )
{
player = Instantiate < GameObject > ( m_PlayerPrefab , startPosition . position , startPosition . rotation ) ;
}
else
{
player = Instantiate < GameObject > ( m_PlayerPrefab , Vector3 . zero , Quaternion . identity ) ;
}
QSBNetworkServer . AddPlayerForConnection ( conn , player , playerControllerId ) ;
}
}
public Transform GetStartPosition ( )
{
if ( s_StartPositions . Count > 0 )
{
for ( int i = s_StartPositions . Count - 1 ; i > = 0 ; i - - )
{
if ( s_StartPositions [ i ] = = null )
{
s_StartPositions . RemoveAt ( i ) ;
}
}
}
Transform result ;
if ( m_PlayerSpawnMethod = = PlayerSpawnMethod . Random & & s_StartPositions . Count > 0 )
{
int index = UnityEngine . Random . Range ( 0 , s_StartPositions . Count ) ;
result = s_StartPositions [ index ] ;
}
else if ( m_PlayerSpawnMethod = = PlayerSpawnMethod . RoundRobin & & s_StartPositions . Count > 0 )
{
if ( s_StartPositionIndex > = s_StartPositions . Count )
{
s_StartPositionIndex = 0 ;
}
Transform transform = s_StartPositions [ s_StartPositionIndex ] ;
s_StartPositionIndex + + ;
result = transform ;
}
else
{
result = null ;
}
return result ;
}
public virtual void OnServerRemovePlayer ( QSBNetworkConnection conn , QSBPlayerController player )
{
2020-12-03 11:56:32 +00:00
if ( player . Gameobject ! = null )
2020-12-02 18:40:38 +00:00
{
2020-12-03 11:56:32 +00:00
QSBNetworkServer . Destroy ( player . Gameobject ) ;
2020-12-02 18:40:38 +00:00
}
}
public virtual void OnServerError ( QSBNetworkConnection conn , int errorCode )
{
}
public virtual void OnServerSceneChanged ( string sceneName )
{
}
public virtual void OnClientConnect ( QSBNetworkConnection conn )
{
if ( ! clientLoadedScene )
{
QSBClientScene . Ready ( conn ) ;
if ( m_AutoCreatePlayer )
{
QSBClientScene . AddPlayer ( 0 ) ;
}
}
}
public virtual void OnClientDisconnect ( QSBNetworkConnection conn )
{
StopClient ( ) ;
if ( conn . LastError ! = NetworkError . Ok )
{
if ( LogFilter . logError )
{
Debug . LogError ( "ClientDisconnected due to error: " + conn . LastError ) ;
}
}
}
public virtual void OnClientError ( QSBNetworkConnection conn , int errorCode )
{
}
public virtual void OnClientNotReady ( QSBNetworkConnection conn )
{
}
public virtual void OnClientSceneChanged ( QSBNetworkConnection conn )
{
QSBClientScene . Ready ( conn ) ;
if ( m_AutoCreatePlayer )
{
bool flag = QSBClientScene . localPlayers . Count = = 0 ;
bool flag2 = false ;
for ( int i = 0 ; i < QSBClientScene . localPlayers . Count ; i + + )
{
2020-12-03 11:56:32 +00:00
if ( QSBClientScene . localPlayers [ i ] . Gameobject ! = null )
2020-12-02 18:40:38 +00:00
{
flag2 = true ;
break ;
}
}
if ( ! flag2 )
{
flag = true ;
}
if ( flag )
{
QSBClientScene . AddPlayer ( 0 ) ;
}
}
}
public void StartMatchMaker ( )
{
if ( LogFilter . logDebug )
{
Debug . Log ( "NetworkManager StartMatchMaker" ) ;
}
SetMatchHost ( m_MatchHost , m_MatchPort , m_MatchPort = = 443 ) ;
}
public void StopMatchMaker ( )
{
if ( matchMaker ! = null & & matchInfo ! = null & & matchInfo . networkId ! = NetworkID . Invalid & & matchInfo . nodeId ! = NodeID . Invalid )
{
matchMaker . DropConnection ( matchInfo . networkId , matchInfo . nodeId , matchInfo . domain , new NetworkMatch . BasicResponseDelegate ( OnDropConnection ) ) ;
}
if ( matchMaker ! = null )
{
Destroy ( matchMaker ) ;
matchMaker = null ;
}
matchInfo = null ;
matches = null ;
}
public void SetMatchHost ( string newHost , int port , bool https )
{
if ( matchMaker = = null )
{
matchMaker = base . gameObject . AddComponent < NetworkMatch > ( ) ;
}
if ( newHost = = "127.0.0.1" )
{
newHost = "localhost" ;
}
string text = "http://" ;
if ( https )
{
text = "https://" ;
}
if ( newHost . StartsWith ( "http://" ) )
{
newHost = newHost . Replace ( "http://" , "" ) ;
}
if ( newHost . StartsWith ( "https://" ) )
{
newHost = newHost . Replace ( "https://" , "" ) ;
}
m_MatchHost = newHost ;
m_MatchPort = port ;
string text2 = string . Concat ( new object [ ]
{
text ,
m_MatchHost ,
":" ,
m_MatchPort
} ) ;
if ( LogFilter . logDebug )
{
Debug . Log ( "SetMatchHost:" + text2 ) ;
}
matchMaker . baseUri = new Uri ( text2 ) ;
}
public virtual void OnStartHost ( )
{
}
public virtual void OnStartServer ( )
{
}
public virtual void OnStartClient ( QSBNetworkClient client )
{
}
public virtual void OnStopServer ( )
{
}
public virtual void OnStopClient ( )
{
}
public virtual void OnStopHost ( )
{
}
public virtual void OnMatchCreate ( bool success , string extendedInfo , MatchInfo matchInfo )
{
if ( LogFilter . logDebug )
{
Debug . LogFormat ( "NetworkManager OnMatchCreate Success:{0}, ExtendedInfo:{1}, matchInfo:{2}" , new object [ ]
{
success ,
extendedInfo ,
matchInfo
} ) ;
}
if ( success )
{
StartHost ( matchInfo ) ;
}
}
public virtual void OnMatchList ( bool success , string extendedInfo , List < MatchInfoSnapshot > matchList )
{
if ( LogFilter . logDebug )
{
Debug . LogFormat ( "NetworkManager OnMatchList Success:{0}, ExtendedInfo:{1}, matchList.Count:{2}" , new object [ ]
{
success ,
extendedInfo ,
matchList . Count
} ) ;
}
matches = matchList ;
}
public virtual void OnMatchJoined ( bool success , string extendedInfo , MatchInfo matchInfo )
{
if ( LogFilter . logDebug )
{
Debug . LogFormat ( "NetworkManager OnMatchJoined Success:{0}, ExtendedInfo:{1}, matchInfo:{2}" , new object [ ]
{
success ,
extendedInfo ,
matchInfo
} ) ;
}
if ( success )
{
StartClient ( matchInfo ) ;
}
}
public virtual void OnDestroyMatch ( bool success , string extendedInfo )
{
if ( LogFilter . logDebug )
{
Debug . LogFormat ( "NetworkManager OnDestroyMatch Success:{0}, ExtendedInfo:{1}" , new object [ ]
{
success ,
extendedInfo
} ) ;
}
}
public virtual void OnDropConnection ( bool success , string extendedInfo )
{
if ( LogFilter . logDebug )
{
Debug . LogFormat ( "NetworkManager OnDropConnection Success:{0}, ExtendedInfo:{1}" , new object [ ]
{
success ,
extendedInfo
} ) ;
}
}
public virtual void OnSetMatchAttributes ( bool success , string extendedInfo )
{
if ( LogFilter . logDebug )
{
Debug . LogFormat ( "NetworkManager OnSetMatchAttributes Success:{0}, ExtendedInfo:{1}" , new object [ ]
{
success ,
extendedInfo
} ) ;
}
}
[SerializeField]
private int m_NetworkPort = 7777 ;
[SerializeField]
private bool m_ServerBindToIP ;
[SerializeField]
private string m_ServerBindAddress = "" ;
[SerializeField]
private string m_NetworkAddress = "localhost" ;
[SerializeField]
private bool m_DontDestroyOnLoad = true ;
[SerializeField]
private bool m_RunInBackground = true ;
[SerializeField]
private bool m_ScriptCRCCheck = true ;
[SerializeField]
private float m_MaxDelay = 0.01f ;
[SerializeField]
private LogFilter . FilterLevel m_LogLevel = LogFilter . FilterLevel . Info ;
[SerializeField]
private GameObject m_PlayerPrefab ;
[SerializeField]
private bool m_AutoCreatePlayer = true ;
[SerializeField]
private PlayerSpawnMethod m_PlayerSpawnMethod ;
[SerializeField]
private string m_OfflineScene = "" ;
[SerializeField]
private string m_OnlineScene = "" ;
[SerializeField]
private List < GameObject > m_SpawnPrefabs = new List < GameObject > ( ) ;
[SerializeField]
private bool m_CustomConfig ;
[SerializeField]
private int m_MaxConnections = 4 ;
[SerializeField]
private ConnectionConfig m_ConnectionConfig ;
[SerializeField]
private GlobalConfig m_GlobalConfig ;
[SerializeField]
private List < QosType > m_Channels = new List < QosType > ( ) ;
[SerializeField]
private bool m_UseWebSockets ;
[SerializeField]
private bool m_UseSimulator ;
[SerializeField]
private int m_SimulatedLatency = 1 ;
[SerializeField]
private float m_PacketLossPercentage ;
[SerializeField]
private int m_MaxBufferedPackets = 16 ;
[SerializeField]
private bool m_AllowFragmentation = true ;
[SerializeField]
private string m_MatchHost = "mm.unet.unity3d.com" ;
[SerializeField]
private int m_MatchPort = 443 ;
[SerializeField]
public string matchName = "default" ;
[SerializeField]
public uint matchSize = 4 U ;
private QSBNetworkMigrationManager m_MigrationManager ;
private EndPoint m_EndPoint ;
private bool m_ClientLoadedScene ;
public static string networkSceneName = "" ;
public bool isNetworkActive ;
public QSBNetworkClient client ;
private static List < Transform > s_StartPositions = new List < Transform > ( ) ;
private static int s_StartPositionIndex ;
public MatchInfo matchInfo ;
public NetworkMatch matchMaker ;
public List < MatchInfoSnapshot > matches ;
public static QSBNetworkManagerUNET singleton ;
2020-12-04 09:23:27 +00:00
private static QSBAddPlayerMessage s_AddPlayerMessage = new QSBAddPlayerMessage ( ) ;
2020-12-02 18:40:38 +00:00
2020-12-04 09:23:27 +00:00
private static QSBRemovePlayerMessage s_RemovePlayerMessage = new QSBRemovePlayerMessage ( ) ;
2020-12-02 18:40:38 +00:00
2020-12-04 09:23:27 +00:00
private static QSBErrorMessage s_ErrorMessage = new QSBErrorMessage ( ) ;
2020-12-02 18:40:38 +00:00
private static AsyncOperation s_LoadingSceneAsync ;
private static QSBNetworkConnection s_ClientReadyConnection ;
private static string s_Address ;
}
2020-12-03 08:28:05 +00:00
}