Files
UnrealEngineUWP/Engine/Source/Runtime/GameplayTasks/Private/Tasks/GameplayTask_SpawnActor.cpp
ryan durand 0f0464a30e Updating copyright for Engine Runtime.
#rnx
#rb none


#ROBOMERGE-OWNER: ryan.durand
#ROBOMERGE-AUTHOR: ryan.durand
#ROBOMERGE-SOURCE: CL 10869210 via CL 10869511 via CL 10869900
#ROBOMERGE-BOT: (v613-10869866)

[CL 10870549 by ryan durand in Main branch]
2019-12-26 14:45:42 -05:00

70 lines
1.8 KiB
C++

// Copyright Epic Games, Inc. All Rights Reserved.
#include "Tasks/GameplayTask_SpawnActor.h"
#include "EngineGlobals.h"
#include "Engine/Engine.h"
UGameplayTask_SpawnActor* UGameplayTask_SpawnActor::SpawnActor(TScriptInterface<IGameplayTaskOwnerInterface> TaskOwner, FVector SpawnLocation, FRotator SpawnRotation, TSubclassOf<AActor> Class, bool bSpawnOnlyOnAuthority)
{
if (TaskOwner.GetInterface() == nullptr)
{
return nullptr;
}
bool bCanSpawn = true;
if (bSpawnOnlyOnAuthority == true)
{
AActor* TaskOwnerActor = TaskOwner->GetGameplayTaskOwner(nullptr);
if (TaskOwnerActor)
{
bCanSpawn = (TaskOwnerActor->GetLocalRole() == ROLE_Authority);
}
else
{
// @todo add warning here
}
}
UGameplayTask_SpawnActor* MyTask = nullptr;
if (bCanSpawn)
{
MyTask = NewTask<UGameplayTask_SpawnActor>(TaskOwner);
if (MyTask)
{
MyTask->CachedSpawnLocation = SpawnLocation;
MyTask->CachedSpawnRotation = SpawnRotation;
MyTask->ClassToSpawn = Class;
}
}
return MyTask;
}
bool UGameplayTask_SpawnActor::BeginSpawningActor(UObject* WorldContextObject, AActor*& SpawnedActor)
{
UWorld* const World = GEngine->GetWorldFromContextObject(WorldContextObject, EGetWorldErrorMode::LogAndReturnNull);
if (World)
{
SpawnedActor = World->SpawnActorDeferred<AActor>(ClassToSpawn, FTransform(CachedSpawnRotation, CachedSpawnLocation), NULL, NULL, ESpawnActorCollisionHandlingMethod::AlwaysSpawn);
}
if (SpawnedActor == nullptr)
{
DidNotSpawn.Broadcast(nullptr);
return false;
}
return true;
}
void UGameplayTask_SpawnActor::FinishSpawningActor(UObject* WorldContextObject, AActor* SpawnedActor)
{
if (SpawnedActor)
{
const FTransform SpawnTransform(CachedSpawnRotation, CachedSpawnLocation);
SpawnedActor->FinishSpawning(SpawnTransform);
Success.Broadcast(SpawnedActor);
}
EndTask();
}