Bläddra i källkod

Merge pull request #293 from aws-lumberyard-dev/pruiksma/decal_spawner_2

Added a level component for spawning decals over a bus.
Ken Pruiksma 2 år sedan
förälder
incheckning
78fcfdbb45

+ 122 - 0
Gem/Code/Include/DecalBus.h

@@ -0,0 +1,122 @@
+/*
+ * Copyright (c) Contributors to the Open 3D Engine Project.
+ * For complete copyright and license terms please see the LICENSE at the root of this distribution.
+ *
+ * SPDX-License-Identifier: Apache-2.0 OR MIT
+ *
+ */
+
+#pragma once
+
+#include <AzCore/Math/Transform.h>
+#include <AzCore/EBus/EBus.h>
+#include <Atom/RPI.Public/Scene.h>
+
+namespace MultiplayerSample
+{
+    struct SpawnDecalConfig
+    {
+        AZ_RTTI(MultiplayerSample::SpawnDecalConfig, "{FC3DA616-174B-48FD-9BFB-BC277132FB47}");
+        inline static void Reflect(AZ::ReflectContext* context);
+
+        AZ::Data::AssetId m_materialAssetId; // Asset Id of the material.
+        float m_scale = 1.0f;                // Scale in meters.
+        float m_opacity = 1.0f;              // How visible the decal is.
+        float m_attenuationAngle = 1.0f;     // How much to attenuate based on the angle of the geometry vs the decal.
+        float m_lifeTimeSec = 0.0f;          // Length of time the decal lives between fading in and out, in seconds.
+        float m_fadeInTimeSec = 0.1f;        // Time it takes the decal to fade in, in seconds.
+        float m_fadeOutTimeSec = 1.0f;       // Time it takes the decal to fade out, in seconds.
+        float m_thickness = 1.0f;            // How thick the decal should be on the z axis.
+        uint8_t m_sortKey = 0;               // Higher numbers sort in front of lower numbers.
+    };
+
+    void SpawnDecalConfig::Reflect(AZ::ReflectContext* context)
+    {
+        if (AZ::SerializeContext* serializeContext = azrtti_cast<AZ::SerializeContext*>(context))
+        {
+            serializeContext->Class<MultiplayerSample::SpawnDecalConfig>()
+                ->Version(0)
+                ->Field("MaterialAssetId", &SpawnDecalConfig::m_materialAssetId)
+                ->Field("Scale", &SpawnDecalConfig::m_scale)
+                ->Field("Opacity", &SpawnDecalConfig::m_opacity)
+                ->Field("AttenuationAngle", &SpawnDecalConfig::m_attenuationAngle)
+                ->Field("LifeTimeSec", &SpawnDecalConfig::m_lifeTimeSec)
+                ->Field("FadeInTimeSec", &SpawnDecalConfig::m_fadeInTimeSec)
+                ->Field("FadeOutTimeSec", &SpawnDecalConfig::m_fadeOutTimeSec)
+                ->Field("Thickness", &SpawnDecalConfig::m_thickness)
+                ->Field("SortKey", &SpawnDecalConfig::m_sortKey)
+                ;
+
+            if (auto editContext = serializeContext->GetEditContext())
+            {
+                editContext->Class<SpawnDecalConfig>("SpawnDecalConfig", "Configuration settings for spawning a decal.")
+                    ->ClassElement(AZ::Edit::ClassElements::EditorData, "")
+                    ->Attribute(AZ::Edit::Attributes::AutoExpand, true)
+                    ->DataElement(AZ::Edit::UIHandlers::Default, &SpawnDecalConfig::m_materialAssetId, "Material", "The material for the decal.")
+                    ->DataElement(AZ::Edit::UIHandlers::Slider, &SpawnDecalConfig::m_scale, "Scale", "The scale of the decal.")
+                        ->Attribute(AZ::Edit::Attributes::Min, 0.01f)
+                        ->Attribute(AZ::Edit::Attributes::Max, 100.0f)
+                        ->Attribute(AZ::Edit::Attributes::SoftMin, 0.01f)
+                        ->Attribute(AZ::Edit::Attributes::SoftMax, 5.0f)
+                    ->DataElement(AZ::Edit::UIHandlers::Slider, &SpawnDecalConfig::m_opacity, "Opacity", "The opacity of the decal.")
+                        ->Attribute(AZ::Edit::Attributes::Min, 0.0f)
+                        ->Attribute(AZ::Edit::Attributes::Max, 1.0f)
+                    ->DataElement(AZ::Edit::UIHandlers::Slider, &SpawnDecalConfig::m_attenuationAngle, "Angle attenuation", "How much to attenuate the opacity of the decal based on the different in the angle between the decal and the surface.")
+                        ->Attribute(AZ::Edit::Attributes::Min, 0.0f)
+                        ->Attribute(AZ::Edit::Attributes::Max, 1.0f)
+                    ->DataElement(AZ::Edit::UIHandlers::Default, &SpawnDecalConfig::m_lifeTimeSec, "Life time", "Length of time the decal lives between fading in and out, in seconds")
+                        ->Attribute(AZ::Edit::Attributes::Min, 0.0f)
+                    ->DataElement(AZ::Edit::UIHandlers::Default, &SpawnDecalConfig::m_fadeInTimeSec, "Fade in time", "How long the decal should spend fading in when it is first spawned, in seconds.")
+                        ->Attribute(AZ::Edit::Attributes::Min, 0.0f)
+                    ->DataElement(AZ::Edit::UIHandlers::Default, &SpawnDecalConfig::m_fadeOutTimeSec, "Fade out time", "How long the decal should spend fading out at the end of its life time, in seconds.")
+                        ->Attribute(AZ::Edit::Attributes::Min, 0.0f)
+                    ->DataElement(AZ::Edit::UIHandlers::Default, &SpawnDecalConfig::m_thickness, "Thickness", "How thick the decal should be on the z axis.")
+                        ->Attribute(AZ::Edit::Attributes::Min, 0.0f)
+                    ->DataElement(AZ::Edit::UIHandlers::Default, &SpawnDecalConfig::m_sortKey, "Sort key", "Used to sort the decal with other decals. Higher numbered decals show on top of lower number decals.")
+                    ;
+            }
+        }
+
+        if (auto behaviorContext = azrtti_cast<AZ::BehaviorContext*>(context))
+        {
+            behaviorContext->Class<SpawnDecalConfig>("SpawnDecalConfig")
+                ->Attribute(AZ::Script::Attributes::Scope, AZ::Script::Attributes::ScopeFlags::Common)
+                ->Attribute(AZ::Script::Attributes::Category, "Graphics")
+                ->Attribute(AZ::Script::Attributes::Module, "decals")
+                ->Constructor()
+                ->Constructor<const SpawnDecalConfig&>()
+                ->Property("material", BehaviorValueProperty(&SpawnDecalConfig::m_materialAssetId))
+                ->Property("scale", BehaviorValueProperty(&SpawnDecalConfig::m_scale))
+                ->Property("opacity", BehaviorValueProperty(&SpawnDecalConfig::m_opacity))
+                ->Property("attenuationAngle", BehaviorValueProperty(&SpawnDecalConfig::m_attenuationAngle))
+                ->Property("lifeTimeSec", BehaviorValueProperty(&SpawnDecalConfig::m_lifeTimeSec))
+                ->Property("fadeInTimeSec", BehaviorValueProperty(&SpawnDecalConfig::m_fadeInTimeSec))
+                ->Property("fadeOutTimeSec", BehaviorValueProperty(&SpawnDecalConfig::m_fadeOutTimeSec))
+                ->Property("thickness", BehaviorValueProperty(&SpawnDecalConfig::m_thickness))
+                ->Property("sortKey", BehaviorValueProperty(&SpawnDecalConfig::m_sortKey))
+                ;
+        }
+    }
+
+    class DecalRequests
+        : public AZ::EBusTraits
+    {
+    public:
+        static const AZ::EBusHandlerPolicy HandlerPolicy = AZ::EBusHandlerPolicy::Single;
+        static const AZ::EBusAddressPolicy AddressPolicy = AZ::EBusAddressPolicy::ById;
+        using BusIdType = AZ::RPI::SceneId;
+
+        AZ_RTTI(MultiplayerSample::DecalRequests, "{A3643473-25ED-4F86-8BEE-D65A1A54867B}");
+        virtual ~DecalRequests() = default;
+
+        /**
+         * \brief Spawn a decal
+         * \param worldTm Where to spawn the decal.
+         * \param materialAssetId The asset ID of the material to use for the decal
+         * \param config The configuration of the decal to spawn (opacity, scale, etc).
+         */
+        virtual void SpawnDecal(const AZ::Transform& worldTm, const SpawnDecalConfig& config) = 0;
+    };
+
+    using DecalRequestBus = AZ::EBus<DecalRequests>;
+}

+ 3 - 3
Gem/Code/Include/WeaponNotificationBus.h

@@ -19,13 +19,13 @@ namespace MultiplayerSample
         virtual ~WeaponNotifications() = default;
 
         //! Called on a local player that has activated a weapon.
-        virtual void OnWeaponActivate([[maybe_unused]] const AZ::Transform& transform) {}
+        virtual void OnWeaponActivate([[maybe_unused]] AZ::EntityId shooterEntityId, [[maybe_unused]] const AZ::Transform& transform) {}
 
         //! Called on a local player that has predictively impacted something with a weapon.
-        virtual void OnWeaponImpact([[maybe_unused]] const AZ::Transform& transform) {}
+        virtual void OnWeaponImpact([[maybe_unused]] AZ::EntityId shooterEntityId, [[maybe_unused]] const AZ::Transform& transform, [[maybe_unused]] AZ::EntityId hitEntityId) {}
 
         //! Called on a local player that has confirmed damaged something with a weapon.
-        virtual void OnWeaponDamage([[maybe_unused]] const AZ::Transform& transform) {}
+        virtual void OnWeaponDamage([[maybe_unused]] AZ::EntityId shooterEntityId, [[maybe_unused]] const AZ::Transform& transform, [[maybe_unused]] AZ::EntityId hitEntityId) {}
 
         //! Called on a local player that has been confirmed to hit a player with a weapon.
         virtual void OnConfirmedHitPlayer([[maybe_unused]] AZ::EntityId byPlayerEntity, [[maybe_unused]] AZ::EntityId otherPlayerEntity) {}

+ 1 - 1
Gem/Code/Source/AutoGen/EnergyBallComponent.AutoComponent.xml

@@ -30,6 +30,6 @@
     </RemoteProcedure>
 
     <RemoteProcedure Name="RPC_BallExplosion" InvokeFrom="Authority" HandleOn="Client" IsPublic="true" IsReliable="true" GenerateEventBindings="true" Description="Triggered on clients whenever an energy ball explodes.">
-        <Param Type="AZ::Vector3" Name="Location"/>
+        <Param Type="HitEvent" Name="HitEvent"/>
     </RemoteProcedure>
 </Component>

+ 30 - 11
Gem/Code/Source/Components/Multiplayer/EnergyBallComponent.cpp

@@ -12,6 +12,7 @@
 #include <MultiplayerSampleTypes.h>
 #include <AzCore/Component/TransformBus.h>
 #include <AzFramework/Physics/RigidBodyBus.h>
+#include <WeaponNotificationBus.h>
 
 #if AZ_TRAIT_CLIENT
 #   include <PopcornFX/PopcornFXBus.h>
@@ -52,11 +53,19 @@ namespace MultiplayerSample
         }
     }
 
-    void EnergyBallComponent::HandleRPC_BallExplosion([[maybe_unused]] AzNetworking::IConnection* invokingConnection, const AZ::Vector3& location)
+    void EnergyBallComponent::HandleRPC_BallExplosion([[maybe_unused]] AzNetworking::IConnection* invokingConnection, const HitEvent& hitEvent)
     {
-        AZ::Transform transform = AZ::Transform::CreateFromQuaternionAndTranslation(AZ::Quaternion::CreateIdentity(), location);
+        AZ::Transform transform = AZ::Transform::CreateFromQuaternionAndTranslation(AZ::Quaternion::CreateIdentity(), hitEvent.m_target);
         m_effect.TriggerEffect(transform);
 
+        for (const HitEntity& hitEntity : hitEvent.m_hitEntities)
+        {
+            const AZ::Transform hitTransform = AZ::Transform::CreateLookAt(hitEntity.m_hitPosition, hitEntity.m_hitPosition + hitEntity.m_hitNormal, AZ::Transform::Axis::ZPositive);
+            const Multiplayer::ConstNetworkEntityHandle handle = Multiplayer::GetNetworkEntityManager()->GetEntity(hitEntity.m_hitNetEntityId);
+            const AZ::EntityId hitEntityId = handle.Exists() ? handle.GetEntity()->GetId() : AZ::EntityId();
+            WeaponNotificationBus::Broadcast(&WeaponNotificationBus::Events::OnWeaponImpact, GetEntity()->GetId(), hitTransform, hitEntityId);
+        }
+
         PopcornFX::PopcornFXEmitterComponentRequests* emitterRequests = PopcornFX::PopcornFXEmitterComponentRequestBus::FindFirstHandler(GetEntity()->GetId());
         if (emitterRequests != nullptr)
         {
@@ -89,6 +98,7 @@ namespace MultiplayerSample
     void EnergyBallComponentController::HandleRPC_LaunchBall([[maybe_unused]] AzNetworking::IConnection* invokingConnection, const AZ::Vector3& startingPosition, const AZ::Vector3& direction, const Multiplayer::NetEntityId& owningNetEntityId)
     {
         m_shooterNetEntityId = owningNetEntityId;
+        m_hitEvent.m_hitEntities.clear();
 
         m_filteredNetEntityIds.clear();
         m_filteredNetEntityIds.insert(owningNetEntityId);
@@ -98,6 +108,9 @@ namespace MultiplayerSample
         // Move the entity to the start position
         GetEntity()->GetTransform()->SetWorldTranslation(startingPosition);
 
+        // We want to sweep our transform during intersect tests to avoid the ball tunneling through targets
+        m_lastSweepTransform = GetEntity()->GetTransform()->GetWorldTM();
+
         Physics::RigidBodyRequestBus::Event(GetEntityId(), &Physics::RigidBodyRequestBus::Events::EnablePhysics);
         Physics::RigidBodyRequestBus::Event(GetEntityId(), &Physics::RigidBodyRequestBus::Events::SetLinearVelocity, direction * GetGatherParams().m_travelSpeed);
 
@@ -114,17 +127,20 @@ namespace MultiplayerSample
         const AZ::Vector3& position = GetEntity()->GetTransform()->GetWorldTM().GetTranslation();
         const HitEffect& effect = GetHitEffect();
 
+        // Sweep from our last checked transform to our current position to avoid tunneling
+        const ActivateEvent activateEvent{ m_lastSweepTransform, position, m_shooterNetEntityId, GetNetEntityId() };
+
         IntersectResults results;
-        const ActivateEvent activateEvent{ GetEntity()->GetTransform()->GetWorldTM(), position, m_shooterNetEntityId, GetNetEntityId() };
         GatherEntities(GetGatherParams(), activateEvent, m_filteredNetEntityIds, results);
+
         if (!results.empty())
         {
-            bool shouldTerminate = false;
             for (const IntersectResult& result : results)
             {
-                shouldTerminate = true;
+                const HitEntity hitEntity{ result.m_position, result.m_normal, result.m_netEntityId };
+                m_hitEvent.m_hitEntities.emplace_back(hitEntity);
 
-                Multiplayer::ConstNetworkEntityHandle handle = Multiplayer::GetMultiplayer()->GetNetworkEntityManager()->GetEntity(result.m_netEntityId);
+                const Multiplayer::ConstNetworkEntityHandle handle = Multiplayer::GetNetworkEntityManager()->GetEntity(result.m_netEntityId);
                 if (handle.Exists())
                 {
                     // Presently set to 1 until we capture falloff range
@@ -149,16 +165,19 @@ namespace MultiplayerSample
                 }
             }
 
-            if (shouldTerminate)
-            {
-                HideEnergyBall();
-            }
+            HideEnergyBall();
         }
+
+        // Update our last sweep transform for the next time we check collision
+        m_lastSweepTransform = GetEntity()->GetTransform()->GetWorldTM();
     }
 
     void EnergyBallComponentController::HideEnergyBall()
     {
-        RPC_BallExplosion(GetEntity()->GetTransform()->GetWorldTM().GetTranslation());
+        m_hitEvent.m_target = GetEntity()->GetTransform()->GetWorldTM().GetTranslation();
+        m_hitEvent.m_shooterNetEntityId = m_shooterNetEntityId;
+        m_hitEvent.m_projectileNetEntityId = GetNetEntityId();
+        RPC_BallExplosion(m_hitEvent);
 
         Physics::RigidBodyRequestBus::Event(GetEntityId(), &Physics::RigidBodyRequestBus::Events::DisablePhysics);
         Physics::RigidBodyRequestBus::Event(GetEntityId(), &Physics::RigidBodyRequestBus::Events::SetLinearVelocity, AZ::Vector3::CreateZero());

+ 4 - 1
Gem/Code/Source/Components/Multiplayer/EnergyBallComponent.h

@@ -25,7 +25,7 @@ namespace MultiplayerSample
 
 #if AZ_TRAIT_CLIENT
         void HandleRPC_BallLaunched(AzNetworking::IConnection* invokingConnection, const AZ::Vector3& location) override;
-        void HandleRPC_BallExplosion(AzNetworking::IConnection* invokingConnection, const AZ::Vector3& location) override;
+        void HandleRPC_BallExplosion(AzNetworking::IConnection* invokingConnection, const HitEvent& hitEvent) override;
 #endif
 
     private:
@@ -54,8 +54,11 @@ namespace MultiplayerSample
         }, AZ::Name("EnergyBallCheckForCollisions") };
 
         AZ::Vector3 m_direction = AZ::Vector3::CreateZero();
+        AZ::Transform m_lastSweepTransform = AZ::Transform::CreateIdentity();
         Multiplayer::NetEntityId m_shooterNetEntityId = Multiplayer::InvalidNetEntityId;
         NetEntityIdSet m_filteredNetEntityIds;
+
+        HitEvent m_hitEvent;
 #endif
     };
 }

