diff --git a/QSB/Ghostbuster.cs b/QSB/Ghostbuster.cs new file mode 100644 index 00000000..e1d9483c --- /dev/null +++ b/QSB/Ghostbuster.cs @@ -0,0 +1,66 @@ +using Mirror; +using QSB.Player; +using QSB.Utility; +using System.Collections.Generic; +using UnityEngine; + +namespace QSB; +internal class Ghostbuster : MonoBehaviour, IAddComponentOnStart +{ + private const int UpdateInterval = 60; + + private int _updateCount; + + public void Update() + { + if (!QSBCore.IsInMultiplayer) + { + return; + } + + if (!QSBCore.IsHost) + { + return; + } + + if (_updateCount != UpdateInterval) + { + _updateCount++; + return; + } + else + { + _updateCount = 0; + } + + var _ghostPlayers = new List(); + + foreach (var player in QSBPlayerManager.PlayerList) + { + var isGhost = false; + + var networkIdentity = player.TransformSync.netIdentity; + + if (networkIdentity.connectionToClient == null) + { + isGhost = true; + } + else if (!NetworkServer.connections.ContainsValue(networkIdentity.connectionToClient)) + { + isGhost = true; + } + + if (isGhost) + { + // WE GOT ONE!!!!!! + _ghostPlayers.Add(player); + } + } + + foreach (var item in _ghostPlayers) + { + DebugLog.ToConsole($"Deleting playerId:{item.PlayerId} - It's a ghooOoOoOooost! (hopefully)", OWML.Common.MessageType.Info); + NetworkServer.DestroyPlayerForConnection(item.TransformSync.netIdentity.connectionToClient); + } + } +} diff --git a/QSB/QSBNetworkManager.cs b/QSB/QSBNetworkManager.cs index 9d920dbf..0d7ebe2d 100644 --- a/QSB/QSBNetworkManager.cs +++ b/QSB/QSBNetworkManager.cs @@ -260,6 +260,8 @@ public class QSBNetworkManager : NetworkManager, IAddComponentOnStart public override void OnServerAddPlayer(NetworkConnectionToClient connection) // Called on the server when a client joins { + connection.Disconnect(); + DebugLog.DebugWrite("OnServerAddPlayer", MessageType.Info); base.OnServerAddPlayer(connection); diff --git a/QSB/Utility/Extensions.cs b/QSB/Utility/Extensions.cs index 0b1488c5..41d4e8c7 100644 --- a/QSB/Utility/Extensions.cs +++ b/QSB/Utility/Extensions.cs @@ -1,6 +1,7 @@ using Cysharp.Threading.Tasks; using Mirror; using OWML.Common; +using QSB.Player; using System; using System.Collections.Generic; using System.Linq; @@ -40,10 +41,10 @@ public static class Extensions public static uint GetPlayerId(this NetworkConnectionToClient conn) { - if (!conn.identity) + if (conn.identity == null) { // wtf - DebugLog.ToConsole($"Error - GetPlayerId on {conn} has no identity\n{Environment.StackTrace}", MessageType.Error); + DebugLog.ToConsole($"Error - GetPlayerId on {conn} has no identity.", MessageType.Error); return uint.MaxValue; }