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 QSBMoveToCarry = "QSBMoveToCarry";
public static string QSBStartStatue = "QSBStartStatue";
public static string QSBPlayerKick = "QSBPlayerKick";
}
}

View File

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

View File

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

View File

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

View File

@ -50,7 +50,7 @@ namespace QSB.OrbSync.Events
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)
{
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
{
AboutId = LocalPlayerId,
PlayerName = name
PlayerName = name,
QSBVersion = QSBCore.QSBVersion
};
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);
player.Name = message.PlayerName;
DebugLog.ToAll($"{player.Name} joined!", MessageType.Info);

View File

@ -6,17 +6,20 @@ namespace QSB.Player.Events
public class PlayerJoinMessage : PlayerMessage
{
public string PlayerName { get; set; }
public string QSBVersion { get; set; }
public override void Deserialize(QNetworkReader reader)
{
base.Deserialize(reader);
PlayerName = reader.ReadString();
QSBVersion = reader.ReadString();
}
public override void Serialize(QNetworkWriter writer)
{
base.Serialize(writer);
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
{
@ -10,10 +9,6 @@ namespace QSB.Player
public PlayerInfo Player => QSBPlayerManager.GetPlayer(PlayerId);
protected virtual void Start() => QSBPlayerManager.AddSyncObject(this);
protected virtual void OnDestroy()
{
DebugLog.DebugWrite($"OnDestroy of {GetType().Name} for {PlayerId}");
QSBPlayerManager.RemoveSyncObject(this);
}
protected virtual void OnDestroy() => QSBPlayerManager.RemoveSyncObject(this);
}
}

View File

@ -66,7 +66,7 @@ namespace QSB.Player
{
var trace = new StackTrace().GetFrame(1).GetMethod();
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) =>

View File

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

View File

@ -57,6 +57,7 @@ namespace QSB
public static bool HasWokenUp { get; set; }
public static bool IsServer => QNetworkServer.active;
public static bool IsInMultiplayer => QNetworkManager.singleton.isNetworkActive;
public static string QSBVersion => Helper.Manifest.Version;
public static GameObject GameObjectInstance => _thisInstance.gameObject;
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));
public override void DoUnpatches()
=> QSBCore.Helper.HarmonyHelper.Unpatch<MemoryUplinkTrigger>("BeginUplinkSequence");
=> QSBCore.Helper.HarmonyHelper.Unpatch<MemoryUplinkTrigger>("Update");
public static bool Statue_Update(bool ____waitForPlayerGrounded)
{

View File

@ -17,9 +17,12 @@ namespace QSB.TransformSync
protected override void OnDestroy()
{
base.OnDestroy();
if (QSBPlayerManager.PlayerExists(PlayerId))
{
Player.HudMarker?.Remove();
QSBPlayerManager.RemovePlayer(PlayerId);
}
}
private Transform GetPlayerModel() =>
Locator.GetPlayerTransform().Find("Traveller_HEA_Player_v2");

View File

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

View File

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