mirror of
https://github.com/space-wizards/RobustToolbox.git
synced 2026-02-15 03:30:53 +01:00
NetListAsArray uses span instead of array now.
This commit is contained in:
Submodule NetSerializer updated: 6c682908f8...b75b301bea
@@ -412,64 +412,57 @@ namespace Robust.Client.GameStates
|
||||
private List<EntityUid> ApplyGameState(GameState curState, GameState? nextState)
|
||||
{
|
||||
_config.TickProcessMessages();
|
||||
_mapManager.ApplyGameStatePre(curState.MapData, curState.EntityStates.Array);
|
||||
var createdEntities = ApplyEntityStates(curState.EntityStates.Array, curState.EntityDeletions.Array,
|
||||
nextState?.EntityStates.Array);
|
||||
_players.ApplyPlayerStates(curState.PlayerStates.Array);
|
||||
_mapManager.ApplyGameStatePre(curState.MapData, curState.EntityStates.Span);
|
||||
var createdEntities = ApplyEntityStates(curState.EntityStates.Span, curState.EntityDeletions.Span,
|
||||
nextState != null ? nextState.EntityStates.Span : default);
|
||||
_players.ApplyPlayerStates(curState.PlayerStates.Value ?? Array.Empty<PlayerState>());
|
||||
_mapManager.ApplyGameStatePost(curState.MapData);
|
||||
|
||||
GameStateApplied?.Invoke(new GameStateAppliedArgs(curState));
|
||||
return createdEntities;
|
||||
}
|
||||
|
||||
private List<EntityUid> ApplyEntityStates(EntityState[]? curEntStates, IEnumerable<EntityUid>? deletions,
|
||||
EntityState[]? nextEntStates)
|
||||
private List<EntityUid> ApplyEntityStates(ReadOnlySpan<EntityState> curEntStates, ReadOnlySpan<EntityUid> deletions,
|
||||
ReadOnlySpan<EntityState> nextEntStates)
|
||||
{
|
||||
var toApply = new Dictionary<IEntity, (EntityState?, EntityState?)>();
|
||||
var toInitialize = new List<Entity>();
|
||||
var created = new List<EntityUid>();
|
||||
deletions ??= new EntityUid[0];
|
||||
|
||||
if (curEntStates != null && curEntStates.Length != 0)
|
||||
foreach (var es in curEntStates)
|
||||
{
|
||||
foreach (var es in curEntStates)
|
||||
//Known entities
|
||||
if (_entities.TryGetEntity(es.Uid, out var entity))
|
||||
{
|
||||
//Known entities
|
||||
if (_entities.TryGetEntity(es.Uid, out var entity))
|
||||
// Logger.Debug($"[{IGameTiming.TickStampStatic}] MOD {es.Uid}");
|
||||
toApply.Add(entity, (es, null));
|
||||
}
|
||||
else //Unknown entities
|
||||
{
|
||||
var metaState = (MetaDataComponentState?) es.ComponentChanges.Value?.FirstOrDefault(c => c.NetID == _metaCompNetId).State;
|
||||
if (metaState == null)
|
||||
{
|
||||
// Logger.Debug($"[{IGameTiming.TickStampStatic}] MOD {es.Uid}");
|
||||
toApply.Add(entity, (es, null));
|
||||
}
|
||||
else //Unknown entities
|
||||
{
|
||||
var metaState = (MetaDataComponentState?) es.ComponentChanges.Value?.FirstOrDefault(c => c.NetID == _metaCompNetId).State;
|
||||
if (metaState == null)
|
||||
{
|
||||
throw new InvalidOperationException($"Server sent new entity state for {es.Uid} without metadata component!");
|
||||
}
|
||||
// Logger.Debug($"[{IGameTiming.TickStampStatic}] CREATE {es.Uid} {metaState.PrototypeId}");
|
||||
var newEntity = (Entity)_entities.CreateEntity(metaState.PrototypeId, es.Uid);
|
||||
toApply.Add(newEntity, (es, null));
|
||||
toInitialize.Add(newEntity);
|
||||
created.Add(newEntity.Uid);
|
||||
throw new InvalidOperationException($"Server sent new entity state for {es.Uid} without metadata component!");
|
||||
}
|
||||
// Logger.Debug($"[{IGameTiming.TickStampStatic}] CREATE {es.Uid} {metaState.PrototypeId}");
|
||||
var newEntity = (Entity)_entities.CreateEntity(metaState.PrototypeId, es.Uid);
|
||||
toApply.Add(newEntity, (es, null));
|
||||
toInitialize.Add(newEntity);
|
||||
created.Add(newEntity.Uid);
|
||||
}
|
||||
}
|
||||
|
||||
if (nextEntStates != null && nextEntStates.Length != 0)
|
||||
foreach (var es in nextEntStates)
|
||||
{
|
||||
foreach (var es in nextEntStates)
|
||||
if (_entities.TryGetEntity(es.Uid, out var entity))
|
||||
{
|
||||
if (_entities.TryGetEntity(es.Uid, out var entity))
|
||||
if (toApply.TryGetValue(entity, out var state))
|
||||
{
|
||||
if (toApply.TryGetValue(entity, out var state))
|
||||
{
|
||||
toApply[entity] = (state.Item1, es);
|
||||
}
|
||||
else
|
||||
{
|
||||
toApply[entity] = (null, es);
|
||||
}
|
||||
toApply[entity] = (state.Item1, es);
|
||||
}
|
||||
else
|
||||
{
|
||||
toApply[entity] = (null, es);
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -553,9 +546,9 @@ namespace Robust.Client.GameStates
|
||||
var compStateWork = new Dictionary<ushort, (ComponentState? curState, ComponentState? nextState)>();
|
||||
var entityUid = entity.Uid;
|
||||
|
||||
if (curState?.ComponentChanges.Array is { } changes)
|
||||
if (curState != null)
|
||||
{
|
||||
foreach (var compChange in changes)
|
||||
foreach (var compChange in curState.ComponentChanges.Span)
|
||||
{
|
||||
if (compChange.Deleted)
|
||||
{
|
||||
@@ -578,19 +571,16 @@ namespace Robust.Client.GameStates
|
||||
compStateWork[compChange.NetID] = (compChange.State, null);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
if (curState?.ComponentChanges.Array is { } changes2)
|
||||
{
|
||||
foreach (var compChange in changes2)
|
||||
foreach (var compChange in curState.ComponentChanges.Span)
|
||||
{
|
||||
compStateWork[compChange.NetID] = (compChange.State, null);
|
||||
}
|
||||
}
|
||||
|
||||
if (nextState?.ComponentChanges.Array is { } nextChanges)
|
||||
if (nextState != null)
|
||||
{
|
||||
foreach (var compState in nextChanges)
|
||||
foreach (var compState in nextState.ComponentChanges.Span)
|
||||
{
|
||||
if (compStateWork.TryGetValue(compState.NetID, out var state))
|
||||
{
|
||||
|
||||
@@ -168,13 +168,13 @@ namespace Robust.Client.GameStates
|
||||
}
|
||||
else
|
||||
{
|
||||
foreach (var deletion in state.EntityDeletions.Array)
|
||||
foreach (var deletion in state.EntityDeletions.Span)
|
||||
{
|
||||
_lastStateFullRep.Remove(deletion);
|
||||
}
|
||||
}
|
||||
|
||||
foreach (var entityState in state.EntityStates.Array)
|
||||
foreach (var entityState in state.EntityStates.Span)
|
||||
{
|
||||
if (!_lastStateFullRep.TryGetValue(entityState.Uid, out var compData))
|
||||
{
|
||||
@@ -182,18 +182,15 @@ namespace Robust.Client.GameStates
|
||||
_lastStateFullRep.Add(entityState.Uid, compData);
|
||||
}
|
||||
|
||||
if (entityState.ComponentChanges.Array is { } changes)
|
||||
foreach (var change in entityState.ComponentChanges.Span)
|
||||
{
|
||||
foreach (var change in changes)
|
||||
if (change.Deleted)
|
||||
{
|
||||
if (change.Deleted)
|
||||
{
|
||||
compData.Remove(change.NetID);
|
||||
}
|
||||
else if (change.State is not null)
|
||||
{
|
||||
compData[change.NetID] = change.State;
|
||||
}
|
||||
compData.Remove(change.NetID);
|
||||
}
|
||||
else if (change.State is not null)
|
||||
{
|
||||
compData[change.NetID] = change.State;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -68,7 +68,7 @@ namespace Robust.Client.GameStates
|
||||
if(gameState.EntityStates.HasContents)
|
||||
{
|
||||
// Loop over every entity that gets updated this state and record the traffic
|
||||
foreach (var entityState in gameState.EntityStates.Array)
|
||||
foreach (var entityState in gameState.EntityStates.Span)
|
||||
{
|
||||
var newEnt = true;
|
||||
for(var i=0;i<_netEnts.Count;i++)
|
||||
|
||||
@@ -82,14 +82,14 @@ namespace Robust.Client.GameStates
|
||||
if (entStates.HasContents)
|
||||
{
|
||||
var sb = new StringBuilder();
|
||||
foreach (var entState in entStates.Array)
|
||||
foreach (var entState in entStates.Span)
|
||||
{
|
||||
if (entState.Uid == WatchEntId)
|
||||
{
|
||||
if(entState.ComponentChanges.Array is { } changes)
|
||||
if(entState.ComponentChanges.HasContents)
|
||||
{
|
||||
sb.Append($"\n Changes:");
|
||||
foreach (var compChange in changes)
|
||||
foreach (var compChange in entState.ComponentChanges.Span)
|
||||
{
|
||||
var registration = _componentFactory.GetRegistration(compChange.NetID);
|
||||
var create = compChange.Created ? 'C' : '\0';
|
||||
@@ -110,7 +110,7 @@ namespace Robust.Client.GameStates
|
||||
if (entDeletes.HasContents)
|
||||
{
|
||||
var sb = new StringBuilder();
|
||||
foreach (var entDelete in entDeletes.Array)
|
||||
foreach (var entDelete in entDeletes.Span)
|
||||
{
|
||||
if (entDelete == WatchEntId)
|
||||
{
|
||||
|
||||
@@ -11,7 +11,7 @@ namespace Robust.Client.Map
|
||||
{
|
||||
internal class ClientMapManager : MapManager, IClientMapManager
|
||||
{
|
||||
public void ApplyGameStatePre(GameStateMapData? data, EntityState[]? entityStates)
|
||||
public void ApplyGameStatePre(GameStateMapData? data, ReadOnlySpan<EntityState> entityStates)
|
||||
{
|
||||
// There was no map data this tick, so nothing to do.
|
||||
if(data == null)
|
||||
@@ -20,7 +20,7 @@ namespace Robust.Client.Map
|
||||
// First we need to figure out all the NEW MAPS.
|
||||
if(data.CreatedMaps != null)
|
||||
{
|
||||
DebugTools.Assert(entityStates is not null, "Received new maps, but no entity state.");
|
||||
DebugTools.Assert(!entityStates.IsEmpty, "Received new maps, but no entity state.");
|
||||
|
||||
foreach (var mapId in data.CreatedMaps)
|
||||
{
|
||||
@@ -33,11 +33,7 @@ namespace Robust.Client.Map
|
||||
//get shared euid of map comp entity
|
||||
foreach (var entityState in entityStates!)
|
||||
{
|
||||
var changes = entityState.ComponentChanges.Array;
|
||||
if (changes is null)
|
||||
continue;
|
||||
|
||||
foreach (var compChange in changes)
|
||||
foreach (var compChange in entityState.ComponentChanges.Span)
|
||||
{
|
||||
if (compChange.State is not MapComponentState mapCompState || mapCompState.MapId != mapId)
|
||||
continue;
|
||||
@@ -69,11 +65,7 @@ namespace Robust.Client.Map
|
||||
//get shared euid of map comp entity
|
||||
foreach (var entityState in entityStates!)
|
||||
{
|
||||
var changes = entityState.ComponentChanges.Array;
|
||||
if (changes is null)
|
||||
continue;
|
||||
|
||||
foreach (var compState in changes)
|
||||
foreach (var compState in entityState.ComponentChanges.Span)
|
||||
{
|
||||
if (compState.State is not MapGridComponentState gridCompState || gridCompState.GridIndex != gridId)
|
||||
continue;
|
||||
|
||||
@@ -1,3 +1,4 @@
|
||||
using System;
|
||||
using Robust.Shared.GameObjects;
|
||||
using Robust.Shared.GameStates;
|
||||
using Robust.Shared.Map;
|
||||
@@ -8,7 +9,7 @@ namespace Robust.Client.Map
|
||||
{
|
||||
// Two methods here, so that new grids etc can be made BEFORE entities get states applied,
|
||||
// but old ones can be deleted after.
|
||||
void ApplyGameStatePre(GameStateMapData? data, EntityState[]? entityStates);
|
||||
void ApplyGameStatePre(GameStateMapData? data, ReadOnlySpan<EntityState> entityStates);
|
||||
void ApplyGameStatePost(GameStateMapData? data);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -24,7 +24,7 @@ namespace Robust.Client.Player
|
||||
void Startup();
|
||||
void Shutdown();
|
||||
|
||||
void ApplyPlayerStates(PlayerState[] list);
|
||||
void ApplyPlayerStates(IReadOnlyCollection<PlayerState> list);
|
||||
}
|
||||
|
||||
public class LocalPlayerChangedEventArgs : EventArgs
|
||||
|
||||
@@ -103,9 +103,9 @@ namespace Robust.Client.Player
|
||||
}
|
||||
|
||||
/// <inheritdoc />
|
||||
public void ApplyPlayerStates(PlayerState[] list)
|
||||
public void ApplyPlayerStates(IReadOnlyCollection<PlayerState> list)
|
||||
{
|
||||
if (list.Length == 0)
|
||||
if (list.Count == 0)
|
||||
{
|
||||
// This happens when the server says "nothing changed!"
|
||||
return;
|
||||
|
||||
Reference in New Issue
Block a user