+ 1 - 1
Gem/Code/Source/Components/Multiplayer/EnergyCannonComponent.cpp

@@ -85,7 +85,7 @@ namespace MultiplayerSample
                 const AZ::Transform& cannonTm = GetEntity()->GetTransform()->GetWorldTM();
                 const AZ::Vector3 forward = cannonTm.TransformVector(AZ::Vector3::CreateAxisY(-1.f));
                 const AZ::Vector3 effectOffset = GetFiringEffect().GetEffectOffset();
-                ballComponent->RPC_LaunchBall(cannonTm.GetTranslation() + cannonTm.TransformVector(effectOffset), forward, GetNetEntityId());
+                ballComponent->RPC_LaunchBall(cannonTm.TransformPoint(effectOffset), forward, GetNetEntityId());
 
                 // Enqueue our ball kill event
                 m_killEvent.Enqueue(GetBallLifetimeMs(), false);

+ 28 - 18
Gem/Code/Source/Components/NetworkWeaponsComponent.cpp

@@ -28,7 +28,7 @@
 namespace MultiplayerSample
 {
     AZ_CVAR(bool, cl_WeaponsDrawDebug, false, nullptr, AZ::ConsoleFunctorFlags::Null, "If enabled, weapons will debug draw various important events");
-    AZ_CVAR(float, cl_WeaponsDrawDebugSize, 0.25f, nullptr, AZ::ConsoleFunctorFlags::Null, "The size of sphere to debug draw during weapon events");
+    AZ_CVAR(float, cl_WeaponsDrawDebugSize, 0.125f, nullptr, AZ::ConsoleFunctorFlags::Null, "The size of sphere to debug draw during weapon events");
     AZ_CVAR(float, cl_WeaponsDrawDebugDurationSec, 10.0f, nullptr, AZ::ConsoleFunctorFlags::Null, "The number of seconds to display debug draw data");
     AZ_CVAR(float, sv_WeaponsImpulseScalar, 750.0f, nullptr, AZ::ConsoleFunctorFlags::Null, "A fudge factor for imparting impulses on rigid bodies due to weapon hits");
     AZ_CVAR(float, sv_WeaponsStartPositionClampRange, 1.f, nullptr, AZ::ConsoleFunctorFlags::Null, "A fudge factor between the where the client and server say a shot started");
@@ -45,19 +45,19 @@ namespace MultiplayerSample
             OnWeaponDamage,
             OnConfirmedHitPlayer);
 
-        void OnWeaponActivate(const AZ::Transform& transform) override
+        void OnWeaponActivate(AZ::EntityId shooterEntityId, const AZ::Transform& transform) override
         {
-            Call(FN_OnWeaponActivate, transform);
+            Call(FN_OnWeaponActivate, shooterEntityId, transform);
         }
 
-        void OnWeaponImpact(const AZ::Transform& transform) override
+        void OnWeaponImpact(AZ::EntityId shooterEntityId, const AZ::Transform& transform, AZ::EntityId hitEntityId) override
         {
-            Call(FN_OnWeaponImpact, transform);
+            Call(FN_OnWeaponImpact, shooterEntityId, transform, hitEntityId);
         }
 
-        void OnWeaponDamage(const AZ::Transform& transform) override
+        void OnWeaponDamage(AZ::EntityId shooterEntityId, const AZ::Transform& transform, AZ::EntityId hitEntityId) override
         {
-            Call(FN_OnWeaponDamage, transform);
+            Call(FN_OnWeaponDamage, shooterEntityId, transform, hitEntityId);
         }
 
         void OnConfirmedHitPlayer(AZ::EntityId byPlayerEntity, AZ::EntityId otherPlayerEntity) override
@@ -183,7 +183,7 @@ namespace MultiplayerSample
         }
 
         m_onWeaponActivateEvent.Signal(activationInfo);
-        WeaponNotificationBus::Broadcast(&WeaponNotificationBus::Events::OnWeaponActivate, activationInfo.m_activateEvent.m_initialTransform);
+        WeaponNotificationBus::Broadcast(&WeaponNotificationBus::Events::OnWeaponActivate, GetEntity()->GetId(), activationInfo.m_activateEvent.m_initialTransform);
 
 #if AZ_TRAIT_CLIENT
         if (cl_WeaponsDrawDebug && m_debugDraw)
@@ -233,10 +233,14 @@ namespace MultiplayerSample
         }
 
         m_onWeaponPredictHitEvent.Signal(hitInfo);
-        WeaponNotificationBus::Broadcast(&WeaponNotificationBus::Events::OnWeaponImpact, hitInfo.m_hitEvent.m_hitTransform);
 
         for (const auto& hitEntity : hitInfo.m_hitEvent.m_hitEntities)
         {
+            const AZ::Transform hitTransform = AZ::Transform::CreateLookAt(hitEntity.m_hitPosition, hitEntity.m_hitPosition + hitEntity.m_hitNormal, AZ::Transform::Axis::ZPositive);
+            const Multiplayer::ConstNetworkEntityHandle handle = Multiplayer::GetNetworkEntityManager()->GetEntity(hitEntity.m_hitNetEntityId);
+            const AZ::EntityId hitEntityId = handle.Exists() ? handle.GetEntity()->GetId() : AZ::EntityId();
+            WeaponNotificationBus::Broadcast(&WeaponNotificationBus::Events::OnWeaponImpact, GetEntity()->GetId(), hitTransform, hitEntityId);
+
 #if AZ_TRAIT_CLIENT
 	        if (cl_WeaponsDrawDebug && m_debugDraw)
             {
@@ -247,6 +251,14 @@ namespace MultiplayerSample
                     AZ::Colors::Orange,
                     cl_WeaponsDrawDebugDurationSec
                 );
+
+                m_debugDraw->DrawLineLocationToLocation
+                (
+                    hitEntity.m_hitPosition,
+                    hitEntity.m_hitPosition + hitEntity.m_hitNormal,
+                    AZ::Colors::Black,
+                    cl_WeaponsDrawDebugDurationSec
+                );
             }
 
             hitInfo.m_weapon.ExecuteImpactEffect(hitInfo.m_weapon.GetFireParams().m_sourcePosition, hitEntity.m_hitPosition);
@@ -275,9 +287,6 @@ namespace MultiplayerSample
 
                 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;
-
                     const WeaponParams& weaponParams = hitInfo.m_weapon.GetParams();
                     const HitEffect effect = weaponParams.m_damageEffect;
 
@@ -289,9 +298,8 @@ namespace MultiplayerSample
                     // Look for physics rigid body component and make impact updates
                     if (Multiplayer::NetworkRigidBodyComponent* rigidBodyComponent = entityHandle.GetEntity()->FindComponent<Multiplayer::NetworkRigidBodyComponent>())
                     {
-                        const AZ::Vector3 hitLocation = hitInfo.m_hitEvent.m_hitTransform.GetTranslation();
-                        // IMPORTANT this impulse is for directional/traced hits only, not suitable for explosions
-                        const AZ::Vector3 impulse = hitInfo.m_hitEvent.m_hitTransform.GetBasisY() * damage * sv_WeaponsImpulseScalar;
+                        const AZ::Vector3 hitLocation = hitEntity.m_hitPosition;
+                        const AZ::Vector3 impulse = -hitEntity.m_hitNormal * damage * sv_WeaponsImpulseScalar;
                         rigidBodyComponent->SendApplyImpulse(impulse, hitLocation);
                     }
 
@@ -306,7 +314,6 @@ namespace MultiplayerSample
 #endif
 
         m_onWeaponConfirmHitEvent.Signal(hitInfo);
-        WeaponNotificationBus::Broadcast(&WeaponNotificationBus::Events::OnWeaponDamage, hitInfo.m_hitEvent.m_hitTransform);
 
         // If we're a simulated weapon, or if the weapon is not predictive, then issue material hit effects since the predicted callback above will not get triggered
         // Note that materialfx are not hooked up currently as the engine currently doesn't support them
@@ -314,6 +321,11 @@ namespace MultiplayerSample
 
         for (const auto& hitEntity : hitInfo.m_hitEvent.m_hitEntities)
         {
+            const AZ::Transform hitTransform = AZ::Transform::CreateLookAt(hitEntity.m_hitPosition, hitEntity.m_hitPosition + hitEntity.m_hitNormal, AZ::Transform::Axis::ZPositive);
+            const Multiplayer::ConstNetworkEntityHandle handle = Multiplayer::GetNetworkEntityManager()->GetEntity(hitEntity.m_hitNetEntityId);
+            const AZ::EntityId hitEntityId = handle.Exists() ? handle.GetEntity()->GetId() : AZ::EntityId();
+            WeaponNotificationBus::Broadcast(&WeaponNotificationBus::Events::OnWeaponDamage, GetEntity()->GetId(), hitTransform, hitEntityId);
+
 #if AZ_TRAIT_CLIENT
             if (cl_WeaponsDrawDebug && m_debugDraw)
             {
@@ -326,8 +338,6 @@ namespace MultiplayerSample
                 );
             }
 
-            Multiplayer::ConstNetworkEntityHandle handle = Multiplayer::GetMultiplayer()->GetNetworkEntityManager()->GetEntity(
-                hitEntity.m_hitNetEntityId);
             if (handle.Exists())
             {
                 if (const AZ::Entity* entity = handle.GetEntity())

+ 219 - 0
Gem/Code/Source/Components/ScriptableDecalComponent.cpp

@@ -0,0 +1,219 @@
+/*
+ * Copyright (c) Contributors to the Open 3D Engine Project.
+ * For complete copyright and license terms please see the LICENSE at the root of this distribution.
+ *
+ * SPDX-License-Identifier: Apache-2.0 OR MIT
+ *
+ */
+
+#include <Components/ScriptableDecalComponent.h>
+
+#include <AzCore/RTTI/BehaviorContext.h>
+#include <AzCore/Serialization/EditContext.h>
+#include <AzCore/Serialization/SerializeContext.h>
+#include <AzCore/Time/ITime.h>
+
+#include <Atom/RPI.Public/Scene.h>
+#include <Atom/RPI.Public/Material/Material.h>
+
+namespace MultiplayerSample
+{
+    void ScriptableDecalComponent::Reflect(AZ::ReflectContext* context)
+    {
+        SpawnDecalConfig::Reflect(context);
+
+        if (AZ::SerializeContext* serialize = azrtti_cast<AZ::SerializeContext*>(context))
+        {
+            serialize->Class<MultiplayerSample::ScriptableDecalComponent, AZ::Component>()
+                ->Version(0)
+                ;
+
+            AZ::EditContext* editContext = serialize->GetEditContext();
+            if (editContext)
+            {
+                editContext->Class<MultiplayerSample::ScriptableDecalComponent>(
+                    "Scriptable Decals", "Allows spawning decals directly from script without prefabs.")
+                    ->ClassElement(AZ::Edit::ClassElements::EditorData, "")
+                    ->Attribute(AZ::Edit::Attributes::Category, "Graphics")
+                    ->Attribute(AZ::Edit::Attributes::AppearsInAddComponentMenu, AZStd::vector<AZ::Crc32>({ AZ_CRC_CE("Level") }))
+                    ;
+            }
+        }
+
+        AZ::BehaviorContext* behaviorContext = azrtti_cast<AZ::BehaviorContext*>(context);
+        if (behaviorContext)
+        {
+            behaviorContext->EBus<DecalRequestBus>("RequestBus")
+                ->Attribute(AZ::Script::Attributes::Scope, AZ::Script::Attributes::ScopeFlags::Common)
+                ->Attribute(AZ::Script::Attributes::Category, "Rendering")
+                ->Attribute(AZ::Script::Attributes::Module, "rendering")
+                ->Attribute(AZ::Script::Attributes::Scope, AZ::Script::Attributes::ScopeFlags::Common)
+                ->Event(
+                    "SpawnDecal",
+                    &DecalRequestBus::Events::SpawnDecal)
+                ;
+        }
+    }
+
+    void ScriptableDecalComponent::GetProvidedServices(AZ::ComponentDescriptor::DependencyArrayType& services)
+    {
+        services.push_back(AZ_CRC_CE("ScriptableDecalService"));
+    }
+
+    void ScriptableDecalComponent::GetIncompatibleServices(AZ::ComponentDescriptor::DependencyArrayType& services)
+    {
+        services.push_back(AZ_CRC_CE("ScriptableDecalService"));
+    }
+
+    void ScriptableDecalComponent::Activate()
+    {
+        m_decalFeatureProcessor = AZ::RPI::Scene::GetFeatureProcessorForEntity<AZ::Render::DecalFeatureProcessorInterface>(GetEntityId());
+        if (m_decalFeatureProcessor)
+        {
+            AZ::RPI::Scene* scene = m_decalFeatureProcessor->GetParentScene();
+            DecalRequestBus::Handler::BusConnect(scene->GetId());
+            AZ::TickBus::Handler::BusConnect();
+        }
+    }
+
+    void ScriptableDecalComponent::Deactivate()
+    {
+        AZ::TickBus::Handler::BusDisconnect();
+        DecalRequestBus::Handler::BusDisconnect();
+
+        auto removeDecalsFromList = [&](AZStd::vector<DecalInstance>& container)
+        {
+            for (const DecalInstance& instance : container)
+            {
+                m_decalFeatureProcessor->ReleaseDecal(instance.m_handle);
+            }
+            container.clear();
+        };
+
+        removeDecalsFromList(m_fadingInDecals);
+        removeDecalsFromList(m_fadingOutDecals);
+        removeDecalsFromList(m_decalHeap);
+
+        m_decalFeatureProcessor = nullptr;
+    }
+
+    void ScriptableDecalComponent::SpawnDecal(const AZ::Transform& worldTm, const SpawnDecalConfig& config)
+    {
+        DecalHandle handle = m_decalFeatureProcessor->AcquireDecal();
+
+        AZ::Vector3 scale = AZ::Vector3(config.m_scale, config.m_scale, config.m_scale * config.m_thickness);
+
+        // Check for bad state.
+        if (config.m_scale <= 0.0f || !config.m_materialAssetId.IsValid() || config.m_opacity <= 0.0f ||
+            (config.m_fadeInTimeSec + config.m_lifeTimeSec + config.m_fadeOutTimeSec <= 0.0f))
+        {
+            return;
+        }
+
+        m_decalFeatureProcessor->SetDecalTransform(handle, worldTm, scale);
+        m_decalFeatureProcessor->SetDecalMaterial(handle, config.m_materialAssetId);
+        m_decalFeatureProcessor->SetDecalOpacity(handle, config.m_opacity);
+        m_decalFeatureProcessor->SetDecalAttenuationAngle(handle, config.m_attenuationAngle);
+        m_decalFeatureProcessor->SetDecalSortKey(handle, config.m_sortKey);
+
+        uint32_t currentTimeMs = static_cast<uint32_t>(AZ::Interface<AZ::ITime>::Get()->GetElapsedTimeMs());
+
+        if (config.m_fadeInTimeSec > 0.0f)
+        {
+            m_fadingInDecals.push_back({ config, handle, currentTimeMs });
+        }
+        else if (config.m_lifeTimeSec > 0.0f)
+        {
+            uint32_t lifetimeMs = static_cast<uint32_t>(config.m_lifeTimeSec * 1000.0f);
+            uint32_t despawnTimeMs = currentTimeMs + lifetimeMs;
+
+            // Store decals in a min heap sorted by when they need to start animating the fade out.
+            // This makes it very cheap to check each frame if any decals need to change to the fade-out state.
+            m_decalHeap.push_back({ config, handle, despawnTimeMs });
+            AZStd::push_heap(m_decalHeap.begin(), m_decalHeap.end(), HeapCompare);
+        }
+        else
+        {
+            m_fadingOutDecals.push_back({ config, handle, currentTimeMs });
+        }
+    }
+
+    void ScriptableDecalComponent::OnTick([[maybe_unused]] float deltaTime, [[maybe_unused]] AZ::ScriptTimePoint time)
+    {
+        uint32_t currentTimeMs = static_cast<uint32_t>(AZ::Interface<AZ::ITime>::Get()->GetElapsedTimeMs());
+
+        for (size_t i = 0; i < m_fadingInDecals.size();)
+        {
+            DecalInstance& decalInstance = m_fadingInDecals.at(i);
+            uint32_t currentFadeTimeMs = currentTimeMs - decalInstance.m_animationStartTimeMs;
+            float fadeInTimeMsFloat = decalInstance.m_config.m_fadeInTimeSec * 1000.0f;
+
+            float opacity = AZStd::GetMin(1.0f, currentFadeTimeMs / fadeInTimeMsFloat);
+            opacity *= decalInstance.m_config.m_opacity;
+            m_decalFeatureProcessor->SetDecalOpacity(decalInstance.m_handle, opacity);
+
+            uint32_t fadeInTimeMs = static_cast<uint32_t>(fadeInTimeMsFloat);
+            if (currentFadeTimeMs > fadeInTimeMs)
+            {
+                uint32_t lifetimeMs = static_cast<uint32_t>(decalInstance.m_config.m_lifeTimeSec * 1000.0f);
+                // Fade out animation starts after the fade in time and life time have passed.
+                uint32_t despawnTimeMs = fadeInTimeMs + lifetimeMs; 
+                decalInstance.m_animationStartTimeMs += despawnTimeMs;
+
+                m_decalHeap.push_back(decalInstance);
+                AZStd::push_heap(m_decalHeap.begin(), m_decalHeap.end(), HeapCompare);
+
+                // Replace this instance with the one on the back
+                decalInstance = m_fadingInDecals.back();
+                m_fadingInDecals.pop_back();
+
+                // Don't increment, next iteration needs to process the item just moved to this spot.
+            }
+            else
+            {
+                ++i;
+            }
+        }
+
+        // Check to see if any decals need to despawn
+        while (!m_decalHeap.empty() && m_decalHeap.front().m_animationStartTimeMs < currentTimeMs)
+        {
+            AZStd::pop_heap(m_decalHeap.begin(), m_decalHeap.end(), HeapCompare);
+            m_fadingOutDecals.push_back(m_decalHeap.back());
+            m_decalHeap.pop_back();
+        }
+
+        // Animate despawning decals, remove those that are expired.
+        for (size_t i = 0; i < m_fadingOutDecals.size();)
+        {
+            DecalInstance& decalInstance = m_fadingOutDecals.at(i);
+
+            // Clamp our minimum total fade time to 1 millisecond to avoid any potential divide-by-zero
+            float totalFadeTimeMs = AZStd::max(decalInstance.m_config.m_fadeOutTimeSec * 1000.0f, 1.0f);
+            float currentFadeTimeMs = static_cast<float>(currentTimeMs - decalInstance.m_animationStartTimeMs);
+            if (currentFadeTimeMs > totalFadeTimeMs)
+            {
+                // Despawn the decal, it's done animating;
+                m_decalFeatureProcessor->ReleaseDecal(decalInstance.m_handle);
+
+                // Replace this instance with the one on the back
+                decalInstance = m_fadingOutDecals.back();
+                m_fadingOutDecals.pop_back();
+
+                // Don't increment, next iteration needs to process the item just moved to this spot.
+            }
+            else
+            {
+                float opacity = 1.0f - (currentFadeTimeMs / totalFadeTimeMs);
+                opacity *= decalInstance.m_config.m_opacity;
+                m_decalFeatureProcessor->SetDecalOpacity(decalInstance.m_handle, opacity);
+                ++i;
+            }
+        }
+    }
+
+    bool ScriptableDecalComponent::HeapCompare(const DecalInstance& value1, const DecalInstance& value2)
+    {
+        return value1.m_animationStartTimeMs > value2.m_animationStartTimeMs;
+    }
+}

+ 62 - 0
Gem/Code/Source/Components/ScriptableDecalComponent.h

@@ -0,0 +1,62 @@
+/*
+ * Copyright (c) Contributors to the Open 3D Engine Project.
+ * For complete copyright and license terms please see the LICENSE at the root of this distribution.
+ *
+ * SPDX-License-Identifier: Apache-2.0 OR MIT
+ *
+ */
+
+#pragma once
+
+#include <AzCore/Component/Component.h>
+#include <AzCore/Component/TickBus.h>
+#include <AzCore/EBus/Event.h>
+#include <DecalBus.h>
+
+#include <Atom/Feature/Decals/DecalFeatureProcessorInterface.h>
+
+namespace MultiplayerSample
+{
+
+    class ScriptableDecalComponent
+        : public AZ::Component
+        , public DecalRequestBus::Handler
+        , public AZ::TickBus::Handler
+    {
+    public:
+        AZ_COMPONENT(MultiplayerSample::ScriptableDecalComponent, "{79AEB56C-E886-4A6A-9BAA-0FE5D6D01F78}");
+
+        static void Reflect(AZ::ReflectContext* context);
+
+        static void GetProvidedServices(AZ::ComponentDescriptor::DependencyArrayType& services);
+        static void GetIncompatibleServices(AZ::ComponentDescriptor::DependencyArrayType& services);
+
+        void Activate() override;
+        void Deactivate() override;
+
+    private:
+
+        using DecalHandle = AZ::Render::DecalFeatureProcessorInterface::DecalHandle;
+
+        struct DecalInstance
+        {
+            SpawnDecalConfig m_config;
+            DecalHandle m_handle;
+            uint32_t m_animationStartTimeMs = 0;
+        };
+
+        // DecalRequestBus::Handler...
+        void SpawnDecal(const AZ::Transform& worldTm, const SpawnDecalConfig& config) override;
+
+        // TickBus::Handler...
+        virtual void OnTick(float deltaTime, AZ::ScriptTimePoint time) override;
+
+        static bool HeapCompare(const DecalInstance& value1, const DecalInstance& value2);
+
+        AZ::Render::DecalFeatureProcessorInterface* m_decalFeatureProcessor = nullptr;
+
+        AZStd::vector<DecalInstance> m_decalHeap;
+        AZStd::vector<DecalInstance> m_fadingInDecals;
+        AZStd::vector<DecalInstance> m_fadingOutDecals;
+    };
+}

+ 1 - 1
Gem/Code/Source/Effects/GameEffect.cpp

@@ -149,7 +149,7 @@ namespace MultiplayerSample
     void GameEffect::TriggerEffect([[maybe_unused]] const AZ::Transform& transform) const
     {
 #if AZ_TRAIT_CLIENT
-        const AZ::Vector3 offsetPosition = transform.GetTranslation() + transform.TransformVector(m_effectOffset);
+        const AZ::Vector3 offsetPosition = transform.TransformPoint(m_effectOffset);
         AZ::Transform transformOffset = transform;
         transformOffset.SetTranslation(offsetPosition);
         if (m_emitter != nullptr)

+ 3 - 1
Gem/Code/Source/MultiplayerSampleModule.cpp

@@ -15,6 +15,7 @@
 #include <Components/UI/UiCoinCountComponent.h>
 #include <Components/UI/UiGameOverComponent.h>
 #include <Components/UI/UiPlayerArmorComponent.h>
+#include <Components/ScriptableDecalComponent.h>
 #if AZ_TRAIT_CLIENT
     #include <Components/UI/HUDComponent.h>
     #include <Components/UI/UiMatchPlayerCoinCountsComponent.h>
@@ -45,13 +46,14 @@ namespace MultiplayerSample
                 ExampleFilteredEntityComponent::CreateDescriptor(),
                 NetworkPrefabSpawnerComponent::CreateDescriptor(),
                 UiCoinCountComponent::CreateDescriptor(),
+                ScriptableDecalComponent::CreateDescriptor(),
                 #if AZ_TRAIT_CLIENT
                     HUDComponent::CreateDescriptor(),
                     UiGameOverComponent::CreateDescriptor(),
                     UiPlayerArmorComponent::CreateDescriptor(),
                     UiMatchPlayerCoinCountsComponent::CreateDescriptor(),
                     UiRestBetweenRoundsComponent::CreateDescriptor(),
-                    UiStartMenuComponent::CreateDescriptor()
+                    UiStartMenuComponent::CreateDescriptor(),
                 #endif
             });
 

