Bug markers now correctly update immediately after being submitted and placed in the world.

This commit is contained in:
Jamie Greunbaum
2023-03-27 02:20:58 -04:00
parent 89c759894c
commit 2c29b5e052
19 changed files with 378 additions and 309 deletions
@@ -8,3 +8,20 @@
EBugStatus ABugMarkerActor::GetBugStatus() const
{
if (GetDefault<UUnrealzillaGlobalSettings>()->ResolvedStatuses.Contains(this->BugData.status))
{
return EBugStatus::Resolved;
}
else if (GetDefault<UUnrealzillaGlobalSettings>()->InProgressStatuses.Contains(this->BugData.status))
{
return EBugStatus::InProgress;
}
else if (GetDefault<UUnrealzillaGlobalSettings>()->UnresolvedStatuses.Contains(this->BugData.status))
{
return EBugStatus::Unresolved;
}
return EBugStatus::NoStatus;
}
+2 -16
View File
@@ -107,22 +107,8 @@ void ABugMarkerLoader::LoadNewBatch()
FActorSpawnParameters SpawnParams;
SpawnParams.Owner = this;
const FTransform Transform = FTransform(FRotationMatrix::MakeFromZ(UpVector).Rotator(), Location, FVector::OneVector);
ABugMarkerActor *Marker = this->GetWorld()->SpawnActorDeferred<ABugMarkerActor>(Class, Transform, this);
Marker->SetBugID(BugData.id);
Marker->SetBugSummary(BugData.summary);
if (GetDefault<UUnrealzillaGlobalSettings>()->UnresolvedStatuses.Contains(BugData.status))
{
Marker->SetBugStatus(EBugStatus::Unresolved);
}
else if (GetDefault<UUnrealzillaGlobalSettings>()->InProgressStatuses.Contains(BugData.status))
{
Marker->SetBugStatus(EBugStatus::InProgress);
}
else if (GetDefault<UUnrealzillaGlobalSettings>()->ResolvedStatuses.Contains(BugData.status))
{
Marker->SetBugStatus(EBugStatus::Resolved);
}
Marker->FinishSpawning(Transform);
ABugMarkerActor *Marker = this->GetWorld()->SpawnActor<ABugMarkerActor>(Class, Transform, SpawnParams);
Marker->SetBugData(BugData);
this->Markers.Add(Marker);
this->BugBatch.RemoveAt(0);
+31 -8
View File
@@ -6,6 +6,7 @@
#include "BugMarkerLoader.h"
#include "ExitingBugPlacementScreen.h"
#include "UnrealzillaGlobalSettings.h"
#include "UnrealzillaJSON.h"
#include "Components/MaterialBillboardComponent.h"
#include "Components/SphereComponent.h"
@@ -78,28 +79,51 @@ void ABugPlacerPawn::TraceTimerElapsed()
FCollisionQueryParams Params;
Params.bTraceComplex = false;
Params.bIgnoreTouches = false;
Params.AddIgnoredActor(this);
FHitResult TraceHit;
const FVector TraceStart = this->TraceOriginComponent->GetComponentLocation();
const FVector TraceEnd = TraceStart + (this->TraceOriginComponent->GetForwardVector() * GetDefault<UUnrealzillaGlobalSettings>()->BugPlacementTraceDistance);
const FVector TraceStart = this->GetActorLocation();
const FVector TraceEnd = TraceStart + (this->GetActorForwardVector() * GetDefault<UUnrealzillaGlobalSettings>()->BugPlacementTraceDistance);
this->bCurrentTraceHit = World->LineTraceSingleByChannel(TraceHit, TraceStart, TraceEnd, ECollisionChannel::ECC_Visibility, Params);
// Move bug marker to the current pointer position, or behind
// the camera if the pointer is not currently hitting a surface.
if (this->bCurrentTraceHit)
{
this->PlacementMarkerRoot->SetWorldLocationAndRotation(TraceHit.ImpactPoint, FRotationMatrix::MakeFromZ(TraceHit.ImpactNormal).ToQuat());
this->PlacementMarkerRoot->SetVisibility(true, true);
if (ABugMarkerActor *Marker = Cast<ABugMarkerActor>(TraceHit.GetActor()))
{
this->PlacementMarkerRoot->SetVisibility(true, false);
this->UpdateBugInformation(Marker->GetBugData());
}
else
{
this->PlacementMarkerRoot->SetVisibility(true, true);
this->UpdateBugInformation(FJSONBugData());
}
this->TraceOriginComponent->SetRelativeScale3D(FVector(1.0f, 1.0f, (TraceHit.ImpactPoint - TraceStart).Length()));
this->PlacementMarkerRoot->SetWorldLocationAndRotation(TraceHit.ImpactPoint, FRotationMatrix::MakeFromZ(TraceHit.ImpactNormal).ToQuat());
const FVector TraceOriginLocation = this->TraceOriginComponent->GetComponentLocation();
FVector FacingVector = (TraceHit.ImpactPoint - TraceOriginLocation);
FacingVector.Normalize();
const FRotator TraceOriginFacingRotation = FRotationMatrix::MakeFromX(FacingVector).Rotator();
this->TraceOriginComponent->SetWorldRotation(TraceOriginFacingRotation);
const FVector TraceOriginScale = this->TraceOriginComponent->GetRelativeScale3D();
this->TraceOriginComponent->SetRelativeScale3D(FVector(TraceOriginScale.X, TraceOriginScale.Y, (TraceHit.ImpactPoint - TraceOriginLocation).Length()));
}
else
{
this->PlacementMarkerRoot->SetRelativeLocationAndRotation(FVector::ZeroVector, FRotator::ZeroRotator);
this->PlacementMarkerRoot->SetVisibility(false, true);
this->TraceOriginComponent->SetRelativeScale3D(FVector(1.0f, 1.0f, (TraceEnd - TraceStart).Length()));
const FVector TraceOriginLocation = this->TraceOriginComponent->GetComponentLocation();
FVector FacingVector = (TraceEnd - TraceOriginLocation);
FacingVector.Normalize();
const FRotator TraceOriginFacingRotation = FRotationMatrix::MakeFromX(FacingVector).Rotator();
this->TraceOriginComponent->SetWorldRotation(TraceOriginFacingRotation);
const FVector TraceOriginScale = this->TraceOriginComponent->GetRelativeScale3D();
this->TraceOriginComponent->SetRelativeScale3D(FVector(TraceOriginScale.X, TraceOriginScale.Y, (TraceEnd - TraceStart).Length()));
}
}
}
@@ -171,9 +195,8 @@ void ABugPlacerPawn::ExitCanceled()
}
void ABugPlacerPawn::SpawnBugPlacerPawn(const UObject *WorldContextObject)
void ABugPlacerPawn::SpawnBugPlacerPawn(const UObject *WorldContextObject, TSubclassOf<ABugPlacerPawn> Class)
{
TSubclassOf<ABugPlacerPawn> Class = StaticLoadClass(ABugPlacerPawn::StaticClass(), nullptr, BUG_PLACER_PAWN_BP);
const FTransform &Transform = UGameplayStatics::GetPlayerCameraManager(WorldContextObject, 0)->GetActorTransform();
FActorSpawnParameters SpawnParams;
SpawnParams.SpawnCollisionHandlingOverride = ESpawnActorCollisionHandlingMethod::AlwaysSpawn;
@@ -9,6 +9,7 @@
#include "HttpModule.h"
#include "JsonObjectConverter.h"
#include "UnrealzillaGlobalSettings.h"
#include "UnrealzillaJSON.h"
#include "Components/CircularThrobber.h"
#include "Components/Overlay.h"
@@ -251,6 +252,68 @@ void UBugSubmissionForm::ServerPOSTResponse(FHttpRequestPtr Request, FHttpRespon
}
else
{
const FString FullURL = GetDefault<UUnrealzillaGlobalSettings>()->SubmissionServer + "/rest.cgi";
TArray<FString> StatusQueries;
StatusQueries.Add("id=" + FString::FromInt(ResponseData.id));
if (GetDefault<UUnrealzillaGlobalSettings>()->bShowUnresolvedBugs)
{
for (const FString Unresolved : GetDefault<UUnrealzillaGlobalSettings>()->UnresolvedStatuses)
{
StatusQueries.Add("status=" + Unresolved);
}
}
if (GetDefault<UUnrealzillaGlobalSettings>()->bShowInProgressBugs)
{
for (const FString InProgress : GetDefault<UUnrealzillaGlobalSettings>()->InProgressStatuses)
{
StatusQueries.Add("status=" + InProgress);
}
}
if (GetDefault<UUnrealzillaGlobalSettings>()->bShowResolvedBugs)
{
for (const FString Resolved : GetDefault<UUnrealzillaGlobalSettings>()->ResolvedStatuses)
{
StatusQueries.Add("status=" + Resolved);
}
}
StatusQueries.Add("cf_mapname=" + this->GetWorld()->GetMapName().RightChop(this->GetWorld()->StreamingLevelsPrefix.Len()));
StatusQueries.Add("api_key=" + GetDefault<UUnrealzillaGlobalSettings>()->APIKey);
const FString QueryString = FString::Join(StatusQueries, TEXT("&"));
FHttpModule &HttpModule = FHttpModule::Get();
TSharedRef<IHttpRequest, ESPMode::ThreadSafe> SeverityRequest = HttpModule.CreateRequest();
SeverityRequest->SetVerb(TEXT("GET"));
SeverityRequest->SetHeader(TEXT("Content-Type"), TEXT("application/json"));
SeverityRequest->SetURL(FullURL + "/bug" + "?" + QueryString);
SeverityRequest->OnProcessRequestComplete().BindUObject(this, &UBugSubmissionForm::ServerPOSTUpdateMarkerResponse);
SeverityRequest->ProcessRequest();
}
}
else
{
this->ServerConnectionError(Request->GetStatus());
}
}
void UBugSubmissionForm::ServerPOSTUpdateMarkerResponse(FHttpRequestPtr Request, FHttpResponsePtr Response, bool Success)
{
if (Success)
{
FJSONBugResponse ResponseData;
FString JSONResponse = Response->GetContentAsString();
FJsonObjectConverter::JsonObjectStringToUStruct(JSONResponse, &ResponseData);
if (ResponseData.error)
{
this->ShowProcessingOverlayMessage(ResponseData.message);
}
else
{
if (!ResponseData.bugs.IsEmpty())
{
this->BugMarkerActor->SetBugData(ResponseData.bugs[0]);
}
this->CloseForm();
}
}
+12 -7
View File
@@ -3,6 +3,7 @@
#pragma once
#include "CoreMinimal.h"
#include "UnrealzillaJSON.h"
#include "BugMarkerActor.generated.h"
@@ -12,6 +13,7 @@
UENUM()
enum class EBugStatus : uint8
{
NoStatus UMETA(DisplayName="No Status"),
Unresolved UMETA(DisplayName="Unresolved"),
InProgress UMETA(DisplayName="In Progress"),
Resolved UMETA(DisplayName="Resolved"),
@@ -24,15 +26,18 @@ class UNREALZILLA_API ABugMarkerActor : public AActor
GENERATED_BODY()
public:
UFUNCTION(BlueprintImplementableEvent)
void ReloadBugData();
UFUNCTION(BlueprintImplementableEvent)
void LoadBugSubmissionForm();
void SetBugID(const uint32 &ID) { this->BugID = ID; }
void SetBugSummary(const FString &Summary) { this->BugSummary = Summary; }
void SetBugStatus(const EBugStatus &Status) { this->BugStatus = Status; }
UFUNCTION(BlueprintCallable)
void SetBugData(const FJSONBugData &Data) { this->BugData = Data; this->ReloadBugData(); }
UFUNCTION(BlueprintPure)
FJSONBugData GetBugData() const { return this->BugData; }
UFUNCTION(BlueprintPure)
EBugStatus GetBugStatus() const;
private:
uint32 BugID = 0;
FString BugSummary;
EBugStatus BugStatus;
protected:
FJSONBugData BugData;
};
+1 -55
View File
@@ -4,67 +4,13 @@
#include "CoreMinimal.h"
#include "UnrealzillaJSON.h"
#include "Interfaces/IHttpRequest.h"
#include "Interfaces/IHttpResponse.h"
#include "BugMarkerLoader.generated.h"
/**
* JSON structs for bug lists
*/
USTRUCT(Blueprintable)
struct FJSONBugData
{
GENERATED_BODY()
public:
UPROPERTY()
int32 id = -1;
UPROPERTY()
FString summary;
UPROPERTY()
FString component;
UPROPERTY()
FString cf_mapname;
UPROPERTY()
FString cf_location;
UPROPERTY()
FString platform;
UPROPERTY()
FString op_sys;
UPROPERTY()
bool is_open = true;
UPROPERTY()
FString severity;
UPROPERTY()
FString status;
UPROPERTY()
FString resolution;
UPROPERTY()
int32 dupe_of = -1;
};
USTRUCT(Blueprintable)
struct FJSONBugResponse
{
GENERATED_BODY()
public:
UPROPERTY(BlueprintReadOnly)
TArray<FJSONBugData> bugs;
UPROPERTY(BlueprintReadOnly)
bool error = false;
UPROPERTY(BlueprintReadOnly)
int32 code = -1;
UPROPERTY(BlueprintReadOnly)
FString message;
UPROPERTY(BlueprintReadOnly)
FString documentation;
};
/**
* END JSON structs for bug lists
*/
UCLASS()
class UNREALZILLA_API ABugMarkerLoader : public AActor
{
+5 -4
View File
@@ -3,6 +3,7 @@
#pragma once
#include "CoreMinimal.h"
#include "UnrealzillaJSON.h"
#include "GameFramework/Pawn.h"
#include "BugPlacerPawn.generated.h"
@@ -22,16 +23,16 @@ public:
UFUNCTION(BlueprintCallable)
void Activate();
UFUNCTION(BlueprintCallable)
void Deactivate();
UFUNCTION(BlueprintCallable, meta=(WorldContext="WorldContextObject"))
static void SpawnBugPlacerPawn(const UObject *WorldContextObject);
UFUNCTION(BlueprintImplementableEvent)
void UpdateBugInformation(const FJSONBugData &BugData);
UFUNCTION(BlueprintCallable, meta=(WorldContext="WorldContextObject"))
static void SpawnBugPlacerPawn(const UObject *WorldContextObject, TSubclassOf<ABugPlacerPawn> Class);
UFUNCTION(BlueprintCallable, meta=(WorldContext="WorldContextObject"))
static void ShowBugMarkersInLevel(const UObject *WorldContextObject);
UFUNCTION(BlueprintCallable, meta=(WorldContext="WorldContextObject"))
static void HideBugMarkersInLevel(const UObject *WorldContextObject);
+2 -219
View File
@@ -6,231 +6,13 @@
#include "BugFormButton.h"
#include "CommonActivatableWidget.h"
#include "UnrealzillaJSON.h"
#include "Interfaces/IHttpRequest.h"
#include "Interfaces/IHttpResponse.h"
#include "BugSubmissionForm.generated.h"
/**
* JSON structs for POST
*/
USTRUCT()
struct FJSONPostBug
{
GENERATED_BODY()
public:
UPROPERTY()
FString product;
UPROPERTY()
FString version;
UPROPERTY()
FString platform;
UPROPERTY()
FString op_sys;
UPROPERTY()
FString component;
UPROPERTY()
FString severity;
UPROPERTY()
FString cf_mapname;
UPROPERTY()
FString cf_location;
UPROPERTY()
FString summary;
UPROPERTY()
FString description;
UPROPERTY()
FString status;
};
USTRUCT(Blueprintable)
struct FJSONPostResponse
{
GENERATED_BODY()
public:
UPROPERTY(BlueprintReadOnly)
int32 id = -1;
UPROPERTY(BlueprintReadOnly)
bool error = false;
UPROPERTY(BlueprintReadOnly)
int32 code = -1;
UPROPERTY(BlueprintReadOnly)
FString message;
UPROPERTY(BlueprintReadOnly)
FString documentation;
};
/**
* END JSON structs for POST
*/
///**
// * JSON structs for bug lists
// */
//USTRUCT(Blueprintable)
//struct FJSONBugData
//{
// GENERATED_BODY()
//public:
// UPROPERTY()
// FString component;
// UPROPERTY()
// FString cf_mapname;
// UPROPERTY()
// FString cf_location;
//};
//
//USTRUCT(Blueprintable)
//struct FJSONBugResponse
//{
// GENERATED_BODY()
//public:
// UPROPERTY(BlueprintReadOnly)
// TArray<FJSONBugData> bugs;
// UPROPERTY(BlueprintReadOnly)
// bool error = false;
// UPROPERTY(BlueprintReadOnly)
// int32 code = -1;
// UPROPERTY(BlueprintReadOnly)
// FString message;
// UPROPERTY(BlueprintReadOnly)
// FString documentation;
//};
///**
// * END JSON structs for bug lists
// */
/**
* JSON structs for product data
*/
USTRUCT(Blueprintable)
struct FJSONComponentData
{
GENERATED_BODY()
public:
UPROPERTY()
int32 id = -1;
UPROPERTY()
bool is_active = false;
UPROPERTY()
FString name;
UPROPERTY()
FString description;
UPROPERTY()
FString default_assigned_to;
UPROPERTY()
int32 sort_key = -1;
};
USTRUCT(Blueprintable)
struct FJSONVersionData
{
GENERATED_BODY()
public:
UPROPERTY()
int32 id = -1;
UPROPERTY()
bool is_active = false;
UPROPERTY()
FString name;
UPROPERTY()
int32 sort_key = -1;
};
USTRUCT(Blueprintable)
struct FJSONProductData
{
GENERATED_BODY()
public:
UPROPERTY(BlueprintReadOnly)
FString name;
UPROPERTY(BlueprintReadOnly)
FString classification;
UPROPERTY(BlueprintReadOnly)
FString description;
UPROPERTY(BlueprintReadOnly)
TArray<FJSONComponentData> components;
UPROPERTY(BlueprintReadOnly)
TArray<FJSONVersionData> versions;
};
USTRUCT(Blueprintable)
struct FJSONProductResponse
{
GENERATED_BODY()
public:
UPROPERTY(BlueprintReadOnly)
TArray<FJSONProductData> products;
UPROPERTY(BlueprintReadOnly)
bool error = false;
UPROPERTY(BlueprintReadOnly)
int32 code = -1;
UPROPERTY(BlueprintReadOnly)
FString message;
UPROPERTY(BlueprintReadOnly)
FString documentation;
};
/**
* END JSON structs for product data
*/
/**
* JSON structs for product data
*/
USTRUCT(Blueprintable)
struct FJSONFieldValueData
{
GENERATED_BODY()
public:
UPROPERTY()
FString name;
UPROPERTY()
int32 sort_key = -1;
};
USTRUCT(Blueprintable)
struct FJSONFieldData
{
GENERATED_BODY()
public:
UPROPERTY(BlueprintReadOnly)
int32 id = -1;
UPROPERTY(BlueprintReadOnly)
FString name;
UPROPERTY(BlueprintReadOnly)
FString display_name;
UPROPERTY(BlueprintReadOnly)
bool is_mandatory = false;
UPROPERTY(BlueprintReadOnly)
TArray<FJSONFieldValueData> values;
};
USTRUCT(Blueprintable)
struct FJSONFieldResponse
{
GENERATED_BODY()
public:
UPROPERTY(BlueprintReadOnly)
TArray<FJSONFieldData> fields;
UPROPERTY(BlueprintReadOnly)
bool error = false;
UPROPERTY(BlueprintReadOnly)
int32 code = -1;
UPROPERTY(BlueprintReadOnly)
FString message;
UPROPERTY(BlueprintReadOnly)
FString documentation;
};
/**
* END JSON structs for product data
*/
UCLASS()
class UNREALZILLA_API UBugSubmissionForm : public UCommonActivatableWidget
{
@@ -298,6 +80,7 @@ protected:
private:
void ServerPOSTResponse(FHttpRequestPtr Request, FHttpResponsePtr Response, bool Success);
void ServerPOSTUpdateMarkerResponse(FHttpRequestPtr Request, FHttpResponsePtr Response, bool Success);
void ServerProductInfoResponse(FHttpRequestPtr Request, FHttpResponsePtr Response, bool Success);
void ServerSeverityInfoResponse(FHttpRequestPtr Request, FHttpResponsePtr Response, bool Success);
void ServerPlatformInfoResponse(FHttpRequestPtr Request, FHttpResponsePtr Response, bool Success);
@@ -2,6 +2,7 @@
#pragma once
#include "BugPlacerPawn.h"
#include "Engine/DeveloperSettingsBackedByCVars.h"
#include "UnrealzillaGlobalSettings.generated.h"
+244
View File
@@ -0,0 +1,244 @@
// ©2022 Batty Bovine Productions, LLC. All Rights Reserved.
#pragma once
#include "CoreMinimal.h"
#include "UnrealzillaJSON.generated.h"
/**
* JSON structs for POST
*/
USTRUCT()
struct FJSONPostBug
{
GENERATED_BODY()
public:
UPROPERTY()
FString product;
UPROPERTY()
FString version;
UPROPERTY()
FString platform;
UPROPERTY()
FString op_sys;
UPROPERTY()
FString component;
UPROPERTY()
FString severity;
UPROPERTY()
FString cf_mapname;
UPROPERTY()
FString cf_location;
UPROPERTY()
FString summary;
UPROPERTY()
FString description;
UPROPERTY()
FString status;
};
USTRUCT(Blueprintable)
struct FJSONPostResponse
{
GENERATED_BODY()
public:
UPROPERTY(BlueprintReadOnly)
int32 id = -1;
UPROPERTY(BlueprintReadOnly)
bool error = false;
UPROPERTY(BlueprintReadOnly)
int32 code = -1;
UPROPERTY(BlueprintReadOnly)
FString message;
UPROPERTY(BlueprintReadOnly)
FString documentation;
};
/**
* END JSON structs for POST
*/
/**
* JSON structs for product data
*/
USTRUCT(Blueprintable)
struct FJSONComponentData
{
GENERATED_BODY()
public:
UPROPERTY()
int32 id = -1;
UPROPERTY()
bool is_active = false;
UPROPERTY()
FString name;
UPROPERTY()
FString description;
UPROPERTY()
FString default_assigned_to;
UPROPERTY()
int32 sort_key = -1;
};
USTRUCT(Blueprintable)
struct FJSONVersionData
{
GENERATED_BODY()
public:
UPROPERTY()
int32 id = -1;
UPROPERTY()
bool is_active = false;
UPROPERTY()
FString name;
UPROPERTY()
int32 sort_key = -1;
};
USTRUCT(Blueprintable)
struct FJSONProductData
{
GENERATED_BODY()
public:
UPROPERTY(BlueprintReadOnly)
FString name;
UPROPERTY(BlueprintReadOnly)
FString classification;
UPROPERTY(BlueprintReadOnly)
FString description;
UPROPERTY(BlueprintReadOnly)
TArray<FJSONComponentData> components;
UPROPERTY(BlueprintReadOnly)
TArray<FJSONVersionData> versions;
};
USTRUCT(Blueprintable)
struct FJSONProductResponse
{
GENERATED_BODY()
public:
UPROPERTY(BlueprintReadOnly)
TArray<FJSONProductData> products;
UPROPERTY(BlueprintReadOnly)
bool error = false;
UPROPERTY(BlueprintReadOnly)
int32 code = -1;
UPROPERTY(BlueprintReadOnly)
FString message;
UPROPERTY(BlueprintReadOnly)
FString documentation;
};
/**
* END JSON structs for product data
*/
/**
* JSON structs for product data
*/
USTRUCT(Blueprintable)
struct FJSONFieldValueData
{
GENERATED_BODY()
public:
UPROPERTY()
FString name;
UPROPERTY()
int32 sort_key = -1;
};
USTRUCT(Blueprintable)
struct FJSONFieldData
{
GENERATED_BODY()
public:
UPROPERTY(BlueprintReadOnly)
int32 id = -1;
UPROPERTY(BlueprintReadOnly)
FString name;
UPROPERTY(BlueprintReadOnly)
FString display_name;
UPROPERTY(BlueprintReadOnly)
bool is_mandatory = false;
UPROPERTY(BlueprintReadOnly)
TArray<FJSONFieldValueData> values;
};
USTRUCT(Blueprintable)
struct FJSONFieldResponse
{
GENERATED_BODY()
public:
UPROPERTY(BlueprintReadOnly)
TArray<FJSONFieldData> fields;
UPROPERTY(BlueprintReadOnly)
bool error = false;
UPROPERTY(BlueprintReadOnly)
int32 code = -1;
UPROPERTY(BlueprintReadOnly)
FString message;
UPROPERTY(BlueprintReadOnly)
FString documentation;
};
/**
* END JSON structs for product data
*/
/**
* JSON structs for bug lists
*/
USTRUCT(Blueprintable)
struct FJSONBugData
{
GENERATED_BODY()
public:
UPROPERTY(BlueprintReadOnly)
int32 id = -1;
UPROPERTY(BlueprintReadOnly)
FString summary;
UPROPERTY(BlueprintReadOnly)
FString component;
UPROPERTY(BlueprintReadOnly)
FString cf_mapname;
UPROPERTY(BlueprintReadOnly)
FString cf_location;
UPROPERTY(BlueprintReadOnly)
FString platform;
UPROPERTY(BlueprintReadOnly)
FString op_sys;
UPROPERTY(BlueprintReadOnly)
bool is_open = true;
UPROPERTY(BlueprintReadOnly)
FString severity;
UPROPERTY(BlueprintReadOnly)
FString status;
UPROPERTY(BlueprintReadOnly)
FString resolution;
UPROPERTY(BlueprintReadOnly)
int32 dupe_of = -1;
};
USTRUCT(Blueprintable)
struct FJSONBugResponse
{
GENERATED_BODY()
public:
UPROPERTY(BlueprintReadOnly)
TArray<FJSONBugData> bugs;
UPROPERTY(BlueprintReadOnly)
bool error = false;
UPROPERTY(BlueprintReadOnly)
int32 code = -1;
UPROPERTY(BlueprintReadOnly)
FString message;
UPROPERTY(BlueprintReadOnly)
FString documentation;
};
/**
* END JSON structs for bug lists
*/