Download

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

Solution Already Exists

I already have an easy solution for this!

I have a node that lets you perform actions if the UE4 game is not the foreground window of the OS ! This works in packaged games!

So you are setting the mouse cursor to be center of screen, you can use my node to stop doing that if the user tabs out / the ue4 game is not the foreground window any more

I have pictures of this node here:


**Better Solution**

Why are you not just getting the center of the viewport and using the player controller deproject node to get the world space position of center of screen, and then tracing in the direction of the camera?

steps

1. get viewport center of screen
2. get player controller 0 -> get deprojected position (screen to world)
3. get the viewing rotation of the player's camera and trace in that direction
(rotation->As X Vector)

You can use my tracedata nodes to simplify the tracing process.


**then you dont need to set the mouse at all!**


**Victory BP Node ~ Get Center of Viewport**

I already gave you a node in my most recent download (if you dont have it in your version of the Victory BP Library Plugin) to get the viewport center!

So just follow my 3 steps above and you are set, no mouse cursor involved, as long as it is the center of the screen you want



```


bool UVictoryBPFunctionLibrary::**Viewport__GetCenterOfViewport**(const APlayerController * ThePC, float & PosX, float & PosY)
{


```




Rama

I am using the tracing solution now, so all (mostly) is good. The node that let you perform actions if the UE4 game is not the foreground window of the OS will be useful in a package game. Thanks.

@Rama, here’s another node that might be useful with the other texture related nodes.

It uses Zoid’s Dynamic Texture update method, and lets you pass in an array of FColors as the texture data.

I have it set here to do the whole texture at once because supposedly sub-regions don’t work, but I haven’t tested that yet. I’ve tested out the updating in general and it does work, though some of the streaming settings on the UTexture2D need to be set (so it may not work on UTexture2Ds that come out of the TextureFromDisk node, without a minor change there).

If sub-regions do work, it’d be really nice to change this to pass in the region data (source X/Y, dest X/Y, basically).

If you ever figure out how to raycast and get a UV coordinate, this would be the perfect second piece to allow for dynamic decals on skinned meshes (the update happens in the render thread, and is quite fast).

https://wiki.unrealengine.com/Dynamic_Textures (UpdateTextureRegions is what you want)


	
        /** Updates a UTexture2D* from an FColor array.
	* Update texture from color data.
	* @param ColorData		Array of FColors to update this texture with. Array is assumed to be the same dimensions as texture, otherwise this call will fail.
	* @param Texture		Texture to update.
	*/
	UFUNCTION(BlueprintCallable, Category = "TextureFromDisk")
	static void UpdateTextureFromColorData(TArray<FColor>& ColorData, UTexture2D* Texture);


And the definition:



void UTextureFromDiskFunctionLibrary::UpdateTextureFromColorData(TArray<FColor>& ColorData, UTexture2D* Texture)
{
	// Sanity checks.
	if (!Texture)
		return;

	if (ColorData.Num() <= 0)
		return;

	// Update region.
	FUpdateTextureRegion2D *region = new FUpdateTextureRegion2D(0, 0, 0, 0, Texture->GetSurfaceWidth(), Texture->GetSurfaceHeight());

	// Call the render command.
	UpdateTextureRegions(Texture, 0, 1, region, Texture->GetSurfaceWidth() * 4, 4, (uint8*)ColorData.GetTypedData(), false);
}

Right now the way it’s set up it will leak the FUpdateTexture2D - so you may want to change UpdateTextureRegions to free the FUpdateTextureRegion2D but NOT the SrcData pointer, because that refers to your TArray of FColors, which you don’t want freed.

To fix that, change this in UpdateTextureRegions


	
	if (bFreeData)
	{
		FMemory::Free(RegionData->Regions);
		FMemory::Free(RegionData->SrcData);
	}


to this:



	if (bFreeData)
	{
		FMemory::Free(RegionData->Regions);
	}


If you change this, make sure to change the last parameter for UpdateTextureRegions to be true, so it will actually free the FUpdateTextureRegion2D.

Hey Rama, are you still taking requests?

If yes, would it be possible to add something like this?

Hi there!

What is the benefit of this function / BP node?

Any sort of pictoral example?

Thanks!

Rama

Yes I can surely do that, but can you be specific about what you want this node for?

If you just want to store data you should use a BP of the GameInstance class, or you can use the globally accessible Game Data object that I describe in my wiki here, already implemented by Epic for storing data in a UObject format:

https://wiki.unrealengine.com/Global_Data_Access,_Data_Storage_Class_Accessible_From_Any_CPP_or_BP_Class_During_Runtime!

:slight_smile:

Rama

I don’t have a pictorial example, but it allows you to update any Texture2D surface with new color data at runtime in a threaded manner (the render command puts it into the rendering thread, so the game thread won’t hitch). I use it myself for updating a Texture2D with large amounts image data from disk so it won’t hitch/pause the game thread.

It could be useful for a lot of things, like doing a live painting application (would need to figure out UV raycasting, though, to know where to put the color data when the user presses), bullet holes/slashes on skinned meshes (again needs UVs tho), or any number of things.

Oh that does sound neat!

Well if you’d like, you could download my latest plugin version, add the relevant code to the specifications that you know are correct, and then you could pm me when ready!

Have fun today!

Rama

Absolutely :slight_smile: I’ll get that sorted.

One other thing that the command can be useful for is to easily create an RTS fog of war (I go over this a bit here).

