Download

(39) Rama's Extra Blueprint Nodes for You as a Plugin, No C++ Required!

Thank you so much for this Plugin!

Hi Rama,
your blueprint library is fantastic.
But i have a build error when packaging project for shipping for win64.


 LINK : fatal error LNK1181: cannot open input file 'D:\Epic Games\4.8\Engine\Plugins\Editor\VictoryPlugin\Binaries\Win64\UE4-VictoryBPLibrary-Win64-Shipping.lib'

can you help me please?
Thanks in advance :slight_smile:
KDX

Of course :slight_smile:

fd61a5beb5b975c6204a88b6b4e72cb28f3e9193.jpeg

I will add that to my list :slight_smile:

That’s awesome The_Shane! Thanks for sharing!

:slight_smile:

Rama

Added to my list of things to investigate/explain further at my next opportunity :slight_smile:

Hee hee!

Are you sure you are compiling for 4.8? Because I believe RESULT_PARAM is new in 4.8.

Checkout KismetArrayLibrary.cpp in 4.7 vs 4.8 and try both ways and let me know!

Make sure you delete your intermediate and sln and suo and sdf and switch engine version to 4.8 from your .uproject.

It should then work :slight_smile:

You’re welcome!

Welcome to the forums KWS!

:slight_smile:

Rama

I will investigate exposing the EQ settings soon as I can :slight_smile:

It looks like you put my plugin at the Engine level? Engine\Plugins?

Please ensure that you include my plugin only at the project level, and let me know if that goes better!


**Summary**

Lovely to hear from you all!

:)

Rama

Thank you, dear Rama!

For advise and for your plugin!

It’s been my bad, not switched engine version for .uproject! I definitely shall sleep more :slight_smile:

You’re the best!

Hi Rama,
My first static function “TryToExecuteConsoleCommand” , maybe it can help someone

96f6b27fe0217f7de7029e6d4052db1d42d5b619.png
.h


public:
		UFUNCTION(BlueprintCallable, Category = "Static Exposed Functions")
		static bool TryToExecuteConsoleCommand(APlayerController* PC, const FString &Command, bool DebugMessage);

.cpp


bool UMyObject::TryToExecuteConsoleCommand(APlayerController* PC, const FString &Command,bool DebugMessage)
{
	if (PC != NULL)
	{
		FString CommandStr = PC->ConsoleCommand(Command, false);
		bool Test = !CommandStr.Contains("Command not recognized");
		if (DebugMessage)
		{
			GEngine->AddOnScreenDebugMessage(0, 15, Test ? FColor::Green : FColor::Red, Test ? "Command Found" : "Command Not Found");
		}
		return Test;
	}
	else
	{
		if (DebugMessage)
		{
			GEngine->AddOnScreenDebugMessage(0, 1.f,  FColor::Red, "Player Controller is not valid");
		}
	}

	return false;
}

You’re the best! <3

Woohoo! I am glad my solution worked out for you, yay!

Definitely gotta get enough sleep!

Hours spent sleeping = less hours spent debugging stuff created while half-awake!

Hee hee!

  • blushes *

:slight_smile:

Rama

Heya Rama. Been a bit since I was able to touch base (work has been keeping me rather occupied), but I was wondering if you’d had a chance to give any more thought to adding the ability to take a Texture2D reference and extract a pixel array from it? I think that would be an extremely useful extension of your existing LoadTexture2DFromFile function. Keep up the awesome work! Cheers,

J^2

Hey Rama,

I just wanted to say big THANK YOU for your vertex access blueprint nodes. They have been instrumental towards the success of my thesis defense.

Using your vertex nodes, I created a variation to Far Cry 3’s fire propagation system. My thesis is called Material Based Fire Propagation & Degradation that spreads fire based on underlying material surface. The system developed to prove the thesis is an intelligent tool that spreads fire without requiring manual scripting like spline paths etc. All the user has to do is click on an object and fire will start from there and spread based on the material properties (plastic, wood, paper etc). This tool now helps designers build pyro levels quick without having to manually plot spawning points for fire.

If there is some way to share my google drive with you, I can provide access to my thesis system (exe) and my presentation slides. That way you can see how your nodes have actually turned out.

Cheers,
CatchPhyre

Hi, has anyone tried to use the Victory plugin with the nVidia branches, I can’t make my game compile, when I include the Victory plugin. (It compiles fine, when I delete the Victory folder from Plugins in my project.)

