{
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();
}
}
+++ /dev/null
-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));
- }
- }
- }
-}
+++ /dev/null
-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();
- }
- }
- }
-}
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;
{
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;
}
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; }
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));
+ }
+ }
}
}
--- /dev/null
+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));
+ }
+ }
+}