]> git.smokeofanarchy.ru Git - space-station-14.git/commitdiff
Fix double counting bounties (#21399)
authorNemanja <98561806+EmoGarbage404@users.noreply.github.com>
Sat, 4 Nov 2023 13:19:23 +0000 (09:19 -0400)
committerGitHub <noreply@github.com>
Sat, 4 Nov 2023 13:19:23 +0000 (16:19 +0300)
Content.Server/Cargo/Components/StationCargoBountyDatabaseComponent.cs
Content.Server/Cargo/Systems/CargoSystem.Bounty.cs

index d94c2995e3dc7bcf8481c221eb54635d5e5b3da6..68517ea144ab38565fbbd8a30d871c30335e736b 100644 (file)
@@ -33,8 +33,15 @@ public sealed partial class StationCargoBountyDatabaseComponent : Component
     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();
 }
index be8f54dfeef5162ac8bb90c31c6c5f9fcadc1fb7..f502b7f92f445e4e2d78144e9086da820cb7656d 100644 (file)
@@ -89,18 +89,24 @@ public sealed partial class CargoSystem
         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;
     }
 
@@ -329,6 +335,7 @@ public sealed partial class CargoSystem
         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)
             {