diff --git a/Robust.Server/GameStates/ChunkIndicesEnumerator.cs b/Robust.Server/GameStates/ChunkIndicesEnumerator.cs index e1deed969..7b9991fa6 100644 --- a/Robust.Server/GameStates/ChunkIndicesEnumerator.cs +++ b/Robust.Server/GameStates/ChunkIndicesEnumerator.cs @@ -11,7 +11,7 @@ public struct ChunkIndicesEnumerator private int _x; private int _y; - public ChunkIndicesEnumerator(Vector2 viewPos, float range, float chunkSize) + public ChunkIndicesEnumerator(Vector2 viewPos, Vector2 range, float chunkSize) { _bottomLeft = ((viewPos - range) / chunkSize).Floored(); // Also floor this as we get the whole chunk anyway. diff --git a/Robust.Server/GameStates/PVSSystem.cs b/Robust.Server/GameStates/PVSSystem.cs index 778394ec3..8030e761e 100644 --- a/Robust.Server/GameStates/PVSSystem.cs +++ b/Robust.Server/GameStates/PVSSystem.cs @@ -43,7 +43,7 @@ internal sealed partial class PVSSystem : EntitySystem /// /// Size of the side of the view bounds square. /// - private float _viewSize; + private Vector2 _viewSize; /// /// If PVS disabled then we'll track if we've dumped all entities on the player. @@ -118,7 +118,7 @@ internal sealed partial class PVSSystem : EntitySystem EntityManager.EntityDeleted += OnEntityDeleted; _configManager.OnValueChanged(CVars.NetPVS, SetPvs, true); - _configManager.OnValueChanged(CVars.NetMaxUpdateRange, OnViewsizeChanged, true); + _configManager.OnValueChanged(CVars.NetDefaultUpdateRange, OnViewsizeChanged, true); InitializeDirty(); } @@ -144,14 +144,14 @@ internal sealed partial class PVSSystem : EntitySystem EntityManager.EntityDeleted -= OnEntityDeleted; _configManager.UnsubValueChanged(CVars.NetPVS, SetPvs); - _configManager.UnsubValueChanged(CVars.NetMaxUpdateRange, OnViewsizeChanged); + _configManager.UnsubValueChanged(CVars.NetDefaultUpdateRange, OnViewsizeChanged); ShutdownDirty(); } - private void OnViewsizeChanged(float obj) + private void OnViewsizeChanged(Vector2 obj) { - _viewSize = obj * 2; + _viewSize = obj; } private void SetPvs(bool value) @@ -323,7 +323,6 @@ internal sealed partial class PVSSystem : EntitySystem { var playerChunks = new HashSet[sessions.Length]; var eyeQuery = EntityManager.GetEntityQuery(); - var transformQuery = EntityManager.GetEntityQuery(); var viewerEntities = new EntityUid[sessions.Length][]; _chunkList.Clear(); @@ -350,11 +349,17 @@ internal sealed partial class PVSSystem : EntitySystem foreach (var eyeEuid in viewers) { - var (viewPos, range, mapId) = CalcViewBounds(in eyeEuid, transformQuery); + var xform = xformQuery.GetComponent(eyeEuid); + var viewPos = xform.WorldPosition; + var range = _viewSize; + var mapId = xform.MapID; uint visMask = EyeComponent.DefaultVisibilityMask; if (eyeQuery.TryGetComponent(eyeEuid, out var eyeComp)) + { visMask = eyeComp.VisibilityMask; + range *= eyeComp.Zoom; + } // Get the nyoom dictionary for index lookups. if (!_mapIndices.TryGetValue(visMask, out var mapDict)) @@ -399,7 +404,7 @@ internal sealed partial class PVSSystem : EntitySystem physicsQuery, true)) { - var localPos = transformQuery.GetComponent(mapGrid.GridEntityId).InvWorldMatrix.Transform(viewPos); + var localPos = xformQuery.GetComponent(mapGrid.GridEntityId).InvWorldMatrix.Transform(viewPos); var gridChunkEnumerator = new ChunkIndicesEnumerator(localPos, range, ChunkSize); @@ -963,13 +968,6 @@ internal sealed partial class PVSSystem : EntitySystem return viewerArray; } - // Read Safe - private (Vector2 worldPos, float range, MapId mapId) CalcViewBounds(in EntityUid euid, EntityQuery transformQuery) - { - var xform = transformQuery.GetComponent(euid); - return (xform.WorldPosition, _viewSize / 2f, xform.MapID); - } - public sealed class SetPolicy : PooledObjectPolicy> { public override HashSet Create() diff --git a/Robust.Shared/CVars.cs b/Robust.Shared/CVars.cs index 6368b0403..572a31c8c 100644 --- a/Robust.Shared/CVars.cs +++ b/Robust.Shared/CVars.cs @@ -4,6 +4,7 @@ using System.Threading; using Robust.Shared.Audio; using Robust.Shared.Configuration; using Robust.Shared.Log; +using Robust.Shared.Maths; using Robust.Shared.Network; using Robust.Shared.Physics; @@ -121,8 +122,8 @@ namespace Robust.Shared /// View size to take for PVS calculations, /// as the size of the sides of a square centered on the view points of clients. /// - public static readonly CVarDef NetMaxUpdateRange = - CVarDef.Create("net.maxupdaterange", 12.5f, CVar.ARCHIVE | CVar.REPLICATED | CVar.SERVER); + public static readonly CVarDef NetDefaultUpdateRange = + CVarDef.Create("net.defaultupdaterange", new Vector2(12.5f, 12.5f), CVar.ARCHIVE | CVar.REPLICATED | CVar.SERVER); /// /// The amount of new entities that can be sent to a client in a single game state, under PVS. diff --git a/Robust.Shared/Network/Messages/MsgConVars.cs b/Robust.Shared/Network/Messages/MsgConVars.cs index 46e371e6f..c9195ca89 100644 --- a/Robust.Shared/Network/Messages/MsgConVars.cs +++ b/Robust.Shared/Network/Messages/MsgConVars.cs @@ -1,6 +1,8 @@ using System; using System.Collections.Generic; +using System.Numerics; using Lidgren.Network; +using Robust.Shared.Configuration; using Robust.Shared.Log; using Robust.Shared.Timing; @@ -66,6 +68,11 @@ namespace Robust.Shared.Network.Messages case CvarType.Double: value = buffer.ReadDouble(); break; + case CvarType.Vector2: + var valX = buffer.ReadFloat(); + var valY = buffer.ReadFloat(); + value = new Vector2(valX, valY); + break; default: throw new ArgumentOutOfRangeException(); } @@ -116,6 +123,11 @@ namespace Robust.Shared.Network.Messages buffer.Write((byte)CvarType.Double); buffer.Write(val); break; + case Vector2 val: + buffer.Write((byte)CvarType.Vector2); + buffer.Write(val.X); + buffer.Write(val.Y); + break; default: throw new ArgumentOutOfRangeException(); } @@ -126,13 +138,13 @@ namespace Robust.Shared.Network.Messages { // ReSharper disable once UnusedMember.Local None, - Int, Long, Bool, String, Float, - Double + Double, + Vector2, } } } diff --git a/Robust.Shared/Player/Filter.cs b/Robust.Shared/Player/Filter.cs index 4b4f64b3b..213101d93 100644 --- a/Robust.Shared/Player/Filter.cs +++ b/Robust.Shared/Player/Filter.cs @@ -5,6 +5,7 @@ using Robust.Shared.Configuration; using Robust.Shared.GameObjects; using Robust.Shared.IoC; using Robust.Shared.Map; +using Robust.Shared.Maths; using Robust.Shared.Physics; using Robust.Shared.Players; @@ -78,7 +79,7 @@ namespace Robust.Shared.Player if (!cfgMan.GetCVar(CVars.NetPVS)) return AddAllPlayers(); - var pvsRange = cfgMan.GetCVar(CVars.NetMaxUpdateRange) * rangeMultiplier; + var pvsRange = cfgMan.GetCVar(CVars.NetDefaultUpdateRange) * rangeMultiplier; return AddInRange(origin, pvsRange, playerMan); } @@ -175,6 +176,13 @@ namespace Robust.Shared.Player (xform.WorldPosition - position.Position).Length < range, playerMan); } + /// + /// Adds all players in range of a position. + /// + public Filter AddInRange(MapCoordinates position, Vector2 range, ISharedPlayerManager? playerMan = null, + IEntityManager? entMan = null) + => AddInRange(position, range.Length, playerMan, entMan); + /// /// Removes all players without the specified visibility flag. ///