ソースを参照

Wip. Rest time between rounds lengthened to give users more time to see their rank. Added rest time between match network archetype. Still need to properly track when the rest is over via network propery to support players that join in between matches.

Signed-off-by: Gene Walters <[email protected]>
Gene Walters 2 年 前
コミット
fbd3ce8a21

+ 2 - 0
Gem/Code/CMakeLists.txt

@@ -52,6 +52,7 @@ ly_add_target(
     FILES_CMAKE
     FILES_CMAKE
         multiplayersample_autogen_files.cmake
         multiplayersample_autogen_files.cmake
         multiplayersample_files.cmake
         multiplayersample_files.cmake
+        multiplayersample_server_files.cmake
         ${pal_dir}/multiplayersample_${PAL_PLATFORM_NAME_LOWERCASE}_files.cmake
         ${pal_dir}/multiplayersample_${PAL_PLATFORM_NAME_LOWERCASE}_files.cmake
     INCLUDE_DIRECTORIES
     INCLUDE_DIRECTORIES
         PRIVATE
         PRIVATE
@@ -84,6 +85,7 @@ ly_add_target(
         multiplayersample_autogen_files.cmake
         multiplayersample_autogen_files.cmake
         multiplayersample_files.cmake
         multiplayersample_files.cmake
         multiplayersample_client_files.cmake
         multiplayersample_client_files.cmake
+        multiplayersample_server_files.cmake
         ${pal_dir}/multiplayersample_${PAL_PLATFORM_NAME_LOWERCASE}_files.cmake
         ${pal_dir}/multiplayersample_${PAL_PLATFORM_NAME_LOWERCASE}_files.cmake
     INCLUDE_DIRECTORIES
     INCLUDE_DIRECTORIES
         PRIVATE
         PRIVATE

+ 36 - 24
Gem/Code/Source/Components/NetworkMatchComponent.cpp

@@ -11,17 +11,12 @@
 #include <MultiplayerSampleTypes.h>
 #include <MultiplayerSampleTypes.h>
 #include <UiGameOverBus.h>
 #include <UiGameOverBus.h>
 
 
-#include <GameState/GameStateMatchEnded.h>
-#include <GameState/GameStateMatchInProgress.h>
-#include <GameState/GameStatePreparingMatch.h>
 #include <Source/Components/Multiplayer/MatchPlayerCoinsComponent.h>
 #include <Source/Components/Multiplayer/MatchPlayerCoinsComponent.h>
 #include <Source/Components/Multiplayer/PlayerIdentityComponent.h>
 #include <Source/Components/Multiplayer/PlayerIdentityComponent.h>
 #include <Source/Components/NetworkTeleportCompatibleComponent.h>
 #include <Source/Components/NetworkTeleportCompatibleComponent.h>
 #include <Source/Components/NetworkHealthComponent.h>
 #include <Source/Components/NetworkHealthComponent.h>
 #include <Source/Components/NetworkMatchComponent.h>
 #include <Source/Components/NetworkMatchComponent.h>
 #include <Source/Components/NetworkRandomComponent.h>
 #include <Source/Components/NetworkRandomComponent.h>
-#include <GameState/GameStateRequestBus.h>
-#include <GameState/GameStateWaitingForPlayers.h>
 
 
 #include "NetworkRandomComponent.h"
 #include "NetworkRandomComponent.h"
 #include "Multiplayer/GemSpawnerComponent.h"
 #include "Multiplayer/GemSpawnerComponent.h"
@@ -34,6 +29,14 @@
 #   include <LyShine/Bus/UiCursorBus.h>
 #   include <LyShine/Bus/UiCursorBus.h>
 #endif
 #endif
 
 
+#if AZ_TRAIT_SERVER
+#   include <GameState/GameStateRequestBus.h>
+#   include <GameState/GameStateWaitingForPlayers.h>
+#   include <GameState/GameStatePreparingMatch.h>
+#   include <GameState/GameStateMatchInProgress.h>
+#   include <GameState/GameStateMatchEnded.h>
+#endif
+
 namespace MultiplayerSample
 namespace MultiplayerSample
 {
 {
     AZ_ENUM_DEFINE_REFLECT_UTILITIES(AllowedPlayerActions);
     AZ_ENUM_DEFINE_REFLECT_UTILITIES(AllowedPlayerActions);
@@ -160,6 +163,12 @@ namespace MultiplayerSample
         RoundRestTimeRemainingAddEvent(handler);
         RoundRestTimeRemainingAddEvent(handler);
     }
     }
 
 
+    float NetworkMatchComponent::GetRestDurationBetweenMatches() const
+    {
+        return NetworkMatchComponentBase::GetRestDurationBetweenMatches();
+    }
+
+
 #if AZ_TRAIT_SERVER
 #if AZ_TRAIT_SERVER
     void NetworkMatchComponent::OnPlayerActivated(Multiplayer::NetEntityId playerEntity)
     void NetworkMatchComponent::OnPlayerActivated(Multiplayer::NetEntityId playerEntity)
     {
     {
@@ -214,26 +223,28 @@ namespace MultiplayerSample
             AZ::SimpleLcgRandom randomNumberGenerator(aznumeric_cast<int64_t>(AZ::GetElapsedTimeMs()));
             AZ::SimpleLcgRandom randomNumberGenerator(aznumeric_cast<int64_t>(AZ::GetElapsedTimeMs()));
             m_playerNameRandomStartingIndexPrefix = randomNumberGenerator.GetRandom() % AutoAssignedPlayerNamePrefix.size();
             m_playerNameRandomStartingIndexPrefix = randomNumberGenerator.GetRandom() % AutoAssignedPlayerNamePrefix.size();
             m_playerNameRandomStartingIndexPostfix = randomNumberGenerator.GetRandom() % AutoAssignedPlayerNamePostfix.size();
             m_playerNameRandomStartingIndexPostfix = randomNumberGenerator.GetRandom() % AutoAssignedPlayerNamePostfix.size();
-        #endif
+        
 
 
-        GameState::GameStateRequests::AddGameStateFactoryOverrideForType<GameStateWaitingForPlayers>([this]()
-            {
-                return AZStd::make_shared<GameStateWaitingForPlayers>(this);
-            });
-        GameState::GameStateRequests::AddGameStateFactoryOverrideForType<GameStatePreparingMatch>([this]()
-            {
-                return AZStd::make_shared<GameStatePreparingMatch>(this);
-            });
-        GameState::GameStateRequests::AddGameStateFactoryOverrideForType<GameStateMatchInProgress>([this]()
-            {
-                return AZStd::make_shared<GameStateMatchInProgress>(this);
-            });
-        GameState::GameStateRequests::AddGameStateFactoryOverrideForType<GameStateMatchEnded>([this]()
-            {
-                return AZStd::make_shared<GameStateMatchEnded>(this);
-            });
+            GameState::GameStateRequests::AddGameStateFactoryOverrideForType<GameStateWaitingForPlayers>([this]()
+                {
+                    return AZStd::make_shared<GameStateWaitingForPlayers>(this);
+                });
+            GameState::GameStateRequests::AddGameStateFactoryOverrideForType<GameStatePreparingMatch>([this]()
+                {
+                    return AZStd::make_shared<GameStatePreparingMatch>(this);
+                });
+            GameState::GameStateRequests::AddGameStateFactoryOverrideForType<GameStateMatchInProgress>([this]()
+                {
+                    return AZStd::make_shared<GameStateMatchInProgress>(this);
+                });
+
+            GameState::GameStateRequests::AddGameStateFactoryOverrideForType<GameStateMatchEnded>([this]()
+                {
+                    return AZStd::make_shared<GameStateMatchEnded>(this);
+                });
 
 
-        GameState::GameStateRequests::CreateAndPushNewOverridableGameStateOfType<GameStateWaitingForPlayers>();
+            GameState::GameStateRequests::CreateAndPushNewOverridableGameStateOfType<GameStateWaitingForPlayers>();
+        #endif
 
 
         PlayerMatchLifecycleBus::Handler::BusConnect();
         PlayerMatchLifecycleBus::Handler::BusConnect();
     }
     }
@@ -242,13 +253,14 @@ namespace MultiplayerSample
     {
     {
         PlayerMatchLifecycleBus::Handler::BusDisconnect();
         PlayerMatchLifecycleBus::Handler::BusDisconnect();
 
 
+#if AZ_TRAIT_SERVER
         GameState::GameStateRequestBus::Broadcast(&GameState::GameStateRequestBus::Events::PopAllGameStates);
         GameState::GameStateRequestBus::Broadcast(&GameState::GameStateRequestBus::Events::PopAllGameStates);
 
 
         GameState::GameStateRequests::RemoveGameStateFactoryOverrideForType<GameStateWaitingForPlayers>();
         GameState::GameStateRequests::RemoveGameStateFactoryOverrideForType<GameStateWaitingForPlayers>();
         GameState::GameStateRequests::RemoveGameStateFactoryOverrideForType<GameStatePreparingMatch>();
         GameState::GameStateRequests::RemoveGameStateFactoryOverrideForType<GameStatePreparingMatch>();
         GameState::GameStateRequests::RemoveGameStateFactoryOverrideForType<GameStateMatchInProgress>();
         GameState::GameStateRequests::RemoveGameStateFactoryOverrideForType<GameStateMatchInProgress>();
         GameState::GameStateRequests::RemoveGameStateFactoryOverrideForType<GameStateMatchEnded>();
         GameState::GameStateRequests::RemoveGameStateFactoryOverrideForType<GameStateMatchEnded>();
-#if AZ_TRAIT_SERVER
+
         m_roundTickEvent.RemoveFromQueue();
         m_roundTickEvent.RemoveFromQueue();
         m_restTickEvent.RemoveFromQueue();
         m_restTickEvent.RemoveFromQueue();
 #endif
 #endif

+ 4 - 0
Gem/Code/Source/Components/NetworkMatchComponent.h

@@ -65,6 +65,8 @@ namespace MultiplayerSample
         //! Adds an event handler to the round number rest remaining AZ::Event
         //! Adds an event handler to the round number rest remaining AZ::Event
         //! @param handler the handler to add the the requested component event
         //! @param handler the handler to add the the requested component event
         virtual void AddRoundRestTimeRemainingEventHandler(AZ::Event<RoundTimeSec>::Handler& handler) = 0;
         virtual void AddRoundRestTimeRemainingEventHandler(AZ::Event<RoundTimeSec>::Handler& handler) = 0;
+
+        virtual float GetRestDurationBetweenMatches() const = 0;
     };
     };
 
 
 
 
@@ -102,6 +104,8 @@ namespace MultiplayerSample
         void AddRoundNumberEventHandler(AZ::Event<uint16_t>::Handler& handler) override;
         void AddRoundNumberEventHandler(AZ::Event<uint16_t>::Handler& handler) override;
         void AddRoundTimeRemainingEventHandler(AZ::Event<RoundTimeSec>::Handler& handler) override;
         void AddRoundTimeRemainingEventHandler(AZ::Event<RoundTimeSec>::Handler& handler) override;
         void AddRoundRestTimeRemainingEventHandler(AZ::Event<RoundTimeSec>::Handler& handler) override;
         void AddRoundRestTimeRemainingEventHandler(AZ::Event<RoundTimeSec>::Handler& handler) override;
+        float GetRestDurationBetweenMatches() const override;
+
         //! @}
         //! @}
 
 
 #if AZ_TRAIT_SERVER
 #if AZ_TRAIT_SERVER

+ 1 - 1
Gem/Code/Source/Components/UI/UiGameOverComponent.cpp

@@ -74,7 +74,7 @@ namespace MultiplayerSample
     {
     {
         if (enabled)
         if (enabled)
         {
         {
-            m_secondsRemainingUntilNewMatch = RestSecondsBetweenMatches;
+            m_secondsRemainingUntilNewMatch = aznumeric_cast<uint16_t>(AZStd::floor(AZ::Interface<INetworkMatch>::Get()->GetRestDurationBetweenMatches()));
             DisplaySecondsRemainingUI(m_secondsRemainingUntilNewMatch);
             DisplaySecondsRemainingUI(m_secondsRemainingUntilNewMatch);
             m_onSecondsRemainingChanged.Enqueue(AZ::TimeMs{ 1000 }, true);
             m_onSecondsRemainingChanged.Enqueue(AZ::TimeMs{ 1000 }, true);
         }
         }

+ 0 - 2
Gem/Code/Source/Components/UI/UiGameOverComponent.h

@@ -20,8 +20,6 @@ namespace MultiplayerSample
         , public UiGameOverBus::Handler
         , public UiGameOverBus::Handler
     {
     {
     public:
     public:
-        static constexpr uint16_t RestSecondsBetweenMatches = 5;
-
         AZ_COMPONENT(UiGameOverComponent, "{37a2de13-a8fa-4ee1-8652-e17253137f62}");
         AZ_COMPONENT(UiGameOverComponent, "{37a2de13-a8fa-4ee1-8652-e17253137f62}");
 
 
         static void Reflect(AZ::ReflectContext* context);
         static void Reflect(AZ::ReflectContext* context);

+ 5 - 15
Gem/Code/Source/GameState/GameStateMatchEnded.cpp

@@ -9,23 +9,19 @@
 #include <GameState/GameStateRequestBus.h>
 #include <GameState/GameStateRequestBus.h>
 #include <Source/GameState/GameStateMatchEnded.h>
 #include <Source/GameState/GameStateMatchEnded.h>
 #include <Source/GameState/GameStatePreparingMatch.h>
 #include <Source/GameState/GameStatePreparingMatch.h>
+#include <AzCore/Time/ITime.h>
 
 
 namespace MultiplayerSample
 namespace MultiplayerSample
 {    
 {    
     GameStateMatchEnded::GameStateMatchEnded([[maybe_unused]] NetworkMatchComponentController* controller)
     GameStateMatchEnded::GameStateMatchEnded([[maybe_unused]] NetworkMatchComponentController* controller)
     {
     {
-#if AZ_TRAIT_SERVER
         m_controller = controller;	    
         m_controller = controller;	    
-#endif	    
     }
     }
 
 
     void GameStateMatchEnded::OnEnter()
     void GameStateMatchEnded::OnEnter()
     {
     {
-#if AZ_TRAIT_SERVER
         m_controller->EndMatch();
         m_controller->EndMatch();
-#endif
-        m_finishingTime = AZ::TimeMs{ 3000 };
-        m_finishingEvent.Enqueue(AZ::Time::ZeroTimeMs, true);
+        m_finishingEvent.Enqueue(AZ::SecondsToTimeMs(m_controller->GetRestDurationBetweenMatches()));
 
 
         GameplayEffectsNotificationBus::Broadcast(&GameplayEffectsNotificationBus::Events::OnEffect, SoundEffect::GameEnd);
         GameplayEffectsNotificationBus::Broadcast(&GameplayEffectsNotificationBus::Events::OnEffect, SoundEffect::GameEnd);
     }
     }
@@ -35,15 +31,9 @@ namespace MultiplayerSample
         m_finishingEvent.RemoveFromQueue();
         m_finishingEvent.RemoveFromQueue();
     }
     }
 
 
-    void GameStateMatchEnded::OnFinishedMatchTick()
+    void GameStateMatchEnded::OnFinishedMatch()
     {
     {
-        m_finishingTime -= m_finishingEvent.TimeInQueueMs();
-        if (m_finishingTime <= AZ::Time::ZeroTimeMs)
-        {
-            m_finishingEvent.RemoveFromQueue();
-
-            const auto state = GameState::GameStateRequests::CreateNewOverridableGameStateOfType<GameStatePreparingMatch>();
-            GameState::GameStateRequestBus::Broadcast(&GameState::GameStateRequestBus::Events::ReplaceActiveGameState, state);
-        }
+        const auto state = GameState::GameStateRequests::CreateNewOverridableGameStateOfType<GameStatePreparingMatch>();
+        GameState::GameStateRequestBus::Broadcast(&GameState::GameStateRequestBus::Events::ReplaceActiveGameState, state);
     }
     }
 }
 }

+ 2 - 5
Gem/Code/Source/GameState/GameStateMatchEnded.h

@@ -29,15 +29,12 @@ namespace MultiplayerSample
         //! }@
         //! }@
 
 
     private:
     private:
-#if AZ_TRAIT_SERVER
         NetworkMatchComponentController* m_controller = nullptr;
         NetworkMatchComponentController* m_controller = nullptr;
-#endif
-        AZ::TimeMs m_finishingTime = AZ::Time::ZeroTimeMs;
 
 
-        void OnFinishedMatchTick();
+        void OnFinishedMatch();
         AZ::ScheduledEvent m_finishingEvent{ [this]()
         AZ::ScheduledEvent m_finishingEvent{ [this]()
         {
         {
-            OnFinishedMatchTick();
+            OnFinishedMatch();
         }, AZ::Name("GameStateMatchEnded") };
         }, AZ::Name("GameStateMatchEnded") };
     };
     };
 }
 }

