--- a/rts/Game/WebbarBrowser.h +++ b/rts/Game/WebbarBrowser.h @@ -454,7 +454,7 @@ static_assert(sizeof(UnitRecord) == 48 && sizeof(ProjectileRecord) == 20); const uint32_t header[] = {0x31524257, uint32_t(gs->frameNum), uint32_t(units.size()), uint32_t(projectiles.size()), CSyncChecker::GetChecksum(), uint32_t(mapDims.mapx * SQUARE_SIZE), - uint32_t(mapDims.mapy * SQUARE_SIZE), 1}; + uint32_t(mapDims.mapy * SQUARE_SIZE), 2}; std::vector packet(sizeof(header) + units.size() * sizeof(UnitRecord) + projectiles.size() * sizeof(ProjectileRecord)); uint8_t* cursor = packet.data(); auto append = [&](const auto& record) { @@ -463,8 +463,13 @@ }; append(header); for (const CUnit* unit: units) { + // Snapshot v2 adds a public draw-material bit only after WebbarUnits' LOS + // admission. Original UnitDrawerData::IsAlpha uses IsCloaked even for a + // detected enemy. Private cloak requests/costs/events stay owner-only. + const uint32_t kind = unit->unitDef->canfly ? 1u : (unit->unitDef->IsImmobileUnit() ? 2u : 0u); + const uint32_t material = WebbarVisible(unit) && unit->IsCloaked() ? 256u : 0u; const UnitRecord record = {uint32_t(unit->id), uint32_t(unit->unitDef->id), uint32_t(unit->team), - unit->unitDef->canfly ? 1u : (unit->unitDef->IsImmobileUnit() ? 2u : 0u), + kind | material, unit->pos.x, unit->pos.y, unit->pos.z, float(unit->heading) * (3.14159265358979323846f / 32768.0f), unit->health / std::max(1.0f, unit->maxHealth), unit->radius, unit->speed.x, unit->speed.z}; append(record);