From 2b6bdf9f80255697ea3d9acd11ddc0d84a65727b Mon Sep 17 00:00:00 2001 From: Foxim Date: Tue, 8 Apr 2025 18:22:33 +0200 Subject: [PATCH] feat: add grenade pickup, throw, and drop mechanics Implemented basic grenade interaction: - Player can pick up, throw, and drop grenades. To-do: - Refine throwing mechanics (e.g. direction, force). - Clean up and refactor related code. --- .../Blueprints/Items/BP_GranadeBase.uasset | Bin 0 -> 32949 bytes .../Player/BP_ExoPlayerController.uasset | Bin 22706 -> 22907 bytes .../Inputs/IMC_ExoMappingContext.uasset | Bin 15824 -> 16470 bytes .../Player/Inputs/Inputs/AI_Throw.uasset | Bin 0 -> 1371 bytes Content/Levels/TestMap.umap | Bin 46725 -> 47806 bytes .../Components/ShootingComponent.cpp | 94 +++++++++++++++++- Source/Exo/Private/Items/ThrowableBase.cpp | 45 +++++++++ .../Private/Player/ExoPlayerController.cpp | 6 ++ .../Characters/Components/ShootingComponent.h | 14 +++ Source/Exo/Public/Items/ThrowableBase.h | 59 +++++++++++ .../Exo/Public/Player/ExoPlayerController.h | 8 +- 11 files changed, 224 insertions(+), 2 deletions(-) create mode 100644 Content/Blueprints/Items/BP_GranadeBase.uasset create mode 100644 Content/Blueprints/Player/Inputs/Inputs/AI_Throw.uasset create mode 100644 Source/Exo/Private/Items/ThrowableBase.cpp create mode 100644 Source/Exo/Public/Items/ThrowableBase.h diff --git a/Content/Blueprints/Items/BP_GranadeBase.uasset b/Content/Blueprints/Items/BP_GranadeBase.uasset new file mode 100644 index 0000000000000000000000000000000000000000..fcfb41537408f9a8acbe1a673701762833470ce9 GIT binary patch literal 32949 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 QM>=*QSI?->LP7Zd1JwZJ$N&HU literal 0 HcmV?d00001 diff --git a/Content/Blueprints/Player/BP_ExoPlayerController.uasset b/Content/Blueprints/Player/BP_ExoPlayerController.uasset index d792f123f94061029d20951fdd5c315d40b47e6c..4ba70946490e079c596770b2bc79f4884e285786 100644 GIT binary patch delta 1806 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 literal 15824 zcmeHO3vg4%6H|a%t>j{B)Lv0^3>KVv3Mk^C5ooi%8g3As5~00r&4)^cfNm#S|P_`k!aYf zMm1%LM%}uyx%77_xD#FP$=FazU2bd1IKRj5^SJ#1S0Lc@SZ&32uh(fWkxE=PH=~K^ z;5#YZ*^jZ|ls@n!%72+MMDI|F&w2WMkdpUU$*UVzg36UmM$6`n!Lkz zvi9fYu9q=3_+TR4SQp}beah~FzEm1BW|rSMW`k(i5Th6D{D$vjW@C%y?W~M-Ocrtq-(bH`=>qV%SSXY#%DhoBKR%4ZqYc4DuW!P<8t!3foHynqUP*ZMf=qyq>Av7O5=?8UZi$wKu1d*ZzrP}&R@dDc0g4|0)k zO$({d|I;6@01{+Jo|(1+dTC`qY~tqq7a{Z@=IoK`&t|_rz2LjZ&0%+Z*5m9Kc8PC3 zKls@~Vw1_A8g7-`f)uG^L;Smrj?1Q#mo{oxnWM-tvfB9WbB%CDrib*#)%s8koA>50 zr6`+zKD9cmur=G4I~-YcBe%w)U6=9xz- z?!%OWp?D;w6?xUTGRyFU?9=kXiSS0EO`K_Z9K#O$=JgNYbosuM3y&UzzoBA_9d-VD zi&wy>qu$snwh2A1!--Ihu?qqgN!1T-s%W|T4oEm@r|t4|8JB(K-u_m;5L1j^(? z(}ls7v{JK(kYSWN10`0;Z4EelPLDg_w!3ZK;^JaY zz~&m~wR>%@cAI+fEl=Ge*(6ViC*W{8tyYiCWp&V1!0L8+d=8i0U+itSsoQU9>X1F( zwEB^NGBg8i1pHF5+hw&mNEa?|pxE!Hb@)Bb;u4?T?{M4OZAs2sT2dKJ9aLo`>@eM9 zX7T)Bo+2sZd4YSEa5H#aCS1@YZe|*s#OtQ>^aC2#V*>X+;k+hr=LzRCfjdVyzX{w~ z!Uas=&Jb>r3EXMIecc4^6yXr4f>QO-T7D-9S8l*=iaS9#{z!0B+;PH9Ho@;b!c8%O zJ4U#vCU8dyS78Eogm9HH88F3DiI9xwKnZ_Mw zz%t@WOyXQ7ac+~iQj<8uu%JxqMW71GgcHv)nQ#*gb{Y9SY7$pw5-0X*>in*g{qpX5 zGL08{QEC}s6!7lU78OtfJ|JS%f*0zprPKijUyT&O7NR>)KOs1y*y69?jY_lp;ipph z56Llq_^nj_V{U=}=dI*}GpeL*cue$ zR)r`+a7ekMTJ+YDqNT+RH68Df`tvy416%=TkduALwuq0vT>iF#gaPVn9dxp_I>f zHOHdGon8o_ovcEz7h=?X7}nE4mNC+hO;Th3-YXL`E0R8lkq%;YtvWbN0s89FK*95Q=*>Fw>fF^{*Pbxf$};w zKH!}2jzXWA&1U!9{(q&I(~>REwAIwq~nirs$={s9H^spEXGS6 zJC}Lz!c*Z;WQdSv{IBOd^uO6Zy!_LZmht=E!1qGpCsJSlYB=JW-u1QJqpe1f0slYH CC~>j? diff --git a/Content/Blueprints/Player/Inputs/Inputs/AI_Throw.uasset b/Content/Blueprints/Player/Inputs/Inputs/AI_Throw.uasset new file mode 100644 index 0000000000000000000000000000000000000000..7aa1e5832b549f95600573d050831e9122702596 GIT binary patch literal 1371 zcmX@utTpe)|Ns9Jm>C$jm>3v70%;In1md?D8=ky$n(~GFmf<4D-EMjsK(Sja3=H}} zTHie}H&x#$r!=*oC^N65SU(^qu`;zt-!reE6v%^8j-K%$8AbW!Kn)BG+(29cG8YJ% zfmSI3X)`l7b3+#(Vc~3S;ACv+8;Dn{zWw$$E6`)+ELDw0iwKj?8GKsy|MT1yZiN&e9rh3L;c?O16I*V|~12uuc?k~4*f*1-whpDqd#9$;a zSpS2<3uLD@k{pQXm!Fr)@P+v(uPl%gkeHmEn4apBpPZPJS(R9lnV;te4Bp~`#N<>4 zp_0lDGD7@8^@Pe`7R$+_lbB<3ZjrhsFO z;p)26Z#aRn@W@krxaI>JP{27SvACF_q`YDx50D2|?3fI4EQ63l0uM-wZ)!=ROJYeP z!;^+BlR1C_P@gdryLX5RAoy@~b9I)aLSvEvWCaNP1qK^PFFHV1_Xnts9bFNS4^szn z5DdV?V0;h_6GK)9N?z#TAJ86TF<4B3k`X8%KmZiYxBw{GL6bcL&?pqMKzh){xS$4s zl8qyj{S3)`Wb>fXa0=ZlxC9mk$Q<;DM2YwJzz{kIwHTxrMN$bU083ja=|>MaVSxMq z@=sVIu%rm7EJ$Sl#jI0)J}{@{fo=B#Cik*bNYb)JG7~Ai>Vaj|3EHL(E*)UO2Q&*O sKn_AhpelmJ&_Q4^IsMzx20iN|7eRiKK{LASo<$(bsr{M;P;roY05Z@O#{d8T literal 0 HcmV?d00001 diff --git a/Content/Levels/TestMap.umap b/Content/Levels/TestMap.umap index 27dd4366fe39fc6cf87676a20ee23de8b53e3105..2d56c033989accaa841cf55af0f8507e22ff3b65 100644 GIT binary patch delta 9548 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 diff --git a/Source/Exo/Private/Characters/Components/ShootingComponent.cpp b/Source/Exo/Private/Characters/Components/ShootingComponent.cpp index 80711e7..80096bd 100644 --- a/Source/Exo/Private/Characters/Components/ShootingComponent.cpp +++ b/Source/Exo/Private/Characters/Components/ShootingComponent.cpp @@ -3,6 +3,8 @@ #include "Characters/Components/ShootingComponent.h" +#include "Items/ThrowableBase.h" + // Sets default values for this component's properties UShootingComponent::UShootingComponent() { @@ -96,7 +98,7 @@ void UShootingComponent::Reload() CurrentGun->CurrentAmmo = CurrentGun->MaxAmmo; PlayerCharacter->GetWorldTimerManager().SetTimer(ReloadTimer, this, &UShootingComponent::ReloadCompleted, CurrentGun->ReloadTime, false); - UE_LOG(LogTemp, Display, TEXT("Reloaded. Ammo: %d/%d"), CurrentGun->CurrentAmmo, CurrentGun->MaxAmmo); // Docelowo tutaj wywo�anie UI aktualizuj�ce stan ammo + UE_LOG(LogTemp, Display, TEXT("Reloaded. Ammo: %d/%d"), CurrentGun->CurrentAmmo, CurrentGun->MaxAmmo); // Docelowo tutaj wywo�anie UI aktualizuj�ce stan ammo } void UShootingComponent::PickUpGun(AGunBase* gunItem) @@ -121,6 +123,38 @@ void UShootingComponent::PickUpGun(AGunBase* gunItem) CurrentGun = NewGun; } +bool UShootingComponent::PickUpThrow(AThrowableBase* ThrowItem) +{ + AThrowableBase* NewThrowable = NewObject(); + + if (IsValid(ThrowableItem)) + { + if (ThrowableItem->GetClass() == NewThrowable->GetClass()) + { + if (ThrowableItem->Quantity + ThrowItem->Quantity >= ThrowableItem->MaxQuantity) + { + ThrowableItem->Quantity = ThrowableItem->MaxQuantity; + return false; + } + + ThrowableItem->Quantity += ThrowItem->Quantity; + return true; + + } + + DropThrow(); + } + + NewThrowable->Damage = ThrowItem->Damage; + NewThrowable->Quantity = ThrowItem->Quantity; + NewThrowable->Radius = ThrowItem->Radius; + NewThrowable->ThrowableType = ThrowItem->ThrowableType; + NewThrowable->SceneItemClass = ThrowItem->GetClass(); + + ThrowableItem = NewThrowable; + return true; +} + void UShootingComponent::DropGun() { if (!IsValid(CurrentGun)) return; @@ -151,6 +185,30 @@ void UShootingComponent::DropGun() } } +void UShootingComponent::DropThrow() +{ + if (!IsValid(ThrowableItem)) return; + + FVector ForwardVector = PlayerCharacter->GetActorForwardVector(); + FVector DroppedPos = PlayerCharacter->GetActorLocation() + (ForwardVector * 100.f); + + FTransform DroppedTransform = PlayerCharacter->GetActorTransform(); + DroppedTransform.SetLocation(DroppedPos); + + AThrowableBase* DropedItem = GetWorld()->SpawnActor(ThrowableItem->SceneItemClass, DroppedTransform); + + if (DropedItem) + { + ThrowableItem->Quantity--; + DropedItem->Damage = ThrowableItem->Damage; + DropedItem->Radius = ThrowableItem->Radius; + DropedItem->Quantity = ThrowableItem->Quantity; + DropedItem->ThrowableType = ThrowableItem->ThrowableType; + + } + +} + void UShootingComponent::ResetFireCooldown() { bCanShoot = true; @@ -206,6 +264,40 @@ void UShootingComponent::StopAiming() TargetFOV = DefaultFOV; } +void UShootingComponent::Throw() // Wymaga dopracowania +{ + if (IsValid(ThrowableItem)) + { + FVector ForwardVector = PlayerCharacter->GetActorForwardVector(); + FVector DroppedPos = PlayerCharacter->GetActorLocation() + (ForwardVector * 100.f); + + FTransform DroppedTransform = PlayerCharacter->GetActorTransform(); + DroppedTransform.SetLocation(DroppedPos); + + AThrowableBase* ThrowedItem = GetWorld()->SpawnActor(ThrowableItem->SceneItemClass, DroppedTransform); + + if (ThrowedItem) + { + ThrowableItem->Quantity--; + ThrowedItem->Damage = ThrowableItem->Damage; + ThrowedItem->Radius = ThrowableItem->Radius; + ThrowedItem->Quantity = 1; + ThrowedItem->ThrowableType = ThrowableItem->ThrowableType; + + FVector ThrowVector = (ThrowedItem->GetActorLocation() - PlayerCharacter->GetActorLocation()).GetSafeNormal(); + ThrowedItem->Mesh->SetPhysicsLinearVelocity(ThrowVector * 800.f); + + if (ThrowableItem->Quantity <= 0) + { + ThrowableItem->Destroy(); + ThrowableItem = nullptr; + } + + } + } + +} + // Called every frame void UShootingComponent::TickComponent(float DeltaTime, ELevelTick TickType, FActorComponentTickFunction* ThisTickFunction) { diff --git a/Source/Exo/Private/Items/ThrowableBase.cpp b/Source/Exo/Private/Items/ThrowableBase.cpp new file mode 100644 index 0000000..81f7fc6 --- /dev/null +++ b/Source/Exo/Private/Items/ThrowableBase.cpp @@ -0,0 +1,45 @@ +// Fill out your copyright notice in the Description page of Project Settings. + + +#include "Items/ThrowableBase.h" + +#include "Characters/Components/ShootingComponent.h" + +AThrowableBase::AThrowableBase() +{ + PrimaryActorTick.bCanEverTick = true; + + RootSceneComponent = CreateDefaultSubobject(TEXT("Root")); + SetRootComponent(RootSceneComponent); + Mesh = CreateDefaultSubobject(TEXT("Mesh")); + Mesh->SetupAttachment(GetRootComponent()); + Mesh->SetSimulatePhysics(true); + +} + +void AThrowableBase::Interact_Implementation(AExoPlayerCharacter* PlayerCharacter) +{ + if (PlayerCharacter->ShootingComponent->PickUpThrow(this)) + { + Destroy(); + } + +} + +void AThrowableBase::EffectActivate() +{ + if (ThrowableType == ThrowableType::Hit) + { + UE_LOG(LogTemp, Display, TEXT("Throwable Hit")); + } + if (ThrowableType == ThrowableType::Explode) + { + UE_LOG(LogTemp, Display, TEXT("Throwable Explode")); + } + if (ThrowableType == ThrowableType::Area) + { + UE_LOG(LogTemp, Display, TEXT("Throwable Area")); + } +} + + diff --git a/Source/Exo/Private/Player/ExoPlayerController.cpp b/Source/Exo/Private/Player/ExoPlayerController.cpp index 3a15caf..26ad496 100644 --- a/Source/Exo/Private/Player/ExoPlayerController.cpp +++ b/Source/Exo/Private/Player/ExoPlayerController.cpp @@ -57,6 +57,7 @@ void AExoPlayerController::SetupInputComponent() EnhancedInputComponent->BindAction(SprintAction, ETriggerEvent::Started, this, &AExoPlayerController::PlayerStartSprint); EnhancedInputComponent->BindAction(SprintAction, ETriggerEvent::Completed, this, &AExoPlayerController::PlayerStopSprint); EnhancedInputComponent->BindAction(ShootAction, ETriggerEvent::Started, this, &AExoPlayerController::PlayerShoot); + EnhancedInputComponent->BindAction(ThrowAction, ETriggerEvent::Completed, this, &AExoPlayerController::PlayerThrow); EnhancedInputComponent->BindAction(AimAction, ETriggerEvent::Started, this, &AExoPlayerController::PlayerStartAim); EnhancedInputComponent->BindAction(AimAction, ETriggerEvent::Completed, this, &AExoPlayerController::PlayerStopAim); EnhancedInputComponent->BindAction(MeleAction, ETriggerEvent::Started, this, &AExoPlayerController::PlayerMeleAttack); @@ -166,6 +167,11 @@ void AExoPlayerController::PlayerShoot() ShootingComponent->Shoot(); } +void AExoPlayerController::PlayerThrow() +{ + ShootingComponent->Throw(); +} + void AExoPlayerController::PlayerStartAim() { ShootingComponent->StartAiming(); diff --git a/Source/Exo/Public/Characters/Components/ShootingComponent.h b/Source/Exo/Public/Characters/Components/ShootingComponent.h index 25eb3ce..de7b490 100644 --- a/Source/Exo/Public/Characters/Components/ShootingComponent.h +++ b/Source/Exo/Public/Characters/Components/ShootingComponent.h @@ -11,6 +11,8 @@ #include "ShootingComponent.generated.h" +class AThrowableBase; + UCLASS( ClassGroup=(Custom), meta=(BlueprintSpawnableComponent) ) class EXO_API UShootingComponent : public UActorComponent { @@ -49,9 +51,15 @@ public: UFUNCTION(BlueprintCallable, Category = "Shooting") void PickUpGun(AGunBase* gunItem); + UFUNCTION(BlueprintCallable, Category = "Shooting") + bool PickUpThrow(AThrowableBase* ThrowItem); + UFUNCTION(Category = "Shooting") void DropGun(); + UFUNCTION(Category = "Shooting") + void DropThrow(); + UFUNCTION(Category = "Shooting") void SwitchGun(); @@ -64,6 +72,9 @@ public: UFUNCTION(Category = "Shooting") void StopAiming(); + UFUNCTION(Category = "Shooting") + void Throw(); + UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = "Aiming") float AimingAnimationSpeed = 30.0f; @@ -76,6 +87,9 @@ public: UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = "Mele Attack") float MeleRange = 75.f; + UPROPERTY(VisibleAnywhere, BlueprintReadOnly, Category = "Shooting") + AThrowableBase* ThrowableItem = nullptr; + AGunBase* CurrentGun = nullptr; AGunBase* SecondaryGun = nullptr; diff --git a/Source/Exo/Public/Items/ThrowableBase.h b/Source/Exo/Public/Items/ThrowableBase.h new file mode 100644 index 0000000..9c8f40f --- /dev/null +++ b/Source/Exo/Public/Items/ThrowableBase.h @@ -0,0 +1,59 @@ +// Fill out your copyright notice in the Description page of Project Settings. + +#pragma once + +#include "CoreMinimal.h" +#include "GameFramework/Actor.h" +#include "Interfaces/Interactable.h" +#include "ThrowableBase.generated.h" + +UENUM() +enum class ThrowableType : uint8 +{ + Hit UMETA(DisplayName = "Hit"), + Explode UMETA(DisplayName = "Explode"), + Area UMETA(DisplayName = "Area") +}; + +UCLASS() +class EXO_API AThrowableBase : public AActor, public IInteractable +{ + GENERATED_BODY() + +public: + AThrowableBase(); + + virtual void Interact_Implementation(AExoPlayerCharacter* PlayerCharacter) override; + + TSubclassOf SceneItemClass; + + UPROPERTY(VisibleAnywhere, BlueprintReadOnly, Category = "Throw") + TObjectPtr RootSceneComponent; + + UPROPERTY(EditAnywhere, BlueprintReadOnly, Category = "Throw") + TObjectPtr Mesh; + + UPROPERTY(EditAnywhere, BlueprintReadOnly, Category = "Throw Details") + int Quantity = 1; + + UPROPERTY(EditAnywhere, BlueprintReadOnly, Category = "Throw Details") + int MaxQuantity = 6; + + UPROPERTY(EditAnywhere, BlueprintReadOnly, Category = "Throw Details") + int NumberOfBounces = 0; + + UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = "Effect") + ThrowableType ThrowableType = ThrowableType::Hit; + + UPROPERTY(EditAnywhere, BlueprintReadOnly, Category = "Effect") + float Damage = 100.f; + + UPROPERTY(EditAnywhere, BlueprintReadOnly, Category = "Effect") + float Radius = 0.f; + +protected: + UFUNCTION(BlueprintCallable, Category = "Effect") + virtual void EffectActivate(); + +}; + diff --git a/Source/Exo/Public/Player/ExoPlayerController.h b/Source/Exo/Public/Player/ExoPlayerController.h index 61064e6..3193b1c 100644 --- a/Source/Exo/Public/Player/ExoPlayerController.h +++ b/Source/Exo/Public/Player/ExoPlayerController.h @@ -62,6 +62,9 @@ protected: UFUNCTION(BlueprintCallable, Category = "Input") void PlayerShoot(); // LPM + UFUNCTION(BlueprintCallable, Category = "Input") + void PlayerThrow(); // G + UFUNCTION(BlueprintCallable, Category = "Input") void PlayerStartAim(); // PPM (pressed) @@ -119,7 +122,10 @@ protected: UPROPERTY(EditAnywhere, Category = "Input") TObjectPtr ShootAction; - + + UPROPERTY(EditAnywhere, Category = "Input") + TObjectPtr ThrowAction; + UPROPERTY(EditAnywhere, Category = "Input") TObjectPtr ReloadAction;