From ad556e05234201dfc709af1c04cdefba28f24b21 Mon Sep 17 00:00:00 2001 From: Kingsmedia Date: Tue, 10 May 2022 15:29:00 +0200 Subject: [PATCH] 126 - Cooldown Announcement --- .../GameModes/BP_BlasterGameMode.uasset | Bin 20243 -> 20388 bytes .../Blueprints/HUD/WBP_Announcement.uasset | Bin 30996 -> 30917 bytes Source/Blaster/GameMode/BlasterGameMode.cpp | 4 ++ Source/Blaster/GameMode/BlasterGameMode.h | 3 + Source/Blaster/HUD/Announcement.h | 2 +- .../BlasterPlayerController.cpp | 52 ++++++++++++++---- .../BlasterPlayerController.h | 6 +- 7 files changed, 54 insertions(+), 13 deletions(-) diff --git a/Content/Blueprints/GameModes/BP_BlasterGameMode.uasset b/Content/Blueprints/GameModes/BP_BlasterGameMode.uasset index 6185c49710a543e48a746ae06620cc278f2790d9..4923297aefee46d5aa5201f3b1a0f6c6bfbfcdc5 100644 GIT binary patch delta 3967 zcmcJSU2M};6u|F)A7n)brCUG#W7Ce0u@)Rt+}LRQZ?~@NKDutYu??n-*==mX)_pn= zSwZkcLjZ4lk%$vD63sMb@kR8(2aFF&)c9he=mQQBP0$z;0mXCvJ-4)5+cidS(wuwl z`Tfs1_uQ|IpO#*KMLKaw*I&t4CS%MW9PR^=!KP1MuP6=b7|REB(o;Gpv&UF>em@Y!=uasvWWWG{)m?$gVumMSp>S9kS%wR zZver=BanGQoOck9QER|+BM@;Y*Eg$yP8rWgUA!u1E$=Z|q$B)!Q$^-+c(vN+J~j24 zJFA65l2i`HZoo0a2MF5(VF3>!HJr0JtImbSY#7+i-%*S@VN!F$k1aSXIr;g@;sEXd zwc!F8s4sToI?}h0q(x*e(^|C9xLSPyiNOJa?%`kRO!B>i3hP?Z{rvDYn_R!ZswKS> zidU>OkXB4GQUJydIYq7u1HhjMYV$*QGw-skOdg~$r68^3RFpK537*7F!pN`N%2$br zim8-f8TfX))+#baJn8Z&{J7ny5wT?cuDw!H_!YZ3w2?wliB&DyEiTj!V&YV7#`R!g zqq$0-*f`^IgHcUM2B@}*|}mctTLnnqzK z8Hw{JxN`8n9Jqz`N{M_Q0r4w7p~O~v3Af>s@rhzh?zXJ-yWhXfo(%fW?vO))uFbX4 z)nC6Lp<2?n;udh0leVZtf55!T$S95_-koX_J`_IdEL>xzQE`d{R!HM)4Zr5JX||Et z%#XPTWE*Mm>-4!x3!Cer%O<(_#VT2|nrMZO>T-EYRfbfn-emRFrTqP>V(DR(68EWs zQ-kmE1pz|-KT6<@WCSH}+DThU~vFxrl<%t^_U+syp$vzN_rNb}k6aGn*(?TVgEbU%l}EjqQ=;M8IWY>SNebZb=;V-NA)n#$x3(!{a~YxsHS u@M}x%Ct}eRAd?|FtvY(jXZ^*Bh^`hN|BA_@4}>9dgQ79o%g0Bor~d(QV*b(q delta 3712 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 delta 7921 zcmeHLeQZ?65#M*g;ENA9pYM+Q!af&+jiCg`C5f9*5+?y;JO02924kCEjg4)65SDw()F0 zsTej-EKq8wSSbVRFPA9w8vZ)VmFn9byjb+hpVdB7dA0NTXP&5eVcl!#XOC^Hd#I`I zW$(l*ZxKF$zthlcv@L!WNB9q6(=>=lT&Y2`6K&g}aQnhj>g5Tv~}i0)D|6XyGm)?u#yQkIafoEA=iKJT@y( zsdo@}*d^}sE^%K$|5|cTW6hWxKk5?qRhPK0F)lruV{mD3)CKO3IFVD+adUNZ9O?_> zYjQoxml#gPKCVy0!C4n0_vak>PGLOf^zA+;a*gCZJMQ2$a3@&zC!GHA>9~5`l)=Ic z@pN=LP`Bh^gzMiUPU;QtU?3i*{kar>`S_Eq)w=--+p3_kC)_+k`fa>0Hlu%%(z zy&kqwKoyi!9a}NgbFhn?T&B2%vb&zur7;?i%R*;k7G$QCz9tR%AXwvRYhiQUEc}Uc&>EAd+n8QA&?KYndjk5^V=&v+ds%J0Z)!b`Jl z>c#T2CDH9{(hM(3(IrXJ2(87zCG_YdL9?*_4OPPR6qMF2>9PkJM~gC=sGyZ6mo6QI z><;c=L%p!It^!sM=NI;JkGTE}vKU#mi+fjdNoR=V)!GiOt%f%mgR4T);?f39){1ZG z>;GN#kZf^!_eB0gpclJhc=K9eGB@l(A7ODtZ-GB|cCFst%5r6aWM=~?MEA=T;krj^CP-ul;xA>RZmvhAo z^m=aBLSb{#XoRZPp!ZJhTMs?M5sQ{E_s)C*Lt$*xf_Ie`dTtWR+O#a=k|slvZGxsq zlCAM>Ff}R#ms1dFUH52z@AOUZ*Z;ZNN_2xVE zSfzwrW#;t$6gxgv#x26hGrZrrV;0h1*-WJWVzV>paf|ft zcFaopzeeUxrpqOnPvE8WUqxoJlgO;k?O@*BcYse zd~AQ8j$WkBQqXzV3TW(!#3?k!NpC&v?0sd1oUp_X%{hfBF%tXzO9_<2uDcJM7>O$v&KDyF6OJ6O{Pca0p#;_EPLUGTNa6<-z| zklGcruB2S^C(rJuPg8a=eVz^{(eSI$MGj;ncklX7l3|SfJISEwxhI1X9+X?mV`uvo zE4!1l|2qe1F3#2kdDrVfqNK&e^l49^T;~Ug;<0-&_#maPd62ei-ZF0tK5k1u*DrMx z&4^mZXnzAL?Z?w@75&>jDp7-kE-hMHnv$bgy0`6S9p9knqIY_Ox>e2pr_7uh&%{79 zpd6i3`tIahzk#`$LM|&6)^$pWk=+bUiG;6KcyheR2*Tm|D27d?2IvoE=8MxxvsL2q$eax86LK+^dfgG#xi0?r5KM?b+G0+bZ!vzUV=;mCo7 z(XBHOer^vVA`TZ0%ujc6&uT6$9+f(3eYL7)rLbUuC=uhME6dAJD#V*SpS0IxF!24r z0_dFZTj>m`Mp>Wbj&`oBi15u=WX`_lXrW0%`L&p#6G~#Jr0%C*OV(t(4cgLXYB@c?_(6YRmRWfGVA5|N`-6uozx5BkMK2Hl diff --git a/Source/Blaster/GameMode/BlasterGameMode.cpp b/Source/Blaster/GameMode/BlasterGameMode.cpp index 012418d..365d459 100644 --- a/Source/Blaster/GameMode/BlasterGameMode.cpp +++ b/Source/Blaster/GameMode/BlasterGameMode.cpp @@ -47,6 +47,10 @@ void ABlasterGameMode::Tick(float DeltaSeconds) SetMatchState(MatchState::Cooldown); } } + else if (MatchState == MatchState::Cooldown) + { + CountDownTime = CooldownTime + WarmupTime + MatchTime - GetWorld()->GetTimeSeconds() + LevelStartingTime; + } } void ABlasterGameMode::OnMatchStateSet() diff --git a/Source/Blaster/GameMode/BlasterGameMode.h b/Source/Blaster/GameMode/BlasterGameMode.h index 1be767a..1cf19f4 100644 --- a/Source/Blaster/GameMode/BlasterGameMode.h +++ b/Source/Blaster/GameMode/BlasterGameMode.h @@ -44,4 +44,7 @@ protected: private: float CountDownTime = 0.f; + +public: + FORCEINLINE float GetCountdownTime() const { return CountDownTime; } }; diff --git a/Source/Blaster/HUD/Announcement.h b/Source/Blaster/HUD/Announcement.h index d9e28e7..9f14d29 100644 --- a/Source/Blaster/HUD/Announcement.h +++ b/Source/Blaster/HUD/Announcement.h @@ -20,7 +20,7 @@ public: class UTextBlock* AnnouncementText; UPROPERTY(meta = (BindWidget)) - UTextBlock* WarmupTime; + UTextBlock* CountdownText; UPROPERTY(meta = (BindWidget)) UTextBlock* AnnouncementMessage; diff --git a/Source/Blaster/PlayerController/BlasterPlayerController.cpp b/Source/Blaster/PlayerController/BlasterPlayerController.cpp index 43394ef..d41e7dc 100644 --- a/Source/Blaster/PlayerController/BlasterPlayerController.cpp +++ b/Source/Blaster/PlayerController/BlasterPlayerController.cpp @@ -18,7 +18,7 @@ void ABlasterPlayerController::BeginPlay() { Super::BeginPlay(); - + BlasterHUD = Cast(GetHUD()); ServerCheckMatchState(); } @@ -33,7 +33,7 @@ void ABlasterPlayerController::GetLifetimeReplicatedProps(TArrayCharacterOverlay->RemoveFromParent(); - if (BlasterHUD->Announcement) + bool bHUDValid = + BlasterHUD->Announcement && + BlasterHUD->Announcement->AnnouncementText && + BlasterHUD->Announcement->AnnouncementMessage; + + if (bHUDValid) { + const FString AnnouncementText("New match starts in:"); + BlasterHUD->Announcement->AnnouncementText->SetText(FText::FromString(AnnouncementText)); + BlasterHUD->Announcement->AnnouncementMessage->SetText(FText()); BlasterHUD->Announcement->SetVisibility(ESlateVisibility::Visible); } } @@ -136,17 +144,19 @@ void ABlasterPlayerController::ServerCheckMatchState_Implementation() LevelStartingTime = GameMode->LevelStartingTime; WarmupTime = GameMode->WarmupTime; MatchTime = GameMode->MatchTime; + CooldownTime = GameMode->CooldownTime; MatchState = GameMode->GetMatchState(); - ClientJoinMidGame(MatchState, WarmupTime, MatchTime, LevelStartingTime); + ClientJoinMidGame(MatchState, WarmupTime, MatchTime, CooldownTime, LevelStartingTime); } } -void ABlasterPlayerController::ClientJoinMidGame_Implementation(FName StateOfMatch, float Warmup, float Match, float StartingTime) +void ABlasterPlayerController::ClientJoinMidGame_Implementation(FName StateOfMatch, float Warmup, float Match, float Cooldown, float StartingTime) { LevelStartingTime = StartingTime; WarmupTime = Warmup; MatchTime = Match; + CooldownTime = Cooldown; MatchState = StateOfMatch; OnMatchStateSet(MatchState); @@ -175,12 +185,22 @@ void ABlasterPlayerController::SetHUDTime() float TimeLeft = 0.f; if (MatchState == MatchState::WaitingToStart) TimeLeft = WarmupTime - GetServerTime() + LevelStartingTime; else if (MatchState == MatchState::InProgress) TimeLeft = WarmupTime + MatchTime - GetServerTime() + LevelStartingTime; - - const uint32 SecondsLeft = FMath::CeilToInt(TimeLeft); + else if (MatchState == MatchState::Cooldown) TimeLeft = WarmupTime + MatchTime + CooldownTime - GetServerTime() + LevelStartingTime; + uint32 SecondsLeft = FMath::CeilToInt(TimeLeft); + + if (HasAuthority()) + { + BlasterGameMode = BlasterGameMode == nullptr ? Cast(UGameplayStatics::GetGameMode(this)) : BlasterGameMode; + if (BlasterGameMode) + { + SecondsLeft = FMath::CeilToInt(BlasterGameMode->GetCountdownTime() + LevelStartingTime); + } + } + if (CountdownInt != SecondsLeft) { - if (MatchState == MatchState::WaitingToStart) SetHUDAnnouncementCountdown(TimeLeft); - if (MatchState == MatchState::InProgress) SetHUDMatchCountdown(TimeLeft); + if (MatchState == MatchState::WaitingToStart || MatchState == MatchState::Cooldown) SetHUDAnnouncementCountdown(TimeLeft); + if (MatchState == MatchState::InProgress) SetHUDMatchCountdown(TimeLeft); } CountdownInt = SecondsLeft; @@ -288,6 +308,11 @@ void ABlasterPlayerController::SetHUDMatchCountdown(float CountdownTime) if (bHUDValid) { + if (CountdownTime < 0.f) + { + BlasterHUD->CharacterOverlay->MatchCountdownText->SetText(FText()); + return; + } const int32 Minutes = FMath::FloorToInt(CountdownTime / 60); const int32 Seconds = CountdownTime - Minutes * 60; @@ -303,14 +328,19 @@ void ABlasterPlayerController::SetHUDAnnouncementCountdown(float CountdownTime) BlasterHUD && BlasterHUD->Announcement && BlasterHUD->Announcement->AnnouncementText && - BlasterHUD->Announcement->WarmupTime; + BlasterHUD->Announcement->CountdownText; if (bHUDValid) { + if (CountdownTime < 0.f) + { + BlasterHUD->Announcement->CountdownText->SetText(FText()); + return; + } const int32 Minutes = FMath::FloorToInt(CountdownTime / 60); const int32 Seconds = CountdownTime - Minutes * 60; const FString CountdownText = FString::Printf(TEXT("%02d:%02d"), Minutes, Seconds); - BlasterHUD->Announcement->WarmupTime->SetText(FText::FromString(CountdownText)); + BlasterHUD->Announcement->CountdownText->SetText(FText::FromString(CountdownText)); } } diff --git a/Source/Blaster/PlayerController/BlasterPlayerController.h b/Source/Blaster/PlayerController/BlasterPlayerController.h index 0d47584..245955a 100644 --- a/Source/Blaster/PlayerController/BlasterPlayerController.h +++ b/Source/Blaster/PlayerController/BlasterPlayerController.h @@ -65,15 +65,19 @@ protected: void ServerCheckMatchState(); UFUNCTION(Client, Reliable) - void ClientJoinMidGame(FName StateOfMatch, float Warmup, float Match, float StartingTime); + void ClientJoinMidGame(FName StateOfMatch, float Warmup, float Match, float Cooldown, float StartingTime); private: UPROPERTY() class ABlasterHUD* BlasterHUD; + UPROPERTY() + class ABlasterGameMode* BlasterGameMode; + float LevelStartingTime = 0.f; float MatchTime = 0.f; float WarmupTime = 0.f; + float CooldownTime = 0.f; uint32 CountdownInt = 0; UPROPERTY(ReplicatedUsing=OnRep_MatchState)