+ 0 - 9
Gem/Code/multiplayersample_files.cmake

@@ -76,15 +76,6 @@ set(FILES
     Source/Components/RpcTesterComponent.cpp
     Source/Components/RpcTesterComponent.cpp
     Source/Components/RpcTesterComponent.h
     Source/Components/RpcTesterComponent.h
 
 
-    Source/GameState/GameStateMatchEnded.h
-    Source/GameState/GameStateMatchEnded.cpp
-    Source/GameState/GameStateMatchInProgress.h
-    Source/GameState/GameStateMatchInProgress.cpp
-    Source/GameState/GameStatePreparingMatch.h
-    Source/GameState/GameStatePreparingMatch.cpp
-    Source/GameState/GameStateWaitingForPlayers.h
-    Source/GameState/GameStateWaitingForPlayers.cpp
-
     Source/Weapons/BaseWeapon.cpp
     Source/Weapons/BaseWeapon.cpp
     Source/Weapons/BaseWeapon.h
     Source/Weapons/BaseWeapon.h
     Source/Weapons/IWeapon.h
     Source/Weapons/IWeapon.h

+ 17 - 0
Gem/Code/multiplayersample_server_files.cmake

@@ -0,0 +1,17 @@
+#
+# Copyright (c) Contributors to the Open 3D Engine Project
+#
+# SPDX-License-Identifier: Apache-2.0 OR MIT
+#
+#
+
+set(FILES
+    Source/GameState/GameStateMatchInProgress.h
+    Source/GameState/GameStateMatchInProgress.cpp
+    Source/GameState/GameStatePreparingMatch.h
+    Source/GameState/GameStatePreparingMatch.cpp
+    Source/GameState/GameStateWaitingForPlayers.h
+    Source/GameState/GameStateWaitingForPlayers.cpp
+    Source/GameState/GameStateMatchEnded.cpp
+    Source/GameState/GameStateMatchEnded.h
+)

ファイルの差分が大きいため隠しています
+ 1004 - 174
UICanvases/BasicHUD.uicanvas


この差分においてかなりの量のファイルが変更されているため、一部のファイルを表示していません