diff --git a/Source/Vehicles/Components/Vehicles/VehiclePawn/VehiclePawn_Combat.cs b/Source/Vehicles/Components/Vehicles/VehiclePawn/VehiclePawn_Combat.cs index 80e67c0d..3aefedec 100644 --- a/Source/Vehicles/Components/Vehicles/VehiclePawn/VehiclePawn_Combat.cs +++ b/Source/Vehicles/Components/Vehicles/VehiclePawn/VehiclePawn_Combat.cs @@ -69,7 +69,7 @@ public void CheckForCollisions(float moveSpeed) { if (Map.thingGrid.ThingAt(cell, ThingCategory.Pawn) is Pawn pawn and not VehiclePawn) { - if (pawn.Faction.HostileTo(Faction) || Faction == null || + if (TargetingHelper.IsHostileToVehicleOrFaction(this, pawn) || Faction == null || Rand.Chance(VehicleDamager.FriendlyFireChance(this, pawn))) { (float pawnDamage, float vehicleDamage) = CalculateImpactDamage(pawn, this, moveSpeed); diff --git a/Source/Vehicles/Utility/Helpers/TargetingHelper.cs b/Source/Vehicles/Utility/Helpers/TargetingHelper.cs index a823529c..b34d6a5c 100644 --- a/Source/Vehicles/Utility/Helpers/TargetingHelper.cs +++ b/Source/Vehicles/Utility/Helpers/TargetingHelper.cs @@ -36,6 +36,11 @@ public static bool TryGetTarget(this VehicleTurret turret, out LocalTargetInfo t return false; } + internal static bool IsHostileToVehicleOrFaction(VehiclePawn vehicle, Thing target) + { + return vehicle.HostileTo(target) || target.HostileTo(vehicle.Faction); + } + /// /// Best attack target for VehicleTurret /// @@ -81,7 +86,7 @@ private static IAttackTarget BestAttackTarget(VehicleTurret turret, TargetScanFl { return false; } - if (!searcherPawn.HostileTo(thing)) + if (!IsHostileToVehicleOrFaction(searcherPawn, thing)) { return false; } @@ -162,8 +167,14 @@ private static IAttackTarget BestAttackTarget(VehicleTurret turret, TargetScanFl return true; }; - List tmpTargets = - [.. searcherPawn.Map.attackTargetsCache.GetPotentialTargetsFor(searcherPawn)]; + var attackTargetsCache = searcherPawn.Map.attackTargetsCache; + HashSet targetSet = [.. attackTargetsCache.GetPotentialTargetsFor(searcherPawn)]; + if (searcherPawn.Faction != null) + { + targetSet.UnionWith(attackTargetsCache.TargetsHostileToFaction(searcherPawn.Faction)); + } + List tmpTargets = [.. targetSet]; + bool flag = false; for (int i = 0; i < tmpTargets.Count; i++) {