void UGameplayTasksComponent::RemoveResourceConsumingTask(UGameplayTask& Task) { UE_VLOG(this, LogGameplayTasks, Log, TEXT("RemoveResourceConsumingTask %s"), *Task.GetName()); TaskEvents.Add(FGameplayTaskEventData(EGameplayTaskEvent::Remove, Task)); // trigger the actual processing only if it was the first event added to the list if (TaskEvents.Num() == 1 && CanProcessEvents()) { ProcessTaskEvents(); } }
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()); }
//----------------------------------------------------------------------// // Priority and resources handling //----------------------------------------------------------------------// void UGameplayTasksComponent::AddTaskReadyForActivation(UGameplayTask& NewTask) { UE_VLOG(this, LogGameplayTasks, Log, TEXT("AddTaskReadyForActivation %s"), *NewTask.GetName()); ensure(NewTask.RequiresPriorityOrResourceManagement() == true); TaskEvents.Add(FGameplayTaskEventData(EGameplayTaskEvent::Add, NewTask)); // trigger the actual processing only if it was the first event added to the list if (TaskEvents.Num() == 1 && CanProcessEvents()) { ProcessTaskEvents(); } }
void UGameplayTasksComponent::RemoveTaskFromPriorityQueue(UGameplayTask& Task) { const int32 RemovedTaskIndex = TaskPriorityQueue.Find(&Task); if (RemovedTaskIndex != INDEX_NONE) { TaskPriorityQueue.RemoveAt(RemovedTaskIndex, 1, /*bAllowShrinking=*/false); } else { // take a note and ignore UE_VLOG(this, LogGameplayTasks, Verbose, TEXT("RemoveTaskFromPriorityQueue for %s called, but it's not in the queue. Might have been already removed"), *Task.GetName()); } }
void UGameplayTask::OnGameplayTaskInitialized(UGameplayTask& Task) { UE_VLOG(GetGameplayTasksComponent(), LogGameplayTasks, Verbose, TEXT("%s> Child task initialized: %s"), *GetName(), *Task.GetName()); // only one child task is allowed if (ChildTask) { UE_VLOG(GetGameplayTasksComponent(), LogGameplayTasks, Verbose, TEXT(">> terminating previous child task: %s"), *ChildTask->GetName()); ChildTask->EndTask(); } ChildTask = &Task; }
void UGameplayTask::OnGameplayTaskDeactivated(UGameplayTask& Task) { // cleanup after deactivation if (&Task == ChildTask) { UE_VLOG(GetGameplayTasksComponent(), LogGameplayTasks, Verbose, TEXT("%s> Child task deactivated: %s (state: %s)"), *GetName(), *Task.GetName(), *Task.GetTaskStateName()); if (Task.IsFinished()) { ChildTask = nullptr; } } }