+ 32 - 0
Gem/Code/Source/MultiplayerSampleSystemComponent.cpp

@@ -19,6 +19,9 @@
 #include <Source/Effects/GameEffect.h>
 #include <Multiplayer/Components/NetBindComponent.h>
 
+#include <AzFramework/Scene/Scene.h>
+#include <Atom/RPI.Public/Scene.h>
+
 namespace MultiplayerSample
 {
     using namespace AzNetworking;
@@ -51,6 +54,21 @@ namespace MultiplayerSample
                     ;
             }
         }
+
+        if (AZ::BehaviorContext* behaviorContext = azrtti_cast<AZ::BehaviorContext*>(context))
+        {
+            // This will put these methods into the 'azlmbr.atomtools.general' module
+            auto addGeneral = [](AZ::BehaviorContext::GlobalMethodBuilder methodBuilder)
+            {
+                methodBuilder->Attribute(AZ::Script::Attributes::Scope, AZ::Script::Attributes::ScopeFlags::Common)
+                    ->Attribute(AZ::Script::Attributes::Category, "MultiplayerSample")
+                    ->Attribute(AZ::Script::Attributes::Module, "MultiplayerSample.general");
+            };
+
+            addGeneral(behaviorContext->Method(
+                "GetRenderSceneIdByName", &MultiplayerSampleSystemComponent::GetRenderSceneIdByName, nullptr,
+                "Gets an RPI scene ID based on the name of the AzFramework Scene."));
+        }
     }
 
     void MultiplayerSampleSystemComponent::GetProvidedServices(AZ::ComponentDescriptor::DependencyArrayType& provided)
@@ -88,5 +106,19 @@ namespace MultiplayerSample
     void MultiplayerSampleSystemComponent::Deactivate()
     {
     }
+
+    AZ::Uuid MultiplayerSampleSystemComponent::GetRenderSceneIdByName(const AZStd::string& name)
+    {
+        AZStd::shared_ptr<AzFramework::Scene> scene = AzFramework::SceneSystemInterface::Get()->GetScene(name);
+        if (scene)
+        {
+            AZ::RPI::ScenePtr renderScene = *scene->FindSubsystemInScene<AZ::RPI::ScenePtr>();
+            if (renderScene)
+            {
+                return renderScene->GetId();
+            }
+        }
+        return AZ::Uuid::CreateInvalid();
+    }
 }
 

+ 2 - 1
Gem/Code/Source/MultiplayerSampleSystemComponent.h

@@ -9,7 +9,6 @@
 
 #include <AzCore/Component/Component.h>
 
-
 namespace MultiplayerSample
 {
     class MultiplayerSampleSystemComponent
@@ -31,5 +30,7 @@ namespace MultiplayerSample
         void Activate() override;
         void Deactivate() override;
         ////////////////////////////////////////////////////////////////////////
+
+        static AZ::Uuid GetRenderSceneIdByName(const AZStd::string& name);
     };
 }

+ 2 - 2
Gem/Code/Source/Weapons/BaseWeapon.cpp

@@ -144,7 +144,7 @@ namespace MultiplayerSample
     {
         HitEvent hitEvent
         {
-            AZ::Transform::CreateFromQuaternionAndTranslation(eventData.m_initialTransform.GetRotation(), eventData.m_targetPosition),
+            eventData.m_targetPosition,
             eventData.m_shooterId,
             Multiplayer::InvalidNetEntityId,
             HitEntities()
@@ -161,7 +161,7 @@ namespace MultiplayerSample
                 }
             }
 
-            hitEvent.m_hitEntities.emplace_back(HitEntity{ gatherResult.m_position, gatherResult.m_netEntityId });
+            hitEvent.m_hitEntities.emplace_back(HitEntity{ gatherResult.m_position, gatherResult.m_normal, gatherResult.m_netEntityId });
         }
 
         WeaponHitInfo hitInfo(*this, hitEvent);

+ 9 - 6
Gem/Code/Source/Weapons/SceneQuery.cpp

@@ -47,7 +47,7 @@ namespace MultiplayerSample
             return nullptr;
         }
 
-        static void CollectHits(AzPhysics::SceneQueryHits& result, IntersectResults& outResults)
+        static void CollectHits(AzPhysics::SceneQueryHits& result, IntersectResults& outResults, const AZ::Vector3& defaultPosition, const AZ::Vector3& defaultNormal)
         {
             auto* networkEntityManager = AZ::Interface<Multiplayer::INetworkEntityManager>::Get();
             AZ_Assert(networkEntityManager, "Multiplayer entity manager must be initialized");
@@ -55,8 +55,11 @@ namespace MultiplayerSample
             for (const AzPhysics::SceneQueryHit& hit : result.m_hits)
             {
                 IntersectResult intersectResult;
-                intersectResult.m_position = hit.m_position;
-                intersectResult.m_normal = hit.m_normal;
+
+                // Certain queries may return zero vectors if the hit position and normal can't easily be determined
+                // Use defaults if we detect zero vectors coming out of the scene query results
+                intersectResult.m_position = (hit.m_position.GetLengthSq() > AZ::Constants::Tolerance) ? hit.m_position : defaultPosition;
+                intersectResult.m_normal = (hit.m_normal.GetLengthSq() > AZ::Constants::Tolerance) ? hit.m_normal : defaultNormal;
                 intersectResult.m_materialName = hit.m_physicsMaterialId.ToString<AZStd::string>();
                 intersectResult.m_netEntityId = networkEntityManager->GetNetEntityIdById(hit.m_entityId);
                 outResults.emplace_back(intersectResult);
@@ -128,7 +131,7 @@ namespace MultiplayerSample
                 };
 
                 AzPhysics::SceneQueryHits result = sceneInterface->QueryScene(sceneHandle, &request);
-                CollectHits(result, outResults);
+                CollectHits(result, outResults, filter.m_initialPose.GetTranslation(), AZ::Vector3::CreateZero());
             }
             else if (intersectShape == GatherShape::Point)
             {
@@ -143,7 +146,7 @@ namespace MultiplayerSample
                 request.m_reportMultipleHits = (filter.m_intersectMultiple == HitMultiple::Yes);
 
                 AzPhysics::SceneQueryHits result = sceneInterface->QueryScene(sceneHandle, &request);
-                CollectHits(result, outResults);
+                CollectHits(result, outResults, filter.m_initialPose.GetTranslation(), -request.m_direction);
             }
             else
             {
@@ -159,7 +162,7 @@ namespace MultiplayerSample
                 request.m_reportMultipleHits = (filter.m_intersectMultiple == HitMultiple::Yes);
 
                 AzPhysics::SceneQueryHits result = sceneInterface->QueryScene(sceneHandle, &request);
-                CollectHits(result, outResults);
+                CollectHits(result, outResults, filter.m_initialPose.GetTranslation(), -request.m_direction);
             }
             
             return outResults.size();

+ 1 - 1
Gem/Code/Source/Weapons/WeaponGathers.cpp

@@ -13,7 +13,7 @@
 #include <Source/Weapons/SceneQuery.h>
 
 #if AZ_TRAIT_CLIENT
-#include <DebugDraw/DebugDrawBus.h>
+#   include <DebugDraw/DebugDrawBus.h>
 #endif
 
 namespace MultiplayerSample

+ 8 - 5
Gem/Code/Source/Weapons/WeaponTypes.cpp

@@ -348,6 +348,7 @@ namespace MultiplayerSample
     bool HitEntity::Serialize(AzNetworking::ISerializer& serializer)
     {
         return serializer.Serialize(m_hitPosition, "HitPosition")
+            && serializer.Serialize(m_hitNormal, "HitNormal")
             && serializer.Serialize(m_hitNetEntityId, "HitNetEntityId");
     }
 
@@ -357,8 +358,9 @@ namespace MultiplayerSample
         if (serializeContext)
         {
             serializeContext->Class<HitEntity>()
-                ->Version(0)
+                ->Version(1)
                 ->Field("HitPosition", &HitEntity::m_hitPosition)
+                ->Field("HitNormal", &HitEntity::m_hitNormal)
                 ->Field("HitNetEntityId", &HitEntity::m_hitNetEntityId);
         }
 
@@ -371,6 +373,7 @@ namespace MultiplayerSample
                 ->Attribute(AZ::Script::Attributes::Category, "MultiplayerSample")
                 ->Constructor<>()
                 ->Property("HitPosition", BehaviorValueProperty(&HitEntity::m_hitPosition))
+                ->Property("HitNormal", BehaviorValueProperty(&HitEntity::m_hitNormal))
                 ->Property("HitNetEntityId", BehaviorValueProperty(&HitEntity::m_hitNetEntityId))
                 ;
         }
@@ -378,7 +381,7 @@ namespace MultiplayerSample
 
     bool HitEvent::Serialize(AzNetworking::ISerializer& serializer)
     {
-        return serializer.Serialize(m_hitTransform, "HitTransform")
+        return serializer.Serialize(m_target, "Target")
             && serializer.Serialize(m_shooterNetEntityId, "ShooterNetEntityId")
             && serializer.Serialize(m_hitEntities, "HitEntities");
     }
@@ -389,8 +392,8 @@ namespace MultiplayerSample
         if (serializeContext)
         {
             serializeContext->Class<HitEvent>()
-                ->Version(0)
-                ->Field("HitTransform", &HitEvent::m_hitTransform)
+                ->Version(1)
+                ->Field("Target", &HitEvent::m_target)
                 ->Field("ShooterNetEntityId", &HitEvent::m_shooterNetEntityId)
                 ->Field("HitEntities", &HitEvent::m_hitEntities);
         }
@@ -403,7 +406,7 @@ namespace MultiplayerSample
                 ->Attribute(AZ::Script::Attributes::Module, "multiplayersample")
                 ->Attribute(AZ::Script::Attributes::Category, "MultiplayerSample")
                 ->Constructor<>()
-                ->Property("HitTransform", BehaviorValueProperty(&HitEvent::m_hitTransform))
+                ->Property("Target", BehaviorValueProperty(&HitEvent::m_target))
                 ->Property("ShooterNetEntityId", BehaviorValueProperty(&HitEvent::m_shooterNetEntityId))
                 ->Property("HitEntities", BehaviorValueProperty(&HitEvent::m_hitEntities))
                 ;

+ 2 - 1
Gem/Code/Source/Weapons/WeaponTypes.h

@@ -173,6 +173,7 @@ namespace MultiplayerSample
         AZ_TYPE_INFO(HitEntity, "{A7A0A64A-816C-4675-9A02-652A72CD2255}");
 
         AZ::Vector3 m_hitPosition = AZ::Vector3::CreateZero(); // Location where the entity was hit, NOT the location of the projectile or weapon in the case of area damage
+        AZ::Vector3 m_hitNormal = AZ::Vector3::CreateZero();
         Multiplayer::NetEntityId m_hitNetEntityId = Multiplayer::InvalidNetEntityId; // Entity Id of the entity which was hit
 
         bool Serialize(AzNetworking::ISerializer& serializer);
@@ -185,7 +186,7 @@ namespace MultiplayerSample
     {
         AZ_TYPE_INFO(HitEvent, "{573515BB-E806-42C1-9F2C-2AA1B8E2EEF0}");
 
-        AZ::Transform m_hitTransform = AZ::Transform::CreateIdentity(); // Transform of the hit event, NOT the location of the entity that was hit in the case of area damage
+        AZ::Vector3 m_target = AZ::Vector3::CreateZero(); // Target of the hit event, NOT the location of the entity that was hit in the case of area damage
         Multiplayer::NetEntityId m_shooterNetEntityId    = Multiplayer::InvalidNetEntityId; // Entity Id of the shooter
         Multiplayer::NetEntityId m_projectileNetEntityId = Multiplayer::InvalidNetEntityId; // Entity Id of the projectile, InvalidNetEntityId if this was a trace weapon hit
         HitEntities m_hitEntities; // Information about the entities that were hit

+ 2 - 0
Gem/Code/multiplayersample_client_files.cmake

@@ -6,6 +6,8 @@
 #
 
 set(FILES
+    Include/DecalBus.h
+
     Source/Components/UI/UiGameOverComponent.cpp
     Source/Components/UI/UiGameOverComponent.h
     Source/Components/UI/HUDComponent.cpp

+ 3 - 0
Gem/Code/multiplayersample_files.cmake

@@ -75,6 +75,9 @@ set(FILES
 
     Source/Components/RpcTesterComponent.cpp
     Source/Components/RpcTesterComponent.h
+    
+    Source/Components/ScriptableDecalComponent.cpp
+    Source/Components/ScriptableDecalComponent.h
 
     Source/Weapons/BaseWeapon.cpp
     Source/Weapons/BaseWeapon.h

+ 570 - 0
Levels/GameplayTest/GameplayTest.prefab

@@ -66,6 +66,13 @@
                     "$type": "MultiplayerSample::ExampleFilteredEntityComponent"
                 }
             },
+            "Component_[2838838923760404239]": {
+                "$type": "GenericComponentWrapper",
+                "Id": 2838838923760404239,
+                "m_template": {
+                    "$type": "MultiplayerSample::ScriptableDecalComponent"
+                }
+            },
             "Component_[3902259769182016681]": {
                 "$type": "EditorLockComponent",
                 "Id": 3902259769182016681
@@ -102,6 +109,7 @@
                     "Entity_[1800029023887]",
                     "Entity_[1808618958479]",
                     "Entity_[2009119671826]",
+                    "Entity_[6269723213373]",
                     "Entity_[2004824704530]",
                     "Entity_[2000529737234]",
                     "Instance_[9344504187970]/ContainerEntity",
@@ -11432,6 +11440,568 @@
                 }
             }
         },
