Sync dirty objects

This commit is contained in:
miniduikboot committed 2024-08-13 21:16:54 +02:00
1 parent e2157b0a6f
commit c729d26ff6
6 files changed
+33 -3

No files matched your search

@@ -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 ||
@@ -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);
@@ -686,7 +686,7 @@ namespace Impostor.Server.Net.Inner.Objects
}
}
PlayerInfo.PlayerName = name;
PlayerInfo.CurrentOutfit.PlayerName = name;
return true;
}
@@ -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<PlayerOutfitType, PlayerOutfit> 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)
@@ -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;
}
@@ -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);
}
}
}