mirror of
https://github.com/Impostor/Impostor.git
synced 2026-10-20 01:46:11 +00:00
Implement deserialization for most GameData objects
This commit is contained in:
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
|
||||
|
||||
@@ -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;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -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;
|
||||
|
||||
+3
-3
@@ -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);
|
||||
}
|
||||
}
|
||||
|
||||
+3
-3
@@ -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
-2
@@ -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
-1
@@ -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
|
||||
{
|
||||
+10
-6
@@ -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();
|
||||
}
|
||||
}
|
||||
}
|
||||
+1
-1
@@ -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
-1
@@ -1,6 +1,6 @@
|
||||
using Impostor.Api.Net.Messages;
|
||||
|
||||
namespace Impostor.Server.GameData.Objects
|
||||
namespace Impostor.Api.Innersloth.Net.Objects
|
||||
{
|
||||
public partial class InnerGameData
|
||||
{
|
||||
+7
-3
@@ -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
-1
@@ -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);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
+2
-2
@@ -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();
|
||||
}
|
||||
}
|
||||
}
|
||||
+19
@@ -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
-1
@@ -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();
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -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;
|
||||
|
||||
@@ -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; }
|
||||
|
||||
@@ -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();
|
||||
|
||||
|
||||
Reference in new issue
Block a user