mirror of
https://github.com/Impostor/Impostor.git
synced 2026-10-20 01:46:11 +00:00
Sync dirty objects
This commit is contained in:
1 parent
cceecb0c36
commit
c48c6b3bde
8 files changed
+95
-19
No files matched your search
@@ -2,19 +2,57 @@ namespace Impostor.Api.Innersloth.Customization
|
||||
{
|
||||
public class PlayerOutfit
|
||||
{
|
||||
public string PlayerName { get; internal set; } = string.Empty;
|
||||
private string _playerName = string.Empty;
|
||||
private ColorType _color = (ColorType)(-1);
|
||||
private string _hatId = "missing";
|
||||
private string _petId = "missing";
|
||||
private string _skinId = "missing";
|
||||
private string _visorId = "missing";
|
||||
private string _namePlateId = "missing";
|
||||
|
||||
public ColorType Color { get; internal set; } = (ColorType)(-1);
|
||||
public bool IsDirty { get; internal set; }
|
||||
|
||||
public string HatId { get; internal set; } = "missing";
|
||||
public string PlayerName
|
||||
{
|
||||
get => _playerName;
|
||||
set => SetField(ref _playerName, value);
|
||||
}
|
||||
|
||||
public string PetId { get; internal set; } = "missing";
|
||||
public ColorType Color
|
||||
{
|
||||
get => _color;
|
||||
set => SetField(ref _color, value);
|
||||
}
|
||||
|
||||
public string SkinId { get; internal set; } = "missing";
|
||||
public string HatId
|
||||
{
|
||||
get => _hatId;
|
||||
set => SetField(ref _hatId, value);
|
||||
}
|
||||
|
||||
public string VisorId { get; internal set; } = "missing";
|
||||
public string PetId
|
||||
{
|
||||
get => _petId;
|
||||
set => SetField(ref _petId, value);
|
||||
}
|
||||
|
||||
public string NamePlateId { get; internal set; } = "missing";
|
||||
public string SkinId
|
||||
{
|
||||
get => _skinId;
|
||||
set => SetField(ref _skinId, value);
|
||||
}
|
||||
|
||||
public string VisorId
|
||||
{
|
||||
get => _visorId;
|
||||
set => SetField(ref _visorId, value);
|
||||
}
|
||||
|
||||
public string NamePlateId
|
||||
{
|
||||
get => _namePlateId;
|
||||
set => SetField(ref _namePlateId, value);
|
||||
}
|
||||
|
||||
public byte HatSequenceId { get; internal set; } = 0;
|
||||
|
||||
@@ -70,5 +108,11 @@ namespace Impostor.Api.Innersloth.Customization
|
||||
VisorSequenceId = reader.ReadByte();
|
||||
NamePlateSequenceId = reader.ReadByte();
|
||||
}
|
||||
|
||||
private void SetField<T>(ref T field, T value)
|
||||
{
|
||||
field = value;
|
||||
IsDirty = true;
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -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);
|
||||
|
||||
@@ -663,11 +663,12 @@ namespace Impostor.Server.Net.Inner.Objects
|
||||
|
||||
if (name != expected)
|
||||
{
|
||||
if (await sender.Client.ReportCheatAsync(RpcCalls.SetName, CheatCategory.NameLimits, "Client sent SetName with incorrect name"))
|
||||
{
|
||||
await SetNameAsync(expected);
|
||||
return false;
|
||||
}
|
||||
// TODO fix
|
||||
//if (await sender.Client.ReportCheatAsync(RpcCalls.SetName, CheatCategory.NameLimits, $"Client sent SetName with incorrect name, got '{name}', expected '{expected}'"))
|
||||
//{
|
||||
// await SetNameAsync(expected);
|
||||
// return false;
|
||||
//}
|
||||
}
|
||||
}
|
||||
else
|
||||
@@ -679,7 +680,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)
|
||||
|
||||
@@ -315,6 +315,19 @@ namespace Impostor.Server.Net.State
|
||||
}
|
||||
}
|
||||
|
||||
// Check for dirty netobjects
|
||||
foreach (var netObject in _allObjectsFast.Values)
|
||||
{
|
||||
if (netObject.IsDirty && netObject.OwnerId == ServerOwned)
|
||||
{
|
||||
_logger.LogInformation("Sending over {Type} {NetId}", netObject.GetType(), netObject.NetId);
|
||||
var writer = MessageWriter.Get(MessageType.Reliable);
|
||||
await WriteObjectData(writer, netObject);
|
||||
await SendToAllAsync(writer);
|
||||
netObject.IsDirty = false;
|
||||
}
|
||||
}
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
@@ -451,7 +464,8 @@ namespace Impostor.Server.Net.State
|
||||
// Sync all server-owned objects
|
||||
foreach (var obj in _allObjectsFast.Values)
|
||||
{
|
||||
if (obj.OwnerId == -4) {
|
||||
if (obj.OwnerId == -4)
|
||||
{
|
||||
_logger.LogTrace("Sharing {Type} {NetId}", obj.GetType(), obj.NetId);
|
||||
var writer = MessageWriter.Get(MessageType.Reliable);
|
||||
WriteObjectSpawn(writer, obj);
|
||||
@@ -482,8 +496,6 @@ namespace Impostor.Server.Net.State
|
||||
WriteObjectSpawn(writer, playerInfo);
|
||||
await SendToAllAsync(writer);
|
||||
}
|
||||
|
||||
|
||||
}
|
||||
|
||||
private bool AddNetObject(InnerNetObject obj)
|
||||
|
||||
@@ -133,5 +133,16 @@ namespace Impostor.Server.Net.State
|
||||
message.EndMessage();
|
||||
message.EndMessage();
|
||||
}
|
||||
|
||||
private async ValueTask WriteObjectData(IMessageWriter message, InnerNetObject obj)
|
||||
{
|
||||
message.StartMessage(MessageFlags.GameData);
|
||||
Code.Serialize(message);
|
||||
message.StartMessage(GameDataTag.DataFlag);
|
||||
message.WritePacked(obj.NetId);
|
||||
await obj.SerializeAsync(message, false);
|
||||
message.EndMessage();
|
||||
message.EndMessage();
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -103,7 +103,6 @@ namespace Impostor.Server.Net.State
|
||||
|
||||
break;
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
return true;
|
||||
|
||||
Reference in new issue
Block a user