From bc89ac167dd8ce29a5677de4abd01bc1f7d8f43d Mon Sep 17 00:00:00 2001 From: Whatstone Date: Sat, 8 Feb 2025 21:22:43 -0500 Subject: [PATCH 1/2] BorgSystem: check droppable items for duped mods --- .../Silicons/Borgs/BorgSystem.Modules.cs | 27 ++++++++++++++++++- 1 file changed, 26 insertions(+), 1 deletion(-) diff --git a/Content.Server/Silicons/Borgs/BorgSystem.Modules.cs b/Content.Server/Silicons/Borgs/BorgSystem.Modules.cs index d955813ddfd..b8d6b4561e7 100644 --- a/Content.Server/Silicons/Borgs/BorgSystem.Modules.cs +++ b/Content.Server/Silicons/Borgs/BorgSystem.Modules.cs @@ -369,7 +369,9 @@ public bool CanInsertModule(EntityUid uid, EntityUid module, BorgChassisComponen continue; if (containedItemModuleComp.Items.Count == itemModuleComp.Items.Count && - containedItemModuleComp.Items.All(itemModuleComp.Items.Contains)) + containedItemModuleComp.DroppableItems.Count == itemModuleComp.DroppableItems.Count && // Frontier + containedItemModuleComp.Items.All(itemModuleComp.Items.Contains) && + containedItemModuleComp.DroppableItems.All(x => itemModuleComp.DroppableItems.Contains(x, new DroppableBorgItemComparer()))) // Frontier { if (user != null) Popup.PopupEntity(Loc.GetString("borg-module-duplicate"), uid, user.Value); @@ -381,6 +383,29 @@ public bool CanInsertModule(EntityUid uid, EntityUid module, BorgChassisComponen return true; } + // Frontier: droppable borg item comparator + private sealed class DroppableBorgItemComparer : IEqualityComparer + { + public bool Equals(DroppableBorgItem? x, DroppableBorgItem? y) + { + // Same object + if (ReferenceEquals(x, y)) + return true; + // Comparisons vs. null + if (x is null || y is null) + return false; + // Otherwise, use EntProtoId of item to keep + return x.ID == y.ID; + } + + public int GetHashCode(DroppableBorgItem obj) + { + if (obj is null) return 0; + return obj.ID.GetHashCode(); + } + } + // End Frontier + /// /// Check if a module can be removed from a borg. /// From e4a1322c305d83dc1519d1f2a3c92e6952f8d4cf Mon Sep 17 00:00:00 2001 From: Whatstone Date: Mon, 10 Feb 2025 17:54:17 -0500 Subject: [PATCH 2/2] Cache item comparer --- .../Silicons/Borgs/BorgSystem.Modules.cs | 14 ++++++++------ 1 file changed, 8 insertions(+), 6 deletions(-) diff --git a/Content.Server/Silicons/Borgs/BorgSystem.Modules.cs b/Content.Server/Silicons/Borgs/BorgSystem.Modules.cs index b8d6b4561e7..5eafc0ce8d8 100644 --- a/Content.Server/Silicons/Borgs/BorgSystem.Modules.cs +++ b/Content.Server/Silicons/Borgs/BorgSystem.Modules.cs @@ -363,6 +363,7 @@ public bool CanInsertModule(EntityUid uid, EntityUid module, BorgChassisComponen if (TryComp(module, out var itemModuleComp)) { + var droppableComparer = new DroppableBorgItemComparer(); // Frontier: cached comparer foreach (var containedModuleUid in component.ModuleContainer.ContainedEntities) { if (!TryComp(containedModuleUid, out var containedItemModuleComp)) @@ -371,7 +372,7 @@ public bool CanInsertModule(EntityUid uid, EntityUid module, BorgChassisComponen if (containedItemModuleComp.Items.Count == itemModuleComp.Items.Count && containedItemModuleComp.DroppableItems.Count == itemModuleComp.DroppableItems.Count && // Frontier containedItemModuleComp.Items.All(itemModuleComp.Items.Contains) && - containedItemModuleComp.DroppableItems.All(x => itemModuleComp.DroppableItems.Contains(x, new DroppableBorgItemComparer()))) // Frontier + containedItemModuleComp.DroppableItems.All(x => itemModuleComp.DroppableItems.Contains(x, droppableComparer))) // Frontier { if (user != null) Popup.PopupEntity(Loc.GetString("borg-module-duplicate"), uid, user.Value); @@ -388,19 +389,20 @@ private sealed class DroppableBorgItemComparer : IEqualityComparer