├── .gitattributes ├── .gitmodules ├── Asset Generator ├── .gitignore ├── AssetGenProject │ └── Plugins │ │ └── AssetGenerator │ │ ├── AssetGenerator.uplugin │ │ ├── Resources │ │ ├── ButtonIcon_40x.png │ │ └── Icon128.png │ │ └── Source │ │ └── AssetGenerator │ │ ├── AssetGenerator.Build.cs │ │ ├── Private │ │ ├── AssetGenOperation.cpp │ │ ├── AssetGenUtils.cpp │ │ ├── AssetGenerator.cpp │ │ ├── AssetGeneratorCommands.cpp │ │ ├── AssetGeneratorStyle.cpp │ │ ├── ParseJSON.cpp │ │ └── StubFillerOperation.cpp │ │ └── Public │ │ ├── AssetGenOperation.h │ │ ├── AssetGenUtils.h │ │ ├── AssetGenerator.h │ │ ├── AssetGeneratorCommands.h │ │ ├── AssetGeneratorStyle.h │ │ ├── ParseJSON.h │ │ ├── StubFillerOperation.h │ │ └── Utils.h ├── AssetTypes.json ├── Audio Assets │ ├── attenuations.txt │ ├── audio_assets.txt │ ├── classes.txt │ ├── concurrencies.txt │ ├── reverbs.txt │ ├── soundmixes.txt │ └── submixes.txt ├── BP_names_and_locations.json ├── BP_names_and_locations.py ├── BP_names_and_locations_with_object_info.json ├── BP_object_info.json ├── BP_object_info_ue4ss.json ├── JSON.zip ├── README.md ├── Unused ABPs.txt ├── combine.py ├── copy abp.py ├── copy animseq shader cache.py ├── copy animsseqs.py ├── copy physasset.py ├── copy skm.py ├── copy sm.py ├── delete unused physasset.py ├── delete_build_files.py ├── gen_BP_object_info.py ├── get_audio_assets.py ├── import abp.py ├── import aic.py ├── import esi.py ├── import id.py ├── import old.py ├── import_cooked_assets.py └── sm.txt ├── Auto-rename Jukebox Songs ├── README.txt └── rename_jukebox_music.py ├── DRGModdingAutomationScriptsLinux ├── .env ├── README.md ├── prep_mod_for_release.sh ├── quick_test_mod.sh ├── setup_cpp_project.sh └── util │ ├── cook_project.sh │ └── pack_project.sh ├── Empty Content Hierarchy Generator ├── README.md └── gen.bat ├── README.md ├── Soundclass Hierarchy ├── TheSoundClassers │ ├── Binaries │ │ └── Win64 │ │ │ ├── UE4Editor-TheSoundClassers.dll │ │ │ ├── UE4Editor-TheSoundClassers.pdb │ │ │ └── UE4Editor.modules │ ├── Intermediate │ │ └── Build │ │ │ └── Win64 │ │ │ └── UE4Editor │ │ │ └── Development │ │ │ └── TheSoundClassers │ │ │ └── UE4Editor-TheSoundClassers.lib │ ├── Resources │ │ ├── ButtonIcon_40x.png │ │ └── Icon128.png │ ├── Source │ │ └── TheSoundClassers │ │ │ ├── Private │ │ │ ├── TheSoundClassers.cpp │ │ │ ├── TheSoundClassersCommands.cpp │ │ │ └── TheSoundClassersStyle.cpp │ │ │ ├── Public │ │ │ ├── TheSoundClassers.h │ │ │ ├── TheSoundClassersCommands.h │ │ │ └── TheSoundClassersStyle.h │ │ │ └── TheSoundClassers.Build.cs │ └── TheSoundClassers.uplugin ├── U34.5 │ ├── README.md │ ├── SoundClasses_Heirachy.txt │ ├── SoundClasses_Heirachy_Inline.txt │ ├── generate_soundmixes_and_properties.py │ ├── get_tree_of_soundclasses.py │ └── soundmixes.json └── U35 │ ├── README.md │ ├── SoundClasses_Hierarchy.txt │ ├── SoundClasses_Hierarchy_Inline.txt │ ├── generate_soundmixes_and_properties.py │ ├── get_soundclasses_sounds_use.py │ ├── get_tree_of_soundclasses.py │ ├── soundmixes.json │ ├── sounds_soundclasses.json │ └── weapon_soundclasses.json └── template generator.py /.gitattributes: -------------------------------------------------------------------------------- 1 | # Auto detect text files and perform LF normalization 2 | * text=auto 3 | -------------------------------------------------------------------------------- /.gitmodules: -------------------------------------------------------------------------------- 1 | [submodule "DRGModdingAutomationScripts"] 2 | path = DRGModdingAutomationScripts 3 | url = https://github.com/DRG-Modding/DRGModdingAutomationScripts.git 4 | -------------------------------------------------------------------------------- /Asset Generator/.gitignore: -------------------------------------------------------------------------------- 1 | AssetGenProject/.idea/* 2 | AssetGenProject/.vs/* 3 | AssetGenProject/Binaries/* 4 | AssetGenProject/Config/* 5 | AssetGenProject/DerivedDataCache/* 6 | AssetGenProject/Intermediate/* 7 | AssetGenProject/Plugins/AssetGenerator/Binaries/* 8 | AssetGenProject/Plugins/AssetGenerator/Intermediate/* 9 | AssetGenProject/Saved/* 10 | AssetGenProject/Source/* 11 | AssetGenProject/AssetGenProject.sln 12 | AssetGenProject/AssetGenProject.uproject -------------------------------------------------------------------------------- /Asset Generator/AssetGenProject/Plugins/AssetGenerator/AssetGenerator.uplugin: -------------------------------------------------------------------------------- 1 | { 2 | "FileVersion": 3, 3 | "Version": 1, 4 | "VersionName": "1.0", 5 | "FriendlyName": "AssetGenerator", 6 | "Description": "Generates stub blueprint and data assets given object information.", 7 | "Category": "Other", 8 | "CreatedBy": "Buckminsterfullerene", 9 | "CreatedByURL": "", 10 | "DocsURL": "", 11 | "MarketplaceURL": "", 12 | "SupportURL": "", 13 | "CanContainContent": false, 14 | "IsBetaVersion": false, 15 | "IsExperimentalVersion": false, 16 | "Installed": false, 17 | "Modules": [ 18 | { 19 | "Name": "AssetGenerator", 20 | "Type": "Editor", 21 | "LoadingPhase": "Default" 22 | } 23 | ] 24 | } -------------------------------------------------------------------------------- /Asset Generator/AssetGenProject/Plugins/AssetGenerator/Resources/ButtonIcon_40x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/DRG-Modding/Useful-Scripts/e8339f43cb660b5b419ccf3939515fdc2d660a9f/Asset Generator/AssetGenProject/Plugins/AssetGenerator/Resources/ButtonIcon_40x.png -------------------------------------------------------------------------------- /Asset Generator/AssetGenProject/Plugins/AssetGenerator/Resources/Icon128.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/DRG-Modding/Useful-Scripts/e8339f43cb660b5b419ccf3939515fdc2d660a9f/Asset Generator/AssetGenProject/Plugins/AssetGenerator/Resources/Icon128.png -------------------------------------------------------------------------------- /Asset Generator/AssetGenProject/Plugins/AssetGenerator/Source/AssetGenerator/AssetGenerator.Build.cs: -------------------------------------------------------------------------------- 1 | // Copyright Epic Games, Inc. All Rights Reserved. 2 | 3 | using UnrealBuildTool; 4 | 5 | public class AssetGenerator : ModuleRules 6 | { 7 | public AssetGenerator(ReadOnlyTargetRules Target) : base(Target) 8 | { 9 | PCHUsage = ModuleRules.PCHUsageMode.UseExplicitOrSharedPCHs; 10 | 11 | PublicIncludePaths.AddRange( 12 | new string[] { 13 | // ... add public include paths required here ... 14 | } 15 | ); 16 | 17 | 18 | PrivateIncludePaths.AddRange( 19 | new string[] { 20 | // ... add other private include paths required here ... 21 | } 22 | ); 23 | 24 | 25 | PublicDependencyModuleNames.AddRange( 26 | new string[] 27 | { 28 | "Core", 29 | "Json", 30 | "AssetTools", 31 | // ... add other public dependencies that you statically link with here ... 32 | } 33 | ); 34 | 35 | 36 | PrivateDependencyModuleNames.AddRange( 37 | new string[] 38 | { 39 | "Projects", 40 | "InputCore", 41 | "UnrealEd", 42 | "ToolMenus", 43 | "CoreUObject", 44 | "Engine", 45 | "Slate", 46 | "SlateCore", 47 | // ... add private dependencies that you statically link with here ... 48 | } 49 | ); 50 | 51 | 52 | DynamicallyLoadedModuleNames.AddRange( 53 | new string[] 54 | { 55 | // ... add any modules that your module loads dynamically here ... 56 | } 57 | ); 58 | } 59 | } 60 | -------------------------------------------------------------------------------- /Asset Generator/AssetGenProject/Plugins/AssetGenerator/Source/AssetGenerator/Private/AssetGenOperation.cpp: -------------------------------------------------------------------------------- 1 | #include "AssetGenOperation.h" 2 | #include "ParseJson.h" 3 | #include "AssetGenUtils.h" 4 | #include "AssetRegistryModule.h" 5 | #include "AssetToolsModule.h" 6 | #include "Misc/Paths.h" 7 | #include "Blueprint/UserWidget.h" 8 | #include "K2Node_FunctionEntry.h" 9 | #include "Dom/JsonObject.h" 10 | #include "Kismet2/BlueprintEditorUtils.h" 11 | #include "BlueprintCompilationManager.h" 12 | #include "EdGraphSchema_K2_Actions.h" 13 | #include "K2Node_CallParentFunction.h" 14 | #include "K2Node_CustomEvent.h" 15 | #include "K2Node_Event.h" 16 | #include "K2Node_FunctionResult.h" 17 | #include "Engine/SimpleConstructionScript.h" 18 | #include "Kismet2/KismetEditorUtilities.h" 19 | 20 | FName AssetGenOperation::GetAssetFName() 21 | { 22 | // return FName(Objects[ObjectIndex].Name); 23 | return ""; 24 | } 25 | 26 | const TCHAR* AssetGenOperation::GetPackageName() 27 | { 28 | // return *Objects[ObjectIndex].Path; 29 | return nullptr; 30 | } 31 | 32 | UBlueprint* AssetGenOperation::CreateBlueprint(UClass* ParentClass, UPackage* Package) 33 | { 34 | EBlueprintType BlueprintType = BPTYPE_Normal; 35 | if (ParentClass->HasAnyClassFlags(CLASS_Const)) { BlueprintType = BPTYPE_Const; } 36 | if (ParentClass == UBlueprintFunctionLibrary::StaticClass()) 37 | { BlueprintType = BPTYPE_FunctionLibrary; } 38 | if (ParentClass == UInterface::StaticClass()) 39 | { BlueprintType = BPTYPE_Interface; } 40 | return FKismetEditorUtilities::CreateBlueprint(ParentClass, Package, GetAssetFName(), BlueprintType, 41 | UBlueprint::StaticClass(), UBlueprintGeneratedClass::StaticClass()); 42 | } 43 | 44 | void AssetGenOperation::CreateAssetPackage() { 45 | // const int32 SuperStructIndex = GetAssetData()->GetIntegerField(TEXT("SuperStruct")); 46 | // UClass* ParentClass = Cast(GetObjectSerializer()->DeserializeObject(SuperStructIndex)); 47 | // 48 | // if (ParentClass == NULL) { 49 | // UE_LOG(LogTemp, Error, TEXT("AssetGenOperation: Cannot resolve parent class %s for blueprint %s"), *ParentClass, *GetAssetFName().ToString()); 50 | // ParentClass = GetFallbackParentClass(); 51 | // } 52 | // 53 | // UPackage* NewPackage = CreatePackage(*GetPackageName()); 54 | // UBlueprint* NewBlueprint = CreateNewBlueprint(NewPackage, ParentClass); 55 | // SetPackageAndAsset(NewPackage, NewBlueprint, false); 56 | // 57 | // UpdateDeserializerBlueprintClassObject(true); 58 | // MarkAssetChanged(); 59 | } 60 | 61 | void AssetGenOperation::GenerateAssets(const FString JsonString) 62 | { 63 | Objects = ParseJSON::GetObjects(JsonString); 64 | 65 | // Create assets in the Content for each object 66 | for (int i = 0; i < Objects.Num(); i++) 67 | { 68 | // ObjectIndex = i; 69 | FString Path = FString(UTF8_TO_TCHAR("/")) + Objects[i].Path; 70 | UE_LOG(LogTemp, Display, TEXT("AssetGenOperation: Asset path: %s"), *Path); 71 | FString Name = Objects[i].Name; 72 | UClass* AssetClassType = AssetGenUtils::GetAssetClass(Objects[i].Type); 73 | UFactory* AssetFactoryType = AssetGenUtils::GetAssetFactory(Objects[i].Type); 74 | if (AssetClassType != nullptr && AssetFactoryType != nullptr) 75 | { 76 | FAssetToolsModule& AssetToolsModule = FModuleManager::LoadModuleChecked("AssetTools"); 77 | UObject* NewAsset = AssetToolsModule.Get().CreateAsset(Name, Path, AssetClassType, AssetFactoryType); 78 | UE_LOG(LogTemp, Display, TEXT("AssetGenOperation: Created asset: %s"), *Name); 79 | 80 | // Save the asset 81 | if (NewAsset != nullptr) 82 | { 83 | UPackage* Package = NewAsset->GetOutermost(); 84 | Package->MarkPackageDirty(); 85 | FString PackageFileName = FPackageName::LongPackageNameToFilename(Package->GetName(), FPackageName::GetAssetPackageExtension()); 86 | FString PackageFilePath = FPaths::ConvertRelativePathToFull(FPaths::ProjectContentDir() + Path); 87 | FString PackageFile = PackageFilePath + "/" + PackageFileName; 88 | if (FPackageName::DoesPackageExist(Package->GetName())) 89 | { 90 | UPackage::SavePackage(Package, nullptr, RF_Standalone, *PackageFile); 91 | UE_LOG(LogTemp, Display, TEXT("AssetGenOperation: Saved package: %s"), *PackageFile); 92 | } 93 | } 94 | } else { UE_LOG(LogTemp, Error, TEXT("AssetGenOperation: Failed to create asset: %s"), *Name); } 95 | } 96 | } 97 | -------------------------------------------------------------------------------- /Asset Generator/AssetGenProject/Plugins/AssetGenerator/Source/AssetGenerator/Private/AssetGenUtils.cpp: -------------------------------------------------------------------------------- 1 | #include "AssetGenUtils.h" 2 | #include "Engine/Blueprint.h" 3 | #include "Blueprint/UserWidget.h" 4 | #include "Engine/DataAsset.h" 5 | #include "WidgetBlueprint.h" 6 | #include "Animation/AnimBlueprint.h" 7 | #include "Factories/SkeletonFactory.h" 8 | #include "Factories/BlueprintFactory.h" 9 | #include "Factories/BlueprintFunctionLibraryFactory.h" 10 | #include "Factories/EnumFactory.h" 11 | #include "Factories/DataAssetFactory.h" 12 | #include "Factories/Factory.h" 13 | #include "Factories/AnimBlueprintFactory.h" 14 | #include "UMGEditor/Classes/WidgetBlueprintFactory.h" 15 | #include "Kismet/BlueprintFunctionLibrary.h" 16 | 17 | UClass* AssetGenUtils::GetAssetClass(const FString AssetType) 18 | { 19 | if (AssetType == "Announcement" || AssetType == "Basic" || AssetType == "HUD" || AssetType == "ITEM" 20 | || AssetType == "LCD" || AssetType == "MENU" || AssetType == "Options" || AssetType == "Popup" 21 | || AssetType == "TOOLTIP" || AssetType == "UI" || AssetType == "WeaponDisplay" || AssetType == "Widget" 22 | || AssetType == "WND") 23 | { 24 | return UWidgetBlueprint::StaticClass(); 25 | } 26 | if (AssetType == "BP" || AssetType == "ENE" || AssetType == "OBJ" || AssetType == "PRJ" || AssetType == "WPN") 27 | { 28 | return UBlueprint::StaticClass(); 29 | } 30 | if (AssetType == "BPL" || AssetType == "LIB") 31 | { 32 | return UBlueprintFunctionLibrary::StaticClass(); 33 | } 34 | if (AssetType == "WPN") 35 | { 36 | return UDataAsset::StaticClass(); 37 | } 38 | if (AssetType == "ABP") 39 | { 40 | return UAnimBlueprint::StaticClass(); 41 | } 42 | if (AssetType == "ENUM") 43 | { 44 | return UEnum::StaticClass(); 45 | } 46 | if (AssetType == "SK") 47 | { 48 | return USkeleton::StaticClass(); 49 | } 50 | UE_LOG(LogTemp, Warning, TEXT("AssetGenOperation: Unknown asset type: %s"), *AssetType); 51 | return nullptr; 52 | } 53 | 54 | UFactory* AssetGenUtils::GetAssetFactory(const FString AssetType) 55 | { 56 | if (AssetType == "Announcement" || AssetType == "Basic" || AssetType == "HUD" || AssetType == "ITEM" 57 | || AssetType == "LCD" || AssetType == "MENU" || AssetType == "Options" || AssetType == "Popup" 58 | || AssetType == "TOOLTIP" || AssetType == "UI" || AssetType == "WeaponDisplay" || AssetType == "Widget" 59 | || AssetType == "WND") { 60 | return NewObject(); 61 | } 62 | if (AssetType == "BP" || AssetType == "ENE" || AssetType == "OBJ" || AssetType == "PRJ" || AssetType == "WPN") 63 | { 64 | return NewObject(); 65 | } 66 | if (AssetType == "BPL" || AssetType == "LIB") 67 | { 68 | return NewObject(); 69 | } 70 | if (AssetType == "WPN") 71 | { 72 | return NewObject(); 73 | } 74 | if (AssetType == "ABP") 75 | { 76 | return NewObject(); 77 | } 78 | if (AssetType == "ENUM") 79 | { 80 | return NewObject(); 81 | } 82 | if (AssetType == "SK") 83 | { 84 | return NewObject(); 85 | } 86 | UE_LOG(LogTemp, Warning, TEXT("AssetGenOperation: Unknown asset type: %s"), *AssetType); 87 | return nullptr; 88 | } -------------------------------------------------------------------------------- /Asset Generator/AssetGenProject/Plugins/AssetGenerator/Source/AssetGenerator/Private/AssetGenerator.cpp: -------------------------------------------------------------------------------- 1 | // Copyright Epic Games, Inc. All Rights Reserved. 2 | 3 | #include "AssetGenerator.h" 4 | 5 | static const FName AssetGeneratorTabName("AssetGenerator"); 6 | 7 | #define LOCTEXT_NAMESPACE "FAssetGeneratorModule" 8 | 9 | void FAssetGeneratorModule::StartupModule() 10 | { 11 | // This code will execute after your module is loaded into memory; the exact timing is specified in the .uplugin file per-module 12 | 13 | FAssetGeneratorStyle::Initialize(); 14 | FAssetGeneratorStyle::ReloadTextures(); 15 | 16 | FAssetGeneratorCommands::Register(); 17 | 18 | PluginCommands = MakeShareable(new FUICommandList); 19 | 20 | PluginCommands->MapAction( 21 | FAssetGeneratorCommands::Get().PluginAction, 22 | FExecuteAction::CreateRaw(this, &FAssetGeneratorModule::PluginButtonClicked), 23 | FCanExecuteAction()); 24 | 25 | UToolMenus::RegisterStartupCallback(FSimpleMulticastDelegate::FDelegate::CreateRaw(this, &FAssetGeneratorModule::RegisterMenus)); 26 | } 27 | 28 | void FAssetGeneratorModule::ShutdownModule() 29 | { 30 | // This function may be called during shutdown to clean up your module. For modules that support dynamic reloading, 31 | // we call this function before unloading the module. 32 | 33 | UToolMenus::UnRegisterStartupCallback(this); 34 | 35 | UToolMenus::UnregisterOwner(this); 36 | 37 | FAssetGeneratorStyle::Shutdown(); 38 | 39 | FAssetGeneratorCommands::Unregister(); 40 | } 41 | 42 | void FAssetGeneratorModule::PluginButtonClicked() 43 | { 44 | // Does user wish to run first or second operation? 45 | if (Utils::GetSelectedButtonFromDialog("Do you wish to run asset generator first?", EAppMsgType::YesNo, 46 | EAppReturnType::Yes)) 47 | { 48 | // Run asset generator operation 49 | if (OpenDialogMenu()) { AssetGenOperation::GenerateAssets(LoadFile()); } 50 | 51 | // Allow user to cancel next operation 52 | if (Utils::GetSelectedButtonFromDialog(R"(Successfully finished creation of assets in given locations. 53 | Do you wish to continue to the next operation?)", EAppMsgType::OkCancel, EAppReturnType::Cancel)) 54 | { 55 | Utils::OpenMessageDialog(EAppMsgType::Ok, "Cancelled the next operation."); 56 | } 57 | else 58 | { 59 | Utils::OpenMessageDialog(EAppMsgType::Ok, "Running stub filler operation."); 60 | 61 | // Run stub filler operation 62 | if (OpenDialogMenu()) { } 63 | } 64 | } 65 | else 66 | { 67 | Utils::OpenMessageDialog(EAppMsgType::Ok, "Running stub filler operation."); 68 | 69 | // Run stub filler operation 70 | if (OpenDialogMenu()) { } 71 | } 72 | } 73 | 74 | void FAssetGeneratorModule::RegisterMenus() 75 | { 76 | // Owner will be used for cleanup in call to UToolMenus::UnregisterOwner 77 | FToolMenuOwnerScoped OwnerScoped(this); 78 | 79 | { 80 | UToolMenu* Menu = UToolMenus::Get()->ExtendMenu("LevelEditor.MainMenu.Window"); 81 | { 82 | FToolMenuSection& Section = Menu->FindOrAddSection("WindowLayout"); 83 | Section.AddMenuEntryWithCommandList(FAssetGeneratorCommands::Get().PluginAction, PluginCommands); 84 | } 85 | } 86 | 87 | { 88 | UToolMenu* ToolbarMenu = UToolMenus::Get()->ExtendMenu("LevelEditor.LevelEditorToolBar"); 89 | { 90 | FToolMenuSection& Section = ToolbarMenu->FindOrAddSection("Settings"); 91 | { 92 | FToolMenuEntry& Entry = Section.AddEntry(FToolMenuEntry::InitToolBarButton(FAssetGeneratorCommands::Get().PluginAction)); 93 | Entry.SetCommandList(PluginCommands); 94 | } 95 | } 96 | } 97 | } 98 | 99 | bool FAssetGeneratorModule::OpenDialogMenu() 100 | { 101 | IDesktopPlatform* FileManager = FDesktopPlatformModule::Get(); 102 | FileManager->OpenFileDialog(0, DialogName, DefaultPath, DefaultFile, FileTypes, Flags,SelectedFileNames); 103 | if (SelectedFileNames.Num() > 1 && !FileManager) 104 | { 105 | UE_LOG(LogTemp, Error, TEXT("FileManipulation: Please only select one file!")); 106 | return false; 107 | } 108 | UE_LOG(LogTemp, Display, TEXT("FileManipulation: File %s loaded."), *SelectedFileNames[0]); 109 | return true; 110 | } 111 | 112 | FString FAssetGeneratorModule::LoadFile() 113 | { 114 | IPlatformFile& FileManager = FPlatformFileManager::Get().GetPlatformFile(); 115 | FString FileContent; 116 | if (FileManager.FileExists(*SelectedFileNames[0])) 117 | { 118 | if (FFileHelper::LoadFileToString(FileContent, *SelectedFileNames[0], FFileHelper::EHashOptions::None)) 119 | { 120 | UE_LOG(LogTemp, Display, TEXT("FileManipulation: Text From File: %s"), *FileContent); 121 | } 122 | else 123 | { 124 | UE_LOG(LogTemp, Error, TEXT("FileManipulation: Could not load text from file for some reason.")); 125 | } 126 | } else 127 | { 128 | UE_LOG(LogTemp, Error, TEXT("FileManipulation: Could not read file because it was not found.")); 129 | UE_LOG(LogTemp, Error, TEXT("FileManipulation: Expected file location: %s"), *SelectedFileNames[0]); 130 | } 131 | return FileContent; 132 | } 133 | 134 | #undef LOCTEXT_NAMESPACE 135 | 136 | IMPLEMENT_MODULE(FAssetGeneratorModule, AssetGenerator) -------------------------------------------------------------------------------- /Asset Generator/AssetGenProject/Plugins/AssetGenerator/Source/AssetGenerator/Private/AssetGeneratorCommands.cpp: -------------------------------------------------------------------------------- 1 | // Copyright Epic Games, Inc. All Rights Reserved. 2 | 3 | #include "AssetGeneratorCommands.h" 4 | 5 | #define LOCTEXT_NAMESPACE "FAssetGeneratorModule" 6 | 7 | void FAssetGeneratorCommands::RegisterCommands() 8 | { 9 | UI_COMMAND(PluginAction, "AssetGenerator", "Execute AssetGenerator action", EUserInterfaceActionType::Button, FInputGesture()); 10 | } 11 | 12 | #undef LOCTEXT_NAMESPACE 13 | -------------------------------------------------------------------------------- /Asset Generator/AssetGenProject/Plugins/AssetGenerator/Source/AssetGenerator/Private/AssetGeneratorStyle.cpp: -------------------------------------------------------------------------------- 1 | // Copyright Epic Games, Inc. All Rights Reserved. 2 | 3 | #include "AssetGeneratorStyle.h" 4 | #include "AssetGenerator.h" 5 | #include "Framework/Application/SlateApplication.h" 6 | #include "Styling/SlateStyleRegistry.h" 7 | #include "Slate/SlateGameResources.h" 8 | #include "Interfaces/IPluginManager.h" 9 | 10 | TSharedPtr< FSlateStyleSet > FAssetGeneratorStyle::StyleInstance = NULL; 11 | 12 | void FAssetGeneratorStyle::Initialize() 13 | { 14 | if (!StyleInstance.IsValid()) 15 | { 16 | StyleInstance = Create(); 17 | FSlateStyleRegistry::RegisterSlateStyle(*StyleInstance); 18 | } 19 | } 20 | 21 | void FAssetGeneratorStyle::Shutdown() 22 | { 23 | FSlateStyleRegistry::UnRegisterSlateStyle(*StyleInstance); 24 | ensure(StyleInstance.IsUnique()); 25 | StyleInstance.Reset(); 26 | } 27 | 28 | FName FAssetGeneratorStyle::GetStyleSetName() 29 | { 30 | static FName StyleSetName(TEXT("AssetGeneratorStyle")); 31 | return StyleSetName; 32 | } 33 | 34 | #define IMAGE_BRUSH( RelativePath, ... ) FSlateImageBrush( Style->RootToContentDir( RelativePath, TEXT(".png") ), __VA_ARGS__ ) 35 | #define BOX_BRUSH( RelativePath, ... ) FSlateBoxBrush( Style->RootToContentDir( RelativePath, TEXT(".png") ), __VA_ARGS__ ) 36 | #define BORDER_BRUSH( RelativePath, ... ) FSlateBorderBrush( Style->RootToContentDir( RelativePath, TEXT(".png") ), __VA_ARGS__ ) 37 | #define TTF_FONT( RelativePath, ... ) FSlateFontInfo( Style->RootToContentDir( RelativePath, TEXT(".ttf") ), __VA_ARGS__ ) 38 | #define OTF_FONT( RelativePath, ... ) FSlateFontInfo( Style->RootToContentDir( RelativePath, TEXT(".otf") ), __VA_ARGS__ ) 39 | 40 | const FVector2D Icon16x16(16.0f, 16.0f); 41 | const FVector2D Icon20x20(20.0f, 20.0f); 42 | const FVector2D Icon40x40(40.0f, 40.0f); 43 | 44 | TSharedRef< FSlateStyleSet > FAssetGeneratorStyle::Create() 45 | { 46 | TSharedRef< FSlateStyleSet > Style = MakeShareable(new FSlateStyleSet("AssetGeneratorStyle")); 47 | Style->SetContentRoot(IPluginManager::Get().FindPlugin("AssetGenerator")->GetBaseDir() / TEXT("Resources")); 48 | 49 | Style->Set("AssetGenerator.PluginAction", new IMAGE_BRUSH(TEXT("ButtonIcon_40x"), Icon40x40)); 50 | 51 | return Style; 52 | } 53 | 54 | #undef IMAGE_BRUSH 55 | #undef BOX_BRUSH 56 | #undef BORDER_BRUSH 57 | #undef TTF_FONT 58 | #undef OTF_FONT 59 | 60 | void FAssetGeneratorStyle::ReloadTextures() 61 | { 62 | if (FSlateApplication::IsInitialized()) 63 | { 64 | FSlateApplication::Get().GetRenderer()->ReloadTextureResources(); 65 | } 66 | } 67 | 68 | const ISlateStyle& FAssetGeneratorStyle::Get() 69 | { 70 | return *StyleInstance; 71 | } 72 | -------------------------------------------------------------------------------- /Asset Generator/AssetGenProject/Plugins/AssetGenerator/Source/AssetGenerator/Private/ParseJSON.cpp: -------------------------------------------------------------------------------- 1 | #include "ParseJSON.h" 2 | 3 | TArray ParseJSON::Objects; 4 | 5 | void ParseJSON::ParseFunction(TArray> FunctionType, FAssetInfo &Info, const EType InfoType) 6 | { 7 | for (int j = 0; j < FunctionType.Num(); j++) 8 | { 9 | const TSharedPtr Type = FunctionType[j]->AsObject(); 10 | FFunctionInfo FunctionInfo; 11 | Type->TryGetStringField(FString(UTF8_TO_TCHAR("name")), FunctionInfo.Name); 12 | TArray> Args = Type->GetArrayField(FString(UTF8_TO_TCHAR("args"))); 13 | if (Args.Num() > 0) 14 | { 15 | for (int k = 0; k < Args.Num(); k++) 16 | { 17 | const TSharedPtr Arg = Args[k]->AsObject(); 18 | FArgInfo ArgInfo; 19 | Arg->TryGetStringField(FString(UTF8_TO_TCHAR("name")), ArgInfo.Name); 20 | Arg->TryGetStringField(FString(UTF8_TO_TCHAR("type")), ArgInfo.Type); 21 | Arg->TryGetBoolField(FString(UTF8_TO_TCHAR("is_out")), ArgInfo.bIsOut); 22 | Arg->TryGetBoolField(FString(UTF8_TO_TCHAR("is_return")), ArgInfo.bIsReturn); 23 | FunctionInfo.Args.Add(ArgInfo); 24 | } 25 | 26 | if (InfoType == EType::Event) { Info.Events.Add(FunctionInfo); } 27 | else if (InfoType == EType::Function) { Info.Functions.Add(FunctionInfo); } 28 | else if (InfoType == EType::Delegate) { Info.Delegates.Add(FunctionInfo); } 29 | } 30 | } 31 | } 32 | 33 | void ParseJSON::ParseObject(const FString JsonString) 34 | { 35 | TArray> Json; 36 | TSharedRef> JsonReader = TJsonReaderFactory<>::Create(JsonString); 37 | if (FJsonSerializer::Deserialize<>(JsonReader, Json, FJsonSerializer::EFlags::None)) 38 | { 39 | for (int i = 0; i < Json.Num(); i++) 40 | { 41 | FAssetInfo Info; 42 | const TSharedPtr JsonObject = Json[i]->AsObject(); 43 | 44 | JsonObject->TryGetStringField(FString(UTF8_TO_TCHAR("type")), Info.Type); 45 | JsonObject->TryGetStringField(FString(UTF8_TO_TCHAR("bp_class")), Info.Name); 46 | JsonObject->TryGetStringField(FString(UTF8_TO_TCHAR("path")), Info.Path); 47 | JsonObject->TryGetStringField(FString(UTF8_TO_TCHAR("inherits")), Info.Inherits); 48 | 49 | TArray> Events = JsonObject->GetArrayField(FString(UTF8_TO_TCHAR("events"))); 50 | if (Events.Num() > 0) { ParseFunction(Events, Info, EType::Event); } 51 | 52 | TArray> Functions = JsonObject->GetArrayField(FString(UTF8_TO_TCHAR("functions"))); 53 | if (Functions.Num() > 0) { ParseFunction(Functions, Info, EType::Function); } 54 | 55 | TArray> Properties = JsonObject->GetArrayField(FString(UTF8_TO_TCHAR("properties"))); 56 | if (Properties.Num() > 0) 57 | { 58 | for (int j = 0; j < Properties.Num(); j++) 59 | { 60 | const TSharedPtr Property = Properties[j]->AsObject(); 61 | FPropertyInfo PropertyInfo; 62 | Property->TryGetStringField(FString(UTF8_TO_TCHAR("name")), PropertyInfo.Name); 63 | Property->TryGetStringField(FString(UTF8_TO_TCHAR("type")), PropertyInfo.Type); 64 | Info.Properties.Add(PropertyInfo); 65 | } 66 | } 67 | 68 | TArray> Delegates = JsonObject->GetArrayField(FString(UTF8_TO_TCHAR("delegates"))); 69 | if (Delegates.Num() > 0) { ParseFunction(Delegates, Info, EType::Delegate); } 70 | 71 | Objects.Add(Info); 72 | } 73 | } else { UE_LOG(LogTemp, Error, TEXT("JSON Parse: Failed to deserialise!")); } 74 | } 75 | 76 | void ParseJSON::ParseOld(const FString JsonString) 77 | { 78 | TArray> Json; 79 | TSharedRef> JsonReader = TJsonReaderFactory<>::Create(JsonString); 80 | if (FJsonSerializer::Deserialize<>(JsonReader, Json, FJsonSerializer::EFlags::None)) 81 | { 82 | for (int i = 0; i < Json.Num(); i++) 83 | { 84 | FAssetInfo Info; 85 | const TSharedPtr JsonObject = Json[i]->AsObject(); 86 | JsonObject->TryGetStringField(FString(UTF8_TO_TCHAR("type")), Info.Type); 87 | JsonObject->TryGetStringField(FString(UTF8_TO_TCHAR("name")), Info.Name); 88 | JsonObject->TryGetStringField(FString(UTF8_TO_TCHAR("path")), Info.Path); 89 | Objects.Add(Info); 90 | } 91 | } else { UE_LOG(LogTemp, Error, TEXT("JSON Parse: Failed to deserialise!")); } 92 | } 93 | 94 | TArray ParseJSON::GetObjects(const FString JsonString) 95 | { 96 | ParseOld(JsonString); 97 | return Objects; 98 | } 99 | -------------------------------------------------------------------------------- /Asset Generator/AssetGenProject/Plugins/AssetGenerator/Source/AssetGenerator/Private/StubFillerOperation.cpp: -------------------------------------------------------------------------------- 1 | #include "StubFillerOperation.h" 2 | 3 | void StubFillerOperation::FillStubs() 4 | { 5 | 6 | 7 | 8 | } 9 | -------------------------------------------------------------------------------- /Asset Generator/AssetGenProject/Plugins/AssetGenerator/Source/AssetGenerator/Public/AssetGenOperation.h: -------------------------------------------------------------------------------- 1 | #pragma once 2 | 3 | #include "CoreMinimal.h" 4 | #include "ParseJSON.h" 5 | 6 | class AssetGenOperation 7 | { 8 | private: 9 | static TArray Objects; 10 | int ObjectIndex = 0; 11 | 12 | static FName GetAssetFName(); 13 | static const TCHAR* GetPackageName(); 14 | static UBlueprint* CreateBlueprint(UClass* ParentClass, UPackage* Package); 15 | static void CreateAssetPackage(); 16 | 17 | public: 18 | static void GenerateAssets(const FString JsonString); 19 | }; 20 | -------------------------------------------------------------------------------- /Asset Generator/AssetGenProject/Plugins/AssetGenerator/Source/AssetGenerator/Public/AssetGenUtils.h: -------------------------------------------------------------------------------- 1 | #pragma once 2 | 3 | #include "CoreMinimal.h" 4 | 5 | class AssetGenUtils 6 | { 7 | public: 8 | static UClass* GetAssetClass(const FString AssetType); 9 | static UFactory* GetAssetFactory(const FString AssetType); 10 | }; 11 | -------------------------------------------------------------------------------- /Asset Generator/AssetGenProject/Plugins/AssetGenerator/Source/AssetGenerator/Public/AssetGenerator.h: -------------------------------------------------------------------------------- 1 | // Copyright Epic Games, Inc. All Rights Reserved. 2 | 3 | #pragma once 4 | 5 | #include "CoreMinimal.h" 6 | #include "AssetGenOperation.h" 7 | #include "StubFillerOperation.h" 8 | #include "AssetGeneratorStyle.h" 9 | #include "AssetGeneratorCommands.h" 10 | #include "Utils.h" 11 | #include "Misc/MessageDialog.h" 12 | #include "ToolMenus.h" 13 | #include "DesktopPlatform/Public/DesktopPlatformModule.h" 14 | #include "DesktopPlatform/Public/IDesktopPlatform.h" 15 | #include "Misc/FileHelper.h" 16 | #include "Modules/ModuleManager.h" 17 | 18 | class FToolBarBuilder; 19 | class FMenuBuilder; 20 | 21 | class FAssetGeneratorModule : public IModuleInterface 22 | { 23 | public: 24 | /** IModuleInterface implementation */ 25 | virtual void StartupModule() override; 26 | virtual void ShutdownModule() override; 27 | 28 | /** This function will be bound to Command. */ 29 | void PluginButtonClicked(); 30 | 31 | TArray SelectedFileNames; 32 | 33 | private: 34 | void RegisterMenus(); 35 | bool OpenDialogMenu(); 36 | FString LoadFile(); 37 | 38 | const FString& DialogName = "Open"; 39 | const FString& DefaultPath = "C:"; 40 | const FString& DefaultFile = ""; 41 | const FString& FileTypes = ".json"; 42 | const uint32 Flags = 0; 43 | 44 | TSharedPtr PluginCommands; 45 | }; 46 | -------------------------------------------------------------------------------- /Asset Generator/AssetGenProject/Plugins/AssetGenerator/Source/AssetGenerator/Public/AssetGeneratorCommands.h: -------------------------------------------------------------------------------- 1 | // Copyright Epic Games, Inc. All Rights Reserved. 2 | 3 | #pragma once 4 | 5 | #include "CoreMinimal.h" 6 | #include "Framework/Commands/Commands.h" 7 | #include "AssetGeneratorStyle.h" 8 | 9 | class FAssetGeneratorCommands : public TCommands 10 | { 11 | public: 12 | 13 | FAssetGeneratorCommands() 14 | : TCommands(TEXT("AssetGenerator"), NSLOCTEXT("Contexts", "AssetGenerator", "AssetGenerator Plugin"), NAME_None, FAssetGeneratorStyle::GetStyleSetName()) 15 | { 16 | } 17 | 18 | // TCommands<> interface 19 | virtual void RegisterCommands() override; 20 | 21 | public: 22 | TSharedPtr< FUICommandInfo > PluginAction; 23 | }; 24 | -------------------------------------------------------------------------------- /Asset Generator/AssetGenProject/Plugins/AssetGenerator/Source/AssetGenerator/Public/AssetGeneratorStyle.h: -------------------------------------------------------------------------------- 1 | // Copyright Epic Games, Inc. All Rights Reserved. 2 | 3 | #pragma once 4 | 5 | #include "CoreMinimal.h" 6 | #include "Styling/SlateStyle.h" 7 | 8 | class FAssetGeneratorStyle 9 | { 10 | public: 11 | 12 | static void Initialize(); 13 | 14 | static void Shutdown(); 15 | 16 | /** reloads textures used by slate renderer */ 17 | static void ReloadTextures(); 18 | 19 | /** @return The Slate style set for the Shooter game */ 20 | static const ISlateStyle& Get(); 21 | 22 | static FName GetStyleSetName(); 23 | 24 | private: 25 | 26 | static TSharedRef< class FSlateStyleSet > Create(); 27 | 28 | private: 29 | 30 | static TSharedPtr< class FSlateStyleSet > StyleInstance; 31 | }; -------------------------------------------------------------------------------- /Asset Generator/AssetGenProject/Plugins/AssetGenerator/Source/AssetGenerator/Public/ParseJSON.h: -------------------------------------------------------------------------------- 1 | #pragma once 2 | 3 | #include "CoreMinimal.h" 4 | #include "Json.h" 5 | 6 | struct FArgInfo 7 | { 8 | FString Name; 9 | FString Type; 10 | bool bIsOut; 11 | bool bIsReturn; 12 | }; 13 | 14 | struct FFunctionInfo 15 | { 16 | FString Name; 17 | TArray Args; 18 | }; 19 | 20 | struct FPropertyInfo 21 | { 22 | FString Name; 23 | FString Type; 24 | }; 25 | 26 | struct FAssetInfo 27 | { 28 | FString Type; 29 | FString Name; 30 | FString Path; 31 | FString Inherits; 32 | TArray Events; 33 | TArray Functions; 34 | TArray Properties; 35 | TArray Delegates; 36 | }; 37 | 38 | enum class EType 39 | { 40 | Event, 41 | Function, 42 | Delegate 43 | }; 44 | 45 | class ParseJSON 46 | { 47 | private: 48 | static void ParseFunction(TArray> FunctionType, FAssetInfo &Info, const EType InfoType); 49 | static void ParseObject(const FString JsonString); 50 | static void ParseOld(const FString JsonString); 51 | 52 | static TArray Objects; 53 | 54 | public: 55 | static TArray GetObjects(const FString JsonString); 56 | }; 57 | -------------------------------------------------------------------------------- /Asset Generator/AssetGenProject/Plugins/AssetGenerator/Source/AssetGenerator/Public/StubFillerOperation.h: -------------------------------------------------------------------------------- 1 | #pragma once 2 | 3 | #include "CoreMinimal.h" 4 | #include "Json.h" 5 | #include "ParseJSON.h" 6 | 7 | class StubFillerOperation 8 | { 9 | private: 10 | static TArray Objects; 11 | 12 | public: 13 | static void FillStubs(); 14 | }; 15 | -------------------------------------------------------------------------------- /Asset Generator/AssetGenProject/Plugins/AssetGenerator/Source/AssetGenerator/Public/Utils.h: -------------------------------------------------------------------------------- 1 | #pragma once 2 | 3 | #include "CoreMinimal.h" 4 | 5 | class Utils 6 | { 7 | public: 8 | static void OpenMessageDialog(EAppMsgType::Type Buttons, const FString Text) 9 | { 10 | FMessageDialog::Open(Buttons, FText::FromString(Text)); 11 | } 12 | 13 | static bool GetSelectedButtonFromDialog(const FString Text, EAppMsgType::Type Buttons, EAppReturnType::Type CheckSelected) 14 | { 15 | if (FMessageDialog::Open(Buttons, FText::FromString(Text)) == CheckSelected) { return true; } 16 | return false; 17 | } 18 | }; -------------------------------------------------------------------------------- /Asset Generator/Audio Assets/attenuations.txt: -------------------------------------------------------------------------------- 1 | AllienEggCallingSoundAttenuation 2 | Ambix_MagicHoleAttenuation 3 | A_Attenuation 4 | BigCallingSoundAttenuation 5 | ButterflyAttenuation 6 | CareTakerBarrierProjectileAttenuation 7 | CloseBigexplAttenuation 8 | CloseExplosionAttenuation 9 | CloseSoundAttenuation 10 | CloseSoundAttenuationSmallCenter 11 | CloseWideAttenuation 12 | CreatureImpactAttenuation 13 | CutSceneSFXAttenuation 14 | DataRackSmallCenterAttenuation 15 | Distance100-800Air200-500Attenuation 16 | DistantBigexplAttenuation 17 | DistantCommunication 18 | DistantMisc_Attenuation 19 | DistantWide_Misc_Attenuation_Cue 20 | DonkeySoundAttenuation 21 | DonkeyVocalSoundAttenuation 22 | DorettaPickedUpVoiceAttenuation 23 | DorettaVoiceAttenuationNoFocus 24 | DreadnaughtMisc_Attenuation 25 | DreadnaughtStepsAttenuation 26 | DropPodAttenuation 27 | DropPodMiscAttenuation 28 | Droppod_OxygenLeak_Attenuation1 29 | EnemyDeathAttenuation 30 | EnemyFallAttenuation 31 | EnemyMediumAttenuation 32 | EnemyOnWallsMedium 33 | EnemyProjectileImpactAttenuation 34 | EnemyTankSizeAttenuation 35 | ExplosionsSoundAttenuation 36 | ExplosionsSoundNearAttenuation 37 | ExplosionsSoundSmallCenterAttenuation 38 | ExplosionVibrationSubmixCurve 39 | ExplosiveProjectileSoundAttenuation 40 | FacilityPowerStationFocus 41 | FacilityRollingDroneAttenuation 42 | FaunaMediumCenterAttenuation 43 | FaunaSmallAttenuation 44 | FaunaVerySmallAttenuation 45 | FlareAttenuation 46 | GameEventLargeAttenuation 47 | GasBurstAttenuation 48 | GeneralWeaponSoundAttenuation 49 | GenericGemAttenuation 50 | GenericLargeAttenuation 51 | GenericLargeOcclusionAttenuation 52 | GenericLargestAttenuation 53 | GenericMediumAttenuation 54 | GenericSmallFocusAttenuation 55 | GenericSmallNoFocusAttenuation 56 | GenericSoundAttenuation 57 | GenericSpiderScream_Attenuation 58 | GhostSoundAttenuation1 59 | GliderBeastAttenuation 60 | HeartstoneGemSmallCenterAttenuation 61 | HugeExplosionWide_Attenuation 62 | ImportantSpiderSoundAttenuation 63 | LongDistanceSoundAttenuation 64 | LoudAtDistanceAttenuation 65 | MachineLargeAttenuationFocus 66 | MachineLargeAttenuationNoFocus 67 | MachineMediumAttenuationFocus 68 | MachinesSmallAttenuation 69 | MagicCrystalAttenuation 70 | MediumConeSoundAttenuation 71 | MediumDistanceSoundAttenuation 72 | MemorialHallMusicSoundAttenuation 73 | MicroMissileAttenuation 74 | MineHead_OxygenLeak_Attenuation 75 | MiniMuleSoundAttenuation 76 | MonoGenericSoundAttenuation 77 | PickAxeSmallCenterAttenuation 78 | RadioActiveCrystalsAttenuation 79 | ReallyCloseSoundAttenuation 80 | ReallyReallyCloseSoundAttenuation 81 | RefineryDiscreteObjectsAttenuation 82 | RefineryPistonObjectsAttenuation 83 | RockAttackAttenuation 84 | RollerDroneWeaponDistantAttenuationSmallCenter 85 | Slide_Attenuation 86 | SpaceRigAmbienceAttenuation 87 | SpeakAttenation 88 | SpiderScreamDistantAttenuation 89 | SpiderSoundAttenuation 90 | SpiderStepsAttenuation 91 | Spider_FP_SoundAttenuation 92 | SpitballerDeathAttenuation 93 | StepsEtcAttenuation 94 | StereoGenericSoundAttenuation 95 | ThornVinesAttenuation 96 | ToolSoundAttenuation 97 | TurretAttenuation 98 | TwinB_ProjectileAttenuation 99 | VolatileGutsExplosionAttenuation_1 100 | VolatileGutsExplosionAttenuation_2 101 | WeaponCloseAttenuation 102 | WeaponCommunicationSoundAttenuation 103 | WeaponDistantAttenuation 104 | WeaponDistantAttenuationSmallCenter 105 | WeaponSmallCenterAttenuation 106 | WeaponsMiscAttenuation 107 | WeaponVerySmallCenterAttenuation 108 | -------------------------------------------------------------------------------- /Asset Generator/Audio Assets/audio_assets.txt: -------------------------------------------------------------------------------- 1 | ML_BossMusic 2 | ML_EndWave 3 | ML_LevelMusic 4 | ML_LevelTutorial 5 | 6 | SoundConcurrency1_Drillvehicle 7 | SoundConcurrency2_EnemyScream 8 | SoundConcurrency2_Explosions 9 | SoundConcurrency3rdEnemies3 10 | SoundConcurrency3rdEnemiesAttack3 11 | SoundConcurrency3_EnemyIdle 12 | SoundConcurrency3_SwarmerIdle 13 | SoundConcurrencyBarrierTurret2 14 | SoundConcurrencyDeathMax2StopLowestPriority 15 | SoundConcurrencyDwarfSteps2 16 | SoundConcurrencyEnemySteps2 17 | SoundConcurrencyFauna4 18 | SoundConcurrencyFesterFlea 19 | SoundConcurrencyFire4 20 | SoundConcurrencyGems2 21 | SoundConcurrencyHydroWeedProjectileImpact 22 | SoundConcurrencyHydroWeedShooting 23 | SoundConcurrencyJellyBreeder1 24 | SoundConcurrencyMax1 25 | SoundConcurrencyPickAxe3 26 | SoundConcurrencyRefineryDiscrete 27 | SoundConcurrencyRicochet1 28 | SoundConcurrencySeasonEndScreen 29 | SoundConcurrencySentry1 30 | SoundConcurrencySpawnSound3 31 | SoundConcurrencyWeapons6 32 | SoundConcurrencyWoodlouse 33 | SoundConcurrency_EnemyDeath 34 | SoundConcurrency_Global 35 | SoundConcurrency_Only2AtATimePreventOld 36 | SoundConcurrency_OnlyOneAtATimePreventNew 37 | 38 | AllienEggCallingSoundAttenuation 39 | Ambix_MagicHoleAttenuation 40 | A_Attenuation 41 | BigCallingSoundAttenuation 42 | ButterflyAttenuation 43 | CareTakerBarrierProjectileAttenuation 44 | CloseBigexplAttenuation 45 | CloseExplosionAttenuation 46 | CloseSoundAttenuation 47 | CloseSoundAttenuationSmallCenter 48 | CloseWideAttenuation 49 | CreatureImpactAttenuation 50 | CutSceneSFXAttenuation 51 | DataRackSmallCenterAttenuation 52 | Distance100-800Air200-500Attenuation 53 | DistantBigexplAttenuation 54 | DistantCommunication 55 | DistantMisc_Attenuation 56 | DistantWide_Misc_Attenuation_Cue 57 | DonkeySoundAttenuation 58 | DonkeyVocalSoundAttenuation 59 | DorettaPickedUpVoiceAttenuation 60 | DorettaVoiceAttenuationNoFocus 61 | DreadnaughtMisc_Attenuation 62 | DreadnaughtStepsAttenuation 63 | DropPodAttenuation 64 | DropPodMiscAttenuation 65 | Droppod_OxygenLeak_Attenuation1 66 | EnemyDeathAttenuation 67 | EnemyFallAttenuation 68 | EnemyMediumAttenuation 69 | EnemyOnWallsMedium 70 | EnemyProjectileImpactAttenuation 71 | EnemyTankSizeAttenuation 72 | ExplosionsSoundAttenuation 73 | ExplosionsSoundNearAttenuation 74 | ExplosionsSoundSmallCenterAttenuation 75 | ExplosionVibrationSubmixCurve 76 | ExplosiveProjectileSoundAttenuation 77 | FacilityPowerStationFocus 78 | FacilityRollingDroneAttenuation 79 | FaunaMediumCenterAttenuation 80 | FaunaSmallAttenuation 81 | FaunaVerySmallAttenuation 82 | FlareAttenuation 83 | GameEventLargeAttenuation 84 | GasBurstAttenuation 85 | GeneralWeaponSoundAttenuation 86 | GenericGemAttenuation 87 | GenericLargeAttenuation 88 | GenericLargeOcclusionAttenuation 89 | GenericLargestAttenuation 90 | GenericMediumAttenuation 91 | GenericSmallFocusAttenuation 92 | GenericSmallNoFocusAttenuation 93 | GenericSoundAttenuation 94 | GenericSpiderScream_Attenuation 95 | GhostSoundAttenuation1 96 | GliderBeastAttenuation 97 | HeartstoneGemSmallCenterAttenuation 98 | HugeExplosionWide_Attenuation 99 | ImportantSpiderSoundAttenuation 100 | LongDistanceSoundAttenuation 101 | LoudAtDistanceAttenuation 102 | MachineLargeAttenuationFocus 103 | MachineLargeAttenuationNoFocus 104 | MachineMediumAttenuationFocus 105 | MachinesSmallAttenuation 106 | MagicCrystalAttenuation 107 | MediumConeSoundAttenuation 108 | MediumDistanceSoundAttenuation 109 | MemorialHallMusicSoundAttenuation 110 | MicroMissileAttenuation 111 | MineHead_OxygenLeak_Attenuation 112 | MiniMuleSoundAttenuation 113 | MonoGenericSoundAttenuation 114 | PickAxeSmallCenterAttenuation 115 | RadioActiveCrystalsAttenuation 116 | ReallyCloseSoundAttenuation 117 | ReallyReallyCloseSoundAttenuation 118 | RefineryDiscreteObjectsAttenuation 119 | RefineryPistonObjectsAttenuation 120 | RockAttackAttenuation 121 | RollerDroneWeaponDistantAttenuationSmallCenter 122 | Slide_Attenuation 123 | SpaceRigAmbienceAttenuation 124 | SpeakAttenation 125 | SpiderScreamDistantAttenuation 126 | SpiderSoundAttenuation 127 | SpiderStepsAttenuation 128 | Spider_FP_SoundAttenuation 129 | SpitballerDeathAttenuation 130 | StepsEtcAttenuation 131 | StereoGenericSoundAttenuation 132 | ThornVinesAttenuation 133 | ToolSoundAttenuation 134 | TurretAttenuation 135 | TwinB_ProjectileAttenuation 136 | VolatileGutsExplosionAttenuation_1 137 | VolatileGutsExplosionAttenuation_2 138 | WeaponCloseAttenuation 139 | WeaponCommunicationSoundAttenuation 140 | WeaponDistantAttenuation 141 | WeaponDistantAttenuationSmallCenter 142 | WeaponSmallCenterAttenuation 143 | WeaponsMiscAttenuation 144 | WeaponVerySmallCenterAttenuation 145 | 146 | 147 | 1stAnd3rdSharedWeapons 148 | 1stEnemies 149 | 1stEnemiesAttackAutoMix 150 | 1stEnemiesAttackManualMix 151 | 1stEnemiesDeathAutomix 152 | 1stEnemiesIdle 153 | 1stEnemiesMisc 154 | 1stEnemiesScreamAutoMix 155 | 1stEnemiesSteps 156 | 1stPersonFire1stWeaponsLoop 157 | 1stPersonFire1stWeaponsSingle 158 | 1stPersonFire2ndWeaponsAutoMix 159 | 1stPersonFire2ndWeaponsManualMix 160 | 1stPersonWeapon 161 | 1stPersonWeaponFireCore 162 | 1stPersonWeaponsTail 163 | 2dHitEnemy 164 | 2dSound 165 | 2ndEnemies 166 | 2ndEnemiesAttackAutoMix 167 | 2ndEnemiesDeathAutomix 168 | 2ndEnemiesDeathManualMix 169 | 2ndEnemiesGrabbersGroup 170 | 2ndEnemiesHydraWeedCommunication 171 | 2ndEnemiesHydraWeedShootAutoMix 172 | 2ndEnemiesIdle 173 | 2ndEnemiesMisc 174 | 2ndEnemiesMiscManualMix 175 | 2ndEnemiesMiscTail 176 | 2ndEnemiesScreamAutoMix 177 | 2ndEnemiesScreamGrabbersGroupAutoMix 178 | 2ndEnemiesSteps 179 | 3rdEnemies 180 | 3rdEnemiesCloseBite 181 | 3rdEnemiesCommunicationAutoMix 182 | 3rdEnemiesDeathAutomix 183 | 3rdEnemiesDeathManualMix 184 | 3rdEnemiesIdle 185 | 3rdEnemiesManualMix 186 | 3rdEnemiesMisc 187 | 3rdEnemiesScream 188 | 3rdEnemiesSteps 189 | 3rdPersonWeaponCore 190 | 3rdpersonWeapons 191 | 3rdPersonWeaponTail 192 | Ambience 193 | Attenuation 194 | BeerEffectsAutoMix 195 | BigUnitsParent 196 | BulletPassBy 197 | CareTakerBarrierFireCoreAutoMix 198 | CareTakerBarrierFireTail 199 | CareTakerCommunicationAutoMix 200 | CareTakerCommunicationTimed 201 | CareTakerManualMix 202 | CareTakerParent 203 | CareTakerPyramid 204 | CharacterFootsteps 205 | CharacterGeneric 206 | CharactersImpactArmor 207 | CharactersImpactDwarf 208 | CharactersParent 209 | Coils 210 | CutSceneSFX 211 | CutSceneSpeak 212 | Depositing 213 | DepositingAutoMix 214 | DepositingManMix 215 | DrillVehicle 216 | DrillVehicleAutoMix 217 | DrillVehicleManualMix 218 | DrillVehicleTalk 219 | DropPod 220 | DropSpikeFall 221 | Earthquake 222 | Enemies 223 | EnemiesCommunication 224 | EnemiesCommunicationGrabbersGroup 225 | EnemiesParent 226 | EnemiesProjectileImpactAutoMix 227 | EnemiesProjectileManualMix 228 | Enemy_Death 229 | Enviorment_FootstepOverwrite 230 | EnvironmentCommunication 231 | EnvironmentMisc 232 | EnvironmentParent 233 | ExplosionsCoreAutoMix 234 | ExplosionsDistant 235 | ExplosionSinus 236 | ExplosionsManualMix 237 | ExplosionsParent 238 | ExplosionsTail 239 | FacilityPowerStation 240 | FriendlyFireProjectileImpact 241 | FuelCell 242 | GameEvents 243 | GameEventsCommunicationAutoMix 244 | GameEventsManualMix 245 | GhostNearSound 246 | GrabbedByEnemy 247 | GunTower 248 | GunTower1stAutoMix 249 | GunTower2ndAutoMix 250 | GunTower3rdManualMix 251 | GunTowerManualMix 252 | HelperWeapons 253 | HotSprings 254 | InfectedMuleCommunication 255 | InfectedMuleMisc 256 | LargestExplosions 257 | LowHealth 258 | MachinesParent 259 | Master 260 | MineHead 261 | Mining 262 | MiscMachines 263 | MiscPerkAutoMix 264 | MiscPerkManualMix 265 | MiscProjectileImpactAutoMix 266 | MiscProjectileManualMix 267 | MissionControl 268 | MulesAutoMix 269 | MulesManualMix 270 | Music 271 | Music_Action 272 | Music_Background 273 | Music_BeerEffect 274 | Music_Boss 275 | Music_Discovery 276 | Music_Endwave 277 | Music_JukeBox 278 | Music_MemorialHall 279 | Music_Menu 280 | Music_Menu_Endscreen 281 | Music_PromotionMenu 282 | OmmoranAutoMix 283 | OmmoranCommunicationAutoMix 284 | OmmoranCommunicationManualMix 285 | OmmoranHeartstone 286 | OmmoranManualMix 287 | OmmoranTail 288 | Organ 289 | PerkHeightenedSenseAutoMix 290 | PerkIronWillAutoMix 291 | PerksParent 292 | Pipes 293 | PlayerNoDuck 294 | RefineryMain 295 | RefineryRocket 296 | RobotCommunication 297 | RobotParent 298 | RockAttack 299 | RockAttackAutoMix 300 | RockAttackHighPrio 301 | RockAttackManualMix 302 | SFX 303 | SharedWeaponsReload 304 | ShieldFields 305 | ShredderMisc 306 | ShreddersDrillAutoMix 307 | ShreddersIdle 308 | SmallUnitsParent 309 | SpeakDwarf 310 | SpeakDwarfNoDuck 311 | SpeakDwarfParent 312 | SpeakParent 313 | SpecialTerminalEvent 314 | SupplyDropAutoMix 315 | SupplyDropManualMix 316 | TentacleCommunicationTail 317 | TentaclesCommunicationInital 318 | TentaclesImpact 319 | TentaclesManualMix 320 | TentaclesParent 321 | TunnelAmbience 322 | UI 323 | UIControllerSounds 324 | UI_AutoMix 325 | UI_IsolatedFromWorld 326 | UI_largeAutomix 327 | UI_ManualMix 328 | VoiceChat 329 | VolatileGutsExplosions 330 | WeaponCommunication 331 | WeaponRicochet 332 | WeaponsParent 333 | 334 | DuckOnBeerEffects 335 | DuckOnOperatingMachine 336 | DuckOnPerkActivated 337 | DuckOnPerkIronWillActivated 338 | DuckOnSpecialTerminalEvent 339 | DuckOnWeaponCommunication0-5 340 | DuckOnWeaponCommunication1-0 341 | DuckOnWeaponCommunication2-0 342 | Duck_InMenu_Music_and_AmbientoundMix1 343 | Duck_OtherMusicOnEndScreen_SoundMix 344 | MusicActionOnly_SoundMix 345 | MusicBeerEffectOnly_SoundMix 346 | MusicBossOnly_SoundMix 347 | MusicDiscoveryOnly_SoundMix 348 | MusicEndwaveOnly_SoundMix 349 | MusicJukeBox_SoundMix 350 | MusicMemorialHall_SoundMix1 351 | NoAmbience_SoundMix 352 | PSM_Duck1stPersonFireWeaponAutoMix 353 | PSM_Duck2ndAnd3rdEnemiesAutoMix 354 | PSM_Duck2ndEnemiesIdleAutoMix 355 | PSM_Duck3rdEnemiesIdleAutoMix 356 | PSM_Duck3rdPersonWeaponFireAutoMix 357 | PSM_Duck3rdStepsAutoMix 358 | PSM_DuckArmorHitAutoMix 359 | PSM_DuckEverythingOnDwarfSpeaksAutoMix 360 | PSM_DuckEverythingOnGhostAutoMix 361 | PSM_DuckEverythingOnMissionControlAutoMix 362 | PSM_DuckEverythingOnUISmallAutomix 363 | PSM_DuckEverythingOnUI_LargeAutomix 364 | PSM_DuckFootstepsAutoMix 365 | PSM_DuckHelperWeapons 366 | PSM_DuckOn1stEnemiesDeath 367 | PSM_DuckOn1stEnemyImpactShort 368 | PSM_DuckOn1stEnemyScreamAutoMix 369 | PSM_DuckOn1stPersonSingleFire 370 | PSM_DuckOn1stPersonWeaponFireLoopAutoMix 371 | PSM_DuckOn2dEnemyHitAutoMix 372 | PSM_DuckOn2ndEnemiesDeath1-5 373 | PSM_DuckOn2ndEnemiesDeathAutoMix 374 | PSM_DuckOn2ndEnemiesScreamAutoMixShort 375 | PSM_DuckOn3rdEnemiesCommunicationAutoMix 376 | PSM_DuckOn3rdEnemiesDeath0-1 377 | PSM_DuckOn3rdEnemiesDeathAutoMix 378 | PSM_DuckOnBoscoTalkAutoMix 379 | PSM_DuckOnBulletPassBy 380 | PSM_DuckOnCareTakerBarrierFireAutoMix 381 | PSM_DuckOnCareTakerCommunicationAutoMix 382 | PSM_DuckOnCareTakerCommunicationTimedMix 383 | PSM_DuckOnDown2-0 384 | PSM_DuckOnDownStateBPTiming 385 | PSM_DuckOnDrillVehicleAutoMix 386 | PSM_DuckOnDrillVehicleTalk 387 | PSM_DuckOnDropSpikeFall1-0 388 | PSM_DuckOnEggAlert 389 | PSM_DuckOnEndScreen 390 | PSM_DuckOnEnemyCommunication0-5 391 | PSM_DuckOnEnemyCommunicationFixedTiming 392 | PSM_DuckOnEnemyDeath3-0sec 393 | PSM_DuckOnEnemyProjectileImpact 394 | PSM_DuckOnExplosionClose 395 | PSM_DuckOnExplosionDistant 396 | PSM_DuckOnExplosionGeneralLongTail0-5 397 | PSM_DuckOnExplosionGeneralLongTailBPTiming 398 | PSM_DuckOnExplosionGeneralShortTailBPTiming 399 | PSM_DuckOnExplosionsAutoMix 400 | PSM_DuckOnFriendlyFireProjectileImpactA 401 | PSM_DuckOnFriendlyFireProjectileImpactB 402 | PSM_DuckOnFrozenStateBPTiming 403 | PSM_DuckOnGameEventCommunication 404 | PSM_DuckOnGrabbed 405 | PSM_DuckOnHeightenedSenses 406 | PSM_DuckOnHugeExplosion3-0 407 | PSM_DuckOnHydraWeedCommunication 408 | PSM_DuckOnImpactShort 409 | PSM_DuckOnImportant0-5sec 410 | PSM_DuckOnImportant1-5sec 411 | PSM_DuckOnInfectedMuleAutoMix 412 | PSM_DuckOnInfectedMuleBPTiming 413 | PSM_DuckOnInsideHotspringBPTiming 414 | PSM_DuckOnInsideSeasonTerminal 415 | PSM_DuckOnInsideShieldBPTiming 416 | PSM_DuckOnInsideSlowGrenadeBPTiming 417 | PSM_DuckOnInsideWardrope 418 | PSM_DuckOnMachineActivityAutoMix 419 | PSM_DuckOnMiscProjectileImpactAutoMix 420 | PSM_DuckOnOmmoranAutoMix 421 | PSM_DuckOnOmmoranCommunicationAutoMix 422 | PSM_DuckOnQuakeBPTimingAutoMix 423 | PSM_DuckOnRicochetAutoMix 424 | PSM_DuckOnRockAttack 425 | PSM_DuckOnRockAttackHighPrio 426 | PSM_DuckOnShooting 427 | PSM_DuckOnShredderAutoMix 428 | PSM_DuckOnTentacleCommunication 429 | PSM_DuckOnTentacleImpact 430 | PSM_DuckOnTowerFire1stAutomix 431 | PSM_DuckOnTowerFire2ndAutomix 432 | PSM_DuckOnTunnelAmbience 433 | PSM_DuckOnWeakPoint 434 | PSM_DuckPlayer 435 | PSM_DuckShieldsAutoMix 436 | PSM_FadeInSFXandMusic 437 | PSM_FadeOutMusicAndSFX 438 | PSM_FadeOutPromotionMusic 439 | PSM_ForPromotion_FadeOutSfxAndSpaceRigMusic 440 | PSM_GrabbedByCaveLeech 441 | PSM_MuteSFXandMusic 442 | 443 | AmbienceSubmix 444 | CharacterNoDuckSubmix 445 | CharacterSubmix 446 | CutSceneSFX 447 | DwarfSpeakSubmix 448 | EnemiesGeneralSubmix 449 | ExplosionsSubmix 450 | GameEventsSubmix 451 | GeneralSpeak_Submix 452 | GeneralWeaponsToolsSubmix 453 | MachinesSubmix 454 | MasterSubmix 455 | MiscSubmix 456 | MusicSubmix 457 | PerksSubmix 458 | RobotSubmix 459 | SFXSubmix 460 | UI_Submix 461 | -------------------------------------------------------------------------------- /Asset Generator/Audio Assets/classes.txt: -------------------------------------------------------------------------------- 1 | 1stAnd3rdSharedWeapons 2 | 1stEnemies 3 | 1stEnemiesAttackAutoMix 4 | 1stEnemiesAttackManualMix 5 | 1stEnemiesDeathAutomix 6 | 1stEnemiesIdle 7 | 1stEnemiesMisc 8 | 1stEnemiesScreamAutoMix 9 | 1stEnemiesSteps 10 | 1stPersonFire1stWeaponsLoop 11 | 1stPersonFire1stWeaponsSingle 12 | 1stPersonFire2ndWeaponsAutoMix 13 | 1stPersonFire2ndWeaponsManualMix 14 | 1stPersonWeapon 15 | 1stPersonWeaponFireCore 16 | 1stPersonWeaponsTail 17 | 2dHitEnemy 18 | 2dSound 19 | 2ndEnemies 20 | 2ndEnemiesAttackAutoMix 21 | 2ndEnemiesDeathAutomix 22 | 2ndEnemiesDeathManualMix 23 | 2ndEnemiesGrabbersGroup 24 | 2ndEnemiesHydraWeedCommunication 25 | 2ndEnemiesHydraWeedShootAutoMix 26 | 2ndEnemiesIdle 27 | 2ndEnemiesMisc 28 | 2ndEnemiesMiscManualMix 29 | 2ndEnemiesMiscTail 30 | 2ndEnemiesScreamAutoMix 31 | 2ndEnemiesScreamGrabbersGroupAutoMix 32 | 2ndEnemiesSteps 33 | 3rdEnemies 34 | 3rdEnemiesCloseBite 35 | 3rdEnemiesCommunicationAutoMix 36 | 3rdEnemiesDeathAutomix 37 | 3rdEnemiesDeathManualMix 38 | 3rdEnemiesIdle 39 | 3rdEnemiesManualMix 40 | 3rdEnemiesMisc 41 | 3rdEnemiesScream 42 | 3rdEnemiesSteps 43 | 3rdPersonWeaponCore 44 | 3rdpersonWeapons 45 | 3rdPersonWeaponTail 46 | Ambience 47 | Attenuation 48 | BeerEffectsAutoMix 49 | BigUnitsParent 50 | BulletPassBy 51 | CareTakerBarrierFireCoreAutoMix 52 | CareTakerBarrierFireTail 53 | CareTakerCommunicationAutoMix 54 | CareTakerCommunicationTimed 55 | CareTakerManualMix 56 | CareTakerParent 57 | CareTakerPyramid 58 | CharacterFootsteps 59 | CharacterGeneric 60 | CharactersImpactArmor 61 | CharactersImpactDwarf 62 | CharactersParent 63 | Coils 64 | CutSceneSFX 65 | CutSceneSpeak 66 | Depositing 67 | DepositingAutoMix 68 | DepositingManMix 69 | DrillVehicle 70 | DrillVehicleAutoMix 71 | DrillVehicleManualMix 72 | DrillVehicleTalk 73 | DropPod 74 | DropSpikeFall 75 | Earthquake 76 | Enemies 77 | EnemiesCommunication 78 | EnemiesCommunicationGrabbersGroup 79 | EnemiesParent 80 | EnemiesProjectileImpactAutoMix 81 | EnemiesProjectileManualMix 82 | Enemy_Death 83 | Enviorment_FootstepOverwrite 84 | EnvironmentCommunication 85 | EnvironmentMisc 86 | EnvironmentParent 87 | ExplosionsCoreAutoMix 88 | ExplosionsDistant 89 | ExplosionSinus 90 | ExplosionsManualMix 91 | ExplosionsParent 92 | ExplosionsTail 93 | FacilityPowerStation 94 | FriendlyFireProjectileImpact 95 | FuelCell 96 | GameEvents 97 | GameEventsCommunicationAutoMix 98 | GameEventsManualMix 99 | GhostNearSound 100 | GrabbedByEnemy 101 | GunTower 102 | GunTower1stAutoMix 103 | GunTower2ndAutoMix 104 | GunTower3rdManualMix 105 | GunTowerManualMix 106 | HelperWeapons 107 | HotSprings 108 | InfectedMuleCommunication 109 | InfectedMuleMisc 110 | LargestExplosions 111 | LowHealth 112 | MachinesParent 113 | Master 114 | MineHead 115 | Mining 116 | MiscMachines 117 | MiscPerkAutoMix 118 | MiscPerkManualMix 119 | MiscProjectileImpactAutoMix 120 | MiscProjectileManualMix 121 | MissionControl 122 | MulesAutoMix 123 | MulesManualMix 124 | Music 125 | Music_Action 126 | Music_Background 127 | Music_BeerEffect 128 | Music_Boss 129 | Music_Discovery 130 | Music_Endwave 131 | Music_JukeBox 132 | Music_MemorialHall 133 | Music_Menu 134 | Music_Menu_Endscreen 135 | Music_PromotionMenu 136 | OmmoranAutoMix 137 | OmmoranCommunicationAutoMix 138 | OmmoranCommunicationManualMix 139 | OmmoranHeartstone 140 | OmmoranManualMix 141 | OmmoranTail 142 | Organ 143 | PerkHeightenedSenseAutoMix 144 | PerkIronWillAutoMix 145 | PerksParent 146 | Pipes 147 | PlayerNoDuck 148 | RefineryMain 149 | RefineryRocket 150 | RobotCommunication 151 | RobotParent 152 | RockAttack 153 | RockAttackAutoMix 154 | RockAttackHighPrio 155 | RockAttackManualMix 156 | SFX 157 | SharedWeaponsReload 158 | ShieldFields 159 | ShredderMisc 160 | ShreddersDrillAutoMix 161 | ShreddersIdle 162 | SmallUnitsParent 163 | SpeakDwarf 164 | SpeakDwarfNoDuck 165 | SpeakDwarfParent 166 | SpeakParent 167 | SpecialTerminalEvent 168 | SupplyDropAutoMix 169 | SupplyDropManualMix 170 | TentacleCommunicationTail 171 | TentaclesCommunicationInital 172 | TentaclesImpact 173 | TentaclesManualMix 174 | TentaclesParent 175 | TunnelAmbience 176 | UI 177 | UIControllerSounds 178 | UI_AutoMix 179 | UI_IsolatedFromWorld 180 | UI_largeAutomix 181 | UI_ManualMix 182 | VoiceChat 183 | VolatileGutsExplosions 184 | WeaponCommunication 185 | WeaponRicochet 186 | WeaponsParent 187 | -------------------------------------------------------------------------------- /Asset Generator/Audio Assets/concurrencies.txt: -------------------------------------------------------------------------------- 1 | SoundConcurrency1_Drillvehicle.uasset 2 | SoundConcurrency2_EnemyScream.uasset 3 | SoundConcurrency2_Explosions.uasset 4 | SoundConcurrency3rdEnemies3.uasset 5 | SoundConcurrency3rdEnemiesAttack3.uasset 6 | SoundConcurrency3_EnemyIdle.uasset 7 | SoundConcurrency3_SwarmerIdle.uasset 8 | SoundConcurrencyBarrierTurret2.uasset 9 | SoundConcurrencyDeathMax2StopLowestPriority.uasset 10 | SoundConcurrencyDwarfSteps2.uasset 11 | SoundConcurrencyEnemySteps2.uasset 12 | SoundConcurrencyFauna4.uasset 13 | SoundConcurrencyFesterFlea.uasset 14 | SoundConcurrencyFire4.uasset 15 | SoundConcurrencyGems2.uasset 16 | SoundConcurrencyHydroWeedProjectileImpact.uasset 17 | SoundConcurrencyHydroWeedShooting.uasset 18 | SoundConcurrencyJellyBreeder1.uasset 19 | SoundConcurrencyMax1.uasset 20 | SoundConcurrencyPickAxe3.uasset 21 | SoundConcurrencyRefineryDiscrete.uasset 22 | SoundConcurrencyRicochet1.uasset 23 | SoundConcurrencySeasonEndScreen.uasset 24 | SoundConcurrencySentry1.uasset 25 | SoundConcurrencySpawnSound3.uasset 26 | SoundConcurrencyWeapons6.uasset 27 | SoundConcurrencyWoodlouse.uasset 28 | SoundConcurrency_EnemyDeath.uasset 29 | SoundConcurrency_Global.uasset 30 | SoundConcurrency_Only2AtATimePreventOld.uasset 31 | SoundConcurrency_OnlyOneAtATimePreventNew.uasset 32 | -------------------------------------------------------------------------------- /Asset Generator/Audio Assets/reverbs.txt: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/DRG-Modding/Useful-Scripts/e8339f43cb660b5b419ccf3939515fdc2d660a9f/Asset Generator/Audio Assets/reverbs.txt -------------------------------------------------------------------------------- /Asset Generator/Audio Assets/soundmixes.txt: -------------------------------------------------------------------------------- 1 | DuckOnBeerEffects 2 | DuckOnOperatingMachine 3 | DuckOnPerkActivated 4 | DuckOnPerkIronWillActivated 5 | DuckOnSpecialTerminalEvent 6 | DuckOnWeaponCommunication0-5 7 | DuckOnWeaponCommunication1-0 8 | DuckOnWeaponCommunication2-0 9 | Duck_InMenu_Music_and_AmbientoundMix1 10 | Duck_OtherMusicOnEndScreen_SoundMix 11 | MusicActionOnly_SoundMix 12 | MusicBeerEffectOnly_SoundMix 13 | MusicBossOnly_SoundMix 14 | MusicDiscoveryOnly_SoundMix 15 | MusicEndwaveOnly_SoundMix 16 | MusicJukeBox_SoundMix 17 | MusicMemorialHall_SoundMix1 18 | NoAmbience_SoundMix 19 | PSM_Duck1stPersonFireWeaponAutoMix 20 | PSM_Duck2ndAnd3rdEnemiesAutoMix 21 | PSM_Duck2ndEnemiesIdleAutoMix 22 | PSM_Duck3rdEnemiesIdleAutoMix 23 | PSM_Duck3rdPersonWeaponFireAutoMix 24 | PSM_Duck3rdStepsAutoMix 25 | PSM_DuckArmorHitAutoMix 26 | PSM_DuckEverythingOnDwarfSpeaksAutoMix 27 | PSM_DuckEverythingOnGhostAutoMix 28 | PSM_DuckEverythingOnMissionControlAutoMix 29 | PSM_DuckEverythingOnUISmallAutomix 30 | PSM_DuckEverythingOnUI_LargeAutomix 31 | PSM_DuckFootstepsAutoMix 32 | PSM_DuckHelperWeapons 33 | PSM_DuckOn1stEnemiesDeath 34 | PSM_DuckOn1stEnemyImpactShort 35 | PSM_DuckOn1stEnemyScreamAutoMix 36 | PSM_DuckOn1stPersonSingleFire 37 | PSM_DuckOn1stPersonWeaponFireLoopAutoMix 38 | PSM_DuckOn2dEnemyHitAutoMix 39 | PSM_DuckOn2ndEnemiesDeath1-5 40 | PSM_DuckOn2ndEnemiesDeathAutoMix 41 | PSM_DuckOn2ndEnemiesScreamAutoMixShort 42 | PSM_DuckOn3rdEnemiesCommunicationAutoMix 43 | PSM_DuckOn3rdEnemiesDeath0-1 44 | PSM_DuckOn3rdEnemiesDeathAutoMix 45 | PSM_DuckOnBoscoTalkAutoMix 46 | PSM_DuckOnBulletPassBy 47 | PSM_DuckOnCareTakerBarrierFireAutoMix 48 | PSM_DuckOnCareTakerCommunicationAutoMix 49 | PSM_DuckOnCareTakerCommunicationTimedMix 50 | PSM_DuckOnDown2-0 51 | PSM_DuckOnDownStateBPTiming 52 | PSM_DuckOnDrillVehicleAutoMix 53 | PSM_DuckOnDrillVehicleTalk 54 | PSM_DuckOnDropSpikeFall1-0 55 | PSM_DuckOnEggAlert 56 | PSM_DuckOnEndScreen 57 | PSM_DuckOnEnemyCommunication0-5 58 | PSM_DuckOnEnemyCommunicationFixedTiming 59 | PSM_DuckOnEnemyDeath3-0sec 60 | PSM_DuckOnEnemyProjectileImpact 61 | PSM_DuckOnExplosionClose 62 | PSM_DuckOnExplosionDistant 63 | PSM_DuckOnExplosionGeneralLongTail0-5 64 | PSM_DuckOnExplosionGeneralLongTailBPTiming 65 | PSM_DuckOnExplosionGeneralShortTailBPTiming 66 | PSM_DuckOnExplosionsAutoMix 67 | PSM_DuckOnFriendlyFireProjectileImpactA 68 | PSM_DuckOnFriendlyFireProjectileImpactB 69 | PSM_DuckOnFrozenStateBPTiming 70 | PSM_DuckOnGameEventCommunication 71 | PSM_DuckOnGrabbed 72 | PSM_DuckOnHeightenedSenses 73 | PSM_DuckOnHugeExplosion3-0 74 | PSM_DuckOnHydraWeedCommunication 75 | PSM_DuckOnImpactShort 76 | PSM_DuckOnImportant0-5sec 77 | PSM_DuckOnImportant1-5sec 78 | PSM_DuckOnInfectedMuleAutoMix 79 | PSM_DuckOnInfectedMuleBPTiming 80 | PSM_DuckOnInsideHotspringBPTiming 81 | PSM_DuckOnInsideSeasonTerminal 82 | PSM_DuckOnInsideShieldBPTiming 83 | PSM_DuckOnInsideSlowGrenadeBPTiming 84 | PSM_DuckOnInsideWardrope 85 | PSM_DuckOnMachineActivityAutoMix 86 | PSM_DuckOnMiscProjectileImpactAutoMix 87 | PSM_DuckOnOmmoranAutoMix 88 | PSM_DuckOnOmmoranCommunicationAutoMix 89 | PSM_DuckOnQuakeBPTimingAutoMix 90 | PSM_DuckOnRicochetAutoMix 91 | PSM_DuckOnRockAttack 92 | PSM_DuckOnRockAttackHighPrio 93 | PSM_DuckOnShooting 94 | PSM_DuckOnShredderAutoMix 95 | PSM_DuckOnTentacleCommunication 96 | PSM_DuckOnTentacleImpact 97 | PSM_DuckOnTowerFire1stAutomix 98 | PSM_DuckOnTowerFire2ndAutomix 99 | PSM_DuckOnTunnelAmbience 100 | PSM_DuckOnWeakPoint 101 | PSM_DuckPlayer 102 | PSM_DuckShieldsAutoMix 103 | PSM_FadeInSFXandMusic 104 | PSM_FadeOutMusicAndSFX 105 | PSM_FadeOutPromotionMusic 106 | PSM_ForPromotion_FadeOutSfxAndSpaceRigMusic 107 | PSM_GrabbedByCaveLeech 108 | PSM_MuteSFXandMusic 109 | -------------------------------------------------------------------------------- /Asset Generator/Audio Assets/submixes.txt: -------------------------------------------------------------------------------- 1 | AmbienceSubmix 2 | CharacterNoDuckSubmix 3 | CharacterSubmix 4 | CutSceneSFX 5 | DwarfSpeakSubmix 6 | EnemiesGeneralSubmix 7 | ExplosionsSubmix 8 | GameEventsSubmix 9 | GeneralSpeak_Submix 10 | GeneralWeaponsToolsSubmix 11 | MachinesSubmix 12 | MasterSubmix 13 | MiscSubmix 14 | MusicSubmix 15 | PerksSubmix 16 | RobotSubmix 17 | SFXSubmix 18 | UI_Submix 19 | -------------------------------------------------------------------------------- /Asset Generator/BP_names_and_locations.py: -------------------------------------------------------------------------------- 1 | import json 2 | import os 3 | 4 | USER_PATH = r'C:/Users/../OneDrive/Documents/DRG Modding/DRGPacker/FSD-WindowsNoEditor/FSD/' # Replace with your path to unpacked files 5 | PATH = USER_PATH + r'Content' 6 | OUTPUT_PATH = r'C:/Users/../OneDrive/Documents/Github Projects/Useful-Scripts/Asset Generator/' # Replace with your path to where you want the output file to be saved 7 | 8 | def check_starts_with(string): 9 | WHITELIST_START = ['ABP_', 'Announcement_', 'Basic_', 'HUD_', 'ITEM_', 'LCD_', 'Lore_', 'MENU_', 'Options_', 'Popup_', 'TOOLTIP_', 'UI_', 'WeaponDisplay_', 'Widget_', 'WND_', 'BP_', 'ENE_', 'BPL_', 'OBJ_', 'LIB_', 'PRJ_', 'WPN_', 'ENUM_', 'SK_'] 10 | WHITELIST_START_CURRENT = ['BP_', 'ENE_', 'BPL_', 'OBJ_', 'LIB_', 'PRJ_', 'WPN_'] 11 | for start in WHITELIST_START_CURRENT: 12 | if string.startswith(start): return True 13 | return False 14 | 15 | def output(): 16 | output = [] 17 | for _path, _, files in os.walk(PATH): 18 | for asset_file in files: 19 | if asset_file.endswith('.uasset'): 20 | if check_starts_with(asset_file): 21 | RELATIVE_PATH = _path.replace(USER_PATH, '') 22 | output.append({ 23 | 'type': asset_file.split('_')[0], 24 | 'name' : asset_file.split('.')[0], 25 | 'path' : os.path.join(RELATIVE_PATH, asset_file).replace('\\', '/').split('_')[0].replace(asset_file.split('_')[0], '').replace('Content/', 'Game/').replace('//', '/') 26 | }) 27 | with open(OUTPUT_PATH + 'BP_names_and_locations.json', 'w+') as file: 28 | json.dump(output, file, indent=2) 29 | 30 | output() -------------------------------------------------------------------------------- /Asset Generator/JSON.zip: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/DRG-Modding/Useful-Scripts/e8339f43cb660b5b419ccf3939515fdc2d660a9f/Asset Generator/JSON.zip -------------------------------------------------------------------------------- /Asset Generator/README.md: -------------------------------------------------------------------------------- 1 | The main use of these scripts is for me (Buckminsterfullerene) to load into my BP Asset Generator tool. 2 | - BP_names_and_locations - This script stores the type, name and relative path of all BP assets into the JSON file. 3 | - gen_BP_object_info - This script generates the name, inheritance, property and functions information from all the BP files from the Guttir C++ header dumper, into the JSON file. 4 | 5 | Use BP_object_info_ue4ss.json to see *exactly* how to dummy your assets in your project. This will act as a solid stopgap until I finish my plugin that automatically generates all dummy BP assets with their events, functions, properties and delegates. The reason there is a UE4SS version, is that the script I have uses the C++ header dumps from the Guttir dumper I modified, which does not force load every asset into memory, meaning that it misses over **50%** of the assets. UE4SS does not miss any, however. -------------------------------------------------------------------------------- /Asset Generator/Unused ABPs.txt: -------------------------------------------------------------------------------- 1 | '/Character/Vanity2/Armor/ABP_Armor_Driller_DLC07_BioHazard.uasset', 2 | '/Character/Vanity2/Armor/ABP_Armor_Engineer_DLC07_BioHazard.uasset', 3 | '/Character/Vanity2/Armor/ABP_Armor_Gunner_DLC07_BioHazard.uasset', 4 | '/Character/Vanity2/Armor/ABP_Armor_Scout_DLC07_BioHazard.uasset', 5 | '/Character/Vanity2/Headwear/ABP_Vanity_Headwear_Lunar_Rabbit_Skeleton.uasset', 6 | '/Character/Vanity2/Headwear/ABP_Vanity_Headwear_Rig_BrokenVisor.uasset', 7 | '/Character/Vanity2/Headwear/ABP_Vanity_Headwear_Xmas2022_Elf.uasset', 8 | '/Character/Vanity2/Headwear/ABP_Vanity_Headwear_Xmas2022_Reindeer.uasset', 9 | '/Critters/Maggot/ASI_Maggot.uasset', 10 | '/Critters/Maggot/ASS_MAggot.uasset', 11 | '/Enemies/Plague/PlagueEnemy_Skeletal_Meshes/ABP_PlagueProjectile_Thrower.uasset', 12 | '/Enemies/Plague/PlagueEnemy_Skeletal_Meshes/ABP_PlagueWormPod.uasset', 13 | '/Enemies/Plague/PlagueLarva/ABP_Plague_Larva.uasset', 14 | '/Enemies/Plague/PlagueLarva/ABP_PlagueLarvaShowroom.uasset', 15 | '/Enemies/Spider/Grunt/ABP_Spider_Grunt_Rockpox.uasset', 16 | '/Enemies/Spider/Tank/ShieldTank/ABP_Spider_Tank_Rockpox.uasset', 17 | '/Enemies/StabberVine/SK_StabberVine_Stalk_FlatHierarchy_Skeleton_AnimBlueprint.uasset', 18 | '/GameElements/GameEvents/PlagueMeteor/PlagueHeart_Models/ABP_plagueHeart.uasset', 19 | '/GameElements/GameEvents/PlagueMeteor/RockCrackerModels/ABP_RockCracker.uasset', 20 | '/GameElements/GameEvents/PlagueMeteor/RockCrackerModels/ABP_RockCracker_Drill.uasset', 21 | '/GameElements/Holidays/Xmas/Nisse/ABP_Xmas_CandyCane_Carry_Skeleton_AnimBlueprint.uasset', 22 | '/GameElements/Holidays/Xmas/Nisse/APB_Nisse.uasset', 23 | '/GameElements/Missions/Warnings/Plague/CleaningPod/ABP_CleanupPod.uasset', 24 | '/GameElements/Missions/Warnings/Plague/CleaningPod/Soaper/FoamTool/ABP_FoamTool_A.uasset'] 25 | '/GameElements/Missions/Warnings/Plague/CleaningPod/Vacuum/ABP_Vacuum.uasset', 26 | '/WeaponsNTools/Grenades/FriendlyShredders/ABP_FriendlyParasite.uasset', -------------------------------------------------------------------------------- /Asset Generator/combine.py: -------------------------------------------------------------------------------- 1 | import json 2 | 3 | LOCATIONS_PATH = r'C:/Users/../OneDrive/Documents/Github Projects/Useful-Scripts/Asset Generator/BP_names_and_locations.json' 4 | OBJECT_INFO_PATH = r'C:/Users/../OneDrive/Documents/Github Projects/Useful-Scripts/Asset Generator/BP_object_info_ue4ss.json' 5 | OUTPUT_PATH = r'C:/Users/../OneDrive/Documents/Github Projects/Useful-Scripts/Asset Generator/' # Replace with your path to where you want the output file to be saved 6 | 7 | def output(): 8 | with open(LOCATIONS_PATH, 'r') as file: 9 | locations = json.load(file) 10 | with open(OBJECT_INFO_PATH, 'r') as file: 11 | object_info = json.load(file) 12 | output = [] 13 | 14 | for asset in locations: 15 | for object in object_info: 16 | if asset['name'] == object['bp_class']: 17 | output.append({ 18 | 'type': asset['type'], 19 | 'bp_class' : asset['name'], 20 | 'path' : asset['path'] 21 | }) 22 | for key in object: 23 | if key == 'bp_class': continue 24 | output[-1][key] = object[key] 25 | 26 | with open(OUTPUT_PATH + 'BP_names_and_locations_with_object_info.json', 'w+') as file: 27 | json.dump(output, file, indent=2) 28 | 29 | output() -------------------------------------------------------------------------------- /Asset Generator/copy abp.py: -------------------------------------------------------------------------------- 1 | import json 2 | import os 3 | 4 | abp_files = 'F:\DRG Modding\Project Generator\FSDTemplateU37P8-all\Content' 5 | json_info = 'F:\DRG Modding\DRGPacker\JSON\AssetTypes.json' 6 | out_path = 'F:\DRG Modding\DRGPacker\JSON\ABPs' 7 | 8 | def main(): 9 | with open(json_info) as f: 10 | asset_types = json.load(f) 11 | 12 | abp_list = asset_types['/Script/Engine.AnimBlueprintGeneratedClass'] 13 | unused_list = abp_list.copy() 14 | 15 | for abp in abp_list: 16 | full = abp 17 | abp = abp.split('/')[-1] 18 | for root, _, files in os.walk(abp_files): 19 | for file in files: 20 | if file == abp: 21 | out_file = os.path.join(out_path, os.path.relpath(root, abp_files), file) 22 | os.makedirs(os.path.dirname(out_file), exist_ok=True) 23 | with open(os.path.join(root, file), 'rb') as f: 24 | with open(out_file, 'wb') as f2: 25 | f2.write(f.read()) 26 | print(f'Copied {os.path.join(root, file)} to {out_file}') 27 | unused_list.remove(full) 28 | 29 | print(f'Unused ABPs: {unused_list}') 30 | 31 | if __name__ == '__main__': 32 | main() -------------------------------------------------------------------------------- /Asset Generator/copy animseq shader cache.py: -------------------------------------------------------------------------------- 1 | import json 2 | import os 3 | 4 | as_files = 'C:/Users/Bobby/AppData/Local/UnrealEngine/Common/DerivedDataCache' 5 | out_path = 'F:/DRG Modding/DRGPacker/JSON/Blender/DerivedDataCache' 6 | 7 | def main(): 8 | for root, _, files in os.walk(as_files): 9 | for file in files: 10 | if file.startswith('ANIMSEQ_'): 11 | out_file = os.path.join(out_path, os.path.relpath(root, as_files), file) 12 | os.makedirs(os.path.dirname(out_file), exist_ok=True) 13 | with open(os.path.join(root, file), 'rb') as f: 14 | with open(out_file, 'wb') as f2: 15 | f2.write(f.read()) 16 | print(f'{out_file}') 17 | 18 | if __name__ == '__main__': 19 | main() 20 | -------------------------------------------------------------------------------- /Asset Generator/copy animsseqs.py: -------------------------------------------------------------------------------- 1 | import json 2 | import os 3 | 4 | as_files = 'F:\DRG Modding\DRGPacker\JSON\Blender\Anims' 5 | out_path = 'F:\DRG Modding\DRGPacker\JSON\Blender\AnimSeqs\Game' 6 | 7 | def main(): 8 | # Scan through as_files and copy all files starting with SK_ with the extension .fbx to out_path 9 | # Make sure that directory hierarchy is preserved 10 | for root, _, files in os.walk(as_files): 11 | for file in files: 12 | if not file.startswith('SK_') and file.endswith('.fbx') or "SK_Banner01_Anim.fbx" in file or "SK_Spacerig_CounterweightCrank_Anim.fbx" in file or "SK_Facility_CareTaker_Body_Anim.fbx" in file or "SK_Facility_CareTaker_Eye_Anim.fbx" in file or "SK_HoopsGame_Slide_Anim.fbx" in file: 13 | # Copy file to out_path, making sure that any directories in the path are created 14 | # if they don't already exist 15 | out_file = os.path.join(out_path, os.path.relpath(root, as_files), file) 16 | os.makedirs(os.path.dirname(out_file), exist_ok=True) 17 | with open(os.path.join(root, file), 'rb') as f: 18 | with open(out_file, 'wb') as f2: 19 | f2.write(f.read()) 20 | 21 | if __name__ == '__main__': 22 | main() 23 | -------------------------------------------------------------------------------- /Asset Generator/copy physasset.py: -------------------------------------------------------------------------------- 1 | import json 2 | import os 3 | 4 | phys_files = 'F:\DRG Modding\Project Generator\FSDTemplateU37P8-all\Content' 5 | out_path = 'F:\DRG Modding\DRGPacker\JSON\Temp Physics Assets' 6 | 7 | def main(): 8 | # Scan through phys_files and copy all files starting with SK_ with the extension .fbx to out_path 9 | # Make sure that directory hierarchy is preserved 10 | for root, _, files in os.walk(phys_files): 11 | for file in files: 12 | if file.endswith('_PhysicsAsset.uasset'): 13 | # Copy file to out_path, making sure that any directories in the path are created 14 | # if they don't already exist 15 | out_file = os.path.join(out_path, os.path.relpath(root, phys_files), file) 16 | os.makedirs(os.path.dirname(out_file), exist_ok=True) 17 | with open(os.path.join(root, file), 'rb') as f: 18 | with open(out_file, 'wb') as f2: 19 | f2.write(f.read()) 20 | 21 | if __name__ == '__main__': 22 | main() -------------------------------------------------------------------------------- /Asset Generator/copy skm.py: -------------------------------------------------------------------------------- 1 | import json 2 | import os 3 | 4 | skm_files = 'F:\DRG Modding\DRGPacker\JSON\Blender\Anims' 5 | out_path = 'F:\DRG Modding\DRGPacker\JSON\Assets\Game' 6 | 7 | def main(): 8 | # Scan through skm_files and copy all files starting with SK_ with the extension .fbx to out_path 9 | # Make sure that directory hierarchy is preserved 10 | for root, _, files in os.walk(skm_files): 11 | for file in files: 12 | if file.startswith('SK_') and file.endswith('.fbx'): 13 | # Copy file to out_path, making sure that any directories in the path are created 14 | # if they don't already exist 15 | out_file = os.path.join(out_path, os.path.relpath(root, skm_files), file) 16 | os.makedirs(os.path.dirname(out_file), exist_ok=True) 17 | with open(os.path.join(root, file), 'rb') as f: 18 | with open(out_file, 'wb') as f2: 19 | f2.write(f.read()) 20 | 21 | if __name__ == '__main__': 22 | main() -------------------------------------------------------------------------------- /Asset Generator/copy sm.py: -------------------------------------------------------------------------------- 1 | import json 2 | import os 3 | 4 | sm_files = 'F:\DRG Modding\Project Generator\FSDTemplateU37P8-all\Content' 5 | json_info = 'F:\DRG Modding\DRGPacker\JSON\AssetTypes.json' 6 | out_path = 'F:\DRG Modding\Project Generator\FSDTemplateU37P8-all\Content' 7 | 8 | def main(): 9 | with open(json_info) as f: 10 | asset_types = json.load(f) 11 | 12 | sm_list = asset_types['/Script/Engine.StaticMesh'] 13 | 14 | for sm in sm_list: 15 | sm = sm.split('/')[-1] 16 | for root, _, files in os.walk(sm_files): 17 | for file in files: 18 | if file == sm: 19 | out_file = os.path.join(out_path, os.path.relpath(root, sm_files), file) 20 | os.makedirs(os.path.dirname(out_file), exist_ok=True) 21 | with open(os.path.join(root, file), 'rb') as f: 22 | with open(out_file, 'wb') as f2: 23 | f2.write(f.read()) 24 | print(f'Copied {os.path.join(root, file)} to {out_file}') 25 | 26 | if __name__ == '__main__': 27 | main() -------------------------------------------------------------------------------- /Asset Generator/delete unused physasset.py: -------------------------------------------------------------------------------- 1 | import json 2 | import os 3 | 4 | phys_files = 'F:\DRG Modding\Project Generator\FSDTemplateU37P8-all\Content' 5 | json_info = 'F:\DRG Modding\DRGPacker\JSON\AssetTypes.json' 6 | 7 | def main(): 8 | with open(json_info) as f: 9 | asset_types = json.load(f) 10 | 11 | assets = [] 12 | for type in asset_types: 13 | for asset in asset_types[type]: 14 | asset = asset.split('/')[-1] 15 | assets.append(asset) 16 | 17 | for root, _, files in os.walk(phys_files): 18 | for file in files: 19 | if file not in assets: 20 | if file.startswith('SK_'): 21 | phys_path = os.path.join(root, file) 22 | os.remove(phys_path) 23 | print(f'Removed {phys_path}') 24 | 25 | if __name__ == '__main__': 26 | main() -------------------------------------------------------------------------------- /Asset Generator/delete_build_files.py: -------------------------------------------------------------------------------- 1 | import os 2 | 3 | FILE_PATH = "F:\DRG Modding\Project Generator\FSDTemplateU36P4" 4 | 5 | for root, dirs, files in os.walk(FILE_PATH): 6 | for name in dirs: 7 | if name == "Binaries" or name == "Intermediate": 8 | os.remove(os.path.join(root, name)) 9 | # Delete all files in directory 10 | for file in os.listdir(os.path.join(root, name)): 11 | os.remove(os.path.join(root, name, file)) 12 | print("Deleted: " + os.path.join(root, name)) 13 | else: 14 | print("Skipped: " + os.path.join(root, name)) -------------------------------------------------------------------------------- /Asset Generator/gen_BP_object_info.py: -------------------------------------------------------------------------------- 1 | import json 2 | import os 3 | import re 4 | 5 | PATH = r'C:/Users/../OneDrive/Documents/Github Projects/Header-Dumps/U35.63118/DUMP/' # Replace with your path to dumped files 6 | OUTPUT_PATH = r'C:/Users/../OneDrive/Documents/Github Projects/Useful-Scripts/Asset Generator/' # Replace with your path to where you want the output file to be saved 7 | 8 | def check_startswith(string): 9 | WHITELIST_START = ['BP_', 'ENE_', 'BPL_', 'OBJ_', 'LIB_', 'PRJ_', 'WPN_'] 10 | for start in WHITELIST_START: 11 | if string.startswith(start): return True 12 | return False 13 | 14 | def check_contains(string, type): 15 | BLACKLIST_PROPERTIES = ['ubergraph', 'onloaded_', 'defaultsceneroot'] 16 | BLACKLIST_FUNCTIONS = ['ubergraph', 'onloaded_', 'receivebeginplay', 'receivedestroyed', 'receivetick', 'userconstructionscript', 'ontick_'] 17 | if type == 'property': 18 | for property in BLACKLIST_PROPERTIES: 19 | if property in string.lower(): return True 20 | return False 21 | elif type == 'function': 22 | for function in BLACKLIST_FUNCTIONS: 23 | if function in string.lower(): return True 24 | return False 25 | 26 | def match_variables(line, properties, type): 27 | match = re.search(type + r'\s(.*);\s\/\/(.*)+', line) 28 | if match: 29 | # If variable is an uber, ignore 30 | name = match.group(1) 31 | if not check_contains(name, 'property'): 32 | # If type is 'enum' then it is an enum class type 33 | if 'enum' in type: 34 | names = name.split(' ') 35 | name = names[-1] 36 | type = type + ' ' + ' '.join(names[:-1]) 37 | type = type.replace('*', '') 38 | properties.append({ 39 | 'name': name, 40 | 'type': type 41 | }) 42 | pass 43 | return properties 44 | 45 | def match_functions(line, functions, type): 46 | match = re.search(type + r'\s(\w+)\((.*)\);', line) 47 | if match: 48 | # If function is a recieve, bind or ubergraph, ignore 49 | name = match.group(1) 50 | if not check_contains(name, 'function'): 51 | # Add the args of the function 52 | args = match.group(2).split(', ') 53 | if args is not None: 54 | function_properties = [] 55 | for arg in args: 56 | arg = arg.strip() 57 | try: 58 | if 'enum' in arg: # We do a little cheeky hardcoding 59 | # Type is all the elements except the last one 60 | arg_type = ' '.join(arg.split(' ')[:-1]) 61 | arg_name = arg.split(' ')[-1] 62 | else: 63 | # Name is all the elements except the first one 64 | arg_type = arg.split(' ')[0] 65 | arg_name = ' '.join(arg.split(' ')[1:]) 66 | except IndexError: 67 | arg_type, arg_name = arg, '' 68 | if arg != '': 69 | arg_type = arg_type.replace('*', '') 70 | function_properties.append({ 71 | 'name': arg_name, 72 | 'type': arg_type 73 | }) 74 | type = type.replace('*', '') 75 | functions.append({ 76 | 'name': name, 77 | 'type': type, 78 | 'args': function_properties 79 | }) 80 | return functions 81 | 82 | def output(): 83 | output = [] 84 | for asset_file in os.listdir(PATH): 85 | if asset_file.endswith('.h'): 86 | if check_startswith(asset_file): 87 | # Open asset file 88 | with open(PATH + asset_file) as f: 89 | data = f.read() 90 | lines = data.split('\n') 91 | 92 | name = asset_file.split('_classes.h')[0] 93 | inherits = lines[2].split(' : ')[1].strip(' {')[1:] 94 | properties = [] 95 | functions = [] 96 | 97 | # Remove the first 3 elements of lines 98 | lines = lines[3:] 99 | for line in lines: 100 | if line == '' or line == '};': continue 101 | line = line.replace('\t', '') 102 | type = line.split(' ')[0] 103 | type = type.replace('*', '') 104 | 105 | # Match variables 106 | properties = match_variables(line, properties, type) 107 | 108 | # Match functions 109 | functions = match_functions(line, functions, type) 110 | output.append({ 111 | 'bp_name': name, 112 | 'inherits': inherits, 113 | 'functions': functions, 114 | 'properties': properties 115 | }) 116 | 117 | with open(OUTPUT_PATH + 'BP_object_info.json', 'w+') as file: 118 | json.dump(output, file, indent=2) 119 | 120 | output() -------------------------------------------------------------------------------- /Asset Generator/get_audio_assets.py: -------------------------------------------------------------------------------- 1 | import os 2 | 3 | # Replace with your path to unpacked files 4 | USER_PATH = r'F:/DRG Modding/DRGPacker/_unpacked/FSD/' 5 | # Change this to whatever specific folder directory you want to start at 6 | PATH = USER_PATH + r'Content/Audio/SoundControl' 7 | # Replace with your path to where you want the output file to be saved 8 | OUTPUT_PATH = r'F:/Github Projects/Other/DRG Modding Org/Useful-Scripts/Asset Generator/Audio Assets/' 9 | 10 | def output(): 11 | music_libraries = [] 12 | concurrencies = [] 13 | attenuations = [] 14 | reverbs = [] 15 | classes = [] 16 | soundmixes = [] 17 | submixes = [] 18 | for _path, _, files in os.walk(PATH): 19 | for asset_file in files: 20 | if asset_file.endswith('.uasset'): 21 | print(asset_file) 22 | if asset_file.startswith('ML_'): 23 | music_libraries.append(asset_file.split('.')[0]) 24 | if asset_file.startswith('SoundConcurrency'): 25 | concurrencies.append(asset_file.split('.')[0]) 26 | if _path.endswith('\\AttenuationGroups'): 27 | attenuations.append(asset_file.split('\\')[-1].split('.')[0]) 28 | if _path.endswith('\\ReverbPresets'): 29 | reverbs.append(asset_file.split('\\')[-1].split('.')[0]) 30 | if _path.endswith('\\SoundClasses'): 31 | classes.append(asset_file.split('\\')[-1].split('.')[0]) 32 | if _path.endswith('\\SoundMixes'): 33 | soundmixes.append(asset_file.split('\\')[-1].split('.')[0]) 34 | if _path.endswith('\\SubMixes'): 35 | submixes.append(asset_file.split('\\')[-1].split('.')[0]) 36 | 37 | with open(OUTPUT_PATH + 'audio_assets.txt', 'w+') as file: 38 | for ml in music_libraries: 39 | file.write(ml + '\n') 40 | file.write('\n') 41 | # with open(OUTPUT_PATH + 'concurrencies.txt', 'w+') as file: 42 | for concurrency in concurrencies: 43 | file.write(concurrency + '\n') 44 | # with open(OUTPUT_PATH + 'attenuations.txt', 'w+') as file: 45 | file.write('\n') 46 | for attenuation in attenuations: 47 | file.write(attenuation + '\n') 48 | # with open(OUTPUT_PATH + 'reverbs.txt', 'w+') as file: 49 | file.write('\n') 50 | for reverb in reverbs: 51 | file.write(reverb + '\n') 52 | # with open(OUTPUT_PATH + 'classes.txt', 'w+') as file: 53 | file.write('\n') 54 | for soundclass in classes: 55 | file.write(soundclass + '\n') 56 | # with open(OUTPUT_PATH + 'soundmixes.txt', 'w+') as file: 57 | file.write('\n') 58 | for soundmix in soundmixes: 59 | file.write(soundmix + '\n') 60 | # with open(OUTPUT_PATH + 'submixes.txt', 'w+') as file: 61 | file.write('\n') 62 | for submix in submixes: 63 | file.write(submix + '\n') 64 | 65 | output() -------------------------------------------------------------------------------- /Asset Generator/import abp.py: -------------------------------------------------------------------------------- 1 | import json 2 | import os 3 | 4 | abp_files = 'F:\DRG Modding\DRGPacker\JSON\ABP' 5 | json_info = 'F:\DRG Modding\DRGPacker\JSON\AssetTypes.json' 6 | out_path = 'F:\DRG Modding\Project Generator\FSDTemplateU36P6-new\Content' 7 | 8 | def main(): 9 | # open assetTypes json to get the list of abp files 10 | with open(json_info) as f: 11 | asset_types = json.load(f) 12 | 13 | # get the list of abp files 14 | abp_list = asset_types['/Script/Engine.AnimBlueprintGeneratedClass'] 15 | 16 | # loop through the abp files in abp_files and check if they are in the abp_list json 17 | for abp in abp_list: 18 | for file in os.listdir(abp_files): 19 | if file in abp: 20 | # get the filepath of the abp file 21 | abp_path = os.path.join(abp_files, file) 22 | # get the output path of the abp file 23 | out_abp_path = out_path + abp 24 | # copy the abp file to the output path 25 | os.system(f'copy "{abp_path}" "{out_abp_path}"') 26 | print(f'Copied {abp_path} to {out_abp_path}') 27 | 28 | if __name__ == '__main__': 29 | main() -------------------------------------------------------------------------------- /Asset Generator/import aic.py: -------------------------------------------------------------------------------- 1 | import json 2 | import os 3 | 4 | aic_files = 'F:\DRG Modding\DRGPacker\JSON\Import assets\AIC' 5 | json_info = 'F:\DRG Modding\DRGPacker\JSON\AssetTypes.json' 6 | out_path = 'F:\DRG Modding\Project Generator\FSDTemplateU36P7-all\Content' 7 | 8 | def main(): 9 | # open assetTypes json to get the list of aic files 10 | with open(json_info) as f: 11 | asset_types = json.load(f) 12 | 13 | # get the list of aic files 14 | aic_list = asset_types['/Script/Engine.BlueprintGeneratedClass'] 15 | 16 | # loop through the aic files in aic_files and check if they are in the aic_list json 17 | for aic in aic_list: 18 | for file in os.listdir(aic_files): 19 | if file in aic: 20 | # get the filepath of the aic file 21 | aic_path = os.path.join(aic_files, file) 22 | # get the output path of the aic file 23 | out_aic_path = out_path + aic 24 | # copy the aic file to the output path 25 | os.system(f'copy "{aic_path}" "{out_aic_path}"') 26 | print(f'Copied {aic_path} to {out_aic_path}') 27 | 28 | if __name__ == '__main__': 29 | main() -------------------------------------------------------------------------------- /Asset Generator/import esi.py: -------------------------------------------------------------------------------- 1 | import json 2 | import os 3 | 4 | esi_files = 'F:\DRG Modding\DRGPacker\JSON\Import assets\ESI' 5 | json_info = 'F:\DRG Modding\DRGPacker\JSON\AssetTypes.json' 6 | out_path = 'F:\DRG Modding\Project Generator\FSDTemplateU36P7-all\Content' 7 | 8 | def main(): 9 | # open assetTypes json to get the list of esi files 10 | with open(json_info) as f: 11 | asset_types = json.load(f) 12 | 13 | # get the list of esi files 14 | esi_list = asset_types['/Script/Engine.BlueprintGeneratedClass'] 15 | 16 | # loop through the esi files in esi_files and check if they are in the esi_list json 17 | for esi in esi_list: 18 | for file in os.listdir(esi_files): 19 | if file in esi: 20 | # get the filepath of the esi file 21 | esi_path = os.path.join(esi_files, file) 22 | # get the output path of the esi file 23 | out_esi_path = out_path + esi 24 | # copy the esi file to the output path 25 | os.system(f'copy "{esi_path}" "{out_esi_path}"') 26 | print(f'Copied {esi_path} to {out_esi_path}') 27 | 28 | if __name__ == '__main__': 29 | main() -------------------------------------------------------------------------------- /Asset Generator/import id.py: -------------------------------------------------------------------------------- 1 | import json 2 | import os 3 | 4 | id_files = 'F:\DRG Modding\DRGPacker\JSON\Import assets\ID' 5 | json_info = 'F:\DRG Modding\DRGPacker\JSON\AssetTypes.json' 6 | out_path = 'F:\DRG Modding\Project Generator\FSDTemplateU36P7-all\Content' 7 | 8 | def main(): 9 | # open assetTypes json to get the list of id files 10 | with open(json_info) as f: 11 | asset_types = json.load(f) 12 | 13 | # get the list of id files 14 | id_list = asset_types['/Script/FSD.ItemID'] 15 | 16 | # loop through the id files in id_files and check if they are in the id_list json 17 | for id in id_list: 18 | for file in os.listdir(id_files): 19 | if file in id: 20 | # get the filepath of the id file 21 | id_path = os.path.join(id_files, file) 22 | # get the output path of the id file 23 | out_id_path = out_path + id 24 | # copy the id file to the output path 25 | os.system(f'copy "{id_path}" "{out_id_path}"') 26 | print(f'Copied {id_path} to {out_id_path}') 27 | 28 | if __name__ == '__main__': 29 | main() -------------------------------------------------------------------------------- /Asset Generator/import old.py: -------------------------------------------------------------------------------- 1 | import json 2 | import os 3 | 4 | json_info = 'F:\DRG Modding\DRGPacker\JSON\AssetTypes.json' 5 | in_path = 'F:\DRG Modding\Project Generator\FSDTemplateU36P6-new\Content' 6 | out_path = 'F:\DRG Modding\Project Generator\FSDTemplateU36P7-all\Content' 7 | 8 | def main(): 9 | # open assetTypes json to get the list of id files 10 | with open(json_info) as f: 11 | asset_types = json.load(f) 12 | 13 | # get the list of id files 14 | id_list = asset_types['/Script/FSD.ItemID'] 15 | 16 | # loop through the id files in id_files and check if they are in the id_list json 17 | for id in id_list: 18 | for root, _, files in os.walk(in_path): 19 | for file in files: 20 | actual = root.replace(in_path, '').replace('\\', '/') + '/' + file 21 | if 'Audio' in actual: continue 22 | if actual == id: 23 | # get the output path of the id file 24 | out_id_path = out_path + id 25 | # copy the id file to the output path 26 | os.system(f'copy "{root}" "{out_id_path}"') 27 | print(f'Copied {root} to {out_id_path}') 28 | 29 | if __name__ == '__main__': 30 | main() -------------------------------------------------------------------------------- /Asset Generator/import_cooked_assets.py: -------------------------------------------------------------------------------- 1 | import os 2 | from shutil import copyfile 3 | import json 4 | 5 | INPUT_PATH = r'Asset Generator\AssetTypes.json' # Path of asset locations JSON 6 | COOKED_PATH = r'F:/DRG Modding/DRGPacker/_unpacked/FSD/Content' # Path of unpacked files 7 | OUTPUT_PATH = r'F:/DRG Modding/UE4GameProjectGenerator/FSDTemplateU36/Content' # Path of project Content folder 8 | 9 | def is_type(asset_type): 10 | if asset_type == '/Script/Engine.StaticMesh': return True 11 | elif '/Script/Engine.Anim' in asset_type and not 'Blueprint' in asset_type: return True 12 | elif asset_type == '/Script/Engine.ParticleSystem': return True 13 | elif '/Script/Niagara.Niagara' in asset_type: return True 14 | elif asset_type == '/Script/Engine.SoundClass': return True 15 | elif asset_type == '/Script/Engine.SoundMix': return True 16 | elif '/Script/Engine.Submix' in asset_type: return True 17 | elif asset_type == '/Script/Engine.SoundAttenuation': return True 18 | elif asset_type == '/Script/Engine.SoundConcurrency': return True 19 | elif asset_type == '/Script/Engine.ReverbEffect': return True 20 | else: return False 21 | 22 | def main(): 23 | with open(INPUT_PATH, 'r') as file: 24 | locations = json.load(file) 25 | for asset_type in locations: 26 | if is_type(asset_type): 27 | for asset_path in locations[asset_type]: 28 | input_path = COOKED_PATH + asset_path 29 | bulk_input_path = input_path[:input_path.rfind('.')] + '.ubulk' 30 | output_path = OUTPUT_PATH + asset_path 31 | uexp_output_path = output_path[:output_path.rfind('.')] + '.uexp' 32 | bulk_output_path = output_path[:output_path.rfind('.')] + '.ubulk' 33 | 34 | if os.path.exists(input_path): 35 | if not os.path.exists(os.path.dirname(output_path)): 36 | os.makedirs(os.path.dirname(output_path)) 37 | copyfile(input_path, output_path) 38 | copyfile(input_path, uexp_output_path) 39 | if os.path.exists(bulk_input_path): copyfile(input_path, bulk_output_path) 40 | else: 41 | print(f'{input_path} does not exist') 42 | 43 | if __name__ == '__main__': 44 | main() -------------------------------------------------------------------------------- /Auto-rename Jukebox Songs/README.txt: -------------------------------------------------------------------------------- 1 | To use, just change your reference filepath and your destination filepath in the variables at the top. -------------------------------------------------------------------------------- /Auto-rename Jukebox Songs/rename_jukebox_music.py: -------------------------------------------------------------------------------- 1 | import os 2 | 3 | REF_FILEPATH = r'F:\DRG Modding\DRGPacker\unpacked\FSD\Content\Audio\Music\JukeBox' 4 | DEST_FILEPATH = r'F:\DRG Modding\MODS\Coffee Stain Games Jukebox Music Pak\Content - Copy\Audio\Music\JukeBox' 5 | 6 | def rename_jukebox_music(dest_dir, ref_dir): 7 | for root, _, files in os.walk(dest_dir): 8 | relpath = os.path.relpath(root, dest_dir) 9 | from_root = os.path.join(ref_dir, relpath) 10 | FROM_SUFFIX = '.uasset' 11 | from_files = [f[:-len(FROM_SUFFIX)] for f in os.listdir(from_root) if f.endswith(FROM_SUFFIX)] 12 | num_to_rename = len(files) 13 | num_to_choose_from = len(from_files) 14 | if num_to_choose_from < num_to_rename: 15 | print('More files in input {} ({}) than there are names to choose from {}'.format(relpath, num_to_rename, num_to_choose_from)) 16 | num_to_rename = num_to_choose_from 17 | else: 18 | print('Renaming {} files in {}, choosing from {} possible names'.format(num_to_rename, relpath, num_to_choose_from)) 19 | 20 | for i, fromfile in enumerate(files): 21 | if i >= num_to_rename: 22 | break 23 | _, extension = os.path.splitext(fromfile) 24 | newname = from_files[i] 25 | if len(extension) > 0: 26 | newname = newname + '.' + extension 27 | os.rename(os.path.join(root, fromfile), os.path.join(root, newname)) 28 | 29 | if __name__ == '__main__': 30 | rename_jukebox_music(DEST_FILEPATH, REF_FILEPATH) -------------------------------------------------------------------------------- /DRGModdingAutomationScriptsLinux/.env: -------------------------------------------------------------------------------- 1 | #!/bin/bash 2 | 3 | # /!\ All the paths should be absolute 4 | 5 | ################################################# 6 | # PROJECT 7 | ################################################# 8 | 9 | # ----------------------------------------------- 10 | 11 | # Path to your UE4 installation 12 | # /!\ REQUIRED /!\ 13 | UE4_PATH="" 14 | 15 | # ----------------------------------------------- 16 | 17 | # Path to the Deep Rock Galactic steam folder 18 | # /!\ REQUIRED /!\ 19 | DRG_PATH="" 20 | 21 | # ----------------------------------------------- 22 | 23 | # Path to your mod project (the one containing the uproject file) 24 | # Defaults to the folder 'FSD' in the current directory 25 | #PROJECT_PATH="" 26 | 27 | # ----------------------------------------------- 28 | 29 | # The name to use for the pak and zip 30 | # Defaults to the parent folder 31 | #MOD_NAME="" 32 | 33 | # ----------------------------------------------- 34 | 35 | ################################################# 36 | # WINE 37 | ################################################# 38 | 39 | # ----------------------------------------------- 40 | 41 | # Go to Lutris -> right click Epic Games Store then Configure 42 | # Go to the "Game options" tab and copy the content of the 43 | # "Wine prefix" field 44 | # This is important as it will allow wine to be in the same environnement as UE4 45 | # Defaults to your default wine prefix 46 | #export WINEPREFIX="" 47 | 48 | # ----------------------------------------------- 49 | 50 | # Got to lutris, click on Epic Games Store 51 | # in the bottom click the Wine icon then "Open Bash terminal" 52 | # type 'echo $WINE' and paste the result here 53 | # This is important as it will allow to use the same wine version as the one used to run UE4 54 | # Defaults to wine 55 | #WINE="" 56 | 57 | # ----------------------------------------------- 58 | 59 | ################################################# 60 | # DO NOT EDIT AFTER THIS 61 | ################################################# 62 | 63 | 64 | # DEFAULT VALUES 65 | 66 | if [ -z ${WINE+x} ]; then 67 | WINE="wine" 68 | fi 69 | 70 | if [ -z ${PROJECT_PATH+x} ]; then 71 | PROJECT_PATH="$(pwd)/FSD" 72 | fi 73 | 74 | if [ -z ${MOD_NAME+x} ]; then 75 | MOD_NAME="${PWD##/*/}" 76 | fi 77 | 78 | 79 | # ADDITIONAL VARIABLES 80 | 81 | # Unreal project file 82 | PROJECT_FILE="$PROJECT_PATH/FSD.uproject" 83 | # Disable Wine warnings to have clearer console output 84 | export WINEDEBUG=-all 85 | 86 | -------------------------------------------------------------------------------- /DRGModdingAutomationScriptsLinux/README.md: -------------------------------------------------------------------------------- 1 | # DRG modding automation scripts - Linux 2 | 3 | This repo contains various bash scripts to help you automate your projects, including packaging, zipping, cooking, and all those fun things. 4 | 5 | Those scripts were inspired by the [bat scripts](https://github.com/DRG-Modding/Useful-Scripts/tree/main/DRGModdingAutomationScripts) by Samamstar but do not work exactly the same, so be sure to read this documentation first! 6 | 7 | ## Installation/usage 8 | 9 | In order to use this I recommend downloading the repo and placing it on folder above your .uproject. By default the scripts use the parent folder name as the mod name, and expects your .uproject parent folder to be named `FSD`. 10 | 11 | Imagine the following structure: 12 | 13 | - My Mod 14 | - FSD 15 | - FSD.uproject 16 | 17 | By placing the scripts under the `My Mod` folder, the project will be automatically detected and the scripts will use `My Mod` as the mod name. 18 | 19 | The most useful scripts are: 20 | 21 | - `quick_test_mod.sh` 22 | - Automatically runs all steps required to test mod locally, by cooking the project, packing it, copying it into the local mods folder, and automatically launching DRG through Steam. Use the `-h` option to see how to skip a specific step. 23 | - `prep_mod_for_release.sh` 24 | - Automatically runs all steps required to upload to mod.io, including cooking the project, packing it and zipping up the pak. Use the `-h` option to see how to skip a specific step. 25 | - `setup_cpp_project.sh` 26 | - If UE4 gives an error when trying to open a project with C++ headers, try using this script. 27 | 28 | ## Configuration 29 | 30 | All the configuration is done through environnement variables in the `.env`. Open it and read the comments for each variable to understand how to fill the right values. 31 | 32 | Some values are required, but some can be guessed from the folder in which the scripts are executed as explained in the `Installation/usage` section. 33 | -------------------------------------------------------------------------------- /DRGModdingAutomationScriptsLinux/prep_mod_for_release.sh: -------------------------------------------------------------------------------- 1 | #!/bin/bash 2 | 3 | . ./.env 4 | 5 | DO_COOK=1 6 | DO_PACK=1 7 | 8 | Help() 9 | { 10 | echo "Prepares the mod for release." 11 | echo "Cooks and packs the mod, then creates a zip to be uploaded to mod.io." 12 | echo 13 | echo "Syntax: $0 [-h|c|p]" 14 | echo "options:" 15 | echo "h Shows this help." 16 | echo "c Disable cooking." 17 | echo "p Disable packing." 18 | echo 19 | } 20 | 21 | 22 | while getopts ":hcp" option; do 23 | case $option in 24 | h) # display Help 25 | Help 26 | exit;; 27 | c) # Disable cooking 28 | echo "Skipping cook phase" 29 | DO_COOK=0;; 30 | p) # Disable packing 31 | echo "Skipping pack phase" 32 | DO_PACK=0;; 33 | \?) # Invalid option 34 | echo "Error: Invalid option $option" 35 | echo 36 | Help 37 | exit;; 38 | esac 39 | done 40 | 41 | echo -e "\n-> Preparing mod for release\n" 42 | 43 | if [ $DO_COOK -ne 0 ]; then 44 | ./util/cook_project.sh 45 | COOK_ERROR=$? 46 | if [ $COOK_ERROR -ne 0 ]; then 47 | exit $COOK_ERROR 48 | fi 49 | fi 50 | if [ $DO_PACK -ne 0 ]; then 51 | ./util/pack_project.sh 52 | PACK_ERROR=$? 53 | if [ $PACK_ERROR -ne 0 ]; then 54 | exit $PACK_ERROR 55 | fi 56 | fi 57 | 58 | read -e -p "Please enter a suffix for this release: " RELEASE_SUFFIX 59 | 60 | echo "Zipping the mod" 61 | zip $MOD_NAME$RELEASE_SUFFIX.zip $MOD_NAME.pak 62 | 63 | echo -e "\n== Mod preparation done ==\n" 64 | 65 | -------------------------------------------------------------------------------- /DRGModdingAutomationScriptsLinux/quick_test_mod.sh: -------------------------------------------------------------------------------- 1 | #!/bin/bash 2 | 3 | . ./.env 4 | 5 | 6 | DO_COOK=1 7 | DO_PACK=1 8 | DO_GAME=1 9 | 10 | Help() 11 | { 12 | echo "Cooks and packs the mod, then installs it in DRG." 13 | echo 14 | echo "Syntax: $0 [-h|c|p|g]" 15 | echo "options:" 16 | echo "h Shows this help." 17 | echo "c Disable cooking." 18 | echo "p Disable packing." 19 | echo "g Disable starting the game." 20 | echo 21 | } 22 | 23 | 24 | while getopts ":hcpg" option; do 25 | case $option in 26 | h) # display Help 27 | Help 28 | exit;; 29 | c) # Disable cooking 30 | echo "Skipping cook phase" 31 | DO_COOK=0;; 32 | p) # Disable packing 33 | echo "Skipping pack phase" 34 | DO_PACK=0;; 35 | g) # Disable starting the game 36 | echo "Skipping game launching phase" 37 | DO_GAME=0;; 38 | \?) # Invalid option 39 | echo "Error: Invalid option $option" 40 | echo 41 | Help 42 | exit;; 43 | esac 44 | done 45 | 46 | echo -e "\n-> Installing mod for testing\n" 47 | 48 | if [ $DO_COOK -ne 0 ]; then 49 | ./util/cook_project.sh 50 | COOK_ERROR=$? 51 | if [ $COOK_ERROR -ne 0 ]; then 52 | exit $COOK_ERROR 53 | fi 54 | fi 55 | if [ $DO_PACK -ne 0 ]; then 56 | ./util/pack_project.sh 57 | PACK_ERROR=$? 58 | if [ $PACK_ERROR -ne 0 ]; then 59 | exit $PACK_ERROR 60 | fi 61 | fi 62 | 63 | MOD_INSTALL_DIR="$DRG_PATH/FSD/Mods/$MOD_NAME" 64 | 65 | echo "Installing the mod" 66 | # Clean the folder to make sure only the mod is there 67 | rm -r "$MOD_INSTALL_DIR" 68 | mkdir -p "$MOD_INSTALL_DIR" 69 | cp "$MOD_NAME.pak" "$MOD_INSTALL_DIR" 70 | 71 | echo "Cleaning up after install" 72 | rm "$MOD_NAME.pak" 73 | 74 | echo -e "\n== Mod installation done ==\n" 75 | 76 | if [ $DO_GAME -ne 0 ]; then 77 | echo -e "Starting DRG...\n" 78 | steam steam://rungameid/548430 79 | fi 80 | -------------------------------------------------------------------------------- /DRGModdingAutomationScriptsLinux/setup_cpp_project.sh: -------------------------------------------------------------------------------- 1 | #!/bin/bash 2 | 3 | . ./.env 4 | 5 | echo -e "\n-> Setting up EU4 project at '$PROJECT_FILE'\n" 6 | 7 | $WINE "$UE4_PATH/Engine/Binaries/DotNET/UnrealBuildTool.exe" -projectfiles -project="Z:$PROJECT_FILE" -game -rocket -progress 8 | 9 | echo -e "\n== Setting up EU4 project done ==\n" 10 | -------------------------------------------------------------------------------- /DRGModdingAutomationScriptsLinux/util/cook_project.sh: -------------------------------------------------------------------------------- 1 | #!/bin/bash 2 | 3 | . ./.env 4 | 5 | echo -e "\n-> Cooking EU4 project at '$PROJECT_FILE'\n" 6 | 7 | $WINE "$UE4_PATH/Engine/Binaries/Win64/UE4Editor-Cmd.exe" "Z:$PROJECT_FILE" -run=cook -targetplatform=WindowsNoEditor 8 | 9 | WINE_ERROR=$? 10 | 11 | if [ $WINE_ERROR -ne 0 ]; then 12 | echo -e "\n-x Error while cooking the project\n" 13 | exit $WINE_ERROR 14 | fi 15 | 16 | echo -e "\n== Cooking EU4 project done ==\n" 17 | -------------------------------------------------------------------------------- /DRGModdingAutomationScriptsLinux/util/pack_project.sh: -------------------------------------------------------------------------------- 1 | #!/bin/bash 2 | 3 | . ./.env 4 | 5 | # VARIABLES SETUP ------------------------------- 6 | 7 | BAKED_PATH="$PROJECT_PATH/Saved/Cooked/WindowsNoEditor/FSD" 8 | # Temporary folders used to pack the mod 9 | TMP_WORKSPACE="$(pwd)/.tmp_pack" 10 | TMP_WORKSPACE_INPUT="$TMP_WORKSPACE/input" 11 | # Utility to convert Linux path to Windows 12 | WINEPATH="$WINE"path 13 | # Wine path to the resulting pak file 14 | PAK_PATH="Z:$(pwd)/$MOD_NAME.pak" 15 | # Wine path to the autogen file 16 | AUTOGEN_PATH="Z:$TMP_WORKSPACE/autogen.txt" 17 | 18 | # ----------------------------------------------- 19 | 20 | echo -e "\n-> Packing mod into $MOD_NAME.pak\n" 21 | 22 | echo "Cleaning previous temporary directory" 23 | rm -r "$TMP_WORKSPACE" 24 | mkdir -p "$TMP_WORKSPACE" 25 | 26 | echo "Copying assets to pack in temporary directory" 27 | mkdir -p "$TMP_WORKSPACE_INPUT" 28 | cp -r "$BAKED_PATH/Content" "$TMP_WORKSPACE_INPUT" 29 | cp "$BAKED_PATH/AssetRegistry.bin" "$TMP_WORKSPACE_INPUT" 30 | 31 | echo "Packing the mod" 32 | echo "$($WINEPATH -w "$TMP_WORKSPACE_INPUT/*")" "../../../FSD/" > "$TMP_WORKSPACE/autogen.txt" 33 | 34 | $WINE "$UE4_PATH/Engine/Binaries/Win64/UnrealPak.exe" "$PAK_PATH" -create="$AUTOGEN_PATH" -platform="Windows" -compress 35 | 36 | WINE_ERROR=$? 37 | 38 | echo "Cleaning up temporary directory after pack" 39 | rm -r "$TMP_WORKSPACE" 40 | 41 | if [ $WINE_ERROR -ne 0 ]; then 42 | echo -e "\n-x Error while cooking the project\n" 43 | exit $WINE_ERROR 44 | fi 45 | 46 | 47 | echo -e "\n== Packing done ==\n" 48 | -------------------------------------------------------------------------------- /Empty Content Hierarchy Generator/README.md: -------------------------------------------------------------------------------- 1 | # Usage 2 | Obviously do not run this on your master copy of the unpacked files, as it deletes everything (not including the folders). 3 | 4 | Then all you need to do is replace the filepath with your one. 5 | -------------------------------------------------------------------------------- /Empty Content Hierarchy Generator/gen.bat: -------------------------------------------------------------------------------- 1 | DEL "D:\ModFactory\DRGPacker\*.*" /S /Q -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # Useful-Scripts 2 | A place to put any useful little scripts you would like to share here. 3 | 4 | If you would like to contribute, and are not a member of the organisation, please contact me (Buckminsterfullerene#6666) on Discord so I can send you an invite. 5 | 6 | If you are a member of the org, please make a folder to categorise what your script does and add a readme inside that explains how to use it/them (if not already inside the scripts). 7 | 8 | ### Scripts list: 9 | * [Asset Generator](https://github.com/DRG-Modding/Useful-Scripts/tree/main/Asset%20Generator) - Written by Buckminsterfullerene 10 | * [Auto-rename Jukebox Songs](https://github.com/DRG-Modding/Useful-Scripts/tree/main/Auto-rename%20Jukebox%20Songs) - Written by Earthcomputer 11 | * [DRG Modding Automation Scripts](https://github.com/DRG-Modding/Useful-Scripts/tree/main/DRGModdingAutomationScripts) - Written by Samamstar 12 | * [DRG Modding Automation Scripts Linux](https://github.com/DRG-Modding/Useful-Scripts/tree/main/DRGModdingAutomationScriptsLinux) - Written by Keplyx 13 | * [Empty Content Hierarchy Generator](https://github.com/DRG-Modding/Useful-Scripts/tree/main/Empty%20Content%20Hierarchy%20Generator) - Written by Elythnwaen 14 | * [Soundclass Hierarchy Scripts](https://github.com/DRG-Modding/Useful-Scripts/tree/main/Soundclass%20Hierarchy) - Written by Buckminsterfullerene & Earthcomputer 15 | * [Sound Classes Plugin](https://github.com/DRG-Modding/Useful-Scripts/tree/main/Soundclass%20Hierarchy/TheSoundClassers) - Written by Hax 16 | -------------------------------------------------------------------------------- /Soundclass Hierarchy/TheSoundClassers/Binaries/Win64/UE4Editor-TheSoundClassers.dll: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/DRG-Modding/Useful-Scripts/e8339f43cb660b5b419ccf3939515fdc2d660a9f/Soundclass Hierarchy/TheSoundClassers/Binaries/Win64/UE4Editor-TheSoundClassers.dll -------------------------------------------------------------------------------- /Soundclass Hierarchy/TheSoundClassers/Binaries/Win64/UE4Editor-TheSoundClassers.pdb: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/DRG-Modding/Useful-Scripts/e8339f43cb660b5b419ccf3939515fdc2d660a9f/Soundclass Hierarchy/TheSoundClassers/Binaries/Win64/UE4Editor-TheSoundClassers.pdb -------------------------------------------------------------------------------- /Soundclass Hierarchy/TheSoundClassers/Binaries/Win64/UE4Editor.modules: -------------------------------------------------------------------------------- 1 | { 2 | "BuildId": "2d2d0253-d17c-4a11-865e-8edad8cd4063", 3 | "Modules": 4 | { 5 | "TheSoundClassers": "UE4Editor-TheSoundClassers.dll" 6 | } 7 | } -------------------------------------------------------------------------------- /Soundclass Hierarchy/TheSoundClassers/Intermediate/Build/Win64/UE4Editor/Development/TheSoundClassers/UE4Editor-TheSoundClassers.lib: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/DRG-Modding/Useful-Scripts/e8339f43cb660b5b419ccf3939515fdc2d660a9f/Soundclass Hierarchy/TheSoundClassers/Intermediate/Build/Win64/UE4Editor/Development/TheSoundClassers/UE4Editor-TheSoundClassers.lib -------------------------------------------------------------------------------- /Soundclass Hierarchy/TheSoundClassers/Resources/ButtonIcon_40x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/DRG-Modding/Useful-Scripts/e8339f43cb660b5b419ccf3939515fdc2d660a9f/Soundclass Hierarchy/TheSoundClassers/Resources/ButtonIcon_40x.png -------------------------------------------------------------------------------- /Soundclass Hierarchy/TheSoundClassers/Resources/Icon128.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/DRG-Modding/Useful-Scripts/e8339f43cb660b5b419ccf3939515fdc2d660a9f/Soundclass Hierarchy/TheSoundClassers/Resources/Icon128.png -------------------------------------------------------------------------------- /Soundclass Hierarchy/TheSoundClassers/Source/TheSoundClassers/Private/TheSoundClassers.cpp: -------------------------------------------------------------------------------- 1 | // Copyright Epic Games, Inc. All Rights Reserved. 2 | 3 | #include "TheSoundClassers.h" 4 | #include "TheSoundClassersStyle.h" 5 | #include "TheSoundClassersCommands.h" 6 | #include "Misc/MessageDialog.h" 7 | #include "ToolMenus.h" 8 | 9 | #include "DesktopPlatform/Public/IDesktopPlatform.h" 10 | #include "DesktopPlatform/Public/DesktopPlatformModule.h" 11 | #include "Misc/FileHelper.h" 12 | #include "Misc/Paths.h" 13 | #include "UObject/UObjectGlobals.h" 14 | 15 | static const FName TheSoundClassersTabName("TheSoundClassers"); 16 | 17 | #define LOCTEXT_NAMESPACE "FTheSoundClassersModule" 18 | 19 | void FTheSoundClassersModule::StartupModule() 20 | { 21 | // This code will execute after your module is loaded into memory; the exact timing is specified in the .uplugin file per-module 22 | 23 | FTheSoundClassersStyle::Initialize(); 24 | FTheSoundClassersStyle::ReloadTextures(); 25 | 26 | FTheSoundClassersCommands::Register(); 27 | 28 | PluginCommands = MakeShareable(new FUICommandList); 29 | 30 | PluginCommands->MapAction( 31 | FTheSoundClassersCommands::Get().PluginAction, 32 | FExecuteAction::CreateRaw(this, &FTheSoundClassersModule::PluginButtonClicked), 33 | FCanExecuteAction()); 34 | 35 | UToolMenus::RegisterStartupCallback(FSimpleMulticastDelegate::FDelegate::CreateRaw(this, &FTheSoundClassersModule::RegisterMenus)); 36 | } 37 | 38 | void FTheSoundClassersModule::ShutdownModule() 39 | { 40 | // This function may be called during shutdown to clean up your module. For modules that support dynamic reloading, 41 | // we call this function before unloading the module. 42 | 43 | UToolMenus::UnRegisterStartupCallback(this); 44 | 45 | UToolMenus::UnregisterOwner(this); 46 | 47 | FTheSoundClassersStyle::Shutdown(); 48 | 49 | FTheSoundClassersCommands::Unregister(); 50 | } 51 | 52 | void FTheSoundClassersModule::PluginButtonClicked() 53 | { 54 | TArray outFileNames; 55 | FString dialogName = "Hi"; 56 | FString defaultPath = "C:"; 57 | FString defaultFile = ""; 58 | FString fileTypes = ".txt"; 59 | uint32 flags = 0; 60 | 61 | //FPackageName::RegisterMountPoint("/MyMountPoint/", FPaths::EnginePluginsDir()); 62 | 63 | IDesktopPlatform* fpl = FDesktopPlatformModule::Get(); 64 | fpl->OpenFileDialog(0, dialogName, defaultPath, defaultFile, fileTypes, flags, outFileNames); 65 | 66 | TSharedPtr myFileParser = ConfigParser(outFileNames[0]); 67 | myFileParser->ConstructChildren(); 68 | 69 | // Put your "OnButtonClicked" stuff here 70 | FText DialogText = LOCTEXT("PluginButtonDialogText", "The Music Hierachy has finished."); 71 | FMessageDialog::Open(EAppMsgType::Ok, DialogText); 72 | } 73 | 74 | void FTheSoundClassersModule::RegisterMenus() 75 | { 76 | // Owner will be used for cleanup in call to UToolMenus::UnregisterOwner 77 | FToolMenuOwnerScoped OwnerScoped(this); 78 | 79 | { 80 | UToolMenu* Menu = UToolMenus::Get()->ExtendMenu("LevelEditor.MainMenu.Window"); 81 | { 82 | FToolMenuSection& Section = Menu->FindOrAddSection("WindowLayout"); 83 | Section.AddMenuEntryWithCommandList(FTheSoundClassersCommands::Get().PluginAction, PluginCommands); 84 | } 85 | } 86 | 87 | { 88 | UToolMenu* ToolbarMenu = UToolMenus::Get()->ExtendMenu("LevelEditor.LevelEditorToolBar"); 89 | { 90 | FToolMenuSection& Section = ToolbarMenu->FindOrAddSection("Settings"); 91 | { 92 | FToolMenuEntry& Entry = Section.AddEntry(FToolMenuEntry::InitToolBarButton(FTheSoundClassersCommands::Get().PluginAction)); 93 | Entry.SetCommandList(PluginCommands); 94 | } 95 | } 96 | } 97 | } 98 | 99 | 100 | TSharedPtr FTheSoundClassersModule::ConfigParser(FString FileLocation) { 101 | IPlatformFile& FileManager = FPlatformFileManager::Get().GetPlatformFile(); 102 | FString FileContent; 103 | TArray LineArray; 104 | if (FileManager.FileExists(*FileLocation)) 105 | { 106 | // We use the LoadFileToString to load the file into 107 | if (FFileHelper::LoadFileToString(FileContent, *FileLocation, FFileHelper::EHashOptions::None)) 108 | { 109 | UE_LOG(LogTemp, Warning, TEXT("FileManipulation: Text From File: %s"), *FileContent); 110 | } 111 | else 112 | { 113 | UE_LOG(LogTemp, Warning, TEXT("FileManipulation: Did not load text from file")); 114 | } 115 | } 116 | else 117 | { 118 | UE_LOG(LogTemp, Warning, TEXT("FileManipulation: ERROR: Can not read the file because it was not found.")); 119 | UE_LOG(LogTemp, Warning, TEXT("FileManipulation: Expected file location: %s"), *FileLocation); 120 | } 121 | FileContent.RemoveSpacesInline(); 122 | FileContent.ParseIntoArrayLines(LineArray); 123 | 124 | 125 | TSharedPtr ReturnNodes = MakeShared(MyNodeClass(LineArray[0], 0)); 126 | ReturnNodes->ParseConfig(&LineArray, 0); 127 | return ReturnNodes; 128 | } 129 | 130 | 131 | 132 | #undef LOCTEXT_NAMESPACE 133 | 134 | IMPLEMENT_MODULE(FTheSoundClassersModule, TheSoundClassers) -------------------------------------------------------------------------------- /Soundclass Hierarchy/TheSoundClassers/Source/TheSoundClassers/Private/TheSoundClassersCommands.cpp: -------------------------------------------------------------------------------- 1 | // Copyright Epic Games, Inc. All Rights Reserved. 2 | 3 | #include "TheSoundClassersCommands.h" 4 | 5 | #define LOCTEXT_NAMESPACE "FTheSoundClassersModule" 6 | 7 | void FTheSoundClassersCommands::RegisterCommands() 8 | { 9 | UI_COMMAND(PluginAction, "TheSoundClassers", "Execute TheSoundClassers action", EUserInterfaceActionType::Button, FInputGesture()); 10 | } 11 | 12 | #undef LOCTEXT_NAMESPACE 13 | -------------------------------------------------------------------------------- /Soundclass Hierarchy/TheSoundClassers/Source/TheSoundClassers/Private/TheSoundClassersStyle.cpp: -------------------------------------------------------------------------------- 1 | // Copyright Epic Games, Inc. All Rights Reserved. 2 | 3 | #include "TheSoundClassersStyle.h" 4 | #include "TheSoundClassers.h" 5 | #include "Framework/Application/SlateApplication.h" 6 | #include "Styling/SlateStyleRegistry.h" 7 | #include "Slate/SlateGameResources.h" 8 | #include "Interfaces/IPluginManager.h" 9 | 10 | TSharedPtr< FSlateStyleSet > FTheSoundClassersStyle::StyleInstance = NULL; 11 | 12 | void FTheSoundClassersStyle::Initialize() 13 | { 14 | if (!StyleInstance.IsValid()) 15 | { 16 | StyleInstance = Create(); 17 | FSlateStyleRegistry::RegisterSlateStyle(*StyleInstance); 18 | } 19 | } 20 | 21 | void FTheSoundClassersStyle::Shutdown() 22 | { 23 | FSlateStyleRegistry::UnRegisterSlateStyle(*StyleInstance); 24 | ensure(StyleInstance.IsUnique()); 25 | StyleInstance.Reset(); 26 | } 27 | 28 | FName FTheSoundClassersStyle::GetStyleSetName() 29 | { 30 | static FName StyleSetName(TEXT("TheSoundClassersStyle")); 31 | return StyleSetName; 32 | } 33 | 34 | #define IMAGE_BRUSH( RelativePath, ... ) FSlateImageBrush( Style->RootToContentDir( RelativePath, TEXT(".png") ), __VA_ARGS__ ) 35 | #define BOX_BRUSH( RelativePath, ... ) FSlateBoxBrush( Style->RootToContentDir( RelativePath, TEXT(".png") ), __VA_ARGS__ ) 36 | #define BORDER_BRUSH( RelativePath, ... ) FSlateBorderBrush( Style->RootToContentDir( RelativePath, TEXT(".png") ), __VA_ARGS__ ) 37 | #define TTF_FONT( RelativePath, ... ) FSlateFontInfo( Style->RootToContentDir( RelativePath, TEXT(".ttf") ), __VA_ARGS__ ) 38 | #define OTF_FONT( RelativePath, ... ) FSlateFontInfo( Style->RootToContentDir( RelativePath, TEXT(".otf") ), __VA_ARGS__ ) 39 | 40 | const FVector2D Icon16x16(16.0f, 16.0f); 41 | const FVector2D Icon20x20(20.0f, 20.0f); 42 | const FVector2D Icon40x40(40.0f, 40.0f); 43 | 44 | TSharedRef< FSlateStyleSet > FTheSoundClassersStyle::Create() 45 | { 46 | TSharedRef< FSlateStyleSet > Style = MakeShareable(new FSlateStyleSet("TheSoundClassersStyle")); 47 | Style->SetContentRoot(IPluginManager::Get().FindPlugin("TheSoundClassers")->GetBaseDir() / TEXT("Resources")); 48 | 49 | Style->Set("TheSoundClassers.PluginAction", new IMAGE_BRUSH(TEXT("ButtonIcon_40x"), Icon40x40)); 50 | 51 | return Style; 52 | } 53 | 54 | #undef IMAGE_BRUSH 55 | #undef BOX_BRUSH 56 | #undef BORDER_BRUSH 57 | #undef TTF_FONT 58 | #undef OTF_FONT 59 | 60 | void FTheSoundClassersStyle::ReloadTextures() 61 | { 62 | if (FSlateApplication::IsInitialized()) 63 | { 64 | FSlateApplication::Get().GetRenderer()->ReloadTextureResources(); 65 | } 66 | } 67 | 68 | const ISlateStyle& FTheSoundClassersStyle::Get() 69 | { 70 | return *StyleInstance; 71 | } 72 | -------------------------------------------------------------------------------- /Soundclass Hierarchy/TheSoundClassers/Source/TheSoundClassers/Public/TheSoundClassers.h: -------------------------------------------------------------------------------- 1 | // Copyright Epic Games, Inc. All Rights Reserved. 2 | 3 | #pragma once 4 | 5 | #include "CoreMinimal.h" 6 | #include "Modules/ModuleManager.h" 7 | #include "Sound/SoundClass.h" 8 | #include "PackageHelperFunctions.h" 9 | 10 | class FToolBarBuilder; 11 | class FMenuBuilder; 12 | 13 | 14 | #define LOCTEXT_NAMESPACE "FTheSoundClassersModule" 15 | 16 | class MyNodeClass { 17 | public: 18 | FString name; 19 | TArray> MyNodeChildren = TArray>(); 20 | UINT16 Depth; 21 | 22 | USoundClass* theLoadedFile; 23 | 24 | MyNodeClass(FString InName, int theDepth) { 25 | name = InName; 26 | Depth = theDepth; 27 | 28 | FString Path = "/Game/SoundClasses/" + name; 29 | theLoadedFile = LoadObject(nullptr, *Path); 30 | if (theLoadedFile == nullptr) { 31 | UE_LOG(LogTemp, Error, TEXT("Failed to load %s"), *name); 32 | } 33 | UE_LOG(LogTemp, Error, TEXT("Failed to load %s"), *name); 34 | } 35 | 36 | void ParseConfig(TArray * ConfigFile, int currentLine) { 37 | if (Depth > 100) { 38 | return; 39 | } 40 | int currentLoopFile = currentLine + 1; 41 | while (true) { 42 | int theFuckingMax = (*ConfigFile).Num(); 43 | if (currentLoopFile >= theFuckingMax) { //End of file 44 | break; 45 | } 46 | FString theLine = (*ConfigFile)[currentLoopFile]; 47 | volatile int theStringDepth = CountVerticalLines(theLine); 48 | if (theStringDepth == Depth + 1) { // If the next index is a child, or one depth below us. 49 | TSharedPtr theNewNode = MakeShared(ParseName(theLine, Depth + 1), Depth + 1); 50 | theNewNode->ParseConfig(ConfigFile, currentLoopFile); 51 | MyNodeChildren.Add(theNewNode); 52 | } 53 | else if (theStringDepth == Depth) { // If the next index is on the same depth as us. 54 | break; 55 | } 56 | currentLoopFile++; 57 | } 58 | } 59 | 60 | int CountVerticalLines(FString TheLine) { 61 | int theLength = TheLine.Len(); 62 | int theDepth = 0; 63 | for (int i = 0; i < theLength; i++) { 64 | if (TheLine[i] == '|') { 65 | theDepth++; 66 | } 67 | else 68 | { 69 | break; 70 | } 71 | } 72 | return theDepth; 73 | } 74 | 75 | FString ParseName(FString theLine, int toRemove) { 76 | FString newString = theLine.Right(theLine.Len() - toRemove); 77 | return newString; 78 | } 79 | 80 | void ConstructChildren() { 81 | if (MyNodeChildren.Num() == 0) { 82 | return; 83 | } 84 | 85 | theLoadedFile->ChildClasses = TArray(); 86 | 87 | for (TSharedPtr Child : MyNodeChildren) { 88 | theLoadedFile->ChildClasses.Add(Child->theLoadedFile); 89 | Child->ConstructChildren(); 90 | } 91 | 92 | theLoadedFile->MarkPackageDirty(); 93 | } 94 | }; 95 | 96 | class FTheSoundClassersModule : public IModuleInterface 97 | { 98 | public: 99 | 100 | /** IModuleInterface implementation */ 101 | virtual void StartupModule() override; 102 | virtual void ShutdownModule() override; 103 | 104 | /** This function will be bound to Command. */ 105 | void PluginButtonClicked(); 106 | 107 | private: 108 | 109 | void RegisterMenus(); 110 | TSharedPtr ConfigParser(FString FileLocation); 111 | 112 | 113 | private: 114 | TSharedPtr PluginCommands; 115 | }; 116 | -------------------------------------------------------------------------------- /Soundclass Hierarchy/TheSoundClassers/Source/TheSoundClassers/Public/TheSoundClassersCommands.h: -------------------------------------------------------------------------------- 1 | // Copyright Epic Games, Inc. All Rights Reserved. 2 | 3 | #pragma once 4 | 5 | #include "CoreMinimal.h" 6 | #include "Framework/Commands/Commands.h" 7 | #include "TheSoundClassersStyle.h" 8 | 9 | class FTheSoundClassersCommands : public TCommands 10 | { 11 | public: 12 | 13 | FTheSoundClassersCommands() 14 | : TCommands(TEXT("TheSoundClassers"), NSLOCTEXT("Contexts", "TheSoundClassers", "TheSoundClassers Plugin"), NAME_None, FTheSoundClassersStyle::GetStyleSetName()) 15 | { 16 | } 17 | 18 | // TCommands<> interface 19 | virtual void RegisterCommands() override; 20 | 21 | public: 22 | TSharedPtr< FUICommandInfo > PluginAction; 23 | }; 24 | -------------------------------------------------------------------------------- /Soundclass Hierarchy/TheSoundClassers/Source/TheSoundClassers/Public/TheSoundClassersStyle.h: -------------------------------------------------------------------------------- 1 | // Copyright Epic Games, Inc. All Rights Reserved. 2 | 3 | #pragma once 4 | 5 | #include "CoreMinimal.h" 6 | #include "Styling/SlateStyle.h" 7 | 8 | class FTheSoundClassersStyle 9 | { 10 | public: 11 | 12 | static void Initialize(); 13 | 14 | static void Shutdown(); 15 | 16 | /** reloads textures used by slate renderer */ 17 | static void ReloadTextures(); 18 | 19 | /** @return The Slate style set for the Shooter game */ 20 | static const ISlateStyle& Get(); 21 | 22 | static FName GetStyleSetName(); 23 | 24 | private: 25 | 26 | static TSharedRef< class FSlateStyleSet > Create(); 27 | 28 | private: 29 | 30 | static TSharedPtr< class FSlateStyleSet > StyleInstance; 31 | }; -------------------------------------------------------------------------------- /Soundclass Hierarchy/TheSoundClassers/Source/TheSoundClassers/TheSoundClassers.Build.cs: -------------------------------------------------------------------------------- 1 | // Copyright Epic Games, Inc. All Rights Reserved. 2 | 3 | using UnrealBuildTool; 4 | 5 | public class TheSoundClassers : ModuleRules 6 | { 7 | public TheSoundClassers(ReadOnlyTargetRules Target) : base(Target) 8 | { 9 | PCHUsage = ModuleRules.PCHUsageMode.UseExplicitOrSharedPCHs; 10 | 11 | PublicIncludePaths.AddRange( 12 | new string[] { 13 | // ... add public include paths required here ... 14 | } 15 | ); 16 | 17 | 18 | PrivateIncludePaths.AddRange( 19 | new string[] { 20 | // ... add other private include paths required here ... 21 | } 22 | ); 23 | 24 | 25 | PublicDependencyModuleNames.AddRange( 26 | new string[] 27 | { 28 | "Core", 29 | // ... add other public dependencies that you statically link with here ... 30 | } 31 | ); 32 | 33 | 34 | PrivateDependencyModuleNames.AddRange( 35 | new string[] 36 | { 37 | "Projects", 38 | "InputCore", 39 | "UnrealEd", 40 | "ToolMenus", 41 | "CoreUObject", 42 | "Engine", 43 | "Slate", 44 | "SlateCore", 45 | "PropertyEditor", 46 | "DesktopPlatform", 47 | // ... add private dependencies that you statically link with here ... 48 | } 49 | ); 50 | 51 | 52 | DynamicallyLoadedModuleNames.AddRange( 53 | new string[] 54 | { 55 | // ... add any modules that your module loads dynamically here ... 56 | } 57 | ); 58 | } 59 | } 60 | -------------------------------------------------------------------------------- /Soundclass Hierarchy/TheSoundClassers/TheSoundClassers.uplugin: -------------------------------------------------------------------------------- 1 | { 2 | "FileVersion": 3, 3 | "Version": 1, 4 | "VersionName": "1.0", 5 | "FriendlyName": "TheSoundClassers", 6 | "Description": "", 7 | "Category": "Other", 8 | "CreatedBy": "Hax", 9 | "CreatedByURL": "", 10 | "DocsURL": "", 11 | "MarketplaceURL": "", 12 | "SupportURL": "", 13 | "EngineVersion": "4.25.0", 14 | "CanContainContent": false, 15 | "Installed": true, 16 | "Modules": [ 17 | { 18 | "Name": "TheSoundClassers", 19 | "Type": "Editor", 20 | "LoadingPhase": "Default" 21 | } 22 | ] 23 | } -------------------------------------------------------------------------------- /Soundclass Hierarchy/U34.5/README.md: -------------------------------------------------------------------------------- 1 | These scripts used DRGParser. -------------------------------------------------------------------------------- /Soundclass Hierarchy/U34.5/SoundClasses_Heirachy.txt: -------------------------------------------------------------------------------- 1 | Master 2 | | Attenuation 3 | | | SFX 4 | | | | WeaponsParent 5 | | | | | 1stAnd3rdSharedWeapons 6 | | | | | | SharedWeaponsReload 7 | | | | | 1stPersonWeapon 8 | | | | | | 1stPersonWeaponFireCore 9 | | | | | | | 1stPersonFire1stWeaponsLoop 10 | | | | | | | 1stPersonFire2ndWeaponsAutoMix 11 | | | | | | | 1stPersonFire1stWeaponsSingle 12 | | | | | | | 1stPersonFire2ndWeaponsManualMix 13 | | | | | | 1stPersonWeaponsTail 14 | | | | | 3rdpersonWeapons 15 | | | | | | 3rdPersonWeaponCore 16 | | | | | | 3rdPersonWeaponTail 17 | | | | | Mining 18 | | | | | HelperWeapons 19 | | | | | WeaponRicochet 20 | | | | | Depositing 21 | | | | | | DepositingManMix 22 | | | | | | DepositingAutoMix 23 | | | | | BulletPassBy 24 | | | | CharactersParent 25 | | | | | CharacterFootsteps 26 | | | | | CharacterGeneric 27 | | | | | CharactersImpactArmor 28 | | | | | CharactersImpactDwarf 29 | | | | | GrabbedByEnemy 30 | | | | | PlayerNoDuck 31 | | | | | BeerEffectsAutoMix 32 | | | | | LowHealth 33 | | | | EnvironmentParent 34 | | | | | Enviorment_FootstepOverwrite 35 | | | | | DropSpikeFall 36 | | | | | EnvironmentCommunication 37 | | | | | Earthquake 38 | | | | | EnvironmentMisc 39 | | | | | ShieldFields 40 | | | | | Ambience 41 | | | | | HotSprings 42 | | | | Music_JukeBox 43 | | | | EnemiesParent 44 | | | | | Enemies 45 | | | | | | 1stEnemies 46 | | | | | | | 1stEnemiesIdle 47 | | | | | | | 1stEnemiesDeathAutomix 48 | | | | | | | 1stEnemiesMisc 49 | | | | | | | 1stEnemiesSteps 50 | | | | | | | 1stEnemiesScreamAutoMix 51 | | | | | | | 1stEnemiesAttackManualMix 52 | | | | | | | GhostNearSound 53 | | | | | | | 1stEnemiesAttackAutoMix 54 | | | | | | 3rdEnemies 55 | | | | | | | 3rdEnemiesIdle 56 | | | | | | | 3rdEnemiesCloseBite 57 | | | | | | | 3rdEnemiesDeathAutomix 58 | | | | | | | 3rdEnemiesScream 59 | | | | | | | 3rdEnemiesSteps 60 | | | | | | | 3rdEnemiesMisc 61 | | | | | | | 3rdEnemiesDeathManualMix 62 | | | | | | | 3rdEnemiesCommunicationAutoMix 63 | | | | | | 2ndEnemies 64 | | | | | | | 2ndEnemiesIdle 65 | | | | | | | 2ndEnemiesScreamAutoMix 66 | | | | | | | 2ndEnemiesSteps 67 | | | | | | | 2ndEnemiesMisc 68 | | | | | | | 2ndEnemiesDeathAutomix 69 | | | | | | | 2ndEnemiesAttackAutoMix 70 | | | | | | | 2ndEnemiesDeathManualMix 71 | | | | | | | 2ndEnemiesMiscManualMix 72 | | | | | | | 2ndEnemiesGrabbersGroup 73 | | | | | | | | 2ndEnemiesScreamGrabbersGroupAutoMix 74 | | | | | | | 2ndEnemiesHydraWeedShootAutoMix 75 | | | | | | | 2ndEnemiesHydraWeedCommunication 76 | | | | | | OmmoranHeartstone 77 | | | | | | | OmmoranManualMix 78 | | | | | | | OmmoranAutoMix 79 | | | | | | | OmmoranCommunicationAutoMix 80 | | | | | | | OmmoranCommunicationManualMix 81 | | | | | EnemiesCommunication 82 | | | | | | EnemiesCommunicationGrabbersGroup 83 | | | | | | RockAttack 84 | | | | | | | RockAttackAutoMix 85 | | | | | | | RockAttackManualMix 86 | | | | | | | RockAttackHighPrio 87 | | | | | EnemiesProjectileImpact 88 | | | | | Enemy_Death 89 | | | | Music_MemorialHall 90 | | | | ExplosionsParent 91 | | | | | ExplosionsManualMix 92 | | | | | ExplosionsDistant 93 | | | | | LargestExplosions 94 | | | | | ExplosionsCoreAutoMix 95 | | | | | ExplosionsTail 96 | | | | | VolatileGutsExplosions 97 | | | | MachinesParent 98 | | | | | DropPod 99 | | | | | FuelCell 100 | | | | | SupplyDropAutoMix 101 | | | | | MineHead 102 | | | | | MulesAutoMix 103 | | | | | MulesManualMix 104 | | | | | SupplyDropManualMix 105 | | | | | DrillVehicle 106 | | | | | | DrillVehicleAutoMix 107 | | | | | | DrillVehicleManualMix 108 | | | | | | DrillVehicleTalk 109 | | | | | Pipes 110 | | | | | Coils 111 | | | | | RefineryMain 112 | | | | | RefineryRocket 113 | | | | | Organ 114 | | | | GameEvents 115 | | | | | GameEventsCommunicationAutoMix 116 | | | | | GameEventsManualMix 117 | | | | | GunTower 118 | | | | | | GunTower1stAutoMix 119 | | | | | | GunTower2ndAutoMix 120 | | | | | | GunTower3rdManualMix 121 | | | | | | GunTowerManualMix 122 | | | | CutSceneSFX 123 | | | | PerksParent 124 | | | | | MiscPerkManualMix 125 | | | | | MiscPerkAutoMix 126 | | | | | PerkHeightenedSenseAutoMix 127 | | | | | PerkIronWillAutoMix 128 | | | | RobotParent 129 | | | | | RobotCommunication 130 | | | | | | InfectedMuleCommunication 131 | | | | | | InfectedMuleMisc 132 | | | UI 133 | | | | UIControllerSounds 134 | | | | SpeakParent 135 | | | | | MissionControl 136 | | | | | SpeakDwarfParent 137 | | | | | | CutSceneSpeak 138 | | | | | | SpeakDwarf 139 | | | | | | SpeakDwarfNoDuck 140 | | | | UI_AutoMix 141 | | | | 2dSound 142 | | | | ExplosionSinus 143 | | | | UI_IsolatedFromWorld 144 | | | | SpecialTerminalEvent 145 | | | | UI_ManualMix 146 | | | | UI_largeAutomix 147 | | | Music 148 | | | | Music_Background 149 | | | | Music_Discovery 150 | | | | Music_Action 151 | | | | Music_Endwave 152 | | | | Music_Menu 153 | | | | Music_Boss 154 | | | | Music_PromotionMenu 155 | | | | Music_BeerEffect 156 | | | | Music_Menu_Endscreen 157 | | | VoiceChat -------------------------------------------------------------------------------- /Soundclass Hierarchy/U34.5/SoundClasses_Heirachy_Inline.txt: -------------------------------------------------------------------------------- 1 | Master 2 | Attenuation 3 | SFX 4 | WeaponsParent 5 | 1stAnd3rdSharedWeapons 6 | SharedWeaponsReload 7 | 1stPersonWeapon 8 | 1stPersonWeaponFireCore 9 | 1stPersonFire1stWeaponsLoop 10 | 1stPersonFire2ndWeaponsAutoMix 11 | 1stPersonFire1stWeaponsSingle 12 | 1stPersonFire2ndWeaponsManualMix 13 | 1stPersonWeaponsTail 14 | 3rdpersonWeapons 15 | 3rdPersonWeaponCore 16 | 3rdPersonWeaponTail 17 | Mining 18 | HelperWeapons 19 | WeaponRicochet 20 | Depositing 21 | DepositingManMix 22 | DepositingAutoMix 23 | BulletPassBy 24 | CharactersParent 25 | CharacterFootsteps 26 | CharacterGeneric 27 | CharactersImpactArmor 28 | CharactersImpactDwarf 29 | GrabbedByEnemy 30 | PlayerNoDuck 31 | BeerEffectsAutoMix 32 | LowHealth 33 | EnvironmentParent 34 | Enviorment_FootstepOverwrite 35 | DropSpikeFall 36 | EnvironmentCommunication 37 | Earthquake 38 | EnvironmentMisc 39 | ShieldFields 40 | Ambience 41 | HotSprings 42 | Music_JukeBox 43 | EnemiesParent 44 | Enemies 45 | 1stEnemies 46 | 1stEnemiesIdle 47 | 1stEnemiesDeathAutomix 48 | 1stEnemiesMisc 49 | 1stEnemiesSteps 50 | 1stEnemiesScreamAutoMix 51 | 1stEnemiesAttackManualMix 52 | GhostNearSound 53 | 1stEnemiesAttackAutoMix 54 | 3rdEnemies 55 | 3rdEnemiesIdle 56 | 3rdEnemiesCloseBite 57 | 3rdEnemiesDeathAutomix 58 | 3rdEnemiesScream 59 | 3rdEnemiesSteps 60 | 3rdEnemiesMisc 61 | 3rdEnemiesDeathManualMix 62 | 3rdEnemiesCommunicationAutoMix 63 | 2ndEnemies 64 | 2ndEnemiesIdle 65 | 2ndEnemiesScreamAutoMix 66 | 2ndEnemiesSteps 67 | 2ndEnemiesMisc 68 | 2ndEnemiesDeathAutomix 69 | 2ndEnemiesAttackAutoMix 70 | 2ndEnemiesDeathManualMix 71 | 2ndEnemiesMiscManualMix 72 | 2ndEnemiesGrabbersGroup 73 | 2ndEnemiesScreamGrabbersGroupAutoMix 74 | 2ndEnemiesHydraWeedShootAutoMix 75 | 2ndEnemiesHydraWeedCommunication 76 | OmmoranHeartstone 77 | OmmoranManualMix 78 | OmmoranAutoMix 79 | OmmoranCommunicationAutoMix 80 | OmmoranCommunicationManualMix 81 | EnemiesCommunication 82 | EnemiesCommunicationGrabbersGroup 83 | RockAttack 84 | RockAttackAutoMix 85 | RockAttackManualMix 86 | RockAttackHighPrio 87 | EnemiesProjectileImpact 88 | Enemy_Death 89 | Music_MemorialHall 90 | ExplosionsParent 91 | ExplosionsManualMix 92 | ExplosionsDistant 93 | LargestExplosions 94 | ExplosionsCoreAutoMix 95 | ExplosionsTail 96 | VolatileGutsExplosions 97 | MachinesParent 98 | DropPod 99 | FuelCell 100 | SupplyDropAutoMix 101 | MineHead 102 | MulesAutoMix 103 | MulesManualMix 104 | SupplyDropManualMix 105 | DrillVehicle 106 | DrillVehicleAutoMix 107 | DrillVehicleManualMix 108 | DrillVehicleTalk 109 | Pipes 110 | Coils 111 | RefineryMain 112 | RefineryRocket 113 | Organ 114 | GameEvents 115 | GameEventsCommunicationAutoMix 116 | GameEventsManualMix 117 | GunTower 118 | GunTower1stAutoMix 119 | GunTower2ndAutoMix 120 | GunTower3rdManualMix 121 | GunTowerManualMix 122 | CutSceneSFX 123 | PerksParent 124 | MiscPerkManualMix 125 | MiscPerkAutoMix 126 | PerkHeightenedSenseAutoMix 127 | PerkIronWillAutoMix 128 | RobotParent 129 | RobotCommunication 130 | InfectedMuleCommunication 131 | InfectedMuleMisc 132 | UI 133 | UIControllerSounds 134 | SpeakParent 135 | MissionControl 136 | SpeakDwarfParent 137 | CutSceneSpeak 138 | SpeakDwarf 139 | SpeakDwarfNoDuck 140 | UI_AutoMix 141 | 2dSound 142 | ExplosionSinus 143 | UI_IsolatedFromWorld 144 | SpecialTerminalEvent 145 | UI_ManualMix 146 | UI_largeAutomix 147 | VoiceChat -------------------------------------------------------------------------------- /Soundclass Hierarchy/U34.5/generate_soundmixes_and_properties.py: -------------------------------------------------------------------------------- 1 | import json 2 | import os 3 | import subprocess 4 | 5 | drg_parser = r'F:\DRG Modding\DRGParser\DeepRockUnpakConverter.exe' 6 | path = r'F:\DRG Modding\DRGPacker\unpacked\FSD\Content\Audio\SoundControl\SoundMixes' 7 | 8 | def create_json(asset_file): 9 | subprocess.run([drg_parser, asset_file], capture_output=True, check=True) 10 | print('Created file:' + asset_file) 11 | 12 | 13 | def print_soundmixes(): 14 | output = [] 15 | for asset_file in os.listdir(path): 16 | if asset_file.endswith('.uasset'): 17 | # create_json(os.path.join(path, asset_file)) 18 | 19 | json_file = os.path.join(path, asset_file.replace('.uasset', '') + '-UAsset.json') 20 | if not os.path.exists(json_file): 21 | pass 22 | with open(json_file) as f: 23 | data = json.load(f) 24 | 25 | prefix_path = '/Game/Audio/SoundControl/SoundClasses/' 26 | soundclass_names = [] 27 | object_imports = data['ObjectImports'] 28 | for objects in object_imports: 29 | object_name = objects['ObjectName'] 30 | if object_name.startswith(prefix_path): 31 | soundclass_names.append(object_name.replace(prefix_path, '')) 32 | print("objects stuff " + object_name) 33 | 34 | export_values = data['ExportValues'][0] 35 | soundmix_name = export_values['Object'] 36 | potential_props = export_values['Potential Properties'] 37 | data_values = { 38 | 'InitialDelay': 0.0, 39 | 'FadeInTime': 0.00, 40 | 'FadeOutTime': 0.0, 41 | 'Duration': -1, 42 | 'bApplyEQ': False, 43 | } 44 | for prop in potential_props: 45 | if prop['Property'] in ['InitialDelay', 'FadeInTime', 'FadeOutTime', 'Duration', 'bApplyEQ']: 46 | if prop['Property'] == 'bApplyEQ': 47 | data_values[prop['Property']] = prop['Tag Data'] 48 | else: 49 | data_values[prop['Property']] = prop['Data Value'] 50 | elif prop['Property'] in ['SoundClassEffects', 'EQSettings']: 51 | continue 52 | else: 53 | data_values[prop['Property']] = 0 54 | 55 | output.append({ 56 | 'soundmix_name' : soundmix_name, 57 | 'data_values' : data_values, 58 | 'soundclass_names' : soundclass_names 59 | }) 60 | 61 | with open('F:\DRG Modding\Scripts\soundmixes.json', 'w+') as file: 62 | json.dump(output, file, indent=2) 63 | 64 | 65 | print_soundmixes() 66 | -------------------------------------------------------------------------------- /Soundclass Hierarchy/U34.5/get_tree_of_soundclasses.py: -------------------------------------------------------------------------------- 1 | ### Written by Earthcomputer 2 | 3 | import json 4 | import os 5 | import subprocess 6 | 7 | drg_parser = r'F:\DRG Modding\DRGParser\DeepRockUnpakConverter.exe' 8 | path = r'F:\DRG Modding\DRGPacker\unpacked\FSD\Content\Audio\SoundControl\SoundClasses' 9 | 10 | # def create_json(asset_file): 11 | # subprocess.run([drg_parser, asset_file], capture_output=True, check=True) 12 | 13 | # for asset_file in os.listdir(path): 14 | # if asset_file.endswith('.uasset'): 15 | # create_json(os.path.join(path, asset_file)) 16 | 17 | def print_tree(file, prefix = ''): 18 | json_file = os.path.join(path, file + '-UAsset.json') 19 | if not os.path.exists(json_file): 20 | return 21 | with open(json_file) as f: 22 | data = json.load(f) 23 | export_values = data['ExportValues'][0] 24 | print(prefix + export_values['Object']) 25 | potential_props = export_values['Potential Properties'] 26 | for prop in potential_props: 27 | if prop['Property'] == 'ChildClasses': 28 | for data_value in prop['Data Value']['Items']: 29 | if data_value.startswith('Import:'): 30 | print_tree(data_value[7:], prefix + ' | ') 31 | 32 | 33 | print_tree('Master') 34 | -------------------------------------------------------------------------------- /Soundclass Hierarchy/U35/README.md: -------------------------------------------------------------------------------- 1 | These scripts use the output JSON from DUAM JParse. -------------------------------------------------------------------------------- /Soundclass Hierarchy/U35/SoundClasses_Hierarchy.txt: -------------------------------------------------------------------------------- 1 | Master 2 | | Attenuation 3 | | | SFX 4 | | | | WeaponsParent 5 | | | | | 1stAnd3rdSharedWeapons 6 | | | | | | SharedWeaponsReload 7 | | | | | 1stPersonWeapon 8 | | | | | | 1stPersonWeaponFireCore 9 | | | | | | | 1stPersonFire1stWeaponsLoop 10 | | | | | | | 1stPersonFire2ndWeaponsAutoMix 11 | | | | | | | 1stPersonFire1stWeaponsSingle 12 | | | | | | | 1stPersonFire2ndWeaponsManualMix 13 | | | | | | 1stPersonWeaponsTail 14 | | | | | 3rdpersonWeapons 15 | | | | | | 3rdPersonWeaponCore 16 | | | | | | 3rdPersonWeaponTail 17 | | | | | Mining 18 | | | | | HelperWeapons 19 | | | | | WeaponRicochet 20 | | | | | Depositing 21 | | | | | | DepositingManMix 22 | | | | | | DepositingAutoMix 23 | | | | | BulletPassBy 24 | | | | CharactersParent 25 | | | | | CharacterFootsteps 26 | | | | | CharacterGeneric 27 | | | | | CharactersImpactArmor 28 | | | | | CharactersImpactDwarf 29 | | | | | GrabbedByEnemy 30 | | | | | PlayerNoDuck 31 | | | | | BeerEffectsAutoMix 32 | | | | | LowHealth 33 | | | | | 2dHitEnemy 34 | | | | EnvironmentParent 35 | | | | | Enviorment_FootstepOverwrite 36 | | | | | DropSpikeFall 37 | | | | | EnvironmentCommunication 38 | | | | | Earthquake 39 | | | | | EnvironmentMisc 40 | | | | | ShieldFields 41 | | | | | Ambience 42 | | | | | HotSprings 43 | | | | | TunnelAmbience 44 | | | | Music_JukeBox 45 | | | | EnemiesParent 46 | | | | | Enemies 47 | | | | | | SmallUnitsParent 48 | | | | | | | 3rdEnemies 49 | | | | | | | | 3rdEnemiesIdle 50 | | | | | | | | 3rdEnemiesCloseBite 51 | | | | | | | | 3rdEnemiesDeathAutomix 52 | | | | | | | | 3rdEnemiesScream 53 | | | | | | | | 3rdEnemiesSteps 54 | | | | | | | | 3rdEnemiesMisc 55 | | | | | | | | 3rdEnemiesDeathManualMix 56 | | | | | | | | 3rdEnemiesCommunicationAutoMix 57 | | | | | | | | 3rdEnemiesManualMix 58 | | | | | | | 2ndEnemies 59 | | | | | | | | 2ndEnemiesIdle 60 | | | | | | | | 2ndEnemiesScreamAutoMix 61 | | | | | | | | 2ndEnemiesSteps 62 | | | | | | | | 2ndEnemiesMisc 63 | | | | | | | | 2ndEnemiesDeathAutomix 64 | | | | | | | | 2ndEnemiesAttackAutoMix 65 | | | | | | | | 2ndEnemiesDeathManualMix 66 | | | | | | | | 2ndEnemiesMiscManualMix 67 | | | | | | | | 2ndEnemiesGrabbersGroup 68 | | | | | | | | | 2ndEnemiesScreamGrabbersGroupAutoMix 69 | | | | | | | | 2ndEnemiesHydraWeedShootAutoMix 70 | | | | | | | | 2ndEnemiesHydraWeedCommunication 71 | | | | | | | | ShreddersDrillAutoMix 72 | | | | | | | | ShreddersIdle 73 | | | | | | | | ShredderMisc 74 | | | | | | | | 2ndEnemiesMiscTail 75 | | | | | | | 1stEnemies 76 | | | | | | | | 1stEnemiesIdle 77 | | | | | | | | 1stEnemiesDeathAutomix 78 | | | | | | | | 1stEnemiesMisc 79 | | | | | | | | 1stEnemiesSteps 80 | | | | | | | | 1stEnemiesScreamAutoMix 81 | | | | | | | | 1stEnemiesAttackManualMix 82 | | | | | | | | GhostNearSound 83 | | | | | | | | 1stEnemiesAttackAutoMix 84 | | | | | | BigUnitsParent 85 | | | | | | | OmmoranHeartstone 86 | | | | | | | | OmmoranManualMix 87 | | | | | | | | OmmoranAutoMix 88 | | | | | | | | OmmoranCommunicationAutoMix 89 | | | | | | | | OmmoranCommunicationManualMix 90 | | | | | | | | OmmoranTail 91 | | | | | | | CareTakerParent 92 | | | | | | | | TentaclesParent 93 | | | | | | | | | TentaclesCommunicationInital 94 | | | | | | | | | TentaclesImpact 95 | | | | | | | | | TentaclesManualMix 96 | | | | | | | | | TentacleCommunicationTail 97 | | | | | | | | CareTakerPyramid 98 | | | | | | | | | CareTakerCommunicationAutoMix 99 | | | | | | | | | CareTakerManualMix 100 | | | | | | | | | CareTakerCommunicationTimed 101 | | | | | | | | | CareTakerBarrierFireCoreAutoMix 102 | | | | | | | | | CareTakerBarrierFireTail 103 | | | | | EnemiesCommunication 104 | | | | | | EnemiesCommunicationGrabbersGroup 105 | | | | | | RockAttack 106 | | | | | | | RockAttackAutoMix 107 | | | | | | | RockAttackManualMix 108 | | | | | | | RockAttackHighPrio 109 | | | | | EnemiesProjectileImpactAutoMix 110 | | | | | Enemy_Death 111 | | | | | FriendlyFireProjectileImpact 112 | | | | | EnemiesProjectileManualMix 113 | | | | | MiscProjectileImpactAutoMix 114 | | | | | MiscProjectileManualMix 115 | | | | Music_MemorialHall 116 | | | | ExplosionsParent 117 | | | | | ExplosionsManualMix 118 | | | | | ExplosionsDistant 119 | | | | | LargestExplosions 120 | | | | | ExplosionsCoreAutoMix 121 | | | | | ExplosionsTail 122 | | | | | VolatileGutsExplosions 123 | | | | MachinesParent 124 | | | | | DropPod 125 | | | | | FuelCell 126 | | | | | SupplyDropAutoMix 127 | | | | | MineHead 128 | | | | | MulesAutoMix 129 | | | | | MulesManualMix 130 | | | | | SupplyDropManualMix 131 | | | | | DrillVehicle 132 | | | | | | DrillVehicleAutoMix 133 | | | | | | DrillVehicleManualMix 134 | | | | | | DrillVehicleTalk 135 | | | | | Pipes 136 | | | | | Coils 137 | | | | | RefineryMain 138 | | | | | RefineryRocket 139 | | | | | Organ 140 | | | | | FacilityPowerStation 141 | | | | | MiscMachines 142 | | | | GameEvents 143 | | | | | GameEventsCommunicationAutoMix 144 | | | | | GameEventsManualMix 145 | | | | | GunTower 146 | | | | | | GunTower1stAutoMix 147 | | | | | | GunTower2ndAutoMix 148 | | | | | | GunTower3rdManualMix 149 | | | | | | GunTowerManualMix 150 | | | | CutSceneSFX 151 | | | | PerksParent 152 | | | | | MiscPerkManualMix 153 | | | | | MiscPerkAutoMix 154 | | | | | PerkHeightenedSenseAutoMix 155 | | | | | PerkIronWillAutoMix 156 | | | | RobotParent 157 | | | | | RobotCommunication 158 | | | | | | InfectedMuleCommunication 159 | | | | | | InfectedMuleMisc 160 | | | | SpeakParent 161 | | | | | MissionControl 162 | | | | | SpeakDwarfParent 163 | | | | | | CutSceneSpeak 164 | | | | | | SpeakDwarf 165 | | | | | | SpeakDwarfNoDuck 166 | | | UI 167 | | | | UIControllerSounds 168 | | | | UI_AutoMix 169 | | | | 2dSound 170 | | | | ExplosionSinus 171 | | | | UI_IsolatedFromWorld 172 | | | | SpecialTerminalEvent 173 | | | | UI_ManualMix 174 | | | | UI_largeAutomix 175 | | | Music 176 | | | | Music_Background 177 | | | | Music_Discovery 178 | | | | Music_Action 179 | | | | Music_Endwave 180 | | | | Music_Menu 181 | | | | Music_Boss 182 | | | | Music_PromotionMenu 183 | | | | Music_BeerEffect 184 | | | | Music_Menu_Endscreen 185 | | | VoiceChat -------------------------------------------------------------------------------- /Soundclass Hierarchy/U35/SoundClasses_Hierarchy_Inline.txt: -------------------------------------------------------------------------------- 1 | Master 2 | Attenuation 3 | SFX 4 | WeaponsParent 5 | 1stAnd3rdSharedWeapons 6 | SharedWeaponsReload 7 | 1stPersonWeapon 8 | 1stPersonWeaponFireCore 9 | 1stPersonFire1stWeaponsLoop 10 | 1stPersonFire2ndWeaponsAutoMix 11 | 1stPersonFire1stWeaponsSingle 12 | 1stPersonFire2ndWeaponsManualMix 13 | 1stPersonWeaponsTail 14 | 3rdpersonWeapons 15 | 3rdPersonWeaponCore 16 | 3rdPersonWeaponTail 17 | Mining 18 | HelperWeapons 19 | WeaponRicochet 20 | Depositing 21 | DepositingManMix 22 | DepositingAutoMix 23 | BulletPassBy 24 | CharactersParent 25 | CharacterFootsteps 26 | CharacterGeneric 27 | CharactersImpactArmor 28 | CharactersImpactDwarf 29 | GrabbedByEnemy 30 | PlayerNoDuck 31 | BeerEffectsAutoMix 32 | LowHealth 33 | 2dHitEnemy 34 | EnvironmentParent 35 | Enviorment_FootstepOverwrite 36 | DropSpikeFall 37 | EnvironmentCommunication 38 | Earthquake 39 | EnvironmentMisc 40 | ShieldFields 41 | Ambience 42 | HotSprings 43 | TunnelAmbience 44 | Music_JukeBox 45 | EnemiesParent 46 | Enemies 47 | SmallUnitsParent 48 | 3rdEnemies 49 | 3rdEnemiesIdle 50 | 3rdEnemiesCloseBite 51 | 3rdEnemiesDeathAutomix 52 | 3rdEnemiesScream 53 | 3rdEnemiesSteps 54 | 3rdEnemiesMisc 55 | 3rdEnemiesDeathManualMix 56 | 3rdEnemiesCommunicationAutoMix 57 | 3rdEnemiesManualMix 58 | 2ndEnemies 59 | 2ndEnemiesIdle 60 | 2ndEnemiesScreamAutoMix 61 | 2ndEnemiesSteps 62 | 2ndEnemiesMisc 63 | 2ndEnemiesDeathAutomix 64 | 2ndEnemiesAttackAutoMix 65 | 2ndEnemiesDeathManualMix 66 | 2ndEnemiesMiscManualMix 67 | 2ndEnemiesGrabbersGroup 68 | 2ndEnemiesScreamGrabbersGroupAutoMix 69 | 2ndEnemiesHydraWeedShootAutoMix 70 | 2ndEnemiesHydraWeedCommunication 71 | ShreddersDrillAutoMix 72 | ShreddersIdle 73 | ShredderMisc 74 | 2ndEnemiesMiscTail 75 | 1stEnemies 76 | 1stEnemiesIdle 77 | 1stEnemiesDeathAutomix 78 | 1stEnemiesMisc 79 | 1stEnemiesSteps 80 | 1stEnemiesScreamAutoMix 81 | 1stEnemiesAttackManualMix 82 | GhostNearSound 83 | 1stEnemiesAttackAutoMix 84 | BigUnitsParent 85 | OmmoranHeartstone 86 | OmmoranManualMix 87 | OmmoranAutoMix 88 | OmmoranCommunicationAutoMix 89 | OmmoranCommunicationManualMix 90 | OmmoranTail 91 | CareTakerParent 92 | TentaclesParent 93 | TentaclesCommunicationInital 94 | TentaclesImpact 95 | TentaclesManualMix 96 | TentacleCommunicationTail 97 | CareTakerPyramid 98 | CareTakerCommunicationAutoMix 99 | CareTakerManualMix 100 | CareTakerCommunicationTimed 101 | CareTakerBarrierFireCoreAutoMix 102 | CareTakerBarrierFireTail 103 | EnemiesCommunication 104 | EnemiesCommunicationGrabbersGroup 105 | RockAttack 106 | RockAttackAutoMix 107 | RockAttackManualMix 108 | RockAttackHighPrio 109 | EnemiesProjectileImpactAutoMix 110 | Enemy_Death 111 | FriendlyFireProjectileImpact 112 | EnemiesProjectileManualMix 113 | MiscProjectileImpactAutoMix 114 | MiscProjectileManualMix 115 | Music_MemorialHall 116 | ExplosionsParent 117 | ExplosionsManualMix 118 | ExplosionsDistant 119 | LargestExplosions 120 | ExplosionsCoreAutoMix 121 | ExplosionsTail 122 | VolatileGutsExplosions 123 | MachinesParent 124 | DropPod 125 | FuelCell 126 | SupplyDropAutoMix 127 | MineHead 128 | MulesAutoMix 129 | MulesManualMix 130 | SupplyDropManualMix 131 | DrillVehicle 132 | DrillVehicleAutoMix 133 | DrillVehicleManualMix 134 | DrillVehicleTalk 135 | Pipes 136 | Coils 137 | RefineryMain 138 | RefineryRocket 139 | Organ 140 | FacilityPowerStation 141 | MiscMachines 142 | GameEvents 143 | GameEventsCommunicationAutoMix 144 | GameEventsManualMix 145 | GunTower 146 | GunTower1stAutoMix 147 | GunTower2ndAutoMix 148 | GunTower3rdManualMix 149 | GunTowerManualMix 150 | CutSceneSFX 151 | PerksParent 152 | MiscPerkManualMix 153 | MiscPerkAutoMix 154 | PerkHeightenedSenseAutoMix 155 | PerkIronWillAutoMix 156 | RobotParent 157 | RobotCommunication 158 | InfectedMuleCommunication 159 | InfectedMuleMisc 160 | SpeakParent 161 | MissionControl 162 | SpeakDwarfParent 163 | CutSceneSpeak 164 | SpeakDwarf 165 | SpeakDwarfNoDuck 166 | UI 167 | UIControllerSounds 168 | UI_AutoMix 169 | 2dSound 170 | ExplosionSinus 171 | UI_IsolatedFromWorld 172 | SpecialTerminalEvent 173 | UI_ManualMix 174 | UI_largeAutomix 175 | Music 176 | Music_Background 177 | Music_Discovery 178 | Music_Action 179 | Music_Endwave 180 | Music_Menu 181 | Music_Boss 182 | Music_PromotionMenu 183 | Music_BeerEffect 184 | Music_Menu_Endscreen 185 | VoiceChat -------------------------------------------------------------------------------- /Soundclass Hierarchy/U35/generate_soundmixes_and_properties.py: -------------------------------------------------------------------------------- 1 | import json 2 | import os 3 | 4 | path = r'F:\DRG Modding\DRGPacker\U35.63118\FSD\Content\Audio\SoundControl\SoundMixes' 5 | 6 | def print_soundmixes(): 7 | output = [] 8 | for asset_file in os.listdir(path): 9 | # Construct json file 10 | json_file = os.path.join(path, asset_file) 11 | if not os.path.exists(json_file) or not json_file.endswith('.json'): 12 | pass 13 | else: 14 | # Load json file 15 | with open(json_file) as f: 16 | data = json.load(f) 17 | 18 | # Get soundclass parents 19 | prefix_path = '/Game/Audio/SoundControl/SoundClasses/' 20 | soundclass_names = [] 21 | imports = data['importMap']['imports'] 22 | for import_ in imports: 23 | name = import_['name'] 24 | if name.startswith(prefix_path): 25 | soundclass_names.append(name.replace(prefix_path, '')) 26 | soundclass_names[-1] = soundclass_names[-1][:-4] 27 | 28 | # Get soundmix name 29 | exports_expansion = data['exportsExpansion'] 30 | soundmix_name = exports_expansion[0]['name'] 31 | 32 | # Get soundmix properties 33 | properties = exports_expansion[0]['properties'] 34 | data_values = { 35 | 'InitialDelay': 0.0, 36 | 'FadeInTime': 0.00, 37 | 'FadeOutTime': 0.0, 38 | 'Duration': -1, 39 | 'bApplyEQ': False, 40 | } 41 | for prop in properties: 42 | if prop['name'] in ['InitialDelay', 'FadeInTime', 'FadeOutTime', 'Duration', 'bApplyEQ']: 43 | data_values[prop['name']] = prop['contents'][0]['value'] 44 | elif prop['name'] in ['SoundClassEffects', 'EQSettings']: 45 | continue 46 | else: 47 | data_values[prop['name']] = 0 48 | 49 | output.append({ 50 | 'soundmix_name' : soundmix_name, 51 | 'data_values' : data_values, 52 | 'soundclass_names' : soundclass_names 53 | }) 54 | 55 | # Write json file 56 | with open('F:/Github Projects/Other/DRG Modding Org/Useful-Scripts/Soundclass Hierarchy/U35/soundmixes.json', 'w+') as file: 57 | json.dump(output, file, indent=2) 58 | 59 | print_soundmixes() -------------------------------------------------------------------------------- /Soundclass Hierarchy/U35/get_soundclasses_sounds_use.py: -------------------------------------------------------------------------------- 1 | import json 2 | import os 3 | 4 | # Replace with your path to unpacked files 5 | USER_PATH = r'C:/../../../../DRG Modding/DRGPacker/FSD-WindowsNoEditor/FSD/' 6 | # Change this to whatever specific folder directory you want to start at 7 | PATH = USER_PATH + r'Content/Audio/WeaponsNTools' 8 | # Replace with your path to where you want the output file to be saved 9 | OUTPUT_PATH = r'C:/../../../../Github Projects/Useful-Scripts/Soundclass Hierarchy/U35/' 10 | 11 | def output(): 12 | output = [] 13 | for _path, _, files in os.walk(PATH): 14 | for asset_file in files: 15 | # Construct json file 16 | json_file = os.path.join(_path, asset_file) 17 | if not os.path.exists(json_file) or not json_file.endswith('.json'): 18 | pass 19 | else: 20 | # Load json file 21 | with open(json_file) as f: 22 | data = json.load(f) 23 | 24 | # Get soundclass 25 | soundclass_name = "" 26 | imports = data['importMap']['imports'] 27 | found = False 28 | for import_ in imports: 29 | if import_['_class'] == 'SoundClass : 0': 30 | soundclass_name = import_['name'] 31 | soundclass_name = soundclass_name.replace(' : 0', '') 32 | found = True 33 | break 34 | if not found: 35 | break 36 | 37 | # Get file name 38 | file_name = asset_file.split('.')[0] 39 | 40 | output.append({ 41 | 'weapon' : file_name, 42 | 'soundclass' : soundclass_name 43 | }) 44 | 45 | # Write json file 46 | with open(OUTPUT_PATH + 'weapon_soundclasses.json', 'w+') as file: 47 | json.dump(output, file, indent=2) 48 | 49 | output() -------------------------------------------------------------------------------- /Soundclass Hierarchy/U35/get_tree_of_soundclasses.py: -------------------------------------------------------------------------------- 1 | import json 2 | import os 3 | 4 | path = r'F:\DRG Modding\DRGPacker\U35.63118\FSD\Content\Audio\SoundControl\SoundClasses' 5 | 6 | def print_tree(file, prefix = ''): 7 | # Construct json file 8 | json_file = os.path.join(path, file + '.json') 9 | if not os.path.exists(json_file): 10 | return 11 | 12 | # Open json file 13 | with open(json_file) as f: 14 | data = json.load(f) 15 | 16 | # Parse JSON 17 | exports_expansion = data['exportsExpansion'] 18 | print(prefix + exports_expansion[0]['name']) 19 | property_types = exports_expansion[0]['properties'] 20 | for prop in property_types: 21 | if prop['name'] == 'ChildClasses': 22 | contents = prop['contents'] 23 | i = 0 24 | for child in contents: 25 | if i > 1: 26 | child_contents = child['contents'][0]['value'] 27 | if child_contents.startswith('Import:'): 28 | print_tree(child_contents[7:], prefix + ' | ') 29 | i += 1 30 | 31 | print_tree('Master') -------------------------------------------------------------------------------- /Soundclass Hierarchy/U35/weapon_soundclasses.json: -------------------------------------------------------------------------------- 1 | [ 2 | { 3 | "weapon": "BuildImpact_Cue", 4 | "soundclass": "1stAnd3rdSharedWeapons" 5 | }, 6 | { 7 | "weapon": "OutOfFlares_Cue", 8 | "soundclass": "UI" 9 | }, 10 | { 11 | "weapon": "RicochetOverclock_Cue", 12 | "soundclass": "1stAnd3rdSharedWeapons" 13 | }, 14 | { 15 | "weapon": "WPN_ScannerIdle_Cue", 16 | "soundclass": "1stAnd3rdSharedWeapons" 17 | }, 18 | { 19 | "weapon": "WPN_ScannerPing_Cue", 20 | "soundclass": "1stAnd3rdSharedWeapons" 21 | }, 22 | { 23 | "weapon": "AlienEggDigFree_Cue", 24 | "soundclass": "Mining" 25 | }, 26 | { 27 | "weapon": "AlienEggImpact_Cue", 28 | "soundclass": "Mining" 29 | }, 30 | { 31 | "weapon": "AlienEgg_NestBreakCue", 32 | "soundclass": "Mining" 33 | }, 34 | { 35 | "weapon": "EggNestAlert_Cue", 36 | "soundclass": "1stEnemiesAttackAutoMix" 37 | }, 38 | { 39 | "weapon": "Amber_Break_Cue", 40 | "soundclass": "Mining" 41 | }, 42 | { 43 | "weapon": "Amber_Impact_Cue", 44 | "soundclass": "Mining" 45 | }, 46 | { 47 | "weapon": "BlockCrumble_Cue", 48 | "soundclass": "Mining" 49 | }, 50 | { 51 | "weapon": "CollectChunk_Cue", 52 | "soundclass": "Mining" 53 | }, 54 | { 55 | "weapon": "CoralHit_Cue", 56 | "soundclass": "Mining" 57 | }, 58 | { 59 | "weapon": "CoralMining_Cue", 60 | "soundclass": "Mining" 61 | }, 62 | { 63 | "weapon": "CrystalHealingMining_Cue", 64 | "soundclass": "Mining" 65 | }, 66 | { 67 | "weapon": "CrystalMining_Cue", 68 | "soundclass": "Mining" 69 | }, 70 | { 71 | "weapon": "CrystalsGeneric_Hit_Cue", 72 | "soundclass": "Mining" 73 | }, 74 | { 75 | "weapon": "CrystalsGeneric_Mining_Cue", 76 | "soundclass": "Mining" 77 | }, 78 | { 79 | "weapon": "DirtHit_Cue", 80 | "soundclass": "Mining" 81 | }, 82 | { 83 | "weapon": "DirtMining_Cue", 84 | "soundclass": "Mining" 85 | }, 86 | { 87 | "weapon": "Dirt_Ice_Mining_Cue", 88 | "soundclass": "Mining" 89 | }, 90 | { 91 | "weapon": "GemPopsFree_Cue", 92 | "soundclass": "Mining" 93 | }, 94 | { 95 | "weapon": "Gem_Impact_Cue", 96 | "soundclass": "Mining" 97 | }, 98 | { 99 | "weapon": "Generic_MetallicMineral_Hit_Cue", 100 | "soundclass": "Mining" 101 | }, 102 | { 103 | "weapon": "Generic_MetallicMineral_Mining_Cue", 104 | "soundclass": "Mining" 105 | }, 106 | { 107 | "weapon": "GoldChime_Cue", 108 | "soundclass": "Mining" 109 | }, 110 | { 111 | "weapon": "GoldCoins_Cue", 112 | "soundclass": "UI" 113 | }, 114 | { 115 | "weapon": "GunkSeedFallingImpact_Cue", 116 | "soundclass": "Mining" 117 | }, 118 | { 119 | "weapon": "HeartStoneGemImpact_Cue", 120 | "soundclass": "Mining" 121 | }, 122 | { 123 | "weapon": "HollowBoughGenericHit_Cue", 124 | "soundclass": "Mining" 125 | }, 126 | { 127 | "weapon": "HollowBoughMining_Cue", 128 | "soundclass": "Mining" 129 | }, 130 | { 131 | "weapon": "IceMining_Cue", 132 | "soundclass": "Mining" 133 | }, 134 | { 135 | "weapon": "Ice_hit_Cue", 136 | "soundclass": "Mining" 137 | }, 138 | { 139 | "weapon": "MiscHit_Cue", 140 | "soundclass": "Mining" 141 | }, 142 | { 143 | "weapon": "MorkiteMining_Cue", 144 | "soundclass": "Mining" 145 | }, 146 | { 147 | "weapon": "OilShaleMachineMining_Cue", 148 | "soundclass": "Mining" 149 | }, 150 | { 151 | "weapon": "OilShaleMining_Cue", 152 | "soundclass": "Mining" 153 | }, 154 | { 155 | "weapon": "OilShale_hit_Cue", 156 | "soundclass": "Mining" 157 | }, 158 | { 159 | "weapon": "PickAxe_CoolDown_Finished_Cue", 160 | "soundclass": "UI" 161 | }, 162 | { 163 | "weapon": "PickUpElement_Cue", 164 | "soundclass": "Mining" 165 | }, 166 | { 167 | "weapon": "PickUp_Barleys_Cue", 168 | "soundclass": "Mining" 169 | }, 170 | { 171 | "weapon": "PickUp_Fossil_Cue", 172 | "soundclass": "Mining" 173 | }, 174 | { 175 | "weapon": "PickUp_Vegetation_Cue", 176 | "soundclass": "Mining" 177 | }, 178 | { 179 | "weapon": "RadioActiveDNA_Mining_Cue", 180 | "soundclass": "Mining" 181 | }, 182 | { 183 | "weapon": "RootsMining_Cue", 184 | "soundclass": "Mining" 185 | }, 186 | { 187 | "weapon": "ShieldRegenerationCooldown_Cue", 188 | "soundclass": "UI_AutoMix" 189 | }, 190 | { 191 | "weapon": "Snow_Mining_Cue", 192 | "soundclass": "Mining" 193 | }, 194 | { 195 | "weapon": "StoneMining_Cue", 196 | "soundclass": "Mining" 197 | }, 198 | { 199 | "weapon": "SwingAxe_Cue", 200 | "soundclass": "1stAnd3rdSharedWeapons" 201 | }, 202 | { 203 | "weapon": "Throw_Cue", 204 | "soundclass": "1stAnd3rdSharedWeapons" 205 | }, 206 | { 207 | "weapon": "ExplosionSinusDistant_Cue", 208 | "soundclass": "ExplosionSinus" 209 | }, 210 | { 211 | "weapon": "GeneralMechA_12_Cue", 212 | "soundclass": "SupplyDropAutoMix" 213 | }, 214 | { 215 | "weapon": "GeneralMechA_1_Cue", 216 | "soundclass": "SupplyDropAutoMix" 217 | }, 218 | { 219 | "weapon": "GeneralMechA_3_Cue", 220 | "soundclass": "GameEvents" 221 | }, 222 | { 223 | "weapon": "GeneralMechA_4_Cue", 224 | "soundclass": "SupplyDropAutoMix" 225 | }, 226 | { 227 | "weapon": "GeneralMechA_5_Cue", 228 | "soundclass": "SupplyDropAutoMix" 229 | }, 230 | { 231 | "weapon": "GeneralMechA_7_Cue", 232 | "soundclass": "SupplyDropAutoMix" 233 | }, 234 | { 235 | "weapon": "FlareImpact_Cue", 236 | "soundclass": "1stAnd3rdSharedWeapons" 237 | }, 238 | { 239 | "weapon": "Lit_Fuse_Cue", 240 | "soundclass": "1stAnd3rdSharedWeapons" 241 | }, 242 | { 243 | "weapon": "AxeGrenadeDullImpact_Cue", 244 | "soundclass": "ExplosionsCoreAutoMix" 245 | }, 246 | { 247 | "weapon": "AxeGrenadeFoldOut_Cue", 248 | "soundclass": "ExplosionsManualMix" 249 | }, 250 | { 251 | "weapon": "AxeGrenadeImpact_Cue", 252 | "soundclass": "ExplosionsCoreAutoMix" 253 | }, 254 | { 255 | "weapon": "AxeGrenadePickup_Cue", 256 | "soundclass": "ExplosionsManualMix" 257 | }, 258 | { 259 | "weapon": "BOuncyPlasmaGrenadeDischarge_Cue", 260 | "soundclass": "ExplosionsCoreAutoMix" 261 | }, 262 | { 263 | "weapon": "ClusterGrenadeExplosion_Cue", 264 | "soundclass": "ExplosionsCoreAutoMix" 265 | }, 266 | { 267 | "weapon": "ClusterGrenade_Breakup_Cue", 268 | "soundclass": "ExplosionsCoreAutoMix" 269 | }, 270 | { 271 | "weapon": "ExplosiveReload_BeepExlode_Cue", 272 | "soundclass": "1stAnd3rdSharedWeapons" 273 | }, 274 | { 275 | "weapon": "FreezeGrenade_Cue", 276 | "soundclass": "ExplosionsCoreAutoMix" 277 | }, 278 | { 279 | "weapon": "GasDischarge_Cue", 280 | "soundclass": "EnvironmentCommunication" 281 | }, 282 | { 283 | "weapon": "StickyGrenadeExplosion_Cue", 284 | "soundclass": "ExplosionsCoreAutoMix" 285 | }, 286 | { 287 | "weapon": "IncendiaryGrenadeExplosion_Cue", 288 | "soundclass": "ExplosionsCoreAutoMix" 289 | }, 290 | { 291 | "weapon": "Grenade_Lure_Cue", 292 | "soundclass": "ExplosionsCoreAutoMix" 293 | }, 294 | { 295 | "weapon": "Grenade_Lure_OutOfPower_Cue", 296 | "soundclass": "1stAnd3rdSharedWeapons" 297 | }, 298 | { 299 | "weapon": "PheromoneGrenadeExplosion_Cue", 300 | "soundclass": "ExplosionsCoreAutoMix" 301 | }, 302 | { 303 | "weapon": "StickyGrenade_BeepExlode_Cue", 304 | "soundclass": "ExplosionsCoreAutoMix" 305 | }, 306 | { 307 | "weapon": "StickyGrenade_Beep_Cue", 308 | "soundclass": "1stAnd3rdSharedWeapons" 309 | }, 310 | { 311 | "weapon": "StickyGrenade_SpikesExtended_Cue", 312 | "soundclass": "WeaponsParent" 313 | }, 314 | { 315 | "weapon": "Mine_Deploy", 316 | "soundclass": "1stAnd3rdSharedWeapons" 317 | }, 318 | { 319 | "weapon": "StickyMineExplosion_Cue", 320 | "soundclass": "ExplosionsCoreAutoMix" 321 | }, 322 | { 323 | "weapon": "StickyMine_ArmedBeep_Cue", 324 | "soundclass": "1stAnd3rdSharedWeapons" 325 | }, 326 | { 327 | "weapon": "StickyMine_BeepExlode_Cue", 328 | "soundclass": "1stAnd3rdSharedWeapons" 329 | }, 330 | { 331 | "weapon": "StickyMine_BeepExplode_Cue", 332 | "soundclass": "1stAnd3rdSharedWeapons" 333 | }, 334 | { 335 | "weapon": "StickyMine_LifetimeBeep_Cue", 336 | "soundclass": "1stAnd3rdSharedWeapons" 337 | }, 338 | { 339 | "weapon": "StickyMine_Setup_Cue", 340 | "soundclass": "1stAnd3rdSharedWeapons" 341 | }, 342 | { 343 | "weapon": "SlowGrenadeExplosion_Cue", 344 | "soundclass": "ExplosionsCoreAutoMix" 345 | }, 346 | { 347 | "weapon": "SlowGrenadeFieldStop_Cue", 348 | "soundclass": "1stAnd3rdSharedWeapons" 349 | }, 350 | { 351 | "weapon": "SlowGrenade_IntoField_Cue", 352 | "soundclass": "ExplosionsManualMix" 353 | }, 354 | { 355 | "weapon": "SlowGrenade_OutOfField_Cue", 356 | "soundclass": "ExplosionsManualMix" 357 | }, 358 | { 359 | "weapon": "SlowGrenadeFieldConstant_Cue", 360 | "soundclass": "ShieldFields" 361 | }, 362 | { 363 | "weapon": "Bosco_MissileFire_Cue", 364 | "soundclass": "HelperWeapons" 365 | }, 366 | { 367 | "weapon": "MollyDepositEnd_Cue", 368 | "soundclass": "DepositingManMix" 369 | }, 370 | { 371 | "weapon": "MollyDepositing_Cue", 372 | "soundclass": "DepositingAutoMix" 373 | }, 374 | { 375 | "weapon": "MollyDepositStart_Cue", 376 | "soundclass": "DepositingManMix" 377 | }, 378 | { 379 | "weapon": "TemperatureShock_Cue", 380 | "soundclass": "ExplosionsCoreAutoMix" 381 | }, 382 | { 383 | "weapon": "FuelCanister_CloseMuzzle_Cue", 384 | "soundclass": "1stAnd3rdSharedWeapons" 385 | }, 386 | { 387 | "weapon": "FuelCanister_Impact_Cue", 388 | "soundclass": "1stAnd3rdSharedWeapons" 389 | }, 390 | { 391 | "weapon": "FuelCanister_OpenMuzzle_Cue", 392 | "soundclass": "1stAnd3rdSharedWeapons" 393 | }, 394 | { 395 | "weapon": "Fuel_Canister_HandlesIn_cue", 396 | "soundclass": "1stAnd3rdSharedWeapons" 397 | }, 398 | { 399 | "weapon": "OilExtractorHitNegative_Cue", 400 | "soundclass": "1stPersonWeaponsTail" 401 | }, 402 | { 403 | "weapon": "OilExtractorHitPositive_Cue", 404 | "soundclass": "1stPersonFire1stWeaponsLoop" 405 | }, 406 | { 407 | "weapon": "OilExtractor_Cue", 408 | "soundclass": "1stPersonFire1stWeaponsLoop" 409 | }, 410 | { 411 | "weapon": "PipeBuildFinished_Cue", 412 | "soundclass": "Pipes" 413 | }, 414 | { 415 | "weapon": "PipeConnect_Cue", 416 | "soundclass": "Pipes" 417 | }, 418 | { 419 | "weapon": "PipelineBuilding_Cue", 420 | "soundclass": "Pipes" 421 | }, 422 | { 423 | "weapon": "PipePlace_Cue", 424 | "soundclass": "Pipes" 425 | }, 426 | { 427 | "weapon": "Pipeplace_start_cue", 428 | "soundclass": "Pipes" 429 | }, 430 | { 431 | "weapon": "PipeSlideOff_Cue", 432 | "soundclass": "CharacterFootsteps" 433 | }, 434 | { 435 | "weapon": "PipeSlide_Cue", 436 | "soundclass": "CharacterGeneric" 437 | }, 438 | { 439 | "weapon": "Repair_HandDrill_Cue", 440 | "soundclass": "1stAnd3rdSharedWeapons" 441 | }, 442 | { 443 | "weapon": "SentryGunMineHeadFire_Cue", 444 | "soundclass": "HelperWeapons" 445 | }, 446 | { 447 | "weapon": "ShotImpact_Crystal_Cue", 448 | "soundclass": "1stAnd3rdSharedWeapons" 449 | }, 450 | { 451 | "weapon": "ShotImpact_Dirt_Cue", 452 | "soundclass": "1stAnd3rdSharedWeapons" 453 | }, 454 | { 455 | "weapon": "ShotImpact_MetallicMineral_Cue", 456 | "soundclass": "1stAnd3rdSharedWeapons" 457 | }, 458 | { 459 | "weapon": "ShotImpact_Rock_Cue", 460 | "soundclass": "1stAnd3rdSharedWeapons" 461 | }, 462 | { 463 | "weapon": "ShotImpact_Wood_Cue", 464 | "soundclass": "1stAnd3rdSharedWeapons" 465 | }, 466 | { 467 | "weapon": "SnowBallImpact_Cue", 468 | "soundclass": "1stAnd3rdSharedWeapons" 469 | }, 470 | { 471 | "weapon": "SnowHandA_1_Cue", 472 | "soundclass": "1stAnd3rdSharedWeapons" 473 | }, 474 | { 475 | "weapon": "SnowHandB_1_Cue", 476 | "soundclass": "1stAnd3rdSharedWeapons" 477 | }, 478 | { 479 | "weapon": "SnowHandC_1_Cue", 480 | "soundclass": "1stAnd3rdSharedWeapons" 481 | }, 482 | { 483 | "weapon": "SnowScoopA_1_Cue", 484 | "soundclass": "1stAnd3rdSharedWeapons" 485 | }, 486 | { 487 | "weapon": "AssaultRifleFireCoreCombined_Cue", 488 | "soundclass": "1stPersonFire1stWeaponsLoop" 489 | }, 490 | { 491 | "weapon": "AssaultRifleFireTail_Cue", 492 | "soundclass": "1stPersonWeaponsTail" 493 | }, 494 | { 495 | "weapon": "AssaultRifle_GunslingA", 496 | "soundclass": "1stAnd3rdSharedWeapons" 497 | }, 498 | { 499 | "weapon": "AssaultRifle_GunslingB", 500 | "soundclass": "1stAnd3rdSharedWeapons" 501 | }, 502 | { 503 | "weapon": "AutoCannonFireCore_Cue", 504 | "soundclass": "1stPersonFire1stWeaponsLoop" 505 | }, 506 | { 507 | "weapon": "BasicPistolFireCore_Cue", 508 | "soundclass": "1stPersonFire1stWeaponsSingle" 509 | }, 510 | { 511 | "weapon": "BasicPistolReload1_Cue", 512 | "soundclass": "1stAnd3rdSharedWeapons" 513 | }, 514 | { 515 | "weapon": "BasicPistolReload2_Cue", 516 | "soundclass": "1stAnd3rdSharedWeapons" 517 | }, 518 | { 519 | "weapon": "BasicPistolReload3_Cue", 520 | "soundclass": "1stAnd3rdSharedWeapons" 521 | }, 522 | { 523 | "weapon": "BasicPistolReload4_Cue", 524 | "soundclass": "1stAnd3rdSharedWeapons" 525 | }, 526 | { 527 | "weapon": "BasicPistolReload5_Cue", 528 | "soundclass": "1stAnd3rdSharedWeapons" 529 | }, 530 | { 531 | "weapon": "BoltActionFireZoom_Cue", 532 | "soundclass": "1stPersonWeaponFireCore" 533 | }, 534 | { 535 | "weapon": "BoltActionRifleFireCoreCharged_Cue", 536 | "soundclass": "1stPersonFire1stWeaponsSingle" 537 | }, 538 | { 539 | "weapon": "BoltActionRifleFireCore_Cue", 540 | "soundclass": "1stPersonFire1stWeaponsSingle" 541 | }, 542 | { 543 | "weapon": "BurstPistolFireCore_Cue", 544 | "soundclass": "1stPersonFire2ndWeaponsAutoMix" 545 | }, 546 | { 547 | "weapon": "BurstPistolReloadA_1_Cue", 548 | "soundclass": "1stAnd3rdSharedWeapons" 549 | }, 550 | { 551 | "weapon": "BurstPistolReloadB_1_Cue", 552 | "soundclass": "1stAnd3rdSharedWeapons" 553 | }, 554 | { 555 | "weapon": "ChargeBlasterFireCore_Cue", 556 | "soundclass": "1stPersonFire1stWeaponsSingle" 557 | }, 558 | { 559 | "weapon": "ChargeBlasterImpact_Cue", 560 | "soundclass": "1stAnd3rdSharedWeapons" 561 | }, 562 | { 563 | "weapon": "ChargeBlasterLargeFireCore_Cue", 564 | "soundclass": "1stPersonFire1stWeaponsSingle" 565 | }, 566 | { 567 | "weapon": "ChargeBlasterLarge_ProjectileLoop_Cue", 568 | "soundclass": "Enemies" 569 | }, 570 | { 571 | "weapon": "ChargeBlaster_ChargedImpactExplosion__Cue", 572 | "soundclass": "ExplosionsManualMix" 573 | }, 574 | { 575 | "weapon": "ChargeBlaster_Counter_Cue", 576 | "soundclass": "1stAnd3rdSharedWeapons" 577 | }, 578 | { 579 | "weapon": "ChargeBlaster_FullyCharged_Cue", 580 | "soundclass": "1stAnd3rdSharedWeapons" 581 | }, 582 | { 583 | "weapon": "ChargeBlaster_Overheat_Cue", 584 | "soundclass": "1stAnd3rdSharedWeapons" 585 | }, 586 | { 587 | "weapon": "ChargeBlaster_SpinUp_Cue", 588 | "soundclass": "1stAnd3rdSharedWeapons" 589 | }, 590 | { 591 | "weapon": "ShotgunFireCore_Cue", 592 | "soundclass": "1stPersonFire1stWeaponsSingle" 593 | }, 594 | { 595 | "weapon": "Shotgun_Empty_Cue", 596 | "soundclass": "1stAnd3rdSharedWeapons" 597 | }, 598 | { 599 | "weapon": "CryoCannon_PressureRelease_Cue", 600 | "soundclass": "1stPersonFire2ndWeaponsAutoMix" 601 | }, 602 | { 603 | "weapon": "CryoJammed_Cue", 604 | "soundclass": "1stPersonFire2ndWeaponsAutoMix" 605 | }, 606 | { 607 | "weapon": "CryosprayChargeUp_Cue", 608 | "soundclass": "1stPersonFire2ndWeaponsAutoMix" 609 | }, 610 | { 611 | "weapon": "DetPack_Beep_Cue", 612 | "soundclass": "1stAnd3rdSharedWeapons" 613 | }, 614 | { 615 | "weapon": "DetPack_Beep_Exlode", 616 | "soundclass": "1stAnd3rdSharedWeapons" 617 | }, 618 | { 619 | "weapon": "DoubleDrillPump_Cue", 620 | "soundclass": "1stPersonFire2ndWeaponsAutoMix" 621 | }, 622 | { 623 | "weapon": "DrillJammed_Cue", 624 | "soundclass": "1stPersonFire2ndWeaponsAutoMix" 625 | }, 626 | { 627 | "weapon": "DrillOverheat_Cue", 628 | "soundclass": "1stPersonFire2ndWeaponsAutoMix" 629 | }, 630 | { 631 | "weapon": "DrillReady_Cue", 632 | "soundclass": "1stPersonFire2ndWeaponsAutoMix" 633 | }, 634 | { 635 | "weapon": "DrillStop_01_Cue", 636 | "soundclass": "1stPersonFire2ndWeaponsAutoMix" 637 | }, 638 | { 639 | "weapon": "DrillTemperature_Cue", 640 | "soundclass": "1stPersonFire2ndWeaponsAutoMix" 641 | }, 642 | { 643 | "weapon": "Drill_Cue", 644 | "soundclass": "1stPersonFire2ndWeaponsAutoMix" 645 | }, 646 | { 647 | "weapon": "DualfMPReloadA_1_Cue", 648 | "soundclass": "1stAnd3rdSharedWeapons" 649 | }, 650 | { 651 | "weapon": "DualfMPReloadB_1_Cue", 652 | "soundclass": "1stAnd3rdSharedWeapons" 653 | }, 654 | { 655 | "weapon": "DualfMPReloadC_1_Cue", 656 | "soundclass": "1stAnd3rdSharedWeapons" 657 | }, 658 | { 659 | "weapon": "DualfMPReloadD_1_Cue", 660 | "soundclass": "1stAnd3rdSharedWeapons" 661 | }, 662 | { 663 | "weapon": "DualMpFireCore_Cue", 664 | "soundclass": "1stPersonFire2ndWeaponsAutoMix" 665 | }, 666 | { 667 | "weapon": "DualMpFireTail_Cue", 668 | "soundclass": "1stPersonWeaponsTail" 669 | }, 670 | { 671 | "weapon": "DualMPGunslingA_Cue", 672 | "soundclass": "1stAnd3rdSharedWeapons" 673 | }, 674 | { 675 | "weapon": "DualMPGunslingB_Cue", 676 | "soundclass": "1stAnd3rdSharedWeapons" 677 | }, 678 | { 679 | "weapon": "DualMPReloadE_1", 680 | "soundclass": "1stAnd3rdSharedWeapons" 681 | }, 682 | { 683 | "weapon": "FlameThrowerAlmostEmpty_Cue", 684 | "soundclass": "1stAnd3rdSharedWeapons" 685 | }, 686 | { 687 | "weapon": "FlameThrowerFireCore_Cue", 688 | "soundclass": "1stPersonFire2ndWeaponsAutoMix" 689 | }, 690 | { 691 | "weapon": "FlameThrowerFireTail_Cue", 692 | "soundclass": "1stPersonWeaponsTail" 693 | }, 694 | { 695 | "weapon": "FlameThrowerReloadA_1_Cue", 696 | "soundclass": "1stAnd3rdSharedWeapons" 697 | }, 698 | { 699 | "weapon": "FlameThrowerReloadB_1_Cue", 700 | "soundclass": "1stAnd3rdSharedWeapons" 701 | }, 702 | { 703 | "weapon": "FlameThrowerReloadC_1_Cue", 704 | "soundclass": "1stAnd3rdSharedWeapons" 705 | }, 706 | { 707 | "weapon": "FlameThrowerReloadD_1_Cue", 708 | "soundclass": "1stAnd3rdSharedWeapons" 709 | }, 710 | { 711 | "weapon": "FlameThrowExplosion_Cue", 712 | "soundclass": "ExplosionsCoreAutoMix" 713 | }, 714 | { 715 | "weapon": "FlareGun_Fire_Cue", 716 | "soundclass": "1stPersonFire1stWeaponsSingle" 717 | }, 718 | { 719 | "weapon": "FlareGun_Reload_Cue", 720 | "soundclass": "1stAnd3rdSharedWeapons" 721 | }, 722 | { 723 | "weapon": "GrenadeLauncherFire_Cue", 724 | "soundclass": "1stPersonFire1stWeaponsSingle" 725 | }, 726 | { 727 | "weapon": "GrenadeLauncher_Explosion_Cue", 728 | "soundclass": "3rdEnemiesScream" 729 | }, 730 | { 731 | "weapon": "GrenadeLauncher_MiniNukeExplosion_Cue", 732 | "soundclass": "ExplosionsCoreAutoMix" 733 | }, 734 | { 735 | "weapon": "PerkEquip_Cue", 736 | "soundclass": "UI" 737 | }, 738 | { 739 | "weapon": "LineCutterFirePostA_Cue", 740 | "soundclass": "1stAnd3rdSharedWeapons" 741 | }, 742 | { 743 | "weapon": "LineCutterFire_Cue", 744 | "soundclass": "1stPersonFire1stWeaponsSingle" 745 | }, 746 | { 747 | "weapon": "LineCutterGunsling_Cue", 748 | "soundclass": "1stAnd3rdSharedWeapons" 749 | }, 750 | { 751 | "weapon": "LineCutterReloadA_Cue", 752 | "soundclass": "1stAnd3rdSharedWeapons" 753 | }, 754 | { 755 | "weapon": "LineCutterReloadB_Cue", 756 | "soundclass": "1stAnd3rdSharedWeapons" 757 | }, 758 | { 759 | "weapon": "LineCutter_Reload_Stereo_02_Cue", 760 | "soundclass": "1stAnd3rdSharedWeapons" 761 | }, 762 | { 763 | "weapon": "MiniGunFireCore_Cue", 764 | "soundclass": "1stPersonFire1stWeaponsLoop" 765 | }, 766 | { 767 | "weapon": "MiniGunFireTail_Cue", 768 | "soundclass": "1stPersonWeaponsTail" 769 | }, 770 | { 771 | "weapon": "MiniGunJammed_Cue", 772 | "soundclass": "1stAnd3rdSharedWeapons" 773 | }, 774 | { 775 | "weapon": "MiniGunOverheatElementA_Cue", 776 | "soundclass": "1stAnd3rdSharedWeapons" 777 | }, 778 | { 779 | "weapon": "MiniGunOverheatElementB_Cue", 780 | "soundclass": "1stAnd3rdSharedWeapons" 781 | }, 782 | { 783 | "weapon": "MiniGunOverheatGyro_Cue", 784 | "soundclass": "1stAnd3rdSharedWeapons" 785 | }, 786 | { 787 | "weapon": "MiniGunOverHeatPitch_Cue", 788 | "soundclass": "1stPersonFire1stWeaponsLoop" 789 | }, 790 | { 791 | "weapon": "MiniGunOverheatVentA_Cue", 792 | "soundclass": "1stAnd3rdSharedWeapons" 793 | }, 794 | { 795 | "weapon": "MiniGunOverheatVentB_Cue", 796 | "soundclass": "1stAnd3rdSharedWeapons" 797 | }, 798 | { 799 | "weapon": "MiniGunRoll_Cue", 800 | "soundclass": "3rdpersonWeapons" 801 | }, 802 | { 803 | "weapon": "CreatePlatform_Cue", 804 | "soundclass": "1stAnd3rdSharedWeapons" 805 | }, 806 | { 807 | "weapon": "PlatformGun_Fire_Cue", 808 | "soundclass": "1stPersonFire1stWeaponsSingle" 809 | }, 810 | { 811 | "weapon": "PlatformGun_Reload_Stereo_Cue", 812 | "soundclass": "1stAnd3rdSharedWeapons" 813 | }, 814 | { 815 | "weapon": "FP_RevolverFire_Cue", 816 | "soundclass": "1stPersonFire1stWeaponsSingle" 817 | }, 818 | { 819 | "weapon": "Revolver_Reload_03_Cue", 820 | "soundclass": "1stAnd3rdSharedWeapons" 821 | }, 822 | { 823 | "weapon": "RevolverReload1_Cue", 824 | "soundclass": "1stAnd3rdSharedWeapons" 825 | }, 826 | { 827 | "weapon": "SawedOffShotgun_Fire_Cue", 828 | "soundclass": "1stPersonFire1stWeaponsSingle" 829 | }, 830 | { 831 | "weapon": "CombatShotgunV2A_Cue", 832 | "soundclass": "1stAnd3rdSharedWeapons" 833 | }, 834 | { 835 | "weapon": "CombatShotgunV2B_Cue", 836 | "soundclass": "1stAnd3rdSharedWeapons" 837 | }, 838 | { 839 | "weapon": "CombatShotgunV2C_Cue", 840 | "soundclass": "1stAnd3rdSharedWeapons" 841 | }, 842 | { 843 | "weapon": "SentryGunFireCore_Cue", 844 | "soundclass": "HelperWeapons" 845 | }, 846 | { 847 | "weapon": "SentryGunHeavyFireCore_Cue1", 848 | "soundclass": "HelperWeapons" 849 | }, 850 | { 851 | "weapon": "SMGFireCore_Cue", 852 | "soundclass": "1stPersonFire2ndWeaponsAutoMix" 853 | }, 854 | { 855 | "weapon": "SMGFireTail_Cue", 856 | "soundclass": "1stPersonWeaponsTail" 857 | }, 858 | { 859 | "weapon": "SMG_Reload1_Cue", 860 | "soundclass": "1stAnd3rdSharedWeapons" 861 | }, 862 | { 863 | "weapon": "SMG_Reload3_Cue", 864 | "soundclass": "1stAnd3rdSharedWeapons" 865 | }, 866 | { 867 | "weapon": "SMG_Reload5_Cue", 868 | "soundclass": "1stAnd3rdSharedWeapons" 869 | }, 870 | { 871 | "weapon": "ZipLineGunFire_Cue", 872 | "soundclass": "1stPersonFire1stWeaponsSingle" 873 | } 874 | ] -------------------------------------------------------------------------------- /template generator.py: -------------------------------------------------------------------------------- 1 | import os 2 | import subprocess 3 | import re 4 | import datetime 5 | import shutil 6 | from uuid import uuid4 7 | 8 | EDITOR_EXE= r"F:/UNEPIC GAMES/UE_4.27/Engine/Binaries/Win64/UE4Editor-Cmd.exe" 9 | UBT_EXE = r"F:/UNEPIC GAMES/UE_4.27/Engine/Binaries/DotNET/UnrealBuildTool.exe" 10 | UAT_EXE = r"F:/UNEPIC GAMES/UE_4.27/Engine/Build/BatchFiles/RunUAT.bat" 11 | PROJECT_GEN_UPROJECT = r"F:/DRG Modding/Project Generator/UE4GameProjectGenerator4.27/GameProjectGenerator.uproject" 12 | HEADER_DUMP = r"C:/Program Files (x86)/Steam/steamapps/common/Deep Rock Galactic/FSD/Binaries/Win64/UHTHeaderDump" 13 | PAK_FILE = r"C:/Program Files (x86)/Steam/steamapps/common/Deep Rock Galactic/FSD/Content/Paks/FSD-WindowsNoEditor.pak" 14 | UNPACKED_FILES = r"F:/DRG Modding/DRGPacker" 15 | PROJECT_FILE = r"F:/DRG Modding/DRGPacker/_unpacked/FSD/FSD.uproject" 16 | PLUGIN_MANIFEST = r"F:/DRG Modding/DRGPacker/_unpacked/FSD/Plugins/FSD.upluginmanifest" 17 | VERSION_CONFIG = r"F:/DRG Modding/DRGPacker/_unpacked/FSD/Config/DefaultGame.ini" 18 | OUTPUT_DIR_START = r"F:/DRG Modding/Project Generator" 19 | GITHUB_REPO = r"F:/Github Projects/Other/DRG Modding Org/FSD-Template" 20 | TEST_COOK_OUTPUT = r"F:/DRG Modding/Project Generator/Output" 21 | 22 | def check_drive_space(): 23 | _, _, free = shutil.disk_usage(os.path.splitdrive(OUTPUT_DIR_START)[0]) 24 | free = free // (2 ** 30) 25 | if free < 25: 26 | print("Not enough space on drive to run generator - needs at least 25GB") 27 | return False 28 | return True 29 | 30 | def get_project_name(): 31 | uuid = str(uuid4()).replace("-", "") 32 | uuid = re.sub(r"\d", "", uuid) 33 | return uuid[:12] 34 | 35 | def unpack_files(): 36 | print("============================================================") 37 | print(" UNPACKING FILES ") 38 | print("============================================================") 39 | print("Deleting old unpacked files...") 40 | os.system( 41 | "rmdir " + 42 | '"' + 43 | os.path.join(UNPACKED_FILES, "_unpacked") + 44 | '"' + 45 | " /S /Q" 46 | ) 47 | 48 | print("Unpacking files...") 49 | subprocess.run([ 50 | os.path.join(UNPACKED_FILES, "repak.exe"), 51 | "unpack", 52 | os.path.join(PAK_FILE), 53 | os.path.join(UNPACKED_FILES, "_unpacked") 54 | ]) 55 | 56 | def get_game_version(): 57 | print("============================================================") 58 | print(" GET GAME VERSION ") 59 | print("============================================================") 60 | with open(VERSION_CONFIG, "r") as f: 61 | for line in f: 62 | if line.startswith("ProjectVersion="): 63 | print("Game version is v" + line.split("=")[1].strip()) 64 | return "v" + line.split("=")[1].strip() 65 | 66 | def run_project_gen(name): 67 | print("============================================================") 68 | print(" RUNNING PROJECT GENERATOR ") 69 | print("============================================================") 70 | os.mkdir(os.path.join(OUTPUT_DIR_START, name)) 71 | subprocess.run([ 72 | EDITOR_EXE, 73 | PROJECT_GEN_UPROJECT, 74 | "-run=ProjectGenerator", 75 | "-HeaderRoot=" + HEADER_DUMP, 76 | "-ProjectFile=" + PROJECT_FILE, 77 | "-PluginManifest=" + PLUGIN_MANIFEST, 78 | "-OutputDir=" + os.path.join(OUTPUT_DIR_START, name), 79 | "-stdout", 80 | "-unattended", 81 | "-NoLogTimes" 82 | ]) 83 | 84 | def copy_modio_sources(name): 85 | print("============================================================") 86 | print(" COPYING MOD.IO SOURCE CODE ") 87 | print("============================================================") 88 | # Delete the folder called Modio inside of OutputDir/Plugins 89 | os.system( 90 | "rmdir " + 91 | '"' + 92 | os.path.join(OUTPUT_DIR_START, name, "Plugins", "Modio") + 93 | '"' + 94 | " /S /Q" 95 | ) 96 | 97 | # Copy the new sources from Modio Source to template/Plugins/Modio 98 | subprocess.run([ 99 | "xcopy", 100 | os.path.join(OUTPUT_DIR_START, "Modio"), 101 | os.path.join(OUTPUT_DIR_START, name, "Plugins", "Modio"), 102 | "/E", 103 | "/I", 104 | "/Y" 105 | ]) 106 | 107 | def copy_config_files(name): 108 | print("============================================================") 109 | print(" COPYING CONFIG FILES ") 110 | print("============================================================") 111 | shutil.copytree(os.path.join(OUTPUT_DIR_START, "Config"), os.path.join(OUTPUT_DIR_START, name, "Config")) 112 | 113 | def change_lines(file_name, line_num, text, is_replace, is_regex = False, match_group = ""): 114 | if not os.path.exists(file_name): return 115 | lines = open(file_name, 'r').readlines() 116 | 117 | if is_regex: 118 | for i, line in enumerate(lines): 119 | if re.search(text, line): 120 | lines[i] = re.sub(text, match_group, line) 121 | print("Replaced line " + str(i) + " with " + match_group + " in " + file_name) 122 | else: 123 | if is_replace: 124 | line_num -= 1 125 | lines[line_num] = text 126 | else: lines.insert(line_num, text) 127 | print("Replaced line " + str(line_num) + " with " + text + " in " + file_name) 128 | 129 | out = open(file_name, 'w') 130 | out.writelines(lines) 131 | out.close() 132 | 133 | def modify_project_file(proj_name, file_name, line_number, is_replace, text, accessor = "Public", module = "FSD", is_regex = False, match_group = ""): 134 | open_module = os.path.join(OUTPUT_DIR_START, proj_name, "Source", module) 135 | if is_regex: 136 | change_lines(file_name, line_number, text, is_replace, is_regex, match_group) 137 | else: 138 | change_lines(os.path.join(open_module, accessor, file_name), line_number, text, is_replace) 139 | 140 | def run_rules(name): 141 | print("============================================================") 142 | print(" RUNNING THROUGH FIX RULES ") 143 | print("============================================================") 144 | 145 | # Re-add GameplayTasks and OnlineSubsystem to FSD.Build.cs 146 | change_lines(os.path.join(OUTPUT_DIR_START, name, "Source", "FSD", "FSD.Build.cs"), 20, '\t\t\t"GameplayTasks",\n', False) 147 | change_lines(os.path.join(OUTPUT_DIR_START, name, "Source", "FSD", "FSD.Build.cs"), 25, '\t\t\t"OnlineSubsystem",\n', False) 148 | 149 | # CharacterSightSensor.h 150 | modify_project_file(name, "CharacterSightSensor.h", 7, False, "DECLARE_DYNAMIC_MULTICAST_DELEGATE(FCharacterSightSensorDelegate);\n") 151 | modify_project_file(name, "CharacterSightSensor.h", 8, False, "\n") 152 | 153 | # FSDProjectileMovementComponent.h 154 | modify_project_file(name, "FSDProjectileMovementComponent.h", 8, False, "DECLARE_DYNAMIC_MULTICAST_DELEGATE(FOnProjectilePenetrateDelegate);\n") 155 | modify_project_file(name, "FSDProjectileMovementComponent.h", 9, False, "DECLARE_DYNAMIC_MULTICAST_DELEGATE(FOnProjectileOutOfPropulsion);\n") 156 | modify_project_file(name, "FSDProjectileMovementComponent.h", 10, False, "\n") 157 | 158 | # SubHealthComponent.h, line 60 159 | modify_project_file(name, "SubHealthComponent.h", 60, True, "\t//UFUNCTION(BlueprintCallable)\n") 160 | 161 | # HealthComponentBase.h, line 118 162 | modify_project_file(name, "HealthComponentBase.h", 118, True, "\t//UFUNCTION(BlueprintCallable)\n") 163 | 164 | # HealthComponent.h, line 102 165 | modify_project_file(name, "HealthComponent.h", 102, True, "\t//UFUNCTION(BlueprintCallable)\n") 166 | 167 | # EnemyHealthComponent.h, line 40 168 | modify_project_file(name, "EnemyHealthComponent.h", 40, True, "\t//UFUNCTION(BlueprintCallable)\n") 169 | 170 | # FriendlyHealthComponent.h, line 34 171 | modify_project_file(name, "FriendlyHealthComponent.h", 34, True, "\t//UFUNCTION(BlueprintCallable)\n") 172 | 173 | # GameFunctionLibrary.cpp, line 26 174 | modify_project_file(name, "GameFunctionLibrary.cpp", 26, True, '\treturn true;\n', "Private") 175 | 176 | # Fix Collision component setting in FriendlyParasite.cpp, lines 6 and 7 177 | modify_project_file(name, "FriendlyParasite.cpp", 6, True, "AFriendlyParasite::AFriendlyParasite(const FObjectInitializer& ObjectInitializer) : Super(ObjectInitializer) {\n") 178 | modify_project_file(name, "FriendlyParasite.cpp", 7, True, "\tthis->Collision = CreateDefaultSubobject(TEXT(\"Collision\"));\n") 179 | 180 | # Search every file in both modules and accessors for the following regex string: (const) ((\w+)\*\&) and replace it with $2 181 | # UE does not like const reference pointers in UFUNCTIONs 182 | for root, _, files in os.walk(os.path.join(OUTPUT_DIR_START, name, "Source")): 183 | for file in files: 184 | if file.endswith(".h") or file.endswith(".cpp"): 185 | modify_project_file(name, os.path.join(root, file), 0, False, "(const) ((\w+)\*\&)", "", "", True, r"\2") 186 | 187 | def generate_build_files(name): 188 | print("============================================================") 189 | print(" GENERATING BUILD FILES ") 190 | print("============================================================") 191 | date = datetime.datetime.now().strftime("%Y.%m.%d-%H.%M.%S") 192 | subprocess.run([ 193 | UBT_EXE, 194 | "-projectfiles", 195 | "-project=" + os.path.join(OUTPUT_DIR_START, name, "FSD.uproject"), 196 | "-game", 197 | "-rocket", 198 | "-progress", 199 | "-log=" + os.path.join(OUTPUT_DIR_START, name, "Saved/Logs/UnrealVersionSelector-" + str(date) + ".log") 200 | ]) 201 | 202 | def compile_project(name): 203 | print("============================================================") 204 | print(" COMPILING PROJECT ") 205 | print("============================================================") 206 | subprocess.run([ 207 | UBT_EXE, 208 | "Development", 209 | "Win64", 210 | "-Project=" + os.path.join(OUTPUT_DIR_START, name, "FSD.uproject"), 211 | "-TargetType=Editor", 212 | "-Progress", 213 | "-NoEngineChanges", 214 | "-NoHotReloadFromIDE" 215 | ]) 216 | 217 | def test_cook_project(name): 218 | print("============================================================") 219 | print(" COOKING PROJECT ") 220 | print("============================================================") 221 | 222 | subprocess.run([ 223 | UAT_EXE, 224 | "BuildCookRun", 225 | "-nocompileeditor", 226 | "-installed", 227 | "-nop4", 228 | "-project=" + os.path.join(OUTPUT_DIR_START, name, "FSD.uproject"), 229 | "-cook", 230 | "-stage", 231 | "-archive", 232 | "-archivedirectory=" + TEST_COOK_OUTPUT, 233 | "-package", 234 | "-ue4exe=" + EDITOR_EXE, 235 | "-ddc=InstalledDerivedDataBackendGraph", 236 | "-prereqs", 237 | "-nodebuginfo", 238 | "-targetplatform=Win64", 239 | "-build", 240 | "-target=FSDGame", 241 | "-clientconfig=Shipping", 242 | "-utf8output", 243 | "-unattended" 244 | ]) 245 | 246 | def copy_template_to_repo(name): 247 | print("============================================================") 248 | print(" COPYING TEMPLATE TO GITHUB REPO ") 249 | print("============================================================") 250 | # We are deleting the files first otherwise we will keep old files that the devs deleted 251 | files_to_delete = ["Binaries", "Plugins", "Source", "Saved", "Intermediate", "Config", "FSD.sln", "FSD.uproject"] 252 | for file in files_to_delete: 253 | if os.path.exists(os.path.join(GITHUB_REPO, file)): 254 | if os.path.isfile(os.path.join(GITHUB_REPO, file)): os.remove(os.path.join(GITHUB_REPO, file)) 255 | else: shutil.rmtree(os.path.join(GITHUB_REPO, file)) 256 | print("Deleted " + file) 257 | 258 | files_to_copy = ["Binaries", "Plugins", "Source", "Config", "FSD.sln", "FSD.uproject"] 259 | for file in files_to_copy: 260 | file_path = os.path.join(OUTPUT_DIR_START, name, file) 261 | if os.path.exists(file_path): 262 | if os.path.isfile(file_path): shutil.copyfile(file_path, os.path.join(GITHUB_REPO, file)) 263 | else: shutil.copytree(file_path, os.path.join(GITHUB_REPO, file)) 264 | print("Copied " + file) 265 | 266 | def check_tag_name(tag): 267 | print("============================================================") 268 | print(" CHECK TAG NAME ") 269 | print("============================================================") 270 | # If the tag is the same as the latest tag, then add -patch1 to the tag 271 | # If the tag is the same as the latest tag + -patch1, then increment the number 272 | latest_tag = subprocess.run(["git", "describe", "--tags", "--abbrev=0"], cwd=GITHUB_REPO, stdout=subprocess.PIPE).stdout.decode("utf-8").strip() 273 | if latest_tag == tag: tag += "-patch1" 274 | elif latest_tag == tag + "-patch1": tag = tag + "-patch" + str(int(latest_tag.split("-patch")[1]) + 1) 275 | print(tag) 276 | return tag 277 | 278 | def git_commit(commit_message, commit_tag, tag_message): 279 | print("============================================================") 280 | print(" GIT COMMIT ") 281 | print("============================================================") 282 | subprocess.run(["git", "add", "."], cwd=GITHUB_REPO) 283 | subprocess.run(["git", "commit", "-m", commit_message], cwd=GITHUB_REPO) 284 | subprocess.run(["git", "tag", "-a", commit_tag, "HEAD", "-m", tag_message], cwd=GITHUB_REPO) 285 | 286 | def git_diff(): 287 | print("============================================================") 288 | print(" GIT DIFF ") 289 | print("============================================================") 290 | subprocess.run(["git", "diff", "HEAD~1", "HEAD", "-U0", "--", ":!*.dll", ":!Binaries/"], cwd=GITHUB_REPO, stdout=open(os.path.join(GITHUB_REPO, "changes.diff"), "w")) 291 | print("Changes saved to changes.diff") 292 | 293 | def git_push(commit_tag): 294 | print("============================================================") 295 | print(" GIT PUSH ") 296 | print("============================================================") 297 | subprocess.run(["git", "push", "origin"], cwd=GITHUB_REPO) 298 | subprocess.run(["git", "push", "origin", commit_tag], cwd=GITHUB_REPO) 299 | 300 | def wait(stage): 301 | input("Press enter to continue to next stage: [" + stage + "] ") 302 | 303 | def main(): 304 | if not check_drive_space(): return 305 | name = get_project_name() 306 | print("Project name: " + name) 307 | 308 | if input("Refresh unpacked files? [y/n] ") == 'y': unpack_files() 309 | 310 | run_project_gen(name) 311 | copy_modio_sources(name) 312 | copy_config_files(name) 313 | run_rules(name) 314 | 315 | wait("generate build files") 316 | generate_build_files(name) 317 | compile_project(name) 318 | 319 | wait("cook project") 320 | test_cook_project(name) 321 | 322 | wait("copy template to repo") 323 | copy_template_to_repo(name) 324 | 325 | version = get_game_version() 326 | version = check_tag_name(version) 327 | tag_message = input("Primary game version (e.g. U37P11): ") 328 | semver = input("PATCH, MINOR or MAJOR version?").upper() + " - " + tag_message 329 | commit_message = semver + " - " + input("Commit message (e.g. UE4SS update): ") 330 | 331 | wait("git commit - REMEMBER TO BE LOGGED INTO THE RIGHT GITHUB ACCOUNT ON GITKRAKEN YOU ABSOLUTE BABOON") 332 | git_commit(commit_message, version, tag_message) 333 | 334 | wait("git push") 335 | git_push(version) 336 | 337 | def ue4ss_test(): # just for testing if ue4ss changes still allows the project to compile 338 | if not check_drive_space(): return 339 | name = get_project_name() 340 | run_project_gen(name) 341 | copy_modio_sources(name) 342 | run_rules(name) 343 | generate_build_files(name) 344 | compile_project(name) 345 | 346 | if __name__ == "__main__": 347 | main() 348 | #ue4ss_test() --------------------------------------------------------------------------------