From: miniduikboot Date: Fri, 21 Jun 2024 21:05:07 +0000 (+0200) Subject: Sync over tasks X-Git-Tag: v1.10.0~7^2~7 X-Git-Url: https://git.deb.at/?a=commitdiff_plain;h=ccd36b6571b96d05b37d80b8a993b6e5e32915bc;p=rhonda%2Fimpostor.git Sync over tasks As tasks used to be part of the GameData, 2024.6.18 has moved them to the PlayerInfo. Because they are now called on the PlayerInfo of the correct player, the playerId field in the RPC is no longer necessary. --- diff --git a/src/Impostor.Api/Net/Messages/Rpcs/Rpc29SetTasks.cs b/src/Impostor.Api/Net/Messages/Rpcs/Rpc29SetTasks.cs index aba9a71..eb2bab4 100644 --- a/src/Impostor.Api/Net/Messages/Rpcs/Rpc29SetTasks.cs +++ b/src/Impostor.Api/Net/Messages/Rpcs/Rpc29SetTasks.cs @@ -4,15 +4,13 @@ namespace Impostor.Api.Net.Messages.Rpcs { public static class Rpc29SetTasks { - public static void Serialize(IMessageWriter writer, byte playerId, ReadOnlyMemory taskTypeIds) + public static void Serialize(IMessageWriter writer, ReadOnlyMemory taskTypeIds) { - writer.Write(playerId); writer.Write(taskTypeIds); } - public static void Deserialize(IMessageReader reader, out byte playerId, out ReadOnlyMemory taskTypeIds) + public static void Deserialize(IMessageReader reader, out ReadOnlyMemory taskTypeIds) { - playerId = reader.ReadByte(); taskTypeIds = reader.ReadBytesAndSize(); } } diff --git a/src/Impostor.Server/Net/Inner/Objects/InnerGameData.TaskInfo.Api.cs b/src/Impostor.Server/Net/Inner/Objects/InnerGameData.TaskInfo.Api.cs deleted file mode 100644 index c8aa17f..0000000 --- a/src/Impostor.Server/Net/Inner/Objects/InnerGameData.TaskInfo.Api.cs +++ /dev/null @@ -1,39 +0,0 @@ -using System.Threading.Tasks; -using Impostor.Api; -using Impostor.Api.Net.Inner; -using Impostor.Api.Net.Messages.Rpcs; -using Impostor.Server.Events.Player; - -namespace Impostor.Server.Net.Inner.Objects -{ - internal partial class InnerGameData - { - public partial class TaskInfo - { - public async ValueTask CompleteAsync() - { - if (_playerInfo.Controller == null) - { - throw new ImpostorException("Can't complete a task that doesn't have a player assigned"); - } - - var player = _playerInfo.Controller; - - if (Complete) - { - throw new ImpostorException("Can't complete a task that is already completed"); - } - - Complete = true; - - // Send RPC. - using var writer = player.Game.StartRpc(player.NetId, RpcCalls.CompleteTask); - Rpc01CompleteTask.Serialize(writer, Id); - await player.Game.FinishRpcAsync(writer); - - // Notify plugins. - await _eventManager.CallAsync(new PlayerCompletedTaskEvent(player.Game, player.Game.GetClientPlayer(player.OwnerId)!, player, this)); - } - } - } -} diff --git a/src/Impostor.Server/Net/Inner/Objects/InnerGameData.TaskInfo.cs b/src/Impostor.Server/Net/Inner/Objects/InnerGameData.TaskInfo.cs deleted file mode 100644 index b4a9620..0000000 --- a/src/Impostor.Server/Net/Inner/Objects/InnerGameData.TaskInfo.cs +++ /dev/null @@ -1,41 +0,0 @@ -using Impostor.Api.Events.Managers; -using Impostor.Api.Innersloth.Maps; -using Impostor.Api.Net.Inner.Objects; - -namespace Impostor.Server.Net.Inner.Objects -{ - internal partial class InnerGameData - { - public partial class TaskInfo : ITaskInfo - { - private readonly InnerPlayerInfo _playerInfo; - private readonly IEventManager _eventManager; - - public TaskInfo(InnerPlayerInfo playerInfo, IEventManager eventManager, uint id, TaskData? task) - { - _playerInfo = playerInfo; - _eventManager = eventManager; - Id = id; - Task = task; - } - - public uint Id { get; internal set; } - - public TaskData? Task { get; internal set; } - - public bool Complete { get; internal set; } - - public void Serialize(IMessageWriter writer) - { - writer.WritePacked(Id); - writer.Write(Complete); - } - - public void Deserialize(IMessageReader reader) - { - Id = reader.ReadPackedUInt32(); - Complete = reader.ReadBoolean(); - } - } - } -} diff --git a/src/Impostor.Server/Net/Inner/Objects/InnerPlayerInfo.cs b/src/Impostor.Server/Net/Inner/Objects/InnerPlayerInfo.cs index 498f8f6..1a9de06 100644 --- a/src/Impostor.Server/Net/Inner/Objects/InnerPlayerInfo.cs +++ b/src/Impostor.Server/Net/Inner/Objects/InnerPlayerInfo.cs @@ -1,12 +1,15 @@ using System; using System.Collections.Generic; using System.Threading.Tasks; +using Impostor.Api.Events.Managers; using Impostor.Api.Games; using Impostor.Api.Innersloth; using Impostor.Api.Innersloth.Customization; using Impostor.Api.Innersloth.GameOptions; using Impostor.Api.Net; using Impostor.Api.Net.Custom; +using Impostor.Api.Net.Inner; +using Impostor.Api.Net.Messages.Rpcs; using Impostor.Api.Utils; using Impostor.Server.Net.State; using Microsoft.Extensions.Logging; @@ -15,11 +18,13 @@ namespace Impostor.Server.Net.Inner.Objects { internal partial class InnerPlayerInfo { + private readonly IEventManager _eventManager; private readonly ILogger _logger; - public InnerPlayerInfo(ICustomMessageManager customMessageManager, Game game, ILogger logger) : base(customMessageManager, game) + public InnerPlayerInfo(ICustomMessageManager customMessageManager, IEventManager eventManager, Game game, ILogger logger) : base(customMessageManager, game) { Components.Add(this); + _eventManager = eventManager; _logger = logger; } @@ -54,7 +59,7 @@ namespace Impostor.Server.Net.Inner.Objects public DeathReason LastDeathReason { get; internal set; } - public List Tasks { get; internal set; } = new List(0); + public List Tasks { get; internal set; } = new List(0); public DateTimeOffset LastMurder { get; set; } @@ -176,5 +181,39 @@ namespace Impostor.Server.Net.Inner.Objects return ValueTask.CompletedTask; } + + public override async ValueTask HandleRpcAsync(ClientPlayer sender, ClientPlayer? target, RpcCalls call, IMessageReader reader) + { + switch (call) + { + case RpcCalls.SetTasks: + Rpc29SetTasks.Deserialize(reader, out var taskTypeIds); + SetTasks(taskTypeIds); + break; + + default: + return await base.HandleRpcAsync(sender, target, call, reader); + } + + return true; + } + + private void SetTasks(ReadOnlyMemory taskTypeIds) + { + if (Disconnected) + { + return; + } + + Tasks = new List(taskTypeIds.Length); + + var taskId = 0u; + foreach (var taskTypeId in taskTypeIds.Span) + { + var mapTasks = Game.GameNet!.ShipStatus?.Data.Tasks; + var taskType = (mapTasks != null && mapTasks.ContainsKey(taskTypeId)) ? mapTasks[taskTypeId] : null; + Tasks.Add(new TaskInfo(this, _eventManager, taskId++, taskType)); + } + } } } diff --git a/src/Impostor.Server/Net/Inner/Objects/TaskInfo.cs b/src/Impostor.Server/Net/Inner/Objects/TaskInfo.cs new file mode 100644 index 0000000..c04c27d --- /dev/null +++ b/src/Impostor.Server/Net/Inner/Objects/TaskInfo.cs @@ -0,0 +1,68 @@ +using System.Threading.Tasks; +using Impostor.Api; +using Impostor.Api.Events.Managers; +using Impostor.Api.Innersloth.Maps; +using Impostor.Api.Net.Inner; +using Impostor.Api.Net.Inner.Objects; +using Impostor.Api.Net.Messages.Rpcs; +using Impostor.Server.Events.Player; + +namespace Impostor.Server.Net.Inner.Objects +{ + internal class TaskInfo : ITaskInfo + { + private readonly InnerPlayerInfo _playerInfo; + private readonly IEventManager _eventManager; + + public TaskInfo(InnerPlayerInfo playerInfo, IEventManager eventManager, uint id, TaskData? task) + { + _playerInfo = playerInfo; + _eventManager = eventManager; + Id = id; + Task = task; + } + + public uint Id { get; internal set; } + + public TaskData? Task { get; internal set; } + + public bool Complete { get; internal set; } + + public void Serialize(IMessageWriter writer) + { + writer.WritePacked(Id); + writer.Write(Complete); + } + + public void Deserialize(IMessageReader reader) + { + Id = reader.ReadPackedUInt32(); + Complete = reader.ReadBoolean(); + } + + public async ValueTask CompleteAsync() + { + if (_playerInfo.Controller == null) + { + throw new ImpostorException("Can't complete a task that doesn't have a player assigned"); + } + + var player = _playerInfo.Controller; + + if (Complete) + { + throw new ImpostorException("Can't complete a task that is already completed"); + } + + Complete = true; + + // Send RPC. + using var writer = player.Game.StartRpc(player.NetId, RpcCalls.CompleteTask); + Rpc01CompleteTask.Serialize(writer, Id); + await player.Game.FinishRpcAsync(writer); + + // Notify plugins. + await _eventManager.CallAsync(new PlayerCompletedTaskEvent(player.Game, player.Game.GetClientPlayer(player.OwnerId)!, player, this)); + } + } +}