diff --git a/Reanimal/NameCollisions.inl b/Reanimal/NameCollisions.inl new file mode 100644 index 0000000..c7f2428 --- /dev/null +++ b/Reanimal/NameCollisions.inl @@ -0,0 +1,115 @@ +#pragma once + +/* +* SDK generated by Dumper-7 +* +* https://github.com/Encryqed/Dumper-7 +*/ + +// FORWARD DECLARATIONS + + +namespace GameplayAbilities { struct FServerAbilityRPCBatch; } + +namespace AnimBP_CannonHatch { struct FAnimBlueprintGeneratedConstantData; } + +namespace AnimBP_IceCreamTruckFinaleScene { struct FAnimBlueprintGeneratedConstantData; } + +namespace ANIM_BP_Sniffer_IceCreamTruckEncounter { struct FAnimBlueprintGeneratedConstantData; } + +namespace ANIMBP_AICompanionPawn_Child { struct FAnimBlueprintGeneratedConstantData; } + +namespace ANIM_BP_FoodTruckNewTires { struct FAnimBlueprintGeneratedConstantData; } + +namespace ANIMBP_CoPlayerPawn { struct FAnimBlueprintGeneratedConstantData; } + +namespace ANIMBP_ChaosFoodTruck { struct FAnimBlueprintGeneratedConstantData; } + +namespace ANIMBP_Draisine_Repairable { struct FAnimBlueprintGeneratedConstantData; } + +namespace ANIMBP_Lantern { struct FAnimBlueprintGeneratedConstantData; } + +namespace AnimBP_PlayerIceCreamTruck_HoodHead { struct FAnimBlueprintGeneratedConstantData; } + +namespace ANIMBP_BrookeEye_Pickup { struct FAnimBlueprintGeneratedConstantData; } + +namespace AnimBP_BoltcutterPickup { struct FAnimBlueprintGeneratedConstantData; } + + +namespace AnimBP_PlayerDraisine_Layered +{ + struct FAnimBlueprintGeneratedConstantData; + struct FAnimBlueprintGeneratedMutableData; +} + +namespace AnimBP_T_Masks +{ + struct FAnimBlueprintGeneratedMutableData; + struct FAnimBlueprintGeneratedConstantData; +} + +namespace AnimBP_ElevatorInWater +{ + struct FAnimBlueprintGeneratedConstantData; + struct FAnimBlueprintGeneratedMutableData; +} + +namespace AnimBP_FoodTruck_Chase +{ + struct FAnimBlueprintGeneratedMutableData; + struct FAnimBlueprintGeneratedConstantData; +} + +namespace AnimBP_IceCreamTruckChase_Sniffer +{ + struct FAnimBlueprintGeneratedConstantData; + struct FAnimBlueprintGeneratedMutableData; +} + +namespace AnimBP_PlayerIceCreamTruck_Driver +{ + struct FAnimBlueprintGeneratedConstantData; + struct FAnimBlueprintGeneratedMutableData; +} + +namespace ANIMBP_PlayerPawn +{ + struct FAnimBlueprintGeneratedMutableData; + struct FAnimBlueprintGeneratedConstantData; +} + +namespace AnimBP_Seagull +{ + struct FAnimBlueprintGeneratedConstantData; + struct FAnimBlueprintGeneratedMutableData; +} + +namespace ANIMBP_IceCreamTruck_SnifferInsideFinale +{ + struct FAnimBlueprintGeneratedConstantData; + struct FAnimBlueprintGeneratedMutableData; +} + +namespace ANIM_BP_Door +{ + struct FAnimBlueprintGeneratedMutableData; + struct FAnimBlueprintGeneratedConstantData; +} + +namespace ANIMBP_Boat +{ + struct FAnimBlueprintGeneratedConstantData; + struct FAnimBlueprintGeneratedMutableData; +} + +namespace ANIM_BP_PlayerWeapon +{ + struct FAnimBlueprintGeneratedMutableData; + struct FAnimBlueprintGeneratedConstantData; +} + +namespace AnimBP_PlayerIceCreamTruck_Passenger +{ + struct FAnimBlueprintGeneratedMutableData; + struct FAnimBlueprintGeneratedConstantData; +} diff --git a/Reanimal/PropertyFixup.hpp b/Reanimal/PropertyFixup.hpp new file mode 100644 index 0000000..6728734 --- /dev/null +++ b/Reanimal/PropertyFixup.hpp @@ -0,0 +1,21 @@ +#pragma once + +/* +* SDK generated by Dumper-7 +* +* https://github.com/Encryqed/Dumper-7 +*/ + +// PROPERTY-FIXUP + + +namespace SDK +{ + +class alignas(0x01) FMulticastSparseDelegateProperty_ +{ + unsigned __int8 Pad[0x1]; +}; + +} + diff --git a/Reanimal/SDK.hpp b/Reanimal/SDK.hpp new file mode 100644 index 0000000..9dfddc7 --- /dev/null +++ b/Reanimal/SDK.hpp @@ -0,0 +1,1292 @@ +#pragma once + +/* +* SDK generated by Dumper-7 +* +* https://github.com/Encryqed/Dumper-7 +*/ + +// Everholm +// 5.4.4-0+UE5 + +// Includes the entire SDK. Include files directly for faster compilation! + +#include "SDK/Basic.hpp" +#include "SDK/CoreUObject_structs.hpp" +#include "SDK/CoreUObject_classes.hpp" +#include "SDK/BP_CustomProgression_Overworld_CodeMachine_classes.hpp" +#include "SDK/MeshModelingTools_structs.hpp" +#include "SDK/PhysicsCore_structs.hpp" +#include "SDK/Chaos_structs.hpp" +#include "SDK/InputCore_structs.hpp" +#include "SDK/Slate_structs.hpp" +#include "SDK/Engine_structs.hpp" +#include "SDK/ModelingComponents_structs.hpp" +#include "SDK/ModelingComponents_classes.hpp" +#include "SDK/ModelingOperators_structs.hpp" +#include "SDK/MeshModelingTools_classes.hpp" +#include "SDK/FieldNotification_structs.hpp" +#include "SDK/DeveloperSettings_structs.hpp" +#include "SDK/DeveloperSettings_classes.hpp" +#include "SDK/PhysicsCore_classes.hpp" +#include "SDK/AudioPlatformConfiguration_structs.hpp" +#include "SDK/AudioExtensions_structs.hpp" +#include "SDK/AudioExtensions_classes.hpp" +#include "SDK/SlateCore_structs.hpp" +#include "SDK/NetCore_structs.hpp" +#include "SDK/NetCore_classes.hpp" +#include "SDK/Engine_classes.hpp" +#include "SDK/UI_PageIndicator_classes.hpp" +#include "SDK/GameplayTags_structs.hpp" +#include "SDK/DataRegistry_structs.hpp" +#include "SDK/UniversalObjectLocator_structs.hpp" +#include "SDK/MovieScene_structs.hpp" +#include "SDK/GameplayAbilities_structs.hpp" +#include "SDK/GameplayAbilities_classes.hpp" +#include "SDK/BP_SniperProxyTarget_classes.hpp" +#include "SDK/AnimationCore_structs.hpp" +#include "SDK/AnimationCore_classes.hpp" +#include "SDK/UMG_structs.hpp" +#include "SDK/UI_GenericGameshareDisconnectMessage_classes.hpp" +#include "SDK/InputCore_classes.hpp" +#include "SDK/AnimGraphRuntime_structs.hpp" +#include "SDK/AnimBP_Seagull_structs.hpp" +#include "SDK/ENUM_SeagullStates_structs.hpp" +#include "SDK/AnimBP_Seagull_classes.hpp" +#include "SDK/SlateCore_classes.hpp" +#include "SDK/WDG_DeveloperMenu_classes.hpp" +#include "SDK/ImguiView_classes.hpp" +#include "SDK/ImageCore_structs.hpp" +#include "SDK/ImageCore_classes.hpp" +#include "SDK/OAuthConnections_structs.hpp" +#include "SDK/OAuthConnections_classes.hpp" +#include "SDK/Slate_classes.hpp" +#include "SDK/EngineSettings_structs.hpp" +#include "SDK/EngineSettings_classes.hpp" +#include "SDK/BuildPatchServices_structs.hpp" +#include "SDK/BuildPatchServices_classes.hpp" +#include "SDK/EngineUtilities_structs.hpp" +#include "SDK/Chalkboard_structs.hpp" +#include "SDK/TarsierAI_structs.hpp" +#include "SDK/GameUtilities_structs.hpp" +#include "SDK/Everholm_structs.hpp" +#include "SDK/EditorUtilitiesRuntime_structs.hpp" +#include "SDK/EditorUtilitiesRuntime_classes.hpp" +#include "SDK/TarsierCore_structs.hpp" +#include "SDK/GameUtilities_classes.hpp" +#include "SDK/CommonUser_structs.hpp" +#include "SDK/CommonUser_classes.hpp" +#include "SDK/Chalkboard_classes.hpp" +#include "SDK/AIModule_structs.hpp" +#include "SDK/AIModule_classes.hpp" +#include "SDK/TarsierAI_classes.hpp" +#include "SDK/EngineUtilities_classes.hpp" +#include "SDK/InteractionSystem_structs.hpp" +#include "SDK/InteractionSystem_classes.hpp" +#include "SDK/CommonInput_structs.hpp" +#include "SDK/MovieScene_classes.hpp" +#include "SDK/UMG_classes.hpp" +#include "SDK/StructUtils_structs.hpp" +#include "SDK/AkAudio_structs.hpp" +#include "SDK/GameEvents_structs.hpp" +#include "SDK/SaveSystem_structs.hpp" +#include "SDK/Everholm_classes.hpp" +#include "SDK/BP_ClimbAction_LadderFromTop_classes.hpp" +#include "SDK/FieldNotification_classes.hpp" +#include "SDK/BP_Pickup_Mask_ClamHead_classes.hpp" +#include "SDK/NotifyState_ApplyGameplayTags_classes.hpp" +#include "SDK/IrisCore_structs.hpp" +#include "SDK/IrisCore_classes.hpp" +#include "SDK/StarlinkRouters_classes.hpp" +#include "SDK/MeshDescription_structs.hpp" +#include "SDK/MeshDescription_classes.hpp" +#include "SDK/StaticMeshDescription_structs.hpp" +#include "SDK/StaticMeshDescription_classes.hpp" +#include "SDK/SkeletalMeshDescription_structs.hpp" +#include "SDK/SkeletalMeshDescription_classes.hpp" +#include "SDK/RigVM_structs.hpp" +#include "SDK/RigVM_classes.hpp" +#include "SDK/DataflowCore_structs.hpp" +#include "SDK/DataflowCore_classes.hpp" +#include "SDK/PropertyPath_structs.hpp" +#include "SDK/PropertyPath_classes.hpp" +#include "SDK/TypedElementFramework_structs.hpp" +#include "SDK/TypedElementFramework_classes.hpp" +#include "SDK/TypedElementRuntime_structs.hpp" +#include "SDK/TypedElementRuntime_classes.hpp" +#include "SDK/AudioLinkCore_classes.hpp" +#include "SDK/JsonUtilities_structs.hpp" +#include "SDK/JsonUtilities_classes.hpp" +#include "SDK/AssetRegistry_structs.hpp" +#include "SDK/AssetRegistry_classes.hpp" +#include "SDK/HNC_MakeBoolMerge_classes.hpp" +#include "SDK/PacketHandler_classes.hpp" +#include "SDK/ClothingSystemRuntimeInterface_structs.hpp" +#include "SDK/ClothingSystemRuntimeInterface_classes.hpp" +#include "SDK/AudioMixer_structs.hpp" +#include "SDK/AudioMixer_classes.hpp" +#include "SDK/ImageWriteQueue_structs.hpp" +#include "SDK/ImageWriteQueue_classes.hpp" +#include "SDK/BP_BoatBlockingSpline_Circle_classes.hpp" +#include "SDK/MaterialShaderQualitySettings_structs.hpp" +#include "SDK/MaterialShaderQualitySettings_classes.hpp" +#include "SDK/BP_IceCreamTruck_Chaos_classes.hpp" +#include "SDK/EyeTracker_structs.hpp" +#include "SDK/EyeTracker_classes.hpp" +#include "SDK/Renderer_structs.hpp" +#include "SDK/Renderer_classes.hpp" +#include "SDK/HeadMountedDisplay_structs.hpp" +#include "SDK/HeadMountedDisplay_classes.hpp" +#include "SDK/Foliage_structs.hpp" +#include "SDK/Foliage_classes.hpp" +#include "SDK/Landscape_structs.hpp" +#include "SDK/Landscape_classes.hpp" +#include "SDK/SlateRHIRenderer_structs.hpp" +#include "SDK/SlateRHIRenderer_classes.hpp" +#include "SDK/TimeManagement_structs.hpp" +#include "SDK/TimeManagement_classes.hpp" +#include "SDK/ChaosSolverEngine_structs.hpp" +#include "SDK/ChaosSolverEngine_classes.hpp" +#include "SDK/FieldSystemEngine_structs.hpp" +#include "SDK/FieldSystemEngine_classes.hpp" +#include "SDK/BP_Pickup_GenericKey_Mill_Sewer_classes.hpp" +#include "SDK/DataflowEngine_structs.hpp" +#include "SDK/DataflowEngine_classes.hpp" +#include "SDK/GeometryCollectionEngine_structs.hpp" +#include "SDK/GeometryCollectionEngine_classes.hpp" +#include "SDK/AnimGraphRuntime_classes.hpp" +#include "SDK/Constraints_structs.hpp" +#include "SDK/Constraints_classes.hpp" +#include "SDK/BP_BoatDecalBase_classes.hpp" +#include "SDK/MovieSceneTracks_structs.hpp" +#include "SDK/MovieSceneTracks_classes.hpp" +#include "SDK/CinematicCamera_structs.hpp" +#include "SDK/CinematicCamera_classes.hpp" +#include "SDK/ChaosCloth_structs.hpp" +#include "SDK/ClothingSystemRuntimeCommon_structs.hpp" +#include "SDK/ClothingSystemRuntimeCommon_classes.hpp" +#include "SDK/ChaosCloth_classes.hpp" +#include "SDK/AudioLinkEngine_classes.hpp" +#include "SDK/ENUM_PryingType_structs.hpp" +#include "SDK/GameplayTags_classes.hpp" +#include "SDK/CamShake_VibrateShake_classes.hpp" +#include "SDK/AnimOverrideTransitionSlots_structs.hpp" +#include "SDK/MovieSceneCapture_structs.hpp" +#include "SDK/MovieSceneCapture_classes.hpp" +#include "SDK/AIReaction_CompanionFollowTargetSplitPath_classes.hpp" +#include "SDK/MediaAssets_structs.hpp" +#include "SDK/MediaAssets_classes.hpp" +#include "SDK/BP_SwapCharacterAbility_classes.hpp" +#include "SDK/LevelSequence_structs.hpp" +#include "SDK/LevelSequence_classes.hpp" +#include "SDK/MRMesh_structs.hpp" +#include "SDK/MRMesh_classes.hpp" +#include "SDK/MoviePlayer_structs.hpp" +#include "SDK/MoviePlayer_classes.hpp" +#include "SDK/NotifyState_WallSwitch_classes.hpp" +#include "SDK/Overlay_structs.hpp" +#include "SDK/Overlay_classes.hpp" +#include "SDK/ClothingSystemRuntimeNv_structs.hpp" +#include "SDK/ClothingSystemRuntimeNv_classes.hpp" +#include "SDK/BPD_HopDownLedge_classes.hpp" +#include "SDK/AnimNotify_AkEvent_classes.hpp" +#include "SDK/TarsierCore_classes.hpp" +#include "SDK/BP_Pickup_ThrowableBase_classes.hpp" +#include "SDK/ModularGameplay_structs.hpp" +#include "SDK/ModularGameplay_classes.hpp" +#include "SDK/BP_ChapterProgression_Forest_classes.hpp" +#include "SDK/ENUM_WeaponSwingState_structs.hpp" +#include "SDK/DataRegistry_classes.hpp" +#include "SDK/GameFeatures_structs.hpp" +#include "SDK/GameFeatures_classes.hpp" +#include "SDK/FluidBoundary_structs.hpp" +#include "SDK/FluidForceImpulseTimedEffects_structs.hpp" +#include "SDK/FluidForceImpulse_structs.hpp" +#include "SDK/FluidForceImpulsePerInstanceData_structs.hpp" +#include "SDK/FluidSimSolverMode_structs.hpp" +#include "SDK/FluidDynamicForceMeshType_structs.hpp" +#include "SDK/FluidForceSocketInfo_structs.hpp" +#include "SDK/FluidForceDynamic_structs.hpp" +#include "SDK/FluidForceDynamicPerInstanceData_structs.hpp" +#include "SDK/FluidTerrainModes_structs.hpp" +#include "SDK/BP_FluidSim_01_classes.hpp" +#include "SDK/MapManagerRuntime_structs.hpp" +#include "SDK/MapManagerRuntime_classes.hpp" +#include "SDK/GameplayTasks_structs.hpp" +#include "SDK/GameplayTasks_classes.hpp" +#include "SDK/NavigationSystem_structs.hpp" +#include "SDK/NavigationSystem_classes.hpp" +#include "SDK/DataflowNodes_structs.hpp" +#include "SDK/AutoTestRuntime_structs.hpp" +#include "SDK/AutoTestRuntime_classes.hpp" +#include "SDK/EnhancedInput_structs.hpp" +#include "SDK/EnhancedInput_classes.hpp" +#include "SDK/CommonInput_classes.hpp" +#include "SDK/DebugSystem_structs.hpp" +#include "SDK/DebugSystem_classes.hpp" +#include "SDK/NiagaraCore_structs.hpp" +#include "SDK/NiagaraCore_classes.hpp" +#include "SDK/Door_AudioComponent_classes.hpp" +#include "SDK/NiagaraShader_structs.hpp" +#include "SDK/NiagaraShader_classes.hpp" +#include "SDK/HNC_ForcePlayerPickup_classes.hpp" +#include "SDK/Niagara_structs.hpp" +#include "SDK/Niagara_classes.hpp" +#include "SDK/CamShake_DriveVehicle_classes.hpp" +#include "SDK/ModalCameraManager_structs.hpp" +#include "SDK/ModalCameraManager_classes.hpp" +#include "SDK/SurfaceQuery_structs.hpp" +#include "SDK/SurfaceQuery_classes.hpp" +#include "SDK/DeveloperMenu_classes.hpp" +#include "SDK/DebugSystemCamera_structs.hpp" +#include "SDK/DebugSystemCamera_classes.hpp" +#include "SDK/CommonUI_structs.hpp" +#include "SDK/CommonUI_classes.hpp" +#include "SDK/BlueprintConditionalsRuntime_structs.hpp" +#include "SDK/BlueprintConditionalsRuntime_classes.hpp" +#include "SDK/BPC_GameProgressManager_classes.hpp" +#include "SDK/COND_FalloffPrevention_Stop_classes.hpp" +#include "SDK/TarsierEQS_structs.hpp" +#include "SDK/TarsierEQS_classes.hpp" +#include "SDK/GameEvents_classes.hpp" +#include "SDK/AnimationSystem_structs.hpp" +#include "SDK/AnimationSystem_classes.hpp" +#include "SDK/TarsierSignal_structs.hpp" +#include "SDK/TarsierSignal_classes.hpp" +#include "SDK/BP_Pickup_GenericKey_Base_classes.hpp" +#include "SDK/GenericStimulus_structs.hpp" +#include "SDK/BP_BoatVehicle_classes.hpp" +#include "SDK/EnumExtension_structs.hpp" +#include "SDK/EnumExtension_classes.hpp" +#include "SDK/DeathHandler_SeagullSwarmed_classes.hpp" +#include "SDK/SaveSystem_classes.hpp" +#include "SDK/WwiseFileHandler_structs.hpp" +#include "SDK/WwiseFileHandler_classes.hpp" +#include "SDK/WwiseResourceLoader_structs.hpp" +#include "SDK/WwiseResourceLoader_classes.hpp" +#include "SDK/AkAudio_classes.hpp" +#include "SDK/OnlineSubsystem_structs.hpp" +#include "SDK/OnlineSubsystem_classes.hpp" +#include "SDK/TarsierWwiseExtension_structs.hpp" +#include "SDK/TarsierWwiseExtension_classes.hpp" +#include "SDK/StructUtils_classes.hpp" +#include "SDK/Water_structs.hpp" +#include "SDK/Water_classes.hpp" +#include "SDK/GeometryCache_structs.hpp" +#include "SDK/GeometryCache_classes.hpp" +#include "SDK/HairStrandsCore_structs.hpp" +#include "SDK/HairStrandsCore_classes.hpp" +#include "SDK/DeathSystem_structs.hpp" +#include "SDK/DeathSystem_classes.hpp" +#include "SDK/BP_CustomProgression_Overworld_WaterMine_classes.hpp" +#include "SDK/StreamingSystem_structs.hpp" +#include "SDK/StreamingSystem_classes.hpp" +#include "SDK/OnlineSubsystemUtils_structs.hpp" +#include "SDK/OnlineSubsystemUtils_classes.hpp" +#include "SDK/OnlineSubsystemSteam_classes.hpp" +#include "SDK/ProceduralMeshComponent_structs.hpp" +#include "SDK/ProceduralMeshComponent_classes.hpp" +#include "SDK/MotionWarping_structs.hpp" +#include "SDK/MotionWarping_classes.hpp" +#include "SDK/BP_PlayerFunneling_Base_classes.hpp" +#include "SDK/AtmosphereUtilities_structs.hpp" +#include "SDK/AtmosphereUtilities_classes.hpp" +#include "SDK/BugSplatRuntime_classes.hpp" +#include "SDK/BP_AchievementFunctions_classes.hpp" +#include "SDK/TraceUtilities_classes.hpp" +#include "SDK/PerformanceToolsRuntime_structs.hpp" +#include "SDK/PerformanceToolsRuntime_classes.hpp" +#include "SDK/NavLinkProxy_WalkForward_classes.hpp" +#include "SDK/PSOTools_classes.hpp" +#include "SDK/AutoTraceTools_structs.hpp" +#include "SDK/AutoTraceTools_classes.hpp" +#include "SDK/UI_GenericControllerMessage_classes.hpp" +#include "SDK/BlendStack_structs.hpp" +#include "SDK/BlendStack_classes.hpp" +#include "SDK/Chooser_structs.hpp" +#include "SDK/Chooser_classes.hpp" +#include "SDK/TextStyleInverted_classes.hpp" +#include "SDK/PoseSearch_structs.hpp" +#include "SDK/PoseSearch_classes.hpp" +#include "SDK/THQGDS_classes.hpp" +#include "SDK/ChaosVehiclesEngine_classes.hpp" +#include "SDK/ChaosVehicles_structs.hpp" +#include "SDK/ChaosVehicles_classes.hpp" +#include "SDK/BFGRendererMathUtils_classes.hpp" +#include "SDK/SignificanceManager_classes.hpp" +#include "SDK/BFGTickOptimizer_structs.hpp" +#include "SDK/BFGUITools_structs.hpp" +#include "SDK/BFGTickOptimizer_classes.hpp" +#include "SDK/CableComponent_classes.hpp" +#include "SDK/PlayerPawnType_ActorFilter_classes.hpp" +#include "SDK/BFGLightweightRenderer_structs.hpp" +#include "SDK/BFGLightweightRenderer_classes.hpp" +#include "SDK/OSSResolver_classes.hpp" +#include "SDK/MixedCallStack_classes.hpp" +#include "SDK/STRUCT_BoatBlockPlaneEntry_structs.hpp" +#include "SDK/STRUCT_BoatBlockSplineImpact_structs.hpp" +#include "SDK/BP_BoatMovementComponent_classes.hpp" +#include "SDK/DeveloperNotes_structs.hpp" +#include "SDK/DeveloperNotes_classes.hpp" +#include "SDK/UI_MaskButton_classes.hpp" +#include "SDK/DebugInGameView_classes.hpp" +#include "SDK/TextStyleControls_classes.hpp" +#include "SDK/DebugMainMenu_classes.hpp" +#include "SDK/NetImgui_classes.hpp" +#include "SDK/DevFolderAnalyzer_classes.hpp" +#include "SDK/ENUM_IceCreamTruckSnifferChaseState_structs.hpp" +#include "SDK/ENUM_IceCreamTruckPassengerSubstate_structs.hpp" +#include "SDK/STR_PuzzleStateForReplication_structs.hpp" +#include "SDK/BP_IceCreamTruckNew_classes.hpp" +#include "SDK/PhysicsControl_structs.hpp" +#include "SDK/PhysicsControl_classes.hpp" +#include "SDK/NiagaraAnimNotifies_structs.hpp" +#include "SDK/NiagaraAnimNotifies_classes.hpp" +#include "SDK/Starlink_classes.hpp" +#include "SDK/WwiseSimpleExternalSource_structs.hpp" +#include "SDK/WwiseSimpleExternalSource_classes.hpp" +#include "SDK/SLVL_Pickups_classes.hpp" +#include "SDK/NotifyState_TankChaseStumbleData_classes.hpp" +#include "SDK/Wwise_classes.hpp" +#include "SDK/ControlRig_structs.hpp" +#include "SDK/ControlRig_classes.hpp" +#include "SDK/LocomotionProfilePriorityEnum_structs.hpp" +#include "SDK/StructUtilsEngine_structs.hpp" +#include "SDK/StructUtilsEngine_classes.hpp" +#include "SDK/STR_GerstnerWaves_structs.hpp" +#include "SDK/BP_WaveGenerator_AtmoBlend_classes.hpp" +#include "SDK/BP_CharacterWoundedComponent_classes.hpp" +#include "SDK/SequencerScripting_structs.hpp" +#include "SDK/SequencerScripting_classes.hpp" +#include "SDK/HoudiniEngineRuntime_structs.hpp" +#include "SDK/HoudiniEngineRuntime_classes.hpp" +#include "SDK/ENUM_FootprintMovementType_structs.hpp" +#include "SDK/STR_Footprint_structs.hpp" +#include "SDK/ComputeFramework_structs.hpp" +#include "SDK/ComputeFramework_classes.hpp" +#include "SDK/HoudiniNiagara_structs.hpp" +#include "SDK/HoudiniNiagara_classes.hpp" +#include "SDK/OptimusSettings_structs.hpp" +#include "SDK/OptimusSettings_classes.hpp" +#include "SDK/OptimusCore_structs.hpp" +#include "SDK/OptimusCore_classes.hpp" +#include "SDK/AnimBP_ElevatorInWater_structs.hpp" +#include "SDK/AnimBP_ElevatorInWater_classes.hpp" +#include "SDK/BP_WallSwitch_PrimaryDataAsset_classes.hpp" +#include "SDK/HairStrandsDeformer_structs.hpp" +#include "SDK/HairStrandsDeformer_classes.hpp" +#include "SDK/GeometryCacheTracks_structs.hpp" +#include "SDK/GeometryCacheTracks_classes.hpp" +#include "SDK/StreamGraph_structs.hpp" +#include "SDK/StreamGraph_classes.hpp" +#include "SDK/GenericStimulus_classes.hpp" +#include "SDK/InteractiveToolsFramework_structs.hpp" +#include "SDK/InteractiveToolsFramework_classes.hpp" +#include "SDK/NavLinkProxy_Default_classes.hpp" +#include "SDK/TextureUtilitiesCommon_structs.hpp" +#include "SDK/TextureUtilitiesCommon_classes.hpp" +#include "SDK/ModelingOperators_classes.hpp" +#include "SDK/GeometryFramework_structs.hpp" +#include "SDK/GeometryFramework_classes.hpp" +#include "SDK/MeshModelingToolsExp_structs.hpp" +#include "SDK/MeshModelingToolsExp_classes.hpp" +#include "SDK/SocketSubsystemEOS_classes.hpp" +#include "SDK/AnimationWarpingRuntime_structs.hpp" +#include "SDK/AnimationWarpingRuntime_classes.hpp" +#include "SDK/OnlineSubsystemEOS_structs.hpp" +#include "SDK/OnlineSubsystemEOS_classes.hpp" +#include "SDK/DisplayClusterLightCardExtender_structs.hpp" +#include "SDK/DisplayClusterLightCardExtender_classes.hpp" +#include "SDK/HNC_DoOnce_classes.hpp" +#include "SDK/ColorCorrectRegions_structs.hpp" +#include "SDK/ColorCorrectRegions_classes.hpp" +#include "SDK/BP_SurfaceClimbAbility_classes.hpp" +#include "SDK/GeometryScriptingCore_structs.hpp" +#include "SDK/GeometryScriptingCore_classes.hpp" +#include "SDK/TakeMovieScene_classes.hpp" +#include "SDK/AnimationAIStateOverride_structs.hpp" +#include "SDK/Everholm_AudioNotifyState_classes.hpp" +#include "SDK/AudioCapture_structs.hpp" +#include "SDK/AudioCapture_classes.hpp" +#include "SDK/ConsoleVariablesEditorRuntime_structs.hpp" +#include "SDK/ConsoleVariablesEditorRuntime_classes.hpp" +#include "SDK/UI_SettingsGraphics_classes.hpp" +#include "SDK/VirtualHeightfieldMesh_classes.hpp" +#include "SDK/ScriptableToolsFramework_structs.hpp" +#include "SDK/ScriptableToolsFramework_classes.hpp" +#include "SDK/AnimToTexture_structs.hpp" +#include "SDK/AnimToTexture_classes.hpp" +#include "SDK/OpenColorIO_structs.hpp" +#include "SDK/OpenColorIO_classes.hpp" +#include "SDK/MovieRenderPipelineCore_structs.hpp" +#include "SDK/MovieRenderPipelineCore_classes.hpp" +#include "SDK/BP_EverholmRichTextInlineDecorator_classes.hpp" +#include "SDK/MovieRenderPipelineSettings_structs.hpp" +#include "SDK/MovieRenderPipelineSettings_classes.hpp" +#include "SDK/ActorLayerUtilities_structs.hpp" +#include "SDK/ActorLayerUtilities_classes.hpp" +#include "SDK/MovieRenderPipelineRenderPasses_structs.hpp" +#include "SDK/MovieRenderPipelineRenderPasses_classes.hpp" +#include "SDK/COND_HopDownLedge_classes.hpp" +#include "SDK/ProxyTable_structs.hpp" +#include "SDK/ProxyTable_classes.hpp" +#include "SDK/DLSS_structs.hpp" +#include "SDK/DLSS_classes.hpp" +#include "SDK/DLSSBlueprint_structs.hpp" +#include "SDK/DLSSBlueprint_classes.hpp" +#include "SDK/BP_EverholmCallComponent_classes.hpp" +#include "SDK/StreamlineRHI_structs.hpp" +#include "SDK/StreamlineRHI_classes.hpp" +#include "SDK/StreamlineBlueprint_structs.hpp" +#include "SDK/StreamlineBlueprint_classes.hpp" +#include "SDK/BP_PlayerSequencerProxy_classes.hpp" +#include "SDK/KeyboardAndMouseSteeringRuntime_classes.hpp" +#include "SDK/FSR2TemporalUpscaling_structs.hpp" +#include "SDK/FSR2TemporalUpscaling_classes.hpp" +#include "SDK/BinkMediaPlayer_structs.hpp" +#include "SDK/BinkMediaPlayer_classes.hpp" +#include "SDK/Paper2D_structs.hpp" +#include "SDK/Paper2D_classes.hpp" +#include "SDK/ACLPlugin_structs.hpp" +#include "SDK/ACLPlugin_classes.hpp" +#include "SDK/IKRig_structs.hpp" +#include "SDK/PBIK_structs.hpp" +#include "SDK/IKRig_classes.hpp" +#include "SDK/InterchangeCore_structs.hpp" +#include "SDK/InterchangeEngine_structs.hpp" +#include "SDK/InterchangeCore_classes.hpp" +#include "SDK/InterchangeEngine_classes.hpp" +#include "SDK/TemplateSequence_structs.hpp" +#include "SDK/TemplateSequence_classes.hpp" +#include "SDK/GameplayCameras_structs.hpp" +#include "SDK/GameplayCameras_classes.hpp" +#include "SDK/ChaosCaching_structs.hpp" +#include "SDK/ChaosCaching_classes.hpp" +#include "SDK/BP_AttachActorToPlayer_classes.hpp" +#include "SDK/BP_Pickup_ThrowableRockDestruction_classes.hpp" +#include "SDK/OodleNetworkHandlerComponent_structs.hpp" +#include "SDK/OodleNetworkHandlerComponent_classes.hpp" +#include "SDK/AnimationSharing_structs.hpp" +#include "SDK/AnimationSharing_classes.hpp" +#include "SDK/GenStim_ShockWave_classes.hpp" +#include "SDK/AnimBP_PlayerIceCreamTruck_Driver_structs.hpp" +#include "SDK/AnimBP_PlayerIceCreamTruck_Driver_classes.hpp" +#include "SDK/UObjectPlugin_structs.hpp" +#include "SDK/UObjectPlugin_classes.hpp" +#include "SDK/FacialAnimation_classes.hpp" +#include "SDK/VariantManagerContent_structs.hpp" +#include "SDK/VariantManagerContent_classes.hpp" +#include "SDK/DatasmithContent_structs.hpp" +#include "SDK/DatasmithContent_classes.hpp" +#include "SDK/GLTFExporter_structs.hpp" +#include "SDK/GLTFExporter_classes.hpp" +#include "SDK/BP_HoodHead_classes.hpp" +#include "SDK/EFieldShapeType_structs.hpp" +#include "SDK/InterchangeNodes_structs.hpp" +#include "SDK/InterchangeNodes_classes.hpp" +#include "SDK/InterchangeFactoryNodes_structs.hpp" +#include "SDK/InterchangeFactoryNodes_classes.hpp" +#include "SDK/BP_CustomProgression_Crank_classes.hpp" +#include "SDK/InterchangeMessages_classes.hpp" +#include "SDK/ENUM_PipOverlapType_structs.hpp" +#include "SDK/WDG_PlayerInteraction_classes.hpp" +#include "SDK/InterchangeImport_structs.hpp" +#include "SDK/InterchangeImport_classes.hpp" +#include "SDK/BP_StumbledByAIAbility_classes.hpp" +#include "SDK/InterchangeExport_classes.hpp" +#include "SDK/DeathHandler_IceCreamTruckSnifferSlam_classes.hpp" +#include "SDK/InterchangePipelines_structs.hpp" +#include "SDK/InterchangeCommon_structs.hpp" +#include "SDK/InterchangePipelines_classes.hpp" +#include "SDK/AutomationUtils_classes.hpp" +#include "SDK/GeometryCollectionTracks_structs.hpp" +#include "SDK/GeometryCollectionTracks_classes.hpp" +#include "SDK/DataflowEnginePlugin_classes.hpp" +#include "SDK/ChaosNiagara_structs.hpp" +#include "SDK/ChaosNiagara_classes.hpp" +#include "SDK/E_OnSpawnDetectionStates_structs.hpp" +#include "SDK/LocalizableMessageBlueprint_classes.hpp" +#include "SDK/NiagaraSimCaching_structs.hpp" +#include "SDK/NiagaraSimCaching_classes.hpp" +#include "SDK/AvfMediaFactory_classes.hpp" +#include "SDK/BP_CustomProgression_ConsumeItem_classes.hpp" +#include "SDK/ImgMediaEngine_classes.hpp" +#include "SDK/NavLinkProxy_Fall_classes.hpp" +#include "SDK/ImgMedia_structs.hpp" +#include "SDK/ImgMedia_classes.hpp" +#include "SDK/ImgMediaFactory_classes.hpp" +#include "SDK/DeathHandler_SimpleRagdoll_classes.hpp" +#include "SDK/MediaCompositing_structs.hpp" +#include "SDK/MediaCompositing_classes.hpp" +#include "SDK/ANIMBP_Lantern_structs.hpp" +#include "SDK/ANIMBP_Lantern_classes.hpp" +#include "SDK/RedBlockInMenuBorderStyle_classes.hpp" +#include "SDK/MediaPlate_structs.hpp" +#include "SDK/MediaPlate_classes.hpp" +#include "SDK/UI_GenericPrompt_classes.hpp" +#include "SDK/AIBehavior_AntiStuck_classes.hpp" +#include "SDK/WmfMediaFactory_classes.hpp" +#include "SDK/ENUM_GameplayContexts_structs.hpp" +#include "SDK/DirectedCameraSettings_classes.hpp" +#include "SDK/TcpMessaging_classes.hpp" +#include "SDK/UdpMessaging_structs.hpp" +#include "SDK/UdpMessaging_classes.hpp" +#include "SDK/BP_TriggerVolume_Box_250_classes.hpp" +#include "SDK/ActorSequence_structs.hpp" +#include "SDK/ActorSequence_classes.hpp" +#include "SDK/AndroidFileServer_structs.hpp" +#include "SDK/AndroidFileServer_classes.hpp" +#include "SDK/ENUM_WorldEventReactionOrientationMethod_structs.hpp" +#include "SDK/STR_ReactionMontageSetup_structs.hpp" +#include "SDK/STR_PlayerWorldEventReactionData_structs.hpp" +#include "SDK/BP_PlayerReaction_PrimaryDataAsset_classes.hpp" +#include "SDK/AndroidPermission_classes.hpp" +#include "SDK/FullBodyIK_structs.hpp" +#include "SDK/AppleImageUtils_structs.hpp" +#include "SDK/AppleImageUtils_classes.hpp" +#include "SDK/BP_PlayerCrouchComponent_classes.hpp" +#include "SDK/ArchVisCharacter_classes.hpp" +#include "SDK/BP_CharacterGameplayTagVolume_classes.hpp" +#include "SDK/AssetTags_structs.hpp" +#include "SDK/AssetTags_classes.hpp" +#include "SDK/AIReaction_AttackNearbyEnemy_classes.hpp" +#include "SDK/CustomMeshComponent_structs.hpp" +#include "SDK/CustomMeshComponent_classes.hpp" +#include "SDK/GooglePAD_structs.hpp" +#include "SDK/GooglePAD_classes.hpp" +#include "SDK/AIAction_DragObject_classes.hpp" +#include "SDK/LocationServicesBPLibrary_structs.hpp" +#include "SDK/LocationServicesBPLibrary_classes.hpp" +#include "SDK/MobilePatchingUtils_classes.hpp" +#include "SDK/ResonanceAudio_structs.hpp" +#include "SDK/ResonanceAudio_classes.hpp" +#include "SDK/SoundFields_classes.hpp" +#include "SDK/BP_IceCreamTruckNewMovementComponent_classes.hpp" +#include "SDK/Synthesis_structs.hpp" +#include "SDK/Synthesis_classes.hpp" +#include "SDK/AudioAnalyzer_classes.hpp" +#include "SDK/ENUM_DamageTypes_structs.hpp" +#include "SDK/BP_SimpleButtonBase_SIG_classes.hpp" +#include "SDK/AudioSynesthesia_structs.hpp" +#include "SDK/AudioSynesthesia_classes.hpp" +#include "SDK/OccluderSeeThrough_structs.hpp" +#include "SDK/OccluderSeeThrough_classes.hpp" +#include "SDK/StatsRuntime_classes.hpp" +#include "SDK/CharacterAudio_classes.hpp" +#include "SDK/WorldMetricsCore_classes.hpp" +#include "SDK/CsvMetrics_classes.hpp" +#include "SDK/WwiseNiagara_classes.hpp" +#include "SDK/AIReaction_TeleportToPlayer_classes.hpp" +#include "SDK/CoreOnline_structs.hpp" +#include "SDK/MediaUtils_structs.hpp" +#include "SDK/ENUM_SeagullTypes_structs.hpp" +#include "SDK/BlackoutBorderStyle_classes.hpp" +#include "SDK/LocalFileNetworkReplayStreaming_structs.hpp" +#include "SDK/AIReaction_PlayerDead_classes.hpp" +#include "SDK/HttpNetworkReplayStreaming_structs.hpp" +#include "SDK/VectorVM_structs.hpp" +#include "SDK/Landmass_structs.hpp" +#include "SDK/ControlRigSpline_structs.hpp" +#include "SDK/ENUM_LadderClimbTransitionLocation_structs.hpp" +#include "SDK/BP_ClimbAction_EnterLadderGround_classes.hpp" +#include "SDK/InterchangeCommonParser_structs.hpp" +#include "SDK/FractureEngine_structs.hpp" +#include "SDK/GeometryCollectionNodes_structs.hpp" +#include "SDK/CommonButtonBase_classes.hpp" +#include "SDK/EngineMessages_structs.hpp" +#include "SDK/Serialization_structs.hpp" +#include "SDK/BP_WaveSyncManager_C_classes.hpp" +#include "SDK/SessionMessages_structs.hpp" +#include "SDK/WidgetCarousel_structs.hpp" +#include "SDK/BP_CustomProgression_Overworld_Seagulls_classes.hpp" +#include "SDK/WwiseObjectUtils_structs.hpp" +#include "SDK/AnimNotify_Boat_IK_classes.hpp" +#include "SDK/BFGMath_structs.hpp" +#include "SDK/BP_CustomProgression_TriggerVolume_classes.hpp" +#include "SDK/LocalizableMessage_structs.hpp" +#include "SDK/UI_SettingsGame_classes.hpp" +#include "SDK/DmgTypeBP_Environmental_classes.hpp" +#include "SDK/SurfaceQueryType_structs.hpp" +#include "SDK/WDG_HighLightedButton_classes.hpp" +#include "SDK/WDG_DeveloperMenuEntry_classes.hpp" +#include "SDK/WDG_ConsumingBackground_classes.hpp" +#include "SDK/AnimOverridePriorities_structs.hpp" +#include "SDK/SLVL_GameStart_StartOcean_Blockout_classes.hpp" +#include "SDK/AnimOverrideSequenceSlots_structs.hpp" +#include "SDK/AnimOverrideBlendspaceSlots_structs.hpp" +#include "SDK/AnimNotify_SnifferBossAttackableReset_classes.hpp" +#include "SDK/AnimOverrideMontageSlots_structs.hpp" +#include "SDK/NavLinkTraversal_Jump_classes.hpp" +#include "SDK/ClimbDetectionSystemCustomActionEnum_structs.hpp" +#include "SDK/BP_CoopTriggerGate_classes.hpp" +#include "SDK/BP_ClimbAction_FalloffPreventionStop_classes.hpp" +#include "SDK/Everholm_AudioNotify_classes.hpp" +#include "SDK/BP_EnvQueryContext_GetPlayerCharacters_classes.hpp" +#include "SDK/DeveloperNotesWidget_classes.hpp" +#include "SDK/Transient_structs.hpp" +#include "SDK/WDG_TempLoadingScreen_classes.hpp" +#include "SDK/BP_TriggerVolume_Actor_SIG_classes.hpp" +#include "SDK/BP_EverholmGameInstance_classes.hpp" +#include "SDK/NavLinkTraversal_Interaction_classes.hpp" +#include "SDK/Notify_DoAttackDamage_classes.hpp" +#include "SDK/STR_ContextualLongIdle_structs.hpp" +#include "SDK/STR_CameraFadeData_structs.hpp" +#include "SDK/STR_ImpactEffectData_structs.hpp" +#include "SDK/ENUM_ButtonAndSwitchesTypes_structs.hpp" +#include "SDK/BP_BandageHead_classes.hpp" +#include "SDK/GameInputData_classes.hpp" +#include "SDK/ControllerData_GamePad_classes.hpp" +#include "SDK/BP_EverholmAIControllerBase_classes.hpp" +#include "SDK/ControllerData_Keyboard_classes.hpp" +#include "SDK/ControllerData_DualSense_classes.hpp" +#include "SDK/ControllerData_XSX_classes.hpp" +#include "SDK/AnimNotify_Camshake_classes.hpp" +#include "SDK/BPD_FalloffPrevention_Basic_classes.hpp" +#include "SDK/ENUM_GlobalCameraHintType_structs.hpp" +#include "SDK/AIReaction_PostInteraction_classes.hpp" +#include "SDK/ENUM_SeagullTakeDamageBehavior_structs.hpp" +#include "SDK/AIBehavior_PostInteraction_classes.hpp" +#include "SDK/WDG_MapBase_classes.hpp" +#include "SDK/SaveComponent_classes.hpp" +#include "SDK/STR_NetworkCameraData_structs.hpp" +#include "SDK/STR_CustomAttackMontageOverride_structs.hpp" +#include "SDK/RIG_Player_WorldIK_classes.hpp" +#include "SDK/BP_DamageType_Base_classes.hpp" +#include "SDK/BP_DeathHandler_BaseDeathEffects_classes.hpp" +#include "SDK/DmgTypeBP_Pickup_Throwable_classes.hpp" +#include "SDK/BP_DmgType_Bullet_classes.hpp" +#include "SDK/BP_SprintAbility_classes.hpp" +#include "SDK/AIReaction_HoldingHands_classes.hpp" +#include "SDK/UI_MenuPage_classes.hpp" +#include "SDK/ELanternSpawnBehavior_structs.hpp" +#include "SDK/STRUCT_LeverData_structs.hpp" +#include "SDK/DeathHandler_RestartFromCheckpoint_classes.hpp" +#include "SDK/NavLinkTraversal_WalkForward_classes.hpp" +#include "SDK/BP_DraisineMovementComponent_classes.hpp" +#include "SDK/ENUM_LadderClimbTransitionType_structs.hpp" +#include "SDK/BPI_AttackTargetInterface_classes.hpp" +#include "SDK/AIAction_ScriptedForcedInteraction_classes.hpp" +#include "SDK/STR_LedgeConditionalQuery_structs.hpp" +#include "SDK/AIReaction_FollowAlongNavmeshEdge_classes.hpp" +#include "SDK/Everholm_SequencerSounds_classes.hpp" +#include "SDK/BP_HasPickupInteractCondition_classes.hpp" +#include "SDK/AIBehavior_FollowAlongNavmeshEdge_classes.hpp" +#include "SDK/WorldMapFunctions_classes.hpp" +#include "SDK/STR_PryingAnimData_structs.hpp" +#include "SDK/BP_PlayerReactionAbility_classes.hpp" +#include "SDK/ThrowImpactFX_structs.hpp" +#include "SDK/AIBehavior_CarryPickupable_classes.hpp" +#include "SDK/AIAction_SwingWeapon_classes.hpp" +#include "SDK/Everholm_SoundActor_classes.hpp" +#include "SDK/AIReaction_SavePinnedDownActor_classes.hpp" +#include "SDK/STR_HopDownLedgePlayerContext_structs.hpp" +#include "SDK/AIAction_VehicleIdle_classes.hpp" +#include "SDK/UI_SettingsGameItems_classes.hpp" +#include "SDK/AIBehavior_ExecuteOrder_classes.hpp" +#include "SDK/AIReaction_UseVehicle_classes.hpp" +#include "SDK/CamShake_Weather_classes.hpp" +#include "SDK/EFieldForceVel_structs.hpp" +#include "SDK/BPI_DeathInstigatorInterface_classes.hpp" +#include "SDK/AIAction_ScriptedCrouch_classes.hpp" +#include "SDK/STR_MPCPlayerParameterNames_structs.hpp" +#include "SDK/AIReaction_MimicDuringFollow_classes.hpp" +#include "SDK/WDG_PipNotification_classes.hpp" +#include "SDK/AIReaction_Sprint_classes.hpp" +#include "SDK/AIReaction_RespondToPlayerCalls_classes.hpp" +#include "SDK/BP_Climbable_Base_classes.hpp" +#include "SDK/AIReaction_HandlePostCharacterSwitch_classes.hpp" +#include "SDK/DoorOcclusionData_structs.hpp" +#include "SDK/ShallowWaterSimComponent_classes.hpp" +#include "SDK/AIBehavior_HandlePostCharacterSwitch_classes.hpp" +#include "SDK/AIAnalyzer_PlayerAnalyzer_classes.hpp" +#include "SDK/AIBehavior_Climb_classes.hpp" +#include "SDK/BP_AutoJumpAbility_classes.hpp" +#include "SDK/AIReaction_SwingRandomlyAtEnemy_classes.hpp" +#include "SDK/BP_CharacterNotifyInterface_classes.hpp" +#include "SDK/BPI_GameProgress_classes.hpp" +#include "SDK/NotifyState_ExitToLoco_classes.hpp" +#include "SDK/BP_NPCKidsCoopInteractionExtension_classes.hpp" +#include "SDK/NavLinkTraversal_Teleport_classes.hpp" +#include "SDK/BP_EverholmPlayerState_classes.hpp" +#include "SDK/Everholm_AmbienceSound_classes.hpp" +#include "SDK/NotifyState_CharacterDisableInstructions_classes.hpp" +#include "SDK/AIReaction_SeagullCombat_classes.hpp" +#include "SDK/ENUM_DeathState_structs.hpp" +#include "SDK/STR_InteractionCylinder_structs.hpp" +#include "SDK/NavLinkProxy_ClimbableLedge_classes.hpp" +#include "SDK/STR_DirectedSpawnCamera_structs.hpp" +#include "SDK/STR_CameraArmOrientation_structs.hpp" +#include "SDK/InfoTextBigStyle_classes.hpp" +#include "SDK/NavLinkProxy_PlayMontage_classes.hpp" +#include "SDK/CamShake_CloseBulletImpact_classes.hpp" +#include "SDK/UI_LevelSelect_classes.hpp" +#include "SDK/BlackoutBorderStyleOpaque_classes.hpp" +#include "SDK/NavLinkTraversal_PlayMontage_classes.hpp" +#include "SDK/BPI_LightToolInterface_classes.hpp" +#include "SDK/AIBrain_CompanionBrain_classes.hpp" +#include "SDK/AIAction_WaitDelay_classes.hpp" +#include "SDK/AIBehavior_SavePinnedDownActor_classes.hpp" +#include "SDK/DeathHandler_Pitfall_classes.hpp" +#include "SDK/Landmass_FunctionLibrary_classes.hpp" +#include "SDK/AIBehavior_Sprint_classes.hpp" +#include "SDK/AIAnalyzer_PlayerCallAnalyzer_classes.hpp" +#include "SDK/AIReaction_ForceCrouch_classes.hpp" +#include "SDK/AIBehavior_ExecutePlayerOrder_classes.hpp" +#include "SDK/BP_LongIdles_PrimaryDataAsset_classes.hpp" +#include "SDK/NavLinkTraversal_Default_classes.hpp" +#include "SDK/EnemyAudioState_structs.hpp" +#include "SDK/ENUM_INTRoundingTypes_structs.hpp" +#include "SDK/BP_StandardFunctionLibrary_classes.hpp" +#include "SDK/BP_FunctionLibrary_classes.hpp" +#include "SDK/BP_LedgeClimbAbility_classes.hpp" +#include "SDK/BP_ClimbConditions_FunctionLibrary_classes.hpp" +#include "SDK/COND_FalloffPrevention_Basic_classes.hpp" +#include "SDK/COND_HoistFromTop_classes.hpp" +#include "SDK/DeathHandler_TetherFailure_Hanged_classes.hpp" +#include "SDK/COND_DropFromLadderAtGround_classes.hpp" +#include "SDK/COND_LedgeClimbUp_classes.hpp" +#include "SDK/ANIMBP_AICompanionPawn_Child_structs.hpp" +#include "SDK/ANIMBP_AICompanionPawn_Child_classes.hpp" +#include "SDK/COND_LedgeClimbFromSurface_classes.hpp" +#include "SDK/BPD_LedgeClimbUp_classes.hpp" +#include "SDK/COND_SurfaceClimbDefault_classes.hpp" +#include "SDK/COND_SurfaceClimbDismount_classes.hpp" +#include "SDK/BPD_SurfaceClimb_classes.hpp" +#include "SDK/CamShake_HarpoonThrow_classes.hpp" +#include "SDK/COND_SurfaceClimbAuto_classes.hpp" +#include "SDK/BPD_SurfaceClimbStart_classes.hpp" +#include "SDK/BPC_PhysicalAnimationController_classes.hpp" +#include "SDK/BP_ScriptedTetherRecoveryEvent_Base_classes.hpp" +#include "SDK/BP_PlayerFunnelingComponent_classes.hpp" +#include "SDK/AIBehavior_FightSpiderkids_classes.hpp" +#include "SDK/BP_Pickup_Mask_classes.hpp" +#include "SDK/AIReaction_UpdateLanternState_classes.hpp" +#include "SDK/ENUM_SeagullResetStates_structs.hpp" +#include "SDK/BP_TriggerVolume_SIG_BirdsManager_Swarming_classes.hpp" +#include "SDK/AIReaction_TurnTowardsEnemies_classes.hpp" +#include "SDK/ANIMBP_Boat_structs.hpp" +#include "SDK/ANIMBP_Boat_classes.hpp" +#include "SDK/AIAnalyzer_LanternTargetState_classes.hpp" +#include "SDK/AIBehavior_ToggleLantern_classes.hpp" +#include "SDK/AIReaction_PlayerTurnOnLightInDark_classes.hpp" +#include "SDK/CameraModifier_TankAimOffset_classes.hpp" +#include "SDK/TextStyleSelected_classes.hpp" +#include "SDK/BP_PlayerTwoDummy_CameraMode_classes.hpp" +#include "SDK/UI_PauseMenu_classes.hpp" +#include "SDK/STR_LadderClimbTransitionContext_structs.hpp" +#include "SDK/CamShake_WeaponImpact_classes.hpp" +#include "SDK/BP_TarsierLevelSequenceDirector_classes.hpp" +#include "SDK/NavLinkTraversal_LedgeClimb_classes.hpp" +#include "SDK/AIReaction_StandIdleWhenMoveIgnored_classes.hpp" +#include "SDK/AIReaction_StandOnMine_classes.hpp" +#include "SDK/AIBehavior_MoveIgnored_classes.hpp" +#include "SDK/STR_RotationHintParams_structs.hpp" +#include "SDK/SLVL_WorldLighting_classes.hpp" +#include "SDK/BP_DraggingFunctionLibrary_classes.hpp" +#include "SDK/BP_WaterMine_Exploding_Simple_classes.hpp" +#include "SDK/BP_DraggableRotationComponent_classes.hpp" +#include "SDK/AIReaction_ToggleWeapon_classes.hpp" +#include "SDK/AIBehavior_Combat_classes.hpp" +#include "SDK/UI_Blur_classes.hpp" +#include "SDK/NavLinkProxy_Ladder_classes.hpp" +#include "SDK/InfoTextStyle_classes.hpp" +#include "SDK/WDG_PlayerName_classes.hpp" +#include "SDK/COND_LadderClimbDownFromTop_classes.hpp" +#include "SDK/BPI_WeaponAttackMontageInterface_classes.hpp" +#include "SDK/BPD_LadderClimbDown_classes.hpp" +#include "SDK/PlayerHumbugInterface_classes.hpp" +#include "SDK/BPC_LightSwitchBuffer_classes.hpp" +#include "SDK/AIBehavior_PerformRequestedInteraction_classes.hpp" +#include "SDK/BP_LightSwitchManager_classes.hpp" +#include "SDK/MenuBackdropBorderStyle_classes.hpp" +#include "SDK/NavLinkTraversal_Fall_classes.hpp" +#include "SDK/UI_WaitScreen_classes.hpp" +#include "SDK/BP_CameraActionZoomComponent_classes.hpp" +#include "SDK/EIntTypes_structs.hpp" +#include "SDK/RenderToTextureFunctionLibrary_classes.hpp" +#include "SDK/TextStyle_CheckpointButton_classes.hpp" +#include "SDK/ButtonStyle_CheckpointButton_classes.hpp" +#include "SDK/BP_ANIMFunctionLibrary_classes.hpp" +#include "SDK/NotifyState_LFootPlant_classes.hpp" +#include "SDK/AIReaction_FollowWhileHoldingHands_classes.hpp" +#include "SDK/NotifyState_RFootPlant_classes.hpp" +#include "SDK/NavLinkTraversal_Climb_classes.hpp" +#include "SDK/AIReaction_CompanionFollowTarget_classes.hpp" +#include "SDK/BP_TetherRecoveryShadowEffect_classes.hpp" +#include "SDK/AIBehavior_FollowTarget_classes.hpp" +#include "SDK/AIBehavior_FollowWhileHoldingHands_classes.hpp" +#include "SDK/BP_TrailerCameraMode_classes.hpp" +#include "SDK/BP_SurfaceClimbComponent_classes.hpp" +#include "SDK/ENUM_DebugTetheringMode_structs.hpp" +#include "SDK/BP_WaterMasking_SnapShot_classes.hpp" +#include "SDK/STR_GalleryIcons_structs.hpp" +#include "SDK/OnlineCoopHostOrJoin_structs.hpp" +#include "SDK/MenuItemsNormalTextStyle_classes.hpp" +#include "SDK/BP_InMontageSection_InteractCondition_classes.hpp" +#include "SDK/TextStyleHovered_classes.hpp" +#include "SDK/TextStyleDisabled_classes.hpp" +#include "SDK/MenuItemsSmallTextStyle_classes.hpp" +#include "SDK/TextStyleNormal_classes.hpp" +#include "SDK/UI_InputIcon_classes.hpp" +#include "SDK/TextStyleNotification_classes.hpp" +#include "SDK/UI_OnScreenButtonHelp_classes.hpp" +#include "SDK/UI_NotificationWidget_classes.hpp" +#include "SDK/FS_Destruction_Base_classes.hpp" +#include "SDK/TextStyleMessages_classes.hpp" +#include "SDK/ButtonStyle_classes.hpp" +#include "SDK/SLVL_DeadLamb_Vinjette_01_classes.hpp" +#include "SDK/Everholm_PhysicsAudio_classes.hpp" +#include "SDK/BP_IsAIControlled_InteractCondition_classes.hpp" +#include "SDK/BP_IsPawnTypeInteractCondition_classes.hpp" +#include "SDK/BPI_SwitchAnimationEvents_classes.hpp" +#include "SDK/AIBrain_BasicAIBrain_classes.hpp" +#include "SDK/RIG_CarryItemIK_classes.hpp" +#include "SDK/ENUM_InterpMoveType_structs.hpp" +#include "SDK/Task_InterpActorToLocation_classes.hpp" +#include "SDK/AIAction_DragObjectAlone_classes.hpp" +#include "SDK/BP_SaveActorVisibilityComponent_classes.hpp" +#include "SDK/BP_ActorCheckpoint_classes.hpp" +#include "SDK/AIReaction_DragObject_classes.hpp" +#include "SDK/AIBehavior_DragObject_classes.hpp" +#include "SDK/BPC_BoatAudio_classes.hpp" +#include "SDK/BP_WeaponAttackMetadata_classes.hpp" +#include "SDK/BP_NetFunctionLibrary_classes.hpp" +#include "SDK/AIAction_BoatIdle_classes.hpp" +#include "SDK/AIReaction_UseBoat_classes.hpp" +#include "SDK/AIBehavior_UseVehicle_classes.hpp" +#include "SDK/CamShake_Co_opFadeAway_classes.hpp" +#include "SDK/BP_PickupAbilityComponent_classes.hpp" +#include "SDK/BP_Co_opSpawn_DataAsset_classes.hpp" +#include "SDK/BP_TriggerRegion_SIG_classes.hpp" +#include "SDK/WDG_PickupNotification_classes.hpp" +#include "SDK/GameplayTagCondition_structs.hpp" +#include "SDK/AIAction_GoUseActionPointWithAlignment_classes.hpp" +#include "SDK/AIBehavior_GoUseBestActionPointWithAlignment_classes.hpp" +#include "SDK/JumpFlood_Component2D_classes.hpp" +#include "SDK/EnemyAudio_classes.hpp" +#include "SDK/BP_SIG_AISpawnerBase_classes.hpp" +#include "SDK/BP_CannonIsland_BaseActor_classes.hpp" +#include "SDK/UI_CreditsScroller_classes.hpp" +#include "SDK/BP_TriggerVolume_SIG_classes.hpp" +#include "SDK/BP_ClimbAction_HopDownLedge_classes.hpp" +#include "SDK/BP_HopDownLedgeAbility_classes.hpp" +#include "SDK/NavLinkTraversal_AutoJump_classes.hpp" +#include "SDK/AIReaction_CarryPickupable_classes.hpp" +#include "SDK/BP_Pickup_SkeletalMeshBase_classes.hpp" +#include "SDK/UI_AcceptOrRevertPrompt_classes.hpp" +#include "SDK/AIAnalyzer_SelfAnalyzer_classes.hpp" +#include "SDK/WDG_SavingIcon_classes.hpp" +#include "SDK/UI_PlayerInfoEx_classes.hpp" +#include "SDK/EnemyCooldownStates_structs.hpp" +#include "SDK/AIReaction_OutOfNavmesh_classes.hpp" +#include "SDK/BP_ClimbAction_HoistFromTop_classes.hpp" +#include "SDK/BP_EmoteAbilityComponent_classes.hpp" +#include "SDK/BP_Pickup_Mask_BirdHead_classes.hpp" +#include "SDK/AIBrain_PlayerBrain_classes.hpp" +#include "SDK/BP_GameplayContextLocoProfiles_Primary_classes.hpp" +#include "SDK/BPI_TownSniper_classes.hpp" +#include "SDK/BP_BirdTargetLocationHelper_classes.hpp" +#include "SDK/STR_GameplayContextData_structs.hpp" +#include "SDK/BPI_PlayerSpawn_classes.hpp" +#include "SDK/AnimBP_PlayerIceCreamTruck_HoodHead_structs.hpp" +#include "SDK/AnimBP_PlayerIceCreamTruck_HoodHead_classes.hpp" +#include "SDK/BP_PerPlayerGameplayContextManager_classes.hpp" +#include "SDK/BP_TrailerCameraPawn_classes.hpp" +#include "SDK/BP_TrailerCameraController_classes.hpp" +#include "SDK/AIBehavior_NavigateOutOfNavmesh_classes.hpp" +#include "SDK/WDG_PlayerIDPopup_classes.hpp" +#include "SDK/BP_Static_Harpoon_classes.hpp" +#include "SDK/BPC_SM_InteractionHighlight_classes.hpp" +#include "SDK/BP_ClimbAction_LadderDismount_classes.hpp" +#include "SDK/BP_Pickup_StaticMeshBase_classes.hpp" +#include "SDK/BP_Pickup_HarpoonBundle_classes.hpp" +#include "SDK/FS_BulletField_classes.hpp" +#include "SDK/BP_PlayersMontageOverride_classes.hpp" +#include "SDK/UI_Controller_Settings_Switch2_classes.hpp" +#include "SDK/UI_Slider_classes.hpp" +#include "SDK/SettingsBlueprintFunctionLibrary_classes.hpp" +#include "SDK/UI_ListButton_classes.hpp" +#include "SDK/BP_BalancingAbility_classes.hpp" +#include "SDK/UI_SliderButton_classes.hpp" +#include "SDK/WDG_MappingKey_classes.hpp" +#include "SDK/BP_CustomProgression_UnlocksDoors_classes.hpp" +#include "SDK/UI_DEMO_Endscreen_classes.hpp" +#include "SDK/BP_Pickup_Mask_WormHead_classes.hpp" +#include "SDK/ENUM_DoorLockingBehavior_structs.hpp" +#include "SDK/ENUM_Co_opDoorState_structs.hpp" +#include "SDK/BP_Co_opDoor_Base_classes.hpp" +#include "SDK/STR_KeyBindingMasterSlave_structs.hpp" +#include "SDK/UI_SettingsKeyBindings_Items_classes.hpp" +#include "SDK/BP_CustomProgression_Forest_SinkHoles_classes.hpp" +#include "SDK/IsNotDemo_ActorFilter_classes.hpp" +#include "SDK/UI_CheckpointButton_classes.hpp" +#include "SDK/UI_TeleportToCheckpoint_classes.hpp" +#include "SDK/DeathHandler_Vehicle_classes.hpp" +#include "SDK/UI_ChangeLevelMenu_classes.hpp" +#include "SDK/UI_GameShare_classes.hpp" +#include "SDK/BP_PlayerTargetingComponent_classes.hpp" +#include "SDK/BP_BoatOnSandDecalActor_classes.hpp" +#include "SDK/WaveFoamSimComponent_classes.hpp" +#include "SDK/AIReaction_UseHidingSpot_classes.hpp" +#include "SDK/BP_BeachBoatTrigger_classes.hpp" +#include "SDK/AnimNotify_GameEvent_classes.hpp" +#include "SDK/BP_CustomProgression_BrookHorseGateKeeper_classes.hpp" +#include "SDK/Pickup_HitMaterials_structs.hpp" +#include "SDK/BP_ToolSwingComponent_classes.hpp" +#include "SDK/BP_CameraWeather_classes.hpp" +#include "SDK/BP_SoloSpawn_DataAsset_classes.hpp" +#include "SDK/UI_GameVersionDistribution_classes.hpp" +#include "SDK/BP_Sinkhole_classes.hpp" +#include "SDK/BP_CustomProgression_Pry_classes.hpp" +#include "SDK/UI_ShaderPrecompilation_classes.hpp" +#include "SDK/UI_LobbyMenuWidget_classes.hpp" +#include "SDK/BP_CoopInteraction_Pry_Base_classes.hpp" +#include "SDK/BP_CustomProgression_ForestTruckFinale_classes.hpp" +#include "SDK/BP_PinnedDownAbility_classes.hpp" +#include "SDK/UI_GamepadControls_classes.hpp" +#include "SDK/ANIMBP_ChaosFoodTruck_structs.hpp" +#include "SDK/ANIMBP_ChaosFoodTruck_classes.hpp" +#include "SDK/UI_SettingsAudioItems_classes.hpp" +#include "SDK/UI_SettingsAudio_classes.hpp" +#include "SDK/UI_SettingsGamma_classes.hpp" +#include "SDK/BP_EnvQueryContext_SceneComponent_classes.hpp" +#include "SDK/UI_SettingsAdvancedItems_classes.hpp" +#include "SDK/UI_SettingsAdvanced_classes.hpp" +#include "SDK/UI_GenericMessage_classes.hpp" +#include "SDK/UI_SettingsGraphicsItems_classes.hpp" +#include "SDK/BP_ClimbableLedgeActor_classes.hpp" +#include "SDK/BP_ClimbableLedgeActor_Hotwire_classes.hpp" +#include "SDK/BP_CameraFocalPointComponent_classes.hpp" +#include "SDK/BP_BoatLedgeActorGenerator_classes.hpp" +#include "SDK/BP_Pickup_BoltCutters_classes.hpp" +#include "SDK/STR_WorldReactionDataContext_structs.hpp" +#include "SDK/UI_Credits_classes.hpp" +#include "SDK/UI_SettingsKeyBindings_classes.hpp" +#include "SDK/UI_Settings_classes.hpp" +#include "SDK/AIReaction_ThrowItemAtTarget_classes.hpp" +#include "SDK/EFieldActivationType_structs.hpp" +#include "SDK/FS_MasterField_classes.hpp" +#include "SDK/ENUM_BuoyMesh_structs.hpp" +#include "SDK/BP_Buoy_classes.hpp" +#include "SDK/ALI_Player_classes.hpp" +#include "SDK/STR_RecoveryEventData_structs.hpp" +#include "SDK/BP_PlayerTetherRecoveryComponent_classes.hpp" +#include "SDK/ENUM_DirtStates_structs.hpp" +#include "SDK/BP_DCHint_FixedAngle_Sphere_classes.hpp" +#include "SDK/BP_NPCTargetingComponent_classes.hpp" +#include "SDK/BP_PlayerCharacterMeshOverride_DataAsset_classes.hpp" +#include "SDK/STRUCT_CompanionFollowPoints_structs.hpp" +#include "SDK/AIBrain_BucketHead_classes.hpp" +#include "SDK/BPI_OverridePlayerCharacterMesh_classes.hpp" +#include "SDK/BP_AbilityActivationComponent_classes.hpp" +#include "SDK/UI_DEMO_Public_PreEndscreen_classes.hpp" +#include "SDK/CamShake_SwapPlayers_classes.hpp" +#include "SDK/UI_TutorialPrompt_classes.hpp" +#include "SDK/BP_IceCreamTruck_SnifferChaseBoss_classes.hpp" +#include "SDK/BP_GlobalCameraHintTrigger_classes.hpp" +#include "SDK/UI_LobbyOverlay_classes.hpp" +#include "SDK/BP_SetHidden_Base_classes.hpp" +#include "SDK/BP_EverholmGameState_classes.hpp" +#include "SDK/ANIMBP_IceCreamTruck_SnifferInsideFinale_structs.hpp" +#include "SDK/ENUM_IceCreamTruckSnifferBossPhase_structs.hpp" +#include "SDK/ANIMBP_IceCreamTruck_SnifferInsideFinale_classes.hpp" +#include "SDK/ENUM_IceCreamTruckSnifferBodyParts_structs.hpp" +#include "SDK/BP_IceCreamTruckFinale_FakeMovement_classes.hpp" +#include "SDK/AnimNotify_SnifferBossLethality_classes.hpp" +#include "SDK/AnimNotify_SnifferBossAttackable_classes.hpp" +#include "SDK/AnimNotify_SnifferBossCheckpoint_classes.hpp" +#include "SDK/BP_PlayerWeapon_PhysicalKnife_classes.hpp" +#include "SDK/BP_SlotInteraction_Base_classes.hpp" +#include "SDK/BP_PlayerWeapon_BaseSkeletal_classes.hpp" +#include "SDK/BP_Fluid_Impulse_Repeating_classes.hpp" +#include "SDK/BP_Checkpoint_SIG_classes.hpp" +#include "SDK/BP_DirtComponent_classes.hpp" +#include "SDK/BP_ClimbAction_LadderClimbUp_classes.hpp" +#include "SDK/NavLinkTraversal_Ladder_classes.hpp" +#include "SDK/BP_Pickup_Harpoon_classes.hpp" +#include "SDK/BP_UseThrowItemAbilityComponent_classes.hpp" +#include "SDK/BP_GameStateFunctionLibrary_classes.hpp" +#include "SDK/BP_PlayerSeparationRecoveryPoint_Base_classes.hpp" +#include "SDK/BP_CreditsTrigger_classes.hpp" +#include "SDK/BP_PlayerSeparationPostProcess_classes.hpp" +#include "SDK/PlayerDeathHandler_Base_classes.hpp" +#include "SDK/BP_PlayerFocalPointComponent_classes.hpp" +#include "SDK/DeathHandler_TetherFailure_Puke_classes.hpp" +#include "SDK/BP_CheckpointVolume_classes.hpp" +#include "SDK/CameraModifier_SharedLookAround_classes.hpp" +#include "SDK/ENUM_CameraAxisInvertBehaviour_structs.hpp" +#include "SDK/BP_EverholmCameraManager_classes.hpp" +#include "SDK/BP_EverholmCameraFunctionLibrary_classes.hpp" +#include "SDK/BP_BoatBlockingSpline_classes.hpp" +#include "SDK/Notify_AttackComboWindow_classes.hpp" +#include "SDK/ANIMBP_PlayerPawn_structs.hpp" +#include "SDK/ANIMBP_PlayerPawn_classes.hpp" +#include "SDK/WDG_ThrowTargetPip_classes.hpp" +#include "SDK/BP_EverholmHUD_classes.hpp" +#include "SDK/BP_PlayerFlavorReactionComponent_classes.hpp" +#include "SDK/AIBehavior_PlayerDead_classes.hpp" +#include "SDK/BP_SwingItemAbilityComponent_classes.hpp" +#include "SDK/AIBehavior_UseHidingSpot_classes.hpp" +#include "SDK/BP_PlayerInteractorComponent_classes.hpp" +#include "SDK/ENUM_OverlapEventType_structs.hpp" +#include "SDK/AIReaction_LightPath_classes.hpp" +#include "SDK/AIBehavior_LightPath_classes.hpp" +#include "SDK/AIReaction_LongIdle_classes.hpp" +#include "SDK/AIAnalyzer_LongIdle_classes.hpp" +#include "SDK/AIBehavior_LongIdle_classes.hpp" +#include "SDK/AIController_CompanionController_classes.hpp" +#include "SDK/BP_PlayerPawn_classes.hpp" +#include "SDK/BP_PrimaryPlayerCharacter_classes.hpp" +#include "SDK/BP_PickupComponent_classes.hpp" +#include "SDK/BP_TiedTogetherComponent_classes.hpp" +#include "SDK/BP_SlotInsertedPickupValidCondition_classes.hpp" +#include "SDK/BP_VisualHandholdingComponent_classes.hpp" +#include "SDK/BP_CannonShellDispenser_classes.hpp" +#include "SDK/BP_FootprintComponent_classes.hpp" +#include "SDK/BP_PlayerAttackComponent_classes.hpp" +#include "SDK/PlayerAudio_classes.hpp" +#include "SDK/DeathHandler_DrownInWater_classes.hpp" +#include "SDK/DeathHandler_HardLanding_classes.hpp" +#include "SDK/CR_Draisine_02_classes.hpp" +#include "SDK/BPI_FocalPointOverride_classes.hpp" +#include "SDK/DeathHandler_PlayerFailedReaction_classes.hpp" +#include "SDK/ENUM_SeagullReachFlyToTargetBehavior_structs.hpp" +#include "SDK/DeathHandler_Bullet_classes.hpp" +#include "SDK/SLVL_WorldBoat_classes.hpp" +#include "SDK/DeathHandler_HumbugsKill_classes.hpp" +#include "SDK/BP_RopeTiedTogether_classes.hpp" +#include "SDK/AnimBP_CannonHatch_structs.hpp" +#include "SDK/AnimBP_CannonHatch_classes.hpp" +#include "SDK/BP_ShootWeaponAbilityComponent_classes.hpp" +#include "SDK/BP_BalancingMovementMode_classes.hpp" +#include "SDK/ANIMBP_CoPlayerPawn_structs.hpp" +#include "SDK/ANIMBP_CoPlayerPawn_classes.hpp" +#include "SDK/BP_CoPlayerCharacter_classes.hpp" +#include "SDK/BP_EverholmSpawn_classes.hpp" +#include "SDK/BP_KidNPC_classes.hpp" +#include "SDK/BP_NPCKids_AISpawner_Base_classes.hpp" +#include "SDK/BP_EverholmCo_opPlayerStart_classes.hpp" +#include "SDK/BP_IngameGameMode_classes.hpp" +#include "SDK/BP_EverholmPlayerController_classes.hpp" +#include "SDK/UI_PlayerOffScreenIndicator_classes.hpp" +#include "SDK/UI_ControllerDisconnectedMessage_classes.hpp" +#include "SDK/BP_BulletVFX_Component_classes.hpp" +#include "SDK/BP_InWaterMovementMode_classes.hpp" +#include "SDK/BP_Pickup_PlayerLight_classes.hpp" +#include "SDK/BP_Pickup_Lighter_classes.hpp" +#include "SDK/BP_LanternSequencerProxy_classes.hpp" +#include "SDK/BP_SwitchBase_classes.hpp" +#include "SDK/BP_BlockingPlane_classes.hpp" +#include "SDK/BP_CrankBase_classes.hpp" +#include "SDK/BP_FoodTruck_ChaosWheel_Front_classes.hpp" +#include "SDK/BP_Pickup_Lantern_classes.hpp" +#include "SDK/WDG_WorldMapTest01_Image_classes.hpp" +#include "SDK/WDG_Map_WorldMapTest01_classes.hpp" +#include "SDK/CamShake_mediumImpact_classes.hpp" +#include "SDK/UI_Masks_classes.hpp" +#include "SDK/BP_Pickup_Lantern_BoyBoat_classes.hpp" +#include "SDK/ENUM_MoveAlongSpline_structs.hpp" +#include "SDK/BP_SplineMover_SIG_classes.hpp" +#include "SDK/BP_BoatTrailComponent_classes.hpp" +#include "SDK/BP_BoatVehicleBoard_classes.hpp" +#include "SDK/ENUM_CheckpointBehaviour_structs.hpp" +#include "SDK/BP_CheckpointComponent_classes.hpp" +#include "SDK/ANIM_BP_PlayerWeapon_structs.hpp" +#include "SDK/ANIM_BP_PlayerWeapon_classes.hpp" +#include "SDK/BP_BoatInteractCondition_classes.hpp" +#include "SDK/BP_WorldBoundsWall_classes.hpp" +#include "SDK/BP_MapViewCameraMode_classes.hpp" +#include "SDK/BP_DirectedCo_opCameraMode_classes.hpp" +#include "SDK/BP_CameraHintComponent_classes.hpp" +#include "SDK/Everholm_AudioSystem_classes.hpp" +#include "SDK/ANIM_BP_Sniffer_IceCreamTruckEncounter_structs.hpp" +#include "SDK/ANIM_BP_Sniffer_IceCreamTruckEncounter_classes.hpp" +#include "SDK/GlobalAmbienceOverride_classes.hpp" +#include "SDK/BP_PlayerFocalPointOverrideVolume_Boundary_classes.hpp" +#include "SDK/ANIM_BP_Door_structs.hpp" +#include "SDK/ANIM_BP_Door_classes.hpp" +#include "SDK/BP_BlockingPlane_Spline_Camera_classes.hpp" +#include "SDK/BP_CustomProgression_FallLadder_classes.hpp" +#include "SDK/BP_FallDownLadderGate_Base_classes.hpp" +#include "SDK/AISpawner_HoodHead_classes.hpp" +#include "SDK/AnimNotify_ForceFeedback_classes.hpp" +#include "SDK/BP_CustomProgression_Forest_Draisine_classes.hpp" +#include "SDK/BP_DraisineVehicle_classes.hpp" +#include "SDK/BP_OneWayLatchedDoor_classes.hpp" +#include "SDK/HNC_ToggleCompanionFollowState_classes.hpp" +#include "SDK/BP_CustomProgression_Suitcase_classes.hpp" +#include "SDK/BP_Suitcase_Dummy_SlotInteraction_classes.hpp" +#include "SDK/BP_DCHint_RadialInwardSphere_classes.hpp" +#include "SDK/BP_CustomProgression_BlockingSplineHotwire_classes.hpp" +#include "SDK/BP_BlockingPlane_Spline_Hotwire_classes.hpp" +#include "SDK/BP_BlockingPlane_Spline_classes.hpp" +#include "SDK/BP_EverholmPlayerStartInBoat_classes.hpp" +#include "SDK/BP_EverholmPlayerStartInVehicle_classes.hpp" +#include "SDK/AIController_BucketHead_classes.hpp" +#include "SDK/BP_SteerPlayerToActor_classes.hpp" +#include "SDK/AIBehavior_ExecuteStartingAction_classes.hpp" +#include "SDK/GameGlobalBool_ActorFilter_classes.hpp" +#include "SDK/BP_CustomProgression_LevelSequencePlayback_classes.hpp" +#include "SDK/ENUM_SequencerLoadMethod_structs.hpp" +#include "SDK/BP_EverholmLevelSequence_SIG_classes.hpp" +#include "SDK/BP_EditableTriggerVolume_SIG_classes.hpp" +#include "SDK/BP_TriggerVolume_Base_classes.hpp" +#include "SDK/BP_DmgType_ToolSwing_classes.hpp" +#include "SDK/AIBehavior_UseBoat_classes.hpp" +#include "SDK/BP_FluidSim_01_Sea_classes.hpp" +#include "SDK/PlayerControlled_ActorFilter_classes.hpp" +#include "SDK/BP_HoodHead_Audio_classes.hpp" +#include "SDK/BP_ActionPoint_SIG_classes.hpp" +#include "SDK/HNC_SetGameGlobal_Bool_classes.hpp" +#include "SDK/HNC_GetGameGlobal_Bool_classes.hpp" +#include "SDK/HNC_Branch_classes.hpp" +#include "SDK/HNC_BlueprintBase_classes.hpp" +#include "SDK/BP_CustomProgression_SwitchesAndButtons_classes.hpp" +#include "SDK/BP_SimpleFlipSwitchBase_SIG_classes.hpp" +#include "SDK/NotifyState_PushButtonIn_classes.hpp" +#include "SDK/NotifyState_PushButtonOut_classes.hpp" +#include "SDK/BP_GrassSolver_classes.hpp" +#include "SDK/BP_CinematicCameraMode_classes.hpp" +#include "SDK/DeathHandler_PlayerScriptedInstantKill_classes.hpp" +#include "SDK/DeathHandler_IceCreamtruckSKinKill_classes.hpp" +#include "SDK/BP_Pickup_Canister_classes.hpp" +#include "SDK/BPC_CustomMeshHighlight_classes.hpp" +#include "SDK/AnimBP_PlayerIceCreamTruck_Passenger_structs.hpp" +#include "SDK/AnimBP_PlayerIceCreamTruck_Passenger_classes.hpp" +#include "SDK/AnimBP_IceCreamTruckChase_Sniffer_structs.hpp" +#include "SDK/AnimBP_IceCreamTruckChase_Sniffer_classes.hpp" +#include "SDK/AnimBP_IceCreamTruckFinaleScene_structs.hpp" +#include "SDK/AnimBP_IceCreamTruckFinaleScene_classes.hpp" +#include "SDK/AnimBP_FoodTruck_Chase_structs.hpp" +#include "SDK/AnimBP_FoodTruck_Chase_classes.hpp" +#include "SDK/ANIMBP_Draisine_Repairable_structs.hpp" +#include "SDK/ANIMBP_Draisine_Repairable_classes.hpp" +#include "SDK/BPC_ChaosVehicleMovement_Base_classes.hpp" +#include "SDK/BP_ChaosVehicleNetProxy_classes.hpp" +#include "SDK/BP_ChaosVehiclePawn_Basic_classes.hpp" +#include "SDK/AnimBP_PlayerDraisine_Layered_structs.hpp" +#include "SDK/AnimBP_PlayerDraisine_Layered_classes.hpp" +#include "SDK/ANIM_BP_FoodTruckNewTires_structs.hpp" +#include "SDK/ANIM_BP_FoodTruckNewTires_classes.hpp" +#include "SDK/CoopDoorAnimationInterface_classes.hpp" +#include "SDK/BP_CustomProgression_Ledges_classes.hpp" +#include "SDK/BP_GivePickup_SIG_classes.hpp" +#include "SDK/CamShake_HeavyImpact_classes.hpp" +#include "SDK/BPI_IceCreamTruckAnimInterface_classes.hpp" +#include "SDK/AIAction_DespawnSelf_classes.hpp" +#include "SDK/BP_FoodTruck_ChaosWheel_classes.hpp" +#include "SDK/BP_TeleportPlayers_SIG_classes.hpp" +#include "SDK/BP_Subtitles_classes.hpp" +#include "SDK/SubtitleText_classes.hpp" +#include "SDK/MLVL_EverholmWorld_classes.hpp" +#include "SDK/HNC_WaitForPlayersReady_classes.hpp" +#include "SDK/BP_ToolPryComponent_classes.hpp" +#include "SDK/BP_PlayerWeapon_Base_classes.hpp" +#include "SDK/BP_PlayerWeapon_Axe_classes.hpp" +#include "SDK/BP_ActorDestroy_SIG_classes.hpp" +#include "SDK/BP_Teleport_Base_SIG_classes.hpp" +#include "SDK/BP_Teleport_Actor_SIG_classes.hpp" +#include "SDK/Bandagehead_Audio_classes.hpp" +#include "SDK/AISpawner_BandageHead_classes.hpp" +#include "SDK/SLVL_AlwaysLoaded_classes.hpp" +#include "SDK/BP_CannonTarget_classes.hpp" +#include "SDK/SaveComponentWithTransform_classes.hpp" +#include "SDK/DeathHandler_BoatBlast_classes.hpp" +#include "SDK/BP_PlayerDeathVolume_classes.hpp" +#include "SDK/BP_CustomProgression_DeathVolume_classes.hpp" +#include "SDK/CamShake_WaterMine_classes.hpp" +#include "SDK/ClassList_ActorFilter_classes.hpp" +#include "SDK/CamShake_ShootCannon_classes.hpp" +#include "SDK/ENUM_BalanceBeamEndpointBehaviour_structs.hpp" +#include "SDK/BP_BalanceBeam_classes.hpp" +#include "SDK/BP_CustomProgression_BalanceBeam_classes.hpp" +#include "SDK/BP_MovementAccumulator_classes.hpp" +#include "SDK/BP_Mover_Base_classes.hpp" +#include "SDK/BP_CustomProgression_Overworld_RegularPig_classes.hpp" +#include "SDK/CamShake_LargeCannon_Movement_classes.hpp" +#include "SDK/BP_VehicleSpeedModifierVolume_classes.hpp" +#include "SDK/CamShake_MeleeHit_classes.hpp" +#include "SDK/CamShake_VibrateWell_classes.hpp" +#include "SDK/STR_CodeMachineCode_structs.hpp" +#include "SDK/BP_ChapterProgression_Orphanage_classes.hpp" +#include "SDK/CamShake_SeagullWounding_classes.hpp" +#include "SDK/BP_CustomProgression_CoopTriggerGate_classes.hpp" +#include "SDK/BP_CodeDecalManager_classes.hpp" +#include "SDK/BP_CodeMachine_4x3_classes.hpp" +#include "SDK/BP_DmgType_Grenade_classes.hpp" +#include "SDK/Buckethead_Audio_classes.hpp" +#include "SDK/BP_FakeAttackedAbility_classes.hpp" +#include "SDK/BP_Pickup_GenericKey_PigStyBarn_classes.hpp" +#include "SDK/BP_Pickup_CannonShell_classes.hpp" +#include "SDK/BP_CustomProgression_Overworld_CannonShellDispenser_classes.hpp" +#include "SDK/BP_SlotInteraction_CannonHatch_classes.hpp" +#include "SDK/BP_CustomProgression_Overworld_Cannon_classes.hpp" +#include "SDK/BP_SetPiece_UnderwaterAscentCage_classes.hpp" +#include "SDK/BP_CustomProgression_Overworld_DivingCage_classes.hpp" +#include "SDK/BP_BucketHead_classes.hpp" +#include "SDK/BP_WaterMine_Exploding_New_classes.hpp" +#include "SDK/BP_Seagull_classes.hpp" +#include "SDK/BP_Seagull_Puzzle_classes.hpp" +#include "SDK/BP_CustomProgression_Overworld_BirdsManager_classes.hpp" +#include "SDK/SLVL_Overworld_AlwaysLoaded_classes.hpp" +#include "SDK/BP_WeatherControl_classes.hpp" +#include "SDK/BP_PlayMontage_PlayerCharacter_classes.hpp" +#include "SDK/BP_BoatAligner_Base_classes.hpp" +#include "SDK/ENUM_FlockType_structs.hpp" +#include "SDK/BP_FloatingGirlCinematic_classes.hpp" +#include "SDK/BPC_SetWaterBodyCollisionPhysMat_classes.hpp" +#include "SDK/BP_NSY_BirdsAggressiveFlock_classes.hpp" +#include "SDK/BP_PlayerFocalPointOverrideVolume_Base_classes.hpp" +#include "SDK/BP_PlayerFocalPointOverrideVolume_Remap_classes.hpp" +#include "SDK/BP_PlayerFocalPointOverrideVolume_ContainFocalPoint_classes.hpp" +#include "SDK/BP_BoatAligner_classes.hpp" +#include "SDK/BP_Pickup_WhaleEye_classes.hpp" +#include "SDK/BP_TriggerVolume_TutorialPrompt_classes.hpp" +#include "SDK/BP_TriggerVolume_Camera_SIG_classes.hpp" +#include "SDK/BP_DCHint_Spline_classes.hpp" +#include "SDK/STR_ChapterAchievementBounds_structs.hpp" +#include "SDK/BP_IsGirl_InteractCondition_classes.hpp" +#include "SDK/ANIMBP_BrookeEye_Pickup_structs.hpp" +#include "SDK/ANIMBP_BrookeEye_Pickup_classes.hpp" +#include "SDK/BP_SetHidden_Actor_classes.hpp" +#include "SDK/AnimBP_BoltcutterPickup_structs.hpp" +#include "SDK/AnimBP_BoltcutterPickup_classes.hpp" +#include "SDK/BP_CallAbility_classes.hpp" +#include "SDK/ENUM_VolumeBlendType_structs.hpp" +#include "SDK/BP_DCHint_Dollhouse_classes.hpp" +#include "SDK/BP_Pickup_CollectibleMask_classes.hpp" +#include "SDK/BP_PlayerWeapon_PhysicalCrowbar_classes.hpp" +#include "SDK/BP_Pickup_DraisineWheel_classes.hpp" +#include "SDK/BP_Pickup_GenericKey_FiringRange_classes.hpp" +#include "SDK/AnimBP_T_Masks_structs.hpp" +#include "SDK/AnimBP_T_Masks_classes.hpp" +#include "SDK/BP_Pickup_Plunger_classes.hpp" +#include "SDK/BP_Pickup_GenericKey_Courtyard_classes.hpp" +#include "SDK/HNC_BlueprintBase_WildInput_classes.hpp" +#include "SDK/HNC_DebugPrintLog_classes.hpp" +#include "SDK/BP_DCHint_FixedAngle_Box_classes.hpp" +#include "SDK/BP_PlayerSequencerProxy_CoPlayer_classes.hpp" +#include "SDK/BP_BoatBlockingSpline_HotWire_classes.hpp" +#include "SDK/SEQ_DeadLambAndGirl_Vinjette_01_classes.hpp" +#include "SDK/BP_ShoreWaves_Spline_02_classes.hpp" +#include "SDK/BP_EditableTriggerVolume_Camera_SIG_classes.hpp" +#include "SDK/SLVL_Seascape_classes.hpp" +#include "SDK/BP_NSYVariableBoundery_classes.hpp" +#include "SDK/BP_NSY_Fog_classes.hpp" +#include "SDK/Everholm_MusicPlayer_classes.hpp" +#include "SDK/Everholm_AudioRegion_classes.hpp" +#include "SDK/OverlappingMaterialRegion_classes.hpp" +#include "SDK/SEQ_BoyWakeUpInBoatAlone_classes.hpp" +#include "SDK/SLVL_BoyAloneInBoat_GameStart_classes.hpp" +#include "SDK/SLVL_GameStart_EpicCliffTunnel_classes.hpp" +#include "SDK/SEQ_FindDeadGirlInWater_classes.hpp" +#include "SDK/SLVL_FindDeadGirlInWater_classes.hpp" +#include "SDK/BP_TeleportAbility_classes.hpp" +#include "SDK/BP_SwapPlayerEffect_classes.hpp" +#include "SDK/BP_JumpAbility_classes.hpp" +#include "SDK/BP_SlideAbilityActivation_classes.hpp" +#include "SDK/BP_FalloffPreventionAbility_classes.hpp" +#include "SDK/BP_SwimAbility_classes.hpp" +#include "SDK/BP_DragAbility_classes.hpp" +#include "SDK/AISwingWeaponCooldown_classes.hpp" +#include "SDK/BP_Pickup_Mask_Rabbit_classes.hpp" diff --git a/Reanimal/SDK/SDK.7z b/Reanimal/SDK/SDK.7z new file mode 100644 index 0000000..6a2eb94 Binary files /dev/null and b/Reanimal/SDK/SDK.7z differ diff --git a/Reanimal/UnrealContainers.hpp b/Reanimal/UnrealContainers.hpp new file mode 100644 index 0000000..4874083 --- /dev/null +++ b/Reanimal/UnrealContainers.hpp @@ -0,0 +1,909 @@ +#pragma once + +/* +* SDK generated by Dumper-7 +* +* https://github.com/Encryqed/Dumper-7 +*/ + +// Container implementations with iterators. See https://github.com/Fischsalat/UnrealContainers + +#include +#include +#include +#include "UtfN.hpp" + +namespace UC +{ + typedef int8_t int8; + typedef int16_t int16; + typedef int32_t int32; + typedef int64_t int64; + + typedef uint8_t uint8; + typedef uint16_t uint16; + typedef uint32_t uint32; + typedef uint64_t uint64; + + template + class TArray; + + template + class TSparseArray; + + template + class TSet; + + template + class TMap; + + template + class TPair; + + namespace Iterators + { + class FSetBitIterator; + + template + class TArrayIterator; + + template + class TContainerIterator; + + template + using TSparseArrayIterator = TContainerIterator>; + + template + using TSetIterator = TContainerIterator>; + + template + using TMapIterator = TContainerIterator>; + } + + + namespace ContainerImpl + { + namespace HelperFunctions + { + inline uint32 FloorLog2(uint32 Value) + { + uint32 pos = 0; + if (Value >= 1 << 16) { Value >>= 16; pos += 16; } + if (Value >= 1 << 8) { Value >>= 8; pos += 8; } + if (Value >= 1 << 4) { Value >>= 4; pos += 4; } + if (Value >= 1 << 2) { Value >>= 2; pos += 2; } + if (Value >= 1 << 1) { pos += 1; } + return pos; + } + + inline uint32 CountLeadingZeros(uint32 Value) + { + if (Value == 0) + return 32; + + return 31 - FloorLog2(Value); + } + } + + template + struct TAlignedBytes + { + alignas(Alignment) uint8 Pad[Size]; + }; + + template + class TInlineAllocator + { + public: + template + class ForElementType + { + private: + static constexpr int32 ElementSize = sizeof(ElementType); + static constexpr int32 ElementAlign = alignof(ElementType); + + static constexpr int32 InlineDataSizeBytes = NumInlineElements * ElementSize; + + private: + TAlignedBytes InlineData[NumInlineElements]; + ElementType* SecondaryData; + + public: + ForElementType() + : InlineData{ 0x0 }, SecondaryData(nullptr) + { + } + + ForElementType(ForElementType&&) = default; + ForElementType(const ForElementType&) = default; + + public: + ForElementType& operator=(ForElementType&&) = default; + ForElementType& operator=(const ForElementType&) = default; + + public: + inline const ElementType* GetAllocation() const { return SecondaryData ? SecondaryData : reinterpret_cast(&InlineData); } + + inline uint32 GetNumInlineBytes() const { return NumInlineElements; } + }; + }; + + class FBitArray + { + protected: + static constexpr int32 NumBitsPerDWORD = 32; + static constexpr int32 NumBitsPerDWORDLogTwo = 5; + + private: + TInlineAllocator<4>::ForElementType Data; + int32 NumBits; + int32 MaxBits; + + public: + FBitArray() + : NumBits(0), MaxBits(Data.GetNumInlineBytes() * NumBitsPerDWORD) + { + } + + FBitArray(const FBitArray&) = default; + + FBitArray(FBitArray&&) = default; + + public: + FBitArray& operator=(FBitArray&&) = default; + + FBitArray& operator=(const FBitArray& Other) = default; + + private: + inline void VerifyIndex(int32 Index) const { if (!IsValidIndex(Index)) throw std::out_of_range("Index was out of range!"); } + + public: + inline int32 Num() const { return NumBits; } + inline int32 Max() const { return MaxBits; } + + inline const uint32* GetData() const { return reinterpret_cast(Data.GetAllocation()); } + + inline bool IsValidIndex(int32 Index) const { return Index >= 0 && Index < NumBits; } + + inline bool IsValid() const { return GetData() && NumBits > 0; } + + public: + inline bool operator[](int32 Index) const { VerifyIndex(Index); return GetData()[Index / NumBitsPerDWORD] & (1 << (Index & (NumBitsPerDWORD - 1))); } + + inline bool operator==(const FBitArray& Other) const { return NumBits == Other.NumBits && GetData() == Other.GetData(); } + inline bool operator!=(const FBitArray& Other) const { return NumBits != Other.NumBits || GetData() != Other.GetData(); } + + public: + friend Iterators::FSetBitIterator begin(const FBitArray& Array); + friend Iterators::FSetBitIterator end (const FBitArray& Array); + }; + + template + union TSparseArrayElementOrFreeListLink + { + SparseArrayType ElementData; + + struct + { + int32 PrevFreeIndex; + int32 NextFreeIndex; + }; + }; + + template + class SetElement + { + private: + template + friend class TSet; + + private: + SetType Value; + int32 HashNextId; + int32 HashIndex; + }; + } + + + template + class TPair + { + public: + KeyType First; + ValueType Second; + + public: + TPair(KeyType Key, ValueType Value) + : First(Key), Second(Value) + { + } + + public: + inline KeyType& Key() { return First; } + inline const KeyType& Key() const { return First; } + + inline ValueType& Value() { return Second; } + inline const ValueType& Value() const { return Second; } + }; + + template + class TArray + { + private: + template + friend class TAllocatedArray; + + template + friend class TSparseArray; + + protected: + static constexpr uint64 ElementAlign = alignof(ArrayElementType); + static constexpr uint64 ElementSize = sizeof(ArrayElementType); + + protected: + ArrayElementType* Data; + int32 NumElements; + int32 MaxElements; + + public: + TArray() + : TArray(nullptr, 0, 0) + { + } + + TArray(ArrayElementType* Data, int32 NumElements, int32 MaxElements) + : Data(Data), NumElements(NumElements), MaxElements(MaxElements) + { + } + + TArray(const TArray&) = default; + + TArray(TArray&&) = default; + + public: + TArray& operator=(TArray&&) = default; + TArray& operator=(const TArray&) = default; + + private: + inline int32 GetSlack() const { return MaxElements - NumElements; } + + inline void VerifyIndex(int32 Index) const { if (!IsValidIndex(Index)) throw std::out_of_range("Index was out of range!"); } + + inline ArrayElementType& GetUnsafe(int32 Index) { return Data[Index]; } + inline const ArrayElementType& GetUnsafe(int32 Index) const { return Data[Index]; } + + public: + /* Adds to the array if there is still space for one more element */ + inline bool Add(const ArrayElementType& Element) + { + if (GetSlack() <= 0) + return false; + + Data[NumElements] = Element; + NumElements++; + + return true; + } + + inline bool Remove(int32 Index) + { + if (!IsValidIndex(Index)) + return false; + + NumElements--; + + for (int i = Index; i < NumElements; i++) + { + /* NumElements was decremented, acessing i + 1 is safe */ + Data[i] = Data[i + 1]; + } + + return true; + } + + inline void Clear() + { + NumElements = 0; + + if (Data) + memset(Data, 0, NumElements * ElementSize); + } + + public: + inline int32 Num() const { return NumElements; } + inline int32 Max() const { return MaxElements; } + + inline const ArrayElementType* GetDataPtr() const { return Data; } + + inline bool IsValidIndex(int32 Index) const { return Data && Index >= 0 && Index < NumElements; } + + inline bool IsValid() const { return Data && NumElements > 0 && MaxElements >= NumElements; } + + public: + inline ArrayElementType& operator[](int32 Index) { VerifyIndex(Index); return Data[Index]; } + inline const ArrayElementType& operator[](int32 Index) const { VerifyIndex(Index); return Data[Index]; } + + inline bool operator==(const TArray& Other) const { return Data == Other.Data; } + inline bool operator!=(const TArray& Other) const { return Data != Other.Data; } + + inline explicit operator bool() const { return IsValid(); }; + + public: + template friend Iterators::TArrayIterator begin(const TArray& Array); + template friend Iterators::TArrayIterator end (const TArray& Array); + }; + + class FString : public TArray + { + public: + friend std::ostream& operator<<(std::ostream& Stream, const UC::FString& Str) { return Stream << Str.ToString(); } + + public: + using TArray::TArray; + + FString(const wchar_t* Str) + { + const uint32 NullTerminatedLength = static_cast(wcslen(Str) + 0x1); + + Data = const_cast(Str); + NumElements = NullTerminatedLength; + MaxElements = NullTerminatedLength; + } + + FString(wchar_t* Str, int32 Num, int32 Max) + { + Data = Str; + NumElements = Num; + MaxElements = Max; + } + + public: + inline std::string ToString() const + { + if (*this) + { + return UtfN::Utf16StringToUtf8String(Data, NumElements - 1); // Exclude null-terminator + } + + return ""; + } + + inline std::wstring ToWString() const + { + if (*this) + return std::wstring(Data); + + return L""; + } + + public: + inline wchar_t* CStr() { return Data; } + inline const wchar_t* CStr() const { return Data; } + + public: + inline bool operator==(const FString& Other) const { return Other ? NumElements == Other.NumElements && wcscmp(Data, Other.Data) == 0 : false; } + inline bool operator!=(const FString& Other) const { return Other ? NumElements != Other.NumElements || wcscmp(Data, Other.Data) != 0 : true; } + }; + + // Utf8String that assumes C-APIs (strlen, strcmp) behaviour works for char8_t like Ansi strings, execept it's counting/comparing bytes not characters. + class FUtf8String : public TArray + { + public: + friend std::ostream& operator<<(std::ostream& Stream, const UC::FUtf8String& Str) { return Stream << Str.ToString(); } + + private: + inline const char* GetDataAsConstCharPtr() const + { + return reinterpret_cast(Data); + } + + public: + using TArray::TArray; + + FUtf8String(const char8_t* Str) + { + Data = const_cast(Str); + + const uint32 NullTerminatedLength = static_cast(strlen(GetDataAsConstCharPtr()) + 0x1); + + NumElements = NullTerminatedLength; + MaxElements = NullTerminatedLength; + } + + FUtf8String(char8_t* Str, int32 Num, int32 Max) + { + Data = Str; + NumElements = Num; + MaxElements = Max; + } + + public: + inline std::string ToString() const + { + if (*this) + { + return std::string(GetDataAsConstCharPtr(), NumElements - 1); // Exclude null-terminator + } + + return ""; + } + + inline std::wstring ToWString() const + { + if (*this) + return UtfN::StringToWString(ToString()); // Exclude null-terminator + + return L""; + } + + public: + inline char8_t* CStr() { return Data; } + inline const char8_t* CStr() const { return Data; } + + public: + inline bool operator==(const FUtf8String& Other) const { return Other ? NumElements == Other.NumElements && strcmp(GetDataAsConstCharPtr(), Other.GetDataAsConstCharPtr()) == 0 : false; } + inline bool operator!=(const FUtf8String& Other) const { return Other ? NumElements != Other.NumElements || strcmp(GetDataAsConstCharPtr(), Other.GetDataAsConstCharPtr()) != 0 : true; } + }; + + class FAnsiString : public TArray + { + public: + friend std::ostream& operator<<(std::ostream& Stream, const UC::FAnsiString& Str) { return Stream << Str.ToString(); } + + public: + using TArray::TArray; + + FAnsiString(const char* Str) + { + const uint32 NullTerminatedLength = static_cast(strlen(Str) + 0x1); + + Data = const_cast(Str); + NumElements = NullTerminatedLength; + MaxElements = NullTerminatedLength; + } + + FAnsiString(char* Str, int32 Num, int32 Max) + { + Data = Str; + NumElements = Num; + MaxElements = Max; + } + + public: + inline std::string ToString() const + { + if (*this) + { + return std::string(Data, NumElements - 1); // Exclude null-terminator + } + + return ""; + } + + inline std::wstring ToWString() const + { + if (*this) + return UtfN::StringToWString(ToString()); // Exclude null-terminator + + return L""; + } + + public: + inline char* CStr() { return Data; } + inline const char* CStr() const { return Data; } + + public: + inline bool operator==(const FAnsiString& Other) const { return Other ? NumElements == Other.NumElements && strcmp(Data, Other.Data) == 0 : false; } + inline bool operator!=(const FAnsiString& Other) const { return Other ? NumElements != Other.NumElements || strcmp(Data, Other.Data) != 0 : true; } + }; + + + /* + * Class to allow construction of a TArray, that uses c-style standard-library memory allocation. + * + * Useful for calling functions that expect a buffer of a certain size and do not reallocate that buffer. + * This avoids leaking memory, if the array would otherwise be allocated by the engine, and couldn't be freed without FMemory-functions. + */ + template + class TAllocatedArray : public TArray + { + public: + TAllocatedArray() = delete; + + public: + TAllocatedArray(int32 Size) + { + this->Data = static_cast(malloc(Size * sizeof(ArrayElementType))); + this->NumElements = 0x0; + this->MaxElements = Size; + } + + ~TAllocatedArray() + { + if (this->Data) + free(this->Data); + + this->NumElements = 0x0; + this->MaxElements = 0x0; + } + + public: + inline operator TArray() { return *reinterpret_cast< TArray*>(this); } + inline operator const TArray() const { return *reinterpret_cast*>(this); } + }; + + /* + * Class to allow construction of an FString, that uses c-style standard-library memory allocation. + * + * Useful for calling functions that expect a buffer of a certain size and do not reallocate that buffer. + * This avoids leaking memory, if the array would otherwise be allocated by the engine, and couldn't be freed without FMemory-functions. + */ + class FAllocatedString : public FString + { + public: + FAllocatedString() = delete; + + public: + FAllocatedString(int32 Size) + { + Data = static_cast(malloc(Size * sizeof(wchar_t))); + NumElements = 0x0; + MaxElements = Size; + } + + ~FAllocatedString() + { + if (Data) + free(Data); + + NumElements = 0x0; + MaxElements = 0x0; + } + + public: + inline operator FString() { return *reinterpret_cast< FString*>(this); } + inline operator const FString() const { return *reinterpret_cast(this); } + }; + template + class TSparseArray + { + private: + static constexpr uint32 ElementAlign = alignof(SparseArrayElementType); + static constexpr uint32 ElementSize = sizeof(SparseArrayElementType); + + private: + using FElementOrFreeListLink = ContainerImpl::TSparseArrayElementOrFreeListLink>; + + private: + TArray Data; + ContainerImpl::FBitArray AllocationFlags; + int32 FirstFreeIndex; + int32 NumFreeIndices; + + public: + TSparseArray() + : FirstFreeIndex(-1), NumFreeIndices(0) + { + } + + TSparseArray(TSparseArray&&) = default; + TSparseArray(const TSparseArray&) = default; + + public: + TSparseArray& operator=(TSparseArray&&) = default; + TSparseArray& operator=(const TSparseArray&) = default; + + private: + inline void VerifyIndex(int32 Index) const { if (!IsValidIndex(Index)) throw std::out_of_range("Index was out of range!"); } + + public: + inline int32 NumAllocated() const { return Data.Num(); } + + inline int32 Num() const { return NumAllocated() - NumFreeIndices; } + inline int32 Max() const { return Data.Max(); } + + inline bool IsValidIndex(int32 Index) const { return Data.IsValidIndex(Index) && AllocationFlags[Index]; } + + inline bool IsValid() const { return Data.IsValid() && AllocationFlags.IsValid(); } + + public: + const ContainerImpl::FBitArray& GetAllocationFlags() const { return AllocationFlags; } + + public: + inline SparseArrayElementType& operator[](int32 Index) { VerifyIndex(Index); return *reinterpret_cast(&Data.GetUnsafe(Index).ElementData); } + inline const SparseArrayElementType& operator[](int32 Index) const { VerifyIndex(Index); return *reinterpret_cast(&Data.GetUnsafe(Index).ElementData); } + + inline bool operator==(const TSparseArray& Other) const { return Data == Other.Data; } + inline bool operator!=(const TSparseArray& Other) const { return Data != Other.Data; } + + public: + template friend Iterators::TSparseArrayIterator begin(const TSparseArray& Array); + template friend Iterators::TSparseArrayIterator end (const TSparseArray& Array); + }; + + template + class TSet + { + private: + static constexpr uint32 ElementAlign = alignof(SetElementType); + static constexpr uint32 ElementSize = sizeof(SetElementType); + + private: + using SetDataType = ContainerImpl::SetElement; + using HashType = ContainerImpl::TInlineAllocator<1>::ForElementType; + + private: + TSparseArray Elements; + HashType Hash; + int32 HashSize; + + public: + TSet() + : HashSize(0) + { + } + + TSet(TSet&&) = default; + TSet(const TSet&) = default; + + public: + TSet& operator=(TSet&&) = default; + TSet& operator=(const TSet&) = default; + + private: + inline void VerifyIndex(int32 Index) const { if (!IsValidIndex(Index)) throw std::out_of_range("Index was out of range!"); } + + public: + inline int32 NumAllocated() const { return Elements.NumAllocated(); } + + inline int32 Num() const { return Elements.Num(); } + inline int32 Max() const { return Elements.Max(); } + + inline bool IsValidIndex(int32 Index) const { return Elements.IsValidIndex(Index); } + + inline bool IsValid() const { return Elements.IsValid(); } + + public: + const ContainerImpl::FBitArray& GetAllocationFlags() const { return Elements.GetAllocationFlags(); } + + public: + inline SetElementType& operator[] (int32 Index) { return Elements[Index].Value; } + inline const SetElementType& operator[] (int32 Index) const { return Elements[Index].Value; } + + inline bool operator==(const TSet& Other) const { return Elements == Other.Elements; } + inline bool operator!=(const TSet& Other) const { return Elements != Other.Elements; } + + public: + template friend Iterators::TSetIterator begin(const TSet& Set); + template friend Iterators::TSetIterator end (const TSet& Set); + }; + + template + class TMap + { + public: + using ElementType = TPair; + + private: + TSet Elements; + + private: + inline void VerifyIndex(int32 Index) const { if (!IsValidIndex(Index)) throw std::out_of_range("Index was out of range!"); } + + public: + inline int32 NumAllocated() const { return Elements.NumAllocated(); } + + inline int32 Num() const { return Elements.Num(); } + inline int32 Max() const { return Elements.Max(); } + + inline bool IsValidIndex(int32 Index) const { return Elements.IsValidIndex(Index); } + + inline bool IsValid() const { return Elements.IsValid(); } + + public: + const ContainerImpl::FBitArray& GetAllocationFlags() const { return Elements.GetAllocationFlags(); } + + public: + inline decltype(auto) Find(const KeyElementType& Key, bool(*Equals)(const KeyElementType& LeftKey, const KeyElementType& RightKey)) + { + for (auto It = begin(*this); It != end(*this); ++It) + { + if (Equals(It->Key(), Key)) + return It; + } + + return end(*this); + } + + public: + inline ElementType& operator[] (int32 Index) { return Elements[Index]; } + inline const ElementType& operator[] (int32 Index) const { return Elements[Index]; } + + inline bool operator==(const TMap& Other) const { return Elements == Other.Elements; } + inline bool operator!=(const TMap& Other) const { return Elements != Other.Elements; } + + public: + template friend Iterators::TMapIterator begin(const TMap& Map); + template friend Iterators::TMapIterator end (const TMap& Map); + }; + + namespace Iterators + { + class FRelativeBitReference + { + protected: + static constexpr int32 NumBitsPerDWORD = 32; + static constexpr int32 NumBitsPerDWORDLogTwo = 5; + + public: + inline explicit FRelativeBitReference(int32 BitIndex) + : WordIndex(BitIndex >> NumBitsPerDWORDLogTwo) + , Mask(1 << (BitIndex & (NumBitsPerDWORD - 1))) + { + } + + int32 WordIndex; + uint32 Mask; + }; + + class FSetBitIterator : public FRelativeBitReference + { + private: + const ContainerImpl::FBitArray& Array; + + uint32 UnvisitedBitMask; + int32 CurrentBitIndex; + int32 BaseBitIndex; + + public: + explicit FSetBitIterator(const ContainerImpl::FBitArray& InArray, int32 StartIndex = 0) + : FRelativeBitReference(StartIndex) + , Array(InArray) + , UnvisitedBitMask((~0U) << (StartIndex & (NumBitsPerDWORD - 1))) + , CurrentBitIndex(StartIndex) + , BaseBitIndex(StartIndex & ~(NumBitsPerDWORD - 1)) + { + if (StartIndex != Array.Num()) + FindFirstSetBit(); + } + + public: + inline FSetBitIterator& operator++() + { + UnvisitedBitMask &= ~this->Mask; + + FindFirstSetBit(); + + return *this; + } + + inline explicit operator bool() const { return CurrentBitIndex < Array.Num(); } + + inline bool operator==(const FSetBitIterator& Rhs) const { return CurrentBitIndex == Rhs.CurrentBitIndex && &Array == &Rhs.Array; } + inline bool operator!=(const FSetBitIterator& Rhs) const { return CurrentBitIndex != Rhs.CurrentBitIndex || &Array != &Rhs.Array; } + + public: + inline int32 GetIndex() { return CurrentBitIndex; } + + void FindFirstSetBit() + { + const uint32* ArrayData = Array.GetData(); + const int32 ArrayNum = Array.Num(); + const int32 LastWordIndex = (ArrayNum - 1) / NumBitsPerDWORD; + + uint32 RemainingBitMask = ArrayData[this->WordIndex] & UnvisitedBitMask; + while (!RemainingBitMask) + { + ++this->WordIndex; + BaseBitIndex += NumBitsPerDWORD; + if (this->WordIndex > LastWordIndex) + { + CurrentBitIndex = ArrayNum; + return; + } + + RemainingBitMask = ArrayData[this->WordIndex]; + UnvisitedBitMask = ~0; + } + + const uint32 NewRemainingBitMask = RemainingBitMask & (RemainingBitMask - 1); + + this->Mask = NewRemainingBitMask ^ RemainingBitMask; + + CurrentBitIndex = BaseBitIndex + NumBitsPerDWORD - 1 - ContainerImpl::HelperFunctions::CountLeadingZeros(this->Mask); + + if (CurrentBitIndex > ArrayNum) + CurrentBitIndex = ArrayNum; + } + }; + + template + class TArrayIterator + { + private: + TArray& IteratedArray; + int32 Index; + + public: + TArrayIterator(const TArray& Array, int32 StartIndex = 0x0) + : IteratedArray(const_cast&>(Array)), Index(StartIndex) + { + } + + public: + inline int32 GetIndex() { return Index; } + + inline int32 IsValid() { return IteratedArray.IsValidIndex(GetIndex()); } + + public: + inline TArrayIterator& operator++() { ++Index; return *this; } + inline TArrayIterator& operator--() { --Index; return *this; } + + inline ArrayType& operator*() { return IteratedArray[GetIndex()]; } + inline const ArrayType& operator*() const { return IteratedArray[GetIndex()]; } + + inline ArrayType* operator->() { return &IteratedArray[GetIndex()]; } + inline const ArrayType* operator->() const { return &IteratedArray[GetIndex()]; } + + inline bool operator==(const TArrayIterator& Other) const { return &IteratedArray == &Other.IteratedArray && Index == Other.Index; } + inline bool operator!=(const TArrayIterator& Other) const { return &IteratedArray != &Other.IteratedArray || Index != Other.Index; } + }; + + template + class TContainerIterator + { + private: + ContainerType& IteratedContainer; + FSetBitIterator BitIterator; + + public: + TContainerIterator(const ContainerType& Container, const ContainerImpl::FBitArray& BitArray, int32 StartIndex = 0x0) + : IteratedContainer(const_cast(Container)), BitIterator(BitArray, StartIndex) + { + } + + public: + inline int32 GetIndex() { return BitIterator.GetIndex(); } + + inline int32 IsValid() { return IteratedContainer.IsValidIndex(GetIndex()); } + + public: + inline TContainerIterator& operator++() { ++BitIterator; return *this; } + inline TContainerIterator& operator--() { --BitIterator; return *this; } + + inline auto& operator*() { return IteratedContainer[GetIndex()]; } + inline const auto& operator*() const { return IteratedContainer[GetIndex()]; } + + inline auto* operator->() { return &IteratedContainer[GetIndex()]; } + inline const auto* operator->() const { return &IteratedContainer[GetIndex()]; } + + inline bool operator==(const TContainerIterator& Other) const { return &IteratedContainer == &Other.IteratedContainer && BitIterator == Other.BitIterator; } + inline bool operator!=(const TContainerIterator& Other) const { return &IteratedContainer != &Other.IteratedContainer || BitIterator != Other.BitIterator; } + }; + } + + inline Iterators::FSetBitIterator begin(const ContainerImpl::FBitArray& Array) { return Iterators::FSetBitIterator(Array, 0); } + inline Iterators::FSetBitIterator end (const ContainerImpl::FBitArray& Array) { return Iterators::FSetBitIterator(Array, Array.Num()); } + + template inline Iterators::TArrayIterator begin(const TArray& Array) { return Iterators::TArrayIterator(Array, 0); } + template inline Iterators::TArrayIterator end (const TArray& Array) { return Iterators::TArrayIterator(Array, Array.Num()); } + + template inline Iterators::TSparseArrayIterator begin(const TSparseArray& Array) { return Iterators::TSparseArrayIterator(Array, Array.GetAllocationFlags(), 0); } + template inline Iterators::TSparseArrayIterator end (const TSparseArray& Array) { return Iterators::TSparseArrayIterator(Array, Array.GetAllocationFlags(), Array.NumAllocated()); } + + template inline Iterators::TSetIterator begin(const TSet& Set) { return Iterators::TSetIterator(Set, Set.GetAllocationFlags(), 0); } + template inline Iterators::TSetIterator end (const TSet& Set) { return Iterators::TSetIterator(Set, Set.GetAllocationFlags(), Set.NumAllocated()); } + + template inline Iterators::TMapIterator begin(const TMap& Map) { return Iterators::TMapIterator(Map, Map.GetAllocationFlags(), 0); } + template inline Iterators::TMapIterator end (const TMap& Map) { return Iterators::TMapIterator(Map, Map.GetAllocationFlags(), Map.NumAllocated()); } + +#if defined(_WIN64) + static_assert(sizeof(TArray) == 0x10, "TArray has a wrong size!"); + static_assert(sizeof(TSet) == 0x50, "TSet has a wrong size!"); + static_assert(sizeof(TMap) == 0x50, "TMap has a wrong size!"); +#elif defined(_WIN32) + static_assert(sizeof(TArray) == 0x0C, "TArray has a wrong size!"); + static_assert(sizeof(TSet) == 0x3C, "TSet has a wrong size!"); + static_assert(sizeof(TMap) == 0x3C, "TMap has a wrong size!"); +#endif +} diff --git a/Reanimal/UtfN.hpp b/Reanimal/UtfN.hpp new file mode 100644 index 0000000..0feb7d7 --- /dev/null +++ b/Reanimal/UtfN.hpp @@ -0,0 +1,1613 @@ +#pragma once + +/* +* SDK generated by Dumper-7 +* +* https://github.com/Encryqed/Dumper-7 +*/ + +// A simple C++ lib for converting between Utf8, Utf16 and Utf32. See https://github.com/Fischsalat/UTF-N + + +// Lower warning-level and turn off certain warnings for STL compilation +#if (defined(_MSC_VER)) +#pragma warning (push, 2) // Push warnings and set warn-level to 2 +#pragma warning(disable : 4365) // signed/unsigned mismatch +#pragma warning(disable : 4710) // 'FunctionName' was not inlined +#pragma warning(disable : 4711) // 'FunctionName' selected for automatic inline expansion +#elif (defined(__CLANG__) || defined(__GNUC__)) +#pragma GCC diagnostic push +#pragma GCC diagnostic ignored "-Wsign-compare" +#endif + +#include +#include +#include +#include + +#ifdef _DEBUG +#include +#endif // _DEBUG + + +// Restore warnings-levels after STL includes +#if (defined(_MSC_VER)) +#pragma warning (pop) +#elif (defined(__CLANG__) || defined(__GNUC__)) +#pragma GCC diagnostic pop +#endif // Warnings + + + +#if (defined(_MSC_VER)) +#pragma warning (push) +#pragma warning (disable: 4514) // C4514 "unreferenced inline function has been removed" +#pragma warning (disable: 4820) // C4820 "'n' bytes padding added after data member '...'" +#pragma warning(disable : 4127) // C4127 conditional expression is constant +#pragma warning(disable : 5045) // C5045 Compiler will insert Spectre mitigation for memory load if /Qspectre switch specified +#pragma warning(disable : 5246) // C5246 'ArrayVariable' the initialization of a subobject should be wrapped in braces +#elif (defined(__CLANG__) || defined(__GNUC__)) +#endif // Warnings + +#ifdef __cpp_constexpr +#define UTF_CONSTEXPR constexpr +#else +#define UTF_CONSTEXPR +#endif // __cpp_constexpr + + +#ifdef __cpp_if_constexpr +#define UTF_IF_CONSTEXPR constexpr +#else +#define UTF_IF_CONSTEXPR +#endif // __cpp_if_constexpr + + +#if (defined(__cpp_constexpr) && __cpp_constexpr >= 201304L) +#define UTF_CONSTEXPR14 constexpr +#else +#define UTF_CONSTEXPR14 +#endif + +#if (defined(__cpp_constexpr) && __cpp_constexpr >= 201603L) +#define UTF_CONSTEXPR17 constexpr +#else +#define UTF_CONSTEXPR17 inline +#endif + +#if (defined(__cpp_constexpr) && __cpp_constexpr >= 201907L) +#define UTF_CONSTEXPR20 constexpr +#else +#define UTF_CONSTEXPR20 inline +#endif + +#if (defined(__cpp_constexpr) && __cpp_constexpr >= 202211L) +#define UTF_CONSTEXPR23 constexpr +#else +#define UTF_CONSTEXPR23 inline +#endif + +#if (defined(__cpp_constexpr) && __cpp_constexpr >= 202406L) +#define UTF_CONSTEXPR26 constexpr +#else +#define UTF_CONSTEXPR26 inline +#endif + + +#ifdef __cpp_nodiscard +#define UTF_NODISCARD [[nodiscard]] +#else +#define UTF_NODISCARD +#endif + + +namespace UtfN +{ +#if defined(__cpp_char8_t) + typedef char8_t utf_cp8_t; + typedef char16_t utf_cp16_t; + typedef char32_t utf_cp32_t; +#elif defined(__cpp_unicode_characters) + typedef unsigned char utf_cp8_t; + typedef char16_t utf_cp16_t; + typedef char32_t utf_cp32_t; +#else + typedef unsigned char utf_cp8_t; + typedef uint16_t utf_cp16_t; + typedef uint32_t utf_cp32_t; +#endif + + namespace UtfImpl + { + namespace Utils + { + template + UTF_CONSTEXPR UTF_NODISCARD + bool IsFlagSet(value_type Value, flag_type Flag) noexcept + { + return (Value & Flag) == Flag; + } + + template + UTF_CONSTEXPR UTF_NODISCARD + value_type GetWithClearedFlag(value_type Value, flag_type Flag) noexcept + { + return static_cast(Value & static_cast(~Flag)); + } + + // Does not add/remove cv-qualifiers + template + UTF_CONSTEXPR UTF_NODISCARD + auto ForceCastIfMissmatch(current_type&& Arg) -> std::enable_if_t, std::decay_t>::value, current_type> + { + return static_cast(Arg); + } + + // Does not add/remove cv-qualifiers + template + UTF_CONSTEXPR UTF_NODISCARD + auto ForceCastIfMissmatch(current_type&& Arg) -> std::enable_if_t, std::decay_t>::value, target_type> + { + return reinterpret_cast(Arg); + } + } + + // wchar_t is a utf16 codepoint on windows, utf32 on linux + UTF_CONSTEXPR bool IsWCharUtf32 = sizeof(wchar_t) == 0x4; + + // Any value greater than this is not a valid Unicode symbol + UTF_CONSTEXPR utf_cp32_t MaxValidUnicodeChar = 0x10FFFF; + + namespace Utf8 + { + /* + * Available bits, and max values, for n-byte utf8 characters + * + * 01111111 -> 1 byte -> 7 bits + * 11011111 -> 2 bytes -> 5 + 6 bits -> 11 bits + * 11101111 -> 3 bytes -> 4 + 6 + 6 bits -> 16 bits + * 11110111 -> 4 bytes -> 3 + 6 + 6 + 6 bits -> 21 bits + * + * 10111111 -> follow up byte + */ + UTF_CONSTEXPR utf_cp32_t Max1ByteValue = (1 << 7) - 1; // 7 bits available + UTF_CONSTEXPR utf_cp32_t Max2ByteValue = (1 << 11) - 1; // 11 bits available + UTF_CONSTEXPR utf_cp32_t Max3ByteValue = (1 << 16) - 1; // 16 bits available + UTF_CONSTEXPR utf_cp32_t Max4ByteValue = 0x10FFFF; // 21 bits available, but not fully used + + // Flags for follow-up bytes of multibyte utf8 character + UTF_CONSTEXPR utf_cp8_t FollowupByteMask = 0b1000'0000; + UTF_CONSTEXPR utf_cp8_t FollowupByteDataMask = 0b0011'1111; + UTF_CONSTEXPR utf_cp8_t NumDataBitsInFollowupByte = 0x6; + + // Flags for start-bytes of multibyte utf8 characters + UTF_CONSTEXPR utf_cp8_t TwoByteFlag = 0b1100'0000; + UTF_CONSTEXPR utf_cp8_t ThreeByteFlag = 0b1110'0000; + UTF_CONSTEXPR utf_cp8_t FourByteFlag = 0b1111'0000; + + UTF_CONSTEXPR UTF_NODISCARD + bool IsValidFollowupCodepoint(const utf_cp8_t Codepoint) noexcept + { + // Test the upper 2 bytes for the FollowupByteMask + return (Codepoint & 0b1100'0000) == FollowupByteMask; + } + + template + UTF_CONSTEXPR UTF_NODISCARD + bool IsValidUtf8Sequence(const utf_cp8_t FirstCp, const utf_cp8_t SecondCp, const utf_cp8_t ThirdCp, const utf_cp8_t FourthCp) noexcept + { + switch (ByteSize) + { + case 1: + { + return SecondCp == 0 && ThirdCp == 0 && FourthCp == 0; + } + case 4: + { + const bool bIsOverlongEncoding = Utils::GetWithClearedFlag(FirstCp, ~Utf8::TwoByteFlag) != 0 && SecondCp == Utf8::FollowupByteMask; + return !bIsOverlongEncoding && IsValidFollowupCodepoint(SecondCp) && IsValidFollowupCodepoint(ThirdCp) && IsValidFollowupCodepoint(FourthCp); + } + case 3: + { + const bool bIsOverlongEncoding = Utils::GetWithClearedFlag(FirstCp, ~Utf8::ThreeByteFlag) != 0 && SecondCp == Utf8::FollowupByteMask; + return !bIsOverlongEncoding && IsValidFollowupCodepoint(SecondCp) && IsValidFollowupCodepoint(ThirdCp) && FourthCp == 0; + } + case 2: + { + const bool bIsOverlongEncoding = Utils::GetWithClearedFlag(FirstCp, ~Utf8::FourByteFlag) != 0 && SecondCp == Utf8::FollowupByteMask; + return !bIsOverlongEncoding && IsValidFollowupCodepoint(SecondCp) && ThirdCp == 0 && FourthCp == 0; + } + default: + { + return false; + break; + } + } + } + } + + namespace Utf16 + { + // Surrogate masks and offset for multibyte utf16 characters + UTF_CONSTEXPR utf_cp16_t HighSurrogateRangeStart = 0xD800; + UTF_CONSTEXPR utf_cp16_t LowerSurrogateRangeStart = 0xDC00; + + UTF_CONSTEXPR utf_cp32_t SurrogatePairOffset = 0x10000; + + // Unicode range for 2byte utf16 values + UTF_CONSTEXPR utf_cp32_t SurrogateRangeLowerBounds = 0xD800; + UTF_CONSTEXPR utf_cp32_t SurrogateRangeUpperBounds = 0xDFFF; + + + UTF_CONSTEXPR UTF_NODISCARD + bool IsHighSurrogate(const utf_cp16_t Codepoint) noexcept + { + // Range [0xD800 - 0xDC00[ + return Codepoint >= HighSurrogateRangeStart && Codepoint < LowerSurrogateRangeStart; + } + UTF_CONSTEXPR UTF_NODISCARD + bool IsLowSurrogate(const utf_cp16_t Codepoint) noexcept + { + // Range [0xDC00 - 0xDFFF] + return Codepoint >= LowerSurrogateRangeStart && Codepoint <= SurrogateRangeUpperBounds; + } + + // Tests if a utf16 value is a valid Unicode character + UTF_CONSTEXPR UTF_NODISCARD + bool IsValidUnicodeChar(const utf_cp16_t LowerCodepoint, const utf_cp16_t UpperCodepoint) noexcept + { + const bool IsValidHighSurrogate = IsHighSurrogate(UpperCodepoint); + const bool IsValidLowSurrogate = IsLowSurrogate(LowerCodepoint); + + // Both needt to be valid + if (IsValidHighSurrogate) + return IsValidLowSurrogate; + + // Neither are valid && the codepoints are not in the wrong surrogate ranges + return !IsValidLowSurrogate && !IsHighSurrogate(LowerCodepoint) && !IsLowSurrogate(UpperCodepoint); + } + } + + namespace Utf32 + { + // Tests if a utf32 value is a valid Unicode character + UTF_CONSTEXPR UTF_NODISCARD + bool IsValidUnicodeChar(const utf_cp32_t Codepoint) noexcept + { + // Codepoints must be within the valid unicode range and must not be within the range of Surrogate-values + return Codepoint < MaxValidUnicodeChar && (Codepoint < Utf16::SurrogateRangeLowerBounds || Codepoint > Utf16::SurrogateRangeUpperBounds); + } + } + + namespace Iterator + { + template + class utf_char_iterator_base_child_acessor + { + private: + template + friend class utf_char_iterator_base; + + private: + static UTF_CONSTEXPR + void ReadChar(child_type* This) + { + return This->ReadChar(); + } + }; + + template + class utf_char_iterator_base + { + public: + UTF_CONSTEXPR utf_char_iterator_base(codepoint_iterator_type Begin, codepoint_iterator_type End) + : CurrentIterator(Begin), NextCharStartIterator(Begin), EndIterator(End) + { + utf_char_iterator_base_child_acessor::ReadChar(static_cast(this)); + } + + template())), // Has begin + typename = decltype(std::end(std::declval())), // Has end + typename iterator_deref_type = decltype(*std::end(std::declval())), // Iterator can be dereferenced + typename = std::enable_if::type) == utf_char_type::GetCodepointSize()>::type // Return-value of derferenced iterator has the same size as one codepoint + > + explicit UTF_CONSTEXPR utf_char_iterator_base(container_type& Container) + : CurrentIterator(std::begin(Container)), NextCharStartIterator(std::begin(Container)), EndIterator(std::end(Container)) + { + utf_char_iterator_base_child_acessor::ReadChar(static_cast(this)); + } + + public: + UTF_CONSTEXPR inline + child_iterator_type& operator++() + { + // Skip ahead to the next char + CurrentIterator = NextCharStartIterator; + + // Populate the current char and advance the NextCharStartIterator + utf_char_iterator_base_child_acessor::ReadChar(static_cast(this)); + + + return *static_cast(this); + } + + public: + UTF_CONSTEXPR inline + utf_char_type operator*() const + { + return CurrentChar; + } + + UTF_CONSTEXPR inline bool operator==(const child_iterator_type& Other) const + { + return CurrentIterator == Other.CurrentIterator; + } + UTF_CONSTEXPR inline + bool operator!=(const child_iterator_type& Other) const + { + return CurrentIterator != Other.CurrentIterator; + } + + UTF_CONSTEXPR inline + explicit operator bool() const + { + return this->CurrentIterator != this->EndIterator; + } + + public: + UTF_CONSTEXPR inline + child_iterator_type begin() + { + return *static_cast(this); + } + + UTF_CONSTEXPR inline + child_iterator_type end() + { + return child_iterator_type(EndIterator, EndIterator); + } + + protected: + codepoint_iterator_type CurrentIterator; // Current byte pos + codepoint_iterator_type NextCharStartIterator; // Byte pos of the next character + codepoint_iterator_type EndIterator; // End Iterator + + utf_char_type CurrentChar; // Current character bytes + }; + } + } + + struct utf8_bytes + { + utf_cp8_t Codepoints[4] = { 0 }; + }; + + struct utf16_pair + { + utf_cp16_t Lower = 0; + utf_cp16_t Upper = 0; + }; + + UTF_CONSTEXPR inline + bool operator==(const utf8_bytes Left, const utf8_bytes Right) noexcept + { + return Left.Codepoints[0] == Right.Codepoints[0] + && Left.Codepoints[1] == Right.Codepoints[1] + && Left.Codepoints[2] == Right.Codepoints[2] + && Left.Codepoints[3] == Right.Codepoints[3]; + } + UTF_CONSTEXPR inline + bool operator!=(const utf8_bytes Left, const utf8_bytes Right) noexcept + { + return !(Left == Right); + } + + UTF_CONSTEXPR inline + bool operator==(const utf16_pair Left, const utf16_pair Right) noexcept + { + return Left.Upper == Right.Upper && Left.Lower == Right.Lower; + } + UTF_CONSTEXPR inline + bool operator!=(const utf16_pair Left, const utf16_pair Right) noexcept + { + return !(Left == Right); + } + + + enum class UtfEncodingType + { + Invalid, + Utf8, + Utf16, + Utf32 + }; + + template + struct utf_char; + + typedef utf_char utf_char8; + typedef utf_char utf_char16; + typedef utf_char utf_char32; + + template<> + struct utf_char + { + utf8_bytes Char = { 0 }; + + public: + UTF_CONSTEXPR utf_char() = default; + UTF_CONSTEXPR utf_char(utf_char&&) = default; + UTF_CONSTEXPR utf_char(const utf_char&) = default; + + UTF_CONSTEXPR utf_char(utf8_bytes InChar) noexcept; + + template()))> + UTF_CONSTEXPR utf_char(const char_type* SingleCharString) noexcept; + + public: + UTF_CONSTEXPR utf_char& operator=(utf_char&&) = default; + UTF_CONSTEXPR utf_char& operator=(const utf_char&) = default; + + UTF_CONSTEXPR utf_char& operator=(utf8_bytes inBytse) noexcept; + + public: + UTF_CONSTEXPR UTF_NODISCARD utf_cp8_t& operator[](const uint8_t Index); + UTF_CONSTEXPR UTF_NODISCARD const utf_cp8_t& operator[](const uint8_t Index) const; + + UTF_CONSTEXPR UTF_NODISCARD bool operator==(utf_char8 Other) const noexcept; + UTF_CONSTEXPR UTF_NODISCARD bool operator!=(utf_char8 Other) const noexcept; + + public: + UTF_CONSTEXPR UTF_NODISCARD utf_char8 GetAsUtf8() const noexcept; + UTF_CONSTEXPR UTF_NODISCARD utf_char16 GetAsUtf16() const noexcept; + UTF_CONSTEXPR UTF_NODISCARD utf_char32 GetAsUtf32() const noexcept; + + UTF_CONSTEXPR UTF_NODISCARD utf8_bytes Get() const; + + UTF_CONSTEXPR UTF_NODISCARD UtfEncodingType GetEncoding() const noexcept; + UTF_CONSTEXPR UTF_NODISCARD uint8_t GetNumCodepoints() const noexcept; + + UTF_CONSTEXPR UTF_NODISCARD static uint8_t GetCodepointSize() noexcept; + }; + + template<> + struct utf_char + { + utf16_pair Char = { 0 }; + + public: + UTF_CONSTEXPR utf_char() = default; + UTF_CONSTEXPR utf_char(utf_char&&) = default; + UTF_CONSTEXPR utf_char(const utf_char&) = default; + + UTF_CONSTEXPR utf_char(utf16_pair InChar) noexcept; + + template()))> + UTF_CONSTEXPR utf_char(const char_type* SingleCharString) noexcept; + + public: + UTF_CONSTEXPR utf_char& operator=(utf_char&&) = default; + UTF_CONSTEXPR utf_char& operator=(const utf_char&) = default; + + UTF_CONSTEXPR utf_char& operator=(utf16_pair inBytse) noexcept; + + public: + UTF_CONSTEXPR UTF_NODISCARD bool operator==(utf_char16 Other) const noexcept; + UTF_CONSTEXPR UTF_NODISCARD bool operator!=(utf_char16 Other) const noexcept; + + public: + UTF_CONSTEXPR UTF_NODISCARD utf_char8 GetAsUtf8() const noexcept; + UTF_CONSTEXPR UTF_NODISCARD utf_char16 GetAsUtf16() const noexcept; + UTF_CONSTEXPR UTF_NODISCARD utf_char32 GetAsUtf32() const noexcept; + + UTF_CONSTEXPR UTF_NODISCARD utf16_pair Get() const noexcept; + + UTF_CONSTEXPR UTF_NODISCARD UtfEncodingType GetEncoding() const noexcept; + UTF_CONSTEXPR UTF_NODISCARD uint8_t GetNumCodepoints() const noexcept; + + UTF_CONSTEXPR UTF_NODISCARD static uint8_t GetCodepointSize() noexcept; + }; + + template<> + struct utf_char + { + utf_cp32_t Char = { 0 }; + + public: + UTF_CONSTEXPR utf_char() = default; + UTF_CONSTEXPR utf_char(utf_char&&) = default; + UTF_CONSTEXPR utf_char(const utf_char&) = default; + + UTF_CONSTEXPR utf_char(utf_cp32_t InChar) noexcept; + + template()))> + UTF_CONSTEXPR utf_char(const char_type* SingleCharString) noexcept; + + public: + UTF_CONSTEXPR utf_char& operator=(utf_char&&) = default; + UTF_CONSTEXPR utf_char& operator=(const utf_char&) = default; + + UTF_CONSTEXPR utf_char& operator=(utf_cp32_t inBytse) noexcept; + + public: + UTF_CONSTEXPR UTF_NODISCARD bool operator==(utf_char32 Other) const noexcept; + UTF_CONSTEXPR UTF_NODISCARD bool operator!=(utf_char32 Other) const noexcept; + + public: + UTF_CONSTEXPR UTF_NODISCARD utf_char8 GetAsUtf8() const noexcept; + UTF_CONSTEXPR UTF_NODISCARD utf_char16 GetAsUtf16() const noexcept; + UTF_CONSTEXPR UTF_NODISCARD utf_char32 GetAsUtf32() const noexcept; + + UTF_CONSTEXPR UTF_NODISCARD utf_cp32_t Get() const noexcept; + + UTF_CONSTEXPR UTF_NODISCARD UtfEncodingType GetEncoding() const noexcept; + UTF_CONSTEXPR UTF_NODISCARD uint8_t GetNumCodepoints() const noexcept; + + UTF_CONSTEXPR UTF_NODISCARD static uint8_t GetCodepointSize() noexcept; + }; + + UTF_CONSTEXPR UTF_NODISCARD + uint8_t GetUtf8CharLenght(const utf_cp8_t C) noexcept + { + using namespace UtfImpl; + + /* No flag for any other byte-count is set */ + if ((C & 0b1000'0000) == 0) + { + return 0x1; + } + else if (Utils::IsFlagSet(C, Utf8::FourByteFlag)) + { + return 0x4; + } + else if (Utils::IsFlagSet(C, Utf8::ThreeByteFlag)) + { + return 0x3; + } + else if (Utils::IsFlagSet(C, Utf8::TwoByteFlag)) + { + return 0x2; + } + else + { + /* Invalid! This is a follow up codepoint but conversion needs to start at the start-codepoint. */ + return 0x0; + } + } + + UTF_CONSTEXPR UTF_NODISCARD + uint8_t GetUtf16CharLenght(const utf_cp16_t UpperCodepoint) noexcept + { + if (UtfImpl::Utf16::IsHighSurrogate(UpperCodepoint)) + return 0x2; + + return 0x1; + } + + UTF_CONSTEXPR UTF_NODISCARD + utf_char16 Utf32ToUtf16Pair(const utf_char32 Character) noexcept + { + using namespace UtfImpl; + + if (!Utf32::IsValidUnicodeChar(Character.Char)) + return utf16_pair{}; + + utf16_pair RetCharPair; + + if (Character.Char > USHRT_MAX) + { + const utf_cp32_t PreparedCodepoint = Character.Char - Utf16::SurrogatePairOffset; + + RetCharPair.Upper = (PreparedCodepoint >> 10) & 0b1111111111; + RetCharPair.Lower = PreparedCodepoint & 0b1111111111; + + // Surrogate-pair starting ranges for higher/lower surrogates + RetCharPair.Upper += Utf16::HighSurrogateRangeStart; + RetCharPair.Lower += Utf16::LowerSurrogateRangeStart; + + return RetCharPair; + } + + RetCharPair.Lower = static_cast(Character.Char); + + return RetCharPair; + } + + UTF_CONSTEXPR UTF_NODISCARD + utf_char32 Utf16PairToUtf32(const utf_char16 Character) noexcept + { + using namespace UtfImpl; + + // The surrogate-values are not valid Unicode codepoints + if (!Utf16::IsValidUnicodeChar(Character.Char.Lower, Character.Char.Upper)) + return utf_cp32_t{ 0 }; + + if (Character.Char.Upper) + { + // Move the characters back from the surrogate range to the normal range + const utf_cp16_t UpperCodepointWithoutSurrogate = static_cast(Character.Char.Upper - Utf16::HighSurrogateRangeStart); + const utf_cp16_t LowerCodepointWithoutSurrogate = static_cast(Character.Char.Lower - Utf16::LowerSurrogateRangeStart); + + return ((static_cast(UpperCodepointWithoutSurrogate) << 10) | LowerCodepointWithoutSurrogate) + Utf16::SurrogatePairOffset; + } + + return Character.Char.Lower; + } + + UTF_CONSTEXPR UTF_NODISCARD + utf_char8 Utf32ToUtf8Bytes(const utf_char32 Character) noexcept + { + using namespace UtfImpl; + using namespace UtfImpl::Utf8; + + if (!Utf32::IsValidUnicodeChar(Character.Char)) + return utf_char8{}; + + utf8_bytes RetBytes; + + if (Character.Char <= Max1ByteValue) + { + RetBytes.Codepoints[0] = static_cast(Character.Char); + } + else if (Character.Char <= Max2ByteValue) + { + /* Upper 3 bits of first byte are reserved for byte-lengh. */ + RetBytes.Codepoints[0] = TwoByteFlag; + RetBytes.Codepoints[0] |= Character.Char >> NumDataBitsInFollowupByte; // Lower bits stored in 2nd byte + + RetBytes.Codepoints[1] |= FollowupByteMask; + RetBytes.Codepoints[1] |= Character.Char & FollowupByteDataMask; + } + else if (Character.Char <= Max3ByteValue) + { + /* Upper 4 bits of first byte are reserved for byte-lengh. */ + RetBytes.Codepoints[0] = ThreeByteFlag; + RetBytes.Codepoints[0] |= Character.Char >> (NumDataBitsInFollowupByte * 2); // Lower bits stored in 2nd and 3rd bytes + + RetBytes.Codepoints[1] = FollowupByteMask; + RetBytes.Codepoints[1] |= (Character.Char >> NumDataBitsInFollowupByte) & FollowupByteDataMask; // Lower bits stored in 2nd byte + + RetBytes.Codepoints[2] = FollowupByteMask; + RetBytes.Codepoints[2] |= Character.Char & FollowupByteDataMask; + } + else if (Character.Char <= Max4ByteValue) + { + /* Upper 5 bits of first byte are reserved for byte-lengh. */ + RetBytes.Codepoints[0] = FourByteFlag; + RetBytes.Codepoints[0] |= Character.Char >> (NumDataBitsInFollowupByte * 3); // Lower bits stored in 2nd, 3rd and 4th bytes + + RetBytes.Codepoints[1] = FollowupByteMask; + RetBytes.Codepoints[1] |= (Character.Char >> (NumDataBitsInFollowupByte * 2)) & FollowupByteDataMask; // Lower bits stored in 3rd and 4th bytes + + RetBytes.Codepoints[2] = FollowupByteMask; + RetBytes.Codepoints[2] |= (Character.Char >> NumDataBitsInFollowupByte) & FollowupByteDataMask; // Lower bits stored in 4th byte + + RetBytes.Codepoints[3] = FollowupByteMask; + RetBytes.Codepoints[3] |= Character.Char & FollowupByteDataMask; + } + else + { + /* Above max allowed value. Invalid codepoint. */ + return RetBytes; + } + + return RetBytes; + } + + UTF_CONSTEXPR UTF_NODISCARD + utf_cp32_t Utf8BytesToUtf32(const utf_char8 Character) noexcept + { + using namespace UtfImpl; + using namespace UtfImpl::Utf8; + + /* No flag for any other byte-count is set */ + if ((Character[0] & 0b1000'0000) == 0) + { + if (!Utf8::IsValidUtf8Sequence<1>(Character[0], Character[1], Character[2], Character[3])) // Verifies encoding + return utf_cp32_t{ 0 }; + + return Character[0]; + } + else if (Utils::IsFlagSet(Character[0], FourByteFlag)) + { + utf_cp32_t RetChar = Utils::GetWithClearedFlag(Character[3], FollowupByteMask); + RetChar |= Utils::GetWithClearedFlag(Character[2], FollowupByteMask) << (NumDataBitsInFollowupByte * 1); // Clear the FollowupByteMask and move the bits to the right position + RetChar |= Utils::GetWithClearedFlag(Character[1], FollowupByteMask) << (NumDataBitsInFollowupByte * 2); // Clear the FollowupByteMask and move the bits to the right position + RetChar |= Utils::GetWithClearedFlag(Character[0], FourByteFlag) << (NumDataBitsInFollowupByte * 3); // Clear the FourByteFlag and move the bits to the right position + + if (!Utf8::IsValidUtf8Sequence<4>(Character[0], Character[1], Character[2], Character[3]) // Verifies encoding + || !Utf32::IsValidUnicodeChar(RetChar)) // Verifies ranges + return utf_cp32_t{ 0 }; + + return RetChar; + } + else if (Utils::IsFlagSet(Character[0], ThreeByteFlag)) + { + utf_cp32_t RetChar = Utils::GetWithClearedFlag(Character[2], FollowupByteMask); + RetChar |= Utils::GetWithClearedFlag(Character[1], FollowupByteMask) << (NumDataBitsInFollowupByte * 1); // Clear the FollowupByteMask and move the bits to the right position + RetChar |= Utils::GetWithClearedFlag(Character[0], ThreeByteFlag) << (NumDataBitsInFollowupByte * 2); // Clear the ThreeByteFlag and move the bits to the right position + + if (!Utf8::IsValidUtf8Sequence<3>(Character[0], Character[1], Character[2], Character[3]) // Verifies encoding + || !Utf32::IsValidUnicodeChar(RetChar)) // Verifies ranges + return utf_cp32_t{ 0 }; + + return RetChar; + } + else if (Utils::IsFlagSet(Character[0], TwoByteFlag)) + { + utf_cp32_t RetChar = Utils::GetWithClearedFlag(Character[1], FollowupByteMask); // Clear the FollowupByteMask and move the bits to the right position + RetChar |= Utils::GetWithClearedFlag(Character[0], TwoByteFlag) << NumDataBitsInFollowupByte; // Clear the TwoByteFlag and move the bits to the right position + + if (!Utf8::IsValidUtf8Sequence<2>(Character[0], Character[1], Character[2], Character[3]) // Verifies encoding + || !Utf32::IsValidUnicodeChar(RetChar)) // Verifies ranges + return utf_cp32_t{ 0 }; + + return RetChar; + } + else + { + /* Invalid! This is a follow up codepoint but conversion needs to start at the start-codepoint. */ + return 0; + } + } + + UTF_CONSTEXPR UTF_NODISCARD + utf_char8 Utf16PairToUtf8Bytes(const utf_char16 Character) noexcept + { + return Utf32ToUtf8Bytes(Utf16PairToUtf32(Character)); + } + + UTF_CONSTEXPR UTF_NODISCARD + utf_char16 Utf8BytesToUtf16(const utf_char8 Character) noexcept + { + return Utf32ToUtf16Pair(Utf8BytesToUtf32(Character)); + } + + template< + typename codepoint_iterator_type, + typename iterator_deref_type = decltype(*std::declval()), // Iterator can be dereferenced + typename = typename std::enable_if::type) == utf_char8::GetCodepointSize()>::type // Return-value of derferenced iterator has the same size as one codepoint + > + class utf8_iterator : public UtfImpl::Iterator::utf_char_iterator_base, codepoint_iterator_type, utf_char8> + { + private: + typedef typename utf8_iterator own_type; + + friend UtfImpl::Iterator::utf_char_iterator_base_child_acessor; + + public: + using UtfImpl::Iterator::utf_char_iterator_base::utf_char_iterator_base; + + public: + utf8_iterator() = delete; + + private: + void ReadChar() + { + if (this->NextCharStartIterator == this->EndIterator) + return; + + // Reset the bytes of the character + this->CurrentChar = utf8_bytes{ 0 }; + + const int CharCodepointCount = GetUtf8CharLenght(static_cast(*this->NextCharStartIterator)); + + for (int i = 0; i < CharCodepointCount; i++) + { + // The least character ended abruptly + if (this->NextCharStartIterator == this->EndIterator) + { + this->CurrentIterator = this->EndIterator; + this->CurrentChar = utf8_bytes{ 0 }; + break; + } + + this->CurrentChar[static_cast(i)] = static_cast(*this->NextCharStartIterator); + this->NextCharStartIterator++; + } + } + }; + + template< + typename codepoint_iterator_type, + typename iterator_deref_type = decltype(*std::declval()), // Iterator can be dereferenced + typename = typename std::enable_if::type) == utf_char16::GetCodepointSize()>::type // Return-value of derferenced iterator has the same size as one codepoint + > + class utf16_iterator : public UtfImpl::Iterator::utf_char_iterator_base, codepoint_iterator_type, utf_char16> + { + private: + typedef typename utf16_iterator own_type; + + friend UtfImpl::Iterator::utf_char_iterator_base_child_acessor; + + public: + using UtfImpl::Iterator::utf_char_iterator_base::utf_char_iterator_base; + + public: + utf16_iterator() = delete; + + private: + UTF_CONSTEXPR void ReadChar() + { + if (this->NextCharStartIterator == this->EndIterator) + return; + + // Reset the bytes of the character + this->CurrentChar = utf16_pair{ 0 }; + + const int CharCodepointCount = GetUtf16CharLenght(static_cast(*this->NextCharStartIterator)); + + if (CharCodepointCount == 0x1) + { + // Read the only codepoint + this->CurrentChar.Char.Lower = *this->NextCharStartIterator; + this->NextCharStartIterator++; + + return; + } + + // Read the first of two codepoints + this->CurrentChar.Char.Upper = *this->NextCharStartIterator; + this->NextCharStartIterator++; + + // The least character ended abruptly + if (this->NextCharStartIterator == this->EndIterator) + { + this->CurrentChar = utf16_pair{ 0 }; + this->CurrentIterator = this->EndIterator; + return; + } + + // Read the second of two codepoints + this->CurrentChar.Char.Lower = *this->NextCharStartIterator; + this->NextCharStartIterator++; + } + }; + + template< + typename codepoint_iterator_type, + typename iterator_deref_type = decltype(*std::declval()), // Iterator can be dereferenced + typename = typename std::enable_if::type) == utf_char32::GetCodepointSize()>::type // Return-value of derferenced iterator has the same size as one codepoint + > + class utf32_iterator : public UtfImpl::Iterator::utf_char_iterator_base, codepoint_iterator_type, utf_char32> + { + private: + typedef typename utf32_iterator own_type; + + friend UtfImpl::Iterator::utf_char_iterator_base_child_acessor; + + public: + using UtfImpl::Iterator::utf_char_iterator_base::utf_char_iterator_base; + + public: + utf32_iterator() = delete; + + public: + template + auto Replace(const char_type NewChar) -> std::enable_if_t::value> + { + this->CurrentChar = NewChar; + *this->CurrentIterator = NewChar; + } + + private: + void ReadChar() + { + if (this->NextCharStartIterator == this->EndIterator) + return; + + this->CurrentChar = *this->NextCharStartIterator; + this->NextCharStartIterator++; + } + }; + + template::value, int>::type = 0 + > + UTF_CONSTEXPR UTF_NODISCARD + utf_char8 ParseUtf8CharFromStr(const codepoint_type* Str) + { + if (!Str) + return utf8_bytes{}; + + const utf_cp8_t FirstCodepoint = static_cast(Str[0]); + const auto CharLength = GetUtf8CharLenght(FirstCodepoint); + + if (CharLength == 0) + return utf8_bytes{}; + + utf8_bytes RetChar; + RetChar.Codepoints[0] = FirstCodepoint; + + for (int i = 1; i < CharLength; i++) + { + const utf_cp8_t CurrentCodepoint = static_cast(Str[i]); + + // Filters the null-terminator and other invalid followup bytes + if (!UtfImpl::Utf8::IsValidFollowupCodepoint(CurrentCodepoint)) + return utf8_bytes{}; + + RetChar.Codepoints[i] = CurrentCodepoint; + } + + return RetChar; + } + + template::value, int>::type = 0 + > + UTF_CONSTEXPR UTF_NODISCARD + utf_char16 ParseUtf16CharFromStr(const codepoint_type* Str) + { + if (!Str) + return utf_char16{}; + + const utf_cp16_t FirstCodepoint = static_cast(Str[0]); + + if (GetUtf16CharLenght(FirstCodepoint) == 1) + return utf16_pair{ FirstCodepoint }; + + return utf16_pair{ FirstCodepoint, static_cast(Str[1]) }; + } + + template::value, int>::type = 0 + > + UTF_CONSTEXPR UTF_NODISCARD + utf_char32 ParseUtf32CharFromStr(const codepoint_type* Str) + { + if (!Str) + return utf_char32{}; + + return static_cast(Str[0]); + } + + + /* + * Conversions from UTF-16 to UTF-8 + */ + template()))>::type + > + UTF_CONSTEXPR20 UTF_NODISCARD + utf8_char_string Utf16StringToUtf8String(utf16_iterator StringIteratorToConvert) + { + utf8_char_string RetString; + + for (const utf_char16 Char : StringIteratorToConvert) + { + const auto NewChar = Utf16PairToUtf8Bytes(Char); + + for (int i = 0; i < NewChar.GetNumCodepoints(); i++) + RetString += static_cast(NewChar[static_cast(i)]); + } + + return RetString; + } + + template())), + typename = utf16_iterator + > + UTF_CONSTEXPR20 UTF_NODISCARD + utf8_char_string Utf16StringToUtf8String(const utf16_char_string& StringToConvert) + { + return Utf16StringToUtf8String(utf16_iterator(StringToConvert)); + } + + template + > + UTF_CONSTEXPR20 UTF_NODISCARD + utf8_char_string Utf16StringToUtf8String(utf16_char_type(&StringToConvert)[CStrLenght]) + { + return Utf16StringToUtf8String(utf16_iterator(std::begin(StringToConvert), std::end(StringToConvert))); + } + + template + > + UTF_CONSTEXPR20 UTF_NODISCARD + utf8_char_string Utf16StringToUtf8String(const utf16_char_type* StringToConvert, int NonNullTermiantedLength) + { + return Utf16StringToUtf8String(utf16_iterator(StringToConvert, StringToConvert + NonNullTermiantedLength)); + } + + + /* + * Conversions from UTF-32 to UTF-8 + */ + template()))>::type + > + UTF_CONSTEXPR20 UTF_NODISCARD + utf8_char_string Utf32StringToUtf8String(utf32_iterator StringIteratorToConvert) + { + utf8_char_string RetString; + + for (const utf_char32 Char : StringIteratorToConvert) + { + const auto NewChar = Utf32ToUtf8Bytes(Char); + + for (int i = 0; i < NewChar.GetNumCodepoints(); i++) + RetString += static_cast(NewChar[static_cast(i)]); + } + + return RetString; + } + + template())), + typename = utf32_iterator + > + UTF_CONSTEXPR20 UTF_NODISCARD + utf8_char_string Utf32StringToUtf8String(const utf32_char_string& StringToConvert) + { + return Utf32StringToUtf8String(utf32_iterator(StringToConvert)); + } + + template + > + UTF_CONSTEXPR20 UTF_NODISCARD + utf8_char_string Utf32StringToUtf8String(utf32_char_type(&StringToConvert)[cstr_lenght]) + { + return Utf32StringToUtf8String(utf32_iterator(std::begin(StringToConvert), std::end(StringToConvert))); + } + + template + > + UTF_CONSTEXPR20 UTF_NODISCARD + utf8_char_string Utf32StringToUtf8String(const utf32_char_type* StringToConvert, int NonNullTermiantedLength) + { + return Utf32StringToUtf8String(utf32_iterator(StringToConvert, StringToConvert + NonNullTermiantedLength)); + } + + + /* + * Conversions from UTF-8 to UTF-16 + */ + template()))>::type + > + UTF_CONSTEXPR20 UTF_NODISCARD + utf16_char_string Utf8StringToUtf16String(utf8_iterator StringIteratorToConvert) + { + utf16_char_string RetString; + + for (const utf_char8 Char : StringIteratorToConvert) + { + const auto NewChar = Utf8BytesToUtf16(Char); + + if (NewChar.GetNumCodepoints() > 1) + RetString += NewChar.Get().Upper; + + RetString += NewChar.Get().Lower; + } + + return RetString; + } + + template())), + typename = utf8_iterator + > + UTF_CONSTEXPR20 UTF_NODISCARD + utf16_char_string Utf8StringToUtf16String(const utf8_char_string& StringToConvert) + { + return Utf8StringToUtf16String(utf8_iterator(StringToConvert)); + } + + template + > + UTF_CONSTEXPR20 UTF_NODISCARD + utf16_char_string Utf8StringToUtf16String(utf8_char_type(&StringToConvert)[cstr_lenght]) + { + return Utf32StringToUtf16String(utf8_iterator(std::begin(StringToConvert), std::end(StringToConvert))); + } + + template + > + UTF_CONSTEXPR20 UTF_NODISCARD + utf16_char_string Utf8StringToUtf16String(const utf8_char_type* StringToConvert, int NonNullTermiantedLength) + { + return Utf32StringToUtf16String(utf32_iterator(StringToConvert, StringToConvert + NonNullTermiantedLength)); + } + + + /* + * Conversions from UTF-32 to UTF-16 + */ + template()))>::type + > + UTF_CONSTEXPR20 UTF_NODISCARD + utf16_char_string Utf32StringToUtf16String(utf32_iterator StringIteratorToConvert) + { + utf16_char_string RetString; + + for (const utf_char32 Char : StringIteratorToConvert) + { + const auto NewChar = Utf32ToUtf16Pair(Char); + + if (NewChar.GetNumCodepoints() > 1) + RetString += NewChar.Get().Upper; + + RetString += NewChar.Get().Lower; + } + + return RetString; + } + + template())), + typename = utf32_iterator + > + UTF_CONSTEXPR20 UTF_NODISCARD + utf16_char_string Utf32StringToUtf16String(const utf32_char_string& StringToConvert) + { + return Utf32StringToUtf16String(utf32_iterator(StringToConvert)); + } + + template + > + UTF_CONSTEXPR20 UTF_NODISCARD + utf16_char_string Utf32StringToUtf16String(utf32_char_type(&StringToConvert)[cstr_lenght]) + { + return Utf32StringToUtf16String(utf32_iterator(std::begin(StringToConvert), std::end(StringToConvert))); + } + + template + > + UTF_CONSTEXPR20 UTF_NODISCARD + utf16_char_string Utf32StringToUtf16String(const utf32_char_type* StringToConvert, int NonNullTermiantedLength) + { + return Utf32StringToUtf16String(utf32_iterator(StringToConvert, StringToConvert + NonNullTermiantedLength)); + } + + + /* + * Conversions from UTF-8 to UTF-32 + */ + template()))>::type + > + UTF_CONSTEXPR20 UTF_NODISCARD + utf32_char_string Utf8StringToUtf32String(utf8_iterator StringIteratorToConvert) + { + utf32_char_string RetString; + + for (const utf_char8 Char : StringIteratorToConvert) + { + RetString += Utf8BytesToUtf32(Char); + } + + return RetString; + } + + template())), + typename = utf8_iterator + > + UTF_CONSTEXPR20 UTF_NODISCARD + utf32_char_string Utf8StringToUtf32String(const utf8_char_string& StringToConvert) + { + return Utf8StringToUtf32String(utf8_iterator(StringToConvert)); + } + + template + > + UTF_CONSTEXPR20 UTF_NODISCARD + utf32_char_string Utf8StringToUtf32String(utf8_char_type(&StringToConvert)[cstr_lenght]) + { + return Utf8StringToUtf32String(utf8_iterator(std::begin(StringToConvert), std::end(StringToConvert))); + } + + template + > + UTF_CONSTEXPR20 UTF_NODISCARD + utf32_char_string Utf8StringToUtf32String(const utf8_char_type* StringToConvert, int NonNullTermiantedLength) + { + return Utf8StringToUtf32String(utf8_iterator(StringToConvert, StringToConvert + NonNullTermiantedLength)); + } + + + /* + * Conversions from UTF-16 to UTF-32 + */ + template()))>::type + > + UTF_CONSTEXPR20 UTF_NODISCARD + utf32_char_string Utf16StringToUtf32String(utf16_iterator StringIteratorToConvert) + { + utf32_char_string RetString; + + for (const utf_char16 Char : StringIteratorToConvert) + { + RetString += Utf16PairToUtf32(Char).Get(); + } + + return RetString; + } + + template())), + typename = utf16_iterator + > + UTF_CONSTEXPR20 UTF_NODISCARD + utf32_char_string Utf16StringToUtf32String(const utf16_char_string& StringToConvert) + { + return Utf16StringToUtf32String(utf16_iterator(StringToConvert)); + } + + template + > + UTF_CONSTEXPR20 UTF_NODISCARD + utf32_char_string Utf16StringToUtf32String(utf16_char_type(&StringToConvert)[cstr_lenght]) + { + return Utf16StringToUtf32String(utf16_iterator(std::begin(StringToConvert), std::end(StringToConvert))); + } + + template + > + UTF_CONSTEXPR20 UTF_NODISCARD + utf32_char_string Utf16StringToUtf32String(const utf16_char_type* StringToConvert, int NonNullTermiantedLength) + { + return Utf16StringToUtf32String(utf16_iterator(StringToConvert, StringToConvert + NonNullTermiantedLength)); + } + + + template())), // has 'begin()' + typename = decltype(std::end(std::declval())) // has 'end()' + > + UTF_CONSTEXPR20 UTF_NODISCARD + string_type WStringToString(const wstring_type& WideString) + { + using char_type = typename std::decay()))>::type; + + // Workaround to missing 'if constexpr (...)' in Cpp14. Satisfies the requirements of conversion-functions. Safe because the incorrect function is never going to be invoked. + struct dummy_2byte_str { uint16_t* begin() const { return nullptr; }; uint16_t* end() const { return nullptr; }; }; + struct dummy_4byte_str { uint32_t* begin() const { return nullptr; }; uint32_t* end() const { return nullptr; }; }; + + if UTF_IF_CONSTEXPR (sizeof(char_type) == 0x2) // UTF-16 + { + using type_to_use = typename std::conditional::type; + return Utf16StringToUtf8String(UtfImpl::Utils::ForceCastIfMissmatch(WideString)); + } + else // UTF-32 + { + using type_to_use = typename std::conditional::type; + return Utf32StringToUtf8String(UtfImpl::Utils::ForceCastIfMissmatch(WideString)); + } + } + + template())), // has 'begin()' + typename = decltype(std::end(std::declval())) // has 'end()' + > + UTF_CONSTEXPR20 UTF_NODISCARD + wstring_type StringToWString(const string_type& NarrowString) + { + using char_type = typename std::decay()))>::type; + + // Workaround to missing 'if constexpr (...)' in Cpp14. Satisfies the requirements of conversion-functions. Safe because the incorrect function is never going to be invoked. + struct dummy_2byte_str { uint16_t* begin() const { return nullptr; }; uint16_t* end() const { return nullptr; }; }; + struct dummy_4byte_str { uint32_t* begin() const { return nullptr; }; uint32_t* end() const { return nullptr; }; }; + + if UTF_IF_CONSTEXPR(sizeof(char_type) == 0x2) // UTF-16 + { + using type_to_use = typename std::conditional::type; + return Utf8StringToUtf16String(NarrowString); + } + else // UTF-32 + { + using type_to_use = typename std::conditional::type; + return Utf8StringToUtf32String(NarrowString); + } + } + + + template + UTF_CONSTEXPR byte_iterator_type ReplaceUtf8(byte_iterator_type Begin, byte_iterator_type End, utf_cp8_t CharToReplace, utf_cp8_t ReplacementChar) + { + using namespace UtfImpl; + + if (Begin == End) + return End; + + const auto ToReplaceSize = GetUtf8CharLenght(CharToReplace); + const auto ReplacementSize = GetUtf8CharLenght(ReplacementChar); + + if (ToReplaceSize == ReplacementSize) // Trivial replacement + { + // TODO + } + else if (ToReplaceSize < ReplacementSize) // + { + // TODO + } + else /* if (ToReplaceSize > ReplacementSize) */ // Replace and move following bytes back + { + // TODO + } + } + + // utf_char spezialization-implementation for Utf8 + UTF_CONSTEXPR utf_char::utf_char(utf8_bytes InChar) noexcept + : Char(InChar) + { + } + + template + UTF_CONSTEXPR utf_char::utf_char(const char_type* SingleCharString) noexcept + : utf_char(ParseUtf8CharFromStr(SingleCharString)) + { + } + + UTF_CONSTEXPR utf_char& utf_char::operator=(utf8_bytes inBytse) noexcept + { + Char.Codepoints[0] = inBytse.Codepoints[0]; + Char.Codepoints[1] = inBytse.Codepoints[1]; + Char.Codepoints[2] = inBytse.Codepoints[2]; + Char.Codepoints[3] = inBytse.Codepoints[3]; + + return *this; + } + + UTF_CONSTEXPR UTF_NODISCARD + bool utf_char::operator==(utf_char8 Other) const noexcept + { + return Char == Other.Char; + } + + UTF_CONSTEXPR UTF_NODISCARD + utf_cp8_t& utf_char::operator[](const uint8_t Index) + { +#ifdef _DEBUG + if (Index >= 0x4) + throw std::out_of_range("Index was greater than 4!"); +#endif // _DEBUG + return Char.Codepoints[Index]; + } + + UTF_CONSTEXPR UTF_NODISCARD + const utf_cp8_t& utf_char::operator[](const uint8_t Index) const + { +#ifdef _DEBUG + if (Index >= 0x4) + throw std::out_of_range("Index was greater than 4!"); +#endif // _DEBUG + return Char.Codepoints[Index]; + } + + UTF_CONSTEXPR UTF_NODISCARD + bool utf_char::operator!=(utf_char8 Other) const noexcept + { + return Char != Other.Char; + } + + UTF_CONSTEXPR UTF_NODISCARD + utf_char8 utf_char::GetAsUtf8() const noexcept + { + return *this; + } + + UTF_CONSTEXPR UTF_NODISCARD + utf_char16 utf_char::GetAsUtf16() const noexcept + { + return Utf8BytesToUtf16(*this); + } + + UTF_CONSTEXPR UTF_NODISCARD + utf_char32 utf_char::GetAsUtf32() const noexcept + { + return Utf8BytesToUtf32(*this); + } + + UTF_CONSTEXPR UTF_NODISCARD + utf8_bytes utf_char::Get() const + { + return Char; + } + + UTF_CONSTEXPR UTF_NODISCARD + UtfEncodingType utf_char::GetEncoding() const noexcept + { + return UtfEncodingType::Utf8; + } + + UTF_CONSTEXPR UTF_NODISCARD + uint8_t utf_char::GetNumCodepoints() const noexcept + { + return GetUtf8CharLenght(Char.Codepoints[0]); + } + + UTF_CONSTEXPR UTF_NODISCARD + /* static */ uint8_t utf_char::GetCodepointSize() noexcept + { + return 0x1; + } + + + + // utf_char spezialization-implementation for Utf8 + UTF_CONSTEXPR utf_char::utf_char(utf16_pair InChar) noexcept + : Char(InChar) + { + } + + template + UTF_CONSTEXPR utf_char::utf_char(const char_type* SingleCharString) noexcept + : utf_char(ParseUtf16CharFromStr(SingleCharString)) + { + } + + UTF_CONSTEXPR utf_char& utf_char::operator=(utf16_pair inBytse) noexcept + { + Char.Upper = inBytse.Upper; + Char.Lower = inBytse.Lower; + + return *this; + } + + UTF_CONSTEXPR UTF_NODISCARD + bool utf_char::operator==(utf_char16 Other) const noexcept + { + return Char == Other.Char; + } + + UTF_CONSTEXPR UTF_NODISCARD + bool utf_char::operator!=(utf_char16 Other) const noexcept + { + return Char != Other.Char; + } + + UTF_CONSTEXPR UTF_NODISCARD + utf_char8 utf_char::GetAsUtf8() const noexcept + { + return Utf16PairToUtf8Bytes(Char); + } + + UTF_CONSTEXPR UTF_NODISCARD + utf_char16 utf_char::GetAsUtf16() const noexcept + { + return Char; + } + + UTF_CONSTEXPR UTF_NODISCARD + utf_char32 utf_char::GetAsUtf32() const noexcept + { + return Utf16PairToUtf32(Char); + } + + UTF_CONSTEXPR UTF_NODISCARD + utf16_pair utf_char::Get() const noexcept + { + return Char; + } + + UTF_CONSTEXPR UTF_NODISCARD + UtfEncodingType utf_char::GetEncoding() const noexcept + { + return UtfEncodingType::Utf16; + } + + UTF_CONSTEXPR UTF_NODISCARD + uint8_t utf_char::GetNumCodepoints() const noexcept + { + return GetUtf16CharLenght(Char.Upper); + } + + UTF_CONSTEXPR UTF_NODISCARD + /* static */ uint8_t utf_char::GetCodepointSize() noexcept + { + return 0x2; + } + + + + // utf_char spezialization-implementation for Utf32 + UTF_CONSTEXPR utf_char::utf_char(utf_cp32_t InChar) noexcept + : Char(InChar) + { + } + + template + UTF_CONSTEXPR utf_char::utf_char(const char_type* SingleCharString) noexcept + : Char(*SingleCharString) + { + } + + UTF_CONSTEXPR utf_char& utf_char::operator=(utf_cp32_t inBytse) noexcept + { + Char = inBytse; + return *this; + } + + UTF_CONSTEXPR UTF_NODISCARD + bool utf_char::operator==(utf_char32 Other) const noexcept + { + return Char == Other.Char; + } + + UTF_CONSTEXPR UTF_NODISCARD + bool utf_char::operator!=(utf_char32 Other) const noexcept + { + return Char != Other.Char; + } + + UTF_CONSTEXPR UTF_NODISCARD + utf_char8 utf_char::GetAsUtf8() const noexcept + { + return Utf32ToUtf8Bytes(Char); + } + + UTF_CONSTEXPR UTF_NODISCARD + utf_char16 utf_char::GetAsUtf16() const noexcept + { + return Utf32ToUtf16Pair(Char); + } + + UTF_CONSTEXPR UTF_NODISCARD + utf_char32 utf_char::GetAsUtf32() const noexcept + { + return Char; + } + + UTF_CONSTEXPR UTF_NODISCARD + utf_cp32_t utf_char::Get() const noexcept + { + return Char; + } + + UTF_CONSTEXPR UTF_NODISCARD + UtfEncodingType utf_char::GetEncoding() const noexcept + { + return UtfEncodingType::Utf32; + } + + UTF_CONSTEXPR UTF_NODISCARD + uint8_t utf_char::GetNumCodepoints() const noexcept + { + return 0x1; + } + + UTF_CONSTEXPR UTF_NODISCARD + /* static */ uint8_t utf_char::GetCodepointSize() noexcept + { + return 0x4; + } +} + +#undef UTF_CONSTEXPR +#undef UTF_CONSTEXPR14 +#undef UTF_CONSTEXPR17 +#undef UTF_CONSTEXPR20 +#undef UTF_CONSTEXPR23 +#undef UTF_CONSTEXPR26 + + +// Restore all warnings suppressed for the UTF-N implementation +#if (defined(_MSC_VER)) +#pragma warning (pop) +#elif (defined(__CLANG__) || defined(__GNUC__)) +#pragma GCC diagnostic pop +#endif // Warnings \ No newline at end of file