Late Join Menu Properly Retains Position On New Player Joins (#26483)
* When another player late joins it will correctly update the UI locally * Resolve passengers not displaying the correct message in late join * Improve final boolean comparison of button disabled state to be a bit neater
This commit is contained in:
@@ -33,7 +33,7 @@ namespace Content.Client.LateJoin
|
|||||||
private readonly SpriteSystem _sprites;
|
private readonly SpriteSystem _sprites;
|
||||||
private readonly CrewManifestSystem _crewManifest;
|
private readonly CrewManifestSystem _crewManifest;
|
||||||
|
|
||||||
private readonly Dictionary<NetEntity, Dictionary<string, JobButton>> _jobButtons = new();
|
private readonly Dictionary<NetEntity, Dictionary<string, List<JobButton>>> _jobButtons = new();
|
||||||
private readonly Dictionary<NetEntity, Dictionary<string, BoxContainer>> _jobCategories = new();
|
private readonly Dictionary<NetEntity, Dictionary<string, BoxContainer>> _jobCategories = new();
|
||||||
private readonly List<ScrollContainer> _jobLists = new();
|
private readonly List<ScrollContainer> _jobLists = new();
|
||||||
|
|
||||||
@@ -139,7 +139,7 @@ namespace Content.Client.LateJoin
|
|||||||
var jobListScroll = new ScrollContainer()
|
var jobListScroll = new ScrollContainer()
|
||||||
{
|
{
|
||||||
VerticalExpand = true,
|
VerticalExpand = true,
|
||||||
Children = {jobList},
|
Children = { jobList },
|
||||||
Visible = false,
|
Visible = false,
|
||||||
};
|
};
|
||||||
|
|
||||||
@@ -163,11 +163,12 @@ namespace Content.Client.LateJoin
|
|||||||
var departments = _prototypeManager.EnumeratePrototypes<DepartmentPrototype>().ToArray();
|
var departments = _prototypeManager.EnumeratePrototypes<DepartmentPrototype>().ToArray();
|
||||||
Array.Sort(departments, DepartmentUIComparer.Instance);
|
Array.Sort(departments, DepartmentUIComparer.Instance);
|
||||||
|
|
||||||
|
_jobButtons[id] = new Dictionary<string, List<JobButton>>();
|
||||||
|
|
||||||
foreach (var department in departments)
|
foreach (var department in departments)
|
||||||
{
|
{
|
||||||
var departmentName = Loc.GetString($"department-{department.ID}");
|
var departmentName = Loc.GetString($"department-{department.ID}");
|
||||||
_jobCategories[id] = new Dictionary<string, BoxContainer>();
|
_jobCategories[id] = new Dictionary<string, BoxContainer>();
|
||||||
_jobButtons[id] = new Dictionary<string, JobButton>();
|
|
||||||
var stationAvailable = _gameTicker.JobsAvailable[id];
|
var stationAvailable = _gameTicker.JobsAvailable[id];
|
||||||
var jobsAvailable = new List<JobPrototype>();
|
var jobsAvailable = new List<JobPrototype>();
|
||||||
|
|
||||||
@@ -223,7 +224,13 @@ namespace Content.Client.LateJoin
|
|||||||
foreach (var prototype in jobsAvailable)
|
foreach (var prototype in jobsAvailable)
|
||||||
{
|
{
|
||||||
var value = stationAvailable[prototype.ID];
|
var value = stationAvailable[prototype.ID];
|
||||||
var jobButton = new JobButton(prototype.ID, value);
|
|
||||||
|
var jobLabel = new Label
|
||||||
|
{
|
||||||
|
Margin = new Thickness(5f, 0, 0, 0)
|
||||||
|
};
|
||||||
|
|
||||||
|
var jobButton = new JobButton(jobLabel, prototype.ID, prototype.LocalizedName, value);
|
||||||
|
|
||||||
var jobSelector = new BoxContainer
|
var jobSelector = new BoxContainer
|
||||||
{
|
{
|
||||||
@@ -241,14 +248,6 @@ namespace Content.Client.LateJoin
|
|||||||
icon.Texture = _sprites.Frame0(jobIcon.Icon);
|
icon.Texture = _sprites.Frame0(jobIcon.Icon);
|
||||||
jobSelector.AddChild(icon);
|
jobSelector.AddChild(icon);
|
||||||
|
|
||||||
var jobLabel = new Label
|
|
||||||
{
|
|
||||||
Margin = new Thickness(5f, 0, 0, 0),
|
|
||||||
Text = value != null ?
|
|
||||||
Loc.GetString("late-join-gui-job-slot-capped", ("jobName", prototype.LocalizedName), ("amount", value)) :
|
|
||||||
Loc.GetString("late-join-gui-job-slot-uncapped", ("jobName", prototype.LocalizedName)),
|
|
||||||
};
|
|
||||||
|
|
||||||
jobSelector.AddChild(jobLabel);
|
jobSelector.AddChild(jobLabel);
|
||||||
jobButton.AddChild(jobSelector);
|
jobButton.AddChild(jobSelector);
|
||||||
category.AddChild(jobButton);
|
category.AddChild(jobButton);
|
||||||
@@ -280,15 +279,43 @@ namespace Content.Client.LateJoin
|
|||||||
jobButton.Disabled = true;
|
jobButton.Disabled = true;
|
||||||
}
|
}
|
||||||
|
|
||||||
_jobButtons[id][prototype.ID] = jobButton;
|
if (!_jobButtons[id].ContainsKey(prototype.ID))
|
||||||
|
{
|
||||||
|
_jobButtons[id][prototype.ID] = new List<JobButton>();
|
||||||
|
}
|
||||||
|
|
||||||
|
_jobButtons[id][prototype.ID].Add(jobButton);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
private void JobsAvailableUpdated(IReadOnlyDictionary<NetEntity, Dictionary<string, uint?>> _)
|
private void JobsAvailableUpdated(IReadOnlyDictionary<NetEntity, Dictionary<string, uint?>> updatedJobs)
|
||||||
{
|
{
|
||||||
RebuildUI();
|
foreach (var stationEntries in updatedJobs)
|
||||||
|
{
|
||||||
|
if (_jobButtons.ContainsKey(stationEntries.Key))
|
||||||
|
{
|
||||||
|
var jobsAvailable = stationEntries.Value;
|
||||||
|
|
||||||
|
var existingJobEntries = _jobButtons[stationEntries.Key];
|
||||||
|
foreach (var existingJobEntry in existingJobEntries)
|
||||||
|
{
|
||||||
|
if (jobsAvailable.ContainsKey(existingJobEntry.Key))
|
||||||
|
{
|
||||||
|
var updatedJobValue = jobsAvailable[existingJobEntry.Key];
|
||||||
|
foreach (var matchingJobButton in existingJobEntry.Value)
|
||||||
|
{
|
||||||
|
if (matchingJobButton.Amount != updatedJobValue)
|
||||||
|
{
|
||||||
|
matchingJobButton.RefreshLabel(updatedJobValue);
|
||||||
|
matchingJobButton.Disabled = matchingJobButton.Amount == 0;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
protected override void Dispose(bool disposing)
|
protected override void Dispose(bool disposing)
|
||||||
@@ -307,14 +334,33 @@ namespace Content.Client.LateJoin
|
|||||||
|
|
||||||
sealed class JobButton : ContainerButton
|
sealed class JobButton : ContainerButton
|
||||||
{
|
{
|
||||||
|
public Label JobLabel { get; }
|
||||||
public string JobId { get; }
|
public string JobId { get; }
|
||||||
public uint? Amount { get; }
|
public string JobLocalisedName { get; }
|
||||||
|
public uint? Amount { get; private set; }
|
||||||
|
private bool _initialised = false;
|
||||||
|
|
||||||
public JobButton(string jobId, uint? amount)
|
public JobButton(Label jobLabel, string jobId, string jobLocalisedName, uint? amount)
|
||||||
{
|
{
|
||||||
|
JobLabel = jobLabel;
|
||||||
JobId = jobId;
|
JobId = jobId;
|
||||||
Amount = amount;
|
JobLocalisedName = jobLocalisedName;
|
||||||
|
RefreshLabel(amount);
|
||||||
AddStyleClass(StyleClassButton);
|
AddStyleClass(StyleClassButton);
|
||||||
|
_initialised = true;
|
||||||
|
}
|
||||||
|
|
||||||
|
public void RefreshLabel(uint? amount)
|
||||||
|
{
|
||||||
|
if (Amount == amount && _initialised)
|
||||||
|
{
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
Amount = amount;
|
||||||
|
|
||||||
|
JobLabel.Text = Amount != null ?
|
||||||
|
Loc.GetString("late-join-gui-job-slot-capped", ("jobName", JobLocalisedName), ("amount", Amount)) :
|
||||||
|
Loc.GetString("late-join-gui-job-slot-uncapped", ("jobName", JobLocalisedName));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user