Hiya Rama. So I’m just now getting around os using your read texture from file pixels function in earnest and I’m finding that it seems to be slowing my function down significantly. If I bypass the Get Pixel node in my function, performance triples or quadruples. Is this a known issue or is that just the nature of the beast? Is there anything I can do to optimize it? If you need details or want the project I’m working with I would be happy to send it your way. Thanks again for all the awesome work and tools you’ve provided. Cheers!

J^2

Edit: I was able to track this down to the resolution of the heightmap I was using. If I use a 512x512 image, it takes one or two seconds. If I use a 2K image, it takes 30 seconds. Which makes sense as a 512x512 image is 262,144 pixels but a 2K image is 4,194,304 pixels, i.e. a non-linear increase. That being said, is there anything that can be done to optimize the performance of this function? If not, no worries. But if so, that would be awesome since it is such a useful tool. Thank you again so much for both making it and then giving it away for free! Cheers again!

Has anyone tried using Rama’s .ini writing nodes to modify values in engine-generated ini files (like key mappings and visual settings)? Or does it only work with custom .ini variables?

Yes its a great node idea J^2 ! I look forward to working on it at my next opportunity!

Nice to hear from you!

To make it any faster I’d need multi-threading powers within the BP node, the issue is just how big the array becomes (4 million+) and the fact that I dont have an easy way to break up the work within a static function context where the user expects the output as soon as the node is executed :slight_smile:

Rama

I need to see the compile errors / output log errors that you’re getting in order to help further, I am including PhysX libraries in the plugin.

:slight_smile:

My ini file nodes specifically work with Game.ini (comes from DefaultGame.ini), so you cant modify vars in DefaultEngine / Saved/Config/[OS]/Engine.ini

I chose Game.ini simply because Engine.ini is full of lots of stuff and the intent of this node was to provide a space to make new vars of your own that are game specific.

To modify config vars you can type them into the console (or use ExecuteConsoleCommand), example:



r.PostProcessAAQuality 4


:slight_smile:

Rama

Rename / Move Most Recent Screen Shot

3ad170c1fdb5928f5f54c13a7fa4405b1e2a8d55.jpeg

Dear Community,

New node for you!

This node will move / rename the most recently taken screenshot!

So the intended work flow is

  1. Exec Console Command -> “HighResShot 2” or “shot showui”

  2. Possibly put in a short Delay node

  3. Use my new node! ScreenShots Move Rename Most Recent!


**More Power for You in BP**

Now you can specify an absolute path directory and also file name for the most recent screen shot, and it will be relocated for you!

So please note you can only do this **after** you create the image using UE4's console commands.

Bonus For You

You can specify a destination folder that does not exist yet and my node will create it for you!

This is great for if you delete your custom screen shots folder and expect my node to work anyway!

My node will!

:slight_smile:


**High Res vs Regular Screen Shots**

You can filter for High Resolution and regular screen shots independently using my node!

So if you have High Res selected, ONLY High Resolution screenshots are considered when sorting by file time.

Otherwise, if this is unchecked, I will ONLY look for regular screenshots taken with  "shot showui"

:)

Keep in Same Directory?

To keep the file in the same directory, use my new Paths node that retrieves your project’s ScreenShot directory!


**Pro Tip**

If you have a bunch of shots, you can:

1. use my node in a for loop with a break and a max count of 1000,  (or while loop if you are feeling confident)

2. Ensure that you are moving the files OUT of their current directory (otherwise for loop will run to its limit) 

3. The break condition is when my new node returns false, so just plug the false end of the branch right back into the break condition!

This will work because my node is only checking the dates of the files that are within the screenshots directory, so as you keep moving the files out, my node will keep finding the new most recent picture!

My C++ Code For You

I had to write a lot of custom File Operations code to fulfill this request, so a lot of the functions you see in this node are not stock UE4 code. :slight_smile:



