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

Hey how is it going? :slight_smile:

I have successfully compiled and fixed the errors/warnings for 4.9 (the changes in get mesh triangles function was the toughest part to fix for me :stuck_out_tongue: but I think it works fine).
Maybe I can save you some trouble?

Here is the link:

Woohoo thank you so much for helping out!

Actually we finished around the same!

I tested both your version and mine, and the 4.9 plugin template code, there’s a bug whenever UnrealEd is included. Just wanted to know I did test your version too to honor your contribution!

See next post!

:slight_smile:

Upgrade to 4.9, Vertex Snap Editor Temp Disabled

Dear Community,

I’ve upgraded my Victory BP plugin to 4.9! (And did too!)

Unfortunately in 4.9.0 there’s a bug involved with editor plugins that I believe has to be fixed engine-side as it is affecting the new 4.9 plugin templates as well.

So version of my plugin does not include the Vertex Snap Editor.

To avoid a crash on editor startup, please remember to remove these lines from your config file if you were using the vertex snap editor:



[/Script/Engine.Engine]
UnrealEdEngine=/Script/VictoryEdEngine.VictoryEdEngine


becomes



;[/Script/Engine.Engine]
;UnrealEdEngine=/Script/VictoryEdEngine.VictoryEdEngine


Full description:


**4.9 Download**

**Latest plugin download on the UE4 Wiki: (15 mb) **


**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  link will not start a download instantly, it will just take you to the Media Fire file description.

https://www.mediafire.com/?g6uf9kt5ueb2upj

Enjoy!

:)

Much happiness glows around me :smiley: Java semester, c++ next. And then the Unreal API for its hugeness and oddness.

Seems the IsValidIndex node doesn’t like 4.9.
I’ll get the fix to shortly :slight_smile:

Victory Ed Engine Plugin, Separate Plugin and Download Now

Dear Community,

As of 4.9.0, My Vertex Snap Editor Plugin is now a separate plugin, called VictoryEdEngine!

Download Link (145kb)

is a plugin that does not package with your game as it is only designed to modify Unreal Engine 4 to add support for vertex snapping while in the Level Editor Viewport.

More Details about my Vertex Snapping Editor

Installation Steps

Enjoy!

Hey!

Why not just upload the plugin here in the forums or just link in the wiki to a separate download location (like google drive)?

Another question: Could you somehow integrate into your plugin?

Epic seems to be quite slow with integrating custom hardware cursors into the engine, they don’t say anything about it, no idea whether it will happen within the next 1 or 2 years :stuck_out_tongue: So there is the code which just needs to get added to the source for making custom cursors work, but of course doing manually after each new version and each hotfix and compile the engine is just a drawback regarding usability. But so many games need custom cursors! The default windows hand cursor is not really fitting for most games, and software cursors feel laggy, even at 60 fps.

Could you integrate the code mentioned in the thread above into your plugin and make it work as a BP node or would it not work inside of a plugin?

Thanks! :slight_smile:

Could you post a fix here? I’m currently stuck on .

IsValidIndex fix:



    DECLARE_FUNCTION(execArray_IsValidIndex)
    {
        Stack.MostRecentProperty = nullptr;
        Stack.StepCompiledIn<UArrayProperty>(NULL);
        void* ArrayAddr = Stack.MostRecentPropertyAddress;
        UArrayProperty* ArrayProperty = Cast<UArrayProperty>(Stack.MostRecentProperty);
        if (!ArrayProperty)
        {
            Stack.bArrayContextFailed = true;
            return;
        }
        P_GET_PROPERTY(UIntProperty, Index);
        P_FINISH;

        bool WasValid = GenericArray_IsValidIndex(ArrayAddr, ArrayProperty, Index);
        *(bool*)RESULT_PARAM = WasValid;
    }




bool UVictoryBPFunctionLibrary::GenericArray_IsValidIndex(void* TargetArray, const UArrayProperty* ArrayProp, int32 Index)
{
    bool bResult = false;

    if (TargetArray)
    {
        FScriptArrayHelper ArrayHelper(ArrayProp, TargetArray);
        bResult = ArrayHelper.IsValidIndex(Index);
    }

    return bResult;
}

I’m still getting crashes.

Hey , your LoadTexture2D_FromFileByExtension node isn’t working correctly for me any more in 4.9, I’m getting a sort of hue shifted effect:

RIAK4bK.png

How the colours should look:

G2k8WOa.png

edit:
Changing
Texture = UTexture2D::CreateTransient(ImageWrapper->GetWidth(), ImageWrapper->GetHeight(), PF_B8G8R8A8);

