🌞 Victory Plugin ~ 's Extra Blueprint Nodes for UE5, No C++ Required!

Hey guys, getting the following error attempting to package a blueprint project, failing packaging:

ERROR: Missing precompiled manifest for ‘VictoryBPLibrary’. This module was most likely not flagged for being included in a precompiled build - set ‘PrecompileForTargets = PrecompileTargetsType.Any;’ in VictoryBPLibrary.build.cs to override.
PackagingResults: Error: Missing precompiled manifest for ‘VictoryBPLibrary’. This module was most likely not flagged for being included in a precompiled build - set ‘PrecompileForTargets = PrecompileTargetsType.Any;’ in VictoryBPLibrary.build.cs to override.

edit: Hey future explorers. I literally just deleted the old addon and threw the new one in. Like, its the exact same one, but now it works lol wtf I dont know. Try that. Possibly, you have it in the wrong location also? I had it with my marketplace ones, and I moved its replacement a directory up. So maybe that too. Dunno good luck buddy, hit the heart so i know you read this, useful or not!

I will be checking this out, and other recent posts soon, sorry for delay!

:heart:

1 Like

:zap: :sparkling_heart: :zap: Merry Christmas Everyone! :zap: :sparkling_heart: :zap:

I hope you all have a Joy-filled Christmas!

:heart:

2 Likes

Hi ,
Just stumbled onto this thread and I am really impressed by all the work you do! I was wondering if I can access the “AI move to with Filter node” in UE5.1, because I want my AIs to avoid different areas like the ones in your original post from 2015. Is this a deprecated feature or something that will return?

I have a question. I am developing on a Mac and have installed it as described. Also it is recognized in the settings. However, when I search for the BP it finds nothing. Do I have to do anything else or unfortunately it does not work on the Mac?

First of all, thank you for providing this plug-in.
I am a Chinese user. I use translation software for this content. I hope you can understand it.
I downloaded and used VictoryPlugin. I encountered some problems with Color Picker.
These problems occur after packaging, and the editor works normally.
Problem 1: The color straw cannot be displayed;
Problem 2: The saved color is lost after restarting the program;
Problem 3: In the editor, the Color Picker is displayed in Chinese, while it is displayed in English after packaging.
I can’t find the corresponding help in the Chinese community. Can you help me solve the problem?

Amazing looking plugin - thanks for sharing.

I came for the IsWorld (or whatever it called, I’ll learn), or IsEditor (is what I was wanting, but probably can figure it out). And come away with += and -= probably will use a lot.

Edit: Figured it out - woot!

I solved problem 3,The problem 1 is half solved.
I used the hardware cursor, and the eyedropper finally displayed,But, the position pointed by the mouse is not consistent with the position where the color is actually read, there is a certain deviation.

Hello !
Thank you for all your work to the community !! <3

tldr : @, can you add the “Array_Sort” from 4.27 version inside the 5.1 please ?
And is the comment of the UFUNCTION for the AppendArray function is intentional ?

I’m migrating my 4.27 project to Unreal 5.1. We use a lot of BP (+60% of our project of 4+ years).
And we of course also use a lot of Victory BP library functions !

I had a lot of trouble to not crash on BP opening (compilation) inside 5.1.
It is now fixed, but I post this on this topic, It might help someone else one day.

All these crashs were due to BP functions from VictoryBPLibrary not present anymore in the 5.1 version.
Why crash ? I don’t know. I have a lot of BP functions from other modules not found in 5.1, and they don’t create a crash. Setting the plugin to "Enabled:“false” in the .uproject didn’t help.

Thanks to VS Crash call stack reporter in debug editor mode, I could catch the node causing issue by searching inside each value inside call stack functions. It took me time to find a usefull variable like this one :

For this error, the UFUNCTION was commented in the VictoryBPLibrary.h, so BP was unable to access it. Uncommented it fixed the issue. I guess it’s a mistake ?
I also had error with Array_Sort function not existing anymore. Removing the node in 4.27 version (and reimport the BP in 5.1) fixed the issue. (but we now need to use another sort function)

With these fixed the 5.1 project could open (compile) BP of our project !
And also remember if you have a crash in BP, you can find the responsible BP/Function/Node inside variables in functions listed in the VS crash reporter. It can take time, but in my experience it’s always rewarding !

GL for your migration to Unreal 5 !

1 Like

Not sure if anyone else ran into this issue as well but it seems in 5.1 when running Create Proc with the Event Delegate it would spit warnings about not being able to find world for object (passed into UEngine::GetFromWorldContextObject()).

