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

Giving Me Credit for Victory BP Library

Victory BP Library Copyright Permissions

Yes the code is free to use anywhere you want!

I only request that you mention me in the credits for your game in the way that feels most appropriate to you, thereby honoring my contributions.

I prefer to be mentioned as simply “Rama”



Thanks, good to know this is possible at all at the moment, i guess i will just wait for 4.7 and in the meanwhile release game footage videos when there are new stuff to show off.

Yea! Epic has been telling me that getting plugins working in BP only packaged games is very high priority for them :slight_smile:


**New Release!

Rama’ Suite of Custom Config Section BP Nodes!**

Using my new suite of BP nodes, you can create as many of your own custom config file sections as you want!

You can both create and retrieve ini variables with any name and fundamental type that you want!

**Supported Types:**


Why Use a Config Var?

Config vars have several benefits

  1. Persistent data storage without using a SaveGame struct or GameInstance, store simple quantities of data and player customization this way! Data is stored between level loads and even after the current instance of the game is shut down.

So in this way config vars have greater persistence than the GameInstance class!

  1. Player-Driven Customization, Players of your game can tweak the config vars that you make available for them on their hard disk, by editing the .ini file directly, just like AAA games! This is the most significant advantage of using config files, and their real core purpose. :slight_smile:

  2. Simplicity, simpler to use than the BP SaveSystem (which is quite wonderful by the way), but not quite as powerful in that you can only store basic data types, not UObjects and Actors.

  3. **Organization, **you can create as many config header sections as you want using my nodes, organizing all your custom settings this way!


All of your custom created config vars and sections are stored in:


Players can navigate to this location on their harddrive to edit your ini files just like any AAA game would allow!

Here's what my **Game.ini** file looks like after running some tests!




VectorVar=X=1.000 Y=2.000 Z=9000.123
StrVar=Yay For Custom Config Vars!!!


**Now you have fully featured ability to use config variables entirely in BP!**


PS: Here's example usage!


Thanks rama the config nodes looks awesome and this is great how you can make variables accessible by the user, especially for an indie developer, instead of investing time on a fancy options screen i can let the user use the config file and invest my time in the real important stuff.

**New Node: Load Texture 2D From File!

JPG, PNG, BMP, ICO, EXR, and ICNS are Supported File Formats !**

With this node you can load a Texture 2D from a file during runtime!

I output for you the width and height of the loaded image!

Now you can easily create Texture 2D’s from image files in Blueprints, during runtime!



PS: Make sure to include the file extension when you use this node!


**C++ Code For You**

Here is the core C++ function involved, entire source is in the download! I wrote my own Enum for the file formats.


UTexture2D* UVictoryBPFunctionLibrary::Victory_LoadTexture2D_FromFile(const FString& FullFilePath,EJoyImageFormats ImageFormat, bool& IsValid,int32& Width, int32& Height)
	IsValid = false;
	UTexture2D* LoadedT2D = NULL;
	IImageWrapperModule& ImageWrapperModule = FModuleManager::LoadModuleChecked<IImageWrapperModule>(FName("ImageWrapper"));
	IImageWrapperPtr ImageWrapper = ImageWrapperModule.CreateImageWrapper(GetJoyImageFormat(ImageFormat));
	//Load From File
	TArray<uint8> RawFileData;
	if (!FFileHelper::LoadFileToArray(RawFileData, * FullFilePath)) 
		return NULL;
	//Create T2D!
	if (ImageWrapper.IsValid() && ImageWrapper->SetCompressed(RawFileData.GetData(), RawFileData.Num()))
		const TArray<uint8>* UncompressedBGRA = NULL;
		if (ImageWrapper->GetRaw(ERGBFormat::BGRA, 8, UncompressedBGRA))
			LoadedT2D = UTexture2D::CreateTransient(ImageWrapper->GetWidth(), ImageWrapper->GetHeight(), PF_B8G8R8A8);
			if (!LoadedT2D) 
				return NULL;
			Width = ImageWrapper->GetWidth();
			Height = ImageWrapper->GetHeight();
			void* TextureData = LoadedT2D->PlatformData->Mips[0].BulkData.Lock(LOCK_READ_WRITE);
			FMemory::Memcpy(TextureData, UncompressedBGRA->GetData(), UncompressedBGRA->Num());

	// Success!
	IsValid = true;
	return LoadedT2D;


