diff --git a/EndlessVendetta/Content/BP_Telemetry.uasset b/EndlessVendetta/Content/BP_Telemetry.uasset new file mode 100644 index 00000000..efc6e5c2 --- /dev/null +++ b/EndlessVendetta/Content/BP_Telemetry.uasset @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:39a587c7f8452e17e2dd4dfccdcc3a0a7a81f2388d937de51f388fbfc53cbd30 +size 19076 diff --git a/EndlessVendetta/Content/FirstPerson/GunMechanicWorld.uasset b/EndlessVendetta/Content/FirstPerson/GunMechanicWorld.uasset index 921b01db..5f3a461d 100644 --- a/EndlessVendetta/Content/FirstPerson/GunMechanicWorld.uasset +++ b/EndlessVendetta/Content/FirstPerson/GunMechanicWorld.uasset @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:f01d66661ebe4dc7038e9105e8c156e3186fdaeafea8e59cfbcbc7dde0741029 -size 19619 +oid sha256:d6148c27e76119507665e2b58c6032c998ffa701c31a41b362657aae54b7bb7f +size 19805 diff --git a/EndlessVendetta/Content/Levels/NewMiamiTemp.umap b/EndlessVendetta/Content/Levels/NewMiamiTemp.umap index 3b8d0ca0..d389e5d4 100644 --- a/EndlessVendetta/Content/Levels/NewMiamiTemp.umap +++ b/EndlessVendetta/Content/Levels/NewMiamiTemp.umap @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:3006f6fb9769c48880863300d73a5a8b6fff1ea6b8e64ca2d115c3a66e33735f -size 105819 +oid sha256:e9b04249156c82a982a6709531a4d3d339a1ddbdbad27f8d1192cd2588a3ff63 +size 119033 diff --git a/EndlessVendetta/Content/Levels/TrainingFacility.umap b/EndlessVendetta/Content/Levels/TrainingFacility.umap index 8a7ef9a0..80da3632 100644 --- a/EndlessVendetta/Content/Levels/TrainingFacility.umap +++ b/EndlessVendetta/Content/Levels/TrainingFacility.umap @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:9570ebbe70165da7d1c1cf54047bdb8b6e76905568015ff38ec3eeb5d283b66b -size 652471 +oid sha256:3d2e06d8fefe6182b8454bd1ef944882ea40c6e77bf74fe0ae999cb0b6c023af +size 652470 diff --git a/EndlessVendetta/Source/EndlessVendetta/AI/AICharacter.cpp b/EndlessVendetta/Source/EndlessVendetta/AI/AICharacter.cpp index 6a2debfc..8c91d7f5 100644 --- a/EndlessVendetta/Source/EndlessVendetta/AI/AICharacter.cpp +++ b/EndlessVendetta/Source/EndlessVendetta/AI/AICharacter.cpp @@ -3,14 +3,13 @@ #include "AICharacter.h" -#include "AI_EnemyController.h" #include "Components/CapsuleComponent.h" #include "Engine/DamageEvents.h" #include "GameFramework/CharacterMovementComponent.h" #include "Perception/AIPerceptionStimuliSourceComponent.h" #include "Perception/AISense_Sight.h" #include "BehaviorTree/BlackboardComponent.h" -#include "Blueprint/AIBlueprintHelperLibrary.h" +#include "../Telemetry.h" // Sets default values @@ -100,4 +99,5 @@ void AAICharacter::OnDeath() } SetLifeSpan(30.0f); + Cast(GetWorld()->GetGameState())->SendEvent("kill", ""); } diff --git a/EndlessVendetta/Source/EndlessVendetta/BountySystem/CheckpointClass.h b/EndlessVendetta/Source/EndlessVendetta/BountySystem/CheckpointClass.h index 2797e996..09fe069e 100644 --- a/EndlessVendetta/Source/EndlessVendetta/BountySystem/CheckpointClass.h +++ b/EndlessVendetta/Source/EndlessVendetta/BountySystem/CheckpointClass.h @@ -5,6 +5,7 @@ #include "CoreMinimal.h" #include "WaypointActor.h" #include "EndlessVendetta/EndlessVendettaCharacter.h" +#include "EndlessVendetta/Telemetry.h" #include "GameFramework/Actor.h" #include "CheckpointClass.generated.h" @@ -32,11 +33,11 @@ class ENDLESSVENDETTA_API ACheckpointClass : public AActor AWaypointActor* WaypointActor; // ---------------------------------------- protected: - UFUNCTION(BlueprintCallable, Category = "Checkpoint") void BroadcastCompletion() { CompletedCheckpoint.Broadcast(); + Cast(GetWorld()->GetGameState())->SendEvent("Check", CheckpointTip); } UFUNCTION(BlueprintCallable) @@ -45,7 +46,7 @@ protected: virtual void BeginPlay() override; virtual void Destroyed() override; - + public: FCompletedCheckpoint CompletedCheckpoint; @@ -55,37 +56,39 @@ public: void SpawnWaypoint(); UFUNCTION(BlueprintImplementableEvent) - void CheckpointActivated(); + void CheckpointActivated(); // ------ Getters for CP Properties ------ FString GetCheckpointDesc() { return CheckpointDescription; } + FString GetCheckpointTip() { return CheckpointTip; } + FVector GetWaypointLoc() { return WaypointLoc; } + UTexture2D* GetWaypointIcon() { return WaypointIcon; } + FTransform GetCheckpointSpawnTransform() { return CheckpointSpawnTransform; } + // --------------------------------------- - + // Sets default values for this actor's properties ACheckpointClass(); - + // Called every frame - virtual void Tick(float DeltaTime) override; - - - + virtual void Tick(float DeltaTime) override; }; diff --git a/EndlessVendetta/Source/EndlessVendetta/EndlessVendetta.Build.cs b/EndlessVendetta/Source/EndlessVendetta/EndlessVendetta.Build.cs index 3149aa96..619c70e9 100644 --- a/EndlessVendetta/Source/EndlessVendetta/EndlessVendetta.Build.cs +++ b/EndlessVendetta/Source/EndlessVendetta/EndlessVendetta.Build.cs @@ -11,7 +11,8 @@ public class EndlessVendetta : ModuleRules PublicDependencyModuleNames.AddRange(new string[] { "Core", "CoreUObject", "Engine", "InputCore", "HeadMountedDisplay", "EnhancedInput", "AIModule", - "GameplayTasks", "NavigationSystem", "UMG", "Slate", "SlateCore", "Niagara", "NiagaraCore", "NiagaraShader" + "GameplayTasks", "NavigationSystem", "UMG", "Slate", "SlateCore", "Niagara", "NiagaraCore", "NiagaraShader", + "HTTP", "Json", "JsonUtilities" }); } } \ No newline at end of file diff --git a/EndlessVendetta/Source/EndlessVendetta/EndlessVendettaCharacter.cpp b/EndlessVendetta/Source/EndlessVendetta/EndlessVendettaCharacter.cpp index e0d1a789..a2dcae5d 100644 --- a/EndlessVendetta/Source/EndlessVendetta/EndlessVendettaCharacter.cpp +++ b/EndlessVendetta/Source/EndlessVendetta/EndlessVendettaCharacter.cpp @@ -7,6 +7,7 @@ #include "EnhancedInputComponent.h" #include "EnhancedInputSubsystems.h" #include "InteractionInterface.h" +#include "Telemetry.h" #include "AI/EnemyCharacter.h" #include "Engine/DamageEvents.h" #include "GameFramework/CharacterMovementComponent.h" @@ -292,6 +293,7 @@ void AEndlessVendettaCharacter::EquipPrimary() PrimaryWeapon = nullptr; bHasRifle = false; GLog->Log("Primary Weapon Put Away"); + Cast(GetWorld()->GetGameState())->SendEvent("DeEquip", "Pri"); return; } if(bIsWeaponPickedUp) @@ -318,6 +320,7 @@ void AEndlessVendettaCharacter::EquipPrimary() // bIsPrimaryWeaponCreated = true; // } if (!IsValid(PrimaryWeaponActor)) return; + Cast(GetWorld()->GetGameState())->SendEvent("Equip", "Pri"); PrimaryWeaponActor->AttachToComponent(Mesh1P, AttachmentRules, FName("GripPoint")); PrimaryWeapon = Cast(PrimaryWeaponActor); PrimaryWeapon->SetActorHiddenInGame(false); diff --git a/EndlessVendetta/Source/EndlessVendetta/Telemetry.cpp b/EndlessVendetta/Source/EndlessVendetta/Telemetry.cpp new file mode 100644 index 00000000..c5be1f28 --- /dev/null +++ b/EndlessVendetta/Source/EndlessVendetta/Telemetry.cpp @@ -0,0 +1,29 @@ +// Fill out your copyright notice in the Description page of Project Settings. + + +#include "Telemetry.h" +#include "Misc/Guid.h" + +void ATelemetry::SendEvent(FString EventKey, FString EventData) +{ + const FString EventID = FGuid::NewGuid().ToString(); + const FString EventTime = FDateTime::Now().ToString(); + const auto Request = FHttpModule::Get().CreateRequest(); + Request->SetURL(TelemetryURLEvents); + Request->SetVerb("POST"); + Request->SetHeader("Content-Type", "application/json"); + Request->SetHeader("Accept", "application/json"); + Request->SetContentAsString( "{\"SessionID\":\"" + SessionID + "\",\"PlayerGUID\":\"" + PlayerGUID + "\",\"EventID\":\"" + EventID + "\",\"Timestamp\":\"" + EventTime + "\",\"EventKey\":\"" + EventKey + "\",\"EventData\":\"" + EventData + "\"}" ); + Request->OnProcessRequestComplete().BindLambda([](FHttpRequestPtr request, FHttpResponsePtr response, bool success) + { + GLog->Log("Telemetry Event Response: " + response->GetContentAsString()); + }); + Request->ProcessRequest(); +} + +void ATelemetry::BeginPlay() +{ + Super::BeginPlay(); + SessionID = FGuid::NewGuid().ToString().Left(5).ToUpper(); + SendEvent("start", ""); +} diff --git a/EndlessVendetta/Source/EndlessVendetta/Telemetry.h b/EndlessVendetta/Source/EndlessVendetta/Telemetry.h new file mode 100644 index 00000000..15cbdc69 --- /dev/null +++ b/EndlessVendetta/Source/EndlessVendetta/Telemetry.h @@ -0,0 +1,33 @@ +// Fill out your copyright notice in the Description page of Project Settings. + +#pragma once + +#include "CoreMinimal.h" +#include "GameFramework/GameState.h" +#include "Http.h" +#include "Telemetry.generated.h" + +/** + * + */ +UCLASS() +class ENDLESSVENDETTA_API ATelemetry : public AGameState +{ + GENERATED_BODY() + +public: + UPROPERTY(EditDefaultsOnly, BlueprintReadOnly, Category = "Telemetry") + FString TelemetryURLEvents = "https://ev.api.philipwhite.dev/api/event"; + UPROPERTY(EditDefaultsOnly, BlueprintReadOnly, Category = "Telemetry") + FString TelemetryURLUsers = "https://ev.api.philipwhite.dev/api/user"; + UPROPERTY(EditDefaultsOnly, BlueprintReadOnly, Category = "Telemetry") + FString SessionID = "AAAAA"; + UPROPERTY(EditDefaultsOnly, BlueprintReadOnly, Category = "Telemetry") + FString PlayerGUID = "aaaaaaaa-bbbb-cccc-dddd-eeeeeeeeeeee"; + + UFUNCTION(BlueprintCallable, Category = "Telemetry") + void SendEvent(FString EventKey, FString EventData); + +protected: + virtual void BeginPlay() override; +}; diff --git a/EndlessVendetta/Source/EndlessVendetta/WeaponSystem/BaseWeaponClass.cpp b/EndlessVendetta/Source/EndlessVendetta/WeaponSystem/BaseWeaponClass.cpp index deb98237..8199182c 100644 --- a/EndlessVendetta/Source/EndlessVendetta/WeaponSystem/BaseWeaponClass.cpp +++ b/EndlessVendetta/Source/EndlessVendetta/WeaponSystem/BaseWeaponClass.cpp @@ -7,6 +7,7 @@ #include "EndlessVendetta/EndlessVendettaCharacter.h" #include "Kismet/KismetMathLibrary.h" #include "Components/CapsuleComponent.h" +#include "EndlessVendetta/Telemetry.h" #include "Kismet/GameplayStatics.h" #include "Engine/DamageEvents.h" #include "EndlessVendetta/AI/EnemyCharacter.h" @@ -242,6 +243,7 @@ void ABaseWeaponClass::Interact() { if(!IsValid(this)) return; endlessVendettaChar->WeaponSwitcher(this); + Cast(GetWorld()->GetGameState())->SendEvent("pickup", ""); } void ABaseWeaponClass::InteractPrompt()