--- a/rts/Game/WebbarCloak.h +++ b/rts/Game/WebbarCloak.h @@ -24,7 +24,10 @@ // BAR's converters need actual stun status too. This is presentation // eligibility, not a prediction of allocation, payment or MMStatus. const bool converter = !gu->spectating && def->customParams.contains("energyconv_capacity") && def->customParams.contains("energyconv_efficiency"); - if (!def->canCloak && !unit->isCloaked && !unit->stealth && !unit->sonarStealth && !def->canResurrect && unit->stockpileWeapon == nullptr && !converter) continue; + // A jammer's native stun state is distinct from activation and sensor + // coverage. Preserve the original simulation and publish only its state. + const bool jammer = !gu->spectating && (def->jammerRadius > 0 || def->sonarJamRadius > 0); + if (!def->canCloak && !unit->isCloaked && !unit->stealth && !unit->sonarStealth && !def->canResurrect && unit->stockpileWeapon == nullptr && !converter && !jammer) continue; if (records.size() >= 4096) { ++dropped; continue; } commandsChanged |= webbarCloakEvents::CommandMetadataChanged(unit->id, unit->beingBuilt); const auto rule = [&](const char* name) {