From d705e610709550ef01a0d3723f44857d056f2807 Mon Sep 17 00:00:00 2001 From: Rafal Swierczek Date: Wed, 1 Nov 2023 21:18:18 +0000 Subject: [PATCH] Implemented Gadget Switching Workbench --- .../Checkpoints/CP_ParkourTutorial.uasset | 4 +-- .../GadgetTutorial/BP_GadgetTutorial.uasset | 4 +-- .../GadgetTutorial/BP_Recon.uasset | 3 ++ .../GadgetTutorial/BP_ReconWorkbench.uasset | 3 ++ .../Content/Gadgets/GM_GadgetManager.uasset | 4 +-- .../Content/Levels/TrainingFacility.umap | 4 +-- .../HDRI/HDRI_Epic_Courtyard_Daylight.uasset | 4 +-- .../Props/MaterialSphere.uasset | 4 +-- .../EndlessVendettaCharacter.cpp | 32 ++++++++++++++----- .../EndlessVendettaCharacter.h | 2 ++ .../EndlessVendetta/GadgetSystem/GadgetBase.h | 10 ++++++ .../GadgetSystem/GadgetManager.cpp | 28 +++++++++------- .../GadgetSystem/GadgetManager.h | 26 ++++++++++++++- .../GadgetTutorial/GadgetTutorialStation.cpp | 9 ++++-- .../GadgetTutorial/GadgetTutorialStation.h | 3 ++ 15 files changed, 105 insertions(+), 35 deletions(-) create mode 100644 EndlessVendetta/Content/BountySystem/TutorialFacility/Checkpoints/GadgetTutorial/BP_Recon.uasset create mode 100644 EndlessVendetta/Content/BountySystem/TutorialFacility/Checkpoints/GadgetTutorial/BP_ReconWorkbench.uasset diff --git a/EndlessVendetta/Content/BountySystem/TutorialFacility/Checkpoints/CP_ParkourTutorial.uasset b/EndlessVendetta/Content/BountySystem/TutorialFacility/Checkpoints/CP_ParkourTutorial.uasset index e90385ac..5d9c77b0 100644 --- a/EndlessVendetta/Content/BountySystem/TutorialFacility/Checkpoints/CP_ParkourTutorial.uasset +++ b/EndlessVendetta/Content/BountySystem/TutorialFacility/Checkpoints/CP_ParkourTutorial.uasset @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:83c9bd092e97c3b7a89a9a920bb278d742d93d13a439c3a8afaed1fbc62287de -size 38434 +oid sha256:760080e3e99953e11230e2d0611fe20c01daa1e6ea7ef3dd4c5923beb8fbc6a9 +size 38487 diff --git a/EndlessVendetta/Content/BountySystem/TutorialFacility/Checkpoints/GadgetTutorial/BP_GadgetTutorial.uasset b/EndlessVendetta/Content/BountySystem/TutorialFacility/Checkpoints/GadgetTutorial/BP_GadgetTutorial.uasset index 64604dec..35556abe 100644 --- a/EndlessVendetta/Content/BountySystem/TutorialFacility/Checkpoints/GadgetTutorial/BP_GadgetTutorial.uasset +++ b/EndlessVendetta/Content/BountySystem/TutorialFacility/Checkpoints/GadgetTutorial/BP_GadgetTutorial.uasset @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:99736a10befa7b16850c07090ed7d29a0c63d5d4181cacdf73f855190c61c1dd -size 16928 +oid sha256:0c9c1c5174be17340a5c1af17f65ebad2f56450fb8194dd1aee554d703ac68ed +size 2754 diff --git a/EndlessVendetta/Content/BountySystem/TutorialFacility/Checkpoints/GadgetTutorial/BP_Recon.uasset b/EndlessVendetta/Content/BountySystem/TutorialFacility/Checkpoints/GadgetTutorial/BP_Recon.uasset new file mode 100644 index 00000000..6f1b328e --- /dev/null +++ b/EndlessVendetta/Content/BountySystem/TutorialFacility/Checkpoints/GadgetTutorial/BP_Recon.uasset @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:86a649d86566076f0904ef7792d413399eedea9e074a4d60603396c5ea3734fb +size 2763 diff --git a/EndlessVendetta/Content/BountySystem/TutorialFacility/Checkpoints/GadgetTutorial/BP_ReconWorkbench.uasset b/EndlessVendetta/Content/BountySystem/TutorialFacility/Checkpoints/GadgetTutorial/BP_ReconWorkbench.uasset new file mode 100644 index 00000000..7efaf4aa --- /dev/null +++ b/EndlessVendetta/Content/BountySystem/TutorialFacility/Checkpoints/GadgetTutorial/BP_ReconWorkbench.uasset @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:aca420300ee672cc466a648e1630d1fe57242f3f601751620e4d4336652b2a3f +size 23371 diff --git a/EndlessVendetta/Content/Gadgets/GM_GadgetManager.uasset b/EndlessVendetta/Content/Gadgets/GM_GadgetManager.uasset index 53e55580..3a71ffb5 100644 --- a/EndlessVendetta/Content/Gadgets/GM_GadgetManager.uasset +++ b/EndlessVendetta/Content/Gadgets/GM_GadgetManager.uasset @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:f89312e222f9d5b588d790390162f6293435c25439f77609ac1ecb532f103499 -size 22674 +oid sha256:e05b0025b98476924070ad8a2492e16ce32fb434b63e82b53a509c63f6e0962a +size 22228 diff --git a/EndlessVendetta/Content/Levels/TrainingFacility.umap b/EndlessVendetta/Content/Levels/TrainingFacility.umap index 5e05a85b..54c7d2b2 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:46c1dbc7d35d69ea66831390e74563f3dc3dfbdcdc2c09fa0887195d6c231104 -size 460293 +oid sha256:5865096b570bd55d2eb3055389ccd4c7f9db407bb3f830746a5736a47d34253a +size 607074 diff --git a/EndlessVendetta/Content/StarterContent/HDRI/HDRI_Epic_Courtyard_Daylight.uasset b/EndlessVendetta/Content/StarterContent/HDRI/HDRI_Epic_Courtyard_Daylight.uasset index 72280a3b..0f990580 100644 --- a/EndlessVendetta/Content/StarterContent/HDRI/HDRI_Epic_Courtyard_Daylight.uasset +++ b/EndlessVendetta/Content/StarterContent/HDRI/HDRI_Epic_Courtyard_Daylight.uasset @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:d607b449f6cba630df205824ffa12e8dba978263858fcc7a0f6089612f21f28b -size 66790690 +oid sha256:bc35eb2d43a47427d30aba0196f9eac90d089dd3abca319528c5d25c83510d0d +size 72364642 diff --git a/EndlessVendetta/Content/StarterContent/Props/MaterialSphere.uasset b/EndlessVendetta/Content/StarterContent/Props/MaterialSphere.uasset index 56bddfc9..bf29e55a 100644 --- a/EndlessVendetta/Content/StarterContent/Props/MaterialSphere.uasset +++ b/EndlessVendetta/Content/StarterContent/Props/MaterialSphere.uasset @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:3a8777c01491888bba9f40eda9d2bed76a611f0e80f75917501ce69c1a321342 -size 47333 +oid sha256:36cd87b4220e1e08e73ba8c88cc787df6058fcd0cdf7ced1c255ba99da2cc189 +size 47710 diff --git a/EndlessVendetta/Source/EndlessVendetta/EndlessVendettaCharacter.cpp b/EndlessVendetta/Source/EndlessVendetta/EndlessVendettaCharacter.cpp index 3cfc910d..78f3e155 100644 --- a/EndlessVendetta/Source/EndlessVendetta/EndlessVendettaCharacter.cpp +++ b/EndlessVendetta/Source/EndlessVendetta/EndlessVendettaCharacter.cpp @@ -60,8 +60,7 @@ void AEndlessVendettaCharacter::BeginPlay() GadgetManagerActor->AttachToComponent(GetRootComponent(), AttachmentRules); for (UActorComponent* PlayersCamera : GetComponentsByTag(UCameraComponent::StaticClass(), FName("PlayersCamera"))) { - UE_LOG(LogTemp, Warning, TEXT("An actor component with PlayersCamera tag has been found")); - GadgetManager->SpawnGadgets(Cast(PlayersCamera)); + GadgetManager->SpawnGadgetsOnBeginPlay(Cast(PlayersCamera)); break; } } @@ -181,6 +180,8 @@ float AEndlessVendettaCharacter::TakeDamage(const float DamageAmount, FDamageEve void AEndlessVendettaCharacter::ToggleRecon() { + if (!GadgetManager->IsValidReconGadget()) return; + if (IsValid(PrimaryWeapon)) EquipPrimary(); if (IsValid(SecondaryWeapon)) EquipSecondary(); @@ -190,7 +191,7 @@ void AEndlessVendettaCharacter::ToggleRecon() return; } - if (GadgetManager->IsCombatEquipped() && !GadgetManager->TryToUnequipCombat()) + if (GadgetManager->IsValidCombatGadget() && GadgetManager->IsCombatEquipped() && !GadgetManager->TryToUnequipCombat()) { // Do nothing if combat is equipped and can't be unequipped at this moment return; @@ -201,6 +202,8 @@ void AEndlessVendettaCharacter::ToggleRecon() void AEndlessVendettaCharacter::ToggleCombat() { + if(!GadgetManager->IsValidCombatGadget()) return; + if (IsValid(PrimaryWeapon)) EquipPrimary(); if (IsValid(SecondaryWeapon)) EquipSecondary(); @@ -210,7 +213,7 @@ void AEndlessVendettaCharacter::ToggleCombat() return; } - if (GadgetManager->IsReconEquipped() && !GadgetManager->TryToUnequipRecon()) + if (GadgetManager->IsValidReconGadget() && GadgetManager->IsReconEquipped() && !GadgetManager->TryToUnequipRecon()) { // Do nothing if recon is equipped and can't be unequipped at the moment return; @@ -235,8 +238,8 @@ void AEndlessVendettaCharacter::EquipPrimary() if (IsValid(SecondaryWeapon)) EquipSecondary(); - if (GadgetManager->IsReconEquipped() && !GadgetManager->TryToUnequipRecon()) return; - if (GadgetManager->IsCombatEquipped() && !GadgetManager->TryToUnequipCombat()) return; + if (GadgetManager->IsValidReconGadget() && GadgetManager->IsReconEquipped() && !GadgetManager->TryToUnequipRecon()) return; + if (GadgetManager->IsValidCombatGadget() && GadgetManager->IsCombatEquipped() && !GadgetManager->TryToUnequipCombat()) return; FActorSpawnParameters spawnParams; @@ -267,8 +270,8 @@ void AEndlessVendettaCharacter::EquipSecondary() if (IsValid(PrimaryWeapon)) EquipPrimary(); - if (GadgetManager->IsReconEquipped() && !GadgetManager->TryToUnequipRecon()) return; - if (GadgetManager->IsCombatEquipped() && !GadgetManager->TryToUnequipCombat()) return; + if (GadgetManager->IsValidReconGadget() && GadgetManager->IsReconEquipped() && !GadgetManager->TryToUnequipRecon()) return; + if (GadgetManager->IsValidCombatGadget() && GadgetManager->IsCombatEquipped() && !GadgetManager->TryToUnequipCombat()) return; FActorSpawnParameters spawnParams; @@ -417,3 +420,16 @@ bool AEndlessVendettaCharacter::GetHasRifle() { return bHasRifle; } + +void AEndlessVendettaCharacter::UpdateGadgetType(TSubclassOf NewGadgetClass) +{ + if (NewGadgetClass.GetDefaultObject()->IsA(AReconGadget::StaticClass()) && GadgetManager->CantReplaceReconGadget()) return; + if (NewGadgetClass.GetDefaultObject()->IsA(ACombatGadget::StaticClass()) && GadgetManager->CantReplaceCombatGadget()) return; + + for (UActorComponent* PlayersCamera : GetComponentsByTag(UCameraComponent::StaticClass(), FName("PlayersCamera"))) + { + GadgetManager->SpawnGadget(NewGadgetClass, Cast(PlayersCamera)); + break; + } +} + diff --git a/EndlessVendetta/Source/EndlessVendetta/EndlessVendettaCharacter.h b/EndlessVendetta/Source/EndlessVendetta/EndlessVendettaCharacter.h index 1f82fd2d..9fbc6e82 100644 --- a/EndlessVendetta/Source/EndlessVendetta/EndlessVendettaCharacter.h +++ b/EndlessVendetta/Source/EndlessVendetta/EndlessVendettaCharacter.h @@ -180,4 +180,6 @@ public: UFUNCTION(BlueprintImplementableEvent) void CheckpointCompletedUI(); + + void UpdateGadgetType(TSubclassOf NewGadgetClass); }; diff --git a/EndlessVendetta/Source/EndlessVendetta/GadgetSystem/GadgetBase.h b/EndlessVendetta/Source/EndlessVendetta/GadgetSystem/GadgetBase.h index 943c5761..05b4e8ef 100644 --- a/EndlessVendetta/Source/EndlessVendetta/GadgetSystem/GadgetBase.h +++ b/EndlessVendetta/Source/EndlessVendetta/GadgetSystem/GadgetBase.h @@ -109,6 +109,16 @@ public: { return GadgetName; } + + bool IsUnequippableInUse() + { + return UnequippableWhenInUse; + } + + bool IsInUse() + { + return GadgetInUse; + } // Sets default values for this actor's properties AGadgetBase(); diff --git a/EndlessVendetta/Source/EndlessVendetta/GadgetSystem/GadgetManager.cpp b/EndlessVendetta/Source/EndlessVendetta/GadgetSystem/GadgetManager.cpp index 8f7c6aa0..8978f40d 100644 --- a/EndlessVendetta/Source/EndlessVendetta/GadgetSystem/GadgetManager.cpp +++ b/EndlessVendetta/Source/EndlessVendetta/GadgetSystem/GadgetManager.cpp @@ -25,23 +25,27 @@ void AGadgetManager::Tick(float DeltaTime) } -void AGadgetManager::SpawnGadgets(USceneComponent* PlayersCameraComponent) +void AGadgetManager::SpawnGadgetsOnBeginPlay(USceneComponent* PlayersCameraComponent) { - if (!IsValid(ReconClass) || !IsValid(CombatClass)) UE_LOG(LogTemp, Fatal, TEXT("Recon or Combat class hasn't been set")); + if (IsValid(ReconClass)) SpawnGadget(ReconClass, PlayersCameraComponent); + if (IsValid(CombatClass)) SpawnGadget(CombatClass, PlayersCameraComponent); +} +void AGadgetManager::SpawnGadget(TSubclassOf GadgetClass, USceneComponent* PlayersCameraComponent) +{ FActorSpawnParameters SpawnParams; SpawnParams.SpawnCollisionHandlingOverride = ESpawnActorCollisionHandlingMethod::AlwaysSpawn; const FAttachmentTransformRules AttachmentRules(EAttachmentRule::SnapToTarget, true); - AActor* SpawnedActor = GetWorld()->SpawnActor(ReconClass, GetActorLocation(), GetActorRotation(), SpawnParams); - ReconGadget = Cast(SpawnedActor); - SpawnedActor->AttachToComponent(PlayersCameraComponent, AttachmentRules); - SpawnedActor->SetActorRelativeLocation(ReconGadget->GetUnequippedOffset()); - SpawnedActor->SetActorRelativeRotation(ReconGadget->GetGadgetSpawnRotation()); + AActor* SpawnedActor = GetWorld()->SpawnActor(GadgetClass, GetActorLocation(), GetActorRotation(), SpawnParams); + + if (SpawnedActor->IsA(AReconGadget::StaticClass())) ReconGadget = Cast(SpawnedActor); + else if (SpawnedActor->IsA(ACombatGadget::StaticClass())) CombatGadget = Cast(SpawnedActor); + else UE_LOG(LogTemp, Fatal, TEXT("Passed sub class of gadget base is neither a combat or recon gadget, check the gadget class you're passing through or contact Rafal")); - SpawnedActor = GetWorld()->SpawnActor(CombatClass, GetActorLocation(), GetActorRotation(), SpawnParams); - CombatGadget = Cast(SpawnedActor); - SpawnedActor->AttachToComponent(PlayersCameraComponent, AttachmentRules); - SpawnedActor->SetActorRelativeLocation(CombatGadget->GetUnequippedOffset()); - SpawnedActor->SetActorRelativeRotation(CombatGadget->GetGadgetSpawnRotation()); + AGadgetBase* BaseGadget = Cast(SpawnedActor); + BaseGadget->AttachToComponent(PlayersCameraComponent, AttachmentRules); + BaseGadget->SetActorRelativeLocation(BaseGadget->GetUnequippedOffset()); + BaseGadget->SetActorRelativeRotation(BaseGadget->GetGadgetSpawnRotation()); } + diff --git a/EndlessVendetta/Source/EndlessVendetta/GadgetSystem/GadgetManager.h b/EndlessVendetta/Source/EndlessVendetta/GadgetSystem/GadgetManager.h index 686b2516..176331a9 100644 --- a/EndlessVendetta/Source/EndlessVendetta/GadgetSystem/GadgetManager.h +++ b/EndlessVendetta/Source/EndlessVendetta/GadgetSystem/GadgetManager.h @@ -26,7 +26,9 @@ protected: virtual void BeginPlay() override; public: - void SpawnGadgets(USceneComponent* PlayersCameraComponent); + void SpawnGadgetsOnBeginPlay(USceneComponent* PlayersCameraComponent); + + void SpawnGadget(TSubclassOf GadgetClass, USceneComponent* PlayersCameraComponent); // Sets default values for this actor's properties AGadgetManager(); @@ -34,6 +36,16 @@ public: // Called every frame virtual void Tick(float DeltaTime) override; + bool IsValidReconGadget() + { + return IsValid(ReconGadget); + } + + bool IsValidCombatGadget() + { + return IsValid(CombatGadget); + } + void EquipRecon() { ReconGadget->Equip(); @@ -66,4 +78,16 @@ public: return false; } + bool CantReplaceReconGadget() + { + // Cant be replaced if it exists, and is either in use whilst being unequippable in use, or equipped and cant be unequipped + return IsValidReconGadget() && (ReconGadget->IsInUse() && ReconGadget->IsUnequippableInUse() || IsReconEquipped() && !TryToUnequipRecon()); + } + + bool CantReplaceCombatGadget() + { + // Cant be replaced if it exists, and is either in use whilst being unequippable in use, or equipped and cant be unequipped + return IsValidCombatGadget() && (CombatGadget->IsInUse() && CombatGadget->IsUnequippableInUse() || IsCombatEquipped() && !TryToUnequipCombat()); + } + }; diff --git a/EndlessVendetta/Source/EndlessVendetta/GadgetSystem/GadgetTutorial/GadgetTutorialStation.cpp b/EndlessVendetta/Source/EndlessVendetta/GadgetSystem/GadgetTutorial/GadgetTutorialStation.cpp index 03742753..a5178b5c 100644 --- a/EndlessVendetta/Source/EndlessVendetta/GadgetSystem/GadgetTutorial/GadgetTutorialStation.cpp +++ b/EndlessVendetta/Source/EndlessVendetta/GadgetSystem/GadgetTutorial/GadgetTutorialStation.cpp @@ -17,7 +17,8 @@ AGadgetTutorialStation::AGadgetTutorialStation() void AGadgetTutorialStation::BeginPlay() { Super::BeginPlay(); - + + EndlessVendettaCharacter = Cast(GetWorld()->GetFirstPlayerController()->GetPawn()); } // Called every frame @@ -47,6 +48,9 @@ void AGadgetTutorialStation::Interact() GadgetMenu->NextGadgetDelegate.AddDynamic(this, &AGadgetTutorialStation::NextGadget); GadgetMenu->PreviousGadgetDelegate.AddDynamic(this, &AGadgetTutorialStation::PreviousGadget); GadgetMenu->SelectGadgetDelegate.AddDynamic(this, &AGadgetTutorialStation::SelectGadget); + + // Runs Update Display Gadget at the end which overrides the default stand in gadget info + NextGadget(); } void AGadgetTutorialStation::InteractPrompt() @@ -86,7 +90,8 @@ void AGadgetTutorialStation::SelectGadget() // Despawn current gadgetRange // Spawn in the correct gadget range for the gadget - UE_LOG(LogTemp, Warning, TEXT("Gadget Selected: %s"), *GadgetsArray[GadgetIndex]->GetDefaultObject()->GetGadgetName()); + EndlessVendettaCharacter->UpdateGadgetType(GadgetsArray[GadgetIndex]); + } void AGadgetTutorialStation::CloseWidget() diff --git a/EndlessVendetta/Source/EndlessVendetta/GadgetSystem/GadgetTutorial/GadgetTutorialStation.h b/EndlessVendetta/Source/EndlessVendetta/GadgetSystem/GadgetTutorial/GadgetTutorialStation.h index 95a0ebce..34bba0ba 100644 --- a/EndlessVendetta/Source/EndlessVendetta/GadgetSystem/GadgetTutorial/GadgetTutorialStation.h +++ b/EndlessVendetta/Source/EndlessVendetta/GadgetSystem/GadgetTutorial/GadgetTutorialStation.h @@ -3,6 +3,7 @@ #pragma once #include "CoreMinimal.h" +#include "EndlessVendetta/EndlessVendettaCharacter.h" #include "EndlessVendetta/GadgetSystem/GadgetBase.h" #include "EndlessVendetta/InteractionInterface.h" #include "EndlessVendetta/UserWidgets/GadgetMenu.h" @@ -14,6 +15,8 @@ class ENDLESSVENDETTA_API AGadgetTutorialStation : public AActor, public IIntera { GENERATED_BODY() + AEndlessVendettaCharacter* EndlessVendettaCharacter; + UPROPERTY(EditDefaultsOnly, Category = "Gadgets") TArray> GadgetsArray;