void UGameplayTasksComponent::AddTaskToPriorityQueue(UGameplayTask& NewTask) { const bool bStartOnTopOfSamePriority = (NewTask.GetResourceOverlapPolicy() == ETaskResourceOverlapPolicy::StartOnTop); int32 InsertionPoint = INDEX_NONE; for (int32 Idx = 0; Idx < TaskPriorityQueue.Num(); ++Idx) { if (TaskPriorityQueue[Idx] == nullptr) { continue; } if ((bStartOnTopOfSamePriority && TaskPriorityQueue[Idx]->GetPriority() <= NewTask.GetPriority()) || (!bStartOnTopOfSamePriority && TaskPriorityQueue[Idx]->GetPriority() < NewTask.GetPriority())) { TaskPriorityQueue.Insert(&NewTask, Idx); InsertionPoint = Idx; break; } } if (InsertionPoint == INDEX_NONE) { TaskPriorityQueue.Add(&NewTask); } }
static FString DescribeTaskHelper(const UGameplayTask& TaskOb) { const UObject* OwnerOb = Cast<const UObject>(TaskOb.GetTaskOwner()); return FString::Printf(TEXT("\n {white}%s%s {%s}%s:%d {white}Owner:{yellow}%s {white}Res:{yellow}%s"), *TaskOb.GetName(), TaskOb.GetInstanceName() != NAME_None ? *FString::Printf(TEXT(" {yellow}[%s]"), *TaskOb.GetInstanceName().ToString()) : TEXT(""), TaskOb.IsActive() ? TEXT("green") : TEXT("orange"), *TaskOb.GetTaskStateName(), TaskOb.GetPriority(), *GetNameSafe(OwnerOb), TaskOb.GetRequiredResources().IsEmpty() ? TEXT("None") : *TaskOb.GetRequiredResources().GetDebugDescription()); }