Download

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

I dont do Victory BP library upgrades until the official release, but Peter explained how you can upgrade to 4.7 early if you want to!

:slight_smile:

Rama

**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:**

Bool
Int
Float
Rotator
Vector
Color
String

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!


**Game.ini**

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

**Saved/Config/Windows/Game.ini**

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!



```


[DebugWindows]
ConsoleWidth=160
ConsoleHeight=4000
ConsoleX=-32000
ConsoleY=-32000

[/Script/UnrealEd.ProjectPackagingSettings]
BuildConfiguration=PPBC_Development
StagingDirectory=(Path="E:/MYPROJECT_DELETE")
FullRebuild=True
ForDistribution=False
UsePakFile=True
UseOBB_InAPK=False
CulturesToStage=en

[Victory]
BoolVar=True
VectorVar=X=1.000 Y=2.000 Z=9000.123
StrVar=Yay For Custom Config Vars!!!
FloatVar=234.000000


```



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

Rama

PS: Here's example usage!

![Usage.jpg|1280x960](upload://vJ8VyiQCZXj6G59JXlBNDrMdZow.jpeg)

9b7a621d3332fdafbe78b687447eb1c37f3f558c.jpeg

Rama’s Suite of Powerful UMG Nodes

Here are the 3 core BP nodes that I’ve been using to make all of my complicated interacting UMG menus, including an in-game file browser and a menu that allows you to change the materials on any skeletal mesh, while in-game!

These nodes are available to you now!


**Get All Widgets of Class**

Allows you to not have to store references everywhere to your widgets, making it easy to interact with the Player Controller and My Character blueprints :) 

Also makes it easy to remove a loading screen after a level transition, without storing refs in Game Instance class

Remove All Widgets Of Class

You can find and remove any widget any time this way, no matter where you are in BP! (here I am in the Level BP)

Rama Tip:
If you make a general superclass for all your widgets (Reparent to a blank UserWidget of your own making), you can clear your entire UI system from the viewport with a single call to RemoveAllWidgetsOfClass, supplying the class that is your super class for all your user widgets!

So lets say you have 3 user widgets that you made, make a 4th that is blank, reparent your existing 3 to your new empty 4th widget (“WidgetMaster” for example).

Now you can just call RemoveAllWidgetsOfClass on your new 4th widget, WidgetMaster, and all 3 of your existing widgets will be removed automatically from the viewport!


**Is Widget Of Class In Viewport**

Take action based on the dynamic lookup of whether a certain widget is currently visible!

No need to store refs or bools anywhere, just do a dynamic look up that is lightning fast!

♥

Rama

Hi Rama,
Thank you for your answer ! sorry I took my time to respond and i did a lot of tests.
I understand all your explication about power, but English is not my native language, and i will try to explain better what i want :slight_smile:

In fact, I have updated my blueprint from v4.6.1 to current version and I discover a wonderful parameter in the Physics category : the “Override Mass” parameter.
It’s exactly what I want !!! but is it possible for you to create a blueprint node to be able to :

  • modify the “Mass in Kg” value
    and optionnaly :
  • set true/false for “Override Mass”
  • be able to modify others parameters like “Center of Mass offset”

I hope it’s a better explication !
Let me know if it’s possible :wink:
Thanks a lot !

Does anyone know if this would work for an iOS game? I’m trying to find a way to use large string arrays with out having to add code to the project.

**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!

Special Note!

Tim Sweeney liked this node!

Enjoy!

Rama

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

5e04c4d83d602f944fb2cfd946e90787f3b20f70.jpeg


**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);
			
			//Valid?
			if (!LoadedT2D) 
			{
				return NULL;
			}
			
			//Out!
			Width = ImageWrapper->GetWidth();
			Height = ImageWrapper->GetHeight();
			 
			//Copy!
			void* TextureData = LoadedT2D->PlatformData->Mips[0].BulkData.Lock(LOCK_READ_WRITE);
			FMemory::Memcpy(TextureData, UncompressedBGRA->GetData(), UncompressedBGRA->Num());
			LoadedT2D->PlatformData->Mips[0].BulkData.Unlock();

			//Update!
			LoadedT2D->UpdateResource();
		}
	}
	 
	// Success!
	IsValid = true;
	return LoadedT2D;
}


