Implement deserialization for most GameData objects

This commit is contained in:
AeonLucid committed 2020-10-23 05:38:32 +02:00
1 parent 93230823b4
commit be5a876113
39 files changed
+658 -107

No files matched your search

@@ -2,7 +2,7 @@
using System.Buffers.Binary;
using System.Runtime.CompilerServices;
namespace Impostor.Api.Extensions
namespace Impostor.Api
{
/// <summary>
/// Priovides a StreamReader-like api throught extensions
+2
View File
@@ -16,6 +16,8 @@ namespace Impostor.Api.Games
GameStates GameState { get; }
GameNet GameNet { get; }
IEnumerable<IClientPlayer> Players { get; }
IPEndPoint PublicIp { get; }
@@ -0,0 +1,29 @@
using Impostor.Api.Innersloth.Net;
using Impostor.Api.Innersloth.Net.Objects;
namespace Impostor.Api.Innersloth.Data
{
/// <summary>
/// Holds all data that is serialized over the network through GameData packets.
/// </summary>
public class GameNet
{
public InnerGameData GameData { get; internal set; }
internal void OnSpawn(InnerNetObject netObj)
{
if (netObj is InnerGameData data)
{
GameData = data;
}
}
internal void OnDestroy(InnerNetObject netObj)
{
if (netObj is InnerGameData)
{
GameData = null;
}
}
}
}
+10
View File
@@ -0,0 +1,10 @@
namespace Impostor.Api.Innersloth.Data
{
public static class MapId
{
// TODO: Not sure if correct, check
public const int Skeld = 0;
public const int MiraHQ = 1;
public const int Polus = 2;
}
}
@@ -1,5 +1,4 @@
using Impostor.Api.Extensions;
using Impostor.Api.Innersloth.Data;
using Impostor.Api.Innersloth.Data;
using System;
using System.IO;
@@ -1,6 +1,6 @@
using System.Collections.Generic;
namespace Impostor.Server.GameData
namespace Impostor.Api.Innersloth.Net
{
public class GameObject
{
@@ -17,9 +17,9 @@ namespace Impostor.Server.GameData
foreach (var component in Components)
{
if (component.GetType().IsAssignableTo(typeof(T)))
if (component is T c)
{
result.Add((T) component);
result.Add(c);
}
}
@@ -1,12 +1,12 @@
using Impostor.Api.Net.Messages;
namespace Impostor.Server.GameData
namespace Impostor.Api.Innersloth.Net
{
public abstract class InnerNetObject : GameObject
{
public uint NetId { get; set; }
public uint NetId { get; internal set; }
public int OwnerId { get; set; }
public int OwnerId { get; internal set; }
public SpawnFlags SpawnFlags { get; internal set; }
@@ -1,9 +1,8 @@
using System.Numerics;
using Impostor.Api.Innersloth;
using Impostor.Api.Net.Messages;
using Microsoft.Extensions.Logging;
namespace Impostor.Server.GameData.Objects.Components
namespace Impostor.Api.Innersloth.Net.Objects.Components
{
public class InnerCustomNetworkTransform : InnerNetObject
{
@@ -1,6 +1,6 @@
using Impostor.Api.Net.Messages;
namespace Impostor.Server.GameData.Objects.Components
namespace Impostor.Api.Innersloth.Net.Objects.Components
{
public class InnerPlayerPhysics : InnerNetObject
{
@@ -2,7 +2,7 @@
using System.Collections.Generic;
using Impostor.Api.Net.Messages;
namespace Impostor.Server.GameData.Objects.Components
namespace Impostor.Api.Innersloth.Net.Objects.Components
{
public class InnerVoteBanSystem : InnerNetObject
{
@@ -26,12 +26,16 @@ namespace Impostor.Server.GameData.Objects.Components
public override void Deserialize(IMessageReader reader, bool initialState)
{
var votes = _votes;
var unknown = reader.ReadBoolean();
if (unknown)
var unknown = reader.ReadByte();
if (unknown != 0)
{
while (true)
for (var i = 0; i < unknown; i++)
{
var v4 = reader.ReadInt32();
if (v4 == 0)
{
break;
}
if (!votes.TryGetValue(v4, out var v12))
{
@@ -39,9 +43,9 @@ namespace Impostor.Server.GameData.Objects.Components
votes[v4] = v12;
}
for (var i = 0; i < 3; i++)
for (var j = 0; j < 3; j++)
{
v12[i] = reader.ReadPackedInt32();
v12[j] = reader.ReadPackedInt32();
}
}
}
@@ -2,7 +2,7 @@
using System.Collections.Generic;
using Impostor.Api.Net.Messages;
namespace Impostor.Server.GameData.Objects
namespace Impostor.Api.Innersloth.Net.Objects
{
public partial class InnerGameData
{
@@ -1,6 +1,6 @@
using Impostor.Api.Net.Messages;
namespace Impostor.Server.GameData.Objects
namespace Impostor.Api.Innersloth.Net.Objects
{
public partial class InnerGameData
{
@@ -1,10 +1,10 @@
using System;
using System.Collections.Generic;
using Impostor.Api.Games;
using Impostor.Api.Innersloth.Net.Objects.Components;
using Impostor.Api.Net.Messages;
using Impostor.Server.GameData.Objects.Components;
namespace Impostor.Server.GameData.Objects
namespace Impostor.Api.Innersloth.Net.Objects
{
public partial class InnerGameData : InnerNetObject
{
@@ -20,6 +20,10 @@ namespace Impostor.Server.GameData.Objects
Components.Add(new InnerVoteBanSystem());
}
public int PlayerCount => _allPlayers.Count;
public IReadOnlyList<PlayerInfo> Players => _allPlayers;
public PlayerInfo GetPlayerById(byte id)
{
foreach (var player in _allPlayers)
@@ -58,7 +62,7 @@ namespace Impostor.Server.GameData.Objects
}
else
{
throw new NotImplementedException("This shouldn't happen, according to Among Us assembly..");
throw new NotImplementedException("This shouldn't happen, according to Among Us disassembly..");
// var num = reader.ReadByte();
//
@@ -1,7 +1,7 @@
using Impostor.Api.Games;
using Impostor.Api.Net.Messages;
namespace Impostor.Server.GameData.Objects
namespace Impostor.Api.Innersloth.Net.Objects
{
public class InnerLobbyBehaviour : InnerNetObject
{
@@ -0,0 +1,49 @@
using Impostor.Api.Net.Messages;
namespace Impostor.Api.Innersloth.Net.Objects
{
public partial class InnerMeetingHud
{
public class PlayerVoteArea
{
private const byte VoteMask = 15;
private const byte ReportedBit = 32;
private const byte VotedBit = 64;
private const byte DeadBit = 128;
public PlayerVoteArea(InnerMeetingHud parent, byte targetPlayerId)
{
Parent = parent;
TargetPlayerId = targetPlayerId;
}
public InnerMeetingHud Parent { get; }
public byte TargetPlayerId { get; }
public bool IsDead { get; private set; }
public bool DidVote { get; private set; }
public bool DidReport { get; private set; }
public sbyte VotedFor { get; private set; }
internal void SetDead(bool didReport, bool isDead)
{
DidReport = didReport;
IsDead = isDead;
}
public void Deserialize(IMessageReader reader)
{
var num = reader.ReadByte();
VotedFor = (sbyte)((num & VoteMask) - 1);
IsDead = (num & DeadBit) > 0;
DidVote = (num & VotedBit) > 0;
DidReport = (num & ReportedBit) > 0;
}
}
}
}
@@ -0,0 +1,78 @@
using System;
using Impostor.Api.Games;
using Impostor.Api.Innersloth.Data;
using Impostor.Api.Net.Messages;
namespace Impostor.Api.Innersloth.Net.Objects
{
public partial class InnerMeetingHud : InnerNetObject
{
private readonly IGame _game;
private readonly GameNet _gameNet;
private PlayerVoteArea[] _playerStates;
public InnerMeetingHud(IGame game)
{
_game = game;
_gameNet = game.GameNet;
_playerStates = null;
Components.Add(this);
}
public byte ReporterId { get; private set; }
private void PopulateButtons(byte reporter)
{
_playerStates = new PlayerVoteArea[_gameNet.GameData.PlayerCount];
for (var i = 0; i < _playerStates.Length; i++)
{
var player = _gameNet.GameData.Players[i];
var playerVoteArea = _playerStates[i] = new PlayerVoteArea(this, player.PlayerId);
playerVoteArea.SetDead(player.PlayerId == reporter, player.Disconnected || player.IsDead);
}
}
public override void HandleRpc(byte callId, IMessageReader reader)
{
throw new NotImplementedException();
}
public override bool Serialize(IMessageWriter writer, bool initialState)
{
throw new NotImplementedException();
}
public override void Deserialize(IMessageReader reader, bool initialState)
{
if (initialState)
{
PopulateButtons(0);
foreach (var playerState in _playerStates)
{
playerState.Deserialize(reader);
if (playerState.DidReport)
{
ReporterId = playerState.TargetPlayerId;
}
}
}
else
{
var num = reader.ReadPackedUInt32();
for (var i = 0; i < _playerStates.Length; i++)
{
if ((num & 1 << i) != 0)
{
_playerStates[i].Deserialize(reader);
}
}
}
}
}
}
@@ -1,10 +1,10 @@
using System;
using Impostor.Api.Games;
using Impostor.Api.Innersloth.Net.Objects.Components;
using Impostor.Api.Net.Messages;
using Impostor.Server.GameData.Objects.Components;
using Microsoft.Extensions.DependencyInjection;
namespace Impostor.Server.GameData.Objects
namespace Impostor.Api.Innersloth.Net.Objects
{
public class InnerPlayerControl : InnerNetObject
{
@@ -0,0 +1,81 @@
using System.Collections.Generic;
using Impostor.Api.Games;
using Impostor.Api.Innersloth.Net.Objects.Systems;
using Impostor.Api.Innersloth.Net.Objects.Systems.ShipStatus;
using Impostor.Api.Net.Messages;
namespace Impostor.Api.Innersloth.Net.Objects
{
public class InnerShipStatus : InnerNetObject
{
private readonly IGame _game;
private readonly Dictionary<SystemTypes, ISystemType> _systems;
public InnerShipStatus(IGame game)
{
_game = game;
_systems = new Dictionary<SystemTypes, ISystemType>
{
[SystemTypes.Electrical] = new SwitchSystem(),
[SystemTypes.MedBay] = new MedScanSystem(),
[SystemTypes.Reactor] = new ReactorSystemType(),
[SystemTypes.LifeSupp] = new LifeSuppSystemType(),
[SystemTypes.Security] = new SecurityCameraSystemType(),
[SystemTypes.Comms] = new HudOverrideSystemType(),
[SystemTypes.Doors] = new DoorsSystemType(_game),
};
_systems.Add(SystemTypes.Sabotage, new SabotageSystemType(new[]
{
(IActivatable) _systems[SystemTypes.Comms],
(IActivatable) _systems[SystemTypes.Reactor],
(IActivatable) _systems[SystemTypes.LifeSupp],
(IActivatable) _systems[SystemTypes.Electrical],
}));
Components.Add(this);
}
public override void HandleRpc(byte callId, IMessageReader reader)
{
throw new System.NotImplementedException();
}
public override bool Serialize(IMessageWriter writer, bool initialState)
{
throw new System.NotImplementedException();
}
public override void Deserialize(IMessageReader reader, bool initialState)
{
if (initialState)
{
// TODO: (_systems[SystemTypes.Doors] as DoorsSystemType).SetDoors();
foreach (var systemType in SystemTypeHelpers.AllTypes)
{
if (_systems.TryGetValue(systemType, out var system))
{
system.Deserialize(reader, true);
}
}
}
else
{
var count = reader.ReadPackedUInt32();
foreach (var systemType in SystemTypeHelpers.AllTypes)
{
// TODO: Not sure what is going on here, check.
if ((count & 1 << (int) (systemType & (SystemTypes.ShipTasks | SystemTypes.Doors))) != 0L)
{
if (_systems.TryGetValue(systemType, out var system))
{
system.Deserialize(reader, false);
}
}
}
}
}
}
}
@@ -0,0 +1,7 @@
namespace Impostor.Api.Innersloth.Net.Objects.Systems
{
public interface IActivatable
{
bool IsActive { get; }
}
}
@@ -0,0 +1,11 @@
using Impostor.Api.Net.Messages;
namespace Impostor.Api.Innersloth.Net.Objects.Systems
{
public interface ISystemType
{
void Serialize(IMessageWriter writer, bool initialState);
void Deserialize(IMessageReader reader, bool initialState);
}
}
@@ -0,0 +1,61 @@
using System;
using System.Collections.Generic;
using Impostor.Api.Games;
using Impostor.Api.Innersloth.Data;
using Impostor.Api.Net.Messages;
namespace Impostor.Api.Innersloth.Net.Objects.Systems.ShipStatus
{
public class DoorsSystemType : ISystemType
{
// TODO: AutoDoors
private readonly Dictionary<int, bool> _doors;
public DoorsSystemType(IGame game)
{
// TODO: Check
var doorCount = game.Options.MapId switch
{
MapId.Skeld => 13,
MapId.MiraHQ => 2,
MapId.Polus => 12,
_ => throw new ArgumentOutOfRangeException()
};
_doors = new Dictionary<int, bool>(doorCount);
for (var i = 0; i < doorCount; i++)
{
_doors.Add(i, false);
}
}
public void Serialize(IMessageWriter writer, bool initialState)
{
throw new NotImplementedException();
}
public void Deserialize(IMessageReader reader, bool initialState)
{
if (initialState)
{
for (var i = 0; i < _doors.Count; i++)
{
_doors[i] = reader.ReadBoolean();
}
}
else
{
var num = reader.ReadPackedUInt32();
for (var i = 0; i < _doors.Count; i++)
{
if ((num & 1 << i) != 0)
{
_doors[i] = reader.ReadBoolean();
}
}
}
}
}
}
@@ -0,0 +1,19 @@
using Impostor.Api.Net.Messages;
namespace Impostor.Api.Innersloth.Net.Objects.Systems.ShipStatus
{
public class HudOverrideSystemType : ISystemType, IActivatable
{
public bool IsActive { get; private set; }
public void Serialize(IMessageWriter writer, bool initialState)
{
throw new System.NotImplementedException();
}
public void Deserialize(IMessageReader reader, bool initialState)
{
IsActive = reader.ReadBoolean();
}
}
}
@@ -0,0 +1,44 @@
using System.Collections.Generic;
using Impostor.Api.Net.Messages;
namespace Impostor.Api.Innersloth.Net.Objects.Systems.ShipStatus
{
public class LifeSuppSystemType : ISystemType, IActivatable
{
public LifeSuppSystemType()
{
Countdown = 10000f;
CompletedConsoles = new HashSet<int>();
}
public float Countdown { get; private set; }
public HashSet<int> CompletedConsoles { get; }
public bool IsActive => Countdown < 10000.0;
public void Serialize(IMessageWriter writer, bool initialState)
{
throw new System.NotImplementedException();
}
public void Deserialize(IMessageReader reader, bool initialState)
{
Countdown = reader.ReadSingle();
if (reader.Position >= reader.Length)
{
return;
}
CompletedConsoles.Clear(); // TODO: Thread safety
var num = reader.ReadPackedInt32();
for (var i = 0; i < num; i++)
{
CompletedConsoles.Add(reader.ReadPackedInt32());
}
}
}
}
@@ -0,0 +1,32 @@
using System.Collections.Generic;
using Impostor.Api.Net.Messages;
namespace Impostor.Api.Innersloth.Net.Objects.Systems.ShipStatus
{
public class MedScanSystem : ISystemType
{
public MedScanSystem()
{
UsersList = new List<byte>();
}
public List<byte> UsersList { get; }
public void Serialize(IMessageWriter writer, bool initialState)
{
throw new System.NotImplementedException();
}
public void Deserialize(IMessageReader reader, bool initialState)
{
UsersList.Clear();
var num = reader.ReadPackedInt32();
for (var i = 0; i < num; i++)
{
UsersList.Add(reader.ReadByte());
}
}
}
}
@@ -0,0 +1,39 @@
using System;
using System.Collections.Generic;
using Impostor.Api.Net.Messages;
namespace Impostor.Api.Innersloth.Net.Objects.Systems.ShipStatus
{
public class ReactorSystemType : ISystemType, IActivatable
{
public ReactorSystemType()
{
Countdown = 10000f;
UserConsolePairs = new HashSet<Tuple<byte, byte>>();
}
public float Countdown { get; private set; }
public HashSet<Tuple<byte, byte>> UserConsolePairs { get; }
public bool IsActive => Countdown < 10000.0;
public void Serialize(IMessageWriter writer, bool initialState)
{
throw new System.NotImplementedException();
}
public void Deserialize(IMessageReader reader, bool initialState)
{
Countdown = reader.ReadSingle();
UserConsolePairs.Clear(); // TODO: Thread safety
var count = reader.ReadPackedInt32();
for (var i = 0; i < count; i++)
{
UserConsolePairs.Add(new Tuple<byte, byte>(reader.ReadByte(), reader.ReadByte()));
}
}
}
}
@@ -0,0 +1,26 @@
using Impostor.Api.Net.Messages;
namespace Impostor.Api.Innersloth.Net.Objects.Systems.ShipStatus
{
public class SabotageSystemType : ISystemType
{
private readonly IActivatable[] _specials;
public SabotageSystemType(IActivatable[] specials)
{
_specials = specials;
}
public float Timer { get; set; }
public void Serialize(IMessageWriter writer, bool initialState)
{
throw new System.NotImplementedException();
}
public void Deserialize(IMessageReader reader, bool initialState)
{
Timer = reader.ReadSingle();
}
}
}
@@ -0,0 +1,19 @@
using Impostor.Api.Net.Messages;
namespace Impostor.Api.Innersloth.Net.Objects.Systems.ShipStatus
{
public class SecurityCameraSystemType : ISystemType
{
public byte InUse { get; internal set; }
public void Serialize(IMessageWriter writer, bool initialState)
{
throw new System.NotImplementedException();
}
public void Deserialize(IMessageReader reader, bool initialState)
{
InUse = reader.ReadByte();
}
}
}
@@ -0,0 +1,27 @@
using Impostor.Api.Net.Messages;
namespace Impostor.Api.Innersloth.Net.Objects.Systems.ShipStatus
{
public class SwitchSystem : ISystemType, IActivatable
{
public byte ExpectedSwitches { get; set; }
public byte ActualSwitches { get; set; }
public byte Value { get; set; } = byte.MaxValue;
public bool IsActive { get; }
public void Serialize(IMessageWriter writer, bool initialState)
{
throw new System.NotImplementedException();
}
public void Deserialize(IMessageReader reader, bool initialState)
{
ExpectedSwitches = reader.ReadByte();
ActualSwitches = reader.ReadByte();
Value = reader.ReadByte();
}
}
}
@@ -0,0 +1,28 @@
using System;
using System.Linq;
namespace Impostor.Api.Innersloth.Net.Objects.Systems
{
internal class SystemTypeHelpers
{
public static readonly SystemTypes[] AllTypes;
public static readonly string[] Names;
static SystemTypeHelpers()
{
AllTypes = Enum.GetValues(typeof(SystemTypes)).Cast<SystemTypes>().ToArray();
Names = AllTypes.Select(x =>
{
return x switch
{
SystemTypes.UpperEngine => "Upper Engine",
SystemTypes.Nav => "Navigations",
SystemTypes.LifeSupp => "O2",
SystemTypes.LowerEngine => "Lower Engine",
SystemTypes.LockerRoom => "Locker Room",
_ => x.ToString()
};
}).ToArray();
}
}
}
@@ -0,0 +1,31 @@
namespace Impostor.Api.Innersloth.Net.Objects.Systems
{
public enum SystemTypes : byte
{
Hallway,
Storage,
Cafeteria,
Reactor,
UpperEngine,
Nav,
Admin,
Electrical,
LifeSupp,
Shields,
MedBay,
Security,
Weapons,
LowerEngine,
Comms,
ShipTasks,
Doors,
Sabotage,
Decontamination,
Launchpad,
LockerRoom,
Laboratory,
Balcony,
Office,
Greenhouse,
}
}
@@ -1,6 +1,6 @@
using System;
namespace Impostor.Server.GameData
namespace Impostor.Api.Innersloth.Net
{
[Flags]
public enum SpawnFlags : byte
@@ -1,5 +1,4 @@
using System;
using Impostor.Api.Extensions;
namespace Impostor.Api.Net.Messages.C2S
{
@@ -1,5 +1,4 @@
using Impostor.Api.Extensions;
using Impostor.Api.Innersloth.Data;
using Impostor.Api.Innersloth.Data;
namespace Impostor.Api.Net.Messages.C2S
{
@@ -0,0 +1,3 @@
using System.Runtime.CompilerServices;
[assembly:InternalsVisibleTo("Impostor.Server")]
@@ -1,32 +0,0 @@
using Impostor.Api.Games;
using Impostor.Api.Net.Messages;
namespace Impostor.Server.GameData.Objects
{
public class InnerMeetingHud : InnerNetObject
{
private readonly IGame _game;
public InnerMeetingHud(IGame game)
{
_game = game;
Components.Add(this);
}
public override void HandleRpc(byte callId, IMessageReader reader)
{
throw new System.NotImplementedException();
}
public override bool Serialize(IMessageWriter writer, bool initialState)
{
throw new System.NotImplementedException();
}
public override void Deserialize(IMessageReader reader, bool initialState)
{
throw new System.NotImplementedException();
}
}
}
@@ -1,32 +0,0 @@
using Impostor.Api.Games;
using Impostor.Api.Net.Messages;
namespace Impostor.Server.GameData.Objects
{
public class InnerShipStatus : InnerNetObject
{
private readonly IGame _game;
public InnerShipStatus(IGame game)
{
_game = game;
Components.Add(this);
}
public override void HandleRpc(byte callId, IMessageReader reader)
{
throw new System.NotImplementedException();
}
public override bool Serialize(IMessageWriter writer, bool initialState)
{
throw new System.NotImplementedException();
}
public override void Deserialize(IMessageReader reader, bool initialState)
{
throw new System.NotImplementedException();
}
}
}
+23 -12
View File
@@ -6,12 +6,12 @@ using System.Threading.Tasks;
using Impostor.Api;
using Impostor.Api.Innersloth.Data;
using Impostor.Api.Innersloth.GameData;
using Impostor.Api.Innersloth.Net;
using Impostor.Api.Innersloth.Net.Objects;
using Impostor.Api.Net.Messages;
using Impostor.Api.Net.Messages.C2S;
using Impostor.Api.Net.Messages.S2C;
using Impostor.Hazel;
using Impostor.Server.GameData;
using Impostor.Server.GameData.Objects;
using Microsoft.Extensions.DependencyInjection;
using Microsoft.Extensions.Logging;
@@ -180,7 +180,7 @@ namespace Impostor.Server.Net.State
continue;
}
_logger.LogTrace(
_logger.LogDebug(
"Spawning {0} components, SpawnFlags {1}",
innerNetObject.GetType().Name,
innerNetObject.SpawnFlags);
@@ -192,7 +192,7 @@ namespace Impostor.Server.Net.State
obj.NetId = reader.ReadPackedUInt32();
obj.OwnerId = ownerClientId;
_logger.LogTrace(
_logger.LogDebug(
"- {0}, NetId {1}, OwnerId {2}",
obj.GetType().Name,
obj.NetId,
@@ -211,6 +211,8 @@ namespace Impostor.Server.Net.State
{
obj.Deserialize(readerSub, true);
}
GameNet.OnSpawn(obj);
}
if ((innerNetObject.SpawnFlags & SpawnFlags.IsClientCharacter) != SpawnFlags.None)
@@ -235,21 +237,30 @@ namespace Impostor.Server.Net.State
case GameDataTag.DespawnFlag:
{
// Only the host is allowed to despawn objects.
if (!sender.IsHost)
{
_logger.LogWarning("Player {0} ({1}) tried to send DespawnFlag as non-host.", sender.Client.Name, sender.Client.Id);
return false;
}
var netId = reader.ReadPackedUInt32();
if (_allObjectsFast.TryGetValue(netId, out var obj))
{
if (sender.Client.Id != obj.OwnerId && !sender.IsHost)
{
_logger.LogWarning(
"Player {0} ({1}) tried to send DespawnFlag for {2} but was denied.",
sender.Client.Name,
sender.Client.Id,
netId);
return false;
}
RemoveNetObject(obj);
_logger.LogTrace("Destroyed InnerNetObject {0} ({1})", obj.GetType().Name, netId);
GameNet.OnSpawn(obj);
_logger.LogDebug("Destroyed InnerNetObject {0} ({1}), OwnerId {2}", obj.GetType().Name, netId, obj.OwnerId);
}
else
{
_logger.LogWarning("Received DespawnFlag for unregistered NetId {0}.", netId);
_logger.LogWarning(
"Player {0} ({1}) sent DespawnFlag for unregistered NetId {2}.",
sender.Client.Name,
sender.Client.Id,
netId);
}
break;
+3
View File
@@ -51,6 +51,7 @@ namespace Impostor.Server.Net.State
Code = code;
HostId = -1;
GameState = GameStates.NotStarted;
GameNet = new GameNet();
Options = options;
_clientManager = clientManager;
_eventManager = eventManager;
@@ -67,6 +68,8 @@ namespace Impostor.Server.Net.State
public GameStates GameState { get; private set; }
public GameNet GameNet { get; }
public GameOptionsData Options { get; }
public IDictionary<object, object> Items { get; }
+2 -1
View File
@@ -43,7 +43,8 @@ namespace Impostor.Tools.ServerReplay
private static async Task Main(string[] args)
{
Log.Logger = new LoggerConfiguration()
.MinimumLevel.Verbose()
// .MinimumLevel.Verbose()
.MinimumLevel.Debug()
.WriteTo.Console()
.CreateLogger();