From 88db9deea46e05448a6587e053509eff87f71e00 Mon Sep 17 00:00:00 2001 From: Sara Montecino Date: Sat, 12 Nov 2022 14:33:50 -0800 Subject: [PATCH] Add player damage, death, and respawn --- Content/GameModeBase_BP.uasset | Bin 26941 -> 26414 bytes Content/PlayerPawn_BP.uasset | Bin 124107 -> 123882 bytes Content/TestMap.umap | Bin 652081 -> 652081 bytes Content/TestMap_BuiltData.uasset | Bin 1249722 -> 1249722 bytes Source/PresidentsBrigade/BasePawn.cpp | 20 +++++++--- Source/PresidentsBrigade/BasePawn.h | 7 ++++ Source/PresidentsBrigade/PlayerPawn.cpp | 50 ++++++++++++++++++++++++ Source/PresidentsBrigade/PlayerPawn.h | 14 +++++++ todo.txt | 16 ++++---- 9 files changed, 95 insertions(+), 12 deletions(-) diff --git a/Content/GameModeBase_BP.uasset b/Content/GameModeBase_BP.uasset index 670f4488de2f5c87fd379ff2b1c632df94a91ec2..5f15a354eb7d7e03e7883629ed4ddcd9519fbaf7 100755 GIT binary patch delta 652 zcmdmciE-UI#t9P`{U=V0l}VRmV8{pJdLaIE*7xE176XUL2?3^pffCM>KME>LUJ%MM zS&uPFawSlKRyqR;_zwjBn-?-#32>c*O87fX4iwUwtiZ@JxmrkMvbvB8ldLn6kOfmT zGFN2scc6-H7q|*WXr#=(WU#VnYf#>2TF z73|_FOw&{0E{_(sVA`9CqT)JG#Yuz;Z3zpe^=WVoATvOr`@x@O@_LCBQD&%5xPbI4 zV8}87Y0k+8lC_M*o7YM1)nH_roa2-$qXQJS0AfD|kk@U17z9A`CeIA72FWmrgL%sX+$ZmifSA!6 pSUx#ACVjJ2)Lo9rib)41x26b8zL2&QNFUoQo}9OTb|99OvYP!{>YDd7gXWe(i4QfCKME>L4hUtL ztj8E7xe=(qGLr!X{0D;Y%?lZ=1h@9b&Pp z7m~CA*LkQgOAuUmx2VSCYEc2E%aKSz7EIAGaBj7b$YgUd6{dm&xKOv41=E*AI2WXX zU0j7}SvuV1`9SWObQBfWfkHPBD(odxnD%ABHGo1iAb@4^dWjTS7N{?{fHWr%zXFCR zGnCCSSwpgxqZ%0QAiqw&$RV=%pyVPAM&`*WPPx2kKrs-I1!AVj%bm2Of`P1LAoc^R zw*j(10Ic_|lavXFp)MB1767Ejo2GrKAeDv?iKF3+2wbE}**6jzWnCug52~@x} z`JQ+6WR{Sy$?JVqOuiXnIeCKb(#aD;Ehp#s-J2{BRzCT#|H{b%;g*w^2Hc(O6P3PM fJK`?KX6NKQ#>urw$0nai+&Wn(;lSpNDYZ-h(9Fi; diff --git a/Content/PlayerPawn_BP.uasset b/Content/PlayerPawn_BP.uasset index 9553a5dc4a0dcc2b57313048c89af116c81922da..6861cf2d6a237196a65857b5dfe7482f49c9ff61 100755 GIT binary patch delta 11263 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 YGZ3=?F)I+W0Wmueb8I)?%K6I{06C3I`~Uy| delta 178 zcmdn^Onu`s^$lK(0yBKpaYp?Ybe-{~DJfF>u+8Qu#y8=tMuvK(Mw1`LNNrAyjMNo~ zIdkLxqJ2x8yZ_Jl$iF9P&t$_Yk;!Y@IVQhqTQ10By{hXA(${c7f%b*=0fqJgh4ur5_5_9Y1%>to sh4u%9_6UXc35E6wh4u@D_6&vg4Tbg&h4v4H_7H{k5ry^=we}Ol5RcC+B>(^b delta 86 zcmV~$u?>Pi06@_wDxiQTtaTRDjNt^v{LVxQYh%IyCL}i03_|4yzxKUph|>`JUwFk& qThN^!SetCollisionEnabled(ECollisionEnabled::NoCollision); + if (death_effect) + { + death_effect->Destroy(); + death_effect = nullptr; + } + /* * Spawn particle effect. */ FVector player_location = player_mesh->GetComponentLocation(); FActorSpawnParameters spawnParameters; spawnParameters.SpawnCollisionHandlingOverride = ESpawnActorCollisionHandlingMethod::AlwaysSpawn; - AActor* bullet = GetWorld()->SpawnActor( + death_effect = GetWorld()->SpawnActor( death_class, player_location, FRotator(0,0,0), spawnParameters ); + destroy_self(); +} + +void ABasePawn::destroy_self() +{ /* * Remove thyself from this world. */ diff --git a/Source/PresidentsBrigade/BasePawn.h b/Source/PresidentsBrigade/BasePawn.h index 254bb58..67f342a 100755 --- a/Source/PresidentsBrigade/BasePawn.h +++ b/Source/PresidentsBrigade/BasePawn.h @@ -49,6 +49,8 @@ protected: }; }; + virtual void destroy_self(); + // Called when the game starts or when spawned virtual void BeginPlay() override; @@ -125,4 +127,9 @@ protected: * Last yaw. */ Yaw yaw; + + /** + * Spawned death effect actor. + */ + AActor* death_effect; }; diff --git a/Source/PresidentsBrigade/PlayerPawn.cpp b/Source/PresidentsBrigade/PlayerPawn.cpp index 2d93307..9ed9462 100755 --- a/Source/PresidentsBrigade/PlayerPawn.cpp +++ b/Source/PresidentsBrigade/PlayerPawn.cpp @@ -55,6 +55,15 @@ void APlayerPawn::Tick(float delta_time) { reset_boost(); } + + if (respawn_wait_s > 0) + { + respawn_wait_s -= delta_time; + if (respawn_wait_s <= 0) + { + respawn(); + } + } } void APlayerPawn::boost() @@ -96,4 +105,45 @@ void APlayerPawn::reset_boost() cooldown_wait_s = 0; } +} + +void APlayerPawn::destroy_self() +{ + APlayerController* controller = Cast(Controller); + if (!controller) + { + LogError("Cannot find palyer controller"); + return; + } + + stop_shooting(); + reset_boost(); + + DisableInput(controller); + player_mesh->SetHiddenInGame(true); + + if (death_effect) + { + death_effect->Destroy(); + death_effect = nullptr; + } + + /* + * Start respawn timer. + */ + respawn_wait_s = respawn_s; +} + +void APlayerPawn::respawn() +{ + APlayerController* controller = Cast(Controller); + if (!controller) + { + LogError("Cannot find palyer controller"); + return; + } + + EnableInput(controller); + player_mesh->SetHiddenInGame(false); + collision->SetCollisionEnabled(ECollisionEnabled::QueryAndPhysics); } \ No newline at end of file diff --git a/Source/PresidentsBrigade/PlayerPawn.h b/Source/PresidentsBrigade/PlayerPawn.h index 0445341..12298ac 100755 --- a/Source/PresidentsBrigade/PlayerPawn.h +++ b/Source/PresidentsBrigade/PlayerPawn.h @@ -24,9 +24,17 @@ public: // Called to bind functionality to input virtual void SetupPlayerInputComponent(class UInputComponent* PlayerInputComponent) override; protected: + virtual void destroy_self() override; + UPROPERTY(EditAnywhere, Category="Player") UCameraComponent* main_camera; + /** + * Time in seconds before respawn. + */ + UPROPERTY(EditAnywhere, Category = "Player") + float respawn_s; + /** * Multiplier to apply to current speed while boosting. Applies to max speed and accleration. */ @@ -48,6 +56,7 @@ protected: private: void boost(); void reset_boost(); + void respawn(); /** * Default max speed. Cached when boost is called. @@ -68,4 +77,9 @@ private: * Time waited for cooldown. */ float cooldown_wait_s; + + /** + * Time waiting for respawn. + */ + float respawn_wait_s; }; diff --git a/todo.txt b/todo.txt index da2778e..33c95c2 100644 --- a/todo.txt +++ b/todo.txt @@ -12,18 +12,20 @@ xAdd enemy cars xAdd dash xShoot from any direction xShoot at continuous rate when holding shoot button -Add local multiplayer - x Blueprint - - C++ -Add player damage +xAdd player damage Add player ammo -Add player health pickups Add HUD UI Add win condition - Time based. Keep president alive until he reaches destination. +Add menu +Add local multiplayer + x Blueprint + - C++ +Add netcode +Add art + - Car models + - Street shader Add sounds Add juice Add muzzle on shoot Camera zoom out based on screen size? Looks too small when I shrink the window -Add menu -Add netcode