```



Download Link (6.5mb)

UE4 Wiki, Plugin Download Page

Hi again Rama! I asked what you told me in the answer hub. Here it is: Change game's culture (language) during runtime (without restart) - UE4 AnswerHub

I hope someone solves this because well… I’ve been messing around with your binding Bps and ohh boy! They work soo good! Here is a picture of my Menu. But I have one question. What if a input have 2 or more bindings asigned? For Example. SHOOT; Left Mouse Button and Gamepad Left Trigger. Next week I’m going to buy a compatible gamepad with ue4 and try it out but I would like to know your point about it.

About my experience with the bindings bp: The menu you see below is not a widget hud menu. They are indeed static meshes and the mouse is not a mouse, but another static mesh projected on a plane. Why? Because VR, that’s why. In short, I had to cheat all the menu functionality. What does that means? well, I used the bindings with UE4 savegames for the strings and had no problem with them and also the info from the bindings BPs can be easily used anywhere.

In the other hand, I hope Epic Games will put more time working on the localization management. I don’t remember where, but they said this is not their main area because big companies use their own localization systems and they haven’t asked them to work on that but… what about the indies? I know a lot of developers don’t pay too much atention to localization but in a sales perspective… it is HUUUUGE.

Anyways, thanks for the awesome work Rama :wink:

e9aaaa42dbaa56c4c71a4ea4258259f6fae694bc.jpeg

~~

**2 Two Nodes For You

Create UObject

Create Primitive Component, Added to Scene at Location!**

These two nodes let you create UObjects at runtime!

I recently needed to create UObjects in Blueprints for a special inventory system! Please note you can use my node to create UObjects that you make Blueprintable via C++ !

Please note you absolutely must save off the return value to a variable or UE4 will Garbage Collect your new UObject within a short time!

Please especially note that if you create a Primitive Component, I actually add it to the world for you so it is visible and has collision!


**C++ Code For You**

Here's the code!



```


UObject* UVictoryBPFunctionLibrary::**CreateObject**(UObject* WorldContextObject,UClass* TheObjectClass, FName Name)
{
	if(!TheObjectClass) return NULL;
	//~~~~~~~~~~~~~~~~~
	
	//using a context object to get the world!
    UWorld* const World = GEngine->GetWorldFromContextObject(WorldContextObject);
	if(!World) return NULL;
	//~~~~~~~~~~~
	 
	return StaticConstructObject( TheObjectClass, World, Name);
}


```





```


UPrimitiveComponent* UVictoryBPFunctionLibrary::**CreatePrimitiveComponent**(
	UObject* WorldContextObject, 
	TSubclassOf<UPrimitiveComponent> CompClass, 
	FName Name,
	FVector Location, 
	FRotator Rotation
){
	if(!CompClass) return NULL;
	//~~~~~~~~~~~~~~~~~
	
	//using a context object to get the world!
    UWorld* const World = GEngine->GetWorldFromContextObject(WorldContextObject);
	if(!World) return NULL;
	//~~~~~~~~~~~
	 
	UPrimitiveComponent* NewComp = ConstructObject<UPrimitiveComponent>( CompClass, World, Name);
	if(!NewComp) return NULL;
	//~~~~~~~~~~~~~
	 
	NewComp->SetWorldLocation(Location);
	NewComp->SetWorldRotation(Rotation);
	NewComp->RegisterComponentWithWorld(World);
	
	return NewComp;
}


```



♥

Rama

any one getting a error of missing Dll files?

Until 4.8 or so you need to include even just an empty C++ class, to get the plugin to compile in a packaged game.

If you are having missing dll errors in editor build, make sure you are using 4.6.1 with my plugin. I will release 4.7 version when 4.7 is released. The current 4.7 in the launcher is for testing only, not commercial development.

:slight_smile:

Rama

**New Nodes

Combine Multiple Strings & Append Multiple Strings**

With these latest nodes you can combine as many strings as you want!

Note the “Add Pin” option!

Combine Strings Multi = I put a space between each string for you!

Append Multiple = Strings are combined without any additional formatting.


**Special Thanks**

Special thanks to Key To Truth for contributing the Append Multiple node!

I was inspired by Key To Truth's offering to make Combine Strings Multi :)

Download Link (6.5mb)

UE4 Wiki, Plugin Download Page

Enjoy!

:heart:

Rama

**Two New AI Nodes

Get Closest Actor Of Class In Radius of Location

Get Closest Actor of Class In Radius of Actor**

These nodes are great for use with AI calculations!


**C++ Code For You**

Here's my c++ code for **Get Closest Actor of Class In Radius of Actor**!



```