The same blueprint setup in a editor utility widget works just fine and the delegate catches the process completion correctly as well.

Inside the Asset Action Utility, it would still run the process but it would never hit the delegate callback.

My Victory BP Node uses the BP feature of obtaining a World Context from the parent BP, which in a Character BP or, as you say, in Editor Utility Widget seems to be fine.

It sounds like Asset Action Utility doesn’t have a valid World Context to offer to my node,

So you can instead pass one in yourself, manually.

Give your node any Actor, or the Game State, and use that as the World Context pin instead of using the automatic “World Context” variable.

Then everything will work great!

:heart:

PS: You can also wrap my node in a Blueprint Library, and use World Context var, and then call the BP Libary wrapper version,

Then Your BP Library wrapper will provide a valid World Context for my Node.

:heart:

1 Like

That’s great advice to the Community, thanks for sharing!

The Array Sort node was provided by a community member, @Kris , and I think there were some issues with changes to the Engine that prevented further development.

If anyone in community has time and would like to make Array Sort official in 5+, please let me know!

I have to make a 5+ Victory Git Repo…

:racehorse: :dash:adds to TO-DO list :racehorse: :dash:

:heart:

2 Likes

Node Requests

I will work on this in near future!

:heart:

Try using the Default Size Scaling / Render Scaling for the Color Picker in Your UMG Widget

Make sure there is no change in the size of your Color Picker at all, inside your UI menu, the RenderScale variable, or manually re-sized color picker could be source of this deviation.

Good luck!

:zap::zap::zap: 勝利屬於你 :zap::zap: :zap:

:heart:

:zap: Save Any Dynamic Mesh as a New Static Mesh Asset in Editor Builds :zap:

In this complimentary C++ → BP Library Plugin

(17 min video showing you exactly how to use the new content included with Victory Plugin!)


(Dynamic Mesh Actor + Spline Component + Victory Plugin = New Static Mesh Asset!)

Dear Community,

I’ve added a new node to Victory Plugin so you can easily save out as a new Static Mesh Asset, any Dynamic Mesh you create using any of your own custom logic in constructor script to make really fancy shapes!

Yes!!!

So you really can :star2: make your own modelling tools :star2: inside of Unreal Engine, using BP constructor script, and then make new Static Mesh Assets that will ship with your game!

Create Your Own Static Mesh Asset Modeling Tools!
EX: Dynamic Mesh + Spline Component Modeling Tool

I show you an example of what I mean in the video, creating a Spline Mesh Modeling Tool in BP, a BP which you can find in the Content Folder of the Victory Plugin, along with the example assets!

Please note this BP node is Editor Only, I explain more in the video!

:zap: The Relevant C++ Code :zap:

Because I let you choose any asset path with your game’s content folder for your new Static Mesh Asset, create the folder structure for you, handle the case of if the asset path is already in use, there is some extra file handling code, but the rest is the utilization of the new MeshModelingToolset plugin that exists in UE5!

:heart: Thank You Epic Devs! :heart:

//~~~ CreateStaticMeshAssetFromDynamicMesh ~~~
#include "GeometryFramework/Public/Components/DynamicMeshComponent.h"

//Runtime
//Engine\Plugins\Runtime\MeshModelingToolset\Source\ModelingComponents\Public\ModelingObjectsCreationAPI.h
#include "ModelingObjectsCreationAPI.h"
 
//Editor
#if WITH_EDITOR
	//"ModelingComponentsEditorOnly" in build.cs ♥ 
	#include "AssetUtils/CreateStaticMeshUtil.h"
#endif
//~~~~ End CreateStaticMeshAssetFromDynamicMesh ~~~

