diff --git a/src/Impostor.Api/Net/Messages/S2C/Message01JoinGameS2C.cs b/src/Impostor.Api/Net/Messages/S2C/Message01JoinGameS2C.cs
index 6bd38c94..902bd666 100644
--- a/src/Impostor.Api/Net/Messages/S2C/Message01JoinGameS2C.cs
+++ b/src/Impostor.Api/Net/Messages/S2C/Message01JoinGameS2C.cs
@@ -22,6 +22,7 @@ namespace Impostor.Api.Net.Messages.S2C
writer.EndMessage();
}
+ [Obsolete("JoinGame errors are no longer used by 2021.11.9 and up, disconnect clients instead.")]
public static void SerializeError(IMessageWriter writer, bool clear, DisconnectReason reason, string? message = null)
{
if (clear)
diff --git a/src/Impostor.Server/Extensions/IHazelConnectionExtensions.cs b/src/Impostor.Server/Extensions/IHazelConnectionExtensions.cs
new file mode 100644
index 00000000..d46e3704
--- /dev/null
+++ b/src/Impostor.Server/Extensions/IHazelConnectionExtensions.cs
@@ -0,0 +1,30 @@
+using System.Threading.Tasks;
+using Impostor.Api.Innersloth;
+using Impostor.Api.Net;
+using Impostor.Api.Net.Messages.S2C;
+using Impostor.Hazel;
+
+namespace Impostor.Server
+{
+ public static class IHazelConnectionExtensions
+ {
+ ///
+ /// Disconnect a connection using a custom message.
+ ///
+ /// The connection to disconnect.
+ /// The message to disconnect with.
+ /// Task that should be awaited to ensure disconnection.
+ public static async ValueTask CustomDisconnectAsync(this IHazelConnection connection, string message)
+ {
+ if (!connection.IsConnected)
+ {
+ return;
+ }
+
+ using var writer = MessageWriter.Get();
+ MessageDisconnect.Serialize(writer, true, DisconnectReason.Custom, message);
+
+ await connection.DisconnectAsync(DisconnectReason.Custom.ToString(), writer);
+ }
+ }
+}
diff --git a/src/Impostor.Server/Net/ClientBase.cs b/src/Impostor.Server/Net/ClientBase.cs
index 74224fcc..15dfe919 100644
--- a/src/Impostor.Server/Net/ClientBase.cs
+++ b/src/Impostor.Server/Net/ClientBase.cs
@@ -5,8 +5,6 @@ using Impostor.Api;
using Impostor.Api.Innersloth;
using Impostor.Api.Net;
using Impostor.Api.Net.Messages;
-using Impostor.Api.Net.Messages.S2C;
-using Impostor.Hazel;
using Impostor.Server.Net.State;
namespace Impostor.Server.Net
@@ -55,15 +53,7 @@ namespace Impostor.Server.Net
public async ValueTask DisconnectAsync(DisconnectReason reason, string? message = null)
{
- if (!Connection.IsConnected)
- {
- return;
- }
-
- using var writer = MessageWriter.Get();
- MessageDisconnect.Serialize(writer, true, reason, message);
-
- await Connection.DisconnectAsync(message ?? reason.ToString(), writer);
+ await Connection.CustomDisconnectAsync(message ?? reason.ToString());
}
}
}
diff --git a/src/Impostor.Server/Net/Manager/ClientManager.cs b/src/Impostor.Server/Net/Manager/ClientManager.cs
index a4ab5cc0..94426bf2 100644
--- a/src/Impostor.Server/Net/Manager/ClientManager.cs
+++ b/src/Impostor.Server/Net/Manager/ClientManager.cs
@@ -8,7 +8,6 @@ using Impostor.Api.Events.Managers;
using Impostor.Api.Innersloth;
using Impostor.Api.Net;
using Impostor.Api.Net.Messages;
-using Impostor.Api.Net.Messages.S2C;
using Impostor.Hazel;
using Impostor.Server.Config;
using Impostor.Server.Events.Client;
@@ -85,25 +84,19 @@ namespace Impostor.Server.Net.Manager
_ => throw new ArgumentOutOfRangeException(),
};
- Message01JoinGameS2C.SerializeError(packet, false, DisconnectReason.Custom, message);
-
- await connection.SendAsync(packet);
+ await connection.CustomDisconnectAsync(message);
return;
}
if (name.Length > 10)
{
- using var packet = MessageWriter.Get(MessageType.Reliable);
- Message01JoinGameS2C.SerializeError(packet, false, DisconnectReason.Custom, DisconnectMessages.UsernameLength);
- await connection.SendAsync(packet);
+ await connection.CustomDisconnectAsync(DisconnectMessages.UsernameLength);
return;
}
if (string.IsNullOrWhiteSpace(name))
{
- using var packet = MessageWriter.Get(MessageType.Reliable);
- Message01JoinGameS2C.SerializeError(packet, false, DisconnectReason.Custom, DisconnectMessages.UsernameIllegalCharacters);
- await connection.SendAsync(packet);
+ await connection.CustomDisconnectAsync(DisconnectMessages.UsernameIllegalCharacters);
return;
}
diff --git a/src/Impostor.Server/Net/Redirector/ClientRedirector.cs b/src/Impostor.Server/Net/Redirector/ClientRedirector.cs
index a96ca733..f463abb6 100644
--- a/src/Impostor.Server/Net/Redirector/ClientRedirector.cs
+++ b/src/Impostor.Server/Net/Redirector/ClientRedirector.cs
@@ -56,27 +56,25 @@ namespace Impostor.Server.Net.Redirector
{
Message01JoinGameC2S.Deserialize(reader, out var gameCode);
- using var packet = MessageWriter.Get(MessageType.Reliable);
var endpoint = await _nodeLocator.FindAsync(gameCode);
if (endpoint == null)
{
- Message01JoinGameS2C.SerializeError(packet, false, DisconnectReason.GameMissing);
+ await DisconnectAsync(DisconnectReason.GameMissing);
}
else
{
+ using var packet = MessageWriter.Get(MessageType.Reliable);
Message13RedirectS2C.Serialize(packet, false, endpoint);
+ await Connection.SendAsync(packet);
}
- await Connection.SendAsync(packet);
break;
}
case MessageFlags.GetGameListV2:
{
// TODO: Implement.
- using var packet = MessageWriter.Get(MessageType.Reliable);
- Message01JoinGameS2C.SerializeError(packet, false, DisconnectReason.Custom, DisconnectMessages.NotImplemented);
- await Connection.SendAsync(packet);
+ await DisconnectAsync(DisconnectReason.Custom, DisconnectMessages.NotImplemented);
break;
}
diff --git a/src/Impostor.Server/Net/State/Game.Data.cs b/src/Impostor.Server/Net/State/Game.Data.cs
index d6d87bf2..26f2e5b9 100644
--- a/src/Impostor.Server/Net/State/Game.Data.cs
+++ b/src/Impostor.Server/Net/State/Game.Data.cs
@@ -382,7 +382,6 @@ namespace Impostor.Server.Net.State
case InnerPlayerControl control:
{
- if (GameState != GameStates.Started)
if (GameState != GameStates.Started && GameState != GameStates.Starting)
{
GameNet.GameData?.RemovePlayer(control);