Прицеп отцепляется, пока машина принадлежит игроку, в том числе и с улицы. Если сесть в другую, отцепка уже не действует. В жизни может быть похоже, вышел, отцепил, думаю это допустимо.
Да так, но я посчитал, что лучше сделать возможность отцепить прицеп только находясь в тягаче.
По поводу брошенных прицепов, можно же создавать машины без запоминания (в классе CVehicle свойство 0x1F8 m_nCreatedBy), они сами исчезнут вне зоны видимости.
Сначала так и делал, создавал прицеп, чтобы игра сама его удаляла, как остальной транспорт в трафике. Происходило именно это
Хотя могут быть подводные камни, типа прицеп в трафике с пропавшим тягачом.
Либо наоборот - пропадал прицеп, а тягач оставался.
Потом стал устанавливать тягачу флаг trailer->m_nVehicleFlags.bIsLocked и проверял на определённом расстоянии от игрока есть ли тягач в заданных координатах от прицепа, в случае отсутствия, удалял прицеп.
(для SA я ставил и тягачу, потом проверял, если тягач и прицеп находятся от игрока на дистанции > 200, выключал этот флаг и vehicle->m_pTrailer->CanBeDeleted(); vehicle->CanBeDeleted(); )
Теперь сделал по другому - добавил флаг, что прицеп прицеплен (включаю при создании прицепа). Написал функцию проверки, что прицеп "прицеплен". По-сути это часть твоего кода для проверки нахождения прицепа возле тягача:
static bool TrailerAttached(CVehicle *trailer) {
bool result = FALSE;
for (int i = 0; i < CPools::ms_pVehiclePool->m_nSize; i++) {
CVehicle *vehicle = CPools::ms_pVehiclePool->GetAt(i);
if (vehicle && vehicle->m_nVehicleClass == VEHICLE_AUTOMOBILE && vehicle->m_fHealth > 0.1f && vehComps.Get(vehicle).misc
&& (vehComps.Get(vehicle).connector == vehComps.Get(trailer).connector)
&& (Distance(PointOffset(vehicle->m_matrix, 0, vehComps.Get(vehicle).misc->modelling.pos.y, vehComps.Get(vehicle).misc->modelling.pos.z), PointOffset(trailer->m_matrix, 0, vehComps.Get(trailer).hookup->modelling.pos.y, vehComps.Get(trailer).hookup->modelling.pos.z)) < 2.0f)) {
result = TRUE;
}
}
return result;
}
Потом так:
ModelInfo &infoTrailer = modelInfo.Get(trailer);
if (infoTrailer.isAttached && !trailer->GetIsOnScreen()) {
if (!TrailerAttached(trailer))
CWorld::Remove(trailer);
}
Ну и "брошенных" прицепов в трафике нет.