fix repair tool targeting

This commit is contained in:
2026-06-17 21:52:47 +02:00
parent 41c8ed2938
commit b95eaaaded

View File

@@ -5,6 +5,7 @@
#include "BehaviorScores.h" #include "BehaviorScores.h"
#include "BehaviorTargeting.h" #include "BehaviorTargeting.h"
#include "EntityAdmin.h" #include "EntityAdmin.h"
#include "FactionComponent.h"
#include "HealthComponent.h" #include "HealthComponent.h"
#include "PositionComponent.h" #include "PositionComponent.h"
#include "RepairBehavior.h" #include "RepairBehavior.h"
@@ -16,23 +17,28 @@ void RepairEvaluator::evaluate(EntityAdmin& admin)
TRACE(); TRACE();
const std::vector<RepairableInfo> repairables = buildRepairables(admin); const std::vector<RepairableInfo> repairables = buildRepairables(admin);
admin.forEach<RepairBehavior, PositionComponent, SensorRangeComponent>( admin.forEach<RepairBehavior, PositionComponent, SensorRangeComponent, FactionComponent>(
[&](entt::entity e, RepairBehavior& repair, const PositionComponent& pos, [&](entt::entity e, RepairBehavior& repair, const PositionComponent& pos,
const SensorRangeComponent& sensor) const SensorRangeComponent& sensor, const FactionComponent& faction)
{ {
// Validate current target: alive and still damaged. // Validate current target: same faction, alive and still damaged.
bool targetValid = false; bool targetValid = false;
if (repair.currentTarget) if (repair.currentTarget)
{ {
const entt::entity t = *repair.currentTarget; const entt::entity t = *repair.currentTarget;
if (admin.isValid(t) && admin.hasAll<HealthComponent>(t)) if (admin.isValid(t) && admin.hasAll<HealthComponent, FactionComponent>(t))
{ {
const HealthComponent& th = admin.get<HealthComponent>(t); const HealthComponent& th = admin.get<HealthComponent>(t);
if (th.hp > 0.0f && th.hp < th.maxHp) { targetValid = true; } const FactionComponent& tf = admin.get<FactionComponent>(t);
if (tf.isEnemy == faction.isEnemy && th.hp > 0.0f && th.hp < th.maxHp)
{
targetValid = true;
}
} }
} }
// Acquire nearest damaged friendly within sensor range. // Acquire nearest damaged friendly within sensor range. Friendly is
// relative to this ship's faction, not the absolute isEnemy flag.
if (!targetValid) if (!targetValid)
{ {
repair.currentTarget = std::nullopt; repair.currentTarget = std::nullopt;
@@ -40,7 +46,7 @@ void RepairEvaluator::evaluate(EntityAdmin& admin)
for (const RepairableInfo& r : repairables) for (const RepairableInfo& r : repairables)
{ {
if (r.entity == e) { continue; } if (r.entity == e) { continue; }
if (r.isEnemy) { continue; } if (r.isEnemy != faction.isEnemy) { continue; }
if (r.hp <= 0.0f || r.hp >= r.maxHp) { continue; } if (r.hp <= 0.0f || r.hp >= r.maxHp) { continue; }
const float dist = (r.position - pos.value).length(); const float dist = (r.position - pos.value).length();
if (dist < bestDist) if (dist < bestDist)