--- a/rts/Game/WebbarBrowser.h +++ b/rts/Game/WebbarBrowser.h @@ -244,13 +244,18 @@ command = Command(order.kind); command.PushParam(float(order.target)); } else if (order.kind == CMD_LOAD_UNITS) { + const bool queued = (order.options & SHIFT_KEY) != 0; requireCapability(CMD_LOAD_UNITS); std::erase(ids, int(order.target)); const CUnit* target = unitHandler.GetUnit(order.target); if (ids.empty()) status = 8; - else if (target == nullptr || target->isDead || target->team != gu->myTeam || target->beingBuilt || target->GetTransporter() != nullptr) status = 4; + else if (target == nullptr || target->isDead || !WebbarVisible(target)) status = 4; + else if (!queued && (target->beingBuilt || target->GetTransporter() != nullptr)) status = 4; else { - std::erase_if(ids, [&](int id) { return !unitHandler.GetUnit(id)->CanTransport(target); }); + // Queued cargo can become eligible after an earlier unload or build. + // MobileCAI validates mutable capacity/terrain/cargo state on execution. + if (!queued) + std::erase_if(ids, [&](int id) { return !unitHandler.GetUnit(id)->CanTransport(target); }); if (ids.empty()) status = 8; command.PushParam(float(order.target)); }