I’d love to help sort out raycasting against UVs, especially for skinned characters, as that’d give the ability to do dynamic, location-accurate decals (not Decals as in the object, just updated texture colors) on skinned meshes when combined with the texture update method. That would be great for doing damage from cuts or even projectiles and have them show up in the right spot. If done right you could even update normals or other maps to change how the material looks for those areas that were updated.

Okay great, let me know when the BP code is tested and ready to go!

Regarding the matter of ray casting against UVs , I don’t have the time at the moment to look deep into this, so if you find out any leads on this let me know! Might require some engine modifications :slight_smile:

Rama

**Rama Victory BP Library Nodes

Get Current Operating System Time

Get Milliseconds/Seconds/Minutes/Hours Passed Since Previous Recorded Time!**


**Real Use Case**

I used these two nodes with a client just last night to help them make a game where they could record the amount of real world time that has passed since someone last played their game!

So their goal was to know exactly how many hours minutes and seconds have passed since  a player logged of their game last!

It was really easy actually thanks to my Get OS Time nodes!

**Here are the steps:**

1. make a new save object with a simple String variable

2. when saving the object, use my Get OS Time node and use the return value

3. When loading, use my Get Time Passed Since Last Recorded Time node!

That was it!

Here's a picture for reference!

![OSUpdate.jpg|1280x960](upload://b5ScGykuHpKI4gWMZuhiUcM40db.jpeg)

Enjoy!

Rama

[COLOR="#0000FF"]Draw Thick Circle With Axis Control[/COLOR]

New node for you!

With this node you can draw circles!

And you can control their thickness, as well as how many points make up the circle!

You can also have axis control!

So you can draw circles horizontally, vertically, at angles, any way you like, with convenient BP node inputs!

See pics!

af68277ba636b7e04fc6af9b982616b2340402e4.jpeg

DrawThickCircle4.jpg

Rama

Sorry for the late reply, i forgot i had commented here :slight_smile:

Thanks for the link, it might be useful in the (near) future.

I’m currently trying to think of a way to handle ‘upgrades’ for the player, i want to create a ‘upgrade tree’. Since each of the upgrades do different things i figured it would be best to create different BPs when necessary. However because i don’t know how many upgrades will have to be created i thought it would be better to use Object as a base class instead of Actor. If you know a better way of doing this please let me know, i’m still not sure if my way is a good way to go :slight_smile:

What I would do is make a BP Structure asset, and then put the skill tree vars there

And then you can use a Dynamic Array of your BP Structure type!

right click->Blueprint->Structure

So now you have a custom data structure that you can easily copy/paste/replace/break, and yet you can have as many as you want due to the dynamic array!

Rama

New BP Node

Get Player Unique Net ID

While working with a client earlier today in Blueprints I came to realize that the essential variable, PlayerID, present in the PlayerState class, is not exposed to Blueprints!

I’ve submitted a pull request to have Epic address this, but in the meantime, I’ve also given you a BP node that gets you this very important variable!

You can use the PlayerID to uniquely identify players in a networked game using Blueprints!

This is an essential variable that lets you assign values to each unit to tell each player who owns which unit :slight_smile:


**Using it**

In your game mode in the post login, when you receive the player, you can then use my node to obtain that player's Net ID, and assign that unique ID wherever you like as an ID variable.

Make sure to replicate the variables that are storing the unique Net ID so all players on all machines know who owns which units!

![PlayerID.jpg|1034x633](upload://fnybdEiCFWxQiaSrLdayyxiwgbb.jpeg)


Have fun!

Rama

That’s what i started out with, but i soon realised that most (if not all) upgrades will do different things so using one class + structs would make things really messy. For example, one upgrade might be a short boost in health, while another upgrade will permanently increase health regeneration, yet another one allows faster movement speed in certain areas. What i’m currently doing is spawning an upgrade that receives a notification when bought together with the buying playercontroller so it can do whatever it does.
I figured it would be easier to use different BPs for the upgrades so it’s easier to keep track of what a certain upgrade does and where things might be going wrong.

ooooh

yea the big complication with my suggestion is that you cant add functions to Structures in BP, but you can in C++

So I can do everything I can do in a class in a USTRUCT in c++, but not so in BP, yet, maybe Epic will fix this at some point!

Once you can make BPs of UObjects I’d recommend going the Uboject route

having an Actor BP for every upgrade is pretty intense :slight_smile:

Rama

Get Screen Resolutions Now Works in Packaged Game

My Get Screen Resolution Nodes works in packaged games now!

In 4.3 the core function in C++ was not working in BP, but now it is! Epic fixed it!

Enjoy getting the screen resolutions of the end user’s hardware in your game now!

It is obtained from the user’s display adapter directly! No guessing or preset values!

:slight_smile:

d4117a7a04ee5f316cbeae35c6e681739e2c00f8.jpeg

https://wiki.unrealengine.com/File:VictoryPlugin.zip

Rama

I did not know there is a structure BP until this thread. Good Info.

Anyway Rama, a dumb question, I just need overwrite the last plugin with the latest plugin?

Will existing Victory nodes (using previous version of your plugin) need reconnecting, or jut work out of the box?

I used a few of your plugin like OS clock/Time & some others I forgot.

If you download the latest version of my plugin you will only be getting new nodes and your previous ones will still work!

top secret: my latest download already has a get vertices of static mesh node that I"ve not yet ahem officially publically announced yet