to

Texture = UTexture2D::CreateTransient(ImageWrapper->GetWidth(), ImageWrapper->GetHeight(), PF_R8G8B8A8;

fixes it

I have a problem with a linux build. I tried a version of the plugin from June and also a version from 08-26-15. The both had error. Any ideas?

Thanks for your awesome plugin!

Edit: Fixed, see below

Funny, that’s what my version already has.
I must have updated it a while back without sending it to .
My bad :frowning:

fixed my problem as well. Thanks Stormwind!

I’m getting an error saying “VictoryPlugin could not be loaded because the module VictoryBPLibrary could not be found.” I’ve looked in the plugin’s Source folder and… well… it’s right there. Not sure what the plugin is not seeing that I can.

Dear ,

I just checked and the current version of the function has source code, which includes your fix, nice to hear from you!

is the most recent Victory Plugin on mediafire and the wiki



UTexture2D* UVictoryBPFunctionLibrary::LoadTexture2D_FromFileByExtension(const FString& ImagePath, bool& IsValid, int32& OutWidth, int32& OutHeight)
{
	UTexture2D* Texture = nullptr;
	IsValid = false;

	// To avoid log spam, make sure it exists before doing anything else.
	if (!FPlatformFileManager::Get().GetPlatformFile().FileExists(*ImagePath))
	{
		return nullptr;
	}

	TArray<uint8> CompressedData;
	if (!FFileHelper::LoadFileToArray(CompressedData, *ImagePath))
	{
		return nullptr;
	}
	
	IImageWrapperPtr ImageWrapper = GetImageWrapperByExtention(ImagePath);

	if (ImageWrapper.IsValid() && ImageWrapper->SetCompressed(CompressedData.GetData(), CompressedData.Num()))
	{ 
		const TArray<uint8>* UncompressedRGBA = nullptr;
		
		if (ImageWrapper->GetRaw(ERGBFormat::RGBA, 8, UncompressedRGBA))
		{
			Texture = UTexture2D::CreateTransient(ImageWrapper->GetWidth(), ImageWrapper->GetHeight(), PF_R8G8B8A8);
			
			if (Texture != nullptr)
			{
				IsValid = true;
				
				OutWidth = ImageWrapper->GetWidth();
				OutHeight = ImageWrapper->GetHeight();

				void* TextureData = Texture->PlatformData->Mips[0].BulkData.Lock(LOCK_READ_WRITE);
				FMemory::Memcpy(TextureData, UncompressedRGBA->GetData(), UncompressedRGBA->Num());
				Texture->PlatformData->Mips[0].BulkData.Unlock();
				Texture->UpdateResource();
			}
		}
	}

	return Texture;
}


:slight_smile:

You’re welcome, and I am glad Stormwind’s Linux packaging fix worked for you!

:slight_smile:

Yes, sorry about that guys, I’ve just realized I’d coppied in an older version that I had broken myself, not the latest :eek:

good, hee hee!

:slight_smile:

In regard to IsValidIndex

I can confirm I was still getting crashes too, I looked into the code and fixed it, here is the correct .h file for 4.9.0



/* 
 *See if index is a valid index for  array
 *    
 *@param    TargetArray        The array to perform the operation on
 *@param    Index            The index to check.
 *@return    Bool if integer is valid index for  array
*/
UFUNCTION(Category="VictoryBPLibrary|Utilities|Array", BlueprintPure, CustomThunk, meta=(DisplayName = "Valid Index", CompactNodeTitle = "VALID INDEX", ArrayParm = "TargetArray"))
static bool Array_IsValidIndex(const TArray<int32>& TargetArray, int32 Index);

static bool GenericArray_IsValidIndex(void* TargetArray, const UArrayProperty* ArrayProp, int32 Index);
  
DECLARE_FUNCTION(execArray_IsValidIndex)
{
	Stack.MostRecentProperty = nullptr;
	Stack.StepCompiledIn<UArrayProperty>(NULL);
	void* ArrayAddr = Stack.MostRecentPropertyAddress;
	UArrayProperty* ArrayProperty = Cast<UArrayProperty>(Stack.MostRecentProperty);
	if (!ArrayProperty)
	{
		Stack.bArrayContextFailed = true;
		return;
	}
	P_GET_PROPERTY(UIntProperty, Index);
	P_FINISH;

	bool WasValid = GenericArray_IsValidIndex(ArrayAddr, ArrayProperty, Index);
	*(bool*)RESULT_PARAM = WasValid;
}


Uploading new plugin version shortly.

:slight_smile: