Compare commits

...

4 Commits

Author SHA1 Message Date
DrSmugleaf
3ef4ac7452 Make component states dependant on the player getting them (#1569) 2021-02-17 23:48:17 -08:00
Pieter-Jan Briers
93bf1b09e7 Fix disconnecting while connecting causes you to be locked out of the server. 2021-02-17 23:22:11 +01:00
DrSmugleaf
a1e557e870 Add IPrototypeManager method to load a string (#1567) 2021-02-17 13:20:39 -08:00
Pieter-Jan Briers
864adb7445 Add DateTimeStyles to sandbox. 2021-02-17 11:52:36 +01:00
21 changed files with 80 additions and 38 deletions

View File

@@ -1,5 +1,6 @@
using System;
using System.Collections.Generic;
using System.Diagnostics;
using Robust.Client.GameObjects;
using Robust.Client.Input;
using Robust.Shared.GameStates;
@@ -352,7 +353,10 @@ namespace Robust.Client.GameStates
foreach (var component in _componentManager.GetNetComponents(createdEntity))
{
var state = component.GetComponentState();
Debug.Assert(_players.LocalPlayer != null, "_players.LocalPlayer != null");
var player = _players.LocalPlayer.Session;
var state = component.GetComponentState(player);
if (state.GetType() == typeof(ComponentState))
{

View File

@@ -3,6 +3,7 @@ using Robust.Shared.ViewVariables;
using System;
using System.Collections.Generic;
using System.Diagnostics.CodeAnalysis;
using Robust.Shared.Players;
namespace Robust.Server.GameObjects
{
@@ -61,7 +62,7 @@ namespace Robust.Server.GameObjects
return false;
}
public override ComponentState GetComponentState()
public override ComponentState GetComponentState(ICommonSession player)
{
return new AppearanceComponentState(data);
}

View File

@@ -5,6 +5,7 @@ using System.Diagnostics.CodeAnalysis;
using System.Linq;
using Robust.Shared.GameObjects;
using Robust.Shared.IoC;
using Robust.Shared.Players;
using Robust.Shared.Reflection;
using Robust.Shared.Serialization;
using Robust.Shared.ViewVariables;
@@ -256,7 +257,7 @@ namespace Robust.Server.GameObjects
_entitiesWaitingResolve = null;
}
public override ComponentState GetComponentState()
public override ComponentState GetComponentState(ICommonSession player)
{
return new ContainerManagerComponentState(
_allContainers.ToDictionary(

View File

@@ -1,5 +1,6 @@
using Robust.Shared.GameObjects;
using Robust.Shared.Maths;
using Robust.Shared.Players;
using Robust.Shared.Serialization;
namespace Robust.Server.GameObjects
@@ -63,7 +64,7 @@ namespace Robust.Server.GameObjects
}
}
public override ComponentState GetComponentState()
public override ComponentState GetComponentState(ICommonSession player)
{
return new EyeComponentState(DrawFov, Zoom, Offset, Rotation);
}

View File

@@ -1,5 +1,6 @@
using Robust.Shared.GameObjects;
using Robust.Shared.Maths;
using Robust.Shared.Players;
using Robust.Shared.Serialization;
using Robust.Shared.ViewVariables;
@@ -73,7 +74,7 @@ namespace Robust.Server.GameObjects
serializer.DataField(ref _offset, "offset", Vector2.Zero);
}
public override ComponentState GetComponentState()
public override ComponentState GetComponentState(ICommonSession player)
{
return new PointLightComponentState(Enabled, Color, Radius, Offset);
}

View File

@@ -4,6 +4,7 @@ using Robust.Shared.GameObjects;
using DrawDepthTag = Robust.Shared.GameObjects.DrawDepth;
using Robust.Shared.Log;
using Robust.Shared.Maths;
using Robust.Shared.Players;
using Robust.Shared.Serialization;
using Robust.Shared.Utility;
using Robust.Shared.ViewVariables;
@@ -441,7 +442,7 @@ namespace Robust.Server.GameObjects
Layers = layerData;
}
public override ComponentState GetComponentState()
public override ComponentState GetComponentState(ICommonSession player)
{
return new SpriteComponentState(Visible, DrawDepth, Scale, Rotation, Offset, Color, Directional,
BaseRSIPath, Layers, RenderOrder);

View File

@@ -10,7 +10,7 @@ namespace Robust.Server.GameObjects
/// <summary>
/// Gets all entity states that have been modified after and including the provided tick.
/// </summary>
List<EntityState>? GetEntityStates(GameTick fromTick);
List<EntityState>? GetEntityStates(GameTick fromTick, IPlayerSession player);
/// <summary>
/// Gets all entity states within an AABB that have been modified after and including the provided tick.

View File

@@ -13,6 +13,7 @@ using Robust.Shared.Maths;
using Robust.Shared.Prototypes;
using Robust.Shared.Timing;
using Robust.Shared.Utility;
using static Robust.Shared.GameObjects.TransformComponent;
namespace Robust.Server.GameObjects
{
@@ -139,7 +140,7 @@ namespace Robust.Server.GameObjects
}
/// <inheritdoc />
public List<EntityState>? GetEntityStates(GameTick fromTick)
public List<EntityState>? GetEntityStates(GameTick fromTick, IPlayerSession player)
{
var stateEntities = new List<EntityState>();
foreach (var entity in AllEntities)
@@ -154,7 +155,7 @@ namespace Robust.Server.GameObjects
if (entity.LastModifiedTick <= fromTick)
continue;
stateEntities.Add(GetEntityState(ComponentManager, entity.Uid, fromTick));
stateEntities.Add(GetEntityState(ComponentManager, entity.Uid, fromTick, player));
}
// no point sending an empty collection
@@ -336,7 +337,7 @@ namespace Robust.Server.GameObjects
if (playerEnt == null)
{
// super-observer?
return GetEntityStates(fromTick);
return GetEntityStates(fromTick, player);
}
var playerUid = playerEnt.Uid;
@@ -390,7 +391,7 @@ namespace Robust.Server.GameObjects
}
}
var state = GetEntityState(ComponentManager, uid, fromTick);
var state = GetEntityState(ComponentManager, uid, fromTick, player);
if (checkedEnts.Add(uid))
{
@@ -404,14 +405,14 @@ namespace Robust.Server.GameObjects
{
// mover changed and can't be seen
var idx = Array.FindIndex(state.ComponentStates,
x => x is TransformComponent.TransformComponentState);
x => x is TransformComponentState);
if (idx != -1)
{
// mover changed positional data and can't be seen
var oldState =
(TransformComponent.TransformComponentState) state.ComponentStates[idx];
var newState = new TransformComponent.TransformComponentState(Vector2NaN,
(TransformComponentState) state.ComponentStates[idx];
var newState = new TransformComponentState(Vector2NaN,
oldState.Rotation, oldState.ParentID, oldState.NoLocalRotation);
state.ComponentStates[idx] = newState;
seenMovers.Remove(uid);
@@ -441,7 +442,7 @@ namespace Robust.Server.GameObjects
{
// mover can't be seen
var oldState =
(TransformComponent.TransformComponentState) entity.Transform.GetComponentState();
(TransformComponentState) entity.Transform.GetComponentState(player);
entityStates.Add(new EntityState(uid,
new ComponentChanged[]
{
@@ -449,7 +450,7 @@ namespace Robust.Server.GameObjects
},
new ComponentState[]
{
new TransformComponent.TransformComponentState(Vector2NaN, oldState.Rotation,
new TransformComponentState(Vector2NaN, oldState.Rotation,
oldState.ParentID, oldState.NoLocalRotation)
}));
@@ -517,7 +518,7 @@ namespace Robust.Server.GameObjects
}
// should this be lastSeen or fromTick?
var entityState = GetEntityState(ComponentManager, uid, lastSeen);
var entityState = GetEntityState(ComponentManager, uid, lastSeen, player);
checkedEnts.Add(uid);
@@ -577,7 +578,7 @@ namespace Robust.Server.GameObjects
continue;
}
var state = GetEntityState(ComponentManager, uid, fromTick);
var state = GetEntityState(ComponentManager, uid, fromTick, player);
if (state.ComponentStates == null)
{
@@ -591,7 +592,7 @@ namespace Robust.Server.GameObjects
seenMovers.Remove(uid);
ClearLastSeenTick(lSeen, uid);
var idx = Array.FindIndex(state.ComponentStates, x => x is TransformComponent.TransformComponentState);
var idx = Array.FindIndex(state.ComponentStates, x => x is TransformComponentState);
if (idx == -1)
{
@@ -599,9 +600,9 @@ namespace Robust.Server.GameObjects
continue;
}
var oldState = (TransformComponent.TransformComponentState) state.ComponentStates[idx];
var oldState = (TransformComponentState) state.ComponentStates[idx];
var newState =
new TransformComponent.TransformComponentState(Vector2NaN, oldState.Rotation, oldState.ParentID, oldState.NoLocalRotation);
new TransformComponentState(Vector2NaN, oldState.Rotation, oldState.ParentID, oldState.NoLocalRotation);
state.ComponentStates[idx] = newState;
@@ -630,7 +631,7 @@ namespace Robust.Server.GameObjects
}
var entity = GetEntity(uid);
var state = GetEntityState(ComponentManager, uid, fromTick);
var state = GetEntityState(ComponentManager, uid, fromTick, player);
if (state.ComponentStates == null || viewbox.Intersects(GetWorldAabbFromEntity(entity)))
{
@@ -643,7 +644,7 @@ namespace Robust.Server.GameObjects
entityStates.Add(state);
var idx = Array.FindIndex(state.ComponentStates,
x => x is TransformComponent.TransformComponentState);
x => x is TransformComponentState);
if (idx == -1)
{
@@ -651,9 +652,9 @@ namespace Robust.Server.GameObjects
continue;
}
var oldState = (TransformComponent.TransformComponentState) state.ComponentStates[idx];
var oldState = (TransformComponentState) state.ComponentStates[idx];
var newState =
new TransformComponent.TransformComponentState(Vector2NaN, oldState.Rotation,
new TransformComponentState(Vector2NaN, oldState.Rotation,
oldState.ParentID, oldState.NoLocalRotation);
state.ComponentStates[idx] = newState;
seenMovers.Remove(uid);
@@ -881,8 +882,9 @@ namespace Robust.Server.GameObjects
/// <param name="compMan">ComponentManager that contains the components for the entity.</param>
/// <param name="entityUid">Uid of the entity to generate the state from.</param>
/// <param name="fromTick">Only provide delta changes from this tick.</param>
/// <param name="player">The player to generate this state for.</param>
/// <returns>New entity State for the given entity.</returns>
private static EntityState GetEntityState(IComponentManager compMan, EntityUid entityUid, GameTick fromTick)
private static EntityState GetEntityState(IComponentManager compMan, EntityUid entityUid, GameTick fromTick, IPlayerSession player)
{
var compStates = new List<ComponentState>();
var changed = new List<ComponentChanged>();
@@ -899,7 +901,7 @@ namespace Robust.Server.GameObjects
// As such, we can avoid sending this data in this case since the client "already has it".
if (comp.NetSyncEnabled && comp.LastModifiedTick != GameTick.Zero && comp.LastModifiedTick >= fromTick)
compStates.Add(comp.GetComponentState());
compStates.Add(comp.GetComponentState(player));
if (comp.CreationTick != GameTick.Zero && comp.CreationTick >= fromTick && !comp.Deleted)
{

View File

@@ -135,7 +135,7 @@ namespace Robust.Server.GameStates
}
var entStates = lastAck == GameTick.Zero || !PvsEnabled
? _entityManager.GetEntityStates(lastAck)
? _entityManager.GetEntityStates(lastAck, session)
: _entityManager.UpdatePlayerSeenEntityStates(lastAck, session, _entityManager.MaxUpdateRange);
var playerStates = _playerManager.GetPlayerStates(lastAck);
var deletions = _entityManager.GetDeletedEntities(lastAck);

View File

@@ -330,6 +330,7 @@ Types:
System.Globalization:
CompareOptions: { }
CultureInfo: { All: True }
DateTimeStyles: { All: True } # Enum
TextInfo:
Methods:
- "bool get_IsRightToLeft()"

View File

@@ -202,8 +202,9 @@ namespace Robust.Shared.GameObjects
/// <inheritdoc />
public virtual void HandleNetworkMessage(ComponentMessage message, INetChannel netChannel, ICommonSession? session = null) { }
/// <param name="player"></param>
/// <inheritdoc />
public virtual ComponentState GetComponentState()
public virtual ComponentState GetComponentState(ICommonSession player)
{
if (NetID == null)
throw new InvalidOperationException($"Cannot make state for component without Net ID: {GetType()}");

View File

@@ -5,6 +5,7 @@ using Robust.Shared.IoC;
using Robust.Shared.Map;
using Robust.Shared.Maths;
using Robust.Shared.Physics;
using Robust.Shared.Players;
using Robust.Shared.Serialization;
using Robust.Shared.ViewVariables;
@@ -132,8 +133,9 @@ namespace Robust.Shared.GameObjects
serializer.DataField(ref _mass, "mass", 1.0f);
}
/// <param name="player"></param>
/// <inheritdoc />
public override ComponentState GetComponentState()
public override ComponentState GetComponentState(ICommonSession player)
{
return new PhysicsComponentState(_canCollide, _status, _physShapes, _isHard, _mass, LinearVelocity, AngularVelocity, Anchored);
}

View File

@@ -1,5 +1,6 @@
using System;
using Robust.Shared.Localization.Macros;
using Robust.Shared.Players;
using Robust.Shared.Serialization;
using Robust.Shared.ViewVariables;
@@ -33,7 +34,7 @@ namespace Robust.Shared.GameObjects
serializer.DataField(this, x => x.Proper, "proper", false);
}
public override ComponentState GetComponentState()
public override ComponentState GetComponentState(ICommonSession player)
{
return new GrammarComponentState(Proper);
}

View File

@@ -1,6 +1,7 @@
using System;
using Robust.Shared.Map;
using Robust.Shared.Maths;
using Robust.Shared.Players;
using Robust.Shared.Serialization;
using Robust.Shared.ViewVariables;
@@ -73,7 +74,7 @@ namespace Robust.Shared.GameObjects
}
}
public override ComponentState GetComponentState()
public override ComponentState GetComponentState(ICommonSession player)
{
return new OccluderComponentState(Enabled, BoundingBox);
}

View File

@@ -1,5 +1,6 @@
using System;
using Robust.Shared.Map;
using Robust.Shared.Players;
using Robust.Shared.Serialization;
using Robust.Shared.ViewVariables;
@@ -39,8 +40,9 @@ namespace Robust.Shared.GameObjects
_mapIndex = MapId.Nullspace;
}
/// <param name="player"></param>
/// <inheritdoc />
public override ComponentState GetComponentState()
public override ComponentState GetComponentState(ICommonSession player)
{
return new MapComponentState(_mapIndex);
}

View File

@@ -2,6 +2,7 @@
using Robust.Shared.IoC;
using Robust.Shared.Log;
using Robust.Shared.Map;
using Robust.Shared.Players;
using Robust.Shared.Serialization;
using Robust.Shared.ViewVariables;
@@ -61,8 +62,9 @@ namespace Robust.Shared.GameObjects
base.OnRemove();
}
/// <param name="player"></param>
/// <inheritdoc />
public override ComponentState GetComponentState()
public override ComponentState GetComponentState(ICommonSession player)
{
return new MapGridComponentState(_gridIndex, Grid.HasGravity);
}

View File

@@ -1,5 +1,6 @@
using System;
using Robust.Shared.IoC;
using Robust.Shared.Players;
using Robust.Shared.Prototypes;
using Robust.Shared.Serialization;
using Robust.Shared.ViewVariables;
@@ -137,8 +138,9 @@ namespace Robust.Shared.GameObjects
}
}
/// <param name="player"></param>
/// <inheritdoc />
public override ComponentState GetComponentState()
public override ComponentState GetComponentState(ICommonSession player)
{
return new MetaDataComponentState(_entityName, _entityDescription, EntityPrototype?.ID);
}

View File

@@ -6,6 +6,7 @@ using Robust.Shared.Containers;
using Robust.Shared.IoC;
using Robust.Shared.Map;
using Robust.Shared.Maths;
using Robust.Shared.Players;
using Robust.Shared.Serialization;
using Robust.Shared.Utility;
using Robust.Shared.ViewVariables;
@@ -698,8 +699,9 @@ namespace Robust.Shared.GameObjects
serializer.DataField(ref _noLocalRotation, "noRot", false);
}
/// <param name="player"></param>
/// <inheritdoc />
public override ComponentState GetComponentState()
public override ComponentState GetComponentState(ICommonSession player)
{
return new TransformComponentState(_localPosition, LocalRotation, _parent, _noLocalRotation);
}

View File

@@ -32,7 +32,7 @@ namespace Robust.Shared.GameObjects
/// Whether the Owner has been paused.
/// </summary>
bool Paused { get; }
/// <summary>
/// Whether the client should synchronize component additions and removals.
/// If this is false and the component gets added or removed server side, the client will not do the same.
@@ -125,8 +125,9 @@ namespace Robust.Shared.GameObjects
/// <summary>
/// Get the component's state for replicating on the client.
/// </summary>
/// <param name="player"></param>
/// <returns>ComponentState object</returns>
ComponentState GetComponentState();
ComponentState GetComponentState(ICommonSession player);
/// <summary>
/// Handles an incoming component state from the server.

View File

@@ -198,6 +198,16 @@ namespace Robust.Shared.Network
}
}
if (connection.Status == NetConnectionStatus.Disconnecting ||
connection.Status == NetConnectionStatus.Disconnected)
{
Logger.InfoS("net",
"{ConnectionEndpoint} disconnected during handshake",
connection.RemoteEndPoint, userName, userId);
return;
}
var msg = peer.Peer.CreateMessage();
var msgResp = new MsgLoginSuccess
{

View File

@@ -56,6 +56,7 @@ namespace Robust.Shared.Prototypes
/// </summary>
void LoadDirectory(ResourcePath path);
void LoadFromStream(TextReader stream);
void LoadString(string str);
/// <summary>
/// Clear out all prototypes and reset to a blank slate.
/// </summary>
@@ -273,6 +274,11 @@ namespace Robust.Shared.Prototypes
LoadedData?.Invoke(yaml, "anonymous prototypes YAML stream");
}
public void LoadString(string str)
{
LoadFromStream(new StreamReader(str));
}
#endregion IPrototypeManager members
public void PostInject()