// ©2023 Batty Bovine Productions, LLC. All Rights Reserved. #include "ComboInputEditor.h" #include "ComboInputAssets.h" #include "ToolMenuSection.h" #include "AssetTypeActions/AssetTypeActions_DataAsset.h" #include "Interfaces/IPluginManager.h" #include "Settings/FComboActionGraphEditorStyle.h" #include "Styling/SlateStyle.h" #include "Styling/SlateStyleMacros.h" #include "Styling/SlateStyleRegistry.h" #include UE_INLINE_GENERATED_CPP_BY_NAME(ComboInputEditor) #define LOCTEXT_NAMESPACE "FComboInputEditorModule" EAssetTypeCategories::Type FComboInputEditorModule::ComboAssetsCategory; class FAssetTypeActions_ComboAction : public FAssetTypeActions_DataAsset { public: virtual FText GetName() const override { return NSLOCTEXT("AssetTypeActions", "AssetTypeActions_ComboAction", "Combo Action"); } virtual uint32 GetCategories() override { return FComboInputEditorModule::GetInputAssetsCategory(); } virtual FColor GetTypeColor() const override { return FColor(255, 127, 255); } virtual FText GetAssetDescription(const FAssetData &AssetData) const override { return NSLOCTEXT("AssetTypeActions", "AssetTypeActions_ComboActionDesc", "An action that can be executed as part of a combo sequence. This is essentially a representation of an attack, and can be sent to the Animation Graph to play an attack animation and the like."); } virtual UClass *GetSupportedClass() const override { return UComboAction::StaticClass(); } }; class FAssetTypeActions_ComboSequenceNode : public FAssetTypeActions_DataAsset { public: virtual FText GetName() const override { return NSLOCTEXT("AssetTypeActions", "AssetTypeActions_ComboSequenceNode", "Combo Sequence Node"); } virtual uint32 GetCategories() override { return FComboInputEditorModule::GetInputAssetsCategory(); } virtual FColor GetTypeColor() const override { return FColor(255, 127, 255); } virtual FText GetAssetDescription(const FAssetData &AssetData) const override { return NSLOCTEXT("AssetTypeActions", "AssetTypeActions_ComboSequenceNodeDesc", "This represents a node in the combo graph, with each key in the ComboBranch being an input this node can react to, and each value containing the action to be executed next, and the node to activate after the action is complete."); } virtual UClass *GetSupportedClass() const override { return UComboSequenceNode::StaticClass(); } }; class FAssetTypeActions_ComboInputAsset : public FAssetTypeActions_DataAsset { public: virtual FText GetName() const override { return NSLOCTEXT("AssetTypeActions", "AssetTypeActions_ComboInputAsset", "Combo Input Asset"); } virtual uint32 GetCategories() override { return FComboInputEditorModule::GetInputAssetsCategory(); } virtual FColor GetTypeColor() const override { return FColor(255, 127, 255); } virtual FText GetAssetDescription(const FAssetData &AssetData) const override { return NSLOCTEXT("AssetTypeActions", "AssetTypeActions_ComboInputAssetDesc", "This maps a sequence of button inputs from EnhancedInput to a combo action that can be used to execute a sequence of moves.This gets sent from the input buffer subsystem to the player controller's ComboManagerComponent, which executes the associated action in the current ComboSequenceNode."); } virtual UClass *GetSupportedClass() const override { return UComboInputAsset::StaticClass(); } }; UComboAction_Factory::UComboAction_Factory(const FObjectInitializer &ObjectInitializer) : Super(ObjectInitializer) { SupportedClass = UComboAction::StaticClass(); bEditAfterNew = true; bCreateNew = true; } UObject *UComboAction_Factory::FactoryCreateNew(UClass *Class, UObject *InParent, FName Name, EObjectFlags Flags, UObject *Context, FFeedbackContext *Warn) { if (this->ComboActionClass != nullptr) { return NewObject(InParent, this->ComboActionClass, Name, Flags | RF_Transactional, Context); } else { check(Class->IsChildOf(UComboAction::StaticClass())); return NewObject(InParent, Class, Name, Flags | RF_Transactional, Context); } } UComboSequenceNode_Factory::UComboSequenceNode_Factory(const FObjectInitializer &ObjectInitializer) : Super(ObjectInitializer) { SupportedClass = UComboSequenceNode::StaticClass(); bEditAfterNew = true; bCreateNew = true; } UObject *UComboSequenceNode_Factory::FactoryCreateNew(UClass *Class, UObject *InParent, FName Name, EObjectFlags Flags, UObject *Context, FFeedbackContext *Warn) { if (this->ComboSequenceNodeClass != nullptr) { return NewObject(InParent, this->ComboSequenceNodeClass, Name, Flags | RF_Transactional, Context); } else { check(Class->IsChildOf(UComboSequenceNode::StaticClass())); return NewObject(InParent, Class, Name, Flags | RF_Transactional, Context); } } UComboInputAsset_Factory::UComboInputAsset_Factory(const FObjectInitializer &ObjectInitializer) : Super(ObjectInitializer) { SupportedClass = UComboInputAsset::StaticClass(); bEditAfterNew = true; bCreateNew = true; } UObject *UComboInputAsset_Factory::FactoryCreateNew(UClass *Class, UObject *InParent, FName Name, EObjectFlags Flags, UObject *Context, FFeedbackContext *Warn) { if (this->ComboInputAssetClass != nullptr) { return NewObject(InParent, this->ComboInputAssetClass, Name, Flags | RF_Transactional, Context); } else { check(Class->IsChildOf(UComboInputAsset::StaticClass())); return NewObject(InParent, Class, Name, Flags | RF_Transactional, Context); } } class FComboInputSlateStyle final : public FSlateStyleSet { public: FComboInputSlateStyle() : FSlateStyleSet("ComboInputEditor") { this->SetParentStyleName(FAppStyle::GetAppStyleSetName()); const FString &PluginSlateDir = IPluginManager::Get().FindPlugin("ComboInput")->GetBaseDir(); this->SetContentRoot(PluginSlateDir / TEXT("Resources/Slate")); this->SetCoreContentRoot(FPaths::EngineContentDir() / TEXT("Slate")); // Combo Input Editor icons static const FVector2D Icon16 = FVector2D(16.0f, 16.0f); static const FVector2D Icon64 = FVector2D(64.0f, 64.0f); this->Set("ComboInputIcon_Small", new IMAGE_BRUSH_SVG("Icons/ComboInput_16", Icon16)); this->Set("ComboInputIcon_Large", new IMAGE_BRUSH_SVG("Icons/ComboInput_64", Icon64)); this->Set("ClassIcon.ComboAction", new IMAGE_BRUSH_SVG("Icons/ComboAction_16", Icon16)); this->Set("ClassThumbnail.ComboAction", new IMAGE_BRUSH_SVG("Icons/ComboAction_64", Icon64)); this->Set("ClassIcon.ComboSequenceNode", new IMAGE_BRUSH_SVG("Icons/ComboSequenceNode_16", Icon16)); this->Set("ClassThumbnail.ComboSequenceNode", new IMAGE_BRUSH_SVG("Icons/ComboSequenceNode_64", Icon64)); this->Set("ClassIcon.ComboInputAsset", new IMAGE_BRUSH_SVG("Icons/ComboInputAsset_16", Icon16)); this->Set("ClassThumbnail.ComboInputAsset", new IMAGE_BRUSH_SVG("Icons/ComboInputAsset_64", Icon64)); } }; void FComboInputEditorModule::StartupModule() { // Register combo action asset IAssetTools &AssetTools = FModuleManager::LoadModuleChecked("AssetTools").Get(); FComboInputEditorModule::ComboAssetsCategory = AssetTools.RegisterAdvancedAssetCategory(FName(TEXT("Input")), LOCTEXT("InputAssetsCategory", "Input")); this->RegisterAssetTypeActions(AssetTools, MakeShareable(new FAssetTypeActions_ComboAction)); this->RegisterAssetTypeActions(AssetTools, MakeShareable(new FAssetTypeActions_ComboSequenceNode)); this->RegisterAssetTypeActions(AssetTools, MakeShareable(new FAssetTypeActions_ComboInputAsset)); // Make a new style set for Combo Input, which will register any custom icons for the types in this plugin this->ComboInputEditorStyleSet = MakeShared(); FSlateStyleRegistry::RegisterSlateStyle(*this->ComboInputEditorStyleSet.Get()); // Make a new style set for Combo Action Graph this->ComboActionGraphEditorStyleSet = MakeShared(); FSlateStyleRegistry::RegisterSlateStyle(*this->ComboActionGraphEditorStyleSet.Get()); } void FComboInputEditorModule::ShutdownModule() { } #undef LOCTEXT_NAMESPACE IMPLEMENT_MODULE(FComboInputEditorModule, ComboInputEditorModule)