Blueprint Library Function Not Entered

I have set up a Blueprint function library to use for callbacks for all my menu buttons in UMG.
I’m not getting any error messages, but my ButonCallbackQuit function is never entered.
Instead, it is skipped and the next function GetHappyMessage is run.
Why is this?

In my header:

UFUNCTION(BlueprintCallable, Category = "VictoryBPLibrary")
	static FString GetHappyMessage();

UFUNCTION(BlueprintCallable, Category = "MenuUtilities")
	static void ButtonCallbackQuit(AActor * actor);

In my cpp:

FString UMenuUtilities::GetHappyMessage()
{
	return FString("Victory! Victory BP Library Works!");
}

void UMenuUtilities::ButtonCallbackQuit(AActor * actor)
{
	actor->()->Exec(actor->(), TEXT("quit")); // BREAK HERE
}

Thank you!

I believe you need to use the BlueprintPure specifier instead of BlueprintCallable

won’t blueprint pure mean i can’t have any side effects?

when i change the button callback to pure, it no longer has an exec pin for some reason

Yes, but that’s required for static functions. BlueprintCallable shouldn’t be on static functions.

so should i change the function to be nonstatic? changing the function to blueprint pure makes it seemingly unusable. sorry, i’m not sure what to do to accomplish the goal of setting up my sample c++ code to be used in blueprints. should i maybe remake a more general question?

May i ask why? I seen lot of non-pure static functions in KismetXXXLibrary classes

But Get functions indeed should be pure

Whats what Pure nodes is, they are getter nodes called if needed by blueprint VM to get output value, because of that they should not set/change anything only get or compute. You should definitely use them on “Get Happy Message”

Static functions can’t access instance state. BlueprintCallable implies that it is calling it on the instance. Libraries don’t really have an instance so that’s fine. Doing the same on some Actor derived class would not be correct

i did some further debugging and found that the library function was being entered and silently failing with an access violation, producing no side effects.
i opened a new issue to determine if that is intentional behaviour or to see if i’m doing something horribly wrong.

so far i’ve not received an answer as to whether or not this behaviour is a bug or if it is intentional