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
+}
/// 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
+}
{
public interface ITaskInfo
{
+ uint Id { get; }
+
TaskTypes Type { get; }
-
+
bool Complete { get; }
}
-}
\ No newline at end of file
+}
{
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; }
public IInnerPlayerControl PlayerControl { get; }
- public TaskTypes Task { get; }
+ public ITaskInfo Task { get; }
}
-}
\ No newline at end of file
+}
{
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
+}
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,
+ });
}
}
}
}
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;
}
--- /dev/null
+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;
+ }
+}
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)
{
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; }
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);
}
}
}