+        "Entity_[6269723213373]": {
+            "Id": "Entity_[6269723213373]",
+            "Name": "Ramp",
+            "Components": {
+                "Component_[10397256755443470613]": {
+                    "$type": "EditorOnlyEntityComponent",
+                    "Id": 10397256755443470613
+                },
+                "Component_[11050547822997230207]": {
+                    "$type": "EditorDisabledCompositionComponent",
+                    "Id": 11050547822997230207
+                },
+                "Component_[11987017710858805623]": {
+                    "$type": "EditorWhiteBoxComponent",
+                    "Id": 11987017710858805623,
+                    "WhiteBoxData": "T01UQQgAAAAMAAAAEgAAAAAWnTRrwAAAAL+YjLk/tu04wAAAAL9cALg/tu04wAS38D9cALg/nTRrwAS38D+YjLk/l3FuwAAAAL+AUVU8AAAAPwAAAL+AUVU8AAAAPwS38D+AUVU8l3FuwAS38D+AUVU8+BYCAQAYAAUEAgAVAQcAAAAGAgEIAwEbAgkFAAEfAwsMBgIeBwgOBQIaBgYKBwIQBQMSBAMUBQQPBwMZBAoWAQQdBQcRBAQBAQUXBAUiAAocAgYhBgkNBQYDAgcgAwgjBwsLBggHAwkTBwoJAAtYDrbtWEAAAIA/TpqFQDAZc7+27VhABLewv7btWEAAAIA/TpqFQAAAgD+27VhABLewv06ahUAEt7C/tu1YQLgAcL9OmoVAAACAPzAZc78Et7C/AAAAAAS3sL/MOIdAdFX5PgAAAAAAAIA/AAAAAAS3sL/MOIdABLewvwAAAAAAAIA/zDiHQAAAgD8AAAAAdFX5Psw4h0AEt7C/dFX5PgAAgD+27VhAuABwvwAAAAAAAIA/zDiHQHRV+T627VhAuABwv8w4h0B0Vfk+MBlzvwAAgD+27VhABLewvwAAAAB0Vfk+AAAAAAAAgD+27VhABLewv06ahUAwGXO/dFX5PgS3sL8AAAAAdFX5Pk6ahUAwGXO/dFX5PgS3sL8wGXO/AACAP+AGCRUbHxkdISPoBgQIDhIWGBwVIBsiHygWxyl8PAAAAIA9+H8/xyl8PAAAAAA9+H8/AAAAgAAAAID//3+/AAAAAAAAAAD//3+/AAAAAP//f78AAAAAAAAAgAAAgL8AAAAAiF7GPgAAAABPAWw/iF7GPgAAAABPAWw/AAAAAAAAgD8AAAAAAAAAAAAAgD8AAAAAZNd/vwAAAAAmLBA9ZNd/vwAAAAAmLBA9wsATdmVydGV4LWhpZGRlbi1wcm9wcwEAAAAAxsANcG9seWdvbi1wcm9wc8QAAAAMAAAABgAAAAIAAAAGAAAABwAAAAUAAAACAAAABAAAAAUAAAAEAAAAAgAAAAQAAAAFAAAACwAAAAIAAAAKAAAACwAAAAMAAAACAAAAAgAAAAMAAAAKAAAAAgAAAAoAAAALAAAAAgAAAAIAAAACAAAAAwAAAAkAAAACAAAACAAAAAkAAAABAAAAAgAAAAAAAAABAAAACAAAAAIAAAAIAAAACQAAAAAAAAACAAAAAAAAAAEAAAAHAAAAAgAAAAYAAAAHAAAAHAA=",
+                    "RenderData": {
+                        "Faces": [
+                            {
+                                "Vertex1": {
+                                    "Position": [
+                                        -3.675086259841919,
+                                        -0.5,
+                                        1.4496030807495117
+                                    ],
+                                    "UV": [
+                                        4.17508602142334,
+                                        1.0
+                                    ]
+                                },
+                                "Vertex2": {
+                                    "Position": [
+                                        -2.8895087242126465,
+                                        -0.5,
+                                        1.4375109672546387
+                                    ],
+                                    "UV": [
+                                        3.3895087242126465,
+                                        1.0
+                                    ]
+                                },
+                                "Vertex3": {
+                                    "Position": [
+                                        -2.8895087242126465,
+                                        1.8805851936340332,
+                                        1.4375109672546387
+                                    ],
+                                    "UV": [
+                                        3.3895087242126465,
+                                        -1.3805851936340332
+                                    ]
+                                },
+                                "Normal": [
+                                    0.015390819869935513,
+                                    -0.0,
+                                    0.9998815655708313
+                                ]
+                            },
+                            {
+                                "Vertex1": {
+                                    "Position": [
+                                        -3.675086259841919,
+                                        -0.5,
+                                        1.4496030807495117
+                                    ],
+                                    "UV": [
+                                        4.17508602142334,
+                                        1.0
+                                    ]
+                                },
+                                "Vertex2": {
+                                    "Position": [
+                                        -2.8895087242126465,
+                                        1.8805851936340332,
+                                        1.4375109672546387
+                                    ],
+                                    "UV": [
+                                        3.3895087242126465,
+                                        -1.3805851936340332
+                                    ]
+                                },
+                                "Vertex3": {
+                                    "Position": [
+                                        -3.675086259841919,
+                                        1.8805851936340332,
+                                        1.4496030807495117
+                                    ],
+                                    "UV": [
+                                        4.17508602142334,
+                                        -1.3805851936340332
+                                    ]
+                                },
+                                "Normal": [
+                                    0.015390819869935513,
+                                    0.0,
+                                    0.9998815655708313
+                                ]
+                            },
+                            {
+                                "Vertex1": {
+                                    "Position": [
+                                        -3.7256829738616943,
+                                        1.8805851936340332,
+                                        0.013019919395446777
+                                    ],
+                                    "UV": [
+                                        4.225683212280273,
+                                        -1.3805851936340332
+                                    ]
+                                },
+                                "Vertex2": {
+                                    "Position": [
+                                        0.5,
+                                        1.8805851936340332,
+                                        0.013019919395446777
+                                    ],
+                                    "UV": [
+                                        0.0,
+                                        -1.3805851936340332
+                                    ]
+                                },
+                                "Vertex3": {
+                                    "Position": [
+                                        0.5,
+                                        -0.5,
+                                        0.013019919395446777
+                                    ],
+                                    "UV": [
+                                        0.0,
+                                        1.0
+                                    ]
+                                },
+                                "Normal": [
+                                    -0.0,
+                                    -0.0,
+                                    -0.9999999403953552
+                                ]
+                            },
+                            {
+                                "Vertex1": {
+                                    "Position": [
+                                        -3.7256829738616943,
+                                        1.8805851936340332,
+                                        0.013019919395446777
+                                    ],
+                                    "UV": [
+                                        4.225683212280273,
+                                        -1.3805851936340332
+                                    ]
+                                },
+                                "Vertex2": {
+                                    "Position": [
+                                        0.5,
+                                        -0.5,
+                                        0.013019919395446777
+                                    ],
+                                    "UV": [
+                                        0.0,
+                                        1.0
+                                    ]
+                                },
+                                "Vertex3": {
+                                    "Position": [
+                                        -3.7256829738616943,
+                                        -0.5,
+                                        0.013019919395446777
+                                    ],
+                                    "UV": [
+                                        4.225683212280273,
+                                        1.0
+                                    ]
+                                },
+                                "Normal": [
+                                    0.0,
+                                    0.0,
+                                    -0.9999999403953552
+                                ]
+                            },
+                            {
+                                "Vertex1": {
+                                    "Position": [
+                                        -3.7256829738616943,
+                                        -0.5,
+                                        0.013019919395446777
+                                    ],
+                                    "UV": [
+                                        4.225683212280273,
+                                        0.4869800806045532
+                                    ]
+                                },
+                                "Vertex2": {
+                                    "Position": [
+                                        0.5,
+                                        -0.5,
+                                        0.013019919395446777
+                                    ],
+                                    "UV": [
+                                        0.0,
+                                        0.4869800806045532
+                                    ]
+                                },
+                                "Vertex3": {
+                                    "Position": [
+                                        -2.8895087242126465,
+                                        -0.5,
+                                        1.4375109672546387
+                                    ],
+                                    "UV": [
+                                        3.3895087242126465,
+                                        -0.9375109672546387
+                                    ]
+                                },
+                                "Normal": [
+                                    0.0,
+                                    -0.9999999403953552,
+                                    0.0
+                                ]
+                            },
+                            {
+                                "Vertex1": {
+                                    "Position": [
+                                        -3.7256829738616943,
+                                        -0.5,
+                                        0.013019919395446777
+                                    ],
+                                    "UV": [
+                                        4.225683212280273,
+                                        0.4869800806045532
+                                    ]
+                                },
+                                "Vertex2": {
+                                    "Position": [
+                                        -2.8895087242126465,
+                                        -0.5,
+                                        1.4375109672546387
+                                    ],
+                                    "UV": [
+                                        3.3895087242126465,
+                                        -0.9375109672546387
+                                    ]
+                                },
+                                "Vertex3": {
+                                    "Position": [
+                                        -3.675086259841919,
+                                        -0.5,
+                                        1.4496030807495117
+                                    ],
+                                    "UV": [
+                                        4.17508602142334,
+                                        -0.9496030807495117
+                                    ]
+                                },
+                                "Normal": [
+                                    -0.0,
+                                    -1.0,
+                                    0.0
+                                ]
+                            },
+                            {
+                                "Vertex1": {
+                                    "Position": [
+                                        0.5,
+                                        -0.5,
+                                        0.013019919395446777
+                                    ],
+                                    "UV": [
+                                        0.0,
+                                        1.0
+                                    ]
+                                },
+                                "Vertex2": {
+                                    "Position": [
+                                        0.5,
+                                        1.8805851936340332,
+                                        0.013019919395446777
+                                    ],
+                                    "UV": [
+                                        0.0,
+                                        -1.3805851936340332
+                                    ]
+                                },
+                                "Vertex3": {
+                                    "Position": [
+                                        -2.8895087242126465,
+                                        1.8805851936340332,
+                                        1.4375109672546387
+                                    ],
+                                    "UV": [
+                                        3.3895087242126465,
+                                        -1.3805851936340332
+                                    ]
+                                },
+                                "Normal": [
+                                    0.3874399662017822,
+                                    0.0,
+                                    0.9218949675559998
+                                ]
+                            },
+                            {
+                                "Vertex1": {
+                                    "Position": [
+                                        0.5,
+                                        -0.5,
+                                        0.013019919395446777
+                                    ],
+                                    "UV": [
+                                        0.0,
+                                        1.0
+                                    ]
+                                },
+                                "Vertex2": {
+                                    "Position": [
+                                        -2.8895087242126465,
+                                        1.8805851936340332,
+                                        1.4375109672546387
+                                    ],
+                                    "UV": [
+                                        3.3895087242126465,
+                                        -1.3805851936340332
+                                    ]
+                                },
+                                "Vertex3": {
+                                    "Position": [
+                                        -2.8895087242126465,
+                                        -0.5,
+                                        1.4375109672546387
+                                    ],
+                                    "UV": [
+                                        3.3895087242126465,
+                                        1.0
+                                    ]
+                                },
+                                "Normal": [
+                                    0.3874399662017822,
+                                    0.0,
+                                    0.9218949675559998
+                                ]
+                            },
+                            {
+                                "Vertex1": {
+                                    "Position": [
+                                        0.5,
+                                        1.8805851936340332,
+                                        0.013019919395446777
+                                    ],
+                                    "UV": [
+                                        0.0,
+                                        0.4869800806045532
+                                    ]
+                                },
+                                "Vertex2": {
+                                    "Position": [
+                                        -3.7256829738616943,
+                                        1.8805851936340332,
+                                        0.013019919395446777
+                                    ],
+                                    "UV": [
+                                        4.225683212280273,
+                                        0.4869800806045532
+                                    ]
+                                },
+                                "Vertex3": {
+                                    "Position": [
+                                        -3.675086259841919,
+                                        1.8805851936340332,
+                                        1.4496030807495117
+                                    ],
+                                    "UV": [
+                                        4.17508602142334,
+                                        -0.9496030807495117
+                                    ]
+                                },
+                                "Normal": [
+                                    0.0,
+                                    1.0,
+                                    0.0
+                                ]
+                            },
+                            {
+                                "Vertex1": {
+                                    "Position": [
+                                        0.5,
+                                        1.8805851936340332,
+                                        0.013019919395446777
+                                    ],
+                                    "UV": [
+                                        0.0,
+                                        0.4869800806045532
+                                    ]
+                                },
+                                "Vertex2": {
+                                    "Position": [
+                                        -3.675086259841919,
+                                        1.8805851936340332,
+                                        1.4496030807495117
+                                    ],
+                                    "UV": [
+                                        4.17508602142334,
+                                        -0.9496030807495117
+                                    ]
+                                },
+                                "Vertex3": {
+                                    "Position": [
+                                        -2.8895087242126465,
+                                        1.8805851936340332,
+                                        1.4375109672546387
+                                    ],
+                                    "UV": [
+                                        3.3895087242126465,
+                                        -0.9375109672546387
+                                    ]
+                                },
+                                "Normal": [
+                                    0.0,
+                                    1.0,
+                                    0.0
+                                ]
+                            },
+                            {
+                                "Vertex1": {
+                                    "Position": [
+                                        -3.7256829738616943,
+                                        1.8805851936340332,
+                                        0.013019919395446777
+                                    ],
+                                    "UV": [
+                                        0.4869800806045532,
+                                        -1.3805851936340332
+                                    ]
+                                },
+                                "Vertex2": {
+                                    "Position": [
+                                        -3.7256829738616943,
+                                        -0.5,
+                                        0.013019919395446777
+                                    ],
+                                    "UV": [
+                                        0.4869800806045532,
+                                        1.0
+                                    ]
+                                },
+                                "Vertex3": {
+                                    "Position": [
+                                        -3.675086259841919,
+                                        -0.5,
+                                        1.4496030807495117
+                                    ],
+                                    "UV": [
+                                        -0.9496030807495117,
+                                        1.0
+                                    ]
+                                },
+                                "Normal": [
+                                    -0.999380350112915,
+                                    0.0,
+                                    0.03519835323095322
+                                ]
+                            },
+                            {
+                                "Vertex1": {
+                                    "Position": [
+                                        -3.7256829738616943,
+                                        1.8805851936340332,
+                                        0.013019919395446777
+                                    ],
+                                    "UV": [
+                                        0.4869800806045532,
+                                        -1.3805851936340332
+                                    ]
+                                },
+                                "Vertex2": {
+                                    "Position": [
+                                        -3.675086259841919,
+                                        -0.5,
+                                        1.4496030807495117
+                                    ],
+                                    "UV": [
+                                        -0.9496030807495117,
+                                        1.0
+                                    ]
+                                },
+                                "Vertex3": {
+                                    "Position": [
+                                        -3.675086259841919,
+                                        1.8805851936340332,
+                                        1.4496030807495117
+                                    ],
+                                    "UV": [
+                                        -0.9496030807495117,
+                                        -1.3805851936340332
+                                    ]
+                                },
+                                "Normal": [
+                                    -0.999380350112915,
+                                    0.0,
+                                    0.03519835323095322
+                                ]
+                            }
+                        ]
+                    }
+                },
+                "Component_[12295523401034242674]": {
+                    "$type": "EditorVisibilityComponent",
+                    "Id": 12295523401034242674
+                },
+                "Component_[13084616973584100498]": {
+                    "$type": "{27F1E1A1-8D9D-4C3B-BD3A-AFB9762449C0} TransformComponent",
+                    "Id": 13084616973584100498,
+                    "Parent Entity": "Entity_[356758116574]",
+                    "Transform Data": {
+                        "Translate": [
+                            -6.851195335388184,
+                            -11.523387908935547,
+                            7.243025779724121
+                        ],
+                        "Rotate": [
+                            -89.9853286743164,
+                            -1.0297627449035645,
+                            -89.184326171875
+                        ],
+                        "UniformScale": 2.8766722679138184
+                    }
+                },
+                "Component_[16669350028946059581]": {
+                    "$type": "EditorWhiteBoxColliderComponent",
+                    "Id": 16669350028946059581,
+                    "Configuration": {
+                        "MaterialSlots": {
+                            "Slots": [
+                                {
+                                    "Name": "Entire object"
+                                }
+                            ]
+                        },
+                        "propertyVisibilityFlags": 235
+                    },
+                    "MeshData": {
+                        "CookedData": "TlhTAU1FU0gPAAAAAAAAAAYAAAAIAAAADAAAAJ00a8AAAAC/mIy5P7btOMAAAAC/XAC4P7btOMAEt/A/XAC4P500a8AEt/A/mIy5P5dxbsAEt/A/gFFVPAAAAD8Et/A/gFFVPAAAAD8AAAC/gFFVPJdxbsAAAAC/gFFVPAcGAQYFAgYCAQQFBgQGBwUDAgUEAwcBAAQAAwQHAAACAwABAgsAAAAEBgcCAwkIBQsKAQBSVFJFAgAAAMh5bsDFIAC/WSBNPAAAAADFIAA/ZsfwP/qcuT8AAAAAAACAPwAAgD8AAIA/AACAP4RBhzh8bBg4cQO4NwAAAAAEAAAAAQAAAAEAAAAEAAAAAQAAAAAAAADIeW7AyHluwMh5bsDIeW7AxSAAv8UgAL+ipvA/xSAAv1kgTTxZIE08WSBNPFkgTTzFIAA/xSAAP8UgAD+F5TjAZsfwP2bH8D9mx/A/ZsfwP74QuD+ngl08+py5P/qcuT8FAAAAYwAAAKMAAADpAAAAl3FuNZdxbsAAAAC/gFFVPAAAAD8Et/A/mIy5PwwAAAAYGDAYMDAYMDAYMBg="
+                    }
+                },
+                "Component_[2482608405239556663]": {
+                    "$type": "EditorLockComponent",
+                    "Id": 2482608405239556663
+                },
+                "Component_[3178633580050940733]": {
+                    "$type": "EditorEntityIconComponent",
+                    "Id": 3178633580050940733
+                },
+                "Component_[4537987012049413452]": {
+                    "$type": "EditorInspectorComponent",
+                    "Id": 4537987012049413452
+                },
+                "Component_[4551674752616433750]": {
+                    "$type": "EditorEntitySortComponent",
+                    "Id": 4551674752616433750
+                },
+                "Component_[7900137566441380515]": {
+                    "$type": "EditorPendingCompositionComponent",
+                    "Id": 7900137566441380515
+                }
+            }
+        },
         "Entity_[685366598502]": {
             "Id": "Entity_[685366598502]",
             "Name": "Gem Spawn Point",

+ 3 - 0
Materials/decal/scorch_01_decal.tif

@@ -0,0 +1,3 @@
+version https://git-lfs.github.com/spec/v1
+oid sha256:889072da11d2034a0d37ec6ae81b551a61b62d6d602965b0b919a999c56d67e2
+size 16793812

+ 63 - 0
Prefabs/Energy_Cannon_with_Energy_Ball.prefab

@@ -187,6 +187,68 @@
                     "$type": "EditorLockComponent",
                     "Id": 7697210517306281973
                 },