Download Link (6.5mb)

UE4 Wiki, Plugin Download Page

You never cease to amaze Rama!
Fantastic addition :slight_smile:


Yeah, i cant find words to appreciate his awesomeness anymore, so yeah…

Thanks Rama! :slight_smile:

Hee hee!

Great to hear from you Jeremy!

Hee hee!! * Blushes *



New Sound Node For you

Keep in mind you can now get/set the volume of any sound class to any value you want, anywhere in BP, any time!




But it will not be possible in 4.7, right?

Hi there Rama,

first of all, thank you very much for all content to provide us with.

I have a question referring your Rebindable Key.

I tried to figure out from where you used this OnKeyDown Event, which seems to be a reply to any Key Event occuring.
I looked through the Engine and couldnt find any Function which describe that behaviour. How did you do that?

best regards

Rama, thank you for another excellent Unreal Engine 4 contribution!

I just found out that the function i need is implemented in UserWidget.h.

But how is the intention of getting this inside an UMG widget, is this event automatically consumed within widgets parent, when the child is in focus?

Hi Rama,

Its been a while since I posted on this forum. Took a break from my thesis.

I am facing some limitations with your current vertex manipulation blueprints. One of that is I have a class called Interactive_Actor. This actor class holds all the thermodynamic properties of a static mesh. It also has a component called Default Mesh which gets changed to a user set static mesh through a Set Static Mesh node in the constructor. However, when I drag out the blueprint into the scene, there are no vertices highlighted. It seems the codes only work directly on static meshes dropped into the scene. Is there a way to make it work also on custom blueprint actors (static meshes with custom properties)?


omg… sorry for the disturbance i missed the “show inherit variables”…

You’re welcome Tim!

Thank you so much for UE4!

I am having fun with UE4 every day!


You should use StaticMeshActor as your base class for your BP, hopefully then it will work right!

Replace all uses of your custom static mesh component with StaticMeshComponent ref.

Try it as a test and see how it goes!

Good luck!


BP Node to Get Your Computer’s IP Address!

Dear Community,

I’ve finally succeeded at implementing a node that many have been trying to implement since the Beta!

This is a BP node that gets the IP address of your computer!

My node relies on, a free and easy way to get your current IP address.

Because this node involves an HTTP request I can’t make it a static library node, so I instead made a VictoryPC class that contains only this functionality.

You can easily re-parent your current player controller blueprint to use my plugin VictoryPC class!


and if you are not using a PC already, make sure to go to World Settings and use my VictoryPC as your player controller!

As long as my Victory BP Library is an active plugin for you, then this VictoryPC class will show up!




Now we can all get the IP address of the local computer for use with multiplayer games or webserver activities!




Here’s the setup you should create in your Blueprinted version of my VictoryPC!


**C++ Source Code For You**

Here is the C++ source code I wrote just earlier today!


bool AVictoryPC::VictoryPC_GetMyIP_SendRequest()
	FHttpModule* Http = &FHttpModule::Get();
		return false;
		return false;
	FString TargetHost = "";
	TSharedRef < IHttpRequest > Request = Http->CreateRequest(); 
	Request->SetHeader("User-Agent", "VictoryBPLibrary/1.0");
	Request->SetHeader("Content-Type" ,"text/html");
	Request->OnProcessRequestComplete().BindUObject(this, &AVictoryPC::HTTPOnResponseReceived);
	if (!Request->ProcessRequest())
		return false;
	return true;
void AVictoryPC::HTTPOnResponseReceived(FHttpRequestPtr Request, FHttpResponsePtr Response, bool bWasSuccessful)




I was stuck with dynamic generated arrays in BP… and then I found a way to load image sequences with your plugin. You saved my life! ;D
I used the LoadObjectFromAssetPath node, but I’m gonna try the LoadImage node soon as well!
I’m eagerly waiting for 4.7 and see if I can deploy to Android apk directly…
Thx again dude!