21#include "Kismet/GameplayStatics.h"
22#include "Kismet/KismetSystemLibrary.h"
23#include "Engine/World.h"
26#include "ROSIntegration/Classes/ROSIntegrationGameInstance.h"
34 PrimaryActorTick.bCanEverTick =
false;
39 Super::InitGame(MapName, Options, ErrorMessage);
55 Super::EndPlay(EndPlayReason);
57 if (EndPlayReason == EEndPlayReason::Type::Quit || EndPlayReason == EEndPlayReason::Type::EndPlayInEditor)
71 if (EndPlayReason == EEndPlayReason::Type::EndPlayInEditor)
73 EditorEndPlayCleanup();
79void AAgrarsenseGameModeBase::EditorEndPlayCleanup()
85 IActorInformation::ClearTMapEditor();
101 if (FParse::Param(FCommandLine::Get(), TEXT(
"-vindeln")) && !
MapChanged)
103 LevelName =
"/Game/Agrarsense/Maps/Vindeln/Vindeln";
105 else if (FParse::Param(FCommandLine::Get(), TEXT(
"-rovaniemi")) && !
MapChanged)
107 LevelName =
"/Game/Agrarsense/Maps/RovaniemiForest/RovaniemiForest";
109 else if (FParse::Param(FCommandLine::Get(), TEXT(
"-playground")) && !
MapChanged)
111 LevelName =
"/Game/Agrarsense/Maps/Playground";
114 if (!LevelName.IsEmpty())
117 UGameplayStatics::OpenLevel(GetWorld(), *LevelName);
130 UWorld* World = GetWorld();
136 Settings->
Setup(World);
139 UROSIntegrationGameInstance* RosInstance = Cast<UROSIntegrationGameInstance>(World->GetGameInstance());
140 bool ROSConnected = RosInstance->IsROSConnected();
170 UE_LOG(LogTemp, Error, TEXT(
"Missing LidarManager class or it already exists."));
177 if (IsValid(simulationLevelManagerActor))
190 TArray<AActor*> WeatherActors;
191 UGameplayStatics::GetAllActorsOfClass(World, AWeather::StaticClass(), WeatherActors);
192 if (!WeatherActors.IsEmpty())
194 Weather = Cast<AWeather>(WeatherActors[0]);
197 if (WeatherActors.Num() >= 2)
199 UE_LOG(LogTemp, Warning, TEXT(
"AAgrarsenseGameModeBase.cpp: Level has multiple Weather blueprints. Make sure to only use one."));
207 TArray<AActor*> InstancedRendererActors;
208 UGameplayStatics::GetAllActorsOfClass(World, AInstancedRenderer::StaticClass(), InstancedRendererActors);
209 if (!InstancedRendererActors.IsEmpty())
222 UWorld* World = GetWorld();
228 auto developerToolsWidget = CreateWidget<UUserWidget>(World,
DeveloperTools);
229 developerToolsWidget->AddToViewport(10);
234 UE_LOG(LogTemp, Error, TEXT(
"Missing DeveloperTools class! Please open AgrarsenseGameMode in Unreal and add it."));
249 TArray<AActor*> Spectators;
250 UGameplayStatics::GetAllActorsOfClass(World, ASpectator::StaticClass(), Spectators);
251 if (!Spectators.IsEmpty())
253 Spectator = Cast<ASpectator>(Spectators[0]);
256 if (Spectators.Num() >= 2)
258 UE_LOG(LogTemp, Warning, TEXT(
"AAgrarsenseGameModeBase.cpp: Level has multiple Spectator blueprints. Make sure to only use one."));
267 TArray<AActor*> Taggers;
268 UGameplayStatics::GetAllActorsOfClass(World, ATagger::StaticClass(), Taggers);
269 for (AActor* TaggerActor : Taggers)
273 TaggerActor->Destroy();
280 if (World && GEngine && GEngine->GameViewport)
287 GEngine->GameViewport->AddViewportWidgetContent(OverlayWidget.ToSharedRef());
AAgrarsenseGameModeBase(const FObjectInitializer &ObjectInitializer)
void SpawnNeededActorsBeginPlay()
ALidarManager * LidarManager
TSubclassOf< ASimulationLevelManager > SimulationLevelManagerClass
void BeginPlay() override
void EndPlay(const EEndPlayReason::Type EndPlayReason) override
static bool AttemptToLaunchROSBridge
ASimulationLevelManager * SimulationLevelManager
void SpawnNeededActorsInitGame()
void ParseMapChangeLaunchArgument()
UROSCommands * ROSCommands
static bool StartMessageLogged
AInstancedRenderer * InstancedRenderer
void InitGame(const FString &MapName, const FString &Options, FString &ErrorMessage) override
TSubclassOf< UUserWidget > DeveloperTools
TSubclassOf< ALidarManager > LidarManagerClass
static void Log(const FString &Message, bool LogToTextFile=true, bool LogToROS=true)
static FString DataPathForThisRun
void Setup(UWorld *World)
static UAgrarsenseSettings * GetAgrarsenseSettings()
void Setup(bool RosIsConnected)