first
commit
c99be9e314
|
|
@ -0,0 +1,71 @@
|
||||||
|
// Fill out your copyright notice in the Description page of Project Settings.
|
||||||
|
#if WITH_EDITOR
|
||||||
|
|
||||||
|
#include "CustomExtensionCommands.h"
|
||||||
|
|
||||||
|
//Uncomment if you are necessary
|
||||||
|
|
||||||
|
//#include "Misc/MessageDialog.h"
|
||||||
|
//#include "LevelEditor.h"
|
||||||
|
|
||||||
|
//#include "Engine/Selection.h"
|
||||||
|
//#include "Editor/EditorEngine.h"
|
||||||
|
#include "Editor/Blutility/Classes/EditorUtilityWidget.h"
|
||||||
|
#include "EditorUtilitySubsystem.h"
|
||||||
|
#include "EditorUtilityWidgetBlueprint.h"
|
||||||
|
//#include "Misc/FileHelper.h"
|
||||||
|
//#include "HAL/FileManagerGeneric.h"
|
||||||
|
//#include "NotificationHelper.h"
|
||||||
|
|
||||||
|
|
||||||
|
#define LOCTEXT_NAMESPACE "IGCCommand"
|
||||||
|
|
||||||
|
void CustomExtensionCommands::RegisterCommands()
|
||||||
|
{
|
||||||
|
UI_COMMAND(Command1, "LevelTool", "Button1", EUserInterfaceActionType::Button, FInputGesture());
|
||||||
|
UI_COMMAND(Command2, "IGCCommand2", "Button2", EUserInterfaceActionType::Button, FInputGesture());
|
||||||
|
UI_COMMAND(Command3, "IGCCommand3", "Button3", EUserInterfaceActionType::Button, FInputGesture());
|
||||||
|
}
|
||||||
|
|
||||||
|
void FIGCExtensionActions::Action1()
|
||||||
|
{
|
||||||
|
UEditorUtilityWidgetBlueprint* LevelToolWBPU = LoadObject<UEditorUtilityWidgetBlueprint>(nullptr, L"/Game/System/Core/Blutilities/WBPU_LevelToolByTable");
|
||||||
|
UWorld* World = GEditor->GetEditorWorldContext().World();
|
||||||
|
if(World)
|
||||||
|
{
|
||||||
|
if(UEditorUtilitySubsystem* EditorUtilitySubsystem = GEditor->GetEditorSubsystem<UEditorUtilitySubsystem>())
|
||||||
|
{
|
||||||
|
if(LevelToolWBPU != nullptr)
|
||||||
|
{
|
||||||
|
EditorUtilitySubsystem->SpawnAndRegisterTab(LevelToolWBPU);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
void FIGCExtensionActions::Action2()
|
||||||
|
{
|
||||||
|
/*Active Action when Press Button2*/
|
||||||
|
}
|
||||||
|
|
||||||
|
void FIGCExtensionActions::Action3()
|
||||||
|
{
|
||||||
|
/*Active Action when Press Button3*/
|
||||||
|
}
|
||||||
|
|
||||||
|
void FIGCExtensionActions::Action4(ECheckBoxState state)
|
||||||
|
{
|
||||||
|
/*Active Action when Checking to CheckBox1*/
|
||||||
|
}
|
||||||
|
|
||||||
|
void FIGCExtensionActions::Action5(ECheckBoxState state)
|
||||||
|
{
|
||||||
|
/*Active Action when Checking to CheckBox2*/
|
||||||
|
}
|
||||||
|
|
||||||
|
void FIGCExtensionActions::Action6(TSharedPtr<FString> NewSelection)
|
||||||
|
{
|
||||||
|
/*Active Action when Selecting to ComboBox's value */
|
||||||
|
}
|
||||||
|
|
||||||
|
#endif
|
||||||
|
|
@ -0,0 +1,53 @@
|
||||||
|
// Fill out your copyright notice in the Description page of Project Settings.
|
||||||
|
|
||||||
|
#pragma once
|
||||||
|
|
||||||
|
#if WITH_EDITOR
|
||||||
|
|
||||||
|
#include "CoreMinimal.h"
|
||||||
|
#include "Framework/Commands/Commands.h"
|
||||||
|
#include "../EditorSlateStyle/CustomSlateStyle.h"
|
||||||
|
|
||||||
|
|
||||||
|
/**
|
||||||
|
*
|
||||||
|
*/
|
||||||
|
class EDITORUTILITYMODULE_API CustomExtensionCommands : public TCommands<CustomExtensionCommands>
|
||||||
|
{
|
||||||
|
public:
|
||||||
|
|
||||||
|
|
||||||
|
CustomExtensionCommands()
|
||||||
|
:TCommands<CustomExtensionCommands>(TEXT("CustomExtensionCommands"), NSLOCTEXT("CustomExtensionCommands", "CustomExtensionCommands", "CustomExtensionCommands"), NAME_None, CustomSlateStyle::GetStyleSetName())
|
||||||
|
{
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
virtual void RegisterCommands()override;
|
||||||
|
|
||||||
|
public:
|
||||||
|
|
||||||
|
//Slate button commands
|
||||||
|
|
||||||
|
TSharedPtr< FUICommandInfo > Command1;
|
||||||
|
TSharedPtr< FUICommandInfo > Command2;
|
||||||
|
TSharedPtr< FUICommandInfo > Command3;
|
||||||
|
|
||||||
|
};
|
||||||
|
|
||||||
|
|
||||||
|
/*Actions by Slate UI*/
|
||||||
|
class FIGCExtensionActions
|
||||||
|
{
|
||||||
|
public:
|
||||||
|
static void Action1();
|
||||||
|
static void Action2();
|
||||||
|
static void Action3();
|
||||||
|
static void Action4(ECheckBoxState state);
|
||||||
|
static void Action5(ECheckBoxState state);
|
||||||
|
static void Action6(TSharedPtr<FString> NewSelection);
|
||||||
|
};
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
#endif
|
||||||
|
|
@ -0,0 +1,58 @@
|
||||||
|
// Fill out your copyright notice in the Description page of Project Settings.
|
||||||
|
#if WITH_EDITOR
|
||||||
|
|
||||||
|
#include "CustomSlateStyle.h"
|
||||||
|
#include "Slate/SlateGameResources.h"
|
||||||
|
#include "Styling/SlateStyleRegistry.h"
|
||||||
|
|
||||||
|
TSharedPtr< FSlateStyleSet > CustomSlateStyle::StyleInstance = nullptr;
|
||||||
|
|
||||||
|
#define IMAGE_BRUSH( RelativePath, ... ) FSlateImageBrush( Style->RootToContentDir( RelativePath, TEXT(".png") ), __VA_ARGS__ )
|
||||||
|
|
||||||
|
const FVector2D Icon16x16(16.0f, 16.0f);
|
||||||
|
const FVector2D Icon20x20(20.0f, 20.0f);
|
||||||
|
const FVector2D Icon40x40(40.0f, 40.0f);
|
||||||
|
const FVector2D DebugToolBtn(64.f, 64.f);
|
||||||
|
|
||||||
|
|
||||||
|
void CustomSlateStyle::Initialize()
|
||||||
|
{
|
||||||
|
if(!StyleInstance.IsValid())
|
||||||
|
{
|
||||||
|
// StyleInstance = Create();
|
||||||
|
// FSlateStyleRegistry::RegisterSlateStyle(*StyleInstance);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
void CustomSlateStyle::Shutdown()
|
||||||
|
{
|
||||||
|
// FSlateStyleRegistry::UnRegisterSlateStyle(*StyleInstance);
|
||||||
|
// ensure(StyleInstance.IsUnique());
|
||||||
|
// StyleInstance.Reset();
|
||||||
|
}
|
||||||
|
|
||||||
|
const ISlateStyle& CustomSlateStyle::Get()
|
||||||
|
{
|
||||||
|
return *StyleInstance;
|
||||||
|
}
|
||||||
|
|
||||||
|
FName CustomSlateStyle::GetStyleSetName()
|
||||||
|
{
|
||||||
|
static FName StyleSetName(TEXT("IGCExtensionStyle"));
|
||||||
|
return StyleSetName;
|
||||||
|
}
|
||||||
|
|
||||||
|
//TSharedRef<class FSlateStyleSet> CustomSlateStyle::Create()
|
||||||
|
//{
|
||||||
|
// TSharedRef< FSlateStyleSet > Style = MakeShareable(new FSlateStyleSet("IGCExtensionStyle"));
|
||||||
|
//
|
||||||
|
// /*Style->SetContentRoot(FPaths::EngineContentDir() / TEXT("Editor/Slate"));
|
||||||
|
// Style->Set("IGCToolbarIcon.Command2", new IMAGE_BRUSH("Old/Kismet2/compile_512px", DebugToolBtn));
|
||||||
|
// Style->Set("IGCToolbarIcon.Command3", new IMAGE_BRUSH("Old/TrashCan", DebugToolBtn));*/
|
||||||
|
//
|
||||||
|
// return Style;
|
||||||
|
//}
|
||||||
|
|
||||||
|
#undef IMAGE_BRUSH
|
||||||
|
|
||||||
|
#endif
|
||||||
|
|
@ -0,0 +1,30 @@
|
||||||
|
// Fill out your copyright notice in the Description page of Project Settings.
|
||||||
|
|
||||||
|
#pragma once
|
||||||
|
|
||||||
|
#if WITH_EDITOR
|
||||||
|
|
||||||
|
#include "CoreMinimal.h"
|
||||||
|
|
||||||
|
/**
|
||||||
|
*
|
||||||
|
*/
|
||||||
|
class EDITORUTILITYMODULE_API CustomSlateStyle
|
||||||
|
{
|
||||||
|
public:
|
||||||
|
|
||||||
|
|
||||||
|
static void Initialize();
|
||||||
|
static void Shutdown();
|
||||||
|
|
||||||
|
static const ISlateStyle& Get();
|
||||||
|
static FName GetStyleSetName();
|
||||||
|
|
||||||
|
private:
|
||||||
|
// static TSharedRef< class FSlateStyleSet > Create();
|
||||||
|
|
||||||
|
private:
|
||||||
|
static TSharedPtr< class FSlateStyleSet > StyleInstance;
|
||||||
|
};
|
||||||
|
|
||||||
|
#endif
|
||||||
|
|
@ -0,0 +1,21 @@
|
||||||
|
// Copyright Epic Games, Inc. All Rights Reserved.
|
||||||
|
|
||||||
|
using UnrealBuildTool;
|
||||||
|
|
||||||
|
public class EditorUtilityModule : ModuleRules
|
||||||
|
{
|
||||||
|
public EditorUtilityModule(ReadOnlyTargetRules Target) : base(Target)
|
||||||
|
{
|
||||||
|
PCHUsage = PCHUsageMode.UseExplicitOrSharedPCHs;
|
||||||
|
|
||||||
|
PublicDependencyModuleNames.AddRange(new string[] { "Core", "CoreUObject", "Engine", "InputCore", "Slate", "SlateCore" });
|
||||||
|
|
||||||
|
|
||||||
|
if (Target.Type == TargetRules.TargetType.Editor)
|
||||||
|
{
|
||||||
|
PublicDependencyModuleNames.AddRange(new string[] { "UnrealEd", "LevelEditor" });
|
||||||
|
PrivateDependencyModuleNames.AddRange(new string[] { "UMG", "Blutility", "UMGEditor" });
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
@ -0,0 +1,132 @@
|
||||||
|
|
||||||
|
#if WITH_EDITOR
|
||||||
|
|
||||||
|
#include "EditorUtilityModule.h"
|
||||||
|
#include "Commands/CustomExtensionCommands.h"
|
||||||
|
#include "Framework/MultiBox/MultiBoxExtender.h"
|
||||||
|
#include "Framework/MultiBox/MultiBoxBuilder.h"
|
||||||
|
#include "LevelEditor.h"
|
||||||
|
|
||||||
|
IMPLEMENT_MODULE(FEditorUtilityModule, EditorUtilityModule);
|
||||||
|
|
||||||
|
|
||||||
|
#define LOCTEXT_NAMESPACE "IGCMenu"
|
||||||
|
|
||||||
|
void FEditorUtilityModule::StartupModule()
|
||||||
|
{
|
||||||
|
CustomSlateStyle::Initialize();
|
||||||
|
|
||||||
|
CustomExtensionCommands::Register();
|
||||||
|
|
||||||
|
IGCCommandList = MakeShareable(new FUICommandList());
|
||||||
|
IGCCommandList->MapAction(CustomExtensionCommands::Get().Command1, FExecuteAction::CreateStatic(&FIGCExtensionActions::Action1), FCanExecuteAction());
|
||||||
|
IGCCommandList->MapAction(CustomExtensionCommands::Get().Command2, FExecuteAction::CreateStatic(&FIGCExtensionActions::Action2), FCanExecuteAction());
|
||||||
|
IGCCommandList->MapAction(CustomExtensionCommands::Get().Command3, FExecuteAction::CreateStatic(&FIGCExtensionActions::Action3), FCanExecuteAction());
|
||||||
|
|
||||||
|
FLevelEditorModule& LevelEditorModule = FModuleManager::LoadModuleChecked<FLevelEditorModule>("LevelEditor");
|
||||||
|
|
||||||
|
static bool IsCheckedBox1;
|
||||||
|
static bool IsCheckedBox2;
|
||||||
|
static TArray<TSharedPtr<FString>> ComboboxOptions;
|
||||||
|
static TSharedPtr<FString> SelectedOption;
|
||||||
|
|
||||||
|
ComboboxOptions.Add(MakeShareable(new FString("Value1")));
|
||||||
|
ComboboxOptions.Add(MakeShareable(new FString("Value2")));
|
||||||
|
ComboboxOptions.Add(MakeShareable(new FString("Value3")));
|
||||||
|
|
||||||
|
struct IGCToolbar
|
||||||
|
{
|
||||||
|
static void CreateIGCToolbar(FToolBarBuilder& ToolbarBuilder)
|
||||||
|
{
|
||||||
|
ToolbarBuilder.BeginSection("IGCToolbar");
|
||||||
|
{
|
||||||
|
ToolbarBuilder.AddToolBarWidget(
|
||||||
|
SNew(SButton)
|
||||||
|
.OnClicked_Lambda([]()->FReply { FIGCExtensionActions::Action1(); return FReply::Handled(); })
|
||||||
|
[
|
||||||
|
SNew(STextBlock)
|
||||||
|
.Text(FText::FromString("LevelTool"))
|
||||||
|
]
|
||||||
|
);
|
||||||
|
|
||||||
|
ToolbarBuilder.AddToolBarButton(
|
||||||
|
CustomExtensionCommands::Get().Command2,
|
||||||
|
NAME_None,
|
||||||
|
TAttribute<FText>(),
|
||||||
|
TAttribute<FText>(),
|
||||||
|
FSlateIcon(),
|
||||||
|
NAME_None
|
||||||
|
);
|
||||||
|
ToolbarBuilder.AddToolBarButton(
|
||||||
|
CustomExtensionCommands::Get().Command3,
|
||||||
|
NAME_None,
|
||||||
|
TAttribute<FText>(),
|
||||||
|
TAttribute<FText>(),
|
||||||
|
FSlateIcon(),
|
||||||
|
NAME_None
|
||||||
|
);
|
||||||
|
|
||||||
|
ToolbarBuilder.AddToolBarWidget(
|
||||||
|
SNew(SCheckBox)
|
||||||
|
.OnCheckStateChanged_Lambda(&FIGCExtensionActions::Action4)
|
||||||
|
.IsChecked(IsCheckedBox1),
|
||||||
|
LOCTEXT("SCCheckBox", "CheckBox1")
|
||||||
|
);
|
||||||
|
|
||||||
|
|
||||||
|
ToolbarBuilder.AddToolBarWidget(
|
||||||
|
SNew(SCheckBox)
|
||||||
|
.OnCheckStateChanged_Lambda(&FIGCExtensionActions::Action5)
|
||||||
|
.IsChecked(IsCheckedBox2),
|
||||||
|
LOCTEXT("SCCheckBox", "CheckBox2")
|
||||||
|
);
|
||||||
|
|
||||||
|
ToolbarBuilder.AddToolBarWidget(
|
||||||
|
SNew(SBox)
|
||||||
|
.Padding(FMargin(20.f, 0.f, 0.f, 0.f))
|
||||||
|
[
|
||||||
|
SNew(SComboBox<TSharedPtr<FString>>)
|
||||||
|
.OptionsSource(&ComboboxOptions)
|
||||||
|
.ToolTipText(LOCTEXT("PlatformComboBox", "Change Build Platform"))
|
||||||
|
.OnGenerateWidget_Lambda([](TSharedPtr<FString> Option)
|
||||||
|
{
|
||||||
|
return SNew(STextBlock).Text(FText::FromString(*Option.Get()));
|
||||||
|
})
|
||||||
|
.OnSelectionChanged_Lambda([](TSharedPtr<FString> NewSelection, ESelectInfo::Type SelectInfo)
|
||||||
|
{
|
||||||
|
if (NewSelection.IsValid())
|
||||||
|
{
|
||||||
|
SelectedOption = NewSelection;
|
||||||
|
FIGCExtensionActions::Action6(SelectedOption);
|
||||||
|
}
|
||||||
|
})
|
||||||
|
.InitiallySelectedItem(SelectedOption)
|
||||||
|
.Content()
|
||||||
|
[
|
||||||
|
SNew(STextBlock)
|
||||||
|
.Text_Lambda([]()
|
||||||
|
{
|
||||||
|
return SelectedOption.IsValid() ? FText::FromString(*SelectedOption) : LOCTEXT("NoSelection", "선택없음");
|
||||||
|
})
|
||||||
|
]
|
||||||
|
]
|
||||||
|
, LOCTEXT("SCComboBox", "ComboBox"));
|
||||||
|
}
|
||||||
|
ToolbarBuilder.EndSection();
|
||||||
|
}
|
||||||
|
|
||||||
|
};
|
||||||
|
|
||||||
|
TSharedPtr<FExtender> IGCToolbarExtender = MakeShareable(new FExtender());
|
||||||
|
IGCToolbarExtender->AddToolBarExtension("Play", EExtensionHook::After, IGCCommandList,
|
||||||
|
FToolBarExtensionDelegate::CreateStatic(&IGCToolbar::CreateIGCToolbar));
|
||||||
|
LevelEditorModule.GetToolBarExtensibilityManager()->AddExtender(IGCToolbarExtender);
|
||||||
|
}
|
||||||
|
|
||||||
|
void FEditorUtilityModule::ShutdownModule()
|
||||||
|
{
|
||||||
|
CustomExtensionCommands::Unregister();
|
||||||
|
CustomSlateStyle::Shutdown();
|
||||||
|
}
|
||||||
|
|
||||||
|
#endif
|
||||||
|
|
@ -0,0 +1,24 @@
|
||||||
|
#if WITH_EDITOR
|
||||||
|
|
||||||
|
#pragma once
|
||||||
|
|
||||||
|
|
||||||
|
#include "Engine.h"
|
||||||
|
#include "Modules/ModuleInterface.h"
|
||||||
|
#include "Modules/ModuleManager.h"
|
||||||
|
|
||||||
|
class FEditorUtilityModule : public IModuleInterface
|
||||||
|
{
|
||||||
|
public:
|
||||||
|
|
||||||
|
virtual void StartupModule()override;
|
||||||
|
virtual void ShutdownModule()override;
|
||||||
|
|
||||||
|
private:
|
||||||
|
|
||||||
|
TSharedPtr<class FUICommandList> IGCCommandList;
|
||||||
|
|
||||||
|
|
||||||
|
};
|
||||||
|
|
||||||
|
#endif
|
||||||
|
|
@ -0,0 +1,24 @@
|
||||||
|
// Fill out your copyright notice in the Description page of Project Settings.
|
||||||
|
|
||||||
|
|
||||||
|
#include "MessageAlert.h"
|
||||||
|
#include "Widgets/Notifications/SNotificationList.h"
|
||||||
|
#include "Framework/Notifications/NotificationManager.h"
|
||||||
|
|
||||||
|
MessageAlert::MessageAlert()
|
||||||
|
{
|
||||||
|
}
|
||||||
|
|
||||||
|
MessageAlert::~MessageAlert()
|
||||||
|
{
|
||||||
|
}
|
||||||
|
|
||||||
|
void MessageAlert::ShowNotifyInfo(const FString& Msg)
|
||||||
|
{
|
||||||
|
FNotificationInfo NotifyInfo(FText::FromString(Msg));
|
||||||
|
|
||||||
|
NotifyInfo.bUseLargeFont = true;
|
||||||
|
NotifyInfo.FadeOutDuration = 5.f;
|
||||||
|
|
||||||
|
FSlateNotificationManager::Get().AddNotification(NotifyInfo);
|
||||||
|
}
|
||||||
|
|
@ -0,0 +1,18 @@
|
||||||
|
// Fill out your copyright notice in the Description page of Project Settings.
|
||||||
|
|
||||||
|
#pragma once
|
||||||
|
|
||||||
|
#include "CoreMinimal.h"
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 에디터 우측 하단 시스템 알림을 위한 클래스
|
||||||
|
*/
|
||||||
|
class EDITORUTILITYMODULE_API MessageAlert
|
||||||
|
{
|
||||||
|
public:
|
||||||
|
MessageAlert();
|
||||||
|
~MessageAlert();
|
||||||
|
|
||||||
|
public:
|
||||||
|
static void ShowNotifyInfo(const FString& Msg);
|
||||||
|
};
|
||||||
|
|
@ -0,0 +1,15 @@
|
||||||
|
// Copyright Epic Games, Inc. All Rights Reserved.
|
||||||
|
|
||||||
|
using UnrealBuildTool;
|
||||||
|
using System.Collections.Generic;
|
||||||
|
|
||||||
|
public class ProjectTTarget : TargetRules
|
||||||
|
{
|
||||||
|
public ProjectTTarget(TargetInfo Target) : base(Target)
|
||||||
|
{
|
||||||
|
Type = TargetType.Game;
|
||||||
|
DefaultBuildSettings = BuildSettingsVersion.V5;
|
||||||
|
IncludeOrderVersion = EngineIncludeOrderVersion.Unreal5_5;
|
||||||
|
ExtraModuleNames.AddRange(new string[] { "ProjectT" , "EditorUtilityModule"});
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
@ -0,0 +1,55 @@
|
||||||
|
//Generated ContentType Index to Enum
|
||||||
|
|
||||||
|
#pragma once
|
||||||
|
|
||||||
|
UENUM(BlueprintType)
|
||||||
|
enum class EContentType : uint8
|
||||||
|
{
|
||||||
|
None = 0 UMETA(DisplayName = "None"),
|
||||||
|
Stage = 10 UMETA(DisplayName= "Stage"),
|
||||||
|
Objective = 11 UMETA(DisplayName= "Objective"),
|
||||||
|
CharacterUnlock = 14 UMETA(DisplayName= "CharacterUnlock"),
|
||||||
|
PlayerCharacter = 20 UMETA(DisplayName= "PlayerCharacter"),
|
||||||
|
EnemyNpc = 21 UMETA(DisplayName= "EnemyNpc"),
|
||||||
|
ObjectiveNpc = 22 UMETA(DisplayName= "ObjectiveNpc"),
|
||||||
|
Effect = 30 UMETA(DisplayName= "Effect"),
|
||||||
|
Skill = 31 UMETA(DisplayName= "Skill"),
|
||||||
|
Item = 40 UMETA(DisplayName= "Item"),
|
||||||
|
ItemSet = 41 UMETA(DisplayName= "ItemSet"),
|
||||||
|
LevelObject = 42 UMETA(DisplayName= "LevelObject"),
|
||||||
|
Localization = 60 UMETA(DisplayName= "Localization"),
|
||||||
|
Mesh = 80 UMETA(DisplayName= "Mesh"),
|
||||||
|
MeshSet = 81 UMETA(DisplayName= "MeshSet"),
|
||||||
|
Animation = 82 UMETA(DisplayName= "Animation"),
|
||||||
|
Sound = 91 UMETA(DisplayName= "Sound"),
|
||||||
|
Haptic = 93 UMETA(DisplayName= "Haptic"),
|
||||||
|
Vfx = 94 UMETA(DisplayName= "Vfx"),
|
||||||
|
};
|
||||||
|
ENUM_RANGE_BY_FIRST_AND_LAST(EContentType,EContentType::Stage,EContentType::Vfx);
|
||||||
|
|
||||||
|
static FString EnumToString(EContentType InEnum)
|
||||||
|
{
|
||||||
|
switch (InEnum)
|
||||||
|
{
|
||||||
|
case EContentType::Stage: return TEXT("Stage");
|
||||||
|
case EContentType::Objective: return TEXT("Objective");
|
||||||
|
case EContentType::CharacterUnlock: return TEXT("CharacterUnlock");
|
||||||
|
case EContentType::PlayerCharacter: return TEXT("PlayerCharacter");
|
||||||
|
case EContentType::EnemyNpc: return TEXT("EnemyNpc");
|
||||||
|
case EContentType::ObjectiveNpc: return TEXT("ObjectiveNpc");
|
||||||
|
case EContentType::Effect: return TEXT("Effect");
|
||||||
|
case EContentType::Skill: return TEXT("Skill");
|
||||||
|
case EContentType::Item: return TEXT("Item");
|
||||||
|
case EContentType::ItemSet: return TEXT("ItemSet");
|
||||||
|
case EContentType::LevelObject: return TEXT("LevelObject");
|
||||||
|
case EContentType::Localization: return TEXT("Localization");
|
||||||
|
case EContentType::Mesh: return TEXT("Mesh");
|
||||||
|
case EContentType::MeshSet: return TEXT("MeshSet");
|
||||||
|
case EContentType::Animation: return TEXT("Animation");
|
||||||
|
case EContentType::Sound: return TEXT("Sound");
|
||||||
|
case EContentType::Haptic: return TEXT("Haptic");
|
||||||
|
case EContentType::Vfx: return TEXT("Vfx");
|
||||||
|
default: checkf(false, TEXT("Error"));
|
||||||
|
}
|
||||||
|
return FString();
|
||||||
|
}
|
||||||
|
|
@ -0,0 +1,54 @@
|
||||||
|
//Generated DataTableKey Index to Enum
|
||||||
|
|
||||||
|
#pragma once
|
||||||
|
|
||||||
|
UENUM(BlueprintType)
|
||||||
|
enum class EDataTableKey : uint8
|
||||||
|
{
|
||||||
|
AnimationSet UMETA(DisplayName = "AnimationSet"),
|
||||||
|
CharacterMeshSet UMETA(DisplayName = "CharacterMeshSet"),
|
||||||
|
CharacterUnlock UMETA(DisplayName = "CharacterUnlock"),
|
||||||
|
Effect UMETA(DisplayName = "Effect"),
|
||||||
|
EnemyNpc UMETA(DisplayName = "EnemyNpc"),
|
||||||
|
HapticList UMETA(DisplayName = "HapticList"),
|
||||||
|
Item UMETA(DisplayName = "Item"),
|
||||||
|
ItemSet UMETA(DisplayName = "ItemSet"),
|
||||||
|
LevelObject UMETA(DisplayName = "LevelObject"),
|
||||||
|
Localization UMETA(DisplayName = "Localization"),
|
||||||
|
MeshList UMETA(DisplayName = "MeshList"),
|
||||||
|
Objective UMETA(DisplayName = "Objective"),
|
||||||
|
PlayerCharacter UMETA(DisplayName = "PlayerCharacter"),
|
||||||
|
Skill UMETA(DisplayName = "Skill"),
|
||||||
|
SocketList UMETA(DisplayName = "SocketList"),
|
||||||
|
SoundList UMETA(DisplayName = "SoundList"),
|
||||||
|
Stage UMETA(DisplayName = "Stage"),
|
||||||
|
VfxList UMETA(DisplayName = "VfxList"),
|
||||||
|
};
|
||||||
|
ENUM_RANGE_BY_FIRST_AND_LAST(EDataTableKey,EDataTableKey::AnimationSet,EDataTableKey::VfxList);
|
||||||
|
|
||||||
|
static FString EnumToString(EDataTableKey InEnum)
|
||||||
|
{
|
||||||
|
switch (InEnum)
|
||||||
|
{
|
||||||
|
case EDataTableKey::AnimationSet: return TEXT("AnimationSet");
|
||||||
|
case EDataTableKey::CharacterMeshSet: return TEXT("CharacterMeshSet");
|
||||||
|
case EDataTableKey::CharacterUnlock: return TEXT("CharacterUnlock");
|
||||||
|
case EDataTableKey::Effect: return TEXT("Effect");
|
||||||
|
case EDataTableKey::EnemyNpc: return TEXT("EnemyNpc");
|
||||||
|
case EDataTableKey::HapticList: return TEXT("HapticList");
|
||||||
|
case EDataTableKey::Item: return TEXT("Item");
|
||||||
|
case EDataTableKey::ItemSet: return TEXT("ItemSet");
|
||||||
|
case EDataTableKey::LevelObject: return TEXT("LevelObject");
|
||||||
|
case EDataTableKey::Localization: return TEXT("Localization");
|
||||||
|
case EDataTableKey::MeshList: return TEXT("MeshList");
|
||||||
|
case EDataTableKey::Objective: return TEXT("Objective");
|
||||||
|
case EDataTableKey::PlayerCharacter: return TEXT("PlayerCharacter");
|
||||||
|
case EDataTableKey::Skill: return TEXT("Skill");
|
||||||
|
case EDataTableKey::SocketList: return TEXT("SocketList");
|
||||||
|
case EDataTableKey::SoundList: return TEXT("SoundList");
|
||||||
|
case EDataTableKey::Stage: return TEXT("Stage");
|
||||||
|
case EDataTableKey::VfxList: return TEXT("VfxList");
|
||||||
|
default: checkf(false, TEXT("Error"));
|
||||||
|
}
|
||||||
|
return FString();
|
||||||
|
}
|
||||||
|
|
@ -0,0 +1,41 @@
|
||||||
|
//Generated EffectSubTypes Index to Enum
|
||||||
|
|
||||||
|
#pragma once
|
||||||
|
|
||||||
|
UENUM(BlueprintType)
|
||||||
|
enum class EEffectSubTypes : uint8
|
||||||
|
{
|
||||||
|
None = 0 UMETA(DisplayName = "None"),
|
||||||
|
Hitback UMETA(DisplayName= "Hitback"),
|
||||||
|
Jumpback UMETA(DisplayName= "Jumpback"),
|
||||||
|
Stun UMETA(DisplayName= "Stun"),
|
||||||
|
Bind UMETA(DisplayName= "Bind"),
|
||||||
|
Surge UMETA(DisplayName= "Surge"),
|
||||||
|
Unrecog UMETA(DisplayName= "Unrecog"),
|
||||||
|
CogImmune UMETA(DisplayName= "CogImmune"),
|
||||||
|
HitbackImmune UMETA(DisplayName= "HitbackImmune"),
|
||||||
|
Fast UMETA(DisplayName= "Fast"),
|
||||||
|
Slow UMETA(DisplayName= "Slow"),
|
||||||
|
Heal UMETA(DisplayName= "Heal"),
|
||||||
|
};
|
||||||
|
ENUM_RANGE_BY_FIRST_AND_LAST(EEffectSubTypes,EEffectSubTypes::Hitback,EEffectSubTypes::Heal);
|
||||||
|
|
||||||
|
static FString EnumToString(EEffectSubTypes InEnum)
|
||||||
|
{
|
||||||
|
switch (InEnum)
|
||||||
|
{
|
||||||
|
case EEffectSubTypes::Hitback: return TEXT("Hitback");
|
||||||
|
case EEffectSubTypes::Jumpback: return TEXT("Jumpback");
|
||||||
|
case EEffectSubTypes::Stun: return TEXT("Stun");
|
||||||
|
case EEffectSubTypes::Bind: return TEXT("Bind");
|
||||||
|
case EEffectSubTypes::Surge: return TEXT("Surge");
|
||||||
|
case EEffectSubTypes::Unrecog: return TEXT("Unrecog");
|
||||||
|
case EEffectSubTypes::CogImmune: return TEXT("CogImmune");
|
||||||
|
case EEffectSubTypes::HitbackImmune: return TEXT("HitbackImmune");
|
||||||
|
case EEffectSubTypes::Fast: return TEXT("Fast");
|
||||||
|
case EEffectSubTypes::Slow: return TEXT("Slow");
|
||||||
|
case EEffectSubTypes::Heal: return TEXT("Heal");
|
||||||
|
default: checkf(false, TEXT("Error"));
|
||||||
|
}
|
||||||
|
return FString();
|
||||||
|
}
|
||||||
|
|
@ -0,0 +1,25 @@
|
||||||
|
//Generated EffectTypes Index to Enum
|
||||||
|
|
||||||
|
#pragma once
|
||||||
|
|
||||||
|
UENUM(BlueprintType)
|
||||||
|
enum class EEffectTypes : uint8
|
||||||
|
{
|
||||||
|
None = 0 UMETA(DisplayName = "None"),
|
||||||
|
CC UMETA(DisplayName= "CC"),
|
||||||
|
Utility UMETA(DisplayName= "Utility"),
|
||||||
|
Status UMETA(DisplayName= "Status"),
|
||||||
|
};
|
||||||
|
ENUM_RANGE_BY_FIRST_AND_LAST(EEffectTypes,EEffectTypes::CC,EEffectTypes::Status);
|
||||||
|
|
||||||
|
static FString EnumToString(EEffectTypes InEnum)
|
||||||
|
{
|
||||||
|
switch (InEnum)
|
||||||
|
{
|
||||||
|
case EEffectTypes::CC: return TEXT("CC");
|
||||||
|
case EEffectTypes::Utility: return TEXT("Utility");
|
||||||
|
case EEffectTypes::Status: return TEXT("Status");
|
||||||
|
default: checkf(false, TEXT("Error"));
|
||||||
|
}
|
||||||
|
return FString();
|
||||||
|
}
|
||||||
|
|
@ -0,0 +1,25 @@
|
||||||
|
//Generated EnemyNpc Index to Enum
|
||||||
|
|
||||||
|
#pragma once
|
||||||
|
|
||||||
|
UENUM(BlueprintType)
|
||||||
|
enum class EEnemyNpc : uint8
|
||||||
|
{
|
||||||
|
None = 0 UMETA(DisplayName = "None"),
|
||||||
|
Stationary UMETA(DisplayName= "Stationary"),
|
||||||
|
Patrol UMETA(DisplayName= "Patrol"),
|
||||||
|
Fixed UMETA(DisplayName= "Fixed"),
|
||||||
|
};
|
||||||
|
ENUM_RANGE_BY_FIRST_AND_LAST(EEnemyNpc,EEnemyNpc::Stationary,EEnemyNpc::Fixed);
|
||||||
|
|
||||||
|
static FString EnumToString(EEnemyNpc InEnum)
|
||||||
|
{
|
||||||
|
switch (InEnum)
|
||||||
|
{
|
||||||
|
case EEnemyNpc::Stationary: return TEXT("Stationary");
|
||||||
|
case EEnemyNpc::Patrol: return TEXT("Patrol");
|
||||||
|
case EEnemyNpc::Fixed: return TEXT("Fixed");
|
||||||
|
default: checkf(false, TEXT("Error"));
|
||||||
|
}
|
||||||
|
return FString();
|
||||||
|
}
|
||||||
|
|
@ -0,0 +1,25 @@
|
||||||
|
//Generated ItemTypes Index to Enum
|
||||||
|
|
||||||
|
#pragma once
|
||||||
|
|
||||||
|
UENUM(BlueprintType)
|
||||||
|
enum class EItemTypes : uint8
|
||||||
|
{
|
||||||
|
None = 0 UMETA(DisplayName = "None"),
|
||||||
|
Gimick UMETA(DisplayName= "Gimick"),
|
||||||
|
Usable UMETA(DisplayName= "Usable"),
|
||||||
|
Collection UMETA(DisplayName= "Collection"),
|
||||||
|
};
|
||||||
|
ENUM_RANGE_BY_FIRST_AND_LAST(EItemTypes,EItemTypes::Gimick,EItemTypes::Collection);
|
||||||
|
|
||||||
|
static FString EnumToString(EItemTypes InEnum)
|
||||||
|
{
|
||||||
|
switch (InEnum)
|
||||||
|
{
|
||||||
|
case EItemTypes::Gimick: return TEXT("Gimick");
|
||||||
|
case EItemTypes::Usable: return TEXT("Usable");
|
||||||
|
case EItemTypes::Collection: return TEXT("Collection");
|
||||||
|
default: checkf(false, TEXT("Error"));
|
||||||
|
}
|
||||||
|
return FString();
|
||||||
|
}
|
||||||
|
|
@ -0,0 +1,23 @@
|
||||||
|
//Generated LevelObjectTypes Index to Enum
|
||||||
|
|
||||||
|
#pragma once
|
||||||
|
|
||||||
|
UENUM(BlueprintType)
|
||||||
|
enum class ELevelObjectTypes : uint8
|
||||||
|
{
|
||||||
|
None = 0 UMETA(DisplayName = "None"),
|
||||||
|
Cast UMETA(DisplayName= "Cast"),
|
||||||
|
Trap UMETA(DisplayName= "Trap"),
|
||||||
|
};
|
||||||
|
ENUM_RANGE_BY_FIRST_AND_LAST(ELevelObjectTypes,ELevelObjectTypes::Cast,ELevelObjectTypes::Trap);
|
||||||
|
|
||||||
|
static FString EnumToString(ELevelObjectTypes InEnum)
|
||||||
|
{
|
||||||
|
switch (InEnum)
|
||||||
|
{
|
||||||
|
case ELevelObjectTypes::Cast: return TEXT("Cast");
|
||||||
|
case ELevelObjectTypes::Trap: return TEXT("Trap");
|
||||||
|
default: checkf(false, TEXT("Error"));
|
||||||
|
}
|
||||||
|
return FString();
|
||||||
|
}
|
||||||
|
|
@ -0,0 +1,25 @@
|
||||||
|
//Generated NpcTypes Index to Enum
|
||||||
|
|
||||||
|
#pragma once
|
||||||
|
|
||||||
|
UENUM(BlueprintType)
|
||||||
|
enum class ENpcTypes : uint8
|
||||||
|
{
|
||||||
|
None = 0 UMETA(DisplayName = "None"),
|
||||||
|
Stationary UMETA(DisplayName= "Stationary"),
|
||||||
|
Patrol UMETA(DisplayName= "Patrol"),
|
||||||
|
Fixed UMETA(DisplayName= "Fixed"),
|
||||||
|
};
|
||||||
|
ENUM_RANGE_BY_FIRST_AND_LAST(ENpcTypes,ENpcTypes::Stationary,ENpcTypes::Fixed);
|
||||||
|
|
||||||
|
static FString EnumToString(ENpcTypes InEnum)
|
||||||
|
{
|
||||||
|
switch (InEnum)
|
||||||
|
{
|
||||||
|
case ENpcTypes::Stationary: return TEXT("Stationary");
|
||||||
|
case ENpcTypes::Patrol: return TEXT("Patrol");
|
||||||
|
case ENpcTypes::Fixed: return TEXT("Fixed");
|
||||||
|
default: checkf(false, TEXT("Error"));
|
||||||
|
}
|
||||||
|
return FString();
|
||||||
|
}
|
||||||
|
|
@ -0,0 +1,27 @@
|
||||||
|
//Generated ObjectiveSubTypes Index to Enum
|
||||||
|
|
||||||
|
#pragma once
|
||||||
|
|
||||||
|
UENUM(BlueprintType)
|
||||||
|
enum class EObjectiveSubTypes : uint8
|
||||||
|
{
|
||||||
|
None = 0 UMETA(DisplayName = "None"),
|
||||||
|
Save UMETA(DisplayName= "Save"),
|
||||||
|
Collect UMETA(DisplayName= "Collect"),
|
||||||
|
Avoid UMETA(DisplayName= "Avoid"),
|
||||||
|
Kill UMETA(DisplayName= "Kill"),
|
||||||
|
};
|
||||||
|
ENUM_RANGE_BY_FIRST_AND_LAST(EObjectiveSubTypes,EObjectiveSubTypes::Save,EObjectiveSubTypes::Kill);
|
||||||
|
|
||||||
|
static FString EnumToString(EObjectiveSubTypes InEnum)
|
||||||
|
{
|
||||||
|
switch (InEnum)
|
||||||
|
{
|
||||||
|
case EObjectiveSubTypes::Save: return TEXT("Save");
|
||||||
|
case EObjectiveSubTypes::Collect: return TEXT("Collect");
|
||||||
|
case EObjectiveSubTypes::Avoid: return TEXT("Avoid");
|
||||||
|
case EObjectiveSubTypes::Kill: return TEXT("Kill");
|
||||||
|
default: checkf(false, TEXT("Error"));
|
||||||
|
}
|
||||||
|
return FString();
|
||||||
|
}
|
||||||
|
|
@ -0,0 +1,23 @@
|
||||||
|
//Generated ObjectiveTypes Index to Enum
|
||||||
|
|
||||||
|
#pragma once
|
||||||
|
|
||||||
|
UENUM(BlueprintType)
|
||||||
|
enum class EObjectiveTypes : uint8
|
||||||
|
{
|
||||||
|
None = 0 UMETA(DisplayName = "None"),
|
||||||
|
Mission UMETA(DisplayName= "Mission"),
|
||||||
|
Quest UMETA(DisplayName= "Quest"),
|
||||||
|
};
|
||||||
|
ENUM_RANGE_BY_FIRST_AND_LAST(EObjectiveTypes,EObjectiveTypes::Mission,EObjectiveTypes::Quest);
|
||||||
|
|
||||||
|
static FString EnumToString(EObjectiveTypes InEnum)
|
||||||
|
{
|
||||||
|
switch (InEnum)
|
||||||
|
{
|
||||||
|
case EObjectiveTypes::Mission: return TEXT("Mission");
|
||||||
|
case EObjectiveTypes::Quest: return TEXT("Quest");
|
||||||
|
default: checkf(false, TEXT("Error"));
|
||||||
|
}
|
||||||
|
return FString();
|
||||||
|
}
|
||||||
|
|
@ -0,0 +1,27 @@
|
||||||
|
//Generated SkillTypes Index to Enum
|
||||||
|
|
||||||
|
#pragma once
|
||||||
|
|
||||||
|
UENUM(BlueprintType)
|
||||||
|
enum class ESkillTypes : uint8
|
||||||
|
{
|
||||||
|
None = 0 UMETA(DisplayName = "None"),
|
||||||
|
Melee UMETA(DisplayName= "Melee"),
|
||||||
|
Direct UMETA(DisplayName= "Direct"),
|
||||||
|
Indirect UMETA(DisplayName= "Indirect"),
|
||||||
|
Buff UMETA(DisplayName= "Buff"),
|
||||||
|
};
|
||||||
|
ENUM_RANGE_BY_FIRST_AND_LAST(ESkillTypes,ESkillTypes::Melee,ESkillTypes::Buff);
|
||||||
|
|
||||||
|
static FString EnumToString(ESkillTypes InEnum)
|
||||||
|
{
|
||||||
|
switch (InEnum)
|
||||||
|
{
|
||||||
|
case ESkillTypes::Melee: return TEXT("Melee");
|
||||||
|
case ESkillTypes::Direct: return TEXT("Direct");
|
||||||
|
case ESkillTypes::Indirect: return TEXT("Indirect");
|
||||||
|
case ESkillTypes::Buff: return TEXT("Buff");
|
||||||
|
default: checkf(false, TEXT("Error"));
|
||||||
|
}
|
||||||
|
return FString();
|
||||||
|
}
|
||||||
|
|
@ -0,0 +1,37 @@
|
||||||
|
//Generated Stage Index to Enum
|
||||||
|
|
||||||
|
#pragma once
|
||||||
|
|
||||||
|
UENUM(BlueprintType)
|
||||||
|
enum class EStage : uint8
|
||||||
|
{
|
||||||
|
None = 0 UMETA(DisplayName = "None"),
|
||||||
|
L_SP_Office_01 UMETA(DisplayName= "L_SP_Office_01"),
|
||||||
|
L_SP_Office_02 UMETA(DisplayName= "L_SP_Office_02"),
|
||||||
|
L_SP_Office_03 UMETA(DisplayName= "L_SP_Office_03"),
|
||||||
|
L_SP_Office_04 UMETA(DisplayName= "L_SP_Office_04"),
|
||||||
|
L_SP_Office_05 UMETA(DisplayName= "L_SP_Office_05"),
|
||||||
|
L_SP_Test_00 UMETA(DisplayName= "L_SP_Test_00"),
|
||||||
|
L_Entry UMETA(DisplayName= "L_Entry"),
|
||||||
|
L_Lobby UMETA(DisplayName= "L_Lobby"),
|
||||||
|
L_Intro UMETA(DisplayName= "L_Intro"),
|
||||||
|
};
|
||||||
|
ENUM_RANGE_BY_FIRST_AND_LAST(EStage,EStage::L_SP_Office_01,EStage::L_Intro);
|
||||||
|
|
||||||
|
static FString EnumToString(EStage InEnum)
|
||||||
|
{
|
||||||
|
switch (InEnum)
|
||||||
|
{
|
||||||
|
case EStage::L_SP_Office_01: return TEXT("L_SP_Office_01");
|
||||||
|
case EStage::L_SP_Office_02: return TEXT("L_SP_Office_02");
|
||||||
|
case EStage::L_SP_Office_03: return TEXT("L_SP_Office_03");
|
||||||
|
case EStage::L_SP_Office_04: return TEXT("L_SP_Office_04");
|
||||||
|
case EStage::L_SP_Office_05: return TEXT("L_SP_Office_05");
|
||||||
|
case EStage::L_SP_Test_00: return TEXT("L_SP_Test_00");
|
||||||
|
case EStage::L_Entry: return TEXT("L_Entry");
|
||||||
|
case EStage::L_Lobby: return TEXT("L_Lobby");
|
||||||
|
case EStage::L_Intro: return TEXT("L_Intro");
|
||||||
|
default: checkf(false, TEXT("Error"));
|
||||||
|
}
|
||||||
|
return FString();
|
||||||
|
}
|
||||||
|
|
@ -0,0 +1,25 @@
|
||||||
|
//Generated UnlockTypes Index to Enum
|
||||||
|
|
||||||
|
#pragma once
|
||||||
|
|
||||||
|
UENUM(BlueprintType)
|
||||||
|
enum class EUnlockTypes : uint8
|
||||||
|
{
|
||||||
|
None = 0 UMETA(DisplayName = "None"),
|
||||||
|
Default UMETA(DisplayName= "Default"),
|
||||||
|
Mission UMETA(DisplayName= "Mission"),
|
||||||
|
Quest UMETA(DisplayName= "Quest"),
|
||||||
|
};
|
||||||
|
ENUM_RANGE_BY_FIRST_AND_LAST(EUnlockTypes,EUnlockTypes::Default,EUnlockTypes::Quest);
|
||||||
|
|
||||||
|
static FString EnumToString(EUnlockTypes InEnum)
|
||||||
|
{
|
||||||
|
switch (InEnum)
|
||||||
|
{
|
||||||
|
case EUnlockTypes::Default: return TEXT("Default");
|
||||||
|
case EUnlockTypes::Mission: return TEXT("Mission");
|
||||||
|
case EUnlockTypes::Quest: return TEXT("Quest");
|
||||||
|
default: checkf(false, TEXT("Error"));
|
||||||
|
}
|
||||||
|
return FString();
|
||||||
|
}
|
||||||
|
|
@ -0,0 +1,33 @@
|
||||||
|
#pragma once
|
||||||
|
|
||||||
|
#include "CoreMinimal.h"
|
||||||
|
#include "Engine/DataTable.h"
|
||||||
|
#include "GenerateStructAnimationSet.generated.h"
|
||||||
|
|
||||||
|
USTRUCT(BlueprintType)
|
||||||
|
struct FAnimationSet : public FTableRowBase
|
||||||
|
{
|
||||||
|
GENERATED_BODY()
|
||||||
|
|
||||||
|
FAnimationSet() :
|
||||||
|
sIdleAniPath()
|
||||||
|
{
|
||||||
|
}
|
||||||
|
|
||||||
|
UPROPERTY(EditAnyWhere, BlueprintReadWrite, Category = AnimationSet)
|
||||||
|
FString sIdleAniPath;
|
||||||
|
|
||||||
|
bool operator==(const FAnimationSet& Other) const
|
||||||
|
{
|
||||||
|
return sIdleAniPath == Other.sIdleAniPath;
|
||||||
|
}
|
||||||
|
bool operator!=(const FAnimationSet& Other) const
|
||||||
|
{
|
||||||
|
return !(*this == Other);
|
||||||
|
}
|
||||||
|
bool IsDefault() const
|
||||||
|
{
|
||||||
|
return sIdleAniPath.IsEmpty();
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
|
|
@ -0,0 +1,41 @@
|
||||||
|
#pragma once
|
||||||
|
|
||||||
|
#include "CoreMinimal.h"
|
||||||
|
#include "Engine/DataTable.h"
|
||||||
|
#include "GenerateStructCharacterMeshSet.generated.h"
|
||||||
|
|
||||||
|
USTRUCT(BlueprintType)
|
||||||
|
struct FCharacterMeshSet : public FTableRowBase
|
||||||
|
{
|
||||||
|
GENERATED_BODY()
|
||||||
|
|
||||||
|
FCharacterMeshSet() :
|
||||||
|
iBodyMeshId(),
|
||||||
|
iWeaponMeshId(),
|
||||||
|
iWeaponSocketId()
|
||||||
|
{
|
||||||
|
}
|
||||||
|
|
||||||
|
UPROPERTY(EditAnyWhere, BlueprintReadWrite, Category = CharacterMeshSet)
|
||||||
|
int32 iBodyMeshId;
|
||||||
|
|
||||||
|
UPROPERTY(EditAnyWhere, BlueprintReadWrite, Category = CharacterMeshSet)
|
||||||
|
int32 iWeaponMeshId;
|
||||||
|
|
||||||
|
UPROPERTY(EditAnyWhere, BlueprintReadWrite, Category = CharacterMeshSet)
|
||||||
|
int32 iWeaponSocketId;
|
||||||
|
|
||||||
|
bool operator==(const FCharacterMeshSet& Other) const
|
||||||
|
{
|
||||||
|
return iBodyMeshId == Other.iBodyMeshId && iWeaponMeshId == Other.iWeaponMeshId && iWeaponSocketId == Other.iWeaponSocketId;
|
||||||
|
}
|
||||||
|
bool operator!=(const FCharacterMeshSet& Other) const
|
||||||
|
{
|
||||||
|
return !(*this == Other);
|
||||||
|
}
|
||||||
|
bool IsDefault() const
|
||||||
|
{
|
||||||
|
return iBodyMeshId == 0 && iWeaponMeshId == 0 && iWeaponSocketId == 0;
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
|
|
@ -0,0 +1,45 @@
|
||||||
|
#pragma once
|
||||||
|
|
||||||
|
#include "CoreMinimal.h"
|
||||||
|
#include "Engine/DataTable.h"
|
||||||
|
#include "GenerateStructCharacterUnlock.generated.h"
|
||||||
|
|
||||||
|
USTRUCT(BlueprintType)
|
||||||
|
struct FCharacterUnlock : public FTableRowBase
|
||||||
|
{
|
||||||
|
GENERATED_BODY()
|
||||||
|
|
||||||
|
FCharacterUnlock() :
|
||||||
|
sUnlockType(),
|
||||||
|
iPlayerCharId(),
|
||||||
|
iClearStage(),
|
||||||
|
iUnlockDescId()
|
||||||
|
{
|
||||||
|
}
|
||||||
|
|
||||||
|
UPROPERTY(EditAnyWhere, BlueprintReadWrite, Category = CharacterUnlock)
|
||||||
|
FString sUnlockType;
|
||||||
|
|
||||||
|
UPROPERTY(EditAnyWhere, BlueprintReadWrite, Category = CharacterUnlock)
|
||||||
|
int32 iPlayerCharId;
|
||||||
|
|
||||||
|
UPROPERTY(EditAnyWhere, BlueprintReadWrite, Category = CharacterUnlock)
|
||||||
|
int32 iClearStage;
|
||||||
|
|
||||||
|
UPROPERTY(EditAnyWhere, BlueprintReadWrite, Category = CharacterUnlock)
|
||||||
|
int32 iUnlockDescId;
|
||||||
|
|
||||||
|
bool operator==(const FCharacterUnlock& Other) const
|
||||||
|
{
|
||||||
|
return sUnlockType == Other.sUnlockType && iPlayerCharId == Other.iPlayerCharId && iClearStage == Other.iClearStage && iUnlockDescId == Other.iUnlockDescId;
|
||||||
|
}
|
||||||
|
bool operator!=(const FCharacterUnlock& Other) const
|
||||||
|
{
|
||||||
|
return !(*this == Other);
|
||||||
|
}
|
||||||
|
bool IsDefault() const
|
||||||
|
{
|
||||||
|
return sUnlockType.IsEmpty() && iPlayerCharId == 0 && iClearStage == 0 && iUnlockDescId == 0;
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
|
|
@ -0,0 +1,57 @@
|
||||||
|
#pragma once
|
||||||
|
|
||||||
|
#include "CoreMinimal.h"
|
||||||
|
#include "Engine/DataTable.h"
|
||||||
|
#include "GenerateStructEffect.generated.h"
|
||||||
|
|
||||||
|
USTRUCT(BlueprintType)
|
||||||
|
struct FEffect : public FTableRowBase
|
||||||
|
{
|
||||||
|
GENERATED_BODY()
|
||||||
|
|
||||||
|
FEffect() :
|
||||||
|
sEffectType(),
|
||||||
|
sEffect(),
|
||||||
|
fEffectValue(),
|
||||||
|
fEffectDuration(),
|
||||||
|
iEffectNameId(),
|
||||||
|
iEffectDescId(),
|
||||||
|
sEffectIconPath()
|
||||||
|
{
|
||||||
|
}
|
||||||
|
|
||||||
|
UPROPERTY(EditAnyWhere, BlueprintReadWrite, Category = Effect)
|
||||||
|
FString sEffectType;
|
||||||
|
|
||||||
|
UPROPERTY(EditAnyWhere, BlueprintReadWrite, Category = Effect)
|
||||||
|
FString sEffect;
|
||||||
|
|
||||||
|
UPROPERTY(EditAnyWhere, BlueprintReadWrite, Category = Effect)
|
||||||
|
float fEffectValue;
|
||||||
|
|
||||||
|
UPROPERTY(EditAnyWhere, BlueprintReadWrite, Category = Effect)
|
||||||
|
float fEffectDuration;
|
||||||
|
|
||||||
|
UPROPERTY(EditAnyWhere, BlueprintReadWrite, Category = Effect)
|
||||||
|
int32 iEffectNameId;
|
||||||
|
|
||||||
|
UPROPERTY(EditAnyWhere, BlueprintReadWrite, Category = Effect)
|
||||||
|
int32 iEffectDescId;
|
||||||
|
|
||||||
|
UPROPERTY(EditAnyWhere, BlueprintReadWrite, Category = Effect)
|
||||||
|
FString sEffectIconPath;
|
||||||
|
|
||||||
|
bool operator==(const FEffect& Other) const
|
||||||
|
{
|
||||||
|
return sEffectType == Other.sEffectType && sEffect == Other.sEffect && fEffectValue == Other.fEffectValue && fEffectDuration == Other.fEffectDuration && iEffectNameId == Other.iEffectNameId && iEffectDescId == Other.iEffectDescId && sEffectIconPath == Other.sEffectIconPath;
|
||||||
|
}
|
||||||
|
bool operator!=(const FEffect& Other) const
|
||||||
|
{
|
||||||
|
return !(*this == Other);
|
||||||
|
}
|
||||||
|
bool IsDefault() const
|
||||||
|
{
|
||||||
|
return sEffectType.IsEmpty() && sEffect.IsEmpty() && fEffectValue == 0 && fEffectDuration == 0 && iEffectNameId == 0 && iEffectDescId == 0 && sEffectIconPath.IsEmpty();
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
|
|
@ -0,0 +1,101 @@
|
||||||
|
#pragma once
|
||||||
|
|
||||||
|
#include "CoreMinimal.h"
|
||||||
|
#include "Engine/DataTable.h"
|
||||||
|
#include "GenerateStructEnemyNpc.generated.h"
|
||||||
|
|
||||||
|
USTRUCT(BlueprintType)
|
||||||
|
struct FEnemyNpc : public FTableRowBase
|
||||||
|
{
|
||||||
|
GENERATED_BODY()
|
||||||
|
|
||||||
|
FEnemyNpc() :
|
||||||
|
sNpcType(),
|
||||||
|
fNpcHp(),
|
||||||
|
fNpcMove(),
|
||||||
|
fNpcRun(),
|
||||||
|
fSightLength(),
|
||||||
|
fSightAngle(),
|
||||||
|
fAttackLength(),
|
||||||
|
fChaseLength(),
|
||||||
|
fRotationAngle(),
|
||||||
|
fRotationSpeed(),
|
||||||
|
fDoubtTime(),
|
||||||
|
fNpcNoise(),
|
||||||
|
fMoveProb(),
|
||||||
|
fSearchProb(),
|
||||||
|
fScoutProb(),
|
||||||
|
iNpcAttackId(),
|
||||||
|
iNpcNameId(),
|
||||||
|
iNpcMeshSetId()
|
||||||
|
{
|
||||||
|
}
|
||||||
|
|
||||||
|
UPROPERTY(EditAnyWhere, BlueprintReadWrite, Category = EnemyNpc)
|
||||||
|
FString sNpcType;
|
||||||
|
|
||||||
|
UPROPERTY(EditAnyWhere, BlueprintReadWrite, Category = EnemyNpc)
|
||||||
|
float fNpcHp;
|
||||||
|
|
||||||
|
UPROPERTY(EditAnyWhere, BlueprintReadWrite, Category = EnemyNpc)
|
||||||
|
float fNpcMove;
|
||||||
|
|
||||||
|
UPROPERTY(EditAnyWhere, BlueprintReadWrite, Category = EnemyNpc)
|
||||||
|
float fNpcRun;
|
||||||
|
|
||||||
|
UPROPERTY(EditAnyWhere, BlueprintReadWrite, Category = EnemyNpc)
|
||||||
|
float fSightLength;
|
||||||
|
|
||||||
|
UPROPERTY(EditAnyWhere, BlueprintReadWrite, Category = EnemyNpc)
|
||||||
|
float fSightAngle;
|
||||||
|
|
||||||
|
UPROPERTY(EditAnyWhere, BlueprintReadWrite, Category = EnemyNpc)
|
||||||
|
float fAttackLength;
|
||||||
|
|
||||||
|
UPROPERTY(EditAnyWhere, BlueprintReadWrite, Category = EnemyNpc)
|
||||||
|
float fChaseLength;
|
||||||
|
|
||||||
|
UPROPERTY(EditAnyWhere, BlueprintReadWrite, Category = EnemyNpc)
|
||||||
|
float fRotationAngle;
|
||||||
|
|
||||||
|
UPROPERTY(EditAnyWhere, BlueprintReadWrite, Category = EnemyNpc)
|
||||||
|
float fRotationSpeed;
|
||||||
|
|
||||||
|
UPROPERTY(EditAnyWhere, BlueprintReadWrite, Category = EnemyNpc)
|
||||||
|
float fDoubtTime;
|
||||||
|
|
||||||
|
UPROPERTY(EditAnyWhere, BlueprintReadWrite, Category = EnemyNpc)
|
||||||
|
float fNpcNoise;
|
||||||
|
|
||||||
|
UPROPERTY(EditAnyWhere, BlueprintReadWrite, Category = EnemyNpc)
|
||||||
|
float fMoveProb;
|
||||||
|
|
||||||
|
UPROPERTY(EditAnyWhere, BlueprintReadWrite, Category = EnemyNpc)
|
||||||
|
float fSearchProb;
|
||||||
|
|
||||||
|
UPROPERTY(EditAnyWhere, BlueprintReadWrite, Category = EnemyNpc)
|
||||||
|
float fScoutProb;
|
||||||
|
|
||||||
|
UPROPERTY(EditAnyWhere, BlueprintReadWrite, Category = EnemyNpc)
|
||||||
|
int32 iNpcAttackId;
|
||||||
|
|
||||||
|
UPROPERTY(EditAnyWhere, BlueprintReadWrite, Category = EnemyNpc)
|
||||||
|
int32 iNpcNameId;
|
||||||
|
|
||||||
|
UPROPERTY(EditAnyWhere, BlueprintReadWrite, Category = EnemyNpc)
|
||||||
|
int32 iNpcMeshSetId;
|
||||||
|
|
||||||
|
bool operator==(const FEnemyNpc& Other) const
|
||||||
|
{
|
||||||
|
return sNpcType == Other.sNpcType && fNpcHp == Other.fNpcHp && fNpcMove == Other.fNpcMove && fNpcRun == Other.fNpcRun && fSightLength == Other.fSightLength && fSightAngle == Other.fSightAngle && fAttackLength == Other.fAttackLength && fChaseLength == Other.fChaseLength && fRotationAngle == Other.fRotationAngle && fRotationSpeed == Other.fRotationSpeed && fDoubtTime == Other.fDoubtTime && fNpcNoise == Other.fNpcNoise && fMoveProb == Other.fMoveProb && fSearchProb == Other.fSearchProb && fScoutProb == Other.fScoutProb && iNpcAttackId == Other.iNpcAttackId && iNpcNameId == Other.iNpcNameId && iNpcMeshSetId == Other.iNpcMeshSetId;
|
||||||
|
}
|
||||||
|
bool operator!=(const FEnemyNpc& Other) const
|
||||||
|
{
|
||||||
|
return !(*this == Other);
|
||||||
|
}
|
||||||
|
bool IsDefault() const
|
||||||
|
{
|
||||||
|
return sNpcType.IsEmpty() && fNpcHp == 0 && fNpcMove == 0 && fNpcRun == 0 && fSightLength == 0 && fSightAngle == 0 && fAttackLength == 0 && fChaseLength == 0 && fRotationAngle == 0 && fRotationSpeed == 0 && fDoubtTime == 0 && fNpcNoise == 0 && fMoveProb == 0 && fSearchProb == 0 && fScoutProb == 0 && iNpcAttackId == 0 && iNpcNameId == 0 && iNpcMeshSetId == 0;
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
|
|
@ -0,0 +1,33 @@
|
||||||
|
#pragma once
|
||||||
|
|
||||||
|
#include "CoreMinimal.h"
|
||||||
|
#include "Engine/DataTable.h"
|
||||||
|
#include "GenerateStructHapticList.generated.h"
|
||||||
|
|
||||||
|
USTRUCT(BlueprintType)
|
||||||
|
struct FHapticList : public FTableRowBase
|
||||||
|
{
|
||||||
|
GENERATED_BODY()
|
||||||
|
|
||||||
|
FHapticList() :
|
||||||
|
sHapticPath()
|
||||||
|
{
|
||||||
|
}
|
||||||
|
|
||||||
|
UPROPERTY(EditAnyWhere, BlueprintReadWrite, Category = HapticList)
|
||||||
|
FString sHapticPath;
|
||||||
|
|
||||||
|
bool operator==(const FHapticList& Other) const
|
||||||
|
{
|
||||||
|
return sHapticPath == Other.sHapticPath;
|
||||||
|
}
|
||||||
|
bool operator!=(const FHapticList& Other) const
|
||||||
|
{
|
||||||
|
return !(*this == Other);
|
||||||
|
}
|
||||||
|
bool IsDefault() const
|
||||||
|
{
|
||||||
|
return sHapticPath.IsEmpty();
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
|
|
@ -0,0 +1,53 @@
|
||||||
|
#pragma once
|
||||||
|
|
||||||
|
#include "CoreMinimal.h"
|
||||||
|
#include "Engine/DataTable.h"
|
||||||
|
#include "GenerateStructItem.generated.h"
|
||||||
|
|
||||||
|
USTRUCT(BlueprintType)
|
||||||
|
struct FItem : public FTableRowBase
|
||||||
|
{
|
||||||
|
GENERATED_BODY()
|
||||||
|
|
||||||
|
FItem() :
|
||||||
|
sItemType(),
|
||||||
|
iItemSkillId(),
|
||||||
|
iItemMeshId(),
|
||||||
|
sItemIconPath(),
|
||||||
|
iItemNameId(),
|
||||||
|
iItemDescId()
|
||||||
|
{
|
||||||
|
}
|
||||||
|
|
||||||
|
UPROPERTY(EditAnyWhere, BlueprintReadWrite, Category = Item)
|
||||||
|
FString sItemType;
|
||||||
|
|
||||||
|
UPROPERTY(EditAnyWhere, BlueprintReadWrite, Category = Item)
|
||||||
|
int32 iItemSkillId;
|
||||||
|
|
||||||
|
UPROPERTY(EditAnyWhere, BlueprintReadWrite, Category = Item)
|
||||||
|
int32 iItemMeshId;
|
||||||
|
|
||||||
|
UPROPERTY(EditAnyWhere, BlueprintReadWrite, Category = Item)
|
||||||
|
FString sItemIconPath;
|
||||||
|
|
||||||
|
UPROPERTY(EditAnyWhere, BlueprintReadWrite, Category = Item)
|
||||||
|
int32 iItemNameId;
|
||||||
|
|
||||||
|
UPROPERTY(EditAnyWhere, BlueprintReadWrite, Category = Item)
|
||||||
|
int32 iItemDescId;
|
||||||
|
|
||||||
|
bool operator==(const FItem& Other) const
|
||||||
|
{
|
||||||
|
return sItemType == Other.sItemType && iItemSkillId == Other.iItemSkillId && iItemMeshId == Other.iItemMeshId && sItemIconPath == Other.sItemIconPath && iItemNameId == Other.iItemNameId && iItemDescId == Other.iItemDescId;
|
||||||
|
}
|
||||||
|
bool operator!=(const FItem& Other) const
|
||||||
|
{
|
||||||
|
return !(*this == Other);
|
||||||
|
}
|
||||||
|
bool IsDefault() const
|
||||||
|
{
|
||||||
|
return sItemType.IsEmpty() && iItemSkillId == 0 && iItemMeshId == 0 && sItemIconPath.IsEmpty() && iItemNameId == 0 && iItemDescId == 0;
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
|
|
@ -0,0 +1,41 @@
|
||||||
|
#pragma once
|
||||||
|
|
||||||
|
#include "CoreMinimal.h"
|
||||||
|
#include "Engine/DataTable.h"
|
||||||
|
#include "GenerateStructItemSet.generated.h"
|
||||||
|
|
||||||
|
USTRUCT(BlueprintType)
|
||||||
|
struct FItemSet : public FTableRowBase
|
||||||
|
{
|
||||||
|
GENERATED_BODY()
|
||||||
|
|
||||||
|
FItemSet() :
|
||||||
|
iItemGroupId(),
|
||||||
|
iItemId(),
|
||||||
|
iProbWeight()
|
||||||
|
{
|
||||||
|
}
|
||||||
|
|
||||||
|
UPROPERTY(EditAnyWhere, BlueprintReadWrite, Category = ItemSet)
|
||||||
|
int32 iItemGroupId;
|
||||||
|
|
||||||
|
UPROPERTY(EditAnyWhere, BlueprintReadWrite, Category = ItemSet)
|
||||||
|
int32 iItemId;
|
||||||
|
|
||||||
|
UPROPERTY(EditAnyWhere, BlueprintReadWrite, Category = ItemSet)
|
||||||
|
int32 iProbWeight;
|
||||||
|
|
||||||
|
bool operator==(const FItemSet& Other) const
|
||||||
|
{
|
||||||
|
return iItemGroupId == Other.iItemGroupId && iItemId == Other.iItemId && iProbWeight == Other.iProbWeight;
|
||||||
|
}
|
||||||
|
bool operator!=(const FItemSet& Other) const
|
||||||
|
{
|
||||||
|
return !(*this == Other);
|
||||||
|
}
|
||||||
|
bool IsDefault() const
|
||||||
|
{
|
||||||
|
return iItemGroupId == 0 && iItemId == 0 && iProbWeight == 0;
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
|
|
@ -0,0 +1,37 @@
|
||||||
|
#pragma once
|
||||||
|
|
||||||
|
#include "CoreMinimal.h"
|
||||||
|
#include "Engine/DataTable.h"
|
||||||
|
#include "GenerateStructLevelObject.generated.h"
|
||||||
|
|
||||||
|
USTRUCT(BlueprintType)
|
||||||
|
struct FLevelObject : public FTableRowBase
|
||||||
|
{
|
||||||
|
GENERATED_BODY()
|
||||||
|
|
||||||
|
FLevelObject() :
|
||||||
|
sLevelObjType(),
|
||||||
|
iCastItemId()
|
||||||
|
{
|
||||||
|
}
|
||||||
|
|
||||||
|
UPROPERTY(EditAnyWhere, BlueprintReadWrite, Category = LevelObject)
|
||||||
|
FString sLevelObjType;
|
||||||
|
|
||||||
|
UPROPERTY(EditAnyWhere, BlueprintReadWrite, Category = LevelObject)
|
||||||
|
int32 iCastItemId;
|
||||||
|
|
||||||
|
bool operator==(const FLevelObject& Other) const
|
||||||
|
{
|
||||||
|
return sLevelObjType == Other.sLevelObjType && iCastItemId == Other.iCastItemId;
|
||||||
|
}
|
||||||
|
bool operator!=(const FLevelObject& Other) const
|
||||||
|
{
|
||||||
|
return !(*this == Other);
|
||||||
|
}
|
||||||
|
bool IsDefault() const
|
||||||
|
{
|
||||||
|
return sLevelObjType.IsEmpty() && iCastItemId == 0;
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
|
|
@ -0,0 +1,37 @@
|
||||||
|
#pragma once
|
||||||
|
|
||||||
|
#include "CoreMinimal.h"
|
||||||
|
#include "Engine/DataTable.h"
|
||||||
|
#include "GenerateStructLocalization.generated.h"
|
||||||
|
|
||||||
|
USTRUCT(BlueprintType)
|
||||||
|
struct FLocalization : public FTableRowBase
|
||||||
|
{
|
||||||
|
GENERATED_BODY()
|
||||||
|
|
||||||
|
FLocalization() :
|
||||||
|
sKorean(),
|
||||||
|
sEnglish()
|
||||||
|
{
|
||||||
|
}
|
||||||
|
|
||||||
|
UPROPERTY(EditAnyWhere, BlueprintReadWrite, Category = Localization)
|
||||||
|
FString sKorean;
|
||||||
|
|
||||||
|
UPROPERTY(EditAnyWhere, BlueprintReadWrite, Category = Localization)
|
||||||
|
FString sEnglish;
|
||||||
|
|
||||||
|
bool operator==(const FLocalization& Other) const
|
||||||
|
{
|
||||||
|
return sKorean == Other.sKorean && sEnglish == Other.sEnglish;
|
||||||
|
}
|
||||||
|
bool operator!=(const FLocalization& Other) const
|
||||||
|
{
|
||||||
|
return !(*this == Other);
|
||||||
|
}
|
||||||
|
bool IsDefault() const
|
||||||
|
{
|
||||||
|
return sKorean.IsEmpty() && sEnglish.IsEmpty();
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
|
|
@ -0,0 +1,33 @@
|
||||||
|
#pragma once
|
||||||
|
|
||||||
|
#include "CoreMinimal.h"
|
||||||
|
#include "Engine/DataTable.h"
|
||||||
|
#include "GenerateStructMeshList.generated.h"
|
||||||
|
|
||||||
|
USTRUCT(BlueprintType)
|
||||||
|
struct FMeshList : public FTableRowBase
|
||||||
|
{
|
||||||
|
GENERATED_BODY()
|
||||||
|
|
||||||
|
FMeshList() :
|
||||||
|
sMeshPath()
|
||||||
|
{
|
||||||
|
}
|
||||||
|
|
||||||
|
UPROPERTY(EditAnyWhere, BlueprintReadWrite, Category = MeshList)
|
||||||
|
FString sMeshPath;
|
||||||
|
|
||||||
|
bool operator==(const FMeshList& Other) const
|
||||||
|
{
|
||||||
|
return sMeshPath == Other.sMeshPath;
|
||||||
|
}
|
||||||
|
bool operator!=(const FMeshList& Other) const
|
||||||
|
{
|
||||||
|
return !(*this == Other);
|
||||||
|
}
|
||||||
|
bool IsDefault() const
|
||||||
|
{
|
||||||
|
return sMeshPath.IsEmpty();
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
|
|
@ -0,0 +1,49 @@
|
||||||
|
#pragma once
|
||||||
|
|
||||||
|
#include "CoreMinimal.h"
|
||||||
|
#include "Engine/DataTable.h"
|
||||||
|
#include "GenerateStructObjective.generated.h"
|
||||||
|
|
||||||
|
USTRUCT(BlueprintType)
|
||||||
|
struct FObjective : public FTableRowBase
|
||||||
|
{
|
||||||
|
GENERATED_BODY()
|
||||||
|
|
||||||
|
FObjective() :
|
||||||
|
sObjectiveType(),
|
||||||
|
sObjectiveSubType(),
|
||||||
|
iObjectiveItemId(),
|
||||||
|
iObjectiveCount(),
|
||||||
|
iObjectiveDescId()
|
||||||
|
{
|
||||||
|
}
|
||||||
|
|
||||||
|
UPROPERTY(EditAnyWhere, BlueprintReadWrite, Category = Objective)
|
||||||
|
FString sObjectiveType;
|
||||||
|
|
||||||
|
UPROPERTY(EditAnyWhere, BlueprintReadWrite, Category = Objective)
|
||||||
|
FString sObjectiveSubType;
|
||||||
|
|
||||||
|
UPROPERTY(EditAnyWhere, BlueprintReadWrite, Category = Objective)
|
||||||
|
int32 iObjectiveItemId;
|
||||||
|
|
||||||
|
UPROPERTY(EditAnyWhere, BlueprintReadWrite, Category = Objective)
|
||||||
|
int32 iObjectiveCount;
|
||||||
|
|
||||||
|
UPROPERTY(EditAnyWhere, BlueprintReadWrite, Category = Objective)
|
||||||
|
int32 iObjectiveDescId;
|
||||||
|
|
||||||
|
bool operator==(const FObjective& Other) const
|
||||||
|
{
|
||||||
|
return sObjectiveType == Other.sObjectiveType && sObjectiveSubType == Other.sObjectiveSubType && iObjectiveItemId == Other.iObjectiveItemId && iObjectiveCount == Other.iObjectiveCount && iObjectiveDescId == Other.iObjectiveDescId;
|
||||||
|
}
|
||||||
|
bool operator!=(const FObjective& Other) const
|
||||||
|
{
|
||||||
|
return !(*this == Other);
|
||||||
|
}
|
||||||
|
bool IsDefault() const
|
||||||
|
{
|
||||||
|
return sObjectiveType.IsEmpty() && sObjectiveSubType.IsEmpty() && iObjectiveItemId == 0 && iObjectiveCount == 0 && iObjectiveDescId == 0;
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
|
|
@ -0,0 +1,117 @@
|
||||||
|
#pragma once
|
||||||
|
|
||||||
|
#include "CoreMinimal.h"
|
||||||
|
#include "Engine/DataTable.h"
|
||||||
|
#include "GenerateStructPlayerCharacter.generated.h"
|
||||||
|
|
||||||
|
USTRUCT(BlueprintType)
|
||||||
|
struct FPlayerCharacter : public FTableRowBase
|
||||||
|
{
|
||||||
|
GENERATED_BODY()
|
||||||
|
|
||||||
|
FPlayerCharacter() :
|
||||||
|
fCharHp(),
|
||||||
|
fCharMove(),
|
||||||
|
fCharMoveSound(),
|
||||||
|
fCharRun(),
|
||||||
|
fCharRunSound(),
|
||||||
|
fStamina(),
|
||||||
|
fStaRecovery(),
|
||||||
|
iItemSlot(),
|
||||||
|
iCharAttackId(),
|
||||||
|
iCharSkillId(),
|
||||||
|
iCharNameId(),
|
||||||
|
iCharDescId(),
|
||||||
|
iPassiveName1Id(),
|
||||||
|
iPassiveDesc1Id(),
|
||||||
|
iPassiveName2Id(),
|
||||||
|
iPassiveDesc2Id(),
|
||||||
|
iPassiveName3Id(),
|
||||||
|
iPassiveDesc3Id(),
|
||||||
|
iCharMeshSetId(),
|
||||||
|
iCharAniSetId(),
|
||||||
|
sCharBlueprintPath(),
|
||||||
|
sCharIconPath()
|
||||||
|
{
|
||||||
|
}
|
||||||
|
|
||||||
|
UPROPERTY(EditAnyWhere, BlueprintReadWrite, Category = PlayerCharacter)
|
||||||
|
float fCharHp;
|
||||||
|
|
||||||
|
UPROPERTY(EditAnyWhere, BlueprintReadWrite, Category = PlayerCharacter)
|
||||||
|
float fCharMove;
|
||||||
|
|
||||||
|
UPROPERTY(EditAnyWhere, BlueprintReadWrite, Category = PlayerCharacter)
|
||||||
|
float fCharMoveSound;
|
||||||
|
|
||||||
|
UPROPERTY(EditAnyWhere, BlueprintReadWrite, Category = PlayerCharacter)
|
||||||
|
float fCharRun;
|
||||||
|
|
||||||
|
UPROPERTY(EditAnyWhere, BlueprintReadWrite, Category = PlayerCharacter)
|
||||||
|
float fCharRunSound;
|
||||||
|
|
||||||
|
UPROPERTY(EditAnyWhere, BlueprintReadWrite, Category = PlayerCharacter)
|
||||||
|
float fStamina;
|
||||||
|
|
||||||
|
UPROPERTY(EditAnyWhere, BlueprintReadWrite, Category = PlayerCharacter)
|
||||||
|
float fStaRecovery;
|
||||||
|
|
||||||
|
UPROPERTY(EditAnyWhere, BlueprintReadWrite, Category = PlayerCharacter)
|
||||||
|
int32 iItemSlot;
|
||||||
|
|
||||||
|
UPROPERTY(EditAnyWhere, BlueprintReadWrite, Category = PlayerCharacter)
|
||||||
|
int32 iCharAttackId;
|
||||||
|
|
||||||
|
UPROPERTY(EditAnyWhere, BlueprintReadWrite, Category = PlayerCharacter)
|
||||||
|
int32 iCharSkillId;
|
||||||
|
|
||||||
|
UPROPERTY(EditAnyWhere, BlueprintReadWrite, Category = PlayerCharacter)
|
||||||
|
int32 iCharNameId;
|
||||||
|
|
||||||
|
UPROPERTY(EditAnyWhere, BlueprintReadWrite, Category = PlayerCharacter)
|
||||||
|
int32 iCharDescId;
|
||||||
|
|
||||||
|
UPROPERTY(EditAnyWhere, BlueprintReadWrite, Category = PlayerCharacter)
|
||||||
|
int32 iPassiveName1Id;
|
||||||
|
|
||||||
|
UPROPERTY(EditAnyWhere, BlueprintReadWrite, Category = PlayerCharacter)
|
||||||
|
int32 iPassiveDesc1Id;
|
||||||
|
|
||||||
|
UPROPERTY(EditAnyWhere, BlueprintReadWrite, Category = PlayerCharacter)
|
||||||
|
int32 iPassiveName2Id;
|
||||||
|
|
||||||
|
UPROPERTY(EditAnyWhere, BlueprintReadWrite, Category = PlayerCharacter)
|
||||||
|
int32 iPassiveDesc2Id;
|
||||||
|
|
||||||
|
UPROPERTY(EditAnyWhere, BlueprintReadWrite, Category = PlayerCharacter)
|
||||||
|
int32 iPassiveName3Id;
|
||||||
|
|
||||||
|
UPROPERTY(EditAnyWhere, BlueprintReadWrite, Category = PlayerCharacter)
|
||||||
|
int32 iPassiveDesc3Id;
|
||||||
|
|
||||||
|
UPROPERTY(EditAnyWhere, BlueprintReadWrite, Category = PlayerCharacter)
|
||||||
|
int32 iCharMeshSetId;
|
||||||
|
|
||||||
|
UPROPERTY(EditAnyWhere, BlueprintReadWrite, Category = PlayerCharacter)
|
||||||
|
int32 iCharAniSetId;
|
||||||
|
|
||||||
|
UPROPERTY(EditAnyWhere, BlueprintReadWrite, Category = PlayerCharacter)
|
||||||
|
FString sCharBlueprintPath;
|
||||||
|
|
||||||
|
UPROPERTY(EditAnyWhere, BlueprintReadWrite, Category = PlayerCharacter)
|
||||||
|
FString sCharIconPath;
|
||||||
|
|
||||||
|
bool operator==(const FPlayerCharacter& Other) const
|
||||||
|
{
|
||||||
|
return fCharHp == Other.fCharHp && fCharMove == Other.fCharMove && fCharMoveSound == Other.fCharMoveSound && fCharRun == Other.fCharRun && fCharRunSound == Other.fCharRunSound && fStamina == Other.fStamina && fStaRecovery == Other.fStaRecovery && iItemSlot == Other.iItemSlot && iCharAttackId == Other.iCharAttackId && iCharSkillId == Other.iCharSkillId && iCharNameId == Other.iCharNameId && iCharDescId == Other.iCharDescId && iPassiveName1Id == Other.iPassiveName1Id && iPassiveDesc1Id == Other.iPassiveDesc1Id && iPassiveName2Id == Other.iPassiveName2Id && iPassiveDesc2Id == Other.iPassiveDesc2Id && iPassiveName3Id == Other.iPassiveName3Id && iPassiveDesc3Id == Other.iPassiveDesc3Id && iCharMeshSetId == Other.iCharMeshSetId && iCharAniSetId == Other.iCharAniSetId && sCharBlueprintPath == Other.sCharBlueprintPath && sCharIconPath == Other.sCharIconPath;
|
||||||
|
}
|
||||||
|
bool operator!=(const FPlayerCharacter& Other) const
|
||||||
|
{
|
||||||
|
return !(*this == Other);
|
||||||
|
}
|
||||||
|
bool IsDefault() const
|
||||||
|
{
|
||||||
|
return fCharHp == 0 && fCharMove == 0 && fCharMoveSound == 0 && fCharRun == 0 && fCharRunSound == 0 && fStamina == 0 && fStaRecovery == 0 && iItemSlot == 0 && iCharAttackId == 0 && iCharSkillId == 0 && iCharNameId == 0 && iCharDescId == 0 && iPassiveName1Id == 0 && iPassiveDesc1Id == 0 && iPassiveName2Id == 0 && iPassiveDesc2Id == 0 && iPassiveName3Id == 0 && iPassiveDesc3Id == 0 && iCharMeshSetId == 0 && iCharAniSetId == 0 && sCharBlueprintPath.IsEmpty() && sCharIconPath.IsEmpty();
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
|
|
@ -0,0 +1,101 @@
|
||||||
|
#pragma once
|
||||||
|
|
||||||
|
#include "CoreMinimal.h"
|
||||||
|
#include "Engine/DataTable.h"
|
||||||
|
#include "GenerateStructSkill.generated.h"
|
||||||
|
|
||||||
|
USTRUCT(BlueprintType)
|
||||||
|
struct FSkill : public FTableRowBase
|
||||||
|
{
|
||||||
|
GENERATED_BODY()
|
||||||
|
|
||||||
|
FSkill() :
|
||||||
|
sSkillName(),
|
||||||
|
sSkillType(),
|
||||||
|
sSkillIconPath(),
|
||||||
|
fCooldown(),
|
||||||
|
fDamage(),
|
||||||
|
fCriDmg(),
|
||||||
|
fSkillNoise(),
|
||||||
|
fCorrectRange(),
|
||||||
|
fSkillRange(),
|
||||||
|
fProjectileSpeed(),
|
||||||
|
fEffectRange(),
|
||||||
|
iEffect1Id(),
|
||||||
|
iEffect2Id(),
|
||||||
|
iEffect3Id(),
|
||||||
|
sSkillBpPath(),
|
||||||
|
iSkillSocketId(),
|
||||||
|
iSkillNameId(),
|
||||||
|
iSkillDescId()
|
||||||
|
{
|
||||||
|
}
|
||||||
|
|
||||||
|
UPROPERTY(EditAnyWhere, BlueprintReadWrite, Category = Skill)
|
||||||
|
FString sSkillName;
|
||||||
|
|
||||||
|
UPROPERTY(EditAnyWhere, BlueprintReadWrite, Category = Skill)
|
||||||
|
FString sSkillType;
|
||||||
|
|
||||||
|
UPROPERTY(EditAnyWhere, BlueprintReadWrite, Category = Skill)
|
||||||
|
FString sSkillIconPath;
|
||||||
|
|
||||||
|
UPROPERTY(EditAnyWhere, BlueprintReadWrite, Category = Skill)
|
||||||
|
float fCooldown;
|
||||||
|
|
||||||
|
UPROPERTY(EditAnyWhere, BlueprintReadWrite, Category = Skill)
|
||||||
|
float fDamage;
|
||||||
|
|
||||||
|
UPROPERTY(EditAnyWhere, BlueprintReadWrite, Category = Skill)
|
||||||
|
float fCriDmg;
|
||||||
|
|
||||||
|
UPROPERTY(EditAnyWhere, BlueprintReadWrite, Category = Skill)
|
||||||
|
float fSkillNoise;
|
||||||
|
|
||||||
|
UPROPERTY(EditAnyWhere, BlueprintReadWrite, Category = Skill)
|
||||||
|
float fCorrectRange;
|
||||||
|
|
||||||
|
UPROPERTY(EditAnyWhere, BlueprintReadWrite, Category = Skill)
|
||||||
|
float fSkillRange;
|
||||||
|
|
||||||
|
UPROPERTY(EditAnyWhere, BlueprintReadWrite, Category = Skill)
|
||||||
|
float fProjectileSpeed;
|
||||||
|
|
||||||
|
UPROPERTY(EditAnyWhere, BlueprintReadWrite, Category = Skill)
|
||||||
|
float fEffectRange;
|
||||||
|
|
||||||
|
UPROPERTY(EditAnyWhere, BlueprintReadWrite, Category = Skill)
|
||||||
|
int32 iEffect1Id;
|
||||||
|
|
||||||
|
UPROPERTY(EditAnyWhere, BlueprintReadWrite, Category = Skill)
|
||||||
|
int32 iEffect2Id;
|
||||||
|
|
||||||
|
UPROPERTY(EditAnyWhere, BlueprintReadWrite, Category = Skill)
|
||||||
|
int32 iEffect3Id;
|
||||||
|
|
||||||
|
UPROPERTY(EditAnyWhere, BlueprintReadWrite, Category = Skill)
|
||||||
|
FString sSkillBpPath;
|
||||||
|
|
||||||
|
UPROPERTY(EditAnyWhere, BlueprintReadWrite, Category = Skill)
|
||||||
|
int32 iSkillSocketId;
|
||||||
|
|
||||||
|
UPROPERTY(EditAnyWhere, BlueprintReadWrite, Category = Skill)
|
||||||
|
int32 iSkillNameId;
|
||||||
|
|
||||||
|
UPROPERTY(EditAnyWhere, BlueprintReadWrite, Category = Skill)
|
||||||
|
int32 iSkillDescId;
|
||||||
|
|
||||||
|
bool operator==(const FSkill& Other) const
|
||||||
|
{
|
||||||
|
return sSkillName == Other.sSkillName && sSkillType == Other.sSkillType && sSkillIconPath == Other.sSkillIconPath && fCooldown == Other.fCooldown && fDamage == Other.fDamage && fCriDmg == Other.fCriDmg && fSkillNoise == Other.fSkillNoise && fCorrectRange == Other.fCorrectRange && fSkillRange == Other.fSkillRange && fProjectileSpeed == Other.fProjectileSpeed && fEffectRange == Other.fEffectRange && iEffect1Id == Other.iEffect1Id && iEffect2Id == Other.iEffect2Id && iEffect3Id == Other.iEffect3Id && sSkillBpPath == Other.sSkillBpPath && iSkillSocketId == Other.iSkillSocketId && iSkillNameId == Other.iSkillNameId && iSkillDescId == Other.iSkillDescId;
|
||||||
|
}
|
||||||
|
bool operator!=(const FSkill& Other) const
|
||||||
|
{
|
||||||
|
return !(*this == Other);
|
||||||
|
}
|
||||||
|
bool IsDefault() const
|
||||||
|
{
|
||||||
|
return sSkillName.IsEmpty() && sSkillType.IsEmpty() && sSkillIconPath.IsEmpty() && fCooldown == 0 && fDamage == 0 && fCriDmg == 0 && fSkillNoise == 0 && fCorrectRange == 0 && fSkillRange == 0 && fProjectileSpeed == 0 && fEffectRange == 0 && iEffect1Id == 0 && iEffect2Id == 0 && iEffect3Id == 0 && sSkillBpPath.IsEmpty() && iSkillSocketId == 0 && iSkillNameId == 0 && iSkillDescId == 0;
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
|
|
@ -0,0 +1,33 @@
|
||||||
|
#pragma once
|
||||||
|
|
||||||
|
#include "CoreMinimal.h"
|
||||||
|
#include "Engine/DataTable.h"
|
||||||
|
#include "GenerateStructSocketList.generated.h"
|
||||||
|
|
||||||
|
USTRUCT(BlueprintType)
|
||||||
|
struct FSocketList : public FTableRowBase
|
||||||
|
{
|
||||||
|
GENERATED_BODY()
|
||||||
|
|
||||||
|
FSocketList() :
|
||||||
|
sSocketName()
|
||||||
|
{
|
||||||
|
}
|
||||||
|
|
||||||
|
UPROPERTY(EditAnyWhere, BlueprintReadWrite, Category = SocketList)
|
||||||
|
FString sSocketName;
|
||||||
|
|
||||||
|
bool operator==(const FSocketList& Other) const
|
||||||
|
{
|
||||||
|
return sSocketName == Other.sSocketName;
|
||||||
|
}
|
||||||
|
bool operator!=(const FSocketList& Other) const
|
||||||
|
{
|
||||||
|
return !(*this == Other);
|
||||||
|
}
|
||||||
|
bool IsDefault() const
|
||||||
|
{
|
||||||
|
return sSocketName.IsEmpty();
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
|
|
@ -0,0 +1,49 @@
|
||||||
|
#pragma once
|
||||||
|
|
||||||
|
#include "CoreMinimal.h"
|
||||||
|
#include "Engine/DataTable.h"
|
||||||
|
#include "GenerateStructSoundList.generated.h"
|
||||||
|
|
||||||
|
USTRUCT(BlueprintType)
|
||||||
|
struct FSoundList : public FTableRowBase
|
||||||
|
{
|
||||||
|
GENERATED_BODY()
|
||||||
|
|
||||||
|
FSoundList() :
|
||||||
|
sSoundClass(),
|
||||||
|
sSoundType(),
|
||||||
|
sSoundPath(),
|
||||||
|
sAttenPath(),
|
||||||
|
bLooping()
|
||||||
|
{
|
||||||
|
}
|
||||||
|
|
||||||
|
UPROPERTY(EditAnyWhere, BlueprintReadWrite, Category = SoundList)
|
||||||
|
FString sSoundClass;
|
||||||
|
|
||||||
|
UPROPERTY(EditAnyWhere, BlueprintReadWrite, Category = SoundList)
|
||||||
|
FString sSoundType;
|
||||||
|
|
||||||
|
UPROPERTY(EditAnyWhere, BlueprintReadWrite, Category = SoundList)
|
||||||
|
FString sSoundPath;
|
||||||
|
|
||||||
|
UPROPERTY(EditAnyWhere, BlueprintReadWrite, Category = SoundList)
|
||||||
|
FString sAttenPath;
|
||||||
|
|
||||||
|
UPROPERTY(EditAnyWhere, BlueprintReadWrite, Category = SoundList)
|
||||||
|
bool bLooping;
|
||||||
|
|
||||||
|
bool operator==(const FSoundList& Other) const
|
||||||
|
{
|
||||||
|
return sSoundClass == Other.sSoundClass && sSoundType == Other.sSoundType && sSoundPath == Other.sSoundPath && sAttenPath == Other.sAttenPath && bLooping == Other.bLooping;
|
||||||
|
}
|
||||||
|
bool operator!=(const FSoundList& Other) const
|
||||||
|
{
|
||||||
|
return !(*this == Other);
|
||||||
|
}
|
||||||
|
bool IsDefault() const
|
||||||
|
{
|
||||||
|
return sSoundClass.IsEmpty() && sSoundType.IsEmpty() && sSoundPath.IsEmpty() && sAttenPath.IsEmpty() && bLooping == 0;
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
|
|
@ -0,0 +1,77 @@
|
||||||
|
#pragma once
|
||||||
|
|
||||||
|
#include "CoreMinimal.h"
|
||||||
|
#include "Engine/DataTable.h"
|
||||||
|
#include "GenerateStructStage.generated.h"
|
||||||
|
|
||||||
|
USTRUCT(BlueprintType)
|
||||||
|
struct FStage : public FTableRowBase
|
||||||
|
{
|
||||||
|
GENERATED_BODY()
|
||||||
|
|
||||||
|
FStage() :
|
||||||
|
iMissionId(),
|
||||||
|
iQuest1Id(),
|
||||||
|
iQuest2Id(),
|
||||||
|
iQuest3Id(),
|
||||||
|
iTimeLimit(),
|
||||||
|
iNextStageId(),
|
||||||
|
sStageName(),
|
||||||
|
sStagePath(),
|
||||||
|
sStageThumbnailPath(),
|
||||||
|
sStageBackgroundPath(),
|
||||||
|
iStageNameId(),
|
||||||
|
iStageDescId()
|
||||||
|
{
|
||||||
|
}
|
||||||
|
|
||||||
|
UPROPERTY(EditAnyWhere, BlueprintReadWrite, Category = Stage)
|
||||||
|
int32 iMissionId;
|
||||||
|
|
||||||
|
UPROPERTY(EditAnyWhere, BlueprintReadWrite, Category = Stage)
|
||||||
|
int32 iQuest1Id;
|
||||||
|
|
||||||
|
UPROPERTY(EditAnyWhere, BlueprintReadWrite, Category = Stage)
|
||||||
|
int32 iQuest2Id;
|
||||||
|
|
||||||
|
UPROPERTY(EditAnyWhere, BlueprintReadWrite, Category = Stage)
|
||||||
|
int32 iQuest3Id;
|
||||||
|
|
||||||
|
UPROPERTY(EditAnyWhere, BlueprintReadWrite, Category = Stage)
|
||||||
|
int32 iTimeLimit;
|
||||||
|
|
||||||
|
UPROPERTY(EditAnyWhere, BlueprintReadWrite, Category = Stage)
|
||||||
|
int32 iNextStageId;
|
||||||
|
|
||||||
|
UPROPERTY(EditAnyWhere, BlueprintReadWrite, Category = Stage)
|
||||||
|
FString sStageName;
|
||||||
|
|
||||||
|
UPROPERTY(EditAnyWhere, BlueprintReadWrite, Category = Stage)
|
||||||
|
FString sStagePath;
|
||||||
|
|
||||||
|
UPROPERTY(EditAnyWhere, BlueprintReadWrite, Category = Stage)
|
||||||
|
FString sStageThumbnailPath;
|
||||||
|
|
||||||
|
UPROPERTY(EditAnyWhere, BlueprintReadWrite, Category = Stage)
|
||||||
|
FString sStageBackgroundPath;
|
||||||
|
|
||||||
|
UPROPERTY(EditAnyWhere, BlueprintReadWrite, Category = Stage)
|
||||||
|
int32 iStageNameId;
|
||||||
|
|
||||||
|
UPROPERTY(EditAnyWhere, BlueprintReadWrite, Category = Stage)
|
||||||
|
int32 iStageDescId;
|
||||||
|
|
||||||
|
bool operator==(const FStage& Other) const
|
||||||
|
{
|
||||||
|
return iMissionId == Other.iMissionId && iQuest1Id == Other.iQuest1Id && iQuest2Id == Other.iQuest2Id && iQuest3Id == Other.iQuest3Id && iTimeLimit == Other.iTimeLimit && iNextStageId == Other.iNextStageId && sStageName == Other.sStageName && sStagePath == Other.sStagePath && sStageThumbnailPath == Other.sStageThumbnailPath && sStageBackgroundPath == Other.sStageBackgroundPath && iStageNameId == Other.iStageNameId && iStageDescId == Other.iStageDescId;
|
||||||
|
}
|
||||||
|
bool operator!=(const FStage& Other) const
|
||||||
|
{
|
||||||
|
return !(*this == Other);
|
||||||
|
}
|
||||||
|
bool IsDefault() const
|
||||||
|
{
|
||||||
|
return iMissionId == 0 && iQuest1Id == 0 && iQuest2Id == 0 && iQuest3Id == 0 && iTimeLimit == 0 && iNextStageId == 0 && sStageName.IsEmpty() && sStagePath.IsEmpty() && sStageThumbnailPath.IsEmpty() && sStageBackgroundPath.IsEmpty() && iStageNameId == 0 && iStageDescId == 0;
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
|
|
@ -0,0 +1,33 @@
|
||||||
|
#pragma once
|
||||||
|
|
||||||
|
#include "CoreMinimal.h"
|
||||||
|
#include "Engine/DataTable.h"
|
||||||
|
#include "GenerateStructVfxList.generated.h"
|
||||||
|
|
||||||
|
USTRUCT(BlueprintType)
|
||||||
|
struct FVfxList : public FTableRowBase
|
||||||
|
{
|
||||||
|
GENERATED_BODY()
|
||||||
|
|
||||||
|
FVfxList() :
|
||||||
|
sVfxPath()
|
||||||
|
{
|
||||||
|
}
|
||||||
|
|
||||||
|
UPROPERTY(EditAnyWhere, BlueprintReadWrite, Category = VfxList)
|
||||||
|
FString sVfxPath;
|
||||||
|
|
||||||
|
bool operator==(const FVfxList& Other) const
|
||||||
|
{
|
||||||
|
return sVfxPath == Other.sVfxPath;
|
||||||
|
}
|
||||||
|
bool operator!=(const FVfxList& Other) const
|
||||||
|
{
|
||||||
|
return !(*this == Other);
|
||||||
|
}
|
||||||
|
bool IsDefault() const
|
||||||
|
{
|
||||||
|
return sVfxPath.IsEmpty();
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
|
|
@ -0,0 +1,4 @@
|
||||||
|
// Fill out your copyright notice in the Description page of Project Settings.
|
||||||
|
|
||||||
|
|
||||||
|
#include "NpcDataModel.h"
|
||||||
|
|
@ -0,0 +1,153 @@
|
||||||
|
// Fill out your copyright notice in the Description page of Project Settings.
|
||||||
|
|
||||||
|
#pragma once
|
||||||
|
|
||||||
|
#include "CoreMinimal.h"
|
||||||
|
#include "UObject/Object.h"
|
||||||
|
#include "NpcDataModel.generated.h"
|
||||||
|
|
||||||
|
USTRUCT(Blueprintable)
|
||||||
|
struct FCrowdSettingsInfo
|
||||||
|
{
|
||||||
|
GENERATED_BODY()
|
||||||
|
|
||||||
|
FCrowdSettingsInfo() :
|
||||||
|
bUseCrowdSeparation(true),
|
||||||
|
SeparationWeight(10.f),
|
||||||
|
AvoidanceRangeMultiplier(1.f)
|
||||||
|
{}
|
||||||
|
|
||||||
|
public:
|
||||||
|
UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = "CrowdSettings")
|
||||||
|
uint8 bUseCrowdSeparation : 1;
|
||||||
|
|
||||||
|
UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = "CrowdSettings", meta = (EditCondition = "bUseCrowdSeparation"), meta = (Tooltip = "NPC 간 거리 유지 강도"))
|
||||||
|
float SeparationWeight;
|
||||||
|
|
||||||
|
UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = "CrowdSettings", meta = (EditCondition = "bUseCrowdSeparation"), meta = (Tooltip = "회피 반응 배율"))
|
||||||
|
float AvoidanceRangeMultiplier;
|
||||||
|
};
|
||||||
|
|
||||||
|
UENUM(BlueprintType)
|
||||||
|
enum class EHeadRotationType : uint8
|
||||||
|
{
|
||||||
|
None = 0 UMETA(DisplayName = "None"),
|
||||||
|
Search UMETA(DisplayName = "Search"),
|
||||||
|
Guard UMETA(DisplayName = "Guard"),
|
||||||
|
LoopSearch UMETA(DisplayName = "LoopSearch"),
|
||||||
|
Pause UMETA(DisplayName = "Pause"),
|
||||||
|
TurnToTarget UMETA(DisplayName = "TurnToTarget")
|
||||||
|
};
|
||||||
|
|
||||||
|
UENUM(BlueprintType)
|
||||||
|
enum class ENpcState : uint8
|
||||||
|
{
|
||||||
|
Default = 0 UMETA(DisplayName = "Default"),
|
||||||
|
Returning UMETA(DisplayName = "Returning"),
|
||||||
|
Doubt UMETA(DisplayName = "Doubt"),
|
||||||
|
Chase UMETA(DisplayName = "Chase"),
|
||||||
|
Attack UMETA(DisplayName = "Attack"),
|
||||||
|
Guard UMETA(DisplayName = "Guard"),
|
||||||
|
Hit UMETA(DisplayName = "Hit"),
|
||||||
|
Dead UMETA(DisplayName = "Dead"),
|
||||||
|
};
|
||||||
|
|
||||||
|
UENUM(BlueprintType)
|
||||||
|
enum class ENpcSpeedType : uint8
|
||||||
|
{
|
||||||
|
Walk = 0 UMETA(DisplayName = "Walk"),
|
||||||
|
Run UMETA(DisplayName = "Run"),
|
||||||
|
Stop UMETA(DisplayName = "Stop"),
|
||||||
|
};
|
||||||
|
|
||||||
|
UENUM(BlueprintType)
|
||||||
|
enum class EPatrolType : uint8
|
||||||
|
{
|
||||||
|
None = 0 UMETA(DisplayName = "None"),
|
||||||
|
Patrol UMETA(DisplayName = "Patrol"),
|
||||||
|
Search UMETA(DisplayName = "Search"),
|
||||||
|
SearchPatrol UMETA(DisplayName = "SearchPatrol"),
|
||||||
|
};
|
||||||
|
|
||||||
|
UENUM(BlueprintType)
|
||||||
|
enum class EDoubtState : uint8
|
||||||
|
{
|
||||||
|
None = 0 UMETA(DisplayName = "None"),
|
||||||
|
Increasing UMETA(DisplayName = "Increasing"),
|
||||||
|
Decreasing UMETA(DisplayName = "Decreasing"),
|
||||||
|
};
|
||||||
|
|
||||||
|
UENUM(BlueprintType)
|
||||||
|
enum class EVisionMode : uint8
|
||||||
|
{
|
||||||
|
None = 0 UMETA(DisplayName = "None"),
|
||||||
|
Cone UMETA(DisplayName = "Cone"),
|
||||||
|
Line UMETA(DisplayName = "Line"),
|
||||||
|
};
|
||||||
|
|
||||||
|
UENUM(BlueprintType)
|
||||||
|
enum class ENpcNormalAnimState : uint8
|
||||||
|
{
|
||||||
|
None = 0 UMETA(DisplayName = "None"),
|
||||||
|
Idle UMETA(DisplayName = "Idle"),
|
||||||
|
Walk UMETA(DisplayName = "Walk"),
|
||||||
|
Run UMETA(DisplayName = "Run"),
|
||||||
|
};
|
||||||
|
|
||||||
|
UENUM(BlueprintType)
|
||||||
|
enum class ENpcAbnormalAnimState : uint8
|
||||||
|
{
|
||||||
|
None = 0 UMETA(DisplayName = "None"),
|
||||||
|
HitBack UMETA(DisplayName = "HitBack"),
|
||||||
|
JumpBack UMETA(DisplayName = "JumpBack"),
|
||||||
|
FallDown UMETA(DisplayName = "FallDown"),
|
||||||
|
GetUp UMETA(DisplayName = "GetUp"),
|
||||||
|
Stun UMETA(DisplayName = "Stun"),
|
||||||
|
DeadStart UMETA(DisplayName = "DeadStart"),
|
||||||
|
DeadLoop UMETA(DisplayName = "DeadLoop"),
|
||||||
|
};
|
||||||
|
|
||||||
|
USTRUCT(Blueprintable)
|
||||||
|
struct FNpcSimpleRatio
|
||||||
|
{
|
||||||
|
GENERATED_BODY()
|
||||||
|
FNpcSimpleRatio() :
|
||||||
|
CurrentValue(0.f),
|
||||||
|
MaxValue(0.f)
|
||||||
|
{
|
||||||
|
}
|
||||||
|
|
||||||
|
UPROPERTY(EditAnywhere)
|
||||||
|
float CurrentValue;
|
||||||
|
|
||||||
|
UPROPERTY(EditAnywhere)
|
||||||
|
float MaxValue;
|
||||||
|
};
|
||||||
|
|
||||||
|
USTRUCT(Blueprintable)
|
||||||
|
struct FNpcEffectValue
|
||||||
|
{
|
||||||
|
GENERATED_BODY()
|
||||||
|
FNpcEffectValue() :
|
||||||
|
RemainTime(0.f),
|
||||||
|
MaxTime(0.f),
|
||||||
|
EffectValue(0.f)
|
||||||
|
{
|
||||||
|
}
|
||||||
|
|
||||||
|
UPROPERTY(EditAnywhere)
|
||||||
|
float RemainTime;
|
||||||
|
|
||||||
|
UPROPERTY(EditAnywhere)
|
||||||
|
float MaxTime;
|
||||||
|
|
||||||
|
UPROPERTY(EditAnywhere)
|
||||||
|
float EffectValue;
|
||||||
|
};
|
||||||
|
|
||||||
|
UCLASS()
|
||||||
|
class PROJECTT_API UNpcDataModel : public UObject
|
||||||
|
{
|
||||||
|
GENERATED_BODY()
|
||||||
|
|
||||||
|
};
|
||||||
|
|
@ -0,0 +1,25 @@
|
||||||
|
// Fill out your copyright notice in the Description page of Project Settings.
|
||||||
|
|
||||||
|
|
||||||
|
#include "BaseDataPathLibrary.h"
|
||||||
|
|
||||||
|
namespace BaseDataPaths
|
||||||
|
{
|
||||||
|
const FString RootDir = "/Game/";
|
||||||
|
const FString SystemDir = RootDir + "System/";
|
||||||
|
const FString CoreDir = SystemDir + "Core/";
|
||||||
|
const FString EnvsDir = RootDir + "Envs/";
|
||||||
|
const FString CharactersDir = RootDir + "Characters/";
|
||||||
|
const FString LevelsDir = RootDir + "Levels/";
|
||||||
|
const FString UIDir = RootDir + "UI/";
|
||||||
|
const FString FXDir = RootDir + "FX/";
|
||||||
|
const FString SoundDir = RootDir + "Sound/";
|
||||||
|
const FString ResourcesDir = RootDir + "Resources/";
|
||||||
|
|
||||||
|
namespace Sound
|
||||||
|
{
|
||||||
|
const FString BGMDir = SoundDir + "BGM/";
|
||||||
|
const FString SFXDir = SoundDir + "SFX/";
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
@ -0,0 +1,38 @@
|
||||||
|
// Fill out your copyright notice in the Description page of Project Settings.
|
||||||
|
|
||||||
|
#pragma once
|
||||||
|
|
||||||
|
#include "CoreMinimal.h"
|
||||||
|
#include "Kismet/BlueprintFunctionLibrary.h"
|
||||||
|
#include "BaseDataPathLibrary.generated.h"
|
||||||
|
|
||||||
|
namespace BaseDataPaths
|
||||||
|
{
|
||||||
|
extern const FString RootDir;
|
||||||
|
extern const FString SystemDir;
|
||||||
|
extern const FString CoreDir;
|
||||||
|
extern const FString EnvsDir;
|
||||||
|
extern const FString CharactersDir;
|
||||||
|
extern const FString LevelsDir;
|
||||||
|
extern const FString UIDir;
|
||||||
|
extern const FString FXDir;
|
||||||
|
extern const FString SoundDir;
|
||||||
|
extern const FString ResourcesDir;
|
||||||
|
|
||||||
|
namespace Sound
|
||||||
|
{
|
||||||
|
extern const FString BGMDir;
|
||||||
|
extern const FString SFXDir;
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
UCLASS()
|
||||||
|
class PROJECTT_API UBaseDataPathLibrary : public UBlueprintFunctionLibrary
|
||||||
|
{
|
||||||
|
GENERATED_BODY()
|
||||||
|
public:
|
||||||
|
UFUNCTION(BlueprintCallable, BlueprintPure, meta = (ToolTip = "../Sound/"))
|
||||||
|
static FString GetSoundDir() { return BaseDataPaths::SoundDir; }
|
||||||
|
|
||||||
|
};
|
||||||
|
|
@ -0,0 +1,16 @@
|
||||||
|
// Fill out your copyright notice in the Description page of Project Settings.
|
||||||
|
|
||||||
|
|
||||||
|
#include "CoreDataPathLibrary.h"
|
||||||
|
#include "ProjectT/Data/Paths/BaseDataPathLibrary.h"
|
||||||
|
|
||||||
|
namespace CoreDataPaths
|
||||||
|
{
|
||||||
|
const FString DataDir = BaseDataPaths::CoreDir + "Data/";
|
||||||
|
|
||||||
|
namespace Data
|
||||||
|
{
|
||||||
|
const FString DatatableDir = DataDir + "DataTable/";
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
@ -0,0 +1,22 @@
|
||||||
|
// Fill out your copyright notice in the Description page of Project Settings.
|
||||||
|
|
||||||
|
#pragma once
|
||||||
|
|
||||||
|
#include "CoreMinimal.h"
|
||||||
|
#include "Kismet/BlueprintFunctionLibrary.h"
|
||||||
|
#include "CoreDataPathLibrary.generated.h"
|
||||||
|
|
||||||
|
namespace CoreDataPaths
|
||||||
|
{
|
||||||
|
extern const FString DataDir;
|
||||||
|
namespace Data
|
||||||
|
{
|
||||||
|
extern const FString DatatableDir;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
UCLASS()
|
||||||
|
class PROJECTT_API UCoreDataPathLibrary : public UBlueprintFunctionLibrary
|
||||||
|
{
|
||||||
|
GENERATED_BODY()
|
||||||
|
};
|
||||||
|
|
@ -0,0 +1,16 @@
|
||||||
|
// Fill out your copyright notice in the Description page of Project Settings.
|
||||||
|
|
||||||
|
|
||||||
|
#include "LevelDataPathLibrary.h"
|
||||||
|
|
||||||
|
#include "ProjectT/Data/Paths/BaseDataPathLibrary.h"
|
||||||
|
|
||||||
|
namespace LevelDataPaths
|
||||||
|
{
|
||||||
|
const FString MultiPlay = BaseDataPaths::LevelsDir + "MultiPlay/";
|
||||||
|
const FString SinglePlay = BaseDataPaths::LevelsDir + "SinglePlay/";
|
||||||
|
namespace Office
|
||||||
|
{
|
||||||
|
extern const FString SPOfficeDir = SinglePlay + "Office/";
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
@ -0,0 +1,23 @@
|
||||||
|
// Fill out your copyright notice in the Description page of Project Settings.
|
||||||
|
|
||||||
|
#pragma once
|
||||||
|
|
||||||
|
#include "CoreMinimal.h"
|
||||||
|
#include "Kismet/BlueprintFunctionLibrary.h"
|
||||||
|
#include "LevelDataPathLibrary.generated.h"
|
||||||
|
|
||||||
|
namespace LevelDataPaths
|
||||||
|
{
|
||||||
|
extern const FString MultiPlay;
|
||||||
|
extern const FString SinglePlay;
|
||||||
|
namespace Office
|
||||||
|
{
|
||||||
|
extern const FString OfficeDir;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
UCLASS()
|
||||||
|
class PROJECTT_API ULevelDataPathLibrary : public UBlueprintFunctionLibrary
|
||||||
|
{
|
||||||
|
GENERATED_BODY()
|
||||||
|
};
|
||||||
|
|
@ -0,0 +1,10 @@
|
||||||
|
// Fill out your copyright notice in the Description page of Project Settings.
|
||||||
|
|
||||||
|
|
||||||
|
#include "UIDataPathLibrary.h"
|
||||||
|
#include "ProjectT/Data/Paths/BaseDataPathLibrary.h"
|
||||||
|
|
||||||
|
namespace UIDataPaths
|
||||||
|
{
|
||||||
|
const FString DebugDir = BaseDataPaths::UIDir + "Debug/";
|
||||||
|
}
|
||||||
|
|
@ -0,0 +1,18 @@
|
||||||
|
// Fill out your copyright notice in the Description page of Project Settings.
|
||||||
|
|
||||||
|
#pragma once
|
||||||
|
|
||||||
|
#include "CoreMinimal.h"
|
||||||
|
#include "Kismet/BlueprintFunctionLibrary.h"
|
||||||
|
#include "UIDataPathLibrary.generated.h"
|
||||||
|
|
||||||
|
namespace UIDataPaths
|
||||||
|
{
|
||||||
|
extern const FString DebugDir;
|
||||||
|
}
|
||||||
|
|
||||||
|
UCLASS()
|
||||||
|
class PROJECTT_API UUIDataPathLibrary : public UBlueprintFunctionLibrary
|
||||||
|
{
|
||||||
|
GENERATED_BODY()
|
||||||
|
};
|
||||||
|
|
@ -0,0 +1,4 @@
|
||||||
|
// Fill out your copyright notice in the Description page of Project Settings.
|
||||||
|
|
||||||
|
|
||||||
|
#include "PlayerInventoryModel.h"
|
||||||
|
|
@ -0,0 +1,48 @@
|
||||||
|
// Fill out your copyright notice in the Description page of Project Settings.
|
||||||
|
|
||||||
|
#pragma once
|
||||||
|
|
||||||
|
#include "CoreMinimal.h"
|
||||||
|
#include "ProjectT/Data/Gen/GenerateStructItem.h"
|
||||||
|
#include "UObject/Object.h"
|
||||||
|
#include "PlayerInventoryModel.generated.h"
|
||||||
|
|
||||||
|
USTRUCT(Blueprintable)
|
||||||
|
struct FPlayerGimmickSlotData
|
||||||
|
{
|
||||||
|
GENERATED_BODY()
|
||||||
|
FPlayerGimmickSlotData() :
|
||||||
|
ItemRowName("None"),
|
||||||
|
ItemCount(0)
|
||||||
|
{
|
||||||
|
}
|
||||||
|
UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = Item)
|
||||||
|
FName ItemRowName;
|
||||||
|
|
||||||
|
UPROPERTY(EditAnywhere, BlueprintReadOnly, Category = Item)
|
||||||
|
FItem ItemData;
|
||||||
|
|
||||||
|
UPROPERTY(EditAnywhere, BlueprintReadOnly, Category = Item)
|
||||||
|
int32 ItemCount;
|
||||||
|
};
|
||||||
|
|
||||||
|
USTRUCT(Blueprintable)
|
||||||
|
struct FPlayerSpendSlotData
|
||||||
|
{
|
||||||
|
GENERATED_BODY()
|
||||||
|
FPlayerSpendSlotData() :
|
||||||
|
ItemRowName("None")
|
||||||
|
{
|
||||||
|
}
|
||||||
|
UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = Item)
|
||||||
|
FName ItemRowName;
|
||||||
|
|
||||||
|
UPROPERTY(EditAnywhere, BlueprintReadOnly, Category = Item)
|
||||||
|
FItem ItemData;
|
||||||
|
};
|
||||||
|
|
||||||
|
UCLASS()
|
||||||
|
class PROJECTT_API UPlayerInventoryModel : public UObject
|
||||||
|
{
|
||||||
|
GENERATED_BODY()
|
||||||
|
};
|
||||||
|
|
@ -0,0 +1,4 @@
|
||||||
|
// Fill out your copyright notice in the Description page of Project Settings.
|
||||||
|
|
||||||
|
|
||||||
|
#include "PlayerDataModel.h"
|
||||||
|
|
@ -0,0 +1,146 @@
|
||||||
|
// Fill out your copyright notice in the Description page of Project Settings.
|
||||||
|
|
||||||
|
#pragma once
|
||||||
|
|
||||||
|
#include "CoreMinimal.h"
|
||||||
|
#include "InputAction.h"
|
||||||
|
#include "UObject/Object.h"
|
||||||
|
#include "PlayerDataModel.generated.h"
|
||||||
|
|
||||||
|
UENUM(BlueprintType)
|
||||||
|
enum class EPlayerSkillState: uint8
|
||||||
|
{
|
||||||
|
None = 0 UMETA(DisplayName = "None"),
|
||||||
|
Start UMETA(DisplayName = "Start"),
|
||||||
|
Aim UMETA(DisplayName = "Aim"),
|
||||||
|
Activate UMETA(DispalyName = "Activate"),
|
||||||
|
Cancel UMETA(DIsplayeName = "Cancel"),
|
||||||
|
Release UMETA(DisplayName = "Release"),
|
||||||
|
Finish UMETA(DisplayName = "Finish")
|
||||||
|
};
|
||||||
|
|
||||||
|
USTRUCT(Blueprintable)
|
||||||
|
struct FPlayerActionTypes
|
||||||
|
{
|
||||||
|
GENERATED_BODY()
|
||||||
|
|
||||||
|
UPROPERTY(EditAnywhere, Category = Input)
|
||||||
|
TObjectPtr<UInputAction> AxisMoveAction;
|
||||||
|
|
||||||
|
UPROPERTY(EditAnywhere, Category = Input)
|
||||||
|
TObjectPtr<UInputAction> RunAction;
|
||||||
|
|
||||||
|
UPROPERTY(EditAnywhere, Category = Input)
|
||||||
|
TObjectPtr<UInputAction> MeleeAttackAction;
|
||||||
|
|
||||||
|
UPROPERTY(EditAnywhere, Category = Input)
|
||||||
|
TObjectPtr<UInputAction> SkillAction;
|
||||||
|
|
||||||
|
UPROPERTY(EditAnywhere, Category = Input)
|
||||||
|
TObjectPtr<UInputAction> InteractionAction;
|
||||||
|
|
||||||
|
UPROPERTY(EditAnywhere, Category = Input)
|
||||||
|
TObjectPtr<UInputAction> UseSlot1Action;
|
||||||
|
|
||||||
|
UPROPERTY(EditAnywhere, Category = Input)
|
||||||
|
TObjectPtr<UInputAction> UseSlot2Action;
|
||||||
|
|
||||||
|
UPROPERTY(EditAnywhere, Category = Input)
|
||||||
|
TObjectPtr<UInputAction> UseSlot3Action;
|
||||||
|
|
||||||
|
UPROPERTY(EditAnywhere, Category = Input)
|
||||||
|
TObjectPtr<UInputAction> MinimapAction;
|
||||||
|
|
||||||
|
UPROPERTY(EditAnywhere, Category = Input)
|
||||||
|
TObjectPtr<UInputAction> PauseAction;
|
||||||
|
};
|
||||||
|
|
||||||
|
USTRUCT(Blueprintable)
|
||||||
|
struct FPlayerChordedActionTypes
|
||||||
|
{
|
||||||
|
GENERATED_BODY()
|
||||||
|
|
||||||
|
UPROPERTY(EditAnywhere, Category = Input)
|
||||||
|
TObjectPtr<UInputAction> CtrlAction;
|
||||||
|
};
|
||||||
|
|
||||||
|
USTRUCT(Blueprintable)
|
||||||
|
struct FPlayerDebugActionTypes
|
||||||
|
{
|
||||||
|
GENERATED_BODY()
|
||||||
|
|
||||||
|
UPROPERTY(EditAnywhere, Category = Input)
|
||||||
|
TObjectPtr<UInputAction> DebugToggleCheat;
|
||||||
|
|
||||||
|
UPROPERTY(EditAnywhere, Category = Input)
|
||||||
|
TObjectPtr<UInputAction> DebugToggleInvincible;
|
||||||
|
|
||||||
|
UPROPERTY(EditAnywhere, Category = Input)
|
||||||
|
TObjectPtr<UInputAction> DebugTogglePlayerDamage;
|
||||||
|
|
||||||
|
UPROPERTY(EditAnywhere, Category = Input)
|
||||||
|
TObjectPtr<UInputAction> DebugTogglePlayerSpeed;
|
||||||
|
|
||||||
|
UPROPERTY(EditAnywhere, Category = Input)
|
||||||
|
TObjectPtr<UInputAction> DebugToggleFrustum;
|
||||||
|
|
||||||
|
UPROPERTY(EditAnywhere, Category = Input)
|
||||||
|
TObjectPtr<UInputAction> DebugToggleHitCollision;
|
||||||
|
|
||||||
|
UPROPERTY(EditAnywhere, Category = Input)
|
||||||
|
TObjectPtr<UInputAction> DebugToggleTimeStop;
|
||||||
|
|
||||||
|
UPROPERTY(EditAnywhere, Category = Input)
|
||||||
|
TObjectPtr<UInputAction> DebugToggleSlomo;
|
||||||
|
|
||||||
|
UPROPERTY(EditAnywhere, Category = Input)
|
||||||
|
TObjectPtr<UInputAction> DebugCharacterSelect;
|
||||||
|
|
||||||
|
UPROPERTY(EditAnywhere, Category = Input)
|
||||||
|
TObjectPtr<UInputAction> DebugToggleCam;
|
||||||
|
|
||||||
|
};
|
||||||
|
|
||||||
|
USTRUCT(Blueprintable)
|
||||||
|
struct FPlayerSimpleRatio
|
||||||
|
{
|
||||||
|
GENERATED_BODY()
|
||||||
|
FPlayerSimpleRatio() :
|
||||||
|
CurrentValue(0.f),
|
||||||
|
MaxValue(0.f)
|
||||||
|
{
|
||||||
|
}
|
||||||
|
|
||||||
|
UPROPERTY(EditAnywhere)
|
||||||
|
float CurrentValue;
|
||||||
|
|
||||||
|
UPROPERTY(EditAnywhere)
|
||||||
|
float MaxValue;
|
||||||
|
};
|
||||||
|
|
||||||
|
USTRUCT(Blueprintable)
|
||||||
|
struct FPlayerEffectValue
|
||||||
|
{
|
||||||
|
GENERATED_BODY()
|
||||||
|
FPlayerEffectValue() :
|
||||||
|
RemainTime(0.f),
|
||||||
|
MaxTime(0.f),
|
||||||
|
EffectValue(0.f)
|
||||||
|
{
|
||||||
|
}
|
||||||
|
|
||||||
|
UPROPERTY(EditAnywhere)
|
||||||
|
float RemainTime;
|
||||||
|
|
||||||
|
UPROPERTY(EditAnywhere)
|
||||||
|
float MaxTime;
|
||||||
|
|
||||||
|
UPROPERTY(EditAnywhere)
|
||||||
|
float EffectValue;
|
||||||
|
};
|
||||||
|
|
||||||
|
UCLASS()
|
||||||
|
class PROJECTT_API UPlayerDataModel : public UObject
|
||||||
|
{
|
||||||
|
GENERATED_BODY()
|
||||||
|
};
|
||||||
|
|
@ -0,0 +1,5 @@
|
||||||
|
// Fill out your copyright notice in the Description page of Project Settings.
|
||||||
|
|
||||||
|
|
||||||
|
#include "UserDataModel.h"
|
||||||
|
|
||||||
|
|
@ -0,0 +1,134 @@
|
||||||
|
// Fill out your copyright notice in the Description page of Project Settings.
|
||||||
|
|
||||||
|
#pragma once
|
||||||
|
|
||||||
|
#include "CoreMinimal.h"
|
||||||
|
#include "UObject/Object.h"
|
||||||
|
#include "UserDataModel.generated.h"
|
||||||
|
|
||||||
|
|
||||||
|
USTRUCT()
|
||||||
|
struct FSubQuestData
|
||||||
|
{
|
||||||
|
GENERATED_BODY()
|
||||||
|
|
||||||
|
FSubQuestData() {}
|
||||||
|
bool operator==(const FUserSaveData& Other) const
|
||||||
|
{
|
||||||
|
return (*this == Other);
|
||||||
|
}
|
||||||
|
bool operator!=(const FUserSaveData& Other) const
|
||||||
|
{
|
||||||
|
return !(*this == Other);
|
||||||
|
}
|
||||||
|
bool IsDefault() const
|
||||||
|
{
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
|
USTRUCT(BlueprintType)
|
||||||
|
struct FUnlockCharacterData
|
||||||
|
{
|
||||||
|
GENERATED_BODY()
|
||||||
|
|
||||||
|
FUnlockCharacterData() : bCleared(false) {}
|
||||||
|
FUnlockCharacterData(const FString& InRowName, bool InCleared = false) :
|
||||||
|
UnlockCharacterRowName(InRowName), bCleared(InCleared) {
|
||||||
|
}
|
||||||
|
|
||||||
|
bool operator==(const FUserSaveData& Other) const
|
||||||
|
{
|
||||||
|
return (*this == Other);
|
||||||
|
}
|
||||||
|
bool operator!=(const FUserSaveData& Other) const
|
||||||
|
{
|
||||||
|
return !(*this == Other);
|
||||||
|
}
|
||||||
|
bool IsDefault() const
|
||||||
|
{
|
||||||
|
return UnlockCharacterRowName.IsEmpty() && !bCleared;
|
||||||
|
}
|
||||||
|
|
||||||
|
UPROPERTY(EditAnywhere, BlueprintReadWrite)
|
||||||
|
FString UnlockCharacterRowName;
|
||||||
|
|
||||||
|
UPROPERTY(EditAnywhere, BlueprintReadWrite)
|
||||||
|
bool bCleared;
|
||||||
|
};
|
||||||
|
|
||||||
|
USTRUCT(BlueprintType)
|
||||||
|
struct FStageData
|
||||||
|
{
|
||||||
|
GENERATED_BODY()
|
||||||
|
|
||||||
|
FStageData() : bCleared(false) {}
|
||||||
|
FStageData(const FString& InRowName, bool InCleared = false) :
|
||||||
|
StageRowName(InRowName), bCleared(InCleared) {
|
||||||
|
}
|
||||||
|
|
||||||
|
bool operator==(const FUserSaveData& Other) const
|
||||||
|
{
|
||||||
|
return (*this == Other);
|
||||||
|
}
|
||||||
|
bool operator!=(const FUserSaveData& Other) const
|
||||||
|
{
|
||||||
|
return !(*this == Other);
|
||||||
|
}
|
||||||
|
bool IsDefault() const
|
||||||
|
{
|
||||||
|
return StageRowName.IsEmpty() && !bCleared;
|
||||||
|
}
|
||||||
|
|
||||||
|
UPROPERTY(EditAnywhere, BlueprintReadWrite)
|
||||||
|
FString StageRowName;
|
||||||
|
|
||||||
|
UPROPERTY(EditAnywhere, BlueprintReadWrite)
|
||||||
|
bool bCleared;
|
||||||
|
};
|
||||||
|
|
||||||
|
USTRUCT()
|
||||||
|
struct FUserSaveData
|
||||||
|
{
|
||||||
|
GENERATED_BODY()
|
||||||
|
|
||||||
|
FUserSaveData()
|
||||||
|
{
|
||||||
|
if(UnlockCharacterData.IsEmpty())
|
||||||
|
UnlockCharacterData.Push(FUnlockCharacterData(TEXT("200001"), true));
|
||||||
|
|
||||||
|
if(UnlockStageData.IsEmpty())
|
||||||
|
UnlockStageData.Push(FStageData(TEXT("100101"), true));
|
||||||
|
}
|
||||||
|
bool operator==(const FUserSaveData& Other) const
|
||||||
|
{
|
||||||
|
return (*this == Other);
|
||||||
|
}
|
||||||
|
bool operator!=(const FUserSaveData& Other) const
|
||||||
|
{
|
||||||
|
return !(*this == Other);
|
||||||
|
}
|
||||||
|
bool IsDefault() const
|
||||||
|
{
|
||||||
|
return SubQuestData.IsDefault() && UnlockStageData.IsEmpty() && UnlockCharacterData.IsEmpty();
|
||||||
|
}
|
||||||
|
|
||||||
|
UPROPERTY()
|
||||||
|
FSubQuestData SubQuestData;
|
||||||
|
|
||||||
|
UPROPERTY()
|
||||||
|
TArray<FStageData> UnlockStageData;
|
||||||
|
|
||||||
|
UPROPERTY()
|
||||||
|
TArray<FUnlockCharacterData> UnlockCharacterData;
|
||||||
|
|
||||||
|
UPROPERTY()
|
||||||
|
FString SelectedCharacterData;
|
||||||
|
};
|
||||||
|
|
||||||
|
|
||||||
|
UCLASS()
|
||||||
|
class PROJECTT_API UUserDataModel : public UObject
|
||||||
|
{
|
||||||
|
GENERATED_BODY()
|
||||||
|
};
|
||||||
|
|
@ -0,0 +1,44 @@
|
||||||
|
// Copyright Epic Games, Inc. All Rights Reserved.
|
||||||
|
|
||||||
|
using UnrealBuildTool;
|
||||||
|
|
||||||
|
public class ProjectT : ModuleRules
|
||||||
|
{
|
||||||
|
public ProjectT(ReadOnlyTargetRules Target) : base(Target)
|
||||||
|
{
|
||||||
|
PublicDependencyModuleNames.AddRange(new string[]
|
||||||
|
{
|
||||||
|
"Core",
|
||||||
|
"CoreUObject",
|
||||||
|
"Engine",
|
||||||
|
"InputCore",
|
||||||
|
"EnhancedInput",
|
||||||
|
"LevelSequence",
|
||||||
|
"MovieScene",
|
||||||
|
"Slate",
|
||||||
|
"SlateCore",
|
||||||
|
"UMG",
|
||||||
|
"Niagara",
|
||||||
|
"AIModule",
|
||||||
|
"ProceduralMeshComponent",
|
||||||
|
"NavigationSystem",
|
||||||
|
"MoviePlayer"
|
||||||
|
});
|
||||||
|
if (Target.bBuildEditor)
|
||||||
|
{
|
||||||
|
PrivateDependencyModuleNames.AddRange(new string[] {"UnrealEd","MaterialEditor", "LevelEditor" , "EditorUtilityModule"});
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
PrivateDependencyModuleNames.AddRange(new string[] { });
|
||||||
|
}
|
||||||
|
|
||||||
|
// Uncomment if you are using Slate UI
|
||||||
|
// PrivateDependencyModuleNames.AddRange(new string[] { "Slate", "SlateCore" });
|
||||||
|
|
||||||
|
// Uncomment if you are using online features
|
||||||
|
// PrivateDependencyModuleNames.Add("OnlineSubsystem");
|
||||||
|
|
||||||
|
// To include OnlineSubsystemSteam, add it to the plugins section in your uproject file with the Enabled attribute set to true
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
@ -0,0 +1,6 @@
|
||||||
|
// Copyright Epic Games, Inc. All Rights Reserved.
|
||||||
|
|
||||||
|
#include "ProjectT.h"
|
||||||
|
#include "Modules/ModuleManager.h"
|
||||||
|
|
||||||
|
IMPLEMENT_PRIMARY_GAME_MODULE( FDefaultGameModuleImpl, ProjectT, "ProjectT" );
|
||||||
|
|
@ -0,0 +1,75 @@
|
||||||
|
// Copyright Epic Games, Inc. All Rights Reserved.
|
||||||
|
|
||||||
|
#pragma once
|
||||||
|
|
||||||
|
#include "CoreMinimal.h"
|
||||||
|
|
||||||
|
#define CONTENT_DIGIT 2
|
||||||
|
|
||||||
|
#define NOT_IMPLEMENTED_MSG(Str) UE_LOG(LogTemp, Warning, TEXT("Not Implemented %s() -> Line:%d -> Desc:%s"), TEXT(__FUNCTION__), __LINE__, TEXT(Str))
|
||||||
|
#define NOT_IMPLEMENTED() UE_LOG(LogTemp, Warning, TEXT("Not Implemented %s() -> Line:%d"), TEXT(__FUNCTION__), __LINE__)
|
||||||
|
#define CHECK_FREE(Str) Str.Equals("FREE")
|
||||||
|
|
||||||
|
#define NMT_CHECKF(Object) checkf((Object), TEXT("%s Is Fail. Please Check %s() -> Line:%d"), TEXT(#Object), TEXT(__FUNCTION__), __LINE__)
|
||||||
|
#define NMT_ENSURE(Object) ensureMsgf((Object), TEXT("%s Is Fail. Please Check %s() -> Line:%d"), TEXT(#Object), TEXT(__FUNCTION__), __LINE__)
|
||||||
|
|
||||||
|
#define NMT_MSG_CHECKF(Object, FormatStr, ...) checkf((Object), TEXT(FormatStr), ##__VA_ARGS__)
|
||||||
|
#define NMT_MSG_ENSURE(Object, FormatStr, ...) ensureMsgf((Object), TEXT(FormatStr), ##__VA_ARGS__)
|
||||||
|
|
||||||
|
#define JOIN_STRINGS(Delimiter, ...) (*(FString::Join<TArray<FString>>({__VA_ARGS__}, Delimiter)))
|
||||||
|
|
||||||
|
#define FROM_INT(Num) (*FString::FromInt(Num))
|
||||||
|
#define STRING_TO_INTEGER(Str) (FCString::Atoi(Str))
|
||||||
|
#define NAME_TO_INTEGER(Name) (FCString::Atoi(Name.ToString()))
|
||||||
|
|
||||||
|
#define SHOW_NMT_LOG 1
|
||||||
|
#define NMT_LOG_TYPE Warning
|
||||||
|
|
||||||
|
#ifndef IGN_PARAM
|
||||||
|
#define IGN_PARAM(X) { (void)X; }
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#define NMT_LOGF(FormatStr, ...) \
|
||||||
|
if(SHOW_NMT_LOG) \
|
||||||
|
{ \
|
||||||
|
UE_LOG(LogTemp, NMT_LOG_TYPE, TEXT(FormatStr), ##__VA_ARGS__); \
|
||||||
|
}
|
||||||
|
|
||||||
|
#define NMT_LOG(FormatStr) \
|
||||||
|
if(SHOW_NMT_LOG) \
|
||||||
|
{ \
|
||||||
|
UE_LOG(LogTemp, NMT_LOG_TYPE, TEXT(FormatStr)); \
|
||||||
|
}
|
||||||
|
|
||||||
|
#ifdef __COUNTER__
|
||||||
|
#define NMT_DEBUG_PRINT(Duration, FormatStr, ...) \
|
||||||
|
if (GEngine) \
|
||||||
|
{ \
|
||||||
|
GEngine->AddOnScreenDebugMessage( \
|
||||||
|
uint64(sizeof(__FILE__) + sizeof(__func__) + __LINE__ + __COUNTER__), \
|
||||||
|
Duration, \
|
||||||
|
FColor::Orange, \
|
||||||
|
FString::Printf(TEXT(FormatStr), ##__VA_ARGS__), \
|
||||||
|
false, \
|
||||||
|
FVector2D(0.9, 0.9)); \
|
||||||
|
}
|
||||||
|
|
||||||
|
#define NMT_DEBUG_PRINT_ONCE(FormatStr, ...) \
|
||||||
|
NMT_DEBUG_PRINT(-1.f, FormatStr, ##__VA_ARGS__)
|
||||||
|
|
||||||
|
#define NMT_DEBUG_POS_PRINT(Duration, Position, FormatStr,...) \
|
||||||
|
if (GEngine) \
|
||||||
|
{ \
|
||||||
|
GEngine->AddOnScreenDebugMessage( \
|
||||||
|
uint64(sizeof(__FILE__) + sizeof(__func__) + __LINE__ + __COUNTER__), \
|
||||||
|
Duration, \
|
||||||
|
FColor::Orange, \
|
||||||
|
FString::Printf(TEXT(FormatStr), ##__VA_ARGS__), \
|
||||||
|
false, \
|
||||||
|
Position \
|
||||||
|
); \
|
||||||
|
}
|
||||||
|
#define NMT_DEBUG_POS_PRINT_ONCE(Position, FormatStr, ...) \
|
||||||
|
NMT_DEBUG_POS_PRINT(-1.f, Position, FormatStr)
|
||||||
|
|
||||||
|
#endif
|
||||||
|
|
@ -0,0 +1,17 @@
|
||||||
|
// Fill out your copyright notice in the Description page of Project Settings.
|
||||||
|
|
||||||
|
|
||||||
|
#include "AbnormalAnimEnd.h"
|
||||||
|
|
||||||
|
#include "ProjectT/System/SinglePlay/Characters/NPC/SPNpcAgent.h"
|
||||||
|
|
||||||
|
void UAbnormalAnimEnd::Notify(USkeletalMeshComponent* MeshComp, UAnimSequenceBase* Animation, const FAnimNotifyEventReference& EventReference)
|
||||||
|
{
|
||||||
|
Super::Notify(MeshComp, Animation, EventReference);
|
||||||
|
|
||||||
|
ASPNpcAgent* AgentNpc = Cast<ASPNpcAgent>(MeshComp->GetOwner());
|
||||||
|
if (AgentNpc)
|
||||||
|
{
|
||||||
|
AgentNpc->DetermineNextStateAfterAbnormal();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
@ -0,0 +1,16 @@
|
||||||
|
// Fill out your copyright notice in the Description page of Project Settings.
|
||||||
|
|
||||||
|
#pragma once
|
||||||
|
|
||||||
|
#include "CoreMinimal.h"
|
||||||
|
#include "Animation/AnimNotifies/AnimNotify.h"
|
||||||
|
#include "AbnormalAnimEnd.generated.h"
|
||||||
|
|
||||||
|
|
||||||
|
UCLASS()
|
||||||
|
class PROJECTT_API UAbnormalAnimEnd : public UAnimNotify
|
||||||
|
{
|
||||||
|
GENERATED_BODY()
|
||||||
|
|
||||||
|
virtual void Notify(USkeletalMeshComponent* MeshComp, UAnimSequenceBase* Animation, const FAnimNotifyEventReference& EventReference) override;
|
||||||
|
};
|
||||||
|
|
@ -0,0 +1,21 @@
|
||||||
|
// Fill out your copyright notice in the Description page of Project Settings.
|
||||||
|
|
||||||
|
|
||||||
|
#include "NonInputAnimEnd.h"
|
||||||
|
|
||||||
|
#include "ProjectT/System/Core/Characters/Player/CorePlayerCharacter.h"
|
||||||
|
#include "ProjectT/System/Core/Characters/Player/Animations/AnimInstance/PlayerCharacterAnimInstance.h"
|
||||||
|
|
||||||
|
void UNonInputAnimEnd::Notify(USkeletalMeshComponent* MeshComp, UAnimSequenceBase* Animation,
|
||||||
|
const FAnimNotifyEventReference& EventReference)
|
||||||
|
{
|
||||||
|
Super::Notify(MeshComp, Animation, EventReference);
|
||||||
|
ACorePlayerCharacter* LocPlayerCharacter = Cast<ACorePlayerCharacter>(MeshComp->GetOwner());
|
||||||
|
if(LocPlayerCharacter)
|
||||||
|
{
|
||||||
|
UPlayerCharacterAnimInstance* LocPlayerAnimInstance;
|
||||||
|
LocPlayerCharacter->GetAnimInstance(LocPlayerAnimInstance);
|
||||||
|
LocPlayerAnimInstance->NonInputAnimFinished();
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
@ -0,0 +1,18 @@
|
||||||
|
// Fill out your copyright notice in the Description page of Project Settings.
|
||||||
|
|
||||||
|
#pragma once
|
||||||
|
|
||||||
|
#include "CoreMinimal.h"
|
||||||
|
#include "Animation/AnimNotifies/AnimNotify.h"
|
||||||
|
#include "NonInputAnimEnd.generated.h"
|
||||||
|
|
||||||
|
/**
|
||||||
|
*
|
||||||
|
*/
|
||||||
|
UCLASS()
|
||||||
|
class PROJECTT_API UNonInputAnimEnd : public UAnimNotify
|
||||||
|
{
|
||||||
|
GENERATED_BODY()
|
||||||
|
|
||||||
|
virtual void Notify(USkeletalMeshComponent* MeshComp, UAnimSequenceBase* Animation, const FAnimNotifyEventReference& EventReference) override;
|
||||||
|
};
|
||||||
|
|
@ -0,0 +1,36 @@
|
||||||
|
// Fill out your copyright notice in the Description page of Project Settings.
|
||||||
|
|
||||||
|
|
||||||
|
#include "SkillHitEnabled.h"
|
||||||
|
|
||||||
|
#include "ProjectT/System/Core/Characters/Player/CorePlayerCharacter.h"
|
||||||
|
#include "ProjectT/System/Core/Characters/Skill/CoreSkill.h"
|
||||||
|
#include "ProjectT/System/SinglePlay/Characters/NPC/SPNpcAgent.h"
|
||||||
|
|
||||||
|
void USkillHitEnabled::Notify(USkeletalMeshComponent* MeshComp, UAnimSequenceBase* Animation,
|
||||||
|
const FAnimNotifyEventReference& EventReference)
|
||||||
|
{
|
||||||
|
Super::Notify(MeshComp, Animation, EventReference);
|
||||||
|
if(const ACorePlayerCharacter* LocPlayerCharacter = Cast<ACorePlayerCharacter>(MeshComp->GetOwner()))
|
||||||
|
{
|
||||||
|
ACoreSkill* LocCurrentSkill;
|
||||||
|
LocPlayerCharacter->GetCurrentSkill(LocCurrentSkill);
|
||||||
|
if (LocCurrentSkill)
|
||||||
|
LocCurrentSkill->SkillHitEnable(true);
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
if(const ASPNpcAgent* LocASPNpcAgent = Cast<ASPNpcAgent>(MeshComp->GetOwner()))
|
||||||
|
{
|
||||||
|
ACoreSkill* LocCurrentSkill = LocASPNpcAgent->GetCurrentSkill();
|
||||||
|
if (LocCurrentSkill)
|
||||||
|
LocCurrentSkill->SkillHitEnable(true);
|
||||||
|
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
if(ACoreSkill* LocACoreSkill = Cast<ACoreSkill>(MeshComp->GetOwner()))
|
||||||
|
{
|
||||||
|
LocACoreSkill->SkillObjectHitEnable(true);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
@ -0,0 +1,18 @@
|
||||||
|
// Fill out your copyright notice in the Description page of Project Settings.
|
||||||
|
|
||||||
|
#pragma once
|
||||||
|
|
||||||
|
#include "CoreMinimal.h"
|
||||||
|
#include "Animation/AnimNotifies/AnimNotify.h"
|
||||||
|
#include "SkillHitEnabled.generated.h"
|
||||||
|
|
||||||
|
/**
|
||||||
|
*
|
||||||
|
*/
|
||||||
|
UCLASS()
|
||||||
|
class PROJECTT_API USkillHitEnabled : public UAnimNotify
|
||||||
|
{
|
||||||
|
GENERATED_BODY()
|
||||||
|
|
||||||
|
virtual void Notify(USkeletalMeshComponent* MeshComp, UAnimSequenceBase* Animation, const FAnimNotifyEventReference& EventReference) override;
|
||||||
|
};
|
||||||
|
|
@ -0,0 +1,56 @@
|
||||||
|
// Fill out your copyright notice in the Description page of Project Settings.
|
||||||
|
|
||||||
|
|
||||||
|
#include "SkillFXEnabledState.h"
|
||||||
|
|
||||||
|
#include "ProjectT/System/Core/Characters/Player/CorePlayerCharacter.h"
|
||||||
|
#include "ProjectT/System/Core/Characters/Skill/CoreSkill.h"
|
||||||
|
#include "ProjectT/System/SinglePlay/Characters/NPC/SPNpcAgent.h"
|
||||||
|
|
||||||
|
void USkillFXEnabledState::NotifyBegin(USkeletalMeshComponent* MeshComp, UAnimSequenceBase* Animation,
|
||||||
|
float TotalDuration, const FAnimNotifyEventReference& EventReference)
|
||||||
|
{
|
||||||
|
Super::NotifyBegin(MeshComp, Animation, TotalDuration, EventReference);
|
||||||
|
ACorePlayerCharacter* LocPlayerCharacter = Cast<ACorePlayerCharacter>(MeshComp->GetOwner());
|
||||||
|
if(LocPlayerCharacter)
|
||||||
|
{
|
||||||
|
ACoreSkill* LocCurrentSkill;
|
||||||
|
LocPlayerCharacter->GetCurrentSkill(LocCurrentSkill);
|
||||||
|
if (LocCurrentSkill)
|
||||||
|
LocCurrentSkill->SkillFXEnable(true, FXIndex);
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
ASPNpcAgent* LocASPNpcAgent = Cast<ASPNpcAgent>(MeshComp->GetOwner());
|
||||||
|
if(LocASPNpcAgent)
|
||||||
|
{
|
||||||
|
ACoreSkill* LocCurrentSkill = LocASPNpcAgent->GetCurrentSkill();
|
||||||
|
if (LocCurrentSkill)
|
||||||
|
LocCurrentSkill->SkillFXEnable(true, FXIndex);
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
void USkillFXEnabledState::NotifyEnd(USkeletalMeshComponent* MeshComp, UAnimSequenceBase* Animation,
|
||||||
|
const FAnimNotifyEventReference& EventReference)
|
||||||
|
{
|
||||||
|
Super::NotifyEnd(MeshComp, Animation, EventReference);
|
||||||
|
ACorePlayerCharacter* LocPlayerCharacter = Cast<ACorePlayerCharacter>(MeshComp->GetOwner());
|
||||||
|
if(LocPlayerCharacter)
|
||||||
|
{
|
||||||
|
ACoreSkill* LocCurrentSkill;
|
||||||
|
LocPlayerCharacter->GetCurrentSkill(LocCurrentSkill);
|
||||||
|
if (LocCurrentSkill)
|
||||||
|
LocCurrentSkill->SkillFXEnable(false, FXIndex);
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
ASPNpcAgent* LocASPNpcAgent = Cast<ASPNpcAgent>(MeshComp->GetOwner());
|
||||||
|
if(LocASPNpcAgent)
|
||||||
|
{
|
||||||
|
ACoreSkill* LocCurrentSkill = LocASPNpcAgent->GetCurrentSkill();
|
||||||
|
if (LocCurrentSkill)
|
||||||
|
LocCurrentSkill->SkillFXEnable(false, FXIndex);
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
@ -0,0 +1,22 @@
|
||||||
|
// Fill out your copyright notice in the Description page of Project Settings.
|
||||||
|
|
||||||
|
#pragma once
|
||||||
|
|
||||||
|
#include "CoreMinimal.h"
|
||||||
|
#include "Animation/AnimNotifies/AnimNotifyState.h"
|
||||||
|
#include "SkillFXEnabledState.generated.h"
|
||||||
|
|
||||||
|
/**
|
||||||
|
*
|
||||||
|
*/
|
||||||
|
UCLASS()
|
||||||
|
class PROJECTT_API USkillFXEnabledState : public UAnimNotifyState
|
||||||
|
{
|
||||||
|
GENERATED_BODY()
|
||||||
|
virtual void NotifyBegin(USkeletalMeshComponent* MeshComp, UAnimSequenceBase* Animation, float TotalDuration, const FAnimNotifyEventReference& EventReference) override;
|
||||||
|
virtual void NotifyEnd(USkeletalMeshComponent* MeshComp, UAnimSequenceBase* Animation, const FAnimNotifyEventReference& EventReference) override;
|
||||||
|
|
||||||
|
protected:
|
||||||
|
UPROPERTY(EditAnywhere)
|
||||||
|
int32 FXIndex = 0;
|
||||||
|
};
|
||||||
|
|
@ -0,0 +1,59 @@
|
||||||
|
// Fill out your copyright notice in the Description page of Project Settings.
|
||||||
|
|
||||||
|
|
||||||
|
#include "SkillHitEnabledState.h"
|
||||||
|
|
||||||
|
#include "ProjectT/System/Core/Characters/Player/CorePlayerCharacter.h"
|
||||||
|
#include "ProjectT/System/Core/Characters/Skill/CoreSkill.h"
|
||||||
|
#include "ProjectT/System/SinglePlay/Characters/NPC/SPNpcAgent.h"
|
||||||
|
|
||||||
|
void USkillHitEnabledState::NotifyBegin(USkeletalMeshComponent* MeshComp, UAnimSequenceBase* Animation,
|
||||||
|
float TotalDuration, const FAnimNotifyEventReference& EventReference)
|
||||||
|
{
|
||||||
|
Super::NotifyBegin(MeshComp, Animation, TotalDuration, EventReference);
|
||||||
|
ACorePlayerCharacter* LocPlayerCharacter = Cast<ACorePlayerCharacter>(MeshComp->GetOwner());
|
||||||
|
if(LocPlayerCharacter)
|
||||||
|
{
|
||||||
|
ACoreSkill* LocCurrentSkill;
|
||||||
|
LocPlayerCharacter->GetCurrentSkill(LocCurrentSkill);
|
||||||
|
if(LocCurrentSkill)
|
||||||
|
{
|
||||||
|
LocCurrentSkill->SkillHitEnable(true);
|
||||||
|
}
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
ASPNpcAgent* LocASPNpcAgent = Cast<ASPNpcAgent>(MeshComp->GetOwner());
|
||||||
|
if(LocASPNpcAgent)
|
||||||
|
{
|
||||||
|
ACoreSkill* LocCurrentSkill = LocASPNpcAgent->GetCurrentSkill();
|
||||||
|
if (LocCurrentSkill)
|
||||||
|
LocCurrentSkill->SkillHitEnable(true);
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
void USkillHitEnabledState::NotifyEnd(USkeletalMeshComponent* MeshComp, UAnimSequenceBase* Animation, const FAnimNotifyEventReference& EventReference)
|
||||||
|
{
|
||||||
|
Super::NotifyEnd(MeshComp, Animation, EventReference);
|
||||||
|
ACorePlayerCharacter* LocPlayerCharacter = Cast<ACorePlayerCharacter>(MeshComp->GetOwner());
|
||||||
|
if(LocPlayerCharacter)
|
||||||
|
{
|
||||||
|
ACoreSkill* LocCurrentSkill;
|
||||||
|
LocPlayerCharacter->GetCurrentSkill(LocCurrentSkill);
|
||||||
|
if (LocCurrentSkill)
|
||||||
|
{
|
||||||
|
LocCurrentSkill->SkillHitEnable(false);
|
||||||
|
}
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
ASPNpcAgent* LocASPNpcAgent = Cast<ASPNpcAgent>(MeshComp->GetOwner());
|
||||||
|
if(LocASPNpcAgent)
|
||||||
|
{
|
||||||
|
ACoreSkill* LocCurrentSkill = LocASPNpcAgent->GetCurrentSkill();
|
||||||
|
if (LocCurrentSkill)
|
||||||
|
LocCurrentSkill->SkillHitEnable(false);
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
@ -0,0 +1,18 @@
|
||||||
|
// Fill out your copyright notice in the Description page of Project Settings.
|
||||||
|
|
||||||
|
#pragma once
|
||||||
|
|
||||||
|
#include "CoreMinimal.h"
|
||||||
|
#include "Animation/AnimNotifies/AnimNotifyState.h"
|
||||||
|
#include "SkillHitEnabledState.generated.h"
|
||||||
|
|
||||||
|
/**
|
||||||
|
*
|
||||||
|
*/
|
||||||
|
UCLASS()
|
||||||
|
class PROJECTT_API USkillHitEnabledState : public UAnimNotifyState
|
||||||
|
{
|
||||||
|
GENERATED_BODY()
|
||||||
|
virtual void NotifyBegin(USkeletalMeshComponent* MeshComp, UAnimSequenceBase* Animation, float TotalDuration, const FAnimNotifyEventReference& EventReference) override;
|
||||||
|
virtual void NotifyEnd(USkeletalMeshComponent* MeshComp, UAnimSequenceBase* Animation, const FAnimNotifyEventReference& EventReference) override;
|
||||||
|
};
|
||||||
|
|
@ -0,0 +1,258 @@
|
||||||
|
#include "CombatCharacter.h"
|
||||||
|
#include "Components/CapsuleComponent.h"
|
||||||
|
#include "ProjectT/ProjectT.h"
|
||||||
|
#include "ProjectT/Data/Gen/GenerateEnumContentType.h"
|
||||||
|
#include "ProjectT/Data/Gen/GenerateEnumDataTableKey.h"
|
||||||
|
#include "ProjectT/Data/Gen/GenerateStructCharacterMeshSet.h"
|
||||||
|
#include "ProjectT/Data/Gen/GenerateStructEnemyNPC.h"
|
||||||
|
#include "ProjectT/Data/Gen/GenerateStructMeshList.h"
|
||||||
|
#include "ProjectT/Data/Gen/GenerateStructPlayerCharacter.h"
|
||||||
|
#include "ProjectT/Data/Gen/GenerateStructSocketList.h"
|
||||||
|
#include "ProjectT/System/Core/Common/AssetUtilsLibrary.h"
|
||||||
|
#include "ProjectT/System/Core/Common/GlobalUtilsLibrary.h"
|
||||||
|
|
||||||
|
class CharacterDataLoader
|
||||||
|
{
|
||||||
|
public:
|
||||||
|
static void From(const FName& RowName, FName& OutMeshRowName, FCharacterMeshSet& OutMeshList, const FTableRowBase*& OutContentData)
|
||||||
|
{
|
||||||
|
FName FoundMeshRowName;
|
||||||
|
EContentType NewContentType = UGlobalUtilsLibrary::GetContentTypeFromIndex(RowName);
|
||||||
|
UDataTable* DataTable = nullptr;
|
||||||
|
switch(NewContentType)
|
||||||
|
{
|
||||||
|
case EContentType::PlayerCharacter:
|
||||||
|
{
|
||||||
|
DataTable = UAssetUtilsLibrary::LoadDataTableByEnumKey(EDataTableKey::PlayerCharacter);
|
||||||
|
FPlayerCharacter* CharacterDataRow = DataTable->FindRow<FPlayerCharacter>(RowName, TEXT("Not Found FPlayerCharacter"));
|
||||||
|
if(!NMT_ENSURE(CharacterDataRow)) return;
|
||||||
|
FoundMeshRowName = FROM_INT(CharacterDataRow->iCharMeshSetId);
|
||||||
|
OutContentData = CharacterDataRow;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
case EContentType::EnemyNpc:
|
||||||
|
{
|
||||||
|
DataTable = UAssetUtilsLibrary::LoadDataTableByEnumKey(EDataTableKey::EnemyNpc);
|
||||||
|
FEnemyNpc* CharacterDataRow = DataTable->FindRow<FEnemyNpc>(RowName, TEXT("Not Found FEnemyNPC"));
|
||||||
|
if(!NMT_ENSURE(CharacterDataRow)) return;
|
||||||
|
FoundMeshRowName = FROM_INT(CharacterDataRow->iNpcMeshSetId);
|
||||||
|
OutContentData = CharacterDataRow;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
default: return;
|
||||||
|
}
|
||||||
|
DataTable = UAssetUtilsLibrary::LoadDataTableByEnumKey(EDataTableKey::CharacterMeshSet);
|
||||||
|
if(FCharacterMeshSet* RowData = DataTable->FindRow<FCharacterMeshSet>(FoundMeshRowName, TEXT("FCharacterMeshSet")))
|
||||||
|
{
|
||||||
|
OutMeshList = *RowData;
|
||||||
|
OutMeshRowName = FoundMeshRowName;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
|
ACombatCharacter::ACombatCharacter() :
|
||||||
|
AccessoryMeshComponent(nullptr),
|
||||||
|
WeaponStaticComponent(nullptr),
|
||||||
|
WeaponDynamicComponent(nullptr),
|
||||||
|
DefaultBodyMesh(nullptr)
|
||||||
|
{
|
||||||
|
GetCapsuleComponent()->SetCapsuleHalfHeight(50.0f);
|
||||||
|
GetCapsuleComponent()->SetCapsuleRadius(20.0f);
|
||||||
|
GetMesh()->SetRelativeLocation(FVector(0.0f, 0.0f, -52.0f));
|
||||||
|
|
||||||
|
AccessoryMeshComponent = CreateDefaultSubobject<UStaticMeshComponent>(TEXT("AccessoryMeshComponent"));
|
||||||
|
WeaponStaticComponent = CreateDefaultSubobject<UStaticMeshComponent>(TEXT("WeaponStaticComponent"));
|
||||||
|
WeaponDynamicComponent = CreateDefaultSubobject<USkeletalMeshComponent>(TEXT("WeaponDynamicComponent"));
|
||||||
|
NMT_CHECKF(AccessoryMeshComponent && WeaponStaticComponent && WeaponDynamicComponent);
|
||||||
|
|
||||||
|
UGlobalUtilsLibrary::EnableComponent(AccessoryMeshComponent, false);
|
||||||
|
UGlobalUtilsLibrary::EnableComponent(WeaponStaticComponent, false);
|
||||||
|
UGlobalUtilsLibrary::EnableComponent(WeaponDynamicComponent, false);
|
||||||
|
}
|
||||||
|
|
||||||
|
void ACombatCharacter::PostLoad()
|
||||||
|
{
|
||||||
|
Super::PostLoad();
|
||||||
|
}
|
||||||
|
|
||||||
|
void ACombatCharacter::OnConstruction(const FTransform& Transform)
|
||||||
|
{
|
||||||
|
Super::OnConstruction(Transform);
|
||||||
|
|
||||||
|
#if WITH_EDITOR
|
||||||
|
const FString LabelRowName = *GetActorLabel();
|
||||||
|
if(LabelRowName.IsNumeric()) ApplyCharacterConfiguration(*LabelRowName);
|
||||||
|
#endif
|
||||||
|
}
|
||||||
|
|
||||||
|
EContentType ACombatCharacter::GetContentType_Implementation()
|
||||||
|
{
|
||||||
|
return IContentType::GetContentType_Implementation();
|
||||||
|
}
|
||||||
|
|
||||||
|
FString ACombatCharacter::GetContentTypeNumber_Implementation()
|
||||||
|
{
|
||||||
|
return IContentType::GetContentTypeNumber_Implementation();
|
||||||
|
}
|
||||||
|
|
||||||
|
void ACombatCharacter::BeginPlay()
|
||||||
|
{
|
||||||
|
Super::BeginPlay();
|
||||||
|
|
||||||
|
#if WITH_EDITOR
|
||||||
|
const FString LabelRowName = *GetActorLabel();
|
||||||
|
if(LabelRowName.IsNumeric()) ApplyCharacterConfiguration(*LabelRowName);
|
||||||
|
else if(!CharacterRowName.IsNone() && CharacterRowName.ToString().IsNumeric()) ApplyCharacterConfiguration(CharacterRowName);
|
||||||
|
#endif
|
||||||
|
|
||||||
|
GetCapsuleComponent()->OnClicked.AddUniqueDynamic(this, &ACombatCharacter::ExecuteClickedEvent);
|
||||||
|
GetCapsuleComponent()->OnBeginCursorOver.AddUniqueDynamic(this, &ACombatCharacter::ExecuteBeginCursorOverEvent);
|
||||||
|
GetCapsuleComponent()->OnEndCursorOver.AddUniqueDynamic(this, &ACombatCharacter::ExecuteEndCursorOverEvent);
|
||||||
|
}
|
||||||
|
|
||||||
|
#if WITH_EDITOR
|
||||||
|
void ACombatCharacter::ApplyCharacterConfiguration(const FName& RowName)
|
||||||
|
{
|
||||||
|
if(RowName.IsNone())
|
||||||
|
{
|
||||||
|
RestoreCharacterSet();
|
||||||
|
RestoreCharacterData();
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
const EContentType NewContentType = UGlobalUtilsLibrary::GetContentTypeFromIndex(RowName);
|
||||||
|
if(EContentType::PlayerCharacter != NewContentType && EContentType::EnemyNpc != NewContentType)
|
||||||
|
{
|
||||||
|
RestoreCharacterSet();
|
||||||
|
RestoreCharacterData();
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
FName MeshSetRowName;
|
||||||
|
FCharacterMeshSet NewMeshSet;
|
||||||
|
const FTableRowBase* CharacterData = nullptr;
|
||||||
|
CharacterDataLoader::From(RowName, MeshSetRowName, NewMeshSet, CharacterData);
|
||||||
|
if(MeshSetRowName.IsNone())
|
||||||
|
{
|
||||||
|
RestoreCharacterSet();
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
if(ApplyCharacterSet(MeshSetRowName))
|
||||||
|
{
|
||||||
|
CurrentMeshSet = NewMeshSet;
|
||||||
|
CharacterRowName = RowName;
|
||||||
|
}
|
||||||
|
else RestoreCharacterSet();
|
||||||
|
|
||||||
|
if(CharacterData) ApplyCharacterData(CharacterData);
|
||||||
|
}
|
||||||
|
|
||||||
|
bool ACombatCharacter::ApplyCharacterSet(const FName& RowName)
|
||||||
|
{
|
||||||
|
UDataTable* CMSTable = UAssetUtilsLibrary::LoadDataTableByEnumKey(EDataTableKey::CharacterMeshSet);
|
||||||
|
FCharacterMeshSet* CMSData = CMSTable->FindRow<FCharacterMeshSet>(RowName, TEXT("FCharacterMeshSet"));
|
||||||
|
if(!CMSData) return false;
|
||||||
|
|
||||||
|
UDataTable* MLSTable = UAssetUtilsLibrary::LoadDataTableByEnumKey(EDataTableKey::MeshList);
|
||||||
|
FMeshList* BodyData = MLSTable->FindRow<FMeshList>(FROM_INT(CMSData->iBodyMeshId), TEXT("FMeshList"));
|
||||||
|
if(!BodyData) return false;
|
||||||
|
|
||||||
|
USkeletalMesh* BodyMesh = UAssetUtilsLibrary::GetSkeletalMeshFromPath(BodyData->sMeshPath);
|
||||||
|
if(!BodyMesh) return false;
|
||||||
|
GetMesh()->SetSkeletalMesh(BodyMesh);
|
||||||
|
|
||||||
|
FMeshList* WeaponData = nullptr;
|
||||||
|
if(CMSData->iWeaponMeshId != 0) WeaponData = MLSTable->FindRow<FMeshList>(FROM_INT(CMSData->iWeaponMeshId), TEXT("FMeshList"));
|
||||||
|
|
||||||
|
/**
|
||||||
|
* NOTE: Weapon Data는 항상 유효성을 보장하지 않음
|
||||||
|
*/
|
||||||
|
if(!WeaponData) return true;
|
||||||
|
if(!CHECK_FREE(WeaponData->sMeshPath))
|
||||||
|
{
|
||||||
|
UMeshComponent* WeaponComponent = nullptr;
|
||||||
|
FString ScriptType = UGlobalUtilsLibrary::GetScriptTypeByRefPath(WeaponData->sMeshPath);
|
||||||
|
if(ScriptType.Equals(TEXT("StaticMesh")))
|
||||||
|
{
|
||||||
|
UStaticMesh* WeaponMesh = UAssetUtilsLibrary::GetStaticMeshFromPath(WeaponData->sMeshPath);
|
||||||
|
WeaponStaticComponent->SetStaticMesh(WeaponMesh);
|
||||||
|
UGlobalUtilsLibrary::EnableComponent(WeaponStaticComponent, true);
|
||||||
|
WeaponComponent = WeaponStaticComponent;
|
||||||
|
}
|
||||||
|
else if(ScriptType.Equals(TEXT("SkeletalMesh")))
|
||||||
|
{
|
||||||
|
USkeletalMesh* WeaponMesh = UAssetUtilsLibrary::GetSkeletalMeshFromPath(WeaponData->sMeshPath);
|
||||||
|
WeaponDynamicComponent->SetSkeletalMesh(WeaponMesh);
|
||||||
|
UGlobalUtilsLibrary::EnableComponent(WeaponDynamicComponent, true);
|
||||||
|
WeaponComponent = WeaponDynamicComponent;
|
||||||
|
}
|
||||||
|
else NMT_MSG_CHECKF(0, "%s: type is not supported", *WeaponData->sMeshPath);
|
||||||
|
|
||||||
|
CMSData->iWeaponSocketId;
|
||||||
|
UDataTable* SocketTable = UAssetUtilsLibrary::LoadDataTableByEnumKey(EDataTableKey::SocketList);
|
||||||
|
FSocketList* SocketData = SocketTable->FindRow<FSocketList>(FROM_INT(CMSData->iWeaponSocketId), TEXT("FSocketList"));
|
||||||
|
if(CHECK_FREE(SocketData->sSocketName))
|
||||||
|
{
|
||||||
|
NMT_MSG_ENSURE(0, "Socket Name Is FREE [%s][%s]", FROM_INT(CMSData->iWeaponSocketId), *SocketData->sSocketName);
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
WeaponComponent->AttachToComponent(GetMesh(), FAttachmentTransformRules::SnapToTargetIncludingScale, *SocketData->sSocketName);
|
||||||
|
}
|
||||||
|
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
void ACombatCharacter::ApplyCharacterData(const FTableRowBase* RowData)
|
||||||
|
{
|
||||||
|
NMT_MSG_ENSURE(0, "Function should be overridden in the child class.");
|
||||||
|
}
|
||||||
|
|
||||||
|
void ACombatCharacter::RestoreCharacterData()
|
||||||
|
{
|
||||||
|
ApplyCharacterData(nullptr);
|
||||||
|
}
|
||||||
|
|
||||||
|
void ACombatCharacter::RestoreCharacterSet()
|
||||||
|
{
|
||||||
|
AccessoryMeshComponent->DetachFromComponent(FDetachmentTransformRules::KeepWorldTransform);
|
||||||
|
UGlobalUtilsLibrary::EnableComponent(AccessoryMeshComponent, false);
|
||||||
|
|
||||||
|
WeaponStaticComponent->DetachFromComponent(FDetachmentTransformRules::KeepWorldTransform);
|
||||||
|
UGlobalUtilsLibrary::EnableComponent(WeaponStaticComponent, false);
|
||||||
|
|
||||||
|
WeaponDynamicComponent->DetachFromComponent(FDetachmentTransformRules::KeepWorldTransform);
|
||||||
|
UGlobalUtilsLibrary::EnableComponent(WeaponDynamicComponent, false);
|
||||||
|
|
||||||
|
FString LocDefaultSKMeshPath = "/Script/Engine.SkeletalMesh'/Game/Characters/Pyro/Assets/SK_Pyro_Invalid.SK_Pyro_Invalid'";
|
||||||
|
DefaultBodyMesh = UAssetUtilsLibrary::GetSkeletalMeshFromPath(LocDefaultSKMeshPath);
|
||||||
|
if(DefaultBodyMesh != nullptr)
|
||||||
|
{
|
||||||
|
GetMesh()->SetSkeletalMesh(DefaultBodyMesh);
|
||||||
|
}
|
||||||
|
|
||||||
|
CurrentMeshSet = FCharacterMeshSet();
|
||||||
|
CharacterRowName = TEXT("None");
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
|
||||||
|
void ACombatCharacter::Respawn()
|
||||||
|
{
|
||||||
|
NOT_IMPLEMENTED();
|
||||||
|
}
|
||||||
|
|
||||||
|
void ACombatCharacter::ExecuteClickedEvent(UPrimitiveComponent* InTouchedComponent, FKey InButtonPressed)
|
||||||
|
{
|
||||||
|
Super::ExecuteClickedEvent(InTouchedComponent, InButtonPressed);
|
||||||
|
}
|
||||||
|
|
||||||
|
void ACombatCharacter::ExecuteBeginCursorOverEvent(UPrimitiveComponent* InTouchedComponent)
|
||||||
|
{
|
||||||
|
Super::ExecuteBeginCursorOverEvent(InTouchedComponent);
|
||||||
|
}
|
||||||
|
|
||||||
|
void ACombatCharacter::ExecuteEndCursorOverEvent(UPrimitiveComponent* InTouchedComponent)
|
||||||
|
{
|
||||||
|
Super::ExecuteEndCursorOverEvent(InTouchedComponent);
|
||||||
|
}
|
||||||
|
|
@ -0,0 +1,69 @@
|
||||||
|
// Fill out your copyright notice in the Description page of Project Settings.
|
||||||
|
|
||||||
|
#pragma once
|
||||||
|
|
||||||
|
#include "CoreMinimal.h"
|
||||||
|
#include "CoreCharacter.h"
|
||||||
|
#include "ProjectT/System/Core/Characters/CoreCharacter.h"
|
||||||
|
#include "ProjectT/Data/Gen/GenerateStructCharacterMeshSet.h"
|
||||||
|
#include "ProjectT/System/Core/Interfaces/ContentType.h"
|
||||||
|
#include "ProjectT/System/Core/Interfaces/ObjectInteractionControl.h"
|
||||||
|
#include "CombatCharacter.generated.h"
|
||||||
|
|
||||||
|
class USkeletalMesh;
|
||||||
|
class UStaticMeshComponent;
|
||||||
|
|
||||||
|
UCLASS()
|
||||||
|
class PROJECTT_API ACombatCharacter : public ACoreCharacter, public IContentType
|
||||||
|
{
|
||||||
|
GENERATED_BODY()
|
||||||
|
|
||||||
|
public:
|
||||||
|
ACombatCharacter();
|
||||||
|
virtual void PostLoad() override;
|
||||||
|
virtual void OnConstruction(const FTransform& Transform) override;
|
||||||
|
virtual EContentType GetContentType_Implementation() override;
|
||||||
|
virtual FString GetContentTypeNumber_Implementation() override;
|
||||||
|
void GetWeaponStaticComponent(TObjectPtr<UStaticMeshComponent>& OutStaticWeapon) const { OutStaticWeapon = WeaponStaticComponent; }
|
||||||
|
|
||||||
|
protected:
|
||||||
|
virtual void BeginPlay() override;
|
||||||
|
|
||||||
|
#if WITH_EDITOR
|
||||||
|
virtual void ApplyCharacterConfiguration(const FName& RowName);
|
||||||
|
virtual bool ApplyCharacterSet(const FName& RowName);
|
||||||
|
virtual void ApplyCharacterData(const FTableRowBase* RowData);
|
||||||
|
void RestoreCharacterSet();
|
||||||
|
void RestoreCharacterData();
|
||||||
|
#endif
|
||||||
|
|
||||||
|
virtual void Respawn();
|
||||||
|
|
||||||
|
virtual void ExecuteClickedEvent(UPrimitiveComponent* InTouchedComponent, FKey InButtonPressed) override;
|
||||||
|
virtual void ExecuteBeginCursorOverEvent(UPrimitiveComponent* InTouchedComponent) override;
|
||||||
|
virtual void ExecuteEndCursorOverEvent(UPrimitiveComponent* InTouchedComponent) override;
|
||||||
|
|
||||||
|
protected:
|
||||||
|
UPROPERTY(VisibleAnywhere, BlueprintReadWrite, Category = "Design|CharacterSet")
|
||||||
|
TObjectPtr<UStaticMeshComponent> AccessoryMeshComponent;
|
||||||
|
|
||||||
|
UPROPERTY(VisibleAnywhere, BlueprintReadWrite, Category = "Design|CharacterSet")
|
||||||
|
TObjectPtr<UStaticMeshComponent> WeaponStaticComponent;
|
||||||
|
|
||||||
|
UPROPERTY(VisibleAnywhere, BlueprintReadWrite, Category = "Design|CharacterSet")
|
||||||
|
TObjectPtr<USkeletalMeshComponent> WeaponDynamicComponent;
|
||||||
|
|
||||||
|
UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = "Design|CharacterSet")
|
||||||
|
FName CharacterRowName;
|
||||||
|
|
||||||
|
UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = "Design|CharacterSet", meta = (AllowPrivateAccess = "true"))
|
||||||
|
FCharacterMeshSet CurrentMeshSet;
|
||||||
|
|
||||||
|
UPROPERTY()
|
||||||
|
TObjectPtr<USkeletalMesh> DefaultBodyMesh;
|
||||||
|
|
||||||
|
private:
|
||||||
|
UPROPERTY()
|
||||||
|
FName PrevCharacterRowName;
|
||||||
|
|
||||||
|
};
|
||||||
|
|
@ -0,0 +1,37 @@
|
||||||
|
// Fill out your copyright notice in the Description page of Project Settings.
|
||||||
|
|
||||||
|
|
||||||
|
#include "CoreCharacter.h"
|
||||||
|
#include "ProjectT/ProjectT.h"
|
||||||
|
|
||||||
|
ACoreCharacter::ACoreCharacter()
|
||||||
|
{
|
||||||
|
PrimaryActorTick.bCanEverTick = true;
|
||||||
|
}
|
||||||
|
|
||||||
|
void ACoreCharacter::BeginPlay()
|
||||||
|
{
|
||||||
|
Super::BeginPlay();
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
void ACoreCharacter::ExecuteClickedEvent(UPrimitiveComponent* InTouchedComponent, FKey InButtonPressed)
|
||||||
|
{
|
||||||
|
NOT_IMPLEMENTED();
|
||||||
|
}
|
||||||
|
|
||||||
|
void ACoreCharacter::ExecuteBeginCursorOverEvent(UPrimitiveComponent* InTouchedComponent)
|
||||||
|
{
|
||||||
|
NOT_IMPLEMENTED();
|
||||||
|
}
|
||||||
|
|
||||||
|
void ACoreCharacter::ExecuteEndCursorOverEvent(UPrimitiveComponent* InTouchedComponent)
|
||||||
|
{
|
||||||
|
NOT_IMPLEMENTED();
|
||||||
|
}
|
||||||
|
|
||||||
|
void ACoreCharacter::Tick(float DeltaTime)
|
||||||
|
{
|
||||||
|
Super::Tick(DeltaTime);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
@ -0,0 +1,33 @@
|
||||||
|
// Fill out your copyright notice in the Description page of Project Settings.
|
||||||
|
|
||||||
|
#pragma once
|
||||||
|
|
||||||
|
#include "CoreMinimal.h"
|
||||||
|
#include "GameFramework/Character.h"
|
||||||
|
#include "CoreCharacter.generated.h"
|
||||||
|
|
||||||
|
UCLASS()
|
||||||
|
class PROJECTT_API ACoreCharacter : public ACharacter
|
||||||
|
{
|
||||||
|
GENERATED_BODY()
|
||||||
|
|
||||||
|
public:
|
||||||
|
ACoreCharacter();
|
||||||
|
|
||||||
|
protected:
|
||||||
|
virtual void BeginPlay() override;
|
||||||
|
|
||||||
|
UFUNCTION()
|
||||||
|
virtual void ExecuteClickedEvent(UPrimitiveComponent* InTouchedComponent, FKey InButtonPressed);
|
||||||
|
|
||||||
|
UFUNCTION()
|
||||||
|
virtual void ExecuteBeginCursorOverEvent(UPrimitiveComponent* InTouchedComponent);
|
||||||
|
|
||||||
|
UFUNCTION()
|
||||||
|
virtual void ExecuteEndCursorOverEvent(UPrimitiveComponent* InTouchedComponent);
|
||||||
|
|
||||||
|
public:
|
||||||
|
virtual void Tick(float DeltaTime) override;
|
||||||
|
|
||||||
|
|
||||||
|
};
|
||||||
|
|
@ -0,0 +1,22 @@
|
||||||
|
// Fill out your copyright notice in the Description page of Project Settings.
|
||||||
|
|
||||||
|
|
||||||
|
#include "BlackboardKeyLibrary.h"
|
||||||
|
|
||||||
|
namespace NpcBaseKeys
|
||||||
|
{
|
||||||
|
const FName TargetActor = FName("TargetActor");
|
||||||
|
const FName TargetLocation = FName("TargetLocation");
|
||||||
|
const FName TargetDir = FName("TargetDir");
|
||||||
|
const FName ReturnLocation = FName("ReturnLocation");
|
||||||
|
const FName CurrentState = FName("CurrentState");
|
||||||
|
const FName bCanAttack = FName("bCanAttack");
|
||||||
|
const FName bCanRotateWhileAttack = FName("bCanRotateWhileAttack");
|
||||||
|
const FName CurrentDoubtState = FName("CurrentDoubtState");
|
||||||
|
|
||||||
|
namespace PatrolKeys
|
||||||
|
{
|
||||||
|
FName bMoveReverse = FName("bMoveReverse");
|
||||||
|
FName PatrolType = FName("PatrolType");
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
@ -0,0 +1,63 @@
|
||||||
|
// Fill out your copyright notice in the Description page of Project Settings.
|
||||||
|
|
||||||
|
#pragma once
|
||||||
|
|
||||||
|
#include "CoreMinimal.h"
|
||||||
|
#include "Kismet/BlueprintFunctionLibrary.h"
|
||||||
|
#include "BlackboardKeyLibrary.generated.h"
|
||||||
|
|
||||||
|
namespace NpcBaseKeys
|
||||||
|
{
|
||||||
|
extern const FName TargetActor;
|
||||||
|
extern const FName TargetLocation;
|
||||||
|
extern const FName TargetDir;
|
||||||
|
extern const FName ReturnLocation;
|
||||||
|
extern const FName CurrentState;
|
||||||
|
extern const FName bCanAttack;
|
||||||
|
extern const FName bCanRotateWhileAttack;
|
||||||
|
extern const FName CurrentDoubtState;
|
||||||
|
|
||||||
|
namespace PatrolKeys
|
||||||
|
{
|
||||||
|
extern FName bMoveReverse;
|
||||||
|
extern FName PatrolType;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
UCLASS()
|
||||||
|
class PROJECTT_API UBlackboardKeyLibrary : public UBlueprintFunctionLibrary
|
||||||
|
{
|
||||||
|
GENERATED_BODY()
|
||||||
|
|
||||||
|
public:
|
||||||
|
UFUNCTION(BlueprintPure, meta = (ToolTip = "TargetActor"))
|
||||||
|
static FName GetTargetActorKey() { return NpcBaseKeys::TargetActor; }
|
||||||
|
|
||||||
|
UFUNCTION(BlueprintPure, meta = (ToolTip = "TargetLocation"))
|
||||||
|
static FName GetTargetLocationKey() { return NpcBaseKeys::TargetLocation; }
|
||||||
|
|
||||||
|
UFUNCTION(BlueprintPure, meta = (ToolTip = "TargetDir"))
|
||||||
|
static FName GetTargetDirKey() { return NpcBaseKeys::TargetDir; }
|
||||||
|
|
||||||
|
UFUNCTION(BlueprintPure, meta = (ToolTip = "ReturnLocation"))
|
||||||
|
static FName GetReturnLocationKey() { return NpcBaseKeys::ReturnLocation; }
|
||||||
|
|
||||||
|
UFUNCTION(BlueprintPure, meta = (ToolTip = "NpcState"))
|
||||||
|
static FName GetCurrentStateKey() { return NpcBaseKeys::CurrentState; }
|
||||||
|
|
||||||
|
UFUNCTION(BlueprintPure, meta = (ToolTip = "CanAttack"))
|
||||||
|
static FName GetCanAttack() { return NpcBaseKeys::bCanAttack; }
|
||||||
|
|
||||||
|
UFUNCTION(BlueprintPure, meta = (ToolTip = "CanRotateWhileAttack"))
|
||||||
|
static FName GetCanRotateWhileAttack() { return NpcBaseKeys::bCanRotateWhileAttack; }
|
||||||
|
|
||||||
|
UFUNCTION(BlueprintPure, meta = (ToolTip = "CurrentDoubtState"))
|
||||||
|
static FName GetCurrentDoubtState() { return NpcBaseKeys::CurrentDoubtState; }
|
||||||
|
|
||||||
|
UFUNCTION(BlueprintPure, meta = (ToolTip = "bMoveReverse"))
|
||||||
|
static FName GetMoveReverseKey() { return NpcBaseKeys::PatrolKeys::bMoveReverse; }
|
||||||
|
|
||||||
|
UFUNCTION(BlueprintPure, meta = (ToolTip = "PatrolType"))
|
||||||
|
static FName GetPatrolTypeKey() { return NpcBaseKeys::PatrolKeys::PatrolType; }
|
||||||
|
|
||||||
|
};
|
||||||
|
|
@ -0,0 +1,154 @@
|
||||||
|
// Fill out your copyright notice in the Description page of Project Settings.
|
||||||
|
|
||||||
|
|
||||||
|
#include "AIControllerBase.h"
|
||||||
|
|
||||||
|
#include "BrainComponent.h"
|
||||||
|
#include "BehaviorTree/BlackboardComponent.h"
|
||||||
|
#include "BehaviorTree/BlackboardData.h"
|
||||||
|
#include "ProjectT/ProjectT.h"
|
||||||
|
#include "ProjectT/System/Core/Interfaces/AISettings.h"
|
||||||
|
#include "ProjectT/Data/Npc/NpcDataModel.h"
|
||||||
|
#include "ProjectT/System/Core/Characters/NPC/AI/Blackboard/BlackboardKeyLibrary.h"
|
||||||
|
|
||||||
|
AAIControllerBase::AAIControllerBase(const FObjectInitializer& ObjectInitializer) :
|
||||||
|
Super(ObjectInitializer),
|
||||||
|
bCanDetect(true)
|
||||||
|
{
|
||||||
|
}
|
||||||
|
|
||||||
|
void AAIControllerBase::BeginPlay()
|
||||||
|
{
|
||||||
|
Super::BeginPlay();
|
||||||
|
}
|
||||||
|
|
||||||
|
class UBlackboardComponent* AAIControllerBase::GetCheckedBlackboardComponent()
|
||||||
|
{
|
||||||
|
UBlackboardComponent* BBC = GetBlackboardComponent();
|
||||||
|
NMT_CHECKF(BBC)
|
||||||
|
return BBC;
|
||||||
|
}
|
||||||
|
|
||||||
|
void AAIControllerBase::PostInitializeComponents()
|
||||||
|
{
|
||||||
|
Super::PostInitializeComponents();
|
||||||
|
}
|
||||||
|
|
||||||
|
void AAIControllerBase::OnPossess(APawn* InPawn)
|
||||||
|
{
|
||||||
|
Super::OnPossess(InPawn);
|
||||||
|
|
||||||
|
SetGenericTeamId(FGenericTeamId(0));
|
||||||
|
}
|
||||||
|
|
||||||
|
void AAIControllerBase::Tick(float DeltaTime)
|
||||||
|
{
|
||||||
|
Super::Tick(DeltaTime);
|
||||||
|
}
|
||||||
|
|
||||||
|
void AAIControllerBase::EndPlay(const EEndPlayReason::Type EndPlayReason)
|
||||||
|
{
|
||||||
|
Super::EndPlay(EndPlayReason);
|
||||||
|
|
||||||
|
OnDetectTarget.Clear();
|
||||||
|
OnForgetTarget.Clear();
|
||||||
|
}
|
||||||
|
|
||||||
|
void AAIControllerBase::UpdateTargetInfo(AActor* InTarget)
|
||||||
|
{
|
||||||
|
GetCheckedBlackboardComponent()->SetValueAsObject(UBlackboardKeyLibrary::GetTargetActorKey(), InTarget);
|
||||||
|
|
||||||
|
if(InTarget != nullptr)
|
||||||
|
{
|
||||||
|
UpdateTargetLocation(InTarget->GetActorLocation());
|
||||||
|
UpdateTargetDirection(InTarget);
|
||||||
|
|
||||||
|
OnDetectTarget.Broadcast();
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
OnForgetTarget.Broadcast();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
void AAIControllerBase::UpdateTargetLocation(const FVector& InLocation)
|
||||||
|
{
|
||||||
|
GetCheckedBlackboardComponent()->SetValueAsVector(UBlackboardKeyLibrary::GetTargetLocationKey(), InLocation);
|
||||||
|
}
|
||||||
|
|
||||||
|
void AAIControllerBase::UpdateTargetDirection(const AActor* InTarget)
|
||||||
|
{
|
||||||
|
FVector Dir = InTarget->GetActorLocation() - GetPawn()->GetActorLocation();
|
||||||
|
Dir.Normalize();
|
||||||
|
GetCheckedBlackboardComponent()->SetValueAsVector(UBlackboardKeyLibrary::GetTargetDirKey(), Dir);
|
||||||
|
}
|
||||||
|
|
||||||
|
void AAIControllerBase::UpdateTargetDirection(const FVector& InTargetDirection)
|
||||||
|
{
|
||||||
|
GetCheckedBlackboardComponent()->SetValueAsVector(UBlackboardKeyLibrary::GetTargetDirKey(), InTargetDirection);
|
||||||
|
}
|
||||||
|
|
||||||
|
void AAIControllerBase::ChangeNpcStateKey(const ENpcState InState)
|
||||||
|
{
|
||||||
|
GetCheckedBlackboardComponent()->SetValueAsEnum(UBlackboardKeyLibrary::GetCurrentStateKey(), static_cast<uint8>(InState));
|
||||||
|
}
|
||||||
|
|
||||||
|
void AAIControllerBase::StartAI()
|
||||||
|
{
|
||||||
|
NMT_CHECKF(BrainComponent)
|
||||||
|
BrainComponent->StartLogic();
|
||||||
|
}
|
||||||
|
|
||||||
|
void AAIControllerBase::StopAI(const FString& Reason, const bool bControlPerception)
|
||||||
|
{
|
||||||
|
NMT_CHECKF(BrainComponent)
|
||||||
|
BrainComponent->StopLogic(Reason);
|
||||||
|
}
|
||||||
|
|
||||||
|
AActor* AAIControllerBase::GetTargetActor() const
|
||||||
|
{
|
||||||
|
return Cast<AActor>(GetBlackboardComponent()->GetValueAsObject(UBlackboardKeyLibrary::GetTargetActorKey()));
|
||||||
|
}
|
||||||
|
|
||||||
|
void AAIControllerBase::ActivateBehaviorTree(APawn* InPawn)
|
||||||
|
{
|
||||||
|
if(InPawn->GetClass()->ImplementsInterface(UAISettings::StaticClass()))
|
||||||
|
{
|
||||||
|
UBlackboardData* BB = IAISettings::Execute_GetBlackboardData(InPawn);
|
||||||
|
BehaviorTree = IAISettings::Execute_GetBehaviorTree(InPawn);
|
||||||
|
|
||||||
|
if(!NMT_ENSURE(BB && BehaviorTree)) return;
|
||||||
|
|
||||||
|
UBlackboardComponent* BlackboardComponent = Blackboard.Get();
|
||||||
|
|
||||||
|
if(UseBlackboard(BB, BlackboardComponent))
|
||||||
|
{
|
||||||
|
RunBehaviorTree(BehaviorTree);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
void AAIControllerBase::UpdateReturnLocation(const FVector& InLocation)
|
||||||
|
{
|
||||||
|
GetCheckedBlackboardComponent()->SetValueAsVector(UBlackboardKeyLibrary::GetReturnLocationKey(), InLocation);
|
||||||
|
}
|
||||||
|
|
||||||
|
void AAIControllerBase::UpdateNextPatrolType(const EPatrolType InPatrolType)
|
||||||
|
{
|
||||||
|
GetCheckedBlackboardComponent()->SetValueAsEnum(UBlackboardKeyLibrary::GetPatrolTypeKey(), static_cast<uint8>(InPatrolType));
|
||||||
|
}
|
||||||
|
|
||||||
|
void AAIControllerBase::UpdateDoubtState(const EDoubtState InDoubtState)
|
||||||
|
{
|
||||||
|
GetCheckedBlackboardComponent()->SetValueAsEnum(UBlackboardKeyLibrary::GetCurrentDoubtState(), static_cast<uint8>(InDoubtState));
|
||||||
|
}
|
||||||
|
|
||||||
|
void AAIControllerBase::SetEnableAttack(const bool InbEnable)
|
||||||
|
{
|
||||||
|
GetCheckedBlackboardComponent()->SetValueAsBool(UBlackboardKeyLibrary::GetCanAttack(), InbEnable);
|
||||||
|
}
|
||||||
|
|
||||||
|
void AAIControllerBase::SetCanRotateWhileAttack(const bool InbEnable)
|
||||||
|
{
|
||||||
|
GetCheckedBlackboardComponent()->SetValueAsBool(UBlackboardKeyLibrary::GetCanRotateWhileAttack(), InbEnable);
|
||||||
|
}
|
||||||
|
|
@ -0,0 +1,76 @@
|
||||||
|
// Fill out your copyright notice in the Description page of Project Settings.
|
||||||
|
|
||||||
|
#pragma once
|
||||||
|
|
||||||
|
#include "CoreMinimal.h"
|
||||||
|
#include "Runtime/AIModule/Classes/AIController.h"
|
||||||
|
#include "ProjectT/Data/Npc/NpcDataModel.h"
|
||||||
|
#include "AIControllerBase.generated.h"
|
||||||
|
|
||||||
|
|
||||||
|
DECLARE_DYNAMIC_MULTICAST_DELEGATE(FOnDetectTarget);
|
||||||
|
DECLARE_DYNAMIC_MULTICAST_DELEGATE(FOnForgetTarget);
|
||||||
|
|
||||||
|
enum class EEffectSubTypes : uint8;
|
||||||
|
|
||||||
|
UCLASS()
|
||||||
|
class PROJECTT_API AAIControllerBase : public AAIController
|
||||||
|
{
|
||||||
|
GENERATED_BODY()
|
||||||
|
|
||||||
|
public:
|
||||||
|
AAIControllerBase(const FObjectInitializer& ObjectInitializer = FObjectInitializer::Get());
|
||||||
|
|
||||||
|
virtual void PostInitializeComponents() override;
|
||||||
|
virtual void OnPossess(APawn* InPawn) override;
|
||||||
|
virtual void Tick(float DeltaTime) override;
|
||||||
|
virtual void EndPlay(const EEndPlayReason::Type EndPlayReason) override;
|
||||||
|
|
||||||
|
UFUNCTION(BlueprintCallable)
|
||||||
|
void UpdateTargetInfo(AActor* InTarget);
|
||||||
|
|
||||||
|
UFUNCTION(BlueprintCallable)
|
||||||
|
void ChangeNpcStateKey(const ENpcState InState);
|
||||||
|
|
||||||
|
UFUNCTION(BlueprintCallable)
|
||||||
|
virtual void StartAI();
|
||||||
|
|
||||||
|
UFUNCTION(BlueprintCallable)
|
||||||
|
virtual void StopAI(const FString& Reason, const bool bControlPerception = true);
|
||||||
|
|
||||||
|
class AActor* GetTargetActor() const;
|
||||||
|
FORCEINLINE void SetCanDetect(bool InbCanDetect) { bCanDetect = InbCanDetect; }
|
||||||
|
FORCEINLINE bool GetCanDetect() const { return bCanDetect; }
|
||||||
|
virtual void ActivateBehaviorTree(APawn* InPawn);
|
||||||
|
void UpdateTargetLocation(const FVector& InLocation);
|
||||||
|
void UpdateTargetDirection(const AActor* InTarget);
|
||||||
|
void UpdateTargetDirection(const FVector& InTargetDirection);
|
||||||
|
void UpdateReturnLocation(const FVector& InLocation);
|
||||||
|
void UpdateNextPatrolType(const EPatrolType InPatrolType);
|
||||||
|
void UpdateDoubtState(const EDoubtState InDoubtState);
|
||||||
|
void SetEnableAttack(const bool InbEnable);
|
||||||
|
void SetCanRotateWhileAttack(const bool InbEnable);
|
||||||
|
|
||||||
|
protected:
|
||||||
|
virtual void BeginPlay() override;
|
||||||
|
class UBlackboardComponent* GetCheckedBlackboardComponent();
|
||||||
|
|
||||||
|
protected:
|
||||||
|
UPROPERTY(BlueprintAssignable)
|
||||||
|
FOnDetectTarget OnDetectTarget;
|
||||||
|
|
||||||
|
UPROPERTY(BlueprintAssignable)
|
||||||
|
FOnForgetTarget OnForgetTarget;
|
||||||
|
|
||||||
|
UPROPERTY()
|
||||||
|
TObjectPtr<class UCrowdFollowingComponent> CrowdFollowingComponent;
|
||||||
|
|
||||||
|
uint8 bCanDetect : 1;
|
||||||
|
|
||||||
|
private:
|
||||||
|
|
||||||
|
UPROPERTY()
|
||||||
|
TObjectPtr<class UBehaviorTree> BehaviorTree;
|
||||||
|
|
||||||
|
};
|
||||||
|
|
||||||
|
|
@ -0,0 +1,44 @@
|
||||||
|
// Fill out your copyright notice in the Description page of Project Settings.
|
||||||
|
|
||||||
|
|
||||||
|
#include "AIHearingController.h"
|
||||||
|
#include "Perception/AISenseConfig_Hearing.h"
|
||||||
|
#include "ProjectT/ProjectT.h"
|
||||||
|
#include "ProjectT/System/Core/Interfaces/AISettings.h"
|
||||||
|
|
||||||
|
|
||||||
|
AAIHearingController::AAIHearingController(const FObjectInitializer& ObjectInitializer) :
|
||||||
|
Super(ObjectInitializer)
|
||||||
|
{
|
||||||
|
PrimaryActorTick.bCanEverTick = true;
|
||||||
|
|
||||||
|
HearingConfig = AddHearingConfig();
|
||||||
|
}
|
||||||
|
|
||||||
|
void AAIHearingController::BeginPlay()
|
||||||
|
{
|
||||||
|
Super::BeginPlay();
|
||||||
|
}
|
||||||
|
|
||||||
|
void AAIHearingController::OnPossess(APawn* InPawn)
|
||||||
|
{
|
||||||
|
Super::OnPossess(InPawn);
|
||||||
|
|
||||||
|
NMT_CHECKF(HearingConfig);
|
||||||
|
NMT_CHECKF(GetPawn());
|
||||||
|
|
||||||
|
if(GetPawn()->GetClass()->ImplementsInterface(UAISettings::StaticClass()))
|
||||||
|
{
|
||||||
|
FHearingInfo HearingInfo = IAISettings::Execute_GetHearingInfo(InPawn);
|
||||||
|
|
||||||
|
HearingConfig->HearingRange = HearingInfo.HearingRange;
|
||||||
|
HearingConfig->SetMaxAge(HearingInfo.HearingMaxAge);
|
||||||
|
}
|
||||||
|
|
||||||
|
UpdatePerceptionSystem();
|
||||||
|
}
|
||||||
|
|
||||||
|
void AAIHearingController::Tick(float DeltaTime)
|
||||||
|
{
|
||||||
|
Super::Tick(DeltaTime);
|
||||||
|
}
|
||||||
|
|
@ -0,0 +1,27 @@
|
||||||
|
// Fill out your copyright notice in the Description page of Project Settings.
|
||||||
|
|
||||||
|
#pragma once
|
||||||
|
|
||||||
|
#include "CoreMinimal.h"
|
||||||
|
#include "AIPerceptionController.h"
|
||||||
|
#include "AIHearingController.generated.h"
|
||||||
|
|
||||||
|
UCLASS()
|
||||||
|
class PROJECTT_API AAIHearingController : public AAIPerceptionController
|
||||||
|
{
|
||||||
|
GENERATED_BODY()
|
||||||
|
|
||||||
|
public:
|
||||||
|
AAIHearingController(const FObjectInitializer& ObjectInitializer = FObjectInitializer::Get());
|
||||||
|
|
||||||
|
protected:
|
||||||
|
virtual void BeginPlay() override;
|
||||||
|
|
||||||
|
public:
|
||||||
|
virtual void OnPossess(APawn* InPawn) override;
|
||||||
|
virtual void Tick(float DeltaTime) override;
|
||||||
|
|
||||||
|
public:
|
||||||
|
UPROPERTY(EditAnywhere, Category = "AIPerception")
|
||||||
|
class UAISenseConfig_Hearing* HearingConfig;
|
||||||
|
};
|
||||||
|
|
@ -0,0 +1,185 @@
|
||||||
|
// Fill out your copyright notice in the Description page of Project Settings.
|
||||||
|
|
||||||
|
|
||||||
|
#include "AIPerceptionController.h"
|
||||||
|
|
||||||
|
#include "BehaviorTree/BlackboardComponent.h"
|
||||||
|
#include "Navigation/CrowdFollowingComponent.h"
|
||||||
|
#include "Perception/AIPerceptionComponent.h"
|
||||||
|
#include "Perception/AISenseConfig_Hearing.h"
|
||||||
|
#include "Perception/AISenseConfig_Sight.h"
|
||||||
|
#include "Perception/AISense_Sight.h"
|
||||||
|
#include "ProjectT/System/Core/Characters/NPC/AI/Blackboard/BlackboardKeyLibrary.h"
|
||||||
|
#include "ProjectT/System/Core/Characters/Player/CorePlayerCharacter.h"
|
||||||
|
#include "ProjectT/System/Core/Interfaces/AISettings.h"
|
||||||
|
#include "ProjectT/System/SinglePlay/Characters/NPC/SPNpcAgent.h"
|
||||||
|
|
||||||
|
|
||||||
|
AAIPerceptionController::AAIPerceptionController(const FObjectInitializer& ObjectInitializer) :
|
||||||
|
Super(ObjectInitializer.SetDefaultSubobjectClass<UCrowdFollowingComponent>(TEXT("PathFollowingComponent")))
|
||||||
|
{
|
||||||
|
SetPerceptionComponent(*CreateOptionalDefaultSubobject<UAIPerceptionComponent>(TEXT("AIPerceptionComponent")));
|
||||||
|
}
|
||||||
|
|
||||||
|
void AAIPerceptionController::BeginPlay()
|
||||||
|
{
|
||||||
|
Super::BeginPlay();
|
||||||
|
|
||||||
|
if(ASPNpcAgent* NpcAgent = Cast<ASPNpcAgent>(GetPawn()))
|
||||||
|
{
|
||||||
|
CrowdFollowingComponent = Cast<UCrowdFollowingComponent>(GetPathFollowingComponent());
|
||||||
|
NMT_CHECKF(CrowdFollowingComponent);
|
||||||
|
SetupCrowdSettings(NpcAgent->CrowdSettingsInfo);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
void AAIPerceptionController::SetupCrowdSettings(const FCrowdSettingsInfo& InCrowdSettings) const
|
||||||
|
{
|
||||||
|
if(!NMT_ENSURE(CrowdFollowingComponent))
|
||||||
|
return;
|
||||||
|
|
||||||
|
if(InCrowdSettings.bUseCrowdSeparation)
|
||||||
|
{
|
||||||
|
CrowdFollowingComponent->SetCrowdSeparation(InCrowdSettings.bUseCrowdSeparation);
|
||||||
|
CrowdFollowingComponent->SetCrowdSeparationWeight(InCrowdSettings.SeparationWeight);
|
||||||
|
CrowdFollowingComponent->SetCrowdAvoidanceRangeMultiplier(InCrowdSettings.AvoidanceRangeMultiplier);
|
||||||
|
CrowdFollowingComponent->SetCrowdRotateToVelocity(false);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
void AAIPerceptionController::OnPossess(APawn* InPawn)
|
||||||
|
{
|
||||||
|
Super::OnPossess(InPawn);
|
||||||
|
}
|
||||||
|
|
||||||
|
void AAIPerceptionController::Tick(float DeltaTime)
|
||||||
|
{
|
||||||
|
Super::Tick(DeltaTime);
|
||||||
|
}
|
||||||
|
|
||||||
|
void AAIPerceptionController::StartAI()
|
||||||
|
{
|
||||||
|
Super::StartAI();
|
||||||
|
SetPerceptionActive(true);
|
||||||
|
}
|
||||||
|
|
||||||
|
void AAIPerceptionController::StopAI(const FString& InReason, const bool InbControlPerception)
|
||||||
|
{
|
||||||
|
if(InbControlPerception)
|
||||||
|
SetPerceptionActive(false);
|
||||||
|
|
||||||
|
Super::StopAI(InReason, InbControlPerception);
|
||||||
|
}
|
||||||
|
|
||||||
|
void AAIPerceptionController::ActivateBehaviorTree(APawn* InPawn)
|
||||||
|
{
|
||||||
|
Super::ActivateBehaviorTree(InPawn);
|
||||||
|
|
||||||
|
if(InPawn->GetClass()->ImplementsInterface(UAISettings::StaticClass()))
|
||||||
|
{
|
||||||
|
bool bUseSense = IAISettings::Execute_GetUseSight(InPawn) || IAISettings::Execute_GetUseHearing(InPawn);
|
||||||
|
if(bUseSense)
|
||||||
|
SetPerceptionActive(true);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
void AAIPerceptionController::UpdatedTargetPerception(AActor* InTarget, FAIStimulus InStimulus)
|
||||||
|
{
|
||||||
|
if(!NMT_ENSURE(GetPawn())) return;
|
||||||
|
|
||||||
|
ACorePlayerCharacter* Player = Cast<ACorePlayerCharacter>(InTarget);
|
||||||
|
if(GetPawn()->GetClass()->ImplementsInterface(UAISettings::StaticClass()) && Player)
|
||||||
|
{
|
||||||
|
if(InStimulus.WasSuccessfullySensed())
|
||||||
|
{
|
||||||
|
bool PlayerUndetect;
|
||||||
|
Player->GetUnDetectState(PlayerUndetect);
|
||||||
|
if(PlayerUndetect || bUnDetect)
|
||||||
|
return;
|
||||||
|
|
||||||
|
TSubclassOf<UAISense> Sense = UAIPerceptionSystem::GetSenseClassForStimulus(GetWorld(), InStimulus);
|
||||||
|
|
||||||
|
if(IAISettings::Execute_GetUseSight(GetPawn()) && Sense == UAISense_Sight::StaticClass())
|
||||||
|
{
|
||||||
|
IAISettings::Execute_DetectTargetBySight(GetPawn(), InTarget, InStimulus);
|
||||||
|
}
|
||||||
|
|
||||||
|
UpdateTargetInfo(InTarget);
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
if(GetCheckedBlackboardComponent()->GetValueAsObject(UBlackboardKeyLibrary::GetTargetActorKey()) != nullptr)
|
||||||
|
{
|
||||||
|
IAISettings::Execute_ForgetTarget(GetPawn(), InTarget);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
void AAIPerceptionController::SetPerceptionActive(const bool InbEnable)
|
||||||
|
{
|
||||||
|
NMT_CHECKF(PerceptionComponent)
|
||||||
|
if(InbEnable)
|
||||||
|
{
|
||||||
|
PerceptionComponent->OnTargetPerceptionUpdated.AddUniqueDynamic(this, &AAIPerceptionController::UpdatedTargetPerception);
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
GetCheckedBlackboardComponent()->SetValueAsObject(UBlackboardKeyLibrary::GetTargetActorKey(), nullptr);
|
||||||
|
PerceptionComponent->OnTargetPerceptionUpdated.Clear();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
void AAIPerceptionController::UpdatePerceptionSystem() const
|
||||||
|
{
|
||||||
|
NMT_CHECKF(PerceptionComponent)
|
||||||
|
PerceptionComponent->RequestStimuliListenerUpdate();
|
||||||
|
PerceptionComponent->SetCanEverAffectNavigation(true);
|
||||||
|
}
|
||||||
|
|
||||||
|
void AAIPerceptionController::ForceUpdatePerception() const
|
||||||
|
{
|
||||||
|
NMT_CHECKF(PerceptionComponent)
|
||||||
|
if(PerceptionComponent->OnTargetPerceptionUpdated.IsBound())
|
||||||
|
{
|
||||||
|
TArray<AActor*> LocPerceivedActors;
|
||||||
|
PerceptionComponent->GetCurrentlyPerceivedActors(UAISense_Sight::StaticClass(), LocPerceivedActors);
|
||||||
|
if(LocPerceivedActors.Num() > 0)
|
||||||
|
{
|
||||||
|
for(AActor* LocPerceiveActor : LocPerceivedActors)
|
||||||
|
{
|
||||||
|
FActorPerceptionBlueprintInfo LocPerceptionInfo;
|
||||||
|
PerceptionComponent->GetActorsPerception(LocPerceiveActor, LocPerceptionInfo);
|
||||||
|
PerceptionComponent->OnTargetPerceptionUpdated.Broadcast(LocPerceiveActor, LocPerceptionInfo.LastSensedStimuli[0]);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
class UAISenseConfig_Sight* AAIPerceptionController::AddSightConfig()
|
||||||
|
{
|
||||||
|
UAISenseConfig_Sight* SightConfig = CreateOptionalDefaultSubobject<UAISenseConfig_Sight>(TEXT("SightConfig"));
|
||||||
|
SightConfig->DetectionByAffiliation.bDetectEnemies = true;
|
||||||
|
SightConfig->DetectionByAffiliation.bDetectNeutrals = false;
|
||||||
|
SightConfig->DetectionByAffiliation.bDetectFriendlies = false;
|
||||||
|
|
||||||
|
NMT_CHECKF(PerceptionComponent)
|
||||||
|
PerceptionComponent->SetDominantSense(*SightConfig->GetSenseImplementation());
|
||||||
|
PerceptionComponent->ConfigureSense(*SightConfig);
|
||||||
|
|
||||||
|
return SightConfig;
|
||||||
|
}
|
||||||
|
|
||||||
|
class UAISenseConfig_Hearing* AAIPerceptionController::AddHearingConfig()
|
||||||
|
{
|
||||||
|
UAISenseConfig_Hearing* HearingConfig = CreateOptionalDefaultSubobject<UAISenseConfig_Hearing>(TEXT("HearingConfig"));
|
||||||
|
HearingConfig->DetectionByAffiliation.bDetectEnemies = true;
|
||||||
|
HearingConfig->DetectionByAffiliation.bDetectNeutrals = false;
|
||||||
|
HearingConfig->DetectionByAffiliation.bDetectFriendlies = false;
|
||||||
|
|
||||||
|
NMT_CHECKF(PerceptionComponent)
|
||||||
|
PerceptionComponent->SetDominantSense(*HearingConfig->GetSenseImplementation());
|
||||||
|
PerceptionComponent->ConfigureSense(*HearingConfig);
|
||||||
|
|
||||||
|
return HearingConfig;
|
||||||
|
}
|
||||||
|
|
@ -0,0 +1,39 @@
|
||||||
|
// Fill out your copyright notice in the Description page of Project Settings.
|
||||||
|
|
||||||
|
#pragma once
|
||||||
|
|
||||||
|
#include "CoreMinimal.h"
|
||||||
|
#include "AIControllerBase.h"
|
||||||
|
#include "AIPerceptionController.generated.h"
|
||||||
|
|
||||||
|
UCLASS()
|
||||||
|
class PROJECTT_API AAIPerceptionController : public AAIControllerBase
|
||||||
|
{
|
||||||
|
GENERATED_BODY()
|
||||||
|
|
||||||
|
public:
|
||||||
|
AAIPerceptionController(const FObjectInitializer& ObjectInitializer = FObjectInitializer::Get());
|
||||||
|
|
||||||
|
virtual void OnPossess(APawn* InPawn) override;
|
||||||
|
virtual void Tick(float DeltaTime) override;
|
||||||
|
virtual void StartAI() override;
|
||||||
|
virtual void StopAI(const FString& InReason, const bool InbControlPerception = true) override;
|
||||||
|
virtual void ActivateBehaviorTree(APawn* InPawn) override;
|
||||||
|
|
||||||
|
void UpdatePerceptionSystem() const;
|
||||||
|
void ForceUpdatePerception() const;
|
||||||
|
void SetPerceptionActive(const bool InbEnable);
|
||||||
|
FORCEINLINE void SetUnDetect(const bool InbUnDetect) { bUnDetect = InbUnDetect; }
|
||||||
|
|
||||||
|
protected:
|
||||||
|
virtual void BeginPlay() override;
|
||||||
|
void SetupCrowdSettings(const FCrowdSettingsInfo& InCrowdSettings) const;
|
||||||
|
|
||||||
|
UFUNCTION()
|
||||||
|
void UpdatedTargetPerception(AActor* InTarget, FAIStimulus InStimulus);
|
||||||
|
|
||||||
|
class UAISenseConfig_Sight* AddSightConfig();
|
||||||
|
class UAISenseConfig_Hearing* AddHearingConfig();
|
||||||
|
|
||||||
|
uint8 bUnDetect;
|
||||||
|
};
|
||||||
|
|
@ -0,0 +1,47 @@
|
||||||
|
// Fill out your copyright notice in the Description page of Project Settings.
|
||||||
|
|
||||||
|
|
||||||
|
#include "AISightController.h"
|
||||||
|
|
||||||
|
#include "Perception/AISenseConfig_Sight.h"
|
||||||
|
#include "ProjectT/ProjectT.h"
|
||||||
|
#include "ProjectT/System/Core/Interfaces/AISettings.h"
|
||||||
|
|
||||||
|
|
||||||
|
AAISightController::AAISightController(const FObjectInitializer& ObjectInitializer) :
|
||||||
|
Super(ObjectInitializer)
|
||||||
|
{
|
||||||
|
PrimaryActorTick.bCanEverTick = true;
|
||||||
|
|
||||||
|
SightConfig = AddSightConfig();
|
||||||
|
}
|
||||||
|
|
||||||
|
void AAISightController::BeginPlay()
|
||||||
|
{
|
||||||
|
Super::BeginPlay();
|
||||||
|
}
|
||||||
|
|
||||||
|
void AAISightController::OnPossess(APawn* InPawn)
|
||||||
|
{
|
||||||
|
Super::OnPossess(InPawn);
|
||||||
|
|
||||||
|
NMT_CHECKF(SightConfig);
|
||||||
|
NMT_CHECKF(GetPawn());
|
||||||
|
|
||||||
|
if(GetPawn()->GetClass()->ImplementsInterface(UAISettings::StaticClass()))
|
||||||
|
{
|
||||||
|
FSightInfo SightInfo = IAISettings::Execute_GetSightInfo(GetPawn());
|
||||||
|
|
||||||
|
SightConfig->SightRadius = SightInfo.SightRange;
|
||||||
|
SightConfig->LoseSightRadius = SightInfo.LoseSightRange;
|
||||||
|
SightConfig->PeripheralVisionAngleDegrees = SightInfo.SightAngle / 2.f;
|
||||||
|
SightConfig->SetMaxAge(SightInfo.SightMaxAge);
|
||||||
|
}
|
||||||
|
|
||||||
|
UpdatePerceptionSystem();
|
||||||
|
}
|
||||||
|
|
||||||
|
void AAISightController::Tick(float DeltaTime)
|
||||||
|
{
|
||||||
|
Super::Tick(DeltaTime);
|
||||||
|
}
|
||||||
|
|
@ -0,0 +1,28 @@
|
||||||
|
// Fill out your copyright notice in the Description page of Project Settings.
|
||||||
|
|
||||||
|
#pragma once
|
||||||
|
|
||||||
|
#include "CoreMinimal.h"
|
||||||
|
#include "AIPerceptionController.h"
|
||||||
|
#include "AISightController.generated.h"
|
||||||
|
|
||||||
|
UCLASS()
|
||||||
|
class PROJECTT_API AAISightController : public AAIPerceptionController
|
||||||
|
{
|
||||||
|
GENERATED_BODY()
|
||||||
|
|
||||||
|
public:
|
||||||
|
AAISightController(const FObjectInitializer& ObjectInitializer = FObjectInitializer::Get());
|
||||||
|
|
||||||
|
protected:
|
||||||
|
virtual void BeginPlay() override;
|
||||||
|
|
||||||
|
public:
|
||||||
|
virtual void OnPossess(APawn* InPawn) override;
|
||||||
|
virtual void Tick(float DeltaTime) override;
|
||||||
|
|
||||||
|
public:
|
||||||
|
UPROPERTY(EditAnywhere, Category = "AIPerception")
|
||||||
|
class UAISenseConfig_Sight* SightConfig;
|
||||||
|
};
|
||||||
|
|
||||||
|
|
@ -0,0 +1,53 @@
|
||||||
|
// Fill out your copyright notice in the Description page of Project Settings.
|
||||||
|
|
||||||
|
|
||||||
|
#include "AISightHearingController.h"
|
||||||
|
|
||||||
|
#include "Perception/AISenseConfig_Hearing.h"
|
||||||
|
#include "Perception/AISenseConfig_Sight.h"
|
||||||
|
#include "ProjectT/ProjectT.h"
|
||||||
|
#include "ProjectT/System/Core/Interfaces/AISettings.h"
|
||||||
|
|
||||||
|
AAISightHearingController::AAISightHearingController(const FObjectInitializer& ObjectInitializer) :
|
||||||
|
Super(ObjectInitializer)
|
||||||
|
{
|
||||||
|
PrimaryActorTick.bCanEverTick = true;
|
||||||
|
|
||||||
|
HearingConfig = AddHearingConfig();
|
||||||
|
SightConfig = AddSightConfig();
|
||||||
|
}
|
||||||
|
|
||||||
|
void AAISightHearingController::BeginPlay()
|
||||||
|
{
|
||||||
|
Super::BeginPlay();
|
||||||
|
}
|
||||||
|
|
||||||
|
void AAISightHearingController::OnPossess(APawn* InPawn)
|
||||||
|
{
|
||||||
|
Super::OnPossess(InPawn);
|
||||||
|
|
||||||
|
NMT_CHECKF(SightConfig && HearingConfig);
|
||||||
|
NMT_CHECKF(GetPawn());
|
||||||
|
|
||||||
|
if(GetPawn()->GetClass()->ImplementsInterface(UAISettings::StaticClass()))
|
||||||
|
{
|
||||||
|
FSightInfo SightInfo = IAISettings::Execute_GetSightInfo(GetPawn());
|
||||||
|
|
||||||
|
SightConfig->SightRadius = SightInfo.SightRange;
|
||||||
|
SightConfig->LoseSightRadius = SightInfo.LoseSightRange;
|
||||||
|
SightConfig->PeripheralVisionAngleDegrees = SightInfo.SightAngle / 2.f;
|
||||||
|
SightConfig->SetMaxAge(SightInfo.SightMaxAge);
|
||||||
|
|
||||||
|
FHearingInfo HearingInfo = IAISettings::Execute_GetHearingInfo(InPawn);
|
||||||
|
|
||||||
|
HearingConfig->HearingRange = HearingInfo.HearingRange;
|
||||||
|
HearingConfig->SetMaxAge(HearingInfo.HearingMaxAge);
|
||||||
|
}
|
||||||
|
|
||||||
|
UpdatePerceptionSystem();
|
||||||
|
}
|
||||||
|
|
||||||
|
void AAISightHearingController::Tick(float DeltaTime)
|
||||||
|
{
|
||||||
|
Super::Tick(DeltaTime);
|
||||||
|
}
|
||||||
|
|
@ -0,0 +1,30 @@
|
||||||
|
// Fill out your copyright notice in the Description page of Project Settings.
|
||||||
|
|
||||||
|
#pragma once
|
||||||
|
|
||||||
|
#include "CoreMinimal.h"
|
||||||
|
#include "AIPerceptionController.h"
|
||||||
|
#include "AISightHearingController.generated.h"
|
||||||
|
|
||||||
|
UCLASS()
|
||||||
|
class PROJECTT_API AAISightHearingController : public AAIPerceptionController
|
||||||
|
{
|
||||||
|
GENERATED_BODY()
|
||||||
|
|
||||||
|
public:
|
||||||
|
AAISightHearingController(const FObjectInitializer& ObjectInitializer = FObjectInitializer::Get());
|
||||||
|
|
||||||
|
protected:
|
||||||
|
virtual void BeginPlay() override;
|
||||||
|
|
||||||
|
public:
|
||||||
|
virtual void OnPossess(APawn* InPawn) override;
|
||||||
|
virtual void Tick(float DeltaTime) override;
|
||||||
|
|
||||||
|
public:
|
||||||
|
UPROPERTY(EditAnywhere, Category = "AIPerception")
|
||||||
|
class UAISenseConfig_Sight* SightConfig;
|
||||||
|
|
||||||
|
UPROPERTY(EditAnywhere, Category = "AIPerception")
|
||||||
|
class UAISenseConfig_Hearing* HearingConfig;
|
||||||
|
};
|
||||||
|
|
@ -0,0 +1,22 @@
|
||||||
|
// Fill out your copyright notice in the Description page of Project Settings.
|
||||||
|
|
||||||
|
|
||||||
|
#include "NpcAnimInstance.h"
|
||||||
|
|
||||||
|
|
||||||
|
UNpcAnimInstance::UNpcAnimInstance() :
|
||||||
|
ForwardHeadRotation(FRotator(0.0, -90.0, 21.0)),
|
||||||
|
HeadRotation(ForwardHeadRotation),
|
||||||
|
HeadRotAlpha(0.f)
|
||||||
|
{
|
||||||
|
}
|
||||||
|
|
||||||
|
void UNpcAnimInstance::NativeInitializeAnimation()
|
||||||
|
{
|
||||||
|
Super::NativeInitializeAnimation();
|
||||||
|
}
|
||||||
|
|
||||||
|
void UNpcAnimInstance::NativeUpdateAnimation(float DeltaSeconds)
|
||||||
|
{
|
||||||
|
Super::NativeUpdateAnimation(DeltaSeconds);
|
||||||
|
}
|
||||||
|
|
@ -0,0 +1,32 @@
|
||||||
|
// Fill out your copyright notice in the Description page of Project Settings.
|
||||||
|
|
||||||
|
#pragma once
|
||||||
|
|
||||||
|
#include "CoreMinimal.h"
|
||||||
|
#include "NpcAnimInstance.generated.h"
|
||||||
|
|
||||||
|
|
||||||
|
UCLASS()
|
||||||
|
class PROJECTT_API UNpcAnimInstance : public UAnimInstance
|
||||||
|
{
|
||||||
|
GENERATED_BODY()
|
||||||
|
|
||||||
|
public:
|
||||||
|
UNpcAnimInstance();
|
||||||
|
|
||||||
|
virtual void NativeInitializeAnimation() override;
|
||||||
|
virtual void NativeUpdateAnimation(float DeltaSeconds) override;
|
||||||
|
|
||||||
|
public:
|
||||||
|
UPROPERTY(EditDefaultsOnly, BlueprintReadOnly)
|
||||||
|
FRotator ForwardHeadRotation;
|
||||||
|
|
||||||
|
UPROPERTY(EditDefaultsOnly, BlueprintReadOnly)
|
||||||
|
FRotator HeadRotation;
|
||||||
|
|
||||||
|
UPROPERTY(EditDefaultsOnly, BlueprintReadOnly)
|
||||||
|
float HeadRotAlpha;
|
||||||
|
};
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
@ -0,0 +1,11 @@
|
||||||
|
// Fill out your copyright notice in the Description page of Project Settings.
|
||||||
|
|
||||||
|
|
||||||
|
#include "NpcFixedAnimInstance.h"
|
||||||
|
|
||||||
|
UNpcFixedAnimInstance::UNpcFixedAnimInstance()
|
||||||
|
{
|
||||||
|
ForwardHeadRotation = FRotator(0.0, 0.0, 90.0);
|
||||||
|
HeadRotation = ForwardHeadRotation;
|
||||||
|
HeadRotAlpha = 0.f;
|
||||||
|
}
|
||||||
|
|
@ -0,0 +1,20 @@
|
||||||
|
// Fill out your copyright notice in the Description page of Project Settings.
|
||||||
|
|
||||||
|
#pragma once
|
||||||
|
|
||||||
|
#include "CoreMinimal.h"
|
||||||
|
#include "NpcAnimInstance.h"
|
||||||
|
#include "NpcFixedAnimInstance.generated.h"
|
||||||
|
|
||||||
|
/**
|
||||||
|
*
|
||||||
|
*/
|
||||||
|
UCLASS()
|
||||||
|
class PROJECTT_API UNpcFixedAnimInstance : public UNpcAnimInstance
|
||||||
|
{
|
||||||
|
GENERATED_BODY()
|
||||||
|
|
||||||
|
public:
|
||||||
|
UNpcFixedAnimInstance();
|
||||||
|
|
||||||
|
};
|
||||||
|
|
@ -0,0 +1,951 @@
|
||||||
|
// Fill out your copyright notice in the Description page of Project Settings.
|
||||||
|
|
||||||
|
|
||||||
|
#include "CoreNpc.h"
|
||||||
|
|
||||||
|
#include "NiagaraComponent.h"
|
||||||
|
#include "AI/Controllers/AISightController.h"
|
||||||
|
#include "Components/CapsuleComponent.h"
|
||||||
|
#include "GameFramework/CharacterMovementComponent.h"
|
||||||
|
#include "GameFramework/SpringArmComponent.h"
|
||||||
|
#include "Kismet/KismetMathLibrary.h"
|
||||||
|
#include "ProjectT/ProjectT.h"
|
||||||
|
#include "ProjectT/Data/Gen/GenerateEnumObjectiveSubTypes.h"
|
||||||
|
#include "ProjectT/System/Core/Characters/NPC/Animations/NpcAnimInstance.h"
|
||||||
|
#include "ProjectT/System/Core/Characters/Player/CorePlayerCharacter.h"
|
||||||
|
#include "ProjectT/System/Core/Common/GlobalUtilsLibrary.h"
|
||||||
|
#include "ProjectT/System/Core/Components/ObstacleFilterComponent.h"
|
||||||
|
#include "ProjectT/System/Core/Components/VisionConeComponent.h"
|
||||||
|
#include "ProjectT/System/Core/GameModes/WorldGameMode.h"
|
||||||
|
#include "ProjectT/System/Core/Interfaces/GlobalObjectProvider.h"
|
||||||
|
#include "ProjectT/System/Core/Managers/CoreCheatManager.h"
|
||||||
|
#include "ProjectT/System/Core/Managers/NotificationCenter.h"
|
||||||
|
#include "ProjectT/System/Core/Managers/QuestManager.h"
|
||||||
|
#include "ProjectT/System/SinglePlay/Components/SPNpcStatusComponent.h"
|
||||||
|
|
||||||
|
#define ACTIVATE_CHARACTER 1
|
||||||
|
|
||||||
|
ACoreNpc::ACoreNpc() :
|
||||||
|
DefaultLocation(),
|
||||||
|
DefaultRotation(),
|
||||||
|
bReachedHeadRotation(false),
|
||||||
|
bCanRotateHeadToTarget(false),
|
||||||
|
bEnableRespawn(0),
|
||||||
|
RespawnTime(0),
|
||||||
|
BehaviorTree(nullptr),
|
||||||
|
Blackboard(nullptr),
|
||||||
|
SpringArmComponent(nullptr),
|
||||||
|
VisionHead(nullptr),
|
||||||
|
VisionConeComponent(nullptr),
|
||||||
|
NpcStatusComponent(nullptr),
|
||||||
|
AlertComponent(nullptr),
|
||||||
|
CurrentState(ENpcState::Default),
|
||||||
|
PerceptionMaxAge(3.f),
|
||||||
|
NpcAnimInstance(nullptr),
|
||||||
|
bActivatedOnStart(true),
|
||||||
|
PrevState(ENpcState::Default),
|
||||||
|
CurrentDoubtState(EDoubtState::None),
|
||||||
|
EyeSocketName(TEXT("SKT_NPC_Vision")),
|
||||||
|
AlertSphereProfileName(TEXT("SoundRange")),
|
||||||
|
LoseSightOffset(10.f),
|
||||||
|
HeadRotSpeedMultiplier(4.f),
|
||||||
|
bCanTriggerAlert(true),
|
||||||
|
bUnDetect(false),
|
||||||
|
bFrustumCullingTimerSet(true),
|
||||||
|
bActivate(true),
|
||||||
|
bUseSocketTransformForVision(true)
|
||||||
|
{
|
||||||
|
PrimaryActorTick.bCanEverTick = true;
|
||||||
|
|
||||||
|
AIControllerClass = AAIControllerBase::StaticClass();
|
||||||
|
AutoPossessAI = EAutoPossessAI::PlacedInWorldOrSpawned;
|
||||||
|
|
||||||
|
GetCharacterMovement()->bUseControllerDesiredRotation = true;
|
||||||
|
GetCharacterMovement()->bOrientRotationToMovement = false;
|
||||||
|
GetCharacterMovement()->GetNavMovementProperties()->bUseAccelerationForPaths = true;
|
||||||
|
bUseControllerRotationYaw = false;
|
||||||
|
|
||||||
|
GetMesh()->SetAnimationMode(EAnimationMode::AnimationBlueprint);
|
||||||
|
GetMesh()->SetAnimInstanceClass(UNpcAnimInstance::StaticClass());
|
||||||
|
|
||||||
|
SubRootComponent = CreateDefaultSubobject<USceneComponent>(TEXT("SubRootComponent"));
|
||||||
|
WidgetRootComponent = CreateDefaultSubobject<USceneComponent>(TEXT("WidgetRootComponent"));
|
||||||
|
SpringArmComponent = CreateDefaultSubobject<USpringArmComponent>(TEXT("SpringArmComponent"));
|
||||||
|
VisionHead = CreateDefaultSubobject<USceneComponent>(TEXT("VisionHead"));
|
||||||
|
VisionConeComponent = CreateDefaultSubobject<UVisionConeComponent>(TEXT("VisionConeComponent"));
|
||||||
|
AlertComponent = CreateDefaultSubobject<UObstacleFilterComponent>(TEXT("AlertComponent"));
|
||||||
|
NpcStatusComponent = CreateDefaultSubobject<USPNpcStatusComponent>(TEXT("NpcStatusComponent"));
|
||||||
|
NoiseFXComponent = CreateDefaultSubobject<UNiagaraComponent>(TEXT("NoiseFXComponent"));
|
||||||
|
NMT_CHECKF(WidgetRootComponent && SubRootComponent && SpringArmComponent && VisionHead && VisionConeComponent && AlertComponent && NpcStatusComponent && NoiseFXComponent)
|
||||||
|
|
||||||
|
SubRootComponent->SetupAttachment(RootComponent);
|
||||||
|
WidgetRootComponent->SetupAttachment(RootComponent);
|
||||||
|
|
||||||
|
SpringArmComponent->SetupAttachment(SubRootComponent);
|
||||||
|
SpringArmComponent->bDoCollisionTest = false;
|
||||||
|
SpringArmComponent->TargetArmLength = 0.f;
|
||||||
|
SpringArmComponent->bInheritRoll = false;
|
||||||
|
SpringArmComponent->bInheritPitch = false;
|
||||||
|
SpringArmComponent->bEnableCameraLag = true;
|
||||||
|
SpringArmComponent->CameraLagSpeed = 0.f;
|
||||||
|
|
||||||
|
SpringArmComponent->bEnableCameraRotationLag = true;
|
||||||
|
SpringArmComponent->CameraRotationLagSpeed = 7.f;
|
||||||
|
SpringArmComponent->SetCanEverAffectNavigation(false);
|
||||||
|
|
||||||
|
VisionHead->SetupAttachment(SpringArmComponent);
|
||||||
|
VisionConeComponent->SetupAttachment(SpringArmComponent);
|
||||||
|
|
||||||
|
AlertComponent->SetupAttachment(SubRootComponent);
|
||||||
|
AlertComponent->DeactivateFiltering();
|
||||||
|
AlertComponent->SetCollisionProfileName(AlertSphereProfileName);
|
||||||
|
|
||||||
|
NoiseFXComponent->SetupAttachment(SubRootComponent);
|
||||||
|
NoiseFXComponent->bAutoActivate = false;
|
||||||
|
|
||||||
|
if(HeadRotationPatterns.IsEmpty())
|
||||||
|
SetupHeadRotationPattern();
|
||||||
|
}
|
||||||
|
|
||||||
|
void ACoreNpc::OnConstruction(const FTransform& Transform)
|
||||||
|
{
|
||||||
|
Super::OnConstruction(Transform);
|
||||||
|
|
||||||
|
DefaultLocation = GetActorLocation();
|
||||||
|
DefaultRotation = GetActorRotation();
|
||||||
|
}
|
||||||
|
|
||||||
|
void ACoreNpc::BeginPlay()
|
||||||
|
{
|
||||||
|
Super::BeginPlay();
|
||||||
|
|
||||||
|
ActivateCharacter(false);
|
||||||
|
InitializeProperty();
|
||||||
|
InitializeEvents();
|
||||||
|
}
|
||||||
|
|
||||||
|
void ACoreNpc::PostInitializeComponents()
|
||||||
|
{
|
||||||
|
Super::PostInitializeComponents();
|
||||||
|
}
|
||||||
|
|
||||||
|
void ACoreNpc::Enable_Implementation()
|
||||||
|
{
|
||||||
|
IPoolableActor::Enable_Implementation();
|
||||||
|
}
|
||||||
|
|
||||||
|
void ACoreNpc::Disable_Implementation()
|
||||||
|
{
|
||||||
|
IPoolableActor::Disable_Implementation();
|
||||||
|
}
|
||||||
|
|
||||||
|
void ACoreNpc::Pushed_Implementation()
|
||||||
|
{
|
||||||
|
IPoolableActor::Pushed_Implementation();
|
||||||
|
}
|
||||||
|
|
||||||
|
void ACoreNpc::Obtained_Implementation()
|
||||||
|
{
|
||||||
|
IPoolableActor::Obtained_Implementation();
|
||||||
|
}
|
||||||
|
|
||||||
|
void ACoreNpc::GetCurrentEffectTypes_Implementation(TArray<EEffectSubTypes>& OutEffectSubTypes)
|
||||||
|
{
|
||||||
|
TArray<EEffectSubTypes> LocReturnCurrentEffects;
|
||||||
|
EffectTimeMap.GetKeys(LocReturnCurrentEffects);
|
||||||
|
if(LocReturnCurrentEffects.Num() > 0)
|
||||||
|
{
|
||||||
|
OutEffectSubTypes = LocReturnCurrentEffects;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
LocReturnCurrentEffects.Add(EEffectSubTypes::None);
|
||||||
|
OutEffectSubTypes = LocReturnCurrentEffects;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
void ACoreNpc::Tick(float DeltaTime)
|
||||||
|
{
|
||||||
|
Super::Tick(DeltaTime);
|
||||||
|
|
||||||
|
if(!bFrustumCullingTimerSet)
|
||||||
|
{
|
||||||
|
bFrustumCullingTimerSet = true;
|
||||||
|
UWorld* World = UGlobalUtilsLibrary::GetValidWorld(this);
|
||||||
|
World->GetTimerManager().SetTimer(UpdateActiveComponentHandle, this, &ACoreNpc::UpdateActiveComponentInFrustum, DeltaTime, true);
|
||||||
|
}
|
||||||
|
|
||||||
|
if(HeadRotationInfo.bOverrideHeadRotation)
|
||||||
|
UpdateHeadRotation(DeltaTime);
|
||||||
|
|
||||||
|
if(HeadRotationInfo.bChangeAlpha)
|
||||||
|
UpdateHeadRotationAlpha(DeltaTime);
|
||||||
|
|
||||||
|
SetSpringArmRotation();
|
||||||
|
if(VisionConeComponent->IsDrawing())
|
||||||
|
VisionConeComponent->UpdateVision(VisionHead->GetComponentRotation());
|
||||||
|
}
|
||||||
|
|
||||||
|
void ACoreNpc::EndPlay(const EEndPlayReason::Type EndPlayReason)
|
||||||
|
{
|
||||||
|
Super::EndPlay(EndPlayReason);
|
||||||
|
|
||||||
|
UWorld* World = UGlobalUtilsLibrary::GetValidWorld(this);
|
||||||
|
World->GetTimerManager().ClearTimer(UpdateActiveComponentHandle);
|
||||||
|
World->GetTimerManager().ClearTimer(RespawnTimerHandle);
|
||||||
|
World->GetTimerManager().ClearTimer(CompleteAlertTimerHandle);
|
||||||
|
World->GetTimerManager().ClearTimer(EffectTimerHandle);
|
||||||
|
|
||||||
|
OnNpcDead.Clear();
|
||||||
|
OnNpcRespawn.Clear();
|
||||||
|
OnNpcIndicatorChanged.Clear();
|
||||||
|
}
|
||||||
|
|
||||||
|
void ACoreNpc::GetActorEyesViewPoint(FVector& Location, FRotator& Rotation) const
|
||||||
|
{
|
||||||
|
if(!VisionHead) return;
|
||||||
|
Location = VisionHead->GetComponentLocation();
|
||||||
|
Rotation = VisionHead->GetComponentRotation();
|
||||||
|
}
|
||||||
|
|
||||||
|
FEnemyNpc ACoreNpc::GetCurrentNpcStatus() const
|
||||||
|
{
|
||||||
|
if(!NMT_ENSURE(NpcStatusComponent))
|
||||||
|
return FEnemyNpc();
|
||||||
|
|
||||||
|
return NpcStatusComponent->GetCurrentNpcStatus();
|
||||||
|
}
|
||||||
|
|
||||||
|
void ACoreNpc::InitializeStatus(const FEnemyNpc InNpcStatus)
|
||||||
|
{
|
||||||
|
if(!NMT_ENSURE(NpcStatusComponent))
|
||||||
|
return;
|
||||||
|
|
||||||
|
bool bNpcDataValid = !InNpcStatus.IsDefault();
|
||||||
|
if(!NMT_ENSURE(bNpcDataValid)) return;
|
||||||
|
|
||||||
|
#if WITH_EDITOR
|
||||||
|
NpcStatusComponent->InitializeStatus(InNpcStatus);
|
||||||
|
#endif
|
||||||
|
}
|
||||||
|
|
||||||
|
void ACoreNpc::InitializeProperty()
|
||||||
|
{
|
||||||
|
NpcAnimInstance = Cast<UNpcAnimInstance>(GetMesh()->GetAnimInstance());
|
||||||
|
NMT_CHECKF(NpcAnimInstance && NpcStatusComponent)
|
||||||
|
|
||||||
|
FObstacleFilterInfo FilterInfo;
|
||||||
|
FilterInfo.SphereRadius = NpcStatusComponent->GetStatusNpcNoise();
|
||||||
|
FilterInfo.CheckOutOfRange = false;
|
||||||
|
AlertComponent->InitializeProperty(FilterInfo);
|
||||||
|
AlertComponent->DeactivateFiltering();
|
||||||
|
}
|
||||||
|
|
||||||
|
void ACoreNpc::InitializeEvents()
|
||||||
|
{
|
||||||
|
UNotificationCenter* NC = IGlobalObjectProvider::Execute_GetNotificationCenter(UGameplayStatics::GetGameInstance(this));
|
||||||
|
|
||||||
|
NC->AddObserverStatic(this, ENotificationTypes::GameState_Victory, FNotificationCenterStatic::CreateWeakLambda(this, [this]()
|
||||||
|
{
|
||||||
|
ResetStateAfterGameEnd();
|
||||||
|
}));
|
||||||
|
NC->AddObserverStatic(this, ENotificationTypes::GameState_Defeat, FNotificationCenterStatic::CreateWeakLambda(this, [this]()
|
||||||
|
{
|
||||||
|
ResetStateAfterGameEnd();;
|
||||||
|
}));
|
||||||
|
// FIXME
|
||||||
|
// NC->AddObserverStatic(this, ENotificationTypes::UI_DefeatActionCleared, FNotificationCenterStatic::CreateWeakLambda(this, [this]()
|
||||||
|
// {
|
||||||
|
// SetActorLocationAndRotation(DefaultLocation, DefaultRotation);
|
||||||
|
// SetActorHiddenInGame(true);
|
||||||
|
// NMT_LOG("UI_DefeatActionCleared")
|
||||||
|
// }));
|
||||||
|
// NC->AddObserverStatic(this, ENotificationTypes::UI_VictoryActionCleared, FNotificationCenterStatic::CreateWeakLambda(this, [this]()
|
||||||
|
// {
|
||||||
|
// SetActorLocationAndRotation(DefaultLocation, DefaultRotation);
|
||||||
|
// SetActorHiddenInGame(true);
|
||||||
|
// NMT_LOG("UI_VictoryActionCleared")
|
||||||
|
// }));
|
||||||
|
}
|
||||||
|
|
||||||
|
void ACoreNpc::Respawn()
|
||||||
|
{
|
||||||
|
Super::Respawn();
|
||||||
|
|
||||||
|
SetActorEnableCollision(true);
|
||||||
|
GetMesh()->bPauseAnims = false;
|
||||||
|
GetAIControllerBase()->StartAI();
|
||||||
|
SetActorHiddenInGame(false);
|
||||||
|
SetActorTickEnabled(true);
|
||||||
|
NpcStatusComponent->ReInitializeStatus();
|
||||||
|
|
||||||
|
ChangeNpcState(ENpcState::Default);
|
||||||
|
OnNpcRespawn.Broadcast();
|
||||||
|
}
|
||||||
|
|
||||||
|
void ACoreNpc::ChangeHeadRotationState(const EHeadRotationType InHeadRotationType)
|
||||||
|
{
|
||||||
|
bReachedHeadRotation = false;
|
||||||
|
switch(InHeadRotationType)
|
||||||
|
{
|
||||||
|
case EHeadRotationType::Pause:
|
||||||
|
{
|
||||||
|
NpcStatusComponent->SetStatusNpcRotationSpeed(NpcStatusComponent->GetPreviousNpcStatus().fRotationSpeed);
|
||||||
|
HeadRotationInfo.bOverrideHeadRotation = false;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
case EHeadRotationType::Search: case EHeadRotationType::LoopSearch:
|
||||||
|
{
|
||||||
|
NpcStatusComponent->SetStatusNpcRotationSpeed(NpcStatusComponent->GetPreviousNpcStatus().fRotationSpeed);
|
||||||
|
CurrentPhaseLists = *HeadRotationPatterns.Find(InHeadRotationType);
|
||||||
|
if(!CurrentPhaseLists.IsEmpty())
|
||||||
|
{
|
||||||
|
HeadRotationInfo.CurrentPhaseIdx = 0;
|
||||||
|
HeadRotationInfo.bOverrideHeadRotation = true;
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
case EHeadRotationType::Guard:
|
||||||
|
{
|
||||||
|
NpcStatusComponent->SetStatusNpcRotationSpeed(NpcStatusComponent->GetPreviousNpcStatus().fRotationSpeed * HeadRotSpeedMultiplier);
|
||||||
|
CurrentPhaseLists = *HeadRotationPatterns.Find(InHeadRotationType);
|
||||||
|
if(!CurrentPhaseLists.IsEmpty())
|
||||||
|
{
|
||||||
|
HeadRotationInfo.CurrentPhaseIdx = 0;
|
||||||
|
HeadRotationInfo.bOverrideHeadRotation = true;
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
case EHeadRotationType::TurnToTarget:
|
||||||
|
{
|
||||||
|
NpcStatusComponent->SetStatusNpcRotationSpeed(NpcStatusComponent->GetPreviousNpcStatus().fRotationSpeed * HeadRotSpeedMultiplier);
|
||||||
|
HeadRotationInfo.bOverrideHeadRotation = true;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
case EHeadRotationType::None:
|
||||||
|
{
|
||||||
|
NpcStatusComponent->SetStatusNpcRotationSpeed(NpcStatusComponent->GetPreviousNpcStatus().fRotationSpeed);
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
HeadRotationInfo.HeadRotationType = InHeadRotationType;
|
||||||
|
}
|
||||||
|
|
||||||
|
void ACoreNpc::SetHeadRotationEnable(const bool InbEnable)
|
||||||
|
{
|
||||||
|
HeadRotationInfo.bChangeAlpha = true;
|
||||||
|
|
||||||
|
InbEnable ? HeadRotationInfo.TargetAlpha = 1.f : HeadRotationInfo.TargetAlpha = 0.f;
|
||||||
|
}
|
||||||
|
|
||||||
|
bool ACoreNpc::IsAggressiveState(const ENpcState InState) const
|
||||||
|
{
|
||||||
|
return InState == ENpcState::Chase || InState == ENpcState::Attack;
|
||||||
|
}
|
||||||
|
|
||||||
|
bool ACoreNpc::IsDamagedState(const ENpcState InState) const
|
||||||
|
{
|
||||||
|
return (InState == ENpcState::Hit || InState == ENpcState::Dead) || GetNpcStatusComponent()->IsDead();
|
||||||
|
}
|
||||||
|
|
||||||
|
void ACoreNpc::SetupHeadRotationPattern()
|
||||||
|
{
|
||||||
|
TArray<EHeadRotationPhase> List;
|
||||||
|
|
||||||
|
List.Append({EHeadRotationPhase::TurnRight, EHeadRotationPhase::TurnLeft, EHeadRotationPhase::TurnForward});
|
||||||
|
HeadRotationPatterns.Add(EHeadRotationType::Search, List);
|
||||||
|
|
||||||
|
List.Empty();
|
||||||
|
List.Append({EHeadRotationPhase::TurnRight, EHeadRotationPhase::TurnLeft, EHeadRotationPhase::TurnForward});
|
||||||
|
HeadRotationPatterns.Add(EHeadRotationType::Guard, List);
|
||||||
|
|
||||||
|
List.Empty();
|
||||||
|
List.Append({EHeadRotationPhase::TurnRight, EHeadRotationPhase::TurnLeft});
|
||||||
|
HeadRotationPatterns.Add(EHeadRotationType::LoopSearch, List);
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
void ACoreNpc::UpdateHeadRotation(float InDeltaTime)
|
||||||
|
{
|
||||||
|
if(!NMT_ENSURE(NpcStatusComponent))
|
||||||
|
return;
|
||||||
|
|
||||||
|
switch(HeadRotationInfo.HeadRotationType)
|
||||||
|
{
|
||||||
|
case EHeadRotationType::LoopSearch:
|
||||||
|
{
|
||||||
|
if(!NMT_MSG_ENSURE(CurrentPhaseLists.IsValidIndex(HeadRotationInfo.CurrentPhaseIdx), "Not ValidIndex in CurrentPhaseLists %d", HeadRotationInfo.CurrentPhaseIdx))
|
||||||
|
{
|
||||||
|
ResetHeadRotation();
|
||||||
|
bReachedHeadRotation = true;
|
||||||
|
HeadRotationInfo.bOverrideHeadRotation = false;
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
if(CurrentPhaseLists[HeadRotationInfo.CurrentPhaseIdx] == EHeadRotationPhase::TurnRight)
|
||||||
|
{
|
||||||
|
HeadRotationInfo.TargetRotation = FRotator(NpcAnimInstance->ForwardHeadRotation.Pitch, NpcAnimInstance->ForwardHeadRotation.Yaw + NpcStatusComponent->GetStatusNpcHalfRotationAngle(), NpcAnimInstance->ForwardHeadRotation.Roll);
|
||||||
|
}
|
||||||
|
else if(CurrentPhaseLists[HeadRotationInfo.CurrentPhaseIdx] == EHeadRotationPhase::TurnLeft)
|
||||||
|
{
|
||||||
|
HeadRotationInfo.TargetRotation = FRotator(NpcAnimInstance->ForwardHeadRotation.Pitch, NpcAnimInstance->ForwardHeadRotation.Yaw - NpcStatusComponent->GetStatusNpcHalfRotationAngle(), NpcAnimInstance->ForwardHeadRotation.Roll);
|
||||||
|
}
|
||||||
|
|
||||||
|
if(NpcAnimInstance->HeadRotation.Equals(HeadRotationInfo.TargetRotation, 0.1f))
|
||||||
|
{
|
||||||
|
HeadRotationInfo.CurrentPhaseIdx == 0 ? HeadRotationInfo.CurrentPhaseIdx++ : HeadRotationInfo.CurrentPhaseIdx--;
|
||||||
|
}
|
||||||
|
NpcAnimInstance->HeadRotation = FMath::RInterpTo(NpcAnimInstance->HeadRotation, HeadRotationInfo.TargetRotation, InDeltaTime, NpcStatusComponent->GetStatusNpcRotationSpeed());
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
case EHeadRotationType::Search: case EHeadRotationType::Guard:
|
||||||
|
{
|
||||||
|
if(!NMT_MSG_ENSURE(CurrentPhaseLists.IsValidIndex(HeadRotationInfo.CurrentPhaseIdx), "Not ValidIndex in CurrentPhaseLists %d", HeadRotationInfo.CurrentPhaseIdx))
|
||||||
|
{
|
||||||
|
ResetHeadRotation();
|
||||||
|
bReachedHeadRotation = true;
|
||||||
|
HeadRotationInfo.bOverrideHeadRotation = false;
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
if(CurrentPhaseLists[HeadRotationInfo.CurrentPhaseIdx] == EHeadRotationPhase::TurnRight)
|
||||||
|
{
|
||||||
|
HeadRotationInfo.TargetRotation = FRotator(NpcAnimInstance->ForwardHeadRotation.Pitch, NpcAnimInstance->ForwardHeadRotation.Yaw + NpcStatusComponent->GetStatusNpcHalfRotationAngle(), NpcAnimInstance->ForwardHeadRotation.Roll);
|
||||||
|
}
|
||||||
|
else if(CurrentPhaseLists[HeadRotationInfo.CurrentPhaseIdx] == EHeadRotationPhase::TurnLeft)
|
||||||
|
{
|
||||||
|
HeadRotationInfo.TargetRotation = FRotator(NpcAnimInstance->ForwardHeadRotation.Pitch, NpcAnimInstance->ForwardHeadRotation.Yaw - NpcStatusComponent->GetStatusNpcHalfRotationAngle(), NpcAnimInstance->ForwardHeadRotation.Roll);
|
||||||
|
}
|
||||||
|
else if(CurrentPhaseLists[HeadRotationInfo.CurrentPhaseIdx] == EHeadRotationPhase::TurnForward)
|
||||||
|
{
|
||||||
|
HeadRotationInfo.TargetRotation = NpcAnimInstance->ForwardHeadRotation;
|
||||||
|
}
|
||||||
|
|
||||||
|
if(NpcAnimInstance->HeadRotation.Equals(HeadRotationInfo.TargetRotation, 0.1f))
|
||||||
|
{
|
||||||
|
HeadRotationInfo.CurrentPhaseIdx++;
|
||||||
|
if(HeadRotationInfo.CurrentPhaseIdx >= CurrentPhaseLists.Num())
|
||||||
|
{
|
||||||
|
bReachedHeadRotation = true;
|
||||||
|
ResetHeadRotation();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
NpcAnimInstance->HeadRotation = FMath::RInterpTo(NpcAnimInstance->HeadRotation, HeadRotationInfo.TargetRotation, InDeltaTime, NpcStatusComponent->GetStatusNpcRotationSpeed());
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
case EHeadRotationType::TurnToTarget:
|
||||||
|
{
|
||||||
|
if(NpcAnimInstance->HeadRotation.Equals(HeadRotationInfo.TargetRotation, 0.1f))
|
||||||
|
{
|
||||||
|
bReachedHeadRotation = true;
|
||||||
|
HeadRotationInfo.bOverrideHeadRotation = false;
|
||||||
|
ResetHeadRotation();
|
||||||
|
}
|
||||||
|
NpcAnimInstance->HeadRotation = FMath::RInterpTo(NpcAnimInstance->HeadRotation, HeadRotationInfo.TargetRotation, InDeltaTime, NpcStatusComponent->GetStatusNpcRotationSpeed());
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
case EHeadRotationType::Pause: case EHeadRotationType::None:
|
||||||
|
break;
|
||||||
|
default : NMT_MSG_ENSURE(0, "Not Valid HeadRotation Type");
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
void ACoreNpc::UpdateHeadRotationAlpha(float InDeltaTime)
|
||||||
|
{
|
||||||
|
if(FMath::IsNearlyEqual(NpcAnimInstance->HeadRotAlpha, HeadRotationInfo.TargetAlpha))
|
||||||
|
{
|
||||||
|
NpcAnimInstance->HeadRotAlpha = HeadRotationInfo.TargetAlpha;
|
||||||
|
HeadRotationInfo.bChangeAlpha = false;
|
||||||
|
}
|
||||||
|
|
||||||
|
NpcAnimInstance->HeadRotAlpha = FMath::FInterpTo(NpcAnimInstance->HeadRotAlpha, HeadRotationInfo.TargetAlpha, InDeltaTime, 5.f);
|
||||||
|
}
|
||||||
|
|
||||||
|
void ACoreNpc::ResetHeadRotation()
|
||||||
|
{
|
||||||
|
HeadRotationInfo.CurrentPhaseIdx = 0;
|
||||||
|
HeadRotationInfo.HeadRotationType = EHeadRotationType::None;
|
||||||
|
}
|
||||||
|
|
||||||
|
void ACoreNpc::SetUnDetectTarget(const bool InbUnDetect)
|
||||||
|
{
|
||||||
|
bUnDetect = InbUnDetect;
|
||||||
|
}
|
||||||
|
|
||||||
|
void ACoreNpc::PostAlert() const
|
||||||
|
{
|
||||||
|
AlertComponent->DeactivateFiltering();
|
||||||
|
}
|
||||||
|
|
||||||
|
bool ACoreNpc::CheckEffectTime(const FEffect& InEffect)
|
||||||
|
{
|
||||||
|
bool LocbRefreshEffect = false;
|
||||||
|
EEffectSubTypes LocEffectSubType = UGlobalUtilsLibrary::GetStringToEnum<EEffectSubTypes>(InEffect.sEffect);
|
||||||
|
if(EffectTimeMap.Find(LocEffectSubType))
|
||||||
|
{
|
||||||
|
if(EffectTimeMap.Find(LocEffectSubType)->EffectValue > InEffect.fEffectValue)
|
||||||
|
return LocbRefreshEffect;
|
||||||
|
if(EffectTimeMap.Find(LocEffectSubType)->EffectValue == InEffect.fEffectValue)
|
||||||
|
{
|
||||||
|
if(EffectTimeMap.Find(LocEffectSubType)->RemainTime < InEffect.fEffectDuration)
|
||||||
|
LocbRefreshEffect = true;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
LocbRefreshEffect = true;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
LocbRefreshEffect = true;
|
||||||
|
|
||||||
|
return LocbRefreshEffect;
|
||||||
|
}
|
||||||
|
|
||||||
|
void ACoreNpc::AddEffectTimeMap(const FEffect& InEffect)
|
||||||
|
{
|
||||||
|
FNpcEffectValue LocEffectValue;
|
||||||
|
EEffectSubTypes LocEffectSubType = UGlobalUtilsLibrary::GetStringToEnum<EEffectSubTypes>(InEffect.sEffect);
|
||||||
|
if(EffectTimeMap.Find(LocEffectSubType))
|
||||||
|
{
|
||||||
|
if(EffectTimeMap.Find(LocEffectSubType)->EffectValue > InEffect.fEffectValue) return;
|
||||||
|
if(EffectTimeMap.Find(LocEffectSubType)->EffectValue == InEffect.fEffectValue)
|
||||||
|
{
|
||||||
|
if(EffectTimeMap.Find(LocEffectSubType)->RemainTime < InEffect.fEffectDuration)
|
||||||
|
{
|
||||||
|
LocEffectValue.RemainTime = InEffect.fEffectDuration;
|
||||||
|
LocEffectValue.MaxTime = InEffect.fEffectDuration;
|
||||||
|
LocEffectValue.EffectValue = InEffect.fEffectValue;
|
||||||
|
EffectTimeMap.Add(LocEffectSubType, LocEffectValue);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
LocEffectValue.RemainTime = InEffect.fEffectDuration;
|
||||||
|
LocEffectValue.MaxTime = InEffect.fEffectDuration;
|
||||||
|
LocEffectValue.EffectValue = InEffect.fEffectValue;
|
||||||
|
EffectTimeMap.Add(LocEffectSubType, LocEffectValue);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
LocEffectValue.RemainTime = InEffect.fEffectDuration;
|
||||||
|
LocEffectValue.MaxTime = InEffect.fEffectDuration;
|
||||||
|
LocEffectValue.EffectValue = InEffect.fEffectValue;
|
||||||
|
EffectTimeMap.Add(LocEffectSubType, LocEffectValue);
|
||||||
|
}
|
||||||
|
if(!GetWorld()->GetTimerManager().IsTimerActive(EffectTimerHandle))
|
||||||
|
GetWorld()->GetTimerManager().SetTimer(EffectTimerHandle, this, &ACoreNpc::EffectTimeDown, GetWorld()->DeltaTimeSeconds, true);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
void ACoreNpc::EffectTimeDown()
|
||||||
|
{
|
||||||
|
TArray<EEffectSubTypes> LocEffectSubType;
|
||||||
|
EffectTimeMap.GetKeys(LocEffectSubType);
|
||||||
|
FEffect LocRemoveEffect;
|
||||||
|
for(EEffectSubTypes LocKey : LocEffectSubType)
|
||||||
|
{
|
||||||
|
float LocCurRemainTime = EffectTimeMap.Find(LocKey)->RemainTime;
|
||||||
|
LocCurRemainTime = LocCurRemainTime - GetWorld()->DeltaTimeSeconds;
|
||||||
|
if(LocCurRemainTime <= 0.f)
|
||||||
|
{
|
||||||
|
TArray<FEffect> LocRemoveEffects;
|
||||||
|
LocRemoveEffect.sEffect = EnumToString(LocKey);
|
||||||
|
LocRemoveEffect.fEffectValue = EffectTimeMap.Find(LocKey)->EffectValue;
|
||||||
|
LocRemoveEffects.Add(LocRemoveEffect);
|
||||||
|
ApplyRecoveryEvent_Implementation(LocRemoveEffects);
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
EffectTimeMap.Find(LocKey)->RemainTime = LocCurRemainTime;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
void ACoreNpc::SetReturnLocationFromDefault() const
|
||||||
|
{
|
||||||
|
if(GetNpcState() == ENpcState::Default)
|
||||||
|
GetAIControllerBase()->UpdateReturnLocation(GetActorLocation());
|
||||||
|
}
|
||||||
|
|
||||||
|
void ACoreNpc::ChangeIndicatorState(const ENpcState InState)
|
||||||
|
{
|
||||||
|
if(NpcStatusComponent->IsDead())
|
||||||
|
return;
|
||||||
|
|
||||||
|
ENpcIndicatorState NewIndicatorState = LastIndicatorState;
|
||||||
|
|
||||||
|
switch(InState)
|
||||||
|
{
|
||||||
|
case ENpcState::Doubt: case ENpcState::Guard:
|
||||||
|
{
|
||||||
|
NewIndicatorState = ENpcIndicatorState::Question;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
case ENpcState::Chase: case ENpcState::Attack:
|
||||||
|
{
|
||||||
|
NewIndicatorState = ENpcIndicatorState::Exclamation;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
case ENpcState::Default: case ENpcState::Returning: case ENpcState::Hit: case ENpcState::Dead:
|
||||||
|
break;
|
||||||
|
default: NMT_LOG("Not Valid Type")
|
||||||
|
}
|
||||||
|
|
||||||
|
if(NewIndicatorState != LastIndicatorState)
|
||||||
|
{
|
||||||
|
LastIndicatorState = NewIndicatorState;
|
||||||
|
OnNpcIndicatorChanged.Broadcast(NewIndicatorState);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
void ACoreNpc::ChangeToChaseInDoubtGauge()
|
||||||
|
{
|
||||||
|
GetAIControllerBase()->UpdateReturnLocation(GetActorLocation());
|
||||||
|
ChangeNpcState(ENpcState::Chase);
|
||||||
|
ApplyStateToQuest(ENpcState::Chase);
|
||||||
|
}
|
||||||
|
|
||||||
|
void ACoreNpc::DebugToggleFrustum()
|
||||||
|
{
|
||||||
|
UCoreCheatManager* CCM = UGlobalUtilsLibrary::GetSharedCoreCheatManager(this);
|
||||||
|
UWorld* World = UGlobalUtilsLibrary::GetValidWorld(this);
|
||||||
|
if(UpdateActiveComponentHandle.IsValid())
|
||||||
|
{
|
||||||
|
if(CCM->GetDebugStatus().bDebugVision)
|
||||||
|
{
|
||||||
|
World->GetTimerManager().PauseTimer(UpdateActiveComponentHandle);
|
||||||
|
VisionConeComponent->ToggleDraw(true);
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
VisionConeComponent->ToggleDraw(false);
|
||||||
|
World->GetTimerManager().UnPauseTimer(UpdateActiveComponentHandle);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
class AAIControllerBase* ACoreNpc::GetAIControllerBase() const
|
||||||
|
{
|
||||||
|
AAIControllerBase* AIC = Cast<AAIControllerBase>(GetController());
|
||||||
|
NMT_CHECKF(AIC)
|
||||||
|
|
||||||
|
return AIC;
|
||||||
|
}
|
||||||
|
|
||||||
|
bool ACoreNpc::CanDetectTargetFromNoise() const
|
||||||
|
{
|
||||||
|
return !bUnDetect && !GetNpcStatusComponent()->IsDead() && !GetAIControllerBase()->GetTargetActor() && CurrentState != ENpcState::Attack;
|
||||||
|
}
|
||||||
|
|
||||||
|
void ACoreNpc::ApplyStateToQuest(const ENpcState InState)
|
||||||
|
{
|
||||||
|
UWorld* World = UGlobalUtilsLibrary::GetValidWorld(this);
|
||||||
|
AWorldGameMode* GM = UGlobalUtilsLibrary::GetGameModeChecked<AWorldGameMode>(World);
|
||||||
|
UQuestManager* QM = IWorldObjectProvider::Execute_GetQuestManager(GM);
|
||||||
|
NMT_CHECKF(QM);
|
||||||
|
|
||||||
|
switch(InState)
|
||||||
|
{
|
||||||
|
case ENpcState::Chase:
|
||||||
|
{
|
||||||
|
NMT_LOG("Avoid")
|
||||||
|
QM->CheckObjectiveSatisfied(EObjectiveSubTypes::Avoid);
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
case ENpcState::Dead:
|
||||||
|
{
|
||||||
|
QM->CheckObjectiveSatisfied(EObjectiveSubTypes::Kill);
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
case ENpcState::Guard:
|
||||||
|
case ENpcState::Hit:
|
||||||
|
case ENpcState::Attack:
|
||||||
|
case ENpcState::Default:
|
||||||
|
case ENpcState::Returning:
|
||||||
|
case ENpcState::Doubt:
|
||||||
|
default: NOT_IMPLEMENTED(); break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
void ACoreNpc::Alert(const FVector& InTargetLocation)
|
||||||
|
{
|
||||||
|
if(!bCanTriggerAlert || GetNpcStatusComponent()->IsDead())
|
||||||
|
return;
|
||||||
|
|
||||||
|
NMT_CHECKF(NpcStatusComponent)
|
||||||
|
NMT_LOG("Alert")
|
||||||
|
|
||||||
|
bCanTriggerAlert = false;
|
||||||
|
AlertComponent->ActivateFiltering();
|
||||||
|
|
||||||
|
TArray<AActor*> DetectedNpcs = AlertComponent->GetNonBlockedActors(InTargetLocation);
|
||||||
|
for(AActor* Npc : DetectedNpcs)
|
||||||
|
{
|
||||||
|
ACoreNpc* OtherNpc = Cast<ACoreNpc>(Npc);
|
||||||
|
if(!OtherNpc)
|
||||||
|
continue;
|
||||||
|
|
||||||
|
OtherNpc->SetDetectLocationFromNoise(InTargetLocation);
|
||||||
|
}
|
||||||
|
|
||||||
|
NoiseFXComponent->SetFloatParameter(FName("Wave Radius"), NpcStatusComponent->GetStatusNpcNoise());
|
||||||
|
NoiseFXComponent->Activate(true);
|
||||||
|
UWorld* World = UGlobalUtilsLibrary::GetValidWorld(this);
|
||||||
|
World->GetTimerManager().SetTimer(CompleteAlertTimerHandle, this, &ACoreNpc::PostAlert, 0.5f, false);
|
||||||
|
}
|
||||||
|
|
||||||
|
void ACoreNpc::SetDetectTargetFromNoise(AActor* InTarget)
|
||||||
|
{
|
||||||
|
if(!CanDetectTargetFromNoise())
|
||||||
|
return;
|
||||||
|
|
||||||
|
GetAIControllerBase()->UpdateTargetInfo(InTarget);
|
||||||
|
HandleForceDetectFromNoise(true);
|
||||||
|
|
||||||
|
NMT_LOG("SetDetectTargetFromNoise")
|
||||||
|
}
|
||||||
|
|
||||||
|
void ACoreNpc::SetDetectLocationFromNoise(const FVector& InTargetLocation)
|
||||||
|
{
|
||||||
|
if(!CanDetectTargetFromNoise())
|
||||||
|
return;
|
||||||
|
|
||||||
|
GetAIControllerBase()->UpdateTargetLocation(InTargetLocation);
|
||||||
|
GetAIControllerBase()->UpdateTargetDirection((InTargetLocation - GetActorLocation()).GetSafeNormal());
|
||||||
|
HandleForceDetectFromNoise(false);
|
||||||
|
|
||||||
|
NMT_LOG("SetDetectLocationFromNoise")
|
||||||
|
}
|
||||||
|
|
||||||
|
void ACoreNpc::UpdateDoubtVisualize(const float InCurrentDoubtTime)
|
||||||
|
{
|
||||||
|
double GaugeLength = UKismetMathLibrary::MapRangeClamped(InCurrentDoubtTime, 0.f, NpcStatusComponent->GetStatusPreviousNpcDoubtTime(), 20.f, NpcStatusComponent->GetStatusNpcSightLength());
|
||||||
|
VisionConeComponent->UpdateVisionGauge(GaugeLength);
|
||||||
|
|
||||||
|
AActor* Target = GetAIControllerBase()->GetTargetActor();
|
||||||
|
if(!Target)
|
||||||
|
return;
|
||||||
|
|
||||||
|
if(GaugeLength >= GetHorizontalDistanceTo(Target))
|
||||||
|
{
|
||||||
|
ChangeToChaseInDoubtGauge();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
void ACoreNpc::UpdateDoubtTime(const float InCurrentDoubtTime)
|
||||||
|
{
|
||||||
|
NMT_CHECKF(NpcStatusComponent)
|
||||||
|
NpcStatusComponent->UpdateCurrentDoubtTime(FMath::Clamp(InCurrentDoubtTime, 0.f, NpcStatusComponent->GetPreviousNpcStatus().fDoubtTime));
|
||||||
|
UpdateDoubtVisualize(InCurrentDoubtTime);
|
||||||
|
}
|
||||||
|
|
||||||
|
void ACoreNpc::ChangeDoubtState(const EDoubtState InDoubtState)
|
||||||
|
{
|
||||||
|
CurrentDoubtState = InDoubtState;
|
||||||
|
GetAIControllerBase()->UpdateDoubtState(InDoubtState);
|
||||||
|
|
||||||
|
switch(InDoubtState)
|
||||||
|
{
|
||||||
|
case EDoubtState::None:
|
||||||
|
{
|
||||||
|
UpdateDoubtTime(0.f);
|
||||||
|
UpdateDoubtVisualize(0.f);
|
||||||
|
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
case EDoubtState::Increasing: case EDoubtState::Decreasing: break;
|
||||||
|
default: NOT_IMPLEMENTED();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
void ACoreNpc::SetHeadTargetRotation(const FVector& InTargetLocation)
|
||||||
|
{
|
||||||
|
NMT_CHECKF(NpcStatusComponent)
|
||||||
|
FVector EyeLocation = GetMesh()->GetSocketLocation(EyeSocketName);
|
||||||
|
FRotator EyeRotation = GetMesh()->GetSocketRotation(EyeSocketName);
|
||||||
|
FRotator WorldLookRotator = UKismetMathLibrary::FindLookAtRotation(EyeLocation, InTargetLocation);
|
||||||
|
FRotator CompLookRotator = WorldLookRotator - EyeRotation;
|
||||||
|
|
||||||
|
float TargetYaw = FMath::Clamp(NpcAnimInstance->ForwardHeadRotation.Yaw + CompLookRotator.Yaw, NpcAnimInstance->ForwardHeadRotation.Yaw - NpcStatusComponent->GetStatusNpcHalfRotationAngle(), NpcAnimInstance->ForwardHeadRotation.Yaw + NpcStatusComponent->GetStatusNpcHalfRotationAngle());
|
||||||
|
HeadRotationInfo.TargetRotation = FRotator(NpcAnimInstance->ForwardHeadRotation.Pitch, TargetYaw, NpcAnimInstance->ForwardHeadRotation.Roll);
|
||||||
|
}
|
||||||
|
|
||||||
|
TArray<EEffectSubTypes> ACoreNpc::GetCurrentEffects() const
|
||||||
|
{
|
||||||
|
TArray<EEffectSubTypes> LocReturnCurrentEffects;
|
||||||
|
EffectTimeMap.GetKeys(LocReturnCurrentEffects);
|
||||||
|
if(LocReturnCurrentEffects.Num() > 0)
|
||||||
|
return LocReturnCurrentEffects;
|
||||||
|
|
||||||
|
LocReturnCurrentEffects.Add(EEffectSubTypes::None);
|
||||||
|
return LocReturnCurrentEffects;
|
||||||
|
}
|
||||||
|
|
||||||
|
void ACoreNpc::HandleForceDetectFromNoise(const bool InbDetectTarget)
|
||||||
|
{
|
||||||
|
bCanTriggerAlert = false;
|
||||||
|
SetReturnLocationFromDefault();
|
||||||
|
if(!IsDamagedState(CurrentState))
|
||||||
|
{
|
||||||
|
ChangeNpcState(ENpcState::Chase);
|
||||||
|
if(InbDetectTarget && (PrevState != ENpcState::Attack && PrevState != ENpcState::Hit))
|
||||||
|
{
|
||||||
|
ApplyStateToQuest(ENpcState::Chase);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
void ACoreNpc::ChangeNpcState(const ENpcState InState)
|
||||||
|
{
|
||||||
|
PrevState = CurrentState;
|
||||||
|
if(CurrentState != InState)
|
||||||
|
{
|
||||||
|
switch(InState)
|
||||||
|
{
|
||||||
|
case ENpcState::Guard:
|
||||||
|
{
|
||||||
|
bCanTriggerAlert = true;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
case ENpcState::Chase: case ENpcState::Attack: case ENpcState::Default: case ENpcState::Doubt: case ENpcState::Returning: case ENpcState::Hit: case ENpcState::Dead:
|
||||||
|
break;
|
||||||
|
default: NMT_LOG("Not Valid ENpcState");
|
||||||
|
}
|
||||||
|
|
||||||
|
CurrentState = InState;
|
||||||
|
GetAIControllerBase()->ChangeNpcStateKey(InState);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
void ACoreNpc::StartDisableNpc()
|
||||||
|
{
|
||||||
|
OnNpcDead.Broadcast();
|
||||||
|
SetActorEnableCollision(false);
|
||||||
|
GetCharacterMovement()->SetMovementMode(MOVE_None);
|
||||||
|
GetAIControllerBase()->StopAI("Death");
|
||||||
|
|
||||||
|
NMT_LOG("DisableNpc")
|
||||||
|
}
|
||||||
|
|
||||||
|
void ACoreNpc::CompleteDisableNpc()
|
||||||
|
{
|
||||||
|
UWorld* World = UGlobalUtilsLibrary::GetValidWorld(this);
|
||||||
|
SetActorHiddenInGame(true);
|
||||||
|
SetActorTickEnabled(false);
|
||||||
|
SetActorLocation(DefaultLocation);
|
||||||
|
SetActorRotation(DefaultRotation);
|
||||||
|
ChangeDoubtState(EDoubtState::None);
|
||||||
|
LastIndicatorState = ENpcIndicatorState::None;
|
||||||
|
|
||||||
|
if(bEnableRespawn)
|
||||||
|
{
|
||||||
|
World->GetTimerManager().SetTimer(RespawnTimerHandle, this, &ACoreNpc::Respawn, RespawnTime, false);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
void ACoreNpc::ResetStateAfterGameEnd()
|
||||||
|
{
|
||||||
|
if(!bActivate)
|
||||||
|
return;
|
||||||
|
|
||||||
|
AAIControllerBase* AIC = GetAIControllerBase();
|
||||||
|
if(AIC->GetTargetActor())
|
||||||
|
AIC->UpdateTargetInfo(nullptr);
|
||||||
|
|
||||||
|
ChangeNpcState(ENpcState::Default);
|
||||||
|
ChangeDoubtState(EDoubtState::None);
|
||||||
|
NpcStatusComponent->ReInitializeStatus();
|
||||||
|
LastIndicatorState = ENpcIndicatorState::None;
|
||||||
|
AIC->StopAI("Ending", false);
|
||||||
|
SetActorTickEnabled(false);
|
||||||
|
}
|
||||||
|
|
||||||
|
void ACoreNpc::ActivateCharacter(const bool InbEnable)
|
||||||
|
{
|
||||||
|
SetActorTickEnabled(InbEnable);
|
||||||
|
SetActorHiddenInGame(!InbEnable);
|
||||||
|
|
||||||
|
TArray<USceneComponent*> Components;
|
||||||
|
GetComponents(Components);
|
||||||
|
|
||||||
|
for (USceneComponent* Component : Components)
|
||||||
|
{
|
||||||
|
Component->SetComponentTickEnabled(InbEnable);
|
||||||
|
}
|
||||||
|
|
||||||
|
if(InbEnable)
|
||||||
|
{
|
||||||
|
bFrustumCullingTimerSet = false;
|
||||||
|
GetCapsuleComponent()->SetCollisionEnabled(ECollisionEnabled::Type::QueryAndPhysics);
|
||||||
|
GetAIControllerBase()->ActivateBehaviorTree(this);
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
GetCapsuleComponent()->SetCollisionEnabled(ECollisionEnabled::NoCollision);
|
||||||
|
}
|
||||||
|
|
||||||
|
bActivate = InbEnable;
|
||||||
|
}
|
||||||
|
|
||||||
|
void ACoreNpc::SetSpringArmRotation()
|
||||||
|
{
|
||||||
|
if(!bUseSocketTransformForVision)
|
||||||
|
return;
|
||||||
|
|
||||||
|
FRotator ArmRotator = SpringArmComponent->GetComponentRotation();
|
||||||
|
SpringArmComponent->SetWorldRotation(UKismetMathLibrary::MakeRotator(ArmRotator.Roll, ArmRotator.Pitch, GetMesh()->GetSocketRotation(EyeSocketName).Yaw));
|
||||||
|
}
|
||||||
|
|
||||||
|
void ACoreNpc::SetVisionMode(EVisionMode InSightMode)
|
||||||
|
{
|
||||||
|
NOT_IMPLEMENTED()
|
||||||
|
}
|
||||||
|
|
||||||
|
void ACoreNpc::UpdateActiveComponentInFrustum() const
|
||||||
|
{
|
||||||
|
APlayerController* PC = UGameplayStatics::GetPlayerController(this, 0);
|
||||||
|
NMT_CHECKF(PC)
|
||||||
|
|
||||||
|
if(ULocalPlayer* LocalPlayer = PC->GetLocalPlayer())
|
||||||
|
{
|
||||||
|
FSceneViewProjectionData ProjectionData;
|
||||||
|
if(LocalPlayer->GetProjectionData(LocalPlayer->ViewportClient->Viewport, ProjectionData))
|
||||||
|
{
|
||||||
|
const FMatrix ViewProjectionMatrix = ProjectionData.ComputeViewProjectionMatrix();
|
||||||
|
|
||||||
|
FConvexVolume Frustum;
|
||||||
|
GetViewFrustumBounds(Frustum, ViewProjectionMatrix, true);
|
||||||
|
bool bInFrustum = Frustum.IntersectSphere(RootComponent->GetComponentLocation(), VisionConeComponent->SightRange);
|
||||||
|
bool bDoNotDraw = IsDamagedState(CurrentState) || bUnDetect;
|
||||||
|
bDoNotDraw |= IsAggressiveState(CurrentState);
|
||||||
|
|
||||||
|
if(VisionConeComponent->IsAllowedDrawing())
|
||||||
|
VisionConeComponent->ToggleDraw(bInFrustum && !bDoNotDraw);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
class USPNpcStatusComponent* ACoreNpc::GetNpcStatusComponent() const
|
||||||
|
{
|
||||||
|
NMT_CHECKF(NpcStatusComponent)
|
||||||
|
return NpcStatusComponent;
|
||||||
|
}
|
||||||
|
|
||||||
|
#if WITH_EDITOR
|
||||||
|
void ACoreNpc::ApplyCharacterData(const FTableRowBase* RowData)
|
||||||
|
{
|
||||||
|
if(!GEditor) return;
|
||||||
|
if(!RowData)
|
||||||
|
{
|
||||||
|
UE_LOG(LogTemp, Error, TEXT("RowName Is Not Valid"))
|
||||||
|
InitializeStatus(FEnemyNpc());
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
const FEnemyNpc* GetData = static_cast<const FEnemyNpc*>(RowData);
|
||||||
|
NMT_CHECKF(GetData)
|
||||||
|
if(*GetData == NpcStatusComponent->GetCurrentNpcStatus()) return;
|
||||||
|
if(GEditor->GetEditorWorldContext().World())
|
||||||
|
InitializeStatus(*GetData);
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
|
@ -0,0 +1,282 @@
|
||||||
|
// Fill out your copyright notice in the Description page of Project Settings.
|
||||||
|
|
||||||
|
#pragma once
|
||||||
|
|
||||||
|
#include "CoreMinimal.h"
|
||||||
|
#include "ProjectT/ProjectT.h"
|
||||||
|
#include "ProjectT/Data/Gen/GenerateEnumContentType.h"
|
||||||
|
#include "ProjectT/Data/Gen/GenerateStructEnemyNPC.h"
|
||||||
|
#include "ProjectT/Data/Npc/NpcDataModel.h"
|
||||||
|
#include "ProjectT/System/Core/Characters/CombatCharacter.h"
|
||||||
|
#include "ProjectT/System/Core/Interfaces/Damageable.h"
|
||||||
|
#include "ProjectT/System/Core/Interfaces/PoolableActor.h"
|
||||||
|
#include "CoreNpc.generated.h"
|
||||||
|
|
||||||
|
struct FEnemyNpc;
|
||||||
|
|
||||||
|
UENUM(BlueprintType)
|
||||||
|
enum class EHeadRotationPhase : uint8
|
||||||
|
{
|
||||||
|
TurnForward = 0 UMETA(DisplayName = "TurnForward"),
|
||||||
|
TurnRight UMETA(DisplayName = "TurnRight"),
|
||||||
|
TurnLeft UMETA(DisplayName = "TurnLeft"),
|
||||||
|
};
|
||||||
|
|
||||||
|
UENUM(BlueprintType)
|
||||||
|
enum class ENpcIndicatorState : uint8
|
||||||
|
{
|
||||||
|
None = 0 UMETA(DisplayName = "None"),
|
||||||
|
Hide UMETA(DisplayName = "Hide"),
|
||||||
|
Question UMETA(DisplayName = "Question"),
|
||||||
|
Exclamation UMETA(DisplayName = "Exclamation"),
|
||||||
|
};
|
||||||
|
|
||||||
|
USTRUCT(BlueprintType)
|
||||||
|
struct FHeadRotationInfo
|
||||||
|
{
|
||||||
|
GENERATED_BODY()
|
||||||
|
|
||||||
|
FHeadRotationInfo() :
|
||||||
|
bOverrideHeadRotation(false),
|
||||||
|
bChangeAlpha(false),
|
||||||
|
TargetRotation(FRotator::ZeroRotator),
|
||||||
|
HeadRotationType(EHeadRotationType::None),
|
||||||
|
CurrentPhaseIdx(0),
|
||||||
|
RotationSpeed(0.f),
|
||||||
|
RotationHalfAngle(0.f),
|
||||||
|
TargetAlpha(0.f)
|
||||||
|
{}
|
||||||
|
|
||||||
|
UPROPERTY(EditAnywhere, BlueprintReadWrite)
|
||||||
|
uint8 bOverrideHeadRotation : 1;
|
||||||
|
|
||||||
|
UPROPERTY(EditDefaultsOnly, BlueprintReadOnly)
|
||||||
|
uint8 bChangeAlpha;
|
||||||
|
|
||||||
|
UPROPERTY(EditDefaultsOnly, BlueprintReadOnly)
|
||||||
|
FRotator TargetRotation;
|
||||||
|
|
||||||
|
UPROPERTY(EditDefaultsOnly, BlueprintReadOnly)
|
||||||
|
EHeadRotationType HeadRotationType;
|
||||||
|
|
||||||
|
UPROPERTY(BlueprintReadOnly)
|
||||||
|
int32 CurrentPhaseIdx;
|
||||||
|
|
||||||
|
UPROPERTY(BlueprintReadOnly)
|
||||||
|
float RotationSpeed;
|
||||||
|
|
||||||
|
UPROPERTY(BlueprintReadOnly)
|
||||||
|
float RotationHalfAngle;
|
||||||
|
|
||||||
|
UPROPERTY(EditDefaultsOnly, BlueprintReadOnly)
|
||||||
|
float TargetAlpha;
|
||||||
|
|
||||||
|
};
|
||||||
|
|
||||||
|
DECLARE_DYNAMIC_MULTICAST_DELEGATE(FOnNpcDead);
|
||||||
|
DECLARE_DYNAMIC_MULTICAST_DELEGATE(FOnNpcRespawn);
|
||||||
|
DECLARE_DYNAMIC_MULTICAST_DELEGATE_OneParam(FOnNpcIndicatorChanged, ENpcIndicatorState, IndicatorState);
|
||||||
|
UCLASS()
|
||||||
|
class PROJECTT_API ACoreNpc : public ACombatCharacter, public IPoolableActor, public IDamageable
|
||||||
|
{
|
||||||
|
GENERATED_BODY()
|
||||||
|
CONTENT_TYPE_NUMBER(EContentType::EnemyNpc)
|
||||||
|
|
||||||
|
public:
|
||||||
|
ACoreNpc();
|
||||||
|
|
||||||
|
virtual void OnConstruction(const FTransform& Transform) override;
|
||||||
|
virtual void Tick(float DeltaTime) override;
|
||||||
|
virtual void EndPlay(const EEndPlayReason::Type EndPlayReason) override;
|
||||||
|
virtual void GetActorEyesViewPoint( FVector& Location, FRotator& Rotation) const override;
|
||||||
|
virtual void PostInitializeComponents() override;
|
||||||
|
virtual void Enable_Implementation() override;
|
||||||
|
virtual void Disable_Implementation() override;
|
||||||
|
virtual void Pushed_Implementation() override;
|
||||||
|
virtual void Obtained_Implementation() override;
|
||||||
|
virtual void GetCurrentEffectTypes_Implementation(TArray<EEffectSubTypes>& OutEffectSubTypes) override;
|
||||||
|
virtual void CompleteDisableNpc();
|
||||||
|
virtual void ActivateCharacter(const bool InbEnable);
|
||||||
|
virtual void SetDetectTargetFromNoise(AActor* InTarget);
|
||||||
|
virtual void SetDetectLocationFromNoise(const FVector& InTargetLocation);
|
||||||
|
virtual void SetVisionMode(EVisionMode InSightMode);
|
||||||
|
virtual void UpdateDoubtTime(const float InCurrentDoubtTime);
|
||||||
|
virtual void ChangeDoubtState(const EDoubtState InDoubtState);
|
||||||
|
void UpdateDoubtVisualize(const float InCurrentDoubtTime);
|
||||||
|
|
||||||
|
UFUNCTION(BlueprintCallable)
|
||||||
|
virtual void StartDisableNpc();
|
||||||
|
|
||||||
|
UFUNCTION(BlueprintCallable)
|
||||||
|
class USPNpcStatusComponent* GetNpcStatusComponent() const;
|
||||||
|
|
||||||
|
UFUNCTION(BlueprintPure)
|
||||||
|
FORCEINLINE ENpcState GetNpcState() const { return CurrentState; }
|
||||||
|
|
||||||
|
UFUNCTION(BlueprintPure)
|
||||||
|
FORCEINLINE ENpcState GetNpcPrevState() const { return PrevState; }
|
||||||
|
|
||||||
|
UFUNCTION(BlueprintPure)
|
||||||
|
FORCEINLINE FVector GetRespawnLocation() const { return DefaultLocation; }
|
||||||
|
|
||||||
|
UFUNCTION(BlueprintCallable)
|
||||||
|
void ChangeHeadRotationState(const EHeadRotationType InHeadRotationType);
|
||||||
|
|
||||||
|
UFUNCTION(BlueprintCallable)
|
||||||
|
virtual void ChangeNpcState(const ENpcState InState);
|
||||||
|
|
||||||
|
FORCEINLINE bool GetCanTriggerAlert() const { return bCanTriggerAlert; }
|
||||||
|
FORCEINLINE bool GetActivatedOnStart() { return bActivatedOnStart; }
|
||||||
|
FORCEINLINE void SetActivatedOnStart(bool InbActivate) { bActivatedOnStart = InbActivate; }
|
||||||
|
FORCEINLINE EDoubtState GetCurrentDoubtState() const { return CurrentDoubtState; }
|
||||||
|
FORCEINLINE EVisionMode GetCurrentVisionMode() const { return CurrentVisionMode; }
|
||||||
|
FORCEINLINE EHeadRotationType GetHeadRotationType() const { return HeadRotationInfo.HeadRotationType; }
|
||||||
|
|
||||||
|
void UpdateActiveComponentInFrustum() const;
|
||||||
|
void SetCanTriggerAlert(const bool InbCanTrigger) { bCanTriggerAlert = InbCanTrigger; }
|
||||||
|
void SetHeadRotationEnable(const bool InbEnable);
|
||||||
|
bool IsAggressiveState(const ENpcState InState) const;
|
||||||
|
bool IsDamagedState(const ENpcState InState) const;
|
||||||
|
void Alert(const FVector& InTargetLocation);
|
||||||
|
void HandleForceDetectFromNoise(const bool InbDetectTarget);
|
||||||
|
FEnemyNpc GetCurrentNpcStatus() const;
|
||||||
|
class AAIControllerBase* GetAIControllerBase() const;
|
||||||
|
bool CanDetectTargetFromNoise() const;
|
||||||
|
void ApplyStateToQuest(const ENpcState InState);
|
||||||
|
void ChangeToChaseInDoubtGauge();
|
||||||
|
void DebugToggleFrustum();
|
||||||
|
void SetHeadTargetRotation(const FVector& InTargetLocation);
|
||||||
|
TArray<EEffectSubTypes> GetCurrentEffects() const;
|
||||||
|
|
||||||
|
protected:
|
||||||
|
virtual void BeginPlay() override;
|
||||||
|
|
||||||
|
#if WITH_EDITOR
|
||||||
|
virtual void ApplyCharacterData(const FTableRowBase* RowData) override;
|
||||||
|
#endif
|
||||||
|
|
||||||
|
virtual void InitializeStatus(const FEnemyNpc InNpcStatus);
|
||||||
|
virtual void InitializeProperty();
|
||||||
|
virtual void InitializeEvents();
|
||||||
|
virtual void Respawn() override;
|
||||||
|
virtual void ResetStateAfterGameEnd();
|
||||||
|
virtual void SetSpringArmRotation();
|
||||||
|
virtual void SetUnDetectTarget(const bool InbUnDetect);
|
||||||
|
virtual void ChangeIndicatorState(const ENpcState InState);
|
||||||
|
void SetupHeadRotationPattern();
|
||||||
|
void UpdateHeadRotation(float InDeltaTime);
|
||||||
|
void UpdateHeadRotationAlpha(float InDeltaTime);
|
||||||
|
void ResetHeadRotation();
|
||||||
|
void PostAlert() const;
|
||||||
|
bool CheckEffectTime(const FEffect& InEffect);
|
||||||
|
void AddEffectTimeMap(const FEffect& InEffect);
|
||||||
|
void EffectTimeDown();
|
||||||
|
void SetReturnLocationFromDefault() const;
|
||||||
|
|
||||||
|
public:
|
||||||
|
UPROPERTY(BlueprintAssignable)
|
||||||
|
FOnNpcDead OnNpcDead;
|
||||||
|
|
||||||
|
UPROPERTY(BlueprintAssignable)
|
||||||
|
FOnNpcRespawn OnNpcRespawn;
|
||||||
|
|
||||||
|
UPROPERTY(BlueprintAssignable)
|
||||||
|
FOnNpcIndicatorChanged OnNpcIndicatorChanged;
|
||||||
|
|
||||||
|
UPROPERTY(EditAnywhere, BlueprintReadWrite)
|
||||||
|
FVector DefaultLocation;
|
||||||
|
|
||||||
|
UPROPERTY(EditAnywhere, BlueprintReadWrite)
|
||||||
|
FRotator DefaultRotation;
|
||||||
|
|
||||||
|
uint8 bReachedHeadRotation : 1;
|
||||||
|
uint8 bCanRotateHeadToTarget : 1;
|
||||||
|
|
||||||
|
protected:
|
||||||
|
UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = "AISetting")
|
||||||
|
uint8 bEnableRespawn : 1;
|
||||||
|
|
||||||
|
UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = "AISetting", meta = (EditCondition = "bEnableRespawn", EditConditionHides))
|
||||||
|
float RespawnTime;
|
||||||
|
|
||||||
|
UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = "AISetting")
|
||||||
|
TObjectPtr<class UBehaviorTree> BehaviorTree;
|
||||||
|
|
||||||
|
UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = "AISetting")
|
||||||
|
TObjectPtr<class UBlackboardData> Blackboard;
|
||||||
|
|
||||||
|
UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = "Component")
|
||||||
|
TObjectPtr<class USceneComponent> SubRootComponent;
|
||||||
|
|
||||||
|
UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = "Component")
|
||||||
|
TObjectPtr<class USceneComponent> WidgetRootComponent;
|
||||||
|
|
||||||
|
UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = "Component")
|
||||||
|
TObjectPtr<class USpringArmComponent> SpringArmComponent;
|
||||||
|
|
||||||
|
UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = "Component")
|
||||||
|
TObjectPtr<class USceneComponent> VisionHead;
|
||||||
|
|
||||||
|
UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = "Component")
|
||||||
|
TObjectPtr<class UVisionConeComponent> VisionConeComponent;
|
||||||
|
|
||||||
|
UPROPERTY(VisibleAnywhere, BlueprintReadOnly, Category = "Component")
|
||||||
|
TObjectPtr<class USPNpcStatusComponent> NpcStatusComponent;
|
||||||
|
|
||||||
|
UPROPERTY(VisibleAnywhere, BlueprintReadOnly, Category = "Component")
|
||||||
|
TObjectPtr<class UObstacleFilterComponent> AlertComponent;
|
||||||
|
|
||||||
|
UPROPERTY(EditDefaultsOnly, BlueprintReadWrite, Category = "Animation")
|
||||||
|
FHeadRotationInfo HeadRotationInfo;
|
||||||
|
|
||||||
|
UPROPERTY(EditAnywhere, BlueprintReadWrite)
|
||||||
|
TObjectPtr<class UNiagaraComponent> NoiseFXComponent;
|
||||||
|
|
||||||
|
UPROPERTY(VisibleAnywhere, BlueprintReadOnly, Category = "Component", meta = (AllowPrivateAccess = "true"))
|
||||||
|
ENpcState CurrentState;
|
||||||
|
|
||||||
|
UPROPERTY(EditAnywhere)
|
||||||
|
float PerceptionMaxAge;
|
||||||
|
|
||||||
|
UPROPERTY(VisibleAnywhere, BlueprintReadOnly)
|
||||||
|
ENpcIndicatorState LastIndicatorState;
|
||||||
|
|
||||||
|
UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = PlayerStatus, meta = (AllowPrivateAccess = "true"))
|
||||||
|
TMap<EEffectSubTypes, FNpcEffectValue> EffectTimeMap;
|
||||||
|
|
||||||
|
UPROPERTY()
|
||||||
|
TObjectPtr<class UNpcAnimInstance> NpcAnimInstance;
|
||||||
|
|
||||||
|
UPROPERTY()
|
||||||
|
TArray<EHeadRotationPhase> CurrentPhaseLists;
|
||||||
|
|
||||||
|
UPROPERTY()
|
||||||
|
FTimerHandle UpdateActiveComponentHandle;
|
||||||
|
|
||||||
|
UPROPERTY()
|
||||||
|
FTimerHandle RespawnTimerHandle;
|
||||||
|
|
||||||
|
UPROPERTY()
|
||||||
|
FTimerHandle EffectTimerHandle;
|
||||||
|
|
||||||
|
UPROPERTY()
|
||||||
|
FTimerHandle CompleteAlertTimerHandle;
|
||||||
|
|
||||||
|
UPROPERTY()
|
||||||
|
uint8 bActivatedOnStart : 1;
|
||||||
|
|
||||||
|
ENpcState PrevState;
|
||||||
|
EDoubtState CurrentDoubtState;
|
||||||
|
EVisionMode CurrentVisionMode;
|
||||||
|
FName EyeSocketName;
|
||||||
|
FName AlertSphereProfileName;
|
||||||
|
TMap<EHeadRotationType, TArray<EHeadRotationPhase>> HeadRotationPatterns;
|
||||||
|
float LoseSightOffset;
|
||||||
|
float HeadRotSpeedMultiplier;
|
||||||
|
uint8 bCanTriggerAlert : 1;
|
||||||
|
uint8 bUnDetect : 1;
|
||||||
|
uint8 bFrustumCullingTimerSet : 1;
|
||||||
|
uint8 bActivate : 1;
|
||||||
|
uint8 bUseSocketTransformForVision : 1;
|
||||||
|
|
||||||
|
};
|
||||||
|
|
@ -0,0 +1,149 @@
|
||||||
|
// Fill out your copyright notice in the Description page of Project Settings.
|
||||||
|
|
||||||
|
|
||||||
|
#include "PlayerCharacterAnimInstance.h"
|
||||||
|
|
||||||
|
#include "ProjectT/ProjectT.h"
|
||||||
|
#include "ProjectT/System/Core/Characters/Player/CorePlayerCharacter.h"
|
||||||
|
|
||||||
|
UPlayerCharacterAnimInstance::UPlayerCharacterAnimInstance() :
|
||||||
|
OwnerPlayerCharacter(nullptr),
|
||||||
|
bPlayerInputable(true),
|
||||||
|
bIdle(true),
|
||||||
|
bRest(false),
|
||||||
|
bWalk(false),
|
||||||
|
bRun(false),
|
||||||
|
bAction(false),
|
||||||
|
bModify(false),
|
||||||
|
PlayerActionMontage(nullptr),
|
||||||
|
PlayerCommonMontage(nullptr),
|
||||||
|
PlayerIdleAnimation(nullptr),
|
||||||
|
PlayerMoveAnimation(nullptr),
|
||||||
|
PlayerRunAnimation(nullptr),
|
||||||
|
ModifyIdleAnimation(nullptr),
|
||||||
|
ModifyMoveAnimation(nullptr),
|
||||||
|
ModifyRunAnimation(nullptr),
|
||||||
|
NonInputAnimState(ENonInputAnimState::None)
|
||||||
|
{
|
||||||
|
}
|
||||||
|
|
||||||
|
void UPlayerCharacterAnimInstance::SetDefaultProperty(AActor* InOwner)
|
||||||
|
{
|
||||||
|
ACorePlayerCharacter* LocOwnerCharacter = Cast<ACorePlayerCharacter>(InOwner);
|
||||||
|
if(!LocOwnerCharacter) return;
|
||||||
|
OwnerPlayerCharacter = LocOwnerCharacter;
|
||||||
|
UAnimMontage* LocPlayerActionMontage;
|
||||||
|
OwnerPlayerCharacter->GetActionMontage(LocPlayerActionMontage);
|
||||||
|
SetActionMontage(LocPlayerActionMontage);
|
||||||
|
TObjectPtr<UAnimSequence> LocSetSequence = nullptr;
|
||||||
|
OwnerPlayerCharacter->GetIdleAnimSequence(LocSetSequence);
|
||||||
|
if(LocSetSequence) PlayerIdleAnimation = LocSetSequence;
|
||||||
|
OwnerPlayerCharacter->GetRestAnimSequence(LocSetSequence);
|
||||||
|
if(LocSetSequence) PlayerRestAnimation = LocSetSequence;
|
||||||
|
OwnerPlayerCharacter->GetMoveAnimSequence(LocSetSequence);
|
||||||
|
if(LocSetSequence) PlayerMoveAnimation = LocSetSequence;
|
||||||
|
OwnerPlayerCharacter->GetRunAnimSequence(LocSetSequence);
|
||||||
|
if(LocSetSequence) PlayerRunAnimation = LocSetSequence;
|
||||||
|
}
|
||||||
|
|
||||||
|
void UPlayerCharacterAnimInstance::SetModifyAnimation(const TObjectPtr<UAnimSequence>& InIdleSequence, const TObjectPtr<UAnimSequence>& InMoveSequence, const TObjectPtr<UAnimSequence>& InRunSequence)
|
||||||
|
{
|
||||||
|
InIdleSequence? ModifyIdleAnimation = InIdleSequence : ModifyIdleAnimation = PlayerIdleAnimation;
|
||||||
|
InMoveSequence? ModifyMoveAnimation = InMoveSequence : ModifyMoveAnimation = PlayerMoveAnimation;
|
||||||
|
InRunSequence? ModifyRunAnimation = InRunSequence : ModifyRunAnimation = PlayerRunAnimation;
|
||||||
|
}
|
||||||
|
|
||||||
|
void UPlayerCharacterAnimInstance::SetActionMontage(UAnimMontage* InSetActionMontage)
|
||||||
|
{
|
||||||
|
if(InSetActionMontage) PlayerActionMontage = InSetActionMontage;
|
||||||
|
}
|
||||||
|
|
||||||
|
void UPlayerCharacterAnimInstance::SetNonInputAnimState(ENonInputAnimState InSetState)
|
||||||
|
{
|
||||||
|
OwnerPlayerCharacter->SetInputable(false);
|
||||||
|
bool LocbChangeState = true;
|
||||||
|
switch(InSetState)
|
||||||
|
{
|
||||||
|
case ENonInputAnimState::Tired:
|
||||||
|
{
|
||||||
|
LocbChangeState = false;
|
||||||
|
NonInputAnimState = InSetState;
|
||||||
|
OwnerPlayerCharacter->SetInputable(true);
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
case ENonInputAnimState::HitBack:
|
||||||
|
{
|
||||||
|
LocbChangeState = !(NonInputAnimState == ENonInputAnimState::JumpBackStart ||
|
||||||
|
NonInputAnimState == ENonInputAnimState::JumpBackLoop ||
|
||||||
|
NonInputAnimState == ENonInputAnimState::JumpBackEnd ||
|
||||||
|
NonInputAnimState == ENonInputAnimState::GetUp ||
|
||||||
|
NonInputAnimState == ENonInputAnimState::Dead);
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
case ENonInputAnimState::JumpBackStart:
|
||||||
|
{
|
||||||
|
LocbChangeState = !(NonInputAnimState == ENonInputAnimState::JumpBackStart ||
|
||||||
|
NonInputAnimState == ENonInputAnimState::JumpBackLoop ||
|
||||||
|
NonInputAnimState == ENonInputAnimState::JumpBackEnd ||
|
||||||
|
NonInputAnimState == ENonInputAnimState::GetUp ||
|
||||||
|
NonInputAnimState == ENonInputAnimState::Dead);
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
case ENonInputAnimState::JumpBackLoop: break;
|
||||||
|
case ENonInputAnimState::JumpBackEnd: break;
|
||||||
|
case ENonInputAnimState::GetUp: break;
|
||||||
|
case ENonInputAnimState::Stun: break;
|
||||||
|
case ENonInputAnimState::Dead: break;
|
||||||
|
case ENonInputAnimState::Defeat: break;
|
||||||
|
case ENonInputAnimState::Victory: break;
|
||||||
|
default: NMT_LOG("Non Input Anim state Invalid"); break;
|
||||||
|
}
|
||||||
|
if(LocbChangeState)
|
||||||
|
{
|
||||||
|
bPlayerInputable = false;
|
||||||
|
NonInputAnimState = InSetState;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
void UPlayerCharacterAnimInstance::StateChangeTest()
|
||||||
|
{
|
||||||
|
}
|
||||||
|
|
||||||
|
void UPlayerCharacterAnimInstance::NonInputAnimFinished()
|
||||||
|
{
|
||||||
|
switch(NonInputAnimState)
|
||||||
|
{
|
||||||
|
case ENonInputAnimState::Tired:
|
||||||
|
{
|
||||||
|
NonInputAnimState = ENonInputAnimState::None;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
case ENonInputAnimState::HitBack:
|
||||||
|
{
|
||||||
|
OwnerPlayerCharacter->SetInputable(true);
|
||||||
|
bPlayerInputable = true;
|
||||||
|
NonInputAnimState = ENonInputAnimState::None;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
case ENonInputAnimState::JumpBackStart: break;
|
||||||
|
case ENonInputAnimState::JumpBackLoop: break;
|
||||||
|
case ENonInputAnimState::JumpBackEnd:
|
||||||
|
{
|
||||||
|
SetNonInputAnimState(ENonInputAnimState::GetUp);
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
case ENonInputAnimState::GetUp:
|
||||||
|
{
|
||||||
|
bPlayerInputable = true;
|
||||||
|
NonInputAnimState = ENonInputAnimState::None;
|
||||||
|
OwnerPlayerCharacter->SetInputable(true);
|
||||||
|
OwnerPlayerCharacter->SetInvincible(false);
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
case ENonInputAnimState::Stun: break;
|
||||||
|
case ENonInputAnimState::Dead: break;
|
||||||
|
case ENonInputAnimState::Defeat: break;
|
||||||
|
case ENonInputAnimState::Victory: break;
|
||||||
|
default: NMT_LOG("Non Input Anim state Invalid"); break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
@ -0,0 +1,107 @@
|
||||||
|
// Fill out your copyright notice in the Description page of Project Settings.
|
||||||
|
|
||||||
|
#pragma once
|
||||||
|
|
||||||
|
#include "CoreMinimal.h"
|
||||||
|
#include "Animation/AnimInstance.h"
|
||||||
|
#include "PlayerCharacterAnimInstance.generated.h"
|
||||||
|
UENUM(BlueprintType)
|
||||||
|
enum class ENonInputAnimState: uint8
|
||||||
|
{
|
||||||
|
None = 0 UMETA(DisplayName = "None"),
|
||||||
|
Tired UMETA(DisplayName = "Tired"),
|
||||||
|
HitBack UMETA(DisplayName = "HitBack"),
|
||||||
|
JumpBackStart UMETA(DisplayName = "JumpBackStart"),
|
||||||
|
JumpBackLoop UMETA(DisplayName = "JumpBackLoop"),
|
||||||
|
JumpBackEnd UMETA(DisplayName = "JumpBackEnd"),
|
||||||
|
GetUp UMETA(DisplayName = "GetUp"),
|
||||||
|
Stun UMETA(DisplayName = "Stun"),
|
||||||
|
Dead UMETA(DisplayName = "Dead"),
|
||||||
|
Defeat UMETA(DisplayName = "Defeat"),
|
||||||
|
Victory UMETA(DisplayName = "Victory")
|
||||||
|
};
|
||||||
|
|
||||||
|
UCLASS()
|
||||||
|
class PROJECTT_API UPlayerCharacterAnimInstance : public UAnimInstance
|
||||||
|
{
|
||||||
|
GENERATED_BODY()
|
||||||
|
|
||||||
|
public:
|
||||||
|
UPlayerCharacterAnimInstance();
|
||||||
|
void SetDefaultProperty(AActor* InOwner);
|
||||||
|
void SetActionState(const bool InbActivate) { bAction = InbActivate; }
|
||||||
|
void SetModifyState(const bool InbModify) { bModify = InbModify; }
|
||||||
|
void NonInputAnimFinished();
|
||||||
|
void GetCommonMontage(UAnimMontage*& OutCommonMontage) const { OutCommonMontage = PlayerCommonMontage; }
|
||||||
|
void SetModifyAnimation(const TObjectPtr<UAnimSequence>& InIdleSequence = nullptr, const TObjectPtr<UAnimSequence>& InMoveSequence = nullptr,
|
||||||
|
const TObjectPtr<UAnimSequence>& InRunSequence = nullptr);
|
||||||
|
ENonInputAnimState GetCurrentNonInputState() { return NonInputAnimState; }
|
||||||
|
|
||||||
|
FORCEINLINE ENonInputAnimState GetCurrentNonInputState() const { return NonInputAnimState; }
|
||||||
|
|
||||||
|
|
||||||
|
UFUNCTION(BlueprintCallable)
|
||||||
|
void SetActionMontage(UAnimMontage* InSetActionMontage);
|
||||||
|
|
||||||
|
UFUNCTION(BlueprintCallable)
|
||||||
|
void SetNonInputAnimState(ENonInputAnimState InSetState);
|
||||||
|
|
||||||
|
UFUNCTION(BlueprintCallable)
|
||||||
|
void StateChangeTest();
|
||||||
|
|
||||||
|
public:
|
||||||
|
UPROPERTY(EditAnywhere, BlueprintReadWrite)
|
||||||
|
class ACorePlayerCharacter* OwnerPlayerCharacter;
|
||||||
|
|
||||||
|
UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = PlayerAnimationState)
|
||||||
|
bool bPlayerInputable;
|
||||||
|
|
||||||
|
UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = PlayerAnimationState)
|
||||||
|
bool bIdle;
|
||||||
|
|
||||||
|
UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = PlayerAnimationState)
|
||||||
|
bool bRest;
|
||||||
|
|
||||||
|
UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = PlayerAnimationState)
|
||||||
|
bool bWalk;
|
||||||
|
|
||||||
|
UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = PlayerAnimationState)
|
||||||
|
bool bRun;
|
||||||
|
|
||||||
|
UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = PlayerAnimationState)
|
||||||
|
bool bAction;
|
||||||
|
|
||||||
|
UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = PlayerAnimationState)
|
||||||
|
bool bModify;
|
||||||
|
|
||||||
|
protected:
|
||||||
|
UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = PlayerAnimationState)
|
||||||
|
TObjectPtr<UAnimMontage> PlayerActionMontage;
|
||||||
|
|
||||||
|
UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = PlayerAnimationState)
|
||||||
|
TObjectPtr<UAnimMontage> PlayerCommonMontage;
|
||||||
|
|
||||||
|
UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = PlayerAnimationState)
|
||||||
|
TObjectPtr<UAnimSequence> PlayerIdleAnimation;
|
||||||
|
|
||||||
|
UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = PlayerAnimationState)
|
||||||
|
TObjectPtr<UAnimSequence> PlayerRestAnimation;
|
||||||
|
|
||||||
|
UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = PlayerAnimationState)
|
||||||
|
TObjectPtr<UAnimSequence> PlayerMoveAnimation;
|
||||||
|
|
||||||
|
UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = PlayerAnimationState)
|
||||||
|
TObjectPtr<UAnimSequence> PlayerRunAnimation;
|
||||||
|
|
||||||
|
UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = PlayerAnimationState)
|
||||||
|
TObjectPtr<UAnimSequence> ModifyIdleAnimation;
|
||||||
|
|
||||||
|
UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = PlayerAnimationState)
|
||||||
|
TObjectPtr<UAnimSequence> ModifyMoveAnimation;
|
||||||
|
|
||||||
|
UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = PlayerAnimationState)
|
||||||
|
TObjectPtr<UAnimSequence> ModifyRunAnimation;
|
||||||
|
|
||||||
|
UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = PlayerAnimationState)
|
||||||
|
ENonInputAnimState NonInputAnimState;
|
||||||
|
};
|
||||||
File diff suppressed because it is too large
Load Diff
|
|
@ -0,0 +1,360 @@
|
||||||
|
// Fill out your copyright notice in the Description page of Project Settings.
|
||||||
|
|
||||||
|
#pragma once
|
||||||
|
|
||||||
|
#include "CoreMinimal.h"
|
||||||
|
#include "GenericTeamAgentInterface.h"
|
||||||
|
#include "ProjectT/System/Core/Characters/CombatCharacter.h"
|
||||||
|
#include "ProjectT/ProjectT.h"
|
||||||
|
#include "ProjectT/Data/Gen/GenerateEnumContentType.h"
|
||||||
|
#include "ProjectT/Data/Gen/GenerateStructPlayerCharacter.h"
|
||||||
|
#include "ProjectT/System/Core/Interfaces/Damageable.h"
|
||||||
|
#include "ProjectT/Data/Player/PlayerDataModel.h"
|
||||||
|
#include "CorePlayerCharacter.generated.h"
|
||||||
|
|
||||||
|
struct FInputActionValue;
|
||||||
|
class UInputAction;
|
||||||
|
class UInputMappingContext;
|
||||||
|
class UCoreCameraComponent;
|
||||||
|
class USpringArmComponent;
|
||||||
|
DECLARE_DYNAMIC_DELEGATE_TwoParams(FOnRequestInteractIcon, const FString&, ThumnailPath, const bool, bVisibility);
|
||||||
|
DECLARE_DYNAMIC_MULTICAST_DELEGATE_TwoParams(FItemSlotActivate, const int&, SlotNumber, const bool, bActivate);
|
||||||
|
DECLARE_DYNAMIC_MULTICAST_DELEGATE_ThreeParams(FSkillCoolTime, TSubclassOf<class ACoreSkill>, SkillClass, float, RemainTimeRatio, bool, bCoolDownComplete);
|
||||||
|
DECLARE_DYNAMIC_MULTICAST_DELEGATE_ThreeParams(FEffectTime, EEffectSubTypes, EffectSubTypes, float, RemainTimeRatio, bool, bEffectRecover);
|
||||||
|
DECLARE_DYNAMIC_MULTICAST_DELEGATE_OneParam(FInteractionIconVisibility, bool, bVisible);
|
||||||
|
DECLARE_DYNAMIC_MULTICAST_DELEGATE(FPlayerDeadDone);
|
||||||
|
|
||||||
|
UCLASS()
|
||||||
|
class PROJECTT_API ACorePlayerCharacter : public ACombatCharacter, public IGenericTeamAgentInterface, public IDamageable
|
||||||
|
{
|
||||||
|
GENERATED_BODY()
|
||||||
|
CONTENT_TYPE_NUMBER(EContentType::PlayerCharacter)
|
||||||
|
|
||||||
|
public:
|
||||||
|
ACorePlayerCharacter();
|
||||||
|
virtual FGenericTeamId GetGenericTeamId() const override { return FGenericTeamId(1); }
|
||||||
|
virtual void PostLoad() override;
|
||||||
|
virtual void OnConstruction(const FTransform& Transform) override;
|
||||||
|
virtual void BeginPlay() override;
|
||||||
|
virtual void Tick(float DeltaTime) override;
|
||||||
|
|
||||||
|
virtual void SetupPlayerInputComponent(class UInputComponent* PlayerInputComponent) override;
|
||||||
|
virtual void ApplyDamageEvent_Implementation(AActor* InOccurActor, const FVector& InOriginLocation, const float InDamage, const TArray<FEffect>& InSkillEffects) override;
|
||||||
|
virtual void ApplyRecoveryEvent_Implementation(const TArray<FEffect>& InReleaseEffects) override;
|
||||||
|
virtual void EndPlay(const EEndPlayReason::Type EndPlayReason) override;
|
||||||
|
void SetupPlayerInputActions();
|
||||||
|
void SetCurrentSkill(bool InbSet, ACoreSkill* InSetSkill = nullptr);
|
||||||
|
void PlayActionMontage(FName InSectionName, FOnMontageEnded InEndedFunction = nullptr, FOnMontageBlendingOutStarted InBlendOutFunction = nullptr) const;
|
||||||
|
void PlayCommonMontage(FName InSectionName, FOnMontageEnded InEndedFunction = nullptr, FOnMontageBlendingOutStarted InBlendOutFunction = nullptr) const;
|
||||||
|
void StopActionMontage() const;
|
||||||
|
void SetUnDetectState(bool InbUnDetect);
|
||||||
|
void SetSlotCursor(int InSetSlotCursor);
|
||||||
|
|
||||||
|
void GetAudioListener(USceneComponent*& OutAudioListener);
|
||||||
|
void GetCameraComponent(TObjectPtr<UCoreCameraComponent>& OutCoreCameraComponent) const { OutCoreCameraComponent = CoreCameraComponent; }
|
||||||
|
void GetAnimInstance(class UPlayerCharacterAnimInstance*& OutAnimInstance) const { OutAnimInstance = PlayerAnimInstance; }
|
||||||
|
void GetCurrentSkill(ACoreSkill*& OutCurrentSkill) const { OutCurrentSkill = CurrentUsingSkill; }
|
||||||
|
void GetInvincible(bool& OutbInvincible) const { OutbInvincible = bInvincible; }
|
||||||
|
void GetSkillClass(TSubclassOf<AActor>& OutAtkSkillClass, TSubclassOf<AActor>& OutSkillClass) const;
|
||||||
|
void GetActionMontage(UAnimMontage*& OutActionMontage) const { OutActionMontage = ActionMontage; }
|
||||||
|
void GetIdleAnimSequence(TObjectPtr<UAnimSequence>& OutIdleAnimSequence) const { OutIdleAnimSequence = IdleAnimation; }
|
||||||
|
void GetRestAnimSequence(TObjectPtr<UAnimSequence>& OutIdleAnimSequence) const { OutIdleAnimSequence = RestAnimation; }
|
||||||
|
void GetMoveAnimSequence(TObjectPtr<UAnimSequence>& OutMoveAnimSequence) const { OutMoveAnimSequence = MoveAnimation; }
|
||||||
|
void GetRunAnimSequence(TObjectPtr<UAnimSequence>& OutRunAnimSequence) const { OutRunAnimSequence = RunAnimation; }
|
||||||
|
void GetPlayerCharacterData(FPlayerCharacter& OutPlayerCharacterData) const;
|
||||||
|
void GetUnDetectState(bool& OutUnDetect) const { OutUnDetect = bUnDetect; }
|
||||||
|
void GetSlotCursor(int& OutCurrentCursor) const { OutCurrentCursor = CurrentSlotCursor; }
|
||||||
|
FORCEINLINE class UPlayerInventoryComponent* GetPlayerInventory() { return PlayerInventoryComponent; }
|
||||||
|
FORCEINLINE class UPlayerStatusComponent* GetPlayerStatus() { return PlayerStatusComponent; }
|
||||||
|
|
||||||
|
UFUNCTION(BlueprintCallable)
|
||||||
|
void SetInputable(bool InbEnable);
|
||||||
|
|
||||||
|
UFUNCTION(BlueprintCallable)
|
||||||
|
void SetInvincible(bool InbInvincible);
|
||||||
|
|
||||||
|
UFUNCTION(BlueprintNativeEvent)
|
||||||
|
void StartCountDown();
|
||||||
|
|
||||||
|
UFUNCTION()
|
||||||
|
void EventOnDead();
|
||||||
|
|
||||||
|
//FIXME: 임시용 상호작용 불가능 아이콘 표시를 띄우기 위한 델리게이트 추가
|
||||||
|
UFUNCTION(BlueprintCallable)
|
||||||
|
void UpdateRequestInteractionIcon(const FOnRequestInteractIcon& Callback);
|
||||||
|
|
||||||
|
protected:
|
||||||
|
#if WITH_EDITOR
|
||||||
|
virtual void PostEditChangeProperty(FPropertyChangedEvent& PropertyChangedEvent) override;
|
||||||
|
virtual void ApplyCharacterData(const FTableRowBase* RowData) override;
|
||||||
|
#endif
|
||||||
|
virtual void SetSkillState(EPlayerSkillState InSkillState, FSkill InSkillData = FSkill());
|
||||||
|
virtual void SetMeleeAtkSkillState(EPlayerSkillState InSkillState, FSkill InSkillData = FSkill());
|
||||||
|
virtual void SetItemSkillState(EPlayerSkillState InSkillState, FSkill InSkillData = FSkill());
|
||||||
|
void InitPlayerCharacter();
|
||||||
|
void InitializeProperty();
|
||||||
|
void SetSkillClass();
|
||||||
|
|
||||||
|
void AxisMoveStarted();
|
||||||
|
void AxisMoveTriggered(const FInputActionValue& Value);
|
||||||
|
void AxisMoveCompleted();
|
||||||
|
void RunTriggered(const FInputActionValue& Value);
|
||||||
|
virtual void ChangeValueOnRun(bool InbRun);
|
||||||
|
void RunCompleted();
|
||||||
|
void ActivateMeleeAttack();
|
||||||
|
void ActivateSkill();
|
||||||
|
void ActivateItemSkill(int InCurrentInput, int InItemSkillId);
|
||||||
|
void InteractionStarted();
|
||||||
|
void InteractionCompleted();
|
||||||
|
void UseItemSlot1();
|
||||||
|
void UseItemSlot2();
|
||||||
|
void UseItemSlot3();
|
||||||
|
void ToggleGameMenu();
|
||||||
|
|
||||||
|
void DebugToggleCheat(const FInputActionValue& InputActionValue);
|
||||||
|
void DebugToggleInvincible(const FInputActionValue& InputActionValue);
|
||||||
|
void DebugTogglePlayerDamage(const FInputActionValue& InputActionValue);
|
||||||
|
void DebugTogglePlayerSpeed(const FInputActionValue& InputActionValue);
|
||||||
|
void DebugToggleFrustum(const FInputActionValue& InputActionValue);
|
||||||
|
void DebugToggleHitCollision(const FInputActionValue& InputActionValue);
|
||||||
|
void DebugToggleTimeStop(const FInputActionValue& InputActionValue);
|
||||||
|
void DebugToggleSlomo(const FInputActionValue& InputActionValue);
|
||||||
|
void DebugCharacterSelect(const FInputActionValue& InputActionValue);
|
||||||
|
void DebugToggleSpectatorPawn(const FInputActionValue& InputActionValue);
|
||||||
|
|
||||||
|
void RespawnCharacter();
|
||||||
|
void AppearPlayerCharacter();
|
||||||
|
void SetSkillCoolTime(const TSubclassOf<AActor>& InSkillClass, const FSkill& InSkillData);
|
||||||
|
void SkillCoolTimeDown();
|
||||||
|
bool CheckEffectTime(const FEffect& InEffect);
|
||||||
|
void AddEffectTimeMap(const FEffect& InEffect);
|
||||||
|
void EffectTimeDown();
|
||||||
|
void RecoverStamina();
|
||||||
|
void DecreaseStamina();
|
||||||
|
void SetActorRotationToMouseCursor();
|
||||||
|
void RotateMeshToMouseCursor();
|
||||||
|
virtual void RotateMeshAxisForward(bool InbMove);
|
||||||
|
bool CheckSkillCalibrateRange(const FSkill& InSkillData, AActor*& OutNearActor) const;
|
||||||
|
void CalibrateMeshNearActor(const AActor* InNearActor);
|
||||||
|
void CalibrateMeshMouseCursor();
|
||||||
|
void CalibrateMeshAxisForward();
|
||||||
|
void CheckClosestObject();
|
||||||
|
void CheckPlayerFalling();
|
||||||
|
void ActivateNoiseFX(bool InActivate);
|
||||||
|
void StatusSlow(float InSlowValue, bool InbRecovery = false) const;
|
||||||
|
void StatusFast(float InFastValue, bool InbRecovery = false) const;
|
||||||
|
void StartMouseCursorLinear(bool InbStart, bool InbSustain = true);
|
||||||
|
void StartMouseCursorParabola(bool InbStart, bool InbSustain = true, bool InbPathVisible = true);
|
||||||
|
|
||||||
|
UFUNCTION(BlueprintCallable)
|
||||||
|
void RestTimerStart();
|
||||||
|
|
||||||
|
UFUNCTION(BlueprintCallable)
|
||||||
|
void RefreshRestTime();
|
||||||
|
|
||||||
|
UFUNCTION(BlueprintCallable)
|
||||||
|
void PlayerJumpBack(AActor* InOccurActor);
|
||||||
|
|
||||||
|
UFUNCTION()
|
||||||
|
void ResetCharacterData();
|
||||||
|
|
||||||
|
UFUNCTION()
|
||||||
|
void InteractionAreaBeginOverlap(UPrimitiveComponent* OverlappedComp, AActor* OtherActor, UPrimitiveComponent* OtherComp, int32 OtherBodyIndex, bool bFromSweep, const FHitResult& SweepResult);
|
||||||
|
|
||||||
|
UFUNCTION()
|
||||||
|
void InteractionAreaEndOverlap(UPrimitiveComponent* OverlappedComp, AActor* OtherActor, UPrimitiveComponent* OtherComp, int32 OtherBodyIndex);
|
||||||
|
|
||||||
|
UFUNCTION()
|
||||||
|
void NoiseAreaBeginOverlap(UPrimitiveComponent* OverlappedComp, AActor* OtherActor, UPrimitiveComponent* OtherComp, int32 OtherBodyIndex, bool bFromSweep, const FHitResult& SweepResult);
|
||||||
|
|
||||||
|
UFUNCTION()
|
||||||
|
void NoiseAreaEndOverlap(UPrimitiveComponent* OverlappedComp, AActor* OtherActor, UPrimitiveComponent* OtherComp, int32 OtherBodyIndex);
|
||||||
|
|
||||||
|
UFUNCTION(BlueprintCallable)
|
||||||
|
void SetDecreaseStaminaTimer(bool InbDecrease);
|
||||||
|
|
||||||
|
|
||||||
|
private:
|
||||||
|
void InitializeCharacterSet();
|
||||||
|
|
||||||
|
public:
|
||||||
|
//FIXME: 임시용 상호작용 불가능 아이콘 표시를 띄우기 위한 델리게이트 추가
|
||||||
|
UPROPERTY()
|
||||||
|
FOnRequestInteractIcon OnRequestInteractIcon;
|
||||||
|
|
||||||
|
UPROPERTY(BlueprintAssignable)
|
||||||
|
FInteractionIconVisibility RefreshInteractionVisibility;
|
||||||
|
|
||||||
|
UPROPERTY(BlueprintAssignable)
|
||||||
|
FPlayerDeadDone PlayerDeadDone;
|
||||||
|
|
||||||
|
UPROPERTY(BlueprintAssignable)
|
||||||
|
FSkillCoolTime RefreshSkillCoolTime;
|
||||||
|
|
||||||
|
UPROPERTY(BlueprintAssignable)
|
||||||
|
FEffectTime RefreshEffectTime;
|
||||||
|
|
||||||
|
UPROPERTY(BlueprintAssignable)
|
||||||
|
FItemSlotActivate ItemSlotActivate;
|
||||||
|
|
||||||
|
UPROPERTY(VisibleAnywhere, BlueprintReadOnly,Category = PlayerSkill, meta = (AllowPrivateAccess = "true"))
|
||||||
|
TObjectPtr<USceneComponent> SkillRootScene;
|
||||||
|
|
||||||
|
protected:
|
||||||
|
FRotator MovingActionForward;
|
||||||
|
FRotator MouseCursorRotation;
|
||||||
|
bool bInvincible;
|
||||||
|
bool bDead;
|
||||||
|
float CalibrateYawValue;
|
||||||
|
float RestTime;
|
||||||
|
|
||||||
|
UPROPERTY(EditDefaultsOnly, BlueprintReadWrite, Category = PlayerAnimation, meta = (AllowPrivateAccess = "true"))
|
||||||
|
TObjectPtr<UAnimMontage> ActionMontage;
|
||||||
|
|
||||||
|
UPROPERTY(EditDefaultsOnly, BlueprintReadWrite, Category = PlayerAnimation, meta = (AllowPrivateAccess = "true"))
|
||||||
|
TObjectPtr<UAnimSequence> IdleAnimation;
|
||||||
|
|
||||||
|
UPROPERTY(EditDefaultsOnly, BlueprintReadWrite, Category = PlayerAnimation, meta = (AllowPrivateAccess = "true"))
|
||||||
|
TObjectPtr<UAnimSequence> RestAnimation;
|
||||||
|
|
||||||
|
UPROPERTY(EditDefaultsOnly, BlueprintReadWrite, Category = PlayerAnimation, meta = (AllowPrivateAccess = "true"))
|
||||||
|
TObjectPtr<UAnimSequence> MoveAnimation;
|
||||||
|
|
||||||
|
UPROPERTY(EditDefaultsOnly, BlueprintReadWrite, Category = PlayerAnimation, meta = (AllowPrivateAccess = "true"))
|
||||||
|
TObjectPtr<UAnimSequence> RunAnimation;
|
||||||
|
|
||||||
|
UPROPERTY(VisibleAnywhere, BlueprintReadOnly, Category = PlayerStatus, meta = (AllowPrivateAccess = "true"))
|
||||||
|
TObjectPtr<class UPlayerStatusComponent> PlayerStatusComponent;
|
||||||
|
|
||||||
|
UPROPERTY(VisibleAnywhere, BlueprintReadOnly, Category = PlayerStatus, meta = (AllowPrivateAccess = "true"))
|
||||||
|
TObjectPtr<class UPlayerInventoryComponent> PlayerInventoryComponent;
|
||||||
|
|
||||||
|
UPROPERTY(VisibleAnywhere, BlueprintReadOnly, Category = PlayerStatus, meta = (AllowPrivateAccess = "true"))
|
||||||
|
TObjectPtr<USceneComponent> AudioListener;
|
||||||
|
|
||||||
|
UPROPERTY(VisibleAnywhere, BlueprintReadWrite, Category = PlayerAnimation, meta = (AllowPrivateAccess = "true"))
|
||||||
|
UPlayerCharacterAnimInstance* PlayerAnimInstance;
|
||||||
|
|
||||||
|
UPROPERTY(EditDefaultsOnly, BlueprintReadWrite, Category = PlayerAnimation, meta = (AllowPrivateAccess = "true"))
|
||||||
|
TObjectPtr<class UPoseableMeshComponent> TransformMeshComponent;
|
||||||
|
|
||||||
|
UPROPERTY(VisibleAnywhere, BlueprintReadOnly, Category = Interaction, meta = (AllowPrivateAccess = "true"))
|
||||||
|
TObjectPtr<class USphereComponent> InteractionAreaCollision;
|
||||||
|
|
||||||
|
UPROPERTY(VisibleAnywhere, BlueprintReadOnly, Category = Interaction, meta = (AllowPrivateAccess = "true"))
|
||||||
|
TObjectPtr<USphereComponent> NoiseAreaCollision;
|
||||||
|
|
||||||
|
UPROPERTY(VisibleAnywhere, BlueprintReadOnly, Category = Interaction, meta = (AllowPrivateAccess = "true"))
|
||||||
|
TObjectPtr<USphereComponent> SkillCalibrateAreaCollision;
|
||||||
|
|
||||||
|
UPROPERTY(VisibleAnywhere, BlueprintReadOnly, Category = Camera, meta = (AllowPrivateAccess = "true"))
|
||||||
|
TObjectPtr<USpringArmComponent> CameraBoom;
|
||||||
|
|
||||||
|
UPROPERTY(VisibleAnywhere, BlueprintReadOnly, Category = Camera, meta = (AllowPrivateAccess = "true"))
|
||||||
|
TObjectPtr<UCoreCameraComponent> CoreCameraComponent;
|
||||||
|
|
||||||
|
UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = Input, meta = (AllowPrivateAccess = "true"))
|
||||||
|
TObjectPtr<UInputMappingContext> DefaultMappingContext;
|
||||||
|
|
||||||
|
UPROPERTY(EditAnywhere, BlueprintReadOnly)
|
||||||
|
TObjectPtr<class UNiagaraComponent> RunFXComponent;
|
||||||
|
|
||||||
|
UPROPERTY(EditAnywhere, BlueprintReadOnly)
|
||||||
|
TObjectPtr<UNiagaraComponent> NoiseFXComponent;
|
||||||
|
|
||||||
|
UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = PlayerStatus, meta = (AllowPrivateAccess = "true"))
|
||||||
|
TObjectPtr<ACoreSkill> CurrentUsingSkill;
|
||||||
|
|
||||||
|
UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = PlayerStatus, meta = (AllowPrivateAccess = "true"))
|
||||||
|
TObjectPtr<AActor> InteractableObject;
|
||||||
|
|
||||||
|
UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = Input)
|
||||||
|
FPlayerActionTypes PlayerActions;
|
||||||
|
|
||||||
|
UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = Input)
|
||||||
|
FPlayerDebugActionTypes PlayerDebugActions;
|
||||||
|
|
||||||
|
UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = Input)
|
||||||
|
FPlayerChordedActionTypes PlayerChordedActions;
|
||||||
|
|
||||||
|
UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = Input)
|
||||||
|
float AxisMoveSpeed;
|
||||||
|
|
||||||
|
UPROPERTY(EditAnywhere, BlueprintReadWrite)
|
||||||
|
FVector2D CharacterMoveAxis;
|
||||||
|
|
||||||
|
UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = Input, meta = (AllowPrivateAccess = "true"))
|
||||||
|
bool bInputAble;
|
||||||
|
|
||||||
|
UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = Input, meta = (AllowPrivateAccess = "true"))
|
||||||
|
bool bUnDetect;
|
||||||
|
|
||||||
|
UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = Input, meta = (AllowPrivateAccess = "true"))
|
||||||
|
int CurrentSlotCursor;
|
||||||
|
|
||||||
|
UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = PlayerStatus, meta = (AllowPrivateAccess = "true"))
|
||||||
|
FPlayerCharacter CurrentPlayerData;
|
||||||
|
|
||||||
|
UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = PlayerStatus, meta = (AllowPrivateAccess = "true"))
|
||||||
|
TMap<TSubclassOf<ACoreSkill>, FPlayerSimpleRatio> SkillCoolTimeMap;
|
||||||
|
|
||||||
|
UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = PlayerStatus, meta = (AllowPrivateAccess = "true"))
|
||||||
|
TMap<EEffectSubTypes, FPlayerEffectValue> EffectTimeMap;
|
||||||
|
|
||||||
|
UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = PlayerStatus, meta = (AllowPrivateAccess = "true"))
|
||||||
|
TSubclassOf<ACoreSkill> PlayerAtkSkillClass;
|
||||||
|
|
||||||
|
UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = PlayerStatus, meta = (AllowPrivateAccess = "true"))
|
||||||
|
TSubclassOf<ACoreSkill> PlayerSkillClass;
|
||||||
|
|
||||||
|
UPROPERTY()
|
||||||
|
class ACorePlayerController* CorePlayerController;
|
||||||
|
|
||||||
|
UPROPERTY()
|
||||||
|
TArray<EEffectSubTypes> ContainEffects;
|
||||||
|
|
||||||
|
UPROPERTY()
|
||||||
|
FTimerHandle SkillCoolDownTimerHandle;
|
||||||
|
|
||||||
|
UPROPERTY()
|
||||||
|
FTimerHandle EffectActiveTimerHandle;
|
||||||
|
|
||||||
|
UPROPERTY()
|
||||||
|
FTimerHandle ClosestObjectTimerHandle;
|
||||||
|
|
||||||
|
UPROPERTY()
|
||||||
|
FTimerHandle DecreaseStaminaTimerHandle;
|
||||||
|
|
||||||
|
UPROPERTY()
|
||||||
|
FTimerHandle RecoverStaminaTimerHandle;
|
||||||
|
|
||||||
|
UPROPERTY()
|
||||||
|
FTimerHandle MeshRotateCalibrateTimerHandle;
|
||||||
|
|
||||||
|
UPROPERTY()
|
||||||
|
FTimerHandle FadeTimerHandle;
|
||||||
|
|
||||||
|
UPROPERTY()
|
||||||
|
FTimerHandle JumpBackTimerHandle;
|
||||||
|
|
||||||
|
UPROPERTY()
|
||||||
|
FTimerHandle MouseCursorTimerHandle;
|
||||||
|
|
||||||
|
UPROPERTY()
|
||||||
|
FTimerHandle RestTimerHandle;
|
||||||
|
|
||||||
|
UPROPERTY()
|
||||||
|
UEnhancedInputComponent* CurrentEnhancedInputComponent;
|
||||||
|
|
||||||
|
UPROPERTY(EditDefaultsOnly, Category = "MovingAction")
|
||||||
|
bool bMovingAction;
|
||||||
|
|
||||||
|
UPROPERTY(EditDefaultsOnly, Category = "MovingAction")
|
||||||
|
float MeleeAtkDecreaseSpeedRatio;
|
||||||
|
|
||||||
|
UPROPERTY(EditDefaultsOnly, Category = "MovingAction")
|
||||||
|
float SkillDecreaseSpeedRatio;
|
||||||
|
|
||||||
|
UPROPERTY(EditDefaultsOnly, Category = "Skill")
|
||||||
|
bool bCalibrateSkill;
|
||||||
|
};
|
||||||
|
|
@ -0,0 +1,22 @@
|
||||||
|
// Fill out your copyright notice in the Description page of Project Settings.
|
||||||
|
|
||||||
|
|
||||||
|
#include "SkillObjectAnimInstance.h"
|
||||||
|
|
||||||
|
USkillObjectAnimInstance::USkillObjectAnimInstance() :
|
||||||
|
ObjectMontage(nullptr),
|
||||||
|
ObjectIdleAnimation(nullptr)
|
||||||
|
{
|
||||||
|
}
|
||||||
|
|
||||||
|
void USkillObjectAnimInstance::SetDefaultProperty(TObjectPtr<UAnimSequence> InIdleSequence, TObjectPtr<UAnimMontage> InObjectMontage)
|
||||||
|
{
|
||||||
|
if(InIdleSequence)
|
||||||
|
{
|
||||||
|
ObjectIdleAnimation = InIdleSequence;
|
||||||
|
}
|
||||||
|
if(InObjectMontage)
|
||||||
|
{
|
||||||
|
ObjectMontage = InObjectMontage;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
@ -0,0 +1,28 @@
|
||||||
|
// Fill out your copyright notice in the Description page of Project Settings.
|
||||||
|
|
||||||
|
#pragma once
|
||||||
|
|
||||||
|
#include "CoreMinimal.h"
|
||||||
|
#include "Animation/AnimInstance.h"
|
||||||
|
#include "SkillObjectAnimInstance.generated.h"
|
||||||
|
|
||||||
|
/**
|
||||||
|
*
|
||||||
|
*/
|
||||||
|
UCLASS()
|
||||||
|
class PROJECTT_API USkillObjectAnimInstance : public UAnimInstance
|
||||||
|
{
|
||||||
|
GENERATED_BODY()
|
||||||
|
|
||||||
|
public:
|
||||||
|
USkillObjectAnimInstance();
|
||||||
|
void SetDefaultProperty(TObjectPtr<UAnimSequence> InIdleSequence, TObjectPtr<UAnimMontage> InObjectMontage);
|
||||||
|
TObjectPtr<UAnimMontage> GetSkillObjectMontage() { return ObjectMontage; }
|
||||||
|
|
||||||
|
protected:
|
||||||
|
UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = PlayerAnimationState)
|
||||||
|
TObjectPtr<UAnimMontage> ObjectMontage;
|
||||||
|
|
||||||
|
UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = PlayerAnimationState)
|
||||||
|
TObjectPtr<UAnimSequence> ObjectIdleAnimation;
|
||||||
|
};
|
||||||
|
|
@ -0,0 +1,277 @@
|
||||||
|
// Fill out your copyright notice in the Description page of Project Settings.
|
||||||
|
|
||||||
|
|
||||||
|
#include "CoreSkill.h"
|
||||||
|
|
||||||
|
#include "NiagaraComponent.h"
|
||||||
|
#include "NiagaraSystem.h"
|
||||||
|
#include "Components/SphereComponent.h"
|
||||||
|
#include "Kismet/KismetMathLibrary.h"
|
||||||
|
#include "ProjectT/Data/Gen/GenerateEnumDataTableKey.h"
|
||||||
|
#include "ProjectT/System/Core/Characters/NPC/CoreNpc.h"
|
||||||
|
#include "ProjectT/System/Core/Characters/Player/CorePlayerCharacter.h"
|
||||||
|
#include "ProjectT/System/Core/Common/AssetUtilsLibrary.h"
|
||||||
|
#include "ProjectT/System/Core/Common/GlobalUtilsLibrary.h"
|
||||||
|
#include "ProjectT/System/Core/GameModes/WorldGameMode.h"
|
||||||
|
#include "ProjectT/System/Core/Managers/CoreCheatManager.h"
|
||||||
|
#include "ProjectT/System/Core/Managers/PooledActorManager.h"
|
||||||
|
|
||||||
|
ACoreSkill::ACoreSkill():
|
||||||
|
SkillRowName(TEXT("None")),
|
||||||
|
RootSceneComponent(nullptr),
|
||||||
|
NoiseSphereComponent(nullptr),
|
||||||
|
HitFXSystem(nullptr),
|
||||||
|
NoiseFXComponent(nullptr),
|
||||||
|
SkillPoolsize(10),
|
||||||
|
SkillOwner(nullptr),
|
||||||
|
SkillId(0),
|
||||||
|
bAimState(false),
|
||||||
|
bCanceled(false),
|
||||||
|
bReleased(false),
|
||||||
|
bActivated(false),
|
||||||
|
BodyHitComponent(nullptr),
|
||||||
|
RangeHitComponent(nullptr)
|
||||||
|
{
|
||||||
|
PrimaryActorTick.bCanEverTick = true;
|
||||||
|
|
||||||
|
RootSceneComponent = CreateDefaultSubobject<USceneComponent>(TEXT("RootSceneComponent"));
|
||||||
|
NoiseSphereComponent = CreateDefaultSubobject<USphereComponent>(TEXT("NoiseSphereComponent"));
|
||||||
|
NoiseFXComponent = CreateDefaultSubobject<UNiagaraComponent>(TEXT("NoiseFXComponent"));
|
||||||
|
|
||||||
|
RootComponent = RootSceneComponent;
|
||||||
|
|
||||||
|
NoiseSphereComponent->SetupAttachment(RootSceneComponent);
|
||||||
|
NoiseSphereComponent->SetCollisionProfileName(TEXT("PlayerHit"));
|
||||||
|
NoiseSphereComponent->SetCollisionEnabled(ECollisionEnabled::Type::NoCollision);
|
||||||
|
NoiseFXComponent->SetupAttachment(NoiseSphereComponent);
|
||||||
|
NoiseFXComponent->bAutoActivate = false;
|
||||||
|
}
|
||||||
|
|
||||||
|
void ACoreSkill::InitializeSkillData()
|
||||||
|
{
|
||||||
|
if(SkillRowName.IsNone()) return;
|
||||||
|
LinearTraceQuery = UEngineTypes::ConvertToTraceType(ECC_GameTraceChannel3);
|
||||||
|
UDataTable* LocDataTable = UAssetUtilsLibrary::LoadDataTableByEnumKey(EDataTableKey::Skill);
|
||||||
|
FSkill* LocSkillDataRow = LocDataTable->FindRow<FSkill>(SkillRowName, TEXT("Not Found FSkill"));
|
||||||
|
if(!NMT_ENSURE(LocSkillDataRow)) return;
|
||||||
|
SkillData = *LocSkillDataRow;
|
||||||
|
TArray<int32> LocEffectArray;
|
||||||
|
if(SkillData.iEffect1Id != 0) LocEffectArray.Add(SkillData.iEffect1Id);
|
||||||
|
if(SkillData.iEffect2Id != 0) LocEffectArray.Add(SkillData.iEffect2Id);
|
||||||
|
if(SkillData.iEffect3Id != 0) LocEffectArray.Add(SkillData.iEffect3Id);
|
||||||
|
if(LocEffectArray.Num() > 0)
|
||||||
|
for(int32 LocEffectID : LocEffectArray)
|
||||||
|
{
|
||||||
|
FName LocEffectRowName = *FString::FromInt(LocEffectID);
|
||||||
|
LocDataTable = UAssetUtilsLibrary::LoadDataTableByEnumKey(EDataTableKey::Effect);
|
||||||
|
FEffect* LocEffectDataRow = LocDataTable->FindRow<FEffect>(LocEffectRowName, TEXT("Not Found FSkill"));
|
||||||
|
SkillEffects.Add(*LocEffectDataRow);
|
||||||
|
}
|
||||||
|
NoiseSphereComponent->SetSphereRadius(SkillData.fSkillNoise);
|
||||||
|
//TODO : Load Relative Path From Table After Added
|
||||||
|
if(UNiagaraSystem* LocFindNoiseAsset = Cast<UNiagaraSystem>(StaticLoadObject(UNiagaraSystem::StaticClass(),nullptr,TEXT("/Script/Niagara.NiagaraSystem'/Game/FX/NiagaraSystem/Common/NS_Common_SoundEangeEffects.NS_Common_SoundEangeEffects'"))))
|
||||||
|
NoiseFXComponent->SetAsset(LocFindNoiseAsset);
|
||||||
|
|
||||||
|
if(UNiagaraSystem* LocFindNoiseAsset = Cast<UNiagaraSystem>(StaticLoadObject(UNiagaraSystem::StaticClass(),nullptr,TEXT("/Script/Niagara.NiagaraSystem'/Game/FX/NiagaraSystem/Common/NS_Common_Hit.NS_Common_Hit'"))))
|
||||||
|
HitFXSystem = LocFindNoiseAsset;
|
||||||
|
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
void ACoreSkill::SetSkillOwner(AActor* InSkillOwner)
|
||||||
|
{
|
||||||
|
SkillOwner = InSkillOwner;
|
||||||
|
}
|
||||||
|
|
||||||
|
void ACoreSkill::GetSkillData(FSkill& OutCurrentSkillData)
|
||||||
|
{
|
||||||
|
OutCurrentSkillData = SkillData;
|
||||||
|
}
|
||||||
|
|
||||||
|
float ACoreSkill::GetFinalDamage(AActor* InHitActor, bool InbLocationSelf)
|
||||||
|
{
|
||||||
|
float LocFinalDamage = 0.f;
|
||||||
|
if(SkillOwner)
|
||||||
|
{
|
||||||
|
ACorePlayerCharacter* LocPlayerCharacter = Cast<ACorePlayerCharacter>(SkillOwner);
|
||||||
|
FVector2D LocOccurForward;
|
||||||
|
InbLocationSelf ? LocOccurForward = FVector2D(InHitActor->GetActorLocation().X - GetActorLocation().X, InHitActor->GetActorLocation().Y - GetActorLocation().Y)
|
||||||
|
: LocOccurForward = FVector2D(LocPlayerCharacter->GetMesh()->GetForwardVector().X, LocPlayerCharacter->GetMesh()->GetForwardVector().Y);
|
||||||
|
FVector2D LocNpcForward(InHitActor->GetActorForwardVector().X,InHitActor->GetActorForwardVector().Y);
|
||||||
|
float LocDotValue = UKismetMathLibrary::DotProduct2D(LocOccurForward,LocNpcForward);
|
||||||
|
if(LocDotValue >= 0)
|
||||||
|
SkillData.fCriDmg <= 0.f ? LocFinalDamage = SkillData.fDamage : LocFinalDamage = SkillData.fCriDmg;
|
||||||
|
else
|
||||||
|
LocFinalDamage = SkillData.fDamage;
|
||||||
|
}
|
||||||
|
return LocFinalDamage;
|
||||||
|
}
|
||||||
|
|
||||||
|
void ACoreSkill::SetParabolaLaunchVelocity()
|
||||||
|
{
|
||||||
|
FVector LocEndPoint = CursorCalibrateHitResult.Location;
|
||||||
|
FVector LocCalibLocation(GetActorLocation().X, GetActorLocation().Y, LocEndPoint.Z);
|
||||||
|
float LocFinalDistance = FVector::Distance(LocCalibLocation, LocEndPoint);
|
||||||
|
UGlobalUtilsLibrary::SuggestProjectileVelocityAtLocation(GetWorld(), LaunchVelocity, GetActorLocation(),
|
||||||
|
LocEndPoint, 110.f, 0.f,
|
||||||
|
LocFinalDistance / 100.f);
|
||||||
|
}
|
||||||
|
|
||||||
|
UPrimitiveComponent* ACoreSkill::GetBodyHitComponent() const
|
||||||
|
{
|
||||||
|
return BodyHitComponent;
|
||||||
|
}
|
||||||
|
|
||||||
|
UPrimitiveComponent* ACoreSkill::GetRangeHitComponent() const
|
||||||
|
{
|
||||||
|
return RangeHitComponent;
|
||||||
|
}
|
||||||
|
|
||||||
|
void ACoreSkill::StartSkill()
|
||||||
|
{
|
||||||
|
}
|
||||||
|
|
||||||
|
void ACoreSkill::AimSkill()
|
||||||
|
{
|
||||||
|
}
|
||||||
|
|
||||||
|
void ACoreSkill::ActivateSkill()
|
||||||
|
{
|
||||||
|
}
|
||||||
|
|
||||||
|
void ACoreSkill::ReleaseSkill()
|
||||||
|
{
|
||||||
|
}
|
||||||
|
|
||||||
|
void ACoreSkill::CancelSkill()
|
||||||
|
{
|
||||||
|
}
|
||||||
|
|
||||||
|
void ACoreSkill::FinishSkill()
|
||||||
|
{
|
||||||
|
UWorld* World = UGlobalUtilsLibrary::GetValidWorld(this);
|
||||||
|
AWorldGameMode* LocGameMode = UGlobalUtilsLibrary::GetGameModeChecked<AWorldGameMode>(World);
|
||||||
|
UPooledActorManager* LocPoolManager = IWorldObjectProvider::Execute_GetPooledActorManager(LocGameMode);
|
||||||
|
if(LocPoolManager)
|
||||||
|
{
|
||||||
|
LocPoolManager->Push(this);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
void ACoreSkill::SkillHitEnable(bool InbEnable)
|
||||||
|
{
|
||||||
|
}
|
||||||
|
|
||||||
|
void ACoreSkill::SkillObjectHitEnable(bool InbEnable)
|
||||||
|
{
|
||||||
|
}
|
||||||
|
|
||||||
|
void ACoreSkill::SkillFXEnable(bool InbEnable, int32 InIndex)
|
||||||
|
{
|
||||||
|
}
|
||||||
|
|
||||||
|
void ACoreSkill::MakeSkillNoise(bool InbLocationSelf, UPrimitiveComponent* InAttachedComponent)
|
||||||
|
{
|
||||||
|
if(SkillData.fSkillNoise == 0) return;
|
||||||
|
if(InbLocationSelf)
|
||||||
|
{
|
||||||
|
if(InAttachedComponent != nullptr)
|
||||||
|
{
|
||||||
|
NoiseFXComponent->AttachToComponent(InAttachedComponent, FAttachmentTransformRules::SnapToTargetNotIncludingScale);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
if(ACorePlayerCharacter* LocPlayerCharacter = Cast<ACorePlayerCharacter>(SkillOwner))
|
||||||
|
{
|
||||||
|
NoiseFXComponent->AttachToComponent(LocPlayerCharacter->GetMesh(), FAttachmentTransformRules::SnapToTargetNotIncludingScale);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
NoiseFXComponent->Activate(true);
|
||||||
|
NoiseFXComponent->SetFloatParameter(TEXT("Wave Radius"), SkillData.fSkillNoise * 2.f);
|
||||||
|
NoiseSphereComponent->SetSphereRadius(SkillData.fSkillNoise);
|
||||||
|
NoiseSphereComponent->SetCollisionEnabled(ECollisionEnabled::Type::QueryOnly);
|
||||||
|
TArray<AActor*> OverlappedActors;
|
||||||
|
NoiseSphereComponent->GetOverlappingActors(OverlappedActors, ACoreNpc::StaticClass());
|
||||||
|
TArray<AActor*> LocIgnoreActors;
|
||||||
|
if(OverlappedActors.Num() >= 1)
|
||||||
|
{
|
||||||
|
for(AActor* LocOverlapActor : OverlappedActors)
|
||||||
|
{
|
||||||
|
if(ACoreNpc* LocOverlapNpc = Cast<ACoreNpc>(LocOverlapActor))
|
||||||
|
{
|
||||||
|
LocOverlapNpc->SetDetectLocationFromNoise(GetActorLocation());
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
NoiseSphereComponent->SetCollisionEnabled(ECollisionEnabled::Type::NoCollision);
|
||||||
|
}
|
||||||
|
|
||||||
|
void ACoreSkill::ResetDefaultState()
|
||||||
|
{
|
||||||
|
}
|
||||||
|
|
||||||
|
void ACoreSkill::MovedComponentToHitPoint(AActor* InHitActor, UPrimitiveComponent* InMovedComponent)
|
||||||
|
{
|
||||||
|
TArray<AActor*> LocIgnoreActors;
|
||||||
|
LocIgnoreActors.Add(SkillOwner);
|
||||||
|
FHitResult LocTraceHitResult;
|
||||||
|
UKismetSystemLibrary::LineTraceSingle(this, GetActorLocation(), InHitActor->GetActorLocation(),
|
||||||
|
TraceTypeQuery1, false, LocIgnoreActors, EDrawDebugTrace::None, LocTraceHitResult, true);
|
||||||
|
if(LocTraceHitResult.bBlockingHit)
|
||||||
|
{
|
||||||
|
InMovedComponent->SetWorldLocation(LocTraceHitResult.Location);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
void ACoreSkill::BeginPlay()
|
||||||
|
{
|
||||||
|
Super::BeginPlay();
|
||||||
|
}
|
||||||
|
|
||||||
|
void ACoreSkill::Tick(float DeltaTime)
|
||||||
|
{
|
||||||
|
Super::Tick(DeltaTime);
|
||||||
|
}
|
||||||
|
|
||||||
|
void ACoreSkill::Enable_Implementation()
|
||||||
|
{
|
||||||
|
IPoolableActor::Enable_Implementation();
|
||||||
|
}
|
||||||
|
|
||||||
|
void ACoreSkill::Disable_Implementation()
|
||||||
|
{
|
||||||
|
IPoolableActor::Disable_Implementation();
|
||||||
|
if(UCoreCheatManager* CCM = UGlobalUtilsLibrary::GetSharedCoreCheatManager(this))
|
||||||
|
{
|
||||||
|
if(CCM->GetDebugStatus().bDebugHitCollision)
|
||||||
|
{
|
||||||
|
if(BodyHitComponent) BodyHitComponent->SetHiddenInGame(true);
|
||||||
|
if(RangeHitComponent) RangeHitComponent->SetHiddenInGame(true);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
void ACoreSkill::Pushed_Implementation()
|
||||||
|
{
|
||||||
|
IPoolableActor::Pushed_Implementation();
|
||||||
|
}
|
||||||
|
|
||||||
|
void ACoreSkill::Obtained_Implementation()
|
||||||
|
{
|
||||||
|
IPoolableActor::Obtained_Implementation();
|
||||||
|
if(UCoreCheatManager* CCM = UGlobalUtilsLibrary::GetSharedCoreCheatManager(this))
|
||||||
|
{
|
||||||
|
if(CCM->GetDebugStatus().bDebugHitCollision)
|
||||||
|
{
|
||||||
|
BodyHitComponent->SetHiddenInGame(false);
|
||||||
|
RangeHitComponent->SetHiddenInGame(false);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
void ACoreSkill::RefreshCursorHitResult_Implementation(FHitResult InHitResult)
|
||||||
|
{
|
||||||
|
IMouseInteraction::RefreshCursorHitResult_Implementation(InHitResult);
|
||||||
|
CursorCalibrateHitResult = InHitResult;
|
||||||
|
}
|
||||||
Some files were not shown because too many files have changed in this diff Show More
Loading…
Reference in New Issue