238 lines
9.6 KiB
C#
238 lines
9.6 KiB
C#
using UnityEngine;
|
|
using Unity.Netcode;
|
|
using Unity.Netcode.Transports.UTP;
|
|
using System.Net.Sockets;
|
|
using System.Net;
|
|
|
|
namespace Northbound
|
|
{
|
|
/// <summary>
|
|
/// Completely restarts network to fix stuck/closed port issues
|
|
/// </summary>
|
|
public class NetworkResetAndRestart : MonoBehaviour
|
|
{
|
|
[Header("Reset Settings")]
|
|
[SerializeField] private bool autoResetOnStart = false;
|
|
[SerializeField] private ushort targetPort = 40445;
|
|
|
|
private NetworkManager _networkManager;
|
|
private UnityTransport _transport;
|
|
|
|
private void Start()
|
|
{
|
|
if (autoResetOnStart)
|
|
{
|
|
StartCoroutine(DoResetAndRestart());
|
|
}
|
|
}
|
|
|
|
[ContextMenu("Reset Network and Restart Host")]
|
|
public void ExecuteResetAndRestart()
|
|
{
|
|
StartCoroutine(DoResetAndRestart());
|
|
}
|
|
|
|
private System.Collections.IEnumerator DoResetAndRestart()
|
|
{
|
|
Debug.Log("<color=yellow>=== NETWORK RESET AND RESTART ===</color>");
|
|
|
|
// Step 1: Get references
|
|
_networkManager = NetworkManager.Singleton;
|
|
if (_networkManager == null)
|
|
{
|
|
Debug.LogError("<color=red>[NetworkReset] NetworkManager not found!</color>");
|
|
yield break;
|
|
}
|
|
|
|
_transport = _networkManager.GetComponent<UnityTransport>();
|
|
if (_transport == null)
|
|
{
|
|
Debug.LogError("<color=red>[NetworkReset] UnityTransport not found!</color>");
|
|
yield break;
|
|
}
|
|
|
|
// Step 2: Log current state
|
|
LogCurrentState();
|
|
|
|
// Step 3: Shutdown if running
|
|
if (_networkManager.IsServer || _networkManager.IsClient)
|
|
{
|
|
Debug.Log("<color=yellow>[NetworkReset] Shutting down current network...</color>");
|
|
_networkManager.Shutdown();
|
|
|
|
// Wait for complete shutdown
|
|
float startTime = Time.time;
|
|
while ((_networkManager.IsServer || _networkManager.IsClient) && Time.time - startTime < 10f)
|
|
{
|
|
yield return new WaitForSeconds(0.1f);
|
|
}
|
|
|
|
Debug.Log("<color=green>[NetworkReset] ✓ Network shutdown complete</color>");
|
|
}
|
|
|
|
yield return new WaitForSeconds(1f);
|
|
|
|
// Step 4: Force port release
|
|
ForcePortRelease();
|
|
|
|
yield return new WaitForSeconds(1f);
|
|
|
|
// Step 5: Reconfigure transport
|
|
Debug.Log("<color=cyan>[NetworkReset] Reconfiguring transport...</color>");
|
|
_transport.SetConnectionData(
|
|
"0.0.0.0", // Listen on all interfaces
|
|
targetPort, // Port 40445
|
|
"0.0.0.0" // Server listen on all interfaces
|
|
);
|
|
|
|
Debug.Log("<color=green>[NetworkReset] ✓ Transport configured to 0.0.0.0:" + targetPort + "</color>");
|
|
Debug.Log("<color=green>[NetworkReset] ✓ Server will accept connections from ANY IP</color>");
|
|
|
|
yield return new WaitForSeconds(0.5f);
|
|
|
|
// Step 6: Start host
|
|
Debug.Log("<color=cyan>[NetworkReset] Starting fresh host...</color>");
|
|
_networkManager.StartHost();
|
|
|
|
// Wait for host to start
|
|
float hostStartTime = Time.time;
|
|
while (!_networkManager.IsServer && Time.time - hostStartTime < 10f)
|
|
{
|
|
yield return new WaitForSeconds(0.2f);
|
|
}
|
|
|
|
if (_networkManager.IsServer)
|
|
{
|
|
Debug.Log("<color=green>[NetworkReset] ✓ Host started successfully!</color>");
|
|
|
|
// Verify port is actually listening
|
|
yield return new WaitForSeconds(1f);
|
|
VerifyPortListening();
|
|
}
|
|
else
|
|
{
|
|
Debug.LogError("<color=red>[NetworkReset] ✗ Failed to start host!</color>");
|
|
}
|
|
|
|
Debug.Log("<color=green>=== RESET AND RESTART COMPLETE ===</color>");
|
|
}
|
|
|
|
private void LogCurrentState()
|
|
{
|
|
Debug.Log("<color=cyan>[NetworkReset] Current Network State:</color>");
|
|
Debug.Log(" IsServer: " + _networkManager.IsServer);
|
|
Debug.Log(" IsClient: " + _networkManager.IsClient);
|
|
Debug.Log(" IsHost: " + _networkManager.IsHost);
|
|
Debug.Log(" IsConnectedClient: " + _networkManager.IsConnectedClient);
|
|
Debug.Log(" LocalClientId: " + _networkManager.LocalClientId);
|
|
Debug.Log(" ConnectedClients: " + _networkManager.ConnectedClients.Count);
|
|
|
|
if (_transport != null)
|
|
{
|
|
Debug.Log(" Transport.Port: " + _transport.ConnectionData.Port);
|
|
Debug.Log(" Transport.Address: " + _transport.ConnectionData.Address);
|
|
}
|
|
}
|
|
|
|
private void ForcePortRelease()
|
|
{
|
|
Debug.Log("<color=cyan>[NetworkReset] Forcing port release...</color>");
|
|
|
|
try
|
|
{
|
|
// Try to bind and release port to ensure it's freed
|
|
TcpListener testListener = new TcpListener(IPAddress.Any, targetPort);
|
|
testListener.Start();
|
|
testListener.Stop();
|
|
|
|
Debug.Log("<color=green>[NetworkReset] ✓ Port " + targetPort + " is released</color>");
|
|
}
|
|
catch (System.Exception e)
|
|
{
|
|
Debug.LogWarning("<color=yellow>[NetworkReset] ⚠ Could not bind port for release: " + e.Message + "</color>");
|
|
Debug.LogWarning("[NetworkReset] This is normal if port is in use");
|
|
}
|
|
}
|
|
|
|
private void VerifyPortListening()
|
|
{
|
|
Debug.Log("<color=cyan>[NetworkReset] Verifying port is listening...</color>");
|
|
|
|
try
|
|
{
|
|
using (TcpClient client = new TcpClient("127.0.0.1", targetPort))
|
|
{
|
|
Debug.Log("<color=green>[NetworkReset] ✓ Successfully connected to localhost:" + targetPort + "</color>");
|
|
Debug.Log("<color=green>[NetworkReset] ✓ Unity IS listening on port</color>");
|
|
Debug.Log("<color=green>[NetworkReset] ✓ Port should now be accessible on yougetsignal</color>");
|
|
Debug.Log("");
|
|
Debug.Log("<color=green>[NetworkReset] ✓ TEST ON YOUGETSIGNAL NOW!</color>");
|
|
}
|
|
}
|
|
catch (System.Exception e)
|
|
{
|
|
Debug.LogWarning("<color=yellow>[NetworkReset] ⚠ Could not connect to localhost:" + targetPort + "</color>");
|
|
Debug.LogWarning("[NetworkReset] Error: " + e.Message);
|
|
Debug.LogWarning("[NetworkReset] This might mean server didn't actually start");
|
|
}
|
|
}
|
|
|
|
[ContextMenu("Check Current Network Status")]
|
|
public void CheckStatus()
|
|
{
|
|
_networkManager = NetworkManager.Singleton;
|
|
if (_networkManager == null)
|
|
{
|
|
Debug.LogError("NetworkManager not found");
|
|
return;
|
|
}
|
|
|
|
Debug.Log("=== NETWORK STATUS ===");
|
|
Debug.Log("IsServer: " + _networkManager.IsServer);
|
|
Debug.Log("IsClient: " + _networkManager.IsClient);
|
|
Debug.Log("IsHost: " + _networkManager.IsHost);
|
|
Debug.Log("IsConnectedClient: " + _networkManager.IsConnectedClient);
|
|
Debug.Log("LocalClientId: " + _networkManager.LocalClientId);
|
|
Debug.Log("ConnectedClients: " + _networkManager.ConnectedClients.Count);
|
|
|
|
foreach (var client in _networkManager.ConnectedClients)
|
|
{
|
|
Debug.Log(" Client " + client.Key + ": " +
|
|
(client.Value.PlayerObject != null ? "Has Player" : "No Player"));
|
|
}
|
|
|
|
Debug.Log("===================");
|
|
}
|
|
|
|
[ContextMenu("Generate Instructions")]
|
|
public void GenerateInstructions()
|
|
{
|
|
Debug.Log("=== NETWORK RESET INSTRUCTIONS ===");
|
|
Debug.Log("");
|
|
Debug.Log("PROBLEM:");
|
|
Debug.Log("- Port stays closed even though config is correct");
|
|
Debug.Log("- Server reports running but port not accessible");
|
|
Debug.Log("");
|
|
Debug.Log("SOLUTION: Complete network reset");
|
|
Debug.Log("");
|
|
Debug.Log("STEPS:");
|
|
Debug.Log("1. Add NetworkResetAndRestart to scene");
|
|
Debug.Log("2. Right-click → 'Reset Network and Restart Host'");
|
|
Debug.Log("3. Wait for '✓ Host started successfully'");
|
|
Debug.Log("4. Test on yougetsignal IMMEDIATELY");
|
|
Debug.Log("");
|
|
Debug.Log("WHAT IT DOES:");
|
|
Debug.Log("1. Shuts down any current network");
|
|
Debug.Log("2. Forces port release");
|
|
Debug.Log("3. Reconfigures transport to 0.0.0.0");
|
|
Debug.Log("4. Starts fresh host");
|
|
Debug.Log("5. Verifies port is actually listening");
|
|
Debug.Log("");
|
|
Debug.Log("EXPECTED RESULT:");
|
|
Debug.Log("✓ Port 40445 shows OPEN on yougetsignal");
|
|
Debug.Log("✓ Teammates can connect");
|
|
Debug.Log("===============================");
|
|
}
|
|
}
|
|
}
|