UStaticMesh* UVictoryBPFunctionLibrary::CreateStaticMeshAssetFromDynamicMesh( 
	FString ContentFolderPath,
	UDynamicMeshComponent* DynamicMeshComp, 
	FString& Status, 
	FString& NewAssetFilePath, 
	bool& Success
){
	NewAssetFilePath = "";
	
	#if WITH_EDITOR
		
	//Comp?
	if(!DynamicMeshComp || !DynamicMeshComp->GetDynamicMesh())
	{
		Status = "No valid Dynamic Mesh Component was supplied!";
		Success = false;
		return nullptr;
	}
	
	//No Triangles?
	if(DynamicMeshComp->GetDynamicMesh()->IsEmpty())
	{
		Status = "Dynamic Mesh has no triangles!";
		Success = false;
		return nullptr;
	}
	
	//Make sure to remove extension if user added it ♥ 
	
	//File without any extension
	ContentFolderPath.ReplaceInline(TEXT(".uasset"),TEXT(""));
	  
	//~~~ Create possibly numbered new filename, if supplied exists! ♥ 
	FString FinalRelativePath = "";
	bool FolderTreeCreated = UVictoryBPFunctionLibrary::GenerateUniqueContentRelativeFileName(ContentFolderPath + ".uasset",FinalRelativePath,NewAssetFilePath);
	  
	if(!FolderTreeCreated)
	{
		Status = "Could not create the specified directory tree";
		Success = false;
		return false;
	}
	
	//Remove ext before sending to AssetUtils
	//// Path is now Relative with no extension, possibly with 1,2,3 added for each create event in editor! <3 
	FinalRelativePath.ReplaceInline(TEXT(".uasset"),TEXT(""));
	
	//~~~ End of file path input handling ♥  ~~~
	
	//Create Mesh Base Params
	FCreateMeshObjectParams CreateMeshParams;
	
	CreateMeshParams.BaseName 		= FinalRelativePath;
	
	//~~~ Materials ~~~
	DynamicMeshComp->ValidateMaterialSlots();
	
	for(int32 v = 0; v < DynamicMeshComp->GetNumMaterials() ; v++)
	{
		CreateMeshParams.Materials.Add(DynamicMeshComp->GetMaterial(v));
	}
	 
	//Set from FDynamicMesh3 (the actual mesh herself, not from a MeshDescription)
	CreateMeshParams.SetMesh(DynamicMeshComp->GetMesh());
	
	//Ensure Set to DynamicMesh
	CreateMeshParams.MeshType = ECreateMeshObjectSourceMeshType::DynamicMesh;
	
	//~~~
	//~~~
	//~~~
	
	//~~~~~~~~~~~~~~~~~
	// Code from UE_5.0\Engine\Plugins\Runtime\MeshModelingToolset\Source\ModelingComponentsEditorOnly\PublicEditorModelingObjectsCreationAPI.cpp
	
	//Static Mesh!
	//CreateMeshObjectResult = EditorCreateMeshAPI->CreateStaticMeshAsset(CreateMeshParams);
	
	//Static Asset Options
	UE::AssetUtils::FStaticMeshAssetOptions AssetOptions;
	AssetOptions.NewAssetPath = "/Game/" + CreateMeshParams.BaseName;
	 
	//Ensure no // 
	FPaths::RemoveDuplicateSlashes(AssetOptions.NewAssetPath);
	 
	AssetOptions.NumSourceModels = 1;
	AssetOptions.NumMaterialSlots = CreateMeshParams.Materials.Num();
	
	//Got rid of FilterMaterials part <3 
	AssetOptions.AssetMaterials = (CreateMeshParams.AssetMaterials.Num() == AssetOptions.NumMaterialSlots) 
		? CreateMeshParams.AssetMaterials 
		: CreateMeshParams.Materials;

	AssetOptions.bEnableRecomputeNormals 	= CreateMeshParams.bEnableRecomputeNormals;
	AssetOptions.bEnableRecomputeTangents 	= CreateMeshParams.bEnableRecomputeTangents;
	AssetOptions.bGenerateNaniteEnabledMesh = CreateMeshParams.bEnableNanite;
	AssetOptions.NaniteProxyTrianglePercent = CreateMeshParams.NaniteProxyTrianglePercent;

	AssetOptions.bCreatePhysicsBody 		= CreateMeshParams.bEnableCollision;
	AssetOptions.CollisionType 				= CreateMeshParams.CollisionMode;

	//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
	//Dynamic Mesh! ♥ 
	FDynamicMesh3* DynamicMesh = &CreateMeshParams.DynamicMesh.GetValue();
	AssetOptions.SourceMeshes.DynamicMeshes.Add(DynamicMesh);
	//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
	
	//Static Mesh Result
	UE::AssetUtils::FStaticMeshResults ResultData;
	 
	//==========
	//CREATE!!!
	UE::AssetUtils::ECreateStaticMeshResult AssetResult = UE::AssetUtils::CreateStaticMeshAsset(AssetOptions, ResultData);
	//==========
 
	if (AssetResult != UE::AssetUtils::ECreateStaticMeshResult::Ok)
	{
		Status = "UE::AssetUtils::ECreateStaticMeshResult is ECreateModelingObjectResult::Failed_AssetCreationFailed";
		Success = false;
		return false;
	}
  
	// End of code from PublicEditorModelingObjectsCreationAPI.cpp
	//~~~~~~~~~~~~~~~~~
	
	Status = "Victory!";
	Success = true;
	return ResultData.StaticMesh;
	#endif
	
	Status = "This node is for Editor Builds only, but does create static mesh assets that can ship with your packaged game! ♥ ";
	Success = false;
	return nullptr;
}


