Expand PVS entities to all players at round end (#18963)

This commit is contained in:
Vordenburg 2023-08-13 12:55:04 -04:00 • committed by GitHub
parent 8b1af46a2b
commit 19326be2d4
No known key found for this signature in database
GPG key ID: 4AEE18F83AFDEB23
2 changed files with 56 additions and 0 deletions

View file

@ -7,6 +7,7 @@ using Content.Shared.GameTicking;
using Content.Shared.Preferences;
using JetBrains.Annotations;
using Prometheus;
using Robust.Server.GameStates;
using Robust.Server.Maps;
using Robust.Server.Player;
using Robust.Shared.Audio;
@ -45,6 +46,22 @@ namespace Content.Server.GameTicking
[ViewVariables]
private bool _startingRound;
/// <summary>
/// This is a list of players that are going to appear in the round-end
/// crew manifest so their children entities can be collected each update
/// and sent to far-away players.
/// </summary>
[ViewVariables]
private HashSet<EntityUid> _expandPvsPlayers = new();
/// <summary>
/// This is the list of the children entities that should be sent to
/// all players at the end of the round, to keep distant characters from
/// looking naked in the crew manifest.
/// </summary>
[ViewVariables]
private List<EntityUid> _expandPvsEntities = new();
[ViewVariables]
private GameRunLevel _runLevel;
@ -64,6 +81,11 @@ namespace Content.Server.GameTicking
}
}
private void InitializeRoundFlow()
{
SubscribeLocalEvent<ExpandPvsEvent>(OnExpandPvs);
}
/// <summary>
/// Returns true if the round's map is eligible to be updated.
/// </summary>
@ -299,6 +321,14 @@ namespace Content.Server.GameTicking
ShowRoundEndScoreboard(text);
}
private void OnExpandPvs(ref ExpandPvsEvent args)
{
if (RunLevel != GameRunLevel.PostRound)
return;
args.Entities.AddRange(_expandPvsEntities);
}
public void ShowRoundEndScoreboard(string text = "")
{
// Log end of round
@ -316,6 +346,10 @@ namespace Content.Server.GameTicking
//Get the timespan of the round.
var roundDuration = RoundDuration();
// Should already be empty, but just in case.
_expandPvsEntities.Clear();
_expandPvsPlayers.Clear();
//Generate a list of basic player info to display in the end round summary.
var listOfPlayerInfo = new List<RoundEndMessageEvent.RoundEndPlayerInfo>();
// Grab the great big book of all the Minds, we'll need them for this.
@ -349,6 +383,9 @@ namespace Content.Server.GameTicking
else if (mind.CurrentEntity != null && TryName(mind.CurrentEntity.Value, out var icName))
playerIcName = icName;
if (Exists(mind.OriginalOwnedEntity))
_expandPvsPlayers.Add(mind.OriginalOwnedEntity.Value);
var playerEndRoundInfo = new RoundEndMessageEvent.RoundEndPlayerInfo()
{
// Note that contentPlayerData?.Name sticks around after the player is disconnected.
@ -366,6 +403,21 @@ namespace Content.Server.GameTicking
};
listOfPlayerInfo.Add(playerEndRoundInfo);
}
// Recursively collect entities for the crew manifest.
void RecursePvsEntities(IEnumerable<EntityUid> entities)
{
_expandPvsEntities.AddRange(entities);
foreach (var entity in entities)
{
if (TryComp<TransformComponent>(entity, out var xform))
RecursePvsEntities(xform.ChildEntities);
}
}
RecursePvsEntities(_expandPvsPlayers);
// This ordering mechanism isn't great (no ordering of minds) but functions
var listOfPlayerInfoFinal = listOfPlayerInfo.OrderBy(pi => pi.PlayerOOCName).ToArray();
@ -464,6 +516,9 @@ namespace Content.Server.GameTicking
_allPreviousGameRules.Clear();
_expandPvsPlayers.Clear();
_expandPvsEntities.Clear();
// Round restart cleanup event, so entity systems can reset.
var ev = new RoundRestartCleanupEvent();
RaiseLocalEvent(ev);

View file

@ -70,6 +70,7 @@ namespace Content.Server.GameTicking
"Overflow role does not have the correct name!");
InitializeGameRules();
InitializeReplays();
InitializeRoundFlow();
_initialized = true;
}