// Fill out your copyright notice in the Description page of Project Settings. #include "UtilityLibrary.h" #include "GameFramework/PlayerController.h" #include "EnhancedInputSubsystems.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); } } void UlxUtilityLibrary::CallFunctionByName(UObject *object, const FString &namepart1, const FString &namepart2, const FString &fallback, bool bFailIfNotFound) { 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; } UFunction* function = object->FindFunction(FName(*fullname)); if (function == nullptr) { function = object->FindFunction(FName(*fallback)); if (function == nullptr) { if (!bFailIfNotFound) { return; } 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); } void UlxUtilityLibrary::AddMovementInputRightward(APawn *target, double ScaleValue, bool Force) { FRotator rotator = target->GetControlRotation(); rotator.Pitch = 0.0; rotator.Roll = 0.0; rotator.Yaw += 90.0; FVector vector = rotator.Vector(); target->AddMovementInput(vector, ScaleValue, Force); } void UlxUtilityLibrary::AddMovementInputForward(APawn *target, double ScaleValue, bool Force) { FRotator rotator = target->GetControlRotation(); rotator.Roll = 0.0; rotator.Pitch = 0.0; FVector vector = rotator.Vector(); target->AddMovementInput(vector, ScaleValue, Force); } UEnhancedInputLocalPlayerSubsystem *UlxUtilityLibrary::GetEnhancedInputLocalPlayerSubsystem(AController *Controller) { APlayerController *pc = Cast(Controller); if (pc != nullptr) { UEnhancedInputLocalPlayerSubsystem* subsys = ULocalPlayer::GetSubsystem(pc->GetLocalPlayer()); if (subsys != nullptr) { return subsys; } } return nullptr; }