Skip to content

Commit 23f71dc

Browse files
SML port to Update 1.2. Added support for GPF plugins as Mods, converted ExampleMod to GPF
1 parent 9c5d2a4 commit 23f71dc

324 files changed

Lines changed: 273 additions & 125 deletions

File tree

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

.gitignore

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -31,7 +31,7 @@ Mods/**/Metadata/Crypto.json
3131
!Mods/WwisePatches/
3232
!Mods/SML/
3333
!Mods/SMLEditor/
34-
!Mods/ExampleMod/
34+
!Mods/GameFeatures/
3535

3636
# Mods binaries
3737
Mods/**/Binaries/*
Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,9 @@
1+
2+
[GameFeatureModTemplateDescription]
3+
+PrimaryAssetTypeTemplates=(PrimaryAssetType="FGSchematic",AssetBaseClass="/Script/FactoryGame.FGSchematic",bHasBlueprintClasses=True,Directories=((Path="/$PluginName/Schematics")),Rules=(Priority=2,ChunkId=1))
4+
+PrimaryAssetTypeTemplates=(PrimaryAssetType="FGResearchTree",AssetBaseClass="/Script/FactoryGame.FGResearchTree",bHasBlueprintClasses=True,Directories=((Path="/$PluginName/Schematics/Research")),Rules=(Priority=2,ChunkId=1))
5+
+PrimaryAssetTypeTemplates=(PrimaryAssetType="FGUserSetting",AssetBaseClass="/Script/FactoryGame.FGUserSetting",Directories=((Path="/$PluginName/Settings")),Rules=(Priority=2,ChunkId=1))
6+
+PrimaryAssetTypeTemplates=(PrimaryAssetType="FGMessage",AssetBaseClass="/Script/FactoryGame.FGMessage",Directories=((Path="/$PluginName/Narrative")),Rules=(Priority=2,ChunkId=1))
7+
+PrimaryAssetTypeTemplates=(PrimaryAssetType="FGRemoteCallObject",AssetBaseClass="/Script/FactoryGame.FGRemoteCallObject",bHasBlueprintClasses=True,Directories=((Path="/$PluginName/Buildable"),(Path="/$PluginName/-Shared/Blueprint")),Rules=(Priority=2,ChunkId=1))
8+
+PrimaryAssetTypeTemplates=(PrimaryAssetType="FGIconLibrary",AssetBaseClass="/Script/FactoryGame.FGIconLibrary",Directories=((Path="/$PluginName/-Shared/Blueprint")),Rules=(Priority=2,ChunkId=1))
9+
+PrimaryAssetTypeTemplates=(PrimaryAssetType="FGChildInputMappingContext",AssetBaseClass="/Script/FactoryGame.FGChildInputMappingContext",Directories=((Path="/$PluginName/Inputs")),Rules=(Priority=2,ChunkId=1))

Mods/Alpakit/Source/Alpakit/Alpakit.Build.cs

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -16,6 +16,9 @@ public Alpakit(ReadOnlyTargetRules Target) : base(Target)
1616

1717
PublicDependencyModuleNames.AddRange(new[] {
1818
"SML",
19+
"FactoryGame",
20+
"GameFeatures",
21+
"GameFeaturesEditor",
1922
});
2023

2124
PrivateDependencyModuleNames.AddRange(new[] {
@@ -33,7 +36,8 @@ public Alpakit(ReadOnlyTargetRules Target) : base(Target)
3336
"EditorStyle",
3437
"PluginBrowser",
3538
"LauncherServices",
36-
"TargetDeviceServices",
39+
"TargetDeviceServices",
40+
"UATHelper",
3741
});
3842
}
3943
}

Mods/Alpakit/Source/Alpakit/Private/Alpakit.cpp

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -10,7 +10,7 @@
1010
#include "ISettingsSection.h"
1111
#include "LevelEditor.h"
1212
#include "IPluginBrowser.h"
13-
#include "UATHelper/Public/IUATHelperModule.h"
13+
#include "IUATHelperModule.h"
1414
#include "ModWizardDefinition.h"
1515
#include "ModTargetsConfig.h"
1616
#include "SAlpakitLogTabContent.h"

Mods/Alpakit/Source/Alpakit/Private/AlpakitInstance.cpp

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -7,10 +7,10 @@
77
#include "Async/Async.h"
88
#include "Framework/Docking/TabManager.h"
99
#include "Framework/Notifications/NotificationManager.h"
10-
#include "LauncherServices/Public/ILauncher.h"
11-
#include "LauncherServices/Public/ILauncherServicesModule.h"
10+
#include "ILauncher.h"
11+
#include "ILauncherServicesModule.h"
1212
#include "Modules/ModuleManager.h"
13-
#include "TargetDeviceServices/Public/ITargetDeviceServicesModule.h"
13+
#include "ITargetDeviceServicesModule.h"
1414
#include "Widgets/Docking/SDockTab.h"
1515

1616
#define LOCTEXT_NAMESPACE "Alpakit"

Mods/Alpakit/Source/Alpakit/Private/AlpakitModEntry.cpp

Lines changed: 5 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -12,11 +12,12 @@
1212
#include "SourceControlOperations.h"
1313
#include "Async/Async.h"
1414
#include "Framework/Notifications/NotificationManager.h"
15-
#include "LauncherServices/Public/ILauncherProfile.h"
16-
#include "LauncherServices/Public/ILauncherServicesModule.h"
17-
#include "TargetDeviceServices/Public/ITargetDeviceServicesModule.h"
18-
#include "UATHelper/Public/IUATHelperModule.h"
15+
#include "ILauncherProfile.h"
16+
#include "ILauncherServicesModule.h"
17+
#include "ITargetDeviceServicesModule.h"
18+
#include "IUATHelperModule.h"
1919
#include "Widgets/Notifications/SNotificationList.h"
20+
#include "Widgets/Text/STextBlock.h"
2021

2122
#define LOCTEXT_NAMESPACE "AlpakitModListEntry"
2223

Lines changed: 68 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,68 @@
1+
#include "GameFeatureModTemplateDescription.h"
2+
#include "AssetToolsModule.h"
3+
#include "Editor.h"
4+
#include "FileHelpers.h"
5+
#include "GameFeaturesSubsystem.h"
6+
#include "AssetRegistry/IAssetRegistry.h"
7+
#include "Engine/AssetManagerTypes.h"
8+
#include "HAL/FileManager.h"
9+
#include "Interfaces/IPluginManager.h"
10+
#include "Misc/ConfigCacheIni.h"
11+
#include "Misc/FeedbackContext.h"
12+
#include "Misc/Paths.h"
13+
#include "Subsystems/AssetEditorSubsystem.h"
14+
15+
void FGameFeatureModTemplateDescription::UpdatePathWhenTemplateSelected(FString& InOutPath)
16+
{
17+
FString ResultPluginRoot = IFileManager::Get().ConvertToAbsolutePathForExternalAppForWrite(*(FPaths::ProjectModsDir() / TEXT("GameFeatures/")));
18+
if (!DefaultSubfolder.IsEmpty())
19+
{
20+
ResultPluginRoot /= DefaultSubfolder + TEXT("/");
21+
}
22+
FPaths::MakePlatformFilename(ResultPluginRoot);
23+
InOutPath = ResultPluginRoot;
24+
}
25+
26+
void FGameFeatureModTemplateDescription::UpdatePathWhenTemplateUnselected(FString& InOutPath)
27+
{
28+
InOutPath = IFileManager::Get().ConvertToAbsolutePathForExternalAppForWrite(*FPaths::ProjectModsDir());
29+
FPaths::MakePlatformFilename(InOutPath);
30+
}
31+
32+
void FGameFeatureModTemplateDescription::OnPluginCreated(const TSharedPtr<IPlugin> NewPlugin)
33+
{
34+
// Create a new game feature data asset
35+
const FAssetToolsModule& AssetToolsModule = FModuleManager::Get().LoadModuleChecked<FAssetToolsModule>(TEXT("AssetTools"));
36+
const FString AssetName = !GameFeatureDataName.IsEmpty() ? GameFeatureDataName : NewPlugin->GetName();
37+
UGameFeatureData* GameFeatureDataAsset = Cast<UGameFeatureData>(AssetToolsModule.Get().CreateAsset(AssetName, NewPlugin->GetMountedAssetPath(), GameFeatureDataClass, nullptr));
38+
39+
if (GameFeatureDataAsset != nullptr)
40+
{
41+
// Populate asset manager primary asset data for it from the template
42+
TArray<FString> PrimaryAssetTypeTemplates;
43+
GConfig->GetArray(TEXT("GameFeatureModTemplateDescription"), TEXT("PrimaryAssetTypeTemplates"), PrimaryAssetTypeTemplates, GConfig->GetConfigFilename(TEXT("Alpakit")));
44+
for (const FString& PrimaryAssetTypeTemplate : PrimaryAssetTypeTemplates)
45+
{
46+
const FString PrimaryAssetTypeString = PrimaryAssetTypeTemplate.Replace(TEXT("$PluginName"), *NewPlugin->GetName());
47+
FPrimaryAssetTypeInfo PrimaryAssetTypeInfo;
48+
UScriptStruct* ScriptStruct = FindObjectChecked<UScriptStruct>(nullptr, TEXT("/Script/Engine.PrimaryAssetTypeInfo"));
49+
ScriptStruct->ImportText(*PrimaryAssetTypeString, &PrimaryAssetTypeInfo, nullptr, PPF_None, GWarn, TEXT("PrimaryAssetTypeInfo"));
50+
GameFeatureDataAsset->GetPrimaryAssetTypesToScan().Add(PrimaryAssetTypeInfo);
51+
GameFeatureDataAsset->MarkPackageDirty();
52+
}
53+
54+
// Save the asset now before we attempt to activate the game feature plugin
55+
UEditorLoadingAndSavingUtils::SavePackages({GameFeatureDataAsset->GetPackage()}, false);
56+
57+
// Activate the new game feature plugin
58+
auto AdditionalFilter = [](const FString&, const FGameFeaturePluginDetails&, FBuiltInGameFeaturePluginBehaviorOptions&) -> bool { return true; };
59+
UGameFeaturesSubsystem::Get().LoadBuiltInGameFeaturePlugin(NewPlugin.ToSharedRef(), AdditionalFilter, FGameFeaturePluginLoadComplete::CreateLambda([GameFeatureDataAsset](const UE::GameFeatures::FResult&)
60+
{
61+
// Edit the new game feature data
62+
if (GameFeatureDataAsset != nullptr)
63+
{
64+
GEditor->GetEditorSubsystem<UAssetEditorSubsystem>()->OpenEditorForAsset(GameFeatureDataAsset);
65+
}
66+
}));
67+
}
68+
}

Mods/Alpakit/Source/Alpakit/Private/ModWizardDefinition.cpp

Lines changed: 25 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,12 +1,16 @@
11
#include "ModWizardDefinition.h"
22

33
#include "Alpakit.h"
4+
#include "FGGameFeatureData.h"
5+
#include "GameFeatureModTemplateDescription.h"
6+
#include "GameFeaturePluginTemplate.h"
47
#include "Dom/JsonObject.h"
58
#include "Features/IPluginsEditorFeature.h"
69
#include "GenericPlatform/GenericPlatformFile.h"
710
#include "Interfaces/IPluginManager.h"
811
#include "HAL/PlatformFileManager.h"
912
#include "Misc/App.h"
13+
#include "Misc/Paths.h"
1014

1115
#define LOCTEXT_NAMESPACE "NewModWizard"
1216

@@ -273,14 +277,33 @@ TSharedPtr<FModTemplateDescription> FModTemplateDescription::Load(const TSharedP
273277
}
274278
}
275279

276-
TSharedRef<FPluginTemplateDescription> PluginTemplateDescription = MakeShareable(new FPluginTemplateDescription(
280+
TSharedPtr<FPluginTemplateDescription> PluginTemplateDescription;
281+
282+
bool bIsGameFeaturePlugin = false;
283+
JSON->TryGetBoolField(TEXT("game_feature"), bIsGameFeaturePlugin);
284+
if (bIsGameFeaturePlugin)
285+
{
286+
PluginTemplateDescription = MakeShareable(new FGameFeatureModTemplateDescription(
287+
FText::FromString(TemplateName),
288+
FText::FromString(TemplateDescription),
289+
TemplatesPath / TemplateFolderName,
290+
TEXT(""), TEXT(""),
291+
UFGGameFeatureData::StaticClass(),
292+
TEXT(""), EPluginEnabledByDefault::Unspecified
293+
));
294+
}
295+
else
296+
{
297+
PluginTemplateDescription = MakeShareable(new FPluginTemplateDescription(
277298
FText::FromString(TemplateName),
278299
FText::FromString(TemplateDescription),
279300
TemplatesPath / TemplateFolderName,
280301
true,
281302
EHostType::Runtime));
303+
}
304+
282305
PluginTemplateDescription->bCanBePlacedInEngine = false;
283-
return MakeShareable(new FModTemplateDescription(PluginTemplateDescription, Dependencies));
306+
return MakeShareable(new FModTemplateDescription(PluginTemplateDescription.ToSharedRef(), Dependencies));
284307
}
285308

286309
#undef LOCTEXT_NAMESPACE

Mods/Alpakit/Source/Alpakit/Public/AlpakitModEntry.h

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,8 +1,9 @@
11
#pragma once
2+
23
#include "AlpakitModEntryList.h"
34
#include "AlpakitProfile.h"
4-
#include "ModTargetsConfig.h"
55
#include "Interfaces/IPluginManager.h"
6+
#include "Widgets/SCompoundWidget.h"
67

78
/**
89
* Entry of a mod within the mod list of the alpakit window

Mods/Alpakit/Source/Alpakit/Public/AlpakitModEntryList.h

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,7 @@
11
#pragma once
2+
23
#include "Interfaces/IPluginManager.h"
4+
#include "Widgets/SCompoundWidget.h"
35

46
/**
57
* Widget that lists all plugins that might be able to get packed as mods

0 commit comments

Comments
 (0)