diff --git a/.gitattributes b/.gitattributes
deleted file mode 100644
index 82090a7..0000000
--- a/.gitattributes
+++ /dev/null
@@ -1,2 +0,0 @@
-.uasset filter=lfs diff=lfs merge=lfs -text
-*.uasset filter=lfs diff=lfs merge=lfs -text
diff --git a/.gitignore b/.gitignore
index dbb6a2c..010cf74 100644
--- a/.gitignore
+++ b/.gitignore
@@ -240,17 +240,14 @@ pip-log.txt
#Unreal Engine
+.vs/
+.vs/*
Binaries/
-Plugins/
-Plugins/*
+
Content/*
+Substance/
+Substance/*
!Content/Blueprints/
-!Plugins/GameInventorySystem/Content
-!Plugins/GameInventorySystem/Source
-!Plugins/GameAttributes/Content
-!Plugins/GameAttributes/Source
-!Plugins/TimeOfDay/Content
-!Plugins/TimeOfDay/Source
DerivedDataCache/
Intermediate/
Saved/
@@ -266,3 +263,9 @@ Saved/
CodeBackup/States/GASAbilityStateCooldown.h
*.bin
*.pak
+Config/DefaultARGame.ini
+Plugins/*
+!Plugins/AbilityFramework/
+!Plugins/AbilityFramework/Source/
+!!Plugins/AbilityFrameworkEditor/
+!Plugins/AbilityFrameworkEditor/Source/
\ No newline at end of file
diff --git a/.vs/ProjectSettings.json b/.vs/ProjectSettings.json
deleted file mode 100644
index 38c5f00..0000000
--- a/.vs/ProjectSettings.json
+++ /dev/null
@@ -1,3 +0,0 @@
-{
- "CurrentProjectSetting": "x86-Debug"
-}
\ No newline at end of file
diff --git a/.vs/VSWorkspaceState.json b/.vs/VSWorkspaceState.json
deleted file mode 100644
index 4fd6934..0000000
--- a/.vs/VSWorkspaceState.json
+++ /dev/null
@@ -1,9 +0,0 @@
-{
- "ExpandedNodes": [
- "",
- "\\Content\\Blueprints",
- "\\Source"
- ],
- "SelectedNode": "\\Content",
- "PreviewInSolutionExplorer": false
-}
\ No newline at end of file
diff --git a/.vs/config/applicationhost.config b/.vs/config/applicationhost.config
deleted file mode 100644
index 4b9bf47..0000000
--- a/.vs/config/applicationhost.config
+++ /dev/null
@@ -1,1031 +0,0 @@
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
diff --git a/.vs/slnx.sqlite b/.vs/slnx.sqlite
deleted file mode 100644
index 0316013..0000000
Binary files a/.vs/slnx.sqlite and /dev/null differ
diff --git a/ActionRPGGame.uproject b/ActionRPGGame.uproject
index 683712d..633f105 100644
--- a/ActionRPGGame.uproject
+++ b/ActionRPGGame.uproject
@@ -1,43 +1,262 @@
{
"FileVersion": 3,
- "EngineAssociation": "{A035B080-4493-F253-AA70-EF8A66B855F8}",
+ "EngineAssociation": "",
"Category": "",
"Description": "",
"Modules": [
{
"Name": "ActionRPGGame",
"Type": "Runtime",
- "LoadingPhase": "Default"
+ "LoadingPhase": "Default",
+ "AdditionalDependencies": [
+ "AbilityFramework",
+ "InventoryFramework",
+ "Engine",
+ "AIModule",
+ "UMG",
+ "CoreUObject",
+ "Slate",
+ "SlateCore",
+ "InventoryFrameworkUI"
+ ]
+ },
+ {
+ "Name": "ActionRPGGameEditor",
+ "Type": "Editor",
+ "LoadingPhase": "Default",
+ "AdditionalDependencies": [
+ "AbilityFramework",
+ "AbilityFrameworkEditor",
+ "InventoryFramework",
+ "Engine",
+ "AIModule",
+ "UMG",
+ "CoreUObject"
+ ]
}
],
"Plugins": [
{
- "Name": "CodeView",
+ "Name": "ActorSequence",
+ "Enabled": true
+ },
+ {
+ "Name": "AbilityFramework",
+ "Enabled": true
+ },
+ {
+ "Name": "InventoryFramework",
+ "Enabled": true
+ },
+ {
+ "Name": "InventoryFrameworkUI",
+ "Enabled": true
+ },
+ {
+ "Name": "ActorSequenceEditor",
+ "Enabled": true
+ },
+ {
+ "Name": "ImagePlate",
+ "Enabled": true
+ },
+ {
+ "Name": "PerformanceMonitor",
+ "Enabled": true
+ },
+ {
+ "Name": "OnlineFramework",
+ "Enabled": true
+ },
+ {
+ "Name": "ActionRPGGameUI",
"Enabled": true,
- "Type": "Editor"
+ "BlacklistTargets": [
+ "Server"
+ ]
+ },
+ {
+ "Name": "GRPC",
+ "Enabled": true
+ },
+ {
+ "Name": "SteamVR",
+ "Enabled": false
+ },
+ {
+ "Name": "OculusVR",
+ "Enabled": false
+ },
+ {
+ "Name": "Niagara",
+ "Enabled": true
+ },
+ {
+ "Name": "SoundUtilities",
+ "Enabled": true
+ },
+ {
+ "Name": "SoundVisualizations",
+ "Enabled": true
+ },
+ {
+ "Name": "BlueprintStats",
+ "Enabled": true
+ },
+ {
+ "Name": "LocationServicesBPLibrary",
+ "Enabled": false
+ },
+ {
+ "Name": "WindowsDeviceProfileSelector",
+ "Enabled": true
+ },
+ {
+ "Name": "AndroidDeviceProfileSelector",
+ "Enabled": false
+ },
+ {
+ "Name": "IOSDeviceProfileSelector",
+ "Enabled": false
+ },
+ {
+ "Name": "AndroidMedia",
+ "Enabled": false
},
{
- "Name": "MessagingDebugger",
+ "Name": "MobileLauncherProfileWizard",
+ "Enabled": false
+ },
+ {
+ "Name": "MobilePatchingUtils",
+ "Enabled": false
+ },
+ {
+ "Name": "AndroidMoviePlayer",
+ "Enabled": false
+ },
+ {
+ "Name": "AppleMoviePlayer",
+ "Enabled": false
+ },
+ {
+ "Name": "GoogleCloudMessaging",
+ "Enabled": false
+ },
+ {
+ "Name": "OnlineSubsystemIOS",
+ "Enabled": false,
+ "SupportedTargetPlatforms": [
+ "IOS",
+ "TVOS"
+ ]
+ },
+ {
+ "Name": "OnlineSubsystemGooglePlay",
+ "Enabled": false,
+ "SupportedTargetPlatforms": [
+ "Android"
+ ]
+ },
+ {
+ "Name": "ApexDestruction",
+ "Enabled": true
+ },
+ {
+ "Name": "AndroidPermission",
+ "Enabled": false
+ },
+ {
+ "Name": "AppleARKit",
+ "Enabled": false
+ },
+ {
+ "Name": "GLTFImporter",
+ "Enabled": true
+ },
+ {
+ "Name": "SteamAudio",
"Enabled": true,
- "Type": "Editor"
+ "BlacklistTargets": [
+ "Server",
+ "Client"
+ ]
},
{
- "Name": "ControlRig",
+ "Name": "ResonanceAudio",
+ "Enabled": false,
+ "BlacklistTargets": [
+ "Server",
+ "Client"
+ ]
+ },
+ {
+ "Name": "CodeView",
+ "Enabled": true
+ },
+ {
+ "Name": "SignificanceManager",
+ "Enabled": true
+ },
+ {
+ "Name": "CustomAnimNode",
"Enabled": true,
- "Type": "Editor"
+ "MarketplaceURL": "com.epicgames.launcher://ue/marketplace/content/8901af6d589b40b68d763b44c9ced66c"
},
{
- "Name": "PerformanceMonitor",
+ "Name": "Substance",
"Enabled": true,
- "Type": "Editor"
+ "MarketplaceURL": "com.epicgames.launcher://ue/marketplace/content/2f6439c2f9584f49809d9b13b16c2ba4",
+ "BlacklistTargets": [
+ "Server",
+ "Client"
+ ]
},
{
- "Name": "ActorSequenceEditor",
+ "Name": "LiveLink",
+ "Enabled": true
+ },
+ {
+ "Name": "ReplicationGraph",
+ "Enabled": true
+ },
+ {
+ "Name": "NiagaraExtras",
+ "Enabled": true
+ },
+ {
+ "Name": "MagicLeapMedia",
+ "Enabled": false,
+ "SupportedTargetPlatforms": [
+ "Lumin"
+ ]
+ },
+ {
+ "Name": "MagicLeapEmulator",
+ "Enabled": false,
+ "SupportedTargetPlatforms": [
+ "Lumin"
+ ]
+ },
+ {
+ "Name": "MagicLeap",
+ "Enabled": false,
+ "SupportedTargetPlatforms": [
+ "Lumin"
+ ]
+ },
+ {
+ "Name": "AppleVision",
+ "Enabled": false
+ },
+ {
+ "Name": "RootMotionExtractor",
"Enabled": true,
- "Type": "Editor"
+ "MarketplaceURL": "com.epicgames.launcher://ue/marketplace/content/4b450f82f56040338a4d5744b3eda4f9"
}
],
"TargetPlatforms": [
+ "LinuxNoEditor",
"WindowsNoEditor"
]
}
\ No newline at end of file
diff --git a/Agones/Agones.uplugin b/Agones/Agones.uplugin
new file mode 100644
index 0000000..ac3651f
--- /dev/null
+++ b/Agones/Agones.uplugin
@@ -0,0 +1,25 @@
+{
+ "FileVersion" : 3,
+
+ "FriendlyName" : "Agones Plugin",
+ "Version" : 1,
+ "VersionName" : "1.0",
+ "CreatedBy" : "Epic Games, Inc.",
+ "CreatedByURL" : "http://epicgames.com",
+ "Description" : "Integration with Kuberenetes Agones.",
+ "Category" : "Dedicated Server",
+ "EnabledByDefault" : false,
+
+ "Modules": [
+ {
+ "Name": "Agones",
+ "Type": "Runtime"
+ }
+ ]
+ "Plugins": [
+ {
+ "Name": "GRPC",
+ "Enabled": true
+ }
+ ]
+}
diff --git a/Agones/Resources/Icon128.png b/Agones/Resources/Icon128.png
new file mode 100644
index 0000000..3033ae0
Binary files /dev/null and b/Agones/Resources/Icon128.png differ
diff --git a/Agones/Source/Agones/Agones.Build.cs b/Agones/Source/Agones/Agones.Build.cs
new file mode 100644
index 0000000..9e54b47
--- /dev/null
+++ b/Agones/Source/Agones/Agones.Build.cs
@@ -0,0 +1,80 @@
+// Copyright 1998-2015 Epic Games, Inc. All Rights Reserved.
+using System;
+using System.IO;
+using System.Text.RegularExpressions;
+
+namespace UnrealBuildTool.Rules
+{
+ public class Agones : ModuleRules
+ {
+ public Agones(ReadOnlyTargetRules Target) : base(Target)
+ {
+ PrivateIncludePaths.AddRange(
+ new string[] {
+ "Agones/Private",
+ }
+ );
+
+ PublicDefinitions.Add("GPR_FORBID_UNREACHABLE_CODE=1");
+ PublicDefinitions.Add("GOOGLE_PROTOBUF_NO_RTTI=1");
+ PublicDependencyModuleNames.AddRange(
+ new string[]
+ {
+ "Core",
+ "Projects",
+ "OpenSSL",
+ "zlib",
+ "GRPC"
+ }
+ );
+ PublicIncludePathModuleNames.AddRange(
+ new string[]
+ {
+ "GRPC"
+ }
+ );
+
+ PrivateDependencyModuleNames.AddRange(
+ new string[]
+ {
+ }
+ );
+
+
+ DynamicallyLoadedModuleNames.AddRange(
+ new string[]
+ {
+ }
+ );
+
+
+
+ if (Target.Type == TargetRules.TargetType.Server)
+ {
+ if (Target.Platform == UnrealTargetPlatform.Linux)
+ {
+ PublicDefinitions.Add("ENABLE_AGONES=1");
+
+ string BaseDirectory = System.IO.Path.GetFullPath(System.IO.Path.Combine(ModuleDirectory, ".."));
+ string SDKDirectory = System.IO.Path.Combine(BaseDirectory, "ThirdParty", "x86_64-unknown-linux-gnu");
+ //PublicIncludePaths.Add(System.IO.Path.Combine(SDKDirectory, "include"));
+
+ // PublicLibraryPaths.Add(SDKDirectory);
+ // PublicAdditionalLibraries.Add(System.IO.Path.Combine(SDKDirectory, "libagonessdk.a"));
+ PublicAdditionalLibraries.Add(System.IO.Path.Combine(SDKDirectory, "libgpr.a"));
+ PublicAdditionalLibraries.Add(System.IO.Path.Combine(SDKDirectory, "libgrpc.a"));
+ PublicAdditionalLibraries.Add(System.IO.Path.Combine(SDKDirectory, "libgrpc_unsecure.a"));
+ PublicAdditionalLibraries.Add(System.IO.Path.Combine(SDKDirectory, "libprotobuf.a"));
+ }
+ else
+ {
+ PublicDefinitions.Add("ENABLE_AGONES=0");
+ }
+ }
+ else
+ {
+ PublicDefinitions.Add("ENABLE_AGONES=0");
+ }
+ }
+ }
+}
diff --git a/Agones/Source/Agones/Private/Agones.cpp b/Agones/Source/Agones/Private/Agones.cpp
new file mode 100644
index 0000000..3bf38f8
--- /dev/null
+++ b/Agones/Source/Agones/Private/Agones.cpp
@@ -0,0 +1,49 @@
+// Copyright 1998-2015 Epic Games, Inc. All Rights Reserved.
+
+#include "IAgones.h"
+
+#if ENABLE_AGONES
+#include "grpc/support/time.h"
+#include "grpc++/grpc++.h"
+#include "sdk.h"
+#endif
+
+class FAgones : public IAgones
+{
+#if ENABLE_AGONES
+
+ agones::SDK* AgonesSDK;
+#endif
+ /** IModuleInterface implementation */
+ virtual void StartupModule() override;
+ virtual void ShutdownModule() override;
+};
+
+IMPLEMENT_MODULE( FAgones, Agones)
+
+
+
+void FAgones::StartupModule()
+{
+#if ENABLE_AGONES
+
+ grpc::string out = grpc::Version();
+ FString ver = FString(ANSI_TO_TCHAR(out.c_str()));
+ UE_LOG(LogTemp, Warning, TEXT("FGRPC::StartupModule Version: %s "), *ver);
+ AgonesSDK = new agones::SDK();
+#endif
+}
+
+
+void FAgones::ShutdownModule()
+{
+#if ENABLE_AGONES
+ //if (AgonesSDK)
+ //{
+ // delete AgonesSDK;
+ // AgonesSDK = nullptr;
+ //}
+#endif
+ // This function may be called during shutdown to clean up your module. For modules that support dynamic reloading,
+ // we call this function before unloading the module.
+}
diff --git a/Agones/Source/Agones/Private/sdk.cc b/Agones/Source/Agones/Private/sdk.cc
new file mode 100644
index 0000000..4cc211f
--- /dev/null
+++ b/Agones/Source/Agones/Private/sdk.cc
@@ -0,0 +1,62 @@
+// Copyright 2017 Google Inc. All Rights Reserved.
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+// http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+
+#include "sdk.h"
+#include "sdk.pb.h"
+
+namespace agones {
+
+ const int port = 59357;
+
+ SDK::SDK() {
+ channel = grpc::CreateChannel("localhost:" + std::to_string(port), grpc::InsecureChannelCredentials());
+ }
+
+ bool SDK::Connect() {
+ if (!channel->WaitForConnected(gpr_time_add(gpr_now(GPR_CLOCK_REALTIME), gpr_time_from_seconds(30, GPR_TIMESPAN)))) {
+ return false;
+ }
+
+ stub = stable::agones::dev::sdk::SDK::NewStub(channel);
+
+ // make the health connection
+ stable::agones::dev::sdk::Empty response;
+ health = stub->Health(new grpc::ClientContext(), &response);
+
+ return true;
+ }
+
+ grpc::Status SDK::Ready() {
+ grpc::ClientContext *context = new grpc::ClientContext();
+ context->set_deadline(gpr_time_add(gpr_now(GPR_CLOCK_REALTIME), gpr_time_from_seconds(30, GPR_TIMESPAN)));
+ stable::agones::dev::sdk::Empty request;
+ stable::agones::dev::sdk::Empty response;
+
+ return stub->Ready(context, request, &response);
+ }
+
+ bool SDK::Health() {
+ stable::agones::dev::sdk::Empty request;
+ return health->Write(request);
+ }
+
+ grpc::Status SDK::Shutdown() {
+ grpc::ClientContext *context = new grpc::ClientContext();
+ context->set_deadline(gpr_time_add(gpr_now(GPR_CLOCK_REALTIME), gpr_time_from_seconds(30, GPR_TIMESPAN)));
+ stable::agones::dev::sdk::Empty request;
+ stable::agones::dev::sdk::Empty response;
+
+ return stub->Shutdown(context, request, &response);
+ }
+}
\ No newline at end of file
diff --git a/Agones/Source/Agones/Private/sdk.grpc.pb.cc b/Agones/Source/Agones/Private/sdk.grpc.pb.cc
new file mode 100644
index 0000000..664bf89
--- /dev/null
+++ b/Agones/Source/Agones/Private/sdk.grpc.pb.cc
@@ -0,0 +1,136 @@
+// Copyright 2018 Google Inc. All Rights Reserved.
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+// http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+
+// This code was autogenerated. Do not edit directly.
+// Generated by the gRPC C++ plugin.
+// If you make any local change, they will be lost.
+// source: sdk.proto
+
+#include "sdk.pb.h"
+#include "sdk.grpc.pb.h"
+
+#include
+#include
+#include
+#include
+#include
+#include
+#include
+#include
+namespace stable {
+namespace agones {
+namespace dev {
+namespace sdk {
+
+static const char* SDK_method_names[] = {
+ "/stable.agones.dev.sdk.SDK/Ready",
+ "/stable.agones.dev.sdk.SDK/Shutdown",
+ "/stable.agones.dev.sdk.SDK/Health",
+};
+
+std::unique_ptr< SDK::Stub> SDK::NewStub(const std::shared_ptr< ::grpc::ChannelInterface>& channel, const ::grpc::StubOptions& options) {
+ std::unique_ptr< SDK::Stub> stub(new SDK::Stub(channel));
+ return stub;
+}
+
+SDK::Stub::Stub(const std::shared_ptr< ::grpc::ChannelInterface>& channel)
+ : channel_(channel), rpcmethod_Ready_(SDK_method_names[0], ::grpc::internal::RpcMethod::NORMAL_RPC, channel)
+ , rpcmethod_Shutdown_(SDK_method_names[1], ::grpc::internal::RpcMethod::NORMAL_RPC, channel)
+ , rpcmethod_Health_(SDK_method_names[2], ::grpc::internal::RpcMethod::CLIENT_STREAMING, channel)
+ {}
+
+::grpc::Status SDK::Stub::Ready(::grpc::ClientContext* context, const ::stable::agones::dev::sdk::Empty& request, ::stable::agones::dev::sdk::Empty* response) {
+ return ::grpc::internal::BlockingUnaryCall(channel_.get(), rpcmethod_Ready_, context, request, response);
+}
+
+::grpc::ClientAsyncResponseReader< ::stable::agones::dev::sdk::Empty>* SDK::Stub::AsyncReadyRaw(::grpc::ClientContext* context, const ::stable::agones::dev::sdk::Empty& request, ::grpc::CompletionQueue* cq) {
+ return ::grpc::internal::ClientAsyncResponseReaderFactory< ::stable::agones::dev::sdk::Empty>::Create(channel_.get(), cq, rpcmethod_Ready_, context, request, true);
+}
+
+::grpc::ClientAsyncResponseReader< ::stable::agones::dev::sdk::Empty>* SDK::Stub::PrepareAsyncReadyRaw(::grpc::ClientContext* context, const ::stable::agones::dev::sdk::Empty& request, ::grpc::CompletionQueue* cq) {
+ return ::grpc::internal::ClientAsyncResponseReaderFactory< ::stable::agones::dev::sdk::Empty>::Create(channel_.get(), cq, rpcmethod_Ready_, context, request, false);
+}
+
+::grpc::Status SDK::Stub::Shutdown(::grpc::ClientContext* context, const ::stable::agones::dev::sdk::Empty& request, ::stable::agones::dev::sdk::Empty* response) {
+ return ::grpc::internal::BlockingUnaryCall(channel_.get(), rpcmethod_Shutdown_, context, request, response);
+}
+
+::grpc::ClientAsyncResponseReader< ::stable::agones::dev::sdk::Empty>* SDK::Stub::AsyncShutdownRaw(::grpc::ClientContext* context, const ::stable::agones::dev::sdk::Empty& request, ::grpc::CompletionQueue* cq) {
+ return ::grpc::internal::ClientAsyncResponseReaderFactory< ::stable::agones::dev::sdk::Empty>::Create(channel_.get(), cq, rpcmethod_Shutdown_, context, request, true);
+}
+
+::grpc::ClientAsyncResponseReader< ::stable::agones::dev::sdk::Empty>* SDK::Stub::PrepareAsyncShutdownRaw(::grpc::ClientContext* context, const ::stable::agones::dev::sdk::Empty& request, ::grpc::CompletionQueue* cq) {
+ return ::grpc::internal::ClientAsyncResponseReaderFactory< ::stable::agones::dev::sdk::Empty>::Create(channel_.get(), cq, rpcmethod_Shutdown_, context, request, false);
+}
+
+::grpc::ClientWriter< ::stable::agones::dev::sdk::Empty>* SDK::Stub::HealthRaw(::grpc::ClientContext* context, ::stable::agones::dev::sdk::Empty* response) {
+ return ::grpc::internal::ClientWriterFactory< ::stable::agones::dev::sdk::Empty>::Create(channel_.get(), rpcmethod_Health_, context, response);
+}
+
+::grpc::ClientAsyncWriter< ::stable::agones::dev::sdk::Empty>* SDK::Stub::AsyncHealthRaw(::grpc::ClientContext* context, ::stable::agones::dev::sdk::Empty* response, ::grpc::CompletionQueue* cq, void* tag) {
+ return ::grpc::internal::ClientAsyncWriterFactory< ::stable::agones::dev::sdk::Empty>::Create(channel_.get(), cq, rpcmethod_Health_, context, response, true, tag);
+}
+
+::grpc::ClientAsyncWriter< ::stable::agones::dev::sdk::Empty>* SDK::Stub::PrepareAsyncHealthRaw(::grpc::ClientContext* context, ::stable::agones::dev::sdk::Empty* response, ::grpc::CompletionQueue* cq) {
+ return ::grpc::internal::ClientAsyncWriterFactory< ::stable::agones::dev::sdk::Empty>::Create(channel_.get(), cq, rpcmethod_Health_, context, response, false, nullptr);
+}
+
+SDK::Service::Service() {
+ AddMethod(new ::grpc::internal::RpcServiceMethod(
+ SDK_method_names[0],
+ ::grpc::internal::RpcMethod::NORMAL_RPC,
+ new ::grpc::internal::RpcMethodHandler< SDK::Service, ::stable::agones::dev::sdk::Empty, ::stable::agones::dev::sdk::Empty>(
+ std::mem_fn(&SDK::Service::Ready), this)));
+ AddMethod(new ::grpc::internal::RpcServiceMethod(
+ SDK_method_names[1],
+ ::grpc::internal::RpcMethod::NORMAL_RPC,
+ new ::grpc::internal::RpcMethodHandler< SDK::Service, ::stable::agones::dev::sdk::Empty, ::stable::agones::dev::sdk::Empty>(
+ std::mem_fn(&SDK::Service::Shutdown), this)));
+ AddMethod(new ::grpc::internal::RpcServiceMethod(
+ SDK_method_names[2],
+ ::grpc::internal::RpcMethod::CLIENT_STREAMING,
+ new ::grpc::internal::ClientStreamingHandler< SDK::Service, ::stable::agones::dev::sdk::Empty, ::stable::agones::dev::sdk::Empty>(
+ std::mem_fn(&SDK::Service::Health), this)));
+}
+
+SDK::Service::~Service() {
+}
+
+::grpc::Status SDK::Service::Ready(::grpc::ServerContext* context, const ::stable::agones::dev::sdk::Empty* request, ::stable::agones::dev::sdk::Empty* response) {
+ (void) context;
+ (void) request;
+ (void) response;
+ return ::grpc::Status(::grpc::StatusCode::UNIMPLEMENTED, "");
+}
+
+::grpc::Status SDK::Service::Shutdown(::grpc::ServerContext* context, const ::stable::agones::dev::sdk::Empty* request, ::stable::agones::dev::sdk::Empty* response) {
+ (void) context;
+ (void) request;
+ (void) response;
+ return ::grpc::Status(::grpc::StatusCode::UNIMPLEMENTED, "");
+}
+
+::grpc::Status SDK::Service::Health(::grpc::ServerContext* context, ::grpc::ServerReader< ::stable::agones::dev::sdk::Empty>* reader, ::stable::agones::dev::sdk::Empty* response) {
+ (void) context;
+ (void) reader;
+ (void) response;
+ return ::grpc::Status(::grpc::StatusCode::UNIMPLEMENTED, "");
+}
+
+
+} // namespace stable
+} // namespace agones
+} // namespace dev
+} // namespace sdk
+
diff --git a/Agones/Source/Agones/Private/sdk.pb.cc b/Agones/Source/Agones/Private/sdk.pb.cc
new file mode 100644
index 0000000..cf68357
--- /dev/null
+++ b/Agones/Source/Agones/Private/sdk.pb.cc
@@ -0,0 +1,342 @@
+// Copyright 2018 Google Inc. All Rights Reserved.
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+// http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+
+// This code was autogenerated. Do not edit directly.
+// Generated by the protocol buffer compiler. DO NOT EDIT!
+// source: sdk.proto
+
+#include "sdk.pb.h"
+
+#include
+
+#include
+#include
+#include
+#include
+#include
+#include
+#include
+#include
+#include
+// This is a temporary google only hack
+#ifdef GOOGLE_PROTOBUF_ENFORCE_UNIQUENESS
+#include "third_party/protobuf/version.h"
+#endif
+// @@protoc_insertion_point(includes)
+namespace stable {
+namespace agones {
+namespace dev {
+namespace sdk {
+class EmptyDefaultTypeInternal {
+ public:
+ ::google::protobuf::internal::ExplicitlyConstructed
+ _instance;
+} _Empty_default_instance_;
+} // namespace sdk
+} // namespace dev
+} // namespace agones
+} // namespace stable
+namespace protobuf_sdk_2eproto {
+void InitDefaultsEmptyImpl() {
+ GOOGLE_PROTOBUF_VERIFY_VERSION;
+
+#ifdef GOOGLE_PROTOBUF_ENFORCE_UNIQUENESS
+ ::google::protobuf::internal::InitProtobufDefaultsForceUnique();
+#else
+ ::google::protobuf::internal::InitProtobufDefaults();
+#endif // GOOGLE_PROTOBUF_ENFORCE_UNIQUENESS
+ {
+ void* ptr = &::stable::agones::dev::sdk::_Empty_default_instance_;
+ new (ptr) ::stable::agones::dev::sdk::Empty();
+ ::google::protobuf::internal::OnShutdownDestroyMessage(ptr);
+ }
+ ::stable::agones::dev::sdk::Empty::InitAsDefaultInstance();
+}
+
+void InitDefaultsEmpty() {
+ static GOOGLE_PROTOBUF_DECLARE_ONCE(once);
+ ::google::protobuf::GoogleOnceInit(&once, &InitDefaultsEmptyImpl);
+}
+
+::google::protobuf::Metadata file_level_metadata[1];
+
+const ::google::protobuf::uint32 TableStruct::offsets[] GOOGLE_PROTOBUF_ATTRIBUTE_SECTION_VARIABLE(protodesc_cold) = {
+ ~0u, // no _has_bits_
+ GOOGLE_PROTOBUF_GENERATED_MESSAGE_FIELD_OFFSET(::stable::agones::dev::sdk::Empty, _internal_metadata_),
+ ~0u, // no _extensions_
+ ~0u, // no _oneof_case_
+ ~0u, // no _weak_field_map_
+};
+static const ::google::protobuf::internal::MigrationSchema schemas[] GOOGLE_PROTOBUF_ATTRIBUTE_SECTION_VARIABLE(protodesc_cold) = {
+ { 0, -1, sizeof(::stable::agones::dev::sdk::Empty)},
+};
+
+static ::google::protobuf::Message const * const file_default_instances[] = {
+ reinterpret_cast(&::stable::agones::dev::sdk::_Empty_default_instance_),
+};
+
+void protobuf_AssignDescriptors() {
+ AddDescriptors();
+ ::google::protobuf::MessageFactory* factory = NULL;
+ AssignDescriptors(
+ "sdk.proto", schemas, file_default_instances, TableStruct::offsets, factory,
+ file_level_metadata, NULL, NULL);
+}
+
+void protobuf_AssignDescriptorsOnce() {
+ static GOOGLE_PROTOBUF_DECLARE_ONCE(once);
+ ::google::protobuf::GoogleOnceInit(&once, &protobuf_AssignDescriptors);
+}
+
+void protobuf_RegisterTypes(const ::std::string&) GOOGLE_PROTOBUF_ATTRIBUTE_COLD;
+void protobuf_RegisterTypes(const ::std::string&) {
+ protobuf_AssignDescriptorsOnce();
+ ::google::protobuf::internal::RegisterAllTypes(file_level_metadata, 1);
+}
+
+void AddDescriptorsImpl() {
+ InitDefaults();
+ static const char descriptor[] GOOGLE_PROTOBUF_ATTRIBUTE_SECTION_VARIABLE(protodesc_cold) = {
+ "\n\tsdk.proto\022\025stable.agones.dev.sdk\"\007\n\005Em"
+ "pty2\340\001\n\003SDK\022E\n\005Ready\022\034.stable.agones.dev"
+ ".sdk.Empty\032\034.stable.agones.dev.sdk.Empty"
+ "\"\000\022H\n\010Shutdown\022\034.stable.agones.dev.sdk.E"
+ "mpty\032\034.stable.agones.dev.sdk.Empty\"\000\022H\n\006"
+ "Health\022\034.stable.agones.dev.sdk.Empty\032\034.s"
+ "table.agones.dev.sdk.Empty\"\000(\001B\005Z\003sdkb\006p"
+ "roto3"
+ };
+ ::google::protobuf::DescriptorPool::InternalAddGeneratedFile(
+ descriptor, 285);
+ ::google::protobuf::MessageFactory::InternalRegisterGeneratedFile(
+ "sdk.proto", &protobuf_RegisterTypes);
+}
+
+void AddDescriptors() {
+ static GOOGLE_PROTOBUF_DECLARE_ONCE(once);
+ ::google::protobuf::GoogleOnceInit(&once, &AddDescriptorsImpl);
+}
+// Force AddDescriptors() to be called at dynamic initialization time.
+struct StaticDescriptorInitializer {
+ StaticDescriptorInitializer() {
+ AddDescriptors();
+ }
+} static_descriptor_initializer;
+} // namespace protobuf_sdk_2eproto
+namespace stable {
+namespace agones {
+namespace dev {
+namespace sdk {
+
+// ===================================================================
+
+void Empty::InitAsDefaultInstance() {
+}
+#if !defined(_MSC_VER) || _MSC_VER >= 1900
+#endif // !defined(_MSC_VER) || _MSC_VER >= 1900
+
+Empty::Empty()
+ : ::google::protobuf::Message(), _internal_metadata_(NULL) {
+ if (GOOGLE_PREDICT_TRUE(this != internal_default_instance())) {
+ ::protobuf_sdk_2eproto::InitDefaultsEmpty();
+ }
+ SharedCtor();
+ // @@protoc_insertion_point(constructor:stable.agones.dev.sdk.Empty)
+}
+Empty::Empty(const Empty& from)
+ : ::google::protobuf::Message(),
+ _internal_metadata_(NULL),
+ _cached_size_(0) {
+ _internal_metadata_.MergeFrom(from._internal_metadata_);
+ // @@protoc_insertion_point(copy_constructor:stable.agones.dev.sdk.Empty)
+}
+
+void Empty::SharedCtor() {
+ _cached_size_ = 0;
+}
+
+Empty::~Empty() {
+ // @@protoc_insertion_point(destructor:stable.agones.dev.sdk.Empty)
+ SharedDtor();
+}
+
+void Empty::SharedDtor() {
+}
+
+void Empty::SetCachedSize(int size) const {
+ GOOGLE_SAFE_CONCURRENT_WRITES_BEGIN();
+ _cached_size_ = size;
+ GOOGLE_SAFE_CONCURRENT_WRITES_END();
+}
+const ::google::protobuf::Descriptor* Empty::descriptor() {
+ ::protobuf_sdk_2eproto::protobuf_AssignDescriptorsOnce();
+ return ::protobuf_sdk_2eproto::file_level_metadata[kIndexInFileMessages].descriptor;
+}
+
+const Empty& Empty::default_instance() {
+ ::protobuf_sdk_2eproto::InitDefaultsEmpty();
+ return *internal_default_instance();
+}
+
+Empty* Empty::New(::google::protobuf::Arena* arena) const {
+ Empty* n = new Empty;
+ if (arena != NULL) {
+ arena->Own(n);
+ }
+ return n;
+}
+
+void Empty::Clear() {
+// @@protoc_insertion_point(message_clear_start:stable.agones.dev.sdk.Empty)
+ ::google::protobuf::uint32 cached_has_bits = 0;
+ // Prevent compiler warnings about cached_has_bits being unused
+ (void) cached_has_bits;
+
+ _internal_metadata_.Clear();
+}
+
+bool Empty::MergePartialFromCodedStream(
+ ::google::protobuf::io::CodedInputStream* input) {
+#define DO_(EXPRESSION) if (!GOOGLE_PREDICT_TRUE(EXPRESSION)) goto failure
+ ::google::protobuf::uint32 tag;
+ // @@protoc_insertion_point(parse_start:stable.agones.dev.sdk.Empty)
+ for (;;) {
+ ::std::pair< ::google::protobuf::uint32, bool> p = input->ReadTagWithCutoffNoLastTag(127u);
+ tag = p.first;
+ if (!p.second) goto handle_unusual;
+ handle_unusual:
+ if (tag == 0) {
+ goto success;
+ }
+ DO_(::google::protobuf::internal::WireFormat::SkipField(
+ input, tag, _internal_metadata_.mutable_unknown_fields()));
+ }
+success:
+ // @@protoc_insertion_point(parse_success:stable.agones.dev.sdk.Empty)
+ return true;
+failure:
+ // @@protoc_insertion_point(parse_failure:stable.agones.dev.sdk.Empty)
+ return false;
+#undef DO_
+}
+
+void Empty::SerializeWithCachedSizes(
+ ::google::protobuf::io::CodedOutputStream* output) const {
+ // @@protoc_insertion_point(serialize_start:stable.agones.dev.sdk.Empty)
+ ::google::protobuf::uint32 cached_has_bits = 0;
+ (void) cached_has_bits;
+
+ if ((_internal_metadata_.have_unknown_fields() && ::google::protobuf::internal::GetProto3PreserveUnknownsDefault())) {
+ ::google::protobuf::internal::WireFormat::SerializeUnknownFields(
+ (::google::protobuf::internal::GetProto3PreserveUnknownsDefault() ? _internal_metadata_.unknown_fields() : _internal_metadata_.default_instance()), output);
+ }
+ // @@protoc_insertion_point(serialize_end:stable.agones.dev.sdk.Empty)
+}
+
+::google::protobuf::uint8* Empty::InternalSerializeWithCachedSizesToArray(
+ bool deterministic, ::google::protobuf::uint8* target) const {
+ (void)deterministic; // Unused
+ // @@protoc_insertion_point(serialize_to_array_start:stable.agones.dev.sdk.Empty)
+ ::google::protobuf::uint32 cached_has_bits = 0;
+ (void) cached_has_bits;
+
+ if ((_internal_metadata_.have_unknown_fields() && ::google::protobuf::internal::GetProto3PreserveUnknownsDefault())) {
+ target = ::google::protobuf::internal::WireFormat::SerializeUnknownFieldsToArray(
+ (::google::protobuf::internal::GetProto3PreserveUnknownsDefault() ? _internal_metadata_.unknown_fields() : _internal_metadata_.default_instance()), target);
+ }
+ // @@protoc_insertion_point(serialize_to_array_end:stable.agones.dev.sdk.Empty)
+ return target;
+}
+
+size_t Empty::ByteSizeLong() const {
+// @@protoc_insertion_point(message_byte_size_start:stable.agones.dev.sdk.Empty)
+ size_t total_size = 0;
+
+ if ((_internal_metadata_.have_unknown_fields() && ::google::protobuf::internal::GetProto3PreserveUnknownsDefault())) {
+ total_size +=
+ ::google::protobuf::internal::WireFormat::ComputeUnknownFieldsSize(
+ (::google::protobuf::internal::GetProto3PreserveUnknownsDefault() ? _internal_metadata_.unknown_fields() : _internal_metadata_.default_instance()));
+ }
+ int cached_size = ::google::protobuf::internal::ToCachedSize(total_size);
+ GOOGLE_SAFE_CONCURRENT_WRITES_BEGIN();
+ _cached_size_ = cached_size;
+ GOOGLE_SAFE_CONCURRENT_WRITES_END();
+ return total_size;
+}
+
+void Empty::MergeFrom(const ::google::protobuf::Message& from) {
+// @@protoc_insertion_point(generalized_merge_from_start:stable.agones.dev.sdk.Empty)
+ GOOGLE_DCHECK_NE(&from, this);
+ const Empty* source =
+ ::google::protobuf::internal::DynamicCastToGenerated(
+ &from);
+ if (source == NULL) {
+ // @@protoc_insertion_point(generalized_merge_from_cast_fail:stable.agones.dev.sdk.Empty)
+ ::google::protobuf::internal::ReflectionOps::Merge(from, this);
+ } else {
+ // @@protoc_insertion_point(generalized_merge_from_cast_success:stable.agones.dev.sdk.Empty)
+ MergeFrom(*source);
+ }
+}
+
+void Empty::MergeFrom(const Empty& from) {
+// @@protoc_insertion_point(class_specific_merge_from_start:stable.agones.dev.sdk.Empty)
+ GOOGLE_DCHECK_NE(&from, this);
+ _internal_metadata_.MergeFrom(from._internal_metadata_);
+ ::google::protobuf::uint32 cached_has_bits = 0;
+ (void) cached_has_bits;
+
+}
+
+void Empty::CopyFrom(const ::google::protobuf::Message& from) {
+// @@protoc_insertion_point(generalized_copy_from_start:stable.agones.dev.sdk.Empty)
+ if (&from == this) return;
+ Clear();
+ MergeFrom(from);
+}
+
+void Empty::CopyFrom(const Empty& from) {
+// @@protoc_insertion_point(class_specific_copy_from_start:stable.agones.dev.sdk.Empty)
+ if (&from == this) return;
+ Clear();
+ MergeFrom(from);
+}
+
+bool Empty::IsInitialized() const {
+ return true;
+}
+
+void Empty::Swap(Empty* other) {
+ if (other == this) return;
+ InternalSwap(other);
+}
+void Empty::InternalSwap(Empty* other) {
+ using std::swap;
+ _internal_metadata_.Swap(&other->_internal_metadata_);
+ swap(_cached_size_, other->_cached_size_);
+}
+
+::google::protobuf::Metadata Empty::GetMetadata() const {
+ protobuf_sdk_2eproto::protobuf_AssignDescriptorsOnce();
+ return ::protobuf_sdk_2eproto::file_level_metadata[kIndexInFileMessages];
+}
+
+
+// @@protoc_insertion_point(namespace_scope)
+} // namespace sdk
+} // namespace dev
+} // namespace agones
+} // namespace stable
+
+// @@protoc_insertion_point(global_scope)
diff --git a/Agones/Source/Agones/Public/IAgones.h b/Agones/Source/Agones/Public/IAgones.h
new file mode 100644
index 0000000..f686a8e
--- /dev/null
+++ b/Agones/Source/Agones/Public/IAgones.h
@@ -0,0 +1,38 @@
+// Copyright 1998-2015 Epic Games, Inc. All Rights Reserved.
+
+#pragma once
+
+#include "ModuleManager.h"
+
+
+/**
+ * The public interface to this module. In most cases, this interface is only public to sibling modules
+ * within this plugin.
+ */
+class IAgones : public IModuleInterface
+{
+
+public:
+
+ /**
+ * Singleton-like access to this module's interface. This is just for convenience!
+ * Beware of calling this during the shutdown phase, though. Your module might have been unloaded already.
+ *
+ * @return Returns singleton instance, loading the module on demand if needed
+ */
+ static inline IAgones& Get()
+ {
+ return FModuleManager::LoadModuleChecked< IAgones >( "Agones" );
+ }
+
+ /**
+ * Checks to see if this module is loaded and ready. It is only valid to call Get() if IsAvailable() returns true.
+ *
+ * @return True if the module is loaded and ready to use
+ */
+ static inline bool IsAvailable()
+ {
+ return FModuleManager::Get().IsModuleLoaded( "Agones" );
+ }
+};
+
diff --git a/Agones/Source/Agones/Public/sdk.grpc.pb.h b/Agones/Source/Agones/Public/sdk.grpc.pb.h
new file mode 100644
index 0000000..0706399
--- /dev/null
+++ b/Agones/Source/Agones/Public/sdk.grpc.pb.h
@@ -0,0 +1,307 @@
+// Generated by the gRPC C++ plugin.
+// If you make any local change, they will be lost.
+// source: sdk.proto
+// Original file comments:
+// Copyright 2017 Google Inc. All Rights Reserved.
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+// http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+//
+#ifndef GRPC_sdk_2eproto__INCLUDED
+#define GRPC_sdk_2eproto__INCLUDED
+#define GPR_FORBID_UNREACHABLE_CODE 1
+#define GOOGLE_PROTOBUF_NO_RTTI 1
+#include "sdk.pb.h"
+
+#include
+#include
+#include
+#include
+#include
+#include
+#include
+#include
+#include
+
+namespace grpc {
+class CompletionQueue;
+class Channel;
+class ServerCompletionQueue;
+class ServerContext;
+} // namespace grpc
+
+namespace stable {
+namespace agones {
+namespace dev {
+namespace sdk {
+
+// SDK service to be used in the GameServer SDK to the Pod Sidecar
+class SDK final {
+ public:
+ static constexpr char const* service_full_name() {
+ return "stable.agones.dev.sdk.SDK";
+ }
+ class StubInterface {
+ public:
+ virtual ~StubInterface() {}
+ // Call when the GameServer is ready
+ virtual ::grpc::Status Ready(::grpc::ClientContext* context, const ::stable::agones::dev::sdk::Empty& request, ::stable::agones::dev::sdk::Empty* response) = 0;
+ std::unique_ptr< ::grpc::ClientAsyncResponseReaderInterface< ::stable::agones::dev::sdk::Empty>> AsyncReady(::grpc::ClientContext* context, const ::stable::agones::dev::sdk::Empty& request, ::grpc::CompletionQueue* cq) {
+ return std::unique_ptr< ::grpc::ClientAsyncResponseReaderInterface< ::stable::agones::dev::sdk::Empty>>(AsyncReadyRaw(context, request, cq));
+ }
+ std::unique_ptr< ::grpc::ClientAsyncResponseReaderInterface< ::stable::agones::dev::sdk::Empty>> PrepareAsyncReady(::grpc::ClientContext* context, const ::stable::agones::dev::sdk::Empty& request, ::grpc::CompletionQueue* cq) {
+ return std::unique_ptr< ::grpc::ClientAsyncResponseReaderInterface< ::stable::agones::dev::sdk::Empty>>(PrepareAsyncReadyRaw(context, request, cq));
+ }
+ // Call when the GmaeServer is shutting down
+ virtual ::grpc::Status Shutdown(::grpc::ClientContext* context, const ::stable::agones::dev::sdk::Empty& request, ::stable::agones::dev::sdk::Empty* response) = 0;
+ std::unique_ptr< ::grpc::ClientAsyncResponseReaderInterface< ::stable::agones::dev::sdk::Empty>> AsyncShutdown(::grpc::ClientContext* context, const ::stable::agones::dev::sdk::Empty& request, ::grpc::CompletionQueue* cq) {
+ return std::unique_ptr< ::grpc::ClientAsyncResponseReaderInterface< ::stable::agones::dev::sdk::Empty>>(AsyncShutdownRaw(context, request, cq));
+ }
+ std::unique_ptr< ::grpc::ClientAsyncResponseReaderInterface< ::stable::agones::dev::sdk::Empty>> PrepareAsyncShutdown(::grpc::ClientContext* context, const ::stable::agones::dev::sdk::Empty& request, ::grpc::CompletionQueue* cq) {
+ return std::unique_ptr< ::grpc::ClientAsyncResponseReaderInterface< ::stable::agones::dev::sdk::Empty>>(PrepareAsyncShutdownRaw(context, request, cq));
+ }
+ // Send a Empty every d Duration to declare that this GameSever is healthy
+ std::unique_ptr< ::grpc::ClientWriterInterface< ::stable::agones::dev::sdk::Empty>> Health(::grpc::ClientContext* context, ::stable::agones::dev::sdk::Empty* response) {
+ return std::unique_ptr< ::grpc::ClientWriterInterface< ::stable::agones::dev::sdk::Empty>>(HealthRaw(context, response));
+ }
+ std::unique_ptr< ::grpc::ClientAsyncWriterInterface< ::stable::agones::dev::sdk::Empty>> AsyncHealth(::grpc::ClientContext* context, ::stable::agones::dev::sdk::Empty* response, ::grpc::CompletionQueue* cq, void* tag) {
+ return std::unique_ptr< ::grpc::ClientAsyncWriterInterface< ::stable::agones::dev::sdk::Empty>>(AsyncHealthRaw(context, response, cq, tag));
+ }
+ std::unique_ptr< ::grpc::ClientAsyncWriterInterface< ::stable::agones::dev::sdk::Empty>> PrepareAsyncHealth(::grpc::ClientContext* context, ::stable::agones::dev::sdk::Empty* response, ::grpc::CompletionQueue* cq) {
+ return std::unique_ptr< ::grpc::ClientAsyncWriterInterface< ::stable::agones::dev::sdk::Empty>>(PrepareAsyncHealthRaw(context, response, cq));
+ }
+ private:
+ virtual ::grpc::ClientAsyncResponseReaderInterface< ::stable::agones::dev::sdk::Empty>* AsyncReadyRaw(::grpc::ClientContext* context, const ::stable::agones::dev::sdk::Empty& request, ::grpc::CompletionQueue* cq) = 0;
+ virtual ::grpc::ClientAsyncResponseReaderInterface< ::stable::agones::dev::sdk::Empty>* PrepareAsyncReadyRaw(::grpc::ClientContext* context, const ::stable::agones::dev::sdk::Empty& request, ::grpc::CompletionQueue* cq) = 0;
+ virtual ::grpc::ClientAsyncResponseReaderInterface< ::stable::agones::dev::sdk::Empty>* AsyncShutdownRaw(::grpc::ClientContext* context, const ::stable::agones::dev::sdk::Empty& request, ::grpc::CompletionQueue* cq) = 0;
+ virtual ::grpc::ClientAsyncResponseReaderInterface< ::stable::agones::dev::sdk::Empty>* PrepareAsyncShutdownRaw(::grpc::ClientContext* context, const ::stable::agones::dev::sdk::Empty& request, ::grpc::CompletionQueue* cq) = 0;
+ virtual ::grpc::ClientWriterInterface< ::stable::agones::dev::sdk::Empty>* HealthRaw(::grpc::ClientContext* context, ::stable::agones::dev::sdk::Empty* response) = 0;
+ virtual ::grpc::ClientAsyncWriterInterface< ::stable::agones::dev::sdk::Empty>* AsyncHealthRaw(::grpc::ClientContext* context, ::stable::agones::dev::sdk::Empty* response, ::grpc::CompletionQueue* cq, void* tag) = 0;
+ virtual ::grpc::ClientAsyncWriterInterface< ::stable::agones::dev::sdk::Empty>* PrepareAsyncHealthRaw(::grpc::ClientContext* context, ::stable::agones::dev::sdk::Empty* response, ::grpc::CompletionQueue* cq) = 0;
+ };
+ class Stub final : public StubInterface {
+ public:
+ Stub(const std::shared_ptr< ::grpc::ChannelInterface>& channel);
+ ::grpc::Status Ready(::grpc::ClientContext* context, const ::stable::agones::dev::sdk::Empty& request, ::stable::agones::dev::sdk::Empty* response) override;
+ std::unique_ptr< ::grpc::ClientAsyncResponseReader< ::stable::agones::dev::sdk::Empty>> AsyncReady(::grpc::ClientContext* context, const ::stable::agones::dev::sdk::Empty& request, ::grpc::CompletionQueue* cq) {
+ return std::unique_ptr< ::grpc::ClientAsyncResponseReader< ::stable::agones::dev::sdk::Empty>>(AsyncReadyRaw(context, request, cq));
+ }
+ std::unique_ptr< ::grpc::ClientAsyncResponseReader< ::stable::agones::dev::sdk::Empty>> PrepareAsyncReady(::grpc::ClientContext* context, const ::stable::agones::dev::sdk::Empty& request, ::grpc::CompletionQueue* cq) {
+ return std::unique_ptr< ::grpc::ClientAsyncResponseReader< ::stable::agones::dev::sdk::Empty>>(PrepareAsyncReadyRaw(context, request, cq));
+ }
+ ::grpc::Status Shutdown(::grpc::ClientContext* context, const ::stable::agones::dev::sdk::Empty& request, ::stable::agones::dev::sdk::Empty* response) override;
+ std::unique_ptr< ::grpc::ClientAsyncResponseReader< ::stable::agones::dev::sdk::Empty>> AsyncShutdown(::grpc::ClientContext* context, const ::stable::agones::dev::sdk::Empty& request, ::grpc::CompletionQueue* cq) {
+ return std::unique_ptr< ::grpc::ClientAsyncResponseReader< ::stable::agones::dev::sdk::Empty>>(AsyncShutdownRaw(context, request, cq));
+ }
+ std::unique_ptr< ::grpc::ClientAsyncResponseReader< ::stable::agones::dev::sdk::Empty>> PrepareAsyncShutdown(::grpc::ClientContext* context, const ::stable::agones::dev::sdk::Empty& request, ::grpc::CompletionQueue* cq) {
+ return std::unique_ptr< ::grpc::ClientAsyncResponseReader< ::stable::agones::dev::sdk::Empty>>(PrepareAsyncShutdownRaw(context, request, cq));
+ }
+ std::unique_ptr< ::grpc::ClientWriter< ::stable::agones::dev::sdk::Empty>> Health(::grpc::ClientContext* context, ::stable::agones::dev::sdk::Empty* response) {
+ return std::unique_ptr< ::grpc::ClientWriter< ::stable::agones::dev::sdk::Empty>>(HealthRaw(context, response));
+ }
+ std::unique_ptr< ::grpc::ClientAsyncWriter< ::stable::agones::dev::sdk::Empty>> AsyncHealth(::grpc::ClientContext* context, ::stable::agones::dev::sdk::Empty* response, ::grpc::CompletionQueue* cq, void* tag) {
+ return std::unique_ptr< ::grpc::ClientAsyncWriter< ::stable::agones::dev::sdk::Empty>>(AsyncHealthRaw(context, response, cq, tag));
+ }
+ std::unique_ptr< ::grpc::ClientAsyncWriter< ::stable::agones::dev::sdk::Empty>> PrepareAsyncHealth(::grpc::ClientContext* context, ::stable::agones::dev::sdk::Empty* response, ::grpc::CompletionQueue* cq) {
+ return std::unique_ptr< ::grpc::ClientAsyncWriter< ::stable::agones::dev::sdk::Empty>>(PrepareAsyncHealthRaw(context, response, cq));
+ }
+
+ private:
+ std::shared_ptr< ::grpc::ChannelInterface> channel_;
+ ::grpc::ClientAsyncResponseReader< ::stable::agones::dev::sdk::Empty>* AsyncReadyRaw(::grpc::ClientContext* context, const ::stable::agones::dev::sdk::Empty& request, ::grpc::CompletionQueue* cq) override;
+ ::grpc::ClientAsyncResponseReader< ::stable::agones::dev::sdk::Empty>* PrepareAsyncReadyRaw(::grpc::ClientContext* context, const ::stable::agones::dev::sdk::Empty& request, ::grpc::CompletionQueue* cq) override;
+ ::grpc::ClientAsyncResponseReader< ::stable::agones::dev::sdk::Empty>* AsyncShutdownRaw(::grpc::ClientContext* context, const ::stable::agones::dev::sdk::Empty& request, ::grpc::CompletionQueue* cq) override;
+ ::grpc::ClientAsyncResponseReader< ::stable::agones::dev::sdk::Empty>* PrepareAsyncShutdownRaw(::grpc::ClientContext* context, const ::stable::agones::dev::sdk::Empty& request, ::grpc::CompletionQueue* cq) override;
+ ::grpc::ClientWriter< ::stable::agones::dev::sdk::Empty>* HealthRaw(::grpc::ClientContext* context, ::stable::agones::dev::sdk::Empty* response) override;
+ ::grpc::ClientAsyncWriter< ::stable::agones::dev::sdk::Empty>* AsyncHealthRaw(::grpc::ClientContext* context, ::stable::agones::dev::sdk::Empty* response, ::grpc::CompletionQueue* cq, void* tag) override;
+ ::grpc::ClientAsyncWriter< ::stable::agones::dev::sdk::Empty>* PrepareAsyncHealthRaw(::grpc::ClientContext* context, ::stable::agones::dev::sdk::Empty* response, ::grpc::CompletionQueue* cq) override;
+ const ::grpc::internal::RpcMethod rpcmethod_Ready_;
+ const ::grpc::internal::RpcMethod rpcmethod_Shutdown_;
+ const ::grpc::internal::RpcMethod rpcmethod_Health_;
+ };
+ static std::unique_ptr NewStub(const std::shared_ptr< ::grpc::ChannelInterface>& channel, const ::grpc::StubOptions& options = ::grpc::StubOptions());
+
+ class Service : public ::grpc::Service {
+ public:
+ Service();
+ virtual ~Service();
+ // Call when the GameServer is ready
+ virtual ::grpc::Status Ready(::grpc::ServerContext* context, const ::stable::agones::dev::sdk::Empty* request, ::stable::agones::dev::sdk::Empty* response);
+ // Call when the GmaeServer is shutting down
+ virtual ::grpc::Status Shutdown(::grpc::ServerContext* context, const ::stable::agones::dev::sdk::Empty* request, ::stable::agones::dev::sdk::Empty* response);
+ // Send a Empty every d Duration to declare that this GameSever is healthy
+ virtual ::grpc::Status Health(::grpc::ServerContext* context, ::grpc::ServerReader< ::stable::agones::dev::sdk::Empty>* reader, ::stable::agones::dev::sdk::Empty* response);
+ };
+ template
+ class WithAsyncMethod_Ready : public BaseClass {
+ private:
+ void BaseClassMustBeDerivedFromService(const Service *service) {}
+ public:
+ WithAsyncMethod_Ready() {
+ ::grpc::Service::MarkMethodAsync(0);
+ }
+ ~WithAsyncMethod_Ready() override {
+ BaseClassMustBeDerivedFromService(this);
+ }
+ // disable synchronous version of this method
+ ::grpc::Status Ready(::grpc::ServerContext* context, const ::stable::agones::dev::sdk::Empty* request, ::stable::agones::dev::sdk::Empty* response) final override {
+ abort();
+ return ::grpc::Status(::grpc::StatusCode::UNIMPLEMENTED, "");
+ }
+ void RequestReady(::grpc::ServerContext* context, ::stable::agones::dev::sdk::Empty* request, ::grpc::ServerAsyncResponseWriter< ::stable::agones::dev::sdk::Empty>* response, ::grpc::CompletionQueue* new_call_cq, ::grpc::ServerCompletionQueue* notification_cq, void *tag) {
+ ::grpc::Service::RequestAsyncUnary(0, context, request, response, new_call_cq, notification_cq, tag);
+ }
+ };
+ template
+ class WithAsyncMethod_Shutdown : public BaseClass {
+ private:
+ void BaseClassMustBeDerivedFromService(const Service *service) {}
+ public:
+ WithAsyncMethod_Shutdown() {
+ ::grpc::Service::MarkMethodAsync(1);
+ }
+ ~WithAsyncMethod_Shutdown() override {
+ BaseClassMustBeDerivedFromService(this);
+ }
+ // disable synchronous version of this method
+ ::grpc::Status Shutdown(::grpc::ServerContext* context, const ::stable::agones::dev::sdk::Empty* request, ::stable::agones::dev::sdk::Empty* response) final override {
+ abort();
+ return ::grpc::Status(::grpc::StatusCode::UNIMPLEMENTED, "");
+ }
+ void RequestShutdown(::grpc::ServerContext* context, ::stable::agones::dev::sdk::Empty* request, ::grpc::ServerAsyncResponseWriter< ::stable::agones::dev::sdk::Empty>* response, ::grpc::CompletionQueue* new_call_cq, ::grpc::ServerCompletionQueue* notification_cq, void *tag) {
+ ::grpc::Service::RequestAsyncUnary(1, context, request, response, new_call_cq, notification_cq, tag);
+ }
+ };
+ template
+ class WithAsyncMethod_Health : public BaseClass {
+ private:
+ void BaseClassMustBeDerivedFromService(const Service *service) {}
+ public:
+ WithAsyncMethod_Health() {
+ ::grpc::Service::MarkMethodAsync(2);
+ }
+ ~WithAsyncMethod_Health() override {
+ BaseClassMustBeDerivedFromService(this);
+ }
+ // disable synchronous version of this method
+ ::grpc::Status Health(::grpc::ServerContext* context, ::grpc::ServerReader< ::stable::agones::dev::sdk::Empty>* reader, ::stable::agones::dev::sdk::Empty* response) final override {
+ abort();
+ return ::grpc::Status(::grpc::StatusCode::UNIMPLEMENTED, "");
+ }
+ void RequestHealth(::grpc::ServerContext* context, ::grpc::ServerAsyncReader< ::stable::agones::dev::sdk::Empty, ::stable::agones::dev::sdk::Empty>* reader, ::grpc::CompletionQueue* new_call_cq, ::grpc::ServerCompletionQueue* notification_cq, void *tag) {
+ ::grpc::Service::RequestAsyncClientStreaming(2, context, reader, new_call_cq, notification_cq, tag);
+ }
+ };
+ typedef WithAsyncMethod_Ready > > AsyncService;
+ template
+ class WithGenericMethod_Ready : public BaseClass {
+ private:
+ void BaseClassMustBeDerivedFromService(const Service *service) {}
+ public:
+ WithGenericMethod_Ready() {
+ ::grpc::Service::MarkMethodGeneric(0);
+ }
+ ~WithGenericMethod_Ready() override {
+ BaseClassMustBeDerivedFromService(this);
+ }
+ // disable synchronous version of this method
+ ::grpc::Status Ready(::grpc::ServerContext* context, const ::stable::agones::dev::sdk::Empty* request, ::stable::agones::dev::sdk::Empty* response) final override {
+ abort();
+ return ::grpc::Status(::grpc::StatusCode::UNIMPLEMENTED, "");
+ }
+ };
+ template
+ class WithGenericMethod_Shutdown : public BaseClass {
+ private:
+ void BaseClassMustBeDerivedFromService(const Service *service) {}
+ public:
+ WithGenericMethod_Shutdown() {
+ ::grpc::Service::MarkMethodGeneric(1);
+ }
+ ~WithGenericMethod_Shutdown() override {
+ BaseClassMustBeDerivedFromService(this);
+ }
+ // disable synchronous version of this method
+ ::grpc::Status Shutdown(::grpc::ServerContext* context, const ::stable::agones::dev::sdk::Empty* request, ::stable::agones::dev::sdk::Empty* response) final override {
+ abort();
+ return ::grpc::Status(::grpc::StatusCode::UNIMPLEMENTED, "");
+ }
+ };
+ template
+ class WithGenericMethod_Health : public BaseClass {
+ private:
+ void BaseClassMustBeDerivedFromService(const Service *service) {}
+ public:
+ WithGenericMethod_Health() {
+ ::grpc::Service::MarkMethodGeneric(2);
+ }
+ ~WithGenericMethod_Health() override {
+ BaseClassMustBeDerivedFromService(this);
+ }
+ // disable synchronous version of this method
+ ::grpc::Status Health(::grpc::ServerContext* context, ::grpc::ServerReader< ::stable::agones::dev::sdk::Empty>* reader, ::stable::agones::dev::sdk::Empty* response) final override {
+ abort();
+ return ::grpc::Status(::grpc::StatusCode::UNIMPLEMENTED, "");
+ }
+ };
+ template
+ class WithStreamedUnaryMethod_Ready : public BaseClass {
+ private:
+ void BaseClassMustBeDerivedFromService(const Service *service) {}
+ public:
+ WithStreamedUnaryMethod_Ready() {
+ ::grpc::Service::MarkMethodStreamed(0,
+ new ::grpc::internal::StreamedUnaryHandler< ::stable::agones::dev::sdk::Empty, ::stable::agones::dev::sdk::Empty>(std::bind(&WithStreamedUnaryMethod_Ready::StreamedReady, this, std::placeholders::_1, std::placeholders::_2)));
+ }
+ ~WithStreamedUnaryMethod_Ready() override {
+ BaseClassMustBeDerivedFromService(this);
+ }
+ // disable regular version of this method
+ ::grpc::Status Ready(::grpc::ServerContext* context, const ::stable::agones::dev::sdk::Empty* request, ::stable::agones::dev::sdk::Empty* response) final override {
+ abort();
+ return ::grpc::Status(::grpc::StatusCode::UNIMPLEMENTED, "");
+ }
+ // replace default version of method with streamed unary
+ virtual ::grpc::Status StreamedReady(::grpc::ServerContext* context, ::grpc::ServerUnaryStreamer< ::stable::agones::dev::sdk::Empty,::stable::agones::dev::sdk::Empty>* server_unary_streamer) = 0;
+ };
+ template
+ class WithStreamedUnaryMethod_Shutdown : public BaseClass {
+ private:
+ void BaseClassMustBeDerivedFromService(const Service *service) {}
+ public:
+ WithStreamedUnaryMethod_Shutdown() {
+ ::grpc::Service::MarkMethodStreamed(1,
+ new ::grpc::internal::StreamedUnaryHandler< ::stable::agones::dev::sdk::Empty, ::stable::agones::dev::sdk::Empty>(std::bind(&WithStreamedUnaryMethod_Shutdown::StreamedShutdown, this, std::placeholders::_1, std::placeholders::_2)));
+ }
+ ~WithStreamedUnaryMethod_Shutdown() override {
+ BaseClassMustBeDerivedFromService(this);
+ }
+ // disable regular version of this method
+ ::grpc::Status Shutdown(::grpc::ServerContext* context, const ::stable::agones::dev::sdk::Empty* request, ::stable::agones::dev::sdk::Empty* response) final override {
+ abort();
+ return ::grpc::Status(::grpc::StatusCode::UNIMPLEMENTED, "");
+ }
+ // replace default version of method with streamed unary
+ virtual ::grpc::Status StreamedShutdown(::grpc::ServerContext* context, ::grpc::ServerUnaryStreamer< ::stable::agones::dev::sdk::Empty,::stable::agones::dev::sdk::Empty>* server_unary_streamer) = 0;
+ };
+ typedef WithStreamedUnaryMethod_Ready > StreamedUnaryService;
+ typedef Service SplitStreamedService;
+ typedef WithStreamedUnaryMethod_Ready > StreamedService;
+};
+
+} // namespace sdk
+} // namespace dev
+} // namespace agones
+} // namespace stable
+
+
+#endif // GRPC_sdk_2eproto__INCLUDED
diff --git a/Agones/Source/Agones/Public/sdk.h b/Agones/Source/Agones/Public/sdk.h
new file mode 100644
index 0000000..313120b
--- /dev/null
+++ b/Agones/Source/Agones/Public/sdk.h
@@ -0,0 +1,50 @@
+// Copyright 2017 Google Inc. All Rights Reserved.
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+// http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+#define GPR_FORBID_UNREACHABLE_CODE 1
+#define GOOGLE_PROTOBUF_NO_RTTI 1
+#include
+#include "sdk.grpc.pb.h"
+
+namespace agones {
+
+ // The Agones SDK
+ class SDK {
+ public:
+ // Creates a new instance of the SDK.
+ // Does not connect to anything.
+ SDK();
+
+ // Must be called before any other functions on the SDK.
+ // This will attempt to do a handshake with the sdk server, timing out
+ // after 30 seconds.
+ // Returns true if the connection was successful, false if not.
+ bool Connect();
+
+ // Marks the Game Server as ready to receive connections
+ grpc::Status Ready();
+
+ // Send Health ping. This is a synchronous request.
+ bool Health();
+
+ // Marks the Game Server as ready to shutdown
+ grpc::Status Shutdown();
+
+ ~SDK();
+
+ private:
+ std::shared_ptr channel;
+ std::unique_ptr stub;
+ std::unique_ptr< ::grpc::ClientWriter< ::stable::agones::dev::sdk::Empty>> health;
+ };
+}
diff --git a/Agones/Source/Agones/Public/sdk.pb.h b/Agones/Source/Agones/Public/sdk.pb.h
new file mode 100644
index 0000000..812f0cd
--- /dev/null
+++ b/Agones/Source/Agones/Public/sdk.pb.h
@@ -0,0 +1,202 @@
+// Copyright 2018 Google Inc. All Rights Reserved.
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+// http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+
+// This code was autogenerated. Do not edit directly.
+// Generated by the protocol buffer compiler. DO NOT EDIT!
+// source: sdk.proto
+
+#ifndef PROTOBUF_sdk_2eproto__INCLUDED
+#define PROTOBUF_sdk_2eproto__INCLUDED
+
+#include
+
+#include
+
+#define GPR_FORBID_UNREACHABLE_CODE 1
+#define GOOGLE_PROTOBUF_NO_RTTI 1
+
+
+#if GOOGLE_PROTOBUF_VERSION < 3005000
+#error This file was generated by a newer version of protoc which is
+#error incompatible with your Protocol Buffer headers. Please update
+#error your headers.
+#endif
+#if 3005000 < GOOGLE_PROTOBUF_MIN_PROTOC_VERSION
+#error This file was generated by an older version of protoc which is
+#error incompatible with your Protocol Buffer headers. Please
+#error regenerate this file with a newer version of protoc.
+#endif
+
+#include
+#include
+#include
+#include
+#include
+#include
+#include
+#include // IWYU pragma: export
+#include // IWYU pragma: export
+#include
+// @@protoc_insertion_point(includes)
+
+namespace protobuf_sdk_2eproto {
+// Internal implementation detail -- do not use these members.
+struct TableStruct {
+ static const ::google::protobuf::internal::ParseTableField entries[];
+ static const ::google::protobuf::internal::AuxillaryParseTableField aux[];
+ static const ::google::protobuf::internal::ParseTable schema[1];
+ static const ::google::protobuf::internal::FieldMetadata field_metadata[];
+ static const ::google::protobuf::internal::SerializationTable serialization_table[];
+ static const ::google::protobuf::uint32 offsets[];
+};
+void AddDescriptors();
+void InitDefaultsEmptyImpl();
+void InitDefaultsEmpty();
+inline void InitDefaults() {
+ InitDefaultsEmpty();
+}
+} // namespace protobuf_sdk_2eproto
+namespace stable {
+namespace agones {
+namespace dev {
+namespace sdk {
+class Empty;
+class EmptyDefaultTypeInternal;
+extern EmptyDefaultTypeInternal _Empty_default_instance_;
+} // namespace sdk
+} // namespace dev
+} // namespace agones
+} // namespace stable
+namespace stable {
+namespace agones {
+namespace dev {
+namespace sdk {
+
+// ===================================================================
+
+class Empty : public ::google::protobuf::Message /* @@protoc_insertion_point(class_definition:stable.agones.dev.sdk.Empty) */ {
+ public:
+ Empty();
+ virtual ~Empty();
+
+ Empty(const Empty& from);
+
+ inline Empty& operator=(const Empty& from) {
+ CopyFrom(from);
+ return *this;
+ }
+ #if LANG_CXX11
+ Empty(Empty&& from) noexcept
+ : Empty() {
+ *this = ::std::move(from);
+ }
+
+ inline Empty& operator=(Empty&& from) noexcept {
+ if (GetArenaNoVirtual() == from.GetArenaNoVirtual()) {
+ if (this != &from) InternalSwap(&from);
+ } else {
+ CopyFrom(from);
+ }
+ return *this;
+ }
+ #endif
+ static const ::google::protobuf::Descriptor* descriptor();
+ static const Empty& default_instance();
+
+ static void InitAsDefaultInstance(); // FOR INTERNAL USE ONLY
+ static inline const Empty* internal_default_instance() {
+ return reinterpret_cast(
+ &_Empty_default_instance_);
+ }
+ static PROTOBUF_CONSTEXPR int const kIndexInFileMessages =
+ 0;
+
+ void Swap(Empty* other);
+ friend void swap(Empty& a, Empty& b) {
+ a.Swap(&b);
+ }
+
+ // implements Message ----------------------------------------------
+
+ inline Empty* New() const PROTOBUF_FINAL { return New(NULL); }
+
+ Empty* New(::google::protobuf::Arena* arena) const PROTOBUF_FINAL;
+ void CopyFrom(const ::google::protobuf::Message& from) PROTOBUF_FINAL;
+ void MergeFrom(const ::google::protobuf::Message& from) PROTOBUF_FINAL;
+ void CopyFrom(const Empty& from);
+ void MergeFrom(const Empty& from);
+ void Clear() PROTOBUF_FINAL;
+ bool IsInitialized() const PROTOBUF_FINAL;
+
+ size_t ByteSizeLong() const PROTOBUF_FINAL;
+ bool MergePartialFromCodedStream(
+ ::google::protobuf::io::CodedInputStream* input) PROTOBUF_FINAL;
+ void SerializeWithCachedSizes(
+ ::google::protobuf::io::CodedOutputStream* output) const PROTOBUF_FINAL;
+ ::google::protobuf::uint8* InternalSerializeWithCachedSizesToArray(
+ bool deterministic, ::google::protobuf::uint8* target) const PROTOBUF_FINAL;
+ int GetCachedSize() const PROTOBUF_FINAL { return _cached_size_; }
+ private:
+ void SharedCtor();
+ void SharedDtor();
+ void SetCachedSize(int size) const PROTOBUF_FINAL;
+ void InternalSwap(Empty* other);
+ private:
+ inline ::google::protobuf::Arena* GetArenaNoVirtual() const {
+ return NULL;
+ }
+ inline void* MaybeArenaPtr() const {
+ return NULL;
+ }
+ public:
+
+ ::google::protobuf::Metadata GetMetadata() const PROTOBUF_FINAL;
+
+ // nested types ----------------------------------------------------
+
+ // accessors -------------------------------------------------------
+
+ // @@protoc_insertion_point(class_scope:stable.agones.dev.sdk.Empty)
+ private:
+
+ ::google::protobuf::internal::InternalMetadataWithArena _internal_metadata_;
+ mutable int _cached_size_;
+ friend struct ::protobuf_sdk_2eproto::TableStruct;
+ friend void ::protobuf_sdk_2eproto::InitDefaultsEmptyImpl();
+};
+// ===================================================================
+
+
+// ===================================================================
+
+#ifdef __GNUC__
+ #pragma GCC diagnostic push
+ #pragma GCC diagnostic ignored "-Wstrict-aliasing"
+#endif // __GNUC__
+// Empty
+
+#ifdef __GNUC__
+ #pragma GCC diagnostic pop
+#endif // __GNUC__
+
+// @@protoc_insertion_point(namespace_scope)
+
+} // namespace sdk
+} // namespace dev
+} // namespace agones
+} // namespace stable
+
+// @@protoc_insertion_point(global_scope)
+
+#endif // PROTOBUF_sdk_2eproto__INCLUDED
diff --git a/Config/DefaultEditor.ini b/Config/DefaultEditor.ini
index c2cf80a..b229537 100644
--- a/Config/DefaultEditor.ini
+++ b/Config/DefaultEditor.ini
@@ -1,23 +1,10 @@
-[UnrealEd.SimpleMap]
-SimpleMapName=/Game/ThirdPerson/Maps/ThirdPersonExampleMap
-
[EditoronlyBP]
bAllowClassAndBlueprintPinMatching=true
bReplaceBlueprintWithClass= true
bDontLoadBlueprintOutsideEditor= true
bBlueprintIsNotBlueprintType= true
-[/Script/Engine.AssetViewerSettings]
--Profiles=(ProfileName="Default",DirectionalLightIntensity=2.620000,DirectionalLightColor=(R=0.990000,G=0.839850,B=0.732600,A=1.000000),SkyLightIntensity=0.880000,bRotateLightingRig=False,bShowEnvironment=True,bShowFloor=True,EnvironmentCubeMap=TextureCube'/Engine/EngineSky/EpicQuadPanorama_CC+EV1.EpicQuadPanorama_CC+EV1',PostProcessingSettings=(bOverride_WhiteTemp=True,bOverride_WhiteTint=False,bOverride_ColorSaturation=True,bOverride_ColorContrast=True,bOverride_ColorGamma=True,bOverride_ColorGain=True,bOverride_ColorOffset=True,bOverride_FilmWhitePoint=False,bOverride_FilmSaturation=False,bOverride_FilmChannelMixerRed=False,bOverride_FilmChannelMixerGreen=False,bOverride_FilmChannelMixerBlue=False,bOverride_FilmContrast=False,bOverride_FilmDynamicRange=False,bOverride_FilmHealAmount=False,bOverride_FilmToeAmount=False,bOverride_FilmShadowTint=False,bOverride_FilmShadowTintBlend=False,bOverride_FilmShadowTintAmount=False,bOverride_FilmSlope=True,bOverride_FilmToe=True,bOverride_FilmShoulder=True,bOverride_FilmBlackClip=True,bOverride_FilmWhiteClip=True,bOverride_SceneColorTint=False,bOverride_SceneFringeIntensity=False,bOverride_AmbientCubemapTint=False,bOverride_AmbientCubemapIntensity=False,bOverride_BloomIntensity=True,bOverride_BloomThreshold=False,bOverride_Bloom1Tint=False,bOverride_Bloom1Size=False,bOverride_Bloom2Size=False,bOverride_Bloom2Tint=False,bOverride_Bloom3Tint=False,bOverride_Bloom3Size=False,bOverride_Bloom4Tint=False,bOverride_Bloom4Size=False,bOverride_Bloom5Tint=False,bOverride_Bloom5Size=False,bOverride_Bloom6Tint=False,bOverride_Bloom6Size=False,bOverride_BloomSizeScale=False,bOverride_BloomDirtMaskIntensity=False,bOverride_BloomDirtMaskTint=False,bOverride_BloomDirtMask=False,bOverride_AutoExposureMethod=True,bOverride_AutoExposureLowPercent=False,bOverride_AutoExposureHighPercent=False,bOverride_AutoExposureMinBrightness=True,bOverride_AutoExposureMaxBrightness=True,bOverride_AutoExposureSpeedUp=False,bOverride_AutoExposureSpeedDown=False,bOverride_AutoExposureBias=True,bOverride_HistogramLogMin=True,bOverride_HistogramLogMax=True,bOverride_LensFlareIntensity=False,bOverride_LensFlareTint=False,bOverride_LensFlareTints=False,bOverride_LensFlareBokehSize=False,bOverride_LensFlareBokehShape=False,bOverride_LensFlareThreshold=False,bOverride_VignetteIntensity=True,bOverride_GrainIntensity=False,bOverride_GrainJitter=False,bOverride_AmbientOcclusionIntensity=True,bOverride_AmbientOcclusionStaticFraction=True,bOverride_AmbientOcclusionRadius=True,bOverride_AmbientOcclusionFadeDistance=False,bOverride_AmbientOcclusionFadeRadius=False,bOverride_AmbientOcclusionDistance=False,bOverride_AmbientOcclusionRadiusInWS=False,bOverride_AmbientOcclusionPower=True,bOverride_AmbientOcclusionBias=True,bOverride_AmbientOcclusionQuality=True,bOverride_AmbientOcclusionMipBlend=True,bOverride_AmbientOcclusionMipScale=True,bOverride_AmbientOcclusionMipThreshold=True,bOverride_LPVIntensity=False,bOverride_LPVDirectionalOcclusionIntensity=False,bOverride_LPVDirectionalOcclusionRadius=False,bOverride_LPVDiffuseOcclusionExponent=False,bOverride_LPVSpecularOcclusionExponent=False,bOverride_LPVDiffuseOcclusionIntensity=False,bOverride_LPVSpecularOcclusionIntensity=False,bOverride_LPVSize=False,bOverride_LPVSecondaryOcclusionIntensity=False,bOverride_LPVSecondaryBounceIntensity=False,bOverride_LPVGeometryVolumeBias=False,bOverride_LPVVplInjectionBias=False,bOverride_LPVEmissiveInjectionIntensity=False,bOverride_IndirectLightingColor=False,bOverride_IndirectLightingIntensity=False,bOverride_ColorGradingIntensity=True,bOverride_ColorGradingLUT=True,bOverride_DepthOfFieldFocalDistance=False,bOverride_DepthOfFieldFstop=False,bOverride_DepthOfFieldSensorWidth=False,bOverride_DepthOfFieldDepthBlurRadius=False,bOverride_DepthOfFieldDepthBlurAmount=False,bOverride_DepthOfFieldFocalRegion=False,bOverride_DepthOfFieldNearTransitionRegion=False,bOverride_DepthOfFieldFarTransitionRegion=False,bOverride_DepthOfFieldScale=True,bOverride_DepthOfFieldMaxBokehSize=False,bOverride_DepthOfFieldNearBlurSize=False,bOverride_DepthOfFieldFarBlurSize=False,bOverride_DepthOfFieldMethod=True,bOverride_MobileHQGaussian=False,bOverride_DepthOfFieldBokehShape=False,bOverride_DepthOfFieldOcclusion=False,bOverride_DepthOfFieldColorThreshold=False,bOverride_DepthOfFieldSizeThreshold=False,bOverride_DepthOfFieldSkyFocusDistance=False,bOverride_DepthOfFieldVignetteSize=False,bOverride_MotionBlurAmount=False,bOverride_MotionBlurMax=False,bOverride_MotionBlurPerObjectSize=False,bOverride_ScreenPercentage=False,bOverride_ScreenSpaceReflectionIntensity=True,bOverride_ScreenSpaceReflectionQuality=True,bOverride_ScreenSpaceReflectionMaxRoughness=True,bOverride_ScreenSpaceReflectionRoughnessScale=False,WhiteTemp=6700.000000,WhiteTint=0.000000,ColorSaturation=(X=1.000000,Y=1.000000,Z=1.000000),ColorContrast=(X=1.000000,Y=1.000000,Z=1.000000),ColorGamma=(X=1.000000,Y=1.000000,Z=1.000000),ColorGain=(X=1.000000,Y=1.000000,Z=1.000000),ColorOffset=(X=0.005000,Y=0.005000,Z=0.005000),FilmWhitePoint=(R=1.000000,G=1.000000,B=1.000000,A=1.000000),FilmShadowTint=(R=1.000000,G=1.000000,B=1.000000,A=1.000000),FilmShadowTintBlend=0.500000,FilmShadowTintAmount=0.000000,FilmSaturation=1.000000,FilmChannelMixerRed=(R=1.000000,G=0.000000,B=0.000000,A=1.000000),FilmChannelMixerGreen=(R=0.000000,G=1.000000,B=0.000000,A=1.000000),FilmChannelMixerBlue=(R=0.000000,G=0.000000,B=1.000000,A=1.000000),FilmContrast=0.030000,FilmToeAmount=1.000000,FilmHealAmount=0.180000,FilmDynamicRange=4.000000,FilmSlope=0.880000,FilmToe=0.550000,FilmShoulder=0.260000,FilmBlackClip=0.000000,FilmWhiteClip=0.040000,SceneColorTint=(R=1.000000,G=1.000000,B=1.000000,A=1.000000),SceneFringeIntensity=0.000000,BloomIntensity=1.000000,BloomThreshold=1.000000,BloomSizeScale=4.000000,Bloom1Size=1.000000,Bloom2Size=4.000000,Bloom3Size=16.000000,Bloom4Size=32.000000,Bloom5Size=64.000000,Bloom6Size=64.000000,Bloom1Tint=(R=0.500000,G=0.500000,B=0.500000,A=1.000000),Bloom2Tint=(R=0.500000,G=0.500000,B=0.500000,A=1.000000),Bloom3Tint=(R=0.500000,G=0.500000,B=0.500000,A=1.000000),Bloom4Tint=(R=0.500000,G=0.500000,B=0.500000,A=1.000000),Bloom5Tint=(R=0.500000,G=0.500000,B=0.500000,A=1.000000),Bloom6Tint=(R=0.500000,G=0.500000,B=0.500000,A=1.000000),BloomDirtMaskIntensity=1.000000,BloomDirtMaskTint=(R=0.500000,G=0.500000,B=0.500000,A=1.000000),BloomDirtMask=None,LPVIntensity=1.000000,LPVVplInjectionBias=0.640000,LPVSize=5312.000000,LPVSecondaryOcclusionIntensity=0.000000,LPVSecondaryBounceIntensity=0.000000,LPVGeometryVolumeBias=0.384000,LPVEmissiveInjectionIntensity=1.000000,LPVDirectionalOcclusionIntensity=0.000000,LPVDirectionalOcclusionRadius=8.000000,LPVDiffuseOcclusionExponent=1.000000,LPVSpecularOcclusionExponent=7.000000,LPVDiffuseOcclusionIntensity=1.000000,LPVSpecularOcclusionIntensity=1.000000,AmbientCubemapTint=(R=1.000000,G=1.000000,B=1.000000,A=1.000000),AmbientCubemapIntensity=1.000000,AmbientCubemap=None,AutoExposureMethod=AEM_Histogram,AutoExposureLowPercent=80.000000,AutoExposureHighPercent=98.300003,AutoExposureMinBrightness=1.000000,AutoExposureMaxBrightness=1.000000,AutoExposureSpeedUp=3.000000,AutoExposureSpeedDown=1.000000,AutoExposureBias=0.330000,HistogramLogMin=-8.000000,HistogramLogMax=4.000000,LensFlareIntensity=1.000000,LensFlareTint=(R=1.000000,G=1.000000,B=1.000000,A=1.000000),LensFlareBokehSize=3.000000,LensFlareThreshold=8.000000,LensFlareBokehShape=None,LensFlareTints[0]=(R=1.000000,G=0.800000,B=0.400000,A=0.600000),LensFlareTints[1]=(R=1.000000,G=1.000000,B=0.600000,A=0.530000),LensFlareTints[2]=(R=0.800000,G=0.800000,B=1.000000,A=0.460000),LensFlareTints[3]=(R=0.500000,G=1.000000,B=0.400000,A=0.390000),LensFlareTints[4]=(R=0.500000,G=0.800000,B=1.000000,A=0.310000),LensFlareTints[5]=(R=0.900000,G=1.000000,B=0.800000,A=0.270000),LensFlareTints[6]=(R=1.000000,G=0.800000,B=0.400000,A=0.220000),LensFlareTints[7]=(R=0.900000,G=0.700000,B=0.700000,A=0.150000),VignetteIntensity=0.161468,GrainJitter=0.000000,GrainIntensity=0.000000,AmbientOcclusionIntensity=1.000000,AmbientOcclusionStaticFraction=1.000000,AmbientOcclusionRadius=73.477997,AmbientOcclusionRadiusInWS=False,AmbientOcclusionFadeDistance=8000.000000,AmbientOcclusionFadeRadius=5000.000000,AmbientOcclusionDistance=80.000000,AmbientOcclusionPower=1.200000,AmbientOcclusionBias=3.000000,AmbientOcclusionQuality=100.000000,AmbientOcclusionMipBlend=0.600000,AmbientOcclusionMipScale=1.700000,AmbientOcclusionMipThreshold=0.010000,IndirectLightingColor=(R=1.000000,G=1.000000,B=1.000000,A=1.000000),IndirectLightingIntensity=1.000000,ColorGradingIntensity=0.000000,ColorGradingLUT=Texture2D'/Engine/EditorResources/RGBTable16x1_AssetViewer.RGBTable16x1_AssetViewer',DepthOfFieldMethod=DOFM_BokehDOF,bMobileHQGaussian=False,DepthOfFieldFstop=4.000000,DepthOfFieldSensorWidth=24.576000,DepthOfFieldFocalDistance=1000.000000,DepthOfFieldDepthBlurAmount=1.000000,DepthOfFieldDepthBlurRadius=0.000000,DepthOfFieldFocalRegion=0.000000,DepthOfFieldNearTransitionRegion=300.000000,DepthOfFieldFarTransitionRegion=500.000000,DepthOfFieldScale=0.000000,DepthOfFieldMaxBokehSize=15.000000,DepthOfFieldNearBlurSize=15.000000,DepthOfFieldFarBlurSize=15.000000,DepthOfFieldBokehShape=None,DepthOfFieldOcclusion=0.400000,DepthOfFieldColorThreshold=1.000000,DepthOfFieldSizeThreshold=0.080000,DepthOfFieldSkyFocusDistance=0.000000,DepthOfFieldVignetteSize=200.000000,MotionBlurAmount=0.500000,MotionBlurMax=5.000000,MotionBlurPerObjectSize=0.500000,ScreenPercentage=100.000000,ScreenSpaceReflectionIntensity=100.000000,ScreenSpaceReflectionQuality=100.000000,ScreenSpaceReflectionMaxRoughness=1.000000,WeightedBlendables=(Array=),Blendables=),bPostProcessingEnabled=True,LightingRigRotation=109.389069,RotationSpeed=2.000000,DirectionalLightRotation=(Pitch=-40.000000,Yaw=-67.500000,Roll=0.000000))
--Profiles=(ProfileName="Default",DirectionalLightIntensity=2.620000,DirectionalLightColor=(R=0.990000,G=0.839850,B=0.732600,A=1.000000),SkyLightIntensity=0.880000,bRotateLightingRig=False,bShowEnvironment=True,bShowFloor=True,EnvironmentCubeMap=TextureCube'/Engine/EngineSky/EpicQuadPanorama_CC+EV1.EpicQuadPanorama_CC+EV1',PostProcessingSettings=(bOverride_WhiteTemp=True,bOverride_WhiteTint=False,bOverride_ColorSaturation=True,bOverride_ColorContrast=True,bOverride_ColorGamma=True,bOverride_ColorGain=True,bOverride_ColorOffset=True,bOverride_ColorSaturationShadows=False,bOverride_ColorContrastShadows=False,bOverride_ColorGammaShadows=False,bOverride_ColorGainShadows=False,bOverride_ColorOffsetShadows=False,bOverride_ColorSaturationMidtones=False,bOverride_ColorContrastMidtones=False,bOverride_ColorGammaMidtones=False,bOverride_ColorGainMidtones=False,bOverride_ColorOffsetMidtones=False,bOverride_ColorSaturationHighlights=False,bOverride_ColorContrastHighlights=False,bOverride_ColorGammaHighlights=False,bOverride_ColorGainHighlights=False,bOverride_ColorOffsetHighlights=False,bOverride_ColorCorrectionShadowsMax=False,bOverride_ColorCorrectionHighlightsMin=False,bOverride_FilmWhitePoint=False,bOverride_FilmSaturation=False,bOverride_FilmChannelMixerRed=False,bOverride_FilmChannelMixerGreen=False,bOverride_FilmChannelMixerBlue=False,bOverride_FilmContrast=False,bOverride_FilmDynamicRange=False,bOverride_FilmHealAmount=False,bOverride_FilmToeAmount=False,bOverride_FilmShadowTint=False,bOverride_FilmShadowTintBlend=False,bOverride_FilmShadowTintAmount=False,bOverride_FilmSlope=True,bOverride_FilmToe=True,bOverride_FilmShoulder=True,bOverride_FilmBlackClip=True,bOverride_FilmWhiteClip=True,bOverride_SceneColorTint=False,bOverride_SceneFringeIntensity=False,bOverride_AmbientCubemapTint=False,bOverride_AmbientCubemapIntensity=False,bOverride_BloomIntensity=True,bOverride_BloomThreshold=False,bOverride_Bloom1Tint=False,bOverride_Bloom1Size=False,bOverride_Bloom2Size=False,bOverride_Bloom2Tint=False,bOverride_Bloom3Tint=False,bOverride_Bloom3Size=False,bOverride_Bloom4Tint=False,bOverride_Bloom4Size=False,bOverride_Bloom5Tint=False,bOverride_Bloom5Size=False,bOverride_Bloom6Tint=False,bOverride_Bloom6Size=False,bOverride_BloomSizeScale=False,bOverride_BloomDirtMaskIntensity=False,bOverride_BloomDirtMaskTint=False,bOverride_BloomDirtMask=False,bOverride_AutoExposureMethod=True,bOverride_AutoExposureLowPercent=False,bOverride_AutoExposureHighPercent=False,bOverride_AutoExposureMinBrightness=True,bOverride_AutoExposureMaxBrightness=True,bOverride_AutoExposureSpeedUp=False,bOverride_AutoExposureSpeedDown=False,bOverride_AutoExposureBias=True,bOverride_HistogramLogMin=True,bOverride_HistogramLogMax=True,bOverride_LensFlareIntensity=False,bOverride_LensFlareTint=False,bOverride_LensFlareTints=False,bOverride_LensFlareBokehSize=False,bOverride_LensFlareBokehShape=False,bOverride_LensFlareThreshold=False,bOverride_VignetteIntensity=True,bOverride_GrainIntensity=False,bOverride_GrainJitter=False,bOverride_AmbientOcclusionIntensity=True,bOverride_AmbientOcclusionStaticFraction=True,bOverride_AmbientOcclusionRadius=True,bOverride_AmbientOcclusionFadeDistance=False,bOverride_AmbientOcclusionFadeRadius=False,bOverride_AmbientOcclusionDistance=False,bOverride_AmbientOcclusionRadiusInWS=False,bOverride_AmbientOcclusionPower=True,bOverride_AmbientOcclusionBias=True,bOverride_AmbientOcclusionQuality=True,bOverride_AmbientOcclusionMipBlend=True,bOverride_AmbientOcclusionMipScale=True,bOverride_AmbientOcclusionMipThreshold=True,bOverride_LPVIntensity=False,bOverride_LPVDirectionalOcclusionIntensity=False,bOverride_LPVDirectionalOcclusionRadius=False,bOverride_LPVDiffuseOcclusionExponent=False,bOverride_LPVSpecularOcclusionExponent=False,bOverride_LPVDiffuseOcclusionIntensity=False,bOverride_LPVSpecularOcclusionIntensity=False,bOverride_LPVSize=False,bOverride_LPVSecondaryOcclusionIntensity=False,bOverride_LPVSecondaryBounceIntensity=False,bOverride_LPVGeometryVolumeBias=False,bOverride_LPVVplInjectionBias=False,bOverride_LPVEmissiveInjectionIntensity=False,bOverride_IndirectLightingColor=False,bOverride_IndirectLightingIntensity=False,bOverride_ColorGradingIntensity=True,bOverride_ColorGradingLUT=True,bOverride_DepthOfFieldFocalDistance=False,bOverride_DepthOfFieldFstop=False,bOverride_DepthOfFieldSensorWidth=False,bOverride_DepthOfFieldDepthBlurRadius=False,bOverride_DepthOfFieldDepthBlurAmount=False,bOverride_DepthOfFieldFocalRegion=False,bOverride_DepthOfFieldNearTransitionRegion=False,bOverride_DepthOfFieldFarTransitionRegion=False,bOverride_DepthOfFieldScale=True,bOverride_DepthOfFieldMaxBokehSize=False,bOverride_DepthOfFieldNearBlurSize=False,bOverride_DepthOfFieldFarBlurSize=False,bOverride_DepthOfFieldMethod=True,bOverride_MobileHQGaussian=False,bOverride_DepthOfFieldBokehShape=False,bOverride_DepthOfFieldOcclusion=False,bOverride_DepthOfFieldColorThreshold=False,bOverride_DepthOfFieldSizeThreshold=False,bOverride_DepthOfFieldSkyFocusDistance=False,bOverride_DepthOfFieldVignetteSize=False,bOverride_MotionBlurAmount=False,bOverride_MotionBlurMax=False,bOverride_MotionBlurPerObjectSize=False,bOverride_ScreenPercentage=False,bOverride_ScreenSpaceReflectionIntensity=True,bOverride_ScreenSpaceReflectionQuality=True,bOverride_ScreenSpaceReflectionMaxRoughness=True,bOverride_ScreenSpaceReflectionRoughnessScale=False,WhiteTemp=6700.000000,WhiteTint=0.000000,ColorSaturation=(X=1.000000,Y=1.000000,Z=1.000000,W=1.000000),ColorContrast=(X=1.000000,Y=1.000000,Z=1.000000,W=1.000000),ColorGamma=(X=1.000000,Y=1.000000,Z=1.000000,W=1.000000),ColorGain=(X=1.000000,Y=1.000000,Z=1.000000,W=1.000000),ColorOffset=(X=0.005000,Y=0.005000,Z=0.005000,W=0.000000),ColorSaturationShadows=(X=1.000000,Y=1.000000,Z=1.000000,W=1.000000),ColorContrastShadows=(X=1.000000,Y=1.000000,Z=1.000000,W=1.000000),ColorGammaShadows=(X=1.000000,Y=1.000000,Z=1.000000,W=1.000000),ColorGainShadows=(X=1.000000,Y=1.000000,Z=1.000000,W=1.000000),ColorOffsetShadows=(X=0.000000,Y=0.000000,Z=0.000000,W=0.000000),ColorCorrectionShadowsMax=0.090000,ColorSaturationMidtones=(X=1.000000,Y=1.000000,Z=1.000000,W=1.000000),ColorContrastMidtones=(X=1.000000,Y=1.000000,Z=1.000000,W=1.000000),ColorGammaMidtones=(X=1.000000,Y=1.000000,Z=1.000000,W=1.000000),ColorGainMidtones=(X=1.000000,Y=1.000000,Z=1.000000,W=1.000000),ColorOffsetMidtones=(X=0.000000,Y=0.000000,Z=0.000000,W=0.000000),ColorSaturationHighlights=(X=1.000000,Y=1.000000,Z=1.000000,W=1.000000),ColorContrastHighlights=(X=1.000000,Y=1.000000,Z=1.000000,W=1.000000),ColorGammaHighlights=(X=1.000000,Y=1.000000,Z=1.000000,W=1.000000),ColorGainHighlights=(X=1.000000,Y=1.000000,Z=1.000000,W=1.000000),ColorOffsetHighlights=(X=0.000000,Y=0.000000,Z=0.000000,W=0.000000),ColorCorrectionHighlightsMin=0.500000,FilmWhitePoint=(R=1.000000,G=1.000000,B=1.000000,A=1.000000),FilmShadowTint=(R=1.000000,G=1.000000,B=1.000000,A=1.000000),FilmShadowTintBlend=0.500000,FilmShadowTintAmount=0.000000,FilmSaturation=1.000000,FilmChannelMixerRed=(R=1.000000,G=0.000000,B=0.000000,A=1.000000),FilmChannelMixerGreen=(R=0.000000,G=1.000000,B=0.000000,A=1.000000),FilmChannelMixerBlue=(R=0.000000,G=0.000000,B=1.000000,A=1.000000),FilmContrast=0.030000,FilmToeAmount=1.000000,FilmHealAmount=0.180000,FilmDynamicRange=4.000000,FilmSlope=0.880000,FilmToe=0.550000,FilmShoulder=0.260000,FilmBlackClip=0.000000,FilmWhiteClip=0.040000,SceneColorTint=(R=1.000000,G=1.000000,B=1.000000,A=1.000000),SceneFringeIntensity=0.000000,BloomIntensity=1.000000,BloomThreshold=1.000000,BloomSizeScale=4.000000,Bloom1Size=1.000000,Bloom2Size=4.000000,Bloom3Size=16.000000,Bloom4Size=32.000000,Bloom5Size=64.000000,Bloom6Size=64.000000,Bloom1Tint=(R=0.500000,G=0.500000,B=0.500000,A=1.000000),Bloom2Tint=(R=0.500000,G=0.500000,B=0.500000,A=1.000000),Bloom3Tint=(R=0.500000,G=0.500000,B=0.500000,A=1.000000),Bloom4Tint=(R=0.500000,G=0.500000,B=0.500000,A=1.000000),Bloom5Tint=(R=0.500000,G=0.500000,B=0.500000,A=1.000000),Bloom6Tint=(R=0.500000,G=0.500000,B=0.500000,A=1.000000),BloomDirtMaskIntensity=1.000000,BloomDirtMaskTint=(R=0.500000,G=0.500000,B=0.500000,A=1.000000),BloomDirtMask=None,LPVIntensity=1.000000,LPVVplInjectionBias=0.640000,LPVSize=5312.000000,LPVSecondaryOcclusionIntensity=0.000000,LPVSecondaryBounceIntensity=0.000000,LPVGeometryVolumeBias=0.384000,LPVEmissiveInjectionIntensity=1.000000,LPVDirectionalOcclusionIntensity=0.000000,LPVDirectionalOcclusionRadius=8.000000,LPVDiffuseOcclusionExponent=1.000000,LPVSpecularOcclusionExponent=7.000000,LPVDiffuseOcclusionIntensity=1.000000,LPVSpecularOcclusionIntensity=1.000000,AmbientCubemapTint=(R=1.000000,G=1.000000,B=1.000000,A=1.000000),AmbientCubemapIntensity=1.000000,AmbientCubemap=None,AutoExposureMethod=AEM_Histogram,AutoExposureLowPercent=80.000000,AutoExposureHighPercent=98.300003,AutoExposureMinBrightness=1.000000,AutoExposureMaxBrightness=1.000000,AutoExposureSpeedUp=3.000000,AutoExposureSpeedDown=1.000000,AutoExposureBias=0.330000,HistogramLogMin=-8.000000,HistogramLogMax=4.000000,LensFlareIntensity=1.000000,LensFlareTint=(R=1.000000,G=1.000000,B=1.000000,A=1.000000),LensFlareBokehSize=3.000000,LensFlareThreshold=8.000000,LensFlareBokehShape=None,LensFlareTints[0]=(R=1.000000,G=0.800000,B=0.400000,A=0.600000),LensFlareTints[1]=(R=1.000000,G=1.000000,B=0.600000,A=0.530000),LensFlareTints[2]=(R=0.800000,G=0.800000,B=1.000000,A=0.460000),LensFlareTints[3]=(R=0.500000,G=1.000000,B=0.400000,A=0.390000),LensFlareTints[4]=(R=0.500000,G=0.800000,B=1.000000,A=0.310000),LensFlareTints[5]=(R=0.900000,G=1.000000,B=0.800000,A=0.270000),LensFlareTints[6]=(R=1.000000,G=0.800000,B=0.400000,A=0.220000),LensFlareTints[7]=(R=0.900000,G=0.700000,B=0.700000,A=0.150000),VignetteIntensity=0.161468,GrainJitter=0.000000,GrainIntensity=0.000000,AmbientOcclusionIntensity=1.000000,AmbientOcclusionStaticFraction=1.000000,AmbientOcclusionRadius=73.477997,AmbientOcclusionRadiusInWS=False,AmbientOcclusionFadeDistance=8000.000000,AmbientOcclusionFadeRadius=5000.000000,AmbientOcclusionDistance=80.000000,AmbientOcclusionPower=1.200000,AmbientOcclusionBias=3.000000,AmbientOcclusionQuality=100.000000,AmbientOcclusionMipBlend=0.600000,AmbientOcclusionMipScale=1.700000,AmbientOcclusionMipThreshold=0.010000,IndirectLightingColor=(R=1.000000,G=1.000000,B=1.000000,A=1.000000),IndirectLightingIntensity=1.000000,ColorGradingIntensity=0.000000,ColorGradingLUT=Texture2D'/Engine/EditorResources/RGBTable16x1_AssetViewer.RGBTable16x1_AssetViewer',DepthOfFieldMethod=DOFM_BokehDOF,bMobileHQGaussian=False,DepthOfFieldFstop=4.000000,DepthOfFieldSensorWidth=24.576000,DepthOfFieldFocalDistance=1000.000000,DepthOfFieldDepthBlurAmount=1.000000,DepthOfFieldDepthBlurRadius=0.000000,DepthOfFieldFocalRegion=0.000000,DepthOfFieldNearTransitionRegion=300.000000,DepthOfFieldFarTransitionRegion=500.000000,DepthOfFieldScale=0.000000,DepthOfFieldMaxBokehSize=15.000000,DepthOfFieldNearBlurSize=15.000000,DepthOfFieldFarBlurSize=15.000000,DepthOfFieldBokehShape=None,DepthOfFieldOcclusion=0.400000,DepthOfFieldColorThreshold=1.000000,DepthOfFieldSizeThreshold=0.080000,DepthOfFieldSkyFocusDistance=0.000000,DepthOfFieldVignetteSize=200.000000,MotionBlurAmount=0.500000,MotionBlurMax=5.000000,MotionBlurPerObjectSize=0.500000,ScreenPercentage=100.000000,ScreenSpaceReflectionIntensity=100.000000,ScreenSpaceReflectionQuality=100.000000,ScreenSpaceReflectionMaxRoughness=1.000000,WeightedBlendables=(Array=),Blendables=),bPostProcessingEnabled=True,LightingRigRotation=109.389069,RotationSpeed=2.000000,DirectionalLightRotation=(Pitch=-39.999985,Yaw=-67.500015,Roll=0.000000))
-+Profiles=(ProfileName="Default",DirectionalLightIntensity=2.620000,DirectionalLightColor=(R=0.990000,G=0.839850,B=0.732600,A=1.000000),SkyLightIntensity=0.880000,bRotateLightingRig=False,bShowEnvironment=True,bShowFloor=True,EnvironmentCubeMap=TextureCube'/Engine/EngineSky/EpicQuadPanorama_CC+EV1.EpicQuadPanorama_CC+EV1',PostProcessingSettings=(bOverride_WhiteTemp=True,bOverride_WhiteTint=False,bOverride_ColorSaturation=True,bOverride_ColorContrast=True,bOverride_ColorGamma=True,bOverride_ColorGain=True,bOverride_ColorOffset=True,bOverride_ColorSaturationShadows=False,bOverride_ColorContrastShadows=False,bOverride_ColorGammaShadows=False,bOverride_ColorGainShadows=False,bOverride_ColorOffsetShadows=False,bOverride_ColorSaturationMidtones=False,bOverride_ColorContrastMidtones=False,bOverride_ColorGammaMidtones=False,bOverride_ColorGainMidtones=False,bOverride_ColorOffsetMidtones=False,bOverride_ColorSaturationHighlights=False,bOverride_ColorContrastHighlights=False,bOverride_ColorGammaHighlights=False,bOverride_ColorGainHighlights=False,bOverride_ColorOffsetHighlights=False,bOverride_ColorCorrectionShadowsMax=False,bOverride_ColorCorrectionHighlightsMin=False,bOverride_FilmWhitePoint=False,bOverride_FilmSaturation=False,bOverride_FilmChannelMixerRed=False,bOverride_FilmChannelMixerGreen=False,bOverride_FilmChannelMixerBlue=False,bOverride_FilmContrast=False,bOverride_FilmDynamicRange=False,bOverride_FilmHealAmount=False,bOverride_FilmToeAmount=False,bOverride_FilmShadowTint=False,bOverride_FilmShadowTintBlend=False,bOverride_FilmShadowTintAmount=False,bOverride_FilmSlope=True,bOverride_FilmToe=True,bOverride_FilmShoulder=True,bOverride_FilmBlackClip=True,bOverride_FilmWhiteClip=True,bOverride_SceneColorTint=False,bOverride_SceneFringeIntensity=False,bOverride_AmbientCubemapTint=False,bOverride_AmbientCubemapIntensity=False,bOverride_BloomIntensity=True,bOverride_BloomThreshold=False,bOverride_Bloom1Tint=False,bOverride_Bloom1Size=False,bOverride_Bloom2Size=False,bOverride_Bloom2Tint=False,bOverride_Bloom3Tint=False,bOverride_Bloom3Size=False,bOverride_Bloom4Tint=False,bOverride_Bloom4Size=False,bOverride_Bloom5Tint=False,bOverride_Bloom5Size=False,bOverride_Bloom6Tint=False,bOverride_Bloom6Size=False,bOverride_BloomSizeScale=False,bOverride_BloomDirtMaskIntensity=False,bOverride_BloomDirtMaskTint=False,bOverride_BloomDirtMask=False,bOverride_AutoExposureMethod=True,bOverride_AutoExposureLowPercent=False,bOverride_AutoExposureHighPercent=False,bOverride_AutoExposureMinBrightness=True,bOverride_AutoExposureMaxBrightness=True,bOverride_AutoExposureSpeedUp=False,bOverride_AutoExposureSpeedDown=False,bOverride_AutoExposureBias=True,bOverride_HistogramLogMin=True,bOverride_HistogramLogMax=True,bOverride_LensFlareIntensity=False,bOverride_LensFlareTint=False,bOverride_LensFlareTints=False,bOverride_LensFlareBokehSize=False,bOverride_LensFlareBokehShape=False,bOverride_LensFlareThreshold=False,bOverride_VignetteIntensity=True,bOverride_GrainIntensity=False,bOverride_GrainJitter=False,bOverride_AmbientOcclusionIntensity=True,bOverride_AmbientOcclusionStaticFraction=True,bOverride_AmbientOcclusionRadius=True,bOverride_AmbientOcclusionFadeDistance=False,bOverride_AmbientOcclusionFadeRadius=False,bOverride_AmbientOcclusionDistance=False,bOverride_AmbientOcclusionRadiusInWS=False,bOverride_AmbientOcclusionPower=True,bOverride_AmbientOcclusionBias=True,bOverride_AmbientOcclusionQuality=True,bOverride_AmbientOcclusionMipBlend=True,bOverride_AmbientOcclusionMipScale=True,bOverride_AmbientOcclusionMipThreshold=True,bOverride_LPVIntensity=False,bOverride_LPVDirectionalOcclusionIntensity=False,bOverride_LPVDirectionalOcclusionRadius=False,bOverride_LPVDiffuseOcclusionExponent=False,bOverride_LPVSpecularOcclusionExponent=False,bOverride_LPVDiffuseOcclusionIntensity=False,bOverride_LPVSpecularOcclusionIntensity=False,bOverride_LPVSize=False,bOverride_LPVSecondaryOcclusionIntensity=False,bOverride_LPVSecondaryBounceIntensity=False,bOverride_LPVGeometryVolumeBias=False,bOverride_LPVVplInjectionBias=False,bOverride_LPVEmissiveInjectionIntensity=False,bOverride_IndirectLightingColor=False,bOverride_IndirectLightingIntensity=False,bOverride_ColorGradingIntensity=True,bOverride_ColorGradingLUT=True,bOverride_DepthOfFieldFocalDistance=False,bOverride_DepthOfFieldFstop=False,bOverride_DepthOfFieldSensorWidth=False,bOverride_DepthOfFieldDepthBlurRadius=False,bOverride_DepthOfFieldDepthBlurAmount=False,bOverride_DepthOfFieldFocalRegion=False,bOverride_DepthOfFieldNearTransitionRegion=False,bOverride_DepthOfFieldFarTransitionRegion=False,bOverride_DepthOfFieldScale=True,bOverride_DepthOfFieldMaxBokehSize=False,bOverride_DepthOfFieldNearBlurSize=False,bOverride_DepthOfFieldFarBlurSize=False,bOverride_DepthOfFieldMethod=True,bOverride_MobileHQGaussian=False,bOverride_DepthOfFieldBokehShape=False,bOverride_DepthOfFieldOcclusion=False,bOverride_DepthOfFieldColorThreshold=False,bOverride_DepthOfFieldSizeThreshold=False,bOverride_DepthOfFieldSkyFocusDistance=False,bOverride_DepthOfFieldVignetteSize=False,bOverride_MotionBlurAmount=False,bOverride_MotionBlurMax=False,bOverride_MotionBlurPerObjectSize=False,bOverride_ScreenPercentage=False,bOverride_ScreenSpaceReflectionIntensity=True,bOverride_ScreenSpaceReflectionQuality=True,bOverride_ScreenSpaceReflectionMaxRoughness=True,bOverride_ScreenSpaceReflectionRoughnessScale=False,WhiteTemp=6700.000000,WhiteTint=0.000000,ColorSaturation=(X=1.000000,Y=1.000000,Z=1.000000,W=1.000000),ColorContrast=(X=1.000000,Y=1.000000,Z=1.000000,W=1.000000),ColorGamma=(X=1.000000,Y=1.000000,Z=1.000000,W=1.000000),ColorGain=(X=1.000000,Y=1.000000,Z=1.000000,W=1.000000),ColorOffset=(X=0.005000,Y=0.005000,Z=0.005000,W=0.000000),ColorSaturationShadows=(X=1.000000,Y=1.000000,Z=1.000000,W=1.000000),ColorContrastShadows=(X=1.000000,Y=1.000000,Z=1.000000,W=1.000000),ColorGammaShadows=(X=1.000000,Y=1.000000,Z=1.000000,W=1.000000),ColorGainShadows=(X=1.000000,Y=1.000000,Z=1.000000,W=1.000000),ColorOffsetShadows=(X=0.000000,Y=0.000000,Z=0.000000,W=0.000000),ColorCorrectionShadowsMax=0.090000,ColorSaturationMidtones=(X=1.000000,Y=1.000000,Z=1.000000,W=1.000000),ColorContrastMidtones=(X=1.000000,Y=1.000000,Z=1.000000,W=1.000000),ColorGammaMidtones=(X=1.000000,Y=1.000000,Z=1.000000,W=1.000000),ColorGainMidtones=(X=1.000000,Y=1.000000,Z=1.000000,W=1.000000),ColorOffsetMidtones=(X=0.000000,Y=0.000000,Z=0.000000,W=0.000000),ColorSaturationHighlights=(X=1.000000,Y=1.000000,Z=1.000000,W=1.000000),ColorContrastHighlights=(X=1.000000,Y=1.000000,Z=1.000000,W=1.000000),ColorGammaHighlights=(X=1.000000,Y=1.000000,Z=1.000000,W=1.000000),ColorGainHighlights=(X=1.000000,Y=1.000000,Z=1.000000,W=1.000000),ColorOffsetHighlights=(X=0.000000,Y=0.000000,Z=0.000000,W=0.000000),ColorCorrectionHighlightsMin=0.500000,FilmWhitePoint=(R=1.000000,G=1.000000,B=1.000000,A=1.000000),FilmShadowTint=(R=1.000000,G=1.000000,B=1.000000,A=1.000000),FilmShadowTintBlend=0.500000,FilmShadowTintAmount=0.000000,FilmSaturation=1.000000,FilmChannelMixerRed=(R=1.000000,G=0.000000,B=0.000000,A=1.000000),FilmChannelMixerGreen=(R=0.000000,G=1.000000,B=0.000000,A=1.000000),FilmChannelMixerBlue=(R=0.000000,G=0.000000,B=1.000000,A=1.000000),FilmContrast=0.030000,FilmToeAmount=1.000000,FilmHealAmount=0.180000,FilmDynamicRange=4.000000,FilmSlope=0.880000,FilmToe=0.550000,FilmShoulder=0.260000,FilmBlackClip=0.000000,FilmWhiteClip=0.040000,SceneColorTint=(R=1.000000,G=1.000000,B=1.000000,A=1.000000),SceneFringeIntensity=0.000000,BloomIntensity=1.000000,BloomThreshold=1.000000,BloomSizeScale=4.000000,Bloom1Size=1.000000,Bloom2Size=4.000000,Bloom3Size=16.000000,Bloom4Size=32.000000,Bloom5Size=64.000000,Bloom6Size=64.000000,Bloom1Tint=(R=0.500000,G=0.500000,B=0.500000,A=1.000000),Bloom2Tint=(R=0.500000,G=0.500000,B=0.500000,A=1.000000),Bloom3Tint=(R=0.500000,G=0.500000,B=0.500000,A=1.000000),Bloom4Tint=(R=0.500000,G=0.500000,B=0.500000,A=1.000000),Bloom5Tint=(R=0.500000,G=0.500000,B=0.500000,A=1.000000),Bloom6Tint=(R=0.500000,G=0.500000,B=0.500000,A=1.000000),BloomDirtMaskIntensity=1.000000,BloomDirtMaskTint=(R=0.500000,G=0.500000,B=0.500000,A=1.000000),BloomDirtMask=None,LPVIntensity=1.000000,LPVVplInjectionBias=0.640000,LPVSize=5312.000000,LPVSecondaryOcclusionIntensity=0.000000,LPVSecondaryBounceIntensity=0.000000,LPVGeometryVolumeBias=0.384000,LPVEmissiveInjectionIntensity=1.000000,LPVDirectionalOcclusionIntensity=0.000000,LPVDirectionalOcclusionRadius=8.000000,LPVDiffuseOcclusionExponent=1.000000,LPVSpecularOcclusionExponent=7.000000,LPVDiffuseOcclusionIntensity=1.000000,LPVSpecularOcclusionIntensity=1.000000,AmbientCubemapTint=(R=1.000000,G=1.000000,B=1.000000,A=1.000000),AmbientCubemapIntensity=1.000000,AmbientCubemap=None,AutoExposureMethod=AEM_Histogram,AutoExposureLowPercent=80.000000,AutoExposureHighPercent=98.300003,AutoExposureMinBrightness=1.000000,AutoExposureMaxBrightness=1.000000,AutoExposureSpeedUp=3.000000,AutoExposureSpeedDown=1.000000,AutoExposureBias=0.330000,HistogramLogMin=-8.000000,HistogramLogMax=4.000000,LensFlareIntensity=1.000000,LensFlareTint=(R=1.000000,G=1.000000,B=1.000000,A=1.000000),LensFlareBokehSize=3.000000,LensFlareThreshold=8.000000,LensFlareBokehShape=None,LensFlareTints[0]=(R=1.000000,G=0.800000,B=0.400000,A=0.600000),LensFlareTints[1]=(R=1.000000,G=1.000000,B=0.600000,A=0.530000),LensFlareTints[2]=(R=0.800000,G=0.800000,B=1.000000,A=0.460000),LensFlareTints[3]=(R=0.500000,G=1.000000,B=0.400000,A=0.390000),LensFlareTints[4]=(R=0.500000,G=0.800000,B=1.000000,A=0.310000),LensFlareTints[5]=(R=0.900000,G=1.000000,B=0.800000,A=0.270000),LensFlareTints[6]=(R=1.000000,G=0.800000,B=0.400000,A=0.220000),LensFlareTints[7]=(R=0.900000,G=0.700000,B=0.700000,A=0.150000),VignetteIntensity=0.161468,GrainJitter=0.000000,GrainIntensity=0.000000,AmbientOcclusionIntensity=1.000000,AmbientOcclusionStaticFraction=1.000000,AmbientOcclusionRadius=73.477997,AmbientOcclusionRadiusInWS=False,AmbientOcclusionFadeDistance=8000.000000,AmbientOcclusionFadeRadius=5000.000000,AmbientOcclusionDistance=80.000000,AmbientOcclusionPower=1.200000,AmbientOcclusionBias=3.000000,AmbientOcclusionQuality=100.000000,AmbientOcclusionMipBlend=0.600000,AmbientOcclusionMipScale=1.700000,AmbientOcclusionMipThreshold=0.010000,IndirectLightingColor=(R=1.000000,G=1.000000,B=1.000000,A=1.000000),IndirectLightingIntensity=1.000000,ColorGradingIntensity=0.000000,ColorGradingLUT=Texture2D'/Engine/EditorResources/RGBTable16x1_AssetViewer.RGBTable16x1_AssetViewer',DepthOfFieldMethod=DOFM_BokehDOF,bMobileHQGaussian=False,DepthOfFieldFstop=4.000000,DepthOfFieldSensorWidth=24.576000,DepthOfFieldFocalDistance=1000.000000,DepthOfFieldDepthBlurAmount=1.000000,DepthOfFieldDepthBlurRadius=0.000000,DepthOfFieldFocalRegion=0.000000,DepthOfFieldNearTransitionRegion=300.000000,DepthOfFieldFarTransitionRegion=500.000000,DepthOfFieldScale=0.000000,DepthOfFieldMaxBokehSize=15.000000,DepthOfFieldNearBlurSize=15.000000,DepthOfFieldFarBlurSize=15.000000,DepthOfFieldBokehShape=None,DepthOfFieldOcclusion=0.400000,DepthOfFieldColorThreshold=1.000000,DepthOfFieldSizeThreshold=0.080000,DepthOfFieldSkyFocusDistance=0.000000,DepthOfFieldVignetteSize=200.000000,MotionBlurAmount=0.500000,MotionBlurMax=5.000000,MotionBlurPerObjectSize=0.500000,ScreenPercentage=100.000000,ScreenSpaceReflectionIntensity=100.000000,ScreenSpaceReflectionQuality=100.000000,ScreenSpaceReflectionMaxRoughness=1.000000,WeightedBlendables=(Array=),Blendables=),bPostProcessingEnabled=True,LightingRigRotation=109.389069,RotationSpeed=2.000000,DirectionalLightRotation=(Pitch=-39.999985,Yaw=-67.500015,Roll=0.000000))
-
-[/Script/UnrealEd.AssetViewerSettings]
--Profiles=(ProfileName="Default",DirectionalLightIntensity=2.620000,DirectionalLightColor=(R=0.990000,G=0.839850,B=0.732600,A=1.000000),SkyLightIntensity=0.880000,bRotateLightingRig=False,bShowEnvironment=True,bShowFloor=True,EnvironmentCubeMapPath="/Engine/EditorMaterials/AssetViewer/EpicQuadPanorama_CC+EV1.EpicQuadPanorama_CC+EV1",PostProcessingSettings=(bOverride_WhiteTemp=True,bOverride_WhiteTint=False,bOverride_ColorSaturation=True,bOverride_ColorContrast=True,bOverride_ColorGamma=True,bOverride_ColorGain=True,bOverride_ColorOffset=True,bOverride_FilmWhitePoint=False,bOverride_FilmSaturation=False,bOverride_FilmChannelMixerRed=False,bOverride_FilmChannelMixerGreen=False,bOverride_FilmChannelMixerBlue=False,bOverride_FilmContrast=False,bOverride_FilmDynamicRange=False,bOverride_FilmHealAmount=False,bOverride_FilmToeAmount=False,bOverride_FilmShadowTint=False,bOverride_FilmShadowTintBlend=False,bOverride_FilmShadowTintAmount=False,bOverride_FilmSlope=True,bOverride_FilmToe=True,bOverride_FilmShoulder=True,bOverride_FilmBlackClip=True,bOverride_FilmWhiteClip=True,bOverride_SceneColorTint=False,bOverride_SceneFringeIntensity=False,bOverride_AmbientCubemapTint=False,bOverride_AmbientCubemapIntensity=False,bOverride_BloomIntensity=True,bOverride_BloomThreshold=False,bOverride_Bloom1Tint=False,bOverride_Bloom1Size=False,bOverride_Bloom2Size=False,bOverride_Bloom2Tint=False,bOverride_Bloom3Tint=False,bOverride_Bloom3Size=False,bOverride_Bloom4Tint=False,bOverride_Bloom4Size=False,bOverride_Bloom5Tint=False,bOverride_Bloom5Size=False,bOverride_Bloom6Tint=False,bOverride_Bloom6Size=False,bOverride_BloomSizeScale=False,bOverride_BloomDirtMaskIntensity=False,bOverride_BloomDirtMaskTint=False,bOverride_BloomDirtMask=False,bOverride_AutoExposureMethod=True,bOverride_AutoExposureLowPercent=False,bOverride_AutoExposureHighPercent=False,bOverride_AutoExposureMinBrightness=True,bOverride_AutoExposureMaxBrightness=True,bOverride_AutoExposureSpeedUp=False,bOverride_AutoExposureSpeedDown=False,bOverride_AutoExposureBias=True,bOverride_HistogramLogMin=True,bOverride_HistogramLogMax=True,bOverride_LensFlareIntensity=False,bOverride_LensFlareTint=False,bOverride_LensFlareTints=False,bOverride_LensFlareBokehSize=False,bOverride_LensFlareBokehShape=False,bOverride_LensFlareThreshold=False,bOverride_VignetteIntensity=True,bOverride_GrainIntensity=False,bOverride_GrainJitter=False,bOverride_AmbientOcclusionIntensity=True,bOverride_AmbientOcclusionStaticFraction=True,bOverride_AmbientOcclusionRadius=True,bOverride_AmbientOcclusionFadeDistance=False,bOverride_AmbientOcclusionFadeRadius=False,bOverride_AmbientOcclusionDistance=False,bOverride_AmbientOcclusionRadiusInWS=False,bOverride_AmbientOcclusionPower=True,bOverride_AmbientOcclusionBias=True,bOverride_AmbientOcclusionQuality=True,bOverride_AmbientOcclusionMipBlend=True,bOverride_AmbientOcclusionMipScale=True,bOverride_AmbientOcclusionMipThreshold=True,bOverride_LPVIntensity=False,bOverride_LPVDirectionalOcclusionIntensity=False,bOverride_LPVDirectionalOcclusionRadius=False,bOverride_LPVDiffuseOcclusionExponent=False,bOverride_LPVSpecularOcclusionExponent=False,bOverride_LPVDiffuseOcclusionIntensity=False,bOverride_LPVSpecularOcclusionIntensity=False,bOverride_LPVSize=False,bOverride_LPVSecondaryOcclusionIntensity=False,bOverride_LPVSecondaryBounceIntensity=False,bOverride_LPVGeometryVolumeBias=False,bOverride_LPVVplInjectionBias=False,bOverride_LPVEmissiveInjectionIntensity=False,bOverride_IndirectLightingColor=False,bOverride_IndirectLightingIntensity=False,bOverride_ColorGradingIntensity=True,bOverride_ColorGradingLUT=True,bOverride_DepthOfFieldFocalDistance=False,bOverride_DepthOfFieldFstop=False,bOverride_DepthOfFieldSensorWidth=False,bOverride_DepthOfFieldDepthBlurRadius=False,bOverride_DepthOfFieldDepthBlurAmount=False,bOverride_DepthOfFieldFocalRegion=False,bOverride_DepthOfFieldNearTransitionRegion=False,bOverride_DepthOfFieldFarTransitionRegion=False,bOverride_DepthOfFieldScale=True,bOverride_DepthOfFieldMaxBokehSize=False,bOverride_DepthOfFieldNearBlurSize=False,bOverride_DepthOfFieldFarBlurSize=False,bOverride_DepthOfFieldMethod=True,bOverride_MobileHQGaussian=False,bOverride_DepthOfFieldBokehShape=False,bOverride_DepthOfFieldOcclusion=False,bOverride_DepthOfFieldColorThreshold=False,bOverride_DepthOfFieldSizeThreshold=False,bOverride_DepthOfFieldSkyFocusDistance=False,bOverride_DepthOfFieldVignetteSize=False,bOverride_MotionBlurAmount=False,bOverride_MotionBlurMax=False,bOverride_MotionBlurPerObjectSize=False,bOverride_ScreenPercentage=False,bOverride_ScreenSpaceReflectionIntensity=True,bOverride_ScreenSpaceReflectionQuality=True,bOverride_ScreenSpaceReflectionMaxRoughness=True,bOverride_ScreenSpaceReflectionRoughnessScale=False,WhiteTemp=6700.000000,WhiteTint=0.000000,ColorSaturation=(X=1.000000,Y=1.000000,Z=1.000000),ColorContrast=(X=1.000000,Y=1.000000,Z=1.000000),ColorGamma=(X=1.000000,Y=1.000000,Z=1.000000),ColorGain=(X=1.000000,Y=1.000000,Z=1.000000),ColorOffset=(X=0.005000,Y=0.005000,Z=0.005000),FilmWhitePoint=(R=1.000000,G=1.000000,B=1.000000,A=1.000000),FilmShadowTint=(R=1.000000,G=1.000000,B=1.000000,A=1.000000),FilmShadowTintBlend=0.500000,FilmShadowTintAmount=0.000000,FilmSaturation=1.000000,FilmChannelMixerRed=(R=1.000000,G=0.000000,B=0.000000,A=1.000000),FilmChannelMixerGreen=(R=0.000000,G=1.000000,B=0.000000,A=1.000000),FilmChannelMixerBlue=(R=0.000000,G=0.000000,B=1.000000,A=1.000000),FilmContrast=0.030000,FilmToeAmount=1.000000,FilmHealAmount=1.000000,FilmDynamicRange=4.000000,FilmSlope=0.880000,FilmToe=0.550000,FilmShoulder=0.260000,FilmBlackClip=0.000000,FilmWhiteClip=0.040000,SceneColorTint=(R=1.000000,G=1.000000,B=1.000000,A=1.000000),SceneFringeIntensity=0.000000,BloomIntensity=0.675000,BloomThreshold=-1.000000,BloomSizeScale=4.000000,Bloom1Size=0.300000,Bloom2Size=1.000000,Bloom3Size=2.000000,Bloom4Size=10.000000,Bloom5Size=30.000000,Bloom6Size=64.000000,Bloom1Tint=(R=0.346500,G=0.346500,B=0.346500,A=1.000000),Bloom2Tint=(R=0.138000,G=0.138000,B=0.138000,A=1.000000),Bloom3Tint=(R=0.117600,G=0.117600,B=0.117600,A=1.000000),Bloom4Tint=(R=0.066000,G=0.066000,B=0.066000,A=1.000000),Bloom5Tint=(R=0.066000,G=0.066000,B=0.066000,A=1.000000),Bloom6Tint=(R=0.061000,G=0.061000,B=0.061000,A=1.000000),BloomDirtMaskIntensity=0.000000,BloomDirtMaskTint=(R=0.500000,G=0.500000,B=0.500000,A=1.000000),BloomDirtMask=None,LPVIntensity=1.000000,LPVVplInjectionBias=0.640000,LPVSize=5312.000000,LPVSecondaryOcclusionIntensity=0.000000,LPVSecondaryBounceIntensity=0.000000,LPVGeometryVolumeBias=0.384000,LPVEmissiveInjectionIntensity=1.000000,LPVDirectionalOcclusionIntensity=0.000000,LPVDirectionalOcclusionRadius=8.000000,LPVDiffuseOcclusionExponent=1.000000,LPVSpecularOcclusionExponent=7.000000,LPVDiffuseOcclusionIntensity=1.000000,LPVSpecularOcclusionIntensity=1.000000,AmbientCubemapTint=(R=1.000000,G=1.000000,B=1.000000,A=1.000000),AmbientCubemapIntensity=1.000000,AmbientCubemap=None,AutoExposureMethod=AEM_Histogram,AutoExposureLowPercent=80.000000,AutoExposureHighPercent=98.300003,AutoExposureMinBrightness=1.000000,AutoExposureMaxBrightness=1.000000,AutoExposureSpeedUp=3.000000,AutoExposureSpeedDown=1.000000,AutoExposureBias=0.330000,HistogramLogMin=-8.000000,HistogramLogMax=4.000000,LensFlareIntensity=1.000000,LensFlareTint=(R=1.000000,G=1.000000,B=1.000000,A=1.000000),LensFlareBokehSize=3.000000,LensFlareThreshold=8.000000,LensFlareBokehShape=None,LensFlareTints[0]=(R=1.000000,G=0.800000,B=0.400000,A=0.600000),LensFlareTints[1]=(R=1.000000,G=1.000000,B=0.600000,A=0.530000),LensFlareTints[2]=(R=0.800000,G=0.800000,B=1.000000,A=0.460000),LensFlareTints[3]=(R=0.500000,G=1.000000,B=0.400000,A=0.390000),LensFlareTints[4]=(R=0.500000,G=0.800000,B=1.000000,A=0.310000),LensFlareTints[5]=(R=0.900000,G=1.000000,B=0.800000,A=0.270000),LensFlareTints[6]=(R=1.000000,G=0.800000,B=0.400000,A=0.220000),LensFlareTints[7]=(R=0.900000,G=0.700000,B=0.700000,A=0.150000),VignetteIntensity=0.161468,GrainJitter=0.000000,GrainIntensity=0.000000,AmbientOcclusionIntensity=1.000000,AmbientOcclusionStaticFraction=1.000000,AmbientOcclusionRadius=73.477997,AmbientOcclusionRadiusInWS=False,AmbientOcclusionFadeDistance=8000.000000,AmbientOcclusionFadeRadius=5000.000000,AmbientOcclusionDistance=80.000000,AmbientOcclusionPower=1.200000,AmbientOcclusionBias=3.000000,AmbientOcclusionQuality=100.000000,AmbientOcclusionMipBlend=0.600000,AmbientOcclusionMipScale=1.700000,AmbientOcclusionMipThreshold=0.010000,IndirectLightingColor=(R=1.000000,G=1.000000,B=1.000000,A=1.000000),IndirectLightingIntensity=1.000000,ColorGradingIntensity=0.000000,ColorGradingLUT=Texture2D'/Engine/EditorResources/RGBTable16x1_AssetViewer.RGBTable16x1_AssetViewer',DepthOfFieldMethod=DOFM_BokehDOF,bMobileHQGaussian=False,DepthOfFieldFstop=4.000000,DepthOfFieldSensorWidth=24.576000,DepthOfFieldFocalDistance=1000.000000,DepthOfFieldDepthBlurAmount=1.000000,DepthOfFieldDepthBlurRadius=0.000000,DepthOfFieldFocalRegion=0.000000,DepthOfFieldNearTransitionRegion=300.000000,DepthOfFieldFarTransitionRegion=500.000000,DepthOfFieldScale=0.000000,DepthOfFieldMaxBokehSize=15.000000,DepthOfFieldNearBlurSize=15.000000,DepthOfFieldFarBlurSize=15.000000,DepthOfFieldBokehShape=None,DepthOfFieldOcclusion=0.400000,DepthOfFieldColorThreshold=1.000000,DepthOfFieldSizeThreshold=0.080000,DepthOfFieldSkyFocusDistance=0.000000,DepthOfFieldVignetteSize=200.000000,MotionBlurAmount=0.500000,MotionBlurMax=5.000000,MotionBlurPerObjectSize=0.500000,ScreenPercentage=100.000000,ScreenSpaceReflectionIntensity=100.000000,ScreenSpaceReflectionQuality=100.000000,ScreenSpaceReflectionMaxRoughness=1.000000,WeightedBlendables=(Array=),Blendables=),bPostProcessingEnabled=True,LightingRigRotation=109.389069,RotationSpeed=2.000000,DirectionalLightRotation=(Pitch=-40.000000,Yaw=-67.500000,Roll=0.000000))
--Profiles=(ProfileName="Default",DirectionalLightIntensity=2.620000,DirectionalLightColor=(R=0.990000,G=0.839850,B=0.732600,A=1.000000),SkyLightIntensity=0.880000,bRotateLightingRig=False,bShowEnvironment=True,bShowFloor=True,EnvironmentCubeMapPath="/Engine/EditorMaterials/AssetViewer/EpicQuadPanorama_CC+EV1.EpicQuadPanorama_CC+EV1",PostProcessingSettings=(bOverride_WhiteTemp=True,bOverride_WhiteTint=False,bOverride_ColorSaturation=True,bOverride_ColorContrast=True,bOverride_ColorGamma=True,bOverride_ColorGain=True,bOverride_ColorOffset=True,bOverride_ColorSaturationShadows=False,bOverride_ColorContrastShadows=False,bOverride_ColorGammaShadows=False,bOverride_ColorGainShadows=False,bOverride_ColorOffsetShadows=False,bOverride_ColorSaturationMidtones=False,bOverride_ColorContrastMidtones=False,bOverride_ColorGammaMidtones=False,bOverride_ColorGainMidtones=False,bOverride_ColorOffsetMidtones=False,bOverride_ColorSaturationHighlights=False,bOverride_ColorContrastHighlights=False,bOverride_ColorGammaHighlights=False,bOverride_ColorGainHighlights=False,bOverride_ColorOffsetHighlights=False,bOverride_ColorCorrectionShadowsMax=False,bOverride_ColorCorrectionHighlightsMin=False,bOverride_FilmWhitePoint=False,bOverride_FilmSaturation=False,bOverride_FilmChannelMixerRed=False,bOverride_FilmChannelMixerGreen=False,bOverride_FilmChannelMixerBlue=False,bOverride_FilmContrast=False,bOverride_FilmDynamicRange=False,bOverride_FilmHealAmount=False,bOverride_FilmToeAmount=False,bOverride_FilmShadowTint=False,bOverride_FilmShadowTintBlend=False,bOverride_FilmShadowTintAmount=False,bOverride_FilmSlope=True,bOverride_FilmToe=True,bOverride_FilmShoulder=True,bOverride_FilmBlackClip=True,bOverride_FilmWhiteClip=True,bOverride_SceneColorTint=False,bOverride_SceneFringeIntensity=False,bOverride_AmbientCubemapTint=False,bOverride_AmbientCubemapIntensity=False,bOverride_BloomIntensity=True,bOverride_BloomThreshold=False,bOverride_Bloom1Tint=False,bOverride_Bloom1Size=False,bOverride_Bloom2Size=False,bOverride_Bloom2Tint=False,bOverride_Bloom3Tint=False,bOverride_Bloom3Size=False,bOverride_Bloom4Tint=False,bOverride_Bloom4Size=False,bOverride_Bloom5Tint=False,bOverride_Bloom5Size=False,bOverride_Bloom6Tint=False,bOverride_Bloom6Size=False,bOverride_BloomSizeScale=False,bOverride_BloomDirtMaskIntensity=False,bOverride_BloomDirtMaskTint=False,bOverride_BloomDirtMask=False,bOverride_AutoExposureMethod=True,bOverride_AutoExposureLowPercent=False,bOverride_AutoExposureHighPercent=False,bOverride_AutoExposureMinBrightness=True,bOverride_AutoExposureMaxBrightness=True,bOverride_AutoExposureSpeedUp=False,bOverride_AutoExposureSpeedDown=False,bOverride_AutoExposureBias=True,bOverride_HistogramLogMin=True,bOverride_HistogramLogMax=True,bOverride_LensFlareIntensity=False,bOverride_LensFlareTint=False,bOverride_LensFlareTints=False,bOverride_LensFlareBokehSize=False,bOverride_LensFlareBokehShape=False,bOverride_LensFlareThreshold=False,bOverride_VignetteIntensity=True,bOverride_GrainIntensity=False,bOverride_GrainJitter=False,bOverride_AmbientOcclusionIntensity=True,bOverride_AmbientOcclusionStaticFraction=True,bOverride_AmbientOcclusionRadius=True,bOverride_AmbientOcclusionFadeDistance=False,bOverride_AmbientOcclusionFadeRadius=False,bOverride_AmbientOcclusionDistance=False,bOverride_AmbientOcclusionRadiusInWS=False,bOverride_AmbientOcclusionPower=True,bOverride_AmbientOcclusionBias=True,bOverride_AmbientOcclusionQuality=True,bOverride_AmbientOcclusionMipBlend=True,bOverride_AmbientOcclusionMipScale=True,bOverride_AmbientOcclusionMipThreshold=True,bOverride_LPVIntensity=False,bOverride_LPVDirectionalOcclusionIntensity=False,bOverride_LPVDirectionalOcclusionRadius=False,bOverride_LPVDiffuseOcclusionExponent=False,bOverride_LPVSpecularOcclusionExponent=False,bOverride_LPVDiffuseOcclusionIntensity=False,bOverride_LPVSpecularOcclusionIntensity=False,bOverride_LPVSize=False,bOverride_LPVSecondaryOcclusionIntensity=False,bOverride_LPVSecondaryBounceIntensity=False,bOverride_LPVGeometryVolumeBias=False,bOverride_LPVVplInjectionBias=False,bOverride_LPVEmissiveInjectionIntensity=False,bOverride_IndirectLightingColor=False,bOverride_IndirectLightingIntensity=False,bOverride_ColorGradingIntensity=True,bOverride_ColorGradingLUT=True,bOverride_DepthOfFieldFocalDistance=False,bOverride_DepthOfFieldFstop=False,bOverride_DepthOfFieldSensorWidth=False,bOverride_DepthOfFieldDepthBlurRadius=False,bOverride_DepthOfFieldDepthBlurAmount=False,bOverride_DepthOfFieldFocalRegion=False,bOverride_DepthOfFieldNearTransitionRegion=False,bOverride_DepthOfFieldFarTransitionRegion=False,bOverride_DepthOfFieldScale=True,bOverride_DepthOfFieldMaxBokehSize=False,bOverride_DepthOfFieldNearBlurSize=False,bOverride_DepthOfFieldFarBlurSize=False,bOverride_DepthOfFieldMethod=True,bOverride_MobileHQGaussian=False,bOverride_DepthOfFieldBokehShape=False,bOverride_DepthOfFieldOcclusion=False,bOverride_DepthOfFieldColorThreshold=False,bOverride_DepthOfFieldSizeThreshold=False,bOverride_DepthOfFieldSkyFocusDistance=False,bOverride_DepthOfFieldVignetteSize=False,bOverride_MotionBlurAmount=False,bOverride_MotionBlurMax=False,bOverride_MotionBlurPerObjectSize=False,bOverride_ScreenPercentage=False,bOverride_ScreenSpaceReflectionIntensity=True,bOverride_ScreenSpaceReflectionQuality=True,bOverride_ScreenSpaceReflectionMaxRoughness=True,bOverride_ScreenSpaceReflectionRoughnessScale=False,WhiteTemp=6700.000000,WhiteTint=0.000000,ColorSaturation=(X=1.000000,Y=1.000000,Z=1.000000,W=1.000000),ColorContrast=(X=1.000000,Y=1.000000,Z=1.000000,W=1.000000),ColorGamma=(X=1.000000,Y=1.000000,Z=1.000000,W=1.000000),ColorGain=(X=1.000000,Y=1.000000,Z=1.000000,W=1.000000),ColorOffset=(X=0.005000,Y=0.005000,Z=0.005000,W=0.000000),ColorSaturationShadows=(X=1.000000,Y=1.000000,Z=1.000000,W=1.000000),ColorContrastShadows=(X=1.000000,Y=1.000000,Z=1.000000,W=1.000000),ColorGammaShadows=(X=1.000000,Y=1.000000,Z=1.000000,W=1.000000),ColorGainShadows=(X=1.000000,Y=1.000000,Z=1.000000,W=1.000000),ColorOffsetShadows=(X=0.000000,Y=0.000000,Z=0.000000,W=0.000000),ColorCorrectionShadowsMax=0.090000,ColorSaturationMidtones=(X=1.000000,Y=1.000000,Z=1.000000,W=1.000000),ColorContrastMidtones=(X=1.000000,Y=1.000000,Z=1.000000,W=1.000000),ColorGammaMidtones=(X=1.000000,Y=1.000000,Z=1.000000,W=1.000000),ColorGainMidtones=(X=1.000000,Y=1.000000,Z=1.000000,W=1.000000),ColorOffsetMidtones=(X=0.000000,Y=0.000000,Z=0.000000,W=0.000000),ColorSaturationHighlights=(X=1.000000,Y=1.000000,Z=1.000000,W=1.000000),ColorContrastHighlights=(X=1.000000,Y=1.000000,Z=1.000000,W=1.000000),ColorGammaHighlights=(X=1.000000,Y=1.000000,Z=1.000000,W=1.000000),ColorGainHighlights=(X=1.000000,Y=1.000000,Z=1.000000,W=1.000000),ColorOffsetHighlights=(X=0.000000,Y=0.000000,Z=0.000000,W=0.000000),ColorCorrectionHighlightsMin=0.500000,FilmWhitePoint=(R=1.000000,G=1.000000,B=1.000000,A=1.000000),FilmShadowTint=(R=1.000000,G=1.000000,B=1.000000,A=1.000000),FilmShadowTintBlend=0.500000,FilmShadowTintAmount=0.000000,FilmSaturation=1.000000,FilmChannelMixerRed=(R=1.000000,G=0.000000,B=0.000000,A=1.000000),FilmChannelMixerGreen=(R=0.000000,G=1.000000,B=0.000000,A=1.000000),FilmChannelMixerBlue=(R=0.000000,G=0.000000,B=1.000000,A=1.000000),FilmContrast=0.030000,FilmToeAmount=1.000000,FilmHealAmount=0.180000,FilmDynamicRange=4.000000,FilmSlope=0.880000,FilmToe=0.550000,FilmShoulder=0.260000,FilmBlackClip=0.000000,FilmWhiteClip=0.040000,SceneColorTint=(R=1.000000,G=1.000000,B=1.000000,A=1.000000),SceneFringeIntensity=0.000000,BloomIntensity=1.000000,BloomThreshold=1.000000,BloomSizeScale=4.000000,Bloom1Size=1.000000,Bloom2Size=4.000000,Bloom3Size=16.000000,Bloom4Size=32.000000,Bloom5Size=64.000000,Bloom6Size=64.000000,Bloom1Tint=(R=0.500000,G=0.500000,B=0.500000,A=1.000000),Bloom2Tint=(R=0.500000,G=0.500000,B=0.500000,A=1.000000),Bloom3Tint=(R=0.500000,G=0.500000,B=0.500000,A=1.000000),Bloom4Tint=(R=0.500000,G=0.500000,B=0.500000,A=1.000000),Bloom5Tint=(R=0.500000,G=0.500000,B=0.500000,A=1.000000),Bloom6Tint=(R=0.500000,G=0.500000,B=0.500000,A=1.000000),BloomDirtMaskIntensity=1.000000,BloomDirtMaskTint=(R=0.500000,G=0.500000,B=0.500000,A=1.000000),BloomDirtMask=None,LPVIntensity=1.000000,LPVVplInjectionBias=0.640000,LPVSize=5312.000000,LPVSecondaryOcclusionIntensity=0.000000,LPVSecondaryBounceIntensity=0.000000,LPVGeometryVolumeBias=0.384000,LPVEmissiveInjectionIntensity=1.000000,LPVDirectionalOcclusionIntensity=0.000000,LPVDirectionalOcclusionRadius=8.000000,LPVDiffuseOcclusionExponent=1.000000,LPVSpecularOcclusionExponent=7.000000,LPVDiffuseOcclusionIntensity=1.000000,LPVSpecularOcclusionIntensity=1.000000,AmbientCubemapTint=(R=1.000000,G=1.000000,B=1.000000,A=1.000000),AmbientCubemapIntensity=1.000000,AmbientCubemap=None,AutoExposureMethod=AEM_Histogram,AutoExposureLowPercent=80.000000,AutoExposureHighPercent=98.300003,AutoExposureMinBrightness=1.000000,AutoExposureMaxBrightness=1.000000,AutoExposureSpeedUp=3.000000,AutoExposureSpeedDown=1.000000,AutoExposureBias=0.330000,HistogramLogMin=-8.000000,HistogramLogMax=4.000000,LensFlareIntensity=1.000000,LensFlareTint=(R=1.000000,G=1.000000,B=1.000000,A=1.000000),LensFlareBokehSize=3.000000,LensFlareThreshold=8.000000,LensFlareBokehShape=None,LensFlareTints[0]=(R=1.000000,G=0.800000,B=0.400000,A=0.600000),LensFlareTints[1]=(R=1.000000,G=1.000000,B=0.600000,A=0.530000),LensFlareTints[2]=(R=0.800000,G=0.800000,B=1.000000,A=0.460000),LensFlareTints[3]=(R=0.500000,G=1.000000,B=0.400000,A=0.390000),LensFlareTints[4]=(R=0.500000,G=0.800000,B=1.000000,A=0.310000),LensFlareTints[5]=(R=0.900000,G=1.000000,B=0.800000,A=0.270000),LensFlareTints[6]=(R=1.000000,G=0.800000,B=0.400000,A=0.220000),LensFlareTints[7]=(R=0.900000,G=0.700000,B=0.700000,A=0.150000),VignetteIntensity=0.161468,GrainJitter=0.000000,GrainIntensity=0.000000,AmbientOcclusionIntensity=1.000000,AmbientOcclusionStaticFraction=1.000000,AmbientOcclusionRadius=73.477997,AmbientOcclusionRadiusInWS=False,AmbientOcclusionFadeDistance=8000.000000,AmbientOcclusionFadeRadius=5000.000000,AmbientOcclusionDistance=80.000000,AmbientOcclusionPower=1.200000,AmbientOcclusionBias=3.000000,AmbientOcclusionQuality=100.000000,AmbientOcclusionMipBlend=0.600000,AmbientOcclusionMipScale=1.700000,AmbientOcclusionMipThreshold=0.010000,IndirectLightingColor=(R=1.000000,G=1.000000,B=1.000000,A=1.000000),IndirectLightingIntensity=1.000000,ColorGradingIntensity=0.000000,ColorGradingLUT=Texture2D'/Engine/EditorResources/RGBTable16x1_AssetViewer.RGBTable16x1_AssetViewer',DepthOfFieldMethod=DOFM_BokehDOF,bMobileHQGaussian=False,DepthOfFieldFstop=4.000000,DepthOfFieldSensorWidth=24.576000,DepthOfFieldFocalDistance=1000.000000,DepthOfFieldDepthBlurAmount=1.000000,DepthOfFieldDepthBlurRadius=0.000000,DepthOfFieldFocalRegion=0.000000,DepthOfFieldNearTransitionRegion=300.000000,DepthOfFieldFarTransitionRegion=500.000000,DepthOfFieldScale=0.000000,DepthOfFieldMaxBokehSize=15.000000,DepthOfFieldNearBlurSize=15.000000,DepthOfFieldFarBlurSize=15.000000,DepthOfFieldBokehShape=None,DepthOfFieldOcclusion=0.400000,DepthOfFieldColorThreshold=1.000000,DepthOfFieldSizeThreshold=0.080000,DepthOfFieldSkyFocusDistance=0.000000,DepthOfFieldVignetteSize=200.000000,MotionBlurAmount=0.500000,MotionBlurMax=5.000000,MotionBlurPerObjectSize=0.500000,ScreenPercentage=100.000000,ScreenSpaceReflectionIntensity=100.000000,ScreenSpaceReflectionQuality=100.000000,ScreenSpaceReflectionMaxRoughness=1.000000,WeightedBlendables=(Array=),Blendables=),bPostProcessingEnabled=True,LightingRigRotation=109.389069,RotationSpeed=2.000000,DirectionalLightRotation=(Pitch=-39.999985,Yaw=-67.500015,Roll=0.000000))
--Profiles=(ProfileName="Profile_0",DirectionalLightIntensity=1.000000,DirectionalLightColor=(R=1.000000,G=1.000000,B=1.000000,A=1.000000),SkyLightIntensity=1.000000,bRotateLightingRig=False,bShowEnvironment=True,bShowFloor=True,EnvironmentCubeMapPath=,PostProcessingSettings=(bOverride_WhiteTemp=False,bOverride_WhiteTint=False,bOverride_ColorSaturation=False,bOverride_ColorContrast=False,bOverride_ColorGamma=False,bOverride_ColorGain=False,bOverride_ColorOffset=False,bOverride_ColorSaturationShadows=False,bOverride_ColorContrastShadows=False,bOverride_ColorGammaShadows=False,bOverride_ColorGainShadows=False,bOverride_ColorOffsetShadows=False,bOverride_ColorSaturationMidtones=False,bOverride_ColorContrastMidtones=False,bOverride_ColorGammaMidtones=False,bOverride_ColorGainMidtones=False,bOverride_ColorOffsetMidtones=False,bOverride_ColorSaturationHighlights=False,bOverride_ColorContrastHighlights=False,bOverride_ColorGammaHighlights=False,bOverride_ColorGainHighlights=False,bOverride_ColorOffsetHighlights=False,bOverride_ColorCorrectionShadowsMax=False,bOverride_ColorCorrectionHighlightsMin=False,bOverride_FilmWhitePoint=False,bOverride_FilmSaturation=False,bOverride_FilmChannelMixerRed=False,bOverride_FilmChannelMixerGreen=False,bOverride_FilmChannelMixerBlue=False,bOverride_FilmContrast=False,bOverride_FilmDynamicRange=False,bOverride_FilmHealAmount=False,bOverride_FilmToeAmount=False,bOverride_FilmShadowTint=False,bOverride_FilmShadowTintBlend=False,bOverride_FilmShadowTintAmount=False,bOverride_FilmSlope=False,bOverride_FilmToe=False,bOverride_FilmShoulder=False,bOverride_FilmBlackClip=False,bOverride_FilmWhiteClip=False,bOverride_SceneColorTint=False,bOverride_SceneFringeIntensity=False,bOverride_AmbientCubemapTint=False,bOverride_AmbientCubemapIntensity=False,bOverride_BloomIntensity=False,bOverride_BloomThreshold=False,bOverride_Bloom1Tint=False,bOverride_Bloom1Size=False,bOverride_Bloom2Size=False,bOverride_Bloom2Tint=False,bOverride_Bloom3Tint=False,bOverride_Bloom3Size=False,bOverride_Bloom4Tint=False,bOverride_Bloom4Size=False,bOverride_Bloom5Tint=False,bOverride_Bloom5Size=False,bOverride_Bloom6Tint=False,bOverride_Bloom6Size=False,bOverride_BloomSizeScale=False,bOverride_BloomDirtMaskIntensity=False,bOverride_BloomDirtMaskTint=False,bOverride_BloomDirtMask=False,bOverride_AutoExposureMethod=False,bOverride_AutoExposureLowPercent=False,bOverride_AutoExposureHighPercent=False,bOverride_AutoExposureMinBrightness=False,bOverride_AutoExposureMaxBrightness=False,bOverride_AutoExposureSpeedUp=False,bOverride_AutoExposureSpeedDown=False,bOverride_AutoExposureBias=False,bOverride_HistogramLogMin=False,bOverride_HistogramLogMax=False,bOverride_LensFlareIntensity=False,bOverride_LensFlareTint=False,bOverride_LensFlareTints=False,bOverride_LensFlareBokehSize=False,bOverride_LensFlareBokehShape=False,bOverride_LensFlareThreshold=False,bOverride_VignetteIntensity=False,bOverride_GrainIntensity=False,bOverride_GrainJitter=False,bOverride_AmbientOcclusionIntensity=False,bOverride_AmbientOcclusionStaticFraction=False,bOverride_AmbientOcclusionRadius=False,bOverride_AmbientOcclusionFadeDistance=False,bOverride_AmbientOcclusionFadeRadius=False,bOverride_AmbientOcclusionDistance=False,bOverride_AmbientOcclusionRadiusInWS=False,bOverride_AmbientOcclusionPower=False,bOverride_AmbientOcclusionBias=False,bOverride_AmbientOcclusionQuality=False,bOverride_AmbientOcclusionMipBlend=False,bOverride_AmbientOcclusionMipScale=False,bOverride_AmbientOcclusionMipThreshold=False,bOverride_LPVIntensity=False,bOverride_LPVDirectionalOcclusionIntensity=False,bOverride_LPVDirectionalOcclusionRadius=False,bOverride_LPVDiffuseOcclusionExponent=False,bOverride_LPVSpecularOcclusionExponent=False,bOverride_LPVDiffuseOcclusionIntensity=False,bOverride_LPVSpecularOcclusionIntensity=False,bOverride_LPVSize=False,bOverride_LPVSecondaryOcclusionIntensity=False,bOverride_LPVSecondaryBounceIntensity=False,bOverride_LPVGeometryVolumeBias=False,bOverride_LPVVplInjectionBias=False,bOverride_LPVEmissiveInjectionIntensity=False,bOverride_IndirectLightingColor=False,bOverride_IndirectLightingIntensity=False,bOverride_ColorGradingIntensity=False,bOverride_ColorGradingLUT=False,bOverride_DepthOfFieldFocalDistance=False,bOverride_DepthOfFieldFstop=False,bOverride_DepthOfFieldSensorWidth=False,bOverride_DepthOfFieldDepthBlurRadius=False,bOverride_DepthOfFieldDepthBlurAmount=False,bOverride_DepthOfFieldFocalRegion=False,bOverride_DepthOfFieldNearTransitionRegion=False,bOverride_DepthOfFieldFarTransitionRegion=False,bOverride_DepthOfFieldScale=False,bOverride_DepthOfFieldMaxBokehSize=False,bOverride_DepthOfFieldNearBlurSize=False,bOverride_DepthOfFieldFarBlurSize=False,bOverride_DepthOfFieldMethod=False,bOverride_MobileHQGaussian=False,bOverride_DepthOfFieldBokehShape=False,bOverride_DepthOfFieldOcclusion=False,bOverride_DepthOfFieldColorThreshold=False,bOverride_DepthOfFieldSizeThreshold=False,bOverride_DepthOfFieldSkyFocusDistance=False,bOverride_DepthOfFieldVignetteSize=False,bOverride_MotionBlurAmount=False,bOverride_MotionBlurMax=False,bOverride_MotionBlurPerObjectSize=False,bOverride_ScreenPercentage=False,bOverride_ScreenSpaceReflectionIntensity=False,bOverride_ScreenSpaceReflectionQuality=False,bOverride_ScreenSpaceReflectionMaxRoughness=False,bOverride_ScreenSpaceReflectionRoughnessScale=False,WhiteTemp=6500.000000,WhiteTint=0.000000,ColorSaturation=(X=1.000000,Y=1.000000,Z=1.000000,W=1.000000),ColorContrast=(X=1.000000,Y=1.000000,Z=1.000000,W=1.000000),ColorGamma=(X=1.000000,Y=1.000000,Z=1.000000,W=1.000000),ColorGain=(X=1.000000,Y=1.000000,Z=1.000000,W=1.000000),ColorOffset=(X=0.000000,Y=0.000000,Z=0.000000,W=0.000000),ColorSaturationShadows=(X=1.000000,Y=1.000000,Z=1.000000,W=1.000000),ColorContrastShadows=(X=1.000000,Y=1.000000,Z=1.000000,W=1.000000),ColorGammaShadows=(X=1.000000,Y=1.000000,Z=1.000000,W=1.000000),ColorGainShadows=(X=1.000000,Y=1.000000,Z=1.000000,W=1.000000),ColorOffsetShadows=(X=0.000000,Y=0.000000,Z=0.000000,W=0.000000),ColorCorrectionShadowsMax=0.090000,ColorSaturationMidtones=(X=1.000000,Y=1.000000,Z=1.000000,W=1.000000),ColorContrastMidtones=(X=1.000000,Y=1.000000,Z=1.000000,W=1.000000),ColorGammaMidtones=(X=1.000000,Y=1.000000,Z=1.000000,W=1.000000),ColorGainMidtones=(X=1.000000,Y=1.000000,Z=1.000000,W=1.000000),ColorOffsetMidtones=(X=0.000000,Y=0.000000,Z=0.000000,W=0.000000),ColorSaturationHighlights=(X=1.000000,Y=1.000000,Z=1.000000,W=1.000000),ColorContrastHighlights=(X=1.000000,Y=1.000000,Z=1.000000,W=1.000000),ColorGammaHighlights=(X=1.000000,Y=1.000000,Z=1.000000,W=1.000000),ColorGainHighlights=(X=1.000000,Y=1.000000,Z=1.000000,W=1.000000),ColorOffsetHighlights=(X=0.000000,Y=0.000000,Z=0.000000,W=0.000000),ColorCorrectionHighlightsMin=0.500000,FilmWhitePoint=(R=1.000000,G=1.000000,B=1.000000,A=1.000000),FilmShadowTint=(R=1.000000,G=1.000000,B=1.000000,A=1.000000),FilmShadowTintBlend=0.500000,FilmShadowTintAmount=0.000000,FilmSaturation=1.000000,FilmChannelMixerRed=(R=1.000000,G=0.000000,B=0.000000,A=1.000000),FilmChannelMixerGreen=(R=0.000000,G=1.000000,B=0.000000,A=1.000000),FilmChannelMixerBlue=(R=0.000000,G=0.000000,B=1.000000,A=1.000000),FilmContrast=0.030000,FilmToeAmount=1.000000,FilmHealAmount=0.180000,FilmDynamicRange=4.000000,FilmSlope=0.880000,FilmToe=0.550000,FilmShoulder=0.260000,FilmBlackClip=0.000000,FilmWhiteClip=0.040000,SceneColorTint=(R=1.000000,G=1.000000,B=1.000000,A=1.000000),SceneFringeIntensity=0.000000,BloomIntensity=1.000000,BloomThreshold=1.000000,BloomSizeScale=4.000000,Bloom1Size=1.000000,Bloom2Size=4.000000,Bloom3Size=16.000000,Bloom4Size=32.000000,Bloom5Size=64.000000,Bloom6Size=64.000000,Bloom1Tint=(R=0.500000,G=0.500000,B=0.500000,A=1.000000),Bloom2Tint=(R=0.500000,G=0.500000,B=0.500000,A=1.000000),Bloom3Tint=(R=0.500000,G=0.500000,B=0.500000,A=1.000000),Bloom4Tint=(R=0.500000,G=0.500000,B=0.500000,A=1.000000),Bloom5Tint=(R=0.500000,G=0.500000,B=0.500000,A=1.000000),Bloom6Tint=(R=0.500000,G=0.500000,B=0.500000,A=1.000000),BloomDirtMaskIntensity=1.000000,BloomDirtMaskTint=(R=0.500000,G=0.500000,B=0.500000,A=1.000000),BloomDirtMask=None,LPVIntensity=1.000000,LPVVplInjectionBias=0.640000,LPVSize=5312.000000,LPVSecondaryOcclusionIntensity=0.000000,LPVSecondaryBounceIntensity=0.000000,LPVGeometryVolumeBias=0.384000,LPVEmissiveInjectionIntensity=1.000000,LPVDirectionalOcclusionIntensity=0.000000,LPVDirectionalOcclusionRadius=8.000000,LPVDiffuseOcclusionExponent=1.000000,LPVSpecularOcclusionExponent=7.000000,LPVDiffuseOcclusionIntensity=1.000000,LPVSpecularOcclusionIntensity=1.000000,AmbientCubemapTint=(R=1.000000,G=1.000000,B=1.000000,A=1.000000),AmbientCubemapIntensity=1.000000,AmbientCubemap=None,AutoExposureMethod=AEM_Histogram,AutoExposureLowPercent=80.000000,AutoExposureHighPercent=98.300003,AutoExposureMinBrightness=0.030000,AutoExposureMaxBrightness=2.000000,AutoExposureSpeedUp=3.000000,AutoExposureSpeedDown=1.000000,AutoExposureBias=0.000000,HistogramLogMin=-8.000000,HistogramLogMax=4.000000,LensFlareIntensity=1.000000,LensFlareTint=(R=1.000000,G=1.000000,B=1.000000,A=1.000000),LensFlareBokehSize=3.000000,LensFlareThreshold=8.000000,LensFlareBokehShape=None,LensFlareTints[0]=(R=1.000000,G=0.800000,B=0.400000,A=0.600000),LensFlareTints[1]=(R=1.000000,G=1.000000,B=0.600000,A=0.530000),LensFlareTints[2]=(R=0.800000,G=0.800000,B=1.000000,A=0.460000),LensFlareTints[3]=(R=0.500000,G=1.000000,B=0.400000,A=0.390000),LensFlareTints[4]=(R=0.500000,G=0.800000,B=1.000000,A=0.310000),LensFlareTints[5]=(R=0.900000,G=1.000000,B=0.800000,A=0.270000),LensFlareTints[6]=(R=1.000000,G=0.800000,B=0.400000,A=0.220000),LensFlareTints[7]=(R=0.900000,G=0.700000,B=0.700000,A=0.150000),VignetteIntensity=0.400000,GrainJitter=0.000000,GrainIntensity=0.000000,AmbientOcclusionIntensity=0.500000,AmbientOcclusionStaticFraction=1.000000,AmbientOcclusionRadius=200.000000,AmbientOcclusionRadiusInWS=False,AmbientOcclusionFadeDistance=8000.000000,AmbientOcclusionFadeRadius=5000.000000,AmbientOcclusionDistance=80.000000,AmbientOcclusionPower=2.000000,AmbientOcclusionBias=3.000000,AmbientOcclusionQuality=50.000000,AmbientOcclusionMipBlend=0.600000,AmbientOcclusionMipScale=1.700000,AmbientOcclusionMipThreshold=0.010000,IndirectLightingColor=(R=1.000000,G=1.000000,B=1.000000,A=1.000000),IndirectLightingIntensity=1.000000,ColorGradingIntensity=1.000000,ColorGradingLUT=None,DepthOfFieldMethod=DOFM_BokehDOF,bMobileHQGaussian=False,DepthOfFieldFstop=4.000000,DepthOfFieldSensorWidth=24.576000,DepthOfFieldFocalDistance=1000.000000,DepthOfFieldDepthBlurAmount=1.000000,DepthOfFieldDepthBlurRadius=0.000000,DepthOfFieldFocalRegion=0.000000,DepthOfFieldNearTransitionRegion=300.000000,DepthOfFieldFarTransitionRegion=500.000000,DepthOfFieldScale=0.000000,DepthOfFieldMaxBokehSize=15.000000,DepthOfFieldNearBlurSize=15.000000,DepthOfFieldFarBlurSize=15.000000,DepthOfFieldBokehShape=None,DepthOfFieldOcclusion=0.400000,DepthOfFieldColorThreshold=1.000000,DepthOfFieldSizeThreshold=0.080000,DepthOfFieldSkyFocusDistance=0.000000,DepthOfFieldVignetteSize=200.000000,MotionBlurAmount=0.500000,MotionBlurMax=5.000000,MotionBlurPerObjectSize=0.500000,ScreenPercentage=100.000000,ScreenSpaceReflectionIntensity=100.000000,ScreenSpaceReflectionQuality=50.000000,ScreenSpaceReflectionMaxRoughness=0.600000,WeightedBlendables=(Array=),Blendables=),bPostProcessingEnabled=True,LightingRigRotation=0.000000,RotationSpeed=2.000000,DirectionalLightRotation=(Pitch=-40.000000,Yaw=-67.500000,Roll=0.000000))
-+Profiles=(ProfileName="Default",DirectionalLightIntensity=2.620000,DirectionalLightColor=(R=0.990000,G=0.839850,B=0.732600,A=1.000000),SkyLightIntensity=0.880000,bRotateLightingRig=False,bShowEnvironment=True,bShowFloor=True,EnvironmentCubeMapPath="/Engine/EditorMaterials/AssetViewer/EpicQuadPanorama_CC+EV1.EpicQuadPanorama_CC+EV1",PostProcessingSettings=(bOverride_WhiteTemp=True,bOverride_WhiteTint=False,bOverride_ColorSaturation=True,bOverride_ColorContrast=True,bOverride_ColorGamma=True,bOverride_ColorGain=True,bOverride_ColorOffset=True,bOverride_ColorSaturationShadows=False,bOverride_ColorContrastShadows=False,bOverride_ColorGammaShadows=False,bOverride_ColorGainShadows=False,bOverride_ColorOffsetShadows=False,bOverride_ColorSaturationMidtones=False,bOverride_ColorContrastMidtones=False,bOverride_ColorGammaMidtones=False,bOverride_ColorGainMidtones=False,bOverride_ColorOffsetMidtones=False,bOverride_ColorSaturationHighlights=False,bOverride_ColorContrastHighlights=False,bOverride_ColorGammaHighlights=False,bOverride_ColorGainHighlights=False,bOverride_ColorOffsetHighlights=False,bOverride_ColorCorrectionShadowsMax=False,bOverride_ColorCorrectionHighlightsMin=False,bOverride_FilmWhitePoint=False,bOverride_FilmSaturation=False,bOverride_FilmChannelMixerRed=False,bOverride_FilmChannelMixerGreen=False,bOverride_FilmChannelMixerBlue=False,bOverride_FilmContrast=False,bOverride_FilmDynamicRange=False,bOverride_FilmHealAmount=False,bOverride_FilmToeAmount=False,bOverride_FilmShadowTint=False,bOverride_FilmShadowTintBlend=False,bOverride_FilmShadowTintAmount=False,bOverride_FilmSlope=True,bOverride_FilmToe=True,bOverride_FilmShoulder=True,bOverride_FilmBlackClip=True,bOverride_FilmWhiteClip=True,bOverride_SceneColorTint=False,bOverride_SceneFringeIntensity=False,bOverride_AmbientCubemapTint=False,bOverride_AmbientCubemapIntensity=False,bOverride_BloomIntensity=True,bOverride_BloomThreshold=False,bOverride_Bloom1Tint=False,bOverride_Bloom1Size=False,bOverride_Bloom2Size=False,bOverride_Bloom2Tint=False,bOverride_Bloom3Tint=False,bOverride_Bloom3Size=False,bOverride_Bloom4Tint=False,bOverride_Bloom4Size=False,bOverride_Bloom5Tint=False,bOverride_Bloom5Size=False,bOverride_Bloom6Tint=False,bOverride_Bloom6Size=False,bOverride_BloomSizeScale=False,bOverride_BloomDirtMaskIntensity=False,bOverride_BloomDirtMaskTint=False,bOverride_BloomDirtMask=False,bOverride_AutoExposureMethod=True,bOverride_AutoExposureLowPercent=False,bOverride_AutoExposureHighPercent=False,bOverride_AutoExposureMinBrightness=True,bOverride_AutoExposureMaxBrightness=True,bOverride_AutoExposureSpeedUp=False,bOverride_AutoExposureSpeedDown=False,bOverride_AutoExposureBias=True,bOverride_HistogramLogMin=True,bOverride_HistogramLogMax=True,bOverride_LensFlareIntensity=False,bOverride_LensFlareTint=False,bOverride_LensFlareTints=False,bOverride_LensFlareBokehSize=False,bOverride_LensFlareBokehShape=False,bOverride_LensFlareThreshold=False,bOverride_VignetteIntensity=True,bOverride_GrainIntensity=False,bOverride_GrainJitter=False,bOverride_AmbientOcclusionIntensity=True,bOverride_AmbientOcclusionStaticFraction=True,bOverride_AmbientOcclusionRadius=True,bOverride_AmbientOcclusionFadeDistance=False,bOverride_AmbientOcclusionFadeRadius=False,bOverride_AmbientOcclusionDistance=False,bOverride_AmbientOcclusionRadiusInWS=False,bOverride_AmbientOcclusionPower=True,bOverride_AmbientOcclusionBias=True,bOverride_AmbientOcclusionQuality=True,bOverride_AmbientOcclusionMipBlend=True,bOverride_AmbientOcclusionMipScale=True,bOverride_AmbientOcclusionMipThreshold=True,bOverride_LPVIntensity=False,bOverride_LPVDirectionalOcclusionIntensity=False,bOverride_LPVDirectionalOcclusionRadius=False,bOverride_LPVDiffuseOcclusionExponent=False,bOverride_LPVSpecularOcclusionExponent=False,bOverride_LPVDiffuseOcclusionIntensity=False,bOverride_LPVSpecularOcclusionIntensity=False,bOverride_LPVSize=False,bOverride_LPVSecondaryOcclusionIntensity=False,bOverride_LPVSecondaryBounceIntensity=False,bOverride_LPVGeometryVolumeBias=False,bOverride_LPVVplInjectionBias=False,bOverride_LPVEmissiveInjectionIntensity=False,bOverride_IndirectLightingColor=False,bOverride_IndirectLightingIntensity=False,bOverride_ColorGradingIntensity=True,bOverride_ColorGradingLUT=True,bOverride_DepthOfFieldFocalDistance=False,bOverride_DepthOfFieldFstop=False,bOverride_DepthOfFieldSensorWidth=False,bOverride_DepthOfFieldDepthBlurRadius=False,bOverride_DepthOfFieldDepthBlurAmount=False,bOverride_DepthOfFieldFocalRegion=False,bOverride_DepthOfFieldNearTransitionRegion=False,bOverride_DepthOfFieldFarTransitionRegion=False,bOverride_DepthOfFieldScale=True,bOverride_DepthOfFieldMaxBokehSize=False,bOverride_DepthOfFieldNearBlurSize=False,bOverride_DepthOfFieldFarBlurSize=False,bOverride_DepthOfFieldMethod=True,bOverride_MobileHQGaussian=False,bOverride_DepthOfFieldBokehShape=False,bOverride_DepthOfFieldOcclusion=False,bOverride_DepthOfFieldColorThreshold=False,bOverride_DepthOfFieldSizeThreshold=False,bOverride_DepthOfFieldSkyFocusDistance=False,bOverride_DepthOfFieldVignetteSize=False,bOverride_MotionBlurAmount=False,bOverride_MotionBlurMax=False,bOverride_MotionBlurPerObjectSize=False,bOverride_ScreenPercentage=False,bOverride_ScreenSpaceReflectionIntensity=True,bOverride_ScreenSpaceReflectionQuality=True,bOverride_ScreenSpaceReflectionMaxRoughness=True,bOverride_ScreenSpaceReflectionRoughnessScale=False,WhiteTemp=6700.000000,WhiteTint=0.000000,ColorSaturation=(X=1.000000,Y=1.000000,Z=1.000000,W=1.000000),ColorContrast=(X=1.000000,Y=1.000000,Z=1.000000,W=1.000000),ColorGamma=(X=1.000000,Y=1.000000,Z=1.000000,W=1.000000),ColorGain=(X=1.000000,Y=1.000000,Z=1.000000,W=1.000000),ColorOffset=(X=0.005000,Y=0.005000,Z=0.005000,W=0.000000),ColorSaturationShadows=(X=1.000000,Y=1.000000,Z=1.000000,W=1.000000),ColorContrastShadows=(X=1.000000,Y=1.000000,Z=1.000000,W=1.000000),ColorGammaShadows=(X=1.000000,Y=1.000000,Z=1.000000,W=1.000000),ColorGainShadows=(X=1.000000,Y=1.000000,Z=1.000000,W=1.000000),ColorOffsetShadows=(X=0.000000,Y=0.000000,Z=0.000000,W=0.000000),ColorCorrectionShadowsMax=0.090000,ColorSaturationMidtones=(X=1.000000,Y=1.000000,Z=1.000000,W=1.000000),ColorContrastMidtones=(X=1.000000,Y=1.000000,Z=1.000000,W=1.000000),ColorGammaMidtones=(X=1.000000,Y=1.000000,Z=1.000000,W=1.000000),ColorGainMidtones=(X=1.000000,Y=1.000000,Z=1.000000,W=1.000000),ColorOffsetMidtones=(X=0.000000,Y=0.000000,Z=0.000000,W=0.000000),ColorSaturationHighlights=(X=1.000000,Y=1.000000,Z=1.000000,W=1.000000),ColorContrastHighlights=(X=1.000000,Y=1.000000,Z=1.000000,W=1.000000),ColorGammaHighlights=(X=1.000000,Y=1.000000,Z=1.000000,W=1.000000),ColorGainHighlights=(X=1.000000,Y=1.000000,Z=1.000000,W=1.000000),ColorOffsetHighlights=(X=0.000000,Y=0.000000,Z=0.000000,W=0.000000),ColorCorrectionHighlightsMin=0.500000,FilmWhitePoint=(R=1.000000,G=1.000000,B=1.000000,A=1.000000),FilmShadowTint=(R=1.000000,G=1.000000,B=1.000000,A=1.000000),FilmShadowTintBlend=0.500000,FilmShadowTintAmount=0.000000,FilmSaturation=1.000000,FilmChannelMixerRed=(R=1.000000,G=0.000000,B=0.000000,A=1.000000),FilmChannelMixerGreen=(R=0.000000,G=1.000000,B=0.000000,A=1.000000),FilmChannelMixerBlue=(R=0.000000,G=0.000000,B=1.000000,A=1.000000),FilmContrast=0.030000,FilmToeAmount=1.000000,FilmHealAmount=1.000000,FilmDynamicRange=4.000000,FilmSlope=0.880000,FilmToe=0.550000,FilmShoulder=0.260000,FilmBlackClip=0.000000,FilmWhiteClip=0.040000,SceneColorTint=(R=1.000000,G=1.000000,B=1.000000,A=1.000000),SceneFringeIntensity=0.000000,BloomIntensity=0.675000,BloomThreshold=-1.000000,BloomSizeScale=4.000000,Bloom1Size=0.300000,Bloom2Size=1.000000,Bloom3Size=2.000000,Bloom4Size=10.000000,Bloom5Size=30.000000,Bloom6Size=64.000000,Bloom1Tint=(R=0.346500,G=0.346500,B=0.346500,A=1.000000),Bloom2Tint=(R=0.138000,G=0.138000,B=0.138000,A=1.000000),Bloom3Tint=(R=0.117600,G=0.117600,B=0.117600,A=1.000000),Bloom4Tint=(R=0.066000,G=0.066000,B=0.066000,A=1.000000),Bloom5Tint=(R=0.066000,G=0.066000,B=0.066000,A=1.000000),Bloom6Tint=(R=0.061000,G=0.061000,B=0.061000,A=1.000000),BloomDirtMaskIntensity=0.000000,BloomDirtMaskTint=(R=0.500000,G=0.500000,B=0.500000,A=1.000000),BloomDirtMask=None,AmbientCubemapTint=(R=1.000000,G=1.000000,B=1.000000,A=1.000000),AmbientCubemapIntensity=1.000000,AmbientCubemap=None,AutoExposureMethod=AEM_Histogram,AutoExposureLowPercent=80.000000,AutoExposureHighPercent=98.300003,AutoExposureMinBrightness=1.000000,AutoExposureMaxBrightness=1.000000,AutoExposureSpeedUp=3.000000,AutoExposureSpeedDown=1.000000,AutoExposureBias=0.330000,HistogramLogMin=-8.000000,HistogramLogMax=4.000000,LensFlareIntensity=1.000000,LensFlareTint=(R=1.000000,G=1.000000,B=1.000000,A=1.000000),LensFlareBokehSize=3.000000,LensFlareThreshold=8.000000,LensFlareBokehShape=None,LensFlareTints[0]=(R=1.000000,G=0.800000,B=0.400000,A=0.600000),LensFlareTints[1]=(R=1.000000,G=1.000000,B=0.600000,A=0.530000),LensFlareTints[2]=(R=0.800000,G=0.800000,B=1.000000,A=0.460000),LensFlareTints[3]=(R=0.500000,G=1.000000,B=0.400000,A=0.390000),LensFlareTints[4]=(R=0.500000,G=0.800000,B=1.000000,A=0.310000),LensFlareTints[5]=(R=0.900000,G=1.000000,B=0.800000,A=0.270000),LensFlareTints[6]=(R=1.000000,G=0.800000,B=0.400000,A=0.220000),LensFlareTints[7]=(R=0.900000,G=0.700000,B=0.700000,A=0.150000),VignetteIntensity=0.161468,GrainJitter=0.000000,GrainIntensity=0.000000,AmbientOcclusionIntensity=1.000000,AmbientOcclusionStaticFraction=1.000000,AmbientOcclusionRadius=73.477997,AmbientOcclusionRadiusInWS=False,AmbientOcclusionFadeDistance=8000.000000,AmbientOcclusionFadeRadius=5000.000000,AmbientOcclusionDistance=80.000000,AmbientOcclusionPower=1.200000,AmbientOcclusionBias=3.000000,AmbientOcclusionQuality=100.000000,AmbientOcclusionMipBlend=0.600000,AmbientOcclusionMipScale=1.700000,AmbientOcclusionMipThreshold=0.010000,IndirectLightingColor=(R=1.000000,G=1.000000,B=1.000000,A=1.000000),IndirectLightingIntensity=1.000000,ColorGradingIntensity=0.000000,ColorGradingLUT=Texture2D'/Engine/EditorResources/RGBTable16x1_AssetViewer.RGBTable16x1_AssetViewer',DepthOfFieldMethod=DOFM_BokehDOF,bMobileHQGaussian=False,DepthOfFieldFstop=4.000000,DepthOfFieldSensorWidth=24.576000,DepthOfFieldFocalDistance=1000.000000,DepthOfFieldDepthBlurAmount=1.000000,DepthOfFieldDepthBlurRadius=0.000000,DepthOfFieldFocalRegion=0.000000,DepthOfFieldNearTransitionRegion=300.000000,DepthOfFieldFarTransitionRegion=500.000000,DepthOfFieldScale=0.000000,DepthOfFieldMaxBokehSize=15.000000,DepthOfFieldNearBlurSize=15.000000,DepthOfFieldFarBlurSize=15.000000,DepthOfFieldBokehShape=None,DepthOfFieldOcclusion=0.400000,DepthOfFieldColorThreshold=1.000000,DepthOfFieldSizeThreshold=0.080000,DepthOfFieldSkyFocusDistance=0.000000,DepthOfFieldVignetteSize=200.000000,MotionBlurAmount=0.500000,MotionBlurMax=5.000000,MotionBlurPerObjectSize=0.500000,LPVIntensity=1.000000,LPVVplInjectionBias=0.640000,LPVSize=5312.000000,LPVSecondaryOcclusionIntensity=0.000000,LPVSecondaryBounceIntensity=0.000000,LPVGeometryVolumeBias=0.384000,LPVEmissiveInjectionIntensity=1.000000,LPVDirectionalOcclusionIntensity=0.000000,LPVDirectionalOcclusionRadius=8.000000,LPVDiffuseOcclusionExponent=1.000000,LPVSpecularOcclusionExponent=7.000000,LPVDiffuseOcclusionIntensity=1.000000,LPVSpecularOcclusionIntensity=1.000000,ScreenSpaceReflectionIntensity=100.000000,ScreenSpaceReflectionQuality=100.000000,ScreenSpaceReflectionMaxRoughness=1.000000,ScreenPercentage=100.000000,WeightedBlendables=(Array=),Blendables=),bPostProcessingEnabled=True,LightingRigRotation=109.389069,RotationSpeed=2.000000,DirectionalLightRotation=(Pitch=-39.999985,Yaw=-67.500015,Roll=0.000000))
-+Profiles=(ProfileName="Default",DirectionalLightIntensity=2.620000,DirectionalLightColor=(R=0.990000,G=0.839850,B=0.732600,A=1.000000),SkyLightIntensity=0.880000,bRotateLightingRig=False,bShowEnvironment=True,bShowFloor=True,EnvironmentCubeMapPath="/Engine/EditorMaterials/AssetViewer/EpicQuadPanorama_CC+EV1.EpicQuadPanorama_CC+EV1",PostProcessingSettings=(bOverride_WhiteTemp=True,bOverride_WhiteTint=False,bOverride_ColorSaturation=True,bOverride_ColorContrast=True,bOverride_ColorGamma=True,bOverride_ColorGain=True,bOverride_ColorOffset=True,bOverride_ColorSaturationShadows=False,bOverride_ColorContrastShadows=False,bOverride_ColorGammaShadows=False,bOverride_ColorGainShadows=False,bOverride_ColorOffsetShadows=False,bOverride_ColorSaturationMidtones=False,bOverride_ColorContrastMidtones=False,bOverride_ColorGammaMidtones=False,bOverride_ColorGainMidtones=False,bOverride_ColorOffsetMidtones=False,bOverride_ColorSaturationHighlights=False,bOverride_ColorContrastHighlights=False,bOverride_ColorGammaHighlights=False,bOverride_ColorGainHighlights=False,bOverride_ColorOffsetHighlights=False,bOverride_ColorCorrectionShadowsMax=False,bOverride_ColorCorrectionHighlightsMin=False,bOverride_FilmWhitePoint=False,bOverride_FilmSaturation=False,bOverride_FilmChannelMixerRed=False,bOverride_FilmChannelMixerGreen=False,bOverride_FilmChannelMixerBlue=False,bOverride_FilmContrast=False,bOverride_FilmDynamicRange=False,bOverride_FilmHealAmount=False,bOverride_FilmToeAmount=False,bOverride_FilmShadowTint=False,bOverride_FilmShadowTintBlend=False,bOverride_FilmShadowTintAmount=False,bOverride_FilmSlope=True,bOverride_FilmToe=True,bOverride_FilmShoulder=True,bOverride_FilmBlackClip=True,bOverride_FilmWhiteClip=True,bOverride_SceneColorTint=False,bOverride_SceneFringeIntensity=False,bOverride_AmbientCubemapTint=False,bOverride_AmbientCubemapIntensity=False,bOverride_BloomIntensity=True,bOverride_BloomThreshold=False,bOverride_Bloom1Tint=False,bOverride_Bloom1Size=False,bOverride_Bloom2Size=False,bOverride_Bloom2Tint=False,bOverride_Bloom3Tint=False,bOverride_Bloom3Size=False,bOverride_Bloom4Tint=False,bOverride_Bloom4Size=False,bOverride_Bloom5Tint=False,bOverride_Bloom5Size=False,bOverride_Bloom6Tint=False,bOverride_Bloom6Size=False,bOverride_BloomSizeScale=False,bOverride_BloomDirtMaskIntensity=False,bOverride_BloomDirtMaskTint=False,bOverride_BloomDirtMask=False,bOverride_AutoExposureMethod=True,bOverride_AutoExposureLowPercent=False,bOverride_AutoExposureHighPercent=False,bOverride_AutoExposureMinBrightness=True,bOverride_AutoExposureMaxBrightness=True,bOverride_AutoExposureSpeedUp=False,bOverride_AutoExposureSpeedDown=False,bOverride_AutoExposureBias=True,bOverride_HistogramLogMin=True,bOverride_HistogramLogMax=True,bOverride_LensFlareIntensity=False,bOverride_LensFlareTint=False,bOverride_LensFlareTints=False,bOverride_LensFlareBokehSize=False,bOverride_LensFlareBokehShape=False,bOverride_LensFlareThreshold=False,bOverride_VignetteIntensity=True,bOverride_GrainIntensity=False,bOverride_GrainJitter=False,bOverride_AmbientOcclusionIntensity=True,bOverride_AmbientOcclusionStaticFraction=True,bOverride_AmbientOcclusionRadius=True,bOverride_AmbientOcclusionFadeDistance=False,bOverride_AmbientOcclusionFadeRadius=False,bOverride_AmbientOcclusionDistance=False,bOverride_AmbientOcclusionRadiusInWS=False,bOverride_AmbientOcclusionPower=True,bOverride_AmbientOcclusionBias=True,bOverride_AmbientOcclusionQuality=True,bOverride_AmbientOcclusionMipBlend=True,bOverride_AmbientOcclusionMipScale=True,bOverride_AmbientOcclusionMipThreshold=True,bOverride_LPVIntensity=False,bOverride_LPVDirectionalOcclusionIntensity=False,bOverride_LPVDirectionalOcclusionRadius=False,bOverride_LPVDiffuseOcclusionExponent=False,bOverride_LPVSpecularOcclusionExponent=False,bOverride_LPVDiffuseOcclusionIntensity=False,bOverride_LPVSpecularOcclusionIntensity=False,bOverride_LPVSize=False,bOverride_LPVSecondaryOcclusionIntensity=False,bOverride_LPVSecondaryBounceIntensity=False,bOverride_LPVGeometryVolumeBias=False,bOverride_LPVVplInjectionBias=False,bOverride_LPVEmissiveInjectionIntensity=False,bOverride_IndirectLightingColor=False,bOverride_IndirectLightingIntensity=False,bOverride_ColorGradingIntensity=True,bOverride_ColorGradingLUT=True,bOverride_DepthOfFieldFocalDistance=False,bOverride_DepthOfFieldFstop=False,bOverride_DepthOfFieldSensorWidth=False,bOverride_DepthOfFieldDepthBlurRadius=False,bOverride_DepthOfFieldDepthBlurAmount=False,bOverride_DepthOfFieldFocalRegion=False,bOverride_DepthOfFieldNearTransitionRegion=False,bOverride_DepthOfFieldFarTransitionRegion=False,bOverride_DepthOfFieldScale=True,bOverride_DepthOfFieldMaxBokehSize=False,bOverride_DepthOfFieldNearBlurSize=False,bOverride_DepthOfFieldFarBlurSize=False,bOverride_DepthOfFieldMethod=True,bOverride_MobileHQGaussian=False,bOverride_DepthOfFieldBokehShape=False,bOverride_DepthOfFieldOcclusion=False,bOverride_DepthOfFieldColorThreshold=False,bOverride_DepthOfFieldSizeThreshold=False,bOverride_DepthOfFieldSkyFocusDistance=False,bOverride_DepthOfFieldVignetteSize=False,bOverride_MotionBlurAmount=False,bOverride_MotionBlurMax=False,bOverride_MotionBlurPerObjectSize=False,bOverride_ScreenPercentage=False,bOverride_ScreenSpaceReflectionIntensity=True,bOverride_ScreenSpaceReflectionQuality=True,bOverride_ScreenSpaceReflectionMaxRoughness=True,bOverride_ScreenSpaceReflectionRoughnessScale=False,WhiteTemp=6700.000000,WhiteTint=0.000000,ColorSaturation=(X=1.000000,Y=1.000000,Z=1.000000,W=1.000000),ColorContrast=(X=1.000000,Y=1.000000,Z=1.000000,W=1.000000),ColorGamma=(X=1.000000,Y=1.000000,Z=1.000000,W=1.000000),ColorGain=(X=1.000000,Y=1.000000,Z=1.000000,W=1.000000),ColorOffset=(X=0.005000,Y=0.005000,Z=0.005000,W=0.000000),ColorSaturationShadows=(X=1.000000,Y=1.000000,Z=1.000000,W=1.000000),ColorContrastShadows=(X=1.000000,Y=1.000000,Z=1.000000,W=1.000000),ColorGammaShadows=(X=1.000000,Y=1.000000,Z=1.000000,W=1.000000),ColorGainShadows=(X=1.000000,Y=1.000000,Z=1.000000,W=1.000000),ColorOffsetShadows=(X=0.000000,Y=0.000000,Z=0.000000,W=0.000000),ColorCorrectionShadowsMax=0.090000,ColorSaturationMidtones=(X=1.000000,Y=1.000000,Z=1.000000,W=1.000000),ColorContrastMidtones=(X=1.000000,Y=1.000000,Z=1.000000,W=1.000000),ColorGammaMidtones=(X=1.000000,Y=1.000000,Z=1.000000,W=1.000000),ColorGainMidtones=(X=1.000000,Y=1.000000,Z=1.000000,W=1.000000),ColorOffsetMidtones=(X=0.000000,Y=0.000000,Z=0.000000,W=0.000000),ColorSaturationHighlights=(X=1.000000,Y=1.000000,Z=1.000000,W=1.000000),ColorContrastHighlights=(X=1.000000,Y=1.000000,Z=1.000000,W=1.000000),ColorGammaHighlights=(X=1.000000,Y=1.000000,Z=1.000000,W=1.000000),ColorGainHighlights=(X=1.000000,Y=1.000000,Z=1.000000,W=1.000000),ColorOffsetHighlights=(X=0.000000,Y=0.000000,Z=0.000000,W=0.000000),ColorCorrectionHighlightsMin=0.500000,FilmWhitePoint=(R=1.000000,G=1.000000,B=1.000000,A=1.000000),FilmShadowTint=(R=1.000000,G=1.000000,B=1.000000,A=1.000000),FilmShadowTintBlend=0.500000,FilmShadowTintAmount=0.000000,FilmSaturation=1.000000,FilmChannelMixerRed=(R=1.000000,G=0.000000,B=0.000000,A=1.000000),FilmChannelMixerGreen=(R=0.000000,G=1.000000,B=0.000000,A=1.000000),FilmChannelMixerBlue=(R=0.000000,G=0.000000,B=1.000000,A=1.000000),FilmContrast=0.030000,FilmToeAmount=1.000000,FilmHealAmount=0.180000,FilmDynamicRange=4.000000,FilmSlope=0.880000,FilmToe=0.550000,FilmShoulder=0.260000,FilmBlackClip=0.000000,FilmWhiteClip=0.040000,SceneColorTint=(R=1.000000,G=1.000000,B=1.000000,A=1.000000),SceneFringeIntensity=0.000000,BloomIntensity=1.000000,BloomThreshold=1.000000,BloomSizeScale=4.000000,Bloom1Size=1.000000,Bloom2Size=4.000000,Bloom3Size=16.000000,Bloom4Size=32.000000,Bloom5Size=64.000000,Bloom6Size=64.000000,Bloom1Tint=(R=0.500000,G=0.500000,B=0.500000,A=1.000000),Bloom2Tint=(R=0.500000,G=0.500000,B=0.500000,A=1.000000),Bloom3Tint=(R=0.500000,G=0.500000,B=0.500000,A=1.000000),Bloom4Tint=(R=0.500000,G=0.500000,B=0.500000,A=1.000000),Bloom5Tint=(R=0.500000,G=0.500000,B=0.500000,A=1.000000),Bloom6Tint=(R=0.500000,G=0.500000,B=0.500000,A=1.000000),BloomDirtMaskIntensity=1.000000,BloomDirtMaskTint=(R=0.500000,G=0.500000,B=0.500000,A=1.000000),BloomDirtMask=None,AmbientCubemapTint=(R=1.000000,G=1.000000,B=1.000000,A=1.000000),AmbientCubemapIntensity=1.000000,AmbientCubemap=None,AutoExposureMethod=AEM_Histogram,AutoExposureLowPercent=80.000000,AutoExposureHighPercent=98.300003,AutoExposureMinBrightness=1.000000,AutoExposureMaxBrightness=1.000000,AutoExposureSpeedUp=3.000000,AutoExposureSpeedDown=1.000000,AutoExposureBias=0.330000,HistogramLogMin=-8.000000,HistogramLogMax=4.000000,LensFlareIntensity=1.000000,LensFlareTint=(R=1.000000,G=1.000000,B=1.000000,A=1.000000),LensFlareBokehSize=3.000000,LensFlareThreshold=8.000000,LensFlareBokehShape=None,LensFlareTints[0]=(R=1.000000,G=0.800000,B=0.400000,A=0.600000),LensFlareTints[1]=(R=1.000000,G=1.000000,B=0.600000,A=0.530000),LensFlareTints[2]=(R=0.800000,G=0.800000,B=1.000000,A=0.460000),LensFlareTints[3]=(R=0.500000,G=1.000000,B=0.400000,A=0.390000),LensFlareTints[4]=(R=0.500000,G=0.800000,B=1.000000,A=0.310000),LensFlareTints[5]=(R=0.900000,G=1.000000,B=0.800000,A=0.270000),LensFlareTints[6]=(R=1.000000,G=0.800000,B=0.400000,A=0.220000),LensFlareTints[7]=(R=0.900000,G=0.700000,B=0.700000,A=0.150000),VignetteIntensity=0.161468,GrainJitter=0.000000,GrainIntensity=0.000000,AmbientOcclusionIntensity=1.000000,AmbientOcclusionStaticFraction=1.000000,AmbientOcclusionRadius=73.477997,AmbientOcclusionRadiusInWS=False,AmbientOcclusionFadeDistance=8000.000000,AmbientOcclusionFadeRadius=5000.000000,AmbientOcclusionDistance=80.000000,AmbientOcclusionPower=1.200000,AmbientOcclusionBias=3.000000,AmbientOcclusionQuality=100.000000,AmbientOcclusionMipBlend=0.600000,AmbientOcclusionMipScale=1.700000,AmbientOcclusionMipThreshold=0.010000,IndirectLightingColor=(R=1.000000,G=1.000000,B=1.000000,A=1.000000),IndirectLightingIntensity=1.000000,ColorGradingIntensity=0.000000,ColorGradingLUT=Texture2D'/Engine/EditorResources/RGBTable16x1_AssetViewer.RGBTable16x1_AssetViewer',DepthOfFieldMethod=DOFM_BokehDOF,bMobileHQGaussian=False,DepthOfFieldFstop=4.000000,DepthOfFieldSensorWidth=24.576000,DepthOfFieldFocalDistance=1000.000000,DepthOfFieldDepthBlurAmount=1.000000,DepthOfFieldDepthBlurRadius=0.000000,DepthOfFieldFocalRegion=0.000000,DepthOfFieldNearTransitionRegion=300.000000,DepthOfFieldFarTransitionRegion=500.000000,DepthOfFieldScale=0.000000,DepthOfFieldMaxBokehSize=15.000000,DepthOfFieldNearBlurSize=15.000000,DepthOfFieldFarBlurSize=15.000000,DepthOfFieldBokehShape=None,DepthOfFieldOcclusion=0.400000,DepthOfFieldColorThreshold=1.000000,DepthOfFieldSizeThreshold=0.080000,DepthOfFieldSkyFocusDistance=0.000000,DepthOfFieldVignetteSize=200.000000,MotionBlurAmount=0.500000,MotionBlurMax=5.000000,MotionBlurPerObjectSize=0.500000,LPVIntensity=1.000000,LPVVplInjectionBias=0.640000,LPVSize=5312.000000,LPVSecondaryOcclusionIntensity=0.000000,LPVSecondaryBounceIntensity=0.000000,LPVGeometryVolumeBias=0.384000,LPVEmissiveInjectionIntensity=1.000000,LPVDirectionalOcclusionIntensity=0.000000,LPVDirectionalOcclusionRadius=8.000000,LPVDiffuseOcclusionExponent=1.000000,LPVSpecularOcclusionExponent=7.000000,LPVDiffuseOcclusionIntensity=1.000000,LPVSpecularOcclusionIntensity=1.000000,ScreenSpaceReflectionIntensity=100.000000,ScreenSpaceReflectionQuality=100.000000,ScreenSpaceReflectionMaxRoughness=1.000000,ScreenPercentage=100.000000,WeightedBlendables=(Array=),Blendables=),bPostProcessingEnabled=True,LightingRigRotation=109.389069,RotationSpeed=2.000000,DirectionalLightRotation=(Pitch=-39.999985,Yaw=-67.500015,Roll=0.000000))
-+Profiles=(ProfileName="Profile_0",DirectionalLightIntensity=1.000000,DirectionalLightColor=(R=1.000000,G=1.000000,B=1.000000,A=1.000000),SkyLightIntensity=1.000000,bRotateLightingRig=False,bShowEnvironment=True,bShowFloor=True,EnvironmentCubeMapPath="",PostProcessingSettings=(bOverride_WhiteTemp=False,bOverride_WhiteTint=False,bOverride_ColorSaturation=False,bOverride_ColorContrast=False,bOverride_ColorGamma=False,bOverride_ColorGain=False,bOverride_ColorOffset=False,bOverride_ColorSaturationShadows=False,bOverride_ColorContrastShadows=False,bOverride_ColorGammaShadows=False,bOverride_ColorGainShadows=False,bOverride_ColorOffsetShadows=False,bOverride_ColorSaturationMidtones=False,bOverride_ColorContrastMidtones=False,bOverride_ColorGammaMidtones=False,bOverride_ColorGainMidtones=False,bOverride_ColorOffsetMidtones=False,bOverride_ColorSaturationHighlights=False,bOverride_ColorContrastHighlights=False,bOverride_ColorGammaHighlights=False,bOverride_ColorGainHighlights=False,bOverride_ColorOffsetHighlights=False,bOverride_ColorCorrectionShadowsMax=False,bOverride_ColorCorrectionHighlightsMin=False,bOverride_FilmWhitePoint=False,bOverride_FilmSaturation=False,bOverride_FilmChannelMixerRed=False,bOverride_FilmChannelMixerGreen=False,bOverride_FilmChannelMixerBlue=False,bOverride_FilmContrast=False,bOverride_FilmDynamicRange=False,bOverride_FilmHealAmount=False,bOverride_FilmToeAmount=False,bOverride_FilmShadowTint=False,bOverride_FilmShadowTintBlend=False,bOverride_FilmShadowTintAmount=False,bOverride_FilmSlope=False,bOverride_FilmToe=False,bOverride_FilmShoulder=False,bOverride_FilmBlackClip=False,bOverride_FilmWhiteClip=False,bOverride_SceneColorTint=False,bOverride_SceneFringeIntensity=False,bOverride_AmbientCubemapTint=False,bOverride_AmbientCubemapIntensity=False,bOverride_BloomIntensity=False,bOverride_BloomThreshold=False,bOverride_Bloom1Tint=False,bOverride_Bloom1Size=False,bOverride_Bloom2Size=False,bOverride_Bloom2Tint=False,bOverride_Bloom3Tint=False,bOverride_Bloom3Size=False,bOverride_Bloom4Tint=False,bOverride_Bloom4Size=False,bOverride_Bloom5Tint=False,bOverride_Bloom5Size=False,bOverride_Bloom6Tint=False,bOverride_Bloom6Size=False,bOverride_BloomSizeScale=False,bOverride_BloomDirtMaskIntensity=False,bOverride_BloomDirtMaskTint=False,bOverride_BloomDirtMask=False,bOverride_AutoExposureMethod=False,bOverride_AutoExposureLowPercent=False,bOverride_AutoExposureHighPercent=False,bOverride_AutoExposureMinBrightness=False,bOverride_AutoExposureMaxBrightness=False,bOverride_AutoExposureSpeedUp=False,bOverride_AutoExposureSpeedDown=False,bOverride_AutoExposureBias=False,bOverride_HistogramLogMin=False,bOverride_HistogramLogMax=False,bOverride_LensFlareIntensity=False,bOverride_LensFlareTint=False,bOverride_LensFlareTints=False,bOverride_LensFlareBokehSize=False,bOverride_LensFlareBokehShape=False,bOverride_LensFlareThreshold=False,bOverride_VignetteIntensity=False,bOverride_GrainIntensity=False,bOverride_GrainJitter=False,bOverride_AmbientOcclusionIntensity=False,bOverride_AmbientOcclusionStaticFraction=False,bOverride_AmbientOcclusionRadius=False,bOverride_AmbientOcclusionFadeDistance=False,bOverride_AmbientOcclusionFadeRadius=False,bOverride_AmbientOcclusionDistance=False,bOverride_AmbientOcclusionRadiusInWS=False,bOverride_AmbientOcclusionPower=False,bOverride_AmbientOcclusionBias=False,bOverride_AmbientOcclusionQuality=False,bOverride_AmbientOcclusionMipBlend=False,bOverride_AmbientOcclusionMipScale=False,bOverride_AmbientOcclusionMipThreshold=False,bOverride_LPVIntensity=False,bOverride_LPVDirectionalOcclusionIntensity=False,bOverride_LPVDirectionalOcclusionRadius=False,bOverride_LPVDiffuseOcclusionExponent=False,bOverride_LPVSpecularOcclusionExponent=False,bOverride_LPVDiffuseOcclusionIntensity=False,bOverride_LPVSpecularOcclusionIntensity=False,bOverride_LPVSize=False,bOverride_LPVSecondaryOcclusionIntensity=False,bOverride_LPVSecondaryBounceIntensity=False,bOverride_LPVGeometryVolumeBias=False,bOverride_LPVVplInjectionBias=False,bOverride_LPVEmissiveInjectionIntensity=False,bOverride_IndirectLightingColor=False,bOverride_IndirectLightingIntensity=False,bOverride_ColorGradingIntensity=False,bOverride_ColorGradingLUT=False,bOverride_DepthOfFieldFocalDistance=False,bOverride_DepthOfFieldFstop=False,bOverride_DepthOfFieldSensorWidth=False,bOverride_DepthOfFieldDepthBlurRadius=False,bOverride_DepthOfFieldDepthBlurAmount=False,bOverride_DepthOfFieldFocalRegion=False,bOverride_DepthOfFieldNearTransitionRegion=False,bOverride_DepthOfFieldFarTransitionRegion=False,bOverride_DepthOfFieldScale=False,bOverride_DepthOfFieldMaxBokehSize=False,bOverride_DepthOfFieldNearBlurSize=False,bOverride_DepthOfFieldFarBlurSize=False,bOverride_DepthOfFieldMethod=False,bOverride_MobileHQGaussian=False,bOverride_DepthOfFieldBokehShape=False,bOverride_DepthOfFieldOcclusion=False,bOverride_DepthOfFieldColorThreshold=False,bOverride_DepthOfFieldSizeThreshold=False,bOverride_DepthOfFieldSkyFocusDistance=False,bOverride_DepthOfFieldVignetteSize=False,bOverride_MotionBlurAmount=False,bOverride_MotionBlurMax=False,bOverride_MotionBlurPerObjectSize=False,bOverride_ScreenPercentage=False,bOverride_ScreenSpaceReflectionIntensity=False,bOverride_ScreenSpaceReflectionQuality=False,bOverride_ScreenSpaceReflectionMaxRoughness=False,bOverride_ScreenSpaceReflectionRoughnessScale=False,WhiteTemp=6500.000000,WhiteTint=0.000000,ColorSaturation=(X=1.000000,Y=1.000000,Z=1.000000,W=1.000000),ColorContrast=(X=1.000000,Y=1.000000,Z=1.000000,W=1.000000),ColorGamma=(X=1.000000,Y=1.000000,Z=1.000000,W=1.000000),ColorGain=(X=1.000000,Y=1.000000,Z=1.000000,W=1.000000),ColorOffset=(X=0.000000,Y=0.000000,Z=0.000000,W=0.000000),ColorSaturationShadows=(X=1.000000,Y=1.000000,Z=1.000000,W=1.000000),ColorContrastShadows=(X=1.000000,Y=1.000000,Z=1.000000,W=1.000000),ColorGammaShadows=(X=1.000000,Y=1.000000,Z=1.000000,W=1.000000),ColorGainShadows=(X=1.000000,Y=1.000000,Z=1.000000,W=1.000000),ColorOffsetShadows=(X=0.000000,Y=0.000000,Z=0.000000,W=0.000000),ColorCorrectionShadowsMax=0.090000,ColorSaturationMidtones=(X=1.000000,Y=1.000000,Z=1.000000,W=1.000000),ColorContrastMidtones=(X=1.000000,Y=1.000000,Z=1.000000,W=1.000000),ColorGammaMidtones=(X=1.000000,Y=1.000000,Z=1.000000,W=1.000000),ColorGainMidtones=(X=1.000000,Y=1.000000,Z=1.000000,W=1.000000),ColorOffsetMidtones=(X=0.000000,Y=0.000000,Z=0.000000,W=0.000000),ColorSaturationHighlights=(X=1.000000,Y=1.000000,Z=1.000000,W=1.000000),ColorContrastHighlights=(X=1.000000,Y=1.000000,Z=1.000000,W=1.000000),ColorGammaHighlights=(X=1.000000,Y=1.000000,Z=1.000000,W=1.000000),ColorGainHighlights=(X=1.000000,Y=1.000000,Z=1.000000,W=1.000000),ColorOffsetHighlights=(X=0.000000,Y=0.000000,Z=0.000000,W=0.000000),ColorCorrectionHighlightsMin=0.500000,FilmWhitePoint=(R=1.000000,G=1.000000,B=1.000000,A=1.000000),FilmShadowTint=(R=1.000000,G=1.000000,B=1.000000,A=1.000000),FilmShadowTintBlend=0.500000,FilmShadowTintAmount=0.000000,FilmSaturation=1.000000,FilmChannelMixerRed=(R=1.000000,G=0.000000,B=0.000000,A=1.000000),FilmChannelMixerGreen=(R=0.000000,G=1.000000,B=0.000000,A=1.000000),FilmChannelMixerBlue=(R=0.000000,G=0.000000,B=1.000000,A=1.000000),FilmContrast=0.030000,FilmToeAmount=1.000000,FilmHealAmount=0.180000,FilmDynamicRange=4.000000,FilmSlope=0.880000,FilmToe=0.550000,FilmShoulder=0.260000,FilmBlackClip=0.000000,FilmWhiteClip=0.040000,SceneColorTint=(R=1.000000,G=1.000000,B=1.000000,A=1.000000),SceneFringeIntensity=0.000000,BloomIntensity=1.000000,BloomThreshold=1.000000,BloomSizeScale=4.000000,Bloom1Size=1.000000,Bloom2Size=4.000000,Bloom3Size=16.000000,Bloom4Size=32.000000,Bloom5Size=64.000000,Bloom6Size=64.000000,Bloom1Tint=(R=0.500000,G=0.500000,B=0.500000,A=1.000000),Bloom2Tint=(R=0.500000,G=0.500000,B=0.500000,A=1.000000),Bloom3Tint=(R=0.500000,G=0.500000,B=0.500000,A=1.000000),Bloom4Tint=(R=0.500000,G=0.500000,B=0.500000,A=1.000000),Bloom5Tint=(R=0.500000,G=0.500000,B=0.500000,A=1.000000),Bloom6Tint=(R=0.500000,G=0.500000,B=0.500000,A=1.000000),BloomDirtMaskIntensity=1.000000,BloomDirtMaskTint=(R=0.500000,G=0.500000,B=0.500000,A=1.000000),BloomDirtMask=None,AmbientCubemapTint=(R=1.000000,G=1.000000,B=1.000000,A=1.000000),AmbientCubemapIntensity=1.000000,AmbientCubemap=None,AutoExposureMethod=AEM_Histogram,AutoExposureLowPercent=80.000000,AutoExposureHighPercent=98.300003,AutoExposureMinBrightness=0.030000,AutoExposureMaxBrightness=2.000000,AutoExposureSpeedUp=3.000000,AutoExposureSpeedDown=1.000000,AutoExposureBias=0.000000,HistogramLogMin=-8.000000,HistogramLogMax=4.000000,LensFlareIntensity=1.000000,LensFlareTint=(R=1.000000,G=1.000000,B=1.000000,A=1.000000),LensFlareBokehSize=3.000000,LensFlareThreshold=8.000000,LensFlareBokehShape=None,LensFlareTints[0]=(R=1.000000,G=0.800000,B=0.400000,A=0.600000),LensFlareTints[1]=(R=1.000000,G=1.000000,B=0.600000,A=0.530000),LensFlareTints[2]=(R=0.800000,G=0.800000,B=1.000000,A=0.460000),LensFlareTints[3]=(R=0.500000,G=1.000000,B=0.400000,A=0.390000),LensFlareTints[4]=(R=0.500000,G=0.800000,B=1.000000,A=0.310000),LensFlareTints[5]=(R=0.900000,G=1.000000,B=0.800000,A=0.270000),LensFlareTints[6]=(R=1.000000,G=0.800000,B=0.400000,A=0.220000),LensFlareTints[7]=(R=0.900000,G=0.700000,B=0.700000,A=0.150000),VignetteIntensity=0.400000,GrainJitter=0.000000,GrainIntensity=0.000000,AmbientOcclusionIntensity=0.500000,AmbientOcclusionStaticFraction=1.000000,AmbientOcclusionRadius=200.000000,AmbientOcclusionRadiusInWS=False,AmbientOcclusionFadeDistance=8000.000000,AmbientOcclusionFadeRadius=5000.000000,AmbientOcclusionDistance=80.000000,AmbientOcclusionPower=2.000000,AmbientOcclusionBias=3.000000,AmbientOcclusionQuality=50.000000,AmbientOcclusionMipBlend=0.600000,AmbientOcclusionMipScale=1.700000,AmbientOcclusionMipThreshold=0.010000,IndirectLightingColor=(R=1.000000,G=1.000000,B=1.000000,A=1.000000),IndirectLightingIntensity=1.000000,ColorGradingIntensity=1.000000,ColorGradingLUT=None,DepthOfFieldMethod=DOFM_BokehDOF,bMobileHQGaussian=False,DepthOfFieldFstop=4.000000,DepthOfFieldSensorWidth=24.576000,DepthOfFieldFocalDistance=1000.000000,DepthOfFieldDepthBlurAmount=1.000000,DepthOfFieldDepthBlurRadius=0.000000,DepthOfFieldFocalRegion=0.000000,DepthOfFieldNearTransitionRegion=300.000000,DepthOfFieldFarTransitionRegion=500.000000,DepthOfFieldScale=0.000000,DepthOfFieldMaxBokehSize=15.000000,DepthOfFieldNearBlurSize=15.000000,DepthOfFieldFarBlurSize=15.000000,DepthOfFieldBokehShape=None,DepthOfFieldOcclusion=0.400000,DepthOfFieldColorThreshold=1.000000,DepthOfFieldSizeThreshold=0.080000,DepthOfFieldSkyFocusDistance=0.000000,DepthOfFieldVignetteSize=200.000000,MotionBlurAmount=0.500000,MotionBlurMax=5.000000,MotionBlurPerObjectSize=0.500000,LPVIntensity=1.000000,LPVVplInjectionBias=0.640000,LPVSize=5312.000000,LPVSecondaryOcclusionIntensity=0.000000,LPVSecondaryBounceIntensity=0.000000,LPVGeometryVolumeBias=0.384000,LPVEmissiveInjectionIntensity=1.000000,LPVDirectionalOcclusionIntensity=0.000000,LPVDirectionalOcclusionRadius=8.000000,LPVDiffuseOcclusionExponent=1.000000,LPVSpecularOcclusionExponent=7.000000,LPVDiffuseOcclusionIntensity=1.000000,LPVSpecularOcclusionIntensity=1.000000,ScreenSpaceReflectionIntensity=100.000000,ScreenSpaceReflectionQuality=50.000000,ScreenSpaceReflectionMaxRoughness=0.600000,ScreenPercentage=100.000000,WeightedBlendables=(Array=),Blendables=),bPostProcessingEnabled=True,LightingRigRotation=0.000000,RotationSpeed=2.000000,DirectionalLightRotation=(Pitch=-40.000000,Yaw=-67.500000,Roll=0.000000))
+[/Script/UnrealEd.EditorProjectAppearanceSettings]
+bDisplayUnitsOnComponentTransforms=True
diff --git a/Config/DefaultEditorPerProjectUserSettings.ini b/Config/DefaultEditorPerProjectUserSettings.ini
index 831e211..8916a8c 100644
--- a/Config/DefaultEditorPerProjectUserSettings.ini
+++ b/Config/DefaultEditorPerProjectUserSettings.ini
@@ -1,31 +1,35 @@
+[ContentBrowser]
+ContentBrowserTab1.SelectedPaths=/Game/ThirdPersonCPP
[/Script/UnrealEd.EditorExperimentalSettings]
bProceduralFoliage=True
-bEnableLocalizationDashboard=False
+bEnableLocalizationDashboard=True
bEnableTranslationPicker=False
bEnableEditorUtilityBlueprints=False
-bUnifiedBlueprintEditor=True
-bBlueprintableComponents=True
-bActorMerging=False
+bEnableFavoriteSystem=False
bDeviceOutputLog=False
ConsoleForGamepadLabels=None
bToolbarCustomization=False
bBreakOnExceptions=False
-bBlueprintPerformanceAnalysisTools=True
-BlueprintProfilerAverageSampleCount=20
-bEnableWidgetVisualDiff=False
-bEnableAnimVisualDiff=False
+bBlueprintPerformanceAnalysisTools=False
bEnableFindAndReplaceReferences=False
bDrawMidpointArrowsInBlueprints=False
-bShowAudioStreamingOptions=True
bContextMenuChunkAssignments=False
bDisableCookInEditor=False
+bSharedCookedBuilds=False
MultiProcessCooking=0
bEQSEditor=True
-bLiveStreamingFromEditor=False
-bFeatureLevelES31Preview=False
+bAllowLateJoinInPIE=False
+bAllowVulkanPreview=False
bEnableMultithreadedLightmapEncoding=False
bEnableMultithreadedShadowmapEncoding=False
+bUseOpenCLForConvexHullDecomp=False
+bAllowPotentiallyUnsafePropertyEditing=False
+bFacialAnimationImporter=False
+bClothingTools=True
+bEnableLiveRecompilationOfAnimationBlueprints=True
+bMobilePIEPreviewDeviceLaunch=False
+bAssetMaterialBaking=False
[/Script/SourceCodeAccess.SourceCodeAccessSettings]
PreferredAccessor=VisualStudio2017
diff --git a/Config/DefaultEditorUserSettings.ini b/Config/DefaultEditorUserSettings.ini
deleted file mode 100644
index 15fb13e..0000000
--- a/Config/DefaultEditorUserSettings.ini
+++ /dev/null
@@ -1,2 +0,0 @@
-[ContentBrowser]
-ContentBrowserTab1.SelectedPaths=/Game/ThirdPerson
\ No newline at end of file
diff --git a/Config/DefaultEngine.ini b/Config/DefaultEngine.ini
index dc1439b..dc8bea1 100644
--- a/Config/DefaultEngine.ini
+++ b/Config/DefaultEngine.ini
@@ -1,96 +1,85 @@
-[/Script/Engine.Engine]
-+ActiveGameNameRedirects=(OldGameName="TP_ThirdPerson",NewGameName="/Script/ActionRPGGame")
-+ActiveGameNameRedirects=(OldGameName="/Script/TP_ThirdPerson",NewGameName="/Script/ActionRPGGame")
-+ActiveClassRedirects=(OldClassName="TP_ThirdPersonGameMode",NewClassName="ActionRPGGameGameMode")
-+ActiveClassRedirects=(OldClassName="TP_ThirdPersonCharacter",NewClassName="ActionRPGGameCharacter")
+[/Script/IOSRuntimeSettings.IOSRuntimeSettings]
+MinimumiOSVersion=IOS_8
-+ActiveClassRedirects=(OldClassName="/Script/GameAbilities.GAGameEffectSpec", NewClassName="/Script/AbilityFramework.GAGameEffectSpec")
-+ActiveClassRedirects=(OldClassName="/Script/GameAbilitiesEditor.GAEK2Node_LatentAction", NewClassName="/Script/AbilityFrameworkEditor.GAEK2Node_LatentAction")
-
-
-+ActiveStructRedirects=(OldStructName="/Script/GameAbilities.GAEffectProperty", NewStructName="/Script/AbilityFramework.GAEffectProperty")
-+ActiveStructRedirects=(OldStructName="/Script/GameAbilities.GAEffectHandle", NewStructName="/Script/AbilityFramework.GAEffectHandle")
+[/Script/HardwareTargeting.HardwareTargetingSettings]
+TargetedHardwareClass=Desktop
+AppliedTargetedHardwareClass=Desktop
+DefaultGraphicsPerformance=Maximum
+AppliedDefaultGraphicsPerformance=Maximum
-GameEngine=/Script/ActionRPGGame.AREngine
-EditorEngine=/Script/ActionRPGGameEditor.AREditorEngine
-UnrealEdEngine=/Script/ActionRPGGameEditor.ARUnrealEdEngine
-bSmoothFrameRate=False
+[/Script/EngineSettings.GameMapsSettings]
+GlobalDefaultGameMode=/Game/Prototypes/ProtGameMode.ProtGameMode_C
+GameDefaultMap=/Game/Maps/MenuMap.MenuMap
+ServerDefaultMap=/Game/Maps/TestMap.TestMap
+EditorStartupMap=/Game/Maps/TestMap.TestMap
+GameInstanceClass=/Script/ActionRPGGame.ARGameInstance
+TransitionMap=/Game/Maps/TransitionMap.TransitionMap
[/Script/Engine.RendererSettings]
-r.MobileHDR=True
-r.AllowOcclusionQueries=True
-r.MinScreenRadiusForLights=0.030000
-r.MinScreenRadiusForDepthPrepass=0.030000
-r.PrecomputedVisibilityWarning=False
-r.TextureStreaming=True
-Compat.UseDXT5NormalMaps=False
r.AllowStaticLighting=False
-r.NormalMapsForStaticLighting=False
-r.GBuffer=True
r.GenerateMeshDistanceFields=True
-r.Shadow.DistanceFieldPenumbraSize=0.050000
-r.TessellationAdaptivePixelsPerTriangle=48.000000
-r.SeparateTranslucency=True
-r.TranslucentSortPolicy=0
-TranslucentSortAxis=(X=0.000000,Y=-1.000000,Z=0.000000)
-r.CustomDepth=1
-r.DefaultFeature.Bloom=True
-r.DefaultFeature.AmbientOcclusion=True
-r.DefaultFeature.AmbientOcclusionStaticFraction=True
-r.DefaultFeature.AutoExposure=True
-r.DefaultFeature.MotionBlur=True
-r.DefaultFeature.LensFlare=True
-r.DefaultFeature.AntiAliasing=2
-r.EarlyZPass=3
-r.EarlyZPassMovable=False
-r.DBuffer=False
-r.ClearSceneMethod=1
-r.WireframeCullThreshold=5.000000
-
-r.Shadow.CSM.MaxCascades=10
-r.Shadow.MaxResolution=2048
-UIScaleRule=ShortestSide
-UIScaleCurve=(EditorCurveData=(Keys=),ExternalCurve=None)
-r.BasePassOutputsVelocity=True
-r.ClearCoatNormal=True
-bDefaultParticleCutouts=True
-r.SkinCache.CompileShaders=False
+r.DistanceFieldBuild.EightBit=True
r.SupportStationarySkylight=False
r.SupportLowQualityLightmaps=False
+r.ClearCoatNormal=True
+r.DefaultFeature.LensFlare=True
+r.GenerateLandscapeGIData=True
+r.TemporalAA.Upsampling=False
+bDefaultParticleCutouts=True
+r.SupportMaterialLayers=True
+r.UsePreExposure=True
-[/Script/HardwareTargeting.HardwareTargetingSettings]
-TargetedHardwareClass=Desktop
-AppliedTargetedHardwareClass=Desktop
-DefaultGraphicsPerformance=Maximum
-AppliedDefaultGraphicsPerformance=Maximum
+[/Script/Engine.StreamingSettings]
+s.AsyncLoadingThreadEnabled=True
-[/Script/EngineSettings.GameMapsSettings]
-EditorStartupMap=/Game/Maps/TestLevel/TestLevel.TestLevel
-GameDefaultMap=/Game/Maps/TestLevel/TestLevel.TestLevel
-GlobalDefaultGameMode=/Game/ThirdPersonBP/Blueprints/ThirdPersonGameMode.ThirdPersonGameMode_C
-GlobalDefaultServerGameMode=/Game/ThirdPersonBP/Blueprints/ThirdPersonGameMode.ThirdPersonGameMode_C
-bUseSplitscreen=False
-ServerDefaultMap=/Game/Maps/TestLevel/TestLevel.TestLevel
-TransitionMap=/Game/Maps/TestLevel/TestLevel.TestLevel
+[/Script/Engine.UserInterfaceSettings]
+bLoadWidgetsOnDedicatedServer=False
+UIScaleRule=ShortestSide
+UIScaleCurve=(EditorCurveData=(PreInfinityExtrap=RCCE_Constant,PostInfinityExtrap=RCCE_Constant,DefaultValue=340282346638528859811704183484516925440.000000,Keys=((Time=395.331543,Value=0.450000),(Time=668.674805,Value=0.670000),(Time=870.085693,Value=1.000000),(Time=8640.000000,Value=8.000000))),ExternalCurve=None)
[/Script/AIModule.AISystem]
-bEnableBTAITasks=True
-bAllowStrafing=True
HotSpotManagerClassName=/Script/AIModule.AIHotSpotManager
-bAllowControllersAsEQSQuerier=True
+bAllowStrafing=True
+bEnableBTAITasks=True
+
+[PacketSimulationSettings]
+PktLag=250
+PktLagVariance=20
+PktLoss=10
+PktOrder=5
+PktDup=0
+
+[/Script/UnrealEd.HierarchicalLODSettings]
+bForceSettingsInAllMaps=False
+
+[/Script/Engine.ProxyLODMeshSimplificationSettings]
+r.ProxyLODMeshReductionModule=ProxyLODMeshReduction
+
+[/Script/Engine.NavigationSystemV1]
+bAutoCreateNavigationData=True
+bAllowClientSideNavigation=False
+bInitialBuildingLocked=False
+bSkipAgentHeightCheckWhenPickingNavData=False
+DataGatheringMode=Lazy
+bGenerateNavigationOnlyAroundNavigationInvokers=False
+ActiveTilesUpdateInterval=1.000000
++SupportedAgents=(Name="Default",Color=(B=0,G=255,R=140,A=164),DefaultQueryExtent=(X=50.000000,Y=50.000000,Z=250.000000),NavigationDataClassName=/Script/Engine.RecastNavMesh,AgentRadius=35.000000,AgentHeight=144.000000,AgentStepHeight=-1.000000,NavWalkingSearchHeightScale=0.500000,PreferredNavData=Class'"/Script/Engine.RecastNavMesh"',bCanCrouch=True,bCanJump=True,bCanWalk=True,bCanSwim=True,bCanFly=False)
+DirtyAreasUpdateFreq=60.000000
+
+[/Script/Engine.AnimationSettings]
+bTickAnimationOnSkeletalMeshInit=True
[/Script/Engine.GarbageCollectionSettings]
-gc.TimeBetweenPurgingPendingKillObjects=20.000000
+gc.TimeBetweenPurgingPendingKillObjects=30.000000
+gc.NumRetriesBeforeForcingGC=0
+gc.ActorClusteringEnabled=True
+gc.BlueprintClusteringEnabled=True
-[/Script/Engine.AutomationTestSettings]
-+EditorTestModules=GameAttributes
+[/Script/NoesisRuntime.NoesisSettings]
+GlyphTextureSize=x4096
[/Script/Engine.CollisionProfile]
--Profiles=(Name="Ragdoll",CollisionEnabled=QueryAndPhysics,ObjectTypeName="PhysicsBody",CustomResponses=((Channel="Pawn",Response=ECR_Ignore)),HelpMessage="Simulating Skeletal Mesh Component. All other channels will be set to default.",bCanModify=False)
--Profiles=(Name="Vehicle",CollisionEnabled=QueryAndPhysics,ObjectTypeName="Vehicle",CustomResponses=,HelpMessage="Vehicle object that blocks Vehicle, WorldStatic, and WorldDynamic. All other channels will be set to default.",bCanModify=False)
--Profiles=(Name="UI",CollisionEnabled=QueryOnly,ObjectTypeName="WorldDynamic",CustomResponses=((Channel="WorldStatic",Response=ECR_Overlap),(Channel="Pawn",Response=ECR_Overlap),(Channel="Visibility"),(Channel="WorldDynamic",Response=ECR_Overlap),(Channel="Camera",Response=ECR_Overlap),(Channel="PhysicsBody",Response=ECR_Overlap),(Channel="Vehicle",Response=ECR_Overlap),(Channel="Destructible",Response=ECR_Overlap)),HelpMessage="WorldStatic object that overlaps all actors by default. All new custom channels will use its own default response. ",bCanModify=False)
--Profiles=(Name="ProjectileBlock",CollisionEnabled=QueryOnly,ObjectTypeName="Projectile",CustomResponses=((Channel="Visibility",Response=ECR_Ignore),(Channel="Camera",Response=ECR_Ignore),(Channel="Projectile",Response=ECR_Overlap)),HelpMessage="Needs description",bCanModify=True)
-Profiles=(Name="NoCollision",CollisionEnabled=NoCollision,ObjectTypeName="WorldStatic",CustomResponses=((Channel="Visibility",Response=ECR_Ignore),(Channel="Camera",Response=ECR_Ignore)),HelpMessage="No collision",bCanModify=False)
-Profiles=(Name="BlockAll",CollisionEnabled=QueryAndPhysics,ObjectTypeName="WorldStatic",CustomResponses=,HelpMessage="WorldStatic object that blocks all actors by default. All new custom channels will use its own default response. ",bCanModify=False)
-Profiles=(Name="OverlapAll",CollisionEnabled=QueryOnly,ObjectTypeName="WorldStatic",CustomResponses=((Channel="WorldStatic",Response=ECR_Overlap),(Channel="Pawn",Response=ECR_Overlap),(Channel="Visibility",Response=ECR_Overlap),(Channel="WorldDynamic",Response=ECR_Overlap),(Channel="Camera",Response=ECR_Overlap),(Channel="PhysicsBody",Response=ECR_Overlap),(Channel="Vehicle",Response=ECR_Overlap),(Channel="Destructible",Response=ECR_Overlap)),HelpMessage="WorldStatic object that overlaps all actors by default. All new custom channels will use its own default response. ",bCanModify=False)
@@ -99,16 +88,16 @@ gc.TimeBetweenPurgingPendingKillObjects=20.000000
-Profiles=(Name="IgnoreOnlyPawn",CollisionEnabled=QueryOnly,ObjectTypeName="WorldDynamic",CustomResponses=((Channel="Pawn",Response=ECR_Ignore),(Channel="Vehicle",Response=ECR_Ignore)),HelpMessage="WorldDynamic object that ignores Pawn and Vehicle. All other channels will be set to default.",bCanModify=False)
-Profiles=(Name="OverlapOnlyPawn",CollisionEnabled=QueryOnly,ObjectTypeName="WorldDynamic",CustomResponses=((Channel="Pawn",Response=ECR_Overlap),(Channel="Vehicle",Response=ECR_Overlap),(Channel="Camera",Response=ECR_Ignore)),HelpMessage="WorldDynamic object that overlaps Pawn, Camera, and Vehicle. All other channels will be set to default. ",bCanModify=False)
-Profiles=(Name="Pawn",CollisionEnabled=QueryAndPhysics,ObjectTypeName="Pawn",CustomResponses=((Channel="Visibility",Response=ECR_Ignore)),HelpMessage="Pawn object. Can be used for capsule of any playerable character or AI. ",bCanModify=False)
--Profiles=(Name="Spectator",CollisionEnabled=QueryOnly,ObjectTypeName="Pawn",CustomResponses=((Channel="WorldStatic"),(Channel="Pawn",Response=ECR_Ignore),(Channel="Visibility",Response=ECR_Ignore),(Channel="WorldDynamic",Response=ECR_Ignore),(Channel="Camera",Response=ECR_Ignore),(Channel="PhysicsBody",Response=ECR_Ignore),(Channel="Vehicle",Response=ECR_Ignore),(Channel="Destructible",Response=ECR_Ignore)),HelpMessage="Pawn object that ignores all other actors except WorldStatic.",bCanModify=False)
+-Profiles=(Name="Spectator",CollisionEnabled=QueryOnly,ObjectTypeName="Pawn",CustomResponses=((Channel="WorldStatic",Response=ECR_Block),(Channel="Pawn",Response=ECR_Ignore),(Channel="Visibility",Response=ECR_Ignore),(Channel="WorldDynamic",Response=ECR_Ignore),(Channel="Camera",Response=ECR_Ignore),(Channel="PhysicsBody",Response=ECR_Ignore),(Channel="Vehicle",Response=ECR_Ignore),(Channel="Destructible",Response=ECR_Ignore)),HelpMessage="Pawn object that ignores all other actors except WorldStatic.",bCanModify=False)
-Profiles=(Name="CharacterMesh",CollisionEnabled=QueryOnly,ObjectTypeName="Pawn",CustomResponses=((Channel="Pawn",Response=ECR_Ignore),(Channel="Vehicle",Response=ECR_Ignore),(Channel="Visibility",Response=ECR_Ignore)),HelpMessage="Pawn object that is used for Character Mesh. All other channels will be set to default.",bCanModify=False)
-Profiles=(Name="PhysicsActor",CollisionEnabled=QueryAndPhysics,ObjectTypeName="PhysicsBody",CustomResponses=,HelpMessage="Simulating actors",bCanModify=False)
-Profiles=(Name="Destructible",CollisionEnabled=QueryAndPhysics,ObjectTypeName="Destructible",CustomResponses=,HelpMessage="Destructible actors",bCanModify=False)
-Profiles=(Name="InvisibleWall",CollisionEnabled=QueryAndPhysics,ObjectTypeName="WorldStatic",CustomResponses=((Channel="Visibility",Response=ECR_Ignore)),HelpMessage="WorldStatic object that is invisible.",bCanModify=False)
-Profiles=(Name="InvisibleWallDynamic",CollisionEnabled=QueryAndPhysics,ObjectTypeName="WorldDynamic",CustomResponses=((Channel="Visibility",Response=ECR_Ignore)),HelpMessage="WorldDynamic object that is invisible.",bCanModify=False)
-Profiles=(Name="Trigger",CollisionEnabled=QueryOnly,ObjectTypeName="WorldDynamic",CustomResponses=((Channel="WorldStatic",Response=ECR_Overlap),(Channel="Pawn",Response=ECR_Overlap),(Channel="Visibility",Response=ECR_Ignore),(Channel="WorldDynamic",Response=ECR_Overlap),(Channel="Camera",Response=ECR_Overlap),(Channel="PhysicsBody",Response=ECR_Overlap),(Channel="Vehicle",Response=ECR_Overlap),(Channel="Destructible",Response=ECR_Overlap)),HelpMessage="WorldDynamic object that is used for trigger. All other channels will be set to default.",bCanModify=False)
-+Profiles=(Name="Vehicle",CollisionEnabled=QueryAndPhysics,ObjectTypeName="Vehicle",CustomResponses=,HelpMessage="Vehicle object that blocks Vehicle, WorldStatic, and WorldDynamic. All other channels will be set to default.",bCanModify=False)
-+Profiles=(Name="UI",CollisionEnabled=QueryOnly,ObjectTypeName="WorldDynamic",CustomResponses=((Channel="WorldStatic",Response=ECR_Overlap),(Channel="Pawn",Response=ECR_Overlap),(Channel="Visibility"),(Channel="WorldDynamic",Response=ECR_Overlap),(Channel="Camera",Response=ECR_Overlap),(Channel="PhysicsBody",Response=ECR_Overlap),(Channel="Vehicle",Response=ECR_Overlap),(Channel="Destructible",Response=ECR_Overlap)),HelpMessage="WorldStatic object that overlaps all actors by default. All new custom channels will use its own default response. ",bCanModify=False)
-+Profiles=(Name="ProjectileBlock",CollisionEnabled=QueryOnly,ObjectTypeName="Projectile",CustomResponses=((Channel="Visibility",Response=ECR_Ignore),(Channel="Camera",Response=ECR_Ignore),(Channel="Projectile",Response=ECR_Overlap)),HelpMessage="Needs description",bCanModify=True)
+-Profiles=(Name="Ragdoll",CollisionEnabled=QueryAndPhysics,ObjectTypeName="PhysicsBody",CustomResponses=((Channel="Pawn",Response=ECR_Ignore),(Channel="Visibility",Response=ECR_Ignore)),HelpMessage="Simulating Skeletal Mesh Component. All other channels will be set to default.",bCanModify=False)
+-Profiles=(Name="Vehicle",CollisionEnabled=QueryAndPhysics,ObjectTypeName="Vehicle",CustomResponses=,HelpMessage="Vehicle object that blocks Vehicle, WorldStatic, and WorldDynamic. All other channels will be set to default.",bCanModify=False)
+-Profiles=(Name="UI",CollisionEnabled=QueryOnly,ObjectTypeName="WorldDynamic",CustomResponses=((Channel="WorldStatic",Response=ECR_Overlap),(Channel="Pawn",Response=ECR_Overlap),(Channel="Visibility",Response=ECR_Block),(Channel="WorldDynamic",Response=ECR_Overlap),(Channel="Camera",Response=ECR_Overlap),(Channel="PhysicsBody",Response=ECR_Overlap),(Channel="Vehicle",Response=ECR_Overlap),(Channel="Destructible",Response=ECR_Overlap)),HelpMessage="WorldStatic object that overlaps all actors by default. All new custom channels will use its own default response. ",bCanModify=False)
+Profiles=(Name="NoCollision",CollisionEnabled=NoCollision,ObjectTypeName="WorldStatic",CustomResponses=((Channel="Visibility",Response=ECR_Ignore),(Channel="Camera",Response=ECR_Ignore)),HelpMessage="No collision",bCanModify=False)
+Profiles=(Name="BlockAll",CollisionEnabled=QueryAndPhysics,ObjectTypeName="WorldStatic",CustomResponses=,HelpMessage="WorldStatic object that blocks all actors by default. All new custom channels will use its own default response. ",bCanModify=False)
+Profiles=(Name="OverlapAll",CollisionEnabled=QueryOnly,ObjectTypeName="WorldStatic",CustomResponses=((Channel="WorldStatic",Response=ECR_Overlap),(Channel="Pawn",Response=ECR_Overlap),(Channel="Visibility",Response=ECR_Overlap),(Channel="WorldDynamic",Response=ECR_Overlap),(Channel="Camera",Response=ECR_Overlap),(Channel="PhysicsBody",Response=ECR_Overlap),(Channel="Vehicle",Response=ECR_Overlap),(Channel="Destructible",Response=ECR_Overlap)),HelpMessage="WorldStatic object that overlaps all actors by default. All new custom channels will use its own default response. ",bCanModify=False)
@@ -124,25 +113,24 @@ gc.TimeBetweenPurgingPendingKillObjects=20.000000
+Profiles=(Name="InvisibleWall",CollisionEnabled=QueryAndPhysics,ObjectTypeName="WorldStatic",CustomResponses=((Channel="Visibility",Response=ECR_Ignore)),HelpMessage="WorldStatic object that is invisible.",bCanModify=False)
+Profiles=(Name="InvisibleWallDynamic",CollisionEnabled=QueryAndPhysics,ObjectTypeName="WorldDynamic",CustomResponses=((Channel="Visibility",Response=ECR_Ignore)),HelpMessage="WorldDynamic object that is invisible.",bCanModify=False)
+Profiles=(Name="Trigger",CollisionEnabled=QueryOnly,ObjectTypeName="WorldDynamic",CustomResponses=((Channel="WorldStatic",Response=ECR_Overlap),(Channel="Pawn",Response=ECR_Overlap),(Channel="Visibility",Response=ECR_Ignore),(Channel="WorldDynamic",Response=ECR_Overlap),(Channel="Camera",Response=ECR_Overlap),(Channel="PhysicsBody",Response=ECR_Overlap),(Channel="Vehicle",Response=ECR_Overlap),(Channel="Destructible",Response=ECR_Overlap)),HelpMessage="WorldDynamic object that is used for trigger. All other channels will be set to default.",bCanModify=False)
-+Profiles=(Name="Ragdoll",CollisionEnabled=QueryAndPhysics,ObjectTypeName="PhysicsBody",CustomResponses=((Channel="Pawn",Response=ECR_Ignore)),HelpMessage="Simulating Skeletal Mesh Component. All other channels will be set to default.",bCanModify=False)
--DefaultChannelResponses=(Channel=ECC_GameTraceChannel2,Name="EffectField",DefaultResponse=ECR_Overlap,bTraceType=False,bStaticObject=False)
--DefaultChannelResponses=(Channel=ECC_GameTraceChannel3,Name="PawnMesh",DefaultResponse=ECR_Ignore,bTraceType=False,bStaticObject=False)
--DefaultChannelResponses=(Channel=ECC_GameTraceChannel4,Name="Weapon",DefaultResponse=ECR_Ignore,bTraceType=True,bStaticObject=False)
--DefaultChannelResponses=(Channel=ECC_GameTraceChannel1,Name="Projectile",DefaultResponse=ECR_Block,bTraceType=False,bStaticObject=False)
-+DefaultChannelResponses=(Channel=ECC_GameTraceChannel1,Name="Projectile",DefaultResponse=ECR_Block,bTraceType=False,bStaticObject=False)
-+DefaultChannelResponses=(Channel=ECC_GameTraceChannel2,Name="EffectField",DefaultResponse=ECR_Overlap,bTraceType=False,bStaticObject=False)
-+DefaultChannelResponses=(Channel=ECC_GameTraceChannel3,Name="PawnMesh",DefaultResponse=ECR_Ignore,bTraceType=False,bStaticObject=False)
-+DefaultChannelResponses=(Channel=ECC_GameTraceChannel4,Name="Weapon",DefaultResponse=ECR_Ignore,bTraceType=True,bStaticObject=False)
++Profiles=(Name="Ragdoll",CollisionEnabled=QueryAndPhysics,ObjectTypeName="PhysicsBody",CustomResponses=((Channel="Pawn",Response=ECR_Ignore),(Channel="Visibility",Response=ECR_Ignore)),HelpMessage="Simulating Skeletal Mesh Component. All other channels will be set to default.",bCanModify=False)
++Profiles=(Name="Vehicle",CollisionEnabled=QueryAndPhysics,ObjectTypeName="Vehicle",CustomResponses=,HelpMessage="Vehicle object that blocks Vehicle, WorldStatic, and WorldDynamic. All other channels will be set to default.",bCanModify=False)
++Profiles=(Name="UI",CollisionEnabled=QueryOnly,ObjectTypeName="WorldDynamic",CustomResponses=((Channel="WorldStatic",Response=ECR_Overlap),(Channel="Pawn",Response=ECR_Overlap),(Channel="Visibility"),(Channel="WorldDynamic",Response=ECR_Overlap),(Channel="Camera",Response=ECR_Overlap),(Channel="PhysicsBody",Response=ECR_Overlap),(Channel="Vehicle",Response=ECR_Overlap),(Channel="Destructible",Response=ECR_Overlap)),HelpMessage="WorldStatic object that overlaps all actors by default. All new custom channels will use its own default response. ",bCanModify=False)
++DefaultChannelResponses=(Channel=ECC_GameTraceChannel1,Name="Enemy",DefaultResponse=ECR_Ignore,bTraceType=True,bStaticObject=False)
++DefaultChannelResponses=(Channel=ECC_GameTraceChannel2,Name="Pickup",DefaultResponse=ECR_Overlap,bTraceType=True,bStaticObject=False)
++DefaultChannelResponses=(Channel=ECC_GameTraceChannel3,Name="Weapon",DefaultResponse=ECR_Overlap,bTraceType=True,bStaticObject=False)
++DefaultChannelResponses=(Channel=ECC_GameTraceChannel4,Name="PikcupObject",DefaultResponse=ECR_Ignore,bTraceType=False,bStaticObject=False)
++EditProfiles=(Name="Pawn",CustomResponses=((Channel="Enemy",Response=ECR_Overlap)))
+-ProfileRedirects=(OldName="BlockingVolume",NewName="InvisibleWall")
-ProfileRedirects=(OldName="InterpActor",NewName="IgnoreOnlyPawn")
+-ProfileRedirects=(OldName="StaticMeshComponent",NewName="BlockAllDynamic")
-ProfileRedirects=(OldName="SkeletalMeshActor",NewName="PhysicsActor")
--ProfileRedirects=(OldName="BlockingVolume",NewName="InvisibleWall")
-ProfileRedirects=(OldName="InvisibleActor",NewName="InvisibleWallDynamic")
--ProfileRedirects=(OldName="StaticMeshComponent",NewName="BlockAllDynamic")
++ProfileRedirects=(OldName="BlockingVolume",NewName="InvisibleWall")
++ProfileRedirects=(OldName="InterpActor",NewName="IgnoreOnlyPawn")
+ProfileRedirects=(OldName="StaticMeshComponent",NewName="BlockAllDynamic")
+ProfileRedirects=(OldName="SkeletalMeshActor",NewName="PhysicsActor")
+ProfileRedirects=(OldName="InvisibleActor",NewName="InvisibleWallDynamic")
-+ProfileRedirects=(OldName="BlockingVolume",NewName="InvisibleWall")
-+ProfileRedirects=(OldName="InterpActor",NewName="IgnoreOnlyPawn")
-CollisionChannelRedirects=(OldName="Static",NewName="WorldStatic")
-CollisionChannelRedirects=(OldName="Dynamic",NewName="WorldDynamic")
-CollisionChannelRedirects=(OldName="VehicleMovement",NewName="Vehicle")
@@ -152,51 +140,21 @@ gc.TimeBetweenPurgingPendingKillObjects=20.000000
+CollisionChannelRedirects=(OldName="VehicleMovement",NewName="Vehicle")
+CollisionChannelRedirects=(OldName="PawnMovement",NewName="Pawn")
-[/Script/Engine.UserInterfaceSettings]
-RenderFocusRule=NavigationOnly
-DefaultCursor=None
-TextEditBeamCursor=None
-CrosshairsCursor=None
-HandCursor=None
-GrabHandCursor=None
-GrabHandClosedCursor=None
-SlashedCircleCursor=None
-ApplicationScale=1.000000
-UIScaleRule=ShortestSide
-CustomScalingRuleClass=None
-UIScaleCurve=(EditorCurveData=(PreInfinityExtrap=RCCE_Constant,PostInfinityExtrap=RCCE_Constant,Keys=((Time=480.000000,Value=0.444000),(Time=720.000000,Value=0.666000),(Time=1080.000000,Value=1.000000),(Time=8640.000000,Value=8.000000)),DefaultValue=340282346638528859811704183484516925440.000000),ExternalCurve=None)
-
-[/Script/UMGEditor.UMGEditorProjectSettings]
-bShowWidgetsFromEngineContent=True
-
-[/Script/Engine.StreamingSettings]
-s.AsyncLoadingThreadEnabled=True
-s.EventDrivenLoaderEnabled=True
-
-[Niagara]
-EnableNiagara=true
-
-[/Script/Engine.NavigationSystem]
-bAutoCreateNavigationData=True
-bAllowClientSideNavigation=False
-bInitialBuildingLocked=False
-bSkipAgentHeightCheckWhenPickingNavData=False
-DataGatheringMode=Instant
-bGenerateNavigationOnlyAroundNavigationInvokers=False
-ActiveTilesUpdateInterval=1.000000
-+SupportedAgents=(Name="Default",Color=(B=0,G=255,R=140,A=164),DefaultQueryExtent=(X=50.000000,Y=50.000000,Z=250.000000),NavigationDataClassName=/Script/Engine.RecastNavMesh,AgentRadius=35.000000,AgentHeight=144.000000,AgentStepHeight=-1.000000,NavWalkingSearchHeightScale=0.500000,PreferredNavData=None,bCanCrouch=False,bCanJump=False,bCanWalk=False,bCanSwim=False,bCanFly=False)
-DirtyAreasUpdateFreq=60.000000
-
-[/Script/Engine.MeshSimplificationSettings]
-r.MeshReductionModule=SimplygonMeshReduction
-
[/Script/WindowsTargetPlatform.WindowsTargetSettings]
-Compiler=VisualStudio2017
-
-[/Script/Niagara.NiagaraSettings]
-DefaultEffect=None
-DefaultEmitter=None
-DefaultScript=None
+Compiler=Default
+-TargetedRHIs=PCD3D_SM5
+-TargetedRHIs=PCD3D_SM4
++TargetedRHIs=PCD3D_SM5
+MinimumOSVersion=MSOS_Vista
+AudioDevice=
+AudioSampleRate=48000
+AudioCallbackBufferFrameSize=1024
+AudioNumBuffersToEnqueue=1
+AudioMaxChannels=0
+AudioNumSourceWorkers=4
+SpatializationPlugin=
+ReverbPlugin=
+OcclusionPlugin=
[/Script/Engine.PhysicsSettings]
DefaultGravityZ=-980.000000
@@ -207,10 +165,11 @@ RagdollAggregateThreshold=4
TriangleMeshTriangleMinAreaThreshold=5.000000
bEnableAsyncScene=True
bEnableShapeSharing=True
-bEnablePCM=False
-bEnableStabilization=False
+bEnablePCM=True
+bEnableStabilization=True
bWarnMissingLocks=True
bEnable2DPhysics=False
+PhysicErrorCorrection=(PingExtrapolation=0.100000,ErrorPerLinearDifference=1.000000,ErrorPerAngularDifference=1.000000,MaxRestoredStateError=1.000000,PositionLerp=0.000000,AngleLerp=0.400000,LinearVelocityCoefficient=100.000000,AngularVelocityCoefficient=10.000000,ErrorAccumulationSeconds=0.500000,ErrorAccumulationDistanceSq=15.000000,ErrorAccumulationSimilarity=100.000000)
LockedAxis=Invalid
DefaultDegreesOfFreedom=Full3D
BounceThresholdVelocity=200.000000
@@ -218,23 +177,29 @@ FrictionCombineMode=Average
RestitutionCombineMode=Average
MaxAngularVelocity=3600.000000
MaxDepenetrationVelocity=0.000000
-ContactOffsetMultiplier=0.010000
-MinContactOffset=0.000100
-MaxContactOffset=1.000000
+ContactOffsetMultiplier=0.020000
+MinContactOffset=2.000000
+MaxContactOffset=8.000000
bSimulateSkeletalMeshOnDedicatedServer=True
DefaultShapeComplexity=CTF_UseSimpleAndComplex
bDefaultHasComplexCollision=True
bSuppressFaceRemapTable=False
bSupportUVFromHitResults=False
bDisableActiveActors=False
+bDisableKinematicStaticPairs=False
+bDisableKinematicKinematicPairs=False
bDisableCCD=False
-bEnableEnhancedDeterminism=False
+bEnableEnhancedDeterminism=True
MaxPhysicsDeltaTime=0.033333
-bSubstepping=False
-bSubsteppingAsync=False
-MaxSubstepDeltaTime=0.016667
-MaxSubsteps=6
+bSubstepping=True
+bSubsteppingAsync=True
+MaxSubstepDeltaTime=0.033000
+MaxSubsteps=2
SyncSceneSmoothingFactor=0.000000
AsyncSceneSmoothingFactor=0.990000
InitialAverageFrameRate=0.016667
PhysXTreeRebuildRate=10
+ClientBroadphaseSettings=(bUseMBP=False,MBPBounds=(Min=(X=0.000000,Y=0.000000,Z=0.000000),Max=(X=0.000000,Y=0.000000,Z=0.000000),IsValid=0),MBPNumSubdivs=2)
+ServerBroadphaseSettings=(bUseMBP=False,MBPBounds=(Min=(X=0.000000,Y=0.000000,Z=0.000000),Max=(X=0.000000,Y=0.000000,Z=0.000000),IsValid=0),MBPNumSubdivs=2)
+
+
diff --git a/Config/DefaultGame.ini b/Config/DefaultGame.ini
index 7b3a394..6c6fd12 100644
--- a/Config/DefaultGame.ini
+++ b/Config/DefaultGame.ini
@@ -1,63 +1,58 @@
-[StartupActions]
-bAddPacks=True
-InsertPack=(PackSource="StarterContent.upack",PackName="StarterContent")
-
[/Script/EngineSettings.GeneralProjectSettings]
-CompanyName=
-CopyrightNotice=Fill out your copyright notice in the Description page of Project Settings.
-Description=
-Homepage=
-LicensingTerms=
-PrivacyPolicy=
-ProjectID=4EF791F14E9D23C40368B18C5D926129
-ProjectName=
-ProjectVersion=
-SupportContact=
-ProjectDisplayedTitle=
+ProjectID=53E63CC7411F280A64FAD489EBFD3E33
+ProjectName=Third Person Game Template
-[/Script/Engine.AssetManagerSettings]
--PrimaryAssetTypesToScan=(PrimaryAssetType="Map",AssetBaseClass=/Script/Engine.World,bHasBlueprintClasses=False,bIsEditorOnly=True,Directories=((Path="/Game/Maps")),SpecificAssets=,Rules=(Priority=-1,bApplyRecursively=True,ChunkId=-1,CookRule=Unknown))
--PrimaryAssetTypesToScan=(PrimaryAssetType="Map",AssetBaseClass=/Script/Engine.World,bHasBlueprintClasses=False,bIsEditorOnly=True,Directories=((Path="/Game/Maps")),SpecificAssets=,Rules=(Priority=-1,bApplyRecursively=True,ChunkId=-1,CookRule=Unknown))
--PrimaryAssetTypesToScan=(PrimaryAssetType="Level",AssetBaseClass=/Script/Engine.Level,bHasBlueprintClasses=False,bIsEditorOnly=True,Directories=((Path="Maps")),SpecificAssets=,Rules=(Priority=-1,bApplyRecursively=True,ChunkId=-1,CookRule=AlwaysCook))
-+PrimaryAssetTypesToScan=(PrimaryAssetType="Map",AssetBaseClass=/Script/Engine.World,bHasBlueprintClasses=False,bIsEditorOnly=True,Directories=((Path="/Game/Maps")),SpecificAssets=,Rules=(Priority=-1,bApplyRecursively=True,ChunkId=-1,CookRule=Unknown))
-+PrimaryAssetTypesToScan=(PrimaryAssetType="Map",AssetBaseClass=/Script/Engine.World,bHasBlueprintClasses=False,bIsEditorOnly=True,Directories=((Path="/Game/Maps")),SpecificAssets=,Rules=(Priority=-1,bApplyRecursively=True,ChunkId=-1,CookRule=Unknown))
-bOnlyCookProductionAssets=False
+[/Script/AbilityFramework.AFCueManager]
+DefaultCueSet=/Game/Prototypes/ProtCueSet.ProtCueSet
[/Script/UnrealEd.ProjectPackagingSettings]
-BuildConfiguration=PPBC_Shipping
-StagingDirectory=(Path="")
+Build=IfProjectHasCode
+BuildConfiguration=PPBC_Development
+StagingDirectory=(Path="D:/Unreal/UE-Master/ActionRPGGame/Saved/StagedBuilds")
FullRebuild=False
ForDistribution=False
-IncludeDebugFiles=True
+IncludeDebugFiles=False
BlueprintNativizationMethod=Disabled
-bWarnIfPackagedWithoutNativizationFlag=True
+bIncludeNativizedAssetsInProjectGeneration=False
+bExcludeMonolithicEngineHeadersInNativizedCode=False
UsePakFile=True
-bGenerateChunks=False
+bGenerateChunks=True
bGenerateNoChunks=False
bChunkHardReferencesOnly=False
bBuildHttpChunkInstallData=False
HttpChunkInstallDataDirectory=(Path="")
HttpChunkInstallDataVersion=
IncludePrerequisites=True
-IncludeAppLocalPrerequisites=False
+IncludeAppLocalPrerequisites=True
bShareMaterialShaderCode=False
bSharedMaterialNativeLibraries=False
-ApplocalPrerequisitesDirectory=(Path="")
-IncludeCrashReporter=True
+ApplocalPrerequisitesDirectory=(Path="$(EngineDir)/Binaries/ThirdParty/AppLocalDependencies")
+IncludeCrashReporter=False
InternationalizationPreset=English
-CulturesToStage=en
+CulturesToStage=en
-DefaultCulture=en
bCookAll=False
bCookMapsOnly=False
bCompressed=False
bEncryptIniFiles=False
bEncryptPakIndex=False
bSkipEditorContent=False
--DirectoriesToAlwaysCook=(Path="")
-+DirectoriesToAlwaysCook=(Path="Prototypes")
+bSkipMovies=False
bNativizeBlueprintAssets=False
bNativizeOnlySelectedBlueprints=False
-[/Script/AbilityFramework.AFCueManager]
-DefaultCueSet=/Game/Prototypes/TestCueSet.TestCueSet
+[/Script/Engine.AssetManagerSettings]
+-PrimaryAssetTypesToScan=(PrimaryAssetType="Map",AssetBaseClass=/Script/Engine.World,bHasBlueprintClasses=False,bIsEditorOnly=True,Directories=((Path="/Game/Maps")))
+-PrimaryAssetTypesToScan=(PrimaryAssetType="PrimaryAssetLabel",AssetBaseClass=/Script/Engine.PrimaryAssetLabel,bHasBlueprintClasses=False,bIsEditorOnly=True,Directories=((Path="/Game")))
++PrimaryAssetTypesToScan=(PrimaryAssetType="Map",AssetBaseClass=/Script/Engine.World,bHasBlueprintClasses=False,bIsEditorOnly=True,Directories=((Path="/Game/Maps")),SpecificAssets=,Rules=(Priority=-1,bApplyRecursively=True,ChunkId=-1,CookRule=Unknown))
++PrimaryAssetTypesToScan=(PrimaryAssetType="PrimaryAssetLabel",AssetBaseClass=/Script/Engine.PrimaryAssetLabel,bHasBlueprintClasses=False,bIsEditorOnly=True,Directories=((Path="/Game")),SpecificAssets=,Rules=(Priority=-1,bApplyRecursively=True,ChunkId=-1,CookRule=Unknown))
++PrimaryAssetTypesToScan=(PrimaryAssetType="Ability",AssetBaseClass=/Script/AbilityFramework.GAAbilityBase,bHasBlueprintClasses=True,bIsEditorOnly=False,Directories=((Path="/Game")),SpecificAssets=,Rules=(Priority=1,bApplyRecursively=True,ChunkId=-1,CookRule=AlwaysCook))
++PrimaryAssetTypesToScan=(PrimaryAssetType="ActorCue",AssetBaseClass=/Script/AbilityFramework.AFCueActor,bHasBlueprintClasses=True,bIsEditorOnly=False,Directories=((Path="/Game")),SpecificAssets=,Rules=(Priority=1,bApplyRecursively=True,ChunkId=-1,CookRule=AlwaysCook))
++PrimaryAssetTypesToScan=(PrimaryAssetType="StaticCue",AssetBaseClass=/Script/AbilityFramework.AFCueStatic,bHasBlueprintClasses=True,bIsEditorOnly=False,Directories=((Path="/Game")),SpecificAssets=,Rules=(Priority=-1,bApplyRecursively=True,ChunkId=-1,CookRule=AlwaysCook))
+bOnlyCookProductionAssets=False
+bShouldManagerDetermineTypeAndName=False
+bShouldGuessTypeAndNameInEditor=True
+bShouldAcquireMissingChunksOnLoad=False
+MetaDataTagsForAssetRegistry=()
+
+
diff --git a/Config/DefaultGameplayTags.ini b/Config/DefaultGameplayTags.ini
index 96fcac8..17e90cc 100644
--- a/Config/DefaultGameplayTags.ini
+++ b/Config/DefaultGameplayTags.ini
@@ -5,108 +5,57 @@ WarnOnInvalidTags=True
FastReplication=False
NumBitsForContainerSize=6
NetIndexFirstBitSegment=16
--GameplayTagList=(Tag="Ability.Blizzard",DevComment="")
--GameplayTagList=(Tag="Ability.Fireball",DevComment="")
--GameplayTagList=(Tag="Ability.Fireball.Activation",DevComment="")
--GameplayTagList=(Tag="Ability.Fireblast",DevComment="")
--GameplayTagList=(Tag="Ability.ForstBolt",DevComment="")
--GameplayTagList=(Tag="Ability.MachineGun.Damage",DevComment="")
--GameplayTagList=(Tag="Ability.TestAbility",DevComment="")
--GameplayTagList=(Tag="Action01",DevComment="")
--GameplayTagList=(Tag="Attribute.Health",DevComment="")
--GameplayTagList=(Tag="Binding.MouseLeftAction",DevComment="")
--GameplayTagList=(Tag="Binding.MouseRightAction",DevComment="")
--GameplayTagList=(Tag="Buff",DevComment="")
--GameplayTagList=(Tag="Condition",DevComment="")
--GameplayTagList=(Tag="Condition.Burning",DevComment="")
--GameplayTagList=(Tag="Damage.Acid",DevComment="")
--GameplayTagList=(Tag="Damage.Basic",DevComment="")
--GameplayTagList=(Tag="Damage.Buff",DevComment="")
--GameplayTagList=(Tag="Damage.Buffable",DevComment="")
--GameplayTagList=(Tag="Damage.Buffed.FireBuff",DevComment="")
--GameplayTagList=(Tag="Damage.Darkness",DevComment="")
--GameplayTagList=(Tag="Damage.Earth",DevComment="")
--GameplayTagList=(Tag="Damage.Electricity",DevComment="")
--GameplayTagList=(Tag="Damage.Fire",DevComment="")
--GameplayTagList=(Tag="Damage.Ice",DevComment="")
--GameplayTagList=(Tag="Damage.Mitigated.Armor",DevComment="")
--GameplayTagList=(Tag="Damage.Necrotic",DevComment="")
--GameplayTagList=(Tag="Damage.Physical",DevComment="")
--GameplayTagList=(Tag="Damage.Radiant",DevComment="")
--GameplayTagList=(Tag="Damage.Reduce",DevComment="")
--GameplayTagList=(Tag="Damage.Spell",DevComment="")
--GameplayTagList=(Tag="Damage.Type1",DevComment="")
--GameplayTagList=(Tag="Damage.Type2",DevComment="")
--GameplayTagList=(Tag="Damage.Water",DevComment="")
--GameplayTagList=(Tag="Enchantment",DevComment="")
--GameplayTagList=(Tag="GameplayCue.Burning",DevComment="")
--GameplayTagList=(Tag="GameplayCue.Test.X",DevComment="")
--GameplayTagList=(Tag="Hex",DevComment="")
--GameplayTagList=(Tag="Immune",DevComment="")
--GameplayTagList=(Tag="Immune.Fire",DevComment="")
--GameplayTagList=(Tag="Immune.Ice",DevComment="")
--GameplayTagList=(Tag="Item.Rune",DevComment="")
--GameplayTagList=(Tag="Lifesteal",DevComment="")
--GameplayTagList=(Tag="Perk.Ability.Fireball.Damage",DevComment="")
--GameplayTagList=(Tag="Protect.Damage",DevComment="")
--GameplayTagList=(Tag="Shield",DevComment="")
--GameplayTagList=(Tag="ShieldAbsorb",DevComment="")
--GameplayTagList=(Tag="Spell",DevComment="")
--GameplayTagList=(Tag="Stack",DevComment="")
--GameplayTagList=(Tag="Stack.CappedNumber",DevComment="")
--GameplayTagList=(Tag="Stack.DiminishingReturns",DevComment="")
--GameplayTagList=(Tag="Stackable",DevComment="")
-+GameplayTagList=(Tag="Ability.Blizzard",DevComment="")
-+GameplayTagList=(Tag="Ability.Fireball",DevComment="")
-+GameplayTagList=(Tag="Ability.Fireball.Activation",DevComment="")
-+GameplayTagList=(Tag="Ability.Fireblast",DevComment="")
-+GameplayTagList=(Tag="Ability.ForstBolt",DevComment="")
-+GameplayTagList=(Tag="Ability.MachineGun.Damage",DevComment="")
-+GameplayTagList=(Tag="Ability.TestAbility",DevComment="")
-+GameplayTagList=(Tag="Action01",DevComment="")
-+GameplayTagList=(Tag="Attribute.Health",DevComment="")
-+GameplayTagList=(Tag="Binding.MouseLeftAction",DevComment="")
-+GameplayTagList=(Tag="Binding.MouseRightAction",DevComment="")
-+GameplayTagList=(Tag="Buff",DevComment="")
-+GameplayTagList=(Tag="Condition",DevComment="")
-+GameplayTagList=(Tag="Condition.Burning",DevComment="")
-+GameplayTagList=(Tag="Damage.Acid",DevComment="")
-+GameplayTagList=(Tag="Damage.Basic",DevComment="")
-+GameplayTagList=(Tag="Damage.Buff",DevComment="")
-+GameplayTagList=(Tag="Damage.Buffable",DevComment="")
-+GameplayTagList=(Tag="Damage.Buffed.FireBuff",DevComment="")
-+GameplayTagList=(Tag="Damage.Darkness",DevComment="")
-+GameplayTagList=(Tag="Damage.Earth",DevComment="")
-+GameplayTagList=(Tag="Damage.Electricity",DevComment="")
++GameplayTagList=(Tag="Ability.AbilityCooldow01.Cooldown",DevComment="")
++GameplayTagList=(Tag="Ability.AbilityCooldown02.Cooldown",DevComment="")
++GameplayTagList=(Tag="Ability.Corruption",DevComment="")
++GameplayTagList=(Tag="Ability.Corruption.Cooldown",DevComment="")
++GameplayTagList=(Tag="Ability.DurationInstance",DevComment="")
++GameplayTagList=(Tag="Ability.EffectInstance",DevComment="")
++GameplayTagList=(Tag="Ability.EffectInstance.Damage",DevComment="")
++GameplayTagList=(Tag="Ability.Input.GolsterWeapon",DevComment="")
++GameplayTagList=(Tag="Ability.Input.HolsterWeapon",DevComment="")
++GameplayTagList=(Tag="Ability.Input.Jump",DevComment="")
++GameplayTagList=(Tag="Ability.Input.NextWeapon",DevComment="")
++GameplayTagList=(Tag="Ability.Input.PreviousWeapon",DevComment="")
++GameplayTagList=(Tag="Ability.Input.SetAbilityGroup01",DevComment="")
++GameplayTagList=(Tag="Ability.Input.SetAbilityGroup02",DevComment="")
++GameplayTagList=(Tag="Ability.Input.SwitchAbilities",DevComment="")
++GameplayTagList=(Tag="Ability.Rifle",DevComment="")
++GameplayTagList=(Tag="Ability.Rifle.Activate",DevComment="")
++GameplayTagList=(Tag="Ability.Rifle.Ammo",DevComment="")
++GameplayTagList=(Tag="Ability.Rifle.Damage",DevComment="")
++GameplayTagList=(Tag="Ability.Rifle.Reload",DevComment="")
++GameplayTagList=(Tag="Ability.Rifle.Shoot",DevComment="")
++GameplayTagList=(Tag="Ability.Shotgun",DevComment="")
++GameplayTagList=(Tag="Ability.UI.NextWeapon",DevComment="")
++GameplayTagList=(Tag="Ability.UI.PreviousWeapon",DevComment="")
++GameplayTagList=(Tag="Action.Shooting",DevComment="")
++GameplayTagList=(Tag="AI.HaveAxe",DevComment="")
++GameplayTagList=(Tag="AI.HaveOre",DevComment="")
++GameplayTagList=(Tag="AI.HavePick",DevComment="")
++GameplayTagList=(Tag="AI.HaveWood",DevComment="")
++GameplayTagList=(Tag="AI.WoodCollected",DevComment="")
++GameplayTagList=(Tag="Cue.Ability.Shoot",DevComment="")
++GameplayTagList=(Tag="Damage",DevComment="")
++GameplayTagList=(Tag="Damage.Damage",DevComment="")
+GameplayTagList=(Tag="Damage.Fire",DevComment="")
-+GameplayTagList=(Tag="Damage.Ice",DevComment="")
-+GameplayTagList=(Tag="Damage.Mitigated.Armor",DevComment="")
-+GameplayTagList=(Tag="Damage.Necrotic",DevComment="")
-+GameplayTagList=(Tag="Damage.Physical",DevComment="")
-+GameplayTagList=(Tag="Damage.Radiant",DevComment="")
-+GameplayTagList=(Tag="Damage.Reduce",DevComment="")
-+GameplayTagList=(Tag="Damage.Spell",DevComment="")
-+GameplayTagList=(Tag="Damage.Type1",DevComment="")
-+GameplayTagList=(Tag="Damage.Type2",DevComment="")
-+GameplayTagList=(Tag="Damage.Water",DevComment="")
-+GameplayTagList=(Tag="Enchantment",DevComment="")
-+GameplayTagList=(Tag="Event.Damage",DevComment="")
-+GameplayTagList=(Tag="GameplayCue.Burning",DevComment="")
-+GameplayTagList=(Tag="GameplayCue.Test.X",DevComment="")
-+GameplayTagList=(Tag="Hex",DevComment="")
-+GameplayTagList=(Tag="Immune",DevComment="")
-+GameplayTagList=(Tag="Immune.Fire",DevComment="")
-+GameplayTagList=(Tag="Immune.Ice",DevComment="")
-+GameplayTagList=(Tag="Item.Rune",DevComment="")
-+GameplayTagList=(Tag="Lifesteal",DevComment="")
-+GameplayTagList=(Tag="Perk.Ability.Fireball.Damage",DevComment="")
-+GameplayTagList=(Tag="Protect.Damage",DevComment="")
-+GameplayTagList=(Tag="Shield",DevComment="")
-+GameplayTagList=(Tag="ShieldAbsorb",DevComment="")
-+GameplayTagList=(Tag="Spell",DevComment="")
-+GameplayTagList=(Tag="Stack",DevComment="")
-+GameplayTagList=(Tag="Stack.CappedNumber",DevComment="")
-+GameplayTagList=(Tag="Stack.DiminishingReturns",DevComment="")
-+GameplayTagList=(Tag="Stackable",DevComment="")
++GameplayTagList=(Tag="Effect.InstancedDuration",DevComment="")
++GameplayTagList=(Tag="EffectEvent.Expired.InstancedDuration",DevComment="")
++GameplayTagList=(Tag="Event.Executed.Damage.Fire",DevComment="")
++GameplayTagList=(Tag="Event.Executed.Shoot.AssaultRifle",DevComment="")
++GameplayTagList=(Tag="Fire",DevComment="")
++GameplayTagList=(Tag="Input.Ability01.Activate",DevComment="")
++GameplayTagList=(Tag="Input.Ability02",DevComment="")
++GameplayTagList=(Tag="Input.Ability02.Activate",DevComment="")
++GameplayTagList=(Tag="Input.Ability03",DevComment="")
++GameplayTagList=(Tag="Input.Ability03.Activate",DevComment="")
++GameplayTagList=(Tag="Input.Gun.Reload",DevComment="")
++GameplayTagList=(Tag="Input.Gun.Shoot",DevComment="")
++GameplayTagList=(Tag="Input.UI.Holster",DevComment="")
++GameplayTagList=(Tag="Input.UI.SetAbilityGroup01",DevComment="")
++GameplayTagList=(Tag="Input.UI.SetAbilityGroup02",DevComment="")
++GameplayTagList=(Tag="Input.UI.WeaponNext",DevComment="")
++GameplayTagList=(Tag="Input.UI.WeaponPrevious",DevComment="")
++GameplayTagList=(Tag="Item.Weapon.AssaultRifle",DevComment="")
diff --git a/Config/DefaultInput.ini b/Config/DefaultInput.ini
index 1bcd62d..8dd4a35 100644
--- a/Config/DefaultInput.ini
+++ b/Config/DefaultInput.ini
@@ -1,26 +1,17 @@
[/Script/Engine.InputSettings]
--AxisConfig=(AxisKeyName="MotionController_Right_Thumbstick_Y",AxisProperties=(DeadZone=0.000000,Sensitivity=1.000000,Exponent=1.000000,bInvert=False))
--AxisConfig=(AxisKeyName="MotionController_Right_TriggerAxis",AxisProperties=(DeadZone=0.000000,Sensitivity=1.000000,Exponent=1.000000,bInvert=False))
--AxisConfig=(AxisKeyName="MotionController_Right_Grip1Axis",AxisProperties=(DeadZone=0.000000,Sensitivity=1.000000,Exponent=1.000000,bInvert=False))
--AxisConfig=(AxisKeyName="MotionController_Right_Grip2Axis",AxisProperties=(DeadZone=0.000000,Sensitivity=1.000000,Exponent=1.000000,bInvert=False))
--AxisConfig=(AxisKeyName="Gamepad_Special_Left_X",AxisProperties=(DeadZone=0.000000,Sensitivity=1.000000,Exponent=1.000000,bInvert=False))
--AxisConfig=(AxisKeyName="Gamepad_Special_Left_Y",AxisProperties=(DeadZone=0.000000,Sensitivity=1.000000,Exponent=1.000000,bInvert=False))
--AxisConfig=(AxisKeyName="Gamepad_LeftX",AxisProperties=(DeadZone=0.250000,Sensitivity=1.000000,Exponent=1.000000,bInvert=False))
--AxisConfig=(AxisKeyName="Gamepad_LeftY",AxisProperties=(DeadZone=0.250000,Sensitivity=1.000000,Exponent=1.000000,bInvert=False))
--AxisConfig=(AxisKeyName="Gamepad_RightX",AxisProperties=(DeadZone=0.250000,Sensitivity=1.000000,Exponent=1.000000,bInvert=False))
--AxisConfig=(AxisKeyName="Gamepad_RightY",AxisProperties=(DeadZone=0.250000,Sensitivity=1.000000,Exponent=1.000000,bInvert=False))
--AxisConfig=(AxisKeyName="MouseX",AxisProperties=(DeadZone=0.000000,Sensitivity=0.070000,Exponent=1.000000,bInvert=False))
--AxisConfig=(AxisKeyName="MouseY",AxisProperties=(DeadZone=0.000000,Sensitivity=0.070000,Exponent=1.000000,bInvert=False))
--AxisConfig=(AxisKeyName="MouseWheelAxis",AxisProperties=(DeadZone=0.000000,Sensitivity=1.000000,Exponent=1.000000,bInvert=False))
--AxisConfig=(AxisKeyName="Gamepad_LeftTriggerAxis",AxisProperties=(DeadZone=0.000000,Sensitivity=1.000000,Exponent=1.000000,bInvert=False))
--AxisConfig=(AxisKeyName="Gamepad_RightTriggerAxis",AxisProperties=(DeadZone=0.000000,Sensitivity=1.000000,Exponent=1.000000,bInvert=False))
--AxisConfig=(AxisKeyName="MotionController_Left_Thumbstick_X",AxisProperties=(DeadZone=0.000000,Sensitivity=1.000000,Exponent=1.000000,bInvert=False))
--AxisConfig=(AxisKeyName="MotionController_Left_Thumbstick_Y",AxisProperties=(DeadZone=0.000000,Sensitivity=1.000000,Exponent=1.000000,bInvert=False))
--AxisConfig=(AxisKeyName="MotionController_Left_TriggerAxis",AxisProperties=(DeadZone=0.000000,Sensitivity=1.000000,Exponent=1.000000,bInvert=False))
--AxisConfig=(AxisKeyName="MotionController_Left_Grip1Axis",AxisProperties=(DeadZone=0.000000,Sensitivity=1.000000,Exponent=1.000000,bInvert=False))
--AxisConfig=(AxisKeyName="MotionController_Left_Grip2Axis",AxisProperties=(DeadZone=0.000000,Sensitivity=1.000000,Exponent=1.000000,bInvert=False))
--AxisConfig=(AxisKeyName="MotionController_Right_Thumbstick_X",AxisProperties=(DeadZone=0.000000,Sensitivity=1.000000,Exponent=1.000000,bInvert=False))
+-AxisConfig=(AxisKeyName="Gamepad_LeftX",AxisProperties=(DeadZone=0.25,Exponent=1.f,Sensitivity=1.f))
+-AxisConfig=(AxisKeyName="Gamepad_LeftY",AxisProperties=(DeadZone=0.25,Exponent=1.f,Sensitivity=1.f))
+-AxisConfig=(AxisKeyName="Gamepad_RightX",AxisProperties=(DeadZone=0.25,Exponent=1.f,Sensitivity=1.f))
+-AxisConfig=(AxisKeyName="Gamepad_RightY",AxisProperties=(DeadZone=0.25,Exponent=1.f,Sensitivity=1.f))
+-AxisConfig=(AxisKeyName="MouseX",AxisProperties=(DeadZone=0.f,Exponent=1.f,Sensitivity=0.07f))
+-AxisConfig=(AxisKeyName="MouseY",AxisProperties=(DeadZone=0.f,Exponent=1.f,Sensitivity=0.07f))
++AxisConfig=(AxisKeyName="MotionController_Left_Thumbstick_X",AxisProperties=(DeadZone=0.000000,Sensitivity=1.000000,Exponent=1.000000,bInvert=False))
++AxisConfig=(AxisKeyName="MotionController_Left_Thumbstick_Y",AxisProperties=(DeadZone=0.000000,Sensitivity=1.000000,Exponent=1.000000,bInvert=False))
++AxisConfig=(AxisKeyName="MotionController_Left_TriggerAxis",AxisProperties=(DeadZone=0.000000,Sensitivity=1.000000,Exponent=1.000000,bInvert=False))
++AxisConfig=(AxisKeyName="MotionController_Left_Grip1Axis",AxisProperties=(DeadZone=0.000000,Sensitivity=1.000000,Exponent=1.000000,bInvert=False))
++AxisConfig=(AxisKeyName="MotionController_Left_Grip2Axis",AxisProperties=(DeadZone=0.000000,Sensitivity=1.000000,Exponent=1.000000,bInvert=False))
++AxisConfig=(AxisKeyName="MotionController_Right_Thumbstick_X",AxisProperties=(DeadZone=0.000000,Sensitivity=1.000000,Exponent=1.000000,bInvert=False))
+AxisConfig=(AxisKeyName="MotionController_Right_Thumbstick_Y",AxisProperties=(DeadZone=0.000000,Sensitivity=1.000000,Exponent=1.000000,bInvert=False))
+AxisConfig=(AxisKeyName="MotionController_Right_TriggerAxis",AxisProperties=(DeadZone=0.000000,Sensitivity=1.000000,Exponent=1.000000,bInvert=False))
+AxisConfig=(AxisKeyName="MotionController_Right_Grip1Axis",AxisProperties=(DeadZone=0.000000,Sensitivity=1.000000,Exponent=1.000000,bInvert=False))
@@ -36,75 +27,49 @@
+AxisConfig=(AxisKeyName="MouseWheelAxis",AxisProperties=(DeadZone=0.000000,Sensitivity=1.000000,Exponent=1.000000,bInvert=False))
+AxisConfig=(AxisKeyName="Gamepad_LeftTriggerAxis",AxisProperties=(DeadZone=0.000000,Sensitivity=1.000000,Exponent=1.000000,bInvert=False))
+AxisConfig=(AxisKeyName="Gamepad_RightTriggerAxis",AxisProperties=(DeadZone=0.000000,Sensitivity=1.000000,Exponent=1.000000,bInvert=False))
-+AxisConfig=(AxisKeyName="MotionController_Left_Thumbstick_X",AxisProperties=(DeadZone=0.000000,Sensitivity=1.000000,Exponent=1.000000,bInvert=False))
-+AxisConfig=(AxisKeyName="MotionController_Left_Thumbstick_Y",AxisProperties=(DeadZone=0.000000,Sensitivity=1.000000,Exponent=1.000000,bInvert=False))
-+AxisConfig=(AxisKeyName="MotionController_Left_TriggerAxis",AxisProperties=(DeadZone=0.000000,Sensitivity=1.000000,Exponent=1.000000,bInvert=False))
-+AxisConfig=(AxisKeyName="MotionController_Left_Grip1Axis",AxisProperties=(DeadZone=0.000000,Sensitivity=1.000000,Exponent=1.000000,bInvert=False))
-+AxisConfig=(AxisKeyName="MotionController_Left_Grip2Axis",AxisProperties=(DeadZone=0.000000,Sensitivity=1.000000,Exponent=1.000000,bInvert=False))
-+AxisConfig=(AxisKeyName="MotionController_Right_Thumbstick_X",AxisProperties=(DeadZone=0.000000,Sensitivity=1.000000,Exponent=1.000000,bInvert=False))
bAltEnterTogglesFullscreen=True
bF11TogglesFullscreen=True
bUseMouseForTouch=False
-bEnableMouseSmoothing=False
+bEnableMouseSmoothing=True
bEnableFOVScaling=True
-FOVScale=0.011110
-DoubleClickTime=0.200000
bCaptureMouseOnLaunch=True
-DefaultViewportMouseCaptureMode=CapturePermanently_IncludingInitialMouseDown
bDefaultViewportMouseLock=False
-DefaultViewportMouseLockMode=LockOnCapture
--ActionMappings=(ActionName="Jump",Key=SpaceBar,bShift=False,bCtrl=False,bAlt=False,bCmd=False)
--ActionMappings=(ActionName="Jump",Key=Gamepad_FaceButton_Bottom,bShift=False,bCtrl=False,bAlt=False,bCmd=False)
--ActionMappings=(ActionName="Action01",Key=One,bShift=False,bCtrl=False,bAlt=False,bCmd=False)
--ActionMappings=(ActionName="Action02",Key=Two,bShift=False,bCtrl=False,bAlt=False,bCmd=False)
--ActionMappings=(ActionName="Action03",Key=Three,bShift=False,bCtrl=False,bAlt=False,bCmd=False)
--ActionMappings=(ActionName="Action04",Key=Four,bShift=False,bCtrl=False,bAlt=False,bCmd=False)
--ActionMappings=(ActionName="Action05",Key=Five,bShift=False,bCtrl=False,bAlt=False,bCmd=False)
--ActionMappings=(ActionName="Action06",Key=Six,bShift=False,bCtrl=False,bAlt=False,bCmd=False)
--ActionMappings=(ActionName="Action07",Key=Seven,bShift=False,bCtrl=False,bAlt=False,bCmd=False)
--ActionMappings=(ActionName="Binding.MouseLeftAction",Key=LeftMouseButton,bShift=False,bCtrl=False,bAlt=False,bCmd=False)
--ActionMappings=(ActionName="Bind.MouseRightAction",Key=RightMouseButton,bShift=False,bCtrl=False,bAlt=False,bCmd=False)
-+ActionMappings=(ActionName="Jump",Key=SpaceBar,bShift=False,bCtrl=False,bAlt=False,bCmd=False)
-+ActionMappings=(ActionName="Jump",Key=Gamepad_FaceButton_Bottom,bShift=False,bCtrl=False,bAlt=False,bCmd=False)
-+ActionMappings=(ActionName="Action01",Key=One,bShift=False,bCtrl=False,bAlt=False,bCmd=False)
-+ActionMappings=(ActionName="Action02",Key=Two,bShift=False,bCtrl=False,bAlt=False,bCmd=False)
-+ActionMappings=(ActionName="Action03",Key=Three,bShift=False,bCtrl=False,bAlt=False,bCmd=False)
-+ActionMappings=(ActionName="Action04",Key=Four,bShift=False,bCtrl=False,bAlt=False,bCmd=False)
-+ActionMappings=(ActionName="Action05",Key=Five,bShift=False,bCtrl=False,bAlt=False,bCmd=False)
-+ActionMappings=(ActionName="Action06",Key=Six,bShift=False,bCtrl=False,bAlt=False,bCmd=False)
-+ActionMappings=(ActionName="Action07",Key=Seven,bShift=False,bCtrl=False,bAlt=False,bCmd=False)
-+ActionMappings=(ActionName="Binding.MouseLeftAction",Key=LeftMouseButton,bShift=False,bCtrl=False,bAlt=False,bCmd=False)
-+ActionMappings=(ActionName="Binding.MouseRightAction",Key=RightMouseButton,bShift=False,bCtrl=False,bAlt=False,bCmd=False)
--AxisMappings=(AxisName="MoveForward",Key=W,Scale=1.000000)
--AxisMappings=(AxisName="MoveForward",Key=S,Scale=-0.750000)
--AxisMappings=(AxisName="MoveForward",Key=Up,Scale=1.000000)
--AxisMappings=(AxisName="MoveForward",Key=Down,Scale=-1.000000)
--AxisMappings=(AxisName="MoveForward",Key=Gamepad_LeftY,Scale=1.000000)
--AxisMappings=(AxisName="MoveRight",Key=A,Scale=-1.000000)
--AxisMappings=(AxisName="MoveRight",Key=D,Scale=1.000000)
--AxisMappings=(AxisName="MoveRight",Key=Gamepad_LeftX,Scale=1.000000)
--AxisMappings=(AxisName="TurnRate",Key=Gamepad_RightX,Scale=1.000000)
--AxisMappings=(AxisName="TurnRate",Key=Left,Scale=-1.000000)
--AxisMappings=(AxisName="TurnRate",Key=Right,Scale=1.000000)
--AxisMappings=(AxisName="Turn",Key=MouseX,Scale=1.000000)
--AxisMappings=(AxisName="LookUpRate",Key=Gamepad_RightY,Scale=1.000000)
--AxisMappings=(AxisName="LookUp",Key=MouseY,Scale=-1.000000)
-+AxisMappings=(AxisName="MoveForward",Key=W,Scale=1.000000)
-+AxisMappings=(AxisName="MoveForward",Key=S,Scale=-0.750000)
-+AxisMappings=(AxisName="MoveForward",Key=Up,Scale=1.000000)
-+AxisMappings=(AxisName="MoveForward",Key=Down,Scale=-1.000000)
-+AxisMappings=(AxisName="MoveForward",Key=Gamepad_LeftY,Scale=1.000000)
-+AxisMappings=(AxisName="MoveRight",Key=A,Scale=-1.000000)
-+AxisMappings=(AxisName="MoveRight",Key=D,Scale=1.000000)
-+AxisMappings=(AxisName="MoveRight",Key=Gamepad_LeftX,Scale=1.000000)
-+AxisMappings=(AxisName="TurnRate",Key=Gamepad_RightX,Scale=1.000000)
-+AxisMappings=(AxisName="TurnRate",Key=Left,Scale=-1.000000)
-+AxisMappings=(AxisName="TurnRate",Key=Right,Scale=1.000000)
-+AxisMappings=(AxisName="Turn",Key=MouseX,Scale=1.000000)
-+AxisMappings=(AxisName="LookUpRate",Key=Gamepad_RightY,Scale=1.000000)
-+AxisMappings=(AxisName="LookUp",Key=MouseY,Scale=-1.000000)
bAlwaysShowTouchInterface=False
bShowConsoleOnFourFingerTap=True
+bEnableGestureRecognizer=False
+bUseAutocorrect=False
+DefaultViewportMouseCaptureMode=CapturePermanently_IncludingInitialMouseDown
+DefaultViewportMouseLockMode=LockOnCapture
+FOVScale=0.011110
+DoubleClickTime=0.200000
++ActionMappings=(ActionName="Jump",bShift=False,bCtrl=False,bAlt=False,bCmd=False,Key=SpaceBar)
++ActionMappings=(ActionName="Jump",bShift=False,bCtrl=False,bAlt=False,bCmd=False,Key=Gamepad_FaceButton_Bottom)
++ActionMappings=(ActionName="Shoot",bShift=False,bCtrl=False,bAlt=False,bCmd=False,Key=LeftMouseButton)
++ActionMappings=(ActionName="Reload",bShift=False,bCtrl=False,bAlt=False,bCmd=False,Key=R)
++ActionMappings=(ActionName="SwitchAbilitySet",bShift=False,bCtrl=False,bAlt=False,bCmd=False,Key=B)
++ActionMappings=(ActionName="InputAbilityManager",bShift=False,bCtrl=False,bAlt=False,bCmd=False,Key=K)
++ActionMappings=(ActionName="NextWeapon",bShift=False,bCtrl=False,bAlt=False,bCmd=False,Key=MouseScrollUp)
++ActionMappings=(ActionName="Input.UI.WeaponPrevious",bShift=False,bCtrl=False,bAlt=False,bCmd=False,Key=MouseScrollDown)
++ActionMappings=(ActionName="InputInventory",bShift=False,bCtrl=False,bAlt=False,bCmd=False,Key=I)
++ActionMappings=(ActionName="Input.UI.Holster",bShift=False,bCtrl=False,bAlt=False,bCmd=False,Key=O)
++ActionMappings=(ActionName="Ability01",bShift=False,bCtrl=False,bAlt=False,bCmd=False,Key=One)
++ActionMappings=(ActionName="Ability02",bShift=False,bCtrl=False,bAlt=False,bCmd=False,Key=Two)
++ActionMappings=(ActionName="Ability03",bShift=False,bCtrl=False,bAlt=False,bCmd=False,Key=Three)
++ActionMappings=(ActionName="Ability04",bShift=False,bCtrl=False,bAlt=False,bCmd=False,Key=Four)
++AxisMappings=(AxisName="MoveForward",Scale=1.000000,Key=W)
++AxisMappings=(AxisName="MoveForward",Scale=-1.000000,Key=S)
++AxisMappings=(AxisName="MoveForward",Scale=1.000000,Key=Up)
++AxisMappings=(AxisName="MoveForward",Scale=-1.000000,Key=Down)
++AxisMappings=(AxisName="MoveForward",Scale=1.000000,Key=Gamepad_LeftY)
++AxisMappings=(AxisName="MoveRight",Scale=-1.000000,Key=A)
++AxisMappings=(AxisName="MoveRight",Scale=1.000000,Key=D)
++AxisMappings=(AxisName="MoveRight",Scale=1.000000,Key=Gamepad_LeftX)
++AxisMappings=(AxisName="TurnRate",Scale=1.000000,Key=Gamepad_RightX)
++AxisMappings=(AxisName="TurnRate",Scale=-1.000000,Key=Left)
++AxisMappings=(AxisName="TurnRate",Scale=1.000000,Key=Right)
++AxisMappings=(AxisName="Turn",Scale=1.000000,Key=MouseX)
++AxisMappings=(AxisName="LookUpRate",Scale=1.000000,Key=Gamepad_RightY)
++AxisMappings=(AxisName="LookUp",Scale=-1.000000,Key=MouseY)
DefaultTouchInterface=/Engine/MobileResources/HUD/DefaultVirtualJoysticks.DefaultVirtualJoysticks
ConsoleKey=None
-ConsoleKeys=Tilde
diff --git a/Content/Blueprints/Test_CameraManager.uasset b/Content/Blueprints/Test_CameraManager.uasset
new file mode 100644
index 0000000..4695021
Binary files /dev/null and b/Content/Blueprints/Test_CameraManager.uasset differ
diff --git a/Plugins/AbilityFramework/AbilityFramework.uplugin b/Plugins/AbilityFramework/AbilityFramework.uplugin
new file mode 100644
index 0000000..49c5851
--- /dev/null
+++ b/Plugins/AbilityFramework/AbilityFramework.uplugin
@@ -0,0 +1,34 @@
+{
+ "FileVersion": 3,
+ "Version": 1,
+ "VersionName": "1.0",
+ "FriendlyName": "AbilityFramework",
+ "Description": "",
+ "Category": "Gameplay",
+ "CreatedBy": "",
+ "CreatedByURL": "",
+ "DocsURL": "",
+ "MarketplaceURL": "",
+ "SupportURL": "",
+ "CanContainContent": true,
+ "IsBetaVersion": true,
+ "Installed": true,
+ "Modules": [
+ {
+ "Name": "AbilityFramework",
+ "Type": "Runtime",
+ "LoadingPhase": "Default"
+ },
+ {
+ "Name": "AbilityFrameworkEditor",
+ "Type": "Editor",
+ "LoadingPhase": "PostEngineInit"
+ }
+ ],
+ "Plugins": [
+ {
+ "Name": "ActorSequence",
+ "Enabled": true
+ }
+ ]
+}
\ No newline at end of file
diff --git a/Plugins/AbilityFramework/Source/AbilityFramework/AbilityFramework.Build.cs b/Plugins/AbilityFramework/Source/AbilityFramework/AbilityFramework.Build.cs
new file mode 100644
index 0000000..3230335
--- /dev/null
+++ b/Plugins/AbilityFramework/Source/AbilityFramework/AbilityFramework.Build.cs
@@ -0,0 +1,56 @@
+// Copyright 1998-2014 Epic Games, Inc. All Rights Reserved.
+
+namespace UnrealBuildTool.Rules
+{
+ public class AbilityFramework : ModuleRules
+ {
+ public AbilityFramework(ReadOnlyTargetRules Target) : base(Target)
+ {
+ PrivateIncludePaths.AddRange(
+ new string[] {
+ // ... add other private include paths required here ...
+ }
+ );
+
+ PublicDependencyModuleNames.AddRange(
+ new string[]
+ {
+ "Core",
+ "CoreUObject",
+ "Engine",
+ "GameplayTags",
+ "InputCore",
+ "UMG",
+ "Slate",
+ "SlateCore",
+ "AIModule",
+ "MovieScene",
+ "MovieSceneTracks",
+ "AssetRegistry"
+ // ... add other public dependencies that you statically link with here ...
+ }
+ );
+
+ PrivateDependencyModuleNames.AddRange(
+ new string[]
+ {
+ "ActorSequence",
+ "TimeManagement"
+ // ... add private dependencies that you statically link with here ...
+ }
+ );
+
+ DynamicallyLoadedModuleNames.AddRange(
+ new string[]
+ {
+
+ // ... add any modules that your module loads dynamically here ...
+ }
+ );
+ if (Target.Type == TargetRules.TargetType.Editor)
+ {
+ PublicDependencyModuleNames.AddRange(new string[] { "UnrealEd", "PropertyEditor" });
+ }
+ }
+ }
+}
\ No newline at end of file
diff --git a/Plugins/AbilityFramework/Source/AbilityFramework/Private/AFAbilityComponent.cpp b/Plugins/AbilityFramework/Source/AbilityFramework/Private/AFAbilityComponent.cpp
new file mode 100644
index 0000000..2b1665d
--- /dev/null
+++ b/Plugins/AbilityFramework/Source/AbilityFramework/Private/AFAbilityComponent.cpp
@@ -0,0 +1,526 @@
+// Copyright 1998-2014 Epic Games, Inc. All Rights Reserved.
+
+#include "AbilityFramework.h"
+
+#include "Abilities/GAAbilityBase.h"
+#include "Abilities/Tasks/GAAbilityTask.h"
+#include "IAbilityFramework.h"
+
+#include "Net/UnrealNetwork.h"
+#include "Engine/ActorChannel.h"
+#include "Animation/AnimInstance.h"
+#include "Animation/AnimMontage.h"
+#include "Attributes/GAAttributesBase.h"
+#include "AFAbilityInterface.h"
+#include "Effects/GAEffectExecution.h"
+#include "Effects/GAGameEffect.h"
+
+#include "Effects/GAEffectExtension.h"
+#include "Effects/AFCueActor.h"
+#include "AFCueManager.h"
+#include "Effects/GABlueprintLibrary.h"
+#include "Async.h"
+
+#include "AFAbilityComponent.h"
+#include "AFEffectsComponent.h"
+#include "AFAbilityInterface.h"
+
+DEFINE_STAT(STAT_ApplyEffect);
+DEFINE_STAT(STAT_ModifyAttribute);
+
+
+
+void FAFReplicatedAttributeItem::PreReplicatedRemove(const struct FAFReplicatedAttributeContainer& InArraySerializer)
+{
+ FAFReplicatedAttributeContainer& ArraySerializer = const_cast(InArraySerializer);
+ ArraySerializer.AttributeMap.Remove(AttributeTag);
+}
+void FAFReplicatedAttributeItem::PostReplicatedAdd(const struct FAFReplicatedAttributeContainer& InArraySerializer)
+{
+ FAFReplicatedAttributeContainer& ArraySerializer = const_cast(InArraySerializer);
+ UGAAttributesBase*& Attribute = ArraySerializer.AttributeMap.FindOrAdd(AttributeTag);
+ Attribute = Attributes;
+ InArraySerializer.OnAttributeReplicated(AttributeTag, Attributes);
+}
+void FAFReplicatedAttributeItem::PostReplicatedChange(const struct FAFReplicatedAttributeContainer& InArraySerializer)
+{
+
+}
+UGAAttributesBase* FAFReplicatedAttributeContainer::Add(const FGameplayTag InTag, UGAAttributesBase* InAttributes, class UAFAbilityComponent* InOuter)
+{
+ UGAAttributesBase* AttributesDup = DuplicateObject(InAttributes, InOuter);
+ FAFReplicatedAttributeItem Item;
+ Item.AttributeTag = InTag;
+ Item.Attributes = AttributesDup;
+ Attributes.Add(Item);
+ MarkItemDirty(Item);
+ UGAAttributesBase*& Added = AttributeMap.FindOrAdd(InTag);
+ Added = AttributesDup;
+ OnAttributeReplicated(InTag, AttributesDup);
+ return AttributesDup;
+}
+UAFAbilityComponent::UAFAbilityComponent(const FObjectInitializer& ObjectInitializer)
+ : Super(ObjectInitializer)
+{
+ bWantsInitializeComponent = true;
+ bIsAnyAbilityActive = false;
+ bAutoActivate = true;
+ bAutoRegister = true;
+ PrimaryComponentTick.bCanEverTick = true;
+ PrimaryComponentTick.bStartWithTickEnabled = true;
+ PrimaryComponentTick.bRunOnAnyThread = false;
+ PrimaryComponentTick.bAllowTickOnDedicatedServer = true;
+ PrimaryComponentTick.TickGroup = ETickingGroup::TG_DuringPhysics;
+}
+
+void UAFAbilityComponent::BroadcastAttributeChange(const FGAAttribute& InAttribute,
+ const FAFAttributeChangedData& InData)
+{
+ FAFAttributeChangedDelegate* Delegate = AttributeChanged.Find(InAttribute);
+ if (Delegate)
+ {
+ Delegate->Broadcast(InData);
+ }
+}
+
+void UAFAbilityComponent::ModifyAttribute(FGAEffectMod& ModIn
+ , const FGAEffectHandle& HandleIn
+ , FGAEffectProperty& InProperty
+ , const FGAEffectContext& InContext)
+{
+ //OnAttributePreModifed.Broadcast(ModIn, 0);
+ //Add log.
+ if (!DefaultAttributes)
+ {
+ return;
+ }
+ float NewValue = DefaultAttributes->ModifyAttribute(ModIn, HandleIn, InProperty, InContext);
+ FAFAttributeChangedData Data;
+ Data.Mod = ModIn;
+ Data.Target = InContext.Target;
+ Data.Location = InContext.HitResult.Location;
+ OnAttributeModifed.Broadcast(Data);
+ InContext.InstigatorComp->NotifyInstigatorTargetAttributeChanged(Data, InContext);
+ //add default replication (PropertyRep) that attribute changed.
+};
+void UAFAbilityComponent::NotifyInstigatorTargetAttributeChanged(const FAFAttributeChangedData& InData,
+ const FGAEffectContext& InContext)
+{
+ ENetMode NM = GetOwner()->GetNetMode();
+
+ switch (NM)
+ {
+ case NM_Standalone:
+ ClientNotifyAttributeModifier(InData);
+ break;
+ case NM_DedicatedServer:
+ ServerOnTargetAttributeModifed.Broadcast(InData);
+ ClientNotifyAttributeModifier(InData);
+ break;
+ case NM_ListenServer:
+ ServerOnTargetAttributeModifed.Broadcast(InData);
+ ClientNotifyAttributeModifier(InData);
+ break;
+ case NM_Client:
+ ClientNotifyAttributeModifier(InData);
+ break;
+ case NM_MAX:
+ break;
+ default:
+ break;
+ }
+}
+void UAFAbilityComponent::ClientNotifyAttributeModifier_Implementation(const FAFAttributeChangedData& InData)
+{
+ OnTargetAttributeModifed.Broadcast(InData);
+}
+void UAFAbilityComponent::GetAttributeStructTest(FGAAttribute Name)
+{
+ DefaultAttributes->GetAttribute(Name);
+}
+
+void UAFAbilityComponent::OnRep_GameEffectContainer()
+{
+ float test = 0;
+}
+void UAFAbilityComponent::TickComponent(float DeltaTime, enum ELevelTick TickType, FActorComponentTickFunction* ThisTickFunction)
+{
+ UActorComponent::TickComponent(DeltaTime, TickType, ThisTickFunction);
+ if (DefaultAttributes)
+ {
+ DefaultAttributes->Tick(DeltaTime);
+ }
+}
+
+void UAFAbilityComponent::BeginPlay()
+{
+ Super::BeginPlay();
+ //FAFEffectTimerManager::Get();
+}
+void UAFAbilityComponent::EndPlay(const EEndPlayReason::Type EndPlayReason)
+{
+ Super::EndPlay(EndPlayReason);
+
+}
+void UAFAbilityComponent::DestroyComponent(bool bPromoteChildren)
+{
+ Super::DestroyComponent(bPromoteChildren);
+
+}
+
+void UAFAbilityComponent::OnAttributeModified(const FGAEffectMod& InMod,
+ const FGAEffectHandle& InHandle, UGAAttributesBase* InAttributeSet)
+{
+
+}
+
+void UAFAbilityComponent::GetLifetimeReplicatedProps(TArray< class FLifetimeProperty > & OutLifetimeProps) const
+{
+ Super::GetLifetimeReplicatedProps(OutLifetimeProps);
+ //possibly replicate it to everyone
+ //to allow prediction for UI.
+ DOREPLIFETIME(UAFAbilityComponent, DefaultAttributes);
+ DOREPLIFETIME(UAFAbilityComponent, RepAttributes);
+
+ DOREPLIFETIME(UAFAbilityComponent, ActiveCues);
+ DOREPLIFETIME_CONDITION(UAFAbilityComponent, AbilityContainer, COND_OwnerOnly);
+ DOREPLIFETIME_CONDITION(UAFAbilityComponent, RepMontage, COND_SkipOwner);
+}
+void UAFAbilityComponent::OnRep_ActiveEffects()
+{
+
+}
+void UAFAbilityComponent::OnRep_ActiveCues()
+{
+
+}
+
+bool UAFAbilityComponent::ReplicateSubobjects(class UActorChannel *Channel, class FOutBunch *Bunch, FReplicationFlags *RepFlags)
+{
+ bool WroteSomething = Super::ReplicateSubobjects(Channel, Bunch, RepFlags);
+
+ if (DefaultAttributes)
+ {
+ WroteSomething |= Channel->ReplicateSubobject(const_cast(DefaultAttributes), *Bunch, *RepFlags);
+ }
+ for (const FAFAbilitySpec& Ability : AbilityContainer.ActivatableAbilities)
+ {
+ //if (Set.InputOverride)
+ // WroteSomething |= Channel->ReplicateSubobject(const_cast(Set.InputOverride), *Bunch, *RepFlags);
+
+ if (Ability.Ability)
+ WroteSomething |= Channel->ReplicateSubobject(const_cast(Ability.Ability), *Bunch, *RepFlags);
+ }
+
+ for (const FAFReplicatedAttributeItem& Attribute : RepAttributes.Attributes)
+ {
+ //if (Set.InputOverride)
+ // WroteSomething |= Channel->ReplicateSubobject(const_cast(Set.InputOverride), *Bunch, *RepFlags);
+
+ if (Attribute.Attributes)
+ WroteSomething |= Channel->ReplicateSubobject(const_cast(Attribute.Attributes), *Bunch, *RepFlags);
+ }
+
+ return WroteSomething;
+}
+void UAFAbilityComponent::GetSubobjectsWithStableNamesForNetworking(TArray& Objs)
+{
+ if (DefaultAttributes && DefaultAttributes->IsNameStableForNetworking())
+ {
+ Objs.Add(const_cast(DefaultAttributes));
+ }
+}
+
+void UAFAbilityComponent::GetOwnedGameplayTags(FGameplayTagContainer& TagContainer) const
+{
+ if (IAFAbilityInterface* ABInterface = Cast(GetOwner()))
+ {
+ TagContainer = ABInterface->NativeGetEffectsComponent()->AppliedTags.AllTags;
+ }
+}
+
+
+
+void UAFAbilityComponent::InitializeComponent()
+{
+ Super::InitializeComponent();
+ //PawnInterface = Cast(GetOwner());
+ UInputComponent* InputComponent = GetOwner()->FindComponentByClass();
+ AbilityContainer.AbilitiesComp = this;
+ //EffectTimerManager = MakeShareable(new FAFEffectTimerManager());
+
+ //EffectTimerManager.InitThread();
+ if (DefaultAttributes)
+ {
+ DefaultAttributes->InitializeAttributes(this);
+ DefaultAttributes->InitializeAttributesFromTable();
+ }
+ ActiveCues.OwningComp = this;
+ //ActiveCues.OwningComponent = this;
+ AppliedTags.AddTagContainer(DefaultTags);
+ InitializeInstancedAbilities();
+
+ AActor* MyOwner = GetOwner();
+ if (!MyOwner || !MyOwner->IsTemplate())
+ {
+ ULevel* ComponentLevel = (MyOwner ? MyOwner->GetLevel() : GetWorld()->PersistentLevel);
+ }
+}
+void UAFAbilityComponent::UninitializeComponent()
+{
+ Super::UninitializeComponent();
+ //EffectTimerManager.Deinitialize();
+ //EffectTimerManager.Reset();
+ //GameEffectContainer
+}
+void UAFAbilityComponent::BindInputs(class UInputComponent* InputComponent, FString BindEnum)
+{
+ UEnum* bindEnum = FindObject(ANY_PACKAGE, *BindEnum);
+ if (!bindEnum)
+ return;
+
+ int32 num = bindEnum->NumEnums();
+
+ for (uint8 Idx = 0; Idx < num; Idx++)
+ {
+ FString Name = bindEnum->GetNameStringByIndex(Idx);
+ {
+ FInputActionBinding AB(FName(*Name), IE_Pressed);
+ AB.ActionDelegate.GetDelegateForManualSet().BindUObject(this, &UAFAbilityComponent::NativeInputPressed, Idx);
+ InputComponent->AddActionBinding(AB);
+ }
+
+ // Released event
+ {
+ FInputActionBinding AB(FName(*Name), IE_Released);
+ AB.ActionDelegate.GetDelegateForManualSet().BindUObject(this, &UAFAbilityComponent::NativeInputReleased, Idx);
+ InputComponent->AddActionBinding(AB);
+ }
+ }
+}
+
+void UAFAbilityComponent::SetBlockedInput(const FGameplayTag& InActionName, bool bBlock)
+{
+}
+
+
+
+TSoftClassPtr UAFAbilityComponent::IsAbilityBoundToAction(const TSoftClassPtr& InAbilityPtr, const TArray& InInputTag)
+{
+ return TSoftClassPtr();
+}
+
+
+void UAFAbilityComponent::BindAbilityToInputIDs(const FAFAbilitySpecHandle Handle, TArray InputIDs)
+{
+ AbilityContainer.BindAbilityToInputIDs(Handle, InputIDs);
+ ENetRole role = GetOwnerRole();
+ if (GetOwner()->GetNetMode() == ENetMode::NM_Client
+ && role == ENetRole::ROLE_AutonomousProxy)
+ {
+ /*for (int32 Idx = 0; Idx < InAbilitiesActions.Num(); Idx++)
+ {
+ if (InputDelegate[Idx].IsBound())
+ {
+ AddOnAbilityInputReadyDelegate(InAbilitiesActions[Idx].AbilityTag, InputDelegate[Idx]);
+ }
+ }*/
+
+ ServerBindAbilityToInputIDs(Handle, InputIDs);
+ }
+}
+
+void UAFAbilityComponent::ServerBindAbilityToInputIDs_Implementation(const FAFAbilitySpecHandle Handle, const TArray& InputIDs)
+{
+ AbilityContainer.BindAbilityToInputIDs(Handle, InputIDs);
+}
+bool UAFAbilityComponent::ServerBindAbilityToInputIDs_Validate(const FAFAbilitySpecHandle Handle, const TArray& InputIDs)
+{
+ return true;
+}
+
+void UAFAbilityComponent::NativeInputPressed(uint8 InputID)
+{
+ FAFPredictionHandle PredHandle;
+ if (GetOwner()->GetNetMode() == ENetMode::NM_Client)
+ {
+ PredHandle = FAFPredictionHandle::GenerateClientHandle(this);
+ AbilityContainer.HandleInputPressed(InputID, PredHandle);
+ }
+ ServerNativeInputPressed(InputID, PredHandle);
+}
+
+void UAFAbilityComponent::ServerNativeInputPressed_Implementation(uint8 InputID, FAFPredictionHandle InPredictionHandle)
+{
+ AbilityContainer.HandleInputPressed(InputID, InPredictionHandle);
+}
+bool UAFAbilityComponent::ServerNativeInputPressed_Validate(uint8 InputID, FAFPredictionHandle InPredictionHandle)
+{
+ return true;
+}
+
+void UAFAbilityComponent::NativeInputReleased(uint8 InputID)
+{
+ if (GetOwner()->GetNetMode() == ENetMode::NM_Client)
+ {
+ AbilityContainer.HandleInputReleased(InputID);
+ }
+ ServerNativeInputReleased(InputID);
+}
+
+void UAFAbilityComponent::ServerNativeInputReleased_Implementation(uint8 InputID)
+{
+ AbilityContainer.HandleInputReleased(InputID);
+}
+bool UAFAbilityComponent::ServerNativeInputReleased_Validate(uint8 InputID)
+{
+ return true;
+}
+
+void UAFAbilityComponent::BP_AddAbility(TSoftClassPtr InAbility,
+ TArray InInputTag)
+{
+}
+
+void UAFAbilityComponent::NativeAddAbility(TSoftClassPtr InAbility, const FAFAbilitySpecHandle ClientHandle)
+{
+ if (GetOwnerRole() < ENetRole::ROLE_Authority)
+ {
+ ServerNativeAddAbility(InAbility.ToSoftObjectPath(), ClientHandle);
+ }
+}
+
+void UAFAbilityComponent::NativeAddAbilityFromObject(UGAAbilityBase* InAbility, const FAFAbilitySpecHandle ClientHandle)
+{
+
+}
+
+void UAFAbilityComponent::ServerNativeAddAbility_Implementation(const FSoftObjectPath& InAbility, const FAFAbilitySpecHandle& ClientHandle)
+{
+ FAFAbilitySpecHandle ServerHandle = FAFAbilitySpecHandle::GenerateHandle();
+
+ if (UAssetManager* Manager = UAssetManager::GetIfValid())
+ {
+ FAssetRegistryModule& AssetRegistryModule = FModuleManager::LoadModuleChecked("AssetRegistry");
+ IAssetRegistry& AssetRegistry = AssetRegistryModule.Get();
+ FStreamableManager& StreamManager = UAssetManager::GetStreamableManager();
+ {
+ TSoftClassPtr Ab(InAbility);
+ FStreamableDelegate del = FStreamableDelegate::CreateUObject(this, &UAFAbilityComponent::OnFinishedLoad, Ab, ServerHandle, ClientHandle);
+
+ StreamManager.RequestAsyncLoad(InAbility
+ , del);
+ }
+ }
+}
+
+bool UAFAbilityComponent::ServerNativeAddAbility_Validate(const FSoftObjectPath& InAbility, const FAFAbilitySpecHandle& ClientHandle)
+{
+ return true;
+}
+void UAFAbilityComponent::OnFinishedLoad(TSoftClassPtr InAbility, const FAFAbilitySpecHandle Handle, const FAFAbilitySpecHandle ClientHandle)
+{
+ if (GetOwnerRole() < ENetRole::ROLE_Authority)
+ {
+ return;
+ }
+ FStreamableManager& Manager = UAssetManager::GetStreamableManager();
+
+ TSubclassOf cls = InAbility.Get();
+ if (cls)
+ {
+ UGAAbilityBase* ability = AbilityContainer.AddAbility(cls, Handle, ClientHandle);
+ AbilityContainer.MarkArrayDirty();
+ }
+
+ {
+ Manager.Unload(InAbility.ToSoftObjectPath());
+ }
+}
+
+void UAFAbilityComponent::BP_RemoveAbility(TSoftClassPtr TagIn)
+{
+
+}
+void UAFAbilityComponent::NativeRemoveAbility(const FAFAbilitySpecHandle InHandle)
+{
+ if (GetOwnerRole() < ENetRole::ROLE_Authority)
+ {
+ ServerNativeRemoveAbility(InHandle);
+ }
+ AbilityContainer.RemoveAbility(InHandle);
+}
+void UAFAbilityComponent::ServerNativeRemoveAbility_Implementation(const FAFAbilitySpecHandle& InHandle)
+{
+ AbilityContainer.RemoveAbility(InHandle);
+}
+
+bool UAFAbilityComponent::ServerNativeRemoveAbility_Validate(const FAFAbilitySpecHandle& InHandle)
+{
+ return true;
+}
+
+UGAAbilityBase* UAFAbilityComponent::BP_GetAbilityByHandle(FAFAbilitySpecHandle TagIn)
+{
+ return AbilityContainer.GetAbility(TagIn);
+}
+
+
+void UAFAbilityComponent::OnRep_InstancedAbilities()
+{
+}
+void UAFAbilityComponent::NotifyOnAbilityAdded(const FGameplayTag& InAbilityTag)
+{
+ OnAbilityAdded.Broadcast(InAbilityTag);
+
+}
+void UAFAbilityComponent::InitializeInstancedAbilities()
+{
+}
+
+void UAFAbilityComponent::OnRep_PlayMontage()
+{
+ ACharacter* MyChar = Cast(GetOwner());
+ if (MyChar)
+ {
+ UAnimInstance* AnimInst = MyChar->GetMesh()->GetAnimInstance();
+ AnimInst->Montage_Play(RepMontage.CurrentMontage);
+ if (RepMontage.SectionName != NAME_None)
+ {
+ AnimInst->Montage_JumpToSection(RepMontage.SectionName, RepMontage.CurrentMontage);
+ }
+ UE_LOG(AbilityFramework, Log, TEXT("OnRep_PlayMontage MontageName: %s SectionNAme: %s ForceRep: %s"), *RepMontage.CurrentMontage->GetName(), *RepMontage.SectionName.ToString(), *FString::FormatAsNumber(RepMontage.ForceRep));
+ }
+}
+
+void UAFAbilityComponent::PlayMontage(UAnimMontage* MontageIn, FName SectionName, float Speed)
+{
+ //if (GetOwnerRole() < ENetRole::ROLE_Authority)
+ {
+ //Probabaly want to do something different here for client non authority montage plays.
+ //return;
+ }
+ ACharacter* MyChar = Cast(GetOwner());
+ if (MyChar)
+ {
+ UAnimInstance* AnimInst = MyChar->GetMesh()->GetAnimInstance();
+ AnimInst->Montage_Play(MontageIn, Speed);
+ if (SectionName != NAME_None)
+ {
+ //AnimInst->Montage_JumpToSection(SectionName, MontageIn);
+ }
+
+ UE_LOG(AbilityFramework, Log, TEXT("PlayMontage MontageName: %s SectionNAme: %s Where: %s"), *MontageIn->GetName(), *SectionName.ToString(), (GetOwnerRole() < ENetRole::ROLE_Authority ? TEXT("Client") : TEXT("Server")));
+ RepMontage.SectionName = SectionName;
+ RepMontage.CurrentMontage = MontageIn;
+ RepMontage.ForceRep++;
+ }
+}
+void UAFAbilityComponent::MulticastPlayMontage_Implementation(UAnimMontage* MontageIn, FName SectionName, float Speed = 1)
+{
+
+}
+void UAFAbilityComponent::ClientNotifyAbilityInputReady_Implementation(const TSoftClassPtr& InAbilityPtr)
+{
+
+}
\ No newline at end of file
diff --git a/Plugins/AbilityFramework/Source/AbilityFramework/Private/AFAbilityInterface.cpp b/Plugins/AbilityFramework/Source/AbilityFramework/Private/AFAbilityInterface.cpp
new file mode 100644
index 0000000..b3b15e7
--- /dev/null
+++ b/Plugins/AbilityFramework/Source/AbilityFramework/Private/AFAbilityInterface.cpp
@@ -0,0 +1,24 @@
+// Copyright 1998-2014 Epic Games, Inc. All Rights Reserved.
+
+#include "AbilityFramework.h"
+#include "AFAbilityInterface.h"
+#include "AFAbilityComponent.h"
+#include "AFEffectsComponent.h"
+#include "AFAttributeComponent.h"
+UAFAbilityInterface::UAFAbilityInterface(const FObjectInitializer& ObjectInitializer)
+ : Super(ObjectInitializer)
+{
+}
+
+//class UGAAttributesBase* IAFAbilityInterface::GetAttributes()
+//{
+// return nullptr;// GetAbilityComp()->DefaultAttributes;
+//}
+
+FGAEffectHandle IAFAbilityInterface::ApplyEffectToTarget(
+ const FGAEffect& EffectIn
+ , const FAFEffectParams& Params
+ , const FAFFunctionModifier& Modifier)
+{
+ return GetEffectsComponent()->ApplyEffectToTarget(EffectIn, Params, Modifier);
+}
\ No newline at end of file
diff --git a/Plugins/AbilityFramework/Source/AbilityFramework/Private/AFAbilityTypes.cpp b/Plugins/AbilityFramework/Source/AbilityFramework/Private/AFAbilityTypes.cpp
new file mode 100644
index 0000000..f6673d5
--- /dev/null
+++ b/Plugins/AbilityFramework/Source/AbilityFramework/Private/AFAbilityTypes.cpp
@@ -0,0 +1,155 @@
+// Fill out your copyright notice in the Description page of Project Settings.
+
+#include "AbilityFramework.h"
+#include "AFAbilityComponent.h"
+#include "Abilities/GAAbilityBase.h"
+#include "AFAbilityTypes.h"
+
+void FAFAbilitySpec::PreReplicatedRemove(const struct FAFAbilityContainer& InArraySerializer)
+{
+ if (InArraySerializer.AbilitiesComp.IsValid())
+ {
+ FAFAbilityContainer& InArraySerializerC = const_cast(InArraySerializer);
+ InArraySerializerC.SpecMap.Remove(Handle);
+ //remove attributes
+ //UGAAttributesBase* attr = InArraySerializer.AbilitiesComp->RepAttributes.AttributeMap.FindRef(Ability->AbilityTag);
+ Ability->Attributes = nullptr;
+ }
+}
+void FAFAbilitySpec::PostReplicatedAdd(const struct FAFAbilityContainer& InArraySerializer)
+{
+ if (InArraySerializer.AbilitiesComp.IsValid())
+ {
+ //should be safe, since we only modify the non replicated part of struct.
+ FAFAbilityContainer& InArraySerializerC = const_cast(InArraySerializer);
+ Ability->AbilityComponent = InArraySerializer.AbilitiesComp.Get();
+ if (InArraySerializer.AbilitiesComp.IsValid())
+ {
+ APawn* POwner = Cast(InArraySerializer.AbilitiesComp->GetOwner());
+ Ability->POwner = POwner;
+ Ability->PCOwner = Cast(POwner->Controller);
+ Ability->OwnerCamera = nullptr;
+ }
+ Ability->InitAbility();
+ Ability->Attributes = nullptr;
+
+ //TODO - CHANGE ATTRIBUTE HANDLING
+ UGAAttributesBase* attr = InArraySerializer.AbilitiesComp->RepAttributes.AttributeMap.FindRef(Ability->AbilityTag);
+ Ability->Attributes = attr;
+ InArraySerializerC.SpecMap.Add(Handle, *this);
+ InArraySerializerC.AbilitiesComp->NotifyOnAbilityReady(*this, Handle, ClientHandle);
+ }
+}
+void FAFAbilitySpec::PostReplicatedChange(const struct FAFAbilityContainer& InArraySerializer)
+{
+
+}
+
+UGAAbilityBase* FAFAbilityContainer::AddAbility(TSubclassOf AbilityIn
+ , const FAFAbilitySpecHandle Handle, const FAFAbilitySpecHandle ClientHandle)
+{
+ ENetMode NetMode = AbilitiesComp->GetNetMode();
+ if (AbilityIn && AbilitiesComp.IsValid())
+ {
+ UGAAbilityBase* ability = NewObject(AbilitiesComp->GetOwner(), AbilityIn);
+ ability->AbilityComponent = AbilitiesComp.Get();
+ if (AbilitiesComp.IsValid())
+ {
+ APawn* POwner = Cast(AbilitiesComp->GetOwner());
+ ability->POwner = POwner;
+ ability->PCOwner = Cast(POwner->Controller);
+ ability->OwnerCamera = nullptr;
+ }
+ ability->InitAbility();
+ FGameplayTag Tag = ability->AbilityTag;
+ FAFAbilitySpec Spec;
+ Spec.Ability = ability;
+ Spec.Handle = Handle;
+ Spec.ClientHandle = ClientHandle;
+ MarkItemDirty(Spec);
+ ActivatableAbilities.Add(Spec);
+ SpecMap.Add(Handle, Spec);
+
+ MarkArrayDirty();
+ if (AbilitiesComp->GetNetMode() == ENetMode::NM_Standalone
+ || AbilitiesComp->GetOwnerRole() == ENetRole::ROLE_Authority)
+ {
+ //AbilitiesComp->NotifyOnAbilityReady(InClassPtr);
+ }
+
+ return ability;
+ }
+ return nullptr;
+}
+
+void FAFAbilityContainer::RemoveAbility(const FAFAbilitySpecHandle AbilityIn)
+{
+ auto pred = [AbilityIn](const FAFAbilitySpec& Item) -> bool
+ {
+ if (Item.Handle == AbilityIn)
+ {
+ return true;
+ }
+ else
+ {
+ return false;
+ }
+ };
+ int32 Index = ActivatableAbilities.IndexOfByPredicate(pred);
+
+ if (Index == INDEX_NONE)
+ return;
+
+ UGAAbilityBase* Ability = SpecMap.FindRef(AbilityIn).Ability;
+
+
+ for (auto It = Ability->AbilityTasks.CreateIterator(); It; ++It)
+ {
+ AbilitiesComp->ReplicatedTasks.Remove(It->Value);
+ }
+ Ability->AbilityTasks.Reset();
+
+ SpecMap.Remove(AbilityIn);
+ MarkItemDirty(ActivatableAbilities[Index]);
+ ActivatableAbilities.RemoveAt(Index);
+ MarkArrayDirty();
+}
+
+
+UGAAbilityBase* FAFAbilityContainer::GetAbility(FAFAbilitySpecHandle InAbiltyPtr)
+{
+ UGAAbilityBase* retAbility = SpecMap.FindRef(InAbiltyPtr).Ability;
+ return retAbility;
+}
+
+void FAFAbilityContainer::HandleInputPressed(const uint8 InputID, const FAFPredictionHandle& InPredictionHandle)
+{
+ FAFAbilitySpec Spec = InputToAbilitySpec.FindRef(InputID);
+
+
+ ENetMode NetMode = AbilitiesComp->GetNetMode();
+ if(Spec.Ability)
+ Spec.Ability->OnNativeInputPressed(InputID, InPredictionHandle);
+}
+void FAFAbilityContainer::HandleInputReleased(const uint8 InputID)
+{
+ FAFAbilitySpec Spec = InputToAbilitySpec.FindRef(InputID);
+
+ ENetMode NetMode = AbilitiesComp->GetNetMode();
+ if(Spec.Ability)
+ Spec.Ability->OnNativeInputReleased(InputID);
+}
+
+void FAFAbilityContainer::BindAbilityToInputIDs(const FAFAbilitySpecHandle Handle, TArray InputIDs)
+{
+ ENetMode NetMode = AbilitiesComp->GetNetMode();
+
+ FAFAbilitySpec Spec = SpecMap[Handle];
+
+ for (uint8 ID : InputIDs)
+ {
+ FAFAbilitySpec& Ref = InputToAbilitySpec.FindOrAdd(ID);
+ Ref = Spec;
+ }
+ Spec.Ability->OnAbilityInputReady();
+}
diff --git a/Plugins/AbilityFramework/Source/AbilityFramework/Private/AFAttributeComponent.cpp b/Plugins/AbilityFramework/Source/AbilityFramework/Private/AFAttributeComponent.cpp
new file mode 100644
index 0000000..3362503
--- /dev/null
+++ b/Plugins/AbilityFramework/Source/AbilityFramework/Private/AFAttributeComponent.cpp
@@ -0,0 +1,35 @@
+// Fill out your copyright notice in the Description page of Project Settings.
+
+#include "AbilityFramework.h"
+#include "AFAttributeComponent.h"
+
+
+// Sets default values for this component's properties
+UAFAttributeComponent::UAFAttributeComponent()
+{
+ // Set this component to be initialized when the game starts, and to be ticked every frame. You can turn these features
+ // off to improve performance if you don't need them.
+ PrimaryComponentTick.bCanEverTick = true;
+
+ // ...
+}
+
+
+// Called when the game starts
+void UAFAttributeComponent::BeginPlay()
+{
+ Super::BeginPlay();
+
+ // ...
+
+}
+
+
+// Called every frame
+void UAFAttributeComponent::TickComponent(float DeltaTime, ELevelTick TickType, FActorComponentTickFunction* ThisTickFunction)
+{
+ Super::TickComponent(DeltaTime, TickType, ThisTickFunction);
+
+ // ...
+}
+
diff --git a/Plugins/AbilityFramework/Source/AbilityFramework/Private/AFAttributeInterface.cpp b/Plugins/AbilityFramework/Source/AbilityFramework/Private/AFAttributeInterface.cpp
new file mode 100644
index 0000000..a771935
--- /dev/null
+++ b/Plugins/AbilityFramework/Source/AbilityFramework/Private/AFAttributeInterface.cpp
@@ -0,0 +1,7 @@
+// Fill out your copyright notice in the Description page of Project Settings.
+
+#include "AbilityFramework.h"
+#include "AFAttributeInterface.h"
+
+
+// Add default functionality here for any IAFAttributeInterface functions that are not pure virtual.
diff --git a/Plugins/AbilityFramework/Source/AbilityFramework/Private/AFBlueprintFunctionLibrary.cpp b/Plugins/AbilityFramework/Source/AbilityFramework/Private/AFBlueprintFunctionLibrary.cpp
new file mode 100644
index 0000000..6c0bc22
--- /dev/null
+++ b/Plugins/AbilityFramework/Source/AbilityFramework/Private/AFBlueprintFunctionLibrary.cpp
@@ -0,0 +1,46 @@
+// Copyright 1998-2014 Epic Games, Inc. All Rights Reserved.
+
+#include "AbilityFramework.h"
+
+#include "Abilities/GAAbilityBase.h"
+#include "Effects/GAEffectField.h"
+#include "AFAbilityInterface.h"
+#include "AFAbilityComponent.h"
+#include "AFBlueprintFunctionLibrary.h"
+
+void UAFBlueprintFunctionLibrary::TriggerAbilityPressedByTag(UObject* Target,
+ const FGameplayTag& AbilityTag, FGameplayTag ActionTag)
+{
+ IAFAbilityInterface* Interface = Cast(Target);
+ if (!Interface)
+ {
+ UE_LOG(AbilityFramework, Log, TEXT("TriggerAbilityPressedByTag: Invalid Target"));
+ return;
+ }
+ UAFAbilityComponent* Comp = Interface->GetAbilityComp();
+ if (!Comp)
+ {
+ UE_LOG(AbilityFramework, Log, TEXT("TriggerAbilityPressedByTag: Target %s InvalidComponent"), *Target->GetName());
+ return;
+ }
+
+ //Comp->NativeInputPressed(ActionTag);
+}
+void UAFBlueprintFunctionLibrary::TriggerAbilityReleasedByTag(UObject* Target,
+ const FGameplayTag& AbilityTag, FGameplayTag ActionTag)
+{
+ IAFAbilityInterface* Interface = Cast(Target);
+ if (!Interface)
+ {
+ UE_LOG(AbilityFramework, Log, TEXT("TriggerAbilityReleasedByTag: Invalid Target"));
+ return;
+ }
+ UAFAbilityComponent* Comp = Interface->GetAbilityComp();
+ if (!Comp)
+ {
+ UE_LOG(AbilityFramework, Log, TEXT("TriggerAbilityReleasedByTag: Target %s InvalidComponent"), *Target->GetName());
+ return;
+ }
+
+ //Comp->NativeInputReleased(ActionTag);
+}
\ No newline at end of file
diff --git a/Plugins/AbilityFramework/Source/AbilityFramework/Private/AFCueInterface.cpp b/Plugins/AbilityFramework/Source/AbilityFramework/Private/AFCueInterface.cpp
new file mode 100644
index 0000000..2fac5ab
--- /dev/null
+++ b/Plugins/AbilityFramework/Source/AbilityFramework/Private/AFCueInterface.cpp
@@ -0,0 +1,7 @@
+// Fill out your copyright notice in the Description page of Project Settings.
+
+#include "AbilityFramework.h"
+#include "AFCueInterface.h"
+
+
+// Add default functionality here for any IAFCueInterface functions that are not pure virtual.
diff --git a/Plugins/AbilityFramework/Source/AbilityFramework/Private/AFCueManager.cpp b/Plugins/AbilityFramework/Source/AbilityFramework/Private/AFCueManager.cpp
new file mode 100644
index 0000000..d812d46
--- /dev/null
+++ b/Plugins/AbilityFramework/Source/AbilityFramework/Private/AFCueManager.cpp
@@ -0,0 +1,176 @@
+// Fill out your copyright notice in the Description page of Project Settings.
+
+#include "AbilityFramework.h"
+#include "Effects/AFCueActor.h"
+#include "Effects/AFCueStatic.h"
+#include "AFCueManager.h"
+#include "GameplayTagsManager.h"
+
+#include "Engine/ObjectLibrary.h"
+
+#if WITH_EDITOR
+#include "Editor.h"
+#endif
+
+UAFCueManager* UAFCueManager::ManagerInstance = nullptr;
+//UWorld* UAFCueManager::CurrentWorld = nullptr;
+
+UAFCueManager* UAFCueManager::Get()
+{
+ if (ManagerInstance)
+ {
+ return ManagerInstance;
+ }
+ ManagerInstance = NewObject(GEngine, UAFCueManager::StaticClass(), "UAFCueManagerInstance",
+ RF_MarkAsRootSet);
+ ManagerInstance->AddToRoot();
+ ManagerInstance->Initialize();
+
+ return ManagerInstance;
+}
+void UAFCueManager::Initialize()
+{
+#if WITH_EDITORONLY_DATA
+ FEditorDelegates::EndPIE.AddUObject(this, &UAFCueManager::HandleOnPIEEnd);
+#endif //WITH_EDITORONLY_DATA
+ FCoreUObjectDelegates::PreLoadMap.AddUObject(this, &UAFCueManager::HandlePreLoadMap);
+ FCoreUObjectDelegates::PostLoadMapWithWorld.AddUObject(this, &UAFCueManager::HandlePostLoadMap);
+
+ StaticCues = UObjectLibrary::CreateLibrary(UAFCueStatic::StaticClass(), true, GIsEditor);
+ if (GIsEditor)
+ {
+ StaticCues->bIncludeOnlyOnDiskAssets = true;
+ }
+
+ TArray Paths;
+ Paths.Add("/Game");
+ StaticCues->LoadBlueprintAssetDataFromPaths(Paths, true);
+
+ TArray StaticCueAssets;
+ StaticCues->GetAssetDataList(StaticCueAssets);
+
+ FName TagProperty = GET_MEMBER_NAME_CHECKED(UAFCueStatic, EffectCueTagSearch);
+ UGameplayTagsManager& TagManager = UGameplayTagsManager::Get();
+
+ for (const FAssetData& CueAsset : StaticCueAssets)
+ {
+ const FName Tag = CueAsset.GetTagValueRef(TagProperty);
+
+ if (!Tag.IsNone())
+ {
+ const FString GeneratedClassTag = CueAsset.GetTagValueRef(FBlueprintTags::GeneratedClassPath);
+
+ FGameplayTag ReqTag = TagManager.RequestGameplayTag(Tag);
+ FSoftObjectPath AssetPath;
+ AssetPath.SetPath(FPackageName::ExportTextPathToObjectPath(*GeneratedClassTag));
+ FAFCueData CueData;
+ CueData.CueTag = ReqTag;
+ CueData.AssetId = CueAsset.GetPrimaryAssetId();
+ Cues.Add(CueData);
+ }
+ }
+
+ for (int32 Idx = 0; Idx < Cues.Num(); Idx++)
+ {
+ int32& i = CuesMap.FindOrAdd(Cues[Idx].CueTag);
+ i = Idx;
+ }
+}
+#if WITH_EDITOR
+void UAFCueManager::HandleOnPIEEnd(bool InVal)
+{
+ CurrentWorld = nullptr;
+}
+#endif //WITH_EDITOR
+void UAFCueManager::HandlePreLoadMap(const FString& InMapName)
+{
+ CurrentWorld = nullptr;
+}
+void UAFCueManager::HandlePostLoadMap(UWorld* InWorld)
+{
+ CurrentWorld = InWorld;
+}
+
+
+void UAFCueManager::HandleCue(const FGameplayTagContainer& Tags
+ , const FGAEffectCueParams& CueParams
+ , EAFCueEvent CueEvent)
+{
+ if (!CurrentWorld)
+ CurrentWorld = CueParams.Instigator->GetWorld();
+
+
+ if (UAssetManager* Manager = UAssetManager::GetIfValid())
+ {
+ for (const FGameplayTag& CueTag : Tags)
+ {
+ int32 Idx = CuesMap[CueTag];
+ FAFCueData Data = Cues[Idx];
+
+ if (Data.CueClass)
+ {
+ HandleCueEvent(Cues[Idx].CueClass, CueParams, CueEvent);
+ }
+ else //load cue asynchronously
+ {
+ FPrimaryAssetId PrimaryAssetId = Data.AssetId;
+ FPrimaryAssetTypeInfo Info;
+ if (Manager->GetPrimaryAssetTypeInfo(PrimaryAssetId.PrimaryAssetType, Info))
+ {
+ FStreamableDelegate StreamDelegate = FStreamableDelegate::CreateUObject(this, &UAFCueManager::OnFinishedLoad, Idx, Data.AssetId, CueParams, CueEvent);
+ TSharedPtr Handle = Manager->LoadPrimaryAsset(PrimaryAssetId, TArray(), StreamDelegate);
+ }
+ }
+ }
+ }
+}
+
+void UAFCueManager::OnFinishedLoad(int32 Idx
+ , FPrimaryAssetId InPrimaryAssetId
+ , FGAEffectCueParams CueParams
+ , EAFCueEvent CueEvent)
+{
+ if (UAssetManager* Manager = UAssetManager::GetIfValid())
+ {
+ UObject* CueClass = Manager->GetPrimaryAssetObject(InPrimaryAssetId);
+ size_t classSize = sizeof(*CueClass);
+
+ Cues[Idx].CueClass = Cast(CueClass);
+ HandleCueEvent(Cues[Idx].CueClass, CueParams, CueEvent);
+ }
+}
+
+void UAFCueManager::HandleRemoveCue(const FGameplayTagContainer& Tags,
+ const FGAEffectCueParams& CueParams, FAFCueHandle InHandle)
+{
+
+}
+
+void UAFCueManager::HandleCueEvent(UClass* InCueClass, const FGAEffectCueParams& InCueParams, EAFCueEvent CueEvent)
+{
+ if (UAFCueStatic* StaticCue = Cast(InCueClass->ClassDefaultObject))
+ {
+ switch (CueEvent)
+ {
+ case Activated:
+ StaticCue->OnActivate(InCueParams);
+ break;
+ case Executed:
+ StaticCue->OnExecuted(InCueParams);
+ break;
+ case Expire:
+ StaticCue->OnExpire(InCueParams);
+ break;
+ case Removed:
+ StaticCue->OnRemoved(InCueParams);
+ break;
+ default:
+ break;
+ }
+
+ }
+ else if (AAFCueActor* ActorCue = Cast(InCueClass->ClassDefaultObject))
+ {
+
+ }
+}
\ No newline at end of file
diff --git a/Plugins/AbilityFramework/Source/AbilityFramework/Private/AFEffectsComponent.cpp b/Plugins/AbilityFramework/Source/AbilityFramework/Private/AFEffectsComponent.cpp
new file mode 100644
index 0000000..72e906c
--- /dev/null
+++ b/Plugins/AbilityFramework/Source/AbilityFramework/Private/AFEffectsComponent.cpp
@@ -0,0 +1,501 @@
+// Fill out your copyright notice in the Description page of Project Settings.
+
+#include "AbilityFramework.h"
+#include "AFEffectsComponent.h"
+
+#include "Net/UnrealNetwork.h"
+#include "Engine/ActorChannel.h"
+
+#include "AFAbilityInterface.h"
+#include "Effects/GAEffectExecution.h"
+#include "Effects/GAGameEffect.h"
+#include "Effects/GAEffectExtension.h"
+#include "Effects/AFCueActor.h"
+#include "AFCueManager.h"
+#include "Effects/GABlueprintLibrary.h"
+
+// Sets default values for this component's properties
+UAFEffectsComponent::UAFEffectsComponent(const FObjectInitializer& ObjectInitializer)
+ : Super(ObjectInitializer)
+{
+ // Set this component to be initialized when the game starts, and to be ticked every frame. You can turn these features
+ // off to improve performance if you don't need them.
+ PrimaryComponentTick.bCanEverTick = true;
+
+ // ...
+}
+
+
+// Called when the game starts
+void UAFEffectsComponent::BeginPlay()
+{
+ Super::BeginPlay();
+ GameEffectContainer.OwningComponent = this;
+ // ...
+
+}
+void UAFEffectsComponent::InitializeComponent()
+{
+ Super::InitializeComponent();
+
+ GameEffectContainer.OwningComponent = this;
+}
+
+// Called every frame
+void UAFEffectsComponent::TickComponent(float DeltaTime, ELevelTick TickType, FActorComponentTickFunction* ThisTickFunction)
+{
+ Super::TickComponent(DeltaTime, TickType, ThisTickFunction);
+
+ // ...
+}
+
+FGAEffectHandle UAFEffectsComponent::ApplyEffectToSelf(
+ const FGAEffect& EffectIn
+ , const FAFEffectParams& Params
+ , const FAFFunctionModifier& Modifier)
+{
+ FGAEffectProperty& InProperty = Params.GetProperty();
+ const FGameplayTagContainer& AppliedEventTags = InProperty.GetSpecData()->AppliedEventTags;
+
+ FAFEventData Data;
+
+ for (const FGameplayTag& Tag : AppliedEventTags)
+ {
+ if (TArray* Events = EffectEvents.Find(Tag))
+ {
+ for (const FAFEventDelegate& Event : *Events)
+ Event.Execute(Data);
+ }
+
+ }
+ OnAppliedToSelf.Broadcast(Params.Context, Params.Property, Params.EffectSpec);
+
+ if (FAFEffectEvent* Delegate = OnEffectApplyToSelf.Find(InProperty.GetSpecData()->EffectTag))
+ {
+ Delegate->ExecuteIfBound();
+ }
+
+ FGAEffectHandle Handle = GameEffectContainer.ApplyEffect(EffectIn, Params, Modifier);
+ GameEffectContainer.MarkArrayDirty();
+ return Handle;
+}
+
+FGAEffectHandle UAFEffectsComponent::ApplyEffectToTarget(
+ const FGAEffect& EffectIn
+ , const FAFEffectParams& Params
+ , const FAFFunctionModifier& Modifier)
+{
+ const FGAEffectProperty& InProperty = Params.GetProperty();
+ const FGAEffectContext& InContext = Params.GetContext();
+ if (FAFEffectEvent* Delegate = OnEffectApplyToTarget.Find(InProperty.GetSpecData()->EffectTag))
+ {
+ Delegate->ExecuteIfBound();
+ }
+ ENetRole role = GetOwnerRole();
+ ENetMode mode = GetOwner()->GetNetMode();
+
+ FAFCueHandle CueHandle = FAFCueHandle::GenerateHandle();
+
+ if (InProperty.GetSpecData()->Cues.CueTags.Num() > 0)
+ {
+ FGAEffectCueParams CueParams(InContext, InProperty);
+ MulticastApplyEffectCue(CueParams, CueHandle);
+ }
+
+ OnAppliedToTarget.Broadcast(Params.Context, Params.Property, Params.EffectSpec);
+
+ if (InContext.TargetComp.IsValid())
+ {
+ FGAEffectHandle Handle;
+ Handle = InContext.GetTargetEffectsComponent()->ApplyEffectToSelf(EffectIn, Params, Modifier);
+ //if (!PropertyByHandle.Contains(Handle))
+ // PropertyByHandle.Add(Handle, &InProperty);
+
+ EffectToCue.Add(Handle, CueHandle);
+
+ return Handle;
+ }
+ return FGAEffectHandle();
+}
+
+
+/* Have to to copy handle around, because timer delegates do not support references. */
+void UAFEffectsComponent::ExecuteEffect(FGAEffectHandle HandleIn
+ , FAFEffectParams Params
+ , FAFFunctionModifier Modifier)
+{
+ const FGAEffectContext& Context = Params.Context;
+ FGAEffectProperty& Property = Params.Property.GetRef();
+ const FAFEffectSpec& EffectSpec = Params.GetSpec();
+ /*
+ this patth will give effects chance to do any replicated events, like applying cues.
+ WE do not make any replication at the ApplyEffect because some effect might want to apply cues
+ on periods on expiration etc, and all those will go trouch ExecuteEffect path.
+ */
+ const FGameplayTagContainer& ExecutionDenyTags = Property.GetSpecData()->ExecutionDenyTags;
+ if (ExecutionDenyTags.Num() > 0)
+ {
+ if (HasAny(ExecutionDenyTags))
+ {
+ UE_LOG(GameAttributesEffects, Log, TEXT("UAFEffectsComponent:: Effect %s not executed, execution denyied by tags: %s"), *Property.GetSpecData()->GetName(), *ExecutionDenyTags.ToString());
+ return;
+ }
+ }
+
+ //apply execution events:
+ const FGameplayTagContainer& ExecuteEventTags = Property.GetSpecData()->ExecuteEventTags;
+ FAFEventData Data(Params);
+ for (const FGameplayTag& Tag : ExecuteEventTags)
+ {
+ TriggerExecuteEvent(Tag, Data);
+ }
+
+ //OnEffectExecuted.Broadcast(HandleIn, HandleIn.GetEffectSpec()->OwnedTags);
+ UE_LOG(GameAttributesEffects, Log, TEXT("UAFAbilityComponent:: Effect %s executed"), *Property.GetSpecData()->GetName());
+
+ FGAEffectMod Mod = FAFStatics::GetAttributeModifier(Property.GetAttributeModifier()
+ , Property.GetSpecData()
+ , Context
+ , HandleIn);
+
+ EffectSpec.OnExecuted();
+ ExecuteEffectEvent(Property.GetSpecData()->OnPeriodEvent);
+
+ FAFCueHandle* CueHandle = EffectToCue.Find(HandleIn);
+ FGAEffectCueParams CueParams(Context, Property);
+ if (CueHandle)
+ MulticastExecuteEffectCue(Params.GetProperty().GetSpecData()->StaticClass(), CueParams);
+
+ Property.ExecuteEffect(HandleIn, Mod, Params, Modifier);
+ PostExecuteEffect();
+}
+
+void UAFEffectsComponent::PostExecuteEffect()
+{
+
+}
+/* ExpireEffect is used to remove existing effect naturally when their time expires. */
+void UAFEffectsComponent::ExpireEffect(FGAEffectHandle HandleIn
+ , FAFEffectParams Params)
+{
+ //call effect internal delegate:
+ FGAEffectProperty& InProperty = Params.GetProperty();
+ const FGAEffectContext& InContext = Params.GetContext();
+ const FAFEffectSpec& EffectSpec = Params.GetSpec();
+ FGAEffect* Effect = GameEffectContainer.GetEffect(HandleIn);
+ EffectSpec.OnExpired();
+ ENetRole role = GetOwnerRole();
+ ENetMode mode = GetOwner()->GetNetMode();
+ ExecuteEffectEvent(InProperty.GetSpecData()->OnExpiredEvent);
+ if (mode == ENetMode::NM_DedicatedServer
+ || mode == ENetMode::NM_ListenServer)
+ {
+ ClientExpireEffect(InProperty.GetPredictionHandle());
+ }
+
+ if (InProperty.GetSpecData()->Cues.CueTags.Num() > 0)
+ {
+ FGAEffectCueParams CueParams(InContext, InProperty);
+
+ FAFCueHandle* CueHandle = EffectToCue.Find(HandleIn);
+ if (CueHandle)
+ {
+ MulticastRemoveEffectCue(CueParams, *CueHandle);
+ }
+ }
+
+ TArray handles = GameEffectContainer.RemoveEffect(Params.Property, InContext);
+}
+
+void UAFEffectsComponent::ClientExpireEffect_Implementation(FAFPredictionHandle PredictionHandle)
+{
+
+}
+
+void UAFEffectsComponent::RemoveEffect(const FAFPropertytHandle& InProperty
+ , const FGAEffectContext& InContext
+ , const FGAEffectHandle& InHandle)
+{
+ if (!InProperty.IsValid())
+ {
+ UE_LOG(AFEffects, Log, TEXT("RemoveEffect - Trying to Remove invalid effect."));
+ return;
+ }
+ //if (GetOwnerRole() == ENetRole::ROLE_Authority
+ // || GetOwner()->GetNetMode() == ENetMode::NM_Standalone)
+ {
+ InternalRemoveEffect(InProperty, InContext);
+ }
+ ExecuteEffectEvent(InProperty.GetSpecData()->OnRemovedEvent);
+ FGAEffectCueParams CueParams(InContext, InProperty.GetRef());
+
+ FAFCueHandle* CueHandle = EffectToCue.Find(InHandle);
+ if (CueHandle)
+ {
+ MulticastRemoveEffectCue(CueParams, *CueHandle);
+ }
+}
+void UAFEffectsComponent::InternalRemoveEffect(const FAFPropertytHandle& InProperty, const FGAEffectContext& InContext)
+{
+ UE_LOG(GameAttributesEffects, Log, TEXT("UAFAbilityComponent:: Reset Timers and Remove Effect"));
+
+ //MulticastRemoveEffectCue(HandleIn);
+ if (InProperty.GetSpecData()->Cues.CueTags.Num() > 0)
+ {
+ FGAEffectCueParams CueParams(InContext, InProperty.GetRef());
+ ENetRole role = GetOwnerRole();
+ ENetMode mode = GetOwner()->GetNetMode();
+ if (mode == ENetMode::NM_Standalone
+ || role >= ENetRole::ROLE_Authority)
+ {
+ //MulticastRemoveEffectCue(CueParams);
+ }
+ }
+
+ TArray handles = GameEffectContainer.RemoveEffect(InProperty, InContext);
+}
+
+void UAFEffectsComponent::AddEffectEvent(const FGameplayTag& InEventTag, const FSimpleDelegate& InEvent)
+{
+ if (!InEventTag.IsValid())
+ return;
+ if (!OnEffectEvent.Contains(InEventTag))
+ {
+ UE_LOG(AbilityFramework, Log, TEXT("AddEffectEvent: %s"), *InEventTag.ToString());
+ OnEffectEvent.Add(InEventTag, InEvent);
+ }
+}
+void UAFEffectsComponent::ExecuteEffectEvent(const FGameplayTag& InEventTag)
+{
+ if (!InEventTag.IsValid())
+ return;
+ FSimpleDelegate* Delegate = OnEffectEvent.Find(InEventTag);
+ if (Delegate)
+ {
+ UE_LOG(AbilityFramework, Log, TEXT("ExecuteEffectEvent: %s"), *InEventTag.ToString());
+ Delegate->ExecuteIfBound();
+ }
+}
+void UAFEffectsComponent::RemoveEffectEvent(const FGameplayTag& InEventTag)
+{
+ if (!InEventTag.IsValid())
+ return;
+ UE_LOG(AbilityFramework, Log, TEXT("RemoveEffectEvent: %s"), *InEventTag.ToString());
+ OnEffectEvent.Remove(InEventTag);
+}
+TArray& UAFEffectsComponent::GetTagEvent(FGameplayTag TagIn)
+{
+ TArray& Delegate = EffectEvents.FindChecked(TagIn);
+ return Delegate;
+}
+
+void UAFEffectsComponent::NativeTriggerTagEvent(FGameplayTag TagIn, const FAFEventData& InEventData)
+{
+ TArray* Delegate = EffectEvents.Find(TagIn);
+ if (Delegate)
+ {
+ for (const FAFEventDelegate& Event : *Delegate)
+ {
+ if (Event.IsBound())
+ {
+ Event.Execute(InEventData);
+ }
+ }
+ }
+}
+
+void UAFEffectsComponent::AddAppliedEvent(const FGameplayTag& EventTag, FAFEventDelegate& EventDelegate)
+{
+ TArray& Events = AppliedEvents.FindOrAdd(EventTag);
+ Events.Add(EventDelegate);
+}
+void UAFEffectsComponent::RemoveAppliedEvent(const FGameplayTag& EventTag, const FDelegateHandle& EventDelegate)
+{
+ TArray* Events = AppliedEvents.Find(EventTag);
+ if (Events)
+ {
+ int32 Idx = Events->IndexOfByPredicate([&](const FAFEventDelegate& Other)
+ {
+ return Other.GetHandle() == EventDelegate;
+ });
+
+ Events->RemoveAt(Idx, 1, true);
+ }
+}
+void UAFEffectsComponent::TriggerAppliedEvent(FGameplayTag TagIn, const FAFEventData& InEventData)
+{
+ TArray* Delegate = AppliedEvents.Find(TagIn);
+ if (Delegate)
+ {
+ for (const FAFEventDelegate& Event : *Delegate)
+ {
+ if (Event.IsBound())
+ {
+ Event.Execute(InEventData);
+ }
+ }
+ }
+}
+
+void UAFEffectsComponent::AddExecuteEvent(const FGameplayTag& EventTag, FAFEventDelegate& EventDelegate)
+{
+ TArray& Events = ExecutedEvents.FindOrAdd(EventTag);
+ Events.Add(EventDelegate);
+}
+void UAFEffectsComponent::RemoveExecuteEvent(const FGameplayTag& EventTag, const FDelegateHandle& EventDelegate)
+{
+ TArray* Events = ExecutedEvents.Find(EventTag);
+ if (Events)
+ {
+ int32 Idx = Events->IndexOfByPredicate([&](const FAFEventDelegate& Other)
+ {
+ return Other.GetHandle() == EventDelegate;
+ });
+
+ Events->RemoveAt(Idx, 1, true);
+ }
+}
+void UAFEffectsComponent::TriggerExecuteEvent(FGameplayTag TagIn, const FAFEventData& InEventData)
+{
+ TArray* Delegate = ExecutedEvents.Find(TagIn);
+ if (Delegate)
+ {
+ for (const FAFEventDelegate& Event : *Delegate)
+ {
+ if (Event.IsBound())
+ {
+ Event.Execute(InEventData);
+ }
+ }
+ }
+}
+
+
+void UAFEffectsComponent::AddEvent(const FGameplayTag& EventTag, FAFEventDelegate& EventDelegate)
+{
+ TArray& Events = EffectEvents.FindOrAdd(EventTag);
+ Events.Add(EventDelegate);
+}
+
+void UAFEffectsComponent::RemoveEvent(const FGameplayTag& EventTag, const FDelegateHandle& EventDelegate)
+{
+ TArray* Events = EffectEvents.Find(EventTag);
+ if (Events)
+ {
+
+ int32 Idx = Events->IndexOfByPredicate([&](const FAFEventDelegate& Other)
+ {
+ return Other.GetHandle() == EventDelegate;
+ });
+
+ Events->RemoveAt(Idx, 1, true);
+ }
+}
+
+bool UAFEffectsComponent::IsEffectActive(const FGAEffectHandle& InHandle) const
+{
+ return GameEffectContainer.IsEffectActive(InHandle);
+}
+
+bool UAFEffectsComponent::DenyEffectApplication(const FGameplayTagContainer& InTags)
+{
+ bool bDenyApplication = false;
+ if (InTags.Num() > 0)
+ {
+ bDenyApplication = HasAny(InTags);
+ }
+ return bDenyApplication;
+}
+
+bool UAFEffectsComponent::HaveEffectRquiredTags(const FGameplayTagContainer& InTags)
+{
+ bool bAllowApplication = true;
+ if (InTags.Num() > 0)
+ {
+ bAllowApplication = HasAll(InTags);
+ }
+ return bAllowApplication;
+}
+
+FGAEffect* UAFEffectsComponent::GetEffect(const FGAEffectHandle& InHandle)
+{
+ return *GameEffectContainer.ActiveEffects.Find(InHandle);
+}
+
+/*
+Need prediction for spawning effects on client,
+and then on updateing them predicitvely on all other clients.
+*/
+/*
+
+*/
+void UAFEffectsComponent::MulticastApplyEffectCue_Implementation(FGAEffectCueParams CueParams, FAFCueHandle InHandle)
+{
+ ENetRole role = GetOwnerRole();
+ ENetMode mode = GetOwner()->GetNetMode();
+ if (mode == ENetMode::NM_Standalone
+ || role != ENetRole::ROLE_Authority)
+ {
+ UAFCueManager::Get()->HandleCue(CueParams.CueTags, CueParams, EAFCueEvent::Activated);
+ }
+}
+void UAFEffectsComponent::MulticastExecuteEffectCue_Implementation(TSubclassOf EffectSpec, FGAEffectCueParams CueParams)
+{
+ ENetRole role = GetOwnerRole();
+ ENetMode mode = GetOwner()->GetNetMode();
+ if (mode == ENetMode::NM_Standalone
+ || role != ENetRole::ROLE_Authority)
+ {
+ UAFCueManager::Get()->HandleCue(CueParams.CueTags, CueParams, EAFCueEvent::Executed);
+ }
+}
+
+void UAFEffectsComponent::MulticastRemoveEffectCue_Implementation(FGAEffectCueParams CueParams, FAFCueHandle InHandle)
+{
+ ENetRole role = GetOwnerRole();
+ ENetMode mode = GetOwner()->GetNetMode();
+ if (mode == ENetMode::NM_Standalone
+ || role != ENetRole::ROLE_Authority)
+ {
+ UAFCueManager::Get()->HandleCue(CueParams.CueTags, CueParams, EAFCueEvent::Removed);
+ }
+}
+
+void UAFEffectsComponent::MulticastUpdateDurationCue_Implementation(FGAEffectHandle EffectHandle, float NewDurationIn)
+{
+
+}
+
+void UAFEffectsComponent::MulticastUpdatePeriodCue_Implementation(FGAEffectHandle EffectHandle, float NewPeriodIn)
+{
+
+}
+
+void UAFEffectsComponent::MulticastUpdateTimersCue_Implementation(FGAEffectHandle EffectHandle, float NewDurationIn, float NewPeriodIn)
+{
+
+}
+
+void UAFEffectsComponent::MulticastExtendDurationCue_Implementation(FGAEffectHandle EffectHandle, float NewDurationIn)
+{
+
+}
+
+
+/*Network Functions - BEGIN */
+
+void UAFEffectsComponent::GetLifetimeReplicatedProps(TArray< class FLifetimeProperty > & OutLifetimeProps) const
+{
+ Super::GetLifetimeReplicatedProps(OutLifetimeProps);
+
+ DOREPLIFETIME(UAFEffectsComponent, GameEffectContainer);
+ DOREPLIFETIME(UAFEffectsComponent, AppliedTags);
+ DOREPLIFETIME(UAFEffectsComponent, ImmunityTags);
+}
+
+void UAFEffectsComponent::OnRep_GameEffectContainer()
+{
+
+}
+
+/*Network Functions - END */
\ No newline at end of file
diff --git a/Plugins/AbilityFramework/Source/AbilityFramework/Private/AFSimpleInterface.cpp b/Plugins/AbilityFramework/Source/AbilityFramework/Private/AFSimpleInterface.cpp
new file mode 100644
index 0000000..bb19175
--- /dev/null
+++ b/Plugins/AbilityFramework/Source/AbilityFramework/Private/AFSimpleInterface.cpp
@@ -0,0 +1,7 @@
+// Fill out your copyright notice in the Description page of Project Settings.
+
+#include "AbilityFramework.h"
+#include "AFSimpleInterface.h"
+
+
+// Add default functionality here for any IAFSimpleInterface functions that are not pure virtual.
diff --git a/Plugins/AbilityFramework/Source/AbilityFramework/Private/Abilities/AFAbilityActivationSpec.cpp b/Plugins/AbilityFramework/Source/AbilityFramework/Private/Abilities/AFAbilityActivationSpec.cpp
new file mode 100644
index 0000000..dbb9013
--- /dev/null
+++ b/Plugins/AbilityFramework/Source/AbilityFramework/Private/Abilities/AFAbilityActivationSpec.cpp
@@ -0,0 +1,13 @@
+// Fill out your copyright notice in the Description page of Project Settings.
+
+#include "AbilityFramework.h"
+#include "../Effects/CustomApplications/AFAtributeDurationAdd.h"
+#include "AFAbilityActivationSpec.h"
+
+
+
+UAFAbilityActivationSpec::UAFAbilityActivationSpec()
+ :Super()
+{
+ Application = UAFAtributeDurationAdd::StaticClass();
+}
\ No newline at end of file
diff --git a/Plugins/AbilityFramework/Source/AbilityFramework/Private/Abilities/AFAbilityCooldownSpec.cpp b/Plugins/AbilityFramework/Source/AbilityFramework/Private/Abilities/AFAbilityCooldownSpec.cpp
new file mode 100644
index 0000000..045614d
--- /dev/null
+++ b/Plugins/AbilityFramework/Source/AbilityFramework/Private/Abilities/AFAbilityCooldownSpec.cpp
@@ -0,0 +1,14 @@
+// Fill out your copyright notice in the Description page of Project Settings.
+
+#include "AbilityFramework.h"
+#include "Effects/CustomApplications/AFAtributeDurationAdd.h"
+#include "AFAbilityCooldownSpec.h"
+
+
+
+
+UAFAbilityCooldownSpec::UAFAbilityCooldownSpec()
+ : Super()
+{
+ Application = UAFAtributeDurationAdd::StaticClass();
+}
\ No newline at end of file
diff --git a/Plugins/AbilityFramework/Source/AbilityFramework/Private/Abilities/AFAbilityInfiniteDurationSpec.cpp b/Plugins/AbilityFramework/Source/AbilityFramework/Private/Abilities/AFAbilityInfiniteDurationSpec.cpp
new file mode 100644
index 0000000..19cf6ce
--- /dev/null
+++ b/Plugins/AbilityFramework/Source/AbilityFramework/Private/Abilities/AFAbilityInfiniteDurationSpec.cpp
@@ -0,0 +1,13 @@
+// Fill out your copyright notice in the Description page of Project Settings.
+
+#include "AbilityFramework.h"
+#include "Effects/CustomApplications/AFAttributeDurationInfinite.h"
+#include "AFAbilityInfiniteDurationSpec.h"
+
+
+
+UAFAbilityInfiniteDurationSpec::UAFAbilityInfiniteDurationSpec()
+ :Super()
+{
+ Application = UAFAttributeDurationInfinite::StaticClass();
+}
diff --git a/Plugins/AbilityFramework/Source/AbilityFramework/Private/Abilities/AFAbilityPeriodSpec.cpp b/Plugins/AbilityFramework/Source/AbilityFramework/Private/Abilities/AFAbilityPeriodSpec.cpp
new file mode 100644
index 0000000..49cb210
--- /dev/null
+++ b/Plugins/AbilityFramework/Source/AbilityFramework/Private/Abilities/AFAbilityPeriodSpec.cpp
@@ -0,0 +1,13 @@
+// Fill out your copyright notice in the Description page of Project Settings.
+
+#include "AbilityFramework.h"
+#include "AFAbilityPeriodSpec.h"
+#include "../Effects/CustomApplications/AFPeriodApplicationAdd.h"
+
+
+
+UAFAbilityPeriodSpec::UAFAbilityPeriodSpec()
+ :Super()
+{
+ Application = UAFPeriodApplicationAdd::StaticClass();
+}
\ No newline at end of file
diff --git a/Plugins/AbilityFramework/Source/AbilityFramework/Private/Abilities/AFAbilityPeriodicInfiniteSpec.cpp b/Plugins/AbilityFramework/Source/AbilityFramework/Private/Abilities/AFAbilityPeriodicInfiniteSpec.cpp
new file mode 100644
index 0000000..a77c62a
--- /dev/null
+++ b/Plugins/AbilityFramework/Source/AbilityFramework/Private/Abilities/AFAbilityPeriodicInfiniteSpec.cpp
@@ -0,0 +1,14 @@
+// Fill out your copyright notice in the Description page of Project Settings.
+
+#include "AbilityFramework.h"
+#include "Effects/CustomApplications/AFPeriodApplicationInfiniteAdd.h"
+#include "AFAbilityPeriodicInfiniteSpec.h"
+
+
+
+
+UAFAbilityPeriodicInfiniteSpec::UAFAbilityPeriodicInfiniteSpec()
+ :Super()
+{
+ Application = UAFPeriodApplicationInfiniteAdd::StaticClass();
+}
diff --git a/Plugins/AbilityFramework/Source/AbilityFramework/Private/Abilities/GAAbilityBase.cpp b/Plugins/AbilityFramework/Source/AbilityFramework/Private/Abilities/GAAbilityBase.cpp
new file mode 100644
index 0000000..57cb4a6
--- /dev/null
+++ b/Plugins/AbilityFramework/Source/AbilityFramework/Private/Abilities/GAAbilityBase.cpp
@@ -0,0 +1,974 @@
+// Copyright 1998-2014 Epic Games, Inc. All Rights Reserved.
+
+
+#include "AbilityFramework.h"
+#include "Tasks/GAAbilityTask.h"
+#include "Effects/GAGameEffect.h"
+#include "GAGlobalTypes.h"
+#include "Effects/GAEffectGlobalTypes.h"
+#include "AFAbilityComponent.h"
+#include "AFEffectsComponent.h"
+
+#include "GameplayTagContainer.h"
+#include "Net/UnrealNetwork.h"
+#include "Animation/AnimMontage.h"
+#include "Effects/GABlueprintLibrary.h"
+#include "Camera/CameraComponent.h"
+#include "Kismet/KismetSystemLibrary.h"
+
+#include "GAAbilityBase.h"
+FAFPredictionHandle UGAAbilityBase::GetPredictionHandle() { return PredictionHandle; }
+
+UGAAbilityBase::UGAAbilityBase(const FObjectInitializer& ObjectInitializer)
+ : Super(ObjectInitializer)
+{
+ bReplicate = true;
+ bIsNameStable = false;
+}
+
+void UGAAbilityBase::PostInitProperties()
+{
+ UpdateAssetRegistryInfo();
+ Super::PostInitProperties();
+}
+
+void UGAAbilityBase::Serialize(FArchive& Ar)
+{
+ if (Ar.IsSaving())
+ {
+ UpdateAssetRegistryInfo();
+ }
+
+ Super::Serialize(Ar);
+
+ if (Ar.IsLoading())
+ {
+ UpdateAssetRegistryInfo();
+ }
+}
+#if WITH_EDITORONLY_DATA
+void UGAAbilityBase::UpdateAssetBundleData()
+{
+ AssetBundleData.Reset();
+
+ // By default parse the metadata
+ if (UAssetManager::IsValid())
+ {
+ UAssetManager::Get().InitializeAssetBundlesFromMetadata(this, AssetBundleData);
+ }
+}
+
+void UGAAbilityBase::PreSave(const class ITargetPlatform* TargetPlatform)
+{
+ Super::PreSave(TargetPlatform);
+
+ UpdateAssetBundleData();
+
+ if (UAssetManager::IsValid())
+ {
+ // Bundles may have changed, refresh
+ UAssetManager::Get().RefreshAssetData(this);
+ }
+}
+#endif
+
+FPrimaryAssetId UGAAbilityBase::GetPrimaryAssetId() const
+{
+ //FName Name = GetFName();
+ //FName clsNam = GetClass()->GetFName();
+ FName dupa1 = FPackageName::GetShortFName(GetOutermost()->GetFName());
+ //FName dupa2 = FPackageName::GetShortFName(GetFName());
+ const UGAAbilityBase* A = this;
+ return FPrimaryAssetId(FPrimaryAssetType("Ability"), dupa1);
+ //if (HasAnyFlags(RF_ClassDefaultObject))
+ {
+ UClass* SearchNativeClass = GetClass();
+
+ while (SearchNativeClass && !SearchNativeClass->HasAnyClassFlags(CLASS_Native | CLASS_Intrinsic))
+ {
+ SearchNativeClass = SearchNativeClass->GetSuperClass();
+ }
+
+ if (SearchNativeClass && SearchNativeClass != GetClass())
+ {
+ // If blueprint, return native class and asset name
+
+ }
+
+ // Native CDO, return nothing
+ return FPrimaryAssetId();
+ }
+
+ // Data assets use Class and ShortName by default, there's no inheritance so class works fine
+ //return FPrimaryAssetId(GetClass()->GetFName(), GetFName());
+}
+
+void UGAAbilityBase::PostLoad()
+{
+ Super::PostLoad();
+
+#if WITH_EDITORONLY_DATA
+ FAssetBundleData OldData = AssetBundleData;
+
+ UpdateAssetBundleData();
+
+ if (UAssetManager::IsValid() && OldData != AssetBundleData)
+ {
+ // Bundles changed, refresh
+ UAssetManager::Get().RefreshAssetData(this);
+ }
+#endif
+}
+#if WITH_EDITOR
+void UGAAbilityBase::PostEditChangeProperty(FPropertyChangedEvent& PropertyChangedEvent)
+{
+ Super::PostEditChangeProperty(PropertyChangedEvent);
+}
+#endif // WITH_EDITOR
+
+void UGAAbilityBase::UpdateAssetRegistryInfo()
+{
+ AbilityTagSearch = AbilityTag.GetTagName();
+}
+
+void UGAAbilityBase::InitAbility()
+{
+ //still want to initialize, as Spec is used in multiple places.
+ DefaultContext = UGABlueprintLibrary::MakeContext(this, POwner, AvatarActor, this, FHitResult(ForceInit)).GetRef();
+ ActivationEffect.InitializeIfNotInitialized(POwner, this);
+ CooldownEffect.InitializeIfNotInitialized(POwner, this);
+ for (int32 Idx = 0; Idx < AttributeCost.Num(); Idx++)
+ {
+ AttributeCost[Idx].InitializeIfNotInitialized(POwner, this);
+ }
+ AttributeCostHandle.AddZeroed(AttributeCost.Num());
+
+ for (int32 Idx = 0; Idx < AbilityAttributeCost.Num(); Idx++)
+ {
+ AbilityAttributeCost[Idx].InitializeIfNotInitialized(POwner, this);
+ }
+ AbilityAttributeCostHandle.AddZeroed(AbilityAttributeCost.Num());
+ if (AbilityComponent)
+ {
+ World = AbilityComponent->GetWorld();
+ }
+
+ if (!AbilityComponent)
+ {
+ AbilityComponent = GetAbilityComp();
+ }
+
+ if (GetAttributes())
+ {
+ GetAttributes()->InitializeAttributes(GetAbilityComp());
+ GetAttributes()->InitializeAttributesFromTable();
+ }
+ ENetRole role = AbilityComponent->GetOwnerRole();
+ ENetMode mode = AbilityComponent->GetOwner()->GetNetMode();
+
+
+ {
+ FAFOnAttributeReady Delegate = FAFOnAttributeReady::CreateUObject(this, &UGAAbilityBase::OnAttributeSetReplicated);
+ AbilityComponent->RepAttributes.RegisterAttributeRepEvent(AbilityTag, Delegate);
+ }
+
+ //AbilityComponent->RepAttributes.AttributeMap.Add(AbilityTag, Attributes);
+ if (role == ENetRole::ROLE_Authority ||
+ mode == ENetMode::NM_Standalone)
+ {
+ if (AbilityComponent && GetAttributes())
+ {
+ UGAAttributesBase* NewAttributes = AbilityComponent->AddAddtionalAttributes(AbilityTag, GetAttributes());;
+ SetAttributes(nullptr);
+ SetAttributes(NewAttributes);
+ }
+ }
+
+ if (!OwnerCamera)
+ {
+ OwnerCamera = POwner->FindComponentByClass();
+ }
+
+ OnAbilityInited();
+}
+void UGAAbilityBase::OnAttributeSetReplicated(class UGAAttributesBase* ReplicatedAttributes)
+{
+ SetAttributes(ReplicatedAttributes);
+ if (GetAttributes())
+ {
+ GetAttributes()->InitializeAttributes(GetAbilityComp());
+ GetAttributes()->InitializeAttributesFromTable();
+ }
+}
+
+void UGAAbilityBase::OnAbilityInited()
+{
+
+}
+void UGAAbilityBase::OnNativeInputPressed(uint8 InputID, const FAFPredictionHandle& InPredictionHandle)
+{
+ {
+ //UE_LOG(AbilityFramework, Log, TEXT("OnNativeInputPressed in ability %s"), *GetName());
+ PredictionHandle = InPredictionHandle;
+ OnInputPressed(InputID);
+ OnInputPressedDelegate.Broadcast();
+ }
+}
+
+void UGAAbilityBase::OnNativeInputReleased(uint8 InputID)
+{
+ {
+ UE_LOG(AbilityFramework, Log, TEXT("OnNativeInputReleased in ability %s"), *GetName());
+ OnInputReleased(InputID);
+ OnInputReleasedDelegate.Broadcast();
+ }
+}
+
+void UGAAbilityBase::StartActivation(bool bApplyActivationEffect)
+{
+ if (!CanUseAbility())
+ {
+ UE_LOG(AbilityFramework, Log, TEXT("Cannot use Ability: %s"), *GetName());
+ return;
+ }
+ //AbilityComponent->ExecutingAbility = this;
+ AbilityState = EAFAbilityState::Activating;
+ NativeOnBeginAbilityActivation(bApplyActivationEffect);
+}
+
+void UGAAbilityBase::NativeOnBeginAbilityActivation(bool bApplyActivationEffect)
+{
+ UE_LOG(AbilityFramework, Log, TEXT("Begin Executing Ability: %s"), *GetName());
+
+ if (OnConfirmCastingEndedDelegate.IsBound())
+ {
+ OnConfirmCastingEndedDelegate.Broadcast();
+ }
+ //ActivationInfo.SetActivationInfo();
+ ApplyActivationEffect(bApplyActivationEffect);
+ OnActivate();
+ OnActivateBeginDelegate.Broadcast();
+ AbilityComponent->AppliedTags.AddTagContainer(ActivationAddedTags);
+ //OnAbilityExecuted();
+}
+
+void UGAAbilityBase::OnCooldownEffectExpired()
+{
+ UE_LOG(AFAbilities, Log, TEXT("Cooldown expired In Ability: %s"), *GetName());
+}
+/* Functions for activation effect delegates */
+void UGAAbilityBase::NativeOnAbilityActivationFinish()
+{
+ UE_LOG(AbilityFramework, Log, TEXT("Ability Activation Effect Expired In Ability: %s"), *GetName());
+ OnActivationFinished();
+ OnActivationFinishedDelegate.Broadcast();
+}
+void UGAAbilityBase::NativeOnAbilityActivationCancel()
+{
+ //OnAbilityExecutedNative();
+ //this works under assumption that current state == activation state.
+ UE_LOG(AbilityFramework, Log, TEXT("Ability Activation Effect Removed In Ability: %s"), *GetName());
+ //AbilityComponent->ExecutingAbility = nullptr;
+ OnConfirmDelegate.Clear();
+ OnConfirmDelegate.RemoveAll(this);
+
+ OnActivationCancel();
+ //AbilityActivatedCounter++;
+}
+void UGAAbilityBase::OnActivationEffectPeriod()
+{
+ UE_LOG(AFAbilities, Log, TEXT("Ability Activation Effect Period In Ability: %s"), *GetName());
+
+ OnPeriod();
+}
+void UGAAbilityBase::FinishAbility()
+{
+ UE_LOG(AFAbilities, Log, TEXT("FinishExecution in ability %s"), *GetName());
+ OnAbilityFinished();
+ NativeFinishAbility();
+ AbilityState = EAFAbilityState::Waiting;
+ GetEffectsComponent()->AppliedTags.RemoveTagContainer(ActivationAddedTags);
+}
+void UGAAbilityBase::NativeFinishAbility()
+{
+ UE_LOG(AFAbilities, Log, TEXT("NativeFinishExecution in ability %s"), *GetName());
+ AbilityComponent->ExecutingAbility = nullptr;
+ OnConfirmDelegate.Clear();
+ OnConfirmDelegate.RemoveAll(this);
+ if (ActivationEffectHandle.Num() > 0 && !ActivationEffectHandle[0].IsValid())
+ {
+ GetEffectsComponent()->RemoveEffect(ActivationEffect, DefaultContext, ActivationEffectHandle[0]);
+ ActivationEffectHandle.Reset();
+ }
+ //remove effect.
+}
+/* Functions for activation effect delegates */
+void UGAAbilityBase::CancelActivation()
+{
+ NativeCancelActivation();
+}
+void UGAAbilityBase::NativeCancelActivation()
+{
+ if (ActivationEffectHandle.Num() > 0 && !ActivationEffectHandle[0].IsValid())
+ return;
+
+ UAFAbilityComponent* AttrComp = DefaultContext.InstigatorComp.Get();
+ AbilityComponent->ExecutingAbility = nullptr;
+ OnConfirmDelegate.Clear();
+ OnConfirmDelegate.RemoveAll(this);
+ if (GetEffectsComponent())
+ {
+ GetEffectsComponent()->RemoveEffect(ActivationEffect, DefaultContext, ActivationEffectHandle[0]);
+ AbilityState = EAFAbilityState::Waiting;
+ ActivationEffectHandle.Reset();
+ }
+ OnActivationCancel();
+}
+
+bool UGAAbilityBase::IsWaitingForConfirm()
+{
+ if (OnConfirmDelegate.IsBound())
+ return true;
+ else
+ return false;
+}
+void UGAAbilityBase::ConfirmAbility()
+{
+ if (OnConfirmDelegate.IsBound())
+ OnConfirmDelegate.Broadcast();
+ OnConfirmDelegate.Clear();
+ OnConfirmDelegate.RemoveAll(this);
+}
+
+bool UGAAbilityBase::ApplyCooldownEffect()
+{
+ if (!CooldownEffect.GetSpecData())
+ {
+ return false;
+ }
+ FAFFunctionModifier Modifier;
+
+ FSimpleDelegate PeriodDel = FSimpleDelegate::CreateUObject(this, &UGAAbilityBase::NativeOnCooldownEnd);
+ GetEffectsComponent()->AddEffectEvent(CooldownEffect.GetSpecData()->OnExpiredEvent, PeriodDel);
+
+ CooldownEffectHandle = UGABlueprintLibrary::ApplyGameEffectToObject(
+ CooldownEffect
+ , this
+ , POwner
+ , this
+ , Modifier);
+ ENetMode nm = AbilityComponent->GetOwner()->GetNetMode();
+ ENetRole role = AbilityComponent->GetOwnerRole();
+
+ if (role >= ENetRole::ROLE_Authority)
+ {
+ ClientSetCooldownHandle(CooldownEffectHandle[0]);
+ }
+ OnCooldownStart();
+
+ //CooldownEffectHandle.GetEffectRef().OnEffectExpired.AddUObject(this, &UGAAbilityBase::OnCooldownEnd);
+ return false;
+}
+void UGAAbilityBase::NativeOnCooldownEnd()
+{
+ //AbilityComponent->RemoveEffect(CooldownEffect, DefaultContext);
+ OnCooldownEnd();
+ CooldownEffectHandle.Reset();
+}
+void UGAAbilityBase::ClientSetCooldownHandle_Implementation(FGAEffectHandle InCooldownHandle)
+{
+ //CooldownEffectHandle = InCooldownHandle;
+}
+bool UGAAbilityBase::ApplyActivationEffect(bool bApplyActivationEffect)
+{
+ if (!ActivationEffect.GetSpecData())
+ return false;
+ FHitResult Hit(ForceInit);
+
+ UGAGameEffectSpec* Spec = ActivationEffect.GetClass().GetDefaultObject();
+ float DurationCheck = Spec->Duration.GetFloatValue(DefaultContext);
+ float PeriodCheck = Spec->Period.GetFloatValue(DefaultContext);
+ if (DurationCheck > 0 || PeriodCheck > 0)
+ {
+ bApplyActivationEffect = true;
+ }
+
+ if (bApplyActivationEffect)
+ {
+ FHitResult HitIn;
+
+ FSimpleDelegate AppliedDel = FSimpleDelegate::CreateUObject(this, &UGAAbilityBase::NativeOnAbilityActivationFinish);
+ GetEffectsComponent()->AddEffectEvent(ActivationEffect.GetSpecData()->OnExpiredEvent, AppliedDel);
+
+ FAFFunctionModifier Modifier;
+ ActivationEffectHandle = UGABlueprintLibrary::ApplyGameEffectToObject(
+ ActivationEffect
+ , this
+ , POwner
+ , this
+ , Modifier);
+
+ //if(!ActivationEffectHandle.GetEffectRef().OnEffectExpired.)
+ // ActivationEffectHandle.GetEffectRef().OnEffectExpired.AddUObject(this, &UGAAbilityBase::NativeOnAbilityActivationFinish);
+
+
+ if (PeriodCheck > 0)
+ {
+ FSimpleDelegate PeriodDel = FSimpleDelegate::CreateUObject(this, &UGAAbilityBase::OnActivationEffectPeriod);
+ GetEffectsComponent()->AddEffectEvent(ActivationEffect.GetSpecData()->OnPeriodEvent, PeriodDel);
+ //if (!ActivationEffectHandle.GetEffectRef().OnEffectPeriod.IsBound())
+ // ActivationEffectHandle.GetEffectRef().OnEffectPeriod.AddUObject(this, &UGAAbilityBase::OnActivationEffectPeriod);
+ }
+ }
+ else
+ {
+ NativeOnAbilityActivationFinish();
+ }
+ return false;
+}
+
+bool UGAAbilityBase::CanUseAbility()
+{
+ bool CanUse = true;
+ bool bIsOnCooldown = IsOnCooldown();
+ bool bIsActivating = IsActivating();
+ //if (!AbilityComponent->ExecutingAbility)
+ // UE_LOG(AbilityFramework, Log, TEXT("CanUseAbility AbilityComponent->ExecutingAbility is true"));
+
+ CanUse = !bIsOnCooldown && !bIsActivating;
+ UE_LOG(AbilityFramework, Log, TEXT("CanUseAbility Ability, Cooldown: %s, Activating: %s \n"), bIsOnCooldown ? TEXT("true") : TEXT("false"), bIsActivating ? TEXT("true") : TEXT("false") );
+ //now Lets check tags
+ if (CanUse)
+ {
+ if (GetEffectsComponent()->HasAll(ActivationRequiredTags))
+ {
+ CanUse = true;
+ }
+ //blocking takes precedence.
+ if (GetEffectsComponent()->HasAny(ActivationBlockedTags))
+ {
+ CanUse = false;
+ }
+ }
+
+ return CanUse;
+}
+bool UGAAbilityBase::BP_CanUseAbility()
+{
+ return CanUseAbility();
+}
+bool UGAAbilityBase::CanReleaseAbility()
+{
+ bool bCanUse = true;
+ /*if (AbilityComponent->ExecutingAbility == this)
+ {
+ bCanUse = true;
+ }*/
+ if (IsOnCooldown())
+ {
+ bCanUse = false;
+ UE_LOG(AbilityFramework, Log, TEXT("CanReleaseAbility can't release ability is on cooldown"));
+ }
+ return bCanUse;
+}
+
+class UGAAttributesBase* UGAAbilityBase::GetAttributes()
+{
+ return Attributes;
+}
+UAFAbilityComponent* UGAAbilityBase::GetAbilityComp()
+{
+ IAFAbilityInterface* OwnerAttributes = Cast(POwner);
+ if (OwnerAttributes)
+ {
+ return OwnerAttributes->GetAbilityComp();
+ }
+ return nullptr;
+}
+
+UAFEffectsComponent* UGAAbilityBase::GetEffectsComponent()
+{
+ IAFAbilityInterface* OwnerAttributes = Cast(POwner);
+ if (OwnerAttributes)
+ {
+ return OwnerAttributes->GetEffectsComponent();
+ }
+ return nullptr;
+}
+UAFEffectsComponent* UGAAbilityBase::NativeGetEffectsComponent() const
+{
+ IAFAbilityInterface* OwnerAttributes = Cast(POwner);
+ if (OwnerAttributes)
+ {
+ return OwnerAttributes->NativeGetEffectsComponent();
+ }
+ return nullptr;
+}
+float UGAAbilityBase::GetAttributeValue(FGAAttribute AttributeIn) const
+{
+ return NativeGetAttributeValue(AttributeIn);
+}
+float UGAAbilityBase::NativeGetAttributeValue(const FGAAttribute AttributeIn) const
+{
+ return GetAttributes()->GetCurrentAttributeValue(AttributeIn);
+}
+float UGAAbilityBase::GetAttributeVal(FGAAttribute AttributeIn) const
+{
+ return GetAttributes()->GetCurrentAttributeValue(AttributeIn);
+}
+
+bool UGAAbilityBase::ApplyAttributeCost()
+{
+ FAFFunctionModifier Modifier;
+ if (CheckAttributeCost())
+ {
+ for (int32 Idx = 0; Idx < AttributeCost.Num(); Idx++)
+ {
+ AttributeCostHandle[Idx] = UGABlueprintLibrary::ApplyGameEffectToObject(
+ AttributeCost[Idx]
+ , POwner
+ , POwner
+ , this
+ , Modifier);
+ }
+ return true;
+ }
+ return false;
+}
+bool UGAAbilityBase::ApplyAbilityAttributeCost()
+{
+ //add checking if attribute goes below zero
+ //maybe let game specific code handle it..
+ FAFFunctionModifier Modifier;
+
+ if (CheckAbilityAttributeCost())
+ {
+ for (int32 Idx = 0; Idx < AbilityAttributeCost.Num(); Idx++)
+ {
+ AbilityAttributeCostHandle[Idx] = UGABlueprintLibrary::ApplyGameEffectToObject(
+ AbilityAttributeCost[Idx]
+ , this
+ , POwner
+ , this
+ , Modifier);
+ }
+ return true;
+ }
+ return false;
+}
+bool UGAAbilityBase::BP_ApplyAttributeCost()
+{
+ return ApplyAttributeCost();
+}
+bool UGAAbilityBase::BP_CheckAttributeCost()
+{
+ return CheckAttributeCost();
+}
+
+bool UGAAbilityBase::BP_ApplyAbilityAttributeCost()
+{
+ return ApplyAbilityAttributeCost();
+}
+bool UGAAbilityBase::BP_CheckAbilityAttributeCost()
+{
+ return CheckAbilityAttributeCost();
+}
+bool UGAAbilityBase::CheckAbilityAttributeCost()
+{
+ for (int32 Idx = 0; Idx < AbilityAttributeCost.Num(); Idx++)
+ {
+ float ModValue = AbilityAttributeCost[Idx].GetSpecData()->AtributeModifier.Magnitude.GetFloatValue(DefaultContext);
+ FGAAttribute Attribute = AbilityAttributeCost[Idx].GetSpecData()->AtributeModifier.Attribute;
+ float AttributeVal = GetAttributes()->GetFloatValue(Attribute);
+ if (ModValue > AttributeVal)
+ return false;
+ }
+ return true;
+}
+bool UGAAbilityBase::CheckAttributeCost()
+{
+ IAFAbilityInterface* Interface = Cast(POwner);
+
+ for (int32 Idx = 0; Idx < AttributeCost.Num(); Idx++)
+ {
+ float ModValue = AttributeCost[Idx].GetSpecData()->AtributeModifier.Magnitude.GetFloatValue(DefaultContext);
+ FGAAttribute Attribute = AttributeCost[Idx].GetSpecData()->AtributeModifier.Attribute;
+ float AttributeVal = Interface->GetAttributes()->GetFloatValue(Attribute);
+ if (ModValue > AttributeVal)
+ return false;
+ }
+ return true;
+}
+bool UGAAbilityBase::IsOnCooldown()
+{
+ if (CooldownEffectHandle.Num() <= 0)
+ return false;
+
+ bool bOnCooldown = false;
+ bOnCooldown = GetEffectsComponent()->IsEffectActive(CooldownEffectHandle[0]);
+ if (bOnCooldown)
+ {
+ OnNotifyOnCooldown.Broadcast();
+ }
+ return bOnCooldown; //temp
+}
+bool UGAAbilityBase::IsActivating()
+{
+ if (ActivationEffectHandle.Num() <= 0)
+ return false;
+
+ bool bAbilityActivating = false;
+ bool bHaveEffect = GetEffectsComponent()->IsEffectActive(ActivationEffectHandle[0]);
+ bool bInActivatingState = AbilityState == EAFAbilityState::Activating;
+ UE_LOG(AbilityFramework, Log, TEXT("IsActivating Ability, Effect: %s, State: %s \n"), bHaveEffect ? TEXT("true") : TEXT("false"), bInActivatingState ? TEXT("true") : TEXT("false"));
+ bAbilityActivating = bHaveEffect || bInActivatingState;
+
+ return bAbilityActivating; //temp
+}
+bool UGAAbilityBase::BP_IsOnCooldown()
+{
+ return IsOnCooldown();
+}
+void UGAAbilityBase::BP_ApplyCooldown()
+{
+ ApplyCooldownEffect();
+}
+
+float UGAAbilityBase::GetCurrentActivationTime()
+{
+ if (ActivationEffectHandle.Num() <= 0)
+ {
+ return 0;
+ }
+
+ if (ActivationEffectHandle[0].IsValid())
+ {
+ if (IAFAbilityInterface* Interface = DefaultContext.TargetInterface)
+ {
+ FGAEffect* Effect = Interface->GetEffectsComponent()->GetEffect(ActivationEffectHandle[0]);
+ if (Effect)
+ {
+ return Effect->GetCurrentDuration();
+ }
+ }
+ //return ActivationEffectHandle.GetEffectPtr()->GetCurrentDuration();
+ }
+ return 0;
+}
+
+float UGAAbilityBase::CalculateAnimationSpeed(UAnimMontage* MontageIn)
+{
+ float ActivationTime = MontageIn->GetPlayLength();
+ UGAGameEffectSpec* Spec = ActivationEffect.GetClass().GetDefaultObject();
+ float DurationCheck = Spec->Duration.GetFloatValue(DefaultContext);
+ if (DurationCheck > 0)
+ {
+ ActivationTime = DurationCheck;
+ }
+ float Duration = MontageIn->GetPlayLength();
+
+ float PlaySpeed = Duration / ActivationTime;
+ return PlaySpeed;
+}
+
+
+bool UGAAbilityBase::IsNameStableForNetworking() const
+{
+ return bIsNameStable;
+}
+
+void UGAAbilityBase::SetNetAddressable()
+{
+ bIsNameStable = true;
+}
+
+class UWorld* UGAAbilityBase::GetWorld() const
+{
+ return World;
+}
+void UGAAbilityBase::PlayMontage(UAnimMontage* MontageIn, FName SectionName, float Speed)
+{
+ AbilityComponent->PlayMontage(MontageIn, SectionName, Speed);
+}
+
+//replication
+void UGAAbilityBase::GetLifetimeReplicatedProps(TArray< class FLifetimeProperty > & OutLifetimeProps) const
+{
+ Super::GetLifetimeReplicatedProps(OutLifetimeProps);
+ //possibly can be infered upon replication.
+ //does other players need info about this ?
+ DOREPLIFETIME(UGAAbilityBase, POwner);
+ DOREPLIFETIME(UGAAbilityBase, PCOwner);
+ DOREPLIFETIME(UGAAbilityBase, AICOwner);
+ DOREPLIFETIME(UGAAbilityBase, AvatarActor);
+ //probabaly should be SKIP_Owner, and I'm not really sure if Multicast wouldn't be better.
+
+}
+int32 UGAAbilityBase::GetFunctionCallspace(UFunction* Function, void* Parameters, FFrame* Stack)
+{
+ if (HasAnyFlags(RF_ClassDefaultObject))
+ {
+ return FunctionCallspace::Local;
+ }
+ check(POwner != NULL);
+ return POwner->GetFunctionCallspace(Function, Parameters, Stack);
+}
+bool UGAAbilityBase::CallRemoteFunction(UFunction* Function, void* Parameters, FOutParmRec* OutParms, FFrame* Stack)
+{
+ check(!HasAnyFlags(RF_ClassDefaultObject));
+ check(POwner != NULL);
+
+
+ UNetDriver* NetDriver = POwner->GetNetDriver();
+ if (NetDriver)
+ {
+ NetDriver->ProcessRemoteFunction(POwner, Function, Parameters, OutParms, Stack, this);
+ return true;
+ }
+
+ return false;
+}
+
+void UGAAbilityBase::ExecuteAbilityInputPressedFromTag(FGameplayTag AbilityTagIn, FGameplayTag ActionName)
+{
+ //AbilityComponent->NativeInputPressed(ActionName);
+}
+void UGAAbilityBase::ExecuteAbilityInputReleasedFromTag(FGameplayTag AbilityTagIn, FGameplayTag ActionName)
+{
+ //AbilityComponent->NativeInputReleased(ActionName);
+}
+
+bool UGAAbilityBase::HaveGameplayTag(AActor* Target, const FGameplayTag& Tag)
+{
+ bool bHaveTag = false;
+ if (IAFAbilityInterface* Interface = Cast(Target))
+ {
+ if (UAFEffectsComponent* Comp = GetEffectsComponent())
+ {
+ if (Comp->HasTag(Tag))
+ {
+ bHaveTag = true;
+ }
+ }
+ }
+ return bHaveTag;
+}
+bool UGAAbilityBase::HaveAnyGameplayTag(AActor* Target, const FGameplayTagContainer& Tag)
+{
+ bool bHaveTag = false;
+ if (IAFAbilityInterface* Interface = Cast(Target))
+ {
+ if (UAFEffectsComponent* Comp = GetEffectsComponent())
+ {
+ if (Comp->HasAny(Tag))
+ {
+ bHaveTag = true;
+ }
+ }
+ }
+ return bHaveTag;
+}
+/* Tracing Helpers Start */
+bool UGAAbilityBase::LineTraceSingleByChannel(const FVector Start, const FVector End, ETraceTypeQuery TraceChannel, bool bTraceComplex, FHitResult& OutHit)
+{
+ ECollisionChannel CollisionChannel = UEngineTypes::ConvertToCollisionChannel(TraceChannel);
+ static const FName LineTraceSingleName(TEXT("AbilityLineTraceSingle"));
+ FCollisionQueryParams Params(LineTraceSingleName, bTraceComplex);
+
+ bool bHit = World->LineTraceSingleByChannel(OutHit, Start, End, CollisionChannel, Params);
+ return bHit;
+}
+bool UGAAbilityBase::LineTraceSingleByChannelFromCamera(float Range, ETraceTypeQuery TraceChannel, bool bTraceComplex, FHitResult& OutHit,
+ EDrawDebugTrace::Type DrawDebugType, bool bIgnoreSelf, FLinearColor TraceColor, FLinearColor TraceHitColor, float DrawTime)
+{
+ FVector Start = FVector::ZeroVector;
+ if (OwnerCamera)
+ {
+ Start = OwnerCamera->GetComponentLocation();
+ }
+ else
+ {
+ FRotator UnusedRot;
+ POwner->GetActorEyesViewPoint(Start, UnusedRot);
+ }
+ FVector End = (POwner->GetBaseAimRotation().Vector() * Range) + Start;
+ ECollisionChannel CollisionChannel = UEngineTypes::ConvertToCollisionChannel(TraceChannel);
+ static const FName LineTraceSingleName(TEXT("AbilityLineTraceSingle"));
+ FCollisionQueryParams Params(LineTraceSingleName, bTraceComplex);
+ bool bHit = World->LineTraceSingleByChannel(OutHit, Start, End, CollisionChannel, Params);
+#if ENABLE_DRAW_DEBUG
+ if (DrawDebugType != EDrawDebugTrace::None)
+ {
+ bool bPersistent = DrawDebugType == EDrawDebugTrace::Persistent;
+ float LifeTime = (DrawDebugType == EDrawDebugTrace::ForDuration) ? DrawTime : 0.f;
+
+ // @fixme, draw line with thickness = 2.f?
+ if (bHit && OutHit.bBlockingHit)
+ {
+ // Red up to the blocking hit, green thereafter
+ ::DrawDebugLine(World, Start, OutHit.ImpactPoint, TraceColor.ToFColor(true), bPersistent, LifeTime);
+ ::DrawDebugLine(World, OutHit.ImpactPoint, End, TraceHitColor.ToFColor(true), bPersistent, LifeTime);
+ ::DrawDebugPoint(World, OutHit.ImpactPoint, 16, TraceColor.ToFColor(true), bPersistent, LifeTime);
+ }
+ else
+ {
+ // no hit means all red
+ ::DrawDebugLine(World, Start, End, TraceColor.ToFColor(true), bPersistent, LifeTime);
+ }
+ }
+#endif
+ return bHit;
+}
+bool UGAAbilityBase::LineTraceSingleByChannelFromSocket(FName SocketName, float Range, ETraceTypeQuery TraceChannel, bool bTraceComplex, FHitResult& OutHit,
+ EDrawDebugTrace::Type DrawDebugType, bool bIgnoreSelf, FLinearColor TraceColor, FLinearColor TraceHitColor, float DrawTime)
+{
+ return false;
+}
+bool UGAAbilityBase::LineTraceSingleByChannelCorrected(FName SocketName, float Range, ETraceTypeQuery TraceChannel, bool bTraceComplex, FHitResult& OutHit,
+ EDrawDebugTrace::Type DrawDebugType, bool bIgnoreSelf, FLinearColor TraceColor, FLinearColor TraceHitColor, float DrawTime)
+{
+ return false;
+}
+/* Tracing Helpers End */
+
+//Helpers
+float UGAAbilityBase::GetActivationRemainingTime() const
+{
+ if (ActivationEffectHandle.Num() <= 0)
+ return 0;
+ return NativeGetEffectsComponent()->GameEffectContainer.GetRemainingTime(ActivationEffectHandle[0]);
+}
+float UGAAbilityBase::GetActivationRemainingTimeNormalized() const
+{
+ if (ActivationEffectHandle.Num() <= 0)
+ return 0;
+ return NativeGetEffectsComponent()->GameEffectContainer.GetRemainingTimeNormalized(ActivationEffectHandle[0]);
+}
+float UGAAbilityBase::GetActivationCurrentTime() const
+{
+ if (ActivationEffectHandle.Num() <= 0)
+ return 0;
+ return NativeGetEffectsComponent()->GameEffectContainer.GetCurrentTime(ActivationEffectHandle[0]);
+}
+float UGAAbilityBase::GetActivationCurrentTimeNormalized() const
+{
+ if (ActivationEffectHandle.Num() <= 0)
+ return 0;
+ return NativeGetEffectsComponent()->GameEffectContainer.GetCurrentTimeNormalized(ActivationEffectHandle[0]);
+}
+float UGAAbilityBase::GetActivationEndTime() const
+{
+ if (ActivationEffectHandle.Num() <= 0)
+ return 0;
+ return NativeGetEffectsComponent()->GameEffectContainer.GetEndTime(ActivationEffectHandle[0]);
+}
+float UGAAbilityBase::BP_GetActivationRemainingTime()
+{
+ return GetActivationRemainingTime();
+}
+float UGAAbilityBase::BP_GetActivationRemainingTimeNormalized()
+{
+ return GetActivationRemainingTimeNormalized();
+}
+float UGAAbilityBase::BP_GetActivationCurrentTime()
+{
+ return GetActivationCurrentTime();
+}
+float UGAAbilityBase::BP_GetActivationCurrentTimeNormalized()
+{
+ return GetActivationCurrentTimeNormalized();
+}
+float UGAAbilityBase::BP_GetActivationEndTime()
+{
+ return GetActivationEndTime();
+}
+
+
+float UGAAbilityBase::GetCooldownRemainingTime() const
+{
+ if (CooldownEffectHandle.Num() <= 0)
+ return 0;
+ return NativeGetEffectsComponent()->GameEffectContainer.GetRemainingTime(CooldownEffectHandle[0]);
+}
+float UGAAbilityBase::GetCooldownRemainingTimeNormalized() const
+{
+ if (CooldownEffectHandle.Num() <= 0)
+ return 0;
+ return NativeGetEffectsComponent()->GameEffectContainer.GetRemainingTimeNormalized(CooldownEffectHandle[0]);
+}
+float UGAAbilityBase::GetCooldownCurrentTime() const
+{
+ if (CooldownEffectHandle.Num() <= 0)
+ return 0;
+ return NativeGetEffectsComponent()->GameEffectContainer.GetCurrentTime(CooldownEffectHandle[0]);
+}
+float UGAAbilityBase::GetCooldownCurrentTimeNormalized() const
+{
+ if (CooldownEffectHandle.Num() <= 0)
+ return 0;
+ return NativeGetEffectsComponent()->GameEffectContainer.GetCurrentTimeNormalized(CooldownEffectHandle[0]);
+}
+float UGAAbilityBase::GetCooldownEndTime() const
+{
+ if (CooldownEffectHandle.Num() <= 0)
+ return 0;
+ return NativeGetEffectsComponent()->GameEffectContainer.GetEndTime(CooldownEffectHandle[0]);
+}
+float UGAAbilityBase::BP_GetCooldownRemainingTime()
+{
+ return GetCooldownRemainingTime();
+}
+float UGAAbilityBase::BP_GetCooldownRemainingTimeNormalized()
+{
+ return GetCooldownRemainingTimeNormalized();
+}
+float UGAAbilityBase::BP_GetCooldownCurrentTime()
+{
+ return GetCooldownCurrentTime();
+}
+float UGAAbilityBase::BP_GetCooldownCurrentTimeNormalized()
+{
+ return GetCooldownCurrentTimeNormalized();
+}
+float UGAAbilityBase::BP_GetCooldownEndTime()
+{
+ return GetCooldownEndTime();
+}
+
+AActor* UGAAbilityBase::BP_GetAvatar()
+{
+ return AvatarActor;
+}
+
+
+void UGAAbilityBase::OnLatentTaskAdded(FName InstanceName, class UAFTaskBase* TaskIn)
+{
+ if (!InstanceName.IsNone())
+ {
+ AbilityTasks.Add(InstanceName, TaskIn);
+ }
+};
+void UGAAbilityBase::AddReplicatedTask(class UAFTaskBase* TaskIn)
+{
+ AbilityComponent->ReplicatedTasks.Add(TaskIn);
+}
+void UGAAbilityBase::OnLatentTaskRemoved(class UAFTaskBase* TaskIn)
+{
+};
+
+void UGAAbilityBase::OnLatentTaskActivated(class UAFTaskBase* TaskIn)
+{
+};
+void UGAAbilityBase::OnLatentTaskDeactivated(class UAFTaskBase* TaskIn)
+{
+};
+
+class UAFTaskBase* UGAAbilityBase::GetCachedLatentAction(FName TaskName)
+{
+ return AbilityTasks.FindRef(TaskName);
+}
+class UGAAbilityTask* UGAAbilityBase::GetAbilityTask(const FName& InName)
+{
+ UAFTaskBase* result = AbilityTasks.FindRef(InName);
+ return Cast(result);
+}
diff --git a/Plugins/AbilityFramework/Source/AbilityFramework/Private/Abilities/GAAbilityBlueprint.cpp b/Plugins/AbilityFramework/Source/AbilityFramework/Private/Abilities/GAAbilityBlueprint.cpp
new file mode 100644
index 0000000..71133ea
--- /dev/null
+++ b/Plugins/AbilityFramework/Source/AbilityFramework/Private/Abilities/GAAbilityBlueprint.cpp
@@ -0,0 +1,33 @@
+// Copyright 1998-2017 Epic Games, Inc. All Rights Reserved.
+
+#include "../AbilityFramework.h"
+#include "GAAbilityBlueprint.h"
+
+//////////////////////////////////////////////////////////////////////////
+// UGameplayAbilityBlueprint
+
+UGAAbilityBlueprint::UGAAbilityBlueprint(const FObjectInitializer& ObjectInitializer)
+ : Super(ObjectInitializer)
+{
+}
+
+#if WITH_EDITOR
+
+/** Returns the most base gameplay ability blueprint for a given blueprint (if it is inherited from another ability blueprint, returning null if only native / non-ability BP classes are it's parent) */
+UGAAbilityBlueprint* UGAAbilityBlueprint::FindRootGameplayAbilityBlueprint(UGAAbilityBlueprint* DerivedBlueprint)
+{
+ UGAAbilityBlueprint* ParentBP = NULL;
+
+ // Determine if there is a gameplay ability blueprint in the ancestry of this class
+ for (UClass* ParentClass = DerivedBlueprint->ParentClass; ParentClass != UObject::StaticClass(); ParentClass = ParentClass->GetSuperClass())
+ {
+ if (UGAAbilityBlueprint* TestBP = Cast(ParentClass->ClassGeneratedBy))
+ {
+ ParentBP = TestBP;
+ }
+ }
+
+ return ParentBP;
+}
+
+#endif
diff --git a/Plugins/AbilityFramework/Source/AbilityFramework/Private/Abilities/Tasks/AFAbilityTask_SpawnProjectile.cpp b/Plugins/AbilityFramework/Source/AbilityFramework/Private/Abilities/Tasks/AFAbilityTask_SpawnProjectile.cpp
new file mode 100644
index 0000000..dee0062
--- /dev/null
+++ b/Plugins/AbilityFramework/Source/AbilityFramework/Private/Abilities/Tasks/AFAbilityTask_SpawnProjectile.cpp
@@ -0,0 +1,30 @@
+// Fill out your copyright notice in the Description page of Project Settings.
+
+#include "AbilityFramework.h"
+#include "AFAbilityTask_SpawnProjectile.h"
+
+
+
+
+UAFAbilityTask_SpawnProjectile* UAFAbilityTask_SpawnProjectile::Ability_SpawnProjectile(UGAAbilityBase* WorldContextObject,
+ FName InTaskName,
+ FVector InStartLocation,
+ FVector InEndLocation,
+ float InLaunchSpeed,
+ float InOverrideGravityZ,
+ EAFPRojectileSpawnTraceOption InTraceOption,
+ float InCollisionRadius,
+ bool InbFavorHighArc,
+ bool InbDrawDebug)
+{
+ auto MyObj = NewAbilityTask(WorldContextObject, InTaskName);
+ MyObj->StartLocation = InStartLocation;
+ MyObj->EndLocation = InEndLocation;
+ MyObj->LaunchSpeed = InLaunchSpeed;
+ MyObj->OverrideGravityZ = InOverrideGravityZ;
+ MyObj->TraceOption = InTraceOption;
+ MyObj->CollisionRadius = InCollisionRadius;
+ MyObj->bFavorHighArc = InbFavorHighArc;
+ MyObj->bDrawDebug = InbDrawDebug;
+ return MyObj;
+}
\ No newline at end of file
diff --git a/Plugins/AbilityFramework/Source/AbilityFramework/Private/Abilities/Tasks/GAAbilityTask.cpp b/Plugins/AbilityFramework/Source/AbilityFramework/Private/Abilities/Tasks/GAAbilityTask.cpp
new file mode 100644
index 0000000..190da1a
--- /dev/null
+++ b/Plugins/AbilityFramework/Source/AbilityFramework/Private/Abilities/Tasks/GAAbilityTask.cpp
@@ -0,0 +1,12 @@
+// Copyright 1998-2014 Epic Games, Inc. All Rights Reserved.
+
+#include "../../AbilityFramework.h"
+#include "../GAAbilityBase.h"
+#include "GAAbilityTask.h"
+
+UGAAbilityTask::UGAAbilityTask(const FObjectInitializer& ObjectInitializer)
+: Super(ObjectInitializer)
+{
+ bIsReplicated = false;
+ SetFlags(RF_StrongRefOnFrame);
+}
diff --git a/Plugins/AbilityFramework/Source/AbilityFramework/Private/Abilities/Tasks/GAAbilityTask_CreateObject.cpp b/Plugins/AbilityFramework/Source/AbilityFramework/Private/Abilities/Tasks/GAAbilityTask_CreateObject.cpp
new file mode 100644
index 0000000..c82011a
--- /dev/null
+++ b/Plugins/AbilityFramework/Source/AbilityFramework/Private/Abilities/Tasks/GAAbilityTask_CreateObject.cpp
@@ -0,0 +1,64 @@
+// Fill out your copyright notice in the Description page of Project Settings.
+
+#include "../../AbilityFramework.h"
+#include "GAAbilityTask_CreateObject.h"
+
+UGAAbilityTask_CreateObject* UGAAbilityTask_CreateObject::CreateObject(UGAAbilityBase* WorldContextObject,
+ FName InTaskName, TSubclassOf Class, UObject* Outer)
+{
+ auto MyObj = NewAbilityTask(WorldContextObject);
+ //if(MyObj)
+ // MyObj->SpawnObject(WorldContextObject, InClass, Outer);
+ //MyObj->CachedTargetDataHandle = TargetData;
+ return MyObj;
+}
+
+// ---------------------------------------------------------------------------------------
+
+bool UGAAbilityTask_CreateObject::BeginSpawningActor(UGAAbilityBase* WorldContextObject,
+ TSubclassOf Class, UObject*& SpawnedActor)
+{
+ //if (Ability.IsValid() && Ability.Get()->GetCurrentActorInfo()->IsNetAuthority())
+ //{
+ //UWorld* const World = GEngine->GetWorldFromContextObject(WorldContextObject);
+ //if (World)
+ //{
+ SpawnedActor = NewObject(WorldContextObject, Class);
+ //}
+ //}
+
+ if (SpawnedActor == nullptr)
+ {
+ Failure.Broadcast(nullptr);
+ return false;
+ }
+ UE_LOG(AbilityFramework, Log, TEXT("Begin Spawning Actor in GAAbilityTask_SpawnActor"));
+ return true;
+}
+
+void UGAAbilityTask_CreateObject::FinishSpawningActor(UGAAbilityBase* WorldContextObject, UObject* SpawnedActor)
+{
+ if (SpawnedActor)
+ {
+ FTransform SpawnTransform;// = AbilitySystemComponent->GetOwner()->GetTransform();
+
+ //if (FGameplayAbilityTargetData* LocationData = CachedTargetDataHandle.Get(0)) //Hardcode to use data 0. It's OK if data isn't useful/valid.
+ //{
+ // //Set location. Rotation is unaffected.
+ // if (LocationData->HasHitResult())
+ // {
+ // SpawnTransform.SetLocation(LocationData->GetHitResult()->Location);
+ // }
+ // else if (LocationData->HasEndPoint())
+ // {
+ // SpawnTransform.SetLocation(LocationData->GetEndPoint());
+ // }
+ //}
+
+ //SpawnedActor->FinishSpawning(SpawnTransform);
+
+ Success.Broadcast(SpawnedActor);
+ }
+ UE_LOG(AbilityFramework, Log, TEXT("Finish Spawning Actor in GAAbilityTask_SpawnActor"));
+ EndTask();
+}
diff --git a/Plugins/AbilityFramework/Source/AbilityFramework/Private/Abilities/Tasks/GAAbilityTask_PlayMontage.cpp b/Plugins/AbilityFramework/Source/AbilityFramework/Private/Abilities/Tasks/GAAbilityTask_PlayMontage.cpp
new file mode 100644
index 0000000..3ab4e2e
--- /dev/null
+++ b/Plugins/AbilityFramework/Source/AbilityFramework/Private/Abilities/Tasks/GAAbilityTask_PlayMontage.cpp
@@ -0,0 +1,50 @@
+// Fill out your copyright notice in the Description page of Project Settings.
+
+#include "../../AbilityFramework.h"
+#include "../../AFAbilityComponent.h"
+#include "GAAbilityTask_PlayMontage.h"
+
+UGAAbilityTask_PlayMontage* UGAAbilityTask_PlayMontage::AbilityPlayMontage(UGAAbilityBase* WorldContextObject,
+ FName InTaskName, UAnimMontage* MontageIn, FName SectionNameIn, float PlayRateIn,
+ bool bInUseActivationTime)
+{
+ auto MyObj = NewAbilityTask(WorldContextObject);
+ MyObj->Montage = MontageIn;
+ MyObj->SectionName = SectionNameIn;
+ MyObj->PlayRate = PlayRateIn;
+ MyObj->bUseActivationTime = bInUseActivationTime;
+ return MyObj;
+}
+
+void UGAAbilityTask_PlayMontage::Activate()
+{
+ AbilityComponent->OnAbilityNotifyBegin.Unbind();
+ AbilityComponent->OnAbilityNotifyTick.Unbind();
+ AbilityComponent->OnAbilityNotifyEnd.Unbind();
+
+ AbilityComponent->OnAbilityNotifyBegin.BindUObject(this, &UGAAbilityTask_PlayMontage::BroadcastStartNotifyState);
+ AbilityComponent->OnAbilityNotifyTick.BindUObject(this, &UGAAbilityTask_PlayMontage::BroadcastTickNotifyState);
+ AbilityComponent->OnAbilityNotifyEnd.BindUObject(this, &UGAAbilityTask_PlayMontage::BroadcastEndNotifyState);
+ if (bUseActivationTime)
+ {
+ PlayRate = Ability->CalculateAnimationSpeed(Montage);
+ Ability->PlayMontage(Montage, SectionName, PlayRate);
+ }
+ else
+ {
+ Ability->PlayMontage(Montage, SectionName, PlayRate);
+ }
+}
+
+void UGAAbilityTask_PlayMontage::BroadcastStartNotifyState(const FGameplayTag& InTag, const FName& InName)
+{
+ NotifyBegin.Broadcast(InTag, InName);
+}
+void UGAAbilityTask_PlayMontage::BroadcastEndNotifyState(const FGameplayTag& InTag, const FName& InName)
+{
+ NotifyTick.Broadcast(InTag, InName);
+}
+void UGAAbilityTask_PlayMontage::BroadcastTickNotifyState(const FGameplayTag& InTag, const FName& InName)
+{
+ NotifyEnd.Broadcast(InTag, InName);
+}
\ No newline at end of file
diff --git a/Plugins/AbilityFramework/Source/AbilityFramework/Private/Abilities/Tasks/GAAbilityTask_Repeat.cpp b/Plugins/AbilityFramework/Source/AbilityFramework/Private/Abilities/Tasks/GAAbilityTask_Repeat.cpp
new file mode 100644
index 0000000..1ee4cbb
--- /dev/null
+++ b/Plugins/AbilityFramework/Source/AbilityFramework/Private/Abilities/Tasks/GAAbilityTask_Repeat.cpp
@@ -0,0 +1,15 @@
+// Fill out your copyright notice in the Description page of Project Settings.
+
+#include "../../AbilityFramework.h"
+#include "GAAbilityTask_Repeat.h"
+
+
+
+
+UGAAbilityTask_Repeat* UGAAbilityTask_Repeat::CreateRepeatTask(UGAAbilityBase* WorldContextObject,
+ FName InTaskName)
+{
+ auto MyObj = NewAbilityTask(WorldContextObject);
+ //MyObj->CachedTargetDataHandle = TargetData;
+ return MyObj;
+}
diff --git a/Plugins/AbilityFramework/Source/AbilityFramework/Private/Abilities/Tasks/GAAbilityTask_SpawnActor.cpp b/Plugins/AbilityFramework/Source/AbilityFramework/Private/Abilities/Tasks/GAAbilityTask_SpawnActor.cpp
new file mode 100644
index 0000000..a075365
--- /dev/null
+++ b/Plugins/AbilityFramework/Source/AbilityFramework/Private/Abilities/Tasks/GAAbilityTask_SpawnActor.cpp
@@ -0,0 +1,70 @@
+// Fill out your copyright notice in the Description page of Project Settings.
+
+#include "../../AbilityFramework.h"
+#include "GAAbilityTask_SpawnActor.h"
+
+
+
+
+
+UGAAbilityTask_SpawnActor* UGAAbilityTask_SpawnActor::SpawnActor(UGAAbilityBase* WorldContextObject,
+ FName InTaskName, TSubclassOf InClass)
+{
+ auto MyObj = NewAbilityTask(WorldContextObject);
+ //MyObj->CachedTargetDataHandle = TargetData;
+ return MyObj;
+}
+
+// ---------------------------------------------------------------------------------------
+void UGAAbilityTask_SpawnActor::Activate()
+{
+ UE_LOG(AbilityFramework, Log, TEXT("TArget object spawned"));
+ //EndTask();
+}
+
+bool UGAAbilityTask_SpawnActor::BeginSpawningActor(UGAAbilityBase* WorldContextObject, TSubclassOf InClass, AActor*& SpawnedActor)
+{
+ //if (Ability.IsValid() && Ability.Get()->GetCurrentActorInfo()->IsNetAuthority())
+ //{
+ UWorld* const World = GEngine->GetWorldFromContextObject(WorldContextObject, EGetWorldErrorMode::LogAndReturnNull);
+ if (World)
+ {
+ SpawnedActor = World->SpawnActorDeferred(InClass, FTransform::Identity, NULL, NULL, ESpawnActorCollisionHandlingMethod::AlwaysSpawn);
+ }
+ //}
+
+ if (SpawnedActor == nullptr)
+ {
+ Failure.Broadcast(nullptr);
+ return false;
+ }
+ UE_LOG(AbilityFramework, Log, TEXT("Begin Spawning Actor in GAAbilityTask_SpawnActor"));
+ return true;
+}
+
+void UGAAbilityTask_SpawnActor::FinishSpawningActor(UGAAbilityBase* WorldContextObject, AActor* SpawnedActor)
+{
+ if (SpawnedActor)
+ {
+ FTransform SpawnTransform;// = AbilitySystemComponent->GetOwner()->GetTransform();
+
+ //if (FGameplayAbilityTargetData* LocationData = CachedTargetDataHandle.Get(0)) //Hardcode to use data 0. It's OK if data isn't useful/valid.
+ //{
+ // //Set location. Rotation is unaffected.
+ // if (LocationData->HasHitResult())
+ // {
+ // SpawnTransform.SetLocation(LocationData->GetHitResult()->Location);
+ // }
+ // else if (LocationData->HasEndPoint())
+ // {
+ // SpawnTransform.SetLocation(LocationData->GetEndPoint());
+ // }
+ //}
+
+ SpawnedActor->FinishSpawning(SpawnTransform);
+
+ Success.Broadcast(SpawnedActor);
+ }
+ UE_LOG(AbilityFramework, Log, TEXT("Finish Spawning Actor in GAAbilityTask_SpawnActor"));
+ //EndTask();
+}
diff --git a/Plugins/AbilityFramework/Source/AbilityFramework/Private/Abilities/Tasks/GAAbilityTask_TargetData.cpp b/Plugins/AbilityFramework/Source/AbilityFramework/Private/Abilities/Tasks/GAAbilityTask_TargetData.cpp
new file mode 100644
index 0000000..9221e99
--- /dev/null
+++ b/Plugins/AbilityFramework/Source/AbilityFramework/Private/Abilities/Tasks/GAAbilityTask_TargetData.cpp
@@ -0,0 +1,154 @@
+// Fill out your copyright notice in the Description page of Project Settings.
+
+#include "../../AbilityFramework.h"
+#include "../GAAbilityBase.h"
+#include "GAAbilityTask_TargetData.h"
+
+
+UGAAbilityTask_TargetData* UGAAbilityTask_TargetData::CreateTargetDataTask(UGAAbilityBase* WorldContextObject,
+ FName InTaskName,
+ bool bDrawDebug,
+ bool bDrawCorrectedDebug,
+ bool bUseCorrectedTrace,
+ EGASConfirmType ConfirmTypeIn,
+ float Range)
+{
+ auto MyObj = NewAbilityTask(WorldContextObject);
+
+ if (MyObj)
+ {
+ MyObj->Range = Range;
+ MyObj->ConfirmType = ConfirmTypeIn;
+ MyObj->bIsTickable = false;
+ MyObj->bDrawDebug = bDrawDebug;
+ MyObj->bDrawCorrectedDebug = bDrawCorrectedDebug;
+ MyObj->bUseCorrectedTrace = bUseCorrectedTrace;
+ }
+ return MyObj;
+}
+
+void UGAAbilityTask_TargetData::Activate()
+{
+ switch (ConfirmType)
+ {
+ case EGASConfirmType::Instant:
+ {
+ FHitResult Hit = LineTrace();
+ OnReceiveTargetData.Broadcast(Hit);
+ EndTask();
+ break;
+ }
+ case EGASConfirmType::WaitForConfirm:
+ {
+ if (Ability.IsValid())
+ {
+ if (!Ability->OnConfirmDelegate.IsBoundToObject(this))
+ {
+ Ability->OnConfirmDelegate.AddUObject(this, &UGAAbilityTask_TargetData::OnConfirm);
+ bIsTickable = true;
+ }
+ if (!Ability->OnConfirmCastingEndedDelegate.IsBoundToObject(this))
+ {
+ Ability->OnConfirmCastingEndedDelegate.AddUObject(this, &UGAAbilityTask_TargetData::OnCastEndedConfirm);
+ }
+ }
+ break;
+ }
+ }
+}
+
+// ---------------------------------------------------------------------------------------
+
+void UGAAbilityTask_TargetData::OnConfirm()
+{
+ FHitResult Hit(ForceInit);// = LineTrace();
+ OnConfirmed.Broadcast(Hit);
+ Ability->OnConfirmDelegate.RemoveAll(this);
+}
+void UGAAbilityTask_TargetData::OnCastEndedConfirm()
+{
+ FHitResult Hit = LineTrace();
+ OnReceiveTargetData.Broadcast(Hit);
+ bIsTickable = false;
+ EndTask();
+}
+void UGAAbilityTask_TargetData::Tick(float DeltaTime)
+{
+ //FHitResult HitOut = LineTrace();
+}
+
+FHitResult UGAAbilityTask_TargetData::LineTrace()
+{
+ FHitResult HitOut;
+ APlayerController* PC = Ability->PCOwner;
+ APawn* P = Ability->POwner;
+ UCameraComponent* Camera = Ability->OwnerCamera;
+ FVector TraceStart;
+ FRotator UnusedRot;
+ if (PC)
+ {
+ PC->PlayerCameraManager->GetCameraViewPoint(TraceStart, UnusedRot);
+// TraceStart = Camera->GetComponentLocation();
+ }
+ else
+ {
+ UnusedRot = P->GetBaseAimRotation();
+ TraceStart = P->GetPawnViewLocation();
+ }
+
+ FVector TraceEnd = UnusedRot.Vector() * Range + TraceStart;
+ UWorld* World = GetWorld();
+ FCollisionQueryParams ColParams;
+ ColParams.AddIgnoredActor(P);
+ FCollisionResponseParams ColResp;
+ World->LineTraceSingleByChannel(HitOut, TraceStart, TraceEnd, ECollisionChannel::ECC_WorldStatic, ColParams, ColResp);
+ if (HitOut.bBlockingHit)
+ {
+ FHitResult NewHit;
+ FVector Start = P->GetPawnViewLocation();
+ FVector NewDir = (HitOut.Location - Start).GetSafeNormal();
+ float Distance = FVector::Dist(Start, HitOut.Location);
+ FVector End = Start + (NewDir * Range);
+ World->LineTraceSingleByChannel(NewHit, Start, End, ECollisionChannel::ECC_WorldStatic, ColParams, ColResp);
+
+ if (bDrawCorrectedDebug)
+ {
+ DrawDebugLine(GetWorld(), Start, End, FColor::Green, true, 2);// GetWorld()->DeltaTimeSeconds);
+ if (NewHit.bBlockingHit)
+ {
+ DrawDebugLine(GetWorld(), Start, NewHit.Location, FColor::Magenta, true, 2);//GetWorld()->DeltaTimeSeconds);
+ DrawDebugPoint(GetWorld(), NewHit.Location, 8, FColor::Magenta, true, 2);//GetWorld()->DeltaTimeSeconds);
+ }
+ }
+ }
+ else
+ {
+ FHitResult NewHit;
+ FVector Start = P->GetPawnViewLocation();
+ FVector NewDir = (TraceEnd - Start).GetSafeNormal();
+ float Distance = Range - FVector::Dist(TraceStart, Start);
+ FVector End = Start + (NewDir * Distance);
+
+ World->LineTraceSingleByChannel(NewHit, Start, End, ECollisionChannel::ECC_WorldStatic, ColParams, ColResp);
+
+ if (bDrawCorrectedDebug)
+ {
+ DrawDebugLine(GetWorld(), Start, End, FColor::Green, true, 2);//GetWorld()->DeltaTimeSeconds);
+ if (NewHit.bBlockingHit)
+ {
+ DrawDebugLine(GetWorld(), Start, NewHit.Location, FColor::Magenta, true, 2);//GetWorld()->DeltaTimeSeconds);
+ DrawDebugPoint(GetWorld(), NewHit.Location, 8, FColor::Magenta, true, 2);//GetWorld()->DeltaTimeSeconds);
+ }
+ }
+ }
+ if (bDrawDebug)
+ {
+ if (HitOut.bBlockingHit)
+ {
+ DrawDebugLine(GetWorld(), TraceStart, HitOut.ImpactPoint, FColor::Red, true, 2);//GetWorld()->DeltaTimeSeconds);
+ DrawDebugPoint(GetWorld(), HitOut.Location, 8, FColor::Red, true, 2);//GetWorld()->DeltaTimeSeconds);
+ }
+ DrawDebugLine(GetWorld(), TraceStart, TraceEnd, FColor::Green, true, 2);//GetWorld()->DeltaTimeSeconds);
+ }
+ return HitOut;
+}
diff --git a/Plugins/AbilityFramework/Source/AbilityFramework/Private/Abilities/Tasks/GAAbilityTask_TargetDataCircle.cpp b/Plugins/AbilityFramework/Source/AbilityFramework/Private/Abilities/Tasks/GAAbilityTask_TargetDataCircle.cpp
new file mode 100644
index 0000000..1d539b4
--- /dev/null
+++ b/Plugins/AbilityFramework/Source/AbilityFramework/Private/Abilities/Tasks/GAAbilityTask_TargetDataCircle.cpp
@@ -0,0 +1,64 @@
+// Fill out your copyright notice in the Description page of Project Settings.
+
+#include "../../AbilityFramework.h"
+#include "../GAAbilityBase.h"
+#include "GAAbilityTask_TargetDataCircle.h"
+
+
+UGAAbilityTask_TargetDataCircle* UGAAbilityTask_TargetDataCircle::TargetCircleDataTask(UGAAbilityBase* WorldContextObject,
+ FName InTaskName, EGASConfirmType ConfirmTypeIn)
+{
+ auto MyObj = NewAbilityTask(WorldContextObject);
+
+ if (MyObj)
+ {
+ MyObj->ConfirmType = ConfirmTypeIn;
+ }
+ return MyObj;
+}
+
+void UGAAbilityTask_TargetDataCircle::Activate()
+{
+ switch (ConfirmType)
+ {
+ case EGASConfirmType::Instant:
+ {
+
+ }
+ case EGASConfirmType::WaitForConfirm:
+ {
+ if (Ability.IsValid())
+ {
+ if (!Ability->OnConfirmDelegate.IsBoundToObject(this))
+ {
+ Ability->OnConfirmDelegate.AddUObject(this, &UGAAbilityTask_TargetDataCircle::OnConfirm);
+ }
+ }
+ }
+ }
+ //EndTask();
+}
+
+// ---------------------------------------------------------------------------------------
+
+//bool UGAAbilityTask_TargetDataCircle::BeginSpawningActor(UObject* WorldContextObject, UGASAbilityTargetingObject*& SpawnedActor)
+//{
+// SpawnedActor = Class.GetDefaultObject();//NewObject(WorldContext
+// return true;
+//}
+//
+//void UGAAbilityTask_TargetDataCircle::FinishSpawningActor(UObject* WorldContextObject, UGASAbilityTargetingObject* SpawnedActor)
+//{
+// if (SpawnedActor)
+// {
+// //Success.Broadcast(SpawnedActor);
+// }
+// UE_LOG(AbilityFramework, Log, TEXT("Finish Spawning Actor in GAAbilityTask_SpawnActor"));
+// ReadyForActivation();
+//}
+
+void UGAAbilityTask_TargetDataCircle::OnConfirm()
+{
+ //TargetObj2->GetTarget();
+ EndTask();
+}
\ No newline at end of file
diff --git a/Plugins/AbilityFramework/Source/AbilityFramework/Private/Abilities/Tasks/GAAbilityTask_TargetDataLineTrace.cpp b/Plugins/AbilityFramework/Source/AbilityFramework/Private/Abilities/Tasks/GAAbilityTask_TargetDataLineTrace.cpp
new file mode 100644
index 0000000..e1d2875
--- /dev/null
+++ b/Plugins/AbilityFramework/Source/AbilityFramework/Private/Abilities/Tasks/GAAbilityTask_TargetDataLineTrace.cpp
@@ -0,0 +1,261 @@
+// Fill out your copyright notice in the Description page of Project Settings.
+
+#include "AbilityFramework.h"
+#include "Abilities/GAAbilityBase.h"
+#include "GAAbilityTask_TargetDataLineTrace.h"
+
+
+UGAAbilityTask_TargetDataLineTrace* UGAAbilityTask_TargetDataLineTrace::CreateTargetDataLineTrace(UGAAbilityBase* WorldContextObject
+ , FName InTaskName
+ , ETraceTypeQuery InTraceChannel
+ , USkeletalMeshComponent* InSocketComponent
+ , FName InSocketName
+ , bool bDrawDebug
+ , EAFConfirmType ConfirmTypeIn
+ , float Range)
+{
+ auto MyObj = NewAbilityTask(WorldContextObject, InTaskName);
+
+ if (MyObj)
+ {
+ MyObj->TraceChannel = InTraceChannel;
+ MyObj->Range = Range;
+ MyObj->ConfirmType = ConfirmTypeIn;
+ MyObj->SocketComponent = InSocketComponent;
+ MyObj->SocketName = InSocketName;
+ MyObj->bIsTickable = false;
+ MyObj->bDrawDebug = bDrawDebug;
+ }
+ return MyObj;
+}
+UGAAbilityTask_TargetDataLineTrace::UGAAbilityTask_TargetDataLineTrace(const FObjectInitializer& ObjectInitializer)
+ : Super(ObjectInitializer)
+{
+ bIsReplicated = true;
+}
+void UGAAbilityTask_TargetDataLineTrace::Activate()
+{
+ LocalHitResult.Reset(1, false);
+ FHitResult HitData;
+ switch (ConfirmType)
+ {
+ case EAFConfirmType::Instant:
+ {
+
+ HitData = LineTrace();
+ LocalHitResult = HitData;
+ //OnClient... Is called on both Client and server and is result of local simulation
+ //unconfirmed by server. This result might get overrided when data from server arrive to client
+ //it's good to spawn some cosmetic effects, but shouldn't be used to actually confirm hit result on client.
+
+ //OnServer.. is confirmed by server that we got hit (or not), and should be used to show client confirmation
+ //for hits.
+ if (IsServerOrStandalone())
+ {
+ //OnClientReceiveTargetData.Broadcast(HitData);
+ OnServerReceiveTargetData.Broadcast(HitData);
+
+ }
+ else
+ {
+ OnClientUnconfirmedTargetData.Broadcast(HitData);
+ }
+ break;
+ }
+ case EAFConfirmType::WaitForConfirm:
+ {
+ if (Ability.IsValid())
+ {
+ if (!Ability->OnConfirmDelegate.IsBoundToObject(this))
+ {
+ Ability->OnConfirmDelegate.AddUObject(this, &UGAAbilityTask_TargetDataLineTrace::OnConfirm);
+ bIsTickable = true;
+ }
+ if (!Ability->OnConfirmCastingEndedDelegate.IsBoundToObject(this))
+ {
+ Ability->OnConfirmCastingEndedDelegate.AddUObject(this, &UGAAbilityTask_TargetDataLineTrace::OnCastEndedConfirm);
+ }
+ }
+ break;
+ }
+ }
+ //if (HitData.IsValidBlockingHit())
+ {
+ if (AbilityComponent->GetOwnerRole() < ROLE_Authority)
+ {
+ APlayerController* PC = Ability->PCOwner;
+ APawn* P = Ability->POwner;
+
+ PC->PlayerState->RecalculateAvgPing();
+ float ExactPing = PC->PlayerState->ExactPing;
+
+ FAFLineTraceData TraceData;
+ TraceData.ExactPing = ExactPing;
+ TraceData.HitActor = HitData.GetActor();
+ TraceData.HitLocation = HitData.Location;
+ ServerConfirmHitInfo(TraceData);
+
+ }
+ }
+ if (AbilityComponent->GetOwnerRole() == ROLE_Authority)
+ {
+ EndTask();
+ }
+
+}
+
+void UGAAbilityTask_TargetDataLineTrace::ServerConfirmHitInfo_Implementation(FAFLineTraceData TraceData)
+{
+ int test = 0;
+ UE_LOG(AbilityFramework, Log, TEXT("%s Server Confirm Hit"), *GetName());
+ FAFLineTraceConfirmData ConfirmData;
+ ConfirmData.bConfirmed = true;
+ ConfirmData.HitActor = LocalHitResult.GetActor();
+ ConfirmData.HitLocation = LocalHitResult.Location;
+ ClientConfirmHitInfo(ConfirmData);
+}
+bool UGAAbilityTask_TargetDataLineTrace::ServerConfirmHitInfo_Validate(FAFLineTraceData TraceData)
+{
+ return true;
+}
+
+void UGAAbilityTask_TargetDataLineTrace::ClientConfirmHitInfo_Implementation(FAFLineTraceConfirmData ConfirmData)
+{
+ if (ConfirmData.bConfirmed)
+ {
+ UE_LOG(AbilityFramework, Log, TEXT("%s Client Hit Confirmed"), *GetName());
+ OnClientReceiveTargetData.Broadcast(LocalHitResult);
+ }
+ else
+ {
+ UE_LOG(AbilityFramework, Log, TEXT("%s Client Hit Overrided"), *GetName());
+ LocalHitResult.Actor = ConfirmData.HitActor;
+ LocalHitResult.Location = ConfirmData.HitLocation;
+ LocalHitResult.ImpactPoint = ConfirmData.HitLocation;
+ OnClientReceiveTargetData.Broadcast(LocalHitResult);
+ }
+ EndTask();
+}
+
+// ---------------------------------------------------------------------------------------
+
+void UGAAbilityTask_TargetDataLineTrace::OnConfirm()
+{
+ FHitResult Hit = LineTrace();
+ //OnConfirmed.Broadcast(Hit);
+
+ Ability->OnConfirmDelegate.RemoveAll(this);
+}
+void UGAAbilityTask_TargetDataLineTrace::OnCastEndedConfirm()
+{
+ FHitResult Hit = LineTrace();
+ LocalHitResult = Hit;
+ //OnClient... Is called on both Client and server and is result of local simulation
+ //unconfirmed by server. This result might get overrided when data from server arrive to client
+ //it's good to spawn some cosmetic effects, but shouldn't be used to actually confirm hit result on client.
+
+ //OnServer.. is confirmed by server that we got hit (or not), and should be used to show client confirmation
+ //for hits.
+ if (AbilityComponent->GetOwnerRole() < ROLE_Authority)
+ {
+ APlayerController* PC = Ability->PCOwner;
+ APawn* P = Ability->POwner;
+
+ PC->PlayerState->RecalculateAvgPing();
+ float ExactPing = PC->PlayerState->ExactPing;
+
+ FAFLineTraceData TraceData;
+ TraceData.ExactPing = ExactPing;
+ TraceData.HitActor = Hit.GetActor();
+ TraceData.HitLocation = Hit.Location;
+ ServerConfirmHitInfo(TraceData);
+
+ }
+
+ if (IsServerOrStandalone())
+ {
+ //OnClientReceiveTargetData.Broadcast(HitData);
+ OnServerReceiveTargetData.Broadcast(Hit);
+ EndTask();
+ }
+ else
+ {
+ OnClientUnconfirmedTargetData.Broadcast(Hit);
+ }
+ bIsTickable = false;
+ EndTask();
+}
+void UGAAbilityTask_TargetDataLineTrace::Tick(float DeltaTime)
+{
+ //FHitResult HitOut = LineTrace();
+}
+
+FHitResult UGAAbilityTask_TargetDataLineTrace::LineTrace()
+{
+ FHitResult HitOut;
+ APlayerController* PC = Ability->PCOwner;
+ APawn* P = Ability->POwner;
+
+
+ UCameraComponent* Camera = Ability->OwnerCamera;
+ FVector TraceStart;
+ FRotator UnusedRot;
+ if (PC)
+ {
+ PC->PlayerCameraManager->GetCameraViewPoint(TraceStart, UnusedRot);
+// TraceStart = Camera->GetComponentLocation();
+ }
+ else
+ {
+ UnusedRot = P->GetBaseAimRotation();
+ TraceStart = P->GetPawnViewLocation();
+ }
+
+ FVector TraceEnd = UnusedRot.Vector() * Range + TraceStart;
+ UWorld* World = GetWorld();
+ FCollisionQueryParams ColParams;
+ ColParams.AddIgnoredActor(P);
+ FCollisionResponseParams ColResp;
+ ECollisionChannel CollisionChannel = UEngineTypes::ConvertToCollisionChannel(TraceChannel);
+ World->LineTraceSingleByChannel(HitOut, TraceStart, TraceEnd, CollisionChannel, ColParams, ColResp);
+ if (HitOut.bBlockingHit)
+ {
+ FHitResult NewHit;
+ FVector Start = SocketComponent->GetSocketLocation(SocketName);
+ FVector NewDir = (HitOut.Location - Start).GetSafeNormal();
+ float Distance = FVector::Dist(Start, HitOut.Location);
+ FVector End = Start + (NewDir * Range);
+ World->LineTraceSingleByChannel(NewHit, Start, End, CollisionChannel, ColParams, ColResp);
+ UE_LOG(AbilityFramework, Log, TEXT("UGAAbilityTask_TargetDataLineTrace::LineTrace Corrected"));
+ if (bDrawDebug)
+ {
+ DrawDebugLine(GetWorld(), Start, End, FColor::Green, false, 1.0f);
+ if (NewHit.bBlockingHit)
+ {
+ DrawDebugLine(GetWorld(), Start, NewHit.Location, FColor::Magenta, false, 1.0f);
+ DrawDebugPoint(GetWorld(), NewHit.Location, 8, FColor::Magenta, false, 1.0f);
+ }
+ }
+ }
+ else
+ {
+ FHitResult NewHit;
+ FVector Start = SocketComponent->GetSocketLocation(SocketName);
+ FVector NewDir = (TraceEnd - Start).GetSafeNormal();
+ float Distance = Range - FVector::Dist(TraceStart, Start);
+ FVector End = Start + (NewDir * Distance);
+
+ World->LineTraceSingleByChannel(NewHit, Start, End, CollisionChannel, ColParams, ColResp);
+ UE_LOG(AbilityFramework, Log, TEXT("UGAAbilityTask_TargetDataLineTrace::LineTrace"));
+ if (bDrawDebug)
+ {
+ DrawDebugLine(GetWorld(), Start, End, FColor::Green, false, 1.0f);
+ if (NewHit.bBlockingHit)
+ {
+ DrawDebugLine(GetWorld(), Start, NewHit.Location, FColor::Magenta, false, 1.0f);
+ DrawDebugPoint(GetWorld(), NewHit.Location, 8, FColor::Magenta, false, 1.0f);
+ }
+ }
+ }
+ return HitOut;
+}
diff --git a/Plugins/AbilityFramework/Source/AbilityFramework/Private/Abilities/Tasks/GAAbilityTask_WaitForConfirm.cpp b/Plugins/AbilityFramework/Source/AbilityFramework/Private/Abilities/Tasks/GAAbilityTask_WaitForConfirm.cpp
new file mode 100644
index 0000000..58e48ce
--- /dev/null
+++ b/Plugins/AbilityFramework/Source/AbilityFramework/Private/Abilities/Tasks/GAAbilityTask_WaitForConfirm.cpp
@@ -0,0 +1,33 @@
+// Fill out your copyright notice in the Description page of Project Settings.
+
+#include "../../AbilityFramework.h"
+#include "../GAAbilityBase.h"
+#include "GAAbilityTask_WaitForConfirm.h"
+
+
+
+
+UGAAbilityTask_WaitForConfirm* UGAAbilityTask_WaitForConfirm::CreateWaitConfirmTask(UGAAbilityBase* WorldContextObject,
+ FName InTaskName)
+{
+ auto MyObj = NewAbilityTask(WorldContextObject, InTaskName);
+ return MyObj;
+}
+void UGAAbilityTask_WaitForConfirm::Activate()
+{
+ if (AbilityComponent.IsValid() && Ability.IsValid())
+ {
+ GetOuterUGAAbilityBase()->OnConfirmDelegate.AddUObject(this, &UGAAbilityTask_WaitForConfirm::OnConfirm);
+ }
+}
+void UGAAbilityTask_WaitForConfirm::Initialize()
+{
+
+}
+
+void UGAAbilityTask_WaitForConfirm::OnConfirm()
+{
+ Ability->OnConfirmDelegate.Clear();
+ OnConfirmed.Broadcast();
+ EndTask();
+}
\ No newline at end of file
diff --git a/Plugins/AbilityFramework/Source/AbilityFramework/Private/Abilities/Tasks/GAAbilityTask_WaitTargetData.cpp b/Plugins/AbilityFramework/Source/AbilityFramework/Private/Abilities/Tasks/GAAbilityTask_WaitTargetData.cpp
new file mode 100644
index 0000000..38f2151
--- /dev/null
+++ b/Plugins/AbilityFramework/Source/AbilityFramework/Private/Abilities/Tasks/GAAbilityTask_WaitTargetData.cpp
@@ -0,0 +1,84 @@
+// Fill out your copyright notice in the Description page of Project Settings.
+
+#include "../../AbilityFramework.h"
+#include "GAAbilityTask_WaitTargetData.h"
+
+
+UGAAbilityTask_WaitTargetData::UGAAbilityTask_WaitTargetData(const FObjectInitializer& ObjectInitializer)
+ : Super(ObjectInitializer)
+{
+}
+
+
+//UGAAbilityTask_WaitTargetData* UGAAbilityTask_WaitTargetData::WaitTargetData(UObject* WorldContextObject,
+// FName InTaskName, TSubclassOf InClass, float InRange, ETraceTypeQuery InTraceChannel)
+//{
+// auto MyObj = NewAbilityTask(WorldContextObject, "UGAAbilityTask_WaitTargetData");
+// MyObj->Range = InRange;
+// MyObj->TraceChannel = InTraceChannel;
+// return MyObj;
+//}
+
+// ---------------------------------------------------------------------------------------
+void UGAAbilityTask_WaitTargetData::Activate()
+{
+ UE_LOG(AbilityFramework, Log, TEXT("TArget object spawned"));
+ if (Ability.IsValid())
+ {
+ if (!Ability->OnConfirmDelegate.IsBoundToObject(this))
+ Ability->OnConfirmDelegate.AddUObject(this, &UGAAbilityTask_WaitTargetData::OnConfirm);
+ //Ability->ConfirmDelegate.CreateUObject(this, &UGAAbilityTask_WaitForConfirm::OnConfirm);
+ }
+}
+
+//bool UGAAbilityTask_WaitTargetData::BeginSpawningActor(UObject* WorldContextObject, TSubclassOf Class, AGATargetingActor*& SpawnedActor)
+//{
+// UWorld* const World = GEngine->GetWorldFromContextObject(WorldContextObject, EGetWorldErrorMode::LogAndReturnNull);
+// if (World)
+// {
+// SpawnedActor = World->SpawnActorDeferred(Class, FTransform::Identity, NULL, NULL, ESpawnActorCollisionHandlingMethod::AlwaysSpawn);
+// }
+//
+// if (SpawnedActor == nullptr)
+// {
+// return false;
+// }
+// UE_LOG(AbilityFramework, Log, TEXT("Begin Spawning Actor in GAAbilityTask_SpawnActor"));
+// return true;
+//}
+//
+//void UGAAbilityTask_WaitTargetData::FinishSpawningActor(UObject* WorldContextObject, AGATargetingActor* SpawnedActor)
+//{
+// if (SpawnedActor)
+// {
+// FTransform SpawnTransform;
+// SpawnedActor->FinishSpawning(SpawnTransform);
+// TargetActor = SpawnedActor;
+// }
+// ReadyForActivation();
+// UE_LOG(AbilityFramework, Log, TEXT("Finish Spawning Actor in GAAbilityTask_SpawnActor"));
+//}
+void UGAAbilityTask_WaitTargetData::TickTask(float DeltaSeconds, ELevelTick TickType, FGALatentFunctionTick& ThisTickFunction)
+{
+ //if (TargetActor && Ability.IsValid())
+ //{
+ // FHitResult OutHit;
+ // bool bHit = Ability->LineTraceSingleByChannelFromCamera(Range, TraceChannel, false, OutHit,
+ // EDrawDebugTrace::Type::None, true, FLinearColor::Green, FLinearColor::Red, 2);
+ // if (bHit)
+ // {
+ // TargetActor->SetActorLocation(OutHit.Location);
+ // }
+ // else
+ // {
+ // TargetActor->SetActorLocation(OutHit.TraceEnd);
+ // }
+ //}
+}
+
+void UGAAbilityTask_WaitTargetData::OnConfirm()
+{
+ Ability->OnConfirmDelegate.Clear();
+ OnConfirmed.Broadcast();
+ EndTask();
+}
\ No newline at end of file
diff --git a/Plugins/AbilityFramework/Source/AbilityFramework/Private/AbilityFramework.cpp b/Plugins/AbilityFramework/Source/AbilityFramework/Private/AbilityFramework.cpp
new file mode 100644
index 0000000..a2e5e3e
--- /dev/null
+++ b/Plugins/AbilityFramework/Source/AbilityFramework/Private/AbilityFramework.cpp
@@ -0,0 +1,220 @@
+// Copyright 1998-2014 Epic Games, Inc. All Rights Reserved.
+#pragma once
+#include "AbilityFramework.h"
+#include "AFCueManager.h"
+#include "Misc/CoreDelegates.h"
+DEFINE_LOG_CATEGORY(AbilityFramework);
+DEFINE_LOG_CATEGORY(GameAttributesGeneral);
+DEFINE_LOG_CATEGORY(GameAttributes);
+DEFINE_LOG_CATEGORY(GameAttributesEffects);
+
+DEFINE_LOG_CATEGORY(AFAttributes);
+DEFINE_LOG_CATEGORY(AFEffects);
+DEFINE_LOG_CATEGORY(AFAbilities);
+
+FAFEffectTimerManager* FAFEffectTimerManager::Instance = nullptr;
+
+DECLARE_CYCLE_STAT(TEXT("EffectTimer.Run"), STAT_EffectTimerRun, STATGROUP_EffectTimer);
+FAFEffectTimer::FAFEffectTimer()
+{
+
+}
+FAFEffectTimerWorker::FAFEffectTimerWorker()
+{
+ bActive = true;
+ Timers.Reset();
+ Timers.SetNumZeroed(0);
+ InternalTime = FPlatformTime::ToSeconds64(FPlatformTime::Cycles64());
+ for (int Idx = 0; Idx < 10000; Idx++)
+ {
+ float Duration = FMath::RandRange(15, 25);
+ AddTimer(Duration, 0.2);
+ }
+}
+FAFEffectTimerManager::FAFEffectTimerManager()
+{
+ TimerWorker = new FAFEffectTimerWorker();
+ TimerThread = FRunnableThread::Create(TimerWorker, TEXT("EffectTimerThread"), 512*1024, TPri_Normal);
+
+ check(TimerWorker != nullptr);
+}
+FAFEffectTimerManager::~FAFEffectTimerManager()
+{
+ //if (TimerThread)
+ //{
+ // TimerThread->Kill();
+ // delete TimerThread;
+ // TimerThread = nullptr;
+ //}
+}
+uint32 FAFEffectTimerWorker::Run()
+{
+ while (1)
+ {
+ SCOPE_CYCLE_COUNTER(STAT_EffectTimerRun);
+ InternalTime = FPlatformTime::ToSeconds64(FPlatformTime::Cycles64());
+ //while (Timers.Num() > 0)
+ {
+//#if UE_BUILD_DEVELOPTMENT || UE_BUILD_DEBUG
+
+//#endif // UE_BUILD_DEVELOPTMENT || UE_BUILD_DEBUG
+
+ //for (FAFEffectTimer& Timer : Timers)
+ {
+ //auto It = Timers.CreateIterator();
+ //for (; It; ++It)
+ //{
+
+ // if (It->bHavePeriod && (InternalTime > It->NextPeriodTime))
+ // {
+ // double asdasd = It->ExpireTime - InternalTime;
+ // double FinalTime = InternalTime - It->StartTime;
+ // //UE_LOG(GameAttributesEffects, Log, TEXT("AsyncTimer Period TimeDifference: %f FinalTime: %f"), asdasd, FinalTime);
+
+ // It->NextPeriodTime = InternalTime + It->PeriodTime;
+ // //It->PeriodDelegate.ExecuteIfBound();
+
+ // }
+ // if (It->bHaveDuration && (InternalTime > It->ExpireTime))
+ // {
+ // double asdasd = It->ExpireTime - InternalTime;
+ // double FinalTime = InternalTime - It->StartTime;
+ // //UE_LOG(GameAttributesEffects, Log, TEXT("AsyncTimer Finish TimeDifference: %f FinalTime: %f"), asdasd, FinalTime);
+ // //It->ExpireDelegate.ExecuteIfBound();
+
+ // //FAFEffectTimer Out;
+ // //Timers.Remove(*It);
+ // //Timers.Shrink();
+ // }
+ //}
+ for (FAFEffectTimer& Timer : Timers)
+ {
+ if (!Timer.bActive)
+ continue;
+
+ if (Timer.bHavePeriod && (InternalTime > Timer.NextPeriodTime))
+ {
+ double asdasd = Timer.ExpireTime - InternalTime;
+ double FinalTime = InternalTime - Timer.StartTime;
+ //UE_LOG(GameAttributesEffects, Log, TEXT("AsyncTimer Period TimeDifference: %f FinalTime: %f"), asdasd, FinalTime);
+
+ Timer.NextPeriodTime = InternalTime + Timer.PeriodTime;
+ //Timer.PeriodDelegate.ExecuteIfBound();
+
+ }
+ if (Timer.bHaveDuration && (InternalTime > Timer.ExpireTime))
+ {
+ double asdasd = Timer.ExpireTime - InternalTime;
+ double FinalTime = InternalTime - Timer.StartTime;
+ //UE_LOG(GameAttributesEffects, Log, TEXT("AsyncTimer Finish TimeDifference: %f FinalTime: %f"), asdasd, FinalTime);
+ //Timer.ExpireDelegate.ExecuteIfBound();
+ //Timer.bActive = false;
+ //FAFEffectTimer Out;
+ //Timers.Remove(*It);
+ //Timers.Shrink();
+ }
+ }
+ //UE_LOG(GameAttributesEffects, Log, TEXT("AsyncTimer TimeRemaining: %f"), asdasd);
+ //FAFEffectTimer& Top = Timers.HeapTop();
+
+ //if (Timer.bActive)
+ //{
+ // if (Top.bHaveDuration && (InternalTime > Top.ExpireTime))
+ // {
+ // double asdasd = Top.ExpireTime - InternalTime;
+ // double FinalTime = InternalTime - Top.StartTime;
+ // //UE_LOG(GameAttributesEffects, Log, TEXT("AsyncTimer Finish TimeDifference: %f FinalTime: %f"), asdasd, FinalTime);
+ // Top.ExpireDelegate.ExecuteIfBound();
+
+ // FAFEffectTimer Out;
+ // Timers.HeapPop(Out);
+ // Timers.Shrink();
+ // }
+ //}
+ }
+ }
+ FPlatformProcess::Sleep(0.01);
+ }
+ return 0;
+}
+bool FAFEffectTimerWorker::Init()
+{
+ return true;
+}
+void FAFEffectTimerWorker::Stop()
+{
+ bActive = false;
+}
+
+/**
+* Exits the runnable object.
+*
+* Called in the context of the aggregating thread to perform any cleanup.
+* @see Init, Run, Stop
+*/
+void FAFEffectTimerWorker::Exit()
+{
+ //Timers.Empty();
+ //bActive = false;
+}
+
+FAFEffectTimeHandle FAFEffectTimerWorker::AddTimer(double InDuration, double InPeriod)
+{
+ FScopeLock lock(&CS);
+ //bActive = false;
+ FAFEffectTimer Timer;
+ Timer.Duration = InDuration;
+ Timer.PeriodTime = InPeriod;
+ Timer.bHaveDuration = InDuration <= 0 ? false : true;
+ Timer.bHavePeriod = InPeriod <= 0 ? false : true;
+ Timer.StartTime = InternalTime; // FPlatformTime::ToSeconds64(FPlatformTime::Cycles64());// InternalTime;
+
+ Timer.ExpireTime = InternalTime + Timer.Duration;
+ Timer.NextPeriodTime = InternalTime + Timer.PeriodTime;
+ Timer.bActive = true;
+ Timers.Add(Timer);
+ int32 idx = Timers.Num() - 1;
+ //Timers.Push(Timer);
+ //Timers.Heapify();
+ FAFEffectTimeHandle Handle;
+ Handle.Index = idx;
+ Timers[idx].Handle = Handle;
+ UE_LOG(GameAttributesEffects, Log, TEXT("AsyncTimer Start TimeDifference: %f"), (Timer.ExpireTime - InternalTime));
+
+ //since there is at least one timer, set timer manager to be active.
+
+ bActive = true;
+ return Handle;
+}
+
+FAFEffectTimeHandle FAFEffectTimerManager::AddTimer(double InDuration, double InPeriod)
+{
+
+ return TimerWorker->AddTimer(InDuration, InPeriod);
+}
+
+void FAbilityFramework::StartupModule()
+{
+#if WITH_EDITOR
+ //FModuleManager::Get().LoadModule(TEXT("AbilityFrameworkEditor"));
+#endif //WITH_EDITOR
+ //FAFEffectTimerManager::Get();
+ // This code will execute after your module is loaded into memory (but after global variables are initialized, of course.)
+
+ //initialize existing cues.
+ FCoreDelegates::OnFEngineLoopInitComplete.AddRaw(this, &FAbilityFramework::InitCues);
+}
+
+
+void FAbilityFramework::ShutdownModule()
+{
+ // This function may be called during shutdown to clean up your module. For modules that support dynamic reloading,
+ // we call this function before unloading the module.
+}
+
+void FAbilityFramework::InitCues()
+{
+ UAFCueManager::Get();
+}
+
+IMPLEMENT_MODULE(FAbilityFramework, AbilityFramework)
\ No newline at end of file
diff --git a/Plugins/AbilityFramework/Source/AbilityFramework/Private/AnimNotify/AFAbilityNotifyState.cpp b/Plugins/AbilityFramework/Source/AbilityFramework/Private/AnimNotify/AFAbilityNotifyState.cpp
new file mode 100644
index 0000000..10e8534
--- /dev/null
+++ b/Plugins/AbilityFramework/Source/AbilityFramework/Private/AnimNotify/AFAbilityNotifyState.cpp
@@ -0,0 +1,33 @@
+// Fill out your copyright notice in the Description page of Project Settings.
+
+#include "AbilityFramework.h"
+#include "AFAbilityInterface.h"
+#include "AFAbilityComponent.h"
+#include "AFAbilityNotifyState.h"
+
+
+
+
+void UAFAbilityNotifyState::NotifyBegin(class USkeletalMeshComponent * MeshComp, class UAnimSequenceBase * Animation, float TotalDuration)
+{
+ IAFAbilityInterface* IAbilities = Cast(MeshComp->GetOwner());
+ if (IAbilities)
+ {
+ CachedAbilitiesComp = IAbilities->GetAbilityComp();
+ CachedAbilitiesComp->OnAbilityNotifyBegin.ExecuteIfBound(Tag, Name);
+ }
+}
+void UAFAbilityNotifyState::NotifyTick(class USkeletalMeshComponent * MeshComp, class UAnimSequenceBase * Animation, float FrameDeltaTime)
+{
+ if (CachedAbilitiesComp)
+ {
+ CachedAbilitiesComp->OnAbilityNotifyTick.ExecuteIfBound(Tag, Name);
+ }
+}
+void UAFAbilityNotifyState::NotifyEnd(class USkeletalMeshComponent * MeshComp, class UAnimSequenceBase * Animation)
+{
+ if (CachedAbilitiesComp)
+ {
+ CachedAbilitiesComp->OnAbilityNotifyEnd.ExecuteIfBound(Tag, Name);
+ }
+}
\ No newline at end of file
diff --git a/Plugins/AbilityFramework/Source/AbilityFramework/Private/AnimNotify/AFAnimNotify.cpp b/Plugins/AbilityFramework/Source/AbilityFramework/Private/AnimNotify/AFAnimNotify.cpp
new file mode 100644
index 0000000..26e0f2d
--- /dev/null
+++ b/Plugins/AbilityFramework/Source/AbilityFramework/Private/AnimNotify/AFAnimNotify.cpp
@@ -0,0 +1,19 @@
+// Fill out your copyright notice in the Description page of Project Settings.
+
+#include "AbilityFramework.h"
+#include "AFAbilityComponent.h"
+#include "AFAbilityInterface.h"
+#include "AFAnimNotify.h"
+
+
+
+
+void UAFAnimNotify::Notify(USkeletalMeshComponent* MeshComp, UAnimSequenceBase* Animation)
+{
+ IAFAbilityInterface* IAbilities = Cast(MeshComp->GetOwner());
+ if (!IAbilities)
+ return;
+
+ UAFAbilityComponent* Comp = IAbilities->GetAbilityComp();
+ Comp->OnAbilityNotifyBegin.ExecuteIfBound(Tag, Name);
+}
\ No newline at end of file
diff --git a/Plugins/AbilityFramework/Source/AbilityFramework/Private/Attributes/GAAttributeBase.cpp b/Plugins/AbilityFramework/Source/AbilityFramework/Private/Attributes/GAAttributeBase.cpp
new file mode 100644
index 0000000..5f2aef1
--- /dev/null
+++ b/Plugins/AbilityFramework/Source/AbilityFramework/Private/Attributes/GAAttributeBase.cpp
@@ -0,0 +1,255 @@
+// Copyright 1998-2014 Epic Games, Inc. All Rights Reserved.
+
+#include "../AbilityFramework.h"
+#include "GameplayTagContainer.h"
+#include "../AFAbilityComponent.h"
+#include "GAAttributesBase.h"
+#include "../AFAbilityInterface.h"
+#include "GAAttributeExtension.h"
+
+#include "GAAttributeBase.h"
+DEFINE_STAT(STAT_CalculateBonus);
+DEFINE_STAT(STAT_CurrentBonusByTag);
+DEFINE_STAT(STAT_FinalBonusByTag);
+//UGAAttributeBase::UGAAttributeBase(const FObjectInitializer& ObjectInitializer)
+// : Super(ObjectInitializer)
+//{
+//
+//}
+FAFAttributeBase::FAFAttributeBase()
+ : BaseBonusValue(0)
+ , CurrentValue(0)
+{
+ Modifiers.AddDefaulted(7);
+};
+FAFAttributeBase::FAFAttributeBase(float BaseValueIn)
+ : BaseValue(BaseValueIn)
+ , BaseBonusValue(0)
+ , CurrentValue(BaseValue)
+
+{
+ Modifiers.AddDefaulted(7);
+};
+
+
+void FAFAttributeBase::InitializeAttribute(UAFAbilityComponent* InComponent, const FName InAttributeName)
+{
+ CurrentValue = BaseValue;
+ CalculateBonus();
+ CurrentValue = GetFinalValue();
+ Modifiers.Empty();
+ Modifiers.AddDefaulted(7);// static_cast(EGAAttributeMod::Invalid));
+ //Modifiers.AddDefaulted(static_cast(EGAAttributeMod::Invalid));
+ AbilityComp = InComponent;
+ SelfName = FGAAttribute(InAttributeName);
+}
+void FAFAttributeBase::CopyFromOther(FAFAttributeBase* Other)
+{
+ if (!Other)
+ return;
+
+ BaseValue = Other->BaseValue;
+ MinValue = Other->MinValue;
+ MaxValue = Other->MaxValue;
+ CurrentValue = Other->CurrentValue;
+ BaseBonusValue = Other->BaseBonusValue;
+
+ CurrentValue = BaseValue;
+ CalculateBonus();
+ CurrentValue = GetFinalValue();
+}
+void FAFAttributeBase::CalculateBonus()
+{
+ SCOPE_CYCLE_COUNTER(STAT_CalculateBonus);
+ float AdditiveBonus = 0;
+ float SubtractBonus = 0;
+ float MultiplyBonus = 1;
+ float DivideBonus = 1;
+ //auto ModIt = Modifiers.CreateConstIterator();
+ TMap& Additive = Modifiers[static_cast(EGAAttributeMod::Add)];
+ TMap& Subtractive = Modifiers[static_cast(EGAAttributeMod::Subtract)];
+ TMap& Multiplicative = Modifiers[static_cast(EGAAttributeMod::Multiply)];
+ TMap& Divide = Modifiers[static_cast(EGAAttributeMod::Divide)];
+ for (auto ModIt = Additive.CreateConstIterator(); ModIt; ++ModIt)
+ {
+ AdditiveBonus += ModIt->Value.Value;
+ }
+ for (auto ModIt = Subtractive.CreateConstIterator(); ModIt; ++ModIt)
+ {
+ SubtractBonus += ModIt->Value.Value;
+ }
+ for (auto ModIt = Multiplicative.CreateConstIterator(); ModIt; ++ModIt)
+ {
+ MultiplyBonus += ModIt->Value.Value;
+ }
+ for (auto ModIt = Divide.CreateConstIterator(); ModIt; ++ModIt)
+ {
+ DivideBonus += ModIt->Value.Value;
+ }
+
+ float OldBonus = BaseBonusValue;
+ //calculate final bonus from modifiers values.
+ //we don't handle stacking here. It's checked and handled before effect is added.
+ BaseBonusValue = (AdditiveBonus - SubtractBonus);
+ BaseBonusValue = (BaseBonusValue * MultiplyBonus);
+ BaseBonusValue = (BaseBonusValue / DivideBonus);
+ //this is absolute maximum (not clamped right now).
+ float addValue = BaseBonusValue - OldBonus;
+ //reset to max = 200
+ CurrentValue = CurrentValue + addValue;
+ /*
+ BaseValue = 200;
+ CurrentValue = 200;
+ BonusValue = 50;
+ CurrentValue = 200 + 50;
+ CurentValue == 250;
+
+ Damage taken.
+ CurrentValue = 250 - 25;
+ CurrentValue == 225;
+ Bonus Ended - THERE IS NO SUBTRACTION ONLY FULL STATCK RECALCULATION;
+ Expected Result : 175; (225 - 50)
+ OldBonusValue = 50;
+ BonusValue = 0;
+ CurrentValue == 225;
+ BonusValue - OldBonusValue = -50;
+ CurrentValue = CurrentValue + (-50); ??
+
+ TwoBonuses 50 + 50;
+ CurrentValue = 300 - 25;
+ CurrentValue == 275;
+ Bonus Ended - THERE IS NO SUBTRACTION ONLY FULL STATCK RECALCULATION;
+ Expected Result : 225; (275 - 50)
+ OldBonusValue = 100;
+ BonusValue = 50;
+ CurrentValue == 225;
+ BonusValue - OldBonusValue = -50;
+ CurrentValue = CurrentValue + (-50); ??
+
+ Inverse Bonus is going to be Increased:
+ TwoBonuses 50 + 50;
+ CurrentValue = 300 - 25;
+ CurrentValue == 275;
+ Bonus Ended - THERE IS NO SUBTRACTION ONLY FULL STATCK RECALCULATION;
+ Expected Result : 325; (275 + 50)
+ OldBonusValue = 100;
+ new BonusValue = 150; (new bonus gives +50)
+ CurrentValue == 275;
+ BonusValue - OldBonusValue = 50; (150 - 100) = 50
+ CurrentValue = CurrentValue + (50); ??
+ */
+}
+
+bool FAFAttributeBase::CheckIfStronger(const FGAEffectMod& InMod)
+{
+ TMap& mods = Modifiers[static_cast(InMod.AttributeMod)];
+ auto It = mods.CreateConstIterator();
+ for (; It; ++It)
+ {
+ if (InMod > It->Value)
+ {
+ return true;
+ }
+ }
+ if (mods.Num() <= 0)
+ {
+ return true;
+ }
+ return false;
+}
+float FAFAttributeBase::Modify(const FGAEffectMod& ModIn, const FGAEffectHandle& HandleIn,
+ FGAEffectProperty& InProperty, const FGAEffectContext& InContext)
+{
+ //FString name = GetTypeName();
+ if (ExtensionClass)
+ {
+ ExtensionClass.GetDefaultObject()->OnPreAttributeModify(AbilityComp, SelfName, CurrentValue);
+
+ ExtensionClass.GetDefaultObject()->PreAttributeModify(InContext
+ , CurrentValue);
+
+
+ }
+ float returnValue = -1;
+ bool isPeriod = InProperty.GetPeriod() > 0;
+ bool IsDuration = InProperty.GetDuration() > 0;
+
+ float PreValue = CurrentValue;
+
+ if ( !InProperty.GetIsInstant())
+ {
+ FGAModifier AttrMod(ModIn.AttributeMod, ModIn.Value, HandleIn);
+ AttrMod.Tags.AppendTags(InProperty.GetSpecData()->AttributeTags);
+ AddBonus(ModIn, HandleIn);
+ return ModIn.Value;
+ }
+ else
+ {
+ switch (ModIn.AttributeMod)
+ {
+ case EGAAttributeMod::Add:
+ {
+ float OldCurrentValue = CurrentValue;
+ UE_LOG(GameAttributes, Log, TEXT("FAFAttributeBase::Add:: OldCurrentValue: %f"), OldCurrentValue);
+ UE_LOG(GameAttributes, Log, TEXT("FAFAttributeBase::Add:: AddValue: %f"), ModIn.Value);
+ float Val = CurrentValue - (OldCurrentValue + ModIn.Value);
+ UE_LOG(GameAttributes, Log, TEXT("FAFAttributeBase::Add:: ActuallAddVal: %f"), Val);
+ CurrentValue -= Val;
+ CurrentValue = FMath::Clamp(CurrentValue, 0, GetFinalValue());
+ UE_LOG(GameAttributes, Log, TEXT("FAFAttributeBase::Add:: CurrentValue: %f"), CurrentValue);
+ returnValue = CurrentValue;
+ break;
+ }
+ case EGAAttributeMod::Subtract:
+ {
+ float OldCurrentValue = CurrentValue;
+ UE_LOG(GameAttributes, Log, TEXT("FAFAttributeBase::Subtract:: OldCurrentValue: %f"), OldCurrentValue);
+ UE_LOG(GameAttributes, Log, TEXT("FAFAttributeBase::Subtract:: SubtractValue: %f"), ModIn.Value);
+ float Val = CurrentValue - (OldCurrentValue - ModIn.Value);
+ UE_LOG(GameAttributes, Log, TEXT("FAFAttributeBase::Subtract:: ActuallSubtractVal: %f"), Val);
+ CurrentValue -= Val;
+ CurrentValue = FMath::Clamp(CurrentValue, 0, GetFinalValue());
+ UE_LOG(GameAttributes, Log, TEXT("FAFAttributeBase::Subtract:: CurrentValue: %f"), CurrentValue);
+
+ returnValue = CurrentValue;
+ break;
+ }
+ case EGAAttributeMod::Multiply:
+ {
+ returnValue = -1;
+ break;
+ }
+ case EGAAttributeMod::Divide:
+ {
+ returnValue = -1;
+ break;
+ }
+ }
+ }
+ if (ExtensionClass)
+ {
+ ExtensionClass.GetDefaultObject()->OnPostAttributeModify(AbilityComp, SelfName, returnValue);
+
+ ExtensionClass.GetDefaultObject()->PostAttributeModify(
+ InContext
+ , PreValue
+ , returnValue);
+
+ }
+ return returnValue;
+}
+
+void FAFAttributeBase::AddBonus(const FGAEffectMod& ModIn, const FGAEffectHandle& Handle)
+{
+ TMap& mods = Modifiers[static_cast(ModIn.AttributeMod)];
+ FGAEffectMod& modsTemp = mods.FindOrAdd(Handle);
+ modsTemp = ModIn;
+ CalculateBonus();
+}
+void FAFAttributeBase::RemoveBonus(const FGAEffectHandle& Handle, EGAAttributeMod InMod)
+{
+ TMap& mods = Modifiers[static_cast(InMod)];
+ mods.Remove(Handle);
+ //Modifiers.Remove(Handle);
+ CalculateBonus();
+}
\ No newline at end of file
diff --git a/Plugins/AbilityFramework/Source/AbilityFramework/Private/Attributes/GAAttributeExtension.cpp b/Plugins/AbilityFramework/Source/AbilityFramework/Private/Attributes/GAAttributeExtension.cpp
new file mode 100644
index 0000000..f81bd71
--- /dev/null
+++ b/Plugins/AbilityFramework/Source/AbilityFramework/Private/Attributes/GAAttributeExtension.cpp
@@ -0,0 +1,14 @@
+// Fill out your copyright notice in the Description page of Project Settings.
+
+#include "../AbilityFramework.h"
+#include "../AFAbilityComponent.h"
+#include "GAAttributeExtension.h"
+
+void UGAAttributeExtension::OnPreAttributeModify(class UAFAbilityComponent* InComp, const FGAAttribute& Attribute, float InValue)
+{
+ InComp->NotifyOnPreAttributeModified(Attribute);
+}
+void UGAAttributeExtension::OnPostAttributeModify(class UAFAbilityComponent* InComp, const FGAAttribute& Attribute, float InValue)
+{
+ InComp->NotifyOnPostAttributeModified(Attribute);
+}
\ No newline at end of file
diff --git a/Plugins/AbilityFramework/Source/AbilityFramework/Private/Attributes/GAAttributeGlobals.cpp b/Plugins/AbilityFramework/Source/AbilityFramework/Private/Attributes/GAAttributeGlobals.cpp
new file mode 100644
index 0000000..de1a982
--- /dev/null
+++ b/Plugins/AbilityFramework/Source/AbilityFramework/Private/Attributes/GAAttributeGlobals.cpp
@@ -0,0 +1,5 @@
+// Fill out your copyright notice in the Description page of Project Settings.
+
+#include "../AbilityFramework.h"
+#include "GAAttributeGlobals.h"
+
diff --git a/Plugins/AbilityFramework/Source/AbilityFramework/Private/Attributes/GAAttributesBase.cpp b/Plugins/AbilityFramework/Source/AbilityFramework/Private/Attributes/GAAttributesBase.cpp
new file mode 100644
index 0000000..fe29ab0
--- /dev/null
+++ b/Plugins/AbilityFramework/Source/AbilityFramework/Private/Attributes/GAAttributesBase.cpp
@@ -0,0 +1,335 @@
+// Copyright 1998-2014 Epic Games, Inc. All Rights Reserved.
+
+#include "../AbilityFramework.h"
+#include "../GAGlobalTypes.h"
+#include "../AFAbilityComponent.h"
+#include "Net/UnrealNetwork.h"
+#include "GAAttributesBase.h"
+
+UGAAttributesBase::UGAAttributesBase(const FObjectInitializer& ObjectInitializer)
+: Super(ObjectInitializer)
+{
+ bNetAddressable = false;
+ LastAttributeProp = nullptr;
+ CachedFloatPropety = nullptr;
+}
+UGAAttributesBase::~UGAAttributesBase()
+{
+ LastAttributeProp = nullptr; //make sure we clear this pointer.
+ CachedFloatPropety = nullptr;
+}
+//void UGAAttributesBase::PostNetReceive()
+//{
+// Super::PostNetReceive();
+//}
+void UGAAttributesBase::InitializeAttributes(UAFAbilityComponent* InOwningAttributeComp)
+{
+ OwningAttributeComp = InOwningAttributeComp;
+ for (TFieldIterator StrIt(GetClass(), EFieldIteratorFlags::IncludeSuper); StrIt; ++StrIt)
+ {
+ FAFAttributeBase* attr = StrIt->ContainerPtrToValuePtr(this);
+ if (attr)
+ {
+ attr->InitializeAttribute(InOwningAttributeComp, StrIt->GetFName());
+ TickableAttributes.Add(attr);
+ }
+ }
+ /*
+ Bind Delegates to map > For each attribute, so we don't store them inside attribute
+ but in this class.
+ */
+ /*for (TFieldIterator PropIt(GetClass(), EFieldIteratorFlags::IncludeSuper); PropIt; ++PropIt)
+ {
+ int32 FoundIndex = -1;
+ FoundIndex = PropIt->GetName().Find("PostAttribute");
+ FAFAttributeBase* attrPtr = GetAttribute(FGAAttribute(PropIt->GetFName()));
+ if (attrPtr)
+ {
+ return attrPtr->InitializeAttribute();
+ }
+ }*/
+ BP_InitializeAttributes();
+}
+
+void UGAAttributesBase::CopyFromOtherAttributes(UGAAttributesBase* Other)
+{
+ for (TFieldIterator StrIt(GetClass(), EFieldIteratorFlags::IncludeSuper); StrIt; ++StrIt)
+ {
+ FAFAttributeBase* ThisAttribute = StrIt->ContainerPtrToValuePtr(this);
+ FAFAttributeBase* OtherAttribute = Other->GetAttribute(FGAAttribute(StrIt->GetFName()));
+
+ if (ThisAttribute && OtherAttribute)
+ {
+ ThisAttribute->CopyFromOther(OtherAttribute);
+ }
+ }
+}
+
+void UGAAttributesBase::CopyFromStruct(UStruct* StructType, void* StructObject)
+{
+ for (TFieldIterator StrIt(StructType); StrIt; ++StrIt)
+ {
+ UProperty* Property = *StrIt;
+ if (UStructProperty* StructProp = Cast(Property))
+ {
+ FAFAttributeBase* StructAttr = StructProp->ContainerPtrToValuePtr(StructObject);
+ UProperty* ThisProp = FindProperty(FGAAttribute(Property->GetFName()));
+ if (ThisProp)
+ {
+ FAFAttributeBase* ThisAttribute = ThisProp->ContainerPtrToValuePtr(this);
+ if (StructAttr && ThisAttribute)
+ {
+ ThisAttribute->CopyFromOther(StructAttr);
+ }
+ }
+ }
+ }
+}
+
+void UGAAttributesBase::InitializeAttributesFromTable()
+{
+ if (!AttributeValues)
+ return;
+
+ for (TFieldIterator StrIt(GetClass(), EFieldIteratorFlags::IncludeSuper); StrIt; ++StrIt)
+ {
+ FAFAttributeBase* attr = StrIt->ContainerPtrToValuePtr(this);
+ if (attr)
+ {
+ FName fieldName = StrIt->GetFName();
+ FString OutString;
+ FAFAtributeRowData* row = AttributeValues->FindRow(fieldName, OutString);
+ if (row)
+ {
+ attr->SetBaseValue(row->BaseValue);
+ attr->SetMaxValue(row->MaxValue);
+ attr->SetMinValue(row->MinValue);
+ attr->SetCurrentValue(row->CurrentValue);
+ attr->SetExtensionClass(row->Extension);
+ attr->InitializeAttribute(OwningAttributeComp, StrIt->GetFName());
+ }
+ //TickableAttributes.Add(attr);
+ }
+ }
+}
+
+void UGAAttributesBase::Tick(float DeltaTime)
+{
+ for (FAFAttributeBase* Attribute : TickableAttributes)
+ {
+ }
+}
+
+
+UProperty* UGAAttributesBase::FindProperty(const FGAAttribute& AttributeIn)
+{
+ //if new attribute name is the same as last attribute name and pointer to last property
+ //is not null, then we just return last pointer instead of performing new search.
+ if ((AttributeIn.AttributeName == LastAttributeName) && LastAttributeProp)
+ return LastAttributeProp;
+
+ LastAttributeName = AttributeIn.AttributeName;
+ LastAttributeProp = FindFieldChecked(this->GetClass(), LastAttributeName);
+ return LastAttributeProp;
+ return nullptr;
+}
+UStructProperty* UGAAttributesBase::GetStructAttribute(const FGAAttribute& Name)
+{
+ return FindField(this->GetClass(), Name.AttributeName);
+}
+FAFAttributeBase* UGAAttributesBase::GetAttribute(const FGAAttribute& Name)
+{
+ if (!Name.IsValid())
+ {
+ UE_LOG(GameAttributesEffects, Log, TEXT("GetAttribute INVALID NAME"));
+ return nullptr;
+ }
+ UStructProperty* tempStruct = FindField(this->GetClass(), Name.AttributeName);
+
+ FAFAttributeBase* attr = nullptr;
+ if (tempStruct)
+ {
+ attr = tempStruct->ContainerPtrToValuePtr(this);
+ return attr;
+ }
+ return attr;
+}
+void UGAAttributesBase::SetAttribute(const FGAAttribute& NameIn, UObject* NewVal)
+{
+ //UStructProperty* tempStruct = FindField(this->GetClass(), NameIn.AttributeName);
+}
+void UGAAttributesBase::SetAttributeAdditiveBonus(const FGAAttribute& NameIn, float NewValue)
+{
+ UStructProperty* tempStruct = FindField(this->GetClass(), NameIn.AttributeName);
+ UScriptStruct* scriptStruct = tempStruct->Struct;
+
+ uint8* StructData = tempStruct->ContainerPtrToValuePtr(this);
+
+ //omg figured it out!
+ //for (TFieldIterator It(scriptStruct); It; ++It)
+ //{
+ // if (UProperty* Prop = *It)
+ // {
+ // if (Prop->GetFName() == "AdditiveBonus")
+ // {
+ // if (Prop->IsA(UFloatProperty::StaticClass()))
+ // {
+ // float testValue = NewValue;
+ // Cast(Prop)->SetPropertyValue_InContainer(StructData, testValue);
+ // break;
+ // }
+ // }
+ // }
+ //}
+}
+
+float UGAAttributesBase::GetFinalAttributeValue(const FGAAttribute& Name)
+{
+ FAFAttributeBase* attrPtr = GetAttribute(Name);
+ if (attrPtr)
+ {
+ return attrPtr->GetFinalValue();
+ }
+ return 0;
+}
+float UGAAttributesBase::GetCurrentAttributeValue(const FGAAttribute& Name)
+{
+ FAFAttributeBase* attrPtr = GetAttribute(Name);
+ if (attrPtr)
+ {
+ return attrPtr->GetCurrentValue();
+ }
+ return 0;
+}
+float UGAAttributesBase::GetFloatValue(const FGAAttribute& AttributeIn)
+{
+ FAFAttributeBase* Attribute = GetAttribute(AttributeIn);
+
+ if (!Attribute)
+ return 0;
+ return Attribute->GetCurrentValue();
+}
+
+float UGAAttributesBase::SetFloatValue(const FGAAttribute& AttributeIn, float ValueIn)
+{
+ if ((AttributeIn.AttributeName == LastAttributeName))
+ {
+ if (CachedFloatPropety)
+ {
+ void* ValuePtr = CachedFloatPropety->ContainerPtrToValuePtr(this);
+ CachedFloatPropety->SetFloatingPointPropertyValue(ValuePtr, ValueIn);
+ return CachedFloatPropety->GetFloatingPointPropertyValue(ValuePtr);
+ }
+ }
+ //LastAttributeName = AttributeIn.AttributeName;
+ UNumericProperty* NumericProperty = CastChecked(FindProperty(AttributeIn));
+ CachedFloatPropety = NumericProperty;
+ void* ValuePtr = CachedFloatPropety->ContainerPtrToValuePtr(this);
+ NumericProperty->SetFloatingPointPropertyValue(ValuePtr, ValueIn);
+ return CachedFloatPropety->GetFloatingPointPropertyValue(ValuePtr);
+ return 0;
+}
+
+float UGAAttributesBase::AttributeOperation(const FGAAttribute& AttributeIn, float ValueIn, EGAAttributeMod Operation)
+{
+ switch (Operation)
+ {
+ case EGAAttributeMod::Add:
+ return AddAttributeFloat(GetFloatValue(AttributeIn), ValueIn); //don't want to set.
+ case EGAAttributeMod::Subtract:
+ return SubtractAttributeFloat(GetFloatValue(AttributeIn), ValueIn);
+ case EGAAttributeMod::Multiply:
+ return MultiplyAttributeFloat(GetFloatValue(AttributeIn), ValueIn);
+ case EGAAttributeMod::Divide:
+ return DivideAttributeFloat(GetFloatValue(AttributeIn), ValueIn);
+ case EGAAttributeMod::Set:
+ return SetFloatValue(AttributeIn, ValueIn);
+ default:
+ return 0;
+ }
+ return 0;
+}
+
+float UGAAttributesBase::AddAttributeFloat(float ValueA, float ValueB)
+{
+ return ValueA + ValueB;
+}
+float UGAAttributesBase::SubtractAttributeFloat(float ValueA, float ValueB)
+{
+ return ValueA - ValueB;
+}
+float UGAAttributesBase::MultiplyAttributeFloat(float ValueA, float ValueB)
+{
+ return ValueA * ValueB;
+}
+float UGAAttributesBase::DivideAttributeFloat(float ValueA, float ValueB)
+{
+ return ValueA / ValueB;
+}
+
+bool UGAAttributesBase::IsNameStableForNetworking() const
+{
+ /**
+ * IsNameStableForNetworking means an attribute set can be referred to its path name (relative to owning AActor*) over the network
+ *
+ * Attribute sets are net addressable if:
+ * -They are Default Subobjects (created in C++ constructor)
+ * -They were loaded directly from a package (placed in map actors)
+ * -They were explicitly set to bNetAddressable
+ */
+
+ return bNetAddressable;// || Super::IsNameStableForNetworking();
+}
+
+
+void UGAAttributesBase::SetNetAddressable()
+{
+ bNetAddressable = true;
+}
+void UGAAttributesBase::ModifyAttribute(const FGAEffect& EffectIn)
+{
+
+}
+
+float UGAAttributesBase::ModifyAttribute(const FGAEffectMod& ModIn
+ , const FGAEffectHandle& HandleIn
+ , FGAEffectProperty& InProperty
+ , const FGAEffectContext& InContext)
+{
+ FAFAttributeBase* attr = nullptr;
+ UGAAttributesBase* atrObj = this;
+
+ attr = GetAttribute(ModIn.Attribute);
+ float OutVal = -1;
+ if (attr)
+ {
+ OutVal = attr->Modify(ModIn, HandleIn, InProperty, InContext);
+ }
+ OnAttributeModified(ModIn, HandleIn);
+ return OutVal;
+}
+
+void UGAAttributesBase::RemoveBonus(FGAAttribute AttributeIn, const FGAEffectHandle& HandleIn, EGAAttributeMod InMod)
+{
+ FAFAttributeBase* attr = nullptr;
+
+ attr = GetAttribute(AttributeIn);
+ if (attr)
+ {
+ return attr->RemoveBonus(HandleIn, InMod);
+ }
+}
+
+void UGAAttributesBase::OnAttributeModified(const FGAEffectMod& InMod, const FGAEffectHandle& InHandle)
+{
+ OwningAttributeComp->OnAttributeModified(InMod, InHandle, this);
+ FAFAttributeChangedData Data;
+ OwningAttributeComp->BroadcastAttributeChange(InMod.Attribute, Data);
+}
+void UGAAttributesBase::GetLifetimeReplicatedProps(TArray< class FLifetimeProperty > & OutLifetimeProps) const
+{
+ Super::GetLifetimeReplicatedProps(OutLifetimeProps);
+ //possibly replicate it to everyone
+ //to allow prediction for UI.
+ DOREPLIFETIME(UGAAttributesBase, OwningAttributeComp);
+}
\ No newline at end of file
diff --git a/Plugins/AbilityFramework/Source/AbilityFramework/Private/Attributes/GAAttributesBlueprintFunctionLibrary.cpp b/Plugins/AbilityFramework/Source/AbilityFramework/Private/Attributes/GAAttributesBlueprintFunctionLibrary.cpp
new file mode 100644
index 0000000..a4fc7f1
--- /dev/null
+++ b/Plugins/AbilityFramework/Source/AbilityFramework/Private/Attributes/GAAttributesBlueprintFunctionLibrary.cpp
@@ -0,0 +1,72 @@
+// Copyright 1998-2014 Epic Games, Inc. All Rights Reserved.
+
+#include "../AbilityFramework.h"
+
+#include "../AFAbilityInterface.h"
+#include "GAAttributesBase.h"
+#include "../AFAbilityComponent.h"
+#include "GABlueprintLibrary.h"
+#include "GAAttributesBlueprintFunctionLibrary.h"
+
+
+
+UGAAttributesBlueprintFunctionLibrary::UGAAttributesBlueprintFunctionLibrary(const FObjectInitializer& ObjectInitializer)
+: Super(ObjectInitializer)
+{
+
+}
+
+bool UGAAttributesBlueprintFunctionLibrary::EqualAttribute(const FGAAttribute& Compare, FGAAttribute Against)
+{
+ return Compare == Against;
+}
+FName UGAAttributesBlueprintFunctionLibrary::GetAttribute(FGAAttribute AttributeIn)
+{
+ return AttributeIn.AttributeName;
+}
+float UGAAttributesBlueprintFunctionLibrary::GetFinalAttributeValue(AActor* Target, FGAAttribute Name)
+{
+ IAFAbilityInterface* attributeInt = Cast(Target);
+ if (!attributeInt)
+ return 0;
+ if (!attributeInt->GetAttributes())
+ return 0;
+
+ return attributeInt->GetAttributes()->GetFinalAttributeValue(Name);
+}
+float UGAAttributesBlueprintFunctionLibrary::GetCurrentAttributeValue(AActor* Target, FGAAttribute Name)
+{
+ IAFAbilityInterface* attributeInt = Cast(Target);
+ if (!attributeInt)
+ return 0;
+ return attributeInt->GetAttributes()->GetCurrentAttributeValue(Name);
+}
+float UGAAttributesBlueprintFunctionLibrary::GetAttributeFloat(AActor* Target, FGAAttribute AttributeIn)
+{
+ IAFAbilityInterface* attributeInt = Cast(Target);
+ if (!attributeInt)
+ return 0;
+
+ return attributeInt->GetAttributes()->GetFloatValue(AttributeIn);
+}
+
+void UGAAttributesBlueprintFunctionLibrary::ExchangeAttributesValues(
+ APawn* Instigator
+ , UObject* Causer
+ , FAFPropertytHandle From
+ , FGAEffectHandle FromHandle
+ , UObject* FromTarget
+ , FAFPropertytHandle To
+ , FGAEffectHandle ToHandle
+ , UObject* ToTarget)
+{
+ IAFAbilityInterface* FromInterface = Cast(FromTarget);
+ IAFAbilityInterface* ToInterface = Cast(ToTarget);
+
+ if (!FromInterface || !ToInterface)
+ return;
+
+ FAFFunctionModifier ModF;
+ UGABlueprintLibrary::ApplyGameEffectToObject(From, FromTarget, Instigator, Causer, ModF);
+ UGABlueprintLibrary::ApplyGameEffectToObject(To, ToTarget, Instigator, Causer, ModF);
+}
\ No newline at end of file
diff --git a/Plugins/AbilityFramework/Source/AbilityFramework/Private/Attributes/GAAttributesStats.cpp b/Plugins/AbilityFramework/Source/AbilityFramework/Private/Attributes/GAAttributesStats.cpp
new file mode 100644
index 0000000..110fd10
--- /dev/null
+++ b/Plugins/AbilityFramework/Source/AbilityFramework/Private/Attributes/GAAttributesStats.cpp
@@ -0,0 +1,4 @@
+// Copyright 1998-2014 Epic Games, Inc. All Rights Reserved.
+
+#include "../AbilityFramework.h"
+#include "GAAttributesStats.h"
diff --git a/Plugins/AbilityFramework/Source/AbilityFramework/Private/Cues/AFCueStaticBlueprint.cpp b/Plugins/AbilityFramework/Source/AbilityFramework/Private/Cues/AFCueStaticBlueprint.cpp
new file mode 100644
index 0000000..ee34def
--- /dev/null
+++ b/Plugins/AbilityFramework/Source/AbilityFramework/Private/Cues/AFCueStaticBlueprint.cpp
@@ -0,0 +1,8 @@
+// Fill out your copyright notice in the Description page of Project Settings.
+
+#include "AbilityFramework.h"
+#include "AFCueStaticBlueprint.h"
+
+
+
+
diff --git a/Plugins/AbilityFramework/Source/AbilityFramework/Private/Cues/AFCueStaticGeneratedClass.cpp b/Plugins/AbilityFramework/Source/AbilityFramework/Private/Cues/AFCueStaticGeneratedClass.cpp
new file mode 100644
index 0000000..13b398a
--- /dev/null
+++ b/Plugins/AbilityFramework/Source/AbilityFramework/Private/Cues/AFCueStaticGeneratedClass.cpp
@@ -0,0 +1,8 @@
+// Fill out your copyright notice in the Description page of Project Settings.
+
+#include "AbilityFramework.h"
+#include "AFCueStaticGeneratedClass.h"
+
+
+
+
diff --git a/Plugins/AbilityFramework/Source/AbilityFramework/Private/Effects/AFCueActor.cpp b/Plugins/AbilityFramework/Source/AbilityFramework/Private/Effects/AFCueActor.cpp
new file mode 100644
index 0000000..2814c05
--- /dev/null
+++ b/Plugins/AbilityFramework/Source/AbilityFramework/Private/Effects/AFCueActor.cpp
@@ -0,0 +1,162 @@
+// Fill out your copyright notice in the Description page of Project Settings.
+
+#include "AbilityFramework.h"
+#include "MovieScene.h"
+#include "GAEffectCueSequence.h"
+#include "ActorSequencePlayer.h"
+#include "AFCueActor.h"
+
+AAFCueActor::AAFCueActor(const FObjectInitializer& ObjectInitializer)
+ : Super(ObjectInitializer)
+{
+ PrimaryActorTick.bCanEverTick = true;
+ PrimaryActorTick.bStartWithTickEnabled = true;
+ StartTime = 0;
+ EndTime = 5;
+ if (HasAnyFlags(RF_ClassDefaultObject) || GetArchetype() == GetDefault())
+ {
+ Sequence = ObjectInitializer.CreateDefaultSubobject(this, "Sequence");
+ Sequence->SetFlags(RF_Public | RF_Transactional);
+ SequencePlayer = ObjectInitializer.CreateDefaultSubobject(this, "SequencePlayer");
+ }
+}
+void AAFCueActor::PostInitProperties()
+{
+ UpdateAssetRegistryInfo();
+ Super::PostInitProperties();
+}
+
+void AAFCueActor::Serialize(FArchive& Ar)
+{
+ if (Ar.IsSaving())
+ {
+ UpdateAssetRegistryInfo();
+ }
+
+ Super::Serialize(Ar);
+
+ if (Ar.IsLoading())
+ {
+ UpdateAssetRegistryInfo();
+ }
+}
+#if WITH_EDITORONLY_DATA
+void AAFCueActor::UpdateAssetBundleData()
+{
+ AssetBundleData.Reset();
+ UpdateAssetRegistryInfo();
+
+ // By default parse the metadata
+ if (UAssetManager::IsValid())
+ {
+ UAssetManager::Get().InitializeAssetBundlesFromMetadata(this, AssetBundleData);
+ }
+}
+
+void AAFCueActor::PreSave(const class ITargetPlatform* TargetPlatform)
+{
+ Super::PreSave(TargetPlatform);
+
+ UpdateAssetBundleData();
+
+ if (UAssetManager::IsValid())
+ {
+ // Bundles may have changed, refresh
+ UAssetManager::Get().RefreshAssetData(this);
+ }
+}
+#endif
+void AAFCueActor::PostLoad()
+{
+ Super::PostLoad();
+
+#if WITH_EDITORONLY_DATA
+ FAssetBundleData OldData = AssetBundleData;
+
+ UpdateAssetBundleData();
+
+ if (UAssetManager::IsValid() && OldData != AssetBundleData)
+ {
+ // Bundles changed, refresh
+ UAssetManager::Get().RefreshAssetData(this);
+ }
+#endif
+}
+FPrimaryAssetId AAFCueActor::GetPrimaryAssetId() const
+{
+ FName dupa1 = FPackageName::GetShortFName(GetOutermost()->GetFName());
+
+ const AAFCueActor* A = this;
+ return FPrimaryAssetId(FPrimaryAssetType("ActorCue"), dupa1);
+ //if (HasAnyFlags(RF_ClassDefaultObject))
+ {
+ UClass* SearchNativeClass = GetClass();
+
+ while (SearchNativeClass && !SearchNativeClass->HasAnyClassFlags(CLASS_Native | CLASS_Intrinsic))
+ {
+ SearchNativeClass = SearchNativeClass->GetSuperClass();
+ }
+
+ if (SearchNativeClass && SearchNativeClass != GetClass())
+ {
+ // If blueprint, return native class and asset name
+
+ }
+
+ // Native CDO, return nothing
+ return FPrimaryAssetId();
+ }
+
+ // Data assets use Class and ShortName by default, there's no inheritance so class works fine
+ //return FPrimaryAssetId(GetClass()->GetFName(), GetFName());
+}
+
+void AAFCueActor::SetAnimation(class UGAEffectCueSequence* InSequence)
+{
+ Sequence = InSequence;
+}
+// Called when the game starts or when spawned
+void AAFCueActor::BeginPlay()
+{
+ if (!SequencePlayer)
+ {
+ SequencePlayer = NewObject(this, UActorSequencePlayer::StaticClass(), "SequencerPlayer");
+ }
+ SequencePlayer->Initialize(Sequence, PlaybackSettings);
+
+ Super::BeginPlay();
+ //NativeBeginCue();
+}
+
+// Called every frame
+void AAFCueActor::Tick( float DeltaTime )
+{
+ Super::Tick( DeltaTime );
+ if (SequencePlayer)
+ {
+ SequencePlayer->Update(DeltaTime);
+ }
+}
+void AAFCueActor::NativeBeginCue(AActor* InstigatorOut, AActor* TargetOut, UObject* Causer,
+ const FHitResult& HitInfo, const FGAEffectCueParams& CueParams)
+{
+ BeginCue(InstigatorOut, TargetOut, Causer, HitInfo);
+ if (!SequencePlayer)
+ {
+ SequencePlayer->Play();
+ }
+}
+
+void AAFCueActor::NativeOnExecuted()
+{
+ OnExecuted();
+}
+void AAFCueActor::NativeOnRemoved()
+{
+ OnRemoved();
+}
+
+void AAFCueActor::UpdateAssetRegistryInfo()
+{
+ EffectCueTagSearch = CueTag.GetTagName();
+}
\ No newline at end of file
diff --git a/Plugins/AbilityFramework/Source/AbilityFramework/Private/Effects/AFCueActorBlueprint.cpp b/Plugins/AbilityFramework/Source/AbilityFramework/Private/Effects/AFCueActorBlueprint.cpp
new file mode 100644
index 0000000..b16fef9
--- /dev/null
+++ b/Plugins/AbilityFramework/Source/AbilityFramework/Private/Effects/AFCueActorBlueprint.cpp
@@ -0,0 +1,33 @@
+// Copyright 1998-2017 Epic Games, Inc. All Rights Reserved.
+
+#include "AbilityFramework.h"
+#include "AFCueActorBlueprint.h"
+
+//////////////////////////////////////////////////////////////////////////
+// UGameplayAbilityBlueprint
+
+UAFCueActorBlueprint::UAFCueActorBlueprint(const FObjectInitializer& ObjectInitializer)
+ : Super(ObjectInitializer)
+{
+}
+
+#if WITH_EDITOR
+
+/** Returns the most base gameplay ability blueprint for a given blueprint (if it is inherited from another ability blueprint, returning null if only native / non-ability BP classes are it's parent) */
+UAFCueActorBlueprint* UAFCueActorBlueprint::FindRootGameplayAbilityBlueprint(UAFCueActorBlueprint* DerivedBlueprint)
+{
+ UAFCueActorBlueprint* ParentBP = NULL;
+
+ // Determine if there is a gameplay ability blueprint in the ancestry of this class
+ for (UClass* ParentClass = DerivedBlueprint->ParentClass; ParentClass != UObject::StaticClass(); ParentClass = ParentClass->GetSuperClass())
+ {
+ if (UAFCueActorBlueprint* TestBP = Cast(ParentClass->ClassGeneratedBy))
+ {
+ ParentBP = TestBP;
+ }
+ }
+
+ return ParentBP;
+}
+
+#endif
\ No newline at end of file
diff --git a/Plugins/AbilityFramework/Source/AbilityFramework/Private/Effects/AFCueActorGeneratedClass.cpp b/Plugins/AbilityFramework/Source/AbilityFramework/Private/Effects/AFCueActorGeneratedClass.cpp
new file mode 100644
index 0000000..f04cbf6
--- /dev/null
+++ b/Plugins/AbilityFramework/Source/AbilityFramework/Private/Effects/AFCueActorGeneratedClass.cpp
@@ -0,0 +1,13 @@
+// Copyright 1998-2017 Epic Games, Inc. All Rights Reserved.
+
+#include "AbilityFramework.h"
+#include "AFCueActorGeneratedClass.h"
+
+//////////////////////////////////////////////////////////////////////////
+// UGameplayAbilityBlueprint
+
+UAFCueActorGeneratedClass::UAFCueActorGeneratedClass(const FObjectInitializer& ObjectInitializer)
+ : Super(ObjectInitializer)
+{
+}
+
diff --git a/Plugins/AbilityFramework/Source/AbilityFramework/Private/Effects/AFCueStatic.cpp b/Plugins/AbilityFramework/Source/AbilityFramework/Private/Effects/AFCueStatic.cpp
new file mode 100644
index 0000000..f6bc2d4
--- /dev/null
+++ b/Plugins/AbilityFramework/Source/AbilityFramework/Private/Effects/AFCueStatic.cpp
@@ -0,0 +1,131 @@
+// Fill out your copyright notice in the Description page of Project Settings.
+
+#include "AbilityFramework.h"
+
+#include "Engine/AssetManager.h"
+
+#include "AFCueStatic.h"
+
+
+UAFCueStatic::UAFCueStatic(const FObjectInitializer& ObjectInitializer)
+ : Super(ObjectInitializer)
+{
+
+}
+
+void UAFCueStatic::PostInitProperties()
+{
+ UpdateAssetRegistryInfo();
+ Super::PostInitProperties();
+}
+
+void UAFCueStatic::Serialize(FArchive& Ar)
+{
+ if (Ar.IsSaving())
+ {
+ UpdateAssetRegistryInfo();
+ }
+
+ Super::Serialize(Ar);
+
+ if (Ar.IsLoading())
+ {
+ UpdateAssetRegistryInfo();
+ }
+}
+#if WITH_EDITORONLY_DATA
+void UAFCueStatic::UpdateAssetBundleData()
+{
+ AssetBundleData.Reset();
+ UpdateAssetRegistryInfo();
+
+ // By default parse the metadata
+ if (UAssetManager::IsValid())
+ {
+ UAssetManager::Get().InitializeAssetBundlesFromMetadata(this, AssetBundleData);
+ }
+}
+
+void UAFCueStatic::PreSave(const class ITargetPlatform* TargetPlatform)
+{
+ Super::PreSave(TargetPlatform);
+
+ UpdateAssetBundleData();
+
+ if (UAssetManager::IsValid())
+ {
+ // Bundles may have changed, refresh
+ UAssetManager::Get().RefreshAssetData(this);
+ }
+}
+#endif
+void UAFCueStatic::PostLoad()
+{
+ Super::PostLoad();
+
+#if WITH_EDITORONLY_DATA
+ FAssetBundleData OldData = AssetBundleData;
+
+ UpdateAssetBundleData();
+
+ if (UAssetManager::IsValid() && OldData != AssetBundleData)
+ {
+ // Bundles changed, refresh
+ UAssetManager::Get().RefreshAssetData(this);
+ }
+#endif
+}
+FPrimaryAssetId UAFCueStatic::GetPrimaryAssetId() const
+{
+ FName dupa1 = FPackageName::GetShortFName(GetOutermost()->GetFName());
+
+ const UAFCueStatic* A = this;
+ return FPrimaryAssetId(FPrimaryAssetType("StaticCue"), dupa1);
+ //if (HasAnyFlags(RF_ClassDefaultObject))
+ {
+ UClass* SearchNativeClass = GetClass();
+
+ while (SearchNativeClass && !SearchNativeClass->HasAnyClassFlags(CLASS_Native | CLASS_Intrinsic))
+ {
+ SearchNativeClass = SearchNativeClass->GetSuperClass();
+ }
+
+ if (SearchNativeClass && SearchNativeClass != GetClass())
+ {
+ // If blueprint, return native class and asset name
+
+ }
+
+ // Native CDO, return nothing
+ return FPrimaryAssetId();
+ }
+}
+void UAFCueStatic::UpdateAssetRegistryInfo()
+{
+ EffectCueTagSearch = CueTag.GetTagName();
+}
+
+bool UAFCueStatic::OnExecuted_Implementation(const FGAEffectCueParams& Hit) const
+{
+ return true;
+}
+void UAFCueStatic::OnActivate_Implementation(const FGAEffectCueParams& Hit) const
+{
+}
+void UAFCueStatic::OnExpire_Implementation(const FGAEffectCueParams& Hit) const
+{
+}
+void UAFCueStatic::OnRemoved_Implementation(const FGAEffectCueParams& Hit) const
+{
+}
+
+UWorld* UAFCueStatic::GetWorld() const
+{
+ /*TIndirectArray WorldContexts = GEngine->GetWorldContexts();
+ UWorld* World = nullptr;
+ for (const FWorldContext& Ctx : WorldContexts)
+ {
+ World = Ctx.World();
+ }*/
+ return nullptr;
+}
\ No newline at end of file
diff --git a/Plugins/AbilityFramework/Source/AbilityFramework/Private/Effects/AFEffectApplicationRequirement.cpp b/Plugins/AbilityFramework/Source/AbilityFramework/Private/Effects/AFEffectApplicationRequirement.cpp
new file mode 100644
index 0000000..a6e6ad6
--- /dev/null
+++ b/Plugins/AbilityFramework/Source/AbilityFramework/Private/Effects/AFEffectApplicationRequirement.cpp
@@ -0,0 +1,8 @@
+// Fill out your copyright notice in the Description page of Project Settings.
+
+#include "AbilityFramework.h"
+#include "AFEffectApplicationRequirement.h"
+
+
+
+
diff --git a/Plugins/AbilityFramework/Source/AbilityFramework/Private/Effects/AFEffectCustomApplication.cpp b/Plugins/AbilityFramework/Source/AbilityFramework/Private/Effects/AFEffectCustomApplication.cpp
new file mode 100644
index 0000000..8f04be7
--- /dev/null
+++ b/Plugins/AbilityFramework/Source/AbilityFramework/Private/Effects/AFEffectCustomApplication.cpp
@@ -0,0 +1,26 @@
+// Fill out your copyright notice in the Description page of Project Settings.
+
+#include "AbilityFramework.h"
+#include "../AFAbilityComponent.h"
+#include "AFEffectCustomApplication.h"
+
+
+
+
+bool UAFEffectCustomApplication::ApplyEffect(
+ const FGAEffectHandle& InHandle
+ , const FGAEffect& EffectIn
+ , struct FGAEffectContainer* InContainer
+ , const FAFEffectParams& Params
+ , const FAFFunctionModifier& Modifier)
+{
+ return true;
+}
+
+void UAFEffectCustomApplication::ApplyExecute(
+ const FGAEffectHandle& InHandle
+ , const FAFEffectParams& Params
+ , const FAFFunctionModifier& Modifier)
+{
+ Params.GetContext().GetTargetEffectsComponent()->ExecuteEffect(InHandle, Params, Modifier);
+}
\ No newline at end of file
diff --git a/Plugins/AbilityFramework/Source/AbilityFramework/Private/Effects/AFEffectCustomStackingRule.cpp b/Plugins/AbilityFramework/Source/AbilityFramework/Private/Effects/AFEffectCustomStackingRule.cpp
new file mode 100644
index 0000000..bc4b54b
--- /dev/null
+++ b/Plugins/AbilityFramework/Source/AbilityFramework/Private/Effects/AFEffectCustomStackingRule.cpp
@@ -0,0 +1,14 @@
+// Fill out your copyright notice in the Description page of Project Settings.
+
+#include "AbilityFramework.h"
+#include "AFEffectCustomStackingRule.h"
+
+
+
+
+bool UAFEffectCustomStackingRule::CanStack(class UAFAbilityComponent* InComp, struct FGAEffectContainer* InContainer,
+ const FGAEffectHandle& InHandle)
+{
+ //InHandle.GetContext().TargetComp->ExecuteEffect(InHandle);
+ return true;
+}
\ No newline at end of file
diff --git a/Plugins/AbilityFramework/Source/AbilityFramework/Private/Effects/AFEffectSpecFunctionLibrary.cpp b/Plugins/AbilityFramework/Source/AbilityFramework/Private/Effects/AFEffectSpecFunctionLibrary.cpp
new file mode 100644
index 0000000..5d1704c
--- /dev/null
+++ b/Plugins/AbilityFramework/Source/AbilityFramework/Private/Effects/AFEffectSpecFunctionLibrary.cpp
@@ -0,0 +1,50 @@
+// Fill out your copyright notice in the Description page of Project Settings.
+
+#include "AbilityFramework.h"
+#include "AFEffectSpecFunctionLibrary.h"
+
+
+
+void UAFEffectSpecFunctionLibrary::AppendOwnedTags(FAFEffectSpecHandle Spec, const FGameplayTagContainer& InTags)
+{
+ Spec.GetPtr()->OwnedTags.AppendTags(InTags);
+}
+
+void UAFEffectSpecFunctionLibrary::CompareOwnedTags(FAFEffectSpecHandle Spec
+ , EAFTagContainerCompare Mode
+ , const FGameplayTagContainer& InTags
+ , EAFTagCompareResult& Result)
+{
+ switch (Mode)
+ {
+ case EAFTagContainerCompare::HasAny:
+ Spec.GetPtr()->OwnedTags.HasAny(InTags) ? Result = EAFTagCompareResult::Match : Result = EAFTagCompareResult::NoMatch;
+ break;
+ case EAFTagContainerCompare::HasAnyExact:
+ Spec.GetPtr()->OwnedTags.HasAnyExact(InTags) ? Result = EAFTagCompareResult::Match : Result = EAFTagCompareResult::NoMatch;
+ break;
+ case EAFTagContainerCompare::HasAll:
+ Spec.GetPtr()->OwnedTags.HasAll(InTags) ? Result = EAFTagCompareResult::Match : Result = EAFTagCompareResult::NoMatch;
+ break;
+ case EAFTagContainerCompare::HasAllExact:
+ Spec.GetPtr()->OwnedTags.HasAllExact(InTags) ? Result = EAFTagCompareResult::Match : Result = EAFTagCompareResult::NoMatch;
+ default:
+ break;
+ }
+}
+
+void UAFEffectSpecFunctionLibrary::CompareOwnedTag(FAFEffectSpecHandle Spec
+ , EAFTagCompare Mode
+ , FGameplayTag InTag
+ , EAFTagCompareResult& Result)
+{
+ switch (Mode)
+ {
+ case EAFTagCompare::HasTag:
+ Spec.GetPtr()->OwnedTags.HasTag(InTag) ? Result = EAFTagCompareResult::Match : Result = EAFTagCompareResult::NoMatch;
+ break;
+ case EAFTagCompare::HasTagExact:
+ Spec.GetPtr()->OwnedTags.HasTagExact(InTag) ? Result = EAFTagCompareResult::Match : Result = EAFTagCompareResult::NoMatch;
+ break;
+ }
+}
\ No newline at end of file
diff --git a/Plugins/AbilityFramework/Source/AbilityFramework/Private/Effects/ApplicationRequirement/AFAttributeStongerOverride.cpp b/Plugins/AbilityFramework/Source/AbilityFramework/Private/Effects/ApplicationRequirement/AFAttributeStongerOverride.cpp
new file mode 100644
index 0000000..95a6008
--- /dev/null
+++ b/Plugins/AbilityFramework/Source/AbilityFramework/Private/Effects/ApplicationRequirement/AFAttributeStongerOverride.cpp
@@ -0,0 +1,39 @@
+// Fill out your copyright notice in the Description page of Project Settings.
+
+#include "AbilityFramework.h"
+#include "../../Attributes/GAAttributeBase.h"
+#include "../../AFAbilityInterface.h"
+#include "AFAttributeStongerOverride.h"
+
+
+
+
+bool UAFAttributeStongerOverride::CanApply(
+ const FGAEffect& EffectIn
+ , const FAFEffectParams& Params
+ , const FGAEffectHandle& InHandle
+ , struct FGAEffectContainer* InContainer)
+{
+ bool bCanApply = true;
+ FGAAttribute Attribute = Params.GetProperty().GetSpecData()->AtributeModifier.Attribute;
+ FAFAttributeBase* AttributePtr = Params.GetContext().TargetInterface->GetAttribute(Attribute);
+ FGAEffectProperty& InProperty = Params.GetProperty();
+
+ if (AttributePtr)
+ {
+ FGAEffectMod mod = FAFStatics::GetAttributeModifier(InProperty.GetAttributeModifier()
+ , InProperty.GetSpecData()
+ , Params.GetContext()
+ , InHandle);
+
+ if (AttributePtr->CheckIfStronger(mod))
+ {
+ bCanApply = true;
+ }
+ else
+ {
+ bCanApply = false;
+ }
+ }
+ return bCanApply;
+}
\ No newline at end of file
diff --git a/Plugins/AbilityFramework/Source/AbilityFramework/Private/Effects/ApplicationRequirement/AFEffectAlreadyApplied.cpp b/Plugins/AbilityFramework/Source/AbilityFramework/Private/Effects/ApplicationRequirement/AFEffectAlreadyApplied.cpp
new file mode 100644
index 0000000..9e44f37
--- /dev/null
+++ b/Plugins/AbilityFramework/Source/AbilityFramework/Private/Effects/ApplicationRequirement/AFEffectAlreadyApplied.cpp
@@ -0,0 +1,20 @@
+// Fill out your copyright notice in the Description page of Project Settings.
+
+#include "AbilityFramework.h"
+#include "AFEffectAlreadyApplied.h"
+
+
+
+
+bool UAFEffectAlreadyApplied::CanApply(
+ const FGAEffect& EffectIn
+ , const FAFEffectParams& Params
+ , const FGAEffectHandle& InHandle
+ , struct FGAEffectContainer* InContainer)
+{
+ if (InContainer->ContainsEffectOfClass(Params.Property))
+ {
+ return false;
+ }
+ return true;
+}
\ No newline at end of file
diff --git a/Plugins/AbilityFramework/Source/AbilityFramework/Private/Effects/CustomApplications/AFAtributeDurationAdd.cpp b/Plugins/AbilityFramework/Source/AbilityFramework/Private/Effects/CustomApplications/AFAtributeDurationAdd.cpp
new file mode 100644
index 0000000..a96c24c
--- /dev/null
+++ b/Plugins/AbilityFramework/Source/AbilityFramework/Private/Effects/CustomApplications/AFAtributeDurationAdd.cpp
@@ -0,0 +1,25 @@
+// Fill out your copyright notice in the Description page of Project Settings.
+
+#include "AbilityFramework.h"
+#include "../GAGameEffect.h"
+#include "AFEffectsComponent.h"
+#include "AFAtributeDurationAdd.h"
+
+
+
+
+bool UAFAtributeDurationAdd::ApplyEffect(
+ const FGAEffectHandle& InHandle
+ , const FGAEffect& EffectIn
+ , struct FGAEffectContainer* InContainer
+ , const FAFEffectParams& Params
+ , const FAFFunctionModifier& Modifier)
+{
+ FTimerManager& DurationTimer = const_cast(Params).GetTargetTimerManager();
+
+ FTimerDelegate delDuration = FTimerDelegate::CreateUObject(Params.GetTargetEffectsComponent(), &UAFEffectsComponent::ExpireEffect, InHandle, Params);
+ DurationTimer.SetTimer(const_cast(EffectIn).DurationTimerHandle, delDuration,
+ Params.GetProperty().GetDuration(), false);
+
+ return true;
+}
\ No newline at end of file
diff --git a/Plugins/AbilityFramework/Source/AbilityFramework/Private/Effects/CustomApplications/AFAtributeDurationUnique.cpp b/Plugins/AbilityFramework/Source/AbilityFramework/Private/Effects/CustomApplications/AFAtributeDurationUnique.cpp
new file mode 100644
index 0000000..d043d7a
--- /dev/null
+++ b/Plugins/AbilityFramework/Source/AbilityFramework/Private/Effects/CustomApplications/AFAtributeDurationUnique.cpp
@@ -0,0 +1,38 @@
+// Fill out your copyright notice in the Description page of Project Settings.
+
+#include "AbilityFramework.h"
+#include "../GAGameEffect.h"
+#include "AFEffectsComponent.h"
+#include "AFAbilityInterface.h"
+#include "AFAtributeDurationUnique.h"
+
+
+
+
+bool UAFAtributeDurationUnique::ApplyEffect(
+ const FGAEffectHandle& InHandle
+ , const FGAEffect& EffectIn
+ , struct FGAEffectContainer* InContainer
+ , const FAFEffectParams& Params
+ , const FAFFunctionModifier& Modifier)
+{
+ if (InContainer->IsEffectActive(Params.Property.SpecClass.SpecClass.Get()))
+ {
+ return false;
+ }
+ FTimerManager& DurationTimer = const_cast(Params).GetTargetTimerManager();
+
+ FTimerDelegate delDuration = FTimerDelegate::CreateUObject(Params.GetTargetEffectsComponent(), &UAFEffectsComponent::ExpireEffect, InHandle, Params);
+ DurationTimer.SetTimer(const_cast(EffectIn).DurationTimerHandle, delDuration,
+ Params.GetProperty().GetDuration(), false);
+
+ return true;
+}
+
+bool UAFAtributeDurationUnique::CanApply(class IAFAbilityInterface* Target, TSubclassOf EffectClass)
+{
+ if (!Target)
+ return false;
+
+ return !Target->GetEffectsComponent()->IsEffectActive(EffectClass);
+}
\ No newline at end of file
diff --git a/Plugins/AbilityFramework/Source/AbilityFramework/Private/Effects/CustomApplications/AFAttributeDurationInfinite.cpp b/Plugins/AbilityFramework/Source/AbilityFramework/Private/Effects/CustomApplications/AFAttributeDurationInfinite.cpp
new file mode 100644
index 0000000..373b41c
--- /dev/null
+++ b/Plugins/AbilityFramework/Source/AbilityFramework/Private/Effects/CustomApplications/AFAttributeDurationInfinite.cpp
@@ -0,0 +1,17 @@
+// Fill out your copyright notice in the Description page of Project Settings.
+
+#include "AbilityFramework.h"
+#include "AFAttributeDurationInfinite.h"
+
+
+
+
+bool UAFAttributeDurationInfinite::ApplyEffect(
+ const FGAEffectHandle& InHandle
+ , const FGAEffect& EffectIn
+ , struct FGAEffectContainer* InContainer
+ , const FAFEffectParams& Params
+ , const FAFFunctionModifier& Modifier)
+{
+ return true;
+}
\ No newline at end of file
diff --git a/Plugins/AbilityFramework/Source/AbilityFramework/Private/Effects/CustomApplications/AFAttributeDurationOverride.cpp b/Plugins/AbilityFramework/Source/AbilityFramework/Private/Effects/CustomApplications/AFAttributeDurationOverride.cpp
new file mode 100644
index 0000000..02e6f6c
--- /dev/null
+++ b/Plugins/AbilityFramework/Source/AbilityFramework/Private/Effects/CustomApplications/AFAttributeDurationOverride.cpp
@@ -0,0 +1,27 @@
+// Fill out your copyright notice in the Description page of Project Settings.
+
+#include "AbilityFramework.h"
+#include "../GAGameEffect.h"
+#include "AFEffectsComponent.h"
+#include "AFAttributeDurationOverride.h"
+
+
+
+
+bool UAFAttributeDurationOverride::ApplyEffect(
+ const FGAEffectHandle& InHandle
+ , const FGAEffect& EffectIn
+ , struct FGAEffectContainer* InContainer
+ , const FAFEffectParams& Params
+ , const FAFFunctionModifier& Modifier)
+{
+ InContainer->RemoveEffect(Params.Property, Params.GetContext());
+
+ FTimerManager& DurationTimer = const_cast(Params).GetTargetTimerManager();
+
+ FTimerDelegate delDuration = FTimerDelegate::CreateUObject(Params.GetTargetEffectsComponent(), &UAFEffectsComponent::ExpireEffect, InHandle, Params);
+ DurationTimer.SetTimer(const_cast(EffectIn).DurationTimerHandle, delDuration,
+ Params.GetProperty().GetDuration(), false);
+
+ return true;
+}
\ No newline at end of file
diff --git a/Plugins/AbilityFramework/Source/AbilityFramework/Private/Effects/CustomApplications/AFPeriodApplicationAdd.cpp b/Plugins/AbilityFramework/Source/AbilityFramework/Private/Effects/CustomApplications/AFPeriodApplicationAdd.cpp
new file mode 100644
index 0000000..a7bab63
--- /dev/null
+++ b/Plugins/AbilityFramework/Source/AbilityFramework/Private/Effects/CustomApplications/AFPeriodApplicationAdd.cpp
@@ -0,0 +1,32 @@
+// Fill out your copyright notice in the Description page of Project Settings.
+
+#include "AbilityFramework.h"
+#include "../GAGameEffect.h"
+#include "AFEffectsComponent.h"
+#include "AFPeriodApplicationAdd.h"
+
+
+bool UAFPeriodApplicationAdd::ApplyEffect(
+ const FGAEffectHandle& InHandle
+ , const FGAEffect& EffectIn
+ , struct FGAEffectContainer* InContainer
+ , const FAFEffectParams& Params
+ , const FAFFunctionModifier& Modifier)
+{
+ FTimerManager& DurationTimer = const_cast(Params).GetTargetTimerManager();
+
+ FTimerDelegate delDuration = FTimerDelegate::CreateUObject(Params.GetTargetEffectsComponent(), &UAFEffectsComponent::ExpireEffect, InHandle, Params);
+ DurationTimer.SetTimer(const_cast(EffectIn).DurationTimerHandle, delDuration,
+ Params.GetProperty().GetDuration(), false);
+
+ FTimerManager& PeriodTimer = const_cast(Params).GetTargetTimerManager();
+
+ FTimerDelegate PeriodDuration = FTimerDelegate::CreateUObject(Params.GetTargetEffectsComponent(), &UAFEffectsComponent::ExecuteEffect, InHandle, Params, Modifier);
+ PeriodTimer.SetTimer(const_cast(EffectIn).PeriodTimerHandle, PeriodDuration,
+ Params.GetProperty().GetPeriod(), true);
+
+ //InContainer->AddEffect(InProperty, InHandle);
+
+ return true;
+}
+
diff --git a/Plugins/AbilityFramework/Source/AbilityFramework/Private/Effects/CustomApplications/AFPeriodApplicationExtend.cpp b/Plugins/AbilityFramework/Source/AbilityFramework/Private/Effects/CustomApplications/AFPeriodApplicationExtend.cpp
new file mode 100644
index 0000000..3d47b88
--- /dev/null
+++ b/Plugins/AbilityFramework/Source/AbilityFramework/Private/Effects/CustomApplications/AFPeriodApplicationExtend.cpp
@@ -0,0 +1,53 @@
+// Fill out your copyright notice in the Description page of Project Settings.
+
+#include "AbilityFramework.h"
+#include "GAGlobalTypes.h"
+#include "Effects/GAGameEffect.h"
+#include "AFEffectsComponent.h"
+#include "AFPeriodApplicationExtend.h"
+
+
+
+
+bool UAFPeriodApplicationExtend::ApplyEffect(
+ const FGAEffectHandle& InHandle
+ , const FGAEffect& EffectIn
+ , struct FGAEffectContainer* InContainer
+ , const FAFEffectParams& Params
+ , const FAFFunctionModifier& Modifier)
+{
+ TSet handles = InContainer->GetHandlesByClass(Params.GetProperty(), Params.GetContext());
+ for (const FGAEffectHandle& handle : handles)
+ {
+ FGAEffect& ExtEffect = *InContainer->GetEffect(handle);
+ FGAEffect& Effect = const_cast(EffectIn);
+
+ FGAEffectContext& ExtContext = const_cast(Params).GetContext();
+
+ FTimerManager& DurationTimer = const_cast(Params).GetTargetTimerManager();
+
+ float RemainingTime = DurationTimer.GetTimerRemaining(ExtEffect.DurationTimerHandle);
+ float NewDuration = RemainingTime + Effect.GetDurationTime();
+ DurationTimer.ClearTimer(ExtEffect.DurationTimerHandle);
+
+ FTimerDelegate delDuration = FTimerDelegate::CreateUObject(ExtContext.GetTargetEffectsComponent(), &UAFEffectsComponent::ExpireEffect, InHandle, Params);
+ DurationTimer.SetTimer(ExtEffect.DurationTimerHandle, delDuration,
+ NewDuration, false);
+ }
+ if (handles.Num() <= 0)
+ {
+ FGAEffect& Effect = const_cast(EffectIn);;
+ FTimerManager& DurationTimer = const_cast(Params).GetTargetTimerManager();
+
+ FTimerDelegate delDuration = FTimerDelegate::CreateUObject(Params.GetTargetEffectsComponent(), &UAFEffectsComponent::ExpireEffect, InHandle, Params);
+ DurationTimer.SetTimer(Effect.DurationTimerHandle, delDuration,
+ Params.GetProperty().GetDuration(), false);
+
+ FTimerManager& PeriodTimer = const_cast(Params).GetTargetTimerManager();
+
+ FTimerDelegate PeriodDuration = FTimerDelegate::CreateUObject(Params.GetTargetEffectsComponent(), &UAFEffectsComponent::ExecuteEffect, InHandle, Params, Modifier);
+ PeriodTimer.SetTimer(Effect.PeriodTimerHandle, PeriodDuration,
+ Params.GetProperty().GetPeriod(), true);
+ }
+ return true;
+}
\ No newline at end of file
diff --git a/Plugins/AbilityFramework/Source/AbilityFramework/Private/Effects/CustomApplications/AFPeriodApplicationInfiniteAdd.cpp b/Plugins/AbilityFramework/Source/AbilityFramework/Private/Effects/CustomApplications/AFPeriodApplicationInfiniteAdd.cpp
new file mode 100644
index 0000000..7fc9e0a
--- /dev/null
+++ b/Plugins/AbilityFramework/Source/AbilityFramework/Private/Effects/CustomApplications/AFPeriodApplicationInfiniteAdd.cpp
@@ -0,0 +1,24 @@
+// Fill out your copyright notice in the Description page of Project Settings.
+
+#include "AbilityFramework.h"
+#include "../GAGameEffect.h"
+#include "AFEffectsComponent.h"
+#include "AFPeriodApplicationInfiniteAdd.h"
+
+
+bool UAFPeriodApplicationInfiniteAdd::ApplyEffect(
+ const FGAEffectHandle& InHandle
+ , const FGAEffect& EffectIn
+ , struct FGAEffectContainer* InContainer
+ , const FAFEffectParams& Params
+ , const FAFFunctionModifier& Modifier)
+{
+ FTimerManager& PeriodTimer = const_cast(Params).GetTargetTimerManager();
+
+ FTimerDelegate PeriodDuration = FTimerDelegate::CreateUObject(Params.GetTargetEffectsComponent(), &UAFEffectsComponent::ExecuteEffect, InHandle, Params, Modifier);
+ PeriodTimer.SetTimer(const_cast(EffectIn).PeriodTimerHandle, PeriodDuration,
+ Params.GetProperty().GetPeriod(), true);
+
+ return true;
+}
+
diff --git a/Plugins/AbilityFramework/Source/AbilityFramework/Private/Effects/CustomApplications/AFPeriodApplicationOverride.cpp b/Plugins/AbilityFramework/Source/AbilityFramework/Private/Effects/CustomApplications/AFPeriodApplicationOverride.cpp
new file mode 100644
index 0000000..255e753
--- /dev/null
+++ b/Plugins/AbilityFramework/Source/AbilityFramework/Private/Effects/CustomApplications/AFPeriodApplicationOverride.cpp
@@ -0,0 +1,34 @@
+// Fill out your copyright notice in the Description page of Project Settings.
+
+#include "AbilityFramework.h"
+#include "../GAGameEffect.h"
+#include "AFEffectsComponent.h"
+#include "AFPeriodApplicationOverride.h"
+
+
+
+
+bool UAFPeriodApplicationOverride::ApplyEffect(
+ const FGAEffectHandle& InHandle
+ , const FGAEffect& EffectIn
+ , struct FGAEffectContainer* InContainer
+ , const FAFEffectParams& Params
+ , const FAFFunctionModifier& Modifier)
+{
+
+ InContainer->RemoveEffect(Params.Property, Params.GetContext());
+
+ FTimerManager& DurationTimer = const_cast(Params).GetTargetTimerManager();
+
+ FTimerDelegate delDuration = FTimerDelegate::CreateUObject(Params.GetTargetEffectsComponent(), &UAFEffectsComponent::ExpireEffect, InHandle, Params);
+ DurationTimer.SetTimer(const_cast(EffectIn).DurationTimerHandle, delDuration,
+ Params.GetProperty().GetDuration(), false);
+
+ FTimerManager& PeriodTimer = const_cast(Params).GetTargetTimerManager();
+
+ FTimerDelegate PeriodDuration = FTimerDelegate::CreateUObject(Params.GetTargetEffectsComponent(), &UAFEffectsComponent::ExecuteEffect, InHandle, Params, Modifier);
+ PeriodTimer.SetTimer(const_cast(EffectIn).PeriodTimerHandle, PeriodDuration,
+ Params.GetProperty().GetPeriod(), true);
+
+ return true;
+}
\ No newline at end of file
diff --git a/Plugins/AbilityFramework/Source/AbilityFramework/Private/Effects/CustomApplications/AFPeriodicApplInfiniteOverride.cpp b/Plugins/AbilityFramework/Source/AbilityFramework/Private/Effects/CustomApplications/AFPeriodicApplInfiniteOverride.cpp
new file mode 100644
index 0000000..4585496
--- /dev/null
+++ b/Plugins/AbilityFramework/Source/AbilityFramework/Private/Effects/CustomApplications/AFPeriodicApplInfiniteOverride.cpp
@@ -0,0 +1,8 @@
+// Fill out your copyright notice in the Description page of Project Settings.
+
+#include "AbilityFramework.h"
+#include "AFPeriodicApplInfiniteOverride.h"
+
+
+
+
diff --git a/Plugins/AbilityFramework/Source/AbilityFramework/Private/Effects/EffectTasks/AFEffectTask.cpp b/Plugins/AbilityFramework/Source/AbilityFramework/Private/Effects/EffectTasks/AFEffectTask.cpp
new file mode 100644
index 0000000..d24b545
--- /dev/null
+++ b/Plugins/AbilityFramework/Source/AbilityFramework/Private/Effects/EffectTasks/AFEffectTask.cpp
@@ -0,0 +1,8 @@
+// Fill out your copyright notice in the Description page of Project Settings.
+
+#include "../../AbilityFramework.h"
+#include "AFEffectTask.h"
+
+
+
+
diff --git a/Plugins/AbilityFramework/Source/AbilityFramework/Private/Effects/EffectTasks/AFEffectTask_AppliedEffectEvent.cpp b/Plugins/AbilityFramework/Source/AbilityFramework/Private/Effects/EffectTasks/AFEffectTask_AppliedEffectEvent.cpp
new file mode 100644
index 0000000..df86500
--- /dev/null
+++ b/Plugins/AbilityFramework/Source/AbilityFramework/Private/Effects/EffectTasks/AFEffectTask_AppliedEffectEvent.cpp
@@ -0,0 +1,82 @@
+// Fill out your copyright notice in the Description page of Project Settings.
+
+#include "AbilityFramework.h"
+#include "AFAbilityInterface.h"
+#include "AFEffectsComponent.h"
+#include "AFEffectTask_AppliedEffectEvent.h"
+
+
+
+
+UAFEffectTask_AppliedEffectEvent::UAFEffectTask_AppliedEffectEvent(const FObjectInitializer& ObjectInitializer)
+ : Super(ObjectInitializer)
+{
+
+}
+
+UAFEffectTask_AppliedEffectEvent* UAFEffectTask_AppliedEffectEvent::ListenAppliedEffectEvent(UGAEffectExtension* OwningExtension, FName TaskName, FGameplayTag Tag, AActor* OptionalExternalTarget, bool OnlyTriggerOnce)
+{
+ auto MyObj = NewEffectTask(OwningExtension, TaskName);
+ MyObj->Tag = Tag;
+ MyObj->SetExternalTarget(OptionalExternalTarget);
+ MyObj->OnlyTriggerOnce = OnlyTriggerOnce;
+
+ return MyObj;
+}
+
+void UAFEffectTask_AppliedEffectEvent::Activate()
+{
+ UAFEffectsComponent* ASC = GetTargetASC();
+ if (ASC)
+ {
+ //(this, &UAFEffectTask_AppliedEffectEvent::GameplayEventCallback
+ FAFEventDelegate Delegate = FAFEventDelegate::CreateUObject(this, &UAFEffectTask_AppliedEffectEvent::GameplayEventCallback);
+ MyHandle = Delegate.GetHandle();
+ ASC->AddAppliedEvent(Tag, Delegate);
+ }
+
+ Super::Activate();
+}
+
+void UAFEffectTask_AppliedEffectEvent::GameplayEventCallback(FAFEventData Payload)
+{
+ //if (ShouldBroadcastAbilityTaskDelegates())
+ {
+ OnEvent.Broadcast(Payload);
+ }
+ if (OnlyTriggerOnce)
+ {
+ EndTask();
+ }
+}
+void UAFEffectTask_AppliedEffectEvent::OnTaskEnded()
+{
+ UAFEffectsComponent* ASC = GetTargetASC();
+ if (ASC)
+ {
+ ASC->RemoveAppliedEvent(Tag, MyHandle);
+ }
+}
+void UAFEffectTask_AppliedEffectEvent::SetExternalTarget(AActor* Actor)
+{
+ if (Actor)
+ {
+
+ if (IAFAbilityInterface* interface = Cast(Actor))
+ {
+ UseExternalTarget = true;
+ OptionalExternalTarget = interface->GetEffectsComponent();
+ }
+
+ }
+}
+
+UAFEffectsComponent* UAFEffectTask_AppliedEffectEvent::GetTargetASC()
+{
+ if (UseExternalTarget)
+ {
+ return OptionalExternalTarget;
+ }
+
+ return EffectsComponent;
+}
\ No newline at end of file
diff --git a/Plugins/AbilityFramework/Source/AbilityFramework/Private/Effects/EffectTasks/AFEffectTask_AttributeChange.cpp b/Plugins/AbilityFramework/Source/AbilityFramework/Private/Effects/EffectTasks/AFEffectTask_AttributeChange.cpp
new file mode 100644
index 0000000..1e91f68
--- /dev/null
+++ b/Plugins/AbilityFramework/Source/AbilityFramework/Private/Effects/EffectTasks/AFEffectTask_AttributeChange.cpp
@@ -0,0 +1,70 @@
+// Fill out your copyright notice in the Description page of Project Settings.
+
+#include "AbilityFramework.h"
+#include "AFEffectTask_AttributeChange.h"
+
+
+UAFEffectTask_AttributeChange::UAFEffectTask_AttributeChange(const FObjectInitializer& ObjectInitializer)
+ : Super(ObjectInitializer)
+{
+
+}
+
+UAFEffectTask_AttributeChange* UAFEffectTask_AttributeChange::ListenAttributeChanged(UGAEffectExtension* OwningExtension,
+ FGAAttribute InAttribute,
+ AActor* OptionalExternalTarget,
+ bool OnlyTriggerOnce)
+{
+ auto MyObj = NewEffectTask(OwningExtension);
+ MyObj->Attribute = InAttribute;
+ MyObj->SetExternalTarget(OptionalExternalTarget);
+ MyObj->OnlyTriggerOnce = OnlyTriggerOnce;
+
+ return MyObj;
+}
+
+void UAFEffectTask_AttributeChange::Activate()
+{
+ UAFEffectsComponent* ASC = GetTargetASC();
+ if (ASC)
+ {
+ // MyHandle = ASC->AttributeChanged.FindOrAdd(Attribute).AddUObject(this, &UAFEffectTask_AttributeChange::AttributeChangedCallback);
+ }
+
+ Super::Activate();
+}
+
+void UAFEffectTask_AttributeChange::AttributeChangedCallback(FAFAttributeChangedData Payload)
+{
+ //if (ShouldBroadcastAbilityTaskDelegates())
+ {
+ OnEvent.Broadcast(Payload);
+ }
+ if (OnlyTriggerOnce)
+ {
+ EndTask();
+ }
+}
+
+void UAFEffectTask_AttributeChange::SetExternalTarget(AActor* Actor)
+{
+ if (Actor)
+ {
+ if (IAFAbilityInterface* interface = Cast(Actor))
+ {
+ UseExternalTarget = true;
+ OptionalExternalTarget = interface->GetEffectsComponent();
+ }
+
+ }
+}
+
+UAFEffectsComponent* UAFEffectTask_AttributeChange::GetTargetASC()
+{
+ if (UseExternalTarget)
+ {
+ return OptionalExternalTarget;
+ }
+
+ return EffectsComponent;
+}
\ No newline at end of file
diff --git a/Plugins/AbilityFramework/Source/AbilityFramework/Private/Effects/EffectTasks/AFEffectTask_EffectAppliedToSelf.cpp b/Plugins/AbilityFramework/Source/AbilityFramework/Private/Effects/EffectTasks/AFEffectTask_EffectAppliedToSelf.cpp
new file mode 100644
index 0000000..79bf78f
--- /dev/null
+++ b/Plugins/AbilityFramework/Source/AbilityFramework/Private/Effects/EffectTasks/AFEffectTask_EffectAppliedToSelf.cpp
@@ -0,0 +1,80 @@
+// Fill out your copyright notice in the Description page of Project Settings.
+
+#include "AbilityFramework.h"
+#include "AFAbilityInterface.h"
+#include "AFEffectsComponent.h"
+#include "AFEffectTask_EffectAppliedToSelf.h"
+
+
+
+
+UAFEffectTask_EffectAppliedToSelf::UAFEffectTask_EffectAppliedToSelf(const FObjectInitializer& ObjectInitializer)
+ : Super(ObjectInitializer)
+{
+
+}
+
+UAFEffectTask_EffectAppliedToSelf* UAFEffectTask_EffectAppliedToSelf::ListenEffectAppliedToSelf(UGAEffectExtension* OwningExtension, FName TaskName, AActor* OptionalExternalTarget, bool OnlyTriggerOnce)
+{
+ auto MyObj = NewEffectTask(OwningExtension, TaskName);
+ MyObj->SetExternalTarget(OptionalExternalTarget);
+ MyObj->OnlyTriggerOnce = OnlyTriggerOnce;
+
+ return MyObj;
+}
+
+void UAFEffectTask_EffectAppliedToSelf::Activate()
+{
+ UAFEffectsComponent* ASC = GetTargetASC();
+ if (ASC)
+ {
+ MyHandle = ASC->OnAppliedToSelf.AddUObject(this, &UAFEffectTask_EffectAppliedToSelf::GameplayEventCallback);//AddExecuteEvent(Tag, Delegate);
+ }
+
+ Super::Activate();
+}
+
+void UAFEffectTask_EffectAppliedToSelf::GameplayEventCallback(FGAEffectContext Context
+ , FAFPropertytHandle Property
+ , FAFEffectSpec Spec)
+{
+ //if (ShouldBroadcastAbilityTaskDelegates())
+ {
+ OnEvent.Broadcast(Context, Property, Spec);
+ }
+ if (OnlyTriggerOnce)
+ {
+ EndTask();
+ }
+}
+void UAFEffectTask_EffectAppliedToSelf::OnTaskEnded()
+{
+ UAFEffectsComponent* ASC = GetTargetASC();
+ if (ASC)
+ {
+ ASC->OnAppliedToSelf.Remove(MyHandle);
+ }
+}
+void UAFEffectTask_EffectAppliedToSelf::SetExternalTarget(AActor* Actor)
+{
+ if (Actor)
+ {
+
+ if (IAFAbilityInterface* interface = Cast(Actor))
+ {
+ UseExternalTarget = true;
+ OptionalExternalTarget = interface->GetEffectsComponent();
+ }
+
+ }
+}
+
+UAFEffectsComponent* UAFEffectTask_EffectAppliedToSelf::GetTargetASC()
+{
+ if (UseExternalTarget)
+ {
+ return OptionalExternalTarget;
+ }
+
+ return EffectsComponent;
+}
\ No newline at end of file
diff --git a/Plugins/AbilityFramework/Source/AbilityFramework/Private/Effects/EffectTasks/AFEffectTask_EffectAppliedToTarget.cpp b/Plugins/AbilityFramework/Source/AbilityFramework/Private/Effects/EffectTasks/AFEffectTask_EffectAppliedToTarget.cpp
new file mode 100644
index 0000000..b81e9f6
--- /dev/null
+++ b/Plugins/AbilityFramework/Source/AbilityFramework/Private/Effects/EffectTasks/AFEffectTask_EffectAppliedToTarget.cpp
@@ -0,0 +1,85 @@
+// Fill out your copyright notice in the Description page of Project Settings.
+
+#include "AbilityFramework.h"
+#include "AFAbilityInterface.h"
+#include "AFEffectsComponent.h"
+#include "AFEffectTask_EffectAppliedToTarget.h"
+
+
+
+
+UAFEffectTask_EffectAppliedToTarget::UAFEffectTask_EffectAppliedToTarget(const FObjectInitializer& ObjectInitializer)
+ : Super(ObjectInitializer)
+{
+
+}
+
+UAFEffectTask_EffectAppliedToTarget* UAFEffectTask_EffectAppliedToTarget::ListenEffectAppliedToTarget(UGAEffectExtension* OwningExtension, FName TaskName, AActor* OptionalExternalTarget, bool OnlyTriggerOnce)
+{
+ auto MyObj = NewEffectTask(OwningExtension, TaskName);
+ MyObj->SetExternalTarget(OptionalExternalTarget);
+ MyObj->OnlyTriggerOnce = OnlyTriggerOnce;
+
+ return MyObj;
+}
+
+void UAFEffectTask_EffectAppliedToTarget::Activate()
+{
+ UAFEffectsComponent* ASC = GetTargetASC();
+ if (ASC)
+ {
+ //(this, &UAFEffectTask_EffectAppliedToTarget::GameplayEventCallback
+ //FAFEventDelegate Delegate = FAFEventDelegate::CreateUObject(this, &UAFEffectTask_EffectAppliedToTarget::GameplayEventCallback);
+ //MyHandle = Delegate.GetHandle();
+ MyHandle = ASC->OnAppliedToTarget.AddUObject(this, &UAFEffectTask_EffectAppliedToTarget::GameplayEventCallback);//AddExecuteEvent(Tag, Delegate);
+ }
+
+ Super::Activate();
+}
+
+void UAFEffectTask_EffectAppliedToTarget::GameplayEventCallback(FGAEffectContext Context
+ , FAFPropertytHandle Property
+ , FAFEffectSpec Spec)
+{
+ //if (ShouldBroadcastAbilityTaskDelegates())
+ {
+ OnEvent.Broadcast(Context, Property, Spec);
+ }
+ if (OnlyTriggerOnce)
+ {
+ EndTask();
+ }
+}
+
+void UAFEffectTask_EffectAppliedToTarget::OnTaskEnded()
+{
+ UAFEffectsComponent* ASC = GetTargetASC();
+ if (ASC)
+ {
+ ASC->OnAppliedToTarget.Remove(MyHandle);
+ }
+}
+
+void UAFEffectTask_EffectAppliedToTarget::SetExternalTarget(AActor* Actor)
+{
+ if (Actor)
+ {
+
+ if (IAFAbilityInterface* interface = Cast(Actor))
+ {
+ UseExternalTarget = true;
+ OptionalExternalTarget = interface->GetEffectsComponent();
+ }
+
+ }
+}
+
+UAFEffectsComponent* UAFEffectTask_EffectAppliedToTarget::GetTargetASC()
+{
+ if (UseExternalTarget)
+ {
+ return OptionalExternalTarget;
+ }
+
+ return EffectsComponent;
+}
diff --git a/Plugins/AbilityFramework/Source/AbilityFramework/Private/Effects/EffectTasks/AFEffectTask_EffectEvent.cpp b/Plugins/AbilityFramework/Source/AbilityFramework/Private/Effects/EffectTasks/AFEffectTask_EffectEvent.cpp
new file mode 100644
index 0000000..c59cda4
--- /dev/null
+++ b/Plugins/AbilityFramework/Source/AbilityFramework/Private/Effects/EffectTasks/AFEffectTask_EffectEvent.cpp
@@ -0,0 +1,84 @@
+// Fill out your copyright notice in the Description page of Project Settings.
+
+#include "AbilityFramework.h"
+#include "../../AFAbilityInterface.h"
+#include "AFEffectsComponent.h"
+#include "AFEffectTask_EffectEvent.h"
+
+
+
+
+UAFEffectTask_EffectEvent::UAFEffectTask_EffectEvent(const FObjectInitializer& ObjectInitializer)
+ : Super(ObjectInitializer)
+{
+
+}
+
+UAFEffectTask_EffectEvent* UAFEffectTask_EffectEvent::ListenEffectEvent(UGAEffectExtension* OwningExtension, FName TaskName, FGameplayTag Tag, AActor* OptionalExternalTarget, bool OnlyTriggerOnce)
+{
+ auto MyObj = NewEffectTask(OwningExtension, TaskName);
+ MyObj->Tag = Tag;
+ MyObj->SetExternalTarget(OptionalExternalTarget);
+ MyObj->OnlyTriggerOnce = OnlyTriggerOnce;
+
+ return MyObj;
+}
+
+void UAFEffectTask_EffectEvent::Activate()
+{
+ UAFEffectsComponent* ASC = GetTargetASC();
+ if (ASC)
+ {
+ //(this, &UAFEffectTask_EffectEvent::GameplayEventCallback
+ FAFEventDelegate Delegate = FAFEventDelegate::CreateUObject(this, &UAFEffectTask_EffectEvent::GameplayEventCallback);
+ MyHandle = Delegate.GetHandle();
+ ASC->AddEvent(Tag, Delegate);
+ }
+
+ Super::Activate();
+}
+
+void UAFEffectTask_EffectEvent::GameplayEventCallback(FAFEventData Payload)
+{
+ //if (ShouldBroadcastAbilityTaskDelegates())
+ {
+ OnEvent.Broadcast(Payload);
+ }
+ if (OnlyTriggerOnce)
+ {
+ EndTask();
+ }
+}
+
+void UAFEffectTask_EffectEvent::OnTaskEnded()
+{
+ UAFEffectsComponent* ASC = GetTargetASC();
+ if (ASC)
+ {
+ ASC->RemoveEvent(Tag, MyHandle);
+ }
+}
+
+void UAFEffectTask_EffectEvent::SetExternalTarget(AActor* Actor)
+{
+ if (Actor)
+ {
+
+ if (IAFAbilityInterface* interface = Cast(Actor))
+ {
+ UseExternalTarget = true;
+ OptionalExternalTarget = interface->GetEffectsComponent();
+ }
+
+ }
+}
+
+UAFEffectsComponent* UAFEffectTask_EffectEvent::GetTargetASC()
+{
+ if (UseExternalTarget)
+ {
+ return OptionalExternalTarget;
+ }
+
+ return EffectsComponent;
+}
\ No newline at end of file
diff --git a/Plugins/AbilityFramework/Source/AbilityFramework/Private/Effects/EffectTasks/AFEffectTask_ExecutedEffectEvent.cpp b/Plugins/AbilityFramework/Source/AbilityFramework/Private/Effects/EffectTasks/AFEffectTask_ExecutedEffectEvent.cpp
new file mode 100644
index 0000000..cdeaaa0
--- /dev/null
+++ b/Plugins/AbilityFramework/Source/AbilityFramework/Private/Effects/EffectTasks/AFEffectTask_ExecutedEffectEvent.cpp
@@ -0,0 +1,84 @@
+// Fill out your copyright notice in the Description page of Project Settings.
+
+#include "AbilityFramework.h"
+#include "AFAbilityInterface.h"
+#include "AFEffectsComponent.h"
+#include "AFEffectTask_ExecutedEffectEvent.h"
+
+
+
+
+UAFEffectTask_ExecutedEffectEvent::UAFEffectTask_ExecutedEffectEvent(const FObjectInitializer& ObjectInitializer)
+ : Super(ObjectInitializer)
+{
+
+}
+
+UAFEffectTask_ExecutedEffectEvent* UAFEffectTask_ExecutedEffectEvent::ListenExecutedEffectEvent(UGAEffectExtension* OwningExtension, FName TaskName, FGameplayTag Tag, AActor* OptionalExternalTarget, bool OnlyTriggerOnce)
+{
+ auto MyObj = NewEffectTask(OwningExtension, TaskName);
+ MyObj->Tag = Tag;
+ MyObj->SetExternalTarget(OptionalExternalTarget);
+ MyObj->OnlyTriggerOnce = OnlyTriggerOnce;
+
+ return MyObj;
+}
+
+void UAFEffectTask_ExecutedEffectEvent::Activate()
+{
+ UAFEffectsComponent* ASC = GetTargetASC();
+ if (ASC)
+ {
+ //(this, &UAFEffectTask_ExecutedEffectEvent::GameplayEventCallback
+ FAFEventDelegate Delegate = FAFEventDelegate::CreateUObject(this, &UAFEffectTask_ExecutedEffectEvent::GameplayEventCallback);
+ MyHandle = Delegate.GetHandle();
+ ASC->AddExecuteEvent(Tag, Delegate);
+ }
+
+ Super::Activate();
+}
+
+void UAFEffectTask_ExecutedEffectEvent::GameplayEventCallback(FAFEventData Payload)
+{
+ //if (ShouldBroadcastAbilityTaskDelegates())
+ {
+ OnEvent.Broadcast(Payload);
+ }
+ if (OnlyTriggerOnce)
+ {
+ EndTask();
+ }
+}
+
+void UAFEffectTask_ExecutedEffectEvent::OnTaskEnded()
+{
+ UAFEffectsComponent* ASC = GetTargetASC();
+ if (ASC)
+ {
+ ASC->RemoveExecuteEvent(Tag, MyHandle);
+ }
+}
+
+void UAFEffectTask_ExecutedEffectEvent::SetExternalTarget(AActor* Actor)
+{
+ if (Actor)
+ {
+
+ if (IAFAbilityInterface* interface = Cast(Actor))
+ {
+ UseExternalTarget = true;
+ OptionalExternalTarget = interface->GetEffectsComponent();
+ }
+
+ }
+}
+
+UAFEffectsComponent* UAFEffectTask_ExecutedEffectEvent::GetTargetASC()
+{
+ if (UseExternalTarget)
+ {
+ return OptionalExternalTarget;
+ }
+
+ return EffectsComponent;
+}
\ No newline at end of file
diff --git a/Plugins/AbilityFramework/Source/AbilityFramework/Private/Effects/GABlueprintLibrary.cpp b/Plugins/AbilityFramework/Source/AbilityFramework/Private/Effects/GABlueprintLibrary.cpp
new file mode 100644
index 0000000..be06b10
--- /dev/null
+++ b/Plugins/AbilityFramework/Source/AbilityFramework/Private/Effects/GABlueprintLibrary.cpp
@@ -0,0 +1,384 @@
+// Copyright 1998-2014 Epic Games, Inc. All Rights Reserved.
+
+#include "AbilityFramework.h"
+#include "AFAbilityComponent.h"
+
+
+#include "GABlueprintLibrary.h"
+
+#include "AFAbilityInterface.h"
+#include "GAGameEffect.h"
+#include "AFEffectCustomApplication.h"
+
+#include "GAEffectExtension.h"
+#include "Engine/Engine.h"
+#include "AFSimpleInterface.h"
+#include "AFAttributeInterface.h"
+#include "AFEffectsComponent.h"
+
+UGABlueprintLibrary::UGABlueprintLibrary(const FObjectInitializer& ObjectInitializer)
+ : Super(ObjectInitializer)
+{
+
+}
+
+
+TArray UGABlueprintLibrary::ApplyGameEffectToObject(
+ UPARAM(Ref) FAFPropertytHandle& InEffect
+ , class UObject* Target
+ , class APawn* Instigator
+ , UObject* Causer
+ , const FAFFunctionModifier& Modifier)
+{
+ TArray Targets;
+ Targets.Add(Target);
+ return ApplyEffectToObject(InEffect, Targets, Instigator, Causer, Modifier);
+}
+
+TArray UGABlueprintLibrary::ApplyGameEffectToActor(
+ UPARAM(Ref) FAFPropertytHandle& InEffect
+ , class AActor* Target
+ , class APawn* Instigator
+ , UObject* Causer
+ , const FAFFunctionModifier& Modifier)
+{
+ TArray Targets;
+ Targets.Add(Target);
+ return ApplyEffectToActor(InEffect, Targets, Instigator, Causer, Modifier);
+}
+
+TArray UGABlueprintLibrary::ApplyGameEffectToLocation(
+ UPARAM(Ref) FAFPropertytHandle& InEffect
+ , const FHitResult& Target
+ , class APawn* Instigator
+ , UObject* Causer
+ , const FAFFunctionModifier& Modifier)
+{
+ TArray