浏览代码

Update health component to use an RPC to communicate damage

Signed-off-by: puvvadar <[email protected]>
puvvadar 4 年之前
父节点
当前提交
c6f84a6d17

+ 6 - 2
Gem/Code/Source/AutoGen/NetworkHealthComponent.AutoComponent.xml

@@ -3,8 +3,8 @@
 <Component
     Name="NetworkHealthComponent" 
     Namespace="MultiplayerSample" 
-    OverrideComponent="true" 
-    OverrideController="false" 
+    OverrideComponent="false" 
+    OverrideController="true" 
     OverrideInclude="Source/Components/NetworkHealthComponent.h"
     xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
 
@@ -12,4 +12,8 @@
 
     <ArchetypeProperty Type="float" Name="MaxHealth" Init="100.0f" ExposeToEditor="true" Description="Maximum health" />
 
+    <RemoteProcedure Name="SendHealthDelta" InvokeFrom="Server" HandleOn="Authority" IsPublic="true" IsReliable="false" GenerateEventBindings="false" Description="Health changed RPC">
+        <Param Type="float" Name="deltaHealth" />
+    </RemoteProcedure>
+
 </Component>

+ 8 - 30
Gem/Code/Source/Components/NetworkHealthComponent.cpp

@@ -9,47 +9,25 @@
 
 namespace MultiplayerSample
 {
-    void NetworkHealthComponent::NetworkHealthComponent::Reflect(AZ::ReflectContext* context)
+    NetworkHealthComponentController::NetworkHealthComponentController(NetworkHealthComponent& parent)
+        : NetworkHealthComponentControllerBase(parent)
     {
-        AZ::SerializeContext* serializeContext = azrtti_cast<AZ::SerializeContext*>(context);
-        if (serializeContext)
-        {
-            serializeContext->Class<NetworkHealthComponent, NetworkHealthComponentBase>()
-                ->Version(1);
-        }
-        NetworkHealthComponentBase::Reflect(context);
     }
 
-    NetworkHealthComponent::NetworkHealthComponent()
-        : m_healthEventHandler([this](const float& health) { OnHealthChangedEvent(health); })
+    void NetworkHealthComponentController::OnActivate([[maybe_unused]] Multiplayer::EntityIsMigrating entityIsMigrating)
     {
         ;
     }
 
-    void NetworkHealthComponent::OnInit()
+    void NetworkHealthComponentController::OnDeactivate([[maybe_unused]] Multiplayer::EntityIsMigrating entityIsMigrating)
     {
         ;
     }
 
-    void NetworkHealthComponent::OnActivate([[maybe_unused]] Multiplayer::EntityIsMigrating entityIsMigrating)
+    void NetworkHealthComponentController::HandleSendHealthDelta([[maybe_unused]] AzNetworking::IConnection* invokingConnection, const float& healthDelta)
     {
-        HealthAddEvent(m_healthEventHandler);
-    }
-
-    void NetworkHealthComponent::OnDeactivate([[maybe_unused]] Multiplayer::EntityIsMigrating entityIsMigrating)
-    {
-        ;
-    }
-
-    void NetworkHealthComponent::SetHealth(float updatedHealth)
-    {
-        updatedHealth = AZStd::max(0.f, AZStd::min(updatedHealth, GetMaxHealth()));
-        static_cast<NetworkHealthComponentController*>(GetController())->SetHealth(updatedHealth);
-    }
-
-    void NetworkHealthComponent::OnHealthChangedEvent([[maybe_unused]] const float& health)
-    {
-        // Hook for gameplay events such as player death, player revive, showing damage numbers, etc.
-        ;
+        float health = GetHealth();
+        health = AZStd::max(0.0f, AZStd::min(GetMaxHealth(), health + healthDelta));
+        SetHealth(health);
     }
 }

+ 4 - 16
Gem/Code/Source/Components/NetworkHealthComponent.h

@@ -11,27 +11,15 @@
 
 namespace MultiplayerSample
 {
-    class NetworkHealthComponent
-        : public NetworkHealthComponentBase
+    class NetworkHealthComponentController
+        : public NetworkHealthComponentControllerBase
     {
     public:
-        AZ_MULTIPLAYER_COMPONENT(MultiplayerSample::NetworkHealthComponent, s_networkHealthComponentConcreteUuid, MultiplayerSample::NetworkHealthComponentBase);
+        NetworkHealthComponentController(NetworkHealthComponent& parent);
 
-        static void Reflect(AZ::ReflectContext* context);
-
-        NetworkHealthComponent();
-
-        void OnInit() override;
         void OnActivate(Multiplayer::EntityIsMigrating entityIsMigrating) override;
         void OnDeactivate(Multiplayer::EntityIsMigrating entityIsMigrating) override;
 
-        //! Component accessor to set health, accounting for a configurable max and floor of 0
-        //! @param updatedHealth the new health value
-        void SetHealth(float updatedHealth);
-
-    private:
-        void OnHealthChangedEvent(const float& health);
-
-        AZ::Event<float>::Handler m_healthEventHandler;
+        void HandleSendHealthDelta(AzNetworking::IConnection* invokingConnection, const float& healthDelta) override;
     };
 }

+ 3 - 4
Gem/Code/Source/Components/NetworkWeaponsComponent.cpp

@@ -100,7 +100,7 @@ namespace MultiplayerSample
             {
                 Multiplayer::ConstNetworkEntityHandle entityHandle = Multiplayer::GetMultiplayer()->GetNetworkEntityManager()->GetEntity(hitEntity.m_hitNetEntityId);
 
-                if (entityHandle != nullptr)
+                if (entityHandle != nullptr && entityHandle.GetEntity() != nullptr)
                 {
                     [[maybe_unused]] const AZ::Vector3& hitCenter = hitInfo.m_hitEvent.m_hitTransform.GetTranslation();
                     [[maybe_unused]] const AZ::Vector3& hitPoint = hitEntity.m_hitPosition;
@@ -108,7 +108,7 @@ namespace MultiplayerSample
                     // Look for physics rigid body component and make impact updates
                     
                     // Look for health component and directly update health based on hit parameters
-                    NetworkHealthComponent* healthComponent = FindComponent<NetworkHealthComponent>();
+                    NetworkHealthComponent* healthComponent = entityHandle.GetEntity()->FindComponent<NetworkHealthComponent>();
                     if (healthComponent)
                     {
                         const WeaponParams& weaponParams = hitInfo.m_weapon.GetParams();
@@ -118,9 +118,8 @@ namespace MultiplayerSample
                         float hitDistance = 1.f;
                         float maxDistance = 1.f;
                         float damage = effect.m_hitMagnitude * powf((effect.m_hitFalloff * (1.0f - hitDistance / maxDistance)), effect.m_hitExponent);
-                        const float& originalHealth = healthComponent->GetHealth();
+                        healthComponent->SendHealthDelta(damage * -1.0f);
 
-                        healthComponent->SetHealth(originalHealth - damage);
                     }
                 }
             }