AActor* UVictoryBPFunctionLibrary::GetClosestActorOfClassInRadiusOfActor(
	UObject* WorldContextObject, 
	TSubclassOf<AActor> ActorClass, 
	AActor* ActorCenter, 
	float Radius, 
	bool& IsValid
){ 
	IsValid = false;
	  
	if(!ActorCenter)
	{
		return nullptr;
	}
	
	const FVector Center = ActorCenter->GetActorLocation();
	
	//using a context object to get the world!
    UWorld* const World = GEngine->GetWorldFromContextObject(WorldContextObject);
	if(!World) return nullptr;
	//~~~~~~~~~~~
	
	AActor* ClosestActor 		= nullptr;
	float MinDistanceSq 		= Radius*Radius;	//Max Radius
	
	for (TActorIterator<AActor> Itr(World, ActorClass); Itr; ++Itr)
	{
		//Skip ActorCenter!
		if(*Itr == ActorCenter) continue;
		//~~~~~~~~~~~~~~~~~
		
		const float DistanceSquared = FVector::DistSquared(Center, Itr->GetActorLocation());

		//Is this the closest possible actor within the max radius?
		if (DistanceSquared < MinDistanceSq)
		{
			ClosestActor = *Itr;					//New Output!
			MinDistanceSq = DistanceSquared;		//New Min!
		}
	}

   IsValid = true;
   return ClosestActor;
}


```



Download Link (6.5mb)

UE4 Wiki, Plugin Download Page

Enjoy!

:heart:

Rama

**Using these nodes in my plugin you can now easily make your own translation animations for 2D games and UMG!
**
I realized the need for these animations while trying to manually animate UMG widgets in BP.

I am in process of submitting this as a pull request for the main engine.

UE4 Wiki, Plugin Download Page

Enjoy!

Rama

Get OS Platform

Now you can perform different actions based on which OS is currently being used!

Platforms you can check for:

**Windows
Mac
Linux

PS4
XBoxOne

iOS
Android

HTML5

WIN RT
WIN RT ARM**

Enjoy!

Rama

I have a problem with the “Get static mesh vertex locations” node.

It doesn’t work it a packed game.

Blueprint:
af7852a03ac912719384764e7817e948ca4f2810.png

Editor:
087857fa01fe0d593ccffce25e9b05189ca8510d.jpeg

Packed:
1e5815cce0b23e8606af78f0b0b35acc9e92102a.jpeg

I’ve also tried to use this node from the game code and not as a plugin and it gave me the save results.

The level builder system i’m making is really depended on this node, please help :expressionless:

@Sahkan

“It doesn’t work it a packed game.”

I have had the same experience and reported this to epic a while back :slight_smile:

I’ve experienced this issue with getting vertex locations in packaged games since 4.3

If you start a new Answerhub, link me and I can add more info to your report :slight_smile:

Please include your pictures and then I can add info, you could also add my code below to the initial post.


For Epic Staff:

Here's the code being used that works perfect in pre-packaged game and does not work in packaged game.

**It seems that using the Render Data / LOD info in packaged game** does not work some reason?



```


Comp->StaticMesh->RenderData->LODResources[0].PositionVertexBuffer


```



Is there an after-packaging better way to get the vertex position info?

Please note the rotation/translation of each vertex is scaled by the FTransform to match actor scaling and rotation.



```


Comp->GetComponentLocation() + RV_Transform.TransformVector(VertexBuffer->VertexPosition(Itr))


