diff --git a/src/Impostor.Server/Net/Inner/InnerNetObject.cs b/src/Impostor.Server/Net/Inner/InnerNetObject.cs index 1fde0068..c7115f74 100644 --- a/src/Impostor.Server/Net/Inner/InnerNetObject.cs +++ b/src/Impostor.Server/Net/Inner/InnerNetObject.cs @@ -29,6 +29,8 @@ namespace Impostor.Server.Net.Inner public SpawnFlags SpawnFlags { get; internal set; } + public virtual bool IsDirty { get; internal set; } + public bool IsOwnedBy(IClientPlayer player) { return OwnerId == player.Client.Id || diff --git a/src/Impostor.Server/Net/Inner/Objects/InnerPlayerControl.Api.cs b/src/Impostor.Server/Net/Inner/Objects/InnerPlayerControl.Api.cs index bd711618..99f3ddec 100644 --- a/src/Impostor.Server/Net/Inner/Objects/InnerPlayerControl.Api.cs +++ b/src/Impostor.Server/Net/Inner/Objects/InnerPlayerControl.Api.cs @@ -20,8 +20,9 @@ namespace Impostor.Server.Net.Inner.Objects public async ValueTask SetNameAsync(string name) { - PlayerInfo.PlayerName = name; + PlayerInfo.CurrentOutfit.PlayerName = name; + // TODO check playerinfo ownership using var writer = Game.StartRpc(NetId, RpcCalls.SetName); writer.Write(name); await Game.FinishRpcAsync(writer); diff --git a/src/Impostor.Server/Net/Inner/Objects/InnerPlayerControl.cs b/src/Impostor.Server/Net/Inner/Objects/InnerPlayerControl.cs index 16fa42ed..113226d6 100644 --- a/src/Impostor.Server/Net/Inner/Objects/InnerPlayerControl.cs +++ b/src/Impostor.Server/Net/Inner/Objects/InnerPlayerControl.cs @@ -686,7 +686,7 @@ namespace Impostor.Server.Net.Inner.Objects } } - PlayerInfo.PlayerName = name; + PlayerInfo.CurrentOutfit.PlayerName = name; return true; } diff --git a/src/Impostor.Server/Net/Inner/Objects/InnerPlayerInfo.cs b/src/Impostor.Server/Net/Inner/Objects/InnerPlayerInfo.cs index 498f8f6b..a2d39a6d 100644 --- a/src/Impostor.Server/Net/Inner/Objects/InnerPlayerInfo.cs +++ b/src/Impostor.Server/Net/Inner/Objects/InnerPlayerInfo.cs @@ -29,7 +29,7 @@ namespace Impostor.Server.Net.Inner.Objects public int ClientId { get; internal set; } - public string PlayerName { get; internal set; } = string.Empty; + public string PlayerName => CurrentOutfit.PlayerName; public Dictionary Outfits { get; } = new() { @@ -60,6 +60,12 @@ namespace Impostor.Server.Net.Inner.Objects public uint PlayerLevel { get; internal set; } + public override bool IsDirty + { + get => CurrentOutfit.IsDirty; + internal set => CurrentOutfit.IsDirty = value; + } + public bool CanMurder(IGame game, IDateTimeProvider dateTimeProvider) { if (!IsImpostor) diff --git a/src/Impostor.Server/Net/State/Game.Data.cs b/src/Impostor.Server/Net/State/Game.Data.cs index a3ce69f2..2d33dfb6 100644 --- a/src/Impostor.Server/Net/State/Game.Data.cs +++ b/src/Impostor.Server/Net/State/Game.Data.cs @@ -326,6 +326,17 @@ namespace Impostor.Server.Net.State } } + // Check for dirty netobjects + foreach (var netObject in _allObjectsFast.Values) + { + if (netObject.IsDirty && netObject.OwnerId == ServerOwned) + { + _logger.LogTrace("Sending over {Type} {NetId}", netObject.GetType().Name, netObject.NetId); + await SendObjectData(netObject); + netObject.IsDirty = false; + } + } + return true; } diff --git a/src/Impostor.Server/Net/State/Game.Outgoing.cs b/src/Impostor.Server/Net/State/Game.Outgoing.cs index a505b10f..3a647080 100644 --- a/src/Impostor.Server/Net/State/Game.Outgoing.cs +++ b/src/Impostor.Server/Net/State/Game.Outgoing.cs @@ -143,5 +143,15 @@ namespace Impostor.Server.Net.State writer.EndMessage(); return FinishGameDataAsync(writer, targetClientId); } + + private async ValueTask SendObjectData(InnerNetObject obj, int? targetClientId = null) + { + using var writer = StartGameData(targetClientId); + writer.StartMessage(GameDataTag.DataFlag); + writer.WritePacked(obj.NetId); + await obj.SerializeAsync(writer, false); + writer.EndMessage(); + await FinishGameDataAsync(writer, targetClientId); + } } }