2024-09-24 18:58:13 -04:00
|
|
|
// Fill out your copyright notice in the Description page of Project Settings.
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
#include "UtilityLibrary.h"
|
|
|
|
|
|
|
|
|
|
#define LOCTEXT_NAMESPACE "Luprex Utility"
|
|
|
|
|
|
|
|
|
|
void UlxUtilityLibrary::Assert(bool condition, const FString &message) {
|
|
|
|
|
if (!condition) {
|
|
|
|
|
FBlueprintExceptionInfo ExceptionInfo(EBlueprintExceptionType::FatalError, FText::FromString(message));
|
|
|
|
|
FBlueprintCoreDelegates::ThrowScriptException(FFrame::GetThreadLocalTopStackFrame()->Object, *FFrame::GetThreadLocalTopStackFrame(), ExceptionInfo);
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
2024-09-24 22:13:56 -04:00
|
|
|
void UlxUtilityLibrary::CallFunctionByName(UObject *object, const FString &namepart1, const FString &namepart2, const FString &fallback, bool bFailIfNotFound) {
|
2024-09-24 18:58:13 -04:00
|
|
|
FString fullname = namepart1 + namepart2;
|
|
|
|
|
if (!IsValid(object)) {
|
|
|
|
|
const FBlueprintExceptionInfo ExceptionInfo(
|
|
|
|
|
EBlueprintExceptionType::FatalError,
|
|
|
|
|
LOCTEXT("CallFunctionByName_ObjectIsNotValid", "In CallFunctionByName, object passed in is not valid.")
|
|
|
|
|
);
|
|
|
|
|
FBlueprintCoreDelegates::ThrowScriptException(FFrame::GetThreadLocalTopStackFrame()->Object, *FFrame::GetThreadLocalTopStackFrame(), ExceptionInfo);
|
|
|
|
|
return;
|
|
|
|
|
}
|
2024-09-30 13:59:17 -04:00
|
|
|
UFunction* function = object->FindFunction(FName(*fullname));
|
2024-09-24 18:58:13 -04:00
|
|
|
if (function == nullptr) {
|
|
|
|
|
function = object->FindFunction(FName(*fallback));
|
|
|
|
|
if (function == nullptr) {
|
2024-09-24 22:13:56 -04:00
|
|
|
if (!bFailIfNotFound) {
|
|
|
|
|
return;
|
|
|
|
|
}
|
2024-09-24 18:58:13 -04:00
|
|
|
const FBlueprintExceptionInfo ExceptionInfo(
|
|
|
|
|
EBlueprintExceptionType::FatalError,
|
|
|
|
|
LOCTEXT("CallFunctionByName_NoSuchFunction", "In CallFunctionByName, cannot find the named function or the fallback function.")
|
|
|
|
|
);
|
|
|
|
|
FBlueprintCoreDelegates::ThrowScriptException(FFrame::GetThreadLocalTopStackFrame()->Object, *FFrame::GetThreadLocalTopStackFrame(), ExceptionInfo);
|
|
|
|
|
return;
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
if (function->ParmsSize != 0) {
|
|
|
|
|
const FBlueprintExceptionInfo ExceptionInfo(
|
|
|
|
|
EBlueprintExceptionType::FatalError,
|
|
|
|
|
LOCTEXT("CallFunctionByName_FunctionHasParameters", "CallFunctionByName can only call functions that have no parameters and no return values.")
|
|
|
|
|
);
|
|
|
|
|
FBlueprintCoreDelegates::ThrowScriptException(FFrame::GetThreadLocalTopStackFrame()->Object, *FFrame::GetThreadLocalTopStackFrame(), ExceptionInfo);
|
|
|
|
|
return;
|
|
|
|
|
}
|
|
|
|
|
object->ProcessEvent(function, nullptr);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
FBox UlxUtilityLibrary::GetActorBounds(const AActor *target, bool bOnlyCollidingComponents, bool bIncludeFromChildActors)
|
|
|
|
|
{
|
|
|
|
|
FVector ActorOrigin;
|
|
|
|
|
FVector BoxExtent;
|
|
|
|
|
|
|
|
|
|
// First argument is bOnlyCollidingComponents - if you want to get the bounds for components that don't have collision enabled then set to false
|
|
|
|
|
// Last argument is bIncludeFromChildActors. Usually this won't do anything but if we've child-ed an actor - like a gun child-ed to a character
|
|
|
|
|
// then we wouldn't want the gun to be part of the bounds so set to false
|
|
|
|
|
target->GetActorBounds(bOnlyCollidingComponents, ActorOrigin, BoxExtent, bIncludeFromChildActors);
|
|
|
|
|
|
|
|
|
|
return FBox::BuildAABB(ActorOrigin, BoxExtent);
|
|
|
|
|
}
|