// Copyright Low Entry. Apache License, Version 2.0. #include "LowEntryExtendedStandardLibrary.h" #include "LowEntryHashingBCryptLibrary.h" #include "LowEntryHashingSha256Library.h" #include "LowEntryHashingSha512Library.h" #include "LowEntryHashingPearsonLibrary.h" #include "LowEntryHashingHashcashLibrary.h" #include "LowEntryLatentActionBoolean.h" #include "LowEntryLatentActionFloat.h" #include "LowEntryLatentActionInteger.h" #include "LowEntryLatentActionNone.h" #include "LowEntryLatentActionObject.h" #include "LowEntryLatentActionString.h" #include "LowEntryLatentActionStruct.h" #include "LowEntryParsedHashcash.h" #include "LowEntryByteArray.h" #include "LowEntryByteDataEntry.h" #include "LowEntryByteDataReader.h" #include "LowEntryByteDataWriter.h" #include "LowEntryBitDataEntry.h" #include "LowEntryBitDataReader.h" #include "LowEntryBitDataWriter.h" #include "LowEntryLong.h" #include "LowEntryDouble.h" #include "LowEntryExecutionQueue.h" #include "FLowEntryTickFrames.h" #include "FLowEntryTickSeconds.h" #include "FLowEntryDelayFramesAction.h" #include "FLowEntryExecutionQueueAction.h" #include "GenericTeamAgentInterface.h" #include "Misc/Base64.h" #include "Internationalization/Regex.h" #include "HAL/PlatformApplicationMisc.h" #include "GenericPlatform/GenericApplication.h" #include "GameMapsSettings.h" #include "IImageWrapperModule.h" #include "TextureResource.h" #include "Components/SceneCaptureComponent2D.h" #include "Engine/TextureRenderTarget2D.h" #include "Engine/GameViewportClient.h" #include "Engine/Engine.h" #include "Engine/LocalPlayer.h" #include "Engine/Texture2D.h" #include "Widgets/SViewport.h" #include "Framework/Application/SlateApplication.h" #include "Misc/ConfigCacheIni.h" #include "UObject/ObjectRedirector.h" ULowEntryExtendedStandardLibrary::ULowEntryExtendedStandardLibrary(const FObjectInitializer& ObjectInitializer) : Super(ObjectInitializer) {} void ULowEntryExtendedStandardLibrary::KismetSystemLibraryPrintString(UObject* WorldContextObject, const FString& InString, const float ScreenDurationTime, const bool bPrintToScreen, const bool bPrintToLog, const FLinearColor TextColor) { #if !(UE_BUILD_SHIPPING || UE_BUILD_TEST) FString Prefix; if (GEngine != nullptr) { WorldContextObject = GEngine->GetWorldFromContextObject(WorldContextObject, EGetWorldErrorMode::ReturnNull); if (WorldContextObject) { UWorld* World = WorldContextObject->GetWorld(); if (World->WorldType == EWorldType::PIE) { switch (World->GetNetMode()) { case NM_Client: // GPlayInEditorID 0 is always the server, so 1 will be first client. // You want to keep this logic in sync with GeneratePIEViewportWindowTitle and UpdatePlayInEditorWorldDebugString Prefix = FString::Printf(TEXT("Client %d: "), UE::GetPlayInEditorID()); break; case NM_DedicatedServer: case NM_ListenServer: Prefix = FString::Printf(TEXT("Server: ")); break; default: break; } } } } const FString FinalString = Prefix + InString; if (bPrintToLog) { UE_LOG(LogBlueprintUserMessages, Log, TEXT("%s"), *FinalString); } else { UE_LOG(LogBlueprintUserMessages, Verbose, TEXT("%s"), *FinalString); } if (bPrintToScreen) { if (GAreScreenMessagesEnabled) { if (GEngine != nullptr) { GEngine->AddOnScreenDebugMessage(INDEX_NONE, ScreenDurationTime, TextColor.ToFColor(true), FinalString); } } } #endif } bool ULowEntryExtendedStandardLibrary::DebugBuild() { #if UE_BUILD_DEBUG return true; #else return false; #endif } bool ULowEntryExtendedStandardLibrary::DevelopmentBuild() { #if UE_BUILD_DEVELOPMENT return true; #else return false; #endif } bool ULowEntryExtendedStandardLibrary::TestBuild() { #if UE_BUILD_TEST return true; #else return false; #endif } bool ULowEntryExtendedStandardLibrary::ShippingBuild() { #if UE_BUILD_SHIPPING return true; #else return false; #endif } bool ULowEntryExtendedStandardLibrary::WithEditor() { #if WITH_EDITOR return true; #else return false; #endif } bool ULowEntryExtendedStandardLibrary::Html5Platform() { #if defined( PLATFORM_HTML5 ) && PLATFORM_HTML5 return true; #else return false; #endif } bool ULowEntryExtendedStandardLibrary::WindowsPlatform() { #if defined( PLATFORM_WINDOWS ) && PLATFORM_WINDOWS return true; #else return false; #endif } bool ULowEntryExtendedStandardLibrary::Windows32Platform() { #if defined( PLATFORM_WINDOWS ) && PLATFORM_WINDOWS #ifdef _WIN64 return false; #else return true; #endif #else return false; #endif } bool ULowEntryExtendedStandardLibrary::Windows64Platform() { #if defined( PLATFORM_WINDOWS ) && PLATFORM_WINDOWS #ifdef _WIN64 return true; #else return false; #endif #else return false; #endif } bool ULowEntryExtendedStandardLibrary::WindowsRtPlatform() { #if defined( PLATFORM_WINRT ) && PLATFORM_WINRT return true; #else return false; #endif } bool ULowEntryExtendedStandardLibrary::WindowsRtArmPlatform() { #if defined( PLATFORM_WINRT_ARM ) && PLATFORM_WINRT_ARM return true; #else return false; #endif } bool ULowEntryExtendedStandardLibrary::LinuxPlatform() { #if defined( PLATFORM_LINUX ) && PLATFORM_LINUX return true; #else return false; #endif } bool ULowEntryExtendedStandardLibrary::MacPlatform() { #if defined( PLATFORM_MAC ) && PLATFORM_MAC return true; #else return false; #endif } bool ULowEntryExtendedStandardLibrary::Ps4Platform() { #if defined( PLATFORM_PS4 ) && PLATFORM_PS4 return true; #else return false; #endif } bool ULowEntryExtendedStandardLibrary::XboxOnePlatform() { #if defined( PLATFORM_XBOXONE ) && PLATFORM_XBOXONE return true; #else return false; #endif } bool ULowEntryExtendedStandardLibrary::SwitchPlatform() { #if defined( PLATFORM_SWITCH ) && PLATFORM_SWITCH return true; #else return false; #endif } bool ULowEntryExtendedStandardLibrary::AndroidPlatform() { #if defined( PLATFORM_ANDROID ) && PLATFORM_ANDROID return true; #else return false; #endif } bool ULowEntryExtendedStandardLibrary::IosPlatform() { #if defined( PLATFORM_IOS ) && PLATFORM_IOS return true; #else return false; #endif } bool ULowEntryExtendedStandardLibrary::DesktopPlatform() { #if defined( PLATFORM_DESKTOP ) && PLATFORM_DESKTOP return true; #else return false; #endif } FString ULowEntryExtendedStandardLibrary::GetProjectName() { FString Result; GConfig->GetString( TEXT("/Script/EngineSettings.GeneralProjectSettings"), TEXT("ProjectName"), Result, GGameIni ); return Result; } FString ULowEntryExtendedStandardLibrary::GetProjectVersion() { FString Result; GConfig->GetString( TEXT("/Script/EngineSettings.GeneralProjectSettings"), TEXT("ProjectVersion"), Result, GGameIni ); return Result; } void ULowEntryExtendedStandardLibrary::GetBatteryState(ELowEntryBatteryState& State, bool& Success) { #if defined( PLATFORM_ANDROID ) && PLATFORM_ANDROID Success = true; FAndroidMisc::FBatteryState Data = FAndroidMisc::GetBatteryState(); if(Data.State == FAndroidMisc::EBatteryState::BATTERY_STATE_CHARGING) { State = ELowEntryBatteryState::Charging; } else if(Data.State == FAndroidMisc::EBatteryState::BATTERY_STATE_DISCHARGING) { State = ELowEntryBatteryState::Discharging; } else if(Data.State == FAndroidMisc::EBatteryState::BATTERY_STATE_FULL) { State = ELowEntryBatteryState::Full; } else if(Data.State == FAndroidMisc::EBatteryState::BATTERY_STATE_NOT_CHARGING) { State = ELowEntryBatteryState::NotCharging; } else { State = ELowEntryBatteryState::Unknown; } #else Success = false; State = ELowEntryBatteryState::Unknown; #endif } void ULowEntryExtendedStandardLibrary::GetBatteryCharge(int32& Percentage, bool& Success) { #if defined( PLATFORM_ANDROID ) && PLATFORM_ANDROID Success = true; FAndroidMisc::FBatteryState Data = FAndroidMisc::GetBatteryState(); Percentage = Data.Level; #else Success = false; Percentage = 0; #endif } void ULowEntryExtendedStandardLibrary::GetBatteryTemperature(double& Celsius, bool& Success) { #if defined( PLATFORM_ANDROID ) && PLATFORM_ANDROID Success = true; FAndroidMisc::FBatteryState Data = FAndroidMisc::GetBatteryState(); Celsius = Data.Temperature; #else Success = false; Celsius = 0; #endif } void ULowEntryExtendedStandardLibrary::GetCurrentVolumePercentage(double& Percentage, bool& Success) { #if defined( PLATFORM_ANDROID ) && PLATFORM_ANDROID Success = true; Percentage = (FAndroidMisc::GetVolumeState(nullptr) / 15.0f); #else Success = false; Percentage = 0; #endif } void ULowEntryExtendedStandardLibrary::GetAndroidVolume(int& Volume) { #if defined( PLATFORM_ANDROID ) && PLATFORM_ANDROID Volume = FAndroidMisc::GetVolumeState(nullptr); #else Volume = 0; #endif } FString ULowEntryExtendedStandardLibrary::GetAndroidDeviceMake() { #if defined( PLATFORM_ANDROID ) && PLATFORM_ANDROID return FAndroidMisc::GetDeviceMake(); #else return TEXT(""); #endif } FString ULowEntryExtendedStandardLibrary::GetAndroidDeviceModel() { #if defined( PLATFORM_ANDROID ) && PLATFORM_ANDROID return FAndroidMisc::GetDeviceModel(); #else return TEXT(""); #endif } FString ULowEntryExtendedStandardLibrary::GetAndroidVersion() { #if defined( PLATFORM_ANDROID ) && PLATFORM_ANDROID return FAndroidMisc::GetAndroidVersion(); #else return TEXT(""); #endif } FString ULowEntryExtendedStandardLibrary::GetAndroidOsLanguage() { #if defined( PLATFORM_ANDROID ) && PLATFORM_ANDROID return FAndroidMisc::GetOSLanguage(); #else return TEXT(""); #endif } FString ULowEntryExtendedStandardLibrary::GetAndroidDefaultLocale() { #if defined( PLATFORM_ANDROID ) && PLATFORM_ANDROID return FAndroidMisc::GetDefaultLocale(); #else return TEXT(""); #endif } FString ULowEntryExtendedStandardLibrary::GetAndroidGpuFamily() { #if defined( PLATFORM_ANDROID ) && PLATFORM_ANDROID return FAndroidMisc::GetGPUFamily(); #else return TEXT(""); #endif } FString ULowEntryExtendedStandardLibrary::GetAndroidGlVersion() { #if defined( PLATFORM_ANDROID ) && PLATFORM_ANDROID return FAndroidMisc::GetGLVersion(); #else return TEXT(""); #endif } int32 ULowEntryExtendedStandardLibrary::GetAndroidBuildVersion() { #if defined( PLATFORM_ANDROID ) && PLATFORM_ANDROID return FAndroidMisc::GetAndroidBuildVersion(); #else return -1; #endif } int32 ULowEntryExtendedStandardLibrary::GetAndroidNumberOfCores() { #if defined( PLATFORM_ANDROID ) && PLATFORM_ANDROID return FAndroidMisc::NumberOfCores(); #else return -1; #endif } bool ULowEntryExtendedStandardLibrary::AreAndroidHeadphonesPluggedIn() { #if defined( PLATFORM_ANDROID ) && PLATFORM_ANDROID return FAndroidMisc::AreHeadPhonesPluggedIn(); #else return false; #endif } void ULowEntryExtendedStandardLibrary::GetCurrentVolume(int32& Volume, bool& Success) { Success = false; Volume = 0; } void ULowEntryExtendedStandardLibrary::GetMaximumVolume(int32& Volume, bool& Success) { Success = false; Volume = 0; } void ULowEntryExtendedStandardLibrary::CreateObject(TSubclassOf Class, UObject*& Object) { Object = NewObject(reinterpret_cast(GetTransientPackage()), Class); } void ULowEntryExtendedStandardLibrary::GetGenericTeamId(AActor* Target, uint8& TeamID) { IGenericTeamAgentInterface* TeamAgentInterface = nullptr; if (Target != nullptr) { TeamAgentInterface = Cast(Target); } if (TeamAgentInterface == nullptr) { TeamID = FGenericTeamId::NoTeam; } else { TeamID = TeamAgentInterface->GetGenericTeamId(); } } void ULowEntryExtendedStandardLibrary::SetGenericTeamId(AActor* Target, const uint8 TeamID) { if (Target == nullptr) { return; } IGenericTeamAgentInterface* TeamAgentInterface = Cast(Target); if (TeamAgentInterface == nullptr) { return; } TeamAgentInterface->SetGenericTeamId(TeamID); } void ULowEntryExtendedStandardLibrary::SoundClass_SetVolume(USoundClass* SoundClass, const double Volume) { if (SoundClass == nullptr) { return; } SoundClass->Properties.Volume = Volume; } double ULowEntryExtendedStandardLibrary::SoundClass_GetVolume(USoundClass* SoundClass) { if (SoundClass == nullptr) { return 0; } return SoundClass->Properties.Volume; } void ULowEntryExtendedStandardLibrary::SoundClass_SetPitch(USoundClass* SoundClass, const double Pitch) { if (SoundClass == nullptr) { return; } SoundClass->Properties.Pitch = Pitch; } double ULowEntryExtendedStandardLibrary::SoundClass_GetPitch(USoundClass* SoundClass) { if (SoundClass == nullptr) { return 0; } return SoundClass->Properties.Pitch; } void ULowEntryExtendedStandardLibrary::LatentAction_Create_Boolean(ULowEntryLatentActionBoolean*& LatentAction) { LatentAction = ULowEntryLatentActionBoolean::Create(); } void ULowEntryExtendedStandardLibrary::LatentAction_Create_Float(ULowEntryLatentActionFloat*& LatentAction) { LatentAction = ULowEntryLatentActionFloat::Create(); } void ULowEntryExtendedStandardLibrary::LatentAction_Create_Integer(ULowEntryLatentActionInteger*& LatentAction) { LatentAction = ULowEntryLatentActionInteger::Create(); } void ULowEntryExtendedStandardLibrary::LatentAction_Create_None(ULowEntryLatentActionNone*& LatentAction) { LatentAction = ULowEntryLatentActionNone::Create(); } void ULowEntryExtendedStandardLibrary::LatentAction_Create_Object(ULowEntryLatentActionObject*& LatentAction) { LatentAction = ULowEntryLatentActionObject::Create(); } void ULowEntryExtendedStandardLibrary::LatentAction_Create_String(ULowEntryLatentActionString*& LatentAction) { LatentAction = ULowEntryLatentActionString::Create(); } void ULowEntryExtendedStandardLibrary::LatentAction_Create_Struct(ULowEntryLatentActionStruct*& LatentAction) { LatentAction = ULowEntryLatentActionStruct::Create(); } bool ULowEntryExtendedStandardLibrary::AreBytesEqual(const TArray& A, const TArray& B, int32 IndexA, int32 LengthA, int32 IndexB, int32 LengthB) { if (IndexA < 0) { LengthA += IndexA; IndexA = 0; } if (LengthA > (A.Num() - IndexA)) { LengthA = A.Num() - IndexA; } if (LengthA < 0) { LengthA = 0; } if (IndexB < 0) { LengthB += IndexB; IndexB = 0; } if (LengthB > (B.Num() - IndexB)) { LengthB = B.Num() - IndexB; } if (LengthB < 0) { LengthB = 0; } if (LengthA != LengthB) { return false; } for (int32 i = 0; i < LengthA; i++) { if (A[IndexA + i] != B[IndexB + i]) { return false; } } return true; } void ULowEntryExtendedStandardLibrary::SplitBytes(const TArray& ByteArray, const int32 LengthA, TArray& A, TArray& B) { if (LengthA <= 0) { A = TArray(); B = ByteArray; return; } if (LengthA >= ByteArray.Num()) { A = ByteArray; B = TArray(); return; } A = TArray(); A.Append(ByteArray.GetData(), LengthA); B = TArray(); B.Append(ByteArray.GetData() + LengthA, ByteArray.Num() - LengthA); } TArray ULowEntryExtendedStandardLibrary::MergeBytes(TArray A, TArray B) { if (A.Num() <= 0) { return B; } if (B.Num() <= 0) { return A; } TArray ReturnArray = TArray(); ReturnArray.Reserve(A.Num() + B.Num()); ReturnArray.Append(A.GetData(), A.Num()); ReturnArray.Append(B.GetData(), B.Num()); return ReturnArray; } TArray ULowEntryExtendedStandardLibrary::BytesSubArray(const TArray& ByteArray, int32 Index, int32 Length) { if (ByteArray.Num() <= 0) { return TArray(); } if (Index < 0) { Length += Index; Index = 0; } if (Length > ByteArray.Num() - Index) { Length = ByteArray.Num() - Index; } if (Length <= 0) { return TArray(); } if ((Index == 0) && (Length == ByteArray.Num())) { return ByteArray; } TArray ReturnArray = TArray(); ReturnArray.Append(ByteArray.GetData() + Index, Length); return ReturnArray; } void ULowEntryExtendedStandardLibrary::GenerateRandomBytes(const int32 Length, TArray& ByteArray) { if (Length <= 0) { ByteArray.SetNum(0); return; } ByteArray.SetNum(Length); for (int32 i = 0; i < Length; i++) { int32 RandomByte = FMath::Rand() & 0xff; ByteArray[i] = RandomByte; } } void ULowEntryExtendedStandardLibrary::GenerateRandomBytesRandomLength(int32 MinLength, int32 MaxLength, TArray& ByteArray) { if (MinLength < 0) { MinLength = 0; } if (MaxLength < 0) { MaxLength = 0; } int32 Diff = 0; int32 Min = 0; if (MaxLength >= MinLength) { Diff = MaxLength - MinLength; Min = MinLength; } else { Diff = MinLength - MaxLength; Min = MaxLength; } if (Min < 0) { Min = 0; } if (Diff < 0) { Diff = 0; } if ((Min == 0) && (Diff == 0)) { ByteArray.SetNum(0); return; } int32 Length = (FMath::Rand() % (Diff + 1)) + Min; if (Length <= 0) { ByteArray.SetNum(0); return; } ByteArray.SetNum(Length); for (int32 i = 0; i < Length; i++) { int32 RandomByte = FMath::Rand() & 0xff; ByteArray[i] = RandomByte; } } TArray ULowEntryExtendedStandardLibrary::StringToBytesUtf8(const FString& String) { if (String.Len() <= 0) { return TArray(); } const FTCHARToUTF8 Src = FTCHARToUTF8(String.GetCharArray().GetData()); return TArray(reinterpret_cast(Src.Get()), Src.Length()); } FString ULowEntryExtendedStandardLibrary::BytesToStringUtf8(const TArray& ByteArray, int32 Index, int32 Length) { if (ByteArray.Num() <= 0) { return TEXT(""); } if (Index < 0) { Length += Index; Index = 0; } if (Length > ByteArray.Num() - Index) { Length = ByteArray.Num() - Index; } if (Length <= 0) { return TEXT(""); } const FUTF8ToTCHAR Src(reinterpret_cast(ByteArray.GetData() + Index), Length); return FString(Src.Length(), Src.Get()); } TArray ULowEntryExtendedStandardLibrary::Base64ToBytes(const FString& Base64) { TArray ByteArray; bool Success = FBase64::Decode(Base64, ByteArray); if (!Success) { return TArray(); } return ByteArray; } FString ULowEntryExtendedStandardLibrary::BytesToBase64(const TArray& ByteArray, int32 Index, int32 Length) { if (ByteArray.Num() <= 0) { return TEXT(""); } if (Index < 0) { Length += Index; Index = 0; } if (Length > ByteArray.Num() - Index) { Length = ByteArray.Num() - Index; } if (Length <= 0) { return TEXT(""); } if ((Index == 0) && (Length == ByteArray.Num())) { return FBase64::Encode(ByteArray); } return FBase64::Encode(BytesSubArray(ByteArray, Index, Length)); } FString ULowEntryExtendedStandardLibrary::Base64ToBase64Url(const FString& Base64) { FString Fixed = Base64; Fixed.ReplaceInline(TEXT("+"), TEXT("-")); Fixed.ReplaceInline(TEXT("/"), TEXT("_")); Fixed.ReplaceInline(TEXT("="), TEXT("")); return Fixed; } FString ULowEntryExtendedStandardLibrary::Base64UrlToBase64(const FString& Base64Url) { FString Fixed = Base64Url; Fixed.ReplaceInline(TEXT("-"), TEXT("+")); Fixed.ReplaceInline(TEXT("_"), TEXT("/")); return Fixed; } TArray ULowEntryExtendedStandardLibrary::Base64UrlToBytes(const FString& Base64Url) { return Base64ToBytes(Base64UrlToBase64(Base64Url)); } FString ULowEntryExtendedStandardLibrary::BytesToBase64Url(const TArray& ByteArray, int32 Index, int32 Length) { return Base64ToBase64Url(BytesToBase64(ByteArray, Index, Length)); } TArray ULowEntryExtendedStandardLibrary::HexToBytes(const FString& Hex) { FString String = Hex.Replace(TEXT(" "), TEXT("")); if (String.Len() <= 0) { return TArray(); } for (const TCHAR c : String) { if (!CheckTCharIsHex(c)) { return TArray(); } } uint8* Bytes = new uint8[String.Len()]; int32 ByteCount = ::HexToBytes(String, Bytes); TArray ByteArray; ByteArray.Append(Bytes, ByteCount); delete [] Bytes; return ByteArray; } FString ULowEntryExtendedStandardLibrary::BytesToHex(const TArray& ByteArray, const bool AddSpaces, int32 Index, int32 Length) { if (ByteArray.Num() <= 0) { return TEXT(""); } if (Index < 0) { Length += Index; Index = 0; } if (Length > ByteArray.Num() - Index) { Length = ByteArray.Num() - Index; } if (Length <= 0) { return TEXT(""); } FString Hex = ::BytesToHex(ByteArray.GetData() + Index, Length); if (!AddSpaces) { return Hex; } FString String; String.Reserve((Hex.Len() / 2) * 3); for (int32 i = 1; i <= Hex.Len(); i++) { String.AppendChar(Hex[i - 1]); if (((i % 2) == 0) && (i < (Hex.Len() - 1))) { String.Append(TEXT(" ")); } } return String; } TArray ULowEntryExtendedStandardLibrary::BinaryToBytes(const FString& Binary) { if (Binary.Len() <= 0) { return TArray(); } FString String = Binary.Replace(TEXT(" "), TEXT("")); if ((String.Len() <= 0) || ((String.Len() % 8) != 0)) { return TArray(); } TArray Bytes; Bytes.SetNum(String.Len() / 8); int32 Index = 0; for (int32 i = 0; i < String.Len(); i += 8) { uint8 b = 0; for (int32 j = 0; j < 8; j++) { if (String[i + j] == '0') { continue; } if (String[i + j] == '1') { b += (1 << (7 - j)); } else { // encountered invalid character return TArray(); } } Bytes[Index] = b; Index++; } return Bytes; } FString ULowEntryExtendedStandardLibrary::BytesToBinary(const TArray& ByteArray, const bool AddSpaces, int32 Index, int32 Length) { if (ByteArray.Num() <= 0) { return TEXT(""); } if (Index < 0) { Length += Index; Index = 0; } if (Length > ByteArray.Num() - Index) { Length = ByteArray.Num() - Index; } if (Length <= 0) { return TEXT(""); } FString String; String.Reserve(Length * (AddSpaces ? 9 : 8)); for (int32 i = 1; i <= Length; i++) { for (int32 j = 7; j >= 0; j--) { if ((ByteArray[Index + (i - 1)] & (1 << j)) > 0) { String.Append(TEXT("1")); } else { String.Append(TEXT("0")); } } if (AddSpaces && (i < Length)) { String.Append(TEXT(" ")); } } return String; } TArray ULowEntryExtendedStandardLibrary::BitStringToBytes(const FString& Binary) { if (Binary.Len() <= 0) { return TArray(); } FString String = Binary.Replace(TEXT(" "), TEXT("")); if ((String.Len() <= 0) || ((String.Len() % 8) != 0)) { return TArray(); } TArray Bytes; Bytes.SetNum(String.Len() / 8); int32 Index = 0; for (int32 i = 0; i < String.Len(); i += 8) { uint8 b = 0; for (int32 j = 0; j < 8; j++) { if (String[i + j] == '0') { continue; } if (String[i + j] == '1') { b += (1 << j); } else { // encountered invalid character return TArray(); } } Bytes[Index] = b; Index++; } return Bytes; } FString ULowEntryExtendedStandardLibrary::BytesToBitString(const TArray& ByteArray, const bool AddSpaces, int32 Index, int32 Length) { if (ByteArray.Num() <= 0) { return TEXT(""); } if (Index < 0) { Length += Index; Index = 0; } if (Length > ByteArray.Num() - Index) { Length = ByteArray.Num() - Index; } if (Length <= 0) { return TEXT(""); } FString String; String.Reserve(Length * (AddSpaces ? 9 : 8)); for (int32 i = 1; i <= Length; i++) { for (int32 j = 0; j < 8; j++) { if ((ByteArray[Index + (i - 1)] & (1 << j)) > 0) { String.Append(TEXT("1")); } else { String.Append(TEXT("0")); } } if (AddSpaces && (i < Length)) { String.Append(TEXT(" ")); } } return String; } TArray ULowEntryExtendedStandardLibrary::BooleanToBytes(const bool Value) { TArray ByteArray; ByteArray.SetNum(1); if (Value) { ByteArray[0] = 0x01; } else { ByteArray[0] = 0x00; } return ByteArray; } bool ULowEntryExtendedStandardLibrary::BytesToBoolean(const TArray& ByteArray, int32 Index, int32 Length) { if (ByteArray.Num() <= 0) { return false; } if (Index < 0) { Length += Index; Index = 0; } if (Length > ByteArray.Num() - Index) { Length = ByteArray.Num() - Index; } if (Length <= 0) { return false; } return (ByteArray[Index] == 0x01); } uint8 ULowEntryExtendedStandardLibrary::BooleanToByte(const bool Value) { if (Value) { return 0x01; } return 0x00; } bool ULowEntryExtendedStandardLibrary::ByteToBoolean(const uint8 Byte) { return (Byte == 0x01); } TArray ULowEntryExtendedStandardLibrary::IntegerToBytes(const int32 Value) { TArray ByteArray; ByteArray.SetNum(4); ByteArray[0] = (Value >> 24); ByteArray[1] = (Value >> 16); ByteArray[2] = (Value >> 8); ByteArray[3] = (Value); return ByteArray; } int32 ULowEntryExtendedStandardLibrary::BytesToInteger(const TArray& ByteArray, int32 Index, int32 Length) { if (ByteArray.Num() <= 0) { return 0; } if (Index < 0) { Length += Index; Index = 0; } if (Length > ByteArray.Num() - Index) { Length = ByteArray.Num() - Index; } if (Length <= 0) { return 0; } if (Length <= 1) { return ByteArray[Index + 0]; } if (Length <= 2) { return (ByteArray[Index + 0] << 8) | ByteArray[Index + 1]; } if (Length <= 3) { return (ByteArray[Index + 0] << 16) | (ByteArray[Index + 1] << 8) | ByteArray[Index + 2]; } return (ByteArray[Index + 0] << 24) | (ByteArray[Index + 1] << 16) | (ByteArray[Index + 2] << 8) | ByteArray[Index + 3]; } TArray ULowEntryExtendedStandardLibrary::LongToBytes(const int64 Value) { TArray ByteArray; ByteArray.SetNum(8); ByteArray[0] = (Value >> 56); ByteArray[1] = (Value >> 48); ByteArray[2] = (Value >> 40); ByteArray[3] = (Value >> 32); ByteArray[4] = (Value >> 24); ByteArray[5] = (Value >> 16); ByteArray[6] = (Value >> 8); ByteArray[7] = (Value); return ByteArray; } int64 ULowEntryExtendedStandardLibrary::BytesToLong(const TArray& ByteArray, int32 Index, int32 Length) { if (ByteArray.Num() <= 0) { return 0; } if (Index < 0) { Length += Index; Index = 0; } if (Length > ByteArray.Num() - Index) { Length = ByteArray.Num() - Index; } if (Length <= 0) { return 0; } if (Length <= 1) { return ByteArray[Index + 0]; } if (Length <= 2) { return (static_cast(ByteArray[Index + 0]) << 8) | static_cast(ByteArray[Index + 1]); } if (Length <= 3) { return (static_cast(ByteArray[Index + 0]) << 16) | (static_cast(ByteArray[Index + 1]) << 8) | static_cast(ByteArray[Index + 2]); } if (Length <= 4) { return (static_cast(ByteArray[Index + 0]) << 24) | (static_cast(ByteArray[Index + 1]) << 16) | (static_cast(ByteArray[Index + 2]) << 8) | static_cast(ByteArray[Index + 3]); } if (Length <= 5) { return (static_cast(ByteArray[Index + 0]) << 32) | (static_cast(ByteArray[Index + 1]) << 24) | (static_cast(ByteArray[Index + 2]) << 16) | (static_cast(ByteArray[Index + 3]) << 8) | static_cast(ByteArray[Index + 4]); } if (Length <= 6) { return (static_cast(ByteArray[Index + 0]) << 40) | (static_cast(ByteArray[Index + 1]) << 32) | (static_cast(ByteArray[Index + 2]) << 24) | (static_cast(ByteArray[Index + 3]) << 16) | (static_cast(ByteArray[Index + 4]) << 8) | static_cast(ByteArray[Index + 5]); } if (Length <= 7) { return (static_cast(ByteArray[Index + 0]) << 48) | (static_cast(ByteArray[Index + 1]) << 40) | (static_cast(ByteArray[Index + 2]) << 32) | (static_cast(ByteArray[Index + 3]) << 24) | (static_cast(ByteArray[Index + 4]) << 16) | (static_cast(ByteArray[Index + 5]) << 8) | static_cast(ByteArray[Index + 6]); } return (static_cast(ByteArray[Index + 0]) << 56) | (static_cast(ByteArray[Index + 1]) << 48) | (static_cast(ByteArray[Index + 2]) << 40) | (static_cast(ByteArray[Index + 3]) << 32) | (static_cast(ByteArray[Index + 4]) << 24) | (static_cast(ByteArray[Index + 5]) << 16) | (static_cast(ByteArray[Index + 6]) << 8) | static_cast(ByteArray[Index + 7]); } ULowEntryLong* ULowEntryExtendedStandardLibrary::BytesToLongBytes(const TArray& ByteArray, int32 Index, int32 Length) { return ULowEntryLong::Create(ByteArray, Index, Length); } int64 ULowEntryExtendedStandardLibrary::ParseStringIntoLong(const FString& String) { return FCString::Atoi64(*String); } ULowEntryLong* ULowEntryExtendedStandardLibrary::ParseStringIntoLongBytes(const FString& String) { return BytesToLongBytes(LongToBytes(FCString::Atoi64(*String))); } TArray ULowEntryExtendedStandardLibrary::FloatToBytes(const float Value) { const int32 IntValue = *reinterpret_cast(&Value); return IntegerToBytes(IntValue); } float ULowEntryExtendedStandardLibrary::BytesToFloat(const TArray& ByteArray, int32 Index, int32 Length) { int32 IntValue = BytesToInteger(ByteArray, Index, Length); return *reinterpret_cast(&IntValue); } TArray ULowEntryExtendedStandardLibrary::DoubleToBytes(const double Value) { const int64 LongValue = *reinterpret_cast(&Value); return LongToBytes(LongValue); } double ULowEntryExtendedStandardLibrary::BytesToDouble(const TArray& ByteArray, int32 Index, int32 Length) { int64 LongValue = BytesToLong(ByteArray, Index, Length); return *reinterpret_cast(&LongValue); } ULowEntryDouble* ULowEntryExtendedStandardLibrary::BytesToDoubleBytes(const TArray& ByteArray, int32 Index, int32 Length) { return ULowEntryDouble::Create(ByteArray, Index, Length); } ULowEntryDouble* ULowEntryExtendedStandardLibrary::ParseStringIntoDoubleBytes(const FString& String) { return BytesToDoubleBytes(DoubleToBytes(FCString::Atod(*String))); } TArray ULowEntryExtendedStandardLibrary::ByteToBytes(const uint8 Value) { TArray ByteArray; ByteArray.SetNum(1); ByteArray[0] = Value; return ByteArray; } uint8 ULowEntryExtendedStandardLibrary::BytesToByte(const TArray& ByteArray, int32 Index, int32 Length) { if (ByteArray.Num() <= 0) { return false; } if (Index < 0) { Length += Index; Index = 0; } if (Length > ByteArray.Num() - Index) { Length = ByteArray.Num() - Index; } if (Length <= 0) { return false; } return ByteArray[Index]; } void ULowEntryExtendedStandardLibrary::BitsToByte(const bool Bit1, const bool Bit2, const bool Bit3, const bool Bit4, const bool Bit5, const bool Bit6, const bool Bit7, const bool Bit8, uint8& Byte) { uint8 B = 0; if (Bit8) { B |= (1 << 7); } if (Bit7) { B |= (1 << 6); } if (Bit6) { B |= (1 << 5); } if (Bit5) { B |= (1 << 4); } if (Bit4) { B |= (1 << 3); } if (Bit3) { B |= (1 << 2); } if (Bit2) { B |= (1 << 1); } if (Bit1) { B |= (1 << 0); } Byte = B; } void ULowEntryExtendedStandardLibrary::ByteToBits(const uint8 Byte, bool& Bit1, bool& Bit2, bool& Bit3, bool& Bit4, bool& Bit5, bool& Bit6, bool& Bit7, bool& Bit8) { Bit8 = (((Byte >> 7) & 1) != 0); Bit7 = (((Byte >> 6) & 1) != 0); Bit6 = (((Byte >> 5) & 1) != 0); Bit5 = (((Byte >> 4) & 1) != 0); Bit4 = (((Byte >> 3) & 1) != 0); Bit3 = (((Byte >> 2) & 1) != 0); Bit2 = (((Byte >> 1) & 1) != 0); Bit1 = (((Byte >> 0) & 1) != 0); } bool ULowEntryExtendedStandardLibrary::IsBitSet(const uint8 B, const int32 Bit) { return (((B >> (Bit - 1)) & 1) != 0); } uint8 ULowEntryExtendedStandardLibrary::GetByteWithBitSet(const uint8 Byte, const int32 Bit, const bool Value) { if (Value) { return Byte | (1 << (Bit - 1)); } return Byte & ~(1 << (Bit - 1)); } UTexture2D* ULowEntryExtendedStandardLibrary::BytesToImage(const TArray& ByteArray, const ELowEntryImageFormat ImageFormat, int32 Index, int32 Length) { if (ByteArray.Num() <= 0) { return nullptr; } if (Index < 0) { Length += Index; Index = 0; } if (Length > ByteArray.Num() - Index) { Length = ByteArray.Num() - Index; } if (Length <= 0) { return nullptr; } IImageWrapperModule* ImageWrapperModule = FModuleManager::LoadModulePtr("ImageWrapper"); if (ImageWrapperModule == nullptr) { return nullptr; } TSharedPtr ImageWrapper = ImageWrapperModule->CreateImageWrapper(ELowEntryImageFormatToUE4(ImageFormat)); if (!ImageWrapper.IsValid() || !ImageWrapper->SetCompressed(ByteArray.GetData() + Index, Length)) { return nullptr; } TArray Uncompressed; if (!ImageWrapper->GetRaw(ERGBFormat::BGRA, 8, Uncompressed)) { return nullptr; } return DataToTexture2D(ImageWrapper->GetWidth(), ImageWrapper->GetHeight(), Uncompressed.GetData(), Uncompressed.Num()); } UTexture2D* ULowEntryExtendedStandardLibrary::BytesToExistingImage(bool& ReusedGivenTexture2D, UTexture2D* Texture2D, const TArray& ByteArray, const ELowEntryImageFormat ImageFormat, int32 Index, int32 Length) { ReusedGivenTexture2D = false; if (ByteArray.Num() <= 0) { ReusedGivenTexture2D = (Texture2D == nullptr); return nullptr; } if (Index < 0) { Length += Index; Index = 0; } if (Length > ByteArray.Num() - Index) { Length = ByteArray.Num() - Index; } if (Length <= 0) { ReusedGivenTexture2D = (Texture2D == nullptr); return nullptr; } IImageWrapperModule* ImageWrapperModule = FModuleManager::LoadModulePtr("ImageWrapper"); if (ImageWrapperModule == nullptr) { ReusedGivenTexture2D = (Texture2D == nullptr); return nullptr; } TSharedPtr ImageWrapper = ImageWrapperModule->CreateImageWrapper(ELowEntryImageFormatToUE4(ImageFormat)); if (!ImageWrapper.IsValid() || !ImageWrapper->SetCompressed(ByteArray.GetData() + Index, Length)) { ReusedGivenTexture2D = (Texture2D == nullptr); return nullptr; } TArray Uncompressed; if (!ImageWrapper->GetRaw(ERGBFormat::BGRA, 8, Uncompressed)) { ReusedGivenTexture2D = (Texture2D == nullptr); return nullptr; } UTexture2D* NewTexture2D = DataToExistingTexture2D(Texture2D, ImageWrapper->GetWidth(), ImageWrapper->GetHeight(), Uncompressed.GetData(), Uncompressed.Num()); ReusedGivenTexture2D = (Texture2D == NewTexture2D); return NewTexture2D; } void ULowEntryExtendedStandardLibrary::Texture2DToBytes(UTexture2D* Texture2D, const ELowEntryImageFormat ImageFormat, TArray& ByteArray, const int32 CompressionQuality) { ByteArray = TArray(); if (Texture2D == nullptr) { return; } int32 Mip0Width = 0; int32 Mip0Height = 0; TArray Pixels; Texture2DToPixels(Texture2D, Mip0Width, Mip0Height, Pixels); PixelsToBytes(Mip0Width, Mip0Height, Pixels, ImageFormat, ByteArray, CompressionQuality); } void ULowEntryExtendedStandardLibrary::BytesToPixels(const TArray& ByteArray, const ELowEntryImageFormat ImageFormat, int32& Width, int32& Height, TArray& Pixels, int32 Index, int32 Length) { Width = 0; Height = 0; Pixels = TArray(); if (ByteArray.Num() <= 0) { return; } if (Index < 0) { Length += Index; Index = 0; } if (Length > ByteArray.Num() - Index) { Length = ByteArray.Num() - Index; } if (Length <= 0) { return; } IImageWrapperModule& ImageWrapperModule = FModuleManager::LoadModuleChecked(FName("ImageWrapper")); TSharedPtr ImageWrapper = ImageWrapperModule.CreateImageWrapper(ELowEntryImageFormatToUE4(ImageFormat)); if (!ImageWrapper.IsValid() || !ImageWrapper->SetCompressed(ByteArray.GetData() + Index, Length)) { return; } TArray Uncompressed; if (!ImageWrapper->GetRaw(ERGBFormat::BGRA, 8, Uncompressed)) { return; } const void* Raw = Uncompressed.GetData(); const FColor* DataPixels = static_cast(Raw); int32 DataWidth = ImageWrapper->GetWidth(); int32 DataHeight = ImageWrapper->GetHeight(); int32 Total = DataWidth * DataHeight; Pixels.SetNum(Total); for (int32 i = 0; i < Total; i++) { Pixels[i] = DataPixels[i]; } Width = DataWidth; Height = DataHeight; } void ULowEntryExtendedStandardLibrary::PixelsToBytes(const int32 Width, const int32 Height, const TArray& Pixels, const ELowEntryImageFormat ImageFormat, TArray& ByteArray, const int32 CompressionQuality) { ByteArray = TArray(); //FImageUtils::CompressImageArray(Width, Height, Pixels, ByteArray); //return; if ((Width <= 0) || (Height <= 0)) { return; } if ((CompressionQuality < 0) || (CompressionQuality > 100)) { UE_LOG(LogBlueprintUserMessages, Error, TEXT("in PixelsToBytes, an invalid CompressionQuality (%i) has been given, should be 1-100 or 0 for the default value"), CompressionQuality); return; } int32 Total = Width * Height; if (Total != Pixels.Num()) { UE_LOG(LogBlueprintUserMessages, Error, TEXT("in PixelsToBytes, the number of given Pixels (%i) don't match the given Width (%i) x Height (%i) (Width x Height: %i)"), Pixels.Num(), Width, Height, Total); return; } if (ImageFormat == ELowEntryImageFormat::Invalid) { UE_LOG(LogBlueprintUserMessages, Error, TEXT("in PixelsToBytes, Invalid compression is not supported")); return; } if (ImageFormat == ELowEntryImageFormat::BMP) { UE_LOG(LogBlueprintUserMessages, Error, TEXT("in PixelsToBytes, BMP compression is not supported")); return; } if (ImageFormat == ELowEntryImageFormat::ICO) { UE_LOG(LogBlueprintUserMessages, Error, TEXT("in PixelsToBytes, ICO compression is not supported")); return; } if (ImageFormat == ELowEntryImageFormat::ICNS) { UE_LOG(LogBlueprintUserMessages, Error, TEXT("in PixelsToBytes, ICNS compression is not supported")); return; } if (ImageFormat == ELowEntryImageFormat::GrayscaleJPEG) { // Images are saved as RGBA but FColors are stored as Gray TArray MutablePixels; for (int32 i = 0; i < Total; i++) { MutablePixels.Add(static_cast(FMath::RoundToDouble((0.2125 * Pixels[i].R) + (0.7154 * Pixels[i].G) + (0.0721 * Pixels[i].B)))); } IImageWrapperModule& ImageWrapperModule = FModuleManager::LoadModuleChecked(FName("ImageWrapper")); TSharedPtr ImageWrapper = ImageWrapperModule.CreateImageWrapper(ELowEntryImageFormatToUE4(ImageFormat)); if (!ImageWrapper.IsValid() || !ImageWrapper->SetRaw(MutablePixels.GetData(), MutablePixels.Num(), Width, Height, ERGBFormat::Gray, 8)) { return; } ByteArray = ImageWrapper->GetCompressed(CompressionQuality); } else { // Images are saved as RGBA but FColors are stored as BGRA TArray MutablePixels = Pixels; for (int32 i = 0; i < Total; i++) { MutablePixels[i].R = Pixels[i].B; MutablePixels[i].B = Pixels[i].R; } IImageWrapperModule& ImageWrapperModule = FModuleManager::LoadModuleChecked(FName("ImageWrapper")); TSharedPtr ImageWrapper = ImageWrapperModule.CreateImageWrapper(ELowEntryImageFormatToUE4(ImageFormat)); if (!ImageWrapper.IsValid() || !ImageWrapper->SetRaw(&MutablePixels[0], MutablePixels.Num() * sizeof(FColor), Width, Height, ERGBFormat::RGBA, 8)) { return; } ByteArray = ImageWrapper->GetCompressed(CompressionQuality); } } FColor ULowEntryExtendedStandardLibrary::GrayscalePixel(const FColor& Pixel) { uint8 Gray = static_cast(FMath::RoundToDouble((0.2125 * Pixel.R) + (0.7154 * Pixel.G) + (0.0721 * Pixel.B))); return FColor(Gray, Gray, Gray, Pixel.A); } TArray ULowEntryExtendedStandardLibrary::GrayscalePixels(const TArray& Pixels) { TArray Result; for (const FColor& Pixel : Pixels) { Result.Add(GrayscalePixel(Pixel)); } return Result; } TArray ULowEntryExtendedStandardLibrary::FlipPixelChannelsRG(const TArray& Pixels) { TArray Result; for (const FColor& Pixel : Pixels) { Result.Add(FColor(Pixel.G, Pixel.R, Pixel.B, Pixel.A)); } return Result; } TArray ULowEntryExtendedStandardLibrary::FlipPixelChannelsGB(const TArray& Pixels) { TArray Result; for (const FColor& Pixel : Pixels) { Result.Add(FColor(Pixel.R, Pixel.B, Pixel.G, Pixel.A)); } return Result; } TArray ULowEntryExtendedStandardLibrary::FlipPixelChannelsRB(const TArray& Pixels) { TArray Result; for (const FColor& Pixel : Pixels) { Result.Add(FColor(Pixel.B, Pixel.G, Pixel.R, Pixel.A)); } return Result; } TArray ULowEntryExtendedStandardLibrary::FlipPixelChannelsRA(const TArray& Pixels) { TArray Result; for (const FColor& Pixel : Pixels) { Result.Add(FColor(Pixel.A, Pixel.G, Pixel.B, Pixel.R)); } return Result; } TArray ULowEntryExtendedStandardLibrary::FlipPixelChannelsGA(const TArray& Pixels) { TArray Result; for (const FColor& Pixel : Pixels) { Result.Add(FColor(Pixel.R, Pixel.A, Pixel.B, Pixel.G)); } return Result; } TArray ULowEntryExtendedStandardLibrary::FlipPixelChannelsBA(const TArray& Pixels) { TArray Result; for (const FColor& Pixel : Pixels) { Result.Add(FColor(Pixel.R, Pixel.G, Pixel.A, Pixel.B)); } return Result; } TArray ULowEntryExtendedStandardLibrary::InvertPixelChannelR(const TArray& Pixels) { TArray Result; for (const FColor& Pixel : Pixels) { Result.Add(FColor(Pixel.R ^ 0xff, Pixel.G, Pixel.B, Pixel.A)); } return Result; } TArray ULowEntryExtendedStandardLibrary::InvertPixelChannelG(const TArray& Pixels) { TArray Result; for (const FColor& Pixel : Pixels) { Result.Add(FColor(Pixel.R, Pixel.G ^ 0xff, Pixel.B, Pixel.A)); } return Result; } TArray ULowEntryExtendedStandardLibrary::InvertPixelChannelB(const TArray& Pixels) { TArray Result; for (const FColor& Pixel : Pixels) { Result.Add(FColor(Pixel.R, Pixel.G, Pixel.B ^ 0xff, Pixel.A)); } return Result; } TArray ULowEntryExtendedStandardLibrary::InvertPixelChannelA(const TArray& Pixels) { TArray Result; for (const FColor& Pixel : Pixels) { Result.Add(FColor(Pixel.R, Pixel.G, Pixel.B, Pixel.A ^ 0xff)); } return Result; } void ULowEntryExtendedStandardLibrary::Texture2DToPixels(UTexture2D* Texture2D, int32& Width, int32& Height, TArray& Pixels) { Width = 0; Height = 0; Pixels = TArray(); if (Texture2D == nullptr) { return; } #if WITH_EDITORONLY_DATA if (Texture2D->MipGenSettings != TMGS_NoMipmaps) { UE_LOG(LogBlueprintUserMessages, Error, TEXT("in ImageToPixels, the given Texture2D has to have MipGenSettings set to NoMipmaps, otherwise the blueprint will always fail")); return; } #endif bool ChangedTexture2D = false; bool PreviousSRGB = Texture2D->SRGB; TextureCompressionSettings PreviousCompressionSettings = Texture2D->CompressionSettings; if ((PreviousSRGB != false) || (PreviousCompressionSettings != TC_VectorDisplacementmap)) { ChangedTexture2D = true; Texture2D->SRGB = false; Texture2D->CompressionSettings = TC_VectorDisplacementmap; Texture2D->UpdateResource(); } FTexture2DMipMap& Mip0 = Texture2D->GetPlatformData()->Mips[0]; int32 Mip0Width = Mip0.SizeX; int32 Mip0Height = Mip0.SizeY; auto Mip0Data = &Mip0.BulkData; if (Mip0Data == nullptr) { UE_LOG(LogBlueprintUserMessages, Error, TEXT("in ImageToPixels, Mips[0].BulkData couldn't be accessed (it was NULL)")); if (ChangedTexture2D) { Texture2D->SRGB = PreviousSRGB; Texture2D->CompressionSettings = PreviousCompressionSettings; Texture2D->UpdateResource(); } return; } void* Mip0Pixels_ = Mip0Data->Lock(LOCK_READ_ONLY); FColor* Mip0Pixels = static_cast(Mip0Pixels_); if (Mip0Pixels == nullptr) { UE_LOG(LogBlueprintUserMessages, Error, TEXT("in ImageToPixels, Mips[0].BulkData couldn't be cast to FColor*")); Mip0Data->Unlock(); if (ChangedTexture2D) { Texture2D->SRGB = PreviousSRGB; Texture2D->CompressionSettings = PreviousCompressionSettings; Texture2D->UpdateResource(); } return; } Width = Mip0Width; Height = Mip0Height; int32 Total = Mip0Width * Mip0Height; Pixels.SetNum(Total); EPixelFormat PixelFormat = Texture2D->GetPixelFormat(); if (PixelFormat == PF_B8G8R8A8) { for (int32 i = 0; i < Total; i++) { Pixels[i] = Mip0Pixels[i]; } } else if (PixelFormat == PF_R8G8B8A8) { for (int32 i = 0; i < Total; i++) { Pixels[i] = FColor(Mip0Pixels[i].B, Mip0Pixels[i].G, Mip0Pixels[i].R, Mip0Pixels[i].A); } } else if (PixelFormat == PF_A8R8G8B8) { for (int32 i = 0; i < Total; i++) { Pixels[i] = FColor(Mip0Pixels[i].A, Mip0Pixels[i].B, Mip0Pixels[i].G, Mip0Pixels[i].R); } } else { UE_LOG(LogBlueprintUserMessages, Error, TEXT("in ImageToPixels, the given Texture2D has an unsupported PixelFormat (%s), the supported formats are: PF_R8G8B8A8, PF_B8G8R8A8, PF_A8R8G8B8"), *Texture2D->GetPixelFormatEnum()->GetNameByValue(PixelFormat).GetPlainNameString()); Mip0Data->Unlock(); if (ChangedTexture2D) { Texture2D->SRGB = PreviousSRGB; Texture2D->CompressionSettings = PreviousCompressionSettings; Texture2D->UpdateResource(); } return; } Mip0Data->Unlock(); if (ChangedTexture2D) { Texture2D->SRGB = PreviousSRGB; Texture2D->CompressionSettings = PreviousCompressionSettings; Texture2D->UpdateResource(); } } UTexture2D* ULowEntryExtendedStandardLibrary::PixelsToTexture2D(const int32 Width, const int32 Height, const TArray& Pixels) { if ((Pixels.Num() <= 0) || (Width <= 0) || (Height <= 0)) { return nullptr; } return DataToTexture2D(Width, Height, &Pixels[0], Pixels.Num() * sizeof(FColor)); } UTexture2D* ULowEntryExtendedStandardLibrary::PixelsToExistingTexture2D(bool& ReusedGivenTexture2D, UTexture2D* Texture2D, const int32 Width, const int32 Height, const TArray& Pixels) { ReusedGivenTexture2D = false; if ((Pixels.Num() <= 0) || (Width <= 0) || (Height <= 0)) { ReusedGivenTexture2D = (Texture2D == nullptr); return nullptr; } UTexture2D* NewTexture2D = DataToExistingTexture2D(Texture2D, Width, Height, &Pixels[0], Pixels.Num() * sizeof(FColor)); ReusedGivenTexture2D = (Texture2D == NewTexture2D); return NewTexture2D; } UTexture2D* ULowEntryExtendedStandardLibrary::DataToTexture2D(int32 Width, int32 Height, const void* Src, SIZE_T Count) { UTexture2D* Texture2D = UTexture2D::CreateTransient(Width, Height, PF_B8G8R8A8); if (Texture2D == nullptr) { return nullptr; } Texture2D->bNoTiling = true; #if WITH_EDITORONLY_DATA Texture2D->MipGenSettings = TMGS_NoMipmaps; #endif void* TextureData = Texture2D->GetPlatformData()->Mips[0].BulkData.Lock(LOCK_READ_WRITE); FMemory::Memcpy(TextureData, Src, Count); Texture2D->GetPlatformData()->Mips[0].BulkData.Unlock(); Texture2D->UpdateResource(); return Texture2D; } UTexture2D* ULowEntryExtendedStandardLibrary::DataToExistingTexture2D(UTexture2D* Texture2D, int32 Width, int32 Height, const void* Src, SIZE_T Count) { if ((Texture2D == nullptr) || (Texture2D->GetSizeX() != Width) || (Texture2D->GetSizeY() != Height) || (Texture2D->GetPixelFormat() != PF_B8G8R8A8)) { Texture2D = UTexture2D::CreateTransient(Width, Height, PF_B8G8R8A8); } if (Texture2D == nullptr) { return nullptr; } Texture2D->bNoTiling = true; #if WITH_EDITORONLY_DATA Texture2D->MipGenSettings = TMGS_NoMipmaps; #endif void* TextureData = Texture2D->GetPlatformData()->Mips[0].BulkData.Lock(LOCK_READ_WRITE); FMemory::Memcpy(TextureData, Src, Count); Texture2D->GetPlatformData()->Mips[0].BulkData.Unlock(); Texture2D->UpdateResource(); return Texture2D; } void ULowEntryExtendedStandardLibrary::SceneCapture2DToBytes(ASceneCapture2D* SceneCapture2D, const ELowEntryImageFormat ImageFormat, TArray& ByteArray, const int32 CompressionQuality) { ByteArray = TArray(); if (SceneCapture2D != nullptr) { SceneCaptureComponent2DToBytes(SceneCapture2D->GetCaptureComponent2D(), ImageFormat, ByteArray, CompressionQuality); } } void ULowEntryExtendedStandardLibrary::SceneCaptureComponent2DToBytes(USceneCaptureComponent2D* SceneCaptureComponent2D, const ELowEntryImageFormat ImageFormat, TArray& ByteArray, const int32 CompressionQuality) { ByteArray = TArray(); if (SceneCaptureComponent2D != nullptr) { TextureRenderTarget2DToBytes(SceneCaptureComponent2D->TextureTarget, ImageFormat, ByteArray, CompressionQuality); } } void ULowEntryExtendedStandardLibrary::TextureRenderTarget2DToBytes(UTextureRenderTarget2D* TextureRenderTarget2D, const ELowEntryImageFormat ImageFormat, TArray& ByteArray, const int32 CompressionQuality) { ByteArray = TArray(); if (TextureRenderTarget2D == nullptr) { return; } if (TextureRenderTarget2D->GetFormat() != PF_B8G8R8A8) { UE_LOG(LogBlueprintUserMessages, Error, TEXT("in ImageToBytes, the TextureRenderTarget2D has a [Render Target Format] that is not supported, use [RTF RGBA8] instead ([PF_B8G8R8A8] in C++)")); return; } FRenderTarget* RenderTarget = TextureRenderTarget2D->GameThread_GetRenderTargetResource(); if (RenderTarget == nullptr) { return; } TArray Pixels; if (!RenderTarget->ReadPixels(Pixels)) { return; } for (FColor& Pixel : Pixels) { Pixel.A = 255; } PixelsToBytes(TextureRenderTarget2D->SizeX, TextureRenderTarget2D->SizeY, Pixels, ImageFormat, ByteArray, CompressionQuality); } void ULowEntryExtendedStandardLibrary::SceneCapture2DToPixels(ASceneCapture2D* SceneCapture2D, int32& Width, int32& Height, TArray& Pixels) { if (SceneCapture2D == nullptr) { Width = 0; Height = 0; Pixels = TArray(); return; } SceneCaptureComponent2DToPixels(SceneCapture2D->GetCaptureComponent2D(), Width, Height, Pixels); } void ULowEntryExtendedStandardLibrary::SceneCaptureComponent2DToPixels(USceneCaptureComponent2D* SceneCaptureComponent2D, int32& Width, int32& Height, TArray& Pixels) { if (SceneCaptureComponent2D == nullptr) { Width = 0; Height = 0; Pixels = TArray(); return; } TextureRenderTarget2DToPixels(SceneCaptureComponent2D->TextureTarget, Width, Height, Pixels); } void ULowEntryExtendedStandardLibrary::TextureRenderTarget2DToPixels(UTextureRenderTarget2D* TextureRenderTarget2D, int32& Width, int32& Height, TArray& Pixels) { Width = 0; Height = 0; Pixels = TArray(); if (TextureRenderTarget2D == nullptr) { return; } if (TextureRenderTarget2D->GetFormat() != PF_B8G8R8A8) { UE_LOG(LogBlueprintUserMessages, Error, TEXT("in ImageToPixels, the TextureRenderTarget2D has a [Render Target Format] that is not supported, use [RTF RGBA8] instead ([PF_B8G8R8A8] in C++)")); return; } FRenderTarget* RenderTarget = TextureRenderTarget2D->GameThread_GetRenderTargetResource(); if (RenderTarget == nullptr) { return; } if (!RenderTarget->ReadPixels(Pixels)) { Pixels = TArray(); return; } FIntPoint Size = RenderTarget->GetSizeXY(); Width = Size.X; Height = Size.Y; for (FColor& Pixel : Pixels) { Pixel.A = 255; } } void ULowEntryExtendedStandardLibrary::LoadVideo(UMediaSoundComponent* MediaSoundComponent, const FString& Url, bool& Success, UMediaPlayer*& Player, UMediaTexture*& Texture, const bool PlayOnOpen, const bool Loop) { Success = false; Player = nullptr; Texture = nullptr; UMediaPlayer* LoadPlayer = NewObject(); LoadPlayer->SetLooping(Loop); LoadPlayer->PlayOnOpen = PlayOnOpen; if (!LoadPlayer->OpenUrl(Url)) { return; } Success = true; Player = LoadPlayer; Texture = NewObject(); Texture->SetMediaPlayer(Player); Texture->UpdateResource(); if (MediaSoundComponent != nullptr) { MediaSoundComponent->SetMediaPlayer(Player); } } void ULowEntryExtendedStandardLibrary::TextureUpdateResource(UTexture* Texture) { if (Texture != nullptr) { Texture->UpdateResource(); } } void ULowEntryExtendedStandardLibrary::SceneCapture2D_GetFov(ASceneCapture2D* SceneCapture2D, double& Fov) { Fov = SceneCapture2D->GetCaptureComponent2D()->FOVAngle; } void ULowEntryExtendedStandardLibrary::SceneCapture2D_SetFov(ASceneCapture2D* SceneCapture2D, const double Fov) { SceneCapture2D->GetCaptureComponent2D()->FOVAngle = Fov; } void ULowEntryExtendedStandardLibrary::SceneCaptureComponent2D_GetFov(USceneCaptureComponent2D* SceneCaptureComponent2D, double& Fov) { Fov = SceneCaptureComponent2D->FOVAngle; } void ULowEntryExtendedStandardLibrary::SceneCaptureComponent2D_SetFov(USceneCaptureComponent2D* SceneCaptureComponent2D, const double Fov) { SceneCaptureComponent2D->FOVAngle = Fov; } TArray ULowEntryExtendedStandardLibrary::Pearson(const TArray& ByteArray, const int32 HashLength, int32 Index, int32 Length) { return ULowEntryHashingPearsonLibrary::Hash(ByteArray, Index, Length, HashLength); } TArray ULowEntryExtendedStandardLibrary::Md5(const TArray& ByteArray, int32 Index, int32 Length) { if (Index < 0) { Length += Index; Index = 0; } if (Length > ByteArray.Num() - Index) { Length = ByteArray.Num() - Index; } FMD5 Hasher; if (Length > 0) { const uint8* Bytes = ByteArray.GetData(); Hasher.Update(const_cast(Bytes) + Index, Length); } uint8 DigestBytes[16]; Hasher.Final(DigestBytes); TArray DigestByteArray; DigestByteArray.Append(DigestBytes, 16); return DigestByteArray; } TArray ULowEntryExtendedStandardLibrary::Sha1(const TArray& ByteArray, int32 Index, int32 Length) { if (Index < 0) { Length += Index; Index = 0; } if (Length > ByteArray.Num() - Index) { Length = ByteArray.Num() - Index; } FSHA1 Hasher; if (Length > 0) { const uint8* Bytes = ByteArray.GetData(); Hasher.Update(const_cast(Bytes) + Index, Length); } uint8 DigestBytes[FSHA1::DigestSize]; Hasher.Final(); Hasher.GetHash(DigestBytes); TArray DigestByteArray; DigestByteArray.Append(DigestBytes, FSHA1::DigestSize); return DigestByteArray; } TArray ULowEntryExtendedStandardLibrary::Sha256(const TArray& ByteArray, int32 Index, int32 Length) { return ULowEntryHashingSha256Library::Hash(ByteArray, Index, Length); } TArray ULowEntryExtendedStandardLibrary::Sha512(const TArray& ByteArray, int32 Index, int32 Length) { return ULowEntryHashingSha512Library::Hash(ByteArray, Index, Length); } TArray ULowEntryExtendedStandardLibrary::BCrypt(const TArray& ByteArray, const TArray& Salt, int32 Strength, int32 Index, int32 Length) { return ULowEntryHashingBCryptLibrary::Hash(BytesSubArray(ByteArray, Index, Length), Salt, Strength); } TArray ULowEntryExtendedStandardLibrary::HMAC(const TArray& ByteArray, const TArray& Key, ELowEntryHmacAlgorithm Algorithm, int32 Index, int32 Length) { if (Index < 0) { Length += Index; Index = 0; } if (Length > ByteArray.Num() - Index) { Length = ByteArray.Num() - Index; } int32 BlockSize = HMAC_GetBlockSize(Algorithm); TArray KeyBytes = Key; if (KeyBytes.Num() > BlockSize) { KeyBytes = HMAC_Hash(KeyBytes, Algorithm);// key = hash(key) } if (KeyBytes.Num() != BlockSize) { KeyBytes.SetNumZeroed(BlockSize);// key = key + 0x00 (till KeyBytes has BlockSize length) } TArray ArrayO = KeyBytes; TArray ArrayI = KeyBytes; for (int32 i = 0; i < KeyBytes.Num(); i++) { ArrayO[i] ^= 0x5c;// o_key_pad = 0x5c ^ key ArrayI[i] ^= 0x36;// i_key_pad = 0x36 ^ key } if (Length > 0)// (i_key_pad + message) { ArrayI.Append(ByteArray.GetData() + Index, Length); } ArrayI = HMAC_Hash(ArrayI, Algorithm);// hash(i_key_pad + message) ArrayO.Append(ArrayI.GetData(), ArrayI.Num());// (o_key_pad + hash(i_key_pad + message)) return HMAC_Hash(ArrayO, Algorithm);// hash(o_key_pad + hash(i_key_pad + message)) } int32 ULowEntryExtendedStandardLibrary::HMAC_GetBlockSize(ELowEntryHmacAlgorithm Algorithm) { switch (Algorithm) { case ELowEntryHmacAlgorithm::MD5: return 64; case ELowEntryHmacAlgorithm::SHA1: return 64; case ELowEntryHmacAlgorithm::SHA256: return 64; case ELowEntryHmacAlgorithm::SHA512: return 128; default: UE_LOG(LogBlueprintUserMessages, Error, TEXT("Unsupported HMAC Algorithm, falls back to SHA-256")); return 64;// defaults to SHA-256 } } TArray ULowEntryExtendedStandardLibrary::HMAC_Hash(const TArray& Array, ELowEntryHmacAlgorithm Algorithm) { switch (Algorithm) { case ELowEntryHmacAlgorithm::MD5: return Md5(Array); case ELowEntryHmacAlgorithm::SHA1: return Sha1(Array); case ELowEntryHmacAlgorithm::SHA256: return Sha256(Array); case ELowEntryHmacAlgorithm::SHA512: return Sha512(Array); default: UE_LOG(LogBlueprintUserMessages, Error, TEXT("Unsupported HMAC Algorithm, falls back to SHA-256")); return Sha256(Array);// defaults to SHA-256 } } TArray ULowEntryExtendedStandardLibrary::HashcashArray(const TArray& Resources, const int32 Bits) { return ULowEntryHashingHashcashLibrary::hashArray(Resources, Bits); } TArray ULowEntryExtendedStandardLibrary::HashcashArrayCustomCreationDate(const TArray& Resources, const FDateTime& UtcDate, const int32 Bits) { return ULowEntryHashingHashcashLibrary::hashArrayCustomCreationDate(Resources, UtcDate, Bits); } FString ULowEntryExtendedStandardLibrary::Hashcash(const FString& Resource, const int32 Bits) { return ULowEntryHashingHashcashLibrary::hash(Resource, Bits); } FString ULowEntryExtendedStandardLibrary::HashcashCustomCreationDate(const FString& Resource, const FDateTime& UtcDate, const int32 Bits) { return ULowEntryHashingHashcashLibrary::hashCustomCreationDate(Resource, UtcDate, Bits); } TArray ULowEntryExtendedStandardLibrary::HashcashParseArray(const TArray& Hashes) { return ULowEntryHashingHashcashLibrary::parseArray(Hashes); } ULowEntryParsedHashcash* ULowEntryExtendedStandardLibrary::HashcashParse(const FString& Hash) { return ULowEntryHashingHashcashLibrary::parse(Hash); } bool ULowEntryExtendedStandardLibrary::ParsedHashcashIsValid(ULowEntryParsedHashcash* Target) { if (Target == nullptr) { return false; } return Target->IsHashcashValid(); } FString ULowEntryExtendedStandardLibrary::NewlineCharacter() { return TEXT("\n"); } FString ULowEntryExtendedStandardLibrary::WindowsNewlineCharacter() { return TEXT("\r\n"); } FString ULowEntryExtendedStandardLibrary::CarriageReturnCharacter() { return TEXT("\r"); } FString ULowEntryExtendedStandardLibrary::TabCharacter() { return TEXT("\t"); } FString ULowEntryExtendedStandardLibrary::MinString(FString A, FString B) { if (A >= B) { return B; } return A; } FString ULowEntryExtendedStandardLibrary::MaxString(FString A, FString B) { if (A >= B) { return A; } return B; } bool ULowEntryExtendedStandardLibrary::LessStringString(const FString& A, const FString& B) { return (A < B); } bool ULowEntryExtendedStandardLibrary::GreaterStringString(const FString& A, const FString& B) { return (A > B); } bool ULowEntryExtendedStandardLibrary::LessEqualStringString(const FString& A, const FString& B) { return (A <= B); } bool ULowEntryExtendedStandardLibrary::GreaterEqualStringString(const FString& A, const FString& B) { return (A >= B); } bool ULowEntryExtendedStandardLibrary::LessIntegerFloat(const int32 A, const double B) { return (A < B); } bool ULowEntryExtendedStandardLibrary::GreaterIntegerFloat(const int32 A, const double B) { return (A > B); } bool ULowEntryExtendedStandardLibrary::LessEqualIntegerFloat(const int32 A, const double B) { return (A <= B); } bool ULowEntryExtendedStandardLibrary::GreaterEqualIntegerFloat(const int32 A, const double B) { return (A >= B); } bool ULowEntryExtendedStandardLibrary::LessIntegerByte(const int32 A, const uint8 B) { return (A < B); } bool ULowEntryExtendedStandardLibrary::GreaterIntegerByte(const int32 A, const uint8 B) { return (A > B); } bool ULowEntryExtendedStandardLibrary::LessEqualIntegerByte(const int32 A, const uint8 B) { return (A <= B); } bool ULowEntryExtendedStandardLibrary::GreaterEqualIntegerByte(const int32 A, const uint8 B) { return (A >= B); } bool ULowEntryExtendedStandardLibrary::LessFloatInteger(const double A, const int32 B) { return (A < B); } bool ULowEntryExtendedStandardLibrary::GreaterFloatInteger(const double A, const int32 B) { return (A > B); } bool ULowEntryExtendedStandardLibrary::LessEqualFloatInteger(const double A, const int32 B) { return (A <= B); } bool ULowEntryExtendedStandardLibrary::GreaterEqualFloatInteger(const double A, const int32 B) { return (A >= B); } bool ULowEntryExtendedStandardLibrary::LessFloatByte(const double A, const uint8 B) { return (A < B); } bool ULowEntryExtendedStandardLibrary::GreaterFloatByte(const double A, const uint8 B) { return (A > B); } bool ULowEntryExtendedStandardLibrary::LessEqualFloatByte(const double A, const uint8 B) { return (A <= B); } bool ULowEntryExtendedStandardLibrary::GreaterEqualFloatByte(const double A, const uint8 B) { return (A >= B); } bool ULowEntryExtendedStandardLibrary::LessByteInteger(const uint8 A, const int32 B) { return (A < B); } bool ULowEntryExtendedStandardLibrary::GreaterByteInteger(const uint8 A, const int32 B) { return (A > B); } bool ULowEntryExtendedStandardLibrary::LessEqualByteInteger(const uint8 A, const int32 B) { return (A <= B); } bool ULowEntryExtendedStandardLibrary::GreaterEqualByteInteger(const uint8 A, const int32 B) { return (A >= B); } bool ULowEntryExtendedStandardLibrary::LessByteFloat(const uint8 A, const double B) { return (A < B); } bool ULowEntryExtendedStandardLibrary::GreaterByteFloat(const uint8 A, const double B) { return (A > B); } bool ULowEntryExtendedStandardLibrary::LessEqualByteFloat(const uint8 A, const double B) { return (A <= B); } bool ULowEntryExtendedStandardLibrary::GreaterEqualByteFloat(const uint8 A, const double B) { return (A >= B); } double ULowEntryExtendedStandardLibrary::RoundDecimals(double Number, int32 Decimals) { if (Number == 0) { return Number; } Decimals = FMath::Min(18, Decimals); if (Decimals > 0) { int64 Multiplier = 1; for (int32 i = 1; i <= Decimals; i++) { Multiplier *= 10; } double MultiplierFloat = static_cast(Multiplier); return FMath::RoundToFloat(Number * MultiplierFloat) / MultiplierFloat; } if (Decimals < 0) { int64 Divider = 1; for (int32 i = -1; i >= Decimals; i--) { Divider *= 10; } double DividerFloat = static_cast(Divider); return FMath::RoundToFloat(Number / DividerFloat) * DividerFloat; } return FMath::RoundToFloat(Number); } double ULowEntryExtendedStandardLibrary::CeilDecimals(double Number, int32 Decimals) { if (Number == 0) { return Number; } Decimals = FMath::Min(18, Decimals); if (Decimals > 0) { int64 Multiplier = 1; for (int32 i = 1; i <= Decimals; i++) { Multiplier *= 10; } double MultiplierFloat = static_cast(Multiplier); return FMath::CeilToFloat(Number * MultiplierFloat) / MultiplierFloat; } if (Decimals < 0) { int64 Divider = 1; for (int32 i = -1; i >= Decimals; i--) { Divider *= 10; } double DividerFloat = static_cast(Divider); return FMath::CeilToFloat(Number / DividerFloat) * DividerFloat; } return FMath::CeilToFloat(Number); } double ULowEntryExtendedStandardLibrary::FloorDecimals(double Number, int32 Decimals) { if (Number == 0) { return Number; } Decimals = FMath::Min(18, Decimals); if (Decimals > 0) { int64 Multiplier = 1; for (int32 i = 1; i <= Decimals; i++) { Multiplier *= 10; } double MultiplierFloat = static_cast(Multiplier); return FMath::FloorToFloat(Number * MultiplierFloat) / MultiplierFloat; } if (Decimals < 0) { int64 Divider = 1; for (int32 i = -1; i >= Decimals; i--) { Divider *= 10; } double DividerFloat = static_cast(Divider); return FMath::FloorToFloat(Number / DividerFloat) * DividerFloat; } return FMath::FloorToFloat(Number); } void ULowEntryExtendedStandardLibrary::MaxOfStringArray(const TArray& StringArray, int32& IndexOfMaxValue, FString& MaxValue) { MaxValue = FMath::Max(StringArray, &IndexOfMaxValue); } void ULowEntryExtendedStandardLibrary::MinOfStringArray(const TArray& StringArray, int32& IndexOfMinValue, FString& MinValue) { MinValue = FMath::Min(StringArray, &IndexOfMinValue); } void ULowEntryExtendedStandardLibrary::MaxOfDateTimeArray(const TArray& DateTimeArray, int32& IndexOfMaxValue, FDateTime& MaxValue) { MaxValue = FMath::Max(DateTimeArray, &IndexOfMaxValue); } void ULowEntryExtendedStandardLibrary::MinOfDateTimeArray(const TArray& DateTimeArray, int32& IndexOfMinValue, FDateTime& MinValue) { MinValue = FMath::Min(DateTimeArray, &IndexOfMinValue); } void ULowEntryExtendedStandardLibrary::MaxOfTimespanArray(const TArray& TimespanArray, int32& IndexOfMaxValue, FTimespan& MaxValue) { MaxValue = FMath::Max(TimespanArray, &IndexOfMaxValue); } void ULowEntryExtendedStandardLibrary::MinOfTimespanArray(const TArray& TimespanArray, int32& IndexOfMinValue, FTimespan& MinValue) { MinValue = FMath::Min(TimespanArray, &IndexOfMinValue); } void ULowEntryExtendedStandardLibrary::DateTime_ToIso8601(const FDateTime& DateTime, FString& String) { String = DateTime.ToIso8601(); } void ULowEntryExtendedStandardLibrary::DateTime_ToString(const FDateTime& DateTime, FString& String, const FString& Format) { String = DateTime.ToString(*Format); } void ULowEntryExtendedStandardLibrary::DateTime_ToUnixTimestamp(const FDateTime& DateTime, ULowEntryLong*& Timestamp) { FTimespan Time = DateTime - FDateTime::FromUnixTimestamp(0); Timestamp = ULowEntryLong::Create(LongToBytes(static_cast(Time.GetTotalMilliseconds()))); // ignores milliseconds: // Timestamp = ULowEntryLong::Create(ULowEntryExtendedStandardLibrary::LongToBytes(DateTime.ToUnixTimestamp() * 1000)); } void ULowEntryExtendedStandardLibrary::DateTime_FromUnixTimestamp(ULowEntryLong* Timestamp, FDateTime& DateTime) { if (Timestamp == nullptr) { DateTime = FDateTime::FromUnixTimestamp(0); } else { int64 Millis = BytesToLong(Timestamp->GetBytes()); DateTime = FDateTime::FromUnixTimestamp(0) + FTimespan(Millis * (ETimespan::TicksPerSecond / 1000)); //ignored milliseconds: // DateTime = FDateTime::FromUnixTimestamp(ULowEntryExtendedStandardLibrary::BytesToLong(Timestamp->GetBytes()) / 1000); } } void ULowEntryExtendedStandardLibrary::ConvertLocalDateToUtcDate(const FDateTime& Local, FDateTime& Utc) { Utc = Local - (FDateTime::Now() - FDateTime::UtcNow()); } void ULowEntryExtendedStandardLibrary::ConvertUtcDateToLocalDate(const FDateTime& Utc, FDateTime& Local) { Local = Utc + (FDateTime::Now() - FDateTime::UtcNow()); } TArray ULowEntryExtendedStandardLibrary::SortStringArray(const TArray& StringArray, const bool Reversed) { TArray Array = StringArray; if (!Reversed) { Array.Sort([](const FString& A, const FString& B) { return A < B; }); } else { Array.Sort([](const FString& A, const FString& B) { return A > B; }); } return Array; } void ULowEntryExtendedStandardLibrary::SortStringArrayDirectly(UPARAM(ref) TArray& StringArray, const bool Reversed) { if (!Reversed) { StringArray.Sort([](const FString& A, const FString& B) { return A < B; }); } else { StringArray.Sort([](const FString& A, const FString& B) { return A > B; }); } } TArray ULowEntryExtendedStandardLibrary::SortIntegerArray(const TArray& IntegerArray, const bool Reversed) { TArray Array = IntegerArray; if (!Reversed) { Array.Sort([](const int32 A, const int32 B) { return A < B; }); } else { Array.Sort([](const int32 A, const int32 B) { return A > B; }); } return Array; } void ULowEntryExtendedStandardLibrary::SortIntegerArrayDirectly(UPARAM(ref) TArray& IntegerArray, const bool Reversed) { if (!Reversed) { IntegerArray.Sort([](const int32 A, const int32 B) { return A < B; }); } else { IntegerArray.Sort([](const int32 A, const int32 B) { return A > B; }); } } TArray ULowEntryExtendedStandardLibrary::SortFloatArray(const TArray& FloatArray, const bool Reversed) { TArray Array = FloatArray; if (!Reversed) { Array.Sort([](const float A, const float B) { return A < B; }); } else { Array.Sort([](const float A, const float B) { return A > B; }); } return Array; } void ULowEntryExtendedStandardLibrary::SortFloatArrayDirectly(UPARAM(ref) TArray& FloatArray, const bool Reversed) { if (!Reversed) { FloatArray.Sort([](const float A, const float B) { return A < B; }); } else { FloatArray.Sort([](const float A, const float B) { return A > B; }); } } TArray ULowEntryExtendedStandardLibrary::SortDoubleArray(const TArray& DoubleArray, const bool Reversed) { TArray Array = DoubleArray; if (!Reversed) { Array.Sort([](const double A, const double B) { return A < B; }); } else { Array.Sort([](const double A, const double B) { return A > B; }); } return Array; } void ULowEntryExtendedStandardLibrary::SortDoubleArrayDirectly(UPARAM(ref) TArray& DoubleArray, const bool Reversed) { if (!Reversed) { DoubleArray.Sort([](const double A, const double B) { return A < B; }); } else { DoubleArray.Sort([](const double A, const double B) { return A > B; }); } } TArray ULowEntryExtendedStandardLibrary::SortByteArray(const TArray& ByteArray, const bool Reversed) { TArray Array = ByteArray; if (!Reversed) { Array.Sort([](const uint8 A, const uint8 B) { return A < B; }); } else { Array.Sort([](const uint8 A, const uint8 B) { return A > B; }); } return Array; } void ULowEntryExtendedStandardLibrary::SortByteArrayDirectly(UPARAM(ref) TArray& ByteArray, const bool Reversed) { if (!Reversed) { ByteArray.Sort([](const uint8 A, const uint8 B) { return A < B; }); } else { ByteArray.Sort([](const uint8 A, const uint8 B) { return A > B; }); } } TArray ULowEntryExtendedStandardLibrary::SortDateTimeArray(const TArray& DateTimeArray, const bool Reversed) { TArray Array = DateTimeArray; if (!Reversed) { Array.Sort([](const FDateTime& A, const FDateTime& B) { return A < B; }); } else { Array.Sort([](const FDateTime& A, const FDateTime& B) { return A > B; }); } return Array; } void ULowEntryExtendedStandardLibrary::SortDateTimeArrayDirectly(UPARAM(ref) TArray& DateTimeArray, const bool Reversed) { if (!Reversed) { DateTimeArray.Sort([](const FDateTime& A, const FDateTime& B) { return A < B; }); } else { DateTimeArray.Sort([](const FDateTime& A, const FDateTime& B) { return A > B; }); } } TArray ULowEntryExtendedStandardLibrary::SortTimespanArray(const TArray& TimespanArray, const bool Reversed) { TArray Array = TimespanArray; if (!Reversed) { Array.Sort([](const FTimespan& A, const FTimespan& B) { return A < B; }); } else { Array.Sort([](const FTimespan& A, const FTimespan& B) { return A > B; }); } return Array; } void ULowEntryExtendedStandardLibrary::SortTimespanArrayDirectly(UPARAM(ref) TArray& TimespanArray, const bool Reversed) { if (!Reversed) { TimespanArray.Sort([](const FTimespan& A, const FTimespan& B) { return A < B; }); } else { TimespanArray.Sort([](const FTimespan& A, const FTimespan& B) { return A > B; }); } } TArray ULowEntryExtendedStandardLibrary::SortObjectArray(const TArray& ObjectArray, FDelegateULowEntryExtendedStandardLibraryCompareObjects Comparator, const bool Reversed) { TArray Array = ObjectArray; if (!Reversed) { Array.Sort([Comparator](UObject& A, UObject& B) { bool Result = false; Comparator.Execute(&A, &B, Result); return Result; }); } else { Array.Sort([Comparator](UObject& A, UObject& B) { bool Result = false; Comparator.Execute(&A, &B, Result); return !Result; }); } return Array; } void ULowEntryExtendedStandardLibrary::SortObjectArrayDirectly(UPARAM(ref) TArray& ObjectArray, FDelegateULowEntryExtendedStandardLibraryCompareObjects Comparator, const bool Reversed) { if (!Reversed) { ObjectArray.Sort([Comparator](UObject& A, UObject& B) { bool Result = false; Comparator.Execute(&A, &B, Result); return Result; }); } else { ObjectArray.Sort([Comparator](UObject& A, UObject& B) { bool Result = false; Comparator.Execute(&A, &B, Result); return !Result; }); } } TArray ULowEntryExtendedStandardLibrary::SortStructArray(const TArray& StructArray, FDelegateULowEntryExtendedStandardLibraryCompareStructs Comparator, const bool Reversed) { TArray Array = StructArray; if (!Reversed) { Array.Sort([Comparator](const FInstancedStruct& A, const FInstancedStruct& B) { bool Result = false; Comparator.Execute(A, B, Result); return Result; }); } else { Array.Sort([Comparator](const FInstancedStruct& A, const FInstancedStruct& B) { bool Result = false; Comparator.Execute(A, B, Result); return !Result; }); } return Array; } void ULowEntryExtendedStandardLibrary::SortStructArrayDirectly(UPARAM(ref) TArray& StructArray, FDelegateULowEntryExtendedStandardLibraryCompareStructs Comparator, const bool Reversed) { if (!Reversed) { StructArray.Sort([Comparator](const FInstancedStruct& A, const FInstancedStruct& B) { bool Result = false; Comparator.Execute(A, B, Result); return Result; }); } else { StructArray.Sort([Comparator](const FInstancedStruct& A, const FInstancedStruct& B) { bool Result = false; Comparator.Execute(A, B, Result); return !Result; }); } } void ULowEntryExtendedStandardLibrary::RandomDelay(UObject* WorldContextObject, double MinDuration, double MaxDuration, FLatentActionInfo LatentInfo) { if (UWorld* World = GEngine->GetWorldFromContextObject(WorldContextObject, EGetWorldErrorMode::LogAndReturnNull)) { FLatentActionManager& LatentActionManager = World->GetLatentActionManager(); if (LatentActionManager.FindExistingAction(LatentInfo.CallbackTarget, LatentInfo.UUID) == nullptr) { LatentActionManager.AddNewAction(LatentInfo.CallbackTarget, LatentInfo.UUID, new FDelayAction(FMath::FRandRange(MinDuration, MaxDuration), LatentInfo)); } } } void ULowEntryExtendedStandardLibrary::RetriggerableRandomDelay(UObject* WorldContextObject, double MinDuration, double MaxDuration, FLatentActionInfo LatentInfo) { if (UWorld* World = GEngine->GetWorldFromContextObject(WorldContextObject, EGetWorldErrorMode::LogAndReturnNull)) { FLatentActionManager& LatentActionManager = World->GetLatentActionManager(); FDelayAction* Action = LatentActionManager.FindExistingAction(LatentInfo.CallbackTarget, LatentInfo.UUID); if (Action == nullptr) { LatentActionManager.AddNewAction(LatentInfo.CallbackTarget, LatentInfo.UUID, new FDelayAction(FMath::FRandRange(MinDuration, MaxDuration), LatentInfo)); } else { Action->TimeRemaining = FMath::FRandRange(MinDuration, MaxDuration); } } } void ULowEntryExtendedStandardLibrary::DelayFrames(UObject* WorldContextObject, int32 Frames, FLatentActionInfo LatentInfo) { if (UWorld* World = GEngine->GetWorldFromContextObject(WorldContextObject, EGetWorldErrorMode::LogAndReturnNull)) { FLatentActionManager& LatentActionManager = World->GetLatentActionManager(); if (LatentActionManager.FindExistingAction(LatentInfo.CallbackTarget, LatentInfo.UUID) == nullptr) { LatentActionManager.AddNewAction(LatentInfo.CallbackTarget, LatentInfo.UUID, new FLowEntryDelayFramesAction(Frames, LatentInfo)); } } } void ULowEntryExtendedStandardLibrary::RetriggerableDelayFrames(UObject* WorldContextObject, int32 Frames, FLatentActionInfo LatentInfo) { if (UWorld* World = GEngine->GetWorldFromContextObject(WorldContextObject, EGetWorldErrorMode::LogAndReturnNull)) { FLatentActionManager& LatentActionManager = World->GetLatentActionManager(); FLowEntryDelayFramesAction* Action = LatentActionManager.FindExistingAction(LatentInfo.CallbackTarget, LatentInfo.UUID); if (Action == nullptr) { LatentActionManager.AddNewAction(LatentInfo.CallbackTarget, LatentInfo.UUID, new FLowEntryDelayFramesAction(Frames, LatentInfo)); } else { Action->FramesRemaining = Frames; } } } void ULowEntryExtendedStandardLibrary::RandomDelayFrames(UObject* WorldContextObject, int32 MinFrames, int32 MaxFrames, FLatentActionInfo LatentInfo) { if (UWorld* World = GEngine->GetWorldFromContextObject(WorldContextObject, EGetWorldErrorMode::LogAndReturnNull)) { FLatentActionManager& LatentActionManager = World->GetLatentActionManager(); if (LatentActionManager.FindExistingAction(LatentInfo.CallbackTarget, LatentInfo.UUID) == nullptr) { LatentActionManager.AddNewAction(LatentInfo.CallbackTarget, LatentInfo.UUID, new FLowEntryDelayFramesAction(FMath::RandRange(MinFrames, MaxFrames), LatentInfo)); } } } void ULowEntryExtendedStandardLibrary::RetriggerableRandomDelayFrames(UObject* WorldContextObject, int32 MinFrames, int32 MaxFrames, FLatentActionInfo LatentInfo) { if (UWorld* World = GEngine->GetWorldFromContextObject(WorldContextObject, EGetWorldErrorMode::LogAndReturnNull)) { FLatentActionManager& LatentActionManager = World->GetLatentActionManager(); FLowEntryDelayFramesAction* Action = LatentActionManager.FindExistingAction(LatentInfo.CallbackTarget, LatentInfo.UUID); if (Action == nullptr) { LatentActionManager.AddNewAction(LatentInfo.CallbackTarget, LatentInfo.UUID, new FLowEntryDelayFramesAction(FMath::RandRange(MinFrames, MaxFrames), LatentInfo)); } else { Action->FramesRemaining = FMath::RandRange(MinFrames, MaxFrames); } } } void ULowEntryExtendedStandardLibrary::QueueExecutions(UObject* WorldContextObject, ULowEntryExecutionQueue*& Queue, FLatentActionInfo LatentInfo) { if (UWorld* World = GEngine->GetWorldFromContextObject(WorldContextObject, EGetWorldErrorMode::LogAndReturnNull)) { FLatentActionManager& LatentActionManager = World->GetLatentActionManager(); FLowEntryExecutionQueueAction* Action = LatentActionManager.FindExistingAction(LatentInfo.CallbackTarget, LatentInfo.UUID); if (Action == nullptr) { Queue = ULowEntryExecutionQueue::Create(1, true); LatentActionManager.AddNewAction(LatentInfo.CallbackTarget, LatentInfo.UUID, new FLowEntryExecutionQueueAction(Queue, LatentInfo)); } else { Queue = Action->GetOrCreateQueueAndIncreaseCount(); } } } void ULowEntryExtendedStandardLibrary::NextQueueExecution(ULowEntryExecutionQueue* Queue) { if (IsValid(Queue)) { Queue->Next = true; } } FString ULowEntryExtendedStandardLibrary::CreateString(const int32 Length, const FString& Filler) { if (Length <= 0) { return TEXT(""); } FString FillerString = Filler; int32 Steps = FillerString.Len(); if (Steps <= 0) { FillerString = TEXT(" "); Steps = FillerString.Len(); } int32 Overflow = (Steps - (Length % Steps)) % Steps; FString String = TEXT(""); String.Reserve(Length); if (Overflow <= 0) { for (int32 i = 0; i < Length; i += Steps) { String.Append(FillerString); } } else { for (int32 i = Steps; i < Length; i += Steps) { String.Append(FillerString); } String.Append(FillerString.Left(Steps - Overflow)); } return String; } FString ULowEntryExtendedStandardLibrary::RemoveCharactersExcept(const FString& String, const bool KeepLowercaseAZ, const bool KeepUppercaseAZ, const bool KeepNumbers, const FString& OtherCharactersToKeep) { if (String.Len() <= 0) { return String; } FString NewString; NewString.Reserve(String.Len()); for (const TCHAR Char : String) { if (KeepLowercaseAZ && (Char >= 'a') && (Char <= 'z')) { NewString.AppendChar(Char); continue; } if (KeepUppercaseAZ && (Char >= 'A') && (Char <= 'Z')) { NewString.AppendChar(Char); continue; } if (KeepNumbers && (Char >= '0') && (Char <= '9')) { NewString.AppendChar(Char); continue; } for (const TCHAR KeepChar : OtherCharactersToKeep) { if (Char == KeepChar) { NewString.AppendChar(Char); break; } } } return NewString; } FString ULowEntryExtendedStandardLibrary::ReplaceCharactersExcept(const FString& String, const FString& ReplacementCharacter, const bool KeepLowercaseAZ, const bool KeepUppercaseAZ, const bool KeepNumbers, const FString& OtherCharactersToKeep) { if (String.Len() <= 0) { return String; } FString NewString; NewString.Reserve(FMath::Max(String.Len(), (ReplacementCharacter.Len() * String.Len()))); for (const TCHAR Char : String) { if (KeepLowercaseAZ && (Char >= 'a') && (Char <= 'z')) { NewString.AppendChar(Char); continue; } if (KeepUppercaseAZ && (Char >= 'A') && (Char <= 'Z')) { NewString.AppendChar(Char); continue; } if (KeepNumbers && (Char >= '0') && (Char <= '9')) { NewString.AppendChar(Char); continue; } bool Keep = false; for (const TCHAR KeepChar : OtherCharactersToKeep) { if (Char == KeepChar) { NewString.AppendChar(Char); Keep = true; break; } } if (Keep) { continue; } NewString.Append(ReplacementCharacter); } return NewString; } bool ULowEntryExtendedStandardLibrary::RegexMatch(const FString& String, const FString& Pattern) { FRegexPattern RegexPattern(Pattern); FRegexMatcher RegexMatcher(RegexPattern, String); return RegexMatcher.FindNext(); } int32 ULowEntryExtendedStandardLibrary::RegexCount(const FString& String, const FString& Pattern) { FRegexPattern RegexPattern(Pattern); FRegexMatcher RegexMatcher(RegexPattern, String); int32 Count = 0; int32 Length = String.Len(); while (RegexMatcher.FindNext()) { Count++; int32 e = RegexMatcher.GetMatchEnding(); RegexMatcher.SetLimits(e, Length); } return Count; } TArray ULowEntryExtendedStandardLibrary::RegexGetMatches(const FString& String, const FString& Pattern) { TArray Matches; int32 Length = String.Len(); FRegexPattern RegexPattern(Pattern); FRegexMatcher RegexMatcher(RegexPattern, String); int32 MatchNumber = 0; while (RegexMatcher.FindNext()) { MatchNumber++; int32 b = RegexMatcher.GetMatchBeginning(); int32 e = RegexMatcher.GetMatchEnding(); if ((b < 0) || (e < 0)) { continue; } TArray CaptureGroups; int32 CaptureGroupNumber = 0; while (true) { CaptureGroupNumber++; int32 gb = RegexMatcher.GetCaptureGroupBeginning(CaptureGroupNumber); int32 ge = RegexMatcher.GetCaptureGroupEnding(CaptureGroupNumber); if ((gb < 0) || (ge < 0)) { break; } FLowEntryRegexCaptureGroup GroupMatch; GroupMatch.CaptureGroupNumber = CaptureGroupNumber; GroupMatch.BeginIndex = gb; GroupMatch.EndIndex = ge; GroupMatch.Match = String.Mid(gb, ge - gb); CaptureGroups.Add(GroupMatch); } FLowEntryRegexMatch Match; Match.MatchNumber = MatchNumber; Match.BeginIndex = b; Match.EndIndex = e; Match.Match = String.Mid(b, e - b); Match.CaptureGroups = CaptureGroups; Matches.Add(Match); RegexMatcher.SetLimits(e, Length); } return Matches; } FString ULowEntryExtendedStandardLibrary::RegexReplace(const FString& String, const FString& Pattern, const FString& Replacement) { int32 Length = String.Len(); FString Result = TEXT(""); int32 LastMatchEnding = 0; FRegexPattern RegexPattern(Pattern); FRegexMatcher RegexMatcher(RegexPattern, String); while (RegexMatcher.FindNext()) { int32 b = RegexMatcher.GetMatchBeginning(); int32 e = RegexMatcher.GetMatchEnding(); for (int32 i = LastMatchEnding; i < b; i++) { Result += String[i]; } Result += Replacement; RegexMatcher.SetLimits(e, Length); LastMatchEnding = e; } for (int32 i = LastMatchEnding; i < Length; i++) { Result += String[i]; } return Result; } void ULowEntryExtendedStandardLibrary::Crash() { for (int32 i = 1; i <= 100; i++) { UE_LOG(LogBlueprintUserMessages, Log, TEXT("This crash was caused by LowEntryExtendedStandardLibrary::Crash() and was meant to happen.")); } FDebug::AssertFailed("This crash was caused by LowEntryExtendedStandardLibrary::Crash() and was meant to happen.", __FILE__, __LINE__); } void ULowEntryExtendedStandardLibrary::HostGame(UObject* WorldContextObject, const FString& Map, const FString& Args, APlayerController* SpecificPlayer) { APlayerController* TargetPC = SpecificPlayer ? SpecificPlayer : UGameplayStatics::GetPlayerController(WorldContextObject, 0); if (TargetPC) { TargetPC->ConsoleCommand(TEXT("open ") + Map + TEXT("?listen") + Args, true); } } void ULowEntryExtendedStandardLibrary::JoinGame(UObject* WorldContextObject, const FString& ServerAddress, const FString& Args, APlayerController* SpecificPlayer) { APlayerController* TargetPC = SpecificPlayer ? SpecificPlayer : UGameplayStatics::GetPlayerController(WorldContextObject, 0); if (TargetPC) { TargetPC->ConsoleCommand(TEXT("open ") + ServerAddress + Args, true); } } void ULowEntryExtendedStandardLibrary::ServerChangeMap(UObject* WorldContextObject, const FString& Map, const FString& Args, APlayerController* SpecificPlayer) { APlayerController* TargetPC = SpecificPlayer ? SpecificPlayer : UGameplayStatics::GetPlayerController(WorldContextObject, 0); if (TargetPC) { TargetPC->ConsoleCommand(TEXT("servertravel ") + Map + Args, true); } } void ULowEntryExtendedStandardLibrary::ChangeMap(UObject* WorldContextObject, const FString& Map, const FString& Args, APlayerController* SpecificPlayer) { APlayerController* TargetPC = SpecificPlayer ? SpecificPlayer : UGameplayStatics::GetPlayerController(WorldContextObject, 0); if (TargetPC) { TargetPC->ConsoleCommand(TEXT("open ") + Map + Args, true); } } void ULowEntryExtendedStandardLibrary::TickFrames(UObject* WorldContextObject, FLatentActionInfo LatentInfo, const int32 Ticks, const int32 FramesInterval, int32& Tick) { UWorld* World = GEngine->GetWorldFromContextObject(WorldContextObject, EGetWorldErrorMode::LogAndReturnNull); if (World == nullptr) { return; } World->GetLatentActionManager().AddNewAction(LatentInfo.CallbackTarget, LatentInfo.UUID, new FLowEntryTickFrames(LatentInfo, Ticks, FramesInterval, Tick)); } void ULowEntryExtendedStandardLibrary::TickSeconds(UObject* WorldContextObject, FLatentActionInfo LatentInfo, const int32 Ticks, const double SecondsInterval, int32& Tick) { UWorld* World = GEngine->GetWorldFromContextObject(WorldContextObject, EGetWorldErrorMode::LogAndReturnNull); if (World == nullptr) { return; } World->GetLatentActionManager().AddNewAction(LatentInfo.CallbackTarget, LatentInfo.UUID, new FLowEntryTickSeconds(LatentInfo, Ticks, SecondsInterval, Tick)); } ULowEntryByteDataReader* ULowEntryExtendedStandardLibrary::ByteDataReader_Create(const TArray& Bytes, int32 Index, int32 Length) { return ULowEntryByteDataReader::Create(Bytes, Index, Length); } ULowEntryByteDataWriter* ULowEntryExtendedStandardLibrary::ByteDataWriter_Create() { return ULowEntryByteDataWriter::Create(); } ULowEntryByteDataWriter* ULowEntryExtendedStandardLibrary::ByteDataWriter_CreateFromEntryArray(const TArray& Array) { return ULowEntryByteDataWriter::CreateFromEntryArray(Array); } ULowEntryByteDataWriter* ULowEntryExtendedStandardLibrary::ByteDataWriter_CreateFromEntryArrayPure(const TArray& Array) { return ULowEntryByteDataWriter::CreateFromEntryArray(Array); } TArray ULowEntryExtendedStandardLibrary::ByteDataWriter_GetBytes(ULowEntryByteDataWriter* ByteDataWriter) { return ByteDataWriter->GetBytes(); } ULowEntryByteDataEntry* ULowEntryExtendedStandardLibrary::ByteDataEntry_CreateFromByte(const uint8 Value) { return ULowEntryByteDataEntry::CreateFromByte(Value); } ULowEntryByteDataEntry* ULowEntryExtendedStandardLibrary::ByteDataEntry_CreateFromInteger(const int32 Value) { return ULowEntryByteDataEntry::CreateFromInteger(Value); } ULowEntryByteDataEntry* ULowEntryExtendedStandardLibrary::ByteDataEntry_CreateFromPositiveInteger1(const int32 Value) { return ULowEntryByteDataEntry::CreateFromPositiveInteger1(Value); } ULowEntryByteDataEntry* ULowEntryExtendedStandardLibrary::ByteDataEntry_CreateFromPositiveInteger2(const int32 Value) { return ULowEntryByteDataEntry::CreateFromPositiveInteger2(Value); } ULowEntryByteDataEntry* ULowEntryExtendedStandardLibrary::ByteDataEntry_CreateFromPositiveInteger3(const int32 Value) { return ULowEntryByteDataEntry::CreateFromPositiveInteger3(Value); } ULowEntryByteDataEntry* ULowEntryExtendedStandardLibrary::ByteDataEntry_CreateFromLong(const int64 Value) { return ULowEntryByteDataEntry::CreateFromLong(Value); } ULowEntryByteDataEntry* ULowEntryExtendedStandardLibrary::ByteDataEntry_CreateFromLongBytes(ULowEntryLong* Value) { return ULowEntryByteDataEntry::CreateFromLongBytes(Value); } ULowEntryByteDataEntry* ULowEntryExtendedStandardLibrary::ByteDataEntry_CreateFromFloat(const float Value) { return ULowEntryByteDataEntry::CreateFromFloat(Value); } ULowEntryByteDataEntry* ULowEntryExtendedStandardLibrary::ByteDataEntry_CreateFromDouble(const double Value) { return ULowEntryByteDataEntry::CreateFromDouble(Value); } ULowEntryByteDataEntry* ULowEntryExtendedStandardLibrary::ByteDataEntry_CreateFromDoubleBytes(ULowEntryDouble* Value) { return ULowEntryByteDataEntry::CreateFromDoubleBytes(Value); } ULowEntryByteDataEntry* ULowEntryExtendedStandardLibrary::ByteDataEntry_CreateFromBoolean(const bool Value) { return ULowEntryByteDataEntry::CreateFromBoolean(Value); } ULowEntryByteDataEntry* ULowEntryExtendedStandardLibrary::ByteDataEntry_CreateFromStringUtf8(const FString& Value) { return ULowEntryByteDataEntry::CreateFromStringUtf8(Value); } ULowEntryByteDataEntry* ULowEntryExtendedStandardLibrary::ByteDataEntry_CreateFromByteArray(const TArray& Value) { return ULowEntryByteDataEntry::CreateFromByteArray(Value); } ULowEntryByteDataEntry* ULowEntryExtendedStandardLibrary::ByteDataEntry_CreateFromIntegerArray(const TArray& Value) { return ULowEntryByteDataEntry::CreateFromIntegerArray(Value); } ULowEntryByteDataEntry* ULowEntryExtendedStandardLibrary::ByteDataEntry_CreateFromPositiveInteger1Array(const TArray& Value) { return ULowEntryByteDataEntry::CreateFromPositiveInteger1Array(Value); } ULowEntryByteDataEntry* ULowEntryExtendedStandardLibrary::ByteDataEntry_CreateFromPositiveInteger2Array(const TArray& Value) { return ULowEntryByteDataEntry::CreateFromPositiveInteger2Array(Value); } ULowEntryByteDataEntry* ULowEntryExtendedStandardLibrary::ByteDataEntry_CreateFromPositiveInteger3Array(const TArray& Value) { return ULowEntryByteDataEntry::CreateFromPositiveInteger3Array(Value); } ULowEntryByteDataEntry* ULowEntryExtendedStandardLibrary::ByteDataEntry_CreateFromLongArray(const TArray& Value) { return ULowEntryByteDataEntry::CreateFromLongArray(Value); } ULowEntryByteDataEntry* ULowEntryExtendedStandardLibrary::ByteDataEntry_CreateFromLongBytesArray(const TArray& Value) { return ULowEntryByteDataEntry::CreateFromLongBytesArray(Value); } ULowEntryByteDataEntry* ULowEntryExtendedStandardLibrary::ByteDataEntry_CreateFromFloatArray(const TArray& Value) { return ULowEntryByteDataEntry::CreateFromFloatArray(Value); } ULowEntryByteDataEntry* ULowEntryExtendedStandardLibrary::ByteDataEntry_CreateFromDoubleArray(const TArray& Value) { return ULowEntryByteDataEntry::CreateFromDoubleArray(Value); } ULowEntryByteDataEntry* ULowEntryExtendedStandardLibrary::ByteDataEntry_CreateFromDoubleBytesArray(const TArray& Value) { return ULowEntryByteDataEntry::CreateFromDoubleBytesArray(Value); } ULowEntryByteDataEntry* ULowEntryExtendedStandardLibrary::ByteDataEntry_CreateFromBooleanArray(const TArray& Value) { return ULowEntryByteDataEntry::CreateFromBooleanArray(Value); } ULowEntryByteDataEntry* ULowEntryExtendedStandardLibrary::ByteDataEntry_CreateFromStringUtf8Array(const TArray& Value) { return ULowEntryByteDataEntry::CreateFromStringUtf8Array(Value); } ULowEntryBitDataReader* ULowEntryExtendedStandardLibrary::BitDataReader_Create(const TArray& Bytes, int32 Index, int32 Length) { return ULowEntryBitDataReader::Create(Bytes, Index, Length); } ULowEntryBitDataWriter* ULowEntryExtendedStandardLibrary::BitDataWriter_Create() { return ULowEntryBitDataWriter::Create(); } ULowEntryBitDataWriter* ULowEntryExtendedStandardLibrary::BitDataWriter_CreateFromEntryArray(const TArray& Array) { return ULowEntryBitDataWriter::CreateFromEntryArray(Array); } ULowEntryBitDataWriter* ULowEntryExtendedStandardLibrary::BitDataWriter_CreateFromEntryArrayPure(const TArray& Array) { return ULowEntryBitDataWriter::CreateFromEntryArray(Array); } TArray ULowEntryExtendedStandardLibrary::BitDataWriter_GetBytes(ULowEntryBitDataWriter* BitDataWriter) { return BitDataWriter->GetBytes(); } ULowEntryBitDataEntry* ULowEntryExtendedStandardLibrary::BitDataEntry_CreateFromBit(const bool Value) { return ULowEntryBitDataEntry::CreateFromBit(Value); } ULowEntryBitDataEntry* ULowEntryExtendedStandardLibrary::BitDataEntry_CreateFromByteLeastSignificantBits(const uint8 Value, const int32 BitCount) { return ULowEntryBitDataEntry::CreateFromByteLeastSignificantBits(Value, BitCount); } ULowEntryBitDataEntry* ULowEntryExtendedStandardLibrary::BitDataEntry_CreateFromByteMostSignificantBits(const uint8 Value, const int32 BitCount) { return ULowEntryBitDataEntry::CreateFromByteMostSignificantBits(Value, BitCount); } ULowEntryBitDataEntry* ULowEntryExtendedStandardLibrary::BitDataEntry_CreateFromIntegerLeastSignificantBits(const int32 Value, const int32 BitCount) { return ULowEntryBitDataEntry::CreateFromIntegerLeastSignificantBits(Value, BitCount); } ULowEntryBitDataEntry* ULowEntryExtendedStandardLibrary::BitDataEntry_CreateFromIntegerMostSignificantBits(const int32 Value, const int32 BitCount) { return ULowEntryBitDataEntry::CreateFromIntegerMostSignificantBits(Value, BitCount); } ULowEntryBitDataEntry* ULowEntryExtendedStandardLibrary::BitDataEntry_CreateFromByte(const uint8 Value) { return ULowEntryBitDataEntry::CreateFromByte(Value); } ULowEntryBitDataEntry* ULowEntryExtendedStandardLibrary::BitDataEntry_CreateFromInteger(const int32 Value) { return ULowEntryBitDataEntry::CreateFromInteger(Value); } ULowEntryBitDataEntry* ULowEntryExtendedStandardLibrary::BitDataEntry_CreateFromPositiveInteger1(const int32 Value) { return ULowEntryBitDataEntry::CreateFromPositiveInteger1(Value); } ULowEntryBitDataEntry* ULowEntryExtendedStandardLibrary::BitDataEntry_CreateFromPositiveInteger2(const int32 Value) { return ULowEntryBitDataEntry::CreateFromPositiveInteger2(Value); } ULowEntryBitDataEntry* ULowEntryExtendedStandardLibrary::BitDataEntry_CreateFromPositiveInteger3(const int32 Value) { return ULowEntryBitDataEntry::CreateFromPositiveInteger3(Value); } ULowEntryBitDataEntry* ULowEntryExtendedStandardLibrary::BitDataEntry_CreateFromLong(const int64 Value) { return ULowEntryBitDataEntry::CreateFromLong(Value); } ULowEntryBitDataEntry* ULowEntryExtendedStandardLibrary::BitDataEntry_CreateFromLongBytes(ULowEntryLong* Value) { return ULowEntryBitDataEntry::CreateFromLongBytes(Value); } ULowEntryBitDataEntry* ULowEntryExtendedStandardLibrary::BitDataEntry_CreateFromFloat(const float Value) { return ULowEntryBitDataEntry::CreateFromFloat(Value); } ULowEntryBitDataEntry* ULowEntryExtendedStandardLibrary::BitDataEntry_CreateFromDouble(const double Value) { return ULowEntryBitDataEntry::CreateFromDouble(Value); } ULowEntryBitDataEntry* ULowEntryExtendedStandardLibrary::BitDataEntry_CreateFromDoubleBytes(ULowEntryDouble* Value) { return ULowEntryBitDataEntry::CreateFromDoubleBytes(Value); } ULowEntryBitDataEntry* ULowEntryExtendedStandardLibrary::BitDataEntry_CreateFromBoolean(const bool Value) { return ULowEntryBitDataEntry::CreateFromBoolean(Value); } ULowEntryBitDataEntry* ULowEntryExtendedStandardLibrary::BitDataEntry_CreateFromStringUtf8(const FString& Value) { return ULowEntryBitDataEntry::CreateFromStringUtf8(Value); } ULowEntryBitDataEntry* ULowEntryExtendedStandardLibrary::BitDataEntry_CreateFromBitArray(const TArray& Value) { return ULowEntryBitDataEntry::CreateFromBitArray(Value); } ULowEntryBitDataEntry* ULowEntryExtendedStandardLibrary::BitDataEntry_CreateFromByteArrayLeastSignificantBits(const TArray& Value, const int32 BitCount) { return ULowEntryBitDataEntry::CreateFromByteArrayLeastSignificantBits(Value, BitCount); } ULowEntryBitDataEntry* ULowEntryExtendedStandardLibrary::BitDataEntry_CreateFromByteArrayMostSignificantBits(const TArray& Value, const int32 BitCount) { return ULowEntryBitDataEntry::CreateFromByteArrayMostSignificantBits(Value, BitCount); } ULowEntryBitDataEntry* ULowEntryExtendedStandardLibrary::BitDataEntry_CreateFromIntegerArrayLeastSignificantBits(const TArray& Value, const int32 BitCount) { return ULowEntryBitDataEntry::CreateFromIntegerArrayLeastSignificantBits(Value, BitCount); } ULowEntryBitDataEntry* ULowEntryExtendedStandardLibrary::BitDataEntry_CreateFromIntegerArrayMostSignificantBits(const TArray& Value, const int32 BitCount) { return ULowEntryBitDataEntry::CreateFromIntegerArrayMostSignificantBits(Value, BitCount); } ULowEntryBitDataEntry* ULowEntryExtendedStandardLibrary::BitDataEntry_CreateFromByteArray(const TArray& Value) { return ULowEntryBitDataEntry::CreateFromByteArray(Value); } ULowEntryBitDataEntry* ULowEntryExtendedStandardLibrary::BitDataEntry_CreateFromIntegerArray(const TArray& Value) { return ULowEntryBitDataEntry::CreateFromIntegerArray(Value); } ULowEntryBitDataEntry* ULowEntryExtendedStandardLibrary::BitDataEntry_CreateFromPositiveInteger1Array(const TArray& Value) { return ULowEntryBitDataEntry::CreateFromPositiveInteger1Array(Value); } ULowEntryBitDataEntry* ULowEntryExtendedStandardLibrary::BitDataEntry_CreateFromPositiveInteger2Array(const TArray& Value) { return ULowEntryBitDataEntry::CreateFromPositiveInteger2Array(Value); } ULowEntryBitDataEntry* ULowEntryExtendedStandardLibrary::BitDataEntry_CreateFromPositiveInteger3Array(const TArray& Value) { return ULowEntryBitDataEntry::CreateFromPositiveInteger3Array(Value); } ULowEntryBitDataEntry* ULowEntryExtendedStandardLibrary::BitDataEntry_CreateFromLongArray(const TArray& Value) { return ULowEntryBitDataEntry::CreateFromLongArray(Value); } ULowEntryBitDataEntry* ULowEntryExtendedStandardLibrary::BitDataEntry_CreateFromLongBytesArray(const TArray& Value) { return ULowEntryBitDataEntry::CreateFromLongBytesArray(Value); } ULowEntryBitDataEntry* ULowEntryExtendedStandardLibrary::BitDataEntry_CreateFromFloatArray(const TArray& Value) { return ULowEntryBitDataEntry::CreateFromFloatArray(Value); } ULowEntryBitDataEntry* ULowEntryExtendedStandardLibrary::BitDataEntry_CreateFromDoubleArray(const TArray& Value) { return ULowEntryBitDataEntry::CreateFromDoubleArray(Value); } ULowEntryBitDataEntry* ULowEntryExtendedStandardLibrary::BitDataEntry_CreateFromDoubleBytesArray(const TArray& Value) { return ULowEntryBitDataEntry::CreateFromDoubleBytesArray(Value); } ULowEntryBitDataEntry* ULowEntryExtendedStandardLibrary::BitDataEntry_CreateFromBooleanArray(const TArray& Value) { return ULowEntryBitDataEntry::CreateFromBooleanArray(Value); } ULowEntryBitDataEntry* ULowEntryExtendedStandardLibrary::BitDataEntry_CreateFromStringUtf8Array(const TArray& Value) { return ULowEntryBitDataEntry::CreateFromStringUtf8Array(Value); } ULowEntryLong* ULowEntryExtendedStandardLibrary::Long_CreateZero() { return ULowEntryLong::Create(); } ULowEntryLong* ULowEntryExtendedStandardLibrary::Long_Create(const TArray& ByteArray, int32 Index, int32 Length) { return ULowEntryLong::Create(ByteArray, Index, Length); } ULowEntryDouble* ULowEntryExtendedStandardLibrary::Double_CreateZero() { return ULowEntryDouble::Create(); } ULowEntryDouble* ULowEntryExtendedStandardLibrary::Double_Create(const TArray& ByteArray, int32 Index, int32 Length) { return ULowEntryDouble::Create(ByteArray, Index, Length); } void ULowEntryExtendedStandardLibrary::SetMousePosition(const int32 X, const int32 Y) { if (GEngine == nullptr) { return; } UGameViewportClient* ViewportClient = GEngine->GameViewport; if (ViewportClient == nullptr) { return; } FViewport* Viewport = ViewportClient->Viewport; if (Viewport == nullptr) { return; } FIntPoint Size = Viewport->GetSizeXY(); if ((Size.X <= 0) || (Size.Y <= 0)) { return; } Viewport->SetMouse(FMath::Clamp(X, 0, Size.X), FMath::Clamp(Y, 0, Size.Y)); } void ULowEntryExtendedStandardLibrary::GetMousePosition(bool& Success, int32& X, int32& Y) { Success = false; X = 0; Y = 0; if (GEngine == nullptr) { return; } UGameViewportClient* ViewportClient = GEngine->GameViewport; if (ViewportClient == nullptr) { return; } FViewport* Viewport = ViewportClient->Viewport; if (Viewport == nullptr) { return; } int32 MouseX = Viewport->GetMouseX(); int32 MouseY = Viewport->GetMouseY(); if ((MouseX < 0) || (MouseY < 0)) { return; } FIntPoint Size = Viewport->GetSizeXY(); if ((Size.X <= 0) || (Size.Y <= 0)) { return; } if ((Size.X < MouseX) || (Size.Y < MouseY)) { return; } Success = true; X = MouseX; Y = MouseY; } void ULowEntryExtendedStandardLibrary::SetMousePositionInPercentages(const double X, const double Y) { if (GEngine == nullptr) { return; } UGameViewportClient* ViewportClient = GEngine->GameViewport; if (ViewportClient == nullptr) { return; } FViewport* Viewport = ViewportClient->Viewport; if (Viewport == nullptr) { return; } FIntPoint Size = Viewport->GetSizeXY(); Viewport->SetMouse(FMath::RoundToInt(Size.X * FMath::Clamp(X, 0.0, 1.0)), FMath::RoundToInt(Size.Y * FMath::Clamp(Y, 0.0, 1.0))); } void ULowEntryExtendedStandardLibrary::GetMousePositionInPercentages(bool& Success, double& X, double& Y) { Success = false; X = 0; Y = 0; if (GEngine == nullptr) { return; } UGameViewportClient* ViewportClient = GEngine->GameViewport; if (ViewportClient == nullptr) { return; } FViewport* Viewport = ViewportClient->Viewport; if (Viewport == nullptr) { return; } int32 MouseX = Viewport->GetMouseX(); int32 MouseY = Viewport->GetMouseY(); if ((MouseX < 0) || (MouseY < 0)) { return; } FIntPoint Size = Viewport->GetSizeXY(); if ((Size.X <= 0) || (Size.Y <= 0)) { return; } if ((Size.X < MouseX) || (Size.Y < MouseY)) { return; } Success = true; X = MouseX / static_cast(Size.X); Y = MouseY / static_cast(Size.Y); } void ULowEntryExtendedStandardLibrary::SetMouseLockedToViewport(const bool Locked) { if (GEngine == nullptr) { return; } UGameViewportClient* ViewportClient = GEngine->GameViewport; if (ViewportClient == nullptr) { return; } TSharedPtr ViewportWidget = ViewportClient->GetGameViewportWidget(); if (!ViewportWidget.IsValid()) { return; } TArray LocalPlayerControllers; GEngine->GetAllLocalPlayerControllers(LocalPlayerControllers); for (APlayerController* LocalPlayerController : LocalPlayerControllers) { if (LocalPlayerController == nullptr) { continue; } ULocalPlayer* LocalPlayer = Cast(LocalPlayerController->Player); if (LocalPlayer == nullptr) { continue; } if (Locked) { LocalPlayer->GetSlateOperations().LockMouseToWidget(ViewportWidget.ToSharedRef()); } else { LocalPlayer->GetSlateOperations().ReleaseMouseLock(); } } } void ULowEntryExtendedStandardLibrary::GetPrimaryMonitorResolution(int32& Width, int32& Height) { FDisplayMetrics DisplayMetrics; FDisplayMetrics::RebuildDisplayMetrics(DisplayMetrics); Width = DisplayMetrics.PrimaryDisplayWidth; Height = DisplayMetrics.PrimaryDisplayHeight; } void ULowEntryExtendedStandardLibrary::GetPrimaryMonitorWorkArea(int32& X, int32& Y, int32& Width, int32& Height) { FDisplayMetrics DisplayMetrics; FDisplayMetrics::RebuildDisplayMetrics(DisplayMetrics); FPlatformRect Bounds = DisplayMetrics.PrimaryDisplayWorkAreaRect; X = Bounds.Left; Y = Bounds.Top; Width = Bounds.Right - Bounds.Left; Height = Bounds.Bottom - Bounds.Top; } void ULowEntryExtendedStandardLibrary::GetWindowBounds(bool& Success, int32& X, int32& Y, int32& Width, int32& Height) { Success = false; X = 0; Y = 0; Width = 0; Height = 0; if (GEngine == nullptr) { return; } UGameViewportClient* ViewportClient = GEngine->GameViewport; if (ViewportClient == nullptr) { return; } TSharedPtr Window = ViewportClient->GetWindow(); if (!Window.IsValid()) { return; } FVector2D Position = Window->GetPositionInScreen(); FVector2D Size = Window->GetSizeInScreen(); Success = true; X = Position.X; Y = Position.Y; Width = Size.X; Height = Size.Y; } void ULowEntryExtendedStandardLibrary::GetWindowPosition(bool& Success, int32& X, int32& Y) { Success = false; X = 0; Y = 0; if (GEngine == nullptr) { return; } UGameViewportClient* ViewportClient = GEngine->GameViewport; if (ViewportClient == nullptr) { return; } TSharedPtr Window = ViewportClient->GetWindow(); if (!Window.IsValid()) { return; } FVector2D Position = Window->GetPositionInScreen(); Success = true; X = Position.X; Y = Position.Y; } void ULowEntryExtendedStandardLibrary::GetWindowSize(bool& Success, int32& Width, int32& Height) { Success = false; Width = 0; Height = 0; if (GEngine == nullptr) { return; } UGameViewportClient* ViewportClient = GEngine->GameViewport; if (ViewportClient == nullptr) { return; } TSharedPtr Window = ViewportClient->GetWindow(); if (!Window.IsValid()) { return; } FVector2D Size = Window->GetSizeInScreen(); Success = true; Width = Size.X; Height = Size.Y; } void ULowEntryExtendedStandardLibrary::GetWindowPositionInPercentagesCentered(bool& Success, double& X, double& Y) { Success = false; X = 0; Y = 0; if (GEngine == nullptr) { return; } UGameViewportClient* ViewportClient = GEngine->GameViewport; if (ViewportClient == nullptr) { return; } TSharedPtr Window = ViewportClient->GetWindow(); if (!Window.IsValid()) { return; } int32 ScreenX = 0; int32 ScreenY = 0; int32 ScreenWidth = 0; int32 ScreenHeight = 0; GetPrimaryMonitorWorkArea(ScreenX, ScreenY, ScreenWidth, ScreenHeight); FVector2D Position = Window->GetPositionInScreen(); FVector2D WindowSize = Window->GetSizeInScreen(); double NewScreenX = ((Position.X + (WindowSize.X / 2.0)) - ScreenX) / ScreenWidth; double NewScreenY = ((Position.Y + (WindowSize.Y / 2.0)) - ScreenY) / ScreenHeight; Success = true; X = NewScreenX; Y = NewScreenY; } void ULowEntryExtendedStandardLibrary::SetWindowPosition(const int32 X, const int32 Y) { if (GEngine == nullptr) { return; } UGameViewportClient* ViewportClient = GEngine->GameViewport; if (ViewportClient == nullptr) { return; } TSharedPtr Window = ViewportClient->GetWindow(); if (!Window.IsValid()) { return; } Window->MoveWindowTo(FVector2D(X, Y)); } void ULowEntryExtendedStandardLibrary::SetWindowSize(const int32 Width, const int32 Height) { if (GEngine == nullptr) { return; } UGameViewportClient* ViewportClient = GEngine->GameViewport; if (ViewportClient == nullptr) { return; } TSharedPtr Window = ViewportClient->GetWindow(); if (!Window.IsValid()) { return; } Window->Resize(FVector2D(Width, Height)); } void ULowEntryExtendedStandardLibrary::SetWindowPositionInPercentagesCentered(const double X, const double Y) { if (GEngine == nullptr) { return; } UGameViewportClient* ViewportClient = GEngine->GameViewport; if (ViewportClient == nullptr) { return; } TSharedPtr Window = ViewportClient->GetWindow(); if (!Window.IsValid()) { return; } int32 ScreenX = 0; int32 ScreenY = 0; int32 ScreenWidth = 0; int32 ScreenHeight = 0; GetPrimaryMonitorWorkArea(ScreenX, ScreenY, ScreenWidth, ScreenHeight); FVector2D WindowSize = Window->GetSizeInScreen(); double NewScreenX = ScreenX + (ScreenWidth * X) - (WindowSize.X / 2.0); double NewScreenY = ScreenY + (ScreenHeight * Y) - (WindowSize.Y / 2.0); Window->MoveWindowTo(FVector2D(NewScreenX, NewScreenY)); } void ULowEntryExtendedStandardLibrary::GetWindowBorderSize(bool& Success, FMargin& Margin) { Success = false; Margin = FMargin(); if (GEngine == nullptr) { return; } UGameViewportClient* ViewportClient = GEngine->GameViewport; if (ViewportClient == nullptr) { return; } TSharedPtr Window = ViewportClient->GetWindow(); if (!Window.IsValid()) { return; } FMargin BorderSize = Window->GetWindowBorderSize(true); Success = true; Margin = BorderSize; } void ULowEntryExtendedStandardLibrary::GetWindowMode(bool& Success, bool& Fullscreen, bool& IsFullscreenWindowed) { Success = false; Fullscreen = false; IsFullscreenWindowed = false; if (GEngine == nullptr) { return; } UGameViewportClient* ViewportClient = GEngine->GameViewport; if (ViewportClient == nullptr) { return; } TSharedPtr Window = ViewportClient->GetWindow(); if (!Window.IsValid()) { return; } EWindowMode::Type Mode = Window->GetWindowMode(); if (Mode == EWindowMode::Type::Fullscreen) { Success = true; Fullscreen = true; } else if (Mode == EWindowMode::Type::WindowedFullscreen) { Success = true; Fullscreen = true; IsFullscreenWindowed = true; } else if (Mode == EWindowMode::Type::Windowed) { Success = true; } } void ULowEntryExtendedStandardLibrary::SetWindowMode(const bool Fullscreen, const bool IsFullscreenWindowed) { if (GEngine == nullptr) { return; } UGameViewportClient* ViewportClient = GEngine->GameViewport; if (ViewportClient == nullptr) { return; } TSharedPtr Window = ViewportClient->GetWindow(); if (!Window.IsValid()) { return; } if (Fullscreen) { if (IsFullscreenWindowed) { Window->SetWindowMode(EWindowMode::Type::WindowedFullscreen); } else { Window->SetWindowMode(EWindowMode::Type::Fullscreen); } } else { Window->SetWindowMode(EWindowMode::Type::Windowed); } } void ULowEntryExtendedStandardLibrary::SetSplitScreenEnabled(const bool Enabled) { if (GEngine == nullptr) { return; } UGameViewportClient* ViewportClient = GEngine->GameViewport; if (ViewportClient == nullptr) { return; } ViewportClient->SetForceDisableSplitscreen(!Enabled); } void ULowEntryExtendedStandardLibrary::GetSplitScreenType(ELowEntrySplitScreenType& Type) { Type = ELowEntrySplitScreenType::None; if (GEngine == nullptr) { return; } UGameViewportClient* ViewportClient = GEngine->GameViewport; if (ViewportClient == nullptr) { return; } Type = ELowEntrySplitScreenTypeFromUE4(ViewportClient->GetCurrentSplitscreenConfiguration()); } void ULowEntryExtendedStandardLibrary::SetSplitScreenType_TwoPlayers(const ELowEntrySplitScreenTypeTwoPlayers Type) { UGameMapsSettings* Settings = GetMutableDefault(); Settings->TwoPlayerSplitscreenLayout = ELowEntrySplitScreenTypeTwoPlayersToUE4(Type); if (GEngine == nullptr) { return; } UGameViewportClient* ViewportClient = GEngine->GameViewport; if (ViewportClient == nullptr) { return; } ViewportClient->UpdateActiveSplitscreenType(); } void ULowEntryExtendedStandardLibrary::SetSplitScreenType_ThreePlayers(const ELowEntrySplitScreenTypeThreePlayers Type) { UGameMapsSettings* Settings = GetMutableDefault(); Settings->ThreePlayerSplitscreenLayout = ELowEntrySplitScreenTypeThreePlayersToUE4(Type); if (GEngine == nullptr) { return; } UGameViewportClient* ViewportClient = GEngine->GameViewport; if (ViewportClient == nullptr) { return; } ViewportClient->UpdateActiveSplitscreenType(); } void ULowEntryExtendedStandardLibrary::IsWorldRenderingEnabled(bool& Success, bool& Enabled) { Success = false; Enabled = false; if (GEngine == nullptr) { return; } UGameViewportClient* ViewportClient = GEngine->GameViewport; if (ViewportClient == nullptr) { return; } Success = true; Enabled = (ViewportClient->bDisableWorldRendering == 0); } void ULowEntryExtendedStandardLibrary::SetWorldRenderingEnabled(const bool Enabled) { if (GEngine == nullptr) { return; } UGameViewportClient* ViewportClient = GEngine->GameViewport; if (ViewportClient == nullptr) { return; } ViewportClient->bDisableWorldRendering = (Enabled ? 0 : 1); } FString ULowEntryExtendedStandardLibrary::ClipboardGet() { FString Value = TEXT(""); FPlatformApplicationMisc::ClipboardPaste(Value); return Value; } void ULowEntryExtendedStandardLibrary::ClipboardSet(const FString& Value) { FPlatformApplicationMisc::ClipboardCopy(*Value); } void ULowEntryExtendedStandardLibrary::GetClassWithName(const FString& ClassName, UClass*& Class_, bool& Success) { Class_ = nullptr; Success = false; {// load class >> FSoftObjectPath Reference(ClassName); UClass* FoundClass = Cast(Reference.TryLoad()); if (FoundClass != nullptr) { Class_ = FoundClass; Success = true; return; } }// load class << {// get class >> UClass* FoundClass = FindFirstObject(*ClassName); if (FoundClass != nullptr) { Class_ = FoundClass; Success = true; return; } }// get class << {// get class through redirector >> UObjectRedirector* RenamedClassRedirector = FindFirstObject(*ClassName); if ((RenamedClassRedirector != nullptr) && (RenamedClassRedirector->DestinationObject != nullptr)) { UClass* FoundClass = CastChecked(RenamedClassRedirector->DestinationObject); if (FoundClass != nullptr) { Class_ = FoundClass; Success = true; } } }// get class through redirector << } FVector2D ULowEntryExtendedStandardLibrary::Divide_Vector2dVector2d(const FVector2D& A, const FVector2D& B) { return A / B; } FVector2D ULowEntryExtendedStandardLibrary::GetAbsoluteSize(const FGeometry& Geometry) { FVector2D LocalSize = Geometry.GetLocalSize(); return Geometry.LocalToAbsolute(LocalSize) - Geometry.LocalToAbsolute(FVector2D(0, 0)); } FVector2D ULowEntryExtendedStandardLibrary::GetLocalToAbsoluteScale(const FGeometry& Geometry) { FVector2D LocalSize = Geometry.GetLocalSize(); FVector2D AbsoluteSize = Geometry.LocalToAbsolute(LocalSize) - Geometry.LocalToAbsolute(FVector2D(0, 0)); return AbsoluteSize / LocalSize; } FVector2D ULowEntryExtendedStandardLibrary::GetAbsoluteToLocalScale(const FGeometry& Geometry) { FVector2D LocalSize = Geometry.GetLocalSize(); FVector2D AbsoluteSize = Geometry.LocalToAbsolute(LocalSize) - Geometry.LocalToAbsolute(FVector2D(0, 0)); return LocalSize / AbsoluteSize; } void ULowEntryExtendedStandardLibrary::ClearAllUserFocus() { if (!FSlateApplication::IsInitialized()) { return; } FSlateApplication::Get().ClearAllUserFocus(); } void ULowEntryExtendedStandardLibrary::ClearUserFocus(const int32 UserIndex) { if (!FSlateApplication::IsInitialized()) { return; } FSlateApplication::Get().ClearUserFocus(UserIndex); } void ULowEntryExtendedStandardLibrary::ClearKeyboardFocus() { if (!FSlateApplication::IsInitialized()) { return; } FSlateApplication::Get().ClearKeyboardFocus(); } FName ULowEntryExtendedStandardLibrary::GetUserFocusedWidgetType(const int32 UserIndex) { if (!FSlateApplication::IsInitialized()) { return TEXT(""); } TSharedPtr Widget = FSlateApplication::Get().GetUserFocusedWidget(UserIndex); if (!Widget.IsValid()) { return TEXT(""); } return Widget->GetType(); } FName ULowEntryExtendedStandardLibrary::GetKeyboardFocusedWidgetType() { if (!FSlateApplication::IsInitialized()) { return TEXT(""); } TSharedPtr Widget = FSlateApplication::Get().GetKeyboardFocusedWidget(); if (!Widget.IsValid()) { return TEXT(""); } return Widget->GetType(); } void ULowEntryExtendedStandardLibrary::ExecToBoolean(const ELowEntryExtendedStandardLibraryTrueOrFalse Branch, bool& Value) { Value = (Branch == ELowEntryExtendedStandardLibraryTrueOrFalse::_True_); } void ULowEntryExtendedStandardLibrary::ExecToInteger(const ELowEntryExtendedStandardLibrary0to9 Branch, int32& Value) { Value = static_cast(Branch); } void ULowEntryExtendedStandardLibrary::ExecToByte(const ELowEntryExtendedStandardLibrary0to9 Branch, uint8& Value) { Value = static_cast(Branch); } void ULowEntryExtendedStandardLibrary::CaseSwitchInteger(const int32 OnlyCheckFirstX, const int32 Value, const int32 _1__, const int32 _2__, const int32 _3__, const int32 _4__, const int32 _5__, const int32 _6__, const int32 _7__, const int32 _8__, const int32 _9__, const int32 _10__, ELowEntryExtendedStandardLibrary1to10other& Branch) { Branch = ELowEntryExtendedStandardLibrary1to10other::Other; if (OnlyCheckFirstX < 1) { return; } if (Value == _1__) { Branch = ELowEntryExtendedStandardLibrary1to10other::_1_; return; } if (OnlyCheckFirstX < 2) { return; } if (Value == _2__) { Branch = ELowEntryExtendedStandardLibrary1to10other::_2_; return; } if (OnlyCheckFirstX < 3) { return; } if (Value == _3__) { Branch = ELowEntryExtendedStandardLibrary1to10other::_3_; return; } if (OnlyCheckFirstX < 4) { return; } if (Value == _4__) { Branch = ELowEntryExtendedStandardLibrary1to10other::_4_; return; } if (OnlyCheckFirstX < 5) { return; } if (Value == _5__) { Branch = ELowEntryExtendedStandardLibrary1to10other::_5_; return; } if (OnlyCheckFirstX < 6) { return; } if (Value == _6__) { Branch = ELowEntryExtendedStandardLibrary1to10other::_6_; return; } if (OnlyCheckFirstX < 7) { return; } if (Value == _7__) { Branch = ELowEntryExtendedStandardLibrary1to10other::_7_; return; } if (OnlyCheckFirstX < 8) { return; } if (Value == _8__) { Branch = ELowEntryExtendedStandardLibrary1to10other::_8_; return; } if (OnlyCheckFirstX < 9) { return; } if (Value == _9__) { Branch = ELowEntryExtendedStandardLibrary1to10other::_9_; return; } if (OnlyCheckFirstX < 10) { return; } if (Value == _10__) { Branch = ELowEntryExtendedStandardLibrary1to10other::_10_; } } void ULowEntryExtendedStandardLibrary::CaseSwitchByte(const int32 OnlyCheckFirstX, const uint8 Value, const uint8 _1__, const uint8 _2__, const uint8 _3__, const uint8 _4__, const uint8 _5__, const uint8 _6__, const uint8 _7__, const uint8 _8__, const uint8 _9__, const uint8 _10__, ELowEntryExtendedStandardLibrary1to10other& Branch) { Branch = ELowEntryExtendedStandardLibrary1to10other::Other; if (OnlyCheckFirstX < 1) { return; } if (Value == _1__) { Branch = ELowEntryExtendedStandardLibrary1to10other::_1_; return; } if (OnlyCheckFirstX < 2) { return; } if (Value == _2__) { Branch = ELowEntryExtendedStandardLibrary1to10other::_2_; return; } if (OnlyCheckFirstX < 3) { return; } if (Value == _3__) { Branch = ELowEntryExtendedStandardLibrary1to10other::_3_; return; } if (OnlyCheckFirstX < 4) { return; } if (Value == _4__) { Branch = ELowEntryExtendedStandardLibrary1to10other::_4_; return; } if (OnlyCheckFirstX < 5) { return; } if (Value == _5__) { Branch = ELowEntryExtendedStandardLibrary1to10other::_5_; return; } if (OnlyCheckFirstX < 6) { return; } if (Value == _6__) { Branch = ELowEntryExtendedStandardLibrary1to10other::_6_; return; } if (OnlyCheckFirstX < 7) { return; } if (Value == _7__) { Branch = ELowEntryExtendedStandardLibrary1to10other::_7_; return; } if (OnlyCheckFirstX < 8) { return; } if (Value == _8__) { Branch = ELowEntryExtendedStandardLibrary1to10other::_8_; return; } if (OnlyCheckFirstX < 9) { return; } if (Value == _9__) { Branch = ELowEntryExtendedStandardLibrary1to10other::_9_; return; } if (OnlyCheckFirstX < 10) { return; } if (Value == _10__) { Branch = ELowEntryExtendedStandardLibrary1to10other::_10_; } } void ULowEntryExtendedStandardLibrary::CaseSwitchObject(const int32 OnlyCheckFirstX, const UObject* Value, const UObject* _1__, const UObject* _2__, const UObject* _3__, const UObject* _4__, const UObject* _5__, const UObject* _6__, const UObject* _7__, const UObject* _8__, const UObject* _9__, const UObject* _10__, ELowEntryExtendedStandardLibrary1to10other& Branch) { Branch = ELowEntryExtendedStandardLibrary1to10other::Other; if (OnlyCheckFirstX < 1) { return; } if (Value == _1__) { Branch = ELowEntryExtendedStandardLibrary1to10other::_1_; return; } if (OnlyCheckFirstX < 2) { return; } if (Value == _2__) { Branch = ELowEntryExtendedStandardLibrary1to10other::_2_; return; } if (OnlyCheckFirstX < 3) { return; } if (Value == _3__) { Branch = ELowEntryExtendedStandardLibrary1to10other::_3_; return; } if (OnlyCheckFirstX < 4) { return; } if (Value == _4__) { Branch = ELowEntryExtendedStandardLibrary1to10other::_4_; return; } if (OnlyCheckFirstX < 5) { return; } if (Value == _5__) { Branch = ELowEntryExtendedStandardLibrary1to10other::_5_; return; } if (OnlyCheckFirstX < 6) { return; } if (Value == _6__) { Branch = ELowEntryExtendedStandardLibrary1to10other::_6_; return; } if (OnlyCheckFirstX < 7) { return; } if (Value == _7__) { Branch = ELowEntryExtendedStandardLibrary1to10other::_7_; return; } if (OnlyCheckFirstX < 8) { return; } if (Value == _8__) { Branch = ELowEntryExtendedStandardLibrary1to10other::_8_; return; } if (OnlyCheckFirstX < 9) { return; } if (Value == _9__) { Branch = ELowEntryExtendedStandardLibrary1to10other::_9_; return; } if (OnlyCheckFirstX < 10) { return; } if (Value == _10__) { Branch = ELowEntryExtendedStandardLibrary1to10other::_10_; } } void ULowEntryExtendedStandardLibrary::PlayerControllerGetLocalPlayer(APlayerController* PlayerController, bool& Success, ULocalPlayer*& LocalPlayer) { Success = false; LocalPlayer = nullptr; if (PlayerController == nullptr) { return; } if (PlayerController->Player == nullptr) { return; } if (!PlayerController->Player->GetClass()->IsChildOf(ULocalPlayer::StaticClass())) { return; } LocalPlayer = static_cast(PlayerController->Player); if (LocalPlayer == nullptr) { return; } Success = true; } void ULowEntryExtendedStandardLibrary::SimpleKismetSystemLibraryPrintString(const FString& InString) { #if !(UE_BUILD_SHIPPING || UE_BUILD_TEST) float ScreenDurationTime = 5.0f; FLinearColor TextColor = FLinearColor(0.0, 0.66, 1.0); UE_LOG(LogBlueprintUserMessages, Log, TEXT("%s"), *InString); if (GAreScreenMessagesEnabled) { if (GEngine != nullptr) { GEngine->AddOnScreenDebugMessage(INDEX_NONE, ScreenDurationTime, TextColor.ToFColor(true), InString); } } #endif } ULowEntryByteArray* ULowEntryExtendedStandardLibrary::EncapsulateByteArray(const TArray& ByteArray) { return ULowEntryByteArray::CreateFromByteArray(ByteArray); } TArray ULowEntryExtendedStandardLibrary::MergeEncapsulatedByteArrays(const TArray& ByteArrays) { if (ByteArrays.Num() <= 0) { return TArray(); } if (ByteArrays.Num() == 1) { ULowEntryByteArray* Array = ByteArrays[0]; if (Array == nullptr) { return TArray(); } return Array->ByteArray; } int32 Length = 0; for (ULowEntryByteArray* Array : ByteArrays) { if (Array != nullptr) { Length += Array->ByteArray.Num(); } } if (Length <= 0) { return TArray(); } TArray Merged = TArray(); Merged.Reserve(Length); for (ULowEntryByteArray* Array : ByteArrays) { if (Array != nullptr) { Merged.Append(Array->ByteArray); } } return Merged; }