From: cybershard <72947914+cybershard@users.noreply.github.com> Date: Mon, 30 Nov 2020 19:24:39 +0000 (+0000) Subject: Fix [API Bug] Task indices being cast to TaskTypes #159 (#164) X-Git-Tag: v1.2.2~6 X-Git-Url: https://git.deb.at/?a=commitdiff_plain;h=a136c676710f8810851a109af36c531ce064cc4a;p=rhonda%2Fimpostor.git Fix [API Bug] Task indices being cast to TaskTypes #159 (#164) Co-authored-by: AeonLucid --- diff --git a/src/Impostor.Api/Events/Game/Player/IPlayerCompletedTaskEvent.cs b/src/Impostor.Api/Events/Game/Player/IPlayerCompletedTaskEvent.cs index 593c53d..78ccd2d 100644 --- a/src/Impostor.Api/Events/Game/Player/IPlayerCompletedTaskEvent.cs +++ b/src/Impostor.Api/Events/Game/Player/IPlayerCompletedTaskEvent.cs @@ -1,9 +1,10 @@ using Impostor.Api.Innersloth; +using Impostor.Api.Net.Inner.Objects; namespace Impostor.Api.Events.Player { public interface IPlayerCompletedTaskEvent : IPlayerEvent { - TaskTypes Task { get; } + ITaskInfo Task { get; } } -} \ No newline at end of file +} diff --git a/src/Impostor.Api/Net/Inner/Objects/IInnerPlayerInfo.cs b/src/Impostor.Api/Net/Inner/Objects/IInnerPlayerInfo.cs index 23c45f5..6cb3302 100644 --- a/src/Impostor.Api/Net/Inner/Objects/IInnerPlayerInfo.cs +++ b/src/Impostor.Api/Net/Inner/Objects/IInnerPlayerInfo.cs @@ -45,9 +45,9 @@ namespace Impostor.Api.Net.Inner.Objects /// Gets the reason why the player is dead in the current game. /// DeathReason LastDeathReason { get; } - - List Tasks { get; } - + + IEnumerable Tasks { get; } + DateTimeOffset LastMurder { get; } } -} \ No newline at end of file +} diff --git a/src/Impostor.Api/Net/Inner/Objects/ITaskInfo.cs b/src/Impostor.Api/Net/Inner/Objects/ITaskInfo.cs index 3a6f075..2b6dd86 100644 --- a/src/Impostor.Api/Net/Inner/Objects/ITaskInfo.cs +++ b/src/Impostor.Api/Net/Inner/Objects/ITaskInfo.cs @@ -5,8 +5,10 @@ namespace Impostor.Api.Net.Inner.Objects { public interface ITaskInfo { + uint Id { get; } + TaskTypes Type { get; } - + bool Complete { get; } } -} \ No newline at end of file +} diff --git a/src/Impostor.Server/Events/Game/Player/PlayerCompletedTaskEvent.cs b/src/Impostor.Server/Events/Game/Player/PlayerCompletedTaskEvent.cs index f0f6ab7..330135d 100644 --- a/src/Impostor.Server/Events/Game/Player/PlayerCompletedTaskEvent.cs +++ b/src/Impostor.Server/Events/Game/Player/PlayerCompletedTaskEvent.cs @@ -8,12 +8,12 @@ namespace Impostor.Server.Events.Player { public class PlayerCompletedTaskEvent : IPlayerCompletedTaskEvent { - public PlayerCompletedTaskEvent(IGame game, IClientPlayer clientPlayer, IInnerPlayerControl playerControl, uint taskID) + public PlayerCompletedTaskEvent(IGame game, IClientPlayer clientPlayer, IInnerPlayerControl playerControl, ITaskInfo task) { Game = game; ClientPlayer = clientPlayer; PlayerControl = playerControl; - Task = (TaskTypes)taskID; + Task = task; } public IGame Game { get; } @@ -22,6 +22,6 @@ namespace Impostor.Server.Events.Player public IInnerPlayerControl PlayerControl { get; } - public TaskTypes Task { get; } + public ITaskInfo Task { get; } } -} \ No newline at end of file +} diff --git a/src/Impostor.Server/Net/Inner/Objects/InnerGameData.TaskInfo.cs b/src/Impostor.Server/Net/Inner/Objects/InnerGameData.TaskInfo.cs index b4aa46a..29ca50a 100644 --- a/src/Impostor.Server/Net/Inner/Objects/InnerGameData.TaskInfo.cs +++ b/src/Impostor.Server/Net/Inner/Objects/InnerGameData.TaskInfo.cs @@ -8,21 +8,23 @@ namespace Impostor.Server.Net.Inner.Objects { public class TaskInfo : ITaskInfo { - public TaskTypes Type { get; internal set; } + public uint Id { get; internal set; } public bool Complete { get; internal set; } + public TaskTypes Type { get; internal set; } + public void Serialize(IMessageWriter writer) { - writer.WritePacked((uint)Type); + writer.WritePacked((uint)Id); writer.Write(Complete); } public void Deserialize(IMessageReader reader) { - this.Type = (TaskTypes)reader.ReadPackedUInt32(); - this.Complete = reader.ReadBoolean(); + Id = reader.ReadPackedUInt32(); + Complete = reader.ReadBoolean(); } } } -} \ No newline at end of file +} diff --git a/src/Impostor.Server/Net/Inner/Objects/InnerGameData.cs b/src/Impostor.Server/Net/Inner/Objects/InnerGameData.cs index af650e3..ed68038 100644 --- a/src/Impostor.Server/Net/Inner/Objects/InnerGameData.cs +++ b/src/Impostor.Server/Net/Inner/Objects/InnerGameData.cs @@ -173,11 +173,14 @@ namespace Impostor.Server.Net.Inner.Objects return; } - player.Tasks = new List(taskTypeIds.Length); + player.Tasks = new List(taskTypeIds.Length); foreach (var taskId in taskTypeIds.ToArray()) { - player.Tasks.Add(new TaskInfo { Type = (TaskTypes)taskId }); + player.Tasks.Add(new TaskInfo + { + Id = taskId, + }); } } } diff --git a/src/Impostor.Server/Net/Inner/Objects/InnerPlayerControl.cs b/src/Impostor.Server/Net/Inner/Objects/InnerPlayerControl.cs index b1867c8..a2c6396 100644 --- a/src/Impostor.Server/Net/Inner/Objects/InnerPlayerControl.cs +++ b/src/Impostor.Server/Net/Inner/Objects/InnerPlayerControl.cs @@ -81,7 +81,17 @@ namespace Impostor.Server.Net.Inner.Objects } var taskId = reader.ReadPackedUInt32(); - await _eventManager.CallAsync(new PlayerCompletedTaskEvent(_game, sender, this, taskId)); + var task = PlayerInfo.Tasks[(int)taskId]; + if (task == null) + { + _logger.LogWarning($"Client sent {nameof(RpcCalls.CompleteTask)} with a taskIndex that is not in their {nameof(InnerPlayerInfo)}"); + } + else + { + task.Complete = true; + await _eventManager.CallAsync(new PlayerCompletedTaskEvent(_game, sender, this, task)); + } + break; } diff --git a/src/Impostor.Server/Net/Inner/Objects/InnerPlayerInfo.Api.cs b/src/Impostor.Server/Net/Inner/Objects/InnerPlayerInfo.Api.cs new file mode 100644 index 0000000..512a4f1 --- /dev/null +++ b/src/Impostor.Server/Net/Inner/Objects/InnerPlayerInfo.Api.cs @@ -0,0 +1,10 @@ +using System.Collections.Generic; +using Impostor.Api.Net.Inner.Objects; + +namespace Impostor.Server.Net.Inner.Objects +{ + internal partial class InnerPlayerInfo : IInnerPlayerInfo + { + IEnumerable IInnerPlayerInfo.Tasks => Tasks; + } +} diff --git a/src/Impostor.Server/Net/Inner/Objects/InnerPlayerInfo.cs b/src/Impostor.Server/Net/Inner/Objects/InnerPlayerInfo.cs index 2aee193..f248994 100644 --- a/src/Impostor.Server/Net/Inner/Objects/InnerPlayerInfo.cs +++ b/src/Impostor.Server/Net/Inner/Objects/InnerPlayerInfo.cs @@ -2,12 +2,11 @@ using System.Collections.Generic; using Impostor.Api.Games; using Impostor.Api.Innersloth; -using Impostor.Api.Net.Inner.Objects; using Impostor.Api.Net.Messages; namespace Impostor.Server.Net.Inner.Objects { - internal class InnerPlayerInfo : IInnerPlayerInfo + internal partial class InnerPlayerInfo { public InnerPlayerInfo(byte playerId) { @@ -36,7 +35,7 @@ namespace Impostor.Server.Net.Inner.Objects public DeathReason LastDeathReason { get; internal set; } - public List Tasks { get; internal set; } + public List Tasks { get; internal set; } public DateTimeOffset LastMurder { get; set; } @@ -67,12 +66,10 @@ namespace Impostor.Server.Net.Inner.Objects IsImpostor = (flag & 2) > 0; IsDead = (flag & 4) > 0; var taskCount = reader.ReadByte(); - Tasks = new List(); for (var i = 0; i < taskCount; i++) { - var task = new InnerGameData.TaskInfo(); - task.Deserialize(reader); - Tasks.Add(task); + Tasks[i] ??= new InnerGameData.TaskInfo(); + Tasks[i].Deserialize(reader); } } }