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

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

BIN
Content/M_IDText.uasset Normal file

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

View File

@ -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;
}

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);

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());
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;

View File

@ -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();
}
}

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;
};

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
{

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);

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);

View File

@ -2,6 +2,7 @@
#pragma once
#include "BugPlacerPawn.h"
#include "Engine/DeveloperSettingsBackedByCVars.h"
#include "UnrealzillaGlobalSettings.generated.h"

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
*/