+                "Component_[8308919018390390778]": {
+                    "$type": "EditorScriptCanvasComponent",
+                    "Id": 8308919018390390778,
+                    "configuration": {
+                        "sourceHandle": {
+                            "id": "{6EA0260B-0747-51BF-944D-BE4B312FC90C}",
+                            "path": "scriptcanvas/WeaponImpactDecal.scriptcanvas"
+                        },
+                        "sourceName": "WeaponImpactDecal.scriptcanvas",
+                        "propertyOverrides": {
+                            "source": {
+                                "id": "{6EA0260B-0747-51BF-944D-BE4B312FC90C}",
+                                "path": "scriptcanvas/WeaponImpactDecal.scriptcanvas"
+                            },
+                            "variables": [
+                                {
+                                    "Datum": {
+                                        "isOverloadedStorage": false,
+                                        "scriptCanvasType": {
+                                            "m_type": 4,
+                                            "m_azType": "{FC3DA616-174B-48FD-9BFB-BC277132FB47}"
+                                        },
+                                        "isNullPointer": false,
+                                        "$type": "MultiplayerSample::SpawnDecalConfig"
+                                    },
+                                    "VariableId": {
+                                        "m_id": "{1850E939-4A77-4323-807E-6EFF953D8810}"
+                                    },
+                                    "VariableName": "Weapon Impact Decal Config",
+                                    "InitialValueSource": 1
+                                }
+                            ],
+                            "overrides": [
+                                {
+                                    "Datum": {
+                                        "isOverloadedStorage": false,
+                                        "scriptCanvasType": {
+                                            "m_type": 4,
+                                            "m_azType": "{FC3DA616-174B-48FD-9BFB-BC277132FB47}"
+                                        },
+                                        "isNullPointer": false,
+                                        "$type": "MultiplayerSample::SpawnDecalConfig",
+                                        "value": {
+                                            "Scale": 2.0,
+                                            "Opacity": 0.800000011920929,
+                                            "LifeTimeSec": 8.0,
+                                            "FadeOutTimeSec": 4.0
+                                        }
+                                    },
+                                    "InputControlVisibility": {
+                                        "Value": 850104567
+                                    },
+                                    "VariableId": {
+                                        "m_id": "{1850E939-4A77-4323-807E-6EFF953D8810}"
+                                    },
+                                    "VariableName": "Weapon Impact Decal Config",
+                                    "InitialValueSource": 1
+                                }
+                            ]
+                        }
+                    }
+                },
                 "Component_[8670461081840355986]": {
                     "$type": "EditorInspectorComponent",
                     "Id": 8670461081840355986,
@@ -287,6 +349,7 @@
                         "$type": "MultiplayerSample::EnergyCannonComponent",
                         "RateOfFireMs": 4000,
                         "BallLifetimeMs": 3800,
+                        "BuildUpTimeMs": 3300,
                         "FiringEffect": {
                             "ParticleAsset": {
                                 "guid": "{F16C718B-7B3D-5F6B-877C-0CA15AAE7544}"

+ 65 - 0
Prefabs/Player.prefab

@@ -232,6 +232,71 @@
                         "DeathParamName": "death_state_index"
                     }
                 },
+                "Component_[12776020870069594600]": {
+                    "$type": "EditorScriptCanvasComponent",
+                    "Id": 12776020870069594600,
+                    "configuration": {
+                        "sourceHandle": {
+                            "id": "{6EA0260B-0747-51BF-944D-BE4B312FC90C}",
+                            "path": "scriptcanvas/WeaponImpactDecal.scriptcanvas"
+                        },
+                        "sourceName": "WeaponImpactDecal.scriptcanvas",
+                        "propertyOverrides": {
+                            "source": {
+                                "id": "{6EA0260B-0747-51BF-944D-BE4B312FC90C}",
+                                "path": "scriptcanvas/WeaponImpactDecal.scriptcanvas"
+                            },
+                            "variables": [
+                                {
+                                    "Datum": {
+                                        "isOverloadedStorage": false,
+                                        "scriptCanvasType": {
+                                            "m_type": 4,
+                                            "m_azType": "{FC3DA616-174B-48FD-9BFB-BC277132FB47}"
+                                        },
+                                        "isNullPointer": false,
+                                        "$type": "MultiplayerSample::SpawnDecalConfig"
+                                    },
+                                    "VariableId": {
+                                        "m_id": "{1850E939-4A77-4323-807E-6EFF953D8810}"
+                                    },
+                                    "VariableName": "Weapon Impact Decal Config",
+                                    "InitialValueSource": 1
+                                }
+                            ],
+                            "overrides": [
+                                {
+                                    "Datum": {
+                                        "isOverloadedStorage": false,
+                                        "scriptCanvasType": {
+                                            "m_type": 4,
+                                            "m_azType": "{FC3DA616-174B-48FD-9BFB-BC277132FB47}"
+                                        },
+                                        "isNullPointer": false,
+                                        "$type": "MultiplayerSample::SpawnDecalConfig",
+                                        "value": {
+                                            "MaterialAssetId": {
+                                                "guid": "{FD203077-616F-53C5-9553-660CCB88DB7B}"
+                                            },
+                                            "Scale": 0.25,
+                                            "LifeTimeSec": 12.0,
+                                            "FadeOutTimeSec": 4.0,
+                                            "Thickness": 0.25
+                                        }
+                                    },
+                                    "InputControlVisibility": {
+                                        "Value": 850104567
+                                    },
+                                    "VariableId": {
+                                        "m_id": "{1850E939-4A77-4323-807E-6EFF953D8810}"
+                                    },
+                                    "VariableName": "Weapon Impact Decal Config",
+                                    "InitialValueSource": 1
+                                }
+                            ]
+                        }
+                    }
+                },
                 "Component_[13362124592556856876]": {
                     "$type": "GenericComponentWrapper",
                     "Id": 13362124592556856876,

Filskillnaden har hållts tillbaka eftersom den är för stor
+ 896 - 75
scriptcanvas/ShieldGeneratorRoundEffects.scriptcanvas


+ 1930 - 0
scriptcanvas/WeaponImpactDecal.scriptcanvas

@@ -0,0 +1,1930 @@
+{
+    "Type": "JsonSerialization",
+    "Version": 1,
+    "ClassName": "ScriptCanvasData",
+    "ClassData": {
+        "m_scriptCanvas": {
+            "Id": {
+                "id": 18141335447636
+            },
+            "Name": "Script Canvas Graph",
+            "Components": {
+                "Component_[6691107567630775583]": {
+                    "$type": "EditorGraphVariableManagerComponent",
+                    "Id": 6691107567630775583,
+                    "m_variableData": {
+                        "m_nameVariableMap": [
+                            {
+                                "Key": {
+                                    "m_id": "{1850E939-4A77-4323-807E-6EFF953D8810}"
+                                },
+                                "Value": {
+                                    "Datum": {
+                                        "isOverloadedStorage": false,
+                                        "scriptCanvasType": {
+                                            "m_type": 4,
+                                            "m_azType": "{FC3DA616-174B-48FD-9BFB-BC277132FB47}"
+                                        },
+                                        "isNullPointer": false,
+                                        "$type": "MultiplayerSample::SpawnDecalConfig"
+                                    },
+                                    "VariableId": {
+                                        "m_id": "{1850E939-4A77-4323-807E-6EFF953D8810}"
+                                    },
+                                    "VariableName": "Weapon Impact Decal Config",
+                                    "InitialValueSource": 1
+                                }
+                            }
+                        ]
+                    }
+                },
+                "Component_[697294833147644403]": {
+                    "$type": "EditorGraph",
+                    "Id": 697294833147644403,
+                    "m_graphData": {
+                        "m_nodes": [
+                            {
+                                "Id": {
+                                    "id": 18167105251412
+                                },
+                                "Name": "SC-Node(EqualTo)",
+                                "Components": {
+                                    "Component_[11172254024979017495]": {
+                                        "$type": "EqualTo",
+                                        "Id": 11172254024979017495,
+                                        "Slots": [
+                                            {
+                                                "id": {
+                                                    "m_id": "{1CBB43EA-70E9-48E4-BAE3-7FC215F55E07}"
+                                                },
+                                                "contracts": [
+                                                    {
+                                                        "$type": "SlotTypeContract"
+                                                    }
+                                                ],
+                                                "slotName": "Result",
+                                                "DisplayDataType": {
+                                                    "m_type": 0
+                                                },
+                                                "Descriptor": {
+                                                    "ConnectionType": 2,
+                                                    "SlotType": 2
+                                                },
+                                                "DataType": 1
+                                            },
+                                            {
+                                                "id": {
+                                                    "m_id": "{633068BE-124A-4291-9B4A-12E9F232A988}"
+                                                },
+                                                "contracts": [
+                                                    {
+                                                        "$type": "SlotTypeContract"
+                                                    }
+                                                ],
+                                                "slotName": "In",
+                                                "toolTip": "Signal to perform the evaluation when desired.",
+                                                "Descriptor": {
+                                                    "ConnectionType": 1,
+                                                    "SlotType": 1
+                                                }
+                                            },
+                                            {
+                                                "id": {
+                                                    "m_id": "{83EAE830-D299-49A8-935A-7E0DCBBCFE9C}"
+                                                },
+                                                "contracts": [
+                                                    {
+                                                        "$type": "SlotTypeContract"
+                                                    }
+                                                ],
+                                                "slotName": "True",
+                                                "toolTip": "Signaled if the result of the operation is true.",
+                                                "Descriptor": {
+                                                    "ConnectionType": 2,
+                                                    "SlotType": 1
+                                                }
+                                            },
+                                            {
+                                                "id": {
+                                                    "m_id": "{D54EDCC1-39DD-4AF3-AA64-28C3CEAB76C9}"
+                                                },
+                                                "contracts": [
+                                                    {
+                                                        "$type": "SlotTypeContract"
+                                                    }
+                                                ],
+                                                "slotName": "False",
+                                                "toolTip": "Signaled if the result of the operation is false.",
+                                                "Descriptor": {
+                                                    "ConnectionType": 2,
+                                                    "SlotType": 1
+                                                }
+                                            },
+                                            {
+                                                "id": {
+                                                    "m_id": "{3C0A925B-B9DF-4346-A6C8-8B52C664BB4F}"
+                                                },
+                                                "DynamicTypeOverride": 3,
+                                                "contracts": [
+                                                    {
+                                                        "$type": "SlotTypeContract"
+                                                    }
+                                                ],
+                                                "slotName": "Value A",
+                                                "DisplayDataType": {
+                                                    "m_type": 1
+                                                },
+                                                "Descriptor": {
+                                                    "ConnectionType": 1,
+                                                    "SlotType": 2
+                                                },
+                                                "DynamicGroup": {
+                                                    "Value": 3545012108
+                                                },
+                                                "DataType": 1
+                                            },
+                                            {
+                                                "id": {
+                                                    "m_id": "{BDA04E64-ECAB-45AC-B833-43E6A3193302}"
+                                                },
+                                                "DynamicTypeOverride": 3,
+                                                "contracts": [
+                                                    {
+                                                        "$type": "SlotTypeContract"
+                                                    }
+                                                ],
+                                                "slotName": "Value B",
+                                                "DisplayDataType": {
+                                                    "m_type": 1
+                                                },
+                                                "Descriptor": {
+                                                    "ConnectionType": 1,
+                                                    "SlotType": 2
+                                                },
+                                                "DynamicGroup": {
+                                                    "Value": 3545012108
+                                                },
+                                                "DataType": 1
+                                            }
+                                        ],
+                                        "Datums": [
+                                            {
+                                                "isOverloadedStorage": false,
+                                                "scriptCanvasType": {
+                                                    "m_type": 1
+                                                },
+                                                "isNullPointer": false,
+                                                "$type": "EntityId",
+                                                "value": {
+                                                    "id": 2901262558
+                                                },
+                                                "label": "Value A"
+                                            },
+                                            {
+                                                "isOverloadedStorage": false,
+                                                "scriptCanvasType": {
+                                                    "m_type": 1
+                                                },
+                                                "isNullPointer": false,
+                                                "$type": "EntityId",
+                                                "value": {
+                                                    "id": 2901262558
+                                                },
+                                                "label": "Value B"
+                                            }
+                                        ]
+                                    }
+                                }
+                            },
+                            {
+                                "Id": {
+                                    "id": 37241055012948
+                                },
+                                "Name": "SC-Node(SpawnDecal)",
+                                "Components": {
+                                    "Component_[13279494901284247922]": {
+                                        "$type": "{E42861BD-1956-45AE-8DD7-CCFC1E3E5ACF} Method",
+                                        "Id": 13279494901284247922,
+                                        "Slots": [
+                                            {
+                                                "id": {
+                                                    "m_id": "{135E833B-6553-448D-B2CD-2DA65BD4F36D}"
+                                                },
+                                                "contracts": [
+                                                    {
+                                                        "$type": "SlotTypeContract"
+                                                    }
+                                                ],
+                                                "slotName": "Uuid: 0",
+                                                "Descriptor": {
+                                                    "ConnectionType": 1,
+                                                    "SlotType": 2
+                                                },
+                                                "DataType": 1
+                                            },
+                                            {
+                                                "id": {
+                                                    "m_id": "{F861D814-26B3-48FB-BDD0-BAD7021B70B6}"
+                                                },
+                                                "contracts": [
+                                                    {
+                                                        "$type": "SlotTypeContract"
+                                                    }
+                                                ],
+                                                "slotName": "Transform: 1",
+                                                "Descriptor": {
+                                                    "ConnectionType": 1,
+                                                    "SlotType": 2
+                                                },
+                                                "DataType": 1
+                                            },
+                                            {
+                                                "id": {
+                                                    "m_id": "{BE735B23-FB8F-4BF6-B7E4-4EDE6355CA14}"
+                                                },
+                                                "contracts": [
+                                                    {
+                                                        "$type": "SlotTypeContract"
+                                                    }
+                                                ],
+                                                "slotName": "SpawnDecalConfig: 2",
+                                                "Descriptor": {
+                                                    "ConnectionType": 1,
+                                                    "SlotType": 2
+                                                },
+                                                "DataType": 1
+                                            },
+                                            {
+                                                "id": {
+                                                    "m_id": "{EA69C101-8368-40B2-9B0C-A34DB730A4C3}"
+                                                },
+                                                "contracts": [
+                                                    {
+                                                        "$type": "SlotTypeContract"
+                                                    }
+                                                ],
+                                                "slotName": "In",
+                                                "Descriptor": {
+                                                    "ConnectionType": 1,
+                                                    "SlotType": 1
+                                                }
+                                            },
+                                            {
+                                                "id": {
+                                                    "m_id": "{ACD63D64-8142-47B7-A094-89A148339725}"
+                                                },
+                                                "contracts": [
+                                                    {
+                                                        "$type": "SlotTypeContract"
+                                                    }
+                                                ],
+                                                "slotName": "Out",
+                                                "Descriptor": {
+                                                    "ConnectionType": 2,
+                                                    "SlotType": 1
+                                                }
+                                            }
+                                        ],
+                                        "Datums": [
+                                            {
+                                                "isOverloadedStorage": false,
+                                                "scriptCanvasType": {
+                                                    "m_type": 4,
+                                                    "m_azType": "{E152C105-A133-4D03-BBF8-3D4B2FBA3E2A}"
+                                                },
+                                                "isNullPointer": true,
+                                                "label": "Source"
+                                            },
+                                            {
+                                                "isOverloadedStorage": false,
+                                                "scriptCanvasType": {
+                                                    "m_type": 7
+                                                },
+                                                "isNullPointer": false,
+                                                "$type": "Transform",
+                                                "value": {
+                                                    "Translation": [
+                                                        0.0,
+                                                        0.0,
+                                                        0.0
+                                                    ],
+                                                    "Rotation": [
+                                                        0.0,
+                                                        0.0,
+                                                        0.0,
+                                                        1.0
+                                                    ],
+                                                    "Scale": 1.0
+                                                },
+                                                "label": "Transform: 1"
+                                            },
+                                            {
+                                                "isOverloadedStorage": false,
+                                                "scriptCanvasType": {
+                                                    "m_type": 4,
+                                                    "m_azType": "{FC3DA616-174B-48FD-9BFB-BC277132FB47}"
+                                                },
+                                                "isNullPointer": true,
+                                                "label": "SpawnDecalConfig: 2"
+                                            }
+                                        ],
+                                        "methodType": 0,
+                                        "methodName": "SpawnDecal",
+                                        "className": "RequestBus",
+                                        "inputSlots": [
+                                            {
+                                                "m_id": "{135E833B-6553-448D-B2CD-2DA65BD4F36D}"
+                                            },
+                                            {
+                                                "m_id": "{F861D814-26B3-48FB-BDD0-BAD7021B70B6}"
+                                            },
+                                            {
+                                                "m_id": "{BE735B23-FB8F-4BF6-B7E4-4EDE6355CA14}"
+                                            }
+                                        ],
+                                        "prettyClassName": "RequestBus"
+                                    }
+                                }
+                            },
+                            {
+                                "Id": {
+                                    "id": 18158515316820
+                                },
+                                "Name": "EBusEventHandler",
+                                "Components": {
+                                    "Component_[17419109423209890249]": {
+                                        "$type": "EBusEventHandler",
+                                        "Id": 17419109423209890249,
+                                        "Slots": [
+                                            {
+                                                "id": {
+                                                    "m_id": "{E7964A20-76D1-491F-95C5-8D479A99B9E3}"
+                                                },
+                                                "contracts": [
+                                                    {
+                                                        "$type": "SlotTypeContract"
+                                                    }
+                                                ],
+                                                "slotName": "Connect",
+                                                "toolTip": "Connect this event handler to the specified entity.",
+                                                "Descriptor": {
+                                                    "ConnectionType": 1,
+                                                    "SlotType": 1
+                                                }
+                                            },
+                                            {
+                                                "id": {
+                                                    "m_id": "{6191A358-29C5-46A2-B70E-1715CB8C1786}"
+                                                },
+                                                "contracts": [
+                                                    {
+                                                        "$type": "SlotTypeContract"
+                                                    }
+                                                ],
+                                                "slotName": "Disconnect",
+                                                "toolTip": "Disconnect this event handler.",
+                                                "Descriptor": {
+                                                    "ConnectionType": 1,
+                                                    "SlotType": 1
+                                                }
+                                            },
+                                            {
+                                                "id": {
+                                                    "m_id": "{4D2BC18B-713E-44F3-84B1-F2FEEC53B88C}"
+                                                },
+                                                "contracts": [
+                                                    {
+                                                        "$type": "SlotTypeContract"
+                                                    }
+                                                ],
+                                                "slotName": "OnConnected",
+                                                "toolTip": "Signaled when a connection has taken place.",
+                                                "Descriptor": {
+                                                    "ConnectionType": 2,
+                                                    "SlotType": 1
+                                                }
+                                            },
+                                            {
+                                                "id": {
+                                                    "m_id": "{B3640F9F-B757-40AF-B293-87157A9797B8}"
+                                                },
+                                                "contracts": [
+                                                    {
+                                                        "$type": "SlotTypeContract"
+                                                    }
+                                                ],
+                                                "slotName": "OnDisconnected",
+                                                "toolTip": "Signaled when this event handler is disconnected.",
+                                                "Descriptor": {
+                                                    "ConnectionType": 2,
+                                                    "SlotType": 1
+                                                }
+                                            },
+                                            {
+                                                "id": {
+                                                    "m_id": "{DB283E80-41EE-4833-BC2B-CD6B26BF042D}"
+                                                },
+                                                "contracts": [
+                                                    {
+                                                        "$type": "SlotTypeContract"
+                                                    }
+                                                ],
+                                                "slotName": "OnFailure",
+                                                "toolTip": "Signaled when it is not possible to connect this handler.",
+                                                "Descriptor": {
+                                                    "ConnectionType": 2,
+                                                    "SlotType": 1
+                                                }
+                                            },
+                                            {
+                                                "id": {
+                                                    "m_id": "{BEA9FF04-34B8-4726-8EBA-EF27725118AC}"
+                                                },
+                                                "contracts": [
+                                                    {
+                                                        "$type": "SlotTypeContract"
+                                                    }
+                                                ],
+                                                "slotName": "EntityId",
+                                                "DisplayDataType": {
+                                                    "m_type": 1
+                                                },
+                                                "Descriptor": {
+                                                    "ConnectionType": 2,
+                                                    "SlotType": 2
+                                                },
+                                                "DataType": 1
+                                            },
+                                            {
+                                                "id": {
+                                                    "m_id": "{2EE0B77C-EBA5-4DC9-8522-0F1902057DB8}"
+                                                },
+                                                "contracts": [
+                                                    {
+                                                        "$type": "SlotTypeContract"
+                                                    }
+                                                ],
+                                                "slotName": "Transform",
+                                                "DisplayDataType": {
+                                                    "m_type": 7
+                                                },
+                                                "Descriptor": {
+                                                    "ConnectionType": 2,
+                                                    "SlotType": 2
+                                                },
+                                                "DataType": 1
+                                            },
+                                            {
+                                                "id": {
+                                                    "m_id": "{F8789AA6-EC61-4644-873F-B240DB89E26D}"
+                                                },
+                                                "contracts": [
+                                                    {
+                                                        "$type": "SlotTypeContract"
+                                                    }
+                                                ],
+                                                "slotName": "ExecutionSlot:OnWeaponActivate",
+                                                "Descriptor": {
+                                                    "ConnectionType": 2,
+                                                    "SlotType": 1
+                                                },
+                                                "IsLatent": true
+                                            },
+                                            {
+                                                "id": {
+                                                    "m_id": "{435AEA8A-5692-4005-8760-38E678E87589}"
+                                                },
+                                                "contracts": [
+                                                    {
+                                                        "$type": "SlotTypeContract"
+                                                    }
+                                                ],
+                                                "slotName": "EntityId",
+                                                "DisplayDataType": {
+                                                    "m_type": 1
+                                                },
+                                                "Descriptor": {
+                                                    "ConnectionType": 2,
+                                                    "SlotType": 2
+                                                },
+                                                "DataType": 1
+                                            },
+                                            {
+                                                "id": {
+                                                    "m_id": "{B16F917B-D68D-4E40-B0D1-81B7BBF05D85}"
+                                                },
+                                                "contracts": [
+                                                    {
+                                                        "$type": "SlotTypeContract"
+                                                    }
+                                                ],
+                                                "slotName": "Transform",
+                                                "DisplayDataType": {
+                                                    "m_type": 7
+                                                },
+                                                "Descriptor": {
+                                                    "ConnectionType": 2,
+                                                    "SlotType": 2
+                                                },
+                                                "DataType": 1
+                                            },
+                                            {
+                                                "id": {
+                                                    "m_id": "{D2371D2A-A55B-4688-AE11-8244802BB404}"
+                                                },
+                                                "contracts": [
+                                                    {
+                                                        "$type": "SlotTypeContract"
+                                                    }
+                                                ],
+                                                "slotName": "EntityId",
+                                                "DisplayDataType": {
+                                                    "m_type": 1
+                                                },
+                                                "Descriptor": {
+                                                    "ConnectionType": 2,
+                                                    "SlotType": 2
+                                                },
+                                                "DataType": 1
+                                            },
+                                            {
+                                                "id": {
+                                                    "m_id": "{4D2D6DEF-6658-4CB2-A0AF-CDFBE5A18760}"
+                                                },
+                                                "contracts": [
+                                                    {
+                                                        "$type": "SlotTypeContract"
+                                                    }
+                                                ],
+                                                "slotName": "ExecutionSlot:OnWeaponImpact",
+                                                "Descriptor": {
+                                                    "ConnectionType": 2,
+                                                    "SlotType": 1
+                                                },
+                                                "IsLatent": true
+                                            },
+                                            {
+                                                "id": {
+                                                    "m_id": "{0FABD7AA-78B6-4E60-A113-1D7F2473E856}"
+                                                },
+                                                "contracts": [
+                                                    {
+                                                        "$type": "SlotTypeContract"
+                                                    }
+                                                ],
+                                                "slotName": "EntityId",
+                                                "DisplayDataType": {
+                                                    "m_type": 1
+                                                },
+                                                "Descriptor": {
+                                                    "ConnectionType": 2,
+                                                    "SlotType": 2
+                                                },
+                                                "DataType": 1
+                                            },
+                                            {
+                                                "id": {
+                                                    "m_id": "{F9B8F487-D4E6-4DC3-B6F1-11DC6C4C6B75}"
+                                                },
+                                                "contracts": [
+                                                    {
+                                                        "$type": "SlotTypeContract"
+                                                    }
+                                                ],
+                                                "slotName": "Transform",
+                                                "DisplayDataType": {
+                                                    "m_type": 7
+                                                },
+                                                "Descriptor": {
+                                                    "ConnectionType": 2,
+                                                    "SlotType": 2
+                                                },
+                                                "DataType": 1
+                                            },
+                                            {
+                                                "id": {
+                                                    "m_id": "{FF0060C4-3AF9-4FE9-9F66-09BE4CC5F8A4}"
+                                                },
+                                                "contracts": [
+                                                    {
+                                                        "$type": "SlotTypeContract"
+                                                    }
+                                                ],
+                                                "slotName": "EntityId",
+                                                "DisplayDataType": {
+                                                    "m_type": 1
+                                                },
+                                                "Descriptor": {
+                                                    "ConnectionType": 2,
+                                                    "SlotType": 2
+                                                },
+                                                "DataType": 1
+                                            },
+                                            {
+                                                "id": {
+                                                    "m_id": "{3D5AB8A8-A981-494B-8BDC-DA83B3BE2D66}"
+                                                },
+                                                "contracts": [
+                                                    {
+                                                        "$type": "SlotTypeContract"
+                                                    }
+                                                ],
+                                                "slotName": "ExecutionSlot:OnWeaponDamage",
+                                                "Descriptor": {
+                                                    "ConnectionType": 2,
+                                                    "SlotType": 1
+                                                },
+                                                "IsLatent": true
+                                            },
+                                            {
+                                                "id": {
+                                                    "m_id": "{B3AFC288-B7B0-4921-89DF-6CEEDD07926E}"
+                                                },
+                                                "contracts": [
+                                                    {
+                                                        "$type": "SlotTypeContract"
+                                                    }
+                                                ],
+                                                "slotName": "EntityId",
+                                                "DisplayDataType": {
+                                                    "m_type": 1
+                                                },
+                                                "Descriptor": {
+                                                    "ConnectionType": 2,
+                                                    "SlotType": 2
+                                                },
+                                                "DataType": 1
+                                            },
+                                            {
+                                                "id": {
+                                                    "m_id": "{07ADFD83-3FB2-4345-8C64-7DF9BF79A44D}"
+                                                },
+                                                "contracts": [
+                                                    {
+                                                        "$type": "SlotTypeContract"
+                                                    }
+                                                ],
+                                                "slotName": "EntityId",
+                                                "DisplayDataType": {
+                                                    "m_type": 1
+                                                },
+                                                "Descriptor": {
+                                                    "ConnectionType": 2,
+                                                    "SlotType": 2
+                                                },
+                                                "DataType": 1
+                                            },
+                                            {
+                                                "id": {
+                                                    "m_id": "{DF40FD46-11DF-40BF-B583-30435617D639}"
+                                                },
+                                                "contracts": [
+                                                    {
+                                                        "$type": "SlotTypeContract"
+                                                    }
+                                                ],
+                                                "slotName": "ExecutionSlot:OnConfirmedHitPlayer",
+                                                "Descriptor": {
+                                                    "ConnectionType": 2,
+                                                    "SlotType": 1
+                                                },
+                                                "IsLatent": true
+                                            }
+                                        ],
+                                        "m_eventMap": [
+                                            {
+                                                "Key": {
+                                                    "Value": 846731788
+                                                },
+                                                "Value": {
+                                                    "m_eventName": "OnWeaponDamage",
+                                                    "m_eventId": {
+                                                        "Value": 846731788
+                                                    },
+                                                    "m_eventSlotId": {
+                                                        "m_id": "{3D5AB8A8-A981-494B-8BDC-DA83B3BE2D66}"
+                                                    },
+                                                    "m_parameterSlotIds": [
+                                                        {
+                                                            "m_id": "{0FABD7AA-78B6-4E60-A113-1D7F2473E856}"
+                                                        },
+                                                        {
+                                                            "m_id": "{F9B8F487-D4E6-4DC3-B6F1-11DC6C4C6B75}"
+                                                        },
+                                                        {
+                                                            "m_id": "{FF0060C4-3AF9-4FE9-9F66-09BE4CC5F8A4}"
+                                                        }
+                                                    ],
+                                                    "m_numExpectedArguments": 3
+                                                }
+                                            },
+                                            {
+                                                "Key": {
+                                                    "Value": 1124016173
+                                                },
+                                                "Value": {
+                                                    "m_eventName": "OnWeaponActivate",
+                                                    "m_eventId": {
+                                                        "Value": 1124016173
+                                                    },
+                                                    "m_eventSlotId": {
+                                                        "m_id": "{F8789AA6-EC61-4644-873F-B240DB89E26D}"
+                                                    },
+                                                    "m_parameterSlotIds": [
+                                                        {
+                                                            "m_id": "{BEA9FF04-34B8-4726-8EBA-EF27725118AC}"
+                                                        },
+                                                        {
+                                                            "m_id": "{2EE0B77C-EBA5-4DC9-8522-0F1902057DB8}"
+                                                        }
+                                                    ],
+                                                    "m_numExpectedArguments": 2
+                                                }
+                                            },
+                                            {
+                                                "Key": {
+                                                    "Value": 3424710957
+                                                },
+                                                "Value": {
+                                                    "m_eventName": "OnConfirmedHitPlayer",
+                                                    "m_eventId": {
+                                                        "Value": 3424710957
+                                                    },
+                                                    "m_eventSlotId": {
+                                                        "m_id": "{DF40FD46-11DF-40BF-B583-30435617D639}"
+                                                    },
+                                                    "m_parameterSlotIds": [
+                                                        {
+                                                            "m_id": "{B3AFC288-B7B0-4921-89DF-6CEEDD07926E}"
+                                                        },
+                                                        {
+                                                            "m_id": "{07ADFD83-3FB2-4345-8C64-7DF9BF79A44D}"
+                                                        }
+                                                    ],
+                                                    "m_numExpectedArguments": 2
+                                                }
+                                            },
+                                            {
+                                                "Key": {
+                                                    "Value": 3887697511
+                                                },
+                                                "Value": {
+                                                    "m_eventName": "OnWeaponImpact",
+                                                    "m_eventId": {
+                                                        "Value": 3887697511
+                                                    },
+                                                    "m_eventSlotId": {
+                                                        "m_id": "{4D2D6DEF-6658-4CB2-A0AF-CDFBE5A18760}"
+                                                    },
+                                                    "m_parameterSlotIds": [
+                                                        {
+                                                            "m_id": "{435AEA8A-5692-4005-8760-38E678E87589}"
+                                                        },
+                                                        {
+                                                            "m_id": "{B16F917B-D68D-4E40-B0D1-81B7BBF05D85}"
+                                                        },
+                                                        {
+                                                            "m_id": "{D2371D2A-A55B-4688-AE11-8244802BB404}"
+                                                        }
+                                                    ],
+                                                    "m_numExpectedArguments": 3
+                                                }
+                                            }
+                                        ],
+                                        "m_ebusName": "WeaponNotificationBus",
+                                        "m_busId": {
+                                            "Value": 2900146421
+                                        }
+                                    }
+                                }
+                            },
+                            {
+                                "Id": {
+                                    "id": 18154220349524
+                                },
+                                "Name": "SC-Node(IfAgentTypeNodeableNode)",
+                                "Components": {
+                                    "Component_[4384075714551454019]": {
+                                        "$type": "IfAgentTypeNodeableNode",
+                                        "Id": 4384075714551454019,
+                                        "Slots": [
+                                            {
+                                                "id": {
+                                                    "m_id": "{DB5FBFEF-C276-46E3-84A0-BC4549A0912C}"
+                                                },
+                                                "contracts": [
+                                                    {
+                                                        "$type": "SlotTypeContract"
+                                                    }
+                                                ],
+                                                "slotName": "In",
+                                                "toolTip": "Branches on agent type",
+                                                "DisplayGroup": {
+                                                    "Value": 1609338446
+                                                },
+                                                "Descriptor": {
+                                                    "ConnectionType": 1,
+                                                    "SlotType": 1
+                                                }
+                                            },
+                                            {
+                                                "id": {
+                                                    "m_id": "{A79B433B-57E2-4B0C-8026-BF742A1F0994}"
+                                                },
+                                                "contracts": [
+                                                    {
+                                                        "$type": "SlotTypeContract"
+                                                    }
+                                                ],
+                                                "slotName": "If Client Type",
+                                                "toolTip": "A Client connected to either a server or host.",
+                                                "DisplayGroup": {
+                                                    "Value": 1609338446
+                                                },
+                                                "Descriptor": {
+                                                    "ConnectionType": 2,
+                                                    "SlotType": 1
+                                                }
+                                            },
+                                            {
+                                                "id": {
+                                                    "m_id": "{1350D1E4-F79E-42DA-AF41-2DAC7B868C1F}"
+                                                },
+                                                "contracts": [
+                                                    {
+                                                        "$type": "SlotTypeContract"
+                                                    }
+                                                ],
+                                                "slotName": "If ClientServer Type",
+                                                "toolTip": "A Client that also hosts and is the authority of the session",
+                                                "DisplayGroup": {
+                                                    "Value": 1609338446
+                                                },
+                                                "Descriptor": {
+                                                    "ConnectionType": 2,
+                                                    "SlotType": 1
+                                                }
+                                            },
+                                            {
+                                                "id": {
+                                                    "m_id": "{DA20EFDB-1615-4ACC-9394-EE3182AD40BA}"
+                                                },
+                                                "contracts": [
+                                                    {
+                                                        "$type": "SlotTypeContract"
+                                                    }
+                                                ],
+                                                "slotName": "If DedicatedServer Type",
+                                                "toolTip": "A Dedicated Server which does not locally host any clients",
+                                                "DisplayGroup": {
+                                                    "Value": 1609338446
+                                                },
+                                                "Descriptor": {
+                                                    "ConnectionType": 2,
+                                                    "SlotType": 1
+                                                }
+                                            },
+                                            {
+                                                "id": {
+                                                    "m_id": "{B5631986-30EC-4A58-838B-A1A7EB522BB6}"
+                                                },
+                                                "contracts": [
+                                                    {
+                                                        "$type": "SlotTypeContract"
+                                                    }
+                                                ],
+                                                "slotName": "If Singleplayer",
+                                                "toolTip": "The application is in single player mode",
+                                                "DisplayGroup": {
+                                                    "Value": 1609338446
+                                                },
+                                                "Descriptor": {
+                                                    "ConnectionType": 2,
+                                                    "SlotType": 1
+                                                }
+                                            }
+                                        ],
+                                        "slotExecutionMap": {
+                                            "ins": [
+                                                {
+                                                    "_slotId": {
+                                                        "m_id": "{DB5FBFEF-C276-46E3-84A0-BC4549A0912C}"
+                                                    },
+                                                    "_outs": [
+                                                        {
+                                                            "_slotId": {
+                                                                "m_id": "{A79B433B-57E2-4B0C-8026-BF742A1F0994}"
+                                                            },
+                                                            "_name": "If Client Type"
+                                                        },
+                                                        {
+                                                            "_slotId": {
+                                                                "m_id": "{1350D1E4-F79E-42DA-AF41-2DAC7B868C1F}"
+                                                            },
+                                                            "_name": "If ClientServer Type"
+                                                        },
+                                                        {
+                                                            "_slotId": {
+                                                                "m_id": "{DA20EFDB-1615-4ACC-9394-EE3182AD40BA}"
+                                                            },
+                                                            "_name": "If DedicatedServer Type"
+                                                        },
+                                                        {
+                                                            "_slotId": {
+                                                                "m_id": "{B5631986-30EC-4A58-838B-A1A7EB522BB6}"
+                                                            },
+                                                            "_name": "If Singleplayer"
+                                                        }
+                                                    ]
+                                                }
+                                            ]
+                                        }
+                                    }
+                                }
+                            },
+                            {
+                                "Id": {
+                                    "id": 18149925382228
+                                },
+                                "Name": "SC-Node(GetRenderSceneIdByName)",
+                                "Components": {
+                                    "Component_[5452490247162896746]": {
+                                        "$type": "{E42861BD-1956-45AE-8DD7-CCFC1E3E5ACF} Method",
+                                        "Id": 5452490247162896746,
+                                        "Slots": [
+                                            {
+                                                "id": {
+                                                    "m_id": "{1E38B865-E766-4396-A2BE-F1F9DC63073F}"
+                                                },
+                                                "contracts": [
+                                                    {
+                                                        "$type": "SlotTypeContract"
+                                                    }
+                                                ],
+                                                "slotName": "String",
+                                                "Descriptor": {
+                                                    "ConnectionType": 1,
+                                                    "SlotType": 2
+                                                },
+                                                "DataType": 1
+                                            },
+                                            {
+                                                "id": {
+                                                    "m_id": "{24906429-04AF-4674-AD8F-4C059AAFEC0E}"
+                                                },
+                                                "contracts": [
+                                                    {
+                                                        "$type": "SlotTypeContract"
+                                                    }
+                                                ],
+                                                "slotName": "In",
+                                                "Descriptor": {
+                                                    "ConnectionType": 1,
+                                                    "SlotType": 1
+                                                }
+                                            },
+                                            {
+                                                "id": {
+                                                    "m_id": "{51A62B12-7E10-44D3-8329-E8EC1BA88994}"
+                                                },
+                                                "contracts": [
+                                                    {
+                                                        "$type": "SlotTypeContract"
+                                                    }
+                                                ],
+                                                "slotName": "Out",
+                                                "Descriptor": {
+                                                    "ConnectionType": 2,
+                                                    "SlotType": 1
+                                                }
+                                            },
+                                            {
+                                                "id": {
+                                                    "m_id": "{C93D559F-BC84-446A-AD0F-A29EC77DD894}"
+                                                },
+                                                "contracts": [
+                                                    {
+                                                        "$type": "SlotTypeContract"
+                                                    }
+                                                ],
+                                                "slotName": "Uuid",
+                                                "DisplayDataType": {
+                                                    "m_type": 4,
+                                                    "m_azType": "{E152C105-A133-4D03-BBF8-3D4B2FBA3E2A}"
+                                                },
+                                                "Descriptor": {
+                                                    "ConnectionType": 2,
+                                                    "SlotType": 2
+                                                },
+                                                "DataType": 1
+                                            }
+                                        ],
+                                        "Datums": [
+                                            {
+                                                "isOverloadedStorage": false,
+                                                "scriptCanvasType": {
+                                                    "m_type": 5
+                                                },
+                                                "isNullPointer": false,
+                                                "$type": "{03AAAB3F-5C47-5A66-9EBC-D5FA4DB353C9} AZStd::string",
+                                                "value": "Main",
+                                                "label": "String"
+                                            }
+                                        ],
+                                        "methodType": 1,
+                                        "methodName": "GetRenderSceneIdByName",
+                                        "resultSlotIDs": [
+                                            {}
+                                        ],
+                                        "inputSlots": [
+                                            {
+                                                "m_id": "{1E38B865-E766-4396-A2BE-F1F9DC63073F}"
+                                            }
+                                        ],
+                                        "prettyClassName": "GetRenderSceneIdByName"
+                                    }
+                                }
+                            },
+                            {
+                                "Id": {
+                                    "id": 24884434102356
+                                },
+                                "Name": "SC Node(GetVariable)",
+                                "Components": {
+                                    "Component_[6670285999244204522]": {
+                                        "$type": "GetVariableNode",
+                                        "Id": 6670285999244204522,
+                                        "Slots": [
+                                            {
+                                                "id": {
+                                                    "m_id": "{60585556-6BC1-492F-9749-C6F25DBDDEEC}"
+                                                },
+                                                "contracts": [
+                                                    {
+                                                        "$type": "SlotTypeContract"
+                                                    }
+                                                ],
+                                                "slotName": "In",
+                                                "toolTip": "When signaled sends the property referenced by this node to a Data Output slot",
+                                                "Descriptor": {
+                                                    "ConnectionType": 1,
+                                                    "SlotType": 1
+                                                }
+                                            },
+                                            {
+                                                "id": {
+                                                    "m_id": "{2F3873D7-93E9-4C89-8BE6-73B9C1990B1E}"
+                                                },
+                                                "contracts": [
+                                                    {
+                                                        "$type": "SlotTypeContract"
+                                                    }
+                                                ],
+                                                "slotName": "Out",
+                                                "toolTip": "Signaled after the referenced property has been pushed to the Data Output slot",
+                                                "Descriptor": {
+                                                    "ConnectionType": 2,
+                                                    "SlotType": 1
+                                                }
+                                            },
+                                            {
+                                                "id": {
+                                                    "m_id": "{54F886F9-C840-46D2-8F9B-5E33705FC6ED}"
+                                                },
+                                                "contracts": [
+                                                    {
+                                                        "$type": "SlotTypeContract"
+                                                    }
+                                                ],
+                                                "slotName": "SpawnDecalConfig",
+                                                "DisplayDataType": {
+                                                    "m_type": 4,
+                                                    "m_azType": "{FC3DA616-174B-48FD-9BFB-BC277132FB47}"
+                                                },
+                                                "Descriptor": {
+                                                    "ConnectionType": 2,
+                                                    "SlotType": 2
+                                                },
+                                                "DataType": 1
+                                            },
+                                            {
+                                                "id": {
+                                                    "m_id": "{8159607F-B21B-4962-8735-531A83338480}"
+                                                },
+                                                "contracts": [
+                                                    {
+                                                        "$type": "SlotTypeContract"
+                                                    }
+                                                ],
+                                                "slotName": "material",
+                                                "DisplayDataType": {
+                                                    "m_type": 19
+                                                },
+                                                "Descriptor": {
+                                                    "ConnectionType": 2,
+                                                    "SlotType": 2
+                                                },
+                                                "DataType": 1
+                                            },
+                                            {
+                                                "id": {
+                                                    "m_id": "{7E58A1D5-46BE-462A-9C50-8EA0807A8728}"
+                                                },
+                                                "contracts": [
+                                                    {
+                                                        "$type": "SlotTypeContract"
+                                                    }
+                                                ],
+                                                "slotName": "fadeInTimeSec",
+                                                "DisplayDataType": {
+                                                    "m_type": 3
+                                                },
+                                                "Descriptor": {
+                                                    "ConnectionType": 2,
+                                                    "SlotType": 2
+                                                },
+                                                "DataType": 1
+                                            },
+                                            {
+                                                "id": {
+                                                    "m_id": "{06A8C417-6842-40B4-969D-C18DCA471F55}"
+                                                },
+                                                "contracts": [
+                                                    {
+                                                        "$type": "SlotTypeContract"
+                                                    }
+                                                ],
+                                                "slotName": "scale",
+                                                "DisplayDataType": {
+                                                    "m_type": 3
+                                                },
+                                                "Descriptor": {
+                                                    "ConnectionType": 2,
+                                                    "SlotType": 2
+                                                },
+                                                "DataType": 1
+                                            },
+                                            {
+                                                "id": {
+                                                    "m_id": "{6EA9D47D-18B7-4AF6-B143-2229DF3F3F15}"
+                                                },
+                                                "contracts": [
+                                                    {
+                                                        "$type": "SlotTypeContract"
+                                                    }
+                                                ],
+                                                "slotName": "opacity",
+                                                "DisplayDataType": {
+                                                    "m_type": 3
+                                                },
+                                                "Descriptor": {
+                                                    "ConnectionType": 2,
+                                                    "SlotType": 2
+                                                },
+                                                "DataType": 1
+                                            },
+                                            {
+                                                "id": {
+                                                    "m_id": "{B88FC4EE-6D71-4289-A1F0-66A664C0C4C1}"
+                                                },
+                                                "contracts": [
+                                                    {
+                                                        "$type": "SlotTypeContract"
+                                                    }
+                                                ],
+                                                "slotName": "attenuationAngle",
+                                                "DisplayDataType": {
+                                                    "m_type": 3
+                                                },
+                                                "Descriptor": {
+                                                    "ConnectionType": 2,
+                                                    "SlotType": 2
+                                                },
+                                                "DataType": 1
+                                            },
+                                            {
+                                                "id": {
+                                                    "m_id": "{4E22AB48-9AA4-4F58-920E-EEE8D5A53305}"
+                                                },
+                                                "contracts": [
+                                                    {
+                                                        "$type": "SlotTypeContract"
+                                                    }
+                                                ],
+                                                "slotName": "lifeTimeSec",
+                                                "DisplayDataType": {
+                                                    "m_type": 3
+                                                },
+                                                "Descriptor": {
+                                                    "ConnectionType": 2,
+                                                    "SlotType": 2
+                                                },
+                                                "DataType": 1
+                                            },
+                                            {
+                                                "id": {
+                                                    "m_id": "{5891A7F8-02B8-412B-A099-2407D6CC1600}"
+                                                },
+                                                "contracts": [
+                                                    {
+                                                        "$type": "SlotTypeContract"
+                                                    }
+                                                ],
+                                                "slotName": "fadeOutTimeSec",
+                                                "DisplayDataType": {
+                                                    "m_type": 3
+                                                },
+                                                "Descriptor": {
+                                                    "ConnectionType": 2,
+                                                    "SlotType": 2
+                                                },
+                                                "DataType": 1
+                                            },
+                                            {
+                                                "id": {
+                                                    "m_id": "{F2168D81-1EA9-4F52-AC5A-183EF0D775A0}"
+                                                },
+                                                "contracts": [
+                                                    {
+                                                        "$type": "SlotTypeContract"
+                                                    }
+                                                ],
+                                                "slotName": "thickness",
+                                                "DisplayDataType": {
+                                                    "m_type": 3
+                                                },
+                                                "Descriptor": {
+                                                    "ConnectionType": 2,
+                                                    "SlotType": 2
+                                                },
+                                                "DataType": 1
+                                            },
+                                            {
+                                                "id": {
+                                                    "m_id": "{E7012119-4DDE-4536-A811-0C0506C5B7F4}"
+                                                },
+                                                "contracts": [
+                                                    {
+                                                        "$type": "SlotTypeContract"
+                                                    }
+                                                ],
+                                                "slotName": "sortKey",
+                                                "DisplayDataType": {
+                                                    "m_type": 3
+                                                },
+                                                "Descriptor": {
+                                                    "ConnectionType": 2,
+                                                    "SlotType": 2
+                                                },
+                                                "DataType": 1
+                                            }
+                                        ],
+                                        "m_variableId": {
+                                            "m_id": "{1850E939-4A77-4323-807E-6EFF953D8810}"
+                                        },
+                                        "m_variableDataOutSlotId": {
+                                            "m_id": "{54F886F9-C840-46D2-8F9B-5E33705FC6ED}"
+                                        },
+                                        "m_propertyAccounts": [
+                                            {
+                                                "m_propertySlotId": {
+                                                    "m_id": "{8159607F-B21B-4962-8735-531A83338480}"
+                                                },
+                                                "m_propertyType": {
+                                                    "m_type": 19
+                                                },
+                                                "m_propertyName": "material"
+                                            },
+                                            {
+                                                "m_propertySlotId": {
+                                                    "m_id": "{7E58A1D5-46BE-462A-9C50-8EA0807A8728}"
+                                                },
+                                                "m_propertyType": {
+                                                    "m_type": 3
+                                                },
+                                                "m_propertyName": "fadeInTimeSec"
+                                            },
+                                            {
+                                                "m_propertySlotId": {
+                                                    "m_id": "{06A8C417-6842-40B4-969D-C18DCA471F55}"
+                                                },
+                                                "m_propertyType": {
+                                                    "m_type": 3
+                                                },
+                                                "m_propertyName": "scale"
+                                            },
+                                            {
+                                                "m_propertySlotId": {
+                                                    "m_id": "{6EA9D47D-18B7-4AF6-B143-2229DF3F3F15}"
+                                                },
+                                                "m_propertyType": {
+                                                    "m_type": 3
+                                                },
+                                                "m_propertyName": "opacity"
+                                            },
+                                            {
+                                                "m_propertySlotId": {
+                                                    "m_id": "{B88FC4EE-6D71-4289-A1F0-66A664C0C4C1}"
+                                                },
+                                                "m_propertyType": {
+                                                    "m_type": 3
+                                                },
+                                                "m_propertyName": "attenuationAngle"
+                                            },
+                                            {
+                                                "m_propertySlotId": {
+                                                    "m_id": "{4E22AB48-9AA4-4F58-920E-EEE8D5A53305}"
+                                                },
+                                                "m_propertyType": {
+                                                    "m_type": 3
+                                                },
+                                                "m_propertyName": "lifeTimeSec"
+                                            },
+                                            {
+                                                "m_propertySlotId": {
+                                                    "m_id": "{5891A7F8-02B8-412B-A099-2407D6CC1600}"
+                                                },
+                                                "m_propertyType": {
+                                                    "m_type": 3
+                                                },
+                                                "m_propertyName": "fadeOutTimeSec"
+                                            },
+                                            {
+                                                "m_propertySlotId": {
+                                                    "m_id": "{F2168D81-1EA9-4F52-AC5A-183EF0D775A0}"
+                                                },
+                                                "m_propertyType": {
+                                                    "m_type": 3
+                                                },
+                                                "m_propertyName": "thickness"
+                                            },
+                                            {
+                                                "m_propertySlotId": {
+                                                    "m_id": "{E7012119-4DDE-4536-A811-0C0506C5B7F4}"
+                                                },
+                                                "m_propertyType": {
+                                                    "m_type": 3
+                                                },
+                                                "m_propertyName": "sortKey"
+                                            }
+                                        ]
+                                    }
+                                }
+                            }
+                        ],
+                        "m_connections": [
+                            {
+                                "Id": {
+                                    "id": 18175695186004
+                                },
+                                "Name": "srcEndpoint=(IfMultiplayerAgentType: If Client Type), destEndpoint=(GetRenderSceneIdByName: In)",
+                                "Components": {
+                                    "Component_[2703780263841702711]": {
+                                        "$type": "{64CA5016-E803-4AC4-9A36-BDA2C890C6EB} Connection",
+                                        "Id": 2703780263841702711,
+                                        "sourceEndpoint": {
+                                            "nodeId": {
+                                                "id": 18154220349524
+                                            },
+                                            "slotId": {
+                                                "m_id": "{A79B433B-57E2-4B0C-8026-BF742A1F0994}"
+                                            }
+                                        },
+                                        "targetEndpoint": {
+                                            "nodeId": {
+                                                "id": 18149925382228
+                                            },
+                                            "slotId": {
+                                                "m_id": "{24906429-04AF-4674-AD8F-4C059AAFEC0E}"
+                                            }
+                                        }
+                                    }
+                                }
+                            },
+                            {
+                                "Id": {
+                                    "id": 18179990153300
+                                },
+                                "Name": "srcEndpoint=(IfMultiplayerAgentType: If ClientServer Type), destEndpoint=(GetRenderSceneIdByName: In)",
+                                "Components": {
+                                    "Component_[10018351341783483527]": {
+                                        "$type": "{64CA5016-E803-4AC4-9A36-BDA2C890C6EB} Connection",
+                                        "Id": 10018351341783483527,
+                                        "sourceEndpoint": {
+                                            "nodeId": {
+                                                "id": 18154220349524
+                                            },
+                                            "slotId": {
+                                                "m_id": "{1350D1E4-F79E-42DA-AF41-2DAC7B868C1F}"
+                                            }
+                                        },
+                                        "targetEndpoint": {
+                                            "nodeId": {
+                                                "id": 18149925382228
+                                            },
+                                            "slotId": {
+                                                "m_id": "{24906429-04AF-4674-AD8F-4C059AAFEC0E}"
+                                            }
+                                        }
+                                    }
+                                }
+                            },
+                            {
+                                "Id": {
+                                    "id": 18184285120596
+                                },
+                                "Name": "srcEndpoint=(IfMultiplayerAgentType: If Singleplayer), destEndpoint=(GetRenderSceneIdByName: In)",
+                                "Components": {
+                                    "Component_[12066342146685190189]": {
+                                        "$type": "{64CA5016-E803-4AC4-9A36-BDA2C890C6EB} Connection",
+                                        "Id": 12066342146685190189,
+                                        "sourceEndpoint": {
+                                            "nodeId": {
+                                                "id": 18154220349524
+                                            },
+                                            "slotId": {
+                                                "m_id": "{B5631986-30EC-4A58-838B-A1A7EB522BB6}"
+                                            }
+                                        },
+                                        "targetEndpoint": {
+                                            "nodeId": {
+                                                "id": 18149925382228
+                                            },
+                                            "slotId": {
+                                                "m_id": "{24906429-04AF-4674-AD8F-4C059AAFEC0E}"
+                                            }
+                                        }
+                                    }
+                                }
+                            },
+                            {
+                                "Id": {
+                                    "id": 18188580087892
+                                },
+                                "Name": "srcEndpoint=(WeaponNotificationBus Handler: EntityId), destEndpoint=(Equal To (==): Value A)",
+                                "Components": {
+                                    "Component_[114957198274854096]": {
+                                        "$type": "{64CA5016-E803-4AC4-9A36-BDA2C890C6EB} Connection",
+                                        "Id": 114957198274854096,
+                                        "sourceEndpoint": {
+                                            "nodeId": {
+                                                "id": 18158515316820
+                                            },
+                                            "slotId": {
+                                                "m_id": "{435AEA8A-5692-4005-8760-38E678E87589}"
+                                            }
+                                        },
+                                        "targetEndpoint": {
+                                            "nodeId": {
+                                                "id": 18167105251412
+                                            },
+                                            "slotId": {
+                                                "m_id": "{3C0A925B-B9DF-4346-A6C8-8B52C664BB4F}"
+                                            }
+                                        }
+                                    }
+                                }
+                            },
+                            {
+                                "Id": {
+                                    "id": 18192875055188
+                                },
+                                "Name": "srcEndpoint=(Equal To (==): True), destEndpoint=(IfMultiplayerAgentType: In)",
+                                "Components": {
+                                    "Component_[13210480970754208944]": {
+                                        "$type": "{64CA5016-E803-4AC4-9A36-BDA2C890C6EB} Connection",
+                                        "Id": 13210480970754208944,
+                                        "sourceEndpoint": {
+                                            "nodeId": {
+                                                "id": 18167105251412
+                                            },
+                                            "slotId": {
+                                                "m_id": "{83EAE830-D299-49A8-935A-7E0DCBBCFE9C}"
+                                            }
+                                        },
+                                        "targetEndpoint": {
+                                            "nodeId": {
+                                                "id": 18154220349524
+                                            },
+                                            "slotId": {
+                                                "m_id": "{DB5FBFEF-C276-46E3-84A0-BC4549A0912C}"
+                                            }
+                                        }
+                                    }
+                                }
+                            },
+                            {
+                                "Id": {
+                                    "id": 18197170022484
+                                },
+                                "Name": "srcEndpoint=(WeaponNotificationBus Handler: ExecutionSlot:OnWeaponImpact), destEndpoint=(Equal To (==): In)",
+                                "Components": {
+                                    "Component_[15021622587972159701]": {
+                                        "$type": "{64CA5016-E803-4AC4-9A36-BDA2C890C6EB} Connection",
+                                        "Id": 15021622587972159701,
+                                        "sourceEndpoint": {
+                                            "nodeId": {
+                                                "id": 18158515316820
+                                            },
+                                            "slotId": {
+                                                "m_id": "{4D2D6DEF-6658-4CB2-A0AF-CDFBE5A18760}"
+                                            }
+                                        },
+                                        "targetEndpoint": {
+                                            "nodeId": {
+                                                "id": 18167105251412
+                                            },
+                                            "slotId": {
+                                                "m_id": "{633068BE-124A-4291-9B4A-12E9F232A988}"
+                                            }
+                                        }
+                                    }
+                                }
+                            },
+                            {
+                                "Id": {
+                                    "id": 26611010955348
+                                },
+                                "Name": "srcEndpoint=(GetRenderSceneIdByName: Out), destEndpoint=(Get Variable: In)",
+                                "Components": {
+                                    "Component_[9268406966892681121]": {
+                                        "$type": "{64CA5016-E803-4AC4-9A36-BDA2C890C6EB} Connection",
+                                        "Id": 9268406966892681121,
+                                        "sourceEndpoint": {
+                                            "nodeId": {
+                                                "id": 18149925382228
+                                            },
+                                            "slotId": {
+                                                "m_id": "{51A62B12-7E10-44D3-8329-E8EC1BA88994}"
+                                            }
+                                        },
+                                        "targetEndpoint": {
+                                            "nodeId": {
+                                                "id": 24884434102356
+                                            },
+                                            "slotId": {
+                                                "m_id": "{60585556-6BC1-492F-9749-C6F25DBDDEEC}"
+                                            }
+                                        }
+                                    }
+                                }
+                            },
+                            {
+                                "Id": {
+                                    "id": 38357746509908
+                                },
+                                "Name": "srcEndpoint=(Get Variable: Out), destEndpoint=(SpawnDecal: In)",
+                                "Components": {
+                                    "Component_[8463797473777258651]": {
+                                        "$type": "{64CA5016-E803-4AC4-9A36-BDA2C890C6EB} Connection",
+                                        "Id": 8463797473777258651,
+                                        "sourceEndpoint": {
+                                            "nodeId": {
+                                                "id": 24884434102356
+                                            },
+                                            "slotId": {
+                                                "m_id": "{2F3873D7-93E9-4C89-8BE6-73B9C1990B1E}"
+                                            }
+                                        },
+                                        "targetEndpoint": {
+                                            "nodeId": {
+                                                "id": 37241055012948
+                                            },
+                                            "slotId": {
+                                                "m_id": "{EA69C101-8368-40B2-9B0C-A34DB730A4C3}"
+                                            }
+                                        }
+                                    }
+                                }
+                            },
+                            {
+                                "Id": {
+                                    "id": 38688458991700
+                                },
+                                "Name": "srcEndpoint=(GetRenderSceneIdByName: Uuid), destEndpoint=(SpawnDecal: Uuid: 0)",
+                                "Components": {
+                                    "Component_[16029061990498217012]": {
+                                        "$type": "{64CA5016-E803-4AC4-9A36-BDA2C890C6EB} Connection",
+                                        "Id": 16029061990498217012,
+                                        "sourceEndpoint": {
+                                            "nodeId": {
+                                                "id": 18149925382228
+                                            },
+                                            "slotId": {
+                                                "m_id": "{C93D559F-BC84-446A-AD0F-A29EC77DD894}"
+                                            }
+                                        },
+                                        "targetEndpoint": {
+                                            "nodeId": {
+                                                "id": 37241055012948
+                                            },
+                                            "slotId": {
+                                                "m_id": "{135E833B-6553-448D-B2CD-2DA65BD4F36D}"
+                                            }
+                                        }
+                                    }
+                                }
+                            },
+                            {
+                                "Id": {
+                                    "id": 39276869511252
+                                },
+                                "Name": "srcEndpoint=(WeaponNotificationBus Handler: Transform), destEndpoint=(SpawnDecal: Transform: 1)",
+                                "Components": {
+                                    "Component_[2712125283736436105]": {
+                                        "$type": "{64CA5016-E803-4AC4-9A36-BDA2C890C6EB} Connection",
+                                        "Id": 2712125283736436105,
+                                        "sourceEndpoint": {
+                                            "nodeId": {
+                                                "id": 18158515316820
+                                            },
+                                            "slotId": {
+                                                "m_id": "{B16F917B-D68D-4E40-B0D1-81B7BBF05D85}"
+                                            }
+                                        },
+                                        "targetEndpoint": {
+                                            "nodeId": {
+                                                "id": 37241055012948
+                                            },
+                                            "slotId": {
+                                                "m_id": "{F861D814-26B3-48FB-BDD0-BAD7021B70B6}"
+                                            }
+                                        }
+                                    }
+                                }
+                            },
+                            {
+                                "Id": {
+                                    "id": 39577517221972
+                                },
+                                "Name": "srcEndpoint=(Get Variable: SpawnDecalConfig), destEndpoint=(SpawnDecal: SpawnDecalConfig: 2)",
+                                "Components": {
+                                    "Component_[11982032547558231432]": {
+                                        "$type": "{64CA5016-E803-4AC4-9A36-BDA2C890C6EB} Connection",
+                                        "Id": 11982032547558231432,
+                                        "sourceEndpoint": {
+                                            "nodeId": {
+                                                "id": 24884434102356
+                                            },
+                                            "slotId": {
+                                                "m_id": "{54F886F9-C840-46D2-8F9B-5E33705FC6ED}"
+                                            }
+                                        },
+                                        "targetEndpoint": {
+                                            "nodeId": {
+                                                "id": 37241055012948
+                                            },
+                                            "slotId": {
+                                                "m_id": "{BE735B23-FB8F-4BF6-B7E4-4EDE6355CA14}"
+                                            }
+                                        }
+                                    }
+                                }
+                            }
+                        ]
+                    },
+                    "versionData": {
+                        "_grammarVersion": 1,
+                        "_runtimeVersion": 1,
+                        "_fileVersion": 1
+                    },
+                    "m_variableCounter": 2,
+                    "GraphCanvasData": [
+                        {
+                            "Key": {
+                                "id": 18141335447636
+                            },
+                            "Value": {
+                                "ComponentData": {
+                                    "{5F84B500-8C45-40D1-8EFC-A5306B241444}": {
+                                        "$type": "SceneComponentSaveData",
+                                        "ViewParams": {
+                                            "Scale": 0.6302871424724118,
+                                            "AnchorX": -533.09033203125,
+                                            "AnchorY": -433.13592529296875
+                                        }
+                                    }
+                                }
+                            }
+                        },
+                        {
+                            "Key": {
+                                "id": 18149925382228
+                            },
+                            "Value": {
+                                "ComponentData": {
+                                    "{24CB38BB-1705-4EC5-8F63-B574571B4DCD}": {
+                                        "$type": "NodeSaveData"
+                                    },
+                                    "{328FF15C-C302-458F-A43D-E1794DE0904E}": {
+                                        "$type": "GeneralNodeTitleComponentSaveData",
+                                        "PaletteOverride": "MethodNodeTitlePalette"
+                                    },
+                                    "{7CC444B1-F9B3-41B5-841B-0C4F2179F111}": {
+                                        "$type": "GeometrySaveData",
+                                        "Position": [
+                                            660.0,
+                                            120.0
+                                        ]
+                                    },
+                                    "{B0B99C8A-03AF-4CF6-A926-F65C874C3D97}": {
+                                        "$type": "StylingComponentSaveData",
+                                        "SubStyle": ".method"
+                                    },
+                                    "{B1F49A35-8408-40DA-B79E-F1E3B64322CE}": {
+                                        "$type": "PersistentIdComponentSaveData",
+                                        "PersistentId": "{DCD60797-AFE8-45F1-9B09-2180D01F15CF}"
+                                    }
+                                }
+                            }
+                        },
+                        {
+                            "Key": {
+                                "id": 18154220349524
+                            },
+                            "Value": {
+                                "ComponentData": {
+                                    "{24CB38BB-1705-4EC5-8F63-B574571B4DCD}": {
+                                        "$type": "NodeSaveData"
+                                    },
+                                    "{328FF15C-C302-458F-A43D-E1794DE0904E}": {
+                                        "$type": "GeneralNodeTitleComponentSaveData",
+                                        "PaletteOverride": "DefaultNodeTitlePalette"
+                                    },
+                                    "{7CC444B1-F9B3-41B5-841B-0C4F2179F111}": {
+                                        "$type": "GeometrySaveData",
+                                        "Position": [
+                                            340.0,
+                                            120.0
+                                        ]
+                                    },
+                                    "{B0B99C8A-03AF-4CF6-A926-F65C874C3D97}": {
+                                        "$type": "StylingComponentSaveData"
+                                    },
+                                    "{B1F49A35-8408-40DA-B79E-F1E3B64322CE}": {
+                                        "$type": "PersistentIdComponentSaveData",
+                                        "PersistentId": "{2F0FC166-8F9E-40F4-B243-4E739CF6F276}"
+                                    }
+                                }
+                            }
+                        },
+                        {
+                            "Key": {
+                                "id": 18158515316820
+                            },
+                            "Value": {
+                                "ComponentData": {
+                                    "{24CB38BB-1705-4EC5-8F63-B574571B4DCD}": {
+                                        "$type": "NodeSaveData"
+                                    },
+                                    "{7CC444B1-F9B3-41B5-841B-0C4F2179F111}": {
+                                        "$type": "GeometrySaveData",
+                                        "Position": [
+                                            -420.0,
+                                            120.0
+                                        ]
+                                    },
+                                    "{9E81C95F-89C0-4476-8E82-63CCC4E52E04}": {
+                                        "$type": "EBusHandlerNodeDescriptorSaveData",
+                                        "EventIds": [
+                                            {
+                                                "Value": 3887697511
+                                            }
+                                        ]
+                                    },
+                                    "{B0B99C8A-03AF-4CF6-A926-F65C874C3D97}": {
+                                        "$type": "StylingComponentSaveData"
+                                    },
+                                    "{B1F49A35-8408-40DA-B79E-F1E3B64322CE}": {
+                                        "$type": "PersistentIdComponentSaveData",
+                                        "PersistentId": "{3F310628-5C96-40AB-8E64-CBBCE800D50A}"
+                                    }
+                                }
+                            }
+                        },
+                        {
+                            "Key": {
+                                "id": 18167105251412
+                            },
+                            "Value": {
+                                "ComponentData": {
+                                    "{24CB38BB-1705-4EC5-8F63-B574571B4DCD}": {
+                                        "$type": "NodeSaveData"
+                                    },
+                                    "{328FF15C-C302-458F-A43D-E1794DE0904E}": {
+                                        "$type": "GeneralNodeTitleComponentSaveData",
+                                        "PaletteOverride": "MathNodeTitlePalette"
+                                    },
+                                    "{7CC444B1-F9B3-41B5-841B-0C4F2179F111}": {
+                                        "$type": "GeometrySaveData",
+                                        "Position": [
+                                            -100.0,
+                                            120.0
+                                        ]
+                                    },
+                                    "{B0B99C8A-03AF-4CF6-A926-F65C874C3D97}": {
+                                        "$type": "StylingComponentSaveData"
+                                    },
+                                    "{B1F49A35-8408-40DA-B79E-F1E3B64322CE}": {
+                                        "$type": "PersistentIdComponentSaveData",
+                                        "PersistentId": "{DFA35CD7-9FE1-4C4D-9A83-BDA8D57118C7}"
+                                    }
+                                }
+                            }
+                        },
+                        {
+                            "Key": {
+                                "id": 24884434102356
+                            },
+                            "Value": {
+                                "ComponentData": {
+                                    "{24CB38BB-1705-4EC5-8F63-B574571B4DCD}": {
+                                        "$type": "NodeSaveData"
+                                    },
+                                    "{328FF15C-C302-458F-A43D-E1794DE0904E}": {
+                                        "$type": "GeneralNodeTitleComponentSaveData",
+                                        "PaletteOverride": "GetVariableNodeTitlePalette"
+                                    },
+                                    "{7CC444B1-F9B3-41B5-841B-0C4F2179F111}": {
+                                        "$type": "GeometrySaveData",
+                                        "Position": [
+                                            1160.0,
+                                            80.0
+                                        ]
+                                    },
+                                    "{B0B99C8A-03AF-4CF6-A926-F65C874C3D97}": {
+                                        "$type": "StylingComponentSaveData",
+                                        "SubStyle": ".getVariable"
+                                    },
+                                    "{B1F49A35-8408-40DA-B79E-F1E3B64322CE}": {
+                                        "$type": "PersistentIdComponentSaveData",
+                                        "PersistentId": "{8067D04B-6EC0-49C3-B77F-0D199779EF63}"
+                                    }
+                                }
+                            }
+                        },
+                        {
+                            "Key": {
+                                "id": 37241055012948
+                            },
+                            "Value": {
+                                "ComponentData": {
+                                    "{24CB38BB-1705-4EC5-8F63-B574571B4DCD}": {
+                                        "$type": "NodeSaveData"
+                                    },
+                                    "{328FF15C-C302-458F-A43D-E1794DE0904E}": {
+                                        "$type": "GeneralNodeTitleComponentSaveData",
+                                        "PaletteOverride": "MethodNodeTitlePalette"
+                                    },
+                                    "{7CC444B1-F9B3-41B5-841B-0C4F2179F111}": {
+                                        "$type": "GeometrySaveData",
+                                        "Position": [
+                                            1540.0,
+                                            120.0
+                                        ]
+                                    },
+                                    "{B0B99C8A-03AF-4CF6-A926-F65C874C3D97}": {
+                                        "$type": "StylingComponentSaveData",
+                                        "SubStyle": ".method"
+                                    },
+                                    "{B1F49A35-8408-40DA-B79E-F1E3B64322CE}": {
+                                        "$type": "PersistentIdComponentSaveData",
+                                        "PersistentId": "{48FA9A40-160B-4502-BCC6-5E4E36B666BE}"
+                                    }
+                                }
+                            }
+                        }
+                    ],
+                    "StatisticsHelper": {
+                        "InstanceCounter": [
+                            {
+                                "Key": 3117476785392655547,
+                                "Value": 1
+                            },
+                            {
+                                "Key": 5842116762352693124,
+                                "Value": 1
+                            },
+                            {
+                                "Key": 8874064635980936025,
+                                "Value": 1
+                            },
+                            {
+                                "Key": 11000802260220917925,
+                                "Value": 1
+                            },
+                            {
+                                "Key": 13774516356728983098,
+                                "Value": 1
+                            },
+                            {
+                                "Key": 17306522614951550820,
+                                "Value": 1
+                            }
+                        ]
+                    }
+                }
+            }
+        }
+    }
+}

Vissa filer visades inte eftersom för många filer har ändrats