refactored UDP audio sender and receiver scripts to maintain last known peer IP during connection loss, improved logging for audio clip monitoring and peer discovery status
This commit is contained in:
@ -39,6 +39,7 @@ namespace Convai.Scripts.Runtime.Multiplayer
|
||||
private byte _peerPlayerID = 0;
|
||||
private DateTime _lastPeerPacketTime;
|
||||
private ConnectionState _connectionState = ConnectionState.Disconnected;
|
||||
private bool _hasEverConnected = false; // Track if we've connected this session
|
||||
|
||||
// Discovery protocol constants
|
||||
private const uint DISCOVERY_MAGIC = 0x44495343; // "DISC" in hex
|
||||
@ -98,6 +99,8 @@ namespace Convai.Scripts.Runtime.Multiplayer
|
||||
}
|
||||
|
||||
_cancellationTokenSource = new CancellationTokenSource();
|
||||
|
||||
// Always start with discovery on game launch (IP addresses may have changed)
|
||||
LogEvent($"🔍 Discovery started (Player {localPlayerID})");
|
||||
StartDiscovery();
|
||||
}
|
||||
@ -200,8 +203,9 @@ namespace Convai.Scripts.Runtime.Multiplayer
|
||||
{
|
||||
try
|
||||
{
|
||||
// Only broadcast if we're still discovering
|
||||
if (_connectionState == ConnectionState.Discovering || _connectionState == ConnectionState.Lost)
|
||||
// Only broadcast if we're discovering AND haven't connected yet this session
|
||||
// Once connected, we remember the peer IP for this session
|
||||
if (_connectionState == ConnectionState.Discovering && !_hasEverConnected)
|
||||
{
|
||||
await SendDiscoveryRequest();
|
||||
}
|
||||
@ -227,8 +231,10 @@ namespace Convai.Scripts.Runtime.Multiplayer
|
||||
{
|
||||
await Task.Delay((int)(heartbeatInterval * 1000), cancellationToken);
|
||||
|
||||
// Only send heartbeat if connected
|
||||
if (_connectionState == ConnectionState.Connected && !string.IsNullOrEmpty(_peerIP))
|
||||
// Send heartbeat if we have a peer IP (Connected or Lost state)
|
||||
// This allows automatic reconnection when peer comes back online
|
||||
if (!string.IsNullOrEmpty(_peerIP) &&
|
||||
(_connectionState == ConnectionState.Connected || _connectionState == ConnectionState.Lost || _connectionState == ConnectionState.Discovering))
|
||||
{
|
||||
await SendHeartbeat();
|
||||
}
|
||||
@ -382,13 +388,20 @@ namespace Convai.Scripts.Runtime.Multiplayer
|
||||
|
||||
case PACKET_TYPE_HEARTBEAT:
|
||||
// Heartbeat keeps connection alive
|
||||
if (_connectionState == ConnectionState.Connected && _peerIP == senderIP)
|
||||
if (_peerIP == senderIP)
|
||||
{
|
||||
// Connection still alive
|
||||
// Same peer - update timestamp and reconnect if we were in Lost state
|
||||
if (_connectionState == ConnectionState.Lost || _connectionState == ConnectionState.Discovering)
|
||||
{
|
||||
// Reconnected to known peer
|
||||
SetConnectionState(ConnectionState.Connected);
|
||||
ConvaiLogger.Info($"🔄 Reconnected to peer Player {senderPlayerID} at {senderIP}", ConvaiLogger.LogCategory.Character);
|
||||
LogEvent($"🔄 Reconnected to peer Player {senderPlayerID}");
|
||||
}
|
||||
}
|
||||
else if (_connectionState != ConnectionState.Connected)
|
||||
{
|
||||
// Reconnected
|
||||
// Different peer IP than expected - this is a new peer
|
||||
HandlePeerDiscovered(senderIP, senderPlayerID);
|
||||
}
|
||||
break;
|
||||
@ -405,10 +418,11 @@ namespace Convai.Scripts.Runtime.Multiplayer
|
||||
_peerIP = peerIP;
|
||||
_peerPlayerID = peerPlayerID;
|
||||
_lastPeerPacketTime = DateTime.UtcNow;
|
||||
_hasEverConnected = true; // Mark that we've connected this session
|
||||
|
||||
SetConnectionState(ConnectionState.Connected);
|
||||
|
||||
ConvaiLogger.Info($"✅ Peer discovered! Player {peerPlayerID} at {peerIP}", ConvaiLogger.LogCategory.Character);
|
||||
ConvaiLogger.Info($"✅ Peer discovered! Player {peerPlayerID} at {peerIP} (will remember for this session)", ConvaiLogger.LogCategory.Character);
|
||||
LogEvent($"✅ Peer discovered! Player {peerPlayerID} at {peerIP}");
|
||||
|
||||
// Notify listeners
|
||||
@ -417,20 +431,18 @@ namespace Convai.Scripts.Runtime.Multiplayer
|
||||
|
||||
private void HandlePeerLost()
|
||||
{
|
||||
ConvaiLogger.Warn($"⚠️ Peer connection lost (Player {_peerPlayerID} at {_peerIP})", ConvaiLogger.LogCategory.Character);
|
||||
LogEvent($"⚠️ Peer connection lost (Player {_peerPlayerID})");
|
||||
|
||||
string lostPeerIP = _peerIP;
|
||||
_peerIP = "";
|
||||
_peerPlayerID = 0;
|
||||
ConvaiLogger.Warn($"⚠️ Peer connection lost (Player {_peerPlayerID} at {_peerIP}) - will keep trying to reconnect", ConvaiLogger.LogCategory.Character);
|
||||
LogEvent($"⚠️ Peer connection lost (Player {_peerPlayerID}) - reconnecting...");
|
||||
|
||||
SetConnectionState(ConnectionState.Lost);
|
||||
|
||||
// Notify listeners
|
||||
OnPeerLost?.Invoke();
|
||||
|
||||
// Restart discovery
|
||||
SetConnectionState(ConnectionState.Discovering);
|
||||
// Don't clear peer IP - keep it and keep trying to reconnect
|
||||
// The heartbeat system will continue sending packets to the known peer
|
||||
// and will automatically reconnect when the peer comes back online
|
||||
ConvaiLogger.Info($"🔄 Will continue sending heartbeats to {_peerIP}", ConvaiLogger.LogCategory.Character);
|
||||
}
|
||||
|
||||
private void SetConnectionState(ConnectionState newState)
|
||||
@ -452,8 +464,11 @@ namespace Convai.Scripts.Runtime.Multiplayer
|
||||
{
|
||||
ConvaiLogger.Info("Manually restarting peer discovery", ConvaiLogger.LogCategory.Character);
|
||||
LogEvent("🔄 Manually restarting discovery");
|
||||
|
||||
// Reset state
|
||||
_peerIP = "";
|
||||
_peerPlayerID = 0;
|
||||
_hasEverConnected = false;
|
||||
SetConnectionState(ConnectionState.Discovering);
|
||||
}
|
||||
|
||||
@ -465,6 +480,7 @@ namespace Convai.Scripts.Runtime.Multiplayer
|
||||
ConvaiLogger.Info($"Peer IP: {(_peerIP ?? "None")}", ConvaiLogger.LogCategory.Character);
|
||||
ConvaiLogger.Info($"Peer Player ID: {_peerPlayerID}", ConvaiLogger.LogCategory.Character);
|
||||
ConvaiLogger.Info($"Listen Port: {_listenPort}", ConvaiLogger.LogCategory.Character);
|
||||
ConvaiLogger.Info($"Has Ever Connected This Session: {_hasEverConnected}", ConvaiLogger.LogCategory.Character);
|
||||
}
|
||||
|
||||
private void LogEvent(string message)
|
||||
|
||||
Reference in New Issue
Block a user