diff --git a/src/Directory.Build.props b/src/Directory.Build.props index 6968bd94..a5fe9cfb 100644 --- a/src/Directory.Build.props +++ b/src/Directory.Build.props @@ -1,6 +1,6 @@ - 1.5.0 + 1.6.0 dev true diff --git a/src/Impostor.Api/Innersloth/Maps/AirshipData.cs b/src/Impostor.Api/Innersloth/Maps/AirshipData.cs index 52733a85..5ec22eda 100644 --- a/src/Impostor.Api/Innersloth/Maps/AirshipData.cs +++ b/src/Impostor.Api/Innersloth/Maps/AirshipData.cs @@ -36,6 +36,7 @@ namespace Impostor.Api.Innersloth.Maps { new AirshipTask(AirshipTask.Ids.ElectricalFixWiring, TaskTypes.FixWiring, TaskCategories.CommonTask), new AirshipTask(AirshipTask.Ids.MeetingRoomEnterIDCode, TaskTypes.EnterIdCode, TaskCategories.CommonTask), + new AirshipTask(AirshipTask.Ids.ElectricalCalibrateDistributor, TaskTypes.CalibrateDistributor, TaskCategories.LongTask), new AirshipTask(AirshipTask.Ids.ElectricalResetBreakers, TaskTypes.ResetBreakers, TaskCategories.LongTask), new AirshipTask(AirshipTask.Ids.VaultRoomDownloadData, TaskTypes.UploadData, TaskCategories.LongTask), new AirshipTask(AirshipTask.Ids.BrigDownloadData, TaskTypes.UploadData, TaskCategories.LongTask), @@ -50,8 +51,9 @@ namespace Impostor.Api.Innersloth.Maps new AirshipTask(AirshipTask.Ids.MainHallDevelopPhotos, TaskTypes.DevelopPhotos, TaskCategories.LongTask), new AirshipTask(AirshipTask.Ids.CargoBayFuelEngines, TaskTypes.FuelEngines, TaskCategories.LongTask), new AirshipTask(AirshipTask.Ids.SecurityRewindTapes, TaskTypes.RewindTapes, TaskCategories.LongTask), + new AirshipTask(AirshipTask.Ids.LoungeEmptyGarbage, TaskTypes.EmptyGarbage, TaskCategories.LongTask), + new AirshipTask(AirshipTask.Ids.ShowersEmptyGarbage, TaskTypes.EmptyGarbage, TaskCategories.LongTask), new AirshipTask(AirshipTask.Ids.VaultRoomPolishRuby, TaskTypes.PolishRuby, TaskCategories.ShortTask), - new AirshipTask(AirshipTask.Ids.ElectricalCalibrateDistributor, TaskTypes.CalibrateDistributor, TaskCategories.LongTask), new AirshipTask(AirshipTask.Ids.CockpitStabilizeSteering, TaskTypes.StabilizeSteering, TaskCategories.ShortTask), new AirshipTask(AirshipTask.Ids.ArmoryDownloadData, TaskTypes.UploadData, TaskCategories.LongTask), new AirshipTask(AirshipTask.Ids.CockpitDownloadData, TaskTypes.UploadData, TaskCategories.LongTask), @@ -74,6 +76,7 @@ namespace Impostor.Api.Innersloth.Maps new AirshipTask(AirshipTask.Ids.MainHallDecontaminate, TaskTypes.Decontaminate, TaskCategories.ShortTask), new AirshipTask(AirshipTask.Ids.KitchenMakeBurger, TaskTypes.MakeBurger, TaskCategories.ShortTask), new AirshipTask(AirshipTask.Ids.ShowersFixShower, TaskTypes.FixShower, TaskCategories.ShortTask), + new AirshipTask(AirshipTask.Ids.CleanVent, TaskTypes.VentCleaning, TaskCategories.ShortTask), }; Tasks = tasks.ToDictionary(x => x.Id, x => x).AsReadOnly(); diff --git a/src/Impostor.Api/Innersloth/Maps/MiraData.cs b/src/Impostor.Api/Innersloth/Maps/MiraData.cs index f66f89a3..326b94ae 100644 --- a/src/Impostor.Api/Innersloth/Maps/MiraData.cs +++ b/src/Impostor.Api/Innersloth/Maps/MiraData.cs @@ -59,6 +59,7 @@ namespace Impostor.Api.Innersloth.Maps new MiraTask(MiraTask.Ids.OfficeProcessData, TaskTypes.ProcessData, TaskCategories.ShortTask), new MiraTask(MiraTask.Ids.LaunchpadRunDiagnostics, TaskTypes.RunDiagnostics, TaskCategories.LongTask), new MiraTask(MiraTask.Ids.ReactorUnlockManifolds, TaskTypes.UnlockManifolds, TaskCategories.ShortTask), + new MiraTask(MiraTask.Ids.CleanVent, TaskTypes.VentCleaning, TaskCategories.ShortTask), }; Tasks = tasks.ToDictionary(x => x.Id, x => x).AsReadOnly(); diff --git a/src/Impostor.Api/Innersloth/Maps/SkeldData.cs b/src/Impostor.Api/Innersloth/Maps/SkeldData.cs index a6df2936..617f7e04 100644 --- a/src/Impostor.Api/Innersloth/Maps/SkeldData.cs +++ b/src/Impostor.Api/Innersloth/Maps/SkeldData.cs @@ -65,6 +65,7 @@ namespace Impostor.Api.Innersloth.Maps new SkeldTask(SkeldTask.Ids.ElectricalDivertPowerToNavigation, TaskTypes.DivertPower, TaskCategories.ShortTask), new SkeldTask(SkeldTask.Ids.ElectricalDivertPowerToLowerEngine, TaskTypes.DivertPower, TaskCategories.ShortTask), new SkeldTask(SkeldTask.Ids.ElectricalDivertPowerToSecurity, TaskTypes.DivertPower, TaskCategories.ShortTask), + new SkeldTask(SkeldTask.Ids.CleanVent, TaskTypes.VentCleaning, TaskCategories.ShortTask), }; Tasks = tasks.ToDictionary(x => x.Id, x => x).AsReadOnly(); diff --git a/src/Impostor.Api/Innersloth/Maps/Tasks/AirshipTask.cs b/src/Impostor.Api/Innersloth/Maps/Tasks/AirshipTask.cs index ab3b5919..798c4e62 100644 --- a/src/Impostor.Api/Innersloth/Maps/Tasks/AirshipTask.cs +++ b/src/Impostor.Api/Innersloth/Maps/Tasks/AirshipTask.cs @@ -15,44 +15,47 @@ namespace Impostor.Api.Innersloth.Maps.Tasks { ElectricalFixWiring = 0, MeetingRoomEnterIDCode = 1, - ElectricalResetBreakers = 2, - VaultRoomDownloadData = 3, - BrigDownloadData = 4, - CargoBayDownloadData = 5, - GapRoomDownloadData = 6, - RecordsDownloadData = 7, - CargoBayUnlockSafe = 8, - VentilationStartFans = 9, - MainHallEmptyGarbage = 10, - MedicalEmptyGarbage = 11, - KitchenEmptyGarbage = 12, - MainHallDevelopPhotos = 13, - CargoBayFuelEngines = 14, - SecurityRewindTapes = 15, - VaultRoomPolishRuby = 16, - ElectricalCalibrateDistributor = 17, - CockpitStabilizeSteering = 18, - ArmoryDownloadData = 19, - CockpitDownloadData = 20, - CommsDownloadData = 21, - MedicalDownloadData = 22, - ViewingDeckDownloadData = 23, - ElectricalDivertPowerToArmory = 24, - ElectricalDivertPowerToCockpit = 25, - ElectricalDivertPowerToGapRoom = 26, - ElectricalDivertPowerToMainHall = 27, - ElectricalDivertPowerToMeetingRoom = 28, - ElectricalDivertPowerToShowers = 29, - ElectricalDivertPowerToEngine = 30, - ShowersPickUpTowels = 31, - LoungeCleanToilet = 32, - VaultRoomDressMannequin = 33, - RecordsSortRecords = 34, - ArmoryPutAwayPistols = 35, - ArmoryPutAwayRifles = 36, - MainHallDecontaminate = 37, - KitchenMakeBurger = 38, - ShowersFixShower = 39, + ElectricalCalibrateDistributor = 2, + ElectricalResetBreakers = 3, + VaultRoomDownloadData = 4, + BrigDownloadData = 5, + CargoBayDownloadData = 6, + GapRoomDownloadData = 7, + RecordsDownloadData = 8, + CargoBayUnlockSafe = 9, + VentilationStartFans = 10, + MainHallEmptyGarbage = 11, + MedicalEmptyGarbage = 12, + KitchenEmptyGarbage = 13, + MainHallDevelopPhotos = 14, + CargoBayFuelEngines = 15, + SecurityRewindTapes = 16, + LoungeEmptyGarbage = 17, + ShowersEmptyGarbage = 18, + VaultRoomPolishRuby = 19, + CockpitStabilizeSteering = 20, + ArmoryDownloadData = 21, + CockpitDownloadData = 22, + CommsDownloadData = 23, + MedicalDownloadData = 24, + ViewingDeckDownloadData = 25, + ElectricalDivertPowerToArmory = 26, + ElectricalDivertPowerToCockpit = 27, + ElectricalDivertPowerToGapRoom = 28, + ElectricalDivertPowerToMainHall = 29, + ElectricalDivertPowerToMeetingRoom = 30, + ElectricalDivertPowerToShowers = 31, + ElectricalDivertPowerToEngine = 32, + ShowersPickUpTowels = 33, + LoungeCleanToilet = 34, + VaultRoomDressMannequin = 35, + RecordsSortRecords = 36, + ArmoryPutAwayPistols = 37, + ArmoryPutAwayRifles = 38, + MainHallDecontaminate = 39, + KitchenMakeBurger = 40, + ShowersFixShower = 41, + CleanVent = 42, } public Ids Id { get; } diff --git a/src/Impostor.Api/Innersloth/Maps/Tasks/MiraTask.cs b/src/Impostor.Api/Innersloth/Maps/Tasks/MiraTask.cs index 75755af3..b0e2f776 100644 --- a/src/Impostor.Api/Innersloth/Maps/Tasks/MiraTask.cs +++ b/src/Impostor.Api/Innersloth/Maps/Tasks/MiraTask.cs @@ -39,6 +39,7 @@ namespace Impostor.Api.Innersloth.Maps.Tasks OfficeProcessData = 23, LaunchpadRunDiagnostics = 24, ReactorUnlockManifolds = 25, + CleanVent = 26, } public Ids Id { get; } diff --git a/src/Impostor.Api/Innersloth/Maps/Tasks/SkeldTask.cs b/src/Impostor.Api/Innersloth/Maps/Tasks/SkeldTask.cs index dc3db8ac..7427044e 100644 --- a/src/Impostor.Api/Innersloth/Maps/Tasks/SkeldTask.cs +++ b/src/Impostor.Api/Innersloth/Maps/Tasks/SkeldTask.cs @@ -42,6 +42,7 @@ namespace Impostor.Api.Innersloth.Maps.Tasks ElectricalDivertPowerToNavigation = 26, ElectricalDivertPowerToLowerEngine = 27, ElectricalDivertPowerToSecurity = 28, + CleanVent = 29, } public Ids Id { get; } diff --git a/src/Impostor.Api/Innersloth/TaskTypes.cs b/src/Impostor.Api/Innersloth/TaskTypes.cs index 1e8653cd..f5c056c6 100644 --- a/src/Impostor.Api/Innersloth/TaskTypes.cs +++ b/src/Impostor.Api/Innersloth/TaskTypes.cs @@ -62,5 +62,6 @@ namespace Impostor.Api.Innersloth GetBiggolSword = 57, PutAwayRifles = 58, StopCharles = 59, + VentCleaning = 60, } } diff --git a/src/Impostor.Api/Net/IClient.cs b/src/Impostor.Api/Net/IClient.cs index 66ab9c5e..02cdee8c 100644 --- a/src/Impostor.Api/Net/IClient.cs +++ b/src/Impostor.Api/Net/IClient.cs @@ -27,6 +27,16 @@ namespace Impostor.Api.Net /// string Name { get; } + /// + /// Gets the language. + /// + Language Language { get; } + + /// + /// Gets the quick chat mode. + /// + QuickChatModes ChatMode { get; } + /// /// Gets the connection of the client. /// diff --git a/src/Impostor.Api/Net/Inner/RpcCalls.cs b/src/Impostor.Api/Net/Inner/RpcCalls.cs index b251a93a..1fe23278 100644 --- a/src/Impostor.Api/Net/Inner/RpcCalls.cs +++ b/src/Impostor.Api/Net/Inner/RpcCalls.cs @@ -35,5 +35,7 @@ ClimbLadder = 31, UsePlatform = 32, SendQuickChat = 33, + BootFromVent = 34, + UpdateSystem = 35, } } diff --git a/src/Impostor.Api/Net/Messages/C2S/HandshakeC2S.cs b/src/Impostor.Api/Net/Messages/C2S/HandshakeC2S.cs index 649e5eec..83fd647a 100644 --- a/src/Impostor.Api/Net/Messages/C2S/HandshakeC2S.cs +++ b/src/Impostor.Api/Net/Messages/C2S/HandshakeC2S.cs @@ -1,12 +1,40 @@ +using Impostor.Api.Innersloth; + namespace Impostor.Api.Net.Messages.C2S { public static class HandshakeC2S { - public static void Deserialize(IMessageReader reader, out int clientVersion, out string name, out uint lastNonceReceived) + public static void Deserialize(IMessageReader reader, out int clientVersion, out string name, out uint? lastNonceReceived, out Language language, out QuickChatModes chatMode) { clientVersion = reader.ReadInt32(); name = reader.ReadString(); - lastNonceReceived = reader.ReadUInt32(); + + if (clientVersion >= Version.V1) + { + lastNonceReceived = reader.ReadUInt32(); + } + else + { + lastNonceReceived = null; + } + + if (clientVersion >= Version.V2) + { + language = (Language)reader.ReadUInt32(); + chatMode = (QuickChatModes)reader.ReadByte(); + } + else + { + language = Language.English; + chatMode = QuickChatModes.FreeChatOrQuickChat; + } + } + + private static class Version + { + public static readonly int V1 = GameVersion.GetVersion(2021, 4, 25); + + public static readonly int V2 = GameVersion.GetVersion(2021, 6, 30); } } } diff --git a/src/Impostor.Api/Net/Messages/Rpcs/Rpc34BootFromVent.cs b/src/Impostor.Api/Net/Messages/Rpcs/Rpc34BootFromVent.cs new file mode 100644 index 00000000..9ae2cb4a --- /dev/null +++ b/src/Impostor.Api/Net/Messages/Rpcs/Rpc34BootFromVent.cs @@ -0,0 +1,15 @@ +namespace Impostor.Api.Net.Messages.Rpcs +{ + public static class Rpc34BootFromVent + { + public static void Serialize(IMessageWriter writer, int ventId) + { + writer.WritePacked(ventId); + } + + public static void Deserialize(IMessageReader reader, out int ventId) + { + ventId = reader.ReadPackedInt32(); + } + } +} diff --git a/src/Impostor.Api/Net/Messages/Rpcs/Rpc35UpdateSystem.cs b/src/Impostor.Api/Net/Messages/Rpcs/Rpc35UpdateSystem.cs new file mode 100644 index 00000000..0a0691d6 --- /dev/null +++ b/src/Impostor.Api/Net/Messages/Rpcs/Rpc35UpdateSystem.cs @@ -0,0 +1,27 @@ +using Impostor.Api.Games; +using Impostor.Api.Innersloth; +using Impostor.Api.Net.Inner.Objects; + +namespace Impostor.Api.Net.Messages.Rpcs +{ + public static class Rpc35UpdateSystem + { + public static void Serialize(IMessageWriter writer, SystemTypes systemType, IInnerPlayerControl playerControl, ushort sequenceId, byte state, byte ventId) + { + writer.Write((byte)systemType); + writer.Write(playerControl.NetId); + writer.Write(sequenceId); + writer.Write(state); + writer.Write(ventId); + } + + public static void Deserialize(IMessageReader reader, IGame game, out SystemTypes systemType, out IInnerPlayerControl? playerControl, out ushort sequenceId, out byte state, out byte ventId) + { + systemType = (SystemTypes)reader.ReadByte(); + playerControl = reader.ReadNetObject(game); + sequenceId = reader.ReadUInt16(); + state = reader.ReadByte(); + ventId = reader.ReadByte(); + } + } +} diff --git a/src/Impostor.Plugins.Example/ExamplePluginStartup.cs b/src/Impostor.Plugins.Example/ExamplePluginStartup.cs index 673026da..fbb282d2 100644 --- a/src/Impostor.Plugins.Example/ExamplePluginStartup.cs +++ b/src/Impostor.Plugins.Example/ExamplePluginStartup.cs @@ -15,6 +15,7 @@ namespace Impostor.Plugins.Example public void ConfigureServices(IServiceCollection services) { services.AddSingleton(); + services.AddSingleton(); services.AddSingleton(); services.AddSingleton(); services.AddSingleton(); diff --git a/src/Impostor.Plugins.Example/Handlers/ClientEventListener.cs b/src/Impostor.Plugins.Example/Handlers/ClientEventListener.cs new file mode 100644 index 00000000..062e2665 --- /dev/null +++ b/src/Impostor.Plugins.Example/Handlers/ClientEventListener.cs @@ -0,0 +1,22 @@ +using Impostor.Api.Events; +using Impostor.Api.Events.Client; +using Microsoft.Extensions.Logging; + +namespace Impostor.Plugins.Example.Handlers +{ + public class ClientEventListener : IEventListener + { + private readonly ILogger _logger; + + public ClientEventListener(ILogger logger) + { + _logger = logger; + } + + [EventListener] + public void OnClientConnected(IClientConnectedEvent e) + { + _logger.LogInformation("Client {name} > connected (language: {language}, chat mode: {chatMode})", e.Client.Name, e.Client.Language, e.Client.ChatMode); + } + } +} diff --git a/src/Impostor.Server/Net/Client.cs b/src/Impostor.Server/Net/Client.cs index 75790346..e755a1cc 100644 --- a/src/Impostor.Server/Net/Client.cs +++ b/src/Impostor.Server/Net/Client.cs @@ -24,8 +24,8 @@ namespace Impostor.Server.Net private readonly GameManager _gameManager; private readonly ICustomMessageManager _customMessageManager; - public Client(ILogger logger, IOptions antiCheatOptions, ClientManager clientManager, GameManager gameManager, ICustomMessageManager customMessageManager, string name, int gameVersion, IHazelConnection connection) - : base(name, gameVersion, connection) + public Client(ILogger logger, IOptions antiCheatOptions, ClientManager clientManager, GameManager gameManager, ICustomMessageManager customMessageManager, string name, int gameVersion, Language language, QuickChatModes chatMode, IHazelConnection connection) + : base(name, gameVersion, language, chatMode, connection) { _logger = logger; _antiCheatConfig = antiCheatOptions.Value; diff --git a/src/Impostor.Server/Net/ClientBase.cs b/src/Impostor.Server/Net/ClientBase.cs index 909c0e9b..c1a63825 100644 --- a/src/Impostor.Server/Net/ClientBase.cs +++ b/src/Impostor.Server/Net/ClientBase.cs @@ -13,10 +13,12 @@ namespace Impostor.Server.Net { internal abstract class ClientBase : IClient { - protected ClientBase(string name, int gameVersion, IHazelConnection connection) + protected ClientBase(string name, int gameVersion, Language language, QuickChatModes chatMode, IHazelConnection connection) { Name = name; GameVersion = gameVersion; + Language = language; + ChatMode = chatMode; Connection = connection; Items = new ConcurrentDictionary(); } @@ -25,6 +27,10 @@ namespace Impostor.Server.Net public string Name { get; } + public Language Language { get; } + + public QuickChatModes ChatMode { get; } + public int GameVersion { get; } public IHazelConnection Connection { get; } diff --git a/src/Impostor.Server/Net/Factories/ClientFactory.cs b/src/Impostor.Server/Net/Factories/ClientFactory.cs index e7d3e668..09e55d99 100644 --- a/src/Impostor.Server/Net/Factories/ClientFactory.cs +++ b/src/Impostor.Server/Net/Factories/ClientFactory.cs @@ -1,4 +1,5 @@ using System; +using Impostor.Api.Innersloth; using Impostor.Api.Net; using Microsoft.Extensions.DependencyInjection; @@ -14,9 +15,9 @@ namespace Impostor.Server.Net.Factories _serviceProvider = serviceProvider; } - public ClientBase Create(IHazelConnection connection, string name, int clientVersion) + public ClientBase Create(IHazelConnection connection, string name, int clientVersion, Language language, QuickChatModes chatMode) { - var client = ActivatorUtilities.CreateInstance(_serviceProvider, name, clientVersion, connection); + var client = ActivatorUtilities.CreateInstance(_serviceProvider, name, clientVersion, language, chatMode, connection); connection.Client = client; return client; } diff --git a/src/Impostor.Server/Net/Factories/IClientFactory.cs b/src/Impostor.Server/Net/Factories/IClientFactory.cs index 11a1ddc9..d0d392d1 100644 --- a/src/Impostor.Server/Net/Factories/IClientFactory.cs +++ b/src/Impostor.Server/Net/Factories/IClientFactory.cs @@ -1,9 +1,10 @@ -using Impostor.Api.Net; +using Impostor.Api.Innersloth; +using Impostor.Api.Net; namespace Impostor.Server.Net.Factories { internal interface IClientFactory { - ClientBase Create(IHazelConnection connection, string name, int clientVersion); + ClientBase Create(IHazelConnection connection, string name, int clientVersion, Language language, QuickChatModes chatMode); } } diff --git a/src/Impostor.Server/Net/Inner/Objects/Components/InnerPlayerPhysics.cs b/src/Impostor.Server/Net/Inner/Objects/Components/InnerPlayerPhysics.cs index 0e84a681..b27ee2f4 100644 --- a/src/Impostor.Server/Net/Inner/Objects/Components/InnerPlayerPhysics.cs +++ b/src/Impostor.Server/Net/Inner/Objects/Components/InnerPlayerPhysics.cs @@ -37,7 +37,7 @@ namespace Impostor.Server.Net.Inner.Objects.Components public override async ValueTask HandleRpcAsync(ClientPlayer sender, ClientPlayer? target, RpcCalls call, IMessageReader reader) { - if (!await ValidateOwnership(call, sender)) + if (call != RpcCalls.BootFromVent && !await ValidateOwnership(call, sender)) { return false; } @@ -46,6 +46,7 @@ namespace Impostor.Server.Net.Inner.Objects.Components { case RpcCalls.EnterVent: case RpcCalls.ExitVent: + { if (!await ValidateImpostor(call, sender, _playerControl.PlayerInfo)) { return false; @@ -86,6 +87,13 @@ namespace Impostor.Server.Net.Inner.Objects.Components } break; + } + + case RpcCalls.BootFromVent: + { + Rpc34BootFromVent.Deserialize(reader, out var ventId); + break; + } case RpcCalls.ClimbLadder: Rpc31ClimbLadder.Deserialize(reader, out var ladderId, out var lastClimbLadderSid); diff --git a/src/Impostor.Server/Net/Inner/Objects/ShipStatus/InnerShipStatus.cs b/src/Impostor.Server/Net/Inner/Objects/ShipStatus/InnerShipStatus.cs index 4d14c632..6a462a3c 100644 --- a/src/Impostor.Server/Net/Inner/Objects/ShipStatus/InnerShipStatus.cs +++ b/src/Impostor.Server/Net/Inner/Objects/ShipStatus/InnerShipStatus.cs @@ -1,4 +1,4 @@ -using System; +using System; using System.Collections.Generic; using System.Linq; using System.Numerics; @@ -105,6 +105,12 @@ namespace Impostor.Server.Net.Inner.Objects.ShipStatus break; } + case RpcCalls.UpdateSystem: + { + Rpc35UpdateSystem.Deserialize(reader, Game, out var systemType, out var playerControl, out var sequenceId, out var state, out var ventId); + break; + } + default: return await base.HandleRpcAsync(sender, target, call, reader); } diff --git a/src/Impostor.Server/Net/Manager/ClientManager.cs b/src/Impostor.Server/Net/Manager/ClientManager.cs index 39e51327..63e34985 100644 --- a/src/Impostor.Server/Net/Manager/ClientManager.cs +++ b/src/Impostor.Server/Net/Manager/ClientManager.cs @@ -22,7 +22,7 @@ namespace Impostor.Server.Net.Manager // NOTE: when updating this array, keep the versions ordered from old to new, otherwise the version compare logic doesn't work properly private static readonly int[] SupportedVersions = { - GameVersion.GetVersion(2021, 4, 25), // 2021.6.15 + GameVersion.GetVersion(2021, 6, 30), // 2021.6.30 }; private readonly ILogger _logger; @@ -65,7 +65,7 @@ namespace Impostor.Server.Net.Manager return clientId; } - public async ValueTask RegisterConnectionAsync(IHazelConnection connection, string name, int clientVersion) + public async ValueTask RegisterConnectionAsync(IHazelConnection connection, string name, int clientVersion, Language language, QuickChatModes chatMode) { var versionCompare = CompareVersion(clientVersion); if (versionCompare != VersionCompareResult.Compatible) @@ -105,7 +105,7 @@ namespace Impostor.Server.Net.Manager return; } - var client = _clientFactory.Create(connection, name, clientVersion); + var client = _clientFactory.Create(connection, name, clientVersion, language, chatMode); var id = NextId(); client.Id = id; diff --git a/src/Impostor.Server/Net/Matchmaker.cs b/src/Impostor.Server/Net/Matchmaker.cs index 79d9c8ff..3e9b1d01 100644 --- a/src/Impostor.Server/Net/Matchmaker.cs +++ b/src/Impostor.Server/Net/Matchmaker.cs @@ -62,14 +62,14 @@ namespace Impostor.Server.Net private async ValueTask OnNewConnection(NewConnectionEventArgs e) { // Handshake. - HandshakeC2S.Deserialize(e.HandshakeData, out var clientVersion, out var name, out _); + HandshakeC2S.Deserialize(e.HandshakeData, out var clientVersion, out var name, out _, out var language, out var chatMode); var connection = new HazelConnection(e.Connection, _connectionLogger); await _eventManager.CallAsync(new ClientConnectionEvent(connection, e.HandshakeData)); // Register client - await _clientManager.RegisterConnectionAsync(connection, name, clientVersion); + await _clientManager.RegisterConnectionAsync(connection, name, clientVersion, language, chatMode); } } } diff --git a/src/Impostor.Server/Net/Redirector/ClientRedirector.cs b/src/Impostor.Server/Net/Redirector/ClientRedirector.cs index 22dc0a7d..4503648b 100644 --- a/src/Impostor.Server/Net/Redirector/ClientRedirector.cs +++ b/src/Impostor.Server/Net/Redirector/ClientRedirector.cs @@ -22,11 +22,13 @@ namespace Impostor.Server.Net.Redirector public ClientRedirector( string name, int gameVersion, + Language language, + QuickChatModes chatMode, HazelConnection connection, ClientManager clientManager, INodeProvider nodeProvider, INodeLocator nodeLocator) - : base(name, gameVersion, connection) + : base(name, gameVersion, language, chatMode, connection) { _clientManager = clientManager; _nodeProvider = nodeProvider; diff --git a/src/Impostor.Server/Recorder/ClientRecorder.cs b/src/Impostor.Server/Recorder/ClientRecorder.cs index 0e01e0c5..20fa59e7 100644 --- a/src/Impostor.Server/Recorder/ClientRecorder.cs +++ b/src/Impostor.Server/Recorder/ClientRecorder.cs @@ -1,4 +1,5 @@ using System.Threading.Tasks; +using Impostor.Api.Innersloth; using Impostor.Api.Net.Custom; using Impostor.Api.Net.Messages; using Impostor.Server.Config; @@ -17,8 +18,8 @@ namespace Impostor.Server.Recorder private bool _createdGame; private bool _recordAfter; - public ClientRecorder(ILogger logger, IOptions antiCheatOptions, ClientManager clientManager, ICustomMessageManager customMessageManager, GameManager gameManager, string name, int gameVersion, HazelConnection connection, PacketRecorder recorder) - : base(logger, antiCheatOptions, clientManager, gameManager, customMessageManager, name, gameVersion, connection) + public ClientRecorder(ILogger logger, IOptions antiCheatOptions, ClientManager clientManager, ICustomMessageManager customMessageManager, GameManager gameManager, string name, int gameVersion, Language language, QuickChatModes chatMode, HazelConnection connection, PacketRecorder recorder) + : base(logger, antiCheatOptions, clientManager, gameManager, customMessageManager, name, gameVersion, language, chatMode, connection) { _recorder = recorder; _isFirst = true; diff --git a/src/Impostor.Tools.ServerReplay/Program.cs b/src/Impostor.Tools.ServerReplay/Program.cs index 6c8c08b3..78c5b78f 100644 --- a/src/Impostor.Tools.ServerReplay/Program.cs +++ b/src/Impostor.Tools.ServerReplay/Program.cs @@ -170,7 +170,7 @@ namespace Impostor.Tools.ServerReplay // Create and register connection. var connection = new MockHazelConnection(address); - await _clientManager.RegisterConnectionAsync(connection, name, gameVersion); + await _clientManager.RegisterConnectionAsync(connection, name, gameVersion, Language.English, QuickChatModes.FreeChatOrQuickChat); // Store reference for ourselfs. Connections.Add(clientId, connection);