```



Entire C++ Code



bool UVictoryBPFunctionLibrary::GetStaticMeshVertexLocations(UStaticMeshComponent* Comp, TArray<FVector>& VertexPositions)
{
	if(!Comp) return false;
	if(!Comp->IsValidLowLevel()) return false;
	
	//~~~~~~~~~~~~~~~~~~~~
	//				Vertex Buffer
	if(! Comp) 									return false;
	if(! Comp->StaticMesh) 					return false;
	if(! Comp->StaticMesh->RenderData) 	return false;
	if( Comp->StaticMesh->RenderData->LODResources.Num() < 1) return false;
	//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
	
	//~~~ End of Pointer Safety Checks ~~~
	
	//~~~~~~~~~~~~
	VertexPositions.Empty();
	//~~~~~~~~~~~~
	
	FPositionVertexBuffer* VertexBuffer = NULL;
	VertexBuffer = & Comp->StaticMesh->RenderData->LODResources[0].PositionVertexBuffer;
	if(!VertexBuffer) return false;
	//~~~~~~~~~~~~~~~~
	
	int32 VertexCount = VertexBuffer->GetNumVertices();
	 
	FTransform RV_Transform = Comp->GetComponentTransform(); 
	for(int32 Itr = 0; Itr < VertexCount; Itr++)
	{
		VertexPositions.Add(
			Comp->GetComponentLocation() + RV_Transform.TransformVector(VertexBuffer->VertexPosition(Itr))
		);
	}
	
	return true;
}



Rama

This is the link to the AnswerHub page:
https://answers.unrealengine.com/questions/174033/some-c-code-doesnt-work-on-a-packed-game.html
Thanks for the help rama, it was really frustrating to debug this thing, i really need it to work, i hope they fix it soon or at least find a workaround.

It seems like this is a known issue :

And this wiki page has a link to rama tutorial ( Integrating PhysX Code into Your Project )
Maybe Rama can make some super node for us out of all this information ? :slight_smile:

Wow that’s an awesome wiki by Vebski,** thank you Vebski!**

I will try turning that into a BP node shortly.

I also posted in your answerhub Sahkan!

:slight_smile:

Rama

**Improved Get Vertex Locations of Static Mesh

Now works in Packaged Games**

560b4f2b24fb116ffc5c2ddfd4f04754501ad6c2.jpeg

I have re-written my Get Vertex Positions BP node so that it works in packaged games!

Special thanks to Vebski for pointing out that using a PhysX method does work in packaged games!


**My C++ Code For You**

See my PhysX wiki for the basic build.cs setup:
https://wiki.unrealengine.com/PhysX,_Integrating_PhysX_Code_into_Your_Project

Here is the code I wrote to get all of the transformed vertex positions using the Body Instance and PhysX code!

I am doing many safety checks to ensure the Body Instance data is valid before utilizing it, and the result is that now you can get accurate vertex locations in packaged games!



```


//~~~ PhysX ~~~
#include "PhysXIncludes.h"
#include "PhysicsPublic.h"		//For the ptou conversions
//~~~~~~~~~~~

//Get Transformed Vertex positions of any static mesh! -Rama
bool UVictoryBPFunctionLibrary::GetStaticMeshVertexLocations(UStaticMeshComponent* Comp, TArray<FVector>& VertexPositions)
{
	
	if(!Comp || !Comp->IsValidLowLevel()) 
	{
		return false;
	}
	//~~~~~~~~~~~~~~~~~~~~~~~
	
	//Component Transform
	FTransform RV_Transform = Comp->GetComponentTransform(); 
	
	//Body Setup valid?
	UBodySetup* BodySetup = Comp->GetBodySetup();
	
	if(!BodySetup || !BodySetup->IsValidLowLevel())
	{
		return false;
	}  
	
	//Get the Px Mesh!
	PxTriangleMesh* TriMesh = BodySetup->TriMesh;
	 
	if(!TriMesh) 
	{
		return false;
	}
	//~~~~~~~~~~~~~~~~
	
	//Number of vertices
	PxU32 VertexCount 			= TriMesh->getNbVertices();
	
	//Vertex array
	const PxVec3* Vertices 	= TriMesh->getVertices();
	
	//For each vertex, transform the position to match the component Transform 
	for(PxU32 v = 0; v < VertexCount; v++)
	{ 
		VertexPositions.Add(RV_Transform.TransformPosition(P2UVector(Vertices[v])));
	}
	
	return true;
} 


```





**UE4 Wiki, Plugin Download Page**
https://wiki.unrealengine.com/File:VictoryPlugin.zip

Enjoy!

:)

Rama