> For the complete documentation index, see [llms.txt](https://lifeexe-art.gitbook.io/unreal-engine-c-course/llms.txt). Markdown versions of documentation pages are available by appending `.md` to page URLs; this page is available as [Markdown](https://lifeexe-art.gitbook.io/unreal-engine-c-course/dopolneniya-k-urokam/lekciya-079/pikap-ne-podbiraetsya-esli-boekomplekt-raskhoduetsya-v-tochke-respauna-pikapa.md).

# Пикап не подбирается, если боекомплект расходуется в точке респауна пикапа

[Ветка с обсуждением вопроса](https://www.udemy.com/course/unrealengine/learn/#questions/16019514/)

### Проблема

* Встаем на точку респауна пикапа с полным боекомплектом
* Расходуем боекомплект (достаточно одного выстрела)
* Пипкап не подбирается

### Решение

* Создаем в базовом пикапе массив указателей на `APawn`:

```cpp
UPROPERTY()
TArray<APawn*> OverlappingPawns;
```

* В `NotifyActorBeginOverlap` если не получилось взять пикап — добавляем указатель на пауна в массив:

```cpp
void ASTUBasePickup::NotifyActorBeginOverlap(AActor* OtherActor)
{
    Super::NotifyActorBeginOverlap(OtherActor);

    const auto Pawn = Cast<APawn>(OtherActor);
    if (GivePickupTo(Pawn))
    {
        PickupWasTaken();
    }
    else if (Pawn)
    {
        OverlappingPawns.Add(Pawn);
    }
}
```

* На тик (можно и кастомный таймер сделать) обходим массив, и смотрим: можем ли мы отдать кому-нибудь пикап из сохраненных паунов в массиве (то есть тем, которые в данный момент пересекают коллизию пикапа), и если можем, то отдаем.

```cpp
void ASTUBasePickup::Tick(float DeltaTime)
{
    Super::Tick(DeltaTime);

    AddActorLocalRotation(FRotator(0.0f, RotationYaw, 0.0f));

    for (const auto OverlapPawn : OverlappingPawns)
    {
        if (GivePickupTo(OverlapPawn))
        {
            PickupWasTaken();
            break;
        }
    }
}
```

* Переопределяем функцию `NotifyActorEndOverlap` (которая вызывается, как несложно догадаться, при выходе актора из коллизии) и в ней удаляем пауна из массива, то есть он покинул пикап:

```cpp
void ASTUBasePickup::NotifyActorEndOverlap(AActor* OtherActor)
{
    Super::NotifyActorBeginOverlap(OtherActor);

    const auto Pawn = Cast<APawn>(OtherActor);
    OverlappingPawns.Remove(Pawn);
}
```

\
[Коммит в репозитории](https://github.com/life-exe/UnrealEngine/commit/0da7b42056072fd2bd01d67aaeed26720ceb6e0b)
