Fix bounties(and potentially other things) running out of ids (#32700)
* Make NameIdentifier Ids get refreshed after round restarts Before this commit the existing values would just get shuffled. This means that eventually the server would run out of ids to give to new entities for different groups. As a result everything would get id 0 * Comply with what seemingly is the convention for sawmills * Make it impossible to insert a bounty with a duplicate id * Reduce duplication * Remove unused sawmill * Fix rustbrain and skill issue * Aaaa * Apply suggestions from code review --------- Co-authored-by: Pieter-Jan Briers <pieterjan.briers@gmail.com>
This commit is contained in:
@@ -420,6 +420,13 @@ public sealed partial class CargoSystem
|
|||||||
return false;
|
return false;
|
||||||
|
|
||||||
_nameIdentifier.GenerateUniqueName(uid, BountyNameIdentifierGroup, out var randomVal);
|
_nameIdentifier.GenerateUniqueName(uid, BountyNameIdentifierGroup, out var randomVal);
|
||||||
|
var newBounty = new CargoBountyData(bounty, randomVal);
|
||||||
|
// This bounty id already exists! Probably because NameIdentifierSystem ran out of ids.
|
||||||
|
if (component.Bounties.Any(b => b.Id == newBounty.Id))
|
||||||
|
{
|
||||||
|
Log.Error("Failed to add bounty {ID} because another one with the same ID already existed!", newBounty.Id);
|
||||||
|
return false;
|
||||||
|
}
|
||||||
component.Bounties.Add(new CargoBountyData(bounty, randomVal));
|
component.Bounties.Add(new CargoBountyData(bounty, randomVal));
|
||||||
_adminLogger.Add(LogType.Action, LogImpact.Low, $"Added bounty \"{bounty.ID}\" (id:{component.TotalBounties}) to station {ToPrettyString(uid)}");
|
_adminLogger.Add(LogType.Action, LogImpact.Low, $"Added bounty \"{bounty.ID}\" (id:{component.TotalBounties}) to station {ToPrettyString(uid)}");
|
||||||
component.TotalBounties++;
|
component.TotalBounties++;
|
||||||
|
|||||||
@@ -14,6 +14,7 @@ public sealed class NameIdentifierSystem : EntitySystem
|
|||||||
[Dependency] private readonly IPrototypeManager _prototypeManager = default!;
|
[Dependency] private readonly IPrototypeManager _prototypeManager = default!;
|
||||||
[Dependency] private readonly IRobustRandom _robustRandom = default!;
|
[Dependency] private readonly IRobustRandom _robustRandom = default!;
|
||||||
[Dependency] private readonly MetaDataSystem _metaData = default!;
|
[Dependency] private readonly MetaDataSystem _metaData = default!;
|
||||||
|
[Dependency] private readonly ILogManager _logManager = default!;
|
||||||
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
/// Free IDs available per <see cref="NameIdentifierGroupPrototype"/>.
|
/// Free IDs available per <see cref="NameIdentifierGroupPrototype"/>.
|
||||||
@@ -118,23 +119,39 @@ public sealed class NameIdentifierSystem : EntitySystem
|
|||||||
|
|
||||||
private void InitialSetupPrototypes()
|
private void InitialSetupPrototypes()
|
||||||
{
|
{
|
||||||
foreach (var proto in _prototypeManager.EnumeratePrototypes<NameIdentifierGroupPrototype>())
|
EnsureIds();
|
||||||
{
|
|
||||||
AddGroup(proto);
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
private void AddGroup(NameIdentifierGroupPrototype proto)
|
private void FillGroup(NameIdentifierGroupPrototype proto, List<int> values)
|
||||||
{
|
{
|
||||||
var values = new List<int>(proto.MaxValue - proto.MinValue);
|
values.Clear();
|
||||||
|
|
||||||
for (var i = proto.MinValue; i < proto.MaxValue; i++)
|
for (var i = proto.MinValue; i < proto.MaxValue; i++)
|
||||||
{
|
{
|
||||||
values.Add(i);
|
values.Add(i);
|
||||||
}
|
}
|
||||||
|
|
||||||
_robustRandom.Shuffle(values);
|
_robustRandom.Shuffle(values);
|
||||||
CurrentIds.Add(proto.ID, values);
|
}
|
||||||
|
|
||||||
|
private List<int> GetOrCreateIdList(NameIdentifierGroupPrototype proto)
|
||||||
|
{
|
||||||
|
if (!CurrentIds.TryGetValue(proto.ID, out var ids))
|
||||||
|
{
|
||||||
|
ids = new List<int>(proto.MaxValue - proto.MinValue);
|
||||||
|
CurrentIds.Add(proto.ID, ids);
|
||||||
|
}
|
||||||
|
|
||||||
|
return ids;
|
||||||
|
}
|
||||||
|
|
||||||
|
private void EnsureIds()
|
||||||
|
{
|
||||||
|
foreach (var proto in _prototypeManager.EnumeratePrototypes<NameIdentifierGroupPrototype>())
|
||||||
|
{
|
||||||
|
var ids = GetOrCreateIdList(proto);
|
||||||
|
|
||||||
|
FillGroup(proto, ids);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
private void OnReloadPrototypes(PrototypesReloadedEventArgs ev)
|
private void OnReloadPrototypes(PrototypesReloadedEventArgs ev)
|
||||||
@@ -159,19 +176,20 @@ public sealed class NameIdentifierSystem : EntitySystem
|
|||||||
|
|
||||||
foreach (var proto in set.Modified.Values)
|
foreach (var proto in set.Modified.Values)
|
||||||
{
|
{
|
||||||
|
var name_proto = (NameIdentifierGroupPrototype) proto;
|
||||||
|
|
||||||
// Only bother adding new ones.
|
// Only bother adding new ones.
|
||||||
if (CurrentIds.ContainsKey(proto.ID))
|
if (CurrentIds.ContainsKey(proto.ID))
|
||||||
continue;
|
continue;
|
||||||
|
|
||||||
AddGroup((NameIdentifierGroupPrototype) proto);
|
var ids = GetOrCreateIdList(name_proto);
|
||||||
|
FillGroup(name_proto, ids);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
private void CleanupIds(RoundRestartCleanupEvent ev)
|
private void CleanupIds(RoundRestartCleanupEvent ev)
|
||||||
{
|
{
|
||||||
foreach (var values in CurrentIds.Values)
|
EnsureIds();
|
||||||
{
|
|
||||||
_robustRandom.Shuffle(values);
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user