]> git.deb.at Git - rhonda/impostor.git/commitdiff
Fix [API Bug] Task indices being cast to TaskTypes #159 (#164)
authorcybershard <72947914+cybershard@users.noreply.github.com>
Mon, 30 Nov 2020 19:24:39 +0000 (19:24 +0000)
committerGitHub <noreply@github.com>
Mon, 30 Nov 2020 19:24:39 +0000 (20:24 +0100)
Co-authored-by: AeonLucid <aeonlucid@outlook.com>
src/Impostor.Api/Events/Game/Player/IPlayerCompletedTaskEvent.cs
src/Impostor.Api/Net/Inner/Objects/IInnerPlayerInfo.cs
src/Impostor.Api/Net/Inner/Objects/ITaskInfo.cs
src/Impostor.Server/Events/Game/Player/PlayerCompletedTaskEvent.cs
src/Impostor.Server/Net/Inner/Objects/InnerGameData.TaskInfo.cs
src/Impostor.Server/Net/Inner/Objects/InnerGameData.cs
src/Impostor.Server/Net/Inner/Objects/InnerPlayerControl.cs
src/Impostor.Server/Net/Inner/Objects/InnerPlayerInfo.Api.cs [new file with mode: 0644]
src/Impostor.Server/Net/Inner/Objects/InnerPlayerInfo.cs

index 593c53d531d7a869bd93524a3322cc49306d499f..78ccd2d6a3cbd19ce0247406acc625841a0e849a 100644 (file)
@@ -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
+}
index 23c45f50cf50e6cfc50254dd85e80a695ea12e1d..6cb33024afd6837bc1abc79408fc51d9b2daa1b4 100644 (file)
@@ -45,9 +45,9 @@ namespace Impostor.Api.Net.Inner.Objects
         ///     Gets the reason why the player is dead in the current game.
         /// </summary>
         DeathReason LastDeathReason { get; }
-        
-        List<ITaskInfo> Tasks { get; }
-        
+
+        IEnumerable<ITaskInfo> Tasks { get; }
+
         DateTimeOffset LastMurder { get; }
     }
-}
\ No newline at end of file
+}
index 3a6f07531724e2ec6a980f2f82f46aaa3701e843..2b6dd86f0561288ce152e0c188b442874f747359 100644 (file)
@@ -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
+}
index f0f6ab742bec1c5f167f5e461a9da12acd443605..330135d16587a4342a1edc8877b4a46227fdb6fa 100644 (file)
@@ -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
+}
index b4aa46a43cb46566c876912460657ca9f06f62c0..29ca50a42acafbdb56ea8237a707162985153f88 100644 (file)
@@ -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
+}
index af650e3f02b9c6446e979648f79a7542008f1807..ed68038881abb361a63e28b4870be8b440d66441 100644 (file)
@@ -173,11 +173,14 @@ namespace Impostor.Server.Net.Inner.Objects
                 return;
             }
 
-            player.Tasks = new List<ITaskInfo>(taskTypeIds.Length);
+            player.Tasks = new List<TaskInfo>(taskTypeIds.Length);
 
             foreach (var taskId in taskTypeIds.ToArray())
             {
-                player.Tasks.Add(new TaskInfo { Type = (TaskTypes)taskId });
+                player.Tasks.Add(new TaskInfo
+                {
+                    Id = taskId,
+                });
             }
         }
     }
index b1867c8799fef891252b319d36e2436e23d41ea9..a2c639682309c936a7955ef162d86508662a01bb 100644 (file)
@@ -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 (file)
index 0000000..512a4f1
--- /dev/null
@@ -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<ITaskInfo> IInnerPlayerInfo.Tasks => Tasks;
+    }
+}
index 2aee193826965e689050e9225ae37d8e02d45663..f248994ee3737e3a462790f2149b8e8681476eca 100644 (file)
@@ -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<ITaskInfo> Tasks { get; internal set; }
+        public List<InnerGameData.TaskInfo> 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<ITaskInfo>();
             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);
             }
         }
     }