include count in hash message

This commit is contained in:
_nebula 2023-03-08 21:02:00 +00:00
parent 65b7ea9f04
commit c3c8e6a375
2 changed files with 11 additions and 10 deletions

View File

@ -23,7 +23,7 @@ public static class QSBWorldSync
public static WorldObjectManager[] Managers;
private static readonly Dictionary<string, List<IWorldObject>> _managerToBuiltObjects = new();
public static readonly Dictionary<string, string> ManagerHashes = new();
public static readonly Dictionary<string, (string hash, int count)> ManagerHashes = new();
/// <summary>
/// Set when all WorldObjectManagers have called Init() on all their objects (AKA all the objects are created)
@ -91,15 +91,16 @@ public static class QSBWorldSync
foreach (var item in _managerToBuiltObjects)
{
var worldObjects = item.Value;
var hash = worldObjects.Select(x => x.GetType().Name).GetMD5Hash();
ManagerHashes[item.Key] = hash;
var objects = worldObjects.Select(x => x.GetType().Name);
var hash = objects.GetMD5Hash();
ManagerHashes[item.Key] = (hash, objects.Count());
}
if (!QSBCore.IsHost)
{
foreach (var item in ManagerHashes)
{
new WorldObjectsHashMessage(item.Key, item.Value).Send();
new WorldObjectsHashMessage(item.Key, item.Value.hash, item.Value.count).Send();
}
new RequestLinksMessage().Send();

View File

@ -8,21 +8,21 @@ namespace QSB.WorldSync;
/// <summary>
/// sends QSBWorldSync.WorldObjectsHash to the server for sanity checking
/// </summary>
internal class WorldObjectsHashMessage : QSBMessage<(string managerName, string hash)>
internal class WorldObjectsHashMessage : QSBMessage<(string managerName, string hash, int count)>
{
public WorldObjectsHashMessage(string managerName, string hash) : base((managerName, hash)) => To = 0;
public WorldObjectsHashMessage(string managerName, string hash, int count) : base((managerName, hash, count)) => To = 0;
public override void OnReceiveRemote()
{
Delay.RunWhen(() => QSBWorldSync.AllObjectsAdded, () =>
{
var serverHash = QSBWorldSync.ManagerHashes[Data.managerName];
var (hash, count) = QSBWorldSync.ManagerHashes[Data.managerName];
if (serverHash != Data.hash)
if (hash != Data.hash)
{
// oh fuck oh no oh god
DebugLog.ToConsole($"Kicking {From} because their WorldObjects hash for {Data.managerName} is wrong. (server:{serverHash}, client:{Data.hash})", MessageType.Error);
new PlayerKickMessage(From, $"WorldObject hash error for {Data.managerName}. (Server:{serverHash}, Client:{Data.hash})").Send();
DebugLog.ToConsole($"Kicking {From} because their WorldObjects hash for {Data.managerName} is wrong. (Server:{hash} count:{count}, Client:{Data.hash} count:{Data.count})", MessageType.Error);
new PlayerKickMessage(From, $"WorldObject hash error for {Data.managerName}. (Server:{hash} count:{count}, Client:{Data.hash}, count:{Data.count})").Send();
}
});
}