Show why you were disconnected in the main menu; reset-world / reload-save make all players reconnect automatically
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
This commit is contained in:
+68
-1
@@ -541,8 +541,18 @@ namespace MSCO
|
||||
SetStatus("");
|
||||
}
|
||||
|
||||
// Letzter Server (für das automatische Neu-Verbinden nach reset-world)
|
||||
string lastServerHost, lastServerName;
|
||||
int lastServerPort, lastServerMax;
|
||||
string reconnectMessage; // gesetzt, wenn der Server uns neu verbinden lässt
|
||||
float reconnectAt;
|
||||
|
||||
void ConnectToServer(string host, int port, string displayName, int maxPlayers)
|
||||
{
|
||||
lastServerHost = host;
|
||||
lastServerPort = port;
|
||||
lastServerName = displayName;
|
||||
lastServerMax = maxPlayers;
|
||||
Join(host, port);
|
||||
if (session == null) return;
|
||||
connectingToServer = true;
|
||||
@@ -758,6 +768,18 @@ namespace MSCO
|
||||
UpdatePresence();
|
||||
|
||||
steam.Tick();
|
||||
|
||||
// Nach reset-world o.ä.: im Hauptmenü automatisch wieder mit demselben Server verbinden
|
||||
if (reconnectMessage != null && session == null && MenuHelper.InMenu && Time.realtimeSinceStartup >= reconnectAt)
|
||||
{
|
||||
string message = reconnectMessage;
|
||||
reconnectMessage = null;
|
||||
if (lastServerHost != null)
|
||||
{
|
||||
SetStatus(message);
|
||||
JoinServer(lastServerHost, lastServerPort, lastServerName, lastServerMax);
|
||||
}
|
||||
}
|
||||
if (pendingLobby.m_SteamID != 0 && MenuHelper.InMenu && session == null && steam.Init())
|
||||
{
|
||||
Steamworks.CSteamID lobbyToJoin = pendingLobby;
|
||||
@@ -832,8 +854,39 @@ namespace MSCO
|
||||
SetStatus(p.Name + " left (" + reason + ")");
|
||||
}
|
||||
|
||||
string serverReason; // Grund, den der Server/Host beim Trennen mitgeschickt hat
|
||||
|
||||
/// <summary>Warum man zuletzt getrennt wurde - wird im Hauptmenü angezeigt, bis man OK drückt.</summary>
|
||||
public string DisconnectNotice { get; private set; }
|
||||
public void ClearDisconnectNotice() { DisconnectNotice = null; }
|
||||
public bool IsReconnecting { get { return reconnectMessage != null && session == null; } }
|
||||
public string ReconnectMessage { get { return reconnectMessage; } }
|
||||
|
||||
/// <summary>Technische Gründe in verständliche Sätze übersetzen.</summary>
|
||||
static string FriendlyReason(string reason)
|
||||
{
|
||||
if (string.IsNullOrEmpty(reason)) return "The connection was closed.";
|
||||
string r = reason.ToLower();
|
||||
if (r.Contains("timed out") || r.Contains("timeout")) return "Connection lost - the server did not respond anymore (timeout).";
|
||||
if (r.Contains("network error") || r.Contains("forcibly closed") || r.Contains("connection reset"))
|
||||
return "Connection lost (" + reason + ").";
|
||||
if (r == "connection closed" || r.Contains("closed")) return "The server closed the connection.";
|
||||
if (r.Contains("host left")) return "The host left the game.";
|
||||
return reason;
|
||||
}
|
||||
|
||||
void OnSessionEnded(string reason)
|
||||
{
|
||||
// Hinweis fürs Hauptmenü - außer man hat selbst auf DISCONNECT gedrückt oder verbindet gleich neu
|
||||
if (reconnectMessage != null)
|
||||
{
|
||||
DisconnectNotice = null;
|
||||
reconnectAt = Time.realtimeSinceStartup + 3f; // erst ins Menü, dann neu verbinden
|
||||
}
|
||||
else if (reason != "Disconnected")
|
||||
DisconnectNotice = serverReason ?? FriendlyReason(reason);
|
||||
serverReason = null;
|
||||
|
||||
nextPresenceUpdate = 0f; // Discord sofort auf "In the Menus"/Singleplayer umstellen
|
||||
bool wasClientInGame = session != null && !session.IsHost && MenuHelper.InGame;
|
||||
|
||||
@@ -1003,9 +1056,13 @@ namespace MSCO
|
||||
}
|
||||
|
||||
case MsgType.Reject:
|
||||
session.Close((dedicated || connectingToServer ? "Rejected by server: " : "Rejected by host: ") + r.ReadString());
|
||||
{
|
||||
string why = r.ReadString();
|
||||
serverReason = why; // für den Hinweis im Hauptmenü (Kick, Ban, Server voll, Shutdown ...)
|
||||
session.Close((dedicated || connectingToServer ? "Rejected by server: " : "Rejected by host: ") + why);
|
||||
OnSessionEnded(session.CloseReason);
|
||||
break;
|
||||
}
|
||||
|
||||
case MsgType.WorldSnapshot:
|
||||
// Wird angewendet, sobald das Spiel geladen und alle Objekte erfasst sind
|
||||
@@ -1059,6 +1116,16 @@ namespace MSCO
|
||||
break;
|
||||
}
|
||||
|
||||
case MsgType.Reconnect:
|
||||
{
|
||||
// Server hat die Welt zurückgesetzt o.ä.: Meldung zeigen, ins Menü, dann automatisch neu verbinden
|
||||
reconnectMessage = r.ReadString();
|
||||
overlays.AddChat("", reconnectMessage, true);
|
||||
session.Close("Reconnecting");
|
||||
OnSessionEnded(session.CloseReason);
|
||||
return;
|
||||
}
|
||||
|
||||
case MsgType.AdminStatus:
|
||||
isAdmin = r.ReadBoolean();
|
||||
if (isAdmin) overlays.Log("You are an admin on this server - type /admin in chat or 'admin' here.");
|
||||
|
||||
Reference in New Issue
Block a user