Merge pull request #262 from misternebula/version-check

Version check
This commit is contained in:
_nebula 2021-03-09 16:47:01 +00:00 committed by GitHub
commit 5723f3a237
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
17 changed files with 94 additions and 23 deletions

View File

@ -54,5 +54,6 @@
public static string QSBSocketItem = "QSBSocketItem"; public static string QSBSocketItem = "QSBSocketItem";
public static string QSBMoveToCarry = "QSBMoveToCarry"; public static string QSBMoveToCarry = "QSBMoveToCarry";
public static string QSBStartStatue = "QSBStartStatue"; public static string QSBStartStatue = "QSBStartStatue";
public static string QSBPlayerKick = "QSBPlayerKick";
} }
} }

View File

@ -38,6 +38,7 @@
DropItem, DropItem,
SocketItem, SocketItem,
MoveToCarry, MoveToCarry,
StartStatue StartStatue,
PlayerKick
} }
} }

View File

@ -79,7 +79,7 @@ namespace QSB.Events
} }
if (message.FromId == QSBPlayerManager.LocalPlayerId || if (message.FromId == QSBPlayerManager.LocalPlayerId ||
QSBPlayerManager.IsBelongingToLocalPlayer(message.AboutId)) QSBPlayerManager.IsBelongingToLocalPlayer(message.FromId))
{ {
OnReceiveLocal(QNetworkServer.active, message); OnReceiveLocal(QNetworkServer.active, message);
return; return;

View File

@ -46,6 +46,7 @@ namespace QSB.Events
new CrouchEvent(), new CrouchEvent(),
new ServerTimeEvent(), new ServerTimeEvent(),
new PlayerEntangledEvent(), new PlayerEntangledEvent(),
new PlayerKickEvent(),
// World Objects // World Objects
new ElevatorEvent(), new ElevatorEvent(),
new GeyserEvent(), new GeyserEvent(),

View File

@ -50,7 +50,7 @@ namespace QSB.OrbSync.Events
private static void HandleServer(WorldObjectMessage message) private static void HandleServer(WorldObjectMessage message)
{ {
var fromPlayer = QNetworkServer.connections.First(x => x.GetPlayer().PlayerId == message.FromId); var fromPlayer = QNetworkServer.connections.First(x => x.GetPlayerId() == message.FromId);
if (QSBWorldSync.OrbSyncList.Count == 0) if (QSBWorldSync.OrbSyncList.Count == 0)
{ {
DebugLog.ToConsole($"Error - OrbSyncList is empty. (ID {message.ObjectId})", MessageType.Error); DebugLog.ToConsole($"Error - OrbSyncList is empty. (ID {message.ObjectId})", MessageType.Error);

View File

@ -16,11 +16,18 @@ namespace QSB.Player.Events
private PlayerJoinMessage CreateMessage(string name) => new PlayerJoinMessage private PlayerJoinMessage CreateMessage(string name) => new PlayerJoinMessage
{ {
AboutId = LocalPlayerId, AboutId = LocalPlayerId,
PlayerName = name PlayerName = name,
QSBVersion = QSBCore.QSBVersion
}; };
public override void OnReceiveRemote(bool server, PlayerJoinMessage message) public override void OnReceiveRemote(bool server, PlayerJoinMessage message)
{ {
if (server && (message.QSBVersion != QSBCore.QSBVersion))
{
DebugLog.DebugWrite($"Error - Client {message.PlayerName} connecting with wrong version. (Client:{message.QSBVersion}, Server:{QSBCore.QSBVersion})", MessageType.Error);
QSBEventManager.FireEvent(EventNames.QSBPlayerKick, message.AboutId, KickReason.VersionNotMatching);
return;
}
var player = QSBPlayerManager.GetPlayer(message.AboutId); var player = QSBPlayerManager.GetPlayer(message.AboutId);
player.Name = message.PlayerName; player.Name = message.PlayerName;
DebugLog.ToAll($"{player.Name} joined!", MessageType.Info); DebugLog.ToAll($"{player.Name} joined!", MessageType.Info);

View File

@ -6,17 +6,20 @@ namespace QSB.Player.Events
public class PlayerJoinMessage : PlayerMessage public class PlayerJoinMessage : PlayerMessage
{ {
public string PlayerName { get; set; } public string PlayerName { get; set; }
public string QSBVersion { get; set; }
public override void Deserialize(QNetworkReader reader) public override void Deserialize(QNetworkReader reader)
{ {
base.Deserialize(reader); base.Deserialize(reader);
PlayerName = reader.ReadString(); PlayerName = reader.ReadString();
QSBVersion = reader.ReadString();
} }
public override void Serialize(QNetworkWriter writer) public override void Serialize(QNetworkWriter writer)
{ {
base.Serialize(writer); base.Serialize(writer);
writer.Write(PlayerName); writer.Write(PlayerName);
writer.Write(QSBVersion);
} }
} }
} }

View File

@ -0,0 +1,51 @@
using QSB.Events;
using QSB.Messaging;
using QSB.Utility;
using QuantumUNET;
using System.Linq;
namespace QSB.Player.Events
{
internal class PlayerKickEvent : QSBEvent<EnumMessage<KickReason>>
{
public override EventType Type => EventType.PlayerKick;
public override void SetupListener() => GlobalMessenger<uint, KickReason>.AddListener(EventNames.QSBPlayerKick, Handler);
public override void CloseListener() => GlobalMessenger<uint, KickReason>.RemoveListener(EventNames.QSBPlayerKick, Handler);
private void Handler(uint player, KickReason reason) => SendEvent(CreateMessage(player, reason));
private EnumMessage<KickReason> CreateMessage(uint player, KickReason reason) => new EnumMessage<KickReason>
{
AboutId = player,
Value = reason
};
public override void OnReceiveLocal(bool server, EnumMessage<KickReason> message)
{
if (!server)
{
return;
}
QSBCore.Helper.Events.Unity.FireInNUpdates(() => KickPlayer(message.AboutId), 10);
}
private void KickPlayer(uint id)
=> QNetworkServer.connections.First(x => x.GetPlayerId() == id).Disconnect();
public override void OnReceiveRemote(bool server, EnumMessage<KickReason> message)
{
if (message.AboutId != QSBPlayerManager.LocalPlayerId)
{
if (QSBPlayerManager.PlayerExists(message.AboutId))
{
DebugLog.ToAll($"{QSBPlayerManager.GetPlayer(message.AboutId).Name} was kicked.");
return;
}
DebugLog.ToAll($"Player id:{message.AboutId} was kicked.");
return;
}
DebugLog.ToAll($"Kicked from server. Reason : {message.Value}");
}
}
}

7
QSB/Player/KickReason.cs Normal file
View File

@ -0,0 +1,7 @@
namespace QSB.Player
{
public enum KickReason
{
VersionNotMatching
}
}

View File

@ -1,5 +1,4 @@
using QSB.Utility; using QuantumUNET;
using QuantumUNET;
namespace QSB.Player namespace QSB.Player
{ {
@ -10,10 +9,6 @@ namespace QSB.Player
public PlayerInfo Player => QSBPlayerManager.GetPlayer(PlayerId); public PlayerInfo Player => QSBPlayerManager.GetPlayer(PlayerId);
protected virtual void Start() => QSBPlayerManager.AddSyncObject(this); protected virtual void Start() => QSBPlayerManager.AddSyncObject(this);
protected virtual void OnDestroy() protected virtual void OnDestroy() => QSBPlayerManager.RemoveSyncObject(this);
{
DebugLog.DebugWrite($"OnDestroy of {GetType().Name} for {PlayerId}");
QSBPlayerManager.RemoveSyncObject(this);
}
} }
} }

View File

@ -66,7 +66,7 @@ namespace QSB.Player
{ {
var trace = new StackTrace().GetFrame(1).GetMethod(); var trace = new StackTrace().GetFrame(1).GetMethod();
DebugLog.DebugWrite($"Remove Player : id<{id}> (Called from {trace.DeclaringType.Name}.{trace.Name})", MessageType.Info); DebugLog.DebugWrite($"Remove Player : id<{id}> (Called from {trace.DeclaringType.Name}.{trace.Name})", MessageType.Info);
PlayerList.Remove(GetPlayer(id)); PlayerList.RemoveAll(x => x.PlayerId == id);
} }
public static bool PlayerExists(uint id) => public static bool PlayerExists(uint id) =>

View File

@ -169,7 +169,9 @@
<Compile Include="OrbSync\WorldObjects\QSBOrbSlot.cs" /> <Compile Include="OrbSync\WorldObjects\QSBOrbSlot.cs" />
<Compile Include="Patches\QSBPatchManager.cs" /> <Compile Include="Patches\QSBPatchManager.cs" />
<Compile Include="Player\Events\PlayerEntangledEvent.cs" /> <Compile Include="Player\Events\PlayerEntangledEvent.cs" />
<Compile Include="Player\Events\PlayerKickEvent.cs" />
<Compile Include="Player\Events\ServerSendPlayerStatesEvent.cs" /> <Compile Include="Player\Events\ServerSendPlayerStatesEvent.cs" />
<Compile Include="Player\KickReason.cs" />
<Compile Include="Player\PlayerEntanglementWatcher.cs" /> <Compile Include="Player\PlayerEntanglementWatcher.cs" />
<Compile Include="Player\PlayerMapMarker.cs" /> <Compile Include="Player\PlayerMapMarker.cs" />
<Compile Include="Player\PlayerSyncObject.cs" /> <Compile Include="Player\PlayerSyncObject.cs" />

View File

@ -57,6 +57,7 @@ namespace QSB
public static bool HasWokenUp { get; set; } public static bool HasWokenUp { get; set; }
public static bool IsServer => QNetworkServer.active; public static bool IsServer => QNetworkServer.active;
public static bool IsInMultiplayer => QNetworkManager.singleton.isNetworkActive; public static bool IsInMultiplayer => QNetworkManager.singleton.isNetworkActive;
public static string QSBVersion => Helper.Manifest.Version;
public static GameObject GameObjectInstance => _thisInstance.gameObject; public static GameObject GameObjectInstance => _thisInstance.gameObject;
private static QSBCore _thisInstance; private static QSBCore _thisInstance;

View File

@ -13,7 +13,7 @@ namespace QSB.StatueSync.Patches
=> QSBCore.Helper.HarmonyHelper.AddPrefix<MemoryUplinkTrigger>("Update", typeof(StatuePatches), nameof(Statue_Update)); => QSBCore.Helper.HarmonyHelper.AddPrefix<MemoryUplinkTrigger>("Update", typeof(StatuePatches), nameof(Statue_Update));
public override void DoUnpatches() public override void DoUnpatches()
=> QSBCore.Helper.HarmonyHelper.Unpatch<MemoryUplinkTrigger>("BeginUplinkSequence"); => QSBCore.Helper.HarmonyHelper.Unpatch<MemoryUplinkTrigger>("Update");
public static bool Statue_Update(bool ____waitForPlayerGrounded) public static bool Statue_Update(bool ____waitForPlayerGrounded)
{ {

View File

@ -17,8 +17,11 @@ namespace QSB.TransformSync
protected override void OnDestroy() protected override void OnDestroy()
{ {
base.OnDestroy(); base.OnDestroy();
Player.HudMarker?.Remove(); if (QSBPlayerManager.PlayerExists(PlayerId))
QSBPlayerManager.RemovePlayer(PlayerId); {
Player.HudMarker?.Remove();
QSBPlayerManager.RemovePlayer(PlayerId);
}
} }
private Transform GetPlayerModel() => private Transform GetPlayerModel() =>

View File

@ -1,5 +1,4 @@
using OWML.Common; using OWML.Common;
using QSB.Player;
using QSB.TransformSync; using QSB.TransformSync;
using QuantumUNET; using QuantumUNET;
using System; using System;
@ -36,11 +35,11 @@ namespace QSB.Utility
original.gameObject.InstantiateInactive().transform; original.gameObject.InstantiateInactive().transform;
// QNET // QNET
public static PlayerInfo GetPlayer(this QNetworkConnection connection) public static uint GetPlayerId(this QNetworkConnection connection)
{ {
var go = connection.PlayerControllers[0].Gameobject; var go = connection.PlayerControllers[0].Gameobject;
var controller = go.GetComponent<PlayerTransformSync>(); var controller = go.GetComponent<PlayerTransformSync>();
return QSBPlayerManager.GetPlayer(controller.NetId.Value); return controller.NetId.Value;
} }
// C# // C#

View File

@ -20,7 +20,7 @@
public static void Debug(string message) public static void Debug(string message)
{ {
if (_logDebug) if (!_logDebug)
{ {
return; return;
} }
@ -29,7 +29,7 @@
public static void Log(string message) public static void Log(string message)
{ {
if (_logLog) if (!_logLog)
{ {
return; return;
} }
@ -38,7 +38,7 @@
public static void Warning(string message) public static void Warning(string message)
{ {
if (_logWarning) if (!_logWarning)
{ {
return; return;
} }
@ -47,7 +47,7 @@
public static void Error(string message) public static void Error(string message)
{ {
if (_logError) if (!_logError)
{ {
return; return;
} }
@ -56,7 +56,7 @@
public static void FatalError(string message) public static void FatalError(string message)
{ {
if (_logFatal) if (!_logFatal)
{ {
return; return;
} }