public float MinBountyTime = 600f;
/// <summary>
- /// The maxmium amount of time the bounty lasts before being removed.
+ /// The maximum amount of time the bounty lasts before being removed.
/// </summary>
[DataField("maxBountyTime"), ViewVariables(VVAccess.ReadWrite)]
public float MaxBountyTime = 905f;
+
+ /// <summary>
+ /// A list of bounty IDs that have been checked this tick.
+ /// Used to prevent multiplying bounty prices.
+ /// </summary>
+ [DataField]
+ public HashSet<int> CheckedBounties = new();
}
if (!_container.TryGetContainingContainer(uid, out var container) || container.ID != LabelSystem.ContainerName)
return;
- if (_station.GetOwningStation(uid) is not { } station)
+ if (_station.GetOwningStation(uid) is not { } station || !TryComp<StationCargoBountyDatabaseComponent>(station, out var database))
+ return;
+
+ if (database.CheckedBounties.Contains(component.Id))
return;
- if (!TryGetBountyFromId(station, component.Id, out var bounty))
+ if (!TryGetBountyFromId(station, component.Id, out var bounty, database))
return;
- if (!_protoMan.TryIndex<CargoBountyPrototype>(bounty.Value.Bounty, out var bountyProtoype) ||!IsBountyComplete(container.Owner, bountyProtoype))
+ if (!_protoMan.TryIndex<CargoBountyPrototype>(bounty.Value.Bounty, out var bountyPrototype) ||
+ !IsBountyComplete(container.Owner, bountyPrototype))
return;
+
+ database.CheckedBounties.Add(component.Id);
args.Handled = true;
component.Calculating = true;
- args.Price = bountyProtoype.Reward - _pricing.GetPrice(container.Owner);
+ args.Price = bountyPrototype.Reward - _pricing.GetPrice(container.Owner);
component.Calculating = false;
}
var query = EntityQueryEnumerator<StationCargoBountyDatabaseComponent>();
while (query.MoveNext(out var uid, out var bountyDatabase))
{
+ bountyDatabase.CheckedBounties.Clear();
var bounties = new ValueList<CargoBountyData>(bountyDatabase.Bounties);
foreach (var bounty in bounties)
{