21#include "Kismet/GameplayStatics.h"
22#include "Kismet/KismetSystemLibrary.h"
23#include "Engine/World.h"
25#include "TimerManager.h"
27#include "ROSIntegration/Classes/ROSIntegrationGameInstance.h"
35 PrimaryActorTick.bCanEverTick =
false;
40 Super::InitGame(MapName, Options, ErrorMessage);
56 Super::EndPlay(EndPlayReason);
58 if (EndPlayReason == EEndPlayReason::Type::Quit || EndPlayReason == EEndPlayReason::Type::EndPlayInEditor)
72 if (EndPlayReason == EEndPlayReason::Type::EndPlayInEditor)
74 EditorEndPlayCleanup();
80void AAgrarsenseGameModeBase::EditorEndPlayCleanup()
86 IActorInformation::ClearTMapEditor();
103 const TMap<FString, FString> MapLaunchArgs = {
104 {
"-vindeln",
"/Game/Agrarsense/Maps/Vindeln/Vindeln" },
105 {
"-vindeln_dev",
"/Game/Agrarsense/Maps/Vindeln/Vindeln_Dev" },
106 {
"-rovaniemi",
"/Game/Agrarsense/Maps/RovaniemiForest/RovaniemiForest" },
107 {
"-rovaniemi_dev",
"/Game/Agrarsense/Maps/RovaniemiForest/RovaniemiForest_Dev" },
108 {
"-playground",
"/Game/Agrarsense/Maps/Playground" }
111 const FString CommandLine = FCommandLine::Get();
114 for (
const auto& Pair : MapLaunchArgs)
116 if (FParse::Param(*CommandLine, *Pair.Key))
119 MapName = Pair.Value;
128 GetWorld()->GetTimerManager().SetTimer(Handle, FTimerDelegate::CreateLambda([
this, MapName]
132 UGameplayStatics::OpenLevel(GetWorld(), *MapName);
147 UWorld* World = GetWorld();
153 Settings->
Setup(World);
156 UROSIntegrationGameInstance* RosInstance = Cast<UROSIntegrationGameInstance>(World->GetGameInstance());
157 bool ROSConnected = RosInstance->IsROSConnected();
187 UE_LOG(LogTemp, Error, TEXT(
"Missing LidarManager class or it already exists."));
194 if (IsValid(simulationLevelManagerActor))
207 TArray<AActor*> WeatherActors;
208 UGameplayStatics::GetAllActorsOfClass(World, AWeather::StaticClass(), WeatherActors);
209 if (!WeatherActors.IsEmpty())
211 Weather = Cast<AWeather>(WeatherActors[0]);
214 if (WeatherActors.Num() >= 2)
216 UE_LOG(LogTemp, Warning, TEXT(
"AAgrarsenseGameModeBase.cpp: Level has multiple Weather blueprints. Make sure to only use one."));
224 TArray<AActor*> InstancedRendererActors;
225 UGameplayStatics::GetAllActorsOfClass(World, AInstancedRendererManager::StaticClass(), InstancedRendererActors);
226 if (!InstancedRendererActors.IsEmpty())
239 UWorld* World = GetWorld();
245 auto developerToolsWidget = CreateWidget<UUserWidget>(World,
DeveloperTools);
246 developerToolsWidget->AddToViewport(10);
251 UE_LOG(LogTemp, Error, TEXT(
"Missing DeveloperTools class! Please open AgrarsenseGameMode in Unreal and add it."));
266 TArray<AActor*> Spectators;
267 UGameplayStatics::GetAllActorsOfClass(World, ASpectator::StaticClass(), Spectators);
268 if (!Spectators.IsEmpty())
270 Spectator = Cast<ASpectator>(Spectators[0]);
273 if (Spectators.Num() >= 2)
275 UE_LOG(LogTemp, Warning, TEXT(
"AAgrarsenseGameModeBase.cpp: Level has multiple Spectator blueprints. Make sure to only use one."));
284 TArray<AActor*> Taggers;
285 UGameplayStatics::GetAllActorsOfClass(World, ATagger::StaticClass(), Taggers);
286 for (AActor* TaggerActor : Taggers)
290 TaggerActor->Destroy();
297 if (World && GEngine && GEngine->GameViewport)
304 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
AInstancedRendererManager * InstancedRenderer
void SpawnNeededActorsInitGame()
void ParseMapChangeLaunchArgument()
UROSCommands * ROSCommands
static bool StartMessageLogged
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)