]> git.deb.at Git - rhonda/impostor.git/commitdiff
Sync over tasks
authorminiduikboot <mini@duikbo.at>
Fri, 21 Jun 2024 21:05:07 +0000 (23:05 +0200)
committerminiduikboot <mini@duikbo.at>
Tue, 20 Aug 2024 19:41:38 +0000 (21:41 +0200)
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.

src/Impostor.Api/Net/Messages/Rpcs/Rpc29SetTasks.cs
src/Impostor.Server/Net/Inner/Objects/InnerGameData.TaskInfo.Api.cs [deleted file]
src/Impostor.Server/Net/Inner/Objects/InnerGameData.TaskInfo.cs [deleted file]
src/Impostor.Server/Net/Inner/Objects/InnerPlayerInfo.cs
src/Impostor.Server/Net/Inner/Objects/TaskInfo.cs [new file with mode: 0644]

index aba9a7158e235e4e54ab4317324616930c1eb8c8..eb2bab49daf3e66d638f2dc9f020923073b54061 100644 (file)
@@ -4,15 +4,13 @@ namespace Impostor.Api.Net.Messages.Rpcs
 {
     public static class Rpc29SetTasks
     {
-        public static void Serialize(IMessageWriter writer, byte playerId, ReadOnlyMemory<byte> taskTypeIds)
+        public static void Serialize(IMessageWriter writer, ReadOnlyMemory<byte> taskTypeIds)
         {
-            writer.Write(playerId);
             writer.Write(taskTypeIds);
         }
 
-        public static void Deserialize(IMessageReader reader, out byte playerId, out ReadOnlyMemory<byte> taskTypeIds)
+        public static void Deserialize(IMessageReader reader, out ReadOnlyMemory<byte> 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 (file)
index c8aa17f..0000000
+++ /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 (file)
index b4a9620..0000000
+++ /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();
-            }
-        }
-    }
-}
index 498f8f6b8f972bc89b616b79ed69e43df502c53e..1a9de063a0c17e1840b6a5f099c404103b6bc0d9 100644 (file)
@@ -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<InnerPlayerInfo> _logger;
 
-        public InnerPlayerInfo(ICustomMessageManager<ICustomRpc> customMessageManager, Game game, ILogger<InnerPlayerInfo> logger) : base(customMessageManager, game)
+        public InnerPlayerInfo(ICustomMessageManager<ICustomRpc> customMessageManager, IEventManager eventManager, Game game, ILogger<InnerPlayerInfo> 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<InnerGameData.TaskInfo> Tasks { get; internal set; } = new List<InnerGameData.TaskInfo>(0);
+        public List<TaskInfo> Tasks { get; internal set; } = new List<TaskInfo>(0);
 
         public DateTimeOffset LastMurder { get; set; }
 
@@ -176,5 +181,39 @@ namespace Impostor.Server.Net.Inner.Objects
 
             return ValueTask.CompletedTask;
         }
+
+        public override async ValueTask<bool> 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<byte> taskTypeIds)
+        {
+            if (Disconnected)
+            {
+                return;
+            }
+
+            Tasks = new List<TaskInfo>(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 (file)
index 0000000..c04c27d
--- /dev/null
@@ -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));
+        }
+    }
+}