bool UVictoryBPFunctionLibrary::GenerateUniqueContentRelativeFileName(FString ContentRelativeFilePath, FString& ContentRelativeNewFileName, FString& AbsolutePath, bool CreateFolderTree)
{
	//UE User-Input Assistance (inline) ♥ 
	FPaths::NormalizeFilename(ContentRelativeFilePath);
	FPaths::RemoveDuplicateSlashes(ContentRelativeFilePath);
	
	FString AbsContentPath = FPaths::ConvertRelativePathToFull(FPaths::ProjectContentDir());
	
	//Extension
	FString FileExt		=  FPaths::GetExtension(ContentRelativeFilePath, true); //include .
	
	//File without any extension
	FString AssetFile 	= FPaths::GetBaseFilename(ContentRelativeFilePath);
	
	//Everything but the file
	FString BasePath 	= FPaths::GetPath(ContentRelativeFilePath);
	
	
	if(ContentRelativeFilePath.Contains("/"))
	{	
		//Absolute Path
		BasePath = AbsContentPath + BasePath; 
		 
		if(CreateFolderTree)
		{
			//Folder?
			if(!FPlatformFileManager::Get().GetPlatformFile().CreateDirectoryTree(*BasePath))
			{ 
				//Info out to user about what was attempted
				AbsolutePath = BasePath;
				return false;
				//~~~~~~~~~~~~~~~~~~~~~~
			}
		}
	}
	
	//~~~
	// Make path with extension
	if(BasePath != "")
	{
		AbsolutePath = BasePath + "/" + AssetFile;
	}
	else
	{
		AbsolutePath = AbsContentPath + AssetFile;
	}
	 
	//Check if file exists already, increment int as needed, ♥ 
	 
	//Absolute Path + File, Still No Extension yet
	BasePath 		= AbsolutePath;
	  
	int32 FileNameInt 	= 1;
	AbsolutePath 		= BasePath + FileExt;
	while(FPlatformFileManager::Get().GetPlatformFile().FileExists( *AbsolutePath))
	{
		FileNameInt++;
		AbsolutePath = BasePath + FString::FromInt(FileNameInt) + FileExt;
	}
	
	FString Left;
	
	//Make Relative
	AbsolutePath.Split(TEXT("/Content/"),&Left,&ContentRelativeNewFileName);
	
	return true;
}

:sparkling_heart: Have Fun Creating Static Mesh Assets Using Your Own Custom Modeling Tools :sparkling_heart:

And Modeling to Your Creative Heart’s Content in the Level Viewport! :sparkling_heart:

:heart:

Geometry Script Plugin (Comes with UE5)

PS: You will want to enable this plugin for use with the new content in the Victory Plugin Content Folder:

(The content demoed in the video is zipped inside Victory Plugin Content Folder so you can make sure you have Geometry Script Plugin enabled first)

:zap::zap::zap::zap::zap::zap::zap::zap::zap::zap::zap::zap::zap::zap::zap::zap:
:zap: :zap: :zap: Download Link :zap: :zap: :zap:
:zap::zap::zap::zap::zap::zap::zap::zap::zap::zap::zap::zap::zap::zap:

PSS: You can download the Victory BP Plugin Here!

Thanks for your respons.
Waiting for your help again,
The saved color is lost after restarting the program;
I hope the saved color will still exist the next time I open the program.

1 Like

Thanks a lot!

C++ Game Startup Loading Screen

Dear Community,

I noticed there wasn’t a fully functional C++ Startup Loading Screen Module example in UE5, so I’ve created an independent plugin that you can add to any project to get a loading screen that will entertain you greatly while you are waiting for your commandline/standalone/packaged game to load!

1 Like

I want to external capture exe file to ue5 blueprint umg inside, is also use this plug-in? How to use?

1 Like

Thank you so much!.
I searched for the Victroy plugin of version ue5.0 and 5.1 for several days.Your post really helped me a lot!Besides,I saw your post showed the plugin that can get static mesh vertex positions.That’s wonderful and it just helped me for my project,but not enough, I also want to get skeletal mesh vertex position,below link is my detailed requirement.So I was wondering if you have plugin like this?Thanks again~

1 Like