Merge pull request #431 from miniduikboot/feature/2021.6.30

This commit is contained in:
js6pak authored and GitHub committed 2021-07-30 20:41:57 +02:00
commit d86efc1345
26 files changed
+201 -60

No files matched your search

+1 -1
View File
@@ -1,6 +1,6 @@
<Project>
<PropertyGroup>
<VersionPrefix>1.5.0</VersionPrefix>
<VersionPrefix>1.6.0</VersionPrefix>
<VersionSuffix>dev</VersionSuffix>
<EnforceCodeStyleInBuild Condition="$(MSBuildProjectName)!='Hazel'">true</EnforceCodeStyleInBuild>
</PropertyGroup>
@@ -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();
@@ -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();
@@ -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();
@@ -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; }
@@ -39,6 +39,7 @@ namespace Impostor.Api.Innersloth.Maps.Tasks
OfficeProcessData = 23,
LaunchpadRunDiagnostics = 24,
ReactorUnlockManifolds = 25,
CleanVent = 26,
}
public Ids Id { get; }
@@ -42,6 +42,7 @@ namespace Impostor.Api.Innersloth.Maps.Tasks
ElectricalDivertPowerToNavigation = 26,
ElectricalDivertPowerToLowerEngine = 27,
ElectricalDivertPowerToSecurity = 28,
CleanVent = 29,
}
public Ids Id { get; }
+1
View File
@@ -62,5 +62,6 @@ namespace Impostor.Api.Innersloth
GetBiggolSword = 57,
PutAwayRifles = 58,
StopCharles = 59,
VentCleaning = 60,
}
}
+10
View File
@@ -27,6 +27,16 @@ namespace Impostor.Api.Net
/// </remarks>
string Name { get; }
/// <summary>
/// Gets the language.
/// </summary>
Language Language { get; }
/// <summary>
/// Gets the quick chat mode.
/// </summary>
QuickChatModes ChatMode { get; }
/// <summary>
/// Gets the connection of the client.
/// </summary>
+2
View File
@@ -35,5 +35,7 @@
ClimbLadder = 31,
UsePlatform = 32,
SendQuickChat = 33,
BootFromVent = 34,
UpdateSystem = 35,
}
}
@@ -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);
}
}
}
@@ -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();
}
}
}
@@ -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<IInnerPlayerControl>(game);
sequenceId = reader.ReadUInt16();
state = reader.ReadByte();
ventId = reader.ReadByte();
}
}
}
@@ -15,6 +15,7 @@ namespace Impostor.Plugins.Example
public void ConfigureServices(IServiceCollection services)
{
services.AddSingleton<IEventListener, GameEventListener>();
services.AddSingleton<IEventListener, ClientEventListener>();
services.AddSingleton<IEventListener, PlayerEventListener>();
services.AddSingleton<IEventListener, MeetingEventListener>();
services.AddSingleton<IEventListener, AnnouncementsListener>();
@@ -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<ClientEventListener> _logger;
public ClientEventListener(ILogger<ClientEventListener> 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);
}
}
}
+2 -2
View File
@@ -24,8 +24,8 @@ namespace Impostor.Server.Net
private readonly GameManager _gameManager;
private readonly ICustomMessageManager<ICustomRootMessage> _customMessageManager;
public Client(ILogger<Client> logger, IOptions<AntiCheatConfig> antiCheatOptions, ClientManager clientManager, GameManager gameManager, ICustomMessageManager<ICustomRootMessage> customMessageManager, string name, int gameVersion, IHazelConnection connection)
: base(name, gameVersion, connection)
public Client(ILogger<Client> logger, IOptions<AntiCheatConfig> antiCheatOptions, ClientManager clientManager, GameManager gameManager, ICustomMessageManager<ICustomRootMessage> customMessageManager, string name, int gameVersion, Language language, QuickChatModes chatMode, IHazelConnection connection)
: base(name, gameVersion, language, chatMode, connection)
{
_logger = logger;
_antiCheatConfig = antiCheatOptions.Value;
+7 -1
View File
@@ -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<object, object>();
}
@@ -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; }
@@ -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<TClient>(_serviceProvider, name, clientVersion, connection);
var client = ActivatorUtilities.CreateInstance<TClient>(_serviceProvider, name, clientVersion, language, chatMode, connection);
connection.Client = client;
return client;
}
@@ -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);
}
}
@@ -37,7 +37,7 @@ namespace Impostor.Server.Net.Inner.Objects.Components
public override async ValueTask<bool> 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);
@@ -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);
}
@@ -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<ClientManager> _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;
+2 -2
View File
@@ -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);
}
}
}
@@ -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;
@@ -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<Client> logger, IOptions<AntiCheatConfig> antiCheatOptions, ClientManager clientManager, ICustomMessageManager<ICustomRootMessage> customMessageManager, GameManager gameManager, string name, int gameVersion, HazelConnection connection, PacketRecorder recorder)
: base(logger, antiCheatOptions, clientManager, gameManager, customMessageManager, name, gameVersion, connection)
public ClientRecorder(ILogger<Client> logger, IOptions<AntiCheatConfig> antiCheatOptions, ClientManager clientManager, ICustomMessageManager<ICustomRootMessage> 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;
+1 -1
View File
@@ -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);