bool UVictoryBPFunctionLibrary::ScreenShots_Rename_Move_Most_Recent(
	FString& OriginalFileName,
	FString NewName, 
	FString NewAbsoluteFolderPath, 
	bool HighResolution
){ 
	OriginalFileName = "None";

	**//File Name given?**
	if(NewName.Len() <= 0) return false;
	
	**//Normalize**
	FPaths::NormalizeDirectoryName(NewAbsoluteFolderPath);
	
	**//Ensure target directory exists, 
	//		_or can be created!_ <3 Rama**
	if(!VCreateDirectory(NewAbsoluteFolderPath)) return false;
	
	FString ScreenShotsDir = VictoryPaths__ScreenShotsDir();
	
	**//Find all screenshots**
	TArray<FString> Files;	  //false = not recursive, not expecting subdirectories
	bool Success = GetFiles(ScreenShotsDir, Files, false);
	
	if(!Success)
	{
		return false;
	}
	
	**//Filter**
	TArray<FString> ToRemove; //16 bytes each, more stable than ptrs though since RemoveSwap is involved
	for(FString& Each : Files)
	{
		if(HighResolution)
		{
			//remove those that dont have it
			if(Each.Left(4) != "High")
			{
				ToRemove.Add(Each);
			}
		}
		else
		{ 
			//Remove those that have it!
			if(Each.Left(4) == "High")
			{
				ToRemove.Add(Each);
			}
		}
	}
	
	**//Remove!**
	for(FString& Each : ToRemove)
	{
		Files.RemoveSwap(Each); //Fast remove! Does not preserve order
	}
	
	**//No files?**
	if(Files.Num() < 1)
	{ 
		return false;
	}
	
	**//~~~~~~~~~~~~~~~~~~~~~~~~~~~~
	// Rama's Sort Files by Time Stamp Feature
	//~~~~~~~~~~~~~~~~~~~~~~~~~~~~
	//Sort the file names by time stamp
	//  This is my custom c++ struct to do this,
	//  	combined with my operator< and UE4's
	//			TArray::Sort() function!**
	TArray<FFileStampSort> FileSort;
	for(FString& Each : Files)
	{
		FileSort.Add(FFileStampSort(&Each,GetFileTimeStamp(Each)));
		
	}

	//Sort all the file names by their Time Stamp!
	FileSort.Sort();
	
	//Biggest value = last entry
	OriginalFileName = *FileSort.Last().FileName;
	**//~~~~~~~~~~~~~~~~~~~~~~~~~~~~**

	    
	**//Generate new Full File Path!**
	FString NewFullFilePath = NewAbsoluteFolderPath + "/" + NewName + ".bmp";
	
	**//Move File!**
	return RenameFile(NewFullFilePath, ScreenShotsDir + "/" + OriginalFileName);
}



**How It Works**

The core feature of my logic and this node is that I used a custom C++ struct in order to sort all of the files by date!

**I do this in a super-efficient way, using UE4's TArray::Sort function which leverages all of Epic's hard work to create a fast sorting function!**

I defined the C++ **operator&lt;** for my custom struct so that UE4 could do the sorting for me!

**In addition I have developed my own File I/O library since my time in the UE4 Beta program.**

So I had all the supporting functions I needed!

C++ Code Speed

Please note that in my internal file sorting system I do not duplicate the FString data! I refer to it via pointer, and use the FDateTime as the only data I access.

So essentially my custom C++ struct is a FDateTime wrapper for a FString ptr so that UE4 can sort the files for me like Lightning!


**Latest plugin download on the UE4 Wiki: (7.93 mb) **
https://wiki.unrealengine.com/File:VictoryPlugin.zip

Victory Plugin on Media Fire

If your browser is not updating the Wiki download page to the most recent version, you can use my alternative Media Fire download link!

Please note clicking this link will not start a download instantly, it will just take you to the Media Fire file description.

Enjoy!

:slight_smile:

Rama

True but this won’t work for writing lines to Input.ini, which is necessary for adjusting key mappings.

I am at my laptop right now, but the compiler complains that it can’t find the Physx include libraries. I will send the log when I get back to my devmachine.

Edit: So John pointed out how to do it, so nevermind my request. :slight_smile:

Cheers,
Dakraid

Rama, do you think it would be useful to have an event which is frame independent?
The current Event Tick fires every single frame, something which isn’t that consistent when getting low fps. I know you can use Delta Seconds to accommodate this a bit, but as far as I understood it you are limited how far. Another thing would be that it doesn’t change how often the event gets fired, so I think a proper solution would be nice and since I think it might be useful for everyone using BP it might be a good request.
I don’t know if Event can use parameters, otherwise I would say a parameter which determines how often per second the event should be fired would be nice.

PS: If it’s already possible to have a frame independent solution within BP which is basically an event which fires 50 times per second for example, then you can ignore this request ^^

If you want an event to fire 50 times a second you would create a custom event and set a timer for this custom event in begin play and set the timer to 0.02 seconds and tick “looping”. Then your custom event will fire 50 times a second, frame independent.

Thank you!
I misunderstood what timers were for, so I didn’t think about using them. Now after you mentioned it I checked the docs, tried it out and it works perfectly.
Again, thank